<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 5.0.0?>
-
-<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage2">
+<?fileVersion 5.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage2">
<storageModule moduleId="org.eclipse.cdt.core.settings">
- <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1353180652">
- <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_org.eclipse.cdt.core.settings" id="cdt.managedbuild.toolchain.gnu.base.1353180652" name="Default"/>
- <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_cdtBuildSystem" version="4.0.0"/>
- <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1353180652_org.eclipse.cdt.core.externalSettings"/>
+ <cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1053321950">
+ <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_org.eclipse.cdt.core.settings" id="cdt.managedbuild.toolchain.gnu.base.1053321950" name="Default"/>
+ <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_cdtBuildSystem" version="4.0.0"/>
+ <storageModule externalCElementFile="cdt.managedbuild.toolchain.gnu.base.1053321950_org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.pathentry">
- <pathentry kind="mac" name="main" path="" value="smpi_simulated_main"/>
- <pathentry include="/usr/include/lua5.1" kind="inc" path="" system="true"/>
- <pathentry include="/usr/include" kind="inc" path="" system="true"/>
- <pathentry base-path="simgrid" include="include" kind="inc" path="" system="true"/>
- <pathentry base-path="simgrid" include="src/include" kind="inc" path="" system="true"/>
- <pathentry base-path="simgrid" include="src" kind="inc" path="" system="true"/>
- <pathentry excluding="**/CMakeFiles/" kind="out" path=""/>
- <pathentry kind="src" path=""/>
- </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="simgrid.null.697056024" name="simgrid"/>
+ <project id="simgrid.null.1652888656" name="simgrid"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="Default">
<resource resourceType="PROJECT" workspacePath="/simgrid"/>
</configuration>
</storageModule>
- <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
- <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
- <storageModule moduleId="scannerConfiguration">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1353180652;cdt.managedbuild.toolchain.gnu.base.1353180652.1797514135;cdt.managedbuild.tool.gnu.c.compiler.base.2037544368;cdt.managedbuild.tool.gnu.c.compiler.input.1851803849">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- <scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1353180652;cdt.managedbuild.toolchain.gnu.base.1353180652.1797514135;cdt.managedbuild.tool.gnu.cpp.compiler.base.1129818443;cdt.managedbuild.tool.gnu.cpp.compiler.input.500761747">
- <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="specsFile">
- <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
- <buildOutputProvider>
- <openAction enabled="true" filePath=""/>
- <parser enabled="true"/>
- </buildOutputProvider>
- <scannerInfoProvider id="makefileGenerator">
- <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
- <parser enabled="true"/>
- </scannerInfoProvider>
- </profile>
- </scannerConfigBuildInfo>
- </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
</cproject>
simgrid.jar
################################################
-### Units and supernovae files
+### Unit files
src/simgrid_units_main.c
src/*_unit.c
-src/supernovae_*.c
################################################
### Generated files
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
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>simgrid</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
- <triggers>clean,full,incremental,</triggers>
- <arguments>
- <dictionary>
- <key>?name?</key>
- <value></value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.append_environment</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
- <value>all</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildArguments</key>
- <value></value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildCommand</key>
- <value>make</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
- <value>clean</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.contents</key>
- <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
- <value>false</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableFullBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
- <value>all</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.stopOnError</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
- <value>true</value>
- </dictionary>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.rubypeople.rdt.core.rubybuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
- <triggers>full,incremental,</triggers>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.cdt.core.ccnature</nature>
- <nature>org.eclipse.cdt.core.cnature</nature>
- <nature>org.rubypeople.rdt.core.rubynature</nature>
- <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
- <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+ <name>simgrid</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <triggers>clean,full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ </natures>
</projectDescription>
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
# 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
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()
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()
=========================================================================
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:
=========================================================================
-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
*/
<------------- 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
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
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
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.
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.
--- /dev/null
+/* 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. */
-SimGrid (3.10-rc2) unstable; urgency=low
+SimGrid (3.11) NOT RELEASED; urgency=low
+
+ TENTATIVE RELEASE GOALS for 3.11:
+ * Switch to tesh.pl, and kill the now unused parts of xbt that seem fragile
+ * Clean up CMake files (may need a full rewrite).
+ Non exhaustive list of subgoals:
+ - Use genuine cmake mechanisms and variables when available,
+ instead of reinventing the wheel.
+ - Correctly determine system and architecture (e.g. x32).
+ - Correctly determine compiler type and version (e.g. clang).
+ - Correctly set compiler flags according to compiler type and version.
+ - Correctly set compiler flags for C++, Java, and Fortran compilers too.
+ - Use git to generate the dist archive. Either use git-archive to
+ generate the tarball, or keep using cmake -E tar, but use git-ls-files
+ to get the list of files to pack.
+
+ Tools:
+ * Normalizing pointers addresses tool for better diff between logs
+
+ Examples:
+ * Add cloud examples using new VMs
+ - examples/msg/cloud/two_tasks_vm.tesh
+ - examples/msg/cloud/simple_vm.tesh
+ - examples/java/cloud/cloud.tesh
+ - examples/java/cloud/migration/migration.tesh
+
+ MSG:
+ * Add virtual machine
+ - creation of a VM on a PM
+ - migration of a VM from a PM to another PM
+
+ Simcalls:
+ * Simcalls are now generated by a python script
+ - generate files include by simgrid
+ - check that all the functions exists and propose prototypes
+ * Clean simcalls
+ - remove sem_destroy, file_set_data, comm_destroy, vm_set_state,
+ host_set_data, host_get_data
+
+ SURF:
+ * Translate surf models from C to C++
+ - Generic classes for all models: Model, Resource, Action
+ - A generic interface for each kind of model (cpu, network, storage
+ workstation, workstationvm)
+ - C bindings
+ * Translate surf routings from C to C++
+ * Add callbacks using sigc++ or boost::signals2
+ - Add callback functions for resource creation/destruction
+ - Add callback finctions for action state change
+ - Handle Energy as a plugin
+ * Replace swag by boost::intrusive
+ * Add new routing model for torus clusters
+ * More documentation
+
+ SMPI:
+ * hostfiles support host:nb_processes construct to deploy several processes on
+ one node
+ * Collective communication algorithms should not crash if used with
+ improper number of nodes and report the error.
+
+ Java:
+ * New cmake option, enable_lib_in_jar, to control whether native libraries are
+ copied into simgrid.jar or not (ON by default). Use this option if you want
+ to reduce the size of the installed simgrid.jar, *and* the native libraries
+ are kept installed elsewhere.
+
+ Build System:
+ * Supernovae build mode is definitively removed. It was used to improve
+ inlining and inter-module optimizations. It is nowadays superseded by
+ link-time optimizations commonly available in compilers.
+ * Update ns3 find lib
+ * Add boost dependency for surf++
+
+ -- $date Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+
+SimGrid (3.10) stable; urgency=low
The Clean Diaper Release, a.k.a. SimGrid is leak-free.
Build System:
* Lots of memory leaks were corrected in this release.
+ There is no known memory leaks anymore, in all of our 600+ tests.
* New command line option --version, to get SimGrid version information.
Packagers may want to add extra words to SIMGRID_VERSION_EXTRA defined in
CMakeLists.txt.
* Supernovae builds are deprecated, and expected to be removed in the next
version of SimGrid.
- -- Fri Nov 8 23:54:56 CET 2013 Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
+ -- Sun Nov 17 00:26:44 CET 2013 Da SimGrid team <simgrid-devel@lists.gforge.inria.fr>
SimGrid (3.9) stable; urgency=low
+ _ _____ _ _
+__ _____ _ __ ___(_) ___ _ __ |___ / / / |
+\ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ | | |
+ \ 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:
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
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.
**
*****************************************************
-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.
do cast it to unsigned long before printing (and use %lu),
or use %zu.
+INTEGERS
+ Please avoid to use long ints. This is the source of many compatibility
+ problems between 32 bits and 64 bits archs. Either use plain ints (generally
+ 32 bits wide) or long long ints (64 bits wide, at least). At last resort
+ consider using integer types defined in C99 by <stdint.h>.
+
PRINTF pointer difference (FIXME: advertise %td instead?)
printf ("diff = %ld\n", (long) (pointer2 - pointer1));
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
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()
# 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()
# 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)
# 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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
# 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)
# 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)
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()
### 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)
TEST_BIG_ENDIAN(BIGENDIAN)
include(FindGraphviz)
+include(FindLibSigc++)
set(HAVE_GTNETS 0)
if(enable_gtnets)
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)
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(
)
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)
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()
###############
## 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/
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)
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)
${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}")
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
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
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
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
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
src/xbt_modinter.h
)
-if(HAVE_MMAP)
+if(HAVE_MMALLOC)
set(XBT_SRC
${XBT_SRC}
src/xbt/mmalloc/mm.c
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
)
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
)
src/simix/smx_smurf.c
src/simix/smx_synchro.c
src/simix/smx_user.c
+ src/simix/smx_vm.c
)
set(SIMGRID_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
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
)
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
src/smpi/smpiff.in
src/smpi/smpif90.in
src/smpi/smpirun.in
+ src/smpi/smpitools.sh
)
set(txt_files
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
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
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
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
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
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
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
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/)
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
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"
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
)
######################################
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)
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()
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")
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)
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}")
### 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}"
)
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)
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)
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)
## 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)
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
)
###############################
# 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})
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})
endif()
endif()
+if(HAVE_LIBSIGC++)
+ SET(SIMGRID_DEP "${SIMGRID_DEP} -lsigc-2.0")
+endif()
+
if(HAVE_GTNETS)
SET(SIMGRID_DEP "${SIMGRID_DEP} -lgtnets")
endif()
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()
# 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()
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()
-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
/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
/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
)
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)
--- /dev/null
+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)
)
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}
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}
)
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()
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()
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)
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}")
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)
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}")
#!/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
#!/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
--- /dev/null
+#!/bin/sh
+
+set -e
+#set -x
+
+if [ $# -lt 3 ]; then
+ cat >&2 <<EOF
+Usage: $0 simgrid.jar java_command strip_command [-so file.so...] [-txt file.txt...]
+ simgrid.jar SimGrid jar file
+ java_command path to the Java runtime
+ strip_command path to the command used to strip libraries
+ file.so library file to stript and bundle into the archive
+ file.txt other file to bundle into the archive
+EOF
+ exit 1
+fi
+
+SIMGRID_JAR=$1
+JAVA=$2
+STRIP=$3
+shift 3
+
+JSG_BUNDLE=$("$JAVA" -classpath "$SIMGRID_JAR" org.simgrid.msg.NativeLib)
+
+# sanity check
+case "$JSG_BUNDLE" in
+ NATIVE/*)
+ cat >&2 <<EOF
+-- [Java] Native libraries bundled into: ${JSG_BUNDLE}
+EOF
+ ;;
+ *)
+ cat >&2 <<EOF
+-- [Java] Native libraries NOT bundled into invalid directory: ${JSG_BUNDLE}
+EOF
+ exit 1
+ ;;
+esac
+
+# prepare directory
+rm -fr NATIVE
+mkdir -p "$JSG_BUNDLE"
+
+if [ "$1" = "-so" ]; then
+ shift
+ for file; do
+ [ "$file" != "-txt" ] || break
+ cp -f "$file" "$JSG_BUNDLE"
+ "$STRIP" -S "$JSG_BUNDLE/${file##*/}"
+ shift
+ done
+fi
+
+if [ "$1" = "-txt" ]; then
+ shift
+ for file; do
+ cp -f "$file" "$JSG_BUNDLE"
+ shift
+ done
+fi
#!/usr/bin/perl -w
+
+# Copyright (c) 2012-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
use strict;
my @argv = ("valgrind");
my $count = 0;
#! /usr/bin/perl
+
+# Copyright (c) 2012-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
eval 'exec perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
#!/usr/bin/perl -w
+
+# Copyright (c) 2012, 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
use strict;
if($#ARGV!=1) {
+++ /dev/null
-### Make supernovae files and libs
-
-#############################################################################
-### Add here every files that should not be supernovaed (generated files) ###
-#############################################################################
-set(simgrid_fragile_sources
- src/simdag/sd_daxloader.c
- src/surf/surfxml_parse.c
- src/xbt/graphxml_parse.c
- src/xbt/mmalloc/mm.c
- ${GTNETS_USED}
- )
-
-#####################################################
-### END OF CONFIGURATION, NO NEED TO READ FURTHER ###
-#####################################################
-
-### Rebuild the supernovae source files
-if (enable_supernovae) # I need supernovae
-
- message(WARNING
-"==============================================================================\n"
-"WARNING\n"
-"Supernovae builds are deprecated, and expected to be removed in the next version of SimGrid.\n"
-"If you want this feature to be kept, please tell us at <simgrid-user@lists.gforge.inria.fr>.\n"
-"===============================================================================
-")
-
- # supernovae files are generated. I promise
- set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
- PROPERTIES GENERATED true)
- set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c
- PROPERTIES GENERATED true)
-
- ADD_CUSTOM_COMMAND(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
- DEPENDS ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl ${simgrid_sources}
- COMMAND perl ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl --out=${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c '--fragile=${simgrid_fragile_sources}' '${simgrid_sources}'
- WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
- COMMENT "Generating supernovae_sg.c"
- )
-
-
- ADD_CUSTOM_COMMAND(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c
- DEPENDS ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl ${SMPI_SRC}
- COMMAND perl ${CMAKE_HOME_DIRECTORY}/src/mk_supernovae.pl --out=${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c '${SMPI_SRC}'
- WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}
- COMMENT "Generating supernovae_smpi.c"
- )
-
- ### Change the content of the libraries so that it contains only supernovae+fragiles
- set(simgrid_sources
- ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c
- ${simgrid_fragile_sources})
-
- set(SMPI_SRC
- ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c)
-
-endif() # I need supernovae
/* This file is AUTOMATICALLY GENERATED by Cmake. Edit the following
template instead buildtools/Cmake/src/internal_config.h.in */
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
/* Set somes variables for Windows compilation */
#ifdef _XBT_DLL_EXPORT
#cmakedefine MMALLOC_WANT_OVERRIDE_LEGACY @MMALLOC_WANT_OVERRIDE_LEGACY@
#cmakedefine HAVE_MC @HAVE_MC@
-/* Set to true if have the mergesort function */
-#cmakedefine HAVE_MERGESORT @HAVE_MERGESORT@
-
/* If have linux_futex.h */
#cmakedefine HAVE_FUTEX_H @HAVE_FUTEX_H@
+/* Some variable for libsigc++ */
+#cmakedefine HAVE_LIBSIGC @HAVE_LIBSIGC++@
+
/* Some variable for graphviz */
#cmakedefine HAVE_GRAPHVIZ @HAVE_GRAPHVIZ@
#cmakedefine HAVE_GRAPH_H @GRAPH_H@
/* Define to 1 if you have the <execinfo.h> header file. */
#cmakedefine HAVE_EXECINFO_H @HAVE_EXECINFO_H@
-/* Define to 1 if you have the `mmap' function. */
-#cmakedefine HAVE_MMAP @HAVE_MMAP@
+/* Define to 1 if mmalloc is compiled in. */
+#cmakedefine HAVE_MMALLOC @HAVE_MMALLOC@
/* Define to 1 if you have the `getdtablesize' function. */
#cmakedefine HAVE_GETDTABLESIZE @HAVE_GETDTABLESIZE@
-/* 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
/* 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
+/* Copyright (c) 2010, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <simulator.h>
int main(){
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
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" ]
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
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
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
+/* 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 */
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;
}
}
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;
}
+/* 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 */
#!/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 {
#!/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
#!/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
#!/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
+/* Copyright (c) 2011, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/**--------- <copy/paste C code snippet in surf/network.c> -------------
* produced by:
* ./regression2.py ./pingpong-in.dat 0.15 30 2 2.4e-5 1.25e8
# 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
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
@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 \
# 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
+/* Copyright (c) 2011-2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include "xbt/log.h"
XBT_LOG_NEW_DEFAULT_CATEGORY(HelloWorld,
~~~~{.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
# 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,
# 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
\endverbatim
\section simgrid_dev_guide_model How to add a new model in surf?
-Search for expression \"TUTORIAL: New model\".
-\verbatim
-user@caraja:~/workspace/simgrid/src$ cg "TUTORIAL: New model"
-0 surf/new_model_private.h 2 /* TUTORIAL: New model
-1 surf/surf.c 213 /* TUTORIAL: New model*/
-2 surf/surf_config.c 380 /* TUTORIAL: New model*/
-3 surf/surf_config.c 746 /* TUTORIAL: New model*/
-4 surf/new_model.c 8 /* TUTORIAL: New model*/
-5 include/surf/surf.h 157 /* TUTORIAL: New model*/
-6 include/surf/surf.h 345 /* TUTORIAL: New model*/
-7 include/surf/surf.h 661 /* TUTORIAL: New model*/
-\endverbatim
+A model in simgrid is composed of three classes: Model, Resource and Action
+(surf_interface.hpp).
-\section simgrid_dev_guide_simcall How to add a new simcall?
-To add a simcall called `<name>` with three arguments `arg1`, `arg2` and `arg3`
-of type `targ1`, `targ2`, `targ3` respectively and which return a value of
-type `tret` you must first define the simcall function in the the
-`include/simgrid/simix.h` and make it call the automatically generated `BODY`
-function which will do all the bad stuff.
+Actually there are five kind of models: CpuModel, NetworkModel, WorkstationModel,
+WorkstationVMModel and StorageModel. For each kind of model, there is an
+interface (e.g.: cpu_interface.hpp) and some implementations (e.g.: cpu_cas01.hpp,
+cpu_ti.hpp).
-~~~~{.c}
-tret simcall_<NAME>(targ1 arg1, targ2 arg2, targ3 arg3){
- return simcall_BODY_<NAME>(arg1, arg2, arg3);
-}
-~~~~
+If you want to create a new implementation of a kind of model you must extend
+the classes of the corresponding interface.
-Then you must add an new line in the list `SIMCALL_LIST1` of simcall actions in
-`src/simix/smx_smurf_private.h`. The arguments of the `ACTION` are:
-- the simcall enum name,
-- the `<name>` of the simcall,
-- if the result must be automatically saved in the simcall
- (`WITH_ANSWER`/`WITHOUT_ANSWER`)
-- the return type,
-- the arguments.
+If you want to create a new kind of model, you must create a new interface
+ where you extend the classes Model, Resource and Action, and then create an
+ implementation of this interface.
-The return type and the arguments must be define by using `TSPEC(name, type)`,
-or one of the predefined type (e.g., `TSTRING(n)`, `TINT(n)`, `TVOID(n)`,
-`TPTR(n)`, …). You must get something like this:
+\section simgrid_dev_guide_simcall How to add a new simcall?
+A simcall is used to go from user mode to kernel mode. The workflow of
+a simcall is the following:
-~~~~{.c}
-ACTION(SIMCALL_<NAME>, <name>, WITH_ANSWER, TSPEC(result, tret), TSPEC(arg1, targ1), TSPEC(arg2, targ2), TSPEC(arg3, targ3)) sep \
-~~~~
+- `<ret> simcall_<name>(<args>)`
+ - `simcall_BODY_<name>(<args>)`
+ - create the simcall
+ - `SIMIX_process_yield` if not maestro
+ - ========== KERNEL MODE ==========
+ - `SIMIX_simcall_pre`
+ - `SIMIX_pre_<name>(simcall, <args>)`
+ - `SIMIX_simcall_answer(simcall)`
+
+To simplify the simcall creation, we have made a python script that
+generate most of the code and give helpers for the remaining stuff.
+The script generating the simcalls (src/simix/simcalls.in) take in input
+the src/simix/simcalls.in file where the simcalls are defined and generate
+the following files:
-Finaly you have to define the kernel code in a `SIMIX_pre_<name>` in the
-corresponding src/simix/smx_*.c file:
+- simcall_generated_args_getter_setter.h:
+ functions to get and set simcall arguments
+- simcall_generated_res_getter_setter.h:
+ functions to get and set simcall result
+- simcall_generated_body.c:
+ the BODY function of the simcall
+- simcall_generated_case.c:
+ the case of the SIMIX_simcall_pre function
+- simcall_generated_enum.h:
+ the enum of simcalls
+- simcall_generated_string.c:
+ string corresponding to the enum to debug
-~~~~{.c}
-tret SIMIX_pre_<name>(smx_simcall_t simcall, targ1 arg1, targ2 arg2, targ3 arg3) {
- SIMIX_<NAME>(arg1, arg2, arg3);
-}
+Furthermode if the simcall_<name> or the SIMIX_pre_<name> function are missing,
+a warning will show up with a prototype of the corresponding fonction to fill.
-tret SIMIX_<name>(targ1 arg1, targ2 arg2, targ3 arg3) {
- // Your code in kernel mode
-}
+The simcall.in file list all the simcalls in sections. A line starting by "##"
+define a new section which will be replace by a "ifdef" in the generated code.
+There is a simcall by line which follow this format:
+
+~~~~
+Simcall -> Name HasAnswer Res Args
+Name -> [a-z0-9_]+
+Has_Answer -> "True" | "False"
+Res -> "(" Type MaybeCast ")"
+Args -> Args Arg | Arg
+Arg -> "(" Name "," Type MaybeCast ")"
+Type -> "char" | "const char*" | "int" | "long" | "unsigned char" | "unsigned short" | "unsigned int" | "unsigned long" | "float" | "double" | "void*" | "FPtr" | "const void*" | "size_t" | "sg_size_t" | "void" | "void*"
+MaybeCast -> "," Cast | ""
+Cast -> [a-z0-9_* ]+
~~~~
\section simgrid_dev_guide_tag What is How to add a new tag for xml files?
your simulation speed even if you simulate without activating
the model-checker. We are working on improving this situation.
- @li <b>enable_supernovae</b> (ON/OFF): If you use an ancient
- compiler (such as gcc prior to 4.6), you want to enable this
- option to ensure that the whole SimGrid library is presented to
- the compiler as a unique compilation unit to allow cross-units
- optimizations. This is useless on modern compilers (and will
- soon be droped).
-
@li <b>enable_compile_warnings</b> (ON/OFF): request the compiler to
issue error message whenever the source code is not perfectly
clean. If you develop SimGrid itself, you must activate it to
## 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
*
*/
+/** @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
* is based on POSIX functions.
*/
-
/**
@defgroup msg_trace_driven Trace-driven simulations
@ingroup MSG_API
/** \addtogroup SURF_API
-
+
\section SURF_doc Surf documentation
+ Surf is composed several components:
- \ref SURF_simulation
- \ref SURF_actions
- \ref SURF_resources
- \ref SURF_build_api
+ - \ref SURF_interface
+ - \ref SURF_routing_interface
+ - \ref SURF_cpu_interface
+ - \ref SURF_network_interface
+ - \ref SURF_storage_interface
+ - \ref SURF_workstation_interface
+ - \ref SURF_vm_workstation_interface
+ - \ref SURF_callbacks
+ - \ref SURF_plugin_energy
+
*/
the simulation and exiting SURF.
*/
-/** \defgroup SURF_actions SURF actions
- \ingroup SURF_API
- \brief This section describes the different datatypes and operations related to the actions in SURF.
-
- \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Actions" --> \endhtmlonly
-*/
-
-/** \defgroup SURF_resources SURF resources
- \ingroup SURF_API
- \brief This section describes the different datatypes and operations related to the resources in SURF.
-
- \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Resources" --> \endhtmlonly
-*/
-
/** \defgroup SURF_build_api Create a new API
\ingroup SURF_API
\brief How to build a new API on top of SURF
we strongly recommand you to contact us before anyway.
*/
+
+/**
+@defgroup SURF_c_bindings SURF C bindings
+@ingroup SURF_API
+@brief Describes the c bindings of SURF
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf C bindings" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_routing_interface SURF Routing Interface
+@ingroup SURF_API
+@brief Describes the routing interface
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Routing" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_interface SURF Interface
+@ingroup SURF_API
+@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM)
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Surf Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_cpu_interface SURF Cpu Interface
+@ingroup SURF_API
+@brief Describes the general Cpu interface for all Cpu implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Cpu Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_network_interface SURF Network Interface
+@ingroup SURF_API
+@brief Describes the general Network interface for all Network implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Network Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_storage_interface SURF Storage Interface
+@ingroup SURF_API
+@brief Describes the general interface for all Storage implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Storage Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_workstation_interface SURF Workstation Interface
+@ingroup SURF_API
+@brief Describes the general interface for all Workstation implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Workstation Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_vm_workstation_interface SURF VM Workstation Interface
+@ingroup SURF_API
+@brief Describes the general interface for all VM Workstation implementations
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="VM Workstation Interface" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_lmm SURF Linear MaxMin
+@ingroup SURF_API
+@brief Describes how the linear MaxMin system work
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="SURF Linear MaxMin" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_callbacks SURF callbacks
+@ingroup SURF_API
+@brief Describes how to use the SURF callbacks
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="SURF callbacks" --> @endhtmlonly
+*/
+
+/**
+@defgroup SURF_plugin_energy SURF Energy Plugin
+@ingroup SURF_API
+@brief Describes how to use the energy plugin.
+
+@htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Energy plugin" --> @endhtmlonly
+*/
\ No newline at end of file
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 ').
within that tag, you can pass one or several \c \<prop\> tags to specify
the configuration to use. For example, setting \c Item to \c Value
can be done by adding the following to the beginning of your platform
-file: \verbatim
+file:
+\verbatim
<config>
<prop id="Item" value="Value"/>
</config>
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.
<b>cluster example</b>
\verbatim
-<cluster id="my_cluster_1" prefix="" suffix=""
- radical="0-262144" power="1000000000" bw="125000000" lat="5E-5"/>
-<cluster id="my_cluster_1" prefix="c-" suffix=".me"
- radical="0-99" power="1000000000" bw="125000000" lat="5E-5"
- bb_bw="2250000000" bb_lat="5E-4"/>
+<cluster id="my_cluster_1" prefix="" suffix="" radical="0-262144"
+ power="1e9" bw="125e6" lat="5E-5"/>
+
+<cluster id="my_cluster_1" prefix="c-" suffix=".me" radical="0-99"
+ power="1e9" bw="125e6" lat="5E-5"
+ bb_bw="2.25e9" bb_lat="5E-4"/>
\endverbatim
-The second examples creates 100 machines, which names are the following:
+The second examples creates one router and 100 machines, which names
+are the following:
\verbatim
+c-my_cluster_1_router.me
c-0.my_cluster_1.me
c-1.my_cluster_1.me
c-2.my_cluster_1.me
\li <b>content</b>: default value 0. The file containing the disk
content. (may be moved soon or later to <b>storage</b> tag.
-The tag must contains some predefined prop, as may do some other
-resources tags. This should moved to attributes soon or later.
-<b>storage_type</b> mandatory <b>prop</b> :
+The tag must contains some predefined model prop, as may do some other
+resources tags.
+<b>storage_type</b> mandatory <b>model_prop</b> :
\li <b>Bwrite</b>: value in B/s. Write throughput
\li <b>Bread</b>: value in B/s. Read throughput
\li <b>Bconnexion</b>: value in B/s. Connection throughput (i.e. the
throughput of the storage connector).
+A storage_type can also contain the <b>prop</b> tag. The prop tag allows you
+to define additional information on this storage_type following the
+attribute/value schema. You may want to use it to give information to
+the tool you use for rendering your simulation, for example.
+
+\verbatim
+<storage_type id="single_HDD" model="linear_no_lat" size="4000" content_type="txt_unix">
+ <model_prop id="Bwrite" value="30MBps" />
+ <model_prop id="Bread" value="100MBps" />
+ <model_prop id="Bconnection" value="150MBps" />
+ <b><prop id="Brand" value="Western Digital" /></b>
+</storage_type>
+\endverbatim
+
\subsubsection pf_sto_st storage
<b>storage_type</b> attributes :
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
! 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'
> [ 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.
-/**
-* 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;
-/*
- * 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
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
#!/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
-/*
- * 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;
-/*
- * 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;
-/*
- * 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
-/*
- * 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 {
-/*
- * 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 {
-/*
- * 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 {
-/*
- * 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 {
-/*
- * 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;
-/*
- * 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 {
-/*
- * 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);
}
/* 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
+}
-/*
- * 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;
-/*
- * 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;
this.hosts = hosts;
}
public void main(String[] args) throws MsgException {
- int slavesCount = 10;
+ int slavesCount = Cloud.hostNB;
ArrayList<VM> vms = new ArrayList<VM>();
+ // Create one VM per host and bind a process inside each one.
for (int i = 0; i < slavesCount; i++) {
- Slave slave = new Slave(hosts[i],i);
- slave.start();
- VM vm = new VM(hosts[i],hosts[i]+"_"+i,1);
- vm.bind(slave);
+ Msg.info("create VM0"+i);
+ VM vm = new VM(hosts[i+1],"VM0"+i);
+ vm.start();
vms.add(vm);
+ Slave slave = new Slave(vm,i);
+ Msg.info("Put Worker "+slave.msgName()+ " on "+vm.getName());
+ slave.start();
+
}
Msg.info("Launched " + vms.size() + " VMs");
Msg.info("Send a first batch of work to everyone");
workBatch(slavesCount);
- Msg.info("Now suspend all VMs, just for fun");
+ Msg.info("Suspend all VMs");
for (int i = 0; i < vms.size(); i++) {
+ Msg.info("Suspend "+vms.get(i).getName());
vms.get(i).suspend();
}
Msg.info("Wait a while");
waitFor(2);
- Msg.info("Enough. Let's resume everybody.");
+ Msg.info("Resume all VMs.");
for (int i = 0; i < vms.size(); i++) {
vms.get(i).resume();
}
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);
}
}
}
-/*
- * 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;
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;
} catch (MsgException e) {
}
- Msg.info("\"" + task.getName() + "\" done ");
+ Msg.info(this.msgName() +" executed task (" + task.getName()+")");
}
}
-}
\ No newline at end of file
+}
! output sort
$ java -classpath ${classpath:=.} cloud/Cloud ${srcdir:=.}/platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n"
-> [ 0.000000] (10:Slave 8@Jean_Yves) Receiving on slave_8
-> [ 0.000000] (11:Slave 9@Fafard) Receiving on slave_9
-> [ 0.000000] (1:Master@Jacquelin) Launched 10 VMs
+> [ 0.000000] (0:@) Using regular java threads. Coroutines could speed your simulation up.
+> [ 0.000000] (0:@) Start2 hosts
+> [ 0.000000] (1:Master@Jacquelin) create VM00
+> [ 0.000000] (0:@) Create VM(VM00)@PM(Intel) with 0 mounted disks
+> [ 0.000000] (1:Master@Jacquelin) Put Worker WRK00 on VM00
+> [ 0.000000] (2:WRK00@VM00) WRK00 is listenning on MBOX:WRK00
+> [ 0.000000] (1:Master@Jacquelin) create VM01
+> [ 0.000000] (0:@) Create VM(VM01)@PM(Provost) with 0 mounted disks
+> [ 0.000000] (1:Master@Jacquelin) Put Worker WRK01 on VM01
+> [ 0.000000] (3:WRK01@VM01) WRK01 is listenning on MBOX:WRK01
+> [ 0.000000] (1:Master@Jacquelin) Launched 2 VMs
> [ 0.000000] (1:Master@Jacquelin) Send a first batch of work to everyone
-> [ 0.000000] (1:Master@Jacquelin) Sending to 0
-> [ 0.000000] (2:Slave 0@Jacquelin) Receiving on slave_0
-> [ 0.000000] (3:Slave 1@Intel) Receiving on slave_1
-> [ 0.000000] (4:Slave 2@Provost) Receiving on slave_2
-> [ 0.000000] (5:Slave 3@Fernand) Receiving on slave_3
-> [ 0.000000] (6:Slave 4@Bescherelle) Receiving on slave_4
-> [ 0.000000] (7:Slave 5@Ethernet) Receiving on slave_5
-> [ 0.000000] (8:Slave 6@Kuenning) Receiving on slave_6
-> [ 0.000000] (9:Slave 7@Dodge) Receiving on slave_7
-> [ 0.000195] (1:Master@Jacquelin) Sending to 1
-> [ 0.000195] (2:Slave 0@Jacquelin) Received "Task_0". Processing it.
-> [ 0.000195] (2:Slave 0@Jacquelin) "Task_0" done
-> [ 0.000195] (2:Slave 0@Jacquelin) Receiving on slave_0
-> [ 0.918916] (1:Master@Jacquelin) Sending to 2
-> [ 0.918916] (3:Slave 1@Intel) Received "Task_1". Processing it.
-> [ 0.918916] (3:Slave 1@Intel) "Task_1" done
-> [ 0.918916] (3:Slave 1@Intel) Receiving on slave_1
-> [ 2.798593] (1:Master@Jacquelin) Sending to 3
-> [ 2.798593] (4:Slave 2@Provost) Received "Task_2". Processing it.
-> [ 2.798593] (4:Slave 2@Provost) "Task_2" done
-> [ 2.798593] (4:Slave 2@Provost) Receiving on slave_2
-> [ 4.624255] (1:Master@Jacquelin) Sending to 4
-> [ 4.624255] (5:Slave 3@Fernand) Received "Task_3". Processing it.
-> [ 4.624255] (5:Slave 3@Fernand) "Task_3" done
-> [ 4.624255] (5:Slave 3@Fernand) Receiving on slave_3
-> [ 5.487049] (1:Master@Jacquelin) Sending to 5
-> [ 5.487049] (6:Slave 4@Bescherelle) Received "Task_4". Processing it.
-> [ 5.487049] (6:Slave 4@Bescherelle) "Task_4" done
-> [ 5.487049] (6:Slave 4@Bescherelle) Receiving on slave_4
-> [ 6.547253] (1:Master@Jacquelin) Sending to 6
-> [ 6.547253] (7:Slave 5@Ethernet) Received "Task_5". Processing it.
-> [ 6.547253] (7:Slave 5@Ethernet) "Task_5" done
-> [ 6.547253] (7:Slave 5@Ethernet) Receiving on slave_5
-> [ 7.404569] (1:Master@Jacquelin) Sending to 7
-> [ 7.404569] (8:Slave 6@Kuenning) Received "Task_6". Processing it.
-> [ 7.404569] (8:Slave 6@Kuenning) "Task_6" done
-> [ 7.404569] (8:Slave 6@Kuenning) Receiving on slave_6
-> [ 8.804761] (1:Master@Jacquelin) Sending to 8
-> [ 8.804761] (9:Slave 7@Dodge) Received "Task_7". Processing it.
-> [ 8.804761] (9:Slave 7@Dodge) "Task_7" done
-> [ 8.804761] (9:Slave 7@Dodge) Receiving on slave_7
-> [ 9.729891] (10:Slave 8@Jean_Yves) Received "Task_8". Processing it.
-> [ 9.729891] (1:Master@Jacquelin) Sending to 9
-> [ 9.729892] (10:Slave 8@Jean_Yves) "Task_8" done
-> [ 9.729892] (10:Slave 8@Jean_Yves) Receiving on slave_8
-> [ 11.714553] (11:Slave 9@Fafard) Received "Task_9". Processing it.
-> [ 11.714553] (1:Master@Jacquelin) Now suspend all VMs, just for fun
-> [ 11.714553] (1:Master@Jacquelin) Wait a while
-> [ 13.714553] (11:Slave 9@Fafard) "Task_9" done
-> [ 13.714553] (11:Slave 9@Fafard) Receiving on slave_9
-> [ 13.714553] (1:Master@Jacquelin) Enough. Let's resume everybody.
-> [ 13.714553] (1:Master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work
-> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up.
-> [1000.000000] (12:Slave 10@Jacquelin) Receiving on slave_10
-> [1000.000000] (13:Slave 11@Intel) Receiving on slave_11
-> [1000.000000] (14:Slave 12@Provost) Receiving on slave_12
-> [1000.000000] (15:Slave 13@Fernand) Receiving on slave_13
-> [1000.000000] (16:Slave 14@Bescherelle) Receiving on slave_14
-> [1000.000000] (17:Slave 15@Ethernet) Receiving on slave_15
-> [1000.000000] (18:Slave 16@Kuenning) Receiving on slave_16
-> [1000.000000] (19:Slave 17@Dodge) Receiving on slave_17
-> [1000.000000] (1:Master@Jacquelin) Add one more process per VM.
-> [1000.000000] (1:Master@Jacquelin) Migrate everyone to the second host.
-> [1000.000000] (1:Master@Jacquelin) Suspend everyone, move them to the third host, and resume them.
-> [1000.000000] (1:Master@Jacquelin) Sending to 0
-> [1000.000000] (20:Slave 18@Jean_Yves) Receiving on slave_18
-> [1000.000000] (21:Slave 19@Fafard) Receiving on slave_19
-> [1000.000195] (1:Master@Jacquelin) Sending to 1
-> [1000.000195] (2:Slave 0@Provost) Received "Task_0". Processing it.
-> [1000.000195] (2:Slave 0@Provost) "Task_0" done
-> [1000.000195] (2:Slave 0@Provost) Receiving on slave_0
-> [1000.918916] (1:Master@Jacquelin) Sending to 2
-> [1000.918916] (3:Slave 1@Provost) Received "Task_1". Processing it.
-> [1000.918916] (3:Slave 1@Provost) "Task_1" done
-> [1000.918916] (3:Slave 1@Provost) Receiving on slave_1
-> [1002.798593] (1:Master@Jacquelin) Sending to 3
-> [1002.798593] (4:Slave 2@Provost) Received "Task_2". Processing it.
-> [1002.798593] (4:Slave 2@Provost) "Task_2" done
-> [1002.798593] (4:Slave 2@Provost) Receiving on slave_2
-> [1004.624255] (1:Master@Jacquelin) Sending to 4
-> [1004.624255] (5:Slave 3@Provost) Received "Task_3". Processing it.
-> [1004.624255] (5:Slave 3@Provost) "Task_3" done
-> [1004.624255] (5:Slave 3@Provost) Receiving on slave_3
-> [1005.487049] (1:Master@Jacquelin) Sending to 5
-> [1005.487049] (6:Slave 4@Provost) Received "Task_4". Processing it.
-> [1005.487049] (6:Slave 4@Provost) "Task_4" done
-> [1005.487049] (6:Slave 4@Provost) Receiving on slave_4
-> [1006.547253] (1:Master@Jacquelin) Sending to 6
-> [1006.547253] (7:Slave 5@Provost) Received "Task_5". Processing it.
-> [1006.547253] (7:Slave 5@Provost) "Task_5" done
-> [1006.547253] (7:Slave 5@Provost) Receiving on slave_5
-> [1007.404569] (1:Master@Jacquelin) Sending to 7
-> [1007.404569] (8:Slave 6@Provost) Received "Task_6". Processing it.
-> [1007.404569] (8:Slave 6@Provost) "Task_6" done
-> [1007.404569] (8:Slave 6@Provost) Receiving on slave_6
-> [1008.804761] (1:Master@Jacquelin) Sending to 8
-> [1008.804761] (9:Slave 7@Provost) Received "Task_7". Processing it.
-> [1008.804761] (9:Slave 7@Provost) "Task_7" done
-> [1008.804761] (9:Slave 7@Provost) Receiving on slave_7
-> [1009.729891] (10:Slave 8@Provost) Received "Task_8". Processing it.
-> [1009.729891] (1:Master@Jacquelin) Sending to 9
-> [1009.729892] (10:Slave 8@Provost) "Task_8" done
-> [1009.729892] (10:Slave 8@Provost) Receiving on slave_8
-> [1011.714553] (11:Slave 9@Provost) Received "Task_9". Processing it.
-> [1011.714553] (11:Slave 9@Provost) "Task_9" done
-> [1011.714553] (11:Slave 9@Provost) Receiving on slave_9
-> [1011.714553] (1:Master@Jacquelin) Sending to 10
-> [1011.714748] (12:Slave 10@Provost) Received "Task_10". Processing it.
-> [1011.714748] (12:Slave 10@Provost) "Task_10" done
-> [1011.714748] (12:Slave 10@Provost) Receiving on slave_10
-> [1011.714748] (1:Master@Jacquelin) Sending to 11
-> [1012.633469] (13:Slave 11@Provost) Received "Task_11". Processing it.
-> [1012.633469] (13:Slave 11@Provost) "Task_11" done
-> [1012.633469] (13:Slave 11@Provost) Receiving on slave_11
-> [1012.633469] (1:Master@Jacquelin) Sending to 12
-> [1014.513146] (14:Slave 12@Provost) Received "Task_12". Processing it.
-> [1014.513146] (14:Slave 12@Provost) "Task_12" done
-> [1014.513146] (14:Slave 12@Provost) Receiving on slave_12
-> [1014.513146] (1:Master@Jacquelin) Sending to 13
-> [1016.338807] (15:Slave 13@Provost) Received "Task_13". Processing it.
-> [1016.338807] (15:Slave 13@Provost) "Task_13" done
-> [1016.338807] (15:Slave 13@Provost) Receiving on slave_13
-> [1016.338807] (1:Master@Jacquelin) Sending to 14
-> [1017.201602] (16:Slave 14@Provost) Received "Task_14". Processing it.
-> [1017.201602] (16:Slave 14@Provost) "Task_14" done
-> [1017.201602] (16:Slave 14@Provost) Receiving on slave_14
-> [1017.201602] (1:Master@Jacquelin) Sending to 15
-> [1018.261806] (17:Slave 15@Provost) Received "Task_15". Processing it.
-> [1018.261806] (17:Slave 15@Provost) "Task_15" done
-> [1018.261806] (17:Slave 15@Provost) Receiving on slave_15
-> [1018.261806] (1:Master@Jacquelin) Sending to 16
-> [1019.119122] (18:Slave 16@Provost) Received "Task_16". Processing it.
-> [1019.119122] (18:Slave 16@Provost) "Task_16" done
-> [1019.119122] (18:Slave 16@Provost) Receiving on slave_16
-> [1019.119122] (1:Master@Jacquelin) Sending to 17
-> [1020.519313] (19:Slave 17@Provost) Received "Task_17". Processing it.
-> [1020.519313] (19:Slave 17@Provost) "Task_17" done
-> [1020.519313] (19:Slave 17@Provost) Receiving on slave_17
-> [1020.519313] (1:Master@Jacquelin) Sending to 18
-> [1021.444444] (1:Master@Jacquelin) Sending to 19
-> [1021.444444] (20:Slave 18@Provost) Received "Task_18". Processing it.
-> [1021.444444] (20:Slave 18@Provost) "Task_18" done
-> [1021.444444] (20:Slave 18@Provost) Receiving on slave_18
-> [1023.429105] (0:@) MSG_main finished; Cleaning up the simulation...
-> [1023.429105] (1:Master@Jacquelin) Let's shut down the simulation and kill everyone.
-> [1023.429105] (1:Master@Jacquelin) Master done.
-> [1023.429105] (21:Slave 19@Provost) Received "Task_19". Processing it.
+> [ 0.000000] (1:Master@Jacquelin) Sending to WRK00
+> [ 0.918703] (2:WRK00@VM00) Received "Task00". Processing it.
+> [ 0.918703] (1:Master@Jacquelin) Sending to WRK01
+> [ 0.918703] (2:WRK00@VM00) WRK00 executed task (Task00)
+> [ 2.798361] (3:WRK01@VM01) Received "Task01". Processing it.
+> [ 2.798361] (1:Master@Jacquelin) Suspend all VMs
+> [ 2.798361] (1:Master@Jacquelin) Suspend VM00
+> [ 2.798361] (1:Master@Jacquelin) Suspend VM01
+> [ 2.798361] (1:Master@Jacquelin) Wait a while
+> [ 4.798361] (1:Master@Jacquelin) Resume all VMs.
+> [ 4.798361] (1:Master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work
+> [ 4.798361] (3:WRK01@VM01) WRK01 executed task (Task01)
+> [1000.000000] (1:Master@Jacquelin) Migrate everyone to Fernand
+> [1000.000000] (1:Master@Jacquelin) Migrate VM00fromIntelto Fernand
+> [1000.000000] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage1: remaining_size 1073741824.000000
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) actual banwdidth 6.964983 (MB/s), threshold 219099.412193
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage 2:0 updated_size 0.000000 computed_during_stage1 0.000000 dp_rate 0.000000 dp_cap 1193046471.111111
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage2.0: remaining_size 0.000000 (< threshold 219099.412193)
+> [1147.021183] (5:__pr_mig_tx:VM00(Intel-Provost)@Intel) mig-stage3: remaining_size 0.000000
+> [1149.029299] (0:@) migrate VM(VM00): set bound (137333000.000000) at Provost
+> [1149.029299] (4:__pr_mig_rx:VM00(Intel-Provost)@Provost) set affinity(0x0000@Provost) for VM00
+> [1150.908953] (1:Master@Jacquelin) Migrate VM01fromProvostto Fernand
+> [1150.908953] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage1: remaining_size 1073741824.000000
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) actual banwdidth 474.886827 (MB/s), threshold 14938647.898422
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage 2:0 updated_size 0.000000 computed_during_stage1 0.000000 dp_rate 0.000000 dp_cap 1193046471.111111
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage2.0: remaining_size 0.000000 (< threshold 14938647.898422)
+> [1153.065257] (9:__pr_mig_tx:VM01(Provost-Provost)@Provost) mig-stage3: remaining_size 0.000000
+> [1153.065452] (0:@) migrate VM(VM01): set bound (137333000.000000) at Provost
+> [1153.065452] (8:__pr_mig_rx:VM01(Provost-Provost)@Provost) set affinity(0x0000@Provost) for VM01
+> [1154.945106] (1:Master@Jacquelin) Let's shut down the simulation and kill everyone.
+> [1154.945106] (1:Master@Jacquelin) Master done.
+> [1154.945106] (0:@) MSG_main finished; Cleaning up the simulation...
--- /dev/null
+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
+ )
--- /dev/null
+/* 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();
+ }
+ }
--- /dev/null
+/* 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();
+
+
+ }
+}
--- /dev/null
+/* Copyright (c) 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+package cloud.migration;
+
+import org.simgrid.msg.*;
+import org.simgrid.msg.Process;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Test extends Process{
+
+ Test(Host host, String name, String[] args) throws HostNotFoundException, NativeException {
+ super(host, name, args);
+ }
+
+ public void main(String[] strings) throws MsgException {
+
+ double startTime = 0;
+ double endTime = 0;
+
+ /* get hosts 1 and 2*/
+ Host host0 = null;
+ Host host1 = null;
+
+ try {
+ host0 = Host.getByName("host0");
+ host1 = Host.getByName("host1");
+ }catch (HostNotFoundException e) {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+
+ List<VM> vms = new ArrayList<VM>();
+
+ /* Create VM1 */
+ int dpRate = 70;
+ int load1 = 90;
+ int load2 = 80;
+
+
+ Msg.info("This example evaluates the migration time of a VM in presence of collocated VMs on the source and the dest nodes");
+ Msg.info("The migrated VM has a memory intensity rate of 70% of the network BW and a cpu load of 90% \"(see cloudcom 2013 paper \"Adding a Live Migration Model Into SimGrid\" for further information) ");
+
+ Msg.info("Load of collocated VMs fluctuate between 0 and 90% in order to create a starvation issue and see whether it impacts or not the migration time");
+ XVM vm1 = null;
+ vm1 = new XVM(
+ host0,
+ "vm0",
+ 1, // Nb of vcpu
+ 2048, // Ramsize,
+ 125, // Net Bandwidth
+ null, //VM disk image
+ -1, //size of disk image,
+ 125, // Net bandwidth,
+ dpRate // Memory intensity
+ );
+ vms.add(vm1);
+ vm1.start();
+
+ /* Collocated VMs */
+ int collocatedSrc = 6;
+ int vmSrcLoad[] = {
+ 80,
+ 0,
+ 90,
+ 40,
+ 30,
+ 90,
+ };
+
+ XVM tmp = null;
+ for (int i=1 ; i<= collocatedSrc ; i++){
+ tmp = new XVM(
+ host0,
+ "vm"+i,
+ 1, // Nb of vcpu
+ 2048, // Ramsize,
+ 125, // Net Bandwidth
+ null, //VM disk image
+ -1, //size of disk image,
+ 125, // Net bandwidth,
+ dpRate // Memory intensity
+ );
+ vms.add(tmp);
+ tmp.start();
+ tmp.setLoad(vmSrcLoad[i-1]);
+ }
+
+ int collocatedDst = 6;
+ int vmDstLoad[] = {
+ 0,
+ 40,
+ 90,
+ 100,
+ 0,
+ 80,
+ };
+
+ for (int i=1 ; i <= collocatedDst ; i++){
+ tmp = new XVM(
+ host1,
+ "vm"+(i+collocatedSrc),
+ 1, // Nb of vcpu
+ 2048, // Ramsize,
+ 125, // Net Bandwidth
+ null, //VM disk image
+ -1, //size of disk image,
+ 125, // Net bandwidth,
+ dpRate // Memory intensity
+ );
+ vms.add(tmp);
+ tmp.start();
+ tmp.setLoad(vmDstLoad[i-1]);
+ }
+
+ Msg.info("Round trip of VM1 (load "+load1+"%)");
+ vm1.setLoad(load1);
+ Msg.info(" - Launch migration from host 0 to host 1");
+ startTime = Msg.getClock();
+ vm1.migrate(host1);
+ endTime = Msg.getClock();
+ Msg.info(" - End of Migration from host 0 to host 1 (duration:"+(endTime-startTime)+")");
+ Msg.info(" - Launch migration from host 1 to host 0");
+ startTime = Msg.getClock();
+ vm1.migrate(host0);
+ endTime = Msg.getClock();
+ Msg.info(" - End of Migration from host 1 to host 0 (duration:"+(endTime-startTime)+")");
+
+ Msg.info("\n \n \nRound trip of VM1 (load "+load2+"%)");
+ vm1.setLoad(load2);
+ Msg.info(" - Launch migration from host 0 to host 1");
+ startTime = Msg.getClock();
+ vm1.migrate(host1);
+ endTime = Msg.getClock();
+ Msg.info(" - End of Migration from host 0 to host 1 (duration:"+(endTime-startTime)+")");
+ Msg.info(" - Launch migration from host 1 to host 0");
+ startTime = Msg.getClock();
+ vm1.migrate(host0);
+ endTime = Msg.getClock();
+ Msg.info(" - End of Migration from host 1 to host 0 (duration:"+(endTime-startTime)+")");
+
+ Main.setEndOfTest();
+ Msg.info("Destroy VMs");
+ for (VM vm: vms)
+ vm.destroy();
+ }
+}
--- /dev/null
+/* 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());
+ }
+}
--- /dev/null
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+ <process host="host0" function="cloud/migration/Test">
+ </process>
+</platform>
--- /dev/null
+#! 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...
--- /dev/null
+<?xml version='1.0'?>
+ <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+ <platform version="3">
+ <AS id="AS0" routing="Full">
+ <host id="host0" core="4" power="8095000000"/>
+ <host id="host1" core="4" power="8095000000"/>
+ <link id="link1" bandwidth="125000000" latency="0.000100"/>
+ <route src="host0" dst="host1"><link_ctn id="link1"/></route>
+ </AS>
+ </platform>
\ No newline at end of file
-/*
- * 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;
-/*
- * 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.*;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/* 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
-/* 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;
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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;
-/* 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
-/* 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;
-/* 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
-/* 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
-/* 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
! 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'
> [ 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.
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
! 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.
> [ 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.
-
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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 {
}
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
<link id="108" bandwidth="990.5kBps" latency="1.742977ms"/>
<link id="115" bandwidth="926.625kBps" latency="601.375us"/>
<link id="92" bandwidth="1.564125MBps" latency="788.956us"/>
- <link id="103" bandwidth="472.125kBps" latency="5.161451ms"/>
+ <link id="103" bandwidth="472.125MBps" latency="5.161451ms"/>
<link id="10" bandwidth="34.285625MBps" latency="514.433us"/>
<link id="113" bandwidth="1.858MBps" latency="820.952us"/>
<link id="152" bandwidth="7.20975MBps" latency="1.461517ms"/>
<link id="88" bandwidth="10.314625MBps" latency="6.932556ms"/>
<link id="116" bandwidth="2.368MBps" latency="9.547561ms"/>
<link id="144" bandwidth="259.125kBps" latency="4.460898ms"/>
- <link id="141" bandwidth="472.125kBps" latency="5.161451ms"/>
+ <link id="141" bandwidth="472.125MBps" latency="5.161451ms"/>
<link id="30" bandwidth="10.099625MBps" latency="479.78us"/>
<link id="100" bandwidth="721.625kBps" latency="6.406us"/>
<link id="25" bandwidth="8.015125MBps" latency="35.076518ms"/>
-/*
- * 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;
-/*
- * 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;
! 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.
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
! 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.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.
-
-/*
- * 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;
-/*
- * $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;
-/*
- * 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;
-/*
- * $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;
+-- 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
+-- 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"};
+-- 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
+-- 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()
+-- 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")
+-- 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")
+-- 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")
-- 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
+-- 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'
+-- 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(...)
+-- 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'
-
+-- 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();
+-- 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(...)
-- 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
+-- 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 = {},
+-- 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
+-- 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
+-- 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 ----------------------------------------------------------
-
+-- 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"};
+-- 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
+-- 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"
+-- 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")
+-- 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")
+-- 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(...)
+-- 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(...)
+-- 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 ----------------------------------------------------------
+-- 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"
+-- 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"};
+-- 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
+-- 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(...)
+-- 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'
+-- 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(...)
-/* 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
-/* 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"
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);
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);
-/* 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
-/* 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"
- /* Copyright (c) 2012-2013. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "connection.h"
#include "bittorrent.h"
#include <xbt/sysdep.h>
-/* 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_
/**
#!/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
- /* 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"
-/* 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
-/* 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"
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;
xbt_free(peer->pieces_count);
xbt_free(peer->bitfield);
xbt_free(peer->bitfield_blocks);
-
- RngStream_DeleteStream(&peer->stream);
}
/**
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef BITTORRENT_PEER_H
#define BITTORRENT_PEER_H
#include <msg/msg.h>
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "tracker.h"
#include <msg/msg.h>
#include <xbt/RngStream.h>
{
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
-/* 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
+/* 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,
+/* 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
-/* 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
+/* 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)
+/* 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
#!/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
+/* 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 */
+/* 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
+/* 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)
+/* 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
+/* 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,
+/* 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
-
-/* 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
} s_task_data_t, *task_data_t;
static int *powers2;
+static xbt_dynar_t host_list;
// utility functions
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);
}
// 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);
{
XBT_DEBUG("Well Guys! I Think it's time for me to quit ;)");
quit_notify(node);
- RngStream_DeleteStream(&node->stream);
}
/**
// 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;
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);
*/
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);
}
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);
! 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
> [ 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
> [ 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
> [ 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
> [ 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
> [ 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
> [ 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
! 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
> [ 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
> [ 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
> [ 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
> [ 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
> [ 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
> [ 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
#!/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
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
--- /dev/null
+/* Copyright (c) 2007-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */
+#include "xbt/sysdep.h" /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+ "Messages specific for this msg example");
+
+/** @addtogroup MSG_examples
+ *
+ * - <b>priority/priority.c</b>: Demonstrates the use of @ref
+ * MSG_task_set_bound to change the computation priority of a
+ * given task.
+ *
+ */
+
+static int worker_main(int argc, char *argv[])
+{
+ double computation_amount = atof(argv[1]);
+ int use_bound = atoi(argv[2]);
+ double bound = atof(argv[3]);
+
+ {
+ double clock_sta = MSG_get_clock();
+
+ msg_task_t task = MSG_task_create("Task", computation_amount, 0, NULL);
+ if (use_bound)
+ MSG_task_set_bound(task, bound);
+ MSG_task_execute(task);
+ MSG_task_destroy(task);
+
+ double clock_end = MSG_get_clock();
+ double duration = clock_end - clock_sta;
+ double flops_per_sec = computation_amount / duration;
+
+ if (use_bound)
+ XBT_INFO("bound to %f => duration %f (%f flops/s)", bound, duration, flops_per_sec);
+ else
+ XBT_INFO("not bound => duration %f (%f flops/s)", duration, flops_per_sec);
+ }
+
+ return 0;
+}
+
+static void launch_worker(msg_host_t host, const char *pr_name, double computation_amount, int use_bound, double bound)
+{
+ char **argv = xbt_new(char *, 5);
+ argv[0] = xbt_strdup(pr_name);
+ argv[1] = bprintf("%f", computation_amount);
+ argv[2] = bprintf("%d", use_bound);
+ argv[3] = bprintf("%f", bound);
+ argv[4] = NULL;
+
+ MSG_process_create_with_arguments(pr_name, worker_main, NULL, host, 4, argv);
+}
+
+
+
+static int worker_busy_loop_main(int argc, char *argv[])
+{
+ msg_task_t *task = MSG_process_get_data(MSG_process_self());
+ for (;;)
+ MSG_task_execute(*task);
+
+ return 0;
+}
+
+/* FIXME: */
+#define DOUBLE_MAX 1e11
+
+static void test_dynamic_change(void)
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+
+ msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+ msg_host_t vm1 = MSG_vm_create_core(pm0, "VM1");
+ MSG_vm_start(vm0);
+ MSG_vm_start(vm1);
+
+ msg_task_t task0 = MSG_task_create("Task0", DOUBLE_MAX, 0, NULL);
+ msg_task_t task1 = MSG_task_create("Task1", DOUBLE_MAX, 0, NULL);
+ msg_process_t pr0 = MSG_process_create("worker0", worker_busy_loop_main, &task0, vm0);
+ msg_process_t pr1 = MSG_process_create("worker1", worker_busy_loop_main, &task1, vm1);
+
+
+ double task0_remain_prev = MSG_task_get_remaining_computation(task0);
+ double task1_remain_prev = MSG_task_get_remaining_computation(task1);
+
+ {
+ const double cpu_speed = MSG_get_host_speed(pm0);
+ int i = 0;
+ for (i = 0; i < 10; i++) {
+ double new_bound = (cpu_speed / 10) * i;
+ XBT_INFO("set bound of VM1 to %f", new_bound);
+ MSG_vm_set_bound(vm1, new_bound);
+ MSG_process_sleep(100);
+
+ double task0_remain_now = MSG_task_get_remaining_computation(task0);
+ double task1_remain_now = MSG_task_get_remaining_computation(task1);
+
+ double task0_flops_per_sec = task0_remain_prev - task0_remain_now;
+ double task1_flops_per_sec = task1_remain_prev - task1_remain_now;
+
+ XBT_INFO("Task0@VM0: %f flops/s", task0_flops_per_sec / 100);
+ XBT_INFO("Task1@VM1: %f flops/s", task1_flops_per_sec / 100);
+
+ task0_remain_prev = task0_remain_now;
+ task1_remain_prev = task1_remain_now;
+ }
+ }
+
+ MSG_process_kill(pr0);
+ MSG_process_kill(pr1);
+
+ MSG_vm_destroy(vm0);
+ MSG_vm_destroy(vm1);
+}
+
+
+
+static void test_one_task(msg_host_t hostA)
+{
+ const double cpu_speed = MSG_get_host_speed(hostA);
+ const double computation_amount = cpu_speed * 10;
+ const char *hostA_name = MSG_host_get_name(hostA);
+
+ XBT_INFO("### Test: with/without MSG_task_set_bound");
+
+#if 0
+ /* Easy-to-understand code (without calling MSG_task_set_bound) */
+ {
+ double clock_sta = MSG_get_clock();
+
+ msg_task_t task = MSG_task_create("Task", computation_amount, 0, NULL);
+ MSG_task_execute(task);
+ MSG_task_destroy(task);
+
+ double clock_end = MSG_get_clock();
+ double duration = clock_end - clock_sta;
+ double flops_per_sec = computation_amount / duration;
+
+ XBT_INFO("not bound => duration %f (%f flops/s)", duration, flops_per_sec);
+ }
+
+ /* Easy-to-understand code (with calling MSG_task_set_bound) */
+ {
+ double clock_sta = MSG_get_clock();
+
+ msg_task_t task = MSG_task_create("Task", computation_amount, 0, NULL);
+ MSG_task_set_bound(task, cpu_speed / 2);
+ MSG_task_execute(task);
+ MSG_task_destroy(task);
+
+ double clock_end = MSG_get_clock();
+ double duration = clock_end - clock_sta;
+ double flops_per_sec = computation_amount / duration;
+
+ XBT_INFO("bound to 0.5 => duration %f (%f flops/s)", duration, flops_per_sec);
+ }
+#endif
+
+ {
+ XBT_INFO("### Test: no bound for Task1@%s", hostA_name);
+ launch_worker(hostA, "worker0", computation_amount, 0, 0);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 50%% for Task1@%s", hostA_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 2);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 33%% for Task1@%s", hostA_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 3);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: zero for Task1@%s (i.e., unlimited)", hostA_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, 0);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 200%% for Task1@%s (i.e., meaningless)", hostA_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed * 2);
+ }
+
+ MSG_process_sleep(1000);
+}
+
+
+static void test_two_tasks(msg_host_t hostA, msg_host_t hostB)
+{
+ const double cpu_speed = MSG_get_host_speed(hostA);
+ xbt_assert(cpu_speed == MSG_get_host_speed(hostB));
+ const double computation_amount = cpu_speed * 10;
+ const char *hostA_name = MSG_host_get_name(hostA);
+ const char *hostB_name = MSG_host_get_name(hostB);
+
+ {
+ XBT_INFO("### Test: no bound for Task1@%s, no bound for Task2@%s", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 0, 0);
+ launch_worker(hostB, "worker1", computation_amount, 0, 0);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 0 for Task1@%s, 0 for Task2@%s (i.e., unlimited)", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, 0);
+ launch_worker(hostB, "worker1", computation_amount, 1, 0);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 50%% for Task1@%s, 50%% for Task2@%s", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 2);
+ launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 2);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 25%% for Task1@%s, 25%% for Task2@%s", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed / 4);
+ launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 4);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 75%% for Task1@%s, 100%% for Task2@%s", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed * 0.75);
+ launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: no bound for Task1@%s, 25%% for Task2@%s", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 0, 0);
+ launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 4);
+ }
+
+ MSG_process_sleep(1000);
+
+ {
+ XBT_INFO("### Test: 75%% for Task1@%s, 25%% for Task2@%s", hostA_name, hostB_name);
+ launch_worker(hostA, "worker0", computation_amount, 1, cpu_speed * 0.75);
+ launch_worker(hostB, "worker1", computation_amount, 1, cpu_speed / 4);
+ }
+
+ MSG_process_sleep(1000);
+}
+
+static int master_main(int argc, char *argv[])
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+
+
+ {
+ XBT_INFO("# 1. Put a single task on a PM. ");
+ test_one_task(pm0);
+ XBT_INFO(" ");
+
+
+ XBT_INFO("# 2. Put two tasks on a PM.");
+ test_two_tasks(pm0, pm0);
+ XBT_INFO(" ");
+ }
+
+
+ {
+ msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+ MSG_vm_start(vm0);
+
+ XBT_INFO("# 3. Put a single task on a VM. ");
+ test_one_task(vm0);
+ XBT_INFO(" ");
+
+ XBT_INFO("# 4. Put two tasks on a VM.");
+ test_two_tasks(vm0, vm0);
+ XBT_INFO(" ");
+
+
+ MSG_vm_destroy(vm0);
+ }
+
+
+ {
+ msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+ MSG_vm_start(vm0);
+
+ XBT_INFO("# 6. Put a task on a PM and a task on a VM.");
+ test_two_tasks(pm0, vm0);
+ XBT_INFO(" ");
+
+
+ MSG_vm_destroy(vm0);
+ }
+
+
+ {
+ msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+ const double cpu_speed = MSG_get_host_speed(pm0);
+ MSG_vm_set_bound(vm0, cpu_speed / 10);
+ MSG_vm_start(vm0);
+
+ XBT_INFO("# 7. Put a single task on the VM capped by 10%%.");
+ test_one_task(vm0);
+ XBT_INFO(" ");
+
+ XBT_INFO("# 8. Put two tasks on the VM capped by 10%%.");
+ test_two_tasks(vm0, vm0);
+ XBT_INFO(" ");
+
+ XBT_INFO("# 9. Put a task on a PM and a task on the VM capped by 10%%.");
+ test_two_tasks(pm0, vm0);
+ XBT_INFO(" ");
+
+ MSG_vm_destroy(vm0);
+ }
+
+
+ {
+ msg_host_t vm0 = MSG_vm_create_core(pm0, "VM0");
+
+ s_ws_params_t params;
+ memset(¶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);
+}
+++ /dev/null
-/* Copyright (c) 2007-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include <stdio.h>
-#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */
-#include "xbt/sysdep.h" /* calloc, printf */
-
-/* Create a log channel to have nice outputs. */
-#include "xbt/log.h"
-#include "xbt/asserts.h"
-XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
- "Messages specific for this msg example");
-
-/** @addtogroup MSG_examples
- *
- * - <b>cloud/masterslave_virtual_machines.c: Master/slaves
- * example, Ã la cloud</b>. The classical example revisited to demonstrate the use of virtual machines.
- */
-
-double task_comp_size = 10000000;
-double task_comm_size = 10000000;
-
-
-int master(int argc, char *argv[]);
-int slave_fun(int argc, char *argv[]);
-
-static void work_batch(int slaves_count) {
- int i;
- for (i = 0; i < slaves_count; i++) {
- char taskname_buffer[64];
- char mailbox_buffer[64];
-
- sprintf(taskname_buffer, "Task_%d", i);
- sprintf(mailbox_buffer,"Slave_%d",i);
-
- XBT_INFO("Sending \"%s\" to \"%s\"",taskname_buffer,mailbox_buffer);
- MSG_task_send(MSG_task_create(taskname_buffer, task_comp_size, task_comm_size,NULL),
- mailbox_buffer);
- }
-}
-
-int master(int argc, char *argv[]) {
- int slaves_count = 10;
- msg_host_t *slaves = xbt_new(msg_host_t,10);
-
- msg_vm_t vm;
- unsigned int i;
-
- /* Retrive the hostnames constituting our playground today */
- for (i = 1; i < argc; i++) {
- slaves[i - 1] = MSG_get_host_by_name(argv[i]);
- xbt_assert(slaves[i - 1] != NULL, "Cannot use inexistent host %s", argv[i]);
- }
-
- /* Launch the sub processes: one VM per host, with one process inside each */
-
- for (i=0;i<slaves_count;i++) {
- char slavename[64];
- sprintf(slavename,"Slave %d",i);
- char**argv=xbt_new(char*,3);
- argv[0] = xbt_strdup(slavename);
- argv[1] = bprintf("%d",i);
- argv[2] = NULL;
-
- char vmName[64];
- snprintf(vmName, 64, "vm_%d", i);
-
- msg_vm_t vm = MSG_vm_start(slaves[i],vmName,2);
- MSG_vm_bind(vm, MSG_process_create_with_arguments(slavename,slave_fun,NULL,slaves[i],2,argv));
- }
-
-
- xbt_dynar_t vms = MSG_vms_as_dynar();
- XBT_INFO("Launched %ld VMs", xbt_dynar_length(vms));
-
- /* Send a bunch of work to every one */
- XBT_INFO("Send a first batch of work to every one");
- work_batch(slaves_count);
-
- XBT_INFO("Now suspend all VMs, just for fun");
-
- xbt_dynar_foreach(vms,i,vm) {
- MSG_vm_suspend(vm);
- }
-
- XBT_INFO("Wait a while");
- MSG_process_sleep(2);
-
- XBT_INFO("Enough. Let's resume everybody.");
- xbt_dynar_foreach(vms,i,vm) {
- MSG_vm_resume(vm);
- }
- XBT_INFO("Sleep long enough for everyone to be done with previous batch of work");
- MSG_process_sleep(1000-MSG_get_clock());
-
- XBT_INFO("Add one more process per VM");
- xbt_dynar_foreach(vms,i,vm) {
- msg_vm_t vm = xbt_dynar_get_as(vms,i,msg_vm_t);
- char slavename[64];
- sprintf(slavename,"Slave %ld",i+xbt_dynar_length(vms));
- char**argv=xbt_new(char*,3);
- argv[0] = xbt_strdup(slavename);
- argv[1] = bprintf("%ld",i+xbt_dynar_length(vms));
- argv[2] = NULL;
- MSG_vm_bind(vm, MSG_process_create_with_arguments(slavename,slave_fun,NULL,slaves[i],2,argv));
- }
-
- XBT_INFO("Reboot all the VMs");
- xbt_dynar_foreach(vms,i,vm) {
- MSG_vm_reboot(vm);
- }
-
- work_batch(slaves_count*2);
-
- XBT_INFO("Migrate everyone to the second host.");
- xbt_dynar_foreach(vms,i,vm) {
- MSG_vm_migrate(vm,slaves[1]);
- }
- XBT_INFO("Suspend everyone, move them to the third host, and resume them.");
- xbt_dynar_foreach(vms,i,vm) {
- MSG_vm_suspend(vm);
- MSG_vm_migrate(vm,slaves[2]);
- MSG_vm_resume(vm);
- }
-
-
- XBT_INFO("Let's shut down the simulation. 10 first processes will be shut down cleanly while the second half will forcefully get killed");
- for (i = 0; i < slaves_count; i++) {
- char mailbox_buffer[64];
- sprintf(mailbox_buffer,"Slave_%d",i);
- msg_task_t finalize = MSG_task_create("finalize", 0, 0, 0);
- MSG_task_send(finalize, mailbox_buffer);
- }
-
- XBT_INFO("Wait a while before effective shutdown.");
- MSG_process_sleep(2);
-
- xbt_dynar_foreach(vms,i,vm) {
- MSG_vm_shutdown(vm);
- MSG_vm_destroy(vm);
- }
-
- XBT_INFO("Goodbye now!");
- free(slaves);
- xbt_dynar_free(&vms);
- return 0;
-} /* end_of_master */
-
-/** Receiver function */
-int slave_fun(int argc, char *argv[])
-{
- char mailbox_name[128];
- msg_task_t task = NULL;
- _XBT_GNUC_UNUSED int res;
- /* since the slaves will move around, use slave_%d as mailbox names instead of hostnames */
- xbt_assert(argc>=2, "slave processes need to be given their rank as parameter");
- sprintf(mailbox_name,"Slave_%s",argv[1]);
- XBT_INFO("Slave listenning on %s",argv[1]);
- while (1) {
- res = MSG_task_receive(&(task),mailbox_name);
- xbt_assert(res == MSG_OK, "MSG_task_get failed");
-
- XBT_INFO("Received \"%s\" from mailbox %s", MSG_task_get_name(task),mailbox_name);
- if (!strcmp(MSG_task_get_name(task), "finalize")) {
- MSG_task_destroy(task);
- break;
- }
-
- MSG_task_execute(task);
- XBT_INFO("\"%s\" done", MSG_task_get_name(task));
- MSG_task_destroy(task);
- task = NULL;
- }
-
- return 0;
-} /* end_of_slave */
-
-/** Main function */
-int main(int argc, char *argv[])
-{
- msg_error_t res = MSG_OK;
- xbt_dynar_t hosts_dynar;
- msg_host_t*hosts= xbt_new(msg_host_t,10);
- char**hostnames= xbt_new(char*,10);
- char**masterargv=xbt_new(char*,12);
- int i;
-
- /* Get the arguments */
- MSG_init(&argc, argv);
- if (argc < 2) {
- printf("Usage: %s platform_file\n", argv[0]);
- printf("example: %s msg_platform.xml\n", argv[0]);
- exit(1);
- } if (argc>2) {
- printf("Usage: %s platform_file\n", argv[0]);
- printf("Other parameters (such as the deployment file) are ignored.");
- }
-
- /* load the platform file */
- MSG_create_environment(argv[1]);
- /* Retrieve the 10 first hosts of the platform file */
- hosts_dynar = MSG_hosts_as_dynar();
- xbt_assert(xbt_dynar_length(hosts_dynar)>10,
- "I need at least 10 hosts in the platform file, but %s contains only %ld hosts_dynar.",
- argv[1],xbt_dynar_length(hosts_dynar));
- for (i=0;i<10;i++) {
- hosts[i] = xbt_dynar_get_as(hosts_dynar,i,msg_host_t);
- hostnames[i] = xbt_strdup(MSG_host_get_name(hosts[i]));
- }
- masterargv[0]=xbt_strdup("master");
- for (i=1;i<11;i++) {
- masterargv[i] = xbt_strdup(MSG_host_get_name(hosts[i-1]));
- }
- masterargv[11]=NULL;
- MSG_process_create_with_arguments("master",master,NULL,hosts[0],11,masterargv);
- res = MSG_main();
- XBT_INFO("Simulation time %g", MSG_get_clock());
-
- free(hosts);
- for (i=0;i<10;i++)
- free(hostnames[i]);
- free(hostnames);
- xbt_dynar_free(&hosts_dynar);
-
- if (res == MSG_OK)
- return 0;
- else
- return 1;
-} /* end_of_main */
+++ /dev/null
-#! ./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!
+++ /dev/null
-<?xml version='1.0'?>
-<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
-<platform version="3">
- <!-- The master process (with some arguments) -->
- <process host="Tremblay" function="master">
- <argument value="20"/> <!-- Number of tasks -->
- <argument value="50000000"/> <!-- Computation size of tasks -->
- <argument value="1000000"/> <!-- Communication size of tasks -->
- <argument value="Jupiter"/> <!-- First slave -->
- <argument value="Fafard"/> <!-- Second slave -->
- <argument value="Ginette"/> <!-- Third slave -->
- <argument value="Bourassa"/> <!-- Last slave -->
- </process>
- <!-- The slave process (with no argument) -->
- <process host="Tremblay" function="slave"/>
- <process host="Jupiter" function="slave"/>
- <process host="Fafard" function="slave"/>
- <process host="Ginette" function="slave"/>
- <process host="Bourassa" function="slave"/>
-</platform>
--- /dev/null
+/* Copyright (c) 2007-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"
+#include "xbt/sysdep.h" /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+ "Messages specific for this msg example");
+
+
+static void vm_migrate(msg_vm_t vm, msg_host_t dst_pm)
+{
+ msg_host_t src_pm = MSG_vm_get_pm(vm);
+ double mig_sta = MSG_get_clock();
+ MSG_vm_migrate(vm, dst_pm);
+ double mig_end = MSG_get_clock();
+
+ XBT_INFO("%s migrated: %s->%s in %g s", MSG_vm_get_name(vm),
+ MSG_host_get_name(src_pm), MSG_host_get_name(dst_pm),
+ mig_end - mig_sta);
+}
+
+static int migration_worker_main(int argc, char *argv[])
+{
+ xbt_assert(argc == 3);
+ char *vm_name = argv[1];
+ char *dst_pm_name = argv[2];
+
+ msg_vm_t vm = MSG_get_host_by_name(vm_name);
+ msg_host_t dst_pm = MSG_get_host_by_name(dst_pm_name);
+
+ vm_migrate(vm, dst_pm);
+
+ return 0;
+}
+
+static void vm_migrate_async(msg_vm_t vm, msg_host_t dst_pm)
+{
+ const char *vm_name = MSG_vm_get_name(vm);
+ const char *dst_pm_name = MSG_host_get_name(dst_pm);
+ msg_host_t host = MSG_host_self();
+
+ const char *pr_name = "mig_wrk";
+ char **argv = xbt_new(char *, 4);
+ argv[0] = xbt_strdup(pr_name);
+ argv[1] = xbt_strdup(vm_name);
+ argv[2] = xbt_strdup(dst_pm_name);
+ argv[3] = NULL;
+
+ MSG_process_create_with_arguments(pr_name, migration_worker_main, NULL, host, 3, argv);
+}
+
+static int master_main(int argc, char *argv[])
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+ msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+ msg_vm_t vm0, vm1;
+ s_ws_params_t params;
+ memset(¶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);
+}
--- /dev/null
+/* Copyright (c) 2007-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"
+#include "xbt/sysdep.h" /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
+
+
+
+
+
+static int worker_main(int argc, char *argv[])
+{
+ msg_task_t task = MSG_process_get_data(MSG_process_self());
+ MSG_task_execute(task);
+
+ XBT_INFO("task %p bye", task);
+
+ return 0;
+}
+
+
+struct task_data {
+ msg_task_t task;
+ double prev_computation_amount;
+ double prev_clock;
+};
+
+
+static void task_data_init_clock(struct task_data *t)
+{
+ t->prev_computation_amount = MSG_task_get_remaining_computation(t->task);
+ t->prev_clock = MSG_get_clock();
+}
+
+
+static void task_data_get_clock(struct task_data *t)
+{
+ double now_computation_amount = MSG_task_get_remaining_computation(t->task);
+ double now_clock = MSG_get_clock();
+
+ double done = t->prev_computation_amount - now_computation_amount;
+ double duration = now_clock - t->prev_clock;
+
+ XBT_INFO("%s: %f fops/s", MSG_task_get_name(t->task), done / duration);
+
+ t->prev_computation_amount = now_computation_amount;
+ t->prev_clock = now_clock;
+}
+
+
+static void test_pm_pin(void)
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+ msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+
+
+ struct task_data t1;
+ struct task_data t2;
+ struct task_data t3;
+ struct task_data t4;
+
+ t1.task = MSG_task_create("Task1", 1e16, 0, NULL);
+ t2.task = MSG_task_create("Task2", 1e16, 0, NULL);
+ t3.task = MSG_task_create("Task3", 1e16, 0, NULL);
+ t4.task = MSG_task_create("Task4", 1e16, 0, NULL);
+
+ MSG_process_create("worker1", worker_main, t1.task, pm1);
+ MSG_process_create("worker2", worker_main, t2.task, pm1);
+ MSG_process_create("worker3", worker_main, t3.task, pm1);
+ MSG_process_create("worker4", worker_main, t4.task, pm1);
+
+
+ XBT_INFO("## 1. start 4 tasks on PM1 (2 cores)");
+ task_data_init_clock(&t1);
+ task_data_init_clock(&t2);
+ task_data_init_clock(&t3);
+ task_data_init_clock(&t4);
+
+ MSG_process_sleep(10);
+ task_data_get_clock(&t1);
+ task_data_get_clock(&t2);
+ task_data_get_clock(&t3);
+ task_data_get_clock(&t4);
+
+
+ XBT_INFO("## 2. pin all tasks to CPU0");
+ MSG_task_set_affinity(t1.task, pm1, 0x01);
+ MSG_task_set_affinity(t2.task, pm1, 0x01);
+ MSG_task_set_affinity(t3.task, pm1, 0x01);
+ MSG_task_set_affinity(t4.task, pm1, 0x01);
+
+ MSG_process_sleep(10);
+ task_data_get_clock(&t1);
+ task_data_get_clock(&t2);
+ task_data_get_clock(&t3);
+ task_data_get_clock(&t4);
+
+
+ XBT_INFO("## 3. clear the affinity of task4");
+ MSG_task_set_affinity(t4.task, pm1, 0);
+
+ MSG_process_sleep(10);
+ task_data_get_clock(&t1);
+ task_data_get_clock(&t2);
+ task_data_get_clock(&t3);
+ task_data_get_clock(&t4);
+
+
+ XBT_INFO("## 4. clear the affinity of task3");
+ MSG_task_set_affinity(t3.task, pm1, 0);
+
+ MSG_process_sleep(10);
+ task_data_get_clock(&t1);
+ task_data_get_clock(&t2);
+ task_data_get_clock(&t3);
+ task_data_get_clock(&t4);
+
+
+ XBT_INFO("## 5. clear the affinity of task2");
+ MSG_task_set_affinity(t2.task, pm1, 0);
+
+ MSG_process_sleep(10);
+ task_data_get_clock(&t1);
+ task_data_get_clock(&t2);
+ task_data_get_clock(&t3);
+ task_data_get_clock(&t4);
+
+
+ XBT_INFO("## 6. pin all tasks to CPU0 of another PM (no effect now)");
+ MSG_task_set_affinity(t1.task, pm0, 0);
+ MSG_task_set_affinity(t2.task, pm0, 0);
+ MSG_task_set_affinity(t3.task, pm2, 0);
+ MSG_task_set_affinity(t4.task, pm2, 0);
+
+ MSG_process_sleep(10);
+ task_data_get_clock(&t1);
+ task_data_get_clock(&t2);
+ task_data_get_clock(&t3);
+ task_data_get_clock(&t4);
+
+
+
+ MSG_task_cancel(t1.task);
+ MSG_task_cancel(t2.task);
+ MSG_task_cancel(t3.task);
+ MSG_task_cancel(t4.task);
+ MSG_process_sleep(10);
+ MSG_task_destroy(t1.task);
+ MSG_task_destroy(t2.task);
+ MSG_task_destroy(t3.task);
+ MSG_task_destroy(t4.task);
+}
+
+
+static void test_vm_pin(void)
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t); // 1 cores
+ msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t); // 2 cores
+ msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t); // 4 cores
+
+
+ /* set up VMs on PM2 (4 cores) */
+ msg_vm_t vm0 = MSG_vm_create_core(pm2, "VM0");
+ msg_vm_t vm1 = MSG_vm_create_core(pm2, "VM1");
+ msg_vm_t vm2 = MSG_vm_create_core(pm2, "VM2");
+ msg_vm_t vm3 = MSG_vm_create_core(pm2, "VM3");
+
+ s_ws_params_t params;
+ memset(¶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);
+}
--- /dev/null
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+ <AS id="siteA" routing="Full">
+ <host id="PM0" power="1E8" core="1"/>
+ <host id="PM1" power="1E8" core="2"/>
+ <host id="PM2" power="1E8" core="4"/>
+
+ <!-- <link id="link1" bandwidth="1E6" latency="1E-2" /> -->
+ <link id="link1" bandwidth="12500000" latency="1E-2" />
+
+ <route src="PM0" dst="PM1">
+ <link_ctn id="link1"/>
+ </route>
+
+ <route src="PM0" dst="PM2">
+ <link_ctn id="link1"/>
+ </route>
+
+ <route src="PM1" dst="PM2">
+ <link_ctn id="link1"/>
+ </route>
+ </AS>
+</platform>
--- /dev/null
+/* Copyright (c) 2007-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include <sys/time.h>
+#include "msg/msg.h"
+#include "xbt/sysdep.h" /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+ "Messages specific for this msg example");
+
+/*
+ * Usage:
+ * ./examples/msg/cloud/scale ../examples/platforms/g5k.xml
+ *
+ * 1. valgrind --tool=callgrind ./examples/msg/cloud/scale ../examples/platforms/g5k.xml
+ * 2. kcachegrind
+ **/
+
+static double time_precise(void)
+{
+ struct timeval tv;
+ int ret = gettimeofday(&tv, NULL);
+ if (ret < 0)
+ xbt_die("gettimeofday");
+
+ double now = (double) tv.tv_sec + tv.tv_usec * 0.001 * 0.001;
+
+ return now;
+}
+
+static int computation_fun(int argc, char *argv[])
+{
+ for (;;) {
+ // double clock_sta = time_precise();
+
+ msg_task_t task = MSG_task_create("Task", 10000000, 0, NULL);
+ MSG_task_execute(task);
+ MSG_task_destroy(task);
+
+ // double clock_end = time_precise();
+
+ // XBT_INFO("%f", clock_end - clock_sta);
+ }
+
+
+ return 0;
+}
+
+static void launch_computation_worker(msg_host_t host)
+{
+ MSG_process_create("compute", computation_fun, NULL, host);
+}
+
+#if 0
+struct task_priv {
+ msg_host_t tx_host;
+ msg_process_t tx_proc;
+ double clock_sta;
+};
+
+static int communication_tx_fun(int argc, char *argv[])
+{
+ xbt_assert(argc == 2);
+ const char *mbox = argv[1];
+
+ msg_task_t task = MSG_task_create("Task", 1000000, 1000000, NULL);
+
+ struct task_priv *priv = xbt_new(struct task_priv, 1);
+ priv->tx_proc = MSG_process_self();
+ priv->tx_host = MSG_host_self();
+ priv->clock_sta = MSG_get_clock();
+
+ MSG_task_set_data(task, priv);
+
+ MSG_task_send(task, mbox);
+
+ return 0;
+}
+
+static int communication_rx_fun(int argc, char *argv[])
+{
+ const char *pr_name = MSG_process_get_name(MSG_process_self());
+ const char *host_name = MSG_host_get_name(MSG_host_self());
+ xbt_assert(argc == 2);
+ const char *mbox = argv[1];
+
+ msg_task_t task = NULL;
+ MSG_task_recv(&task, mbox);
+
+ struct task_priv *priv = MSG_task_get_data(task);
+ double clock_end = MSG_get_clock();
+
+ XBT_INFO("%s:%s to %s:%s => %g sec",
+ MSG_host_get_name(priv->tx_host),
+ MSG_process_get_name(priv->tx_proc),
+ host_name, pr_name, clock_end - priv->clock_sta);
+
+ MSG_task_destroy(task);
+
+ return 0;
+}
+
+static void launch_communication_worker(msg_host_t tx_host, msg_host_t rx_host)
+{
+ char *mbox = bprintf("MBOX:%s-%s",
+ MSG_host_get_name(tx_host),
+ MSG_host_get_name(rx_host));
+ char **argv = NULL;
+
+ const char *pr_name_tx = "comm_tx";
+ argv = xbt_new(char *, 3);
+ argv[0] = xbt_strdup(pr_name_tx);
+ argv[1] = xbt_strdup(mbox);
+ argv[2] = NULL;
+
+ MSG_process_create_with_arguments(pr_name_tx, communication_tx_fun, NULL, tx_host, 2, argv);
+
+ const char *pr_name_rx = "comm_rx";
+ argv = xbt_new(char *, 3);
+ argv[0] = xbt_strdup(pr_name_rx);
+ argv[1] = xbt_strdup(mbox);
+ argv[2] = NULL;
+
+ MSG_process_create_with_arguments(pr_name_rx, communication_rx_fun, NULL, rx_host, 2, argv);
+
+ xbt_free(mbox);
+}
+#endif
+
+
+
+
+
+
+static int master_main(int argc, char *argv[])
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+
+ int npm = 10;
+ int nvm = 1000;
+
+ msg_host_t *pm = xbt_new(msg_host_t, npm);
+ msg_vm_t *vm = xbt_new(msg_vm_t, nvm);
+
+ int i = 0;
+ for (i = 0; i < npm; i++) {
+ pm[i] = xbt_dynar_get_as(hosts_dynar, i, msg_host_t);
+ }
+
+ for (i = 0; i < nvm; i++) {
+ int pm_index = i % npm;
+ char *vm_name = bprintf("vm%d", i);
+ vm[i] = MSG_vm_create_core(pm[pm_index], vm_name);
+ MSG_vm_start(vm[i]);
+
+ launch_computation_worker(vm[i]);
+
+ xbt_free(vm_name);
+ }
+
+
+ XBT_INFO("## Test (start)");
+
+ for (i = 0; i < 10; i++) {
+ double clock_sta = time_precise();
+ MSG_process_sleep(1);
+ double clock_end = time_precise();
+ XBT_INFO("duration %f", clock_end - clock_sta);
+ }
+
+
+ for (i = 0; i < nvm; i++) {
+ MSG_vm_destroy(vm[i]);
+ }
+
+ XBT_INFO("## Test (ended)");
+
+ return 0;
+}
+
+static void launch_master(msg_host_t host)
+{
+ const char *pr_name = "master_";
+ char **argv = xbt_new(char *, 2);
+ argv[0] = xbt_strdup(pr_name);
+ argv[1] = NULL;
+
+ MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+
+int main(int argc, char *argv[])
+{
+ /* Get the arguments */
+ MSG_init(&argc, argv);
+
+ /* load the platform file */
+ xbt_assert(argc == 2);
+ MSG_create_environment(argv[1]);
+
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ launch_master(pm0);
+
+ int res = MSG_main();
+ XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+
+
+ return !(res == MSG_OK);
+}
--- /dev/null
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+ <AS id="siteA" routing="Full">
+ <host id="PM0" power="1E8"/>
+ <host id="PM1" power="1E8"/>
+ <host id="PM2" power="1E8"/>
+
+ <!-- <link id="link1" bandwidth="1E6" latency="1E-2" /> -->
+ <link id="link1" bandwidth="12500000" latency="1E-2" />
+
+ <route src="PM0" dst="PM1">
+ <link_ctn id="link1"/>
+ </route>
+
+ <route src="PM0" dst="PM2">
+ <link_ctn id="link1"/>
+ </route>
+
+ <route src="PM1" dst="PM2">
+ <link_ctn id="link1"/>
+ </route>
+ </AS>
+</platform>
--- /dev/null
+/* Copyright (c) 2007-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"
+#include "xbt/sysdep.h" /* calloc, printf */
+
+/* Create a log channel to have nice outputs. */
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+ "Messages specific for this msg example");
+
+
+static int computation_fun(int argc, char *argv[])
+{
+ const char *pr_name = MSG_process_get_name(MSG_process_self());
+ const char *host_name = MSG_host_get_name(MSG_host_self());
+
+ msg_task_t task = MSG_task_create("Task", 1000000, 1000000, NULL);
+
+ double clock_sta = MSG_get_clock();
+ MSG_task_execute(task);
+ double clock_end = MSG_get_clock();
+
+ XBT_INFO("%s:%s task executed %g", host_name, pr_name, clock_end - clock_sta);
+
+ MSG_task_destroy(task);
+
+ return 0;
+}
+
+static void launch_computation_worker(msg_host_t host)
+{
+ const char *pr_name = "compute";
+ char **argv = xbt_new(char *, 2);
+ argv[0] = xbt_strdup(pr_name);
+ argv[1] = NULL;
+
+ MSG_process_create_with_arguments(pr_name, computation_fun, NULL, host, 1, argv);
+}
+
+struct task_priv {
+ msg_host_t tx_host;
+ msg_process_t tx_proc;
+ double clock_sta;
+};
+
+static int communication_tx_fun(int argc, char *argv[])
+{
+ xbt_assert(argc == 2);
+ const char *mbox = argv[1];
+
+ msg_task_t task = MSG_task_create("Task", 1000000, 1000000, NULL);
+
+ struct task_priv *priv = xbt_new(struct task_priv, 1);
+ priv->tx_proc = MSG_process_self();
+ priv->tx_host = MSG_host_self();
+ priv->clock_sta = MSG_get_clock();
+
+ MSG_task_set_data(task, priv);
+
+ MSG_task_send(task, mbox);
+
+ return 0;
+}
+
+static int communication_rx_fun(int argc, char *argv[])
+{
+ const char *pr_name = MSG_process_get_name(MSG_process_self());
+ const char *host_name = MSG_host_get_name(MSG_host_self());
+ xbt_assert(argc == 2);
+ const char *mbox = argv[1];
+
+ msg_task_t task = NULL;
+ MSG_task_recv(&task, mbox);
+
+ struct task_priv *priv = MSG_task_get_data(task);
+ double clock_end = MSG_get_clock();
+
+ XBT_INFO("%s:%s to %s:%s => %g sec",
+ MSG_host_get_name(priv->tx_host),
+ MSG_process_get_name(priv->tx_proc),
+ host_name, pr_name, clock_end - priv->clock_sta);
+
+ xbt_free(priv);
+ MSG_task_destroy(task);
+
+ return 0;
+}
+
+static void launch_communication_worker(msg_host_t tx_host, msg_host_t rx_host)
+{
+ char *mbox = bprintf("MBOX:%s-%s",
+ MSG_host_get_name(tx_host),
+ MSG_host_get_name(rx_host));
+ char **argv = NULL;
+
+ const char *pr_name_tx = "comm_tx";
+ argv = xbt_new(char *, 3);
+ argv[0] = xbt_strdup(pr_name_tx);
+ argv[1] = xbt_strdup(mbox);
+ argv[2] = NULL;
+
+ MSG_process_create_with_arguments(pr_name_tx, communication_tx_fun, NULL, tx_host, 2, argv);
+
+ const char *pr_name_rx = "comm_rx";
+ argv = xbt_new(char *, 3);
+ argv[0] = xbt_strdup(pr_name_rx);
+ argv[1] = xbt_strdup(mbox);
+ argv[2] = NULL;
+
+ MSG_process_create_with_arguments(pr_name_rx, communication_rx_fun, NULL, rx_host, 2, argv);
+
+ xbt_free(mbox);
+}
+
+
+static int master_main(int argc, char *argv[])
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
+ msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
+ msg_vm_t vm0, vm1;
+
+
+ XBT_INFO("## Test 1 (started): check computation on normal PMs");
+
+ XBT_INFO("### Put a task on a PM");
+ launch_computation_worker(pm0);
+ MSG_process_sleep(2);
+
+ XBT_INFO("### Put two tasks on a PM");
+ launch_computation_worker(pm0);
+ launch_computation_worker(pm0);
+ MSG_process_sleep(2);
+
+ XBT_INFO("### Put a task on each PM");
+ launch_computation_worker(pm0);
+ launch_computation_worker(pm1);
+ MSG_process_sleep(2);
+
+ XBT_INFO("## Test 1 (ended)");
+
+
+ XBT_INFO("## Test 2 (started): check impact of running a task inside a VM (there is no degradation for the moment)");
+
+ XBT_INFO("### Put a VM on a PM, and put a task to the VM");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ MSG_vm_start(vm0);
+ launch_computation_worker(vm0);
+ MSG_process_sleep(2);
+ MSG_vm_destroy(vm0);
+
+ XBT_INFO("## Test 2 (ended)");
+
+
+ XBT_INFO("## Test 3 (started): check impact of running a task collocated with a VM (there is no VM noise for the moment)");
+
+ XBT_INFO("### Put a VM on a PM, and put a task to the PM");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ MSG_vm_start(vm0);
+ launch_computation_worker(pm0);
+ MSG_process_sleep(2);
+ MSG_vm_destroy(vm0);
+
+ XBT_INFO("## Test 3 (ended)");
+
+
+ XBT_INFO("## Test 4 (started): compare the cost of running two tasks inside two different VMs collocated or not (for the moment, there is no degradation for the VMs. Hence, the time should be equals to the time of test 1");
+
+ XBT_INFO("### Put two VMs on a PM, and put a task to each VM");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ vm1 = MSG_vm_create_core(pm0, "VM1");
+ MSG_vm_start(vm0);
+ MSG_vm_start(vm1);
+ launch_computation_worker(vm0);
+ launch_computation_worker(vm1);
+ MSG_process_sleep(2);
+ MSG_vm_destroy(vm0);
+ MSG_vm_destroy(vm1);
+
+ XBT_INFO("### Put a VM on each PM, and put a task to each VM");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ vm1 = MSG_vm_create_core(pm1, "VM1");
+ MSG_vm_start(vm0);
+ MSG_vm_start(vm1);
+ launch_computation_worker(vm0);
+ launch_computation_worker(vm1);
+ MSG_process_sleep(2);
+ MSG_vm_destroy(vm0);
+ MSG_vm_destroy(vm1);
+ XBT_INFO("## Test 4 (ended)");
+
+
+ XBT_INFO("## Test 5 (started): Analyse network impact");
+ XBT_INFO("### Make a connection between PM0 and PM1");
+ launch_communication_worker(pm0, pm1);
+ MSG_process_sleep(5);
+
+ XBT_INFO("### Make two connection between PM0 and PM1");
+ launch_communication_worker(pm0, pm1);
+ launch_communication_worker(pm0, pm1);
+ MSG_process_sleep(5);
+
+ XBT_INFO("### Make a connection between PM0 and VM0@PM0");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ MSG_vm_start(vm0);
+ launch_communication_worker(pm0, vm0);
+ MSG_process_sleep(5);
+ MSG_vm_destroy(vm0);
+
+ XBT_INFO("### Make a connection between PM0 and VM0@PM1");
+ vm0 = MSG_vm_create_core(pm1, "VM0");
+ MSG_vm_start(vm0);
+ launch_communication_worker(pm0, vm0);
+ MSG_process_sleep(5);
+ MSG_vm_destroy(vm0);
+
+ XBT_INFO("### Make two connections between PM0 and VM0@PM1");
+ vm0 = MSG_vm_create_core(pm1, "VM0");
+ MSG_vm_start(vm0);
+ launch_communication_worker(pm0, vm0);
+ launch_communication_worker(pm0, vm0);
+ MSG_process_sleep(5);
+ MSG_vm_destroy(vm0);
+
+ XBT_INFO("### Make a connection between PM0 and VM0@PM1, and also make a connection between PM0 and PM1");
+ vm0 = MSG_vm_create_core(pm1, "VM0");
+ MSG_vm_start(vm0);
+ launch_communication_worker(pm0, vm0);
+ launch_communication_worker(pm0, pm1);
+ MSG_process_sleep(5);
+ MSG_vm_destroy(vm0);
+
+ XBT_INFO("### Make a connection between VM0@PM0 and PM1@PM1, and also make a connection between VM0@PM0 and VM1@PM1");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ vm1 = MSG_vm_create_core(pm1, "VM1");
+ MSG_vm_start(vm0);
+ MSG_vm_start(vm1);
+ launch_communication_worker(vm0, vm1);
+ launch_communication_worker(vm0, vm1);
+ MSG_process_sleep(5);
+ MSG_vm_destroy(vm0);
+ MSG_vm_destroy(vm1);
+
+ XBT_INFO("## Test 5 (ended)");
+
+
+ XBT_INFO("## Test 6 (started): Check migration impact (not yet implemented neither on the CPU resource nor on the network one");
+ XBT_INFO("### Relocate VM0 between PM0 and PM1");
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ {
+ s_ws_params_t params;
+ memset(¶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);
+}
--- /dev/null
+#! ./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)
--- /dev/null
+/* Copyright (c) 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <stdio.h>
+#include "msg/msg.h"
+#include "xbt/sysdep.h"
+
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,
+ "Messages specific for this msg example");
+
+msg_task_t atask = NULL;
+
+static int computation_fun(int argc, char *argv[])
+{
+ const char *pr_name = MSG_process_get_name(MSG_process_self());
+ const char *host_name = MSG_host_get_name(MSG_host_self());
+ double clock_sta, clock_end;
+ atask = MSG_task_create("Task1", 1e9, 1e9, NULL);
+ clock_sta = MSG_get_clock();
+ XBT_INFO("%s:%s task 1 created %g", host_name, pr_name, clock_sta);
+ MSG_task_execute(atask);
+ clock_end = MSG_get_clock();
+
+ XBT_INFO("%s:%s task 1 executed %g", host_name, pr_name, clock_end - clock_sta);
+
+ MSG_task_destroy(atask);
+ atask = NULL;
+
+ MSG_process_sleep(1);
+
+ atask = MSG_task_create("Task2", 1e10, 1e10, NULL);
+
+ clock_sta = MSG_get_clock();
+ XBT_INFO("%s:%s task 2 created %g", host_name, pr_name, clock_sta);
+ MSG_task_execute(atask);
+ clock_end = MSG_get_clock();
+
+ XBT_INFO("%s:%s task 2 executed %g", host_name, pr_name, clock_end - clock_sta);
+
+ MSG_task_destroy(atask);
+ atask = NULL;
+
+ return 0;
+}
+
+static void launch_computation_worker(msg_host_t host)
+{
+ const char *pr_name = "compute";
+ char **argv = xbt_new(char *, 2);
+ argv[0] = xbt_strdup(pr_name);
+ argv[1] = NULL;
+
+ MSG_process_create_with_arguments(pr_name, computation_fun, NULL, host, 1, argv);
+}
+
+static int master_main(int argc, char *argv[])
+{
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ msg_vm_t vm0;
+ vm0 = MSG_vm_create_core(pm0, "VM0");
+ MSG_vm_start(vm0);
+ //MSG_process_sleep(1);
+
+ launch_computation_worker(vm0);
+
+ while(MSG_get_clock()<100) {
+ if (atask != NULL)
+ XBT_INFO("aTask remaining duration: %g", MSG_task_get_remaining_computation(atask));
+ MSG_process_sleep(1);
+ }
+
+ MSG_process_sleep(10000);
+ MSG_vm_destroy(vm0);
+ xbt_dynar_free(&hosts_dynar);
+ return 1;
+}
+
+static void launch_master(msg_host_t host)
+{
+ const char *pr_name = "master_";
+ char **argv = xbt_new(char *, 2);
+ argv[0] = xbt_strdup(pr_name);
+ argv[1] = NULL;
+
+ MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
+}
+
+int main(int argc, char *argv[]){
+ MSG_init(&argc, argv);
+
+ xbt_assert(argc == 2);
+ MSG_create_environment(argv[1]);
+
+ xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
+ msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
+ launch_master(pm0);
+
+ int res = MSG_main();
+ XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
+ xbt_dynar_free(&hosts_dynar);
+
+ return !(res == MSG_OK);
+}
+
+
+
+
--- /dev/null
+#! ./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)
-/* 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 */
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
-
-/* 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
#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"
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) {
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
> [ 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
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
> [ 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
-/* 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
#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"
int main(int argc, char *argv[])
{
msg_error_t res = MSG_OK;
-
+ sg_energy_plugin_init();
MSG_init(&argc, argv);
if (argc != 3) {
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
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
${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
-/* 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
*/
#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"
#include <stdlib.h>
#include "msg/msg.h"
#include "surf/surf_private.h"
-#include "inttypes.h"
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);
-/* 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
#include <stdlib.h>
#include "msg/msg.h"
#include "surf/surf_private.h"
-#include "inttypes.h"
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);
// 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);
$ ${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:
> 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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#! ./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
-/* 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);
-/* Copyright (c) 2012. The SimGrid Team.
+/* Copyright (c) 2012, 2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef _KADEMLIA_EXAMPLES_ANSWER_H_
#define _KADEMLIA_EXAMPLES_ANSWER_H_
#include <xbt/dynar.h>
-/* 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
#!/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:
-/* 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"
-
-/* 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"
-
-/* 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
-
-/* 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
-/* 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"
-
-/* 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
-/* 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,
-/* 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"
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
+/* 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"
-/* 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 */
+/* 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 */
+/* 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
! 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 ...
! 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
-/* 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 */
+/* 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 */
+/* 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
-/* 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 */
-/* 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 */
-/* 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*/
-/* 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
-/* 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
$ 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
-/* 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
-/* 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
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <math.h>
#include "msg/msg.h"
/* 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"
-/* 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
-/* 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
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <stdlib.h>
#include "msg/msg.h"
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
> [ 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"
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
#!/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) {
--- /dev/null
+./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
#! /usr/bin/perl
-# L.Bobelin (Perl newbie) 25th of November
+# Copyright (c) 2011-2012, 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
# Quick script to generate hierarchical clusters. Usage : <the script> p s d where :
# - p : 2^p gives the total number of hosts.
# - s : cluster size
#! /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.
#!/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;
#!/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;
<storage_type id="single_HDD" model="linear_no_lat"
content="content/storage_content.txt" size="500GiB"
content_type="txt_unix">
- <prop id="Bwrite" value="30MBps" />
- <prop id="Bread" value="100MBps" />
- <prop id="Bconnection" value="150MBps" />
+ <model_prop id="Bwrite" value="30MBps" />
+ <model_prop id="Bread" value="100MBps" />
+ <model_prop id="Bconnection" value="120MBps" />
</storage_type>
- <storage_type id="single_SSD" model="linear_no_lat"
- content="content/storage_content.txt" size="500GiB">
- <prop id="Bwrite" value="30MBps" />
- <prop id="Bread" value="100MBps" />
- <prop id="Bconnection" value="150MBps" />
- </storage_type>
-
- <storage id="Disk1" typeId="single_HDD"/>
- <storage id="Disk2" typeId="single_SSD"/>
- <storage id="Disk3" typeId="single_HDD"
- content="content/storage_content.txt"
- content_type="txt_unix"/>
- <storage id="Disk4" typeId="single_SSD"/>
-
- <host id="bob" power="1Gf">
- <mount storageId="Disk1" name="/home"/>
- </host>
-
- <host id="alice" power="1Gf">
- <mount storageId="Disk2" name="/home"/>
- </host>
-
- <host id="carl" power="1Gf">
- <mount storageId="Disk3" name="/home"/>
- </host>
-
- <host id="denise" power="1Gf">
- <mount storageId="Disk4" name="/home"/>
- </host>
-
- <link id="link1" bandwidth="125MBps" latency="50us" />
- <link id="link2" bandwidth="125MBps" latency="50us" />
- <link id="link3" bandwidth="125MBps" latency="50us" />
-
- <route src="bob" dst="alice" symmetrical="YES">
- <link_ctn id="link1" />
- <link_ctn id="link2" />
- <link_ctn id="link3" />
- </route>
-
- </AS>
+ <storage_type id="single_SSD" model="linear_no_lat" size="500GiB">
+ <model_prop id="Bwrite" value="60MBps" />
+ <model_prop id="Bread" value="200MBps" />
+ <model_prop id="Bconnection" value="220MBps" />
+ </storage_type>
+
+ <storage id="Disk1" typeId="single_HDD" />
+ <storage id="Disk2" typeId="single_SSD"
+ content="content/win_storage_content.txt"
+ content_type="txt_windows" />
+ <storage id="Disk3" typeId="single_HDD" />
+ <storage id="Disk4" typeId="single_SSD"
+ content="content/small_content.txt"
+ content_type="txt_unix" />
+
+ <host id="bob" power="1Gf">
+ <mount storageId="Disk1" name="/home"/>
+ </host>
+
+ <host id="alice" power="1Gf">
+ <mount storageId="Disk2" name="/windows"/>
+ </host>
+
+ <host id="carl" power="1Gf">
+ <mount storageId="Disk3" name="/home"/>
+ </host>
+
+ <host id="denise" power="1Gf">
+ <mount storageId="Disk2" name="/windows"/>
+ <mount storageId="Disk4" name="/home"/>
+ </host>
+
+ <link id="link1" bandwidth="125MBps" latency="50us" />
+ <link id="link2" bandwidth="125MBps" latency="50us" />
+ <link id="link3" bandwidth="125MBps" latency="50us" />
+
+ <route src="bob" dst="alice" symmetrical="YES">
+ <link_ctn id="link1" />
+ <link_ctn id="link2" />
+ <link_ctn id="link3" />
+ </route>
+ </AS>
</platform>
#!/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;
--- /dev/null
+<?xml version='1.0'?>
+<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+<platform version="3">
+<AS id="AS0" routing="Full">
+ <cluster id="bob_cluster" prefix="bob" suffix=".hamburger.edu"
+ radical="0-11" power="1Gf" bw="125MBps" lat="50us" topology="TORUS" topo_parameters="3,2,2"
+ loopback_bw="100000000" loopback_lat="0"/>
+</AS>
+</platform>
! 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'
> [ 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.
/* 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
#! /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";
#! /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 {
/* 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
/* 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
-/* 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
/* 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
/* Example of scatter communication, accepting a large amount of processes.
* This based the experiment of Fig. 4 in http://hal.inria.fr/hal-00650233/
* That experiment is a comparison to the LogOPSim simulator, that takes
- * GOAL files as an input, thus the file name. But there is no actual link
- * to the GOAL formalism beside of this.
- *
- * Copyright (c) 2011-2013. The SimGrid Team.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package.
+ * GOAL files as an input, thus the file name. But there is no actual link
+ * to the GOAL formalism beside of this.
*/
+/* Copyright (c) 2011-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdlib.h>
#include <stdio.h>
#include "simdag/simdag.h"
$ ${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'
-/* 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
-/* 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
+-- 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"};
-/* 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
/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
#! @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
+/* 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
*
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <mpi.h>
double two_dot_five(
size_t m, size_t k, size_t n,
+/* 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
*
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "Matrix_init.h"
#include <math.h>
#include <stdio.h>
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdlib.h>
//#undef CYCLIC
#define CYCLIC
+/* 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
*
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <mpi.h>
double Summa(
double *a, double *b, double *c,
-/* 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
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
> [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
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.
+! 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'
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)
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)
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
+! 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
<host id="MyHost2" power="100.0Mf" >
<prop id="power_per_state" value="95.0:200.0" />
</host>
+
+ <link id="link1" bandwidth="100kBps" latency="0"/>
+ <route src="MyHost1" dst="MyHost2"><link_ctn id="link1"/></route>
+
</AS>
</platform>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
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);
}
} 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();
/* 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
+/* 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 */
/* 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
-/* 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
-/* 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
$ 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'
> [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
< 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'
> [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
> 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
< 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'
> [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
< 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'
> [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
< 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'
> [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
< 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'
> [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
< 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'
> [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
< 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'
> [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
< 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'
> [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
< 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'
> [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
-/* 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
# 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'
> [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'
> [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'
> [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'
> [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'
-/* 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
-/* 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
-/* 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
-/* 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
-/*
- * 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_
-/*
- * 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_
-/*
- * 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_
-/*
- * 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_
-/* 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
typedef struct s_smx_rvpoint *msg_mailbox_t;
/* ******************************** Environment ************************************ */
-typedef struct s_as *msg_as_t;
+typedef struct As *msg_as_t;
/* ******************************** Host ************************************ */
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
*/
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;
-/* 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
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);
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);
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);
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 *********************************/
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);
* 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)
-/* 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
-/* 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
--- /dev/null
+/* simgrid.h - Public interface all SimGrid APIs */
+
+/* Copyright (c) 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SIMGRID_H
+#define SIMGRID_H
+
+#include <xbt.h>
+
+#include <simgrid/datatypes.h>
+#include <simgrid/modelchecker.h>
+#include <simgrid/platf_generator.h>
+#include <simgrid/platf.h>
+#include <simgrid/simix.h>
+#include <simgrid/plugins.h>
+
+// SG_BEGIN_DECL()
+// nothing
+// SG_END_DECL()
+
+#endif /* SG_PLATF_H */
--- /dev/null
+/* 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_ */
/* 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
#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 */
#endif
-
+SG_END_DECL()
#endif /* SIMGRID_MODELCHECKER_H */
/* platf.h - Public interface to the SimGrid platforms */
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include <xbt.h>
-typedef void *sg_routing_link_t; /* The actual type is model-dependent so use void* instead*/
-typedef struct s_routing_edge *sg_routing_edge_t;
+SG_BEGIN_DECL()
+
+typedef void *sg_routing_link_t; /* FIXME:The actual type is model-dependent so use void* instead*/
+typedef struct RoutingEdge *sg_routing_edge_t;
XBT_PUBLIC(sg_routing_edge_t) sg_routing_edge_by_name_or_null(const char *name);
-/** Defines whether a given resource is working or not */
+/** @ingroup SURF_interface
+* @brief Defines whether a given resource is working or not */
typedef enum {
SURF_RESOURCE_ON = 1, /**< Up & ready */
SURF_RESOURCE_OFF = 0 /**< Down & broken */
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 */
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;
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
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;
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}
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 */
/* 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
--- /dev/null
+/* 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_ */
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "xbt/parmap.h"
#include "xbt/swag.h"
#include "simgrid/platf.h"
+#include "simgrid/datatypes.h"
SG_BEGIN_DECL()
} e_smx_state_t;
/** @} */
-
typedef struct s_smx_timer* smx_timer_t;
/* ******************************** Synchro ************************************ */
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);
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 {
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 */
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;
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);
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);
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);
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,
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 */
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);
/***************************** 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 ***************************/
/* 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. */
#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
-/* 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
! -*- 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
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)
parameter(MPI_PROC_NULL=-666)
parameter(MPI_ANY_TAG=-444)
parameter(MPI_UNDEFINED=-333)
- parameter(MPI_IN_PLACE=-222)
- parameter(MPI_BOTTOM=-111)
parameter(MPI_SOURCE=1)
parameter(MPI_TAG=2)
parameter(MPI_ERROR=3)
parameter(MPI_ERRHANDLER_NULL=2)
! This should be equal to the number of int fields in MPI_Status
- integer MPI_STATUS_SIZE, MPI_STATUSES_IGNORE
+ integer MPI_STATUS_SIZE
parameter(MPI_STATUS_SIZE=4)
- parameter(MPI_STATUSES_IGNORE=-1)
- integer MPI_STATUS_IGNORE
- parameter(MPI_STATUS_IGNORE=-1)
+! These should be ordered as in smpi_f77.c
+ integer MPI_IN_PLACE, MPI_BOTTOM
+ integer MPI_STATUS_IGNORE, MPI_STATUSES_IGNORE
+ common /smpi/ MPI_IN_PLACE, MPI_BOTTOM
+ common /smpi/ MPI_STATUS_IGNORE, MPI_STATUSES_IGNORE
integer MPI_REQUEST_NULL
parameter(MPI_REQUEST_NULL=-1)
integer MPI_INTEGER_KIND
parameter(MPI_INTEGER_KIND=4)
-! These should be ordered as in smpi_f77.c
integer MPI_DATATYPE_NULL, MPI_BYTE, MPI_CHARACTER, MPI_LOGICAL
integer MPI_INTEGER, MPI_INTEGER1, MPI_INTEGER2, MPI_INTEGER4
integer MPI_INTEGER8, MPI_REAL, MPI_REAL4, MPI_REAL8
-/* 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
#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
#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;
//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);
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#define SMPI_VARINIT_GLOBAL(name,type) \
type *name = NULL; \
-void __attribute__((weak,constructor)) __preinit_##name(void) { \
+static void __attribute__((constructor)) __preinit_##name(void) { \
if(!name) \
- name = (type*)malloc(smpi_global_size() * sizeof(type)); \
+ name = (type*)calloc(smpi_global_size(), sizeof(type)); \
} \
-void __attribute__((weak,destructor)) __postfini_##name(void) { \
+static void __attribute__((destructor)) __postfini_##name(void) { \
free(name); \
name = NULL; \
}
#define SMPI_VARINIT_GLOBAL_AND_SET(name,type,expr) \
type *name = NULL; \
-void __attribute__((weak,constructor)) __preinit_##name(void) { \
+static void __attribute__((constructor)) __preinit_##name(void) { \
size_t size = smpi_global_size(); \
size_t i; \
type value = expr; \
} \
} \
} \
-void __attribute__((weak,destructor)) __postfini_##name(void) { \
+static void __attribute__((destructor)) __postfini_##name(void) { \
free(name); \
name = NULL; \
}
#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); \
}
+/* 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);\
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include <xbt/misc.h>
#include <smpi/smpi.h>
+/* those are defined in f2c.h */
+#undef min
+#undef max
#include <f2c.h>
XBT_PUBLIC_DATA(__thread int) smpi_current_rank;
XBT_PUBLIC(int) smpi_process_argc(void);
XBT_PUBLIC(int) smpi_process_getarg(integer* index, char* dst, ftnlen len);
-XBT_PUBLIC(int) smpi_global_size(void);
#define smpi_sample_local__(pi,pt) \
{ \
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;
#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;
#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;
#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;
#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;
#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;
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;
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;
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;
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;
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "xbt/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
void routing_cluster_add_backbone(void* bb);
+SG_END_DECL()
+
#endif /* _SURF_SURF_H */
-/* 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
/* 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
+/* 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
/* 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
+/* 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
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;
/* 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
/* 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
/* 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
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
* @{ */
/** @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) {
/* 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
/* ex - Exception Handling */
-/* Copyright (c) 2005-2013. The SimGrid Team. */
+/* Copyright (c) 2005-2014. The SimGrid Team.
+ * All rights reserved. */
+
/* Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com> */
/* Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/> */
/* Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/> */
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);
-/* 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
/* 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
-/* 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
-/* 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
/* 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
-/* 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
#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.
*
*,
int));
XBT_PUBLIC(void *) xbt_heap_remove(xbt_heap_t H, int i);
-
/* @} */
+SG_END_DECL()
#endif /* _XBT_HEAP_H */
/* 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
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)
/* 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
* 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) \
{ \
_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 */, \
* 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) \
/* 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
/* 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
/* 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
/* 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
/* module - modularize the code */
-/* Copyright (c) 2004-2007, 2009-2010, 2012. The SimGrid Team.
+/* Copyright (c) 2004-2007, 2009-2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include <xbt/misc.h> /* XBT_PUBLIC */
+SG_BEGIN_DECL()
+
XBT_PUBLIC(void) xbt_init(int *argc, char **argv);
XBT_PUBLIC(void) xbt_exit(void);
+
+SG_END_DECL()
+
#endif /* _XBT_MODULE_H */
/* 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
/* 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
/* 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
/* 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
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);
/* 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
+/* 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"
/* 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
/* 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
-/* 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
/* 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
/* 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
/* 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__
+/* Copyright (c) 2010, 2014. The SimGrid Team.\r
+ * All rights reserved. */\r
+\r
+/* This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of the license (GNU LGPL) which comes with this package. */\r
+\r
/*\r
* win32-ucontext: Unix ucontext_t operations on Windows platforms\r
* Copyright(C) 2007 Panagiotis E. Hadjidoukas\r
/* 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
-/* 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
Built-By: Da SimGrid team
Main-Class: org.simgrid.msg.Msg
Class-Path: .
-
/* Java Wrappers to the MSG API. */
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <msg/msg.h>
#include <simgrid/simix.h>
#endif
/* end of eclipse-mandated pimple */
+int JAVA_HOST_LEVEL;
+
static int create_jprocess(int argc, char *argv[]);
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
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)
{
(*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);
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
/* 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);
/* Java Wrappers to the MSG API. */
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#ifndef MSG4JAVA_H
#define MSG4JAVA_H
#include <msg/msg.h>
#include <jni.h>
+extern int JAVA_HOST_LEVEL;
+extern xbt_lib_t host_lib;
+
JavaVM *get_java_VM(void);
JNIEnv *get_current_thread_env(void);
/**
/* 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"
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));
/* 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
/* 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"
/* Functions related to the java comm instances */
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
* All rights reserved. */
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef MSG_JCOMM_H
#define MSG_JCOMM_H
#include <jni.h>
/* 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"
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) {
/* 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
/* 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"
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);
}
(*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);
/* 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
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 */
(*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();
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));
/* 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
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
/* 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"
/* 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
/* 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"
/* Functions related to the RngStream Java port */
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef MSG_RNGSTREAM_H
#define MSG_RNGSTREAM_H
#include <jni.h>
/* 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
/* 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
/* 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"
}
}
+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) {
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
/* 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
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
/* 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"
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;
}
/* 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
*/
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
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);
/* 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 ;)
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_simgrid_trace_Trace */
/* Various JNI helper functions */
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdlib.h> /* abort */
#include "xbt/misc.h"
/* 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
-/*
- * 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 {
+/* 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.
+/* 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;
-/*
- * 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;
/**
/**
* Host name
*/
- private String name;
+ protected String name;
/**
* User data.
this.bind = 0;
this.data = null;
};
+
+ public String toString (){
+ return this.name;
+
+ }
/**
* This static method gets an host instance associated with a native
public String getName() {
return name;
}
+
/**
* Sets the data of the host.
* @param data
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.
* 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();
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
/**
-/*
- * 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;
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);
-/*
- * 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;
/**
-/*
- * 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,
-/*
- * 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;
/**
--- /dev/null
+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());
+ }
+}
-/*
- * 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;
-/*
- * 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
-/*
- * 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;
-/*
- * 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
-/*
- * 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
-/*
- * 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;
* @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.
*
-/*
- * 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;
-/*
- * 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;
-/*
- * 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;
-/*
- * JNI interface to Cloud interface in Simgrid
- *
- * Copyright (c) 2006-2013. The SimGrid Team.
- * All right reserved.
- *
- * This program is free software; you can redistribute
- * it and/or modify it under the terms of the license
- * (GNU LGPL) which comes with this package.
- */
+/* JNI interface to virtual machine in Simgrid */
+
+/* Copyright (c) 2006-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
package org.simgrid.msg;
import org.simgrid.msg.Host;
import org.simgrid.msg.Process;
-public class VM {
- /**
- * This attribute represents a bind between a java task object and
- * a native task. Even if this attribute is public you must never
- * access to it. It is set automatically during the build of the object.
- */
- private long bind = 0;
+public class VM extends Host{
+ // Please note that we are not declaring a new bind variable
+ //(the bind variable has been inherited from the super class Host)
- private int coreAmount;
+ /* Static functions */
+ // GetByName is inherited from the super class Host
+
+
+ private static VM[] vms=null;
+ private Host currentHost;
+
+ /* Constructors / destructors */
+ /**
+ * Create a `basic' VM (i.e. 1 core, 1GB of RAM, other values are not taken into account).
+ */
+ public VM(Host host, String name) {
+ this(host,name,1,1024, -1, null, -1,0 , 0);
+ }
- private String name;
/**
- * Create a new empty VM.
- * NOTE: it is expected that in the future, the coreAmount parameter will be used
- * to add extra constraints on the execution, but the argument is ignored for now.
+ * Create a VM
+ * @param host Host node
+ * @param name name of the machine
+ * @param nCore number of core
+ * @param ramSize size of the RAM that should be allocated (in MBytes)
+ * @param netCap (not used for the moment)
+ * @param diskPath (not used for the moment)
+ * @param diskSize (not used for the moment)
+ * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
+ * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;))
*/
- public VM(Host host, String name, int coreAmount) {
- this.coreAmount = coreAmount;
- this.name = name;
- start(host,name,coreAmount);
+ public VM(Host host, String name, int nCore, int ramSize,
+ int netCap, String diskPath, int diskSize, int migNetSpeed, int dpIntensity){
+ super();
+ super.name = name;
+ this.currentHost = host;
+ create(host, name, nCore, ramSize, netCap, diskPath, diskSize, migNetSpeed, dpIntensity);
+ VM.addVM(this);
+ }
+
+ private static void addVM(VM vm){
+ VM[] vmsN=null;
+ int i=0;
+ if(VM.vms == null)
+ vmsN = new VM[1];
+ else
+ vmsN = new VM[vms.length+1];
+
+ for (i=0; i<vmsN.length-1 ; i ++){
+ vmsN[i]=vms[i];
+ }
+ vmsN[i]=vm;
+ vms=vmsN;
+ }
+ public static VM[] all(){
+ return vms;
+ }
+ public static VM getVMByName(String name){
+ for (int i=0 ; i < vms.length ; i++){
+ if (vms[i].getName().equals(name))
+ return vms[i];
+ }
+ return null;
}
protected void finalize() {
destroy();
}
- /**
- * Destroy the VM
- */
- protected native void destroy();
- /**
- * Natively implemented method starting the VM.
- * @param coreAmount
- */
- private native void start(Host host, String name, int coreAmount);
-
+
+
+ /* JNI / Native code */
+
+ /* get/set property methods are inherited from the Host class. */
+
/** Returns whether the given VM is currently suspended
*/
- public native boolean isSuspended();
+ public native int isCreated();
+
/** Returns whether the given VM is currently running
*/
- public native boolean isRunning();
- /** Add the given process into the VM.
- * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too.
- */
- public native void bind(Process process);
- /** Removes the given process from the given VM, and kill it
- * Will raise a ProcessNotFound exception if the process were not bound to that VM
+ public native int isRunning();
+
+ /** Returns whether the given VM is currently running
+ */
+ public native int isMigrating();
+
+ /** Returns whether the given VM is currently suspended
*/
- public native void unbind(Process process);
- /** Immediately change the host on which all processes are running
- *
- * No migration cost occurs. If you want to simulate this too, you want to use a
- * Task.send() before or after, depending on whether you want to do cold or hot
- * migration.
+ public native int isSuspended();
+
+ /** Returns whether the given VM is currently saving
+ */
+ public native int isSaving();
+
+ /** Returns whether the given VM is currently saved
+ */
+ public native int isSaved();
+
+ /** Returns whether the given VM is currently restoring its state
+ */
+ public native boolean isRestoring();
+
+ /**
+ * Natively implemented method create the VM.
+ * @param nCore number of core
+ * @param ramSize size of the RAM that should be allocated (in MB)
+ * @param netCap (not used for the moment)
+ * @param diskPath (not used for the moment)
+ * @param diskSize (not used for the moment)
+ * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
+ * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100], if you don't know put zero ;))
+ */
+ private native void create(Host host, String name, int nCore, int ramSize,
+ int netCap, String diskPath, int diskSize, int migNetSpeed, int dpIntensity);
+
+
+ /**
+ * Bound the VM to a certain % of its vcpu capability (e.g. 75% of vm.getSpeed())
+ * @param load percentage (between [0,100]
+ */
+ public native void setBound(int load);
+
+ /**
+ * start the VM
+ */
+ public native void start();
+
+
+ /**
+ * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
+ * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
+ */
+ public native void shutdown();
+
+ /**
+ * Invoke native migration routine
+ */
+ public native void internalmig(Host destination);
+
+
+ /** Change the host on which all processes are running
+ * (pre-copy is implemented)
*/
- public native void migrate(Host destination);
+ public void migrate(Host destination){
+ this.internalmig(destination);
+ this.currentHost = destination;
+ }
+
/** Immediately suspend the execution of all processes within the given VM
*
* No suspension cost occurs. If you want to simulate this too, you want to
* of VM suspend to you.
*/
public native void suspend();
+
/** Immediately resumes the execution of all processes within the given VM
*
* No resume cost occurs. If you want to simulate this too, you want to
* of VM resume to you.
*/
public native void resume();
- /**
- * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
- * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
+
+ /** Immediately suspend the execution of all processes within the given VM
+ * and save its state on the persistent HDD
+ * Not yet implemented (for the moment it behaves like suspend)
+ * No suspension cost occurs. If you want to simulate this too, you want to
+ * use a \ref File.write() before or after, depending on the exact semantic
+ * of VM suspend to you.
+ */
+ public native void save();
+
+ /** Immediately resumes the execution of all processes previously saved
+ * within the given VM
+ * Not yet implemented (for the moment it behaves like resume)
+ *
+ * No resume cost occurs. If you want to simulate this too, you want to
+ * use a \ref File.read() before or after, depending on the exact semantic
+ * of VM resume to you.
*/
- public native void shutdown();
+ public native void restore();
+
+
/**
- * Reboot the VM, restarting all the processes in it.
+ * Destroy the VM
*/
- public native void reboot();
+ public native void destroy();
- public String getName() {
- return name;
- }
+
/**
* Class initializer, to initialize various JNI stuff
-/*
- * JNI interface to C code for the TRACES part of SimGrid.
- *
- * Copyright (c) 2012-2013. The SimGrid Team.
- * All right reserved.
- *
- * This program is free software; you can redistribute
- * it and/or modify it under the terms of the license
- * (GNU LGPL) which comes with this package.
- */
+/* JNI interface to C code for the TRACES part of SimGrid. */
+
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
package org.simgrid.trace;
import org.simgrid.msg.Msg;
/* context_cojava - implementation of context switching for java coroutines */
-/* Copyright (c) 2012-2013. The SimGrid Team.
+/* Copyright (c) 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include <xbt/function_types.h>
#include <simgrid/simix.h>
#include <xbt/ex.h>
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);
(*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();
}
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
maestro_context = (smx_context_t)context;
}
context->bound = 0;
- context->super.data = data;
+ context->super.process = process;
return (smx_context_t) context;
}
-/* 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
/* context_java - implementation of context switching for java threads */
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include <xbt/function_types.h>
#include <simgrid/simix.h>
#include <xbt/ex.h>
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);
(*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)
{
}
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);
context->thread = NULL;
xbt_os_thread_set_extra_data(context);
}
- context->super.data = data;
+ context->super.process = process;
return (smx_context_t) context;
}
(*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;
-/* 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
-/* 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
-/* 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
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;
}
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
+/* 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. */
+/* 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. */
+/* 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);
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()
-/* 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
-/* 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
/* 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
#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);
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 */
-/* 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
/*******************************************/
/*** 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);
void sg_config_init(int *argc, char **argv);
void sg_config_finalize(void);
+
+SG_END_DECL()
+/* 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"
-/* 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
#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;
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "surf/datatypes.h"
#include <math.h>
+
+/** @addtogroup SURF_lmm
+ * @details
+ * A linear maxmin solver to resolves inequations systems.
+ *
+ * A system is composed of variables, constraints and elements linking them.
+ * Constraint:
+ * - bound (set)
+ * - shared (set)
+ * - usage (computed)
+ * Variable:
+ * - weight (set)
+ * - bound (set)
+ * - value (computed)
+ * Element:
+ * - value (set)
+ *
+ * A possible system could be:
+ * - three variables: `var1`, `var2`, `var3`
+ * - two constraints: `cons1`, `cons2`
+ * - four elements linking:
+ * - `elem1` linking `var1` and `cons1`
+ * - `elem2` linking `var2` and `cons1`
+ * - `elem3` linking `var2` and `cons2`
+ * - `elem4` linking `var3` and `cons2`
+ *
+ * And the corresponding inequations will be:
+ *
+ * var1.value <= var1.bound
+ * var2.value <= var2.bound
+ * var3.value <= var3.bound
+ * var1.weight * var1.value * elem1.value + var2.weight * var2.value * elem2.value <= cons1.bound
+ * var2.weight * var2.value * elem3.value + var3.weight * var3.value * elem4.value <= cons2.bound
+ *
+ * where `var1.value`, `var2.value` and `var3.value` are the unknown values
+ *
+ * if a constraint is not shared the sum is replace by a max
+ *
+ * Its usefull for the sharing of resources for various models.
+ * For instance for the network model the link are associated
+ * to consrtaint and the communications to variables.
+ */
+
extern double sg_maxmin_precision;
#define MAXMIN_PRECISION sg_maxmin_precision
static XBT_INLINE void double_update(double *variable, double value)
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);
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 */
-/* 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
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "xbt/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... */
#endif
extern xbt_dynar_t surf_path;
-
typedef enum {
SURF_NETWORK_ELEMENT_NULL = 0, /* NULL */
SURF_NETWORK_ELEMENT_HOST, /* host type */
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);
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 */
/**< 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) {
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
*/
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
*/
* 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.
*/
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
* 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
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.
/*******************************************/
/*** 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 **************************/
/* 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);
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);
-/* 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
#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)
static XBT_INLINE xbt_dict_t surf_resource_properties(const void *resource)
{
return ((surf_resource_t) resource)->properties;
-}
+}*/
#endif /* SURF_RESOURCE_H */
-/* 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
#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 */
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)
-/* 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_
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_ */
-/* 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
#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);
XBT_PUBLIC(void) tmgr_finalize(void);
+SG_END_DECL()
+
#endif /* _SURF_TMGR_H */
+/* 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
*
/* 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
-/* 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"
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",
-/* 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"
" 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.",
-/* 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,
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);
}
}
-/* 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"
-/* 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"
-/* 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 */
-/* 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
-/* 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
-/* 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_
#ifdef HAVE_TRACING
+SG_BEGIN_DECL()
+
/* Need to define function drand48 for Windows */
#ifdef _WIN32
# define drand48() (rand()/(RAND_MAX + 1.0))
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);
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_ */
-/* 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"
-/* 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 */
-/*
- * jedule_events.c
- *
- * Created on: Nov 30, 2010
- * Author: sascha
- */
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdio.h>
#include <stdlib.h>
-/*
- * jedule_output.c
- *
- * Created on: Dec 1, 2010
- * Author: sascha
- */
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved. */
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdio.h>
#include <stdlib.h>
-/*
- * jed_simgrid_platform.c
- *
- * Created on: Nov 30, 2010
- * Author: sascha
- */
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdlib.h>
#include <string.h>
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
if(location_list != NULL){
- char *key = bprintf("%d", (int)strtoul(expr, NULL, 16));
+ char *key = bprintf("%lu", strtoul(expr, NULL, 16));
loc->type = e_dw_loclist;
loc->location.loclist = (xbt_dynar_t)xbt_dict_get_or_null(location_list, key);
if(loc->location.loclist == NULL)
}
-
/** \brief Finds a frame (DW_TAG_subprogram) from an DWARF offset in the rangd of this subprogram
*
* The offset can be an offset of a child DW_TAG_variable.
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
+++ /dev/null
-#! /usr/bin/perl
-
-use strict;
-use Getopt::Long qw(GetOptions);
-
-#open TMP,">mk_supernovae.pl.args";
-#map {print TMP "$_ "} @ARGV;
-#close TMP;
-
-sub usage($) {
- my $ret;
- print "USAGE: mk_supernovae.pl [--fragile=file]* --out=file file1 file2*\n";
- print " --help: show this message\n";
- print " --fragile=file: specify that file is fragile and shouldn't be supernovaed\n";
- print " --out=file: specify the name of the output file\n";
- print "elements may be separated by semi-columns (;) instead of spaces, too\n";
- exit $ret;
-}
-
-my @fragile_files=undef;
-my $outfile=undef;
-my $help;
-
-Getopt::Long::config('permute','no_getopt_compat', 'no_auto_abbrev');
-GetOptions(
- 'help|h' => \$help,
-
- 'fragile=s' =>\@fragile_files,
- 'out=s' =>\$outfile) or usage(1);
-
-@fragile_files = split(/;/,join(';',@fragile_files));
-@fragile_files = split(/ /,join(' ',@fragile_files));
-
-usage(0) if (defined($help));
-unless(defined($outfile)) {
- print "ERROR: No outfile defined.\n";
- usage(1);
-}
-
-#print "mk_supernovae: generate $outfile\n";
-
-open OUT, ">$outfile" or die "ERROR: cannot open $outfile: $!\n";
-
-print OUT <<EOF
-#define SUPERNOVAE_MODE 1
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE /* for getline() with older libc */
-#endif
-#ifndef _SVID_SOURCE
-# define _SVID_SOURCE /* strdup() */
-#endif
-#ifndef _ISOC99_SOURCE
-# define _ISOC99_SOURCE /* isfinite() */
-#endif
-#ifndef _ISO_C99_SOURCE
-# define _ISO_C99_SOURCE /* isfinite() */
-#endif
-#include <ctype.h>
-#include "portable.h"
-#include "xbt.h"
-
-EOF
- ;
-
-sub readfile($) {
- my $filename=shift;
- open IN,"$filename" || die "ERROR: cannot read $filename: $!\n";
- my $res;
- while (<IN>) {
- $res .= $_;
- }
- close IN;
- return $res;
-}
-
-
-my %fragile;
-map {$fragile{$_}=1} @fragile_files;
-my @args = split(/;/,join(';',@ARGV));
-@args = split(/ /,join(' ',@args));
-my $nbfile=0;
-foreach my $file (@args) {
- if ($fragile{$file}) {
- print "mk_supernovae: $file is fragile, skip it\n";
- next;
- }
-# print "mk_supernovae: process $file\n";
- $nbfile++;
-
- my $needundef=1;
- print OUT "/* file $file */\n";
- if ($file eq "xbt/log.c") {
- print OUT " #define _simgrid_log_category__default &_simgrid_log_category__log\n";
- } else {
- my $ctn = readfile($file);
- if ($ctn =~ m/XBT_LOG_[^ ]*?DEFAULT_[^ ]*?CATEGORY/s) {
- my $default=$ctn;
- $default =~ s/.*XBT_LOG_[^ ]*?DEFAULT_[^ ]*?CATEGORY[^(]*\(([^,)]*).*$/$1/s;
- print OUT " #define _simgrid_log_category__default &_simgrid_log_category__$default\n";
- } else {
- print OUT " /* no default category in file $file */\n";
- $needundef = 0;
- }
- }
- print OUT " #include \"$file\"\n";
- print OUT " #undef _simgrid_log_category__default\n" if $needundef;
- print OUT "\n";
-}
-close OUT;
-print "mk_supernovae: $outfile contains $nbfile files inlined\n";
-/* 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"
-/* 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"
-/* 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"
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)
}
}
-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;
}
}
+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;
}
}
-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;
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;
-/* 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
-/* 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
-/* 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
-/* 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
xbt_getpid = MSG_process_self_PID;
if (!msg_global) {
- s_msg_vm_t vm; // to compute the offset
SIMIX_global_init(argc, 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();
#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);
TRACE_end();
#endif
- xbt_swag_free(msg_global->vms);
free(msg_global);
msg_global = NULL;
}
-/* 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
*/
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
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
/*proc->simdata->waiting_action = act_sleep;
FIXME: check if not setting the waiting_action breaks something on msg
-
+
proc->simdata->waiting_action = NULL;*/
TRY {
*/
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);
}
* #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);
}
*/
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
*/
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.
*
*/
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
* \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);
}
* \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
*/
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.
*
* 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
*
* 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
* \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 */
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;
}
*
* 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
*/
&& (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);
-/* 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
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);
}
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;
}
*/
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
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
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
*
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;
}
-/* Copyright (c) 2004-2013. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "msg_private.h"
#include "xbt/log.h"
-#include <inttypes.h>
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg,
"Logging specific to MSG (io)");
/********************************* 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);
__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"
* \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);
}
* \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);
}
* \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);
}
}
/*
- * Move a file to another location. Depending on the values of dest, dest, mount,
- * and fullname, this move can be local or remote and, within a host, on the same
- * mounted disk or between mounted disks.
+ * \ingroup msg_file_management
+ * \brief Set the file position indicator in the msg_file_t by adding offset bytes
+ * to the position specified by origin (either SEEK_SET, SEEK_CUR, or SEEK_END).
+ *
+ * \param fd : file object that identifies the stream
+ * \param offset : number of bytes to offset from origin
+ * \param origin : Position used as reference for the offset. It is specified by
+ * one of the following constants defined in <cstdio> exclusively to be used as
+ * arguments for this function (SEEK_SET = beginning of file, SEEK_CUR = current
+ * position of the file pointer, SEEK_END = end of file)
+ *
+ * \return If successful, the function returns MSG_OK (=0). Otherwise, it returns
+ * MSG_TASK_CANCELED (=8).
*
*/
-msg_error_t MSG_file_move (msg_file_t fd, msg_host_t dest, char* mount, char* fullname)
+msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin)
{
- THROW_UNIMPLEMENTED;
- return MSG_OK;
+ //THROW_UNIMPLEMENTED;
+ return simcall_file_seek(fd->simdata->smx_file, offset, origin);
}
/*
- * Set the file position indicator in the msg_file_t by adding offset bytes
- * to the position specified by whence (either SEEK_SET, SEEK_CUR, or SEEK_END).
+ * \ingroup msg_file_management
+ * \brief Returns the current value of the position indicator of the file
+ *
+ * \param fd : file object that identifies the stream
+ * \return On success, the current value of the position indicator is returned.
+ *
*/
-msg_error_t MSG_file_seek (msg_file_t fd, sg_storage_size_t offset, int whence)
+sg_size_t MSG_file_tell(msg_file_t fd)
{
- THROW_UNIMPLEMENTED;
- return MSG_OK;
+ return simcall_file_tell(fd->simdata->smx_file);
}
-/*
- * Rename the file in the contents of its associated storage.
- */
-msg_error_t MSG_file_rename (msg_file_t fd, char* new_name)
-{
- THROW_UNIMPLEMENTED;
- return MSG_OK;
-}
/********************************* Storage **************************************/
/** \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);
}
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;
+}
/* 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
* #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
*/
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;
/* 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;
}
&& (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
-/* 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
-/* 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"
-/* 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
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 !!!! *******/
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;
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;
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;*/
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);
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);
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()
-/* 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
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);
}
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 */
-/* 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
-/* 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"
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;
/* 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);
simcall_host_execution_set_priority(task->simdata->compute,
task->simdata->priority);
}
+
+
+/** \ingroup m_task_management
+ * \brief Changes the maximum CPU utilization of a computation task.
+ * Unit is flops/s.
+ *
+ * For VMs, there is a pitfall. Please see MSG_vm_set_bound().
+ */
+void MSG_task_set_bound(msg_task_t task, double bound)
+{
+ xbt_assert(task, "Invalid parameter");
+ xbt_assert(task->simdata, "Invalid parameter");
+
+ if (bound == 0)
+ XBT_INFO("bound == 0 means no capping (i.e., unlimited).");
+
+ task->simdata->bound = bound;
+ if (task->simdata->compute)
+ simcall_host_execution_set_bound(task->simdata->compute,
+ task->simdata->bound);
+}
+
+
+/** \ingroup m_task_management
+ * \brief Changes the CPU affinity of a computation task.
+ *
+ * When pinning the given task to the first CPU core of the given host, use
+ * 0x01 for the mask value. Each bit of the mask value corresponds to each CPU
+ * core. See taskset(1) on Linux.
+ *
+ * \param task a target task
+ * \param host the host having a multi-core CPU
+ * \param mask the bit mask of a new CPU affinity setting for the task
+ *
+ *
+ * Usage:
+ * 0. Define a host with multiple cores.
+ * \<host id="PM0" power="1E8" core="2"/\>
+ *
+ * 1. Pin a given task to the first CPU core of a host.
+ * MSG_task_set_affinity(task, pm0, 0x01);
+ *
+ * 2. Pin a given task to the third CPU core of a host. Turn on the third bit of the mask.
+ * MSG_task_set_affinity(task, pm0, 0x04); // 0x04 == 100B
+ *
+ * 3. Pin a given VM to the first CPU core of a host.
+ * MSG_vm_set_affinity(vm, pm0, 0x01);
+ *
+ * See examples/msg/cloud/multicore.c for more information.
+ *
+ *
+ * Note:
+ * 1. The current code does not allow an affinity of a task to multiple cores.
+ * The mask value 0x03 (i.e., a given task will be executed on the first core
+ * or the second core) is not allowed. The mask value 0x01 or 0x02 works. See
+ * cpu_cas01.c for details.
+ *
+ * 2. It is recommended to first compare simulation results in both the Lazy
+ * and Full calculation modes (using --cfg=cpu/optim:Full or not). Fix
+ * cpu_cas01.c if you find wrong results in the Lazy mode.
+ *
+ */
+void MSG_task_set_affinity(msg_task_t task, msg_host_t host, unsigned long mask)
+{
+ xbt_assert(task, "Invalid parameter");
+ xbt_assert(task->simdata, "Invalid parameter");
+
+ if (mask == 0) {
+ /* 0 means clear */
+ {
+ /* We need remove_ext() not throwing exception. */
+ void *ret = xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t));
+ if (ret != NULL)
+ xbt_dict_remove_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host));
+ }
+ } else
+ xbt_dict_set_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(host), (void *) mask, NULL);
+
+ /* We set affinity data of this task. If the task is being executed, we
+ * actually change the affinity setting of the task. Otherwise, this change
+ * will be applied when the task is executed. */
+
+ if (!task->simdata->compute) {
+ /* task is not yet executed */
+ XBT_INFO("set affinity(0x%04lx@%s) for %s (not active now)", mask, MSG_host_get_name(host), MSG_task_get_name(task));
+ return;
+ }
+
+ {
+ smx_action_t compute = task->simdata->compute;
+ msg_host_t host_now = compute->execution.host; // simix_private.h is necessary
+ if (host_now != host) {
+ /* task is not yet executed on this host */
+ XBT_INFO("set affinity(0x%04lx@%s) for %s (not active now)", mask, MSG_host_get_name(host), MSG_task_get_name(task));
+ return;
+ }
+
+ /* task is being executed on this host. so change the affinity now */
+ {
+ /* check it works. remove me if it works. */
+ unsigned long affinity_mask = (unsigned long) xbt_dict_get_or_null_ext(task->simdata->affinity_mask_db, (char *) host, sizeof(msg_host_t));
+ xbt_assert(affinity_mask == mask);
+ }
+
+ XBT_INFO("set affinity(0x%04lx@%s) for %s", mask, MSG_host_get_name(host), MSG_task_get_name(task));
+ simcall_host_execution_set_affinity(task->simdata->compute, host, mask);
+ }
+}
-/* 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));
}
/* 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
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
FAIL("Unexpected character `%c': `</adag>' expected.",dax_text[0]);
YY_BREAK
case YY_STATE_EOF(S_dax__adag_1):
-case YY_STATE_EOF(S_dax__adag_5):
-case YY_STATE_EOF(E_dax__adag):
case YY_STATE_EOF(S_dax__adag_3):
+case YY_STATE_EOF(E_dax__adag):
case YY_STATE_EOF(S_dax__adag):
+case YY_STATE_EOF(S_dax__adag_5):
FAIL("Premature EOF: `</adag>' expected.");
YY_BREAK
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
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
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</job>' expected.",dax_text[0]);
YY_BREAK
-case YY_STATE_EOF(S_dax__job):
-case YY_STATE_EOF(E_dax__job):
case YY_STATE_EOF(S_dax__job_2):
+case YY_STATE_EOF(E_dax__job):
+case YY_STATE_EOF(S_dax__job):
FAIL("Premature EOF: `</job>' expected.");
YY_BREAK
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
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
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
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
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</child>' expected.",dax_text[0]);
YY_BREAK
-case YY_STATE_EOF(S_dax__child_2):
-case YY_STATE_EOF(E_dax__child):
case YY_STATE_EOF(S_dax__child):
+case YY_STATE_EOF(E_dax__child):
+case YY_STATE_EOF(S_dax__child_2):
FAIL("Premature EOF: `</child>' expected.");
YY_BREAK
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);
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
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");
}
/* 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);
-/* 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
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;
*/
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);
}
/**
*/
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);
}
/**
-/* 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
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);
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);
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;
}
}
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);
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);
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);
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");
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;
}
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;
}
-/* 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
#include "surf/surf.h"
#include "surf/surf_resource.h"
-
-
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_workstation, sd,
"Logging specific to SimDag (workstation)");
*/
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));
}
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);
*/
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));
}
/**
*/
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);
}
/**
*/
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);
}
/**
* \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*/
-/* 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
"Each of these configurations can be used by adding\n"
" --cfg=<option name>:<option value>\n"
"to the command line.\n"
+"\n"
"You can also use --help-models to see the details of all models known by this simulator.\n"
#ifdef HAVE_TRACING
"\n"
sg_cfg_exit_early();
}
+/* callback of the plugin variable */
+static void _sg_cfg_cb__plugin(const char *name, int pos)
+{
+ char *val;
+
+ XBT_VERB("PLUGIN");
+ xbt_assert(_sg_cfg_init_status < 2,
+ "Cannot load a plugin after the initialization");
+
+ val = xbt_cfg_get_string(_sg_cfg_set, name);
+
+ if (!strcmp(val, "help")) {
+ model_help("plugin", surf_plugin_description);
+ sg_cfg_exit_early();
+ }
+
+ /* New Module missing */
+ int plugin_id = find_model_description(surf_plugin_description, val);
+ surf_plugin_description[plugin_id].model_init_preparse();
+}
+
/* callback of the workstation/model variable */
static void _sg_cfg_cb__workstation_model(const char *name, int pos)
{
find_model_description(surf_workstation_model_description, val);
}
+/* callback of the vm_workstation/model variable */
+static void _sg_cfg_cb__vm_workstation_model(const char *name, int pos)
+{
+ char *val;
+
+ xbt_assert(_sg_cfg_init_status < 2,
+ "Cannot change the model after the initialization");
+
+ val = xbt_cfg_get_string(_sg_cfg_set, name);
+
+ if (!strcmp(val, "help")) {
+ model_help("vm_workstation", surf_vm_workstation_model_description);
+ sg_cfg_exit_early();
+ }
+
+ /* Make sure that the model exists */
+ find_model_description(surf_vm_workstation_model_description, val);
+}
+
/* callback of the cpu/model variable */
static void _sg_cfg_cb__cpu_model(const char *name, int pos)
{
}
#endif
+/* build description line with possible values */
+static void describe_model(char *result,
+ const s_surf_model_description_t model_description[],
+ const char *name,
+ const char *description)
+{
+ char *p = result +
+ sprintf(result, "%s. Possible values: %s", description,
+ model_description[0].name ? model_description[0].name : "n/a");
+ int i;
+ for (i = 1; model_description[i].name; i++)
+ p += sprintf(p, ", %s", model_description[i].name);
+ sprintf(p,
+ ".\n (use 'help' as a value to see the long description of each %s)",
+ name);
+}
+
/* create the config set, register what should be and parse the command line*/
void sg_config_init(int *argc, char **argv)
{
- char *description = xbt_malloc(1024);
- char *p;
- int i;
+ char description[1024];
/* Create the configuration support */
if (_sg_cfg_init_status == 0) { /* Only create stuff if not already inited */
- sprintf(description,
- "The model to use for the CPU. Possible values: ");
- p = description;
- while (*(++p) != '\0');
- for (i = 0; surf_cpu_model_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_cpu_model_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each model)");
+
+ /* Plugins configuration */
+ describe_model(description, surf_plugin_description,
+ "plugin", "The plugins");
+ xbt_cfg_register(&_sg_cfg_set, "plugin", description,
+ xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__plugin, NULL);
+
+ describe_model(description, surf_cpu_model_description,
+ "model", "The model to use for the CPU");
xbt_cfg_register(&_sg_cfg_set, "cpu/model", description,
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__cpu_model, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "cpu/model", "Cas01");
- while (*(++p) != '\0');
- for (i = 0; surf_optimization_mode_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_optimization_mode_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each optimization mode)");
+ describe_model(description, surf_optimization_mode_description,
+ "optimization mode",
+ "The optimization modes to use for the CPU");
xbt_cfg_register(&_sg_cfg_set, "cpu/optim", description,
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__optimization_mode, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "cpu/optim", "Lazy");
- sprintf(description,
- "The model to use for the storage. Possible values: ");
- p = description;
- while (*(++p) != '\0');
- for (i = 0; surf_storage_model_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_storage_model_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each model)");
+ describe_model(description, surf_storage_model_description,
+ "model", "The model to use for the storage");
xbt_cfg_register(&_sg_cfg_set, "storage/model", description,
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "storage/model", "default");
- /* ********************************************************************* */
- /* TUTORIAL: New model */
- sprintf(description,
- "The model to use for the New model. Possible values: ");
- p = description;
- while (*(++p) != '\0');
- for (i = 0; surf_new_model_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_new_model_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each model)");
- xbt_cfg_register(&_sg_cfg_set, "new_model/model", description,
- xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__storage_mode, NULL);
- xbt_cfg_setdefault_string(_sg_cfg_set, "new_model/model", "default");
- /* ********************************************************************* */
-
- sprintf(description,
- "The model to use for the network. Possible values: ");
- p = description;
- while (*(++p) != '\0');
- for (i = 0; surf_network_model_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_network_model_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each model)");
+ describe_model(description, surf_network_model_description,
+ "model", "The model to use for the network");
xbt_cfg_register(&_sg_cfg_set, "network/model", description,
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__network_model, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "network/model", "LV08");
- sprintf(description,
- "The optimization modes to use for the network. Possible values: ");
- p = description;
- while (*(++p) != '\0');
- for (i = 0; surf_optimization_mode_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_optimization_mode_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each optimization mode)");
+ describe_model(description, surf_optimization_mode_description,
+ "optimization mode",
+ "The optimization modes to use for the network");
xbt_cfg_register(&_sg_cfg_set, "network/optim", description,
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__optimization_mode, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "network/optim", "Lazy");
- sprintf(description,
- "The model to use for the workstation. Possible values: ");
- p = description;
- while (*(++p) != '\0');
- for (i = 0; surf_workstation_model_description[i].name; i++)
- p += sprintf(p, "%s%s", (i == 0 ? "" : ", "),
- surf_workstation_model_description[i].name);
- sprintf(p,
- ".\n (use 'help' as a value to see the long description of each model)");
+ describe_model(description, surf_workstation_model_description,
+ "model", "The model to use for the workstation");
xbt_cfg_register(&_sg_cfg_set, "workstation/model", description,
xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__workstation_model, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "workstation/model", "default");
+ describe_model(description, surf_vm_workstation_model_description,
+ "model", "The model to use for the vm workstation");
+ xbt_cfg_register(&_sg_cfg_set, "vm_workstation/model", description,
+ xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__vm_workstation_model, NULL);
+ xbt_cfg_setdefault_string(_sg_cfg_set, "vm_workstation/model", "default");
+
xbt_cfg_register(&_sg_cfg_set, "network/TCP_gamma",
"Size of the biggest TCP window (cat /proc/sys/net/ipv4/tcp_[rw]mem for recv/send window; Use the last given value, which is the max window size)",
xbt_cfgelm_double, 1, 1, _sg_cfg_cb__tcp_gamma, NULL);
xbt_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes");
/* context factory */
- sprintf(description,
- "Context factory to use in SIMIX. Possible values: thread");
const char *dflt_ctx_fact = "thread";
+ {
+ char *p = description +
+ sprintf(description,
+ "Context factory to use in SIMIX. Possible values: %s",
+ dflt_ctx_fact);
#ifdef CONTEXT_UCONTEXT
- dflt_ctx_fact = "ucontext";
- strcat(strcat(description, ", "), dflt_ctx_fact);
+ dflt_ctx_fact = "ucontext";
+ p += sprintf(p, ", %s", dflt_ctx_fact);
#endif
#ifdef HAVE_RAWCTX
- dflt_ctx_fact = "raw";
- strcat(strcat(description, ", "), dflt_ctx_fact);
+ dflt_ctx_fact = "raw";
+ p += sprintf(p, ", %s", dflt_ctx_fact);
#endif
- strcat(description, ".");
+ sprintf(p, ".");
+ }
xbt_cfg_register(&_sg_cfg_set, "contexts/factory", description,
xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL);
xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact);
} else {
XBT_WARN("Call to sg_config_init() after initialization ignored");
}
-
- xbt_free(description);
}
void sg_config_finalize(void)
void surf_config_models_setup()
{
const char *workstation_model_name;
+ const char *vm_workstation_model_name;
int workstation_id = -1;
+ int vm_workstation_id = -1;
char *network_model_name = NULL;
char *cpu_model_name = NULL;
int storage_id = -1;
workstation_model_name =
xbt_cfg_get_string(_sg_cfg_set, "workstation/model");
+ vm_workstation_model_name =
+ xbt_cfg_get_string(_sg_cfg_set, "vm_workstation/model");
network_model_name = xbt_cfg_get_string(_sg_cfg_set, "network/model");
cpu_model_name = xbt_cfg_get_string(_sg_cfg_set, "cpu/model");
storage_model_name = xbt_cfg_get_string(_sg_cfg_set, "storage/model");
XBT_DEBUG("Call workstation_model_init");
surf_workstation_model_description[workstation_id].model_init_preparse();
+ XBT_DEBUG("Call vm_workstation_model_init");
+ vm_workstation_id = find_model_description(surf_vm_workstation_model_description,
+ vm_workstation_model_name);
+ surf_vm_workstation_model_description[vm_workstation_id].model_init_preparse();
+
XBT_DEBUG("Call storage_model_init");
storage_id = find_model_description(surf_storage_model_description, storage_model_name);
surf_storage_model_description[storage_id].model_init_preparse();
- /* ********************************************************************* */
- /* TUTORIAL: New model */
- int new_model_id = -1;
- char *new_model_name = NULL;
- new_model_name = xbt_cfg_get_string(_sg_cfg_set, "new_model/model");
- XBT_DEBUG("Call new model_init");
- new_model_id = find_model_description(surf_new_model_description, new_model_name);
- surf_new_model_description[new_model_id].model_init_preparse();
- /* ********************************************************************* */
+}
+
+int sg_cfg_is_default_value(const char *name)
+{
+ return xbt_cfg_is_default_value(_sg_cfg_set, name);
}
int sg_cfg_get_int(const char* name)
{
- return xbt_cfg_get_int(_sg_cfg_set,name);
+ return xbt_cfg_get_int(_sg_cfg_set, name);
}
double sg_cfg_get_double(const char* name)
{
- return xbt_cfg_get_double(_sg_cfg_set,name);
+ return xbt_cfg_get_double(_sg_cfg_set, name);
}
char* sg_cfg_get_string(const char* name)
{
- return xbt_cfg_get_string(_sg_cfg_set,name);
+ return xbt_cfg_get_string(_sg_cfg_set, name);
}
int sg_cfg_get_boolean(const char* name)
{
- return xbt_cfg_get_boolean(_sg_cfg_set,name);
+ return xbt_cfg_get_boolean(_sg_cfg_set, name);
}
void sg_cfg_get_peer(const char *name, char **peer, int *port)
{
- xbt_cfg_get_peer(_sg_cfg_set,name, peer, port);
+ xbt_cfg_get_peer(_sg_cfg_set, name, peer, port);
}
xbt_dynar_t sg_cfg_get_dynar(const char* name)
{
- return xbt_cfg_get_dynar(_sg_cfg_set,name);
+ return xbt_cfg_get_dynar(_sg_cfg_set, name);
}
--- /dev/null
+# Copyright (c) 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+# name has_answer (restype,rescast) (arg0name,arg0type,arg0cast) (arg1name,arg1type,arg1cast)
+host_get_by_name True (void*, smx_host_t) (name, const char*)
+host_get_name True (const char*) (host, void*, smx_host_t)
+host_on True (void) (host, void*, smx_host_t)
+host_off True (void) (host, void*, smx_host_t)
+host_get_properties True (void*, xbt_dict_t) (host, void*, smx_host_t)
+host_get_core True (int) (host, void*, smx_host_t)
+host_get_process_list True (void*, xbt_swag_t) (host, void*, smx_host_t)
+host_get_speed True (double) (host, void*, smx_host_t)
+host_get_available_speed True (double) (host, void*, smx_host_t)
+host_get_state True (int) (host, void*, smx_host_t)
+host_get_current_power_peak True (double) (host, void*, smx_host_t)
+host_get_power_peak_at True (double) (host, void*, smx_host_t) (pstate_index, int)
+host_get_nb_pstates True (int) (host, void*, smx_host_t)
+host_set_power_peak_at True (void) (host, void*, smx_host_t) (pstate_index, int)
+host_get_consumed_energy True (double) (host, void*, smx_host_t)
+host_execute True (void*, smx_action_t) (name, const char*) (host, void*, smx_host_t) (computation_amount, double) (priority, double) (bound, double) (affinity_mask, unsigned long)
+host_parallel_execute True (void*, smx_action_t) (name, const char*) (host_nb, int) (host_list, void*, smx_host_t*) (computation_amount, void*, double*) (communication_amount, void*, double*) (amount, double) (rate, double)
+host_execution_destroy True (void) (execution, void*, smx_action_t)
+host_execution_cancel True (void) (execution, void*, smx_action_t)
+host_execution_get_remains True (double) (execution, void*, smx_action_t)
+host_execution_get_state True (int) (execution, void*, smx_action_t)
+host_execution_set_priority True (void) (execution, void*, smx_action_t) (priority, double)
+host_execution_set_bound True (void) (execution, void*, smx_action_t) (bound, double)
+host_execution_set_affinity True (void) (execution, void*, smx_action_t) (ws, void*, smx_host_t) (mask, unsigned long)
+host_execution_wait False (int) (execution, void*, smx_action_t)
+host_get_storage_list True (void*, xbt_dict_t) (host, void*, smx_host_t)
+host_get_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t)
+host_set_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t)
+vm_create True (void*) (name, const char*) (ind_pm, void*, smx_host_t)
+vm_start True (void) (ind_vm, void*, smx_host_t)
+vm_get_state True (int) (ind_vm, void*, smx_host_t)
+vm_migrate True (void) (ind_vm, void*, smx_host_t) (ind_dst_pm, void*, smx_host_t)
+vm_get_pm True (void*) (ind_vm, void*, smx_host_t)
+vm_set_bound True (void) (ind_vm, void*, smx_host_t) (bound, double)
+vm_set_affinity True (void) (ind_vm, void*, smx_host_t) (ind_pm, void*, smx_host_t) (mask, unsigned long)
+vm_destroy True (void) (ind_vm, void*, smx_host_t)
+vm_suspend True (void) (ind_vm, void*, smx_host_t)
+vm_resume True (void) (ind_vm, void*, smx_host_t)
+vm_shutdown True (void) (ind_vm, void*, smx_host_t)
+vm_save True (void) (ind_vm, void*, smx_host_t)
+vm_restore True (void) (ind_vm, void*, smx_host_t)
+process_create True (void) (process, void*, smx_process_t*) (name, const char*) (code, FPtr, xbt_main_func_t) (data, void*) (hostname, const char*) (kill_time, double) (argc, int) (argv, void*, char**) (properties, void*, xbt_dict_t) (auto_restart, int)
+process_kill True (void) (process, void*, smx_process_t)
+process_killall True (void) (reset_pid, int)
+process_cleanup True (void) (process, void*, smx_process_t)
+process_change_host True (void) (process, void*, smx_process_t) (dest, void*, smx_host_t)
+process_suspend False (void) (process, void*, smx_process_t)
+process_resume True (void) (process, void*, smx_process_t)
+process_count True (int)
+process_get_PID True (int) (process, void*, smx_process_t)
+process_get_PPID True (int) (process, void*, smx_process_t)
+process_get_data True (void*) (process, void*, smx_process_t)
+process_set_data True (void) (process, void*, smx_process_t) (data, void*)
+process_get_host True (void*, smx_host_t) (process, void*, smx_process_t)
+process_get_name True (const char*) (process, void*, smx_process_t)
+process_is_suspended True (int) (process, void*, smx_process_t)
+process_get_properties True (void*, xbt_dict_t) (process, void*, smx_process_t)
+process_sleep False (int) (duration, double)
+process_on_exit True (void) (process, void*, smx_process_t) (fun, FPtr, int_f_pvoid_t) (data, void*)
+process_auto_restart_set True (void) (process, void*, smx_process_t) (auto_restart, int)
+process_restart True (void*, smx_process_t) (process, void*, smx_process_t)
+rdv_create True (void*, smx_rdv_t) (name, const char*)
+rdv_destroy True (void) (rdv, void*, smx_rdv_t)
+rdv_get_by_name True (void*, smx_host_t) (name, const char*)
+rdv_comm_count_by_host True (unsigned int) (rdv, void*, smx_rdv_t) (host, void*, smx_host_t)
+rdv_get_head True (void*, smx_action_t) (rdv, void*, smx_rdv_t)
+rdv_set_receiver True (void) (rdv, void*, smx_rdv_t) (receiver, void*, smx_process_t)
+rdv_get_receiver True (void*, smx_process_t) (rdv, void*, smx_rdv_t)
+comm_iprobe True (void*, smx_action_t) (rdv, void*, smx_rdv_t) (src, int) (tag, int) (match_fun, FPtr, simix_match_func_t) (data, void*)
+comm_send False (void) (rdv, void*, smx_rdv_t) (task_size, double) (rate, double) (src_buff, void*) (src_buff_size, size_t) (match_fun, FPtr, simix_match_func_t) (data, void*) (timeout, double)
+comm_isend True (void*, smx_action_t) (rdv, void*, smx_rdv_t) (task_size, double) (rate, double) (src_buff, void*) (src_buff_size, size_t) (match_fun, FPtr, simix_match_func_t) (clean_fun, FPtr, simix_clean_func_t) (data, void*) (detached, int)
+comm_recv False (void) (rdv, void*, smx_rdv_t) (dst_buff, void*) (dst_buff_size, void*, size_t*) (match_fun, FPtr, simix_match_func_t) (data, void*) (timeout, double) (rate, double)
+comm_irecv True (void*, smx_action_t) (rdv, void*, smx_rdv_t) (dst_buff, void*) (dst_buff_size, void*, size_t*) (match_fun, FPtr, simix_match_func_t) (data, void*) (rate, double)
+comm_cancel True (void) (comm, void*, smx_action_t)
+comm_waitany False (int) (comms, void*, xbt_dynar_t)
+comm_wait False (void) (comm, void*, smx_action_t) (timeout, double)
+comm_test False (int) (comm, void*, smx_action_t)
+comm_testany False (int) (comms, void*, xbt_dynar_t)
+comm_get_remains True (double) (comm, void*, smx_action_t)
+comm_get_state True (int) (comm, void*, smx_action_t)
+comm_get_src_data True (void*) (comm, void*, smx_action_t)
+comm_get_dst_data True (void*) (comm, void*, smx_action_t)
+comm_get_src_proc True (void*, smx_process_t) (comm, void*, smx_action_t)
+comm_get_dst_proc True (void*, smx_process_t) (comm, void*, smx_action_t)
+mutex_init True (void*, smx_mutex_t)
+mutex_destroy True (void) (mutex, void*, smx_mutex_t)
+mutex_lock False (void) (mutex, void*, smx_mutex_t)
+mutex_trylock True (int) (mutex, void*, smx_mutex_t)
+mutex_unlock True (void) (mutex, void*, smx_mutex_t)
+cond_init True (void*, smx_cond_t)
+cond_destroy True (void) (cond, void*, smx_cond_t)
+cond_signal True (void) (cond, void*, smx_cond_t)
+cond_wait False (void) (cond, void*, smx_cond_t) (mutex, void*, smx_mutex_t)
+cond_wait_timeout False (void) (cond, void*, smx_cond_t) (mutex, void*, smx_mutex_t) (timeout, double)
+cond_broadcast True (void) (cond, void*, smx_cond_t)
+sem_init True (void*, smx_sem_t) (capacity, int)
+sem_destroy True (void) (sem, void*, smx_sem_t)
+sem_release True (void) (sem, void*, smx_sem_t)
+sem_would_block True (int) (sem, void*, smx_sem_t)
+sem_acquire False (void) (sem, void*, smx_sem_t)
+sem_acquire_timeout False (void) (sem, void*, smx_sem_t) (timeout, double)
+sem_get_capacity True (int) (sem, void*, smx_sem_t)
+file_get_data True (void*) (fd, void*, smx_file_t)
+file_set_data True (void) (fd, void*, smx_file_t) (data, void*)
+file_read False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t)
+file_write False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t)
+file_open False (void*, smx_file_t) (mount, const char*) (path, const char*)
+file_close False (int) (fd, void*, smx_file_t)
+file_unlink True (int) (fd, void*, smx_file_t)
+file_ls False (void*, xbt_dict_t) (mount, const char*) (path, const char*)
+file_get_size True (sg_size_t) (fd, void*, smx_file_t)
+file_tell True (sg_size_t) (fd, void*, smx_file_t)
+file_seek True (int) (fd, void*, smx_file_t) (offset, sg_size_t) (origin, int)
+file_get_info True (void*, xbt_dynar_t) (fd, void*, smx_file_t)
+storage_file_rename True (void) (storage, void*, smx_storage_t) (src, const char*) (dest, const char*)
+storage_get_free_size True (sg_size_t) (name, const char*)
+storage_get_used_size True (sg_size_t) (name, const char*)
+storage_get_properties True (void*, xbt_dict_t) (storage, void*, smx_storage_t)
+storage_get_content True (void*, xbt_dict_t) (storage, void*, smx_storage_t)
+asr_get_properties True (void*, xbt_dict_t) (name, const char*)
+## HAVE_LATENCY_BOUND_TRACKING
+comm_is_latency_bounded True (int) (comm, void*, smx_action_t)
+## HAVE_TRACING
+set_category True (void) (action, void*, smx_action_t) (category, const char*)
+## HAVE_MC
+mc_snapshot True (void*)
+mc_compare_snapshots True (int) (s1, void*) (s2, void*)
+mc_random True (int) (min, int) (max, int)
--- /dev/null
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+import re, glob
+
+types = [('TCHAR', 'char', 'c')
+ ,('TSTRING', 'const char*', 'cc')
+ ,('TINT', 'int', 'i')
+ ,('TLONG', 'long', 'l')
+ ,('TUCHAR', 'unsigned char', 'uc')
+ ,('TUSHORT', 'unsigned short', 'us')
+ ,('TUINT', 'unsigned int', 'ui')
+ ,('TULONG', 'unsigned long', 'ul')
+ ,('TFLOAT', 'float', 'f')
+ ,('TDOUBLE', 'double', 'd')
+ ,('TDPTR', 'void*', 'dp')
+ ,('TFPTR', 'FPtr', 'fp')
+ ,('TCPTR', 'const void*', 'cp')
+ ,('TSIZE', 'size_t', 'sz')
+ ,('TSGSIZE', 'sg_size_t', 'sgsz')
+ ,('TVOID', 'void', '')
+ ,('TDSPEC', 'void*', 'dp')
+ ,('TFSPEC', 'FPtr', 'fp')]
+
+class Arg(object):
+ simcall_types = {k:v for _,k,v in types}
+ def __init__(self, name, type, casted=None):
+ self.name = name
+ self.type = type
+ self.casted = casted
+ assert type in self.simcall_types, '%s not in (%s)'%(type, ', '.join(self.simcall_types.keys()))
+
+ def field(self):
+ return self.simcall_types[self.type]
+
+ def ret(self):
+ return '%s'%self.casted if self.casted else self.type
+
+ def cast(self):
+ return '(%s)'%self.casted if self.casted else ''
+
+class Simcall(object):
+ simcalls_BODY = None
+ simcalls_PRE = None
+ def __init__(self, name, res, args, has_answer=True):
+ self.name = name
+ self.res = res
+ self.args = args
+ self.has_answer = has_answer
+
+ def check(self):
+ # smx_user.c simcall_BODY_
+ # smx_*.c void SIMIX_pre_host_on(smx_simcall_t simcall, smx_host_t h)
+ self.check_body()
+ self.check_pre()
+
+ def check_body(self):
+ if self.simcalls_BODY is None:
+ f = open('smx_user.c')
+ self.simcalls_BODY = set(re.findall('simcall_BODY_(.*?)\(', f.read()))
+ f.close()
+ if self.name not in self.simcalls_BODY:
+ print '# ERROR: No function calling simcall_BODY_%s'%self.name
+ print '# Add something like this to smx_user.c:'
+ print '''%s simcall_%s(%s)
+{
+ return simcall_BODY_%s(%s);
+}\n'''%(self.res.ret()
+ ,self.name
+ ,', '.join('%s %s'%(arg.ret(), arg.name)
+ for arg in self.args)
+ ,self.name
+ ,', '.join(arg.name for arg in self.args))
+ return False
+ return True
+
+ def check_pre(self):
+ if self.simcalls_PRE is None:
+ self.simcalls_PRE = set()
+ for fn in glob.glob('smx_*') + glob.glob('../mc/*'):
+ f = open(fn)
+ self.simcalls_PRE |= set(re.findall('SIMIX_pre_(.*?)\(', f.read()))
+ f.close()
+ if self.name not in self.simcalls_PRE:
+ print '# ERROR: No function called SIMIX_pre_%s'%self.name
+ print '# Add something like this to smx_.*.c:'
+ print '''%s SIMIX_pre_%s(smx_simcall_t simcall%s)
+{
+ // Your code handling the simcall
+}\n'''%(self.res.ret()
+ ,self.name
+ ,''.join(', %s %s'%(arg.ret(), arg.name)
+ for arg in self.args))
+ return False
+ return True
+
+ def enum(self):
+ return 'SIMCALL_%s,'%(self.name.upper())
+
+ def string(self):
+ return '[SIMCALL_%s] = "SIMCALL_%s",'%(self.name.upper(), self.name.upper())
+
+ def result_getter_setter(self):
+ return '%s\n%s'%(self.result_getter(), self.result_setter())
+
+ def result_getter(self):
+ return '' if self.res.type == 'void' else '''static inline %s simcall_%s__get__result(smx_simcall_t simcall){
+ return %s simcall->result.%s;
+}'''%(self.res.ret(), self.name, self.res.cast(), self.res.field())
+
+ def result_setter(self):
+ return '' if self.res.type == 'void' else '''static inline void simcall_%s__set__result(smx_simcall_t simcall, %s result){
+ simcall->result.%s = result;
+}'''%(self.name, self.res.type, self.res.field())
+
+ def args_getter_setter(self):
+ res = []
+ for i in range(len(self.args)):
+ res.append(self.arg_getter(i))
+ res.append(self.arg_setter(i))
+ return '\n'.join(res)
+
+ def arg_getter(self, i):
+ arg = self.args[i]
+ return '''static inline %s simcall_%s__get__%s(smx_simcall_t simcall){
+ return %s simcall->args[%i].%s;
+}'''%(arg.ret(), self.name, arg.name, arg.cast(), i, arg.field())
+
+ def arg_setter(self, i):
+ arg = self.args[i]
+ return '''static inline void simcall_%s__set__%s(smx_simcall_t simcall, %s arg){
+ simcall->args[%i].%s = arg;
+}'''%(self.name, arg.name, arg.type, i, arg.field())
+
+ def case(self):
+ return '''case SIMCALL_%s:
+ %sSIMIX_pre_%s(simcall %s);
+ %sbreak;
+'''%(self.name.upper(),
+ 'simcall->result.%s = '%self.res.field() if self.res.type != 'void' and self.has_answer else ' ',
+ self.name,
+ ''.join(', %s simcall->args[%d].%s'%(arg.cast(), i, arg.field())
+ for i, arg in enumerate(self.args)),
+ 'SIMIX_simcall_answer(simcall);\n ' if self.has_answer else ' ')
+
+ def body(self):
+ return ''' inline static %s simcall_BODY_%s(%s) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_%s;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+%s
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%%s' on simcall %%s (%%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ %s
+ }'''%(self.res.ret()
+ ,self.name
+ ,', '.join('%s %s'%(arg.ret(), arg.name)
+ for arg in self.args)
+ ,self.name.upper()
+ ,'\n'.join(' self->simcall.args[%d].%s = (%s) %s;'%(i, arg.field(), arg.type, arg.name)
+ for i, arg in enumerate(self.args))
+ ,'' if self.res.type == 'void' else 'return self->simcall.result.%s;'%self.res.field())
+
+def parse(fn):
+ res = []
+ resdi = None
+ resd = {}
+ for line in open(fn).read().split('\n'):
+ if line.startswith('##'):
+ resdi = []
+ resd[re.search(r'## *(.*)', line).group(1)] = resdi
+ if line.startswith('#') or not line:
+ continue
+ match = re.match(r'(\S*?) *(\S*?) *\((.*?)(?:, *(.*?))?\) *(.*)', line)
+ assert match, line
+ name, ans, rest, resc, args = match.groups()
+ sargs = []
+ for n,t,c in re.findall(r'\((.*?), *(.*?)(?:, *(.*?))?\)', args):
+ sargs.append(Arg(n,t,c))
+ sim = Simcall(name, Arg('result', rest, resc), sargs, ans == 'True')
+ if resdi is None:
+ res.append(sim)
+ else:
+ resdi.append(sim)
+ return res, resd
+
+def write(fn, func, scs, scd):
+ f = open(fn, 'w')
+ f.write('/*********************************************\n')
+ f.write(' * File Generated by src/simix/simcalls.py *\n')
+ f.write(' * from src/simix/simcalls.in *\n')
+ f.write(' * Do not modify this file, add new simcalls *\n')
+ f.write(' * in src/simix/simcalls.in *\n')
+ f.write(' *********************************************/\n\n')
+ f.write('\n'.join(func(sc) for sc in scs))
+ for k, v in scd.items():
+ f.write('\n#ifdef %s\n%s\n#endif\n'%(k, '\n'.join(func(sc) for sc in v)))
+ f.close()
+
+if __name__=='__main__':
+ import sys
+ simcalls, simcalls_dict = parse('simcalls.in')
+
+ ok = True
+ ok &= all(map(Simcall.check, simcalls))
+ for k,v in simcalls_dict.items():
+ ok &= all(map(Simcall.check, v))
+ #if not ok:
+ # sys.exit(1)
+
+ write('simcalls_generated_enum.h', Simcall.enum, simcalls, simcalls_dict)
+ write('simcalls_generated_string.c', Simcall.string, simcalls, simcalls_dict)
+ write('simcalls_generated_res_getter_setter.h', Simcall.result_getter_setter, simcalls, simcalls_dict)
+ write('simcalls_generated_args_getter_setter.h', Simcall.args_getter_setter, simcalls, simcalls_dict)
+ write('simcalls_generated_case.c', Simcall.case, simcalls, simcalls_dict)
+ write('simcalls_generated_body.c', Simcall.body, simcalls, simcalls_dict)
--- /dev/null
+/*********************************************
+ * File Generated by src/simix/simcalls.py *
+ * from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in *
+ *********************************************/
+
+static inline const char* simcall_host_get_by_name__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_host_get_by_name__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline smx_host_t simcall_host_get_name__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_name__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_on__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_on__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_off__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_off__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_properties__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_properties__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_core__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_core__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_process_list__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_process_list__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_speed__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_speed__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_available_speed__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_available_speed__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_state__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_state__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_current_power_peak__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_current_power_peak__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_power_peak_at__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_power_peak_at__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_host_get_power_peak_at__get__pstate_index(smx_simcall_t simcall){
+ return simcall->args[1].i;
+}
+static inline void simcall_host_get_power_peak_at__set__pstate_index(smx_simcall_t simcall, int arg){
+ simcall->args[1].i = arg;
+}
+static inline smx_host_t simcall_host_get_nb_pstates__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_nb_pstates__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_set_power_peak_at__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_set_power_peak_at__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_host_set_power_peak_at__get__pstate_index(smx_simcall_t simcall){
+ return simcall->args[1].i;
+}
+static inline void simcall_host_set_power_peak_at__set__pstate_index(smx_simcall_t simcall, int arg){
+ simcall->args[1].i = arg;
+}
+static inline smx_host_t simcall_host_get_consumed_energy__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_consumed_energy__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_host_execute__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_host_execute__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline smx_host_t simcall_host_execute__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_host_execute__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline double simcall_host_execute__get__computation_amount(smx_simcall_t simcall){
+ return simcall->args[2].d;
+}
+static inline void simcall_host_execute__set__computation_amount(smx_simcall_t simcall, double arg){
+ simcall->args[2].d = arg;
+}
+static inline double simcall_host_execute__get__priority(smx_simcall_t simcall){
+ return simcall->args[3].d;
+}
+static inline void simcall_host_execute__set__priority(smx_simcall_t simcall, double arg){
+ simcall->args[3].d = arg;
+}
+static inline double simcall_host_execute__get__bound(smx_simcall_t simcall){
+ return simcall->args[4].d;
+}
+static inline void simcall_host_execute__set__bound(smx_simcall_t simcall, double arg){
+ simcall->args[4].d = arg;
+}
+static inline unsigned long simcall_host_execute__get__affinity_mask(smx_simcall_t simcall){
+ return simcall->args[5].ul;
+}
+static inline void simcall_host_execute__set__affinity_mask(smx_simcall_t simcall, unsigned long arg){
+ simcall->args[5].ul = arg;
+}
+static inline const char* simcall_host_parallel_execute__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_host_parallel_execute__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline int simcall_host_parallel_execute__get__host_nb(smx_simcall_t simcall){
+ return simcall->args[1].i;
+}
+static inline void simcall_host_parallel_execute__set__host_nb(smx_simcall_t simcall, int arg){
+ simcall->args[1].i = arg;
+}
+static inline smx_host_t* simcall_host_parallel_execute__get__host_list(smx_simcall_t simcall){
+ return (smx_host_t*) simcall->args[2].dp;
+}
+static inline void simcall_host_parallel_execute__set__host_list(smx_simcall_t simcall, void* arg){
+ simcall->args[2].dp = arg;
+}
+static inline double* simcall_host_parallel_execute__get__computation_amount(smx_simcall_t simcall){
+ return (double*) simcall->args[3].dp;
+}
+static inline void simcall_host_parallel_execute__set__computation_amount(smx_simcall_t simcall, void* arg){
+ simcall->args[3].dp = arg;
+}
+static inline double* simcall_host_parallel_execute__get__communication_amount(smx_simcall_t simcall){
+ return (double*) simcall->args[4].dp;
+}
+static inline void simcall_host_parallel_execute__set__communication_amount(smx_simcall_t simcall, void* arg){
+ simcall->args[4].dp = arg;
+}
+static inline double simcall_host_parallel_execute__get__amount(smx_simcall_t simcall){
+ return simcall->args[5].d;
+}
+static inline void simcall_host_parallel_execute__set__amount(smx_simcall_t simcall, double arg){
+ simcall->args[5].d = arg;
+}
+static inline double simcall_host_parallel_execute__get__rate(smx_simcall_t simcall){
+ return simcall->args[6].d;
+}
+static inline void simcall_host_parallel_execute__set__rate(smx_simcall_t simcall, double arg){
+ simcall->args[6].d = arg;
+}
+static inline smx_action_t simcall_host_execution_destroy__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_destroy__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_cancel__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_cancel__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_get_remains__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_get_remains__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_get_state__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_get_state__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_host_execution_set_priority__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_set_priority__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_host_execution_set_priority__get__priority(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_host_execution_set_priority__set__priority(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline smx_action_t simcall_host_execution_set_bound__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_set_bound__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_host_execution_set_bound__get__bound(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_host_execution_set_bound__set__bound(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline smx_action_t simcall_host_execution_set_affinity__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_set_affinity__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_execution_set_affinity__get__ws(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_host_execution_set_affinity__set__ws(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline unsigned long simcall_host_execution_set_affinity__get__mask(smx_simcall_t simcall){
+ return simcall->args[2].ul;
+}
+static inline void simcall_host_execution_set_affinity__set__mask(smx_simcall_t simcall, unsigned long arg){
+ simcall->args[2].ul = arg;
+}
+static inline smx_action_t simcall_host_execution_wait__get__execution(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_host_execution_wait__set__execution(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_storage_list__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_storage_list__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_host_get_params__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_get_params__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline ws_params_t simcall_host_get_params__get__params(smx_simcall_t simcall){
+ return (ws_params_t) simcall->args[1].dp;
+}
+static inline void simcall_host_get_params__set__params(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_host_t simcall_host_set_params__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_host_set_params__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline ws_params_t simcall_host_set_params__get__params(smx_simcall_t simcall){
+ return (ws_params_t) simcall->args[1].dp;
+}
+static inline void simcall_host_set_params__set__params(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline const char* simcall_vm_create__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_vm_create__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline smx_host_t simcall_vm_create__get__ind_pm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_vm_create__set__ind_pm(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_host_t simcall_vm_start__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_start__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_get_state__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_get_state__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_migrate__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_migrate__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_migrate__get__ind_dst_pm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_vm_migrate__set__ind_dst_pm(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_host_t simcall_vm_get_pm__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_get_pm__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_set_bound__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_set_bound__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_vm_set_bound__get__bound(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_vm_set_bound__set__bound(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline smx_host_t simcall_vm_set_affinity__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_set_affinity__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_set_affinity__get__ind_pm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_vm_set_affinity__set__ind_pm(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline unsigned long simcall_vm_set_affinity__get__mask(smx_simcall_t simcall){
+ return simcall->args[2].ul;
+}
+static inline void simcall_vm_set_affinity__set__mask(smx_simcall_t simcall, unsigned long arg){
+ simcall->args[2].ul = arg;
+}
+static inline smx_host_t simcall_vm_destroy__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_destroy__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_suspend__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_suspend__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_resume__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_resume__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_shutdown__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_shutdown__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_save__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_save__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_vm_restore__get__ind_vm(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[0].dp;
+}
+static inline void simcall_vm_restore__set__ind_vm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t* simcall_process_create__get__process(smx_simcall_t simcall){
+ return (smx_process_t*) simcall->args[0].dp;
+}
+static inline void simcall_process_create__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_process_create__get__name(smx_simcall_t simcall){
+ return simcall->args[1].cc;
+}
+static inline void simcall_process_create__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[1].cc = arg;
+}
+static inline xbt_main_func_t simcall_process_create__get__code(smx_simcall_t simcall){
+ return (xbt_main_func_t) simcall->args[2].fp;
+}
+static inline void simcall_process_create__set__code(smx_simcall_t simcall, FPtr arg){
+ simcall->args[2].fp = arg;
+}
+static inline void* simcall_process_create__get__data(smx_simcall_t simcall){
+ return simcall->args[3].dp;
+}
+static inline void simcall_process_create__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[3].dp = arg;
+}
+static inline const char* simcall_process_create__get__hostname(smx_simcall_t simcall){
+ return simcall->args[4].cc;
+}
+static inline void simcall_process_create__set__hostname(smx_simcall_t simcall, const char* arg){
+ simcall->args[4].cc = arg;
+}
+static inline double simcall_process_create__get__kill_time(smx_simcall_t simcall){
+ return simcall->args[5].d;
+}
+static inline void simcall_process_create__set__kill_time(smx_simcall_t simcall, double arg){
+ simcall->args[5].d = arg;
+}
+static inline int simcall_process_create__get__argc(smx_simcall_t simcall){
+ return simcall->args[6].i;
+}
+static inline void simcall_process_create__set__argc(smx_simcall_t simcall, int arg){
+ simcall->args[6].i = arg;
+}
+static inline char** simcall_process_create__get__argv(smx_simcall_t simcall){
+ return (char**) simcall->args[7].dp;
+}
+static inline void simcall_process_create__set__argv(smx_simcall_t simcall, void* arg){
+ simcall->args[7].dp = arg;
+}
+static inline xbt_dict_t simcall_process_create__get__properties(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->args[8].dp;
+}
+static inline void simcall_process_create__set__properties(smx_simcall_t simcall, void* arg){
+ simcall->args[8].dp = arg;
+}
+static inline int simcall_process_create__get__auto_restart(smx_simcall_t simcall){
+ return simcall->args[9].i;
+}
+static inline void simcall_process_create__set__auto_restart(smx_simcall_t simcall, int arg){
+ simcall->args[9].i = arg;
+}
+static inline smx_process_t simcall_process_kill__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_kill__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_process_killall__get__reset_pid(smx_simcall_t simcall){
+ return simcall->args[0].i;
+}
+static inline void simcall_process_killall__set__reset_pid(smx_simcall_t simcall, int arg){
+ simcall->args[0].i = arg;
+}
+static inline smx_process_t simcall_process_cleanup__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_cleanup__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_change_host__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_change_host__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_process_change_host__get__dest(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_process_change_host__set__dest(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_process_t simcall_process_suspend__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_suspend__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_resume__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_resume__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+
+static inline smx_process_t simcall_process_get_PID__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_PID__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_PPID__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_PPID__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_data__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_data__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_set_data__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_set_data__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline void* simcall_process_set_data__get__data(smx_simcall_t simcall){
+ return simcall->args[1].dp;
+}
+static inline void simcall_process_set_data__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_process_t simcall_process_get_host__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_host__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_name__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_name__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_is_suspended__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_is_suspended__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_process_get_properties__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_get_properties__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_process_sleep__get__duration(smx_simcall_t simcall){
+ return simcall->args[0].d;
+}
+static inline void simcall_process_sleep__set__duration(smx_simcall_t simcall, double arg){
+ simcall->args[0].d = arg;
+}
+static inline smx_process_t simcall_process_on_exit__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_on_exit__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int_f_pvoid_t simcall_process_on_exit__get__fun(smx_simcall_t simcall){
+ return (int_f_pvoid_t) simcall->args[1].fp;
+}
+static inline void simcall_process_on_exit__set__fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[1].fp = arg;
+}
+static inline void* simcall_process_on_exit__get__data(smx_simcall_t simcall){
+ return simcall->args[2].dp;
+}
+static inline void simcall_process_on_exit__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[2].dp = arg;
+}
+static inline smx_process_t simcall_process_auto_restart_set__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_auto_restart_set__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_process_auto_restart_set__get__auto_restart(smx_simcall_t simcall){
+ return simcall->args[1].i;
+}
+static inline void simcall_process_auto_restart_set__set__auto_restart(smx_simcall_t simcall, int arg){
+ simcall->args[1].i = arg;
+}
+static inline smx_process_t simcall_process_restart__get__process(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[0].dp;
+}
+static inline void simcall_process_restart__set__process(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_rdv_create__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_rdv_create__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline smx_rdv_t simcall_rdv_destroy__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_destroy__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_rdv_get_by_name__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_rdv_get_by_name__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline smx_rdv_t simcall_rdv_comm_count_by_host__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_comm_count_by_host__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_host_t simcall_rdv_comm_count_by_host__get__host(smx_simcall_t simcall){
+ return (smx_host_t) simcall->args[1].dp;
+}
+static inline void simcall_rdv_comm_count_by_host__set__host(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_rdv_t simcall_rdv_get_head__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_get_head__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_rdv_t simcall_rdv_set_receiver__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_set_receiver__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_process_t simcall_rdv_set_receiver__get__receiver(smx_simcall_t simcall){
+ return (smx_process_t) simcall->args[1].dp;
+}
+static inline void simcall_rdv_set_receiver__set__receiver(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_rdv_t simcall_rdv_get_receiver__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_rdv_get_receiver__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_rdv_t simcall_comm_iprobe__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_iprobe__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_comm_iprobe__get__src(smx_simcall_t simcall){
+ return simcall->args[1].i;
+}
+static inline void simcall_comm_iprobe__set__src(smx_simcall_t simcall, int arg){
+ simcall->args[1].i = arg;
+}
+static inline int simcall_comm_iprobe__get__tag(smx_simcall_t simcall){
+ return simcall->args[2].i;
+}
+static inline void simcall_comm_iprobe__set__tag(smx_simcall_t simcall, int arg){
+ simcall->args[2].i = arg;
+}
+static inline simix_match_func_t simcall_comm_iprobe__get__match_fun(smx_simcall_t simcall){
+ return (simix_match_func_t) simcall->args[3].fp;
+}
+static inline void simcall_comm_iprobe__set__match_fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[3].fp = arg;
+}
+static inline void* simcall_comm_iprobe__get__data(smx_simcall_t simcall){
+ return simcall->args[4].dp;
+}
+static inline void simcall_comm_iprobe__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[4].dp = arg;
+}
+static inline smx_rdv_t simcall_comm_send__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_send__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_comm_send__get__task_size(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_comm_send__set__task_size(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline double simcall_comm_send__get__rate(smx_simcall_t simcall){
+ return simcall->args[2].d;
+}
+static inline void simcall_comm_send__set__rate(smx_simcall_t simcall, double arg){
+ simcall->args[2].d = arg;
+}
+static inline void* simcall_comm_send__get__src_buff(smx_simcall_t simcall){
+ return simcall->args[3].dp;
+}
+static inline void simcall_comm_send__set__src_buff(smx_simcall_t simcall, void* arg){
+ simcall->args[3].dp = arg;
+}
+static inline size_t simcall_comm_send__get__src_buff_size(smx_simcall_t simcall){
+ return simcall->args[4].sz;
+}
+static inline void simcall_comm_send__set__src_buff_size(smx_simcall_t simcall, size_t arg){
+ simcall->args[4].sz = arg;
+}
+static inline simix_match_func_t simcall_comm_send__get__match_fun(smx_simcall_t simcall){
+ return (simix_match_func_t) simcall->args[5].fp;
+}
+static inline void simcall_comm_send__set__match_fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[5].fp = arg;
+}
+static inline void* simcall_comm_send__get__data(smx_simcall_t simcall){
+ return simcall->args[6].dp;
+}
+static inline void simcall_comm_send__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[6].dp = arg;
+}
+static inline double simcall_comm_send__get__timeout(smx_simcall_t simcall){
+ return simcall->args[7].d;
+}
+static inline void simcall_comm_send__set__timeout(smx_simcall_t simcall, double arg){
+ simcall->args[7].d = arg;
+}
+static inline smx_rdv_t simcall_comm_isend__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_isend__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_comm_isend__get__task_size(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_comm_isend__set__task_size(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline double simcall_comm_isend__get__rate(smx_simcall_t simcall){
+ return simcall->args[2].d;
+}
+static inline void simcall_comm_isend__set__rate(smx_simcall_t simcall, double arg){
+ simcall->args[2].d = arg;
+}
+static inline void* simcall_comm_isend__get__src_buff(smx_simcall_t simcall){
+ return simcall->args[3].dp;
+}
+static inline void simcall_comm_isend__set__src_buff(smx_simcall_t simcall, void* arg){
+ simcall->args[3].dp = arg;
+}
+static inline size_t simcall_comm_isend__get__src_buff_size(smx_simcall_t simcall){
+ return simcall->args[4].sz;
+}
+static inline void simcall_comm_isend__set__src_buff_size(smx_simcall_t simcall, size_t arg){
+ simcall->args[4].sz = arg;
+}
+static inline simix_match_func_t simcall_comm_isend__get__match_fun(smx_simcall_t simcall){
+ return (simix_match_func_t) simcall->args[5].fp;
+}
+static inline void simcall_comm_isend__set__match_fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[5].fp = arg;
+}
+static inline simix_clean_func_t simcall_comm_isend__get__clean_fun(smx_simcall_t simcall){
+ return (simix_clean_func_t) simcall->args[6].fp;
+}
+static inline void simcall_comm_isend__set__clean_fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[6].fp = arg;
+}
+static inline void* simcall_comm_isend__get__data(smx_simcall_t simcall){
+ return simcall->args[7].dp;
+}
+static inline void simcall_comm_isend__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[7].dp = arg;
+}
+static inline int simcall_comm_isend__get__detached(smx_simcall_t simcall){
+ return simcall->args[8].i;
+}
+static inline void simcall_comm_isend__set__detached(smx_simcall_t simcall, int arg){
+ simcall->args[8].i = arg;
+}
+static inline smx_rdv_t simcall_comm_recv__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_recv__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline void* simcall_comm_recv__get__dst_buff(smx_simcall_t simcall){
+ return simcall->args[1].dp;
+}
+static inline void simcall_comm_recv__set__dst_buff(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline size_t* simcall_comm_recv__get__dst_buff_size(smx_simcall_t simcall){
+ return (size_t*) simcall->args[2].dp;
+}
+static inline void simcall_comm_recv__set__dst_buff_size(smx_simcall_t simcall, void* arg){
+ simcall->args[2].dp = arg;
+}
+static inline simix_match_func_t simcall_comm_recv__get__match_fun(smx_simcall_t simcall){
+ return (simix_match_func_t) simcall->args[3].fp;
+}
+static inline void simcall_comm_recv__set__match_fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[3].fp = arg;
+}
+static inline void* simcall_comm_recv__get__data(smx_simcall_t simcall){
+ return simcall->args[4].dp;
+}
+static inline void simcall_comm_recv__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[4].dp = arg;
+}
+static inline double simcall_comm_recv__get__timeout(smx_simcall_t simcall){
+ return simcall->args[5].d;
+}
+static inline void simcall_comm_recv__set__timeout(smx_simcall_t simcall, double arg){
+ simcall->args[5].d = arg;
+}
+static inline double simcall_comm_recv__get__rate(smx_simcall_t simcall){
+ return simcall->args[6].d;
+}
+static inline void simcall_comm_recv__set__rate(smx_simcall_t simcall, double arg){
+ simcall->args[6].d = arg;
+}
+static inline smx_rdv_t simcall_comm_irecv__get__rdv(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_irecv__set__rdv(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline void* simcall_comm_irecv__get__dst_buff(smx_simcall_t simcall){
+ return simcall->args[1].dp;
+}
+static inline void simcall_comm_irecv__set__dst_buff(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline size_t* simcall_comm_irecv__get__dst_buff_size(smx_simcall_t simcall){
+ return (size_t*) simcall->args[2].dp;
+}
+static inline void simcall_comm_irecv__set__dst_buff_size(smx_simcall_t simcall, void* arg){
+ simcall->args[2].dp = arg;
+}
+static inline simix_match_func_t simcall_comm_irecv__get__match_fun(smx_simcall_t simcall){
+ return (simix_match_func_t) simcall->args[3].fp;
+}
+static inline void simcall_comm_irecv__set__match_fun(smx_simcall_t simcall, FPtr arg){
+ simcall->args[3].fp = arg;
+}
+static inline void* simcall_comm_irecv__get__data(smx_simcall_t simcall){
+ return simcall->args[4].dp;
+}
+static inline void simcall_comm_irecv__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[4].dp = arg;
+}
+static inline double simcall_comm_irecv__get__rate(smx_simcall_t simcall){
+ return simcall->args[5].d;
+}
+static inline void simcall_comm_irecv__set__rate(smx_simcall_t simcall, double arg){
+ simcall->args[5].d = arg;
+}
+static inline smx_action_t simcall_comm_cancel__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_cancel__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline xbt_dynar_t simcall_comm_waitany__get__comms(smx_simcall_t simcall){
+ return (xbt_dynar_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_waitany__set__comms(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_wait__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_wait__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_comm_wait__get__timeout(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_comm_wait__set__timeout(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline smx_action_t simcall_comm_test__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_test__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline xbt_dynar_t simcall_comm_testany__get__comms(smx_simcall_t simcall){
+ return (xbt_dynar_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_testany__set__comms(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_remains__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_remains__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_state__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_state__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_src_data__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_src_data__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_dst_data__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_dst_data__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_src_proc__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_src_proc__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_action_t simcall_comm_get_dst_proc__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_get_dst_proc__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+
+static inline smx_mutex_t simcall_mutex_destroy__get__mutex(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_destroy__set__mutex(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_mutex_lock__get__mutex(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_lock__set__mutex(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_mutex_trylock__get__mutex(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_trylock__set__mutex(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_mutex_unlock__get__mutex(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->args[0].dp;
+}
+static inline void simcall_mutex_unlock__set__mutex(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+
+static inline smx_cond_t simcall_cond_destroy__get__cond(smx_simcall_t simcall){
+ return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_destroy__set__cond(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_cond_t simcall_cond_signal__get__cond(smx_simcall_t simcall){
+ return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_signal__set__cond(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_cond_t simcall_cond_wait__get__cond(smx_simcall_t simcall){
+ return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_wait__set__cond(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_cond_wait__get__mutex(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->args[1].dp;
+}
+static inline void simcall_cond_wait__set__mutex(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_cond_t simcall_cond_wait_timeout__get__cond(smx_simcall_t simcall){
+ return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_wait_timeout__set__cond(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_mutex_t simcall_cond_wait_timeout__get__mutex(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->args[1].dp;
+}
+static inline void simcall_cond_wait_timeout__set__mutex(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline double simcall_cond_wait_timeout__get__timeout(smx_simcall_t simcall){
+ return simcall->args[2].d;
+}
+static inline void simcall_cond_wait_timeout__set__timeout(smx_simcall_t simcall, double arg){
+ simcall->args[2].d = arg;
+}
+static inline smx_cond_t simcall_cond_broadcast__get__cond(smx_simcall_t simcall){
+ return (smx_cond_t) simcall->args[0].dp;
+}
+static inline void simcall_cond_broadcast__set__cond(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline int simcall_sem_init__get__capacity(smx_simcall_t simcall){
+ return simcall->args[0].i;
+}
+static inline void simcall_sem_init__set__capacity(smx_simcall_t simcall, int arg){
+ simcall->args[0].i = arg;
+}
+static inline smx_sem_t simcall_sem_destroy__get__sem(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_destroy__set__sem(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_release__get__sem(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_release__set__sem(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_would_block__get__sem(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_would_block__set__sem(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_acquire__get__sem(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_acquire__set__sem(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_sem_t simcall_sem_acquire_timeout__get__sem(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_acquire_timeout__set__sem(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline double simcall_sem_acquire_timeout__get__timeout(smx_simcall_t simcall){
+ return simcall->args[1].d;
+}
+static inline void simcall_sem_acquire_timeout__set__timeout(smx_simcall_t simcall, double arg){
+ simcall->args[1].d = arg;
+}
+static inline smx_sem_t simcall_sem_get_capacity__get__sem(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->args[0].dp;
+}
+static inline void simcall_sem_get_capacity__set__sem(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_get_data__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_get_data__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_set_data__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_set_data__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline void* simcall_file_set_data__get__data(smx_simcall_t simcall){
+ return simcall->args[1].dp;
+}
+static inline void simcall_file_set_data__set__data(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline smx_file_t simcall_file_read__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_read__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline sg_size_t simcall_file_read__get__size(smx_simcall_t simcall){
+ return simcall->args[1].sgsz;
+}
+static inline void simcall_file_read__set__size(smx_simcall_t simcall, sg_size_t arg){
+ simcall->args[1].sgsz = arg;
+}
+static inline smx_file_t simcall_file_write__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_write__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline sg_size_t simcall_file_write__get__size(smx_simcall_t simcall){
+ return simcall->args[1].sgsz;
+}
+static inline void simcall_file_write__set__size(smx_simcall_t simcall, sg_size_t arg){
+ simcall->args[1].sgsz = arg;
+}
+static inline const char* simcall_file_open__get__mount(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_file_open__set__mount(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline const char* simcall_file_open__get__path(smx_simcall_t simcall){
+ return simcall->args[1].cc;
+}
+static inline void simcall_file_open__set__path(smx_simcall_t simcall, const char* arg){
+ simcall->args[1].cc = arg;
+}
+static inline smx_file_t simcall_file_close__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_close__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_unlink__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_unlink__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_file_ls__get__mount(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_file_ls__set__mount(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline const char* simcall_file_ls__get__path(smx_simcall_t simcall){
+ return simcall->args[1].cc;
+}
+static inline void simcall_file_ls__set__path(smx_simcall_t simcall, const char* arg){
+ simcall->args[1].cc = arg;
+}
+static inline smx_file_t simcall_file_get_size__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_get_size__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_tell__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_tell__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_file_t simcall_file_seek__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_seek__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline sg_size_t simcall_file_seek__get__offset(smx_simcall_t simcall){
+ return simcall->args[1].sgsz;
+}
+static inline void simcall_file_seek__set__offset(smx_simcall_t simcall, sg_size_t arg){
+ simcall->args[1].sgsz = arg;
+}
+static inline int simcall_file_seek__get__origin(smx_simcall_t simcall){
+ return simcall->args[2].i;
+}
+static inline void simcall_file_seek__set__origin(smx_simcall_t simcall, int arg){
+ simcall->args[2].i = arg;
+}
+static inline smx_file_t simcall_file_get_info__get__fd(smx_simcall_t simcall){
+ return (smx_file_t) simcall->args[0].dp;
+}
+static inline void simcall_file_get_info__set__fd(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_storage_t simcall_storage_file_rename__get__storage(smx_simcall_t simcall){
+ return (smx_storage_t) simcall->args[0].dp;
+}
+static inline void simcall_storage_file_rename__set__storage(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_storage_file_rename__get__src(smx_simcall_t simcall){
+ return simcall->args[1].cc;
+}
+static inline void simcall_storage_file_rename__set__src(smx_simcall_t simcall, const char* arg){
+ simcall->args[1].cc = arg;
+}
+static inline const char* simcall_storage_file_rename__get__dest(smx_simcall_t simcall){
+ return simcall->args[2].cc;
+}
+static inline void simcall_storage_file_rename__set__dest(smx_simcall_t simcall, const char* arg){
+ simcall->args[2].cc = arg;
+}
+static inline const char* simcall_storage_get_free_size__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_storage_get_free_size__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline const char* simcall_storage_get_used_size__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_storage_get_used_size__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+static inline smx_storage_t simcall_storage_get_properties__get__storage(smx_simcall_t simcall){
+ return (smx_storage_t) simcall->args[0].dp;
+}
+static inline void simcall_storage_get_properties__set__storage(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline smx_storage_t simcall_storage_get_content__get__storage(smx_simcall_t simcall){
+ return (smx_storage_t) simcall->args[0].dp;
+}
+static inline void simcall_storage_get_content__set__storage(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_asr_get_properties__get__name(smx_simcall_t simcall){
+ return simcall->args[0].cc;
+}
+static inline void simcall_asr_get_properties__set__name(smx_simcall_t simcall, const char* arg){
+ simcall->args[0].cc = arg;
+}
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+static inline smx_action_t simcall_comm_is_latency_bounded__get__comm(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_comm_is_latency_bounded__set__comm(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+#endif
+
+#ifdef HAVE_TRACING
+static inline smx_action_t simcall_set_category__get__action(smx_simcall_t simcall){
+ return (smx_action_t) simcall->args[0].dp;
+}
+static inline void simcall_set_category__set__action(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline const char* simcall_set_category__get__category(smx_simcall_t simcall){
+ return simcall->args[1].cc;
+}
+static inline void simcall_set_category__set__category(smx_simcall_t simcall, const char* arg){
+ simcall->args[1].cc = arg;
+}
+#endif
+
+#ifdef HAVE_MC
+
+static inline void* simcall_mc_compare_snapshots__get__s1(smx_simcall_t simcall){
+ return simcall->args[0].dp;
+}
+static inline void simcall_mc_compare_snapshots__set__s1(smx_simcall_t simcall, void* arg){
+ simcall->args[0].dp = arg;
+}
+static inline void* simcall_mc_compare_snapshots__get__s2(smx_simcall_t simcall){
+ return simcall->args[1].dp;
+}
+static inline void simcall_mc_compare_snapshots__set__s2(smx_simcall_t simcall, void* arg){
+ simcall->args[1].dp = arg;
+}
+static inline int simcall_mc_random__get__min(smx_simcall_t simcall){
+ return simcall->args[0].i;
+}
+static inline void simcall_mc_random__set__min(smx_simcall_t simcall, int arg){
+ simcall->args[0].i = arg;
+}
+static inline int simcall_mc_random__get__max(smx_simcall_t simcall){
+ return simcall->args[1].i;
+}
+static inline void simcall_mc_random__set__max(smx_simcall_t simcall, int arg){
+ simcall->args[1].i = arg;
+}
+#endif
--- /dev/null
+/*********************************************
+ * File Generated by src/simix/simcalls.py *
+ * from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in *
+ *********************************************/
+
+ inline static smx_host_t simcall_BODY_host_get_by_name(const char* name) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_BY_NAME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static const char* simcall_BODY_host_get_name(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_NAME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.cc;
+ }
+ inline static void simcall_BODY_host_on(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_ON;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_host_off(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_OFF;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static xbt_dict_t simcall_BODY_host_get_properties(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_PROPERTIES;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static int simcall_BODY_host_get_core(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_CORE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static xbt_swag_t simcall_BODY_host_get_process_list(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_PROCESS_LIST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static double simcall_BODY_host_get_speed(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_SPEED;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static double simcall_BODY_host_get_available_speed(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_AVAILABLE_SPEED;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static int simcall_BODY_host_get_state(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_STATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static double simcall_BODY_host_get_current_power_peak(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_CURRENT_POWER_PEAK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static double simcall_BODY_host_get_power_peak_at(smx_host_t host, int pstate_index) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_POWER_PEAK_AT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ self->simcall.args[1].i = (int) pstate_index;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static int simcall_BODY_host_get_nb_pstates(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_NB_PSTATES;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_host_set_power_peak_at(smx_host_t host, int pstate_index) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_SET_POWER_PEAK_AT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ self->simcall.args[1].i = (int) pstate_index;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static double simcall_BODY_host_get_consumed_energy(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_CONSUMED_ENERGY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static smx_action_t simcall_BODY_host_execute(const char* name, smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ self->simcall.args[1].dp = (void*) host;
+ self->simcall.args[2].d = (double) computation_amount;
+ self->simcall.args[3].d = (double) priority;
+ self->simcall.args[4].d = (double) bound;
+ self->simcall.args[5].ul = (unsigned long) affinity_mask;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static smx_action_t simcall_BODY_host_parallel_execute(const char* name, int host_nb, smx_host_t* host_list, double* computation_amount, double* communication_amount, double amount, double rate) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_PARALLEL_EXECUTE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ self->simcall.args[1].i = (int) host_nb;
+ self->simcall.args[2].dp = (void*) host_list;
+ self->simcall.args[3].dp = (void*) computation_amount;
+ self->simcall.args[4].dp = (void*) communication_amount;
+ self->simcall.args[5].d = (double) amount;
+ self->simcall.args[6].d = (double) rate;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_host_execution_destroy(smx_action_t execution) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_DESTROY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_host_execution_cancel(smx_action_t execution) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_CANCEL;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static double simcall_BODY_host_execution_get_remains(smx_action_t execution) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_GET_REMAINS;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static int simcall_BODY_host_execution_get_state(smx_action_t execution) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_GET_STATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_host_execution_set_priority(smx_action_t execution, double priority) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_SET_PRIORITY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ self->simcall.args[1].d = (double) priority;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_host_execution_set_bound(smx_action_t execution, double bound) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_SET_BOUND;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ self->simcall.args[1].d = (double) bound;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_host_execution_set_affinity(smx_action_t execution, smx_host_t ws, unsigned long mask) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_SET_AFFINITY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ self->simcall.args[1].dp = (void*) ws;
+ self->simcall.args[2].ul = (unsigned long) mask;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_host_execution_wait(smx_action_t execution) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_EXECUTION_WAIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) execution;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static xbt_dict_t simcall_BODY_host_get_storage_list(smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_STORAGE_LIST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_host_get_params(smx_host_t ind_vm, ws_params_t params) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_GET_PARAMS;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ self->simcall.args[1].dp = (void*) params;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_host_set_params(smx_host_t ind_vm, ws_params_t params) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_HOST_SET_PARAMS;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ self->simcall.args[1].dp = (void*) params;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void* simcall_BODY_vm_create(const char* name, smx_host_t ind_pm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_CREATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ self->simcall.args[1].dp = (void*) ind_pm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_vm_start(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_START;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_vm_get_state(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_GET_STATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_vm_migrate(smx_host_t ind_vm, smx_host_t ind_dst_pm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_MIGRATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ self->simcall.args[1].dp = (void*) ind_dst_pm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void* simcall_BODY_vm_get_pm(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_GET_PM;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_vm_set_bound(smx_host_t ind_vm, double bound) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_SET_BOUND;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ self->simcall.args[1].d = (double) bound;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_set_affinity(smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_SET_AFFINITY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ self->simcall.args[1].dp = (void*) ind_pm;
+ self->simcall.args[2].ul = (unsigned long) mask;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_destroy(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_DESTROY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_suspend(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_SUSPEND;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_resume(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_RESUME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_shutdown(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_SHUTDOWN;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_save(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_SAVE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_vm_restore(smx_host_t ind_vm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_VM_RESTORE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) ind_vm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_create(smx_process_t* process, const char* name, xbt_main_func_t code, void* data, const char* hostname, double kill_time, int argc, char** argv, xbt_dict_t properties, int auto_restart) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_CREATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ self->simcall.args[1].cc = (const char*) name;
+ self->simcall.args[2].fp = (FPtr) code;
+ self->simcall.args[3].dp = (void*) data;
+ self->simcall.args[4].cc = (const char*) hostname;
+ self->simcall.args[5].d = (double) kill_time;
+ self->simcall.args[6].i = (int) argc;
+ self->simcall.args[7].dp = (void*) argv;
+ self->simcall.args[8].dp = (void*) properties;
+ self->simcall.args[9].i = (int) auto_restart;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_kill(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_KILL;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_killall(int reset_pid) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_KILLALL;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].i = (int) reset_pid;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_cleanup(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_CLEANUP;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_change_host(smx_process_t process, smx_host_t dest) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_CHANGE_HOST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ self->simcall.args[1].dp = (void*) dest;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_suspend(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_SUSPEND;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_resume(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_RESUME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_process_count() {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_COUNT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static int simcall_BODY_process_get_PID(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_GET_PID;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static int simcall_BODY_process_get_PPID(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_GET_PPID;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void* simcall_BODY_process_get_data(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_GET_DATA;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_process_set_data(smx_process_t process, void* data) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_SET_DATA;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ self->simcall.args[1].dp = (void*) data;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_host_t simcall_BODY_process_get_host(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_GET_HOST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static const char* simcall_BODY_process_get_name(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_GET_NAME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.cc;
+ }
+ inline static int simcall_BODY_process_is_suspended(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_IS_SUSPENDED;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static xbt_dict_t simcall_BODY_process_get_properties(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_GET_PROPERTIES;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static int simcall_BODY_process_sleep(double duration) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_SLEEP;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].d = (double) duration;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_process_on_exit(smx_process_t process, int_f_pvoid_t fun, void* data) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_ON_EXIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ self->simcall.args[1].fp = (FPtr) fun;
+ self->simcall.args[2].dp = (void*) data;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_process_auto_restart_set(smx_process_t process, int auto_restart) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_AUTO_RESTART_SET;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ self->simcall.args[1].i = (int) auto_restart;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_process_t simcall_BODY_process_restart(smx_process_t process) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_PROCESS_RESTART;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) process;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static smx_rdv_t simcall_BODY_rdv_create(const char* name) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_CREATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_rdv_destroy(smx_rdv_t rdv) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_DESTROY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_host_t simcall_BODY_rdv_get_by_name(const char* name) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_GET_BY_NAME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static unsigned int simcall_BODY_rdv_comm_count_by_host(smx_rdv_t rdv, smx_host_t host) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_COMM_COUNT_BY_HOST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].dp = (void*) host;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.ui;
+ }
+ inline static smx_action_t simcall_BODY_rdv_get_head(smx_rdv_t rdv) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_GET_HEAD;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_rdv_set_receiver(smx_rdv_t rdv, smx_process_t receiver) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_SET_RECEIVER;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].dp = (void*) receiver;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_process_t simcall_BODY_rdv_get_receiver(smx_rdv_t rdv) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_RDV_GET_RECEIVER;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static smx_action_t simcall_BODY_comm_iprobe(smx_rdv_t rdv, int src, int tag, simix_match_func_t match_fun, void* data) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_IPROBE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].i = (int) src;
+ self->simcall.args[2].i = (int) tag;
+ self->simcall.args[3].fp = (FPtr) match_fun;
+ self->simcall.args[4].dp = (void*) data;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_comm_send(smx_rdv_t rdv, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, void* data, double timeout) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_SEND;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].d = (double) task_size;
+ self->simcall.args[2].d = (double) rate;
+ self->simcall.args[3].dp = (void*) src_buff;
+ self->simcall.args[4].sz = (size_t) src_buff_size;
+ self->simcall.args[5].fp = (FPtr) match_fun;
+ self->simcall.args[6].dp = (void*) data;
+ self->simcall.args[7].d = (double) timeout;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_action_t simcall_BODY_comm_isend(smx_rdv_t rdv, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, void* data, int detached) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_ISEND;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].d = (double) task_size;
+ self->simcall.args[2].d = (double) rate;
+ self->simcall.args[3].dp = (void*) src_buff;
+ self->simcall.args[4].sz = (size_t) src_buff_size;
+ self->simcall.args[5].fp = (FPtr) match_fun;
+ self->simcall.args[6].fp = (FPtr) clean_fun;
+ self->simcall.args[7].dp = (void*) data;
+ self->simcall.args[8].i = (int) detached;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_comm_recv(smx_rdv_t rdv, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, void* data, double timeout, double rate) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_RECV;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].dp = (void*) dst_buff;
+ self->simcall.args[2].dp = (void*) dst_buff_size;
+ self->simcall.args[3].fp = (FPtr) match_fun;
+ self->simcall.args[4].dp = (void*) data;
+ self->simcall.args[5].d = (double) timeout;
+ self->simcall.args[6].d = (double) rate;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_action_t simcall_BODY_comm_irecv(smx_rdv_t rdv, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, void* data, double rate) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_IRECV;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) rdv;
+ self->simcall.args[1].dp = (void*) dst_buff;
+ self->simcall.args[2].dp = (void*) dst_buff_size;
+ self->simcall.args[3].fp = (FPtr) match_fun;
+ self->simcall.args[4].dp = (void*) data;
+ self->simcall.args[5].d = (double) rate;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_comm_cancel(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_CANCEL;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_comm_waitany(xbt_dynar_t comms) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_WAITANY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comms;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_comm_wait(smx_action_t comm, double timeout) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_WAIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ self->simcall.args[1].d = (double) timeout;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_comm_test(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_TEST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static int simcall_BODY_comm_testany(xbt_dynar_t comms) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_TESTANY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comms;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static double simcall_BODY_comm_get_remains(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_GET_REMAINS;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.d;
+ }
+ inline static int simcall_BODY_comm_get_state(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_GET_STATE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void* simcall_BODY_comm_get_src_data(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_GET_SRC_DATA;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void* simcall_BODY_comm_get_dst_data(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_GET_DST_DATA;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static smx_process_t simcall_BODY_comm_get_src_proc(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_GET_SRC_PROC;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static smx_process_t simcall_BODY_comm_get_dst_proc(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_GET_DST_PROC;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static smx_mutex_t simcall_BODY_mutex_init() {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MUTEX_INIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_mutex_destroy(smx_mutex_t mutex) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MUTEX_DESTROY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) mutex;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_mutex_lock(smx_mutex_t mutex) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MUTEX_LOCK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) mutex;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_mutex_trylock(smx_mutex_t mutex) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MUTEX_TRYLOCK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) mutex;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_mutex_unlock(smx_mutex_t mutex) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MUTEX_UNLOCK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) mutex;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_cond_t simcall_BODY_cond_init() {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COND_INIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_cond_destroy(smx_cond_t cond) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COND_DESTROY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) cond;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_cond_signal(smx_cond_t cond) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COND_SIGNAL;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) cond;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COND_WAIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) cond;
+ self->simcall.args[1].dp = (void*) mutex;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COND_WAIT_TIMEOUT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) cond;
+ self->simcall.args[1].dp = (void*) mutex;
+ self->simcall.args[2].d = (double) timeout;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_cond_broadcast(smx_cond_t cond) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COND_BROADCAST;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) cond;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static smx_sem_t simcall_BODY_sem_init(int capacity) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_INIT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].i = (int) capacity;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_sem_destroy(smx_sem_t sem) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_DESTROY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) sem;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_sem_release(smx_sem_t sem) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_RELEASE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) sem;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_sem_would_block(smx_sem_t sem) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_WOULD_BLOCK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) sem;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void simcall_BODY_sem_acquire(smx_sem_t sem) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_ACQUIRE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) sem;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static void simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_ACQUIRE_TIMEOUT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) sem;
+ self->simcall.args[1].d = (double) timeout;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static int simcall_BODY_sem_get_capacity(smx_sem_t sem) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SEM_GET_CAPACITY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) sem;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static void* simcall_BODY_file_get_data(smx_file_t fd) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_GET_DATA;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_file_set_data(smx_file_t fd, void* data) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_SET_DATA;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ self->simcall.args[1].dp = (void*) data;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static sg_size_t simcall_BODY_file_read(smx_file_t fd, sg_size_t size) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_READ;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ self->simcall.args[1].sgsz = (sg_size_t) size;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.sgsz;
+ }
+ inline static sg_size_t simcall_BODY_file_write(smx_file_t fd, sg_size_t size) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_WRITE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ self->simcall.args[1].sgsz = (sg_size_t) size;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.sgsz;
+ }
+ inline static smx_file_t simcall_BODY_file_open(const char* mount, const char* path) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_OPEN;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) mount;
+ self->simcall.args[1].cc = (const char*) path;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static int simcall_BODY_file_close(smx_file_t fd) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_CLOSE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static int simcall_BODY_file_unlink(smx_file_t fd) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_UNLINK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static xbt_dict_t simcall_BODY_file_ls(const char* mount, const char* path) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_LS;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) mount;
+ self->simcall.args[1].cc = (const char*) path;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static sg_size_t simcall_BODY_file_get_size(smx_file_t fd) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_GET_SIZE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.sgsz;
+ }
+ inline static sg_size_t simcall_BODY_file_tell(smx_file_t fd) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_TELL;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.sgsz;
+ }
+ inline static int simcall_BODY_file_seek(smx_file_t fd, sg_size_t offset, int origin) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_SEEK;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ self->simcall.args[1].sgsz = (sg_size_t) offset;
+ self->simcall.args[2].i = (int) origin;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static xbt_dynar_t simcall_BODY_file_get_info(smx_file_t fd) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_FILE_GET_INFO;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) fd;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static void simcall_BODY_storage_file_rename(smx_storage_t storage, const char* src, const char* dest) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_STORAGE_FILE_RENAME;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) storage;
+ self->simcall.args[1].cc = (const char*) src;
+ self->simcall.args[2].cc = (const char*) dest;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+ inline static sg_size_t simcall_BODY_storage_get_free_size(const char* name) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_STORAGE_GET_FREE_SIZE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.sgsz;
+ }
+ inline static sg_size_t simcall_BODY_storage_get_used_size(const char* name) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_STORAGE_GET_USED_SIZE;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.sgsz;
+ }
+ inline static xbt_dict_t simcall_BODY_storage_get_properties(smx_storage_t storage) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_STORAGE_GET_PROPERTIES;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) storage;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static xbt_dict_t simcall_BODY_storage_get_content(smx_storage_t storage) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_STORAGE_GET_CONTENT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) storage;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static xbt_dict_t simcall_BODY_asr_get_properties(const char* name) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_ASR_GET_PROPERTIES;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].cc = (const char*) name;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ inline static int simcall_BODY_comm_is_latency_bounded(smx_action_t comm) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_COMM_IS_LATENCY_BOUNDED;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) comm;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+#endif
+
+#ifdef HAVE_TRACING
+ inline static void simcall_BODY_set_category(smx_action_t action, const char* category) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_SET_CATEGORY;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) action;
+ self->simcall.args[1].cc = (const char*) category;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+
+ }
+#endif
+
+#ifdef HAVE_MC
+ inline static void* simcall_BODY_mc_snapshot() {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MC_SNAPSHOT;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.dp;
+ }
+ inline static int simcall_BODY_mc_compare_snapshots(void* s1, void* s2) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MC_COMPARE_SNAPSHOTS;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].dp = (void*) s1;
+ self->simcall.args[1].dp = (void*) s2;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+ inline static int simcall_BODY_mc_random(int min, int max) {
+ smx_process_t self = SIMIX_process_self();
+ self->simcall.call = SIMCALL_MC_RANDOM;
+ memset(&self->simcall.result, 0, sizeof(self->simcall.result));
+ memset(self->simcall.args, 0, sizeof(self->simcall.args));
+ self->simcall.args[0].i = (int) min;
+ self->simcall.args[1].i = (int) max;
+ if (self != simix_global->maestro_process) {
+ XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name,
+ SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
+ SIMIX_process_yield(self);
+ } else {
+ SIMIX_simcall_pre(&self->simcall, 0);
+ }
+ return self->simcall.result.i;
+ }
+#endif
--- /dev/null
+/*********************************************
+ * File Generated by src/simix/simcalls.py *
+ * from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in *
+ *********************************************/
+
+case SIMCALL_HOST_GET_BY_NAME:
+ simcall->result.dp = SIMIX_pre_host_get_by_name(simcall , simcall->args[0].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_NAME:
+ simcall->result.cc = SIMIX_pre_host_get_name(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_ON:
+ SIMIX_pre_host_on(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_OFF:
+ SIMIX_pre_host_off(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_PROPERTIES:
+ simcall->result.dp = SIMIX_pre_host_get_properties(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_CORE:
+ simcall->result.i = SIMIX_pre_host_get_core(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_PROCESS_LIST:
+ simcall->result.dp = SIMIX_pre_host_get_process_list(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_SPEED:
+ simcall->result.d = SIMIX_pre_host_get_speed(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_AVAILABLE_SPEED:
+ simcall->result.d = SIMIX_pre_host_get_available_speed(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_STATE:
+ simcall->result.i = SIMIX_pre_host_get_state(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_CURRENT_POWER_PEAK:
+ simcall->result.d = SIMIX_pre_host_get_current_power_peak(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_POWER_PEAK_AT:
+ simcall->result.d = SIMIX_pre_host_get_power_peak_at(simcall , (smx_host_t) simcall->args[0].dp, simcall->args[1].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_NB_PSTATES:
+ simcall->result.i = SIMIX_pre_host_get_nb_pstates(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_SET_POWER_PEAK_AT:
+ SIMIX_pre_host_set_power_peak_at(simcall , (smx_host_t) simcall->args[0].dp, simcall->args[1].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_CONSUMED_ENERGY:
+ simcall->result.d = SIMIX_pre_host_get_consumed_energy(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTE:
+ simcall->result.dp = SIMIX_pre_host_execute(simcall , simcall->args[0].cc, (smx_host_t) simcall->args[1].dp, simcall->args[2].d, simcall->args[3].d, simcall->args[4].d, simcall->args[5].ul);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_PARALLEL_EXECUTE:
+ simcall->result.dp = SIMIX_pre_host_parallel_execute(simcall , simcall->args[0].cc, simcall->args[1].i, (smx_host_t*) simcall->args[2].dp, (double*) simcall->args[3].dp, (double*) simcall->args[4].dp, simcall->args[5].d, simcall->args[6].d);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_DESTROY:
+ SIMIX_pre_host_execution_destroy(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_CANCEL:
+ SIMIX_pre_host_execution_cancel(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_GET_REMAINS:
+ simcall->result.d = SIMIX_pre_host_execution_get_remains(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_GET_STATE:
+ simcall->result.i = SIMIX_pre_host_execution_get_state(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_SET_PRIORITY:
+ SIMIX_pre_host_execution_set_priority(simcall , (smx_action_t) simcall->args[0].dp, simcall->args[1].d);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_SET_BOUND:
+ SIMIX_pre_host_execution_set_bound(simcall , (smx_action_t) simcall->args[0].dp, simcall->args[1].d);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_SET_AFFINITY:
+ SIMIX_pre_host_execution_set_affinity(simcall , (smx_action_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp, simcall->args[2].ul);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_EXECUTION_WAIT:
+ SIMIX_pre_host_execution_wait(simcall , (smx_action_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_HOST_GET_STORAGE_LIST:
+ simcall->result.dp = SIMIX_pre_host_get_storage_list(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_GET_PARAMS:
+ SIMIX_pre_host_get_params(simcall , (smx_host_t) simcall->args[0].dp, (ws_params_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_HOST_SET_PARAMS:
+ SIMIX_pre_host_set_params(simcall , (smx_host_t) simcall->args[0].dp, (ws_params_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_CREATE:
+ simcall->result.dp = SIMIX_pre_vm_create(simcall , simcall->args[0].cc, (smx_host_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_START:
+ SIMIX_pre_vm_start(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_GET_STATE:
+ simcall->result.i = SIMIX_pre_vm_get_state(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_MIGRATE:
+ SIMIX_pre_vm_migrate(simcall , (smx_host_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_GET_PM:
+ simcall->result.dp = SIMIX_pre_vm_get_pm(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_SET_BOUND:
+ SIMIX_pre_vm_set_bound(simcall , (smx_host_t) simcall->args[0].dp, simcall->args[1].d);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_SET_AFFINITY:
+ SIMIX_pre_vm_set_affinity(simcall , (smx_host_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp, simcall->args[2].ul);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_DESTROY:
+ SIMIX_pre_vm_destroy(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_SUSPEND:
+ SIMIX_pre_vm_suspend(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_RESUME:
+ SIMIX_pre_vm_resume(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_SHUTDOWN:
+ SIMIX_pre_vm_shutdown(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_SAVE:
+ SIMIX_pre_vm_save(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_VM_RESTORE:
+ SIMIX_pre_vm_restore(simcall , (smx_host_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_CREATE:
+ SIMIX_pre_process_create(simcall , (smx_process_t*) simcall->args[0].dp, simcall->args[1].cc, (xbt_main_func_t) simcall->args[2].fp, simcall->args[3].dp, simcall->args[4].cc, simcall->args[5].d, simcall->args[6].i, (char**) simcall->args[7].dp, (xbt_dict_t) simcall->args[8].dp, simcall->args[9].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_KILL:
+ SIMIX_pre_process_kill(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_KILLALL:
+ SIMIX_pre_process_killall(simcall , simcall->args[0].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_CLEANUP:
+ SIMIX_pre_process_cleanup(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_CHANGE_HOST:
+ SIMIX_pre_process_change_host(simcall , (smx_process_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_SUSPEND:
+ SIMIX_pre_process_suspend(simcall , (smx_process_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_PROCESS_RESUME:
+ SIMIX_pre_process_resume(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_COUNT:
+ simcall->result.i = SIMIX_pre_process_count(simcall );
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_GET_PID:
+ simcall->result.i = SIMIX_pre_process_get_PID(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_GET_PPID:
+ simcall->result.i = SIMIX_pre_process_get_PPID(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_GET_DATA:
+ simcall->result.dp = SIMIX_pre_process_get_data(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_SET_DATA:
+ SIMIX_pre_process_set_data(simcall , (smx_process_t) simcall->args[0].dp, simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_GET_HOST:
+ simcall->result.dp = SIMIX_pre_process_get_host(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_GET_NAME:
+ simcall->result.cc = SIMIX_pre_process_get_name(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_IS_SUSPENDED:
+ simcall->result.i = SIMIX_pre_process_is_suspended(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_GET_PROPERTIES:
+ simcall->result.dp = SIMIX_pre_process_get_properties(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_SLEEP:
+ SIMIX_pre_process_sleep(simcall , simcall->args[0].d);
+ break;
+
+case SIMCALL_PROCESS_ON_EXIT:
+ SIMIX_pre_process_on_exit(simcall , (smx_process_t) simcall->args[0].dp, (int_f_pvoid_t) simcall->args[1].fp, simcall->args[2].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_AUTO_RESTART_SET:
+ SIMIX_pre_process_auto_restart_set(simcall , (smx_process_t) simcall->args[0].dp, simcall->args[1].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_PROCESS_RESTART:
+ simcall->result.dp = SIMIX_pre_process_restart(simcall , (smx_process_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_CREATE:
+ simcall->result.dp = SIMIX_pre_rdv_create(simcall , simcall->args[0].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_DESTROY:
+ SIMIX_pre_rdv_destroy(simcall , (smx_rdv_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_GET_BY_NAME:
+ simcall->result.dp = SIMIX_pre_rdv_get_by_name(simcall , simcall->args[0].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_COMM_COUNT_BY_HOST:
+ simcall->result.ui = SIMIX_pre_rdv_comm_count_by_host(simcall , (smx_rdv_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_GET_HEAD:
+ simcall->result.dp = SIMIX_pre_rdv_get_head(simcall , (smx_rdv_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_SET_RECEIVER:
+ SIMIX_pre_rdv_set_receiver(simcall , (smx_rdv_t) simcall->args[0].dp, (smx_process_t) simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_RDV_GET_RECEIVER:
+ simcall->result.dp = SIMIX_pre_rdv_get_receiver(simcall , (smx_rdv_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_IPROBE:
+ simcall->result.dp = SIMIX_pre_comm_iprobe(simcall , (smx_rdv_t) simcall->args[0].dp, simcall->args[1].i, simcall->args[2].i, (simix_match_func_t) simcall->args[3].fp, simcall->args[4].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_SEND:
+ SIMIX_pre_comm_send(simcall , (smx_rdv_t) simcall->args[0].dp, simcall->args[1].d, simcall->args[2].d, simcall->args[3].dp, simcall->args[4].sz, (simix_match_func_t) simcall->args[5].fp, simcall->args[6].dp, simcall->args[7].d);
+ break;
+
+case SIMCALL_COMM_ISEND:
+ simcall->result.dp = SIMIX_pre_comm_isend(simcall , (smx_rdv_t) simcall->args[0].dp, simcall->args[1].d, simcall->args[2].d, simcall->args[3].dp, simcall->args[4].sz, (simix_match_func_t) simcall->args[5].fp, (simix_clean_func_t) simcall->args[6].fp, simcall->args[7].dp, simcall->args[8].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_RECV:
+ SIMIX_pre_comm_recv(simcall , (smx_rdv_t) simcall->args[0].dp, simcall->args[1].dp, (size_t*) simcall->args[2].dp, (simix_match_func_t) simcall->args[3].fp, simcall->args[4].dp, simcall->args[5].d, simcall->args[6].d);
+ break;
+
+case SIMCALL_COMM_IRECV:
+ simcall->result.dp = SIMIX_pre_comm_irecv(simcall , (smx_rdv_t) simcall->args[0].dp, simcall->args[1].dp, (size_t*) simcall->args[2].dp, (simix_match_func_t) simcall->args[3].fp, simcall->args[4].dp, simcall->args[5].d);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_CANCEL:
+ SIMIX_pre_comm_cancel(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_WAITANY:
+ SIMIX_pre_comm_waitany(simcall , (xbt_dynar_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_COMM_WAIT:
+ SIMIX_pre_comm_wait(simcall , (smx_action_t) simcall->args[0].dp, simcall->args[1].d);
+ break;
+
+case SIMCALL_COMM_TEST:
+ SIMIX_pre_comm_test(simcall , (smx_action_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_COMM_TESTANY:
+ SIMIX_pre_comm_testany(simcall , (xbt_dynar_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_COMM_GET_REMAINS:
+ simcall->result.d = SIMIX_pre_comm_get_remains(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_GET_STATE:
+ simcall->result.i = SIMIX_pre_comm_get_state(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_GET_SRC_DATA:
+ simcall->result.dp = SIMIX_pre_comm_get_src_data(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_GET_DST_DATA:
+ simcall->result.dp = SIMIX_pre_comm_get_dst_data(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_GET_SRC_PROC:
+ simcall->result.dp = SIMIX_pre_comm_get_src_proc(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COMM_GET_DST_PROC:
+ simcall->result.dp = SIMIX_pre_comm_get_dst_proc(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_MUTEX_INIT:
+ simcall->result.dp = SIMIX_pre_mutex_init(simcall );
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_MUTEX_DESTROY:
+ SIMIX_pre_mutex_destroy(simcall , (smx_mutex_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_MUTEX_LOCK:
+ SIMIX_pre_mutex_lock(simcall , (smx_mutex_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_MUTEX_TRYLOCK:
+ simcall->result.i = SIMIX_pre_mutex_trylock(simcall , (smx_mutex_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_MUTEX_UNLOCK:
+ SIMIX_pre_mutex_unlock(simcall , (smx_mutex_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COND_INIT:
+ simcall->result.dp = SIMIX_pre_cond_init(simcall );
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COND_DESTROY:
+ SIMIX_pre_cond_destroy(simcall , (smx_cond_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COND_SIGNAL:
+ SIMIX_pre_cond_signal(simcall , (smx_cond_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_COND_WAIT:
+ SIMIX_pre_cond_wait(simcall , (smx_cond_t) simcall->args[0].dp, (smx_mutex_t) simcall->args[1].dp);
+ break;
+
+case SIMCALL_COND_WAIT_TIMEOUT:
+ SIMIX_pre_cond_wait_timeout(simcall , (smx_cond_t) simcall->args[0].dp, (smx_mutex_t) simcall->args[1].dp, simcall->args[2].d);
+ break;
+
+case SIMCALL_COND_BROADCAST:
+ SIMIX_pre_cond_broadcast(simcall , (smx_cond_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_SEM_INIT:
+ simcall->result.dp = SIMIX_pre_sem_init(simcall , simcall->args[0].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_SEM_DESTROY:
+ SIMIX_pre_sem_destroy(simcall , (smx_sem_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_SEM_RELEASE:
+ SIMIX_pre_sem_release(simcall , (smx_sem_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_SEM_WOULD_BLOCK:
+ simcall->result.i = SIMIX_pre_sem_would_block(simcall , (smx_sem_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_SEM_ACQUIRE:
+ SIMIX_pre_sem_acquire(simcall , (smx_sem_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_SEM_ACQUIRE_TIMEOUT:
+ SIMIX_pre_sem_acquire_timeout(simcall , (smx_sem_t) simcall->args[0].dp, simcall->args[1].d);
+ break;
+
+case SIMCALL_SEM_GET_CAPACITY:
+ simcall->result.i = SIMIX_pre_sem_get_capacity(simcall , (smx_sem_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_GET_DATA:
+ simcall->result.dp = SIMIX_pre_file_get_data(simcall , (smx_file_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_SET_DATA:
+ SIMIX_pre_file_set_data(simcall , (smx_file_t) simcall->args[0].dp, simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_READ:
+ SIMIX_pre_file_read(simcall , (smx_file_t) simcall->args[0].dp, simcall->args[1].sgsz);
+ break;
+
+case SIMCALL_FILE_WRITE:
+ SIMIX_pre_file_write(simcall , (smx_file_t) simcall->args[0].dp, simcall->args[1].sgsz);
+ break;
+
+case SIMCALL_FILE_OPEN:
+ SIMIX_pre_file_open(simcall , simcall->args[0].cc, simcall->args[1].cc);
+ break;
+
+case SIMCALL_FILE_CLOSE:
+ SIMIX_pre_file_close(simcall , (smx_file_t) simcall->args[0].dp);
+ break;
+
+case SIMCALL_FILE_UNLINK:
+ simcall->result.i = SIMIX_pre_file_unlink(simcall , (smx_file_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_LS:
+ SIMIX_pre_file_ls(simcall , simcall->args[0].cc, simcall->args[1].cc);
+ break;
+
+case SIMCALL_FILE_GET_SIZE:
+ simcall->result.sgsz = SIMIX_pre_file_get_size(simcall , (smx_file_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_TELL:
+ simcall->result.sgsz = SIMIX_pre_file_tell(simcall , (smx_file_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_SEEK:
+ simcall->result.i = SIMIX_pre_file_seek(simcall , (smx_file_t) simcall->args[0].dp, simcall->args[1].sgsz, simcall->args[2].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_FILE_GET_INFO:
+ simcall->result.dp = SIMIX_pre_file_get_info(simcall , (smx_file_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_STORAGE_FILE_RENAME:
+ SIMIX_pre_storage_file_rename(simcall , (smx_storage_t) simcall->args[0].dp, simcall->args[1].cc, simcall->args[2].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_STORAGE_GET_FREE_SIZE:
+ simcall->result.sgsz = SIMIX_pre_storage_get_free_size(simcall , simcall->args[0].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_STORAGE_GET_USED_SIZE:
+ simcall->result.sgsz = SIMIX_pre_storage_get_used_size(simcall , simcall->args[0].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_STORAGE_GET_PROPERTIES:
+ simcall->result.dp = SIMIX_pre_storage_get_properties(simcall , (smx_storage_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_STORAGE_GET_CONTENT:
+ simcall->result.dp = SIMIX_pre_storage_get_content(simcall , (smx_storage_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_ASR_GET_PROPERTIES:
+ simcall->result.dp = SIMIX_pre_asr_get_properties(simcall , simcall->args[0].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+case SIMCALL_COMM_IS_LATENCY_BOUNDED:
+ simcall->result.i = SIMIX_pre_comm_is_latency_bounded(simcall , (smx_action_t) simcall->args[0].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+#endif
+
+#ifdef HAVE_TRACING
+case SIMCALL_SET_CATEGORY:
+ SIMIX_pre_set_category(simcall , (smx_action_t) simcall->args[0].dp, simcall->args[1].cc);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+#endif
+
+#ifdef HAVE_MC
+case SIMCALL_MC_SNAPSHOT:
+ simcall->result.dp = SIMIX_pre_mc_snapshot(simcall );
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_MC_COMPARE_SNAPSHOTS:
+ simcall->result.i = SIMIX_pre_mc_compare_snapshots(simcall , simcall->args[0].dp, simcall->args[1].dp);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+case SIMCALL_MC_RANDOM:
+ simcall->result.i = SIMIX_pre_mc_random(simcall , simcall->args[0].i, simcall->args[1].i);
+ SIMIX_simcall_answer(simcall);
+ break;
+
+#endif
--- /dev/null
+/*********************************************
+ * File Generated by src/simix/simcalls.py *
+ * from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in *
+ *********************************************/
+
+SIMCALL_HOST_GET_BY_NAME,
+SIMCALL_HOST_GET_NAME,
+SIMCALL_HOST_ON,
+SIMCALL_HOST_OFF,
+SIMCALL_HOST_GET_PROPERTIES,
+SIMCALL_HOST_GET_CORE,
+SIMCALL_HOST_GET_PROCESS_LIST,
+SIMCALL_HOST_GET_SPEED,
+SIMCALL_HOST_GET_AVAILABLE_SPEED,
+SIMCALL_HOST_GET_STATE,
+SIMCALL_HOST_GET_CURRENT_POWER_PEAK,
+SIMCALL_HOST_GET_POWER_PEAK_AT,
+SIMCALL_HOST_GET_NB_PSTATES,
+SIMCALL_HOST_SET_POWER_PEAK_AT,
+SIMCALL_HOST_GET_CONSUMED_ENERGY,
+SIMCALL_HOST_EXECUTE,
+SIMCALL_HOST_PARALLEL_EXECUTE,
+SIMCALL_HOST_EXECUTION_DESTROY,
+SIMCALL_HOST_EXECUTION_CANCEL,
+SIMCALL_HOST_EXECUTION_GET_REMAINS,
+SIMCALL_HOST_EXECUTION_GET_STATE,
+SIMCALL_HOST_EXECUTION_SET_PRIORITY,
+SIMCALL_HOST_EXECUTION_SET_BOUND,
+SIMCALL_HOST_EXECUTION_SET_AFFINITY,
+SIMCALL_HOST_EXECUTION_WAIT,
+SIMCALL_HOST_GET_STORAGE_LIST,
+SIMCALL_HOST_GET_PARAMS,
+SIMCALL_HOST_SET_PARAMS,
+SIMCALL_VM_CREATE,
+SIMCALL_VM_START,
+SIMCALL_VM_GET_STATE,
+SIMCALL_VM_MIGRATE,
+SIMCALL_VM_GET_PM,
+SIMCALL_VM_SET_BOUND,
+SIMCALL_VM_SET_AFFINITY,
+SIMCALL_VM_DESTROY,
+SIMCALL_VM_SUSPEND,
+SIMCALL_VM_RESUME,
+SIMCALL_VM_SHUTDOWN,
+SIMCALL_VM_SAVE,
+SIMCALL_VM_RESTORE,
+SIMCALL_PROCESS_CREATE,
+SIMCALL_PROCESS_KILL,
+SIMCALL_PROCESS_KILLALL,
+SIMCALL_PROCESS_CLEANUP,
+SIMCALL_PROCESS_CHANGE_HOST,
+SIMCALL_PROCESS_SUSPEND,
+SIMCALL_PROCESS_RESUME,
+SIMCALL_PROCESS_COUNT,
+SIMCALL_PROCESS_GET_PID,
+SIMCALL_PROCESS_GET_PPID,
+SIMCALL_PROCESS_GET_DATA,
+SIMCALL_PROCESS_SET_DATA,
+SIMCALL_PROCESS_GET_HOST,
+SIMCALL_PROCESS_GET_NAME,
+SIMCALL_PROCESS_IS_SUSPENDED,
+SIMCALL_PROCESS_GET_PROPERTIES,
+SIMCALL_PROCESS_SLEEP,
+SIMCALL_PROCESS_ON_EXIT,
+SIMCALL_PROCESS_AUTO_RESTART_SET,
+SIMCALL_PROCESS_RESTART,
+SIMCALL_RDV_CREATE,
+SIMCALL_RDV_DESTROY,
+SIMCALL_RDV_GET_BY_NAME,
+SIMCALL_RDV_COMM_COUNT_BY_HOST,
+SIMCALL_RDV_GET_HEAD,
+SIMCALL_RDV_SET_RECEIVER,
+SIMCALL_RDV_GET_RECEIVER,
+SIMCALL_COMM_IPROBE,
+SIMCALL_COMM_SEND,
+SIMCALL_COMM_ISEND,
+SIMCALL_COMM_RECV,
+SIMCALL_COMM_IRECV,
+SIMCALL_COMM_CANCEL,
+SIMCALL_COMM_WAITANY,
+SIMCALL_COMM_WAIT,
+SIMCALL_COMM_TEST,
+SIMCALL_COMM_TESTANY,
+SIMCALL_COMM_GET_REMAINS,
+SIMCALL_COMM_GET_STATE,
+SIMCALL_COMM_GET_SRC_DATA,
+SIMCALL_COMM_GET_DST_DATA,
+SIMCALL_COMM_GET_SRC_PROC,
+SIMCALL_COMM_GET_DST_PROC,
+SIMCALL_MUTEX_INIT,
+SIMCALL_MUTEX_DESTROY,
+SIMCALL_MUTEX_LOCK,
+SIMCALL_MUTEX_TRYLOCK,
+SIMCALL_MUTEX_UNLOCK,
+SIMCALL_COND_INIT,
+SIMCALL_COND_DESTROY,
+SIMCALL_COND_SIGNAL,
+SIMCALL_COND_WAIT,
+SIMCALL_COND_WAIT_TIMEOUT,
+SIMCALL_COND_BROADCAST,
+SIMCALL_SEM_INIT,
+SIMCALL_SEM_DESTROY,
+SIMCALL_SEM_RELEASE,
+SIMCALL_SEM_WOULD_BLOCK,
+SIMCALL_SEM_ACQUIRE,
+SIMCALL_SEM_ACQUIRE_TIMEOUT,
+SIMCALL_SEM_GET_CAPACITY,
+SIMCALL_FILE_GET_DATA,
+SIMCALL_FILE_SET_DATA,
+SIMCALL_FILE_READ,
+SIMCALL_FILE_WRITE,
+SIMCALL_FILE_OPEN,
+SIMCALL_FILE_CLOSE,
+SIMCALL_FILE_UNLINK,
+SIMCALL_FILE_LS,
+SIMCALL_FILE_GET_SIZE,
+SIMCALL_FILE_TELL,
+SIMCALL_FILE_SEEK,
+SIMCALL_FILE_GET_INFO,
+SIMCALL_STORAGE_FILE_RENAME,
+SIMCALL_STORAGE_GET_FREE_SIZE,
+SIMCALL_STORAGE_GET_USED_SIZE,
+SIMCALL_STORAGE_GET_PROPERTIES,
+SIMCALL_STORAGE_GET_CONTENT,
+SIMCALL_ASR_GET_PROPERTIES,
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+SIMCALL_COMM_IS_LATENCY_BOUNDED,
+#endif
+
+#ifdef HAVE_TRACING
+SIMCALL_SET_CATEGORY,
+#endif
+
+#ifdef HAVE_MC
+SIMCALL_MC_SNAPSHOT,
+SIMCALL_MC_COMPARE_SNAPSHOTS,
+SIMCALL_MC_RANDOM,
+#endif
--- /dev/null
+/*********************************************
+ * File Generated by src/simix/simcalls.py *
+ * from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in *
+ *********************************************/
+
+static inline smx_host_t simcall_host_get_by_name__get__result(smx_simcall_t simcall){
+ return (smx_host_t) simcall->result.dp;
+}
+static inline void simcall_host_get_by_name__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline const char* simcall_host_get_name__get__result(smx_simcall_t simcall){
+ return simcall->result.cc;
+}
+static inline void simcall_host_get_name__set__result(smx_simcall_t simcall, const char* result){
+ simcall->result.cc = result;
+}
+
+
+
+
+static inline xbt_dict_t simcall_host_get_properties__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_host_get_properties__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline int simcall_host_get_core__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_host_get_core__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline xbt_swag_t simcall_host_get_process_list__get__result(smx_simcall_t simcall){
+ return (xbt_swag_t) simcall->result.dp;
+}
+static inline void simcall_host_get_process_list__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline double simcall_host_get_speed__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_speed__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline double simcall_host_get_available_speed__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_available_speed__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline int simcall_host_get_state__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_host_get_state__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline double simcall_host_get_current_power_peak__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_current_power_peak__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline double simcall_host_get_power_peak_at__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_power_peak_at__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline int simcall_host_get_nb_pstates__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_host_get_nb_pstates__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+static inline double simcall_host_get_consumed_energy__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_get_consumed_energy__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline smx_action_t simcall_host_execute__get__result(smx_simcall_t simcall){
+ return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_host_execute__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline smx_action_t simcall_host_parallel_execute__get__result(smx_simcall_t simcall){
+ return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_host_parallel_execute__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+
+
+static inline double simcall_host_execution_get_remains__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_host_execution_get_remains__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline int simcall_host_execution_get_state__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_host_execution_get_state__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+
+
+
+
+static inline int simcall_host_execution_wait__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_host_execution_wait__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline xbt_dict_t simcall_host_get_storage_list__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_host_get_storage_list__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+
+
+static inline void* simcall_vm_create__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_vm_create__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline int simcall_vm_get_state__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_vm_get_state__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+static inline void* simcall_vm_get_pm__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_vm_get_pm__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static inline int simcall_process_count__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_process_count__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline int simcall_process_get_PID__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_process_get_PID__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline int simcall_process_get_PPID__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_process_get_PPID__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline void* simcall_process_get_data__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_process_get_data__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline smx_host_t simcall_process_get_host__get__result(smx_simcall_t simcall){
+ return (smx_host_t) simcall->result.dp;
+}
+static inline void simcall_process_get_host__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline const char* simcall_process_get_name__get__result(smx_simcall_t simcall){
+ return simcall->result.cc;
+}
+static inline void simcall_process_get_name__set__result(smx_simcall_t simcall, const char* result){
+ simcall->result.cc = result;
+}
+static inline int simcall_process_is_suspended__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_process_is_suspended__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline xbt_dict_t simcall_process_get_properties__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_process_get_properties__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline int simcall_process_sleep__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_process_sleep__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+
+
+static inline smx_process_t simcall_process_restart__get__result(smx_simcall_t simcall){
+ return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_process_restart__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline smx_rdv_t simcall_rdv_create__get__result(smx_simcall_t simcall){
+ return (smx_rdv_t) simcall->result.dp;
+}
+static inline void simcall_rdv_create__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline smx_host_t simcall_rdv_get_by_name__get__result(smx_simcall_t simcall){
+ return (smx_host_t) simcall->result.dp;
+}
+static inline void simcall_rdv_get_by_name__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline unsigned int simcall_rdv_comm_count_by_host__get__result(smx_simcall_t simcall){
+ return simcall->result.ui;
+}
+static inline void simcall_rdv_comm_count_by_host__set__result(smx_simcall_t simcall, unsigned int result){
+ simcall->result.ui = result;
+}
+static inline smx_action_t simcall_rdv_get_head__get__result(smx_simcall_t simcall){
+ return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_rdv_get_head__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline smx_process_t simcall_rdv_get_receiver__get__result(smx_simcall_t simcall){
+ return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_rdv_get_receiver__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline smx_action_t simcall_comm_iprobe__get__result(smx_simcall_t simcall){
+ return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_comm_iprobe__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline smx_action_t simcall_comm_isend__get__result(smx_simcall_t simcall){
+ return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_comm_isend__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline smx_action_t simcall_comm_irecv__get__result(smx_simcall_t simcall){
+ return (smx_action_t) simcall->result.dp;
+}
+static inline void simcall_comm_irecv__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline int simcall_comm_waitany__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_comm_waitany__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+static inline int simcall_comm_test__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_comm_test__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline int simcall_comm_testany__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_comm_testany__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline double simcall_comm_get_remains__get__result(smx_simcall_t simcall){
+ return simcall->result.d;
+}
+static inline void simcall_comm_get_remains__set__result(smx_simcall_t simcall, double result){
+ simcall->result.d = result;
+}
+static inline int simcall_comm_get_state__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_comm_get_state__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline void* simcall_comm_get_src_data__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_comm_get_src_data__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline void* simcall_comm_get_dst_data__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_comm_get_dst_data__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline smx_process_t simcall_comm_get_src_proc__get__result(smx_simcall_t simcall){
+ return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_comm_get_src_proc__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline smx_process_t simcall_comm_get_dst_proc__get__result(smx_simcall_t simcall){
+ return (smx_process_t) simcall->result.dp;
+}
+static inline void simcall_comm_get_dst_proc__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline smx_mutex_t simcall_mutex_init__get__result(smx_simcall_t simcall){
+ return (smx_mutex_t) simcall->result.dp;
+}
+static inline void simcall_mutex_init__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+
+
+static inline int simcall_mutex_trylock__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_mutex_trylock__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+static inline smx_cond_t simcall_cond_init__get__result(smx_simcall_t simcall){
+ return (smx_cond_t) simcall->result.dp;
+}
+static inline void simcall_cond_init__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+
+
+
+
+
+
+
+
+static inline smx_sem_t simcall_sem_init__get__result(smx_simcall_t simcall){
+ return (smx_sem_t) simcall->result.dp;
+}
+static inline void simcall_sem_init__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+
+
+static inline int simcall_sem_would_block__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_sem_would_block__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+
+
+
+
+static inline int simcall_sem_get_capacity__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_sem_get_capacity__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline void* simcall_file_get_data__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_file_get_data__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline sg_size_t simcall_file_read__get__result(smx_simcall_t simcall){
+ return simcall->result.sgsz;
+}
+static inline void simcall_file_read__set__result(smx_simcall_t simcall, sg_size_t result){
+ simcall->result.sgsz = result;
+}
+static inline sg_size_t simcall_file_write__get__result(smx_simcall_t simcall){
+ return simcall->result.sgsz;
+}
+static inline void simcall_file_write__set__result(smx_simcall_t simcall, sg_size_t result){
+ simcall->result.sgsz = result;
+}
+static inline smx_file_t simcall_file_open__get__result(smx_simcall_t simcall){
+ return (smx_file_t) simcall->result.dp;
+}
+static inline void simcall_file_open__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline int simcall_file_close__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_file_close__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline int simcall_file_unlink__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_file_unlink__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline xbt_dict_t simcall_file_ls__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_file_ls__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline sg_size_t simcall_file_get_size__get__result(smx_simcall_t simcall){
+ return simcall->result.sgsz;
+}
+static inline void simcall_file_get_size__set__result(smx_simcall_t simcall, sg_size_t result){
+ simcall->result.sgsz = result;
+}
+static inline sg_size_t simcall_file_tell__get__result(smx_simcall_t simcall){
+ return simcall->result.sgsz;
+}
+static inline void simcall_file_tell__set__result(smx_simcall_t simcall, sg_size_t result){
+ simcall->result.sgsz = result;
+}
+static inline int simcall_file_seek__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_file_seek__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline xbt_dynar_t simcall_file_get_info__get__result(smx_simcall_t simcall){
+ return (xbt_dynar_t) simcall->result.dp;
+}
+static inline void simcall_file_get_info__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+
+
+static inline sg_size_t simcall_storage_get_free_size__get__result(smx_simcall_t simcall){
+ return simcall->result.sgsz;
+}
+static inline void simcall_storage_get_free_size__set__result(smx_simcall_t simcall, sg_size_t result){
+ simcall->result.sgsz = result;
+}
+static inline sg_size_t simcall_storage_get_used_size__get__result(smx_simcall_t simcall){
+ return simcall->result.sgsz;
+}
+static inline void simcall_storage_get_used_size__set__result(smx_simcall_t simcall, sg_size_t result){
+ simcall->result.sgsz = result;
+}
+static inline xbt_dict_t simcall_storage_get_properties__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_storage_get_properties__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline xbt_dict_t simcall_storage_get_content__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_storage_get_content__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline xbt_dict_t simcall_asr_get_properties__get__result(smx_simcall_t simcall){
+ return (xbt_dict_t) simcall->result.dp;
+}
+static inline void simcall_asr_get_properties__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+static inline int simcall_comm_is_latency_bounded__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_comm_is_latency_bounded__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+#endif
+
+#ifdef HAVE_TRACING
+
+
+#endif
+
+#ifdef HAVE_MC
+static inline void* simcall_mc_snapshot__get__result(smx_simcall_t simcall){
+ return simcall->result.dp;
+}
+static inline void simcall_mc_snapshot__set__result(smx_simcall_t simcall, void* result){
+ simcall->result.dp = result;
+}
+static inline int simcall_mc_compare_snapshots__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_mc_compare_snapshots__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+static inline int simcall_mc_random__get__result(smx_simcall_t simcall){
+ return simcall->result.i;
+}
+static inline void simcall_mc_random__set__result(smx_simcall_t simcall, int result){
+ simcall->result.i = result;
+}
+#endif
--- /dev/null
+/*********************************************
+ * File Generated by src/simix/simcalls.py *
+ * from src/simix/simcalls.in *
+ * Do not modify this file, add new simcalls *
+ * in src/simix/simcalls.in *
+ *********************************************/
+
+[SIMCALL_HOST_GET_BY_NAME] = "SIMCALL_HOST_GET_BY_NAME",
+[SIMCALL_HOST_GET_NAME] = "SIMCALL_HOST_GET_NAME",
+[SIMCALL_HOST_ON] = "SIMCALL_HOST_ON",
+[SIMCALL_HOST_OFF] = "SIMCALL_HOST_OFF",
+[SIMCALL_HOST_GET_PROPERTIES] = "SIMCALL_HOST_GET_PROPERTIES",
+[SIMCALL_HOST_GET_CORE] = "SIMCALL_HOST_GET_CORE",
+[SIMCALL_HOST_GET_PROCESS_LIST] = "SIMCALL_HOST_GET_PROCESS_LIST",
+[SIMCALL_HOST_GET_SPEED] = "SIMCALL_HOST_GET_SPEED",
+[SIMCALL_HOST_GET_AVAILABLE_SPEED] = "SIMCALL_HOST_GET_AVAILABLE_SPEED",
+[SIMCALL_HOST_GET_STATE] = "SIMCALL_HOST_GET_STATE",
+[SIMCALL_HOST_GET_CURRENT_POWER_PEAK] = "SIMCALL_HOST_GET_CURRENT_POWER_PEAK",
+[SIMCALL_HOST_GET_POWER_PEAK_AT] = "SIMCALL_HOST_GET_POWER_PEAK_AT",
+[SIMCALL_HOST_GET_NB_PSTATES] = "SIMCALL_HOST_GET_NB_PSTATES",
+[SIMCALL_HOST_SET_POWER_PEAK_AT] = "SIMCALL_HOST_SET_POWER_PEAK_AT",
+[SIMCALL_HOST_GET_CONSUMED_ENERGY] = "SIMCALL_HOST_GET_CONSUMED_ENERGY",
+[SIMCALL_HOST_EXECUTE] = "SIMCALL_HOST_EXECUTE",
+[SIMCALL_HOST_PARALLEL_EXECUTE] = "SIMCALL_HOST_PARALLEL_EXECUTE",
+[SIMCALL_HOST_EXECUTION_DESTROY] = "SIMCALL_HOST_EXECUTION_DESTROY",
+[SIMCALL_HOST_EXECUTION_CANCEL] = "SIMCALL_HOST_EXECUTION_CANCEL",
+[SIMCALL_HOST_EXECUTION_GET_REMAINS] = "SIMCALL_HOST_EXECUTION_GET_REMAINS",
+[SIMCALL_HOST_EXECUTION_GET_STATE] = "SIMCALL_HOST_EXECUTION_GET_STATE",
+[SIMCALL_HOST_EXECUTION_SET_PRIORITY] = "SIMCALL_HOST_EXECUTION_SET_PRIORITY",
+[SIMCALL_HOST_EXECUTION_SET_BOUND] = "SIMCALL_HOST_EXECUTION_SET_BOUND",
+[SIMCALL_HOST_EXECUTION_SET_AFFINITY] = "SIMCALL_HOST_EXECUTION_SET_AFFINITY",
+[SIMCALL_HOST_EXECUTION_WAIT] = "SIMCALL_HOST_EXECUTION_WAIT",
+[SIMCALL_HOST_GET_STORAGE_LIST] = "SIMCALL_HOST_GET_STORAGE_LIST",
+[SIMCALL_HOST_GET_PARAMS] = "SIMCALL_HOST_GET_PARAMS",
+[SIMCALL_HOST_SET_PARAMS] = "SIMCALL_HOST_SET_PARAMS",
+[SIMCALL_VM_CREATE] = "SIMCALL_VM_CREATE",
+[SIMCALL_VM_START] = "SIMCALL_VM_START",
+[SIMCALL_VM_GET_STATE] = "SIMCALL_VM_GET_STATE",
+[SIMCALL_VM_MIGRATE] = "SIMCALL_VM_MIGRATE",
+[SIMCALL_VM_GET_PM] = "SIMCALL_VM_GET_PM",
+[SIMCALL_VM_SET_BOUND] = "SIMCALL_VM_SET_BOUND",
+[SIMCALL_VM_SET_AFFINITY] = "SIMCALL_VM_SET_AFFINITY",
+[SIMCALL_VM_DESTROY] = "SIMCALL_VM_DESTROY",
+[SIMCALL_VM_SUSPEND] = "SIMCALL_VM_SUSPEND",
+[SIMCALL_VM_RESUME] = "SIMCALL_VM_RESUME",
+[SIMCALL_VM_SHUTDOWN] = "SIMCALL_VM_SHUTDOWN",
+[SIMCALL_VM_SAVE] = "SIMCALL_VM_SAVE",
+[SIMCALL_VM_RESTORE] = "SIMCALL_VM_RESTORE",
+[SIMCALL_PROCESS_CREATE] = "SIMCALL_PROCESS_CREATE",
+[SIMCALL_PROCESS_KILL] = "SIMCALL_PROCESS_KILL",
+[SIMCALL_PROCESS_KILLALL] = "SIMCALL_PROCESS_KILLALL",
+[SIMCALL_PROCESS_CLEANUP] = "SIMCALL_PROCESS_CLEANUP",
+[SIMCALL_PROCESS_CHANGE_HOST] = "SIMCALL_PROCESS_CHANGE_HOST",
+[SIMCALL_PROCESS_SUSPEND] = "SIMCALL_PROCESS_SUSPEND",
+[SIMCALL_PROCESS_RESUME] = "SIMCALL_PROCESS_RESUME",
+[SIMCALL_PROCESS_COUNT] = "SIMCALL_PROCESS_COUNT",
+[SIMCALL_PROCESS_GET_PID] = "SIMCALL_PROCESS_GET_PID",
+[SIMCALL_PROCESS_GET_PPID] = "SIMCALL_PROCESS_GET_PPID",
+[SIMCALL_PROCESS_GET_DATA] = "SIMCALL_PROCESS_GET_DATA",
+[SIMCALL_PROCESS_SET_DATA] = "SIMCALL_PROCESS_SET_DATA",
+[SIMCALL_PROCESS_GET_HOST] = "SIMCALL_PROCESS_GET_HOST",
+[SIMCALL_PROCESS_GET_NAME] = "SIMCALL_PROCESS_GET_NAME",
+[SIMCALL_PROCESS_IS_SUSPENDED] = "SIMCALL_PROCESS_IS_SUSPENDED",
+[SIMCALL_PROCESS_GET_PROPERTIES] = "SIMCALL_PROCESS_GET_PROPERTIES",
+[SIMCALL_PROCESS_SLEEP] = "SIMCALL_PROCESS_SLEEP",
+[SIMCALL_PROCESS_ON_EXIT] = "SIMCALL_PROCESS_ON_EXIT",
+[SIMCALL_PROCESS_AUTO_RESTART_SET] = "SIMCALL_PROCESS_AUTO_RESTART_SET",
+[SIMCALL_PROCESS_RESTART] = "SIMCALL_PROCESS_RESTART",
+[SIMCALL_RDV_CREATE] = "SIMCALL_RDV_CREATE",
+[SIMCALL_RDV_DESTROY] = "SIMCALL_RDV_DESTROY",
+[SIMCALL_RDV_GET_BY_NAME] = "SIMCALL_RDV_GET_BY_NAME",
+[SIMCALL_RDV_COMM_COUNT_BY_HOST] = "SIMCALL_RDV_COMM_COUNT_BY_HOST",
+[SIMCALL_RDV_GET_HEAD] = "SIMCALL_RDV_GET_HEAD",
+[SIMCALL_RDV_SET_RECEIVER] = "SIMCALL_RDV_SET_RECEIVER",
+[SIMCALL_RDV_GET_RECEIVER] = "SIMCALL_RDV_GET_RECEIVER",
+[SIMCALL_COMM_IPROBE] = "SIMCALL_COMM_IPROBE",
+[SIMCALL_COMM_SEND] = "SIMCALL_COMM_SEND",
+[SIMCALL_COMM_ISEND] = "SIMCALL_COMM_ISEND",
+[SIMCALL_COMM_RECV] = "SIMCALL_COMM_RECV",
+[SIMCALL_COMM_IRECV] = "SIMCALL_COMM_IRECV",
+[SIMCALL_COMM_CANCEL] = "SIMCALL_COMM_CANCEL",
+[SIMCALL_COMM_WAITANY] = "SIMCALL_COMM_WAITANY",
+[SIMCALL_COMM_WAIT] = "SIMCALL_COMM_WAIT",
+[SIMCALL_COMM_TEST] = "SIMCALL_COMM_TEST",
+[SIMCALL_COMM_TESTANY] = "SIMCALL_COMM_TESTANY",
+[SIMCALL_COMM_GET_REMAINS] = "SIMCALL_COMM_GET_REMAINS",
+[SIMCALL_COMM_GET_STATE] = "SIMCALL_COMM_GET_STATE",
+[SIMCALL_COMM_GET_SRC_DATA] = "SIMCALL_COMM_GET_SRC_DATA",
+[SIMCALL_COMM_GET_DST_DATA] = "SIMCALL_COMM_GET_DST_DATA",
+[SIMCALL_COMM_GET_SRC_PROC] = "SIMCALL_COMM_GET_SRC_PROC",
+[SIMCALL_COMM_GET_DST_PROC] = "SIMCALL_COMM_GET_DST_PROC",
+[SIMCALL_MUTEX_INIT] = "SIMCALL_MUTEX_INIT",
+[SIMCALL_MUTEX_DESTROY] = "SIMCALL_MUTEX_DESTROY",
+[SIMCALL_MUTEX_LOCK] = "SIMCALL_MUTEX_LOCK",
+[SIMCALL_MUTEX_TRYLOCK] = "SIMCALL_MUTEX_TRYLOCK",
+[SIMCALL_MUTEX_UNLOCK] = "SIMCALL_MUTEX_UNLOCK",
+[SIMCALL_COND_INIT] = "SIMCALL_COND_INIT",
+[SIMCALL_COND_DESTROY] = "SIMCALL_COND_DESTROY",
+[SIMCALL_COND_SIGNAL] = "SIMCALL_COND_SIGNAL",
+[SIMCALL_COND_WAIT] = "SIMCALL_COND_WAIT",
+[SIMCALL_COND_WAIT_TIMEOUT] = "SIMCALL_COND_WAIT_TIMEOUT",
+[SIMCALL_COND_BROADCAST] = "SIMCALL_COND_BROADCAST",
+[SIMCALL_SEM_INIT] = "SIMCALL_SEM_INIT",
+[SIMCALL_SEM_DESTROY] = "SIMCALL_SEM_DESTROY",
+[SIMCALL_SEM_RELEASE] = "SIMCALL_SEM_RELEASE",
+[SIMCALL_SEM_WOULD_BLOCK] = "SIMCALL_SEM_WOULD_BLOCK",
+[SIMCALL_SEM_ACQUIRE] = "SIMCALL_SEM_ACQUIRE",
+[SIMCALL_SEM_ACQUIRE_TIMEOUT] = "SIMCALL_SEM_ACQUIRE_TIMEOUT",
+[SIMCALL_SEM_GET_CAPACITY] = "SIMCALL_SEM_GET_CAPACITY",
+[SIMCALL_FILE_GET_DATA] = "SIMCALL_FILE_GET_DATA",
+[SIMCALL_FILE_SET_DATA] = "SIMCALL_FILE_SET_DATA",
+[SIMCALL_FILE_READ] = "SIMCALL_FILE_READ",
+[SIMCALL_FILE_WRITE] = "SIMCALL_FILE_WRITE",
+[SIMCALL_FILE_OPEN] = "SIMCALL_FILE_OPEN",
+[SIMCALL_FILE_CLOSE] = "SIMCALL_FILE_CLOSE",
+[SIMCALL_FILE_UNLINK] = "SIMCALL_FILE_UNLINK",
+[SIMCALL_FILE_LS] = "SIMCALL_FILE_LS",
+[SIMCALL_FILE_GET_SIZE] = "SIMCALL_FILE_GET_SIZE",
+[SIMCALL_FILE_TELL] = "SIMCALL_FILE_TELL",
+[SIMCALL_FILE_SEEK] = "SIMCALL_FILE_SEEK",
+[SIMCALL_FILE_GET_INFO] = "SIMCALL_FILE_GET_INFO",
+[SIMCALL_STORAGE_FILE_RENAME] = "SIMCALL_STORAGE_FILE_RENAME",
+[SIMCALL_STORAGE_GET_FREE_SIZE] = "SIMCALL_STORAGE_GET_FREE_SIZE",
+[SIMCALL_STORAGE_GET_USED_SIZE] = "SIMCALL_STORAGE_GET_USED_SIZE",
+[SIMCALL_STORAGE_GET_PROPERTIES] = "SIMCALL_STORAGE_GET_PROPERTIES",
+[SIMCALL_STORAGE_GET_CONTENT] = "SIMCALL_STORAGE_GET_CONTENT",
+[SIMCALL_ASR_GET_PROPERTIES] = "SIMCALL_ASR_GET_PROPERTIES",
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+[SIMCALL_COMM_IS_LATENCY_BOUNDED] = "SIMCALL_COMM_IS_LATENCY_BOUNDED",
+#endif
+
+#ifdef HAVE_TRACING
+[SIMCALL_SET_CATEGORY] = "SIMCALL_SET_CATEGORY",
+#endif
+
+#ifdef HAVE_MC
+[SIMCALL_MC_SNAPSHOT] = "SIMCALL_MC_SNAPSHOT",
+[SIMCALL_MC_COMPARE_SNAPSHOTS] = "SIMCALL_MC_COMPARE_SNAPSHOTS",
+[SIMCALL_MC_RANDOM] = "SIMCALL_MC_RANDOM",
+#endif
/* a fast and simple context switching library */
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
/* context_base - Code factorization across context switching implementations */
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include "xbt/function_types.h"
#include "simgrid/simix.h"
#include "smx_private.h"
(*factory)->suspend = NULL;
(*factory)->runall = NULL;
(*factory)->self = smx_ctx_base_self;
- (*factory)->get_data = smx_ctx_base_get_data;
+ (*factory)->get_process = smx_ctx_base_get_process;
(*factory)->name = "base context factory";
}
}
smx_context_t
-smx_ctx_base_factory_create_context_sized(size_t size,
- xbt_main_func_t code, int argc,
- char **argv,
+smx_ctx_base_factory_create_context_sized(size_t size, xbt_main_func_t code,
+ int argc, char **argv,
void_pfn_smxprocess_t cleanup_func,
- void *data)
+ smx_process_t process)
{
smx_context_t context = xbt_malloc0(size);
} else {
SIMIX_context_set_current(context);
}
- context->data = data;
+ context->process = process;
return context;
}
void smx_ctx_base_stop(smx_context_t context)
{
if (context->cleanup_func)
- context->cleanup_func(context->data);
+ context->cleanup_func(context->process);
+ context->process->suspended = 0;
context->iwannadie = 0;
- simcall_process_cleanup(context->data);
+ simcall_process_cleanup(context->process);
context->iwannadie = 1;
}
return SIMIX_context_get_current();
}
-void *smx_ctx_base_get_data(smx_context_t context)
+smx_process_t smx_ctx_base_get_process(smx_context_t context)
{
- return context->data;
+ return context->process;
}
/* context_raw - fast context switching inspired from System V ucontexts */
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
static void smx_ctx_raw_wrapper(smx_ctx_raw_t context);
static int smx_ctx_raw_factory_finalize(smx_context_factory_t *factory);
static smx_context_t smx_ctx_raw_create_context(xbt_main_func_t code, int argc,
- char **argv, void_pfn_smxprocess_t cleanup_func, void *data);
+ char **argv, void_pfn_smxprocess_t cleanup_func, smx_process_t process);
static void smx_ctx_raw_free(smx_context_t context);
static void smx_ctx_raw_wrapper(smx_ctx_raw_t context);
static void smx_ctx_raw_stop(smx_context_t context);
* \param argv arguments to pass to the main function
* \param cleanup_func a function to call to free the user data when the
* context finished
- * \param data user data
+ * \param process SIMIX process
*/
static smx_context_t
smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv,
- void_pfn_smxprocess_t cleanup_func,
- void *data)
+ void_pfn_smxprocess_t cleanup_func,
+ smx_process_t process)
{
smx_ctx_raw_t context =
argc,
argv,
cleanup_func,
- data);
+ process);
/* if the user provided a function for the process then use it,
otherwise it is the context for maestro */
#endif /* HAVE_VALGRIND_VALGRIND_H */
} else {
- if(data != NULL && raw_maestro_context==NULL)
+ if(process != NULL && raw_maestro_context==NULL)
raw_maestro_context = context;
if(MC_is_active())
/* context_sysv - context switching with ucontexts from System V */
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
- /* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdarg.h>
xbt_main_func_t code, int argc,
char **argv,
void_pfn_smxprocess_t cleanup_func,
- void *data);
+ smx_process_t process);
static void smx_ctx_sysv_free(smx_context_t context);
static smx_context_t
smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
- void_pfn_smxprocess_t cleanup_func, void* data);
+ void_pfn_smxprocess_t cleanup_func, smx_process_t process);
static void smx_ctx_sysv_wrapper(int count, ...);
smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code,
int argc, char **argv,
void_pfn_smxprocess_t cleanup_func,
- void *data)
+ smx_process_t process)
{
int ctx_addr[CTX_ADDR_LEN];
smx_ctx_sysv_t context =
argc,
argv,
cleanup_func,
- data);
+ process);
/* if the user provided a function for the process then use it,
otherwise it is the context for maestro */
sizeof(smx_ctx_sysv_t), sizeof(int), CTX_ADDR_LEN);
}
} else {
- if(data != NULL && sysv_maestro_context == NULL)
+ if (process != NULL && sysv_maestro_context == NULL)
sysv_maestro_context = context;
}
if(MC_is_active() && code)
- MC_new_stack_area(context, ((smx_process_t)((smx_context_t)context)->data)->name, &(context->uc), size);
+ MC_new_stack_area(context, ((smx_context_t)context)->process->name,
+ &(context->uc), size);
return (smx_context_t) context;
}
static smx_context_t
smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv,
- void_pfn_smxprocess_t cleanup_func,
- void *data)
+ void_pfn_smxprocess_t cleanup_func,
+ smx_process_t process)
{
- return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) + smx_context_stack_size,
+ return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) +
+ smx_context_stack_size,
code, argc, argv, cleanup_func,
- data);
+ process);
}
/* context_thread - implementation of context switching with native threads */
-/* Copyright (c) 2009-2012. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
static xbt_os_sem_t smx_ctx_thread_sem;
static smx_context_t
-smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc,
- char **argv,
+smx_ctx_thread_factory_create_context(xbt_main_func_t code,
+ int argc, char **argv,
void_pfn_smxprocess_t cleanup_func,
- void *data);
+ smx_process_t process);
static void smx_ctx_thread_free(smx_context_t context);
static void smx_ctx_thread_stop(smx_context_t context);
smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc,
char **argv,
void_pfn_smxprocess_t cleanup_func,
- void *data)
+ smx_process_t process)
{
smx_ctx_thread_t context = (smx_ctx_thread_t)
smx_ctx_base_factory_create_context_sized(sizeof(s_smx_ctx_thread_t),
code, argc, argv,
- cleanup_func, data);
+ cleanup_func, process);
/* If the user provided a function for the process then use it
otherwise is the context for maestro */
-/* 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
smx_process_arg_t arg = NULL;
smx_process_t process_created = NULL;
+ arg = xbt_new0(s_smx_process_arg_t, 1);
+ arg->code = parse_code;
+ arg->data = NULL;
+ arg->hostname = sg_host_name(host);
+ arg->argc = process->argc;
+ arg->argv = xbt_new(char *,process->argc);
+ int i;
+ for (i=0; i<process->argc; i++)
+ arg->argv[i] = xbt_strdup(process->argv[i]);
+ arg->name = xbt_strdup(arg->argv[0]);
+ arg->kill_time = kill_time;
+ arg->properties = current_property_set;
+ if (!SIMIX_host_priv(host)->boot_processes) {
+ SIMIX_host_priv(host)->boot_processes = xbt_dynar_new(sizeof(smx_process_arg_t), _SIMIX_host_free_process_arg);
+ }
+ xbt_dynar_push_as(SIMIX_host_priv(host)->boot_processes,smx_process_arg_t,arg);
+
if (start_time > SIMIX_get_clock()) {
arg = xbt_new0(s_smx_process_arg_t, 1);
arg->name = (char*)(process->argv)[0];
else
simcall_process_create(&process_created, (char*)(process->argv)[0], parse_code, NULL, sg_host_name(host), kill_time, process->argc,
(char**)process->argv, current_property_set,auto_restart);
-
+
/* verify if process has been created (won't be the case if the host is currently dead, but that's fine) */
if (!process_created) {
return;
-/* 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
-/* 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
{
double time = 0;
smx_process_t process;
- xbt_swag_t set;
surf_action_t action;
smx_timer_t timer;
surf_model_t model;
((void (*)(void*))timer->func)(timer->args);
xbt_free(timer);
}
+
/* Wake up all processes waiting for a Surf action to finish */
xbt_dynar_foreach(model_list, iter, model) {
- set = model->states.failed_action_set;
- while ((action = xbt_swag_extract(set)))
- SIMIX_simcall_post((smx_action_t) action->data);
- set = model->states.done_action_set;
- while ((action = xbt_swag_extract(set)))
- SIMIX_simcall_post((smx_action_t) action->data);
+ while ((action = surf_model_extract_failed_action_set(model)))
+
+ SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
+
+ while ((action = surf_model_extract_done_action_set(model)))
+ if (surf_action_get_data(action) == NULL)
+ XBT_DEBUG("probably vcpu's action %p, skip", action);
+ else
+ SIMIX_simcall_post((smx_action_t) surf_action_get_data(action));
}
/* Autorestart all process */
/* Clean processes to destroy */
SIMIX_process_empty_trash();
+
+ XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run));
+ // !(time == -1.0 && xbt_dynar_is_empty())
+
+
} while (time != -1.0 || !xbt_dynar_is_empty(simix_global->process_to_run));
if (xbt_swag_size(simix_global->process_list) != 0) {
-/* 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
s_smx_process_t proc;
/* Host structure */
- smx_host->data = data;
smx_host->process_list =
xbt_swag_new(xbt_swag_offset(proc, host_proc_hookup));
/* Update global variables */
xbt_lib_set(host_lib,name,SIMIX_HOST_LEVEL,smx_host);
+
+ return xbt_lib_get_elm_or_null(host_lib, name);
+}
- return xbt_lib_get_or_null(host_lib, name, SIMIX_HOST_LEVEL);
+void SIMIX_pre_host_on(smx_simcall_t simcall, smx_host_t h)
+{
+ SIMIX_host_on(h);
+}
+
+/**
+ * \brief Start the host if it is off
+ *
+ */
+void SIMIX_host_on(smx_host_t h)
+{
+ smx_host_priv_t host = SIMIX_host_priv(h);
+
+ xbt_assert((host != NULL), "Invalid parameters");
+
+ if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) {
+ surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
+ unsigned int cpt;
+ smx_process_arg_t arg;
+ xbt_dynar_foreach(host->boot_processes,cpt,arg) {
+ smx_process_t process;
+
+ XBT_DEBUG("Booting Process %s(%s) right now", arg->argv[0], arg->hostname);
+ if (simix_global->create_process_function) {
+ simix_global->create_process_function(&process,
+ arg->argv[0],
+ arg->code,
+ NULL,
+ arg->hostname,
+ arg->kill_time,
+ arg->argc,
+ arg->argv,
+ arg->properties,
+ arg->auto_restart);
+ }
+ else {
+ simcall_process_create(&process,
+ arg->argv[0],
+ arg->code,
+ NULL,
+ arg->hostname,
+ arg->kill_time,
+ arg->argc,
+ arg->argv,
+ arg->properties,
+ arg->auto_restart);
+ }
+ }
+ }
+}
+
+void SIMIX_pre_host_off(smx_simcall_t simcall, smx_host_t h)
+{
+ SIMIX_host_off(h, simcall->issuer);
+}
+
+/**
+ * \brief Stop the host if it is on
+ *
+ */
+void SIMIX_host_off(smx_host_t h, smx_process_t issuer)
+{
+ smx_host_priv_t host = SIMIX_host_priv(h);
+
+ xbt_assert((host != NULL), "Invalid parameters");
+
+ if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) {
+ surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON);
+
+ /* Clean Simulator data */
+ if (xbt_swag_size(host->process_list) != 0) {
+ smx_process_t process = NULL;
+ xbt_swag_foreach(process, host->process_list) {
+ SIMIX_process_kill(process, issuer);
+ XBT_DEBUG("Killing %s on %s by %s", process->name, sg_host_name(process->smx_host), issuer->name);
+ }
+ }
+ }
}
/**
THROWF(arg_error, 0, "%s", msg);
}
xbt_dynar_free(&host->auto_restart_processes);
+ xbt_dynar_free(&host->boot_processes);
xbt_swag_free(host->process_list);
/* Clean host structure */
xbt_dict_t SIMIX_host_get_properties(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.get_properties(host);
+ return surf_resource_get_properties(surf_workstation_resource_priv(host));
}
double SIMIX_pre_host_get_speed(smx_simcall_t simcall, smx_host_t host){
}
double SIMIX_host_get_speed(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
-
- return surf_workstation_model->extension.workstation.
- get_speed(host, 1.0);
+ return surf_workstation_get_speed(host, 1.0);
}
int SIMIX_pre_host_get_core(smx_simcall_t simcall, smx_host_t host){
int SIMIX_host_get_core(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_core(host);
+ return surf_workstation_get_core(host);
}
xbt_swag_t SIMIX_pre_host_get_process_list(smx_simcall_t simcall, smx_host_t host){
double SIMIX_host_get_available_speed(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_available_speed(host);
+ return surf_workstation_get_available_speed(host);
}
double SIMIX_pre_host_get_current_power_peak(smx_simcall_t simcall, smx_host_t host){
}
double SIMIX_host_get_current_power_peak(smx_host_t host) {
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_current_power_peak(host);
+ return surf_workstation_get_current_power_peak(host);
}
double SIMIX_pre_host_get_power_peak_at(smx_simcall_t simcall, smx_host_t host, int pstate_index){
double SIMIX_host_get_power_peak_at(smx_host_t host, int pstate_index) {
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_power_peak_at(host, pstate_index);
+ return surf_workstation_get_power_peak_at(host, pstate_index);
}
int SIMIX_pre_host_get_nb_pstates(smx_simcall_t simcall, smx_host_t host){
int SIMIX_host_get_nb_pstates(smx_host_t host) {
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_nb_pstates(host);
+ return surf_workstation_get_nb_pstates(host);
}
void SIMIX_host_set_power_peak_at(smx_host_t host, int pstate_index) {
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- surf_workstation_model->extension.workstation.
- set_power_peak_at(host, pstate_index);
+ surf_workstation_set_power_peak_at(host, pstate_index);
}
double SIMIX_pre_host_get_consumed_energy(smx_simcall_t simcall, smx_host_t host){
}
double SIMIX_host_get_consumed_energy(smx_host_t host) {
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_consumed_energy(host);
+ return surf_workstation_get_consumed_energy(host);
}
int SIMIX_pre_host_get_state(smx_simcall_t simcall, smx_host_t host){
int SIMIX_host_get_state(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.
- get_state(host);
-}
-
-void* SIMIX_pre_host_self_get_data(smx_simcall_t simcall){
- return SIMIX_host_self_get_data();
-}
-void* SIMIX_host_self_get_data(void)
-{
- smx_host_t self = SIMIX_host_self();
- return SIMIX_host_get_data(self);
-}
-
-void SIMIX_host_self_set_data(void *data)
-{
- smx_host_t self = SIMIX_host_self();
- SIMIX_host_set_data(self, data);
-}
-
-void* SIMIX_pre_host_get_data(smx_simcall_t simcall,smx_host_t host){
- return SIMIX_host_get_data(host);
-}
-void* SIMIX_host_get_data(smx_host_t host){
- xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
-
- return SIMIX_host_priv(host)->data;
+ return surf_resource_get_state(surf_workstation_resource_priv(host));
}
-static void _SIMIX_host_free_process_arg(void *data)
+void _SIMIX_host_free_process_arg(void *data)
{
smx_process_arg_t arg = *(void**)data;
int i;
xbt_die("No function for simix_global->autorestart");
}
-void SIMIX_pre_host_set_data(smx_simcall_t simcall, smx_host_t host, void *data) {
- SIMIX_host_set_data(host, data);
-}
-void SIMIX_host_set_data(smx_host_t host, void *data){
- xbt_assert((host != NULL), "Invalid parameters");
- xbt_assert((SIMIX_host_priv(host)->data == NULL), "Data already set");
-
- SIMIX_host_priv(host)->data = data;
-}
-
smx_action_t SIMIX_pre_host_execute(smx_simcall_t simcall,const char *name,
- smx_host_t host, double computation_amount, double priority){
- return SIMIX_host_execute(name, host, computation_amount, priority);
+ smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask){
+ return SIMIX_host_execute(name, host, computation_amount, priority, bound, affinity_mask);
}
smx_action_t SIMIX_host_execute(const char *name,
- smx_host_t host, double computation_amount, double priority){
+ smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask){
/* alloc structures and initialize */
smx_action_t action = xbt_mallocator_get(simix_global->action_mallocator);
/* set surf's action */
if (!MC_is_active()) {
- action->execution.surf_exec =
- surf_workstation_model->extension.workstation.execute(host,
- computation_amount);
- surf_workstation_model->action_data_set(action->execution.surf_exec, action);
- surf_workstation_model->set_priority(action->execution.surf_exec, priority);
+
+ action->execution.surf_exec = surf_workstation_execute(host, computation_amount);
+ surf_action_set_data(action->execution.surf_exec, action);
+ surf_action_set_priority(action->execution.surf_exec, priority);
+
+ /* Note (hypervisor): for multicore, the bound value being passed to the
+ * surf layer should not be zero (i.e., unlimited). It should be the
+ * capacity of a CPU core. */
+ if (bound == 0)
+ surf_cpu_action_set_bound(action->execution.surf_exec, SIMIX_host_get_speed(host));
+ else
+ surf_cpu_action_set_bound(action->execution.surf_exec, bound);
+
+ if (affinity_mask != 0) {
+ /* just a double check to confirm that this host is the host where this task is running. */
+ xbt_assert(action->execution.host == host);
+ surf_cpu_action_set_affinity(action->execution.surf_exec, host, affinity_mask);
+ }
}
XBT_DEBUG("Create execute action %p", action);
/* set surf's action */
workstation_list = xbt_new0(void *, host_nb);
for (i = 0; i < host_nb; i++)
- workstation_list[i] = host_list[i];
+ workstation_list[i] = surf_workstation_resource_priv(host_list[i]);
+
+
+ /* FIXME: what happens if host_list contains VMs and PMs. If
+ * execute_parallel_task() does not change the state of the model, we can mix
+ * them. */
+ surf_model_t ws_model = surf_resource_model(host_list[0], SURF_WKS_LEVEL);
+ for (i = 1; i < host_nb; i++) {
+ surf_model_t ws_model_tmp = surf_resource_model(host_list[i], SURF_WKS_LEVEL);
+ if (ws_model_tmp != ws_model) {
+ XBT_CRITICAL("mixing VMs and PMs is not supported");
+ DIE_IMPOSSIBLE;
+ }
+ }
/* set surf's action */
if (!MC_is_active()) {
action->execution.surf_exec =
- surf_workstation_model->extension.workstation.
- execute_parallel_task(host_nb, workstation_list, computation_amount,
- communication_amount, rate);
+ surf_workstation_model_execute_parallel_task((surf_workstation_model_t)surf_workstation_model,
+ host_nb, workstation_list, computation_amount, communication_amount, rate);
- surf_workstation_model->action_data_set(action->execution.surf_exec, action);
+ surf_action_set_data(action->execution.surf_exec, action);
}
XBT_DEBUG("Create parallel execute action %p", action);
return action;
}
+//FIXME: REMOVE not used
+static surf_model_t get_ws_model_from_action(smx_action_t action)
+{
+ xbt_assert(action->type == SIMIX_ACTION_EXECUTE);
+ smx_host_t host = action->execution.host;
+ surf_model_t model = surf_resource_model(host, SURF_WKS_LEVEL);
+ return model;
+}
+
void SIMIX_pre_host_execution_destroy(smx_simcall_t simcall, smx_action_t action){
SIMIX_host_execution_destroy(action);
}
XBT_DEBUG("Destroy action %p", action);
if (action->execution.surf_exec) {
- surf_workstation_model->action_unref(action->execution.surf_exec);
+ surf_action_unref(action->execution.surf_exec);
action->execution.surf_exec = NULL;
}
xbt_free(action->name);
XBT_DEBUG("Cancel action %p", action);
if (action->execution.surf_exec)
- surf_workstation_model->action_cancel(action->execution.surf_exec);
+ surf_action_cancel(action->execution.surf_exec);
}
double SIMIX_pre_host_execution_get_remains(smx_simcall_t simcall, smx_action_t action){
double result = 0.0;
if (action->state == SIMIX_RUNNING)
- result = surf_workstation_model->get_remains(action->execution.surf_exec);
+ result = surf_action_get_remains(action->execution.surf_exec);
return result;
}
void SIMIX_pre_host_execution_set_priority(smx_simcall_t simcall, smx_action_t action,
double priority){
- return SIMIX_host_execution_set_priority(action, priority);
+ SIMIX_host_execution_set_priority(action, priority);
}
void SIMIX_host_execution_set_priority(smx_action_t action, double priority){
+
+ if(action->execution.surf_exec)
+ surf_action_set_priority(action->execution.surf_exec, priority);
+}
+
+void SIMIX_pre_host_execution_set_bound(smx_simcall_t simcall, smx_action_t action,
+ double bound){
+ SIMIX_host_execution_set_bound(action, bound);
+}
+void SIMIX_host_execution_set_bound(smx_action_t action, double bound){
+
if(action->execution.surf_exec)
- surf_workstation_model->set_priority(action->execution.surf_exec, priority);
+ surf_cpu_action_set_bound(action->execution.surf_exec, bound);
+}
+
+void SIMIX_pre_host_execution_set_affinity(smx_simcall_t simcall,
+ smx_action_t action, smx_host_t host, unsigned long mask){
+ SIMIX_host_execution_set_affinity(action, host, mask);
+}
+void SIMIX_host_execution_set_affinity(smx_action_t action, smx_host_t host, unsigned long mask){
+ xbt_assert(action->type == SIMIX_ACTION_EXECUTE);
+
+ if (action->execution.surf_exec) {
+ /* just a double check to confirm that this host is the host where this task is running. */
+ xbt_assert(action->execution.host == host);
+ surf_cpu_action_set_affinity(action->execution.surf_exec, host, mask);
+ }
}
void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action){
void SIMIX_host_execution_suspend(smx_action_t action)
{
if(action->execution.surf_exec)
- surf_workstation_model->suspend(action->execution.surf_exec);
+ surf_action_suspend(action->execution.surf_exec);
}
void SIMIX_host_execution_resume(smx_action_t action)
{
if(action->execution.surf_exec)
- surf_workstation_model->resume(action->execution.surf_exec);
+ surf_action_resume(action->execution.surf_exec);
}
void SIMIX_execution_finish(smx_action_t action)
(int)action->state);
}
/* check if the host is down */
- if (surf_workstation_model->extension.
- workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
simcall->issuer->context->iwannadie = 1;
}
SIMIX_host_execution_destroy(action);
}
+
void SIMIX_post_host_execute(smx_action_t action)
{
if (action->type == SIMIX_ACTION_EXECUTE && /* FIMXE: handle resource failure
* for parallel tasks too */
- surf_workstation_model->extension.workstation.get_state(action->execution.host) == SURF_RESOURCE_OFF) {
+ surf_resource_get_state(surf_workstation_resource_priv(action->execution.host)) == SURF_RESOURCE_OFF) {
/* If the host running the action failed, notice it so that the asking
* process can be killed if it runs on that host itself */
action->state = SIMIX_FAILED;
- } else if (surf_workstation_model->action_state_get(action->execution.surf_exec) == SURF_ACTION_FAILED) {
+ } else if (surf_action_get_state(action->execution.surf_exec) == SURF_ACTION_FAILED) {
/* If the host running the action didn't fail, then the action was
* canceled */
action->state = SIMIX_CANCELED;
}
if (action->execution.surf_exec) {
- surf_workstation_model->action_unref(action->execution.surf_exec);
+ surf_action_unref(action->execution.surf_exec);
action->execution.surf_exec = NULL;
}
{
if (action->state != SIMIX_RUNNING) return;
if (action->type == SIMIX_ACTION_EXECUTE){
- surf_workstation_model->set_category(action->execution.surf_exec, category);
+ surf_action_set_category(action->execution.surf_exec, category);
}else if (action->type == SIMIX_ACTION_COMMUNICATE){
- surf_workstation_model->set_category(action->comm.surf_comm, category);
+ surf_action_set_category(action->comm.surf_comm, category);
}
}
#endif
+/**
+ * \brief Function to get the parameters of the given the SIMIX host.
+ *
+ * \param host the host to get_phys_host (a smx_host_t)
+ * \param param the parameter object space to be overwritten (a ws_params_t)
+ */
+void SIMIX_host_get_params(smx_host_t ind_vm, ws_params_t params)
+{
+ /* jump to ws_get_params(). */
+ surf_workstation_get_params(ind_vm, params);
+}
+
+void SIMIX_pre_host_get_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params)
+{
+ SIMIX_host_get_params(ind_vm, params);
+}
+
+void SIMIX_host_set_params(smx_host_t ind_vm, ws_params_t params)
+{
+ /* jump to ws_set_params(). */
+ surf_workstation_set_params(ind_vm, params);
+}
+
+void SIMIX_pre_host_set_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params)
+{
+ SIMIX_host_set_params(ind_vm, params);
+}
+
xbt_dict_t SIMIX_pre_host_get_storage_list(smx_simcall_t simcall, smx_host_t host){
return SIMIX_host_get_storage_list(host);
}
+
xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host){
xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)");
- return surf_workstation_model->extension.workstation.get_storage_list(host);
+ return surf_workstation_get_storage_list(host);
}
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "simgrid/simix.h"
#include "smx_smurf_private.h"
+SG_BEGIN_DECL()
+
/** @brief Host datatype */
typedef struct s_smx_host_priv {
xbt_swag_t process_list;
xbt_dynar_t auto_restart_processes;
- void *data; /**< @brief user data */
+ xbt_dynar_t boot_processes;
} s_smx_host_priv_t;
static inline smx_host_priv_t SIMIX_host_priv(smx_host_t host){
- return xbt_lib_get_level(host, SIMIX_HOST_LEVEL);
+ return (smx_host_priv_t) xbt_lib_get_level(host, SIMIX_HOST_LEVEL);
}
-
+void _SIMIX_host_free_process_arg(void *);
smx_host_t SIMIX_host_create(const char *name, void *workstation, void *data);
void SIMIX_host_destroy(void *host);
double SIMIX_host_get_speed(smx_host_t host);
double SIMIX_host_get_available_speed(smx_host_t host);
int SIMIX_host_get_state(smx_host_t host);
+void SIMIX_host_on(smx_host_t host);
+void SIMIX_host_off(smx_host_t host, smx_process_t issuer);
double SIMIX_host_get_current_power_peak(smx_host_t host);
double SIMIX_host_get_power_peak_at(smx_host_t host, int pstate_index);
int SIMIX_host_get_nb_pstates(smx_host_t host);
double SIMIX_host_get_consumed_energy(smx_host_t host);
void SIMIX_host_set_power_peak_at(smx_host_t host, int pstate_index);
smx_action_t SIMIX_host_execute(const char *name,
- smx_host_t host, double computation_amount, double priority);
+ smx_host_t host, double computation_amount, double priority, double bound, unsigned long affinity_mask);
smx_action_t SIMIX_host_parallel_execute(const char *name,
int host_nb, smx_host_t *host_list,
double *computation_amount, double *communication_amount,
double SIMIX_host_execution_get_remains(smx_action_t action);
e_smx_state_t SIMIX_host_execution_get_state(smx_action_t action);
void SIMIX_host_execution_set_priority(smx_action_t action, double priority);
+void SIMIX_host_execution_set_bound(smx_action_t action, double bound);
+void SIMIX_host_execution_set_affinity(smx_action_t action, smx_host_t host, unsigned long mask);
void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action);
xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host);
smx_host_t SIMIX_pre_host_get_by_name(smx_simcall_t, const char*);
const char* SIMIX_pre_host_self_get_name(smx_simcall_t);
const char* SIMIX_pre_host_get_name(smx_simcall_t, smx_host_t);
+void SIMIX_pre_host_on(smx_simcall_t, smx_host_t host);
+void SIMIX_pre_host_off(smx_simcall_t, smx_host_t host);
xbt_dict_t SIMIX_pre_host_get_properties(smx_simcall_t, smx_host_t);
int SIMIX_pre_host_get_core(smx_simcall_t, smx_host_t);
xbt_swag_t SIMIX_pre_host_get_process_list(smx_simcall_t, smx_host_t host);
void SIMIX_pre_host_set_power_peak_at(smx_simcall_t, smx_host_t host, int pstate_index);
double SIMIX_pre_host_get_consumed_energy(smx_simcall_t, smx_host_t);
void* SIMIX_pre_host_self_get_data(smx_simcall_t);
-void* SIMIX_pre_host_get_data(smx_simcall_t, smx_host_t);
-void SIMIX_pre_host_set_data(smx_simcall_t, smx_host_t, void*);
-smx_action_t SIMIX_pre_host_execute(smx_simcall_t, const char*, smx_host_t, double, double);
+smx_action_t SIMIX_pre_host_execute(smx_simcall_t, const char*, smx_host_t, double, double, double, unsigned long);
smx_action_t SIMIX_pre_host_parallel_execute(smx_simcall_t, const char*, int, smx_host_t*,
double*, double*, double, double);
void SIMIX_pre_host_execution_destroy(smx_simcall_t, smx_action_t);
double SIMIX_pre_host_execution_get_remains(smx_simcall_t, smx_action_t);
e_smx_state_t SIMIX_pre_host_execution_get_state(smx_simcall_t, smx_action_t);
void SIMIX_pre_host_execution_set_priority(smx_simcall_t, smx_action_t, double);
+void SIMIX_pre_host_execution_set_bound(smx_simcall_t simcall, smx_action_t action, double bound);
+void SIMIX_pre_host_execution_set_affinity(smx_simcall_t simcall, smx_action_t action, smx_host_t host, unsigned long mask);
void SIMIX_host_execution_suspend(smx_action_t action);
void SIMIX_host_execution_resume(smx_action_t action);
const char *category);
void SIMIX_set_category(smx_action_t action, const char *category);
#endif
+/* vm related stuff */
+smx_host_t SIMIX_vm_create(const char *name, smx_host_t ind_phys_host);
+smx_host_t SIMIX_pre_vm_create(smx_simcall_t simcall, const char *name, smx_host_t ind_phys_host);
+
+void SIMIX_vm_destroy(smx_host_t ind_vm);
+void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_resume(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_resume(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_suspend(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_suspend(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_save(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_save(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_restore(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_restore(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_start(smx_host_t ind_vm);
+void SIMIX_pre_vm_start(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_shutdown(smx_host_t ind_vm, smx_process_t issuer);
+void SIMIX_pre_vm_shutdown(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+
+int SIMIX_vm_get_state(smx_host_t ind_vm);
+int SIMIX_pre_vm_get_state(smx_simcall_t simcall, smx_host_t ind_vm);
+// --
+void SIMIX_vm_migrate(smx_host_t ind_vm, smx_host_t ind_dst_pm);
+void SIMIX_pre_vm_migrate(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_dst_pm);
+
+void *SIMIX_vm_get_pm(smx_host_t ind_vm);
+void *SIMIX_pre_vm_get_pm(smx_simcall_t simcall, smx_host_t ind_vm);
+
+void SIMIX_vm_set_bound(smx_host_t ind_vm, double bound);
+void SIMIX_pre_vm_set_bound(smx_simcall_t simcall, smx_host_t ind_vm, double bound);
+
+void SIMIX_vm_set_affinity(smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask);
+void SIMIX_pre_vm_set_affinity(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask);
+
+void SIMIX_host_get_params(smx_host_t ind_vm, ws_params_t params);
+void SIMIX_pre_host_get_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params);
+
+void SIMIX_host_set_params(smx_host_t ind_vm, ws_params_t params);
+void SIMIX_pre_host_set_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_params_t params);
+
+SG_END_DECL()
#endif
-/* Copyright (c) 2007-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "smx_private.h"
-#include "surf/storage_private.h"
+//#include "surf/storage_private.h"
#include "xbt/sysdep.h"
#include "xbt/log.h"
#include "xbt/dict.h"
/* Update global variables */
xbt_lib_set(storage_lib,name,SIMIX_STORAGE_LEVEL,smx_storage);
-
- return xbt_lib_get_or_null(storage_lib, name, SIMIX_STORAGE_LEVEL);
+ return xbt_lib_get_elm_or_null(storage_lib, name);
}
/**
}
//SIMIX FILE READ
-void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size)
+void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size)
{
smx_action_t action = SIMIX_file_read(simcall->issuer, fd, size);
xbt_fifo_push(action->simcalls, simcall);
simcall->issuer->waiting_action = action;
}
-smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_storage_size_t size)
+smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size)
{
smx_action_t action;
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
#endif
action->io.host = host;
- action->io.surf_io =
- surf_workstation_model->extension.workstation.read(host, fd->surf_file, size);
+ action->io.surf_io = surf_workstation_read(host, fd->surf_file, size);
- surf_workstation_model->action_data_set(action->io.surf_io, action);
+ surf_action_set_data(action->io.surf_io, action);
XBT_DEBUG("Create io action %p", action);
return action;
}
//SIMIX FILE WRITE
-void SIMIX_pre_file_write(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size)
+void SIMIX_pre_file_write(smx_simcall_t simcall, smx_file_t fd, sg_size_t size)
{
smx_action_t action = SIMIX_file_write(simcall->issuer, fd, size);
xbt_fifo_push(action->simcalls, simcall);
simcall->issuer->waiting_action = action;
}
-smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_storage_size_t size)
+smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size)
{
smx_action_t action;
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
#endif
action->io.host = host;
- action->io.surf_io =
- surf_workstation_model->extension.workstation.write(host, fd->surf_file, size);
+ action->io.surf_io = surf_workstation_write(host, fd->surf_file, size);
- surf_workstation_model->action_data_set(action->io.surf_io, action);
+ surf_action_set_data(action->io.surf_io, action);
XBT_DEBUG("Create io action %p", action);
return action;
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
#endif
action->io.host = host;
- action->io.surf_io =
- surf_workstation_model->extension.workstation.open(host, mount, path);
+ action->io.surf_io = surf_workstation_open(host, mount, path);
- surf_workstation_model->action_data_set(action->io.surf_io, action);
+ surf_action_set_data(action->io.surf_io, action);
XBT_DEBUG("Create io action %p", action);
return action;
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
#endif
action->io.host = host;
- action->io.surf_io = surf_workstation_model->extension.workstation.close(host, fd->surf_file);
+ action->io.surf_io = surf_workstation_close(host, fd->surf_file);
- surf_workstation_model->action_data_set(action->io.surf_io, action);
+ surf_action_set_data(action->io.surf_io, action);
XBT_DEBUG("Create io action %p", action);
return action;
{
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
- if (surf_workstation_model->extension.workstation.unlink(host, fd->surf_file)){
+ if (surf_workstation_unlink(host, fd->surf_file)){
xbt_free(fd);
return 1;
} else
smx_action_t action;
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
#endif
action->io.host = host;
- action->io.surf_io = surf_workstation_model->extension.workstation.ls(host,mount,path);
+ action->io.surf_io = surf_workstation_ls(host,mount,path);
- surf_workstation_model->action_data_set(action->io.surf_io, action);
+ surf_action_set_data(action->io.surf_io, action);
XBT_DEBUG("Create io action %p", action);
return action;
}
-sg_storage_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd)
+sg_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd)
{
return SIMIX_file_get_size(simcall->issuer, fd);
}
-sg_storage_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd)
+sg_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd)
+{
+ smx_host_t host = process->smx_host;
+ return surf_workstation_get_size(host, fd->surf_file);
+}
+
+sg_size_t SIMIX_pre_file_tell(smx_simcall_t simcall, smx_file_t fd)
+{
+ return SIMIX_file_tell(simcall->issuer, fd);
+}
+
+sg_size_t SIMIX_file_tell(smx_process_t process, smx_file_t fd)
{
smx_host_t host = process->smx_host;
- return surf_workstation_model->extension.workstation.get_size(host,
- fd->surf_file);
+ return surf_workstation_file_tell(host, fd->surf_file);
}
+
xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd)
{
return SIMIX_file_get_info(simcall->issuer, fd);
xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd)
{
smx_host_t host = process->smx_host;
- return surf_workstation_model->extension.workstation.get_info(host,
- fd->surf_file);
+ return surf_workstation_get_info(host, fd->surf_file);
+}
+
+int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin)
+{
+ return SIMIX_file_seek(simcall->issuer, fd, offset, origin);
}
-sg_storage_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall, const char* name)
+int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin)
+{
+ smx_host_t host = process->smx_host;
+ return surf_workstation_file_seek(host, fd->surf_file, offset, origin);
+}
+
+void SIMIX_pre_storage_file_rename(smx_simcall_t simcall, smx_storage_t storage, const char* src, const char* dest)
+{
+ return SIMIX_storage_file_rename(simcall->issuer, storage, src, dest);
+}
+
+void SIMIX_storage_file_rename(smx_process_t process, smx_storage_t storage, const char* src, const char* dest)
+{
+ return surf_storage_rename(storage, src, dest);
+}
+
+sg_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall, const char* name)
{
return SIMIX_storage_get_free_size(simcall->issuer, name);
}
-sg_storage_size_t SIMIX_storage_get_free_size(smx_process_t process, const char* name)
+sg_size_t SIMIX_storage_get_free_size(smx_process_t process, const char* name)
{
smx_host_t host = process->smx_host;
- return surf_workstation_model->extension.workstation.get_free_size(host,name);
+ return surf_workstation_get_free_size(host, name);
}
-sg_storage_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall, const char* name)
+sg_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall, const char* name)
{
return SIMIX_storage_get_used_size(simcall->issuer, name);
}
-sg_storage_size_t SIMIX_storage_get_used_size(smx_process_t process, const char* name)
+sg_size_t SIMIX_storage_get_used_size(smx_process_t process, const char* name)
{
smx_host_t host = process->smx_host;
- return surf_workstation_model->extension.workstation.get_used_size(host,name);
+ return surf_workstation_get_used_size(host, name);
}
xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t simcall, smx_storage_t storage){
}
xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage){
xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
- return surf_storage_model->extension.storage.get_properties(storage);
+ return surf_resource_get_properties(surf_storage_resource_priv(storage));
}
const char* SIMIX_pre_storage_get_name(smx_simcall_t simcall, smx_storage_t storage){
xbt_dict_t SIMIX_storage_get_content(smx_storage_t storage){
xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
- return surf_storage_model->extension.storage.get_content(storage);
+ return surf_storage_get_content(storage);
}
-sg_storage_size_t SIMIX_storage_get_size(smx_storage_t storage){
+sg_size_t SIMIX_storage_get_size(smx_storage_t storage){
xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)");
- return surf_storage_model->extension.storage.get_size(storage);
+ return surf_storage_get_size(storage);
}
void SIMIX_post_io(smx_action_t action)
switch (simcall->call) {
case SIMCALL_FILE_OPEN:;
smx_file_t tmp = xbt_new(s_smx_file_t,1);
- tmp->surf_file = (action->io.surf_io)->file;
+ tmp->surf_file = surf_storage_action_get_file(action->io.surf_io);
simcall_file_open__set__result(simcall, tmp);
break;
xbt_free(simcall_file_close__get__fd(simcall));
simcall_file_close__set__result(simcall, 0);
break;
-
case SIMCALL_FILE_WRITE:
- simcall_file_write__set__result(simcall, (action->io.surf_io)->cost);
+ simcall_file_write__set__result(simcall, surf_action_get_cost(action->io.surf_io));
break;
case SIMCALL_FILE_READ:
- simcall_file_read__set__result(simcall, (action->io.surf_io)->cost);
+ simcall_file_read__set__result(simcall, surf_action_get_cost(action->io.surf_io));
break;
case SIMCALL_FILE_LS:
// xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,xbt_free);
// }
// }
- simcall_file_ls__set__result(simcall, (action->io.surf_io)->ls_dict);
+ simcall_file_ls__set__result(simcall, surf_storage_action_get_ls_dict(action->io.surf_io));
break;
default:
break;
}
}
- switch (surf_workstation_model->action_state_get(action->io.surf_io)) {
+ switch (surf_action_get_state(action->io.surf_io)) {
case SURF_ACTION_FAILED:
action->state = SIMIX_FAILED;
{
XBT_DEBUG("Destroy action %p", action);
if (action->io.surf_io)
- action->io.surf_io->model_type->action_unref(action->io.surf_io);
+ surf_action_unref(action->io.surf_io);
xbt_mallocator_release(simix_global->action_mallocator, action);
}
(int)action->state);
}
- if (surf_workstation_model->extension.
- workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
simcall->issuer->context->iwannadie = 1;
}
-/* 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
void SIMIX_storage_destroy(void *s);
void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd);
void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data);
-void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_storage_size_t size);
-void SIMIX_pre_file_write(smx_simcall_t simcall,smx_file_t fd, sg_storage_size_t size);
+void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size);
+void SIMIX_pre_file_write(smx_simcall_t simcall,smx_file_t fd, sg_size_t size);
void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount,
const char* path);
void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd);
int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd);
void SIMIX_pre_file_ls(smx_simcall_t simcall,
const char* mount, const char* path);
-sg_storage_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
+sg_size_t SIMIX_pre_file_get_size(smx_simcall_t simcall, smx_file_t fd);
+sg_size_t SIMIX_pre_file_tell(smx_simcall_t simcall, smx_file_t fd);
xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd);
+int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin);
+void SIMIX_pre_storage_file_rename(smx_simcall_t simcall,smx_storage_t storage, const char* src, const char* dest);
void* SIMIX_file_get_data(smx_file_t fd);
void SIMIX_file_set_data(smx_file_t fd, void *data);
-smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_storage_size_t size);
-smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_storage_size_t size);
+smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size);
+smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size);
smx_action_t SIMIX_file_open(smx_process_t process, const char* storage,
const char* path);
smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd);
int SIMIX_file_unlink(smx_process_t process, smx_file_t fd);
smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount,
const char *path);
-sg_storage_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd);
+sg_size_t SIMIX_file_get_size(smx_process_t process, smx_file_t fd);
+sg_size_t SIMIX_file_tell(smx_process_t process, smx_file_t fd);
xbt_dynar_t SIMIX_file_get_info(smx_process_t process, smx_file_t fd);
+int SIMIX_file_seek(smx_process_t process, smx_file_t fd, sg_size_t offset, int origin);
-sg_storage_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall,const char* name);
-sg_storage_size_t SIMIX_storage_get_free_size(smx_process_t process,const char* name);
+void SIMIX_storage_file_rename(smx_process_t process, smx_storage_t storage, const char* src, const char* dest);
+sg_size_t SIMIX_pre_storage_get_free_size(smx_simcall_t simcall,const char* name);
+sg_size_t SIMIX_storage_get_free_size(smx_process_t process,const char* name);
-sg_storage_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall,const char* name);
-sg_storage_size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name);
+sg_size_t SIMIX_pre_storage_get_used_size(smx_simcall_t simcall,const char* name);
+sg_size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name);
xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage);
xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t, smx_storage_t);
-/* 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
return act;
}
-void SIMIX_pre_comm_destroy(smx_simcall_t simcall, smx_action_t action){
- SIMIX_comm_destroy(action);
-}
/**
* \brief Destroy a communicate action
* \param action The communicate action to be destroyed
#ifdef HAVE_LATENCY_BOUND_TRACKING
action->latency_limited = SIMIX_comm_is_latency_bounded(action);
#endif
- action->comm.surf_comm->model_type->action_unref(action->comm.surf_comm);
+ surf_action_unref(action->comm.surf_comm);
action->comm.surf_comm = NULL;
}
if (action->comm.src_timeout){
- action->comm.src_timeout->model_type->action_unref(action->comm.src_timeout);
+ surf_action_unref(action->comm.src_timeout);
action->comm.src_timeout = NULL;
}
if (action->comm.dst_timeout){
- action->comm.dst_timeout->model_type->action_unref(action->comm.dst_timeout);
+ surf_action_unref(action->comm.dst_timeout);
action->comm.dst_timeout = NULL;
}
}
}
void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t),
- void *data, double timeout){
+ void *dst_buff, size_t *dst_buff_size,
+ int (*match_fun)(void *, void *, smx_action_t),
+ void *data, double timeout, double rate)
+{
smx_action_t comm = SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff,
- dst_buff_size, match_fun, data);
- simcall->mc_value = 0;
- SIMIX_pre_comm_wait(simcall, comm, timeout);
-}
-
-void SIMIX_pre_comm_recv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t),
- void *data, double timeout, double rate){
- smx_action_t comm = SIMIX_comm_irecv_bounded(simcall->issuer, rdv, dst_buff,
dst_buff_size, match_fun, data, rate);
simcall->mc_value = 0;
SIMIX_pre_comm_wait(simcall, comm, timeout);
smx_action_t SIMIX_pre_comm_irecv(smx_simcall_t simcall, smx_rdv_t rdv,
void *dst_buff, size_t *dst_buff_size,
int (*match_fun)(void *, void *, smx_action_t),
- void *data){
- return SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, dst_buff_size,
- match_fun, data);
-}
-
-smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t), void *data)
+ void *data, double rate)
{
- XBT_DEBUG("recv from %p %p\n", rdv, rdv->comm_fifo);
- smx_action_t this_action = SIMIX_comm_new(SIMIX_COMM_RECEIVE);
-
- smx_action_t other_action;
- //communication already done, get it inside the fifo of completed comms
- //permanent receive v1
- //int already_received=0;
- if(rdv->permanent_receiver && xbt_fifo_size(rdv->done_comm_fifo)!=0){
-
- XBT_DEBUG("We have a comm that has probably already been received, trying to match it, to skip the communication\n");
- //find a match in the already received fifo
- other_action = SIMIX_fifo_get_comm(rdv->done_comm_fifo, SIMIX_COMM_SEND, match_fun, data, this_action);
- //if not found, assume the receiver came first, register it to the mailbox in the classical way
- if (!other_action) {
- XBT_DEBUG("We have messages in the permanent receive list, but not the one we are looking for, pushing request into fifo\n");
- other_action = this_action;
- SIMIX_rdv_push(rdv, this_action);
- }else{
- if(other_action->comm.surf_comm && SIMIX_comm_get_remains(other_action)==0.0)
- {
- XBT_DEBUG("comm %p has been already sent, and is finished, destroy it\n",&(other_action->comm));
- other_action->state = SIMIX_DONE;
- other_action->comm.type = SIMIX_COMM_DONE;
- other_action->comm.rdv = NULL;
- //SIMIX_comm_destroy(this_action);
- //--smx_total_comms; // this creation was a pure waste
- //already_received=1;
- //other_action->comm.refcount--;
- }/*else{
- XBT_DEBUG("Not yet finished, we have to wait %d\n", xbt_fifo_size(rdv->comm_fifo));
- }*/
- other_action->comm.refcount--;
- SIMIX_comm_destroy(this_action);
- --smx_total_comms; // this creation was a pure waste
- }
- }else{
- /* Prepare an action describing us, so that it gets passed to the user-provided filter of other side */
-
- /* Look for communication action matching our needs. We also provide a description of
- * ourself so that the other side also gets a chance of choosing if it wants to match with us.
- *
- * If it is not found then push our communication into the rendez-vous point */
- other_action = SIMIX_fifo_get_comm(rdv->comm_fifo, SIMIX_COMM_SEND, match_fun, data, this_action);
-
- if (!other_action) {
- XBT_DEBUG("Receive pushed first %d\n", xbt_fifo_size(rdv->comm_fifo));
- other_action = this_action;
- SIMIX_rdv_push(rdv, this_action);
- } else {
- SIMIX_comm_destroy(this_action);
- --smx_total_comms; // this creation was a pure waste
- other_action->state = SIMIX_READY;
- other_action->comm.type = SIMIX_COMM_READY;
- //other_action->comm.refcount--;
- }
- xbt_fifo_push(dst_proc->comms, other_action);
- }
-
- /* Setup communication action */
- other_action->comm.dst_proc = dst_proc;
- other_action->comm.dst_buff = dst_buff;
- other_action->comm.dst_buff_size = dst_buff_size;
- other_action->comm.dst_data = data;
-
- other_action->comm.match_fun = match_fun;
-
-
- /*if(already_received)//do the actual copy, because the first one after the comm didn't have all the info
- SIMIX_comm_copy_data(other_action);*/
-
-
- if (MC_is_active()) {
- other_action->state = SIMIX_RUNNING;
- return other_action;
- }
-
- SIMIX_comm_start(other_action);
- // }
- return other_action;
-}
-
-smx_action_t SIMIX_pre_comm_irecv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t),
- void *data, double rate){
- return SIMIX_comm_irecv_bounded(simcall->issuer, rdv, dst_buff, dst_buff_size,
+ return SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, dst_buff_size,
match_fun, data, rate);
}
-smx_action_t SIMIX_comm_irecv_bounded(smx_process_t dst_proc, smx_rdv_t rdv,
+smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv,
void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t), void *data, double rate)
+ int (*match_fun)(void *, void *, smx_action_t),
+ void *data, double rate)
{
XBT_DEBUG("recv from %p %p\n", rdv, rdv->comm_fifo);
smx_action_t this_action = SIMIX_comm_new(SIMIX_COMM_RECEIVE);
other_action->comm.dst_buff_size = dst_buff_size;
other_action->comm.dst_data = data;
- if (rate < other_action->comm.rate || other_action->comm.rate == -1.0)
- other_action->comm.rate = rate;
+ if (rate != -1.0 &&
+ (other_action->comm.rate == -1.0 || rate < other_action->comm.rate))
+ other_action->comm.rate = rate;
other_action->comm.match_fun = match_fun;
if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) {
SIMIX_comm_finish(action);
} else { /* if (timeout >= 0) { we need a surf sleep action even when there is no timeout, otherwise surf won't tell us when the host fails */
- sleep = surf_workstation_model->extension.workstation.sleep(simcall->issuer->smx_host, timeout);
- surf_workstation_model->action_data_set(sleep, action);
+ sleep = surf_workstation_sleep(simcall->issuer->smx_host, timeout);
+ surf_action_set_data(sleep, action);
if (simcall->issuer == action->comm.src_proc)
action->comm.src_timeout = sleep;
XBT_DEBUG("Starting communication %p from '%s' to '%s'", action,
SIMIX_host_get_name(sender), SIMIX_host_get_name(receiver));
- action->comm.surf_comm = surf_workstation_model->extension.workstation.
- communicate(sender, receiver, action->comm.task_size, action->comm.rate);
+ action->comm.surf_comm = surf_workstation_model_communicate(surf_workstation_model,
+ sender, receiver,
+ action->comm.task_size, action->comm.rate);
- surf_workstation_model->action_data_set(action->comm.surf_comm, action);
+ surf_action_set_data(action->comm.surf_comm, action);
action->state = SIMIX_RUNNING;
/* If a link is failed, detect it immediately */
- if (surf_workstation_model->action_state_get(action->comm.surf_comm) == SURF_ACTION_FAILED) {
+ if (surf_action_get_state(action->comm.surf_comm) == SURF_ACTION_FAILED) {
XBT_DEBUG("Communication from '%s' to '%s' failed to start because of a link failure",
SIMIX_host_get_name(sender), SIMIX_host_get_name(receiver));
action->state = SIMIX_LINK_FAILURE;
XBT_DEBUG("The communication is suspended on startup because dst (%s:%s) were suspended since it initiated the communication",
SIMIX_host_get_name(action->comm.dst_proc->smx_host), action->comm.dst_proc->name);
- surf_workstation_model->suspend(action->comm.surf_comm);
+ surf_action_suspend(action->comm.surf_comm);
}
}
unsigned int destroy_count = 0;
smx_simcall_t simcall;
+
while ((simcall = xbt_fifo_shift(action->simcalls))) {
/* If a waitany simcall is waiting for this action to finish, then remove
}
}
- if (surf_workstation_model->extension.
- workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
simcall->issuer->context->iwannadie = 1;
}
simcall->issuer->waiting_action = NULL;
xbt_fifo_remove(simcall->issuer->comms, action);
if(action->comm.detached){
+ smx_process_t proc;
+ int still_alive = 0;
+
if(simcall->issuer == action->comm.src_proc){
- if(action->comm.dst_proc)
- xbt_fifo_remove(action->comm.dst_proc->comms, action);
+ if(action->comm.dst_proc){
+ xbt_swag_foreach(proc, simix_global->process_list)
+ {
+ if(proc==action->comm.dst_proc){
+ still_alive=1;
+ break;
+ }
+ }
+ }
+ if(still_alive) xbt_fifo_remove(action->comm.dst_proc->comms, action);
}
if(simcall->issuer == action->comm.dst_proc){
if(action->comm.src_proc)
- xbt_fifo_remove(action->comm.src_proc->comms, action);
+ if(action->comm.dst_proc){
+ xbt_swag_foreach(proc, simix_global->process_list)
+ {
+ if(proc==action->comm.src_proc){
+ still_alive=1;
+ break;
+ }
+ }
+ }
+ if(still_alive) xbt_fifo_remove(action->comm.src_proc->comms, action);
}
}
SIMIX_simcall_answer(simcall);
{
/* Update action state */
if (action->comm.src_timeout &&
- surf_workstation_model->action_state_get(action->comm.src_timeout) == SURF_ACTION_DONE)
+ surf_action_get_state(action->comm.src_timeout) == SURF_ACTION_DONE)
action->state = SIMIX_SRC_TIMEOUT;
else if (action->comm.dst_timeout &&
- surf_workstation_model->action_state_get(action->comm.dst_timeout) == SURF_ACTION_DONE)
+ surf_action_get_state(action->comm.dst_timeout) == SURF_ACTION_DONE)
action->state = SIMIX_DST_TIMEOUT;
else if (action->comm.src_timeout &&
- surf_workstation_model->action_state_get(action->comm.src_timeout) == SURF_ACTION_FAILED)
+ surf_action_get_state(action->comm.src_timeout) == SURF_ACTION_FAILED)
action->state = SIMIX_SRC_HOST_FAILURE;
else if (action->comm.dst_timeout &&
- surf_workstation_model->action_state_get(action->comm.dst_timeout) == SURF_ACTION_FAILED)
+ surf_action_get_state(action->comm.dst_timeout) == SURF_ACTION_FAILED)
action->state = SIMIX_DST_HOST_FAILURE;
else if (action->comm.surf_comm &&
- surf_workstation_model->action_state_get(action->comm.surf_comm) == SURF_ACTION_FAILED) {
+ surf_action_get_state(action->comm.surf_comm) == SURF_ACTION_FAILED) {
XBT_DEBUG("Puta madre. Surf says that the link broke");
action->state = SIMIX_LINK_FAILURE;
} else
else if (!MC_is_active() /* when running the MC there are no surf actions */
&& (action->state == SIMIX_READY || action->state == SIMIX_RUNNING)) {
- surf_workstation_model->action_cancel(action->comm.surf_comm);
+ surf_action_cancel(action->comm.surf_comm);
}
}
{
/*FIXME: shall we suspend also the timeout actions? */
if (action->comm.surf_comm)
- surf_workstation_model->suspend(action->comm.surf_comm);
+ surf_action_suspend(action->comm.surf_comm);
/* in the other case, the action will be suspended on creation, in SIMIX_comm_start() */
}
{
/*FIXME: check what happen with the timeouts */
if (action->comm.surf_comm)
- surf_workstation_model->resume(action->comm.surf_comm);
+ surf_action_resume(action->comm.surf_comm);
/* in the other case, the action were not really suspended yet, see SIMIX_comm_suspend() and SIMIX_comm_start() */
}
switch (action->state) {
case SIMIX_RUNNING:
- remains = surf_workstation_model->get_remains(action->comm.surf_comm);
+ remains = surf_action_get_remains(action->comm.surf_comm);
break;
case SIMIX_WAITING:
* \brief verify if communication is latency bounded
* \param comm The communication
*/
-XBT_INLINE int SIMIX_comm_is_latency_bounded(smx_action_t action)
+int SIMIX_comm_is_latency_bounded(smx_action_t action)
{
if(!action){
return 0;
}
if (action->comm.surf_comm){
XBT_DEBUG("Getting latency limited for surf_action (%p)", action->comm.surf_comm);
- action->latency_limited = surf_workstation_model->get_latency_limited(action->comm.surf_comm);
+ action->latency_limited = surf_network_action_get_latency_limited(action->comm.surf_comm);
XBT_DEBUG("Action limited is %d", action->latency_limited);
}
return action->latency_limited;
-/* 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
void SIMIX_network_exit(void);
#ifdef HAVE_LATENCY_BOUND_TRACKING
-XBT_INLINE XBT_PUBLIC(int) SIMIX_comm_is_latency_bounded(smx_action_t comm);
+XBT_PUBLIC(int) SIMIX_comm_is_latency_bounded(smx_action_t comm);
#endif
smx_rdv_t SIMIX_rdv_create(const char *name);
int detached);
smx_action_t SIMIX_comm_irecv(smx_process_t dst_proc, smx_rdv_t rdv,
void *dst_buff, size_t *dst_buff_size,
- int (*)(void *, void *, smx_action_t), void *data);
-smx_action_t SIMIX_comm_irecv_bounded(smx_process_t dst_proc, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*)(void *, void *, smx_action_t), void *data, double rate);
+ int (*)(void *, void *, smx_action_t),
+ void *data, double rate);
void SIMIX_comm_destroy(smx_action_t action);
void SIMIX_comm_destroy_internal_actions(smx_action_t action);
smx_action_t SIMIX_comm_iprobe(smx_process_t dst_proc, smx_rdv_t rdv, int src,
void (*clean_fun)(void *),
void *data, int detached);
void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t),
- void *data, double timeout);
-void SIMIX_pre_comm_recv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t),
- void *data, double timeout, double rate);
+ void *dst_buff, size_t *dst_buff_size,
+ int (*match_fun)(void *, void *, smx_action_t),
+ void *data, double timeout, double rate);
smx_action_t SIMIX_pre_comm_irecv(smx_simcall_t simcall, smx_rdv_t rdv,
- void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t),
- void *data);
-smx_action_t SIMIX_pre_comm_irecv_bounded(smx_simcall_t simcall, smx_rdv_t rdv,
void *dst_buff, size_t *dst_buff_size,
int (*match_fun)(void *, void *, smx_action_t),
void *data, double rate);
-void SIMIX_pre_comm_destroy(smx_simcall_t simcall, smx_action_t action);
void SIMIX_pre_comm_cancel(smx_simcall_t simcall, smx_action_t action);
double SIMIX_pre_comm_get_remains(smx_simcall_t simcall, smx_action_t action);
e_smx_state_t SIMIX_pre_comm_get_state(smx_simcall_t simcall, smx_action_t action);
-/* 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
}
}
- switch (surf_workstation_model->action_state_get(action->new_api.surf_new_api)) {
+ switch (surf_action_get_state(action->new_api.surf_new_api)) {
case SURF_ACTION_FAILED:
action->state = SIMIX_FAILED;
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
#endif
// Called the function from the new model
- action->new_api.surf_new_api = surf_workstation_model->extension.new_model.fct();
+ //FIXME:CHECKÂ WHATÂ TOÂ DO action->new_api.surf_new_api = surf_workstation_model->extension.new_model.fct();
- surf_workstation_model->action_data_set(action->new_api.surf_new_api, action);
+ surf_action_set_data(action->new_api.surf_new_api, action);
XBT_DEBUG("Create NEW MODEL action %p", action);
return action;
{
XBT_DEBUG("Destroy action %p", action);
if (action->new_api.surf_new_api)
- action->new_api.surf_new_api->model_type->action_unref(action->new_api.surf_new_api);
+ surf_action_unref(action->new_api.surf_new_api);
xbt_mallocator_release(simix_global->action_mallocator, action);
}
(int)action->state);
}
- if (surf_workstation_model->extension.
- workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
simcall->issuer->context->iwannadie = 1;
}
-/* 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
-/* 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
}
/**
- \brief returns the data associated to a context
+ \brief returns the SIMIX process associated to a context
\param context The context
- \return The data
+ \return The SIMIX process
*/
-static XBT_INLINE void* SIMIX_context_get_data(smx_context_t context)
+static XBT_INLINE smx_process_t SIMIX_context_get_process(smx_context_t context)
{
- return simix_global->context_factory->get_data(context);
+ return simix_global->context_factory->get_process(context);
}
XBT_PUBLIC(int) SIMIX_process_get_maxpid(void);
-/* 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
{
smx_context_t self_context = SIMIX_context_self();
- return self_context ? SIMIX_context_get_data(self_context) : NULL;
+ return self_context ? SIMIX_context_get_process(self_context) : NULL;
}
/**
return NULL;
}
} else {
- return SIMIX_host_execute("suspend", process->smx_host, 0.0, 1.0);
+ /* FIXME: computation size is zero. Is it okay that bound is zero ? */
+ return SIMIX_host_execute("suspend", process->smx_host, 0.0, 1.0, 0.0, 0);
}
}
smx_host_t host = process->smx_host;
/* check if the host is active */
- if (surf_workstation_model->extension.
- workstation.get_state(host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(host)) != SURF_RESOURCE_ON) {
THROWF(host_error, 0, "Host %s failed, you cannot call this function",
sg_host_name(host));
}
action->sleep.host = host;
action->sleep.surf_sleep =
- surf_workstation_model->extension.workstation.sleep(host, duration);
+ surf_workstation_sleep(host, duration);
- surf_workstation_model->action_data_set(action->sleep.surf_sleep, action);
+ surf_action_set_data(action->sleep.surf_sleep, action);
XBT_DEBUG("Create sleep action %p", action);
return action;
smx_simcall_t simcall;
e_smx_state_t state;
+ xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+
while ((simcall = xbt_fifo_shift(action->simcalls))) {
- switch(surf_workstation_model->action_state_get(action->sleep.surf_sleep)){
+ switch(surf_action_get_state(action->sleep.surf_sleep)){
case SURF_ACTION_FAILED:
simcall->issuer->context->iwannadie = 1;
//SMX_EXCEPTION(simcall->issuer, host_error, 0, "Host failed");
THROW_IMPOSSIBLE;
break;
}
- if (surf_workstation_model->extension.
- workstation.get_state(simcall->issuer->smx_host) != SURF_RESOURCE_ON) {
+ if (surf_resource_get_state(surf_workstation_resource_priv(simcall->issuer->smx_host)) != SURF_RESOURCE_ON) {
simcall->issuer->context->iwannadie = 1;
}
simcall_process_sleep__set__result(simcall, state);
void SIMIX_process_sleep_destroy(smx_action_t action)
{
XBT_DEBUG("Destroy action %p", action);
+ xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+
if (action->sleep.surf_sleep)
- action->sleep.surf_sleep->model_type->action_unref(action->sleep.surf_sleep);
+ surf_action_unref(action->sleep.surf_sleep);
xbt_mallocator_release(simix_global->action_mallocator, action);
}
void SIMIX_process_sleep_suspend(smx_action_t action)
{
- surf_workstation_model->suspend(action->sleep.surf_sleep);
+ xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+ surf_action_suspend(action->sleep.surf_sleep);
}
void SIMIX_process_sleep_resume(smx_action_t action)
{
- surf_workstation_model->resume(action->sleep.surf_sleep);
+ xbt_assert(action->type == SIMIX_ACTION_SLEEP);
+ surf_action_resume(action->sleep.surf_sleep);
}
/**
-/* 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
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "smx_private.h"
#include "xbt/fifo.h"
#include "xbt/xbt_os_thread.h"
-#include "../mc/mc_private.h"
+#ifdef HAVE_MC
+#include "mc/mc_private.h"
+#endif
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix,
"Logging specific to SIMIX (SMURF)");
{
XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call));
simcall->mc_value = value;
+ if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP)
+ return;
switch (simcall->call) {
-SIMCALL_LIST(SIMCALL_CASE, SIMCALL_SEP_NOTHING)
+#include "simcalls_generated_case.c"
case NUM_SIMCALLS:;
break;
case SIMCALL_NONE:;
-/* 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
#ifndef _SIMIX_SMURF_PRIVATE_H
#define _SIMIX_SMURF_PRIVATE_H
+SG_BEGIN_DECL()
+
/********************************* Simcalls *********************************/
/* we want to build the e_smx_simcall_t enumeration, the table of the
* automatically, using macros.
* To add a new simcall follow the following syntax:
*
- * SIMCALL_ENUM_ELEMENT(<simcall_enumeration_id>, <simcall_handler_function>)
- *
* */
-/****************************
- * SIMCALL GENERATING MACRO *
- ****************************
- *
- * action(ENUM_NAME, func_name, result_type, params…)
- *
- **/
-
-/*
- * Some macro machinery to get a MAP over the arguments of a variadic macro.
- * It uses a FOLD to apply a macro to every argument, and because there is
- * no recursion in the C preprocessor we must create a new macro for every
- * depth of FOLD's recursion.
- */
-
-/* FOLD macro */
-#define FE_0(WHAT, X, ...)
-#define FE_1(I, WHAT, X) WHAT(I, X)
-#define FE_2(I, WHAT, X, ...) WHAT(I, X), FE_1(I+1, WHAT, __VA_ARGS__)
-#define FE_3(I, WHAT, X, ...) WHAT(I, X), FE_2(I+1, WHAT, __VA_ARGS__)
-#define FE_4(I, WHAT, X, ...) WHAT(I, X), FE_3(I+1, WHAT, __VA_ARGS__)
-#define FE_5(I, WHAT, X, ...) WHAT(I, X), FE_4(I+1, WHAT, __VA_ARGS__)
-#define FE_6(I, WHAT, X, ...) WHAT(I, X), FE_5(I+1, WHAT, __VA_ARGS__)
-#define FE_7(I, WHAT, X, ...) WHAT(I, X), FE_6(I+1, WHAT, __VA_ARGS__)
-#define FE_8(I, WHAT, X, ...) WHAT(I, X), FE_7(I+1, WHAT, __VA_ARGS__)
-#define FE_9(I, WHAT, X, ...) WHAT(I, X), FE_8(I+1, WHAT, __VA_ARGS__)
-#define FE_10(I, WHAT, X, ...) WHAT(I, X), FE_9(I+1, WHAT, __VA_ARGS__)
-
-/* NOTE: add as many FE_n as needed (maximum number of simcall arguments )*/
-
-/* Make a MAP macro usgin FOLD (will apply 'action' to the arguments.
- * GET_MACRO is a smart hack that counts the number of arguments passed to
- * the variadic macro, and it is used to invoke the right FOLD depth.
- */
-#define GET_MACRO(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...) NAME
-#define MAP(action, ...) \
- GET_MACRO(, ##__VA_ARGS__, FE_10,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1, FE_0) (0, action, __VA_ARGS__)
-
-/* MAP with default arguments */
-#define APPLY_MAP(WHAT, I, X, ...) WHAT(I, __VA_ARGS__, X)
-#define FE_DA_0(I, WHAT, args, X, ...)
-#define FE_DA_1(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args)
-#define FE_DA_2(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_1(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_3(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_2(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_4(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_3(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_5(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_4(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_6(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_5(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_7(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_6(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_8(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_7(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_9(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_8(I+1, WHAT, args, __VA_ARGS__)
-#define FE_DA_10(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_9(I+1, WHAT, args, __VA_ARGS__)
-
-#define MAP_WITH_DEFAULT_ARGS(action, args, ...) \
- GET_MACRO(, ##__VA_ARGS__, FE_DA_10,FE_DA_9,FE_DA_8,FE_DA_7,FE_DA_6,FE_DA_5,FE_DA_4,FE_DA_3,FE_DA_2,FE_DA_1, FE_DA_0) (0, action, args, __VA_ARGS__)
-
-/*
- * Define scalar type wrappers to ease the use of simcalls.
- * These are used to wrap the arguments in SIMIX_simcall macro.
- */
-#define TCHAR(n) (n, char, c)
-#define TSTRING(n) (n, const char*, cc)
-#define TSHORT(n) (n, short, s)
-#define TINT(n) (n, int, i)
-#define TLONG(n) (n, long, l)
-#define TUCHAR(n) (n, unsigned char, uc)
-#define TUSHORT(n) (n, unsigned short, us)
-#define TUINT(n) (n, unsigned int, ui)
-#define TULONG(n) (n, unsigned long, ul)
-#define TFLOAT(n) (n, float, f)
-#define TDOUBLE(n) (n, double, d)
-#define TPTR(n) (n, void*, p)
-#define TCPTR(n) (n, const void*, cp)
-#define TSIZE(n) (n, size_t, si)
-#define TVOID(n) (n, void)
-#define TSPEC(n,t) (n, t, p)
-
-/* use comma or nothing to separate elements*/
-#define SIMCALL_SEP_COMMA ,
-#define SIMCALL_SEP_NOTHING
-
-/* get the name of the parameter */
-#define SIMCALL_NAME_(name, type, field) name
-#define SIMCALL_NAME(i, v) SIMCALL_NAME_ v
-
-/* get the %s format code of the parameter */
-#define SIMCALL_FORMAT_(name, type, field) %field
-#define SIMCALL_FORMAT(i, v) SIMCALL_FORMAT_ v
-
-/* get the field of the parameter */
-#define SIMCALL_FIELD_(name, type, field) field
-#define SIMCALL_FIELD(i, v) SIMCALL_FIELD_ v
-
-/* get the parameter declaration */
-#define SIMCALL_ARG_(name, type, field) type name
-#define SIMCALL_ARG(i, v) SIMCALL_ARG_ v
-
-/* get the parameter initialisation field */
-#define SIMCALL_INIT_FIELD_(name, type, field) .field = name
-#define SIMCALL_INIT_FIELD(i, d, v) self->simcall.args[i]SIMCALL_INIT_FIELD_ v;
-
-/* get the case of the parameter */
-#define SIMCALL_CASE_PARAM_(name, type, field) field
-#define SIMCALL_CASE_PARAM(i, v) simcall->args[i].SIMCALL_CASE_PARAM_ v
-
-/* generate some code for SIMCALL_CASE if the simcall has an answer */
-#define MAYBE2(_0, _1, func, ...) func
-
-#define SIMCALL_WITH_RESULT_BEGIN(name, type, field) simcall->result.field =
-#define SIMCALL_WITHOUT_RESULT_BEGIN(name, type, field)
-#define SIMCALL_RESULT_BEGIN_(name, type, ...)\
- MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RESULT_BEGIN, SIMCALL_WITHOUT_RESULT_BEGIN)\
- (name, type, __VA_ARGS__)
-#define SIMCALL_RESULT_BEGIN(answer, res) answer(SIMCALL_RESULT_BEGIN_ res)
-
-#define SIMCALL_RESULT_END_(name, type, ...)\
- SIMIX_simcall_answer(simcall);
-#define SIMCALL_RESULT_END(answer, res) answer(SIMCALL_RESULT_END_ res)
-
-/* generate some code for BODY function */
-#define SIMCALL_FUNC_RETURN_TYPE_(name, type, ...) type
-#define SIMCALL_FUNC_RETURN_TYPE(res) SIMCALL_FUNC_RETURN_TYPE_ res
-
-#define SIMCALL_WITH_FUNC_SIMCALL(name, type, field) smx_simcall_t simcall =
-#define SIMCALL_WITHOUT_FUNC_SIMCALL(name, type, field)
-#define SIMCALL_FUNC_SIMCALL_(name, type, ...)\
- MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_FUNC_SIMCALL, SIMCALL_WITHOUT_FUNC_SIMCALL)\
- (name, type, __VA_ARGS__)
-#define SIMCALL_FUNC_SIMCALL(res) SIMCALL_FUNC_SIMCALL_ res
-
-#define SIMCALL_WITH_FUNC_RETURN(name, type, field) return self->simcall.result.field;
-#define SIMCALL_WITHOUT_FUNC_RETURN(name, type, field)
-#define SIMCALL_FUNC_RETURN_(name, type, ...)\
- MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_FUNC_RETURN, SIMCALL_WITHOUT_FUNC_RETURN)\
- (name, type, __VA_ARGS__)
-#define SIMCALL_FUNC_RETURN(res) SIMCALL_FUNC_RETURN_ res
-
-
-/* generate the simcall enumeration */
-#define SIMCALL_ENUM(type, ...)\
- type
-
-/* generate the strings name from the enumeration values */
-#define SIMCALL_STRING_TYPE(type, name, answer, res, ...)\
- [type] = STRINGIFY(type)
-
-/* generate strings from the enumeration values */
-#define SIMCALL_TYPE(type, name, answer, res, ...)\
- [type] = STRINGIFY(MAP(SIMCALL_FORMAT, __VA_ARGS__))
-
-/* generate the simcalls BODY functions */
-#define SIMCALL_FUNC(TYPE, NAME, ANSWER, RES, ...)\
- inline static SIMCALL_FUNC_RETURN_TYPE(RES) simcall_BODY_##NAME(MAP(SIMCALL_ARG, ##__VA_ARGS__)) { \
- smx_process_t self = SIMIX_process_self(); \
- self->simcall.call = TYPE; \
- memset(&self->simcall.result, 0, sizeof(self->simcall.result)); \
- memset(self->simcall.args, 0, sizeof(self->simcall.args)); \
- MAP_WITH_DEFAULT_ARGS(SIMCALL_INIT_FIELD, (), ##__VA_ARGS__) \
- if (self != simix_global->maestro_process) { \
- XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, \
- SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); \
- SIMIX_process_yield(self); \
- } else { \
- SIMIX_simcall_pre(&self->simcall, 0); \
- } \
- SIMCALL_FUNC_RETURN(RES) \
- }
-
-/* generate a comma if there is an argument*/
-#define WITHOUT_COMMA
-#define WITH_COMMA ,
-#define GET_CLEAN(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10, NAME,...) NAME
-#define MAYBE_COMMA(...) GET_CLEAN(,##__VA_ARGS__,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITH_COMMA,WITHOUT_COMMA)
-
-/* generate the simcalls cases for the SIMIX_simcall_pre function */
-#define WITH_ANSWER(...) __VA_ARGS__
-#define WITHOUT_ANSWER(...)
-#define SIMCALL_CASE(type, name, answer, res, ...)\
- case type:\
- SIMCALL_RESULT_BEGIN(answer, res) SIMIX_pre_ ## name(simcall MAYBE_COMMA(__VA_ARGS__) MAP(SIMCALL_CASE_PARAM, ##__VA_ARGS__));\
- SIMCALL_RESULT_END(answer, res)\
- break;
-
-
-/*
- * Generate simcall args and result getter/setter
- */
-#define SIMCALL_GS_SC_NAME_(n) n
-#define SIMCALL_GS_SC_NAME(n) SIMCALL_GS_SC_NAME_ n
-#define SIMCALL_GS_ARG_NAME(n) SIMCALL_NAME_ n
-#define JOIN2(_0, _1) _0 ##__## _1
-#define JOIN3(_0, _1, _2) JOIN2(_0 ##__## _1, _2)
-#define JOIN4(_0, _1, _2, _3) JOIN3(_0 ##_## _1, _2, _3)
-#define SIMCALL_GS_FUNC(scname, setget, vname) \
- JOIN4(simcall, scname, setget, vname)
-
-/* generate the simcalls args getter/setter */
-#define SIMCALL_ARG_GETSET_(i, name, v) \
- static inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\
- return simcall->args[i].SIMCALL_FIELD_ v ;\
- }\
- static inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\
- simcall->args[i].SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\
- }
-
-#define SIMCALL_ARG_GETSET(type, name, answer, res, ...)\
- MAP_WITH_DEFAULT_ARGS(SIMCALL_ARG_GETSET_, (name), ##__VA_ARGS__)
-
-/* generate the simcalls result getter/setter */
-#define SIMCALL_WITH_RES_GETSET(name, v) \
- static inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\
- return simcall->result.SIMCALL_FIELD_ v ;\
- }\
- static inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\
- simcall->result.SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\
- }
-#define SIMCALL_WITHOUT_RES_GETSET(name, v)
-#define SIMCALL_RES_GETSET__(name, type, ...)\
- MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET, SIMCALL_WITHOUT_RES_GETSET)
-#define SIMCALL_RES_GETSET_(scname, v)\
- SIMCALL_RES_GETSET__ v (scname, v)
-#define SIMCALL_RES_GETSET(type, name, answer, res, ...)\
- SIMCALL_RES_GETSET_(name, res)
-
-/* generate the simcalls result getter/setter protos*/
-#define SIMCALL_WITH_RES_GETSET_PROTO(name, v) \
- inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall);\
- inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v);
-#define SIMCALL_WITHOUT_RES_GETSET_PROTO(name, v)
-#define SIMCALL_RES_GETSET_PROTO__(name, type, ...)\
- MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET_PROTO, SIMCALL_WITHOUT_RES_GETSET_PROTO)
-#define SIMCALL_RES_GETSET_PROTO_(scname, v)\
- SIMCALL_RES_GETSET_PROTO__ v (scname, v)
-#define SIMCALL_RES_GETSET_PROTO(type, name, answer, res, ...)\
- SIMCALL_RES_GETSET_PROTO_(name, res)
-
-/* stringify arguments */
-#define STRINGIFY_(...) #__VA_ARGS__
-#define STRINGIFY(...) STRINGIFY_(__VA_ARGS__)
-
-/* the list of simcalls definitions */
-#define SIMCALL_LIST1(ACTION, sep) \
-ACTION(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
-ACTION(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_CORE, host_get_core, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_PROCESS_LIST, host_get_process_list, WITH_ANSWER, TSPEC(result, xbt_swag_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_DATA, host_get_data, WITH_ANSWER, TPTR(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_SET_DATA, host_set_data, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TPTR(data)) sep \
-ACTION(SIMCALL_HOST_GET_CURRENT_POWER_PEAK, host_get_current_power_peak, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_GET_POWER_PEAK_AT, host_get_power_peak_at, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t), TINT(pstate_index)) sep \
-ACTION(SIMCALL_HOST_GET_NB_PSTATES, host_get_nb_pstates, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_SET_POWER_PEAK_AT, host_set_power_peak_at, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TINT(pstate_index)) sep \
-ACTION(SIMCALL_HOST_GET_CONSUMED_ENERGY, host_get_consumed_energy, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTE, host_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TSPEC(host, smx_host_t), TDOUBLE(computation_amount), TDOUBLE(priority)) sep \
-ACTION(SIMCALL_HOST_PARALLEL_EXECUTE, host_parallel_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TINT(host_nb), TSPEC(host_list, smx_host_t*), TSPEC(computation_amount, double*), TSPEC(communication_amount, double*), TDOUBLE(amount), TDOUBLE(rate)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_DESTROY, host_execution_destroy, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_CANCEL, host_execution_cancel, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_GET_REMAINS, host_execution_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_GET_STATE, host_execution_get_state, WITH_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_SET_PRIORITY, host_execution_set_priority, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t), TDOUBLE(priority)) sep \
-ACTION(SIMCALL_HOST_EXECUTION_WAIT, host_execution_wait, WITHOUT_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \
-ACTION(SIMCALL_HOST_GET_STORAGE_LIST, host_get_storage_list, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_PROCESS_CREATE, process_create, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t*), TSTRING(name), TSPEC(code, xbt_main_func_t), TPTR(data), TSTRING(hostname), TDOUBLE(kill_time), TINT(argc), TSPEC(argv, char**), TSPEC(properties, xbt_dict_t), TINT(auto_restart)) sep \
-ACTION(SIMCALL_PROCESS_KILL, process_kill, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_KILLALL, process_killall, WITH_ANSWER, TVOID(result), TINT(reset_pid)) sep \
-ACTION(SIMCALL_PROCESS_CLEANUP, process_cleanup, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_CHANGE_HOST, process_change_host, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(dest, smx_host_t)) sep \
-ACTION(SIMCALL_PROCESS_SUSPEND, process_suspend, WITHOUT_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_RESUME, process_resume, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_COUNT, process_count, WITH_ANSWER, TINT(result)) sep \
-ACTION(SIMCALL_PROCESS_GET_PID, process_get_PID, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_GET_PPID, process_get_PPID, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_GET_DATA, process_get_data, WITH_ANSWER, TPTR(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_SET_DATA, process_set_data, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TPTR(data)) sep \
-ACTION(SIMCALL_PROCESS_GET_HOST, process_get_host, WITH_ANSWER, TSPEC(result, smx_host_t), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_GET_NAME, process_get_name, WITH_ANSWER, TSTRING(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_IS_SUSPENDED, process_is_suspended, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_GET_PROPERTIES, process_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_PROCESS_SLEEP, process_sleep, WITHOUT_ANSWER, TINT(result), TDOUBLE(duration)) sep \
-ACTION(SIMCALL_PROCESS_ON_EXIT, process_on_exit, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(fun, int_f_pvoid_t), TPTR(data)) sep \
-ACTION(SIMCALL_PROCESS_AUTO_RESTART_SET, process_auto_restart_set, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TINT(auto_restart)) sep \
-ACTION(SIMCALL_PROCESS_RESTART, process_restart, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(process, smx_process_t)) sep \
-ACTION(SIMCALL_RDV_CREATE, rdv_create, WITH_ANSWER, TSPEC(result, smx_rdv_t), TSTRING(name)) sep \
-ACTION(SIMCALL_RDV_DESTROY, rdv_destroy, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t)) sep \
-ACTION(SIMCALL_RDV_GET_BY_NAME, rdv_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \
-ACTION(SIMCALL_RDV_COMM_COUNT_BY_HOST, rdv_comm_count_by_host, WITH_ANSWER, TUINT(result), TSPEC(rdv, smx_rdv_t), TSPEC(host, smx_host_t)) sep \
-ACTION(SIMCALL_RDV_GET_HEAD, rdv_get_head, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t)) sep \
-ACTION(SIMCALL_RDV_SET_RECV, rdv_set_receiver, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TSPEC(receiver, smx_process_t)) sep \
-ACTION(SIMCALL_RDV_GET_RECV, rdv_get_receiver, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(rdv, smx_rdv_t)) sep \
-ACTION(SIMCALL_COMM_IPROBE, comm_iprobe, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TINT(src), TINT(tag), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \
-ACTION(SIMCALL_COMM_SEND, comm_send, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COMM_ISEND, comm_isend, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TSPEC(clean_fun, simix_clean_func_t), TPTR(data), TINT(detached)) sep \
-ACTION(SIMCALL_COMM_RECV, comm_recv, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COMM_IRECV, comm_irecv, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \
-ACTION(SIMCALL_COMM_RECV_BOUNDED, comm_recv_bounded, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout), TDOUBLE(rate)) sep \
-ACTION(SIMCALL_COMM_IRECV_BOUNDED, comm_irecv_bounded, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(rate)) sep \
-ACTION(SIMCALL_COMM_DESTROY, comm_destroy, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_CANCEL, comm_cancel, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_WAITANY, comm_waitany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \
-ACTION(SIMCALL_COMM_WAIT, comm_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(comm, smx_action_t), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COMM_TEST, comm_test, WITHOUT_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_TESTANY, comm_testany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \
-ACTION(SIMCALL_COMM_GET_REMAINS, comm_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_STATE, comm_get_state, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_SRC_DATA, comm_get_src_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_DST_DATA, comm_get_dst_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_SRC_PROC, comm_get_src_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_COMM_GET_DST_PROC, comm_get_dst_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \
-ACTION(SIMCALL_MUTEX_INIT, mutex_init, WITH_ANSWER, TSPEC(result, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_DESTROY, mutex_destroy, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_LOCK, mutex_lock, WITHOUT_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_TRYLOCK, mutex_trylock, WITH_ANSWER, TINT(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_MUTEX_UNLOCK, mutex_unlock, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_COND_INIT, cond_init, WITH_ANSWER, TSPEC(result, smx_cond_t)) sep \
-ACTION(SIMCALL_COND_DESTROY, cond_destroy, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
-ACTION(SIMCALL_COND_SIGNAL, cond_signal, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
-ACTION(SIMCALL_COND_WAIT, cond_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t)) sep \
-ACTION(SIMCALL_COND_WAIT_TIMEOUT, cond_wait_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_COND_BROADCAST, cond_broadcast, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \
-ACTION(SIMCALL_SEM_INIT, sem_init, WITH_ANSWER, TSPEC(result, smx_sem_t), TINT(capacity)) sep \
-ACTION(SIMCALL_SEM_DESTROY, sem_destroy, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_RELEASE, sem_release, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \
-ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \
-ACTION(SIMCALL_FILE_GET_DATA, file_get_data, WITH_ANSWER, TPTR(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_SET_DATA, file_set_data, WITH_ANSWER, TVOID(result), TSPEC(fd, smx_file_t), TPTR(data)) sep \
-ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t), TSIZE(size)) sep \
-ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t), TSIZE(size)) sep \
-ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path)) sep \
-ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITH_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \
-ACTION(SIMCALL_FILE_GET_SIZE, file_get_size, WITH_ANSWER, TSIZE(result), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_FILE_GET_INFO, file_get_info, WITH_ANSWER, TSPEC(result, xbt_dynar_t), TSPEC(fd, smx_file_t)) sep \
-ACTION(SIMCALL_STORAGE_GET_FREE_SIZE, storage_get_free_size, WITH_ANSWER, TSIZE(result), TSTRING(name)) sep \
-ACTION(SIMCALL_STORAGE_GET_USED_SIZE, storage_get_used_size, WITH_ANSWER, TSIZE(result), TSTRING(name)) sep \
-ACTION(SIMCALL_STORAGE_GET_PROPERTIES, storage_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(storage, smx_storage_t)) sep \
-ACTION(SIMCALL_STORAGE_GET_CONTENT, storage_get_content, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(storage, smx_storage_t)) sep \
-ACTION(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep
-
-/* SIMCALL_COMM_IS_LATENCY_BOUNDED and SIMCALL_SET_CATEGORY make things complicated
- * because they are not always present */
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-#define SIMCALL_LIST2(ACTION, sep) \
-ACTION(SIMCALL_COMM_IS_LATENCY_BOUNDED, comm_is_latency_bounded, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep
-#else
-#define SIMCALL_LIST2(ACTION, sep)
-#endif
-
-#ifdef HAVE_TRACING
-#define SIMCALL_LIST3(ACTION, sep) \
-ACTION(SIMCALL_SET_CATEGORY, set_category, WITH_ANSWER, TVOID(result), TSPEC(action, smx_action_t), TSTRING(category)) sep
-#else
-#define SIMCALL_LIST3(ACTION, sep)
-#endif
-
-#ifdef HAVE_MC
-#define SIMCALL_LIST4(ACTION, sep) \
-ACTION(SIMCALL_MC_SNAPSHOT, mc_snapshot, WITH_ANSWER, TPTR(result)) sep \
-ACTION(SIMCALL_MC_COMPARE_SNAPSHOTS, mc_compare_snapshots, WITH_ANSWER, TINT(result), TPTR(s1), TPTR(s2)) sep \
-ACTION(SIMCALL_MC_RANDOM, mc_random, WITH_ANSWER, TINT(result), TINT(min), TINT(max)) sep
-#else
-#define SIMCALL_LIST4(ACTION, sep)
-#endif
-
-/* SIMCALL_LIST is the final macro to use */
-#define SIMCALL_LIST(ACTION, ...) \
- SIMCALL_LIST1(ACTION, ##__VA_ARGS__)\
- SIMCALL_LIST2(ACTION, ##__VA_ARGS__)\
- SIMCALL_LIST3(ACTION, ##__VA_ARGS__)\
- SIMCALL_LIST4(ACTION, ##__VA_ARGS__)
-
-
-/* you can redefine the following macro differently to generate something else
- * with the list of enumeration values (e.g. a table of strings or a table of function pointers) */
-#define SIMCALL_ENUM_ELEMENT(x, y) x
-
/**
* \brief All possible simcalls.
*/
typedef enum {
SIMCALL_NONE,
-SIMCALL_LIST(SIMCALL_ENUM, SIMCALL_SEP_COMMA)
+#include "simcalls_generated_enum.h"
SIMCALL_NEW_API_INIT,
NUM_SIMCALLS
} e_smx_simcall_t;
typedef int (*simix_match_func_t)(void *, void *, smx_action_t);
typedef void (*simix_clean_func_t)(void *);
+typedef void (*FPtr)(void); // Hide the ugliness
/* Pack all possible scalar types in an union */
union u_smx_scalar {
unsigned long ul;
float f;
double d;
- size_t si;
- void* p;
+ size_t sz;
+ sg_size_t sgsz;
+ void* dp;
+ FPtr fp;
const void* cp;
};
};
} s_smx_simcall_t, *smx_simcall_t;
-SIMCALL_LIST(SIMCALL_RES_GETSET, SIMCALL_SEP_NOTHING)
-SIMCALL_LIST(SIMCALL_ARG_GETSET, SIMCALL_SEP_NOTHING)
+#include "simcalls_generated_res_getter_setter.h"
+#include "simcalls_generated_args_getter_setter.h"
/******************************** General *************************************/
extern const char *simcall_types[];
extern simcall_handler_t simcall_table[];
-#endif
+SG_END_DECL()
+#endif
-/* 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
static smx_action_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout)
{
XBT_IN("(%p, %f)",smx_host,timeout);
+
smx_action_t action;
action = xbt_mallocator_get(simix_global->action_mallocator);
action->type = SIMIX_ACTION_SYNCHRO;
action->name = xbt_strdup("synchro");
action->synchro.sleep =
- surf_workstation_model->extension.workstation.sleep(smx_host, timeout);
+ surf_workstation_sleep(smx_host, timeout);
- surf_workstation_model->action_data_set(action->synchro.sleep, action);
+ surf_action_set_data(action->synchro.sleep, action);
XBT_OUT();
return action;
}
{
XBT_IN("(%p)",action);
XBT_DEBUG("Destroying synchro %p", action);
- action->synchro.sleep->model_type->action_unref(action->synchro.sleep);
+ xbt_assert(action->type == SIMIX_ACTION_SYNCHRO);
+ surf_action_unref(action->synchro.sleep);
xbt_free(action->name);
xbt_mallocator_release(simix_global->action_mallocator, action);
XBT_OUT();
void SIMIX_post_synchro(smx_action_t action)
{
XBT_IN("(%p)",action);
- if (surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_FAILED)
+ xbt_assert(action->type == SIMIX_ACTION_SYNCHRO);
+ if (surf_action_get_state(action->synchro.sleep) == SURF_ACTION_FAILED)
action->state = SIMIX_FAILED;
- else if(surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_DONE)
+ else if(surf_action_get_state(action->synchro.sleep) == SURF_ACTION_DONE)
action->state = SIMIX_SRC_TIMEOUT;
SIMIX_synchro_finish(action);
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef _SIMIX_SYNCHRO_PRIVATE_H
#define _SIMIX_SYNCHRO_PRIVATE_H
/* smx_user.c - public interface to simix */
-/* Copyright (c) 2010-2013. The SimGrid Team.
- All rights reserved. */
+/* Copyright (c) 2010-2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
/* generate strings from the enumeration values */
static const char* simcall_names[] = {
-SIMCALL_LIST(SIMCALL_STRING_TYPE, SIMCALL_SEP_COMMA)
+#include "simcalls_generated_string.c"
[SIMCALL_NONE] = "NONE"
};
-SIMCALL_LIST(SIMCALL_FUNC, SIMCALL_SEP_NOTHING)
+#include "simcalls_generated_body.c"
/**
* \ingroup simix_host_management
return simcall_BODY_host_get_name(host);
}
+/**
+ * \ingroup simix_host_management
+ * \brief Start the host if it is off
+ *
+ * \param host A SIMIX host
+ */
+void simcall_host_on(smx_host_t host)
+{
+ simcall_BODY_host_on(host);
+}
+
+/**
+ * \ingroup simix_host_management
+ * \brief Stop the host if it is on
+ *
+ * \param host A SIMIX host
+ */
+void simcall_host_off(smx_host_t host)
+{
+ simcall_BODY_host_off(host);
+}
+
/**
* \ingroup simix_host_management
* \brief Returns a dict of the properties assigned to a host.
return simcall_BODY_host_get_state(host);
}
-/**
- * \ingroup simix_host_management
- * \brief Returns the user data associated to a host.
- *
- * \param host SIMIX host
- * \return the user data of this host
- */
-void* simcall_host_get_data(smx_host_t host)
-{
- return simcall_BODY_host_get_data(host);
-}
-
-/**
- * \ingroup simix_host_management
- * \brief Sets the user data associated to a host.
- *
- * The host must not have previous user data associated to it.
- * \param host A SIMIX host
- * \param data The user data to set
- */
-void simcall_host_set_data(smx_host_t host, void *data)
-{
- simcall_host_set_data(host, data);
-}
-
/**
* \ingroup simix_host_management
* \brief Returns the power peak of a host.
* \param host SIMIX host where the action will be executed
* \param computation_amount amount Computation amount (in bytes)
* \param priority computation priority
+ * \param bound
+ * \param affinity_mask
* \return A new SIMIX execution action
*/
smx_action_t simcall_host_execute(const char *name, smx_host_t host,
double computation_amount,
- double priority)
+ double priority, double bound, unsigned long affinity_mask)
{
/* checking for infinite values */
xbt_assert(isfinite(computation_amount), "computation_amount is not finite!");
xbt_assert(isfinite(priority), "priority is not finite!");
- return simcall_BODY_host_execute(name, host, computation_amount, priority);
+ return simcall_BODY_host_execute(name, host, computation_amount, priority, bound, affinity_mask);
}
/**
simcall_BODY_host_execution_set_priority(execution, priority);
}
+/**
+ * \ingroup simix_host_management
+ * \brief Changes the capping (the maximum CPU utilization) of an execution action.
+ *
+ * This functions changes the capping only. It calls a surf function.
+ * \param execution The execution action
+ * \param bound The new bound
+ */
+void simcall_host_execution_set_bound(smx_action_t execution, double bound)
+{
+ simcall_BODY_host_execution_set_bound(execution, bound);
+}
+
+/**
+ * \ingroup simix_host_management
+ * \brief Changes the CPU affinity of an execution action.
+ *
+ * This functions changes the CPU affinity of an execution action. See taskset(1) on Linux.
+ * \param execution The execution action
+ * \param host Host
+ * \param mask Affinity mask
+ */
+void simcall_host_execution_set_affinity(smx_action_t execution, smx_host_t host, unsigned long mask)
+{
+ simcall_BODY_host_execution_set_affinity(execution, host, mask);
+}
+
/**
* \ingroup simix_host_management
* \brief Waits for the completion of an execution action and destroy it.
return simcall_BODY_host_execution_wait(execution);
}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Create a VM on the given physical host.
+ *
+ * \param name VM name
+ * \param host Physical host
+ *
+ * \return The host object of the VM
+ */
+void* simcall_vm_create(const char *name, smx_host_t phys_host){
+ /* will jump to SIMIX_pre_vm_create() in src/simix/smx_smurf_private.h */
+ return simcall_BODY_vm_create(name, phys_host);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Start the given VM to the given physical host
+ *
+ * \param vm VM
+ */
+void simcall_vm_start(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_start in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_start(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Get the state of the given VM
+ *
+ * \param vm VM
+ * \return The state of the VM
+ */
+int simcall_vm_get_state(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_get_state in src/simix/smx_smurf_private.h */
+ return simcall_BODY_vm_get_state(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Get the name of the physical host on which the given VM runs.
+ *
+ * \param vm VM
+ * \return The name of the physical host
+ */
+void *simcall_vm_get_pm(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_migrate in src/simix/smx_smurf_private.h */
+ return simcall_BODY_vm_get_pm(vm);
+}
+
+void simcall_vm_set_bound(smx_host_t vm, double bound)
+{
+ /* will jump to SIMIX_pre_vm_set_bound in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_set_bound(vm, bound);
+}
+
+void simcall_vm_set_affinity(smx_host_t vm, smx_host_t pm, unsigned long mask)
+{
+ /* will jump to SIMIX_pre_vm_set_affinity in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_set_affinity(vm, pm, mask);
+}
+
+void simcall_host_get_params(smx_host_t vm, ws_params_t params)
+{
+ /* will jump to SIMIX_pre_host_get_params in src/simix/smx_smurf_private.h */
+ simcall_BODY_host_get_params(vm, params);
+}
+
+void simcall_host_set_params(smx_host_t vm, ws_params_t params)
+{
+ /* will jump to SIMIX_pre_host_set_params in src/simix/smx_smurf_private.h */
+ simcall_BODY_host_set_params(vm, params);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Migrate the given VM to the given physical host
+ *
+ * \param vm VM
+ * \param host Destination physical host
+ */
+void simcall_vm_migrate(smx_host_t vm, smx_host_t host)
+{
+ /* will jump to SIMIX_pre_vm_migrate in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_migrate(vm, host);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Suspend the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_suspend(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_suspend in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_suspend(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Resume the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_resume(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_resume in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_resume(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Save the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_save(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_save in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_save(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Restore the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_restore(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_restore in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_restore(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Shutdown the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_shutdown(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_shutdown in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_shutdown(vm);
+}
+
+/**
+ * \ingroup simix_vm_management
+ * \brief Destroy the given VM
+ *
+ * \param vm VM
+ */
+void simcall_vm_destroy(smx_host_t vm)
+{
+ /* will jump to SIMIX_pre_vm_destroy in src/simix/smx_smurf_private.h */
+ simcall_BODY_vm_destroy(vm);
+}
+
+
/**
* \ingroup simix_process_management
* \brief Creates and runs a new SIMIX process.
* skipping the simcall (for now). It works in parallel, it won't work on
* distributed but probably we will change MSG for that. */
- /*
- smx_simcall_t simcall = simcall_mine();
- simcall->call = SIMCALL_RDV_GEY_BY_NAME;
- simcall->rdv_get_by_name.name = name;
- SIMIX_simcall_push(simcall->issuer);
- return simcall->rdv_get_by_name.result;*/
-
return SIMIX_rdv_get_by_name(name);
}
src_buff_size, match_fun,
clean_fun, data, detached);
}
+
/**
* \ingroup simix_comm_management
*/
void simcall_comm_recv(smx_rdv_t rdv, void *dst_buff, size_t * dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t), void *data, double timeout)
+ int (*match_fun)(void *, void *, smx_action_t),
+ void *data, double timeout, double rate)
{
xbt_assert(isfinite(timeout), "timeout is not finite!");
xbt_assert(rdv, "No rendez-vous point defined for recv");
/* the model-checker wants two separate simcalls */
smx_action_t comm = NULL; /* MC needs the comm to be set to NULL during the simcall */
comm = simcall_comm_irecv(rdv, dst_buff, dst_buff_size,
- match_fun, data);
+ match_fun, data, rate);
simcall_comm_wait(comm, timeout);
comm = NULL;
}
else {
simcall_BODY_comm_recv(rdv, dst_buff, dst_buff_size,
- match_fun, data, timeout);
- }
-}
-/**
- * \ingroup simix_comm_management
- */
-smx_action_t simcall_comm_irecv(smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t), void *data)
-{
- xbt_assert(rdv, "No rendez-vous point defined for irecv");
-
- return simcall_BODY_comm_irecv(rdv, dst_buff, dst_buff_size,
- match_fun, data);
-}
-
-
-/**
- * \ingroup simix_comm_management
- */
-void simcall_comm_recv_bounded(smx_rdv_t rdv, void *dst_buff, size_t * dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t), void *data, double timeout, double rate)
-{
- xbt_assert(isfinite(timeout), "timeout is not finite!");
- xbt_assert(rdv, "No rendez-vous point defined for recv");
-
- if (MC_is_active()) {
- /* the model-checker wants two separate simcalls */
- smx_action_t comm = simcall_comm_irecv_bounded(rdv, dst_buff, dst_buff_size,
- match_fun, data, rate);
- simcall_comm_wait(comm, timeout);
- }
- else {
- simcall_BODY_comm_recv_bounded(rdv, dst_buff, dst_buff_size,
match_fun, data, timeout, rate);
}
}
/**
* \ingroup simix_comm_management
*/
-smx_action_t simcall_comm_irecv_bounded(smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size,
- int (*match_fun)(void *, void *, smx_action_t), void *data, double rate)
+smx_action_t simcall_comm_irecv(smx_rdv_t rdv, void *dst_buff, size_t *dst_buff_size,
+ int (*match_fun)(void *, void *, smx_action_t),
+ void *data, double rate)
{
xbt_assert(rdv, "No rendez-vous point defined for irecv");
- return simcall_BODY_comm_irecv_bounded(rdv, dst_buff, dst_buff_size,
+ return simcall_BODY_comm_irecv(rdv, dst_buff, dst_buff_size,
match_fun, data, rate);
}
-
/**
* \ingroup simix_comm_management
*/
return simcall_BODY_comm_iprobe(rdv, src, tag, match_fun, data);
}
-void simcall_comm_destroy(smx_action_t comm)
-{
- xbt_assert(comm, "Invalid parameter");
-
- /* FIXME remove this simcall type: comms are auto-destroyed now */
-
- /*
- smx_simcall_t simcall = simcall_mine();
-
- simcall->call = SIMCALL_COMM_DESTROY;
- simcall->comm_destroy.comm = comm;
-
- SIMIX_simcall_push(simcall->issuer);
- */
-}
-
/**
* \ingroup simix_comm_management
*/
*/
void simcall_sem_destroy(smx_sem_t sem)
{
- simcall_sem_destroy(sem);
+ simcall_BODY_sem_destroy(sem);
}
/**
*/
void simcall_file_set_data(smx_file_t fd, void *data)
{
- simcall_file_set_data(fd, data);
+ simcall_BODY_file_set_data(fd, data);
}
/**
* \ingroup simix_file_management
*
*/
-sg_storage_size_t simcall_file_read(smx_file_t fd, sg_storage_size_t size)
+sg_size_t simcall_file_read(smx_file_t fd, sg_size_t size)
{
return simcall_BODY_file_read(fd, size);
}
* \ingroup simix_file_management
*
*/
-sg_storage_size_t simcall_file_write(smx_file_t fd, sg_storage_size_t size)
+sg_size_t simcall_file_write(smx_file_t fd, sg_size_t size)
{
return simcall_BODY_file_write(fd, size);
}
* \ingroup simix_file_management
*
*/
-sg_storage_size_t simcall_file_get_size (smx_file_t fd){
+sg_size_t simcall_file_get_size(smx_file_t fd){
return simcall_BODY_file_get_size(fd);
}
+/**
+ * \ingroup simix_file_management
+ *
+ */
+sg_size_t simcall_file_tell(smx_file_t fd){
+ return simcall_BODY_file_tell(fd);
+}
+
/**
* \ingroup simix_file_management
*
return simcall_BODY_file_get_info(fd);
}
+/**
+ * \ingroup simix_file_management
+ *
+ */
+int simcall_file_seek(smx_file_t fd, sg_size_t offset, int origin){
+ return simcall_BODY_file_seek(fd, offset, origin);
+}
+
+/**
+ * \ingroup simix_file_management
+ *
+ */
+void simcall_storage_file_rename(smx_storage_t storage, const char* src, const char* dest)
+{
+ return simcall_BODY_storage_file_rename(storage, src, dest);
+}
+
/**
* \ingroup simix_storage_management
* \brief Returns the free space size on a given storage element.
* \param storage name
- * \return Return the free space size on a given storage element (as sg_storage_size_t)
+ * \return Return the free space size on a given storage element (as sg_size_t)
*/
-sg_storage_size_t simcall_storage_get_free_size (const char* name){
+sg_size_t simcall_storage_get_free_size (const char* name){
return simcall_BODY_storage_get_free_size(name);
}
* \ingroup simix_storage_management
* \brief Returns the used space size on a given storage element.
* \param storage name
- * \return Return the used space size on a given storage element (as sg_storage_size_t)
+ * \return Return the used space size on a given storage element (as sg_size_t)
*/
-sg_storage_size_t simcall_storage_get_used_size (const char* name){
+sg_size_t simcall_storage_get_used_size (const char* name){
return simcall_BODY_storage_get_used_size(name);
}
--- /dev/null
+/* Copyright (c) 2007-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "smx_private.h"
+#include "xbt/sysdep.h"
+#include "xbt/log.h"
+#include "xbt/dict.h"
+#include "mc/mc.h"
+
+//If you need to log some stuffs, just uncomment these two lines and uses XBT_DEBUG for instance
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_vm, simix, "Logging specific to SIMIX (vms)");
+
+/* **** create a VM **** */
+
+/**
+ * \brief Internal function to create a SIMIX host.
+ * \param name name of the host to create
+ * \param data some user data (may be NULL)
+ */
+smx_host_t SIMIX_vm_create(const char *name, smx_host_t ind_phys_host)
+{
+ /* Create surf associated resource */
+ surf_vm_workstation_model_create(name, ind_phys_host);
+
+ smx_host_t smx_host = SIMIX_host_create(name, ind_phys_host, NULL);
+
+ /* We will be able to register the VM to its physical host, so that we can promptly
+ * retrieve the list VMs on the physical host. */
+
+ return smx_host;
+}
+
+
+smx_host_t SIMIX_pre_vm_create(smx_simcall_t simcall, const char *name, smx_host_t ind_phys_host)
+{
+ return SIMIX_vm_create(name, ind_phys_host);
+}
+
+
+/* works for VMs and PMs */
+static long host_get_ramsize(smx_host_t vm, int *overcommit)
+{
+ s_ws_params_t params;
+ surf_workstation_get_params(vm, ¶ms);
+
+ if (overcommit)
+ *overcommit = params.overcommit;
+
+ return params.ramsize;
+}
+
+/* **** start a VM **** */
+static int __can_be_started(smx_host_t vm)
+{
+ smx_host_t pm = surf_vm_workstation_get_pm(vm);
+
+ int pm_overcommit = 0;
+ long pm_ramsize = host_get_ramsize(pm, &pm_overcommit);
+ long vm_ramsize = host_get_ramsize(vm, NULL);
+
+ if (!pm_ramsize) {
+ /* We assume users do not want to care about ramsize. */
+ return 1;
+ }
+
+ if (pm_overcommit) {
+ XBT_INFO("%s allows memory overcommit.", pm->key);
+ return 1;
+ }
+
+ long total_ramsize_of_vms = 0;
+ xbt_dynar_t dyn_vms = surf_workstation_get_vms(pm);
+ {
+ unsigned int cursor = 0;
+ smx_host_t another_vm;
+ xbt_dynar_foreach(dyn_vms, cursor, another_vm) {
+ long another_vm_ramsize = host_get_ramsize(vm, NULL);
+ total_ramsize_of_vms += another_vm_ramsize;
+ }
+ }
+
+ if (vm_ramsize > pm_ramsize - total_ramsize_of_vms) {
+ XBT_WARN("cannnot start %s@%s due to memory shortage: vm_ramsize %ld, free %ld, pm_ramsize %ld (bytes).",
+ vm->key, pm->key, vm_ramsize, pm_ramsize - total_ramsize_of_vms, pm_ramsize);
+ xbt_dynar_free(&dyn_vms);
+ return 0;
+ }
+
+ xbt_dynar_free(&dyn_vms);
+ return 1;
+}
+
+void SIMIX_vm_start(smx_host_t ind_vm)
+{
+ if (__can_be_started(ind_vm))
+ surf_resource_set_state(surf_workstation_resource_priv(ind_vm),
+ (int)SURF_VM_STATE_RUNNING);
+ else
+ THROWF(vm_error, 0, "The VM %s cannot be started", SIMIX_host_get_name(ind_vm));
+}
+
+
+
+void SIMIX_pre_vm_start(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ SIMIX_vm_start(ind_vm);
+}
+
+int SIMIX_vm_get_state(smx_host_t ind_vm)
+{
+ return surf_resource_get_state(surf_workstation_resource_priv(ind_vm));
+}
+
+int SIMIX_pre_vm_get_state(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ return SIMIX_vm_get_state(ind_vm);
+}
+
+
+/**
+ * \brief Function to migrate a SIMIX VM host.
+ *
+ * \param host the vm host to migrate (a smx_host_t)
+ */
+void SIMIX_vm_migrate(smx_host_t ind_vm, smx_host_t ind_dst_pm)
+{
+ /* precopy migration makes the VM temporally paused */
+ e_surf_vm_state_t state = SIMIX_vm_get_state(ind_vm);
+ xbt_assert(state == SURF_VM_STATE_SUSPENDED);
+
+ /* jump to vm_ws_migrate(). this will update the vm location. */
+ surf_vm_workstation_migrate(ind_vm, ind_dst_pm);
+}
+
+void SIMIX_pre_vm_migrate(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_dst_pm)
+{
+ SIMIX_vm_migrate(ind_vm, ind_dst_pm);
+}
+
+
+/**
+ * \brief Function to get the physical host of the given SIMIX VM host.
+ *
+ * \param host the vm host to get_phys_host (a smx_host_t)
+ */
+void *SIMIX_vm_get_pm(smx_host_t ind_vm)
+{
+ /* jump to vm_ws_get_pm(). this will return the vm name. */
+ return surf_vm_workstation_get_pm(ind_vm);
+}
+
+void *SIMIX_pre_vm_get_pm(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ return SIMIX_vm_get_pm(ind_vm);
+}
+
+
+/**
+ * \brief Function to set the CPU bound of the given SIMIX VM host.
+ *
+ * \param host the vm host (a smx_host_t)
+ * \param bound bound (a double)
+ */
+void SIMIX_vm_set_bound(smx_host_t ind_vm, double bound)
+{
+ /* jump to vm_ws_set_vm_bound(). */
+ surf_vm_workstation_set_bound(ind_vm, bound);
+}
+
+void SIMIX_pre_vm_set_bound(smx_simcall_t simcall, smx_host_t ind_vm, double bound)
+{
+ SIMIX_vm_set_bound(ind_vm, bound);
+}
+
+
+/**
+ * \brief Function to set the CPU affinity of the given SIMIX VM host.
+ *
+ * \param host the vm host (a smx_host_t)
+ * \param host the pm host (a smx_host_t)
+ * \param mask affinity mask (a unsigned long)
+ */
+void SIMIX_vm_set_affinity(smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask)
+{
+ /* make sure this at the MSG layer. */
+ xbt_assert(SIMIX_vm_get_pm(ind_vm) == ind_pm);
+
+ /* jump to vm_ws_set_vm_affinity(). */
+ surf_vm_workstation_set_affinity(ind_vm, ind_pm, mask);
+}
+
+void SIMIX_pre_vm_set_affinity(smx_simcall_t simcall, smx_host_t ind_vm, smx_host_t ind_pm, unsigned long mask)
+{
+ SIMIX_vm_set_affinity(ind_vm, ind_pm, mask);
+}
+
+
+/**
+ * \brief Function to suspend a SIMIX VM host. This function stops the exection of the
+ * VM. All the processes on this VM will pause. The state of the VM is
+ * preserved on memory. We can later resume it again.
+ *
+ * \param host the vm host to suspend (a smx_host_t)
+ */
+void SIMIX_vm_suspend(smx_host_t ind_vm, smx_process_t issuer)
+{
+ const char *name = SIMIX_host_get_name(ind_vm);
+
+ if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_RUNNING)
+ THROWF(vm_error, 0, "VM(%s) is not running", name);
+
+ XBT_DEBUG("suspend VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+ /* jump to vm_ws_suspend. The state will be set. */
+ surf_vm_workstation_suspend(ind_vm);
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+ XBT_DEBUG("suspend %s", smx_process->name);
+ SIMIX_process_suspend(smx_process, issuer);
+ }
+
+ XBT_DEBUG("suspend all processes on the VM done done");
+}
+
+void SIMIX_pre_vm_suspend(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ if (simcall->issuer->smx_host == ind_vm) {
+ XBT_ERROR("cannot suspend the VM where I run");
+ DIE_IMPOSSIBLE;
+ }
+
+ SIMIX_vm_suspend(ind_vm, simcall->issuer);
+
+ XBT_DEBUG("SIMIX_pre_vm_suspend done");
+}
+
+
+/**
+ * \brief Function to resume a SIMIX VM host. This function restart the execution of the
+ * VM. All the processes on this VM will run again.
+ *
+ * \param host the vm host to resume (a smx_host_t)
+ */
+void SIMIX_vm_resume(smx_host_t ind_vm, smx_process_t issuer)
+{
+ const char *name = SIMIX_host_get_name(ind_vm);
+
+ if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_SUSPENDED)
+ THROWF(vm_error, 0, "VM(%s) was not suspended", name);
+
+ XBT_DEBUG("resume VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+ /* jump to vm_ws_resume() */
+ surf_vm_workstation_resume(ind_vm);
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+ XBT_DEBUG("resume %s", smx_process->name);
+ SIMIX_process_resume(smx_process, issuer);
+ }
+}
+
+void SIMIX_pre_vm_resume(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ SIMIX_vm_resume(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to save a SIMIX VM host.
+ * This function is the same as vm_suspend, but the state of the VM is saved to the disk, and not preserved on memory.
+ * We can later restore it again.
+ *
+ * \param host the vm host to save (a smx_host_t)
+ */
+void SIMIX_vm_save(smx_host_t ind_vm, smx_process_t issuer)
+{
+ const char *name = SIMIX_host_get_name(ind_vm);
+
+ if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_RUNNING)
+ THROWF(vm_error, 0, "VM(%s) is not running", name);
+
+
+ XBT_DEBUG("save VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+ /* jump to vm_ws_save() */
+ surf_vm_workstation_save(ind_vm);
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+ XBT_DEBUG("suspend %s", smx_process->name);
+ SIMIX_process_suspend(smx_process, issuer);
+ }
+}
+
+void SIMIX_pre_vm_save(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ SIMIX_vm_save(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to restore a SIMIX VM host. This function restart the execution of the
+ * VM. All the processes on this VM will run again.
+ *
+ * \param host the vm host to restore (a smx_host_t)
+ */
+void SIMIX_vm_restore(smx_host_t ind_vm, smx_process_t issuer)
+{
+ const char *name = SIMIX_host_get_name(ind_vm);
+
+ if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_SAVED)
+ THROWF(vm_error, 0, "VM(%s) was not saved", name);
+
+ XBT_DEBUG("restore VM(%s), where %d processes exist", name, xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+ /* jump to vm_ws_restore() */
+ surf_vm_workstation_resume(ind_vm);
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+ XBT_DEBUG("resume %s", smx_process->name);
+ SIMIX_process_resume(smx_process, issuer);
+ }
+}
+
+void SIMIX_pre_vm_restore(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ SIMIX_vm_restore(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to shutdown a SIMIX VM host. This function powers off the
+ * VM. All the processes on this VM will be killed. But, the state of the VM is
+ * preserved on memory. We can later start it again.
+ *
+ * \param host the vm host to shutdown (a smx_host_t)
+ */
+void SIMIX_vm_shutdown(smx_host_t ind_vm, smx_process_t issuer)
+{
+ const char *name = SIMIX_host_get_name(ind_vm);
+
+ if (SIMIX_vm_get_state(ind_vm) != SURF_VM_STATE_RUNNING)
+ THROWF(vm_error, 0, "VM(%s) is not running", name);
+
+ XBT_DEBUG("shutdown %s", name);
+ XBT_DEBUG("%d processes in the VM", xbt_swag_size(SIMIX_host_priv(ind_vm)->process_list));
+
+ smx_process_t smx_process, smx_process_safe;
+ xbt_swag_foreach_safe(smx_process, smx_process_safe, SIMIX_host_priv(ind_vm)->process_list) {
+ XBT_DEBUG("kill %s", smx_process->name);
+ SIMIX_process_kill(smx_process, issuer);
+ }
+
+ /* FIXME: we may have to do something at the surf layer, e.g., vcpu action */
+ surf_resource_set_state(surf_workstation_resource_priv(ind_vm),
+ (int)SURF_VM_STATE_CREATED);
+}
+
+void SIMIX_pre_vm_shutdown(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ SIMIX_vm_shutdown(ind_vm, simcall->issuer);
+}
+
+
+/**
+ * \brief Function to destroy a SIMIX VM host.
+ *
+ * \param host the vm host to destroy (a smx_host_t)
+ */
+void SIMIX_vm_destroy(smx_host_t ind_vm)
+{
+ /* this code basically performs a similar thing like SIMIX_host_destroy() */
+
+ xbt_assert((ind_vm != NULL), "Invalid parameters");
+ const char *hostname = SIMIX_host_get_name(ind_vm);
+
+ XBT_DEBUG("destroy %s", hostname);
+
+ /* this will call the registered callback function, i.e., SIMIX_host_destroy(). */
+ xbt_lib_unset(host_lib, hostname, SIMIX_HOST_LEVEL, 1);
+
+ /* jump to vm_ws_destroy(). The surf level resource will be freed. */
+ surf_vm_workstation_destroy(ind_vm);
+}
+
+void SIMIX_pre_vm_destroy(smx_simcall_t simcall, smx_host_t ind_vm)
+{
+ SIMIX_vm_destroy(ind_vm);
+}
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
block_size = extent * send_count;
if (!is_2dmesh(num_procs, &X, &Y))
- return MPI_ERR_COMM;
+ THROWF(arg_error,0, "allgather_2dmesh algorithm can't be used with this number of processes! ");
my_row_base = (rank / Y) * Y;
my_col_base = rank % Y;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
num_procs = smpi_comm_size(comm);
extent = smpi_datatype_get_extent(send_type);
- is_3dmesh(num_procs, &X, &Y, &Z);
+ if (!is_3dmesh(num_procs, &X, &Y, &Z))
+ THROWF(arg_error,0, "allgather_3dmesh algorithm can't be used with this number of processes! ");
+
num_reqs = X;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
// Allgather - gather/bcast algorithm
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
// Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
// Allgather-Non-Topoloty-Scecific-Logical-Ring algorithm
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef NUM_CORE
#define NUM_CORE 8
int i, send_offset, recv_offset;
int intra_rank, inter_rank;
- intra_rank = rank % NUM_CORE;
- inter_rank = rank / NUM_CORE;
- int inter_comm_size = (comm_size + NUM_CORE - 1) / NUM_CORE;
- int num_core_in_current_smp = NUM_CORE;
+
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
+
+
+ intra_rank = rank % num_core;
+ inter_rank = rank / num_core;
+ int inter_comm_size = (comm_size + num_core - 1) / num_core;
+ int num_core_in_current_smp = num_core;
+
+ if(comm_size%num_core)
+ THROWF(arg_error,0, "allgather SMP NTS algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ", num_core);
/* for too small number of processes, use default implementation */
- if (comm_size <= NUM_CORE) {
+ if (comm_size <= num_core) {
XBT_WARN("MPI_allgather_SMP_NTS use default MPI_allgather.");
smpi_mpi_allgather(sbuf, scount, stype, rbuf, rcount, rtype, comm);
return MPI_SUCCESS;
// the last SMP node may have fewer number of running processes than all others
if (inter_rank == (inter_comm_size - 1)) {
- num_core_in_current_smp = comm_size - (inter_rank * NUM_CORE);
+ num_core_in_current_smp = comm_size - (inter_rank * num_core);
}
//copy corresponding message from sbuf to rbuf
recv_offset = rank * rextent * rcount;
for (i = 1; i < num_core_in_current_smp; i++) {
dst =
- (inter_rank * NUM_CORE) + (intra_rank + i) % (num_core_in_current_smp);
+ (inter_rank * num_core) + (intra_rank + i) % (num_core_in_current_smp);
src =
- (inter_rank * NUM_CORE) + (intra_rank - i +
+ (inter_rank * num_core) + (intra_rank - i +
num_core_in_current_smp) %
(num_core_in_current_smp);
recv_offset = src * rextent * rcount;
MPI_Request *rrequest_array = xbt_new(MPI_Request, inter_comm_size - 1);
MPI_Request *srequest_array = xbt_new(MPI_Request, inter_comm_size - 1);
- src = ((inter_rank - 1 + inter_comm_size) % inter_comm_size) * NUM_CORE;
- dst = ((inter_rank + 1) % inter_comm_size) * NUM_CORE;
+ src = ((inter_rank - 1 + inter_comm_size) % inter_comm_size) * num_core;
+ dst = ((inter_rank + 1) % inter_comm_size) * num_core;
// post all inter Irecv
for (i = 0; i < inter_comm_size - 1; i++) {
recv_offset =
((inter_rank - i - 1 +
- inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
- rrequest_array[i] = smpi_mpi_irecv((char *)rbuf + recv_offset, rcount * NUM_CORE,
+ inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+ rrequest_array[i] = smpi_mpi_irecv((char *)rbuf + recv_offset, rcount * num_core,
rtype, src, tag + i, comm);
}
// send first message
send_offset =
((inter_rank +
- inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
- srequest_array[0] = smpi_mpi_isend((char *)rbuf + send_offset, scount * NUM_CORE,
+ inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+ srequest_array[0] = smpi_mpi_isend((char *)rbuf + send_offset, scount * num_core,
stype, dst, tag, comm);
// loop : recv-inter , send-inter, send-intra (linear-bcast)
for (i = 0; i < inter_comm_size - 2; i++) {
recv_offset =
((inter_rank - i - 1 +
- inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
+ inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
smpi_mpi_wait(&rrequest_array[i], MPI_STATUS_IGNORE);
- srequest_array[i + 1] = smpi_mpi_isend((char *)rbuf + recv_offset, scount * NUM_CORE,
+ srequest_array[i + 1] = smpi_mpi_isend((char *)rbuf + recv_offset, scount * num_core,
stype, dst, tag + i + 1, comm);
if (num_core_in_current_smp > 1) {
- smpi_mpi_send((char *)rbuf + recv_offset, scount * NUM_CORE,
+ smpi_mpi_send((char *)rbuf + recv_offset, scount * num_core,
stype, (rank + 1), tag + i + 1, comm);
}
}
// recv last message and send_intra
recv_offset =
((inter_rank - i - 1 +
- inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
- //recv_offset = ((inter_rank + 1) % inter_comm_size) * NUM_CORE * sextent * scount;
+ inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+ //recv_offset = ((inter_rank + 1) % inter_comm_size) * num_core * sextent * scount;
//i=inter_comm_size-2;
smpi_mpi_wait(&rrequest_array[i], MPI_STATUS_IGNORE);
if (num_core_in_current_smp > 1) {
- smpi_mpi_send((char *)rbuf + recv_offset, scount * NUM_CORE,
+ smpi_mpi_send((char *)rbuf + recv_offset, scount * num_core,
stype, (rank + 1), tag + i + 1, comm);
}
for (i = 0; i < inter_comm_size - 1; i++) {
recv_offset =
((inter_rank - i - 1 +
- inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
- smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype,
+ inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+ smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * num_core), rtype,
rank - 1, tag + i + 1, comm, MPI_STATUS_IGNORE);
}
}
for (i = 0; i < inter_comm_size - 1; i++) {
recv_offset =
((inter_rank - i - 1 +
- inter_comm_size) % inter_comm_size) * NUM_CORE * sextent * scount;
- smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * NUM_CORE), rtype,
+ inter_comm_size) % inter_comm_size) * num_core * sextent * scount;
+ smpi_mpi_recv((char *) rbuf + recv_offset, (rcount * num_core), rtype,
rank - 1, tag + i + 1, comm, MPI_STATUS_IGNORE);
- smpi_mpi_send((char *) rbuf + recv_offset, (scount * NUM_CORE), stype,
+ smpi_mpi_send((char *) rbuf + recv_offset, (scount * num_core), stype,
(rank + 1), tag + i + 1, comm);
}
}
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef NUM_CORE
int inter_dst, inter_src;
comm_size = smpi_comm_size(comm);
+
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
+
+ if(comm_size%num_core)
+ THROWF(arg_error,0, "allgather loosely lr algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ",num_core);
+
rank = smpi_comm_rank(comm);
MPI_Aint rextent, sextent;
rextent = smpi_datatype_get_extent(rtype);
MPI_Status status;
- intra_rank = rank % NUM_CORE;
- inter_rank = rank / NUM_CORE;
- inter_comm_size = (comm_size + NUM_CORE - 1) / NUM_CORE;
- intra_comm_size = NUM_CORE;
+ intra_rank = rank % num_core;
+ inter_rank = rank / num_core;
+ inter_comm_size = (comm_size + num_core - 1) / num_core;
+ intra_comm_size = num_core;
int src_seg, dst_seg;
} // intra loop
- // wait for inter communication to finish for these rounds (# of round equals NUM_CORE)
+ // wait for inter communication to finish for these rounds (# of round equals num_core)
if (i != inter_comm_size - 1) {
smpi_mpi_wait(&inter_rrequest, &status);
}
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* ompi_coll_tuned_allgather_intra_neighborexchange
*
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "allgather pair algorithm can't be used with non power of two number of processes ! ");
+
extent = smpi_datatype_get_extent(send_type);
// local send/recv
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
// now only work with power of two processes
// get size of the communicator, followed by rank
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "allgather rhv algorithm can't be used with non power of two number of processes ! ");
+
rank = smpi_comm_rank(comm);
// get size of single element's type for send buffer and recv buffer
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef NUM_CORE
#define NUM_CORE 8
{
int src, dst, comm_size, rank;
comm_size = smpi_comm_size(comm);
+
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
+
+ if(comm_size%num_core)
+ THROWF(arg_error,0, "allgather SMP simple algorithm can't be used with non multiple of NUM_CORE=%d number of processes ! ", num_core);
+
rank = smpi_comm_rank(comm);
MPI_Aint rextent, sextent;
rextent = smpi_datatype_get_extent(rtype);
MPI_Status status;
int i, send_offset, recv_offset;
int intra_rank, inter_rank;
- int num_core = NUM_CORE;
intra_rank = rank % num_core;
inter_rank = rank / num_core;
int inter_comm_size = (comm_size + num_core - 1) / num_core;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
// Allgather - gather/bcast algorithm
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/* Short or medium size message and power-of-two no. of processes. Use
* recursive doubling algorithm */
#include "colls_private.h"
-#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
-/* -*- Mode: C; c-basic-offset:4 ; -*- */
/*
*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
+#include "colls_private.h"
+
/*****************************************************************************
* Function: allgather_mpich_ring
* return: int
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2009 University of Houston. All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
/*
* ompi_coll_tuned_allgatherv_intra_neighborexchange
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "allgatherv pair algorithm can't be used with non power of two number of processes ! ");
+
extent = smpi_datatype_get_extent(send_type);
// local send/recv
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/* IMPLEMENTED BY PITCH PATARASUK
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2009 University of Houston. All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
*
- * $HEADER$
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
*/
-
-
/*
* ompi_coll_tuned_allreduce_intra_ring_segmented
*
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int smpi_coll_tuned_allreduce_rab_rdb(void *sbuff, void *rbuff, int count,
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
rank = smpi_comm_rank(comm);
nprocs = smpi_comm_size(comm);
+ if((nprocs&(nprocs-1)))
+ THROWF(arg_error,0, "allreduce rab1 algorithm can't be used with non power of two number of processes ! ");
+
extent = smpi_datatype_get_extent(dtype);
pof2 = 1;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int smpi_coll_tuned_allreduce_redbcast(void *buf, void *buf2, int count,
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/* IMPLEMENTED BY PITCH PATARASUK
Non-topoloty-specific (however, number of cores/node need to be changed)
int tag = COLL_TAG_ALLREDUCE;
int mask, src, dst;
MPI_Status status;
- int num_core = NUM_CORE;
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
comm_size = smpi_comm_size(comm);
rank = smpi_comm_rank(comm);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/* IMPLEMENTED BY PITCH PATARASUK
Non-topoloty-specific (however, number of cores/node need to be changed)
void *tmp_buf;
int tag = COLL_TAG_ALLREDUCE;
int mask, src, dst;
- int num_core = NUM_CORE;
+
+
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
MPI_Status status;
comm_size=smpi_comm_size(comm);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/* IMPLEMENTED BY PITCH PATARASUK
Non-topoloty-specific (however, number of cores/node need to be changed)
int tag = COLL_TAG_ALLREDUCE;
int mask, src, dst;
MPI_Status status;
- int num_core = NUM_CORE;
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
/*
#ifdef MPICH2_REDUCTION
MPI_User_function * uop = MPIR_Op_table[op % 16 - 1];
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
int tag = COLL_TAG_ALLREDUCE;
int mask, src, dst;
MPI_Status status;
- int num_core = NUM_CORE;
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
/*
#ifdef MPICH2_REDUCTION
MPI_User_function * uop = MPIR_Op_table[op % 16 - 1];
-#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* implemented by Pitch Patarasuk, 07/01/2007
*/
+#include "colls_private.h"
//#include <star-reduction.c>
/* change number of core per smp-node
int tag = COLL_TAG_ALLREDUCE;
int mask, src, dst;
MPI_Status status;
- int num_core = NUM_CORE;
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
comm_size = smpi_comm_size(comm);
+
+ if((comm_size&(comm_size-1)))
+ THROWF(arg_error,0, "allreduce smp rsag rab algorithm can't be used with non power of two number of processes ! ");
+
rank = smpi_comm_rank(comm);
MPI_Aint extent;
extent = smpi_datatype_get_extent(dtype);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/* change number of core per smp-node
int tag = COLL_TAG_ALLREDUCE;
int mask, src, dst;
MPI_Status status;
- int num_core = NUM_CORE;
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
/*
#ifdef MPICH2_REDUCTION
MPI_User_function * uop = MPIR_Op_table[op % 16 - 1];
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#include <math.h>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#include <math.h>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*****************************************************************************
* Function: alltoall_bruck
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoall pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/**
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "colls_private.h"
/*
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
rank = smpi_comm_rank(comm);
num_procs = smpi_comm_size(comm);
+
+ if((num_procs&(num_procs-1)))
+ THROWF(arg_error,0, "alltoallv pair algorithm can't be used with non power of two number of processes ! ");
+
send_chunk = smpi_datatype_get_extent(send_type);
recv_chunk = smpi_datatype_get_extent(recv_type);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int bcast_NTSB_segment_size_in_byte = 8192;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
static int bcast_NTSL_segment_size_in_byte = 8192;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
static int bcast_NTSL_segment_size_in_byte = 8192;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef NUM_CORE
#define NUM_CORE 8
rank = smpi_comm_rank(comm);
size = smpi_comm_size(comm);
+ int host_num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (host_num_core == 1) host_num_core = NUM_CORE;
+
+ if(size%host_num_core)
+ THROWF(arg_error,0, "bcast SMP binary can't be used with non multiple of NUM_CORE=%d number of processes ! ",host_num_core);
int segment = bcast_SMP_binary_segment_byte / extent;
int pipe_length = count / segment;
int remainder = count % segment;
- int to_intra_left = (rank / NUM_CORE) * NUM_CORE + (rank % NUM_CORE) * 2 + 1;
- int to_intra_right = (rank / NUM_CORE) * NUM_CORE + (rank % NUM_CORE) * 2 + 2;
- int to_inter_left = ((rank / NUM_CORE) * 2 + 1) * NUM_CORE;
- int to_inter_right = ((rank / NUM_CORE) * 2 + 2) * NUM_CORE;
- int from_inter = (((rank / NUM_CORE) - 1) / 2) * NUM_CORE;
- int from_intra = (rank / NUM_CORE) * NUM_CORE + ((rank % NUM_CORE) - 1) / 2;
+ int to_intra_left = (rank / host_num_core) * host_num_core + (rank % host_num_core) * 2 + 1;
+ int to_intra_right = (rank / host_num_core) * host_num_core + (rank % host_num_core) * 2 + 2;
+ int to_inter_left = ((rank / host_num_core) * 2 + 1) * host_num_core;
+ int to_inter_right = ((rank / host_num_core) * 2 + 2) * host_num_core;
+ int from_inter = (((rank / host_num_core) - 1) / 2) * host_num_core;
+ int from_intra = (rank / host_num_core) * host_num_core + ((rank % host_num_core) - 1) / 2;
int increment = segment * extent;
- int base = (rank / NUM_CORE) * NUM_CORE;
- int num_core = NUM_CORE;
- if (((rank / NUM_CORE) * NUM_CORE) == ((size / NUM_CORE) * NUM_CORE))
- num_core = size - (rank / NUM_CORE) * NUM_CORE;
+ int base = (rank / host_num_core) * host_num_core;
+ int num_core = host_num_core;
+ if (((rank / host_num_core) * host_num_core) == ((size / host_num_core) * host_num_core))
+ num_core = size - (rank / host_num_core) * host_num_core;
// if root is not zero send to rank zero first
if (root != 0) {
// when a message is smaller than a block size => no pipeline
if (count <= segment) {
// case ROOT-of-each-SMP
- if (rank % NUM_CORE == 0) {
+ if (rank % host_num_core == 0) {
// case ROOT
if (rank == 0) {
//printf("node %d left %d right %d\n",rank,to_inter_left,to_inter_right);
(MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status));
// case ROOT-of-each-SMP
- if (rank % NUM_CORE == 0) {
+ if (rank % host_num_core == 0) {
// case ROOT
if (rank == 0) {
for (i = 0; i < pipe_length; i++) {
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef NUM_CORE
#define NUM_CORE 8
size = smpi_comm_size(comm);
rank = smpi_comm_rank(comm);
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
+
+ if(size%num_core)
+ THROWF(arg_error,0, "bcast SMP binomial can't be used with non multiple of NUM_CORE=%d number of processes ! ",num_core);
+
int to_intra, to_inter;
int from_intra, from_inter;
- int inter_rank = rank / NUM_CORE;
- int inter_size = (size - 1) / NUM_CORE + 1;
- int intra_rank = rank % NUM_CORE;
- int intra_size = NUM_CORE;
- if (((rank / NUM_CORE) * NUM_CORE) == ((size / NUM_CORE) * NUM_CORE))
- intra_size = size - (rank / NUM_CORE) * NUM_CORE;
+ int inter_rank = rank / num_core;
+ int inter_size = (size - 1) / num_core + 1;
+ int intra_rank = rank % num_core;
+ int intra_size = num_core;
+ if (((rank / num_core) * num_core) == ((size / num_core) * num_core))
+ intra_size = size - (rank / num_core) * num_core;
// if root is not zero send to rank zero first
if (root != 0) {
mask = 1;
while (mask < inter_size) {
if (inter_rank & mask) {
- from_inter = (inter_rank - mask) * NUM_CORE;
+ from_inter = (inter_rank - mask) * num_core;
//printf("Node %d recv from node %d when mask is %d\n", rank, from_inter, mask);
smpi_mpi_recv(buf, count, datatype, from_inter, tag, comm, &status);
break;
while (mask > 0) {
if (inter_rank < inter_size) {
- to_inter = (inter_rank + mask) * NUM_CORE;
+ to_inter = (inter_rank + mask) * num_core;
if (to_inter < size) {
//printf("Node %d send to node %d when mask is %d\n", rank, to_inter, mask);
smpi_mpi_send(buf, count, datatype, to_inter, tag, comm);
}
// SECOND STEP every root-of-each-SMP send to all children with binomial tree
// base is a rank of root-of-each-SMP
- int base = (rank / NUM_CORE) * NUM_CORE;
+ int base = (rank / num_core) * num_core;
mask = 1;
while (mask < intra_size) {
if (intra_rank & mask) {
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef NUM_CORE
#define NUM_CORE 8
rank = smpi_comm_rank(comm);
size = smpi_comm_size(comm);
+ int num_core = simcall_host_get_core(SIMIX_host_self());
+ // do we use the default one or the number of cores in the platform ?
+ // if the number of cores is one, the platform may be simulated with 1 node = 1 core
+ if (num_core == 1) num_core = NUM_CORE;
+
+ if(size%num_core)
+ THROWF(arg_error,0, "bcast SMP linear can't be used with non multiple of num_core=%d number of processes!",num_core);
int segment = bcast_SMP_linear_segment_byte / extent;
int pipe_length = count / segment;
/* leader of each SMP do inter-communication
and act as a root for intra-communication */
- int to_inter = (rank + NUM_CORE) % size;
+ int to_inter = (rank + num_core) % size;
int to_intra = (rank + 1) % size;
- int from_inter = (rank - NUM_CORE + size) % size;
+ int from_inter = (rank - num_core + size) % size;
int from_intra = (rank + size - 1) % size;
// call native when MPI communication size is too small
- if (size <= NUM_CORE) {
+ if (size <= num_core) {
XBT_WARN("MPI_bcast_SMP_linear use default MPI_bcast.");
smpi_mpi_bcast(buf, count, datatype, root, comm);
return MPI_SUCCESS;
smpi_mpi_send(buf, count, datatype, to_intra, tag, comm);
}
// case last ROOT of each SMP
- else if (rank == (((size - 1) / NUM_CORE) * NUM_CORE)) {
+ else if (rank == (((size - 1) / num_core) * num_core)) {
request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm);
smpi_mpi_wait(&request, &status);
smpi_mpi_send(buf, count, datatype, to_intra, tag, comm);
}
// case intermediate ROOT of each SMP
- else if (rank % NUM_CORE == 0) {
+ else if (rank % num_core == 0) {
request = smpi_mpi_irecv(buf, count, datatype, from_inter, tag, comm);
smpi_mpi_wait(&request, &status);
smpi_mpi_send(buf, count, datatype, to_inter, tag, comm);
smpi_mpi_send(buf, count, datatype, to_intra, tag, comm);
}
// case last non-ROOT of each SMP
- else if (((rank + 1) % NUM_CORE == 0) || (rank == (size - 1))) {
+ else if (((rank + 1) % num_core == 0) || (rank == (size - 1))) {
request = smpi_mpi_irecv(buf, count, datatype, from_intra, tag, comm);
smpi_mpi_wait(&request, &status);
}
(MPI_Status *) xbt_malloc((size + pipe_length) * sizeof(MPI_Status));
// case ROOT of each SMP
- if (rank % NUM_CORE == 0) {
+ if (rank % num_core == 0) {
// case real root
if (rank == 0) {
for (i = 0; i < pipe_length; i++) {
}
}
// case last ROOT of each SMP
- else if (rank == (((size - 1) / NUM_CORE) * NUM_CORE)) {
+ else if (rank == (((size - 1) / num_core) * num_core)) {
for (i = 0; i < pipe_length; i++) {
request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype,
from_inter, (tag + i), comm);
}
}
} else { // case last non-ROOT of each SMP
- if (((rank + 1) % NUM_CORE == 0) || (rank == (size - 1))) {
+ if (((rank + 1) % num_core == 0) || (rank == (size - 1))) {
for (i = 0; i < pipe_length; i++) {
request_array[i] = smpi_mpi_irecv((char *) buf + (i * increment), segment, datatype,
from_intra, (tag + i), comm);
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int bcast_arrival_pattern_aware_wait_segment_size_in_byte = 8192;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
static int bcast_NTSL_segment_size_in_byte = 8192;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#ifndef BCAST_ARRIVAL_PATTERN_AWARE_HEADER_SIZE
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int flattree_segment_in_byte = 8192;
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
int
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
#include "coll_tuned_topo.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2009 University of Houston. All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
*
- * $HEADER$
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
*/
-
+
#include "colls_private.h"
#include "coll_tuned_topo.h"
#define MAXTREEFANOUT 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. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*****************************************************************************
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#ifndef MCA_COLL_TUNED_TOPO_H_HAS_BEEN_INCLUDED
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef SMPI_COLLS_H
#define SMPI_COLLS_H
#include <math.h>
#include "smpi/mpi.h"
#include "smpi/private.h"
+#include "xbt/ex.h"
#include "xbt.h"
#define COLL_DESCRIPTION(cat, ret, args, name) \
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "xbt.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_colls, smpi,
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef SMPI_COLLS_PRIVATE_H
#define SMPI_COLLS_PRIVATE_H
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
//#include <star-reduction.c>
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
/*
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
static inline int MPIU_Mirror_permutation(unsigned int x, int bits)
-/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* All rights reserved.
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2009 University of Houston. All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
#include "colls_private.h"
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
- * $COPYRIGHT$
*
* Additional copyrights may follow
- *
- * $HEADER$
*/
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "colls_private.h"
+#ifdef HAVE_MC
#include "mc/mc_private.h"
+#endif
#include <float.h>
//attempt to do a quick autotuning version of the collective,
ret smpi_coll_tuned_ ## cat ## _ ## automatic(COLL_UNPAREN args)\
{\
double time1, time2, time_min=DBL_MAX;\
- int min_coll=-1, global_coll=-1;\
- int i;\
+ volatile int min_coll=-1, global_coll=-1;\
+ volatile int i;\
+ xbt_ex_t ex;\
double buf_in, buf_out, max_min=DBL_MAX;\
for (i = 0; mpi_coll_##cat##_description[i].name; i++){\
if(!strcmp(mpi_coll_##cat##_description[i].name, "automatic"))continue;\
smpi_mpi_barrier(comm);\
TRACE_AUTO_COLL(cat)\
time1 = SIMIX_get_clock();\
+ TRY{\
((int (*) args)\
mpi_coll_##cat##_description[i].coll) args2 ;\
+ }\
+ CATCH(ex) {\
+ xbt_ex_free(ex);\
+ continue;\
+ }\
time2 = SIMIX_get_clock();\
buf_out=time2-time1;\
smpi_mpi_reduce((void*)&buf_out,(void*)&buf_in, 1, MPI_DOUBLE, MPI_MAX, 0,comm );\
/* selector for collective algorithms based on mpich decision logic */
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
/* selector for collective algorithms based on openmpi's default coll_tuned_decision_fixed selector */
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#!/usr/bin/perl
+# Copyright (c) 2011, 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
# Add include for mandatory header file
print "#include <smpi_cocci.h>\n";
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "private.h"
#include <ctype.h>
return container;
}
+static char *TRACE_smpi_get_key(int src, int dst, char *key, int n);
+
+
static char *TRACE_smpi_put_key(int src, int dst, char *key, int n)
{
//get the dynar for src#dst
char aux[INSTR_DEFAULT_STR_SIZE];
snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d", src, dst);
xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
+
+
+ if(!xbt_dynar_is_empty(d)){
+ //receive was already pushed, perform a get instead
+ TRACE_smpi_get_key(src , dst, key ,n);
+ return key;
+ }
+
if (d == NULL) {
d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
xbt_dict_set(keys, aux, d, NULL);
}
+
//generate the key
static unsigned long long counter = 0;
snprintf(aux, INSTR_DEFAULT_STR_SIZE, "%d#%d", src, dst);
xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
- xbt_assert(!xbt_dynar_is_empty(d),
- "Trying to get a link key (for message reception) that has no corresponding send (%s).", __FUNCTION__);
+ // xbt_assert(!xbt_dynar_is_empty(d),
+ // "Trying to get a link key (for message reception) that has no corresponding send (%s).", __FUNCTION__);
+
+ // sometimes the receive may be posted before the send
+ if(xbt_dynar_is_empty(d)){
+ TRACE_smpi_put_key(src, dst, key, n);
+ return key;
+ }
+
char *s = xbt_dynar_get_as (d, 0, char *);
snprintf (key, n, "%s", s);
xbt_dynar_remove_at (d, 0, NULL);
#!/bin/bash
+
+# Copyright (c) 2011, 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
INFILE="$1"
OUTFILE="$2"
SPFILE="replace_globals.cocci"
-/* Copyright (c) 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#ifndef SMPI_PRIVATE_H
#define SMPI_PRIVATE_H
#define ISEND 0x20
#define SSEND 0x40
#define PREPARED 0x80
+
+
+enum smpi_process_state{
+ SMPI_UNINITIALIZED,
+ SMPI_INITIALIZED,
+ SMPI_FINALIZED
+};
+
// this struct is here to handle the problem of non-contignous data
// for each such structure these function should be implemented (vector
// index hvector hindex struct)
-/* 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
static int factor_cmp(const void *pa, const void *pb)
{
- return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor);
+ return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 :
+ (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0;
}
smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
radical_elements = xbt_str_split(smpi_coef_string, ";");
xbt_dynar_foreach(radical_elements, iter, value) {
+ memset(&fact, 0, sizeof(s_smpi_factor_t));
radical_elements2 = xbt_str_split(value, ":");
if (xbt_dynar_length(radical_elements2) <2 || xbt_dynar_length(radical_elements2) > 5)
xbt_die("Malformed radical for smpi factor!");
request->real_size=request->size;
smpi_datatype_use(request->old_type);
smpi_comm_use(request->comm);
- request->action = simcall_comm_irecv(mailbox, request->buf, &request->real_size, &match_recv, request);
+ request->action = simcall_comm_irecv(mailbox, request->buf,
+ &request->real_size, &match_recv,
+ request, -1.0);
//integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0
double sleeptime = request->detached ? smpi_or(request->size) : 0.0;
request->refcount++;
if(request->old_type->has_subtype == 0){
oldbuf = request->buf;
- if (oldbuf && request->size!=0){
+ if (!_xbt_replay_is_active() && oldbuf && request->size!=0){
request->buf = xbt_malloc(request->size);
memcpy(request->buf,oldbuf,request->size);
}
simcall_comm_isend(mailbox, request->size, -1.0,
request->buf, request->real_size,
&match_send,
- &smpi_mpi_request_free_voidp, // how to free the userdata if a detached send fails
+ &xbt_free, // how to free the userdata if a detached send fails
request,
// detach if msg size < eager/rdv switch limit
request->detached);
if ((*request)->action != NULL) { // this is not a detached send
simcall_comm_wait((*request)->action, -1.0);
- }
-
#ifdef HAVE_MC
if(MC_is_active() && (*request)->action)
(*request)->action->comm.dst_data = NULL; // dangling pointer : dst_data is freed with a wait, need to set it to NULL for system state comparison
#endif
+ }
finish_wait(request, status);
*request = MPI_REQUEST_NULL;
-/* Copyright (c) 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "private.h"
#include "xbt/dict.h"
smx_action_t action;
smx_host_t host;
host = SIMIX_host_self();
- XBT_DEBUG("Handle real computation time: %g flops", flops);
- action = simcall_host_execute("computation", host, flops, 1);
+ XBT_DEBUG("Handle real computation time: %f flops", flops);
+ action = simcall_host_execute("computation", host, flops, 1, 0, 0);
#ifdef HAVE_TRACING
simcall_set_category (action, TRACE_internal_smpi_get_category());
#endif
double flops = (double) secs*simcall_host_get_speed(SIMIX_host_self());
XBT_DEBUG("Sleep for: %f flops", flops);
- action = simcall_host_execute("computation", SIMIX_host_self(), flops, 1);
+ action = simcall_host_execute("computation", SIMIX_host_self(), flops, 1, 0, 0);
#ifdef HAVE_TRACING
simcall_set_category (action, TRACE_internal_smpi_get_category());
#endif
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <xbt/dynar.h>
#include "private.h"
/* smpi_coll.c -- various optimized routing for collectives */
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <stdlib.h>
-/* Copyright (c) 2013. The SimGrid Team.
+/* Copyright (c) 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "xbt/log.h"
#include "simgrid/simix.h"
-/* Copyright (c) 2010-2013. The SimGrid Team.
+/* Copyright (c) 2010-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include <limits.h>
#include <stdio.h>
static xbt_dict_t op_lookup = NULL;
static int running_processes = 0;
-
-
-/* Convert between Fortran and C MPI_BOTTOM */
-#define F2C_BOTTOM(addr) ((addr!=MPI_IN_PLACE && *(int*)addr == MPI_FORTRAN_BOTTOM) ? MPI_BOTTOM : (addr))
-#define F2C_IN_PLACE(addr) ((addr!=MPI_BOTTOM &&*(int*)addr == MPI_FORTRAN_IN_PLACE) ? MPI_IN_PLACE : (addr))
-#define F2C_STATUS_IGNORE(addr) ((*(int*)addr == MPI_FORTRAN_STATUS_IGNORE) ? MPI_STATUS_IGNORE : (addr))
-#define F2C_STATUSES_IGNORE(addr) ((*(int*)addr == MPI_FORTRAN_STATUSES_IGNORE) ? MPI_STATUSES_IGNORE : (addr))
+/* Bindings for MPI special values */
+union u_smpi_common {
+ struct s_smpi_common {
+ integer mpi_in_place;
+ integer mpi_bottom;
+ integer mpi_status_ignore;
+ integer mpi_statuses_ignore;
+ } f90; /* with gftortran */
+ struct s_smpi_common *f77; /* with f2c */
+} smpi_;
+
+/* Convert between Fortran and C */
+static XBT_INLINE void *f2c_addr(void *addr, void *cval, void *chk1, void *chk2)
+{
+ return (addr == chk1 || addr == chk2) ? cval : addr;
+}
+#define F2C_ADDR(addr, cval, fval) \
+ f2c_addr(addr, cval, &smpi_.f90.fval, &smpi_.f77[smpi_current_rank].fval)
+#define F2C_BOTTOM(addr) \
+ F2C_ADDR(addr, MPI_BOTTOM, mpi_bottom)
+#define F2C_IN_PLACE(addr) \
+ F2C_ADDR(addr, MPI_IN_PLACE, mpi_in_place)
+#define F2C_STATUS_IGNORE(addr) \
+ F2C_ADDR(addr, MPI_STATUS_IGNORE, mpi_status_ignore)
+#define F2C_STATUSES_IGNORE(addr) \
+ F2C_ADDR(addr, MPI_STATUSES_IGNORE, mpi_statuses_ignore)
#define KEY_SIZE (sizeof(int) * 2 + 1)
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "private.h"
#include "smpi_mpi_dt_private.h"
#include "mc/mc.h"
+#include "xbt/replay.h"
#include "surf/surf.h"
#include "simix/smx_private.h"
#include "simgrid/sg_config.h"
MPI_Comm comm_self;
void *data; /* user data */
int index;
- int initialized;
+ char state;
int sampling; /* inside an SMPI_SAMPLE_ block? */
} s_smpi_process_data_t;
if (argc && argv) {
proc = SIMIX_process_self();
index = atoi((*argv)[1]);
+#ifdef SMPI_F2C
+ smpi_current_rank = index;
+#endif
data = smpi_process_remote_data(index);
simcall_process_set_data(proc, data);
if (*argc > 2) {
void smpi_process_destroy(void)
{
int index = smpi_process_index();
- process_data[index]->index = -100;
+ process_data[index]->state = SMPI_FINALIZED;
XBT_DEBUG("<%d> Process left the game", index);
}
*/
void smpi_process_finalize(void)
{
- // wait for all pending asynchronous comms to finish
- while (SIMIX_process_has_pending_comms(SIMIX_process_self())) {
- simcall_process_sleep(0.01);
+ int i;
+ int size = smpi_comm_size(MPI_COMM_WORLD);
+ int rank = smpi_comm_rank(MPI_COMM_WORLD);
+ /* All non-root send & receive zero-length message. */
+ if (rank > 0) {
+ smpi_mpi_ssend (NULL, 0, MPI_BYTE, 0,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD);
+ smpi_mpi_recv (NULL, 0, MPI_BYTE, 0,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+ }
+ /* The root collects and broadcasts the messages. */
+ else {
+ MPI_Request* requests;
+ requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) );
+ for (i = 1; i < size; ++i) {
+ requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE,
+ COLL_TAG_BARRIER, MPI_COMM_WORLD
+ );
+ }
+ smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+ for (i = 1; i < size; ++i) {
+ requests[i] = smpi_mpi_issend(NULL, 0, MPI_BYTE, i,
+ COLL_TAG_BARRIER,
+ MPI_COMM_WORLD
+ );
+ }
+ smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE );
+ free( requests );
}
+
}
/**
*/
int smpi_process_finalized()
{
- return (smpi_process_index() == -100);
- // If finalized, this value has been set to -100;
+ int index = smpi_process_index();
+ if (index != MPI_UNDEFINED)
+ return (process_data[index]->state == SMPI_FINALIZED);
+ else
+ return 0;
}
/**
int smpi_process_initialized(void)
{
int index = smpi_process_index();
- return ((index != -100) && (index != MPI_UNDEFINED)
- && (process_data[index]->initialized));
+ return ( (index != MPI_UNDEFINED)
+ && (process_data[index]->state == SMPI_INITIALIZED));
}
/**
void smpi_process_mark_as_initialized(void)
{
int index = smpi_process_index();
- if ((index != -100) && (index != MPI_UNDEFINED))
- process_data[index]->initialized = 1;
+ if ((index != MPI_UNDEFINED) && (!process_data[index]->state != SMPI_FINALIZED))
+ process_data[index]->state = SMPI_INITIALIZED;
}
}
return 0;
}
+#endif
int smpi_global_size(void)
{
}
return atoi(value);
}
-#endif
smpi_process_data_t smpi_process_data(void)
{
MPI_Comm smpi_process_comm_self(void)
{
smpi_process_data_t data = smpi_process_data();
+ if(data->comm_self==MPI_COMM_NULL){
+ MPI_Group group = smpi_group_new(1);
+ data->comm_self = smpi_comm_new(group);
+ smpi_group_set_mapping(group, smpi_process_index(), 0);
+ }
+
return data->comm_self;
}
void *buff, size_t buff_size)
{
XBT_DEBUG("Copy the data over");
+ if(_xbt_replay_is_active()) return;
memcpy(comm->comm.dst_buff, buff, buff_size);
if (comm->comm.detached) {
// if this is a detached send, the source buffer was duplicated by SMPI
process_data[i]->timer = xbt_os_timer_new();
if (MC_is_active())
MC_ignore_heap(process_data[i]->timer, xbt_os_timer_size());
- group = smpi_group_new(1);
- process_data[i]->comm_self = smpi_comm_new(group);
- process_data[i]->initialized = 0;
+ process_data[i]->comm_self = MPI_COMM_NULL;
+ process_data[i]->state = SMPI_UNINITIALIZED;
process_data[i]->sampling = 0;
-
- smpi_group_set_mapping(group, i, 0);
}
group = smpi_group_new(process_count);
MPI_COMM_WORLD = smpi_comm_new(group);
xbt_assert(sg_cfg_get_int("smpi/async_small_thres") <=
sg_cfg_get_int("smpi/send_is_detached_thres"));
+
+ if (sg_cfg_is_default_value("smpi/running_power")) {
+ XBT_INFO("You did not set the power of the host running the simulation. "
+ "The timings will certainly not be accurate. "
+ "Use the option \"--cfg=smpi/running_power:<flops>\" to set its value."
+ "Check http://simgrid.org/simgrid/latest/doc/options.html#options_smpi_bench for more information. ");
+ }
}
void smpi_global_destroy(void)
xbt_free(MPI_COMM_WORLD);
MPI_COMM_WORLD = MPI_COMM_NULL;
for (i = 0; i < count; i++) {
- smpi_group_unuse(smpi_comm_group(process_data[i]->comm_self));
- smpi_comm_destroy(process_data[i]->comm_self);
+ if(process_data[i]->comm_self!=MPI_COMM_NULL){
+ smpi_group_unuse(smpi_comm_group(process_data[i]->comm_self));
+ smpi_comm_destroy(process_data[i]->comm_self);
+ }
xbt_os_timer_free(process_data[i]->timer);
simcall_rdv_destroy(process_data[i]->mailbox);
simcall_rdv_destroy(process_data[i]->mailbox_small);
{
smpi_process_init(&argc, &argv);
user_main_();
- //xbt_die("Should not be in this smpi_simulated_main");
return 0;
}
-/* Copyright (c) 2010, 2013. The SimGrid Team.
+/* Copyright (c) 2010, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "private.h"
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "private.h"
#include "simgrid/sg_config.h"
/* smpi_mpi_dt.c -- MPI primitives to handle datatypes */
/* FIXME: a very incomplete implementation */
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "private.h"
#include "smpi_mpi_dt_private.h"
#include "mc/mc.h"
+#include "xbt/replay.h"
#include "simgrid/modelchecker.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi_dt, smpi,
count = sendcount < recvcount ? sendcount : recvcount;
if(sendtype->has_subtype == 0 && recvtype->has_subtype == 0) {
- memcpy(recvbuf, sendbuf, count);
+ if(!_xbt_replay_is_active()) memcpy(recvbuf, sendbuf, count);
}
else if (sendtype->has_subtype == 0)
{
void smpi_op_apply(MPI_Op op, void *invec, void *inoutvec, int *len,
MPI_Datatype * datatype)
{
+ if(!_xbt_replay_is_active())
op->func(invec, inoutvec, len, datatype);
}
/* smpi_mpi_dt_private.h -- functions of smpi_mpi_dt.c that are exported to other SMPI modules. */
-/* Copyright (c) 2009-2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2009-2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#ifndef SMPI_DT_PRIVATE_H
#define SMPI_DT_PRIVATE_H
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "private.h"
#include "smpi_mpi_dt_private.h"
#ifdef HAVE_TRACING
//the src may not have been known at the beginning of the recv (MPI_ANY_SOURCE)
- if(status!=MPI_STATUS_IGNORE)src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE);
+ if(status!=MPI_STATUS_IGNORE){
+ src_traced = smpi_group_index(smpi_comm_group(comm), status->MPI_SOURCE);
+ TRACE_smpi_recv(rank, src_traced, rank);
+ }
TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__);
- TRACE_smpi_recv(rank, src_traced, rank);
#endif
}
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include "private.h"
#include <stdio.h>
#include <xbt.h>
TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, extra);
#endif
+ //unknow size from the receiver pov
+ if(size==-1){
+ smpi_mpi_probe(from, 0, MPI_COMM_WORLD, &status);
+ size=status.count;
+ }
+
smpi_mpi_recv(NULL, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD, &status);
#ifdef HAVE_TRACING
extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE);
TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, extra);
#endif
+ MPI_Status status;
+ //unknow size from the receiver pov
+ if(size==-1){
+ smpi_mpi_probe(from, 0, MPI_COMM_WORLD, &status);
+ size=status.count;
+ }
request = smpi_mpi_irecv(NULL, size, MPI_CURRENT_TYPE, from, 0, MPI_COMM_WORLD);
/* Last process alive speaking */
/* end the simulated timer */
sim_time = smpi_process_simulated_elapsed();
- XBT_INFO("Simulation time %g", sim_time);
+ XBT_INFO("Simulation time %f", sim_time);
_xbt_replay_action_exit();
xbt_free(reqq);
reqq = NULL;
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2007-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
CC=@CMAKE_C_COMPILER@
INCLUDEARGS="@includeflag@"
CMAKE_LINKARGS="-L@libdir@"
+@SMPITOOLS_SH@
+
+list_set CFLAGS
+list_set LINKARGS
if [ "@WIN32@" != "1" ]; then
- CFLAGS="-Dmain=smpi_simulated_main_"
- LINKARGS="-lsimgrid"
+ list_add CFLAGS "-Dmain=smpi_simulated_main_"
+ list_add LINKARGS "-lsimgrid"
else
- CFLAGS="-include @includedir@/smpi/smpi_main.h"
- LINKARGS="@libdir@\libsimgrid.dll"
+ list_add CFLAGS "-include" "@includedir@/smpi/smpi_main.h"
+ list_add LINKARGS "@libdir@\libsimgrid.dll"
fi
-CMDLINE=""
-while [ -n "$1" ]; do
- ARG="$1"
- shift
- case "${ARG}" in
- -c)
- CMAKE_LINKARGS=""
- LINKARGS=""
- CMDLINE="${CMDLINE} -c "
- ;;
- *.c)
- SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
- if [ -z $SRCFILE ] ; then
- SRCFILE="$ARG"
- fi
- CMDLINE="${CMDLINE} ${SRCFILE} "
- ;;
- *)
- CMDLINE="${CMDLINE} ${ARG} "
+list_set CMDARGS
+while [ $# -gt 0 ]; do
+ ARG="$1"
+ shift
+ case "${ARG}" in
+ -c)
+ CMAKE_LINKARGS=""
+ LINKARGS=""
+ list_add CMDARGS "-c"
+ ;;
+ *.c)
+ SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
+ if [ -z "$SRCFILE" ] ; then
+ SRCFILE="$ARG"
+ fi
+ list_add CMDARGS "${SRCFILE}"
+ ;;
+ *)
+ list_add CMDARGS "${ARG}"
;;
esac
done
-CMDLINE="${CC} ${CFLAGS} ${CMDLINE} ${INCLUDEARGS} ${CMAKE_LINKARGS} ${LINKARGS}"
+list_set CMDLINE "${CC}"
+list_add_not_empty CMDLINE "${CFLAGS}"
+list_add_not_empty CMDLINE ${INCLUDEARGS}
+list_add_not_empty CMDLINE ${CMAKE_LINKARGS}
+list_add_not_empty CMDLINE "${CMDARGS}"
+list_add_not_empty CMDLINE "${LINKARGS}"
-#echo "${CMDLINE}"
-${CMDLINE}
+eval $(list_get CMDLINE)
+"$@"
#! /usr/bin/env perl
+# Copyright (c) 2010-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
use warnings;
use strict;
use File::Temp;
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2012-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
F90=@GFORTRAN_EXE@
INCLUDEARGS="@includeflag@"
CMAKE_LINKARGS="-L@libdir@"
-FFLAGS="-ff2c -fno-second-underscore"
-LINKARGS="-lsimgrid -lm -lgfortran"
+@SMPITOOLS_SH@
+
+list_set FFLAGS "-ff2c" "-fno-second-underscore"
+list_set LINKARGS "-lsimgrid" "-lm" "-lgfortran"
+list_set TMPFILES
main_name=main
-declare -a TMPFILES
-trap 'rm -f "${TMPFILES[@]}"' EXIT
-
-# $1: prefix, $2: suffix
-mymktemp () {
- tmp=$(mktemp --suffix="$2" "$1_XXXXXXXXXX" 2> /dev/null)
- if [ -z "$tmp" ]; then
- # mktemp failed (unsupported --suffix ?), try unsafe mode
- tmp=$(mktemp -u "$1_XXXXXXXXXX" 2> /dev/null)
- if [ -z "$tmp" ]; then
- # mktemp failed again (doesn't exist ?), try very unsafe mode
- tmp="$1_$$x$RANDOM"
- fi
- tmp="${tmp}$2"
- # create temp file, and exit if it existed before
- sh -C -c "true > \"${tmp}\"" || exit 1
- fi
- echo "${tmp}"
+cleanup () {
+ eval $(list_get TMPFILES)
+ rm -f "$@"
}
-
-CMDLINE=""
-while [ -n "$1" ]; do
- ARG="$1"
- shift
- case "${ARG}" in
- -c)
- CMAKE_LINKARGS=""
- LINKARGS=""
- CMDLINE="${CMDLINE} -c "
- ;;
- *.f90|*.F90)
- TMPFILE=$(mymktemp "${ARG}" ".f90")
- TMPFILES+="${TMPFILE}"
+trap 'cleanup' EXIT
+
+list_set CMDLINE "${F90}"
+list_add_not_empty CMDLINE "${FFLAGS}"
+while [ $# -gt 0 ]; do
+ ARG="$1"
+ shift
+ case "${ARG}" in
+ -c)
+ CMAKE_LINKARGS=""
+ LINKARGS=""
+ list_add CMDLINE "-c"
+ ;;
+ *.f90|*.F90)
+ TMPFILE=$(mymktemp "${ARG}" ".f90")
+ list_add TMPFILES "${TMPFILE}"
#replace "program main_name by subroutine user\_main (and the end clause as well)"
- sed 's/[[:space:]]*program[[:space:]]*\([a-zA-Z0-9\-\_]*\)/subroutine user\_main /gI;s/[[:space:]]*use[[:space:]]*mpi/\include \"mpif\.h\" /gI' ${ARG} > ${TMPFILE}
- SRCFILE="${TMPFILE}"
- CMDLINE="${CMDLINE} ${SRCFILE} "
- ;;
- *)
- CMDLINE="${CMDLINE} ${ARG} "
- ;;
- esac
+ sed 's/[[:space:]]*program[[:space:]]*\([a-zA-Z0-9\-\_]*\)/subroutine user\_main /gI;s/[[:space:]]*use[[:space:]]*mpi/\include \"mpif\.h\" /gI' "${ARG}" > "${TMPFILE}"
+ SRCFILE="${TMPFILE}"
+ list_add CMDLINE "${SRCFILE}"
+ ;;
+ *)
+ list_add CMDLINE "${ARG}"
+ ;;
+ esac
done
-CMDLINE="${F90} ${FFLAGS} ${CMDLINE} ${INCLUDEARGS} ${CMAKE_LINKARGS} ${LINKARGS}"
+list_add_not_empty CMDLINE ${INCLUDEARGS}
+list_add_not_empty CMDLINE ${CMAKE_LINKARGS}
+list_add_not_empty CMDLINE "${LINKARGS}"
-#echo "${CMDLINE}"
-${CMDLINE}
+eval $(list_get CMDLINE)
+"$@"
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2010-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
prefix="@exec_prefix@"
+smpicc="$prefix/bin/smpicc"
+smpif2c="$prefix/bin/smpif2c"
-ARGS="-DMAIN__=user_main -Diargc_=smpi_process_argc -Dgetarg_=smpi_process_getarg"
-LINKARGS="-L@F2C_LIBRARY_PATH@ -lf2c -lm"
-declare -a SRCFILES
+@SMPITOOLS_SH@
-# $1: prefix, $2: suffix
-mymktemp () {
- tmp=$(mktemp --suffix="$2" "$1_XXXXXXXXXX" 2> /dev/null)
- if [ -z "$tmp" ]; then
- # mktemp failed (unsupported --suffix ?), try unsafe mode
- tmp=$(mktemp -u "$1_XXXXXXXXXX" 2> /dev/null)
- if [ -z "$tmp" ]; then
- # mktemp failed again (doesn't exist ?), try very unsafe mode
- tmp="$1_$$x$RANDOM"
- fi
- tmp="${tmp}$2"
- # create temp file, and exit if it existed before
- sh -C -c "true > \"${tmp}\"" || exit 1
- fi
- echo "${tmp}"
-}
+list_set ARGS "-DMAIN__=user_main" "-Diargc_=smpi_process_argc" "-Dgetarg_=smpi_process_getarg"
+list_set LINKARGS "-L@F2C_LIBRARY_PATH@" "-lf2c" "-lm"
+list_set SRCFILES
-while [ -n "$1" ]; do
- ARG="$1"
- shift
- case "${ARG}" in
- *.f)
- SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
- if [ -z "$SRCFILE" ] ; then
- SRCFILE="$ARG"
- fi
- SRCFILES+="${SRCFILE}"
- ;;
- *)
- if [ "${ARG}" = "-c" ]; then
- LINKARGS=""
- fi
- ARGS="${ARGS} ${ARG}"
- ;;
- esac
+while [ $# -gt 0 ]; do
+ ARG="$1"
+ shift
+ case "${ARG}" in
+ *.f)
+ SRCFILE="$(readlink -f ${ARG} 2>/dev/null)"
+ if [ -z "$SRCFILE" ] ; then
+ SRCFILE="$ARG"
+ fi
+ list_add SRCFILES "${SRCFILE}"
+ ;;
+ *)
+ if [ "${ARG}" = "-c" ]; then
+ LINKARGS=""
+ fi
+ list_add ARGS "${ARG}"
+ ;;
+ esac
done
-ARGS="${ARGS} ${LINKARGS}"
+list_add_not_empty ARGS "${LINKARGS}"
+
+build () {
+ local SRCFILE
+ SRCFILE="$1"
+ TMPFILE=$(mymktemp "${SRCFILE}" ".f")
+ CFILE="${TMPFILE%.f}.c"
+
+ eval $(list_get ARGS)
+
+ cp "${SRCFILE}" "${TMPFILE}" \
+ && "$smpif2c" "${TMPFILE}" \
+ && "$smpicc" "$@" "${CFILE}" \
+ && rm -f "${CFILE}" \
+ && rm -f "${TMPFILE}" \
+ || exit $?
+
+ # When the file is compiled with "-c" and no output file is specified with
+ # "-o", rename the output. FIXME: do it properly.
+ if [ -f "${CFILE%.c}.o" ]; then
+ mv "${CFILE%.c}.o" "${SRCFILE%.f}.o"
+ fi
+}
-if [ -n "${SRCFILES}" ]
-then
- for SRCFILE in "${SRCFILES[@]}"
- do
- TMPFILE=$(mymktemp "${SRCFILE}" ".f")
- cp ${SRCFILE} ${TMPFILE}
- CFILE="${TMPFILE%.f}.c"
- #echo "$prefix/bin/smpif2c ${TMPFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE} && rm ${CFILE} && rm ${TMPFILE}"
- $prefix/bin/smpif2c ${TMPFILE} && $prefix/bin/smpicc ${ARGS} ${CFILE} && rm ${CFILE} && rm ${TMPFILE} || exit $?
- # When the file is compiled with "-c" and no output file is specified with
- # "-o", rename the output. FIXME: do it properly.
- if [ -f ${CFILE%.c}.o ]; then
- mv ${CFILE%.c}.o ${SRCFILE%.f}.o
- fi
- done
+if [ -n "${SRCFILES}" ]; then
+ eval $(list_get SRCFILES)
+ for SRCFILE in "$@"; do
+ build "$SRCFILE"
+ done
else
- #echo "$prefix/bin/smpicc ${ARGS}"
- $prefix/bin/smpicc ${ARGS}
+ eval $(list_get ARGS)
+ "$smpicc" "$@"
fi
-#! /usr/bin/env bash
+#! /bin/sh
+
+# Copyright (c) 2007-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
@CMAKE_SMPI_COMMAND@
SIMOPTS="--cfg=maxmin/precision:1e-9 --cfg=network/model:SMPI --cfg=network/TCP_gamma:4194304"
#usage to print the way this script should be called
-function usage () {
+usage () {
cat <<EOF
Usage: $0 [OPTIONS] -platform <xmldesc> -hostfile <hostfile> program [program-options]
Options:
-trace-comment-file <file> # put file contents on the top of the trace file as comment
-trace-grouped # group MPI processes by location
-trace-resource # trace resource utilization
- -trace-viva # generate configuration for Viva's GraphView
+ -trace-viva # generate configuration for Viva's GraphView
-trace-file <tracefile> # name of the tracefile (simgrid_smpi.trace)
-ext <value> # additional parameter (reserved)
EXTOPT=""
WRAPPER=""
+HOSTFILE=""
while true; do
case "$1" in
shift 2
;;
+ "-machinefile")
+ HOSTFILE="$2"
+ if [ ! -f "${HOSTFILE}" ]; then
+ echo "[$0] ** error: the file '${HOSTFILE}' does not exist. Aborting."
+ exit 1
+ fi
+ shift 2
+ ;;
+
"-ext")
EXTOPT="$2"
shift 2
##-----------------------------------
-# Basic checks on the provided arguments
-if [ -z "${EXEC}" ] ; then
- echo "You must provide a program to execute."
- usage
- exit 1
-fi
if [ -z "${HOSTFILE}" ] && [ -z "${PLATFORM}" ] ; then
echo "No hostfile nor platform specified."
HOSTFILE="$(mktemp tmphostXXXXXX)"
perl -ne 'print "$1\n" if /.*<host.*?id="(.*?)".*?\/>.*/' ${PLATFORM} > ${HOSTFILE}
fi
+UNROLLEDHOSTFILETMP=0
+
+#parse if our lines are terminated by :num_process
+multiple_processes=`grep -c ":" $HOSTFILE`
+if [ "${multiple_processes}" -gt 0 ] ; then
+ UNROLLEDHOSTFILETMP=1
+ UNROLLEDHOSTFILE="$(mktemp tmphostXXXXXX)"
+ perl -ne ' do{ for ( 1 .. $2 ) { print "$1\n" } } if /(.*?):(\d+).*/' ${HOSTFILE} > ${UNROLLEDHOSTFILE}
+ if [ ${HOSTFILETMP} = 1 ] ; then
+ rm ${HOSTFILE}
+ HOSTFILETMP=0
+ fi
+ HOSTFILE=$UNROLLEDHOSTFILE
+fi
+
# Don't use wc -l to compute it to avoid issues with trailing \n at EOF
hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE`
<AS id="AS0" routing="Full">
PLATFORMHEAD
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
+i=${NUMPROCS}
+while [ $i -gt 0 ]; do
echo " <host id=\"host$i\" power=\"${POWER}\"/>" >> ${PLATFORMTMP}
echo " <link id=\"loop$i\" bandwidth=\"${LOOPBACK_BANDWIDTH}\" latency=\"${LOOPBACK_LATENCY}\"/>" >> ${PLATFORMTMP}
echo " <link id=\"link$i\" bandwidth=\"${NETWORK_BANDWIDTH}\" latency=\"${NETWORK_LATENCY}\"/>" >> ${PLATFORMTMP}
+ i=$((i - 1))
done
-for (( i=${NUMPROCS}; $i ; i=$i-1 )) do
- for (( j=${NUMPROCS}; $j ; j=$j-1 )) do
+i=${NUMPROCS}
+while [ $i -gt 0 ]; do
+ j=${NUMPROCS}
+ while [ $j -gt 0 ]; do
if [ $i -eq $j ]; then
echo " <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"loop$i\"/></route>" >> ${PLATFORMTMP}
else
echo " <route src=\"host$i\" dst=\"host$j\"><link_ctn id=\"link$i\"/><link_ctn id=\"link$j\"/></route>" >> ${PLATFORMTMP}
fi
+ j=$((j - 1))
done
+ i=$((i - 1))
done
cat >> ${PLATFORMTMP} <<PLATFORMFOOT
##---- cache hostnames of hostfile---------------
if [ -n "${HOSTFILE}" ] && [ -f ${HOSTFILE} ]; then
- hostnames=(`cat ${HOSTFILE} | tr \\\n " "`)
- NUMHOSTS=`cat ${HOSTFILE} | wc -l`
+ hostnames=$(cat ${HOSTFILE} | tr '\n\r' ' ')
+ NUMHOSTS=$(cat ${HOSTFILE} | wc -l)
fi
if [ "${EXTOPT}" = "smpi_replay" ]; then
APP_TRACES=$PROC_ARGS
if [ -n "${APP_TRACES}" ] && [ -f "${APP_TRACES}" ]; then
- hosttraces=(`cat ${APP_TRACES} | tr \\\n " "`)
- NUMTRACES=`cat ${APP_TRACES} | wc -l`
+ hosttraces=$(cat ${APP_TRACES} | tr '\n\r' ' ' )
+ NUMTRACES=$(cat ${APP_TRACES} | wc -l)
else
printf "File not found: %s\n", "${APP_TRACES:-\${APP_TRACES\}}" >&2
exit 1
for i in ${SEQ}
do
if [ -n "${HOSTFILE}" ]; then
- j=$(( $i % ${NUMHOSTS} ))
+ j=$(( $i % ${NUMHOSTS} + 1 ))
fi
##---- optional display of ranks to process mapping
if [ -n "${MAPOPT}" ]; then
- echo "[rank $i] -> ${hostnames[$j]}"
+ echo "[rank $i] -> $(echo $hostnames|cut -d' ' -f$j)"
fi
- if [ -z "${hostnames[$j]}" ]; then
- host="host"$(($j+1))
+ if [ -z "$(echo $hostnames|cut -d' ' -f$j)" ]; then
+ host="host"$($j)
else
- host="${hostnames[$j]}"
+ host="$(echo $hostnames|cut -d' ' -f$j)"
fi
echo " <process host=\"${host}\" function=\"$i\"> <!-- function name used only for logging -->" >> ${APPLICATIONTMP}
echo " <argument value=\"$i\"/> <!-- rank -->" >> ${APPLICATIONTMP}
if [ "${EXTOPT}" = "smpi_replay" ]; then
if [ ${NUMTRACES} -gt 1 ]; then
- echo " <argument value=\"${hosttraces[$j]}\"/>" >> ${APPLICATIONTMP}
+ echo " <argument value=\"$(echo $hosttraces|cut -d' ' -f$j)\"/>" >> ${APPLICATIONTMP}
else
- echo " <argument value=\"${hosttraces[0]}\"/>" >> ${APPLICATIONTMP}
+ echo " <argument value=\"$(echo $hosttraces|cut -d' ' -f1)\"/>" >> ${APPLICATIONTMP}
fi
else
for ARG in $PROC_ARGS; do
if [ ${HOSTFILETMP} = 1 ] ; then
echo "Generated hostfile ${HOSTFILE} keeped."
fi
+ if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
+ echo "Generated unrolled hostfile ${UNROLLEDHOSTFILE} keeped."
+ fi
fi
${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP}
status=$?
+if [ ${status} = 139 ]; then echo "ERROR: A segmentation fault was triggered.
+A common cause in SimGrid may be the use of a too small stack size for the simulated processes (default 128KiB).
+Please see contexts/stack_size parameter , or http://simgrid.org/simgrid/latest/doc/options.html#options_virt_stacksize "; fi
+
if [ -z "${KEEP}" ] ; then
if [ -z "${PLATFORM}" ]; then
rm ${PLATFORMTMP}
if [ ${HOSTFILETMP} = 1 ] ; then
rm ${HOSTFILE}
fi
+ if [ ${UNROLLEDHOSTFILETMP} = 1 ] ; then
+ rm ${UNROLLEDHOSTFILE}
+ fi
rm ${APPLICATIONTMP}
fi
--- /dev/null
+#!/bin/sh
+#---- smpitools.sh --------------------------------------------------------#
+
+# Copyright (c) 2013-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+SAVEIFS="$IFS"
+LISTSEP="$(printf '\b')"
+
+# Create a temporary file, with its name of the form $1_XXX$2, where XXX is
+# replaced by an unique string.
+# $1: prefix, $2: suffix
+mymktemp () {
+ tmp=$(mktemp --suffix="$2" "$1_XXXXXXXXXX" 2> /dev/null)
+ if [ -z "$tmp" ]; then
+ # mktemp failed (unsupported --suffix ?), try unsafe mode
+ tmp=$(mktemp -u "$1_XXXXXXXXXX" 2> /dev/null)
+ if [ -z "$tmp" ]; then
+ # mktemp failed again (doesn't exist ?), try very unsafe mode
+ if [ -z "${mymktemp_seq}" ]; then
+ mymktemp_seq=$(date +%d%H%M%S)
+ fi
+ tmp="$1_$$x${mymktemp_seq}"
+ mymktemp_seq=$((mymktemp_seq + 1))
+ fi
+ tmp="${tmp}$2"
+ # create temp file, and exit if it existed before
+ sh -C -c "true > \"${tmp}\"" || exit 1
+ fi
+ echo "${tmp}"
+}
+
+# Add a word to the end of a list (words separated by LISTSEP)
+# $1: list, $2...: words to add
+list_add () {
+ local list content newcontent
+ list="$1"
+ shift
+ if [ $# -gt 0 ]; then
+ eval content=\"\${$list}\"
+ IFS="$LISTSEP"
+ newcontent="$*"
+ IFS="$SAVEIFS"
+ if [ -z "$content" ]; then
+ content="$newcontent"
+ else
+ content="$content${LISTSEP}$newcontent"
+ fi
+ eval $list=\"\${content}\"
+ fi
+}
+
+# Like list_add, but only if first word to add ($2) is not empty
+list_add_not_empty () {
+ if [ -n "$2" ]; then
+ list_add "$@"
+ fi
+}
+
+# Set contents of a list (words separated by LISTSEP)
+# $1: list, $2...: words to set
+list_set () {
+ eval $1=""
+ list_add "$@"
+}
+
+# Get the content of a list: positional parameters ($1, $2, ...) are set to the
+# content of the list
+# $1: list
+# usage: eval $(list_get list)
+list_get () {
+ printf 'IFS="$LISTSEP"; eval set -- \\$%s; IFS="$SAVEIFS"' "$1"
+}
+
+#---- end of smpitools.sh -------------------------------------------------#
+++ /dev/null
-/* Copyright (c) 2009-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "surf_private.h"
-#include "surf/surf_resource.h"
-#include "maxmin_private.h"
-#include "simgrid/sg_config.h"
-#include "cpu_cas01_private.h"
-
-#include "string.h"
-#include "stdlib.h"
-
-surf_model_t surf_cpu_model = NULL;
-
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu, surf,
- "Logging specific to the SURF CPU IMPROVED module");
-
-static xbt_swag_t
- cpu_running_action_set_that_does_not_need_being_checked = NULL;
-
-/* Additionnal callback function to cleanup some data, called from surf_resource_free */
-
-static void cpu_cas01_cleanup(void* r){
- cpu_Cas01_t cpu = (cpu_Cas01_t)r;
- unsigned int iter;
- xbt_dynar_t power_tuple = NULL;
- xbt_dynar_foreach(cpu->energy->power_range_watts_list, iter, power_tuple)
- xbt_dynar_free(&power_tuple);
- xbt_dynar_free(&cpu->energy->power_range_watts_list);
- xbt_dynar_free(&cpu->power_peak_list);
- xbt_free(cpu->energy);
- return;
-}
-
-/* This function is registered as a callback to sg_platf_new_host() and never called directly */
-static void *cpu_create_resource(const char *name, xbt_dynar_t power_peak,
- int pstate,
- double power_scale,
- tmgr_trace_t power_trace,
- int core,
- e_surf_resource_state_t state_initial,
- tmgr_trace_t state_trace,
- xbt_dict_t cpu_properties)
-{
- cpu_Cas01_t cpu = NULL;
-
- xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
- "Host '%s' declared several times in the platform file",
- name);
- cpu = (cpu_Cas01_t) surf_resource_new(sizeof(s_cpu_Cas01_t),
- surf_cpu_model, name,
- cpu_properties, &cpu_cas01_cleanup);
- cpu->power_peak = xbt_dynar_get_as(power_peak, pstate, double);
- cpu->power_peak_list = power_peak;
- cpu->pstate = pstate;
-
- cpu->energy = xbt_new(s_energy_cpu_cas01_t, 1);
- cpu->energy->total_energy = 0;
- cpu->energy->power_range_watts_list = cpu_get_watts_range_list(cpu);
- cpu->energy->last_updated = surf_get_clock();
-
- XBT_DEBUG("CPU create: peak=%f, pstate=%d",cpu->power_peak, cpu->pstate);
-
- xbt_assert(cpu->power_peak > 0, "Power has to be >0");
- cpu->power_scale = power_scale;
- cpu->core = core;
- xbt_assert(core > 0, "Invalid number of cores %d", core);
-
- if (power_trace)
- cpu->power_event =
- tmgr_history_add_trace(history, power_trace, 0.0, 0, cpu);
-
- cpu->state_current = state_initial;
- if (state_trace)
- cpu->state_event =
- tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu);
-
- cpu->constraint =
- lmm_constraint_new(surf_cpu_model->model_private->maxmin_system, cpu,
- cpu->core * cpu->power_scale * cpu->power_peak);
-
- xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu);
-
- return xbt_lib_get_elm_or_null(host_lib, name);;
-}
-
-
-static void parse_cpu_init(sg_platf_host_cbarg_t host)
-{
- cpu_create_resource(host->id,
- host->power_peak,
- host->pstate,
- host->power_scale,
- host->power_trace,
- host->core_amount,
- host->initial_state,
- host->state_trace, host->properties);
-}
-
-static void cpu_add_traces_cpu(void)
-{
- xbt_dict_cursor_t cursor = NULL;
- char *trace_name, *elm;
- static int called = 0;
- if (called)
- return;
- called = 1;
-
- /* connect all traces relative to hosts */
- xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- cpu_Cas01_t host = surf_cpu_resource_by_name(elm);
-
- xbt_assert(host, "Host %s undefined", elm);
- xbt_assert(trace, "Trace %s undefined", trace_name);
-
- host->state_event =
- tmgr_history_add_trace(history, trace, 0.0, 0, host);
- }
-
- xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- cpu_Cas01_t host = surf_cpu_resource_by_name(elm);
-
- xbt_assert(host, "Host %s undefined", elm);
- xbt_assert(trace, "Trace %s undefined", trace_name);
-
- host->power_event =
- tmgr_history_add_trace(history, trace, 0.0, 0, host);
- }
-}
-
-static void cpu_define_callbacks()
-{
- sg_platf_host_add_cb(parse_cpu_init);
- sg_platf_postparse_add_cb(cpu_add_traces_cpu);
-}
-
-static int cpu_resource_used(void *resource)
-{
- return lmm_constraint_used(surf_cpu_model->model_private->maxmin_system,
- ((cpu_Cas01_t) resource)->constraint);
-}
-
-static double cpu_share_resources_lazy(double now)
-{
- return generic_share_resources_lazy(now, surf_cpu_model);
-}
-
-static double cpu_share_resources_full(double now)
-{
- s_surf_action_cpu_Cas01_t action;
- return generic_maxmin_share_resources(surf_cpu_model->states.
- running_action_set,
- xbt_swag_offset(action,
- generic_lmm_action.
- variable),
- surf_cpu_model->model_private->maxmin_system, lmm_solve);
-}
-
-static void cpu_update_actions_state_lazy(double now, double delta)
-{
- generic_update_actions_state_lazy(now, delta, surf_cpu_model);
-}
-
-static void cpu_update_actions_state_full(double now, double delta)
-{
- generic_update_actions_state_full(now, delta, surf_cpu_model);
-}
-
-xbt_dynar_t cpu_get_watts_range_list(cpu_Cas01_t cpu_model)
-{
- xbt_dynar_t power_range_list;
- xbt_dynar_t power_tuple;
- int i = 0, pstate_nb=0;
- xbt_dynar_t current_power_values;
- double min_power, max_power;
- xbt_dict_t props = cpu_model->generic_resource.properties;
-
- if (props == NULL)
- return NULL;
-
- char* all_power_values_str = xbt_dict_get_or_null(props, "power_per_state");
-
- if (all_power_values_str == NULL)
- return NULL;
-
-
- power_range_list = xbt_dynar_new(sizeof(xbt_dynar_t), NULL);
- xbt_dynar_t all_power_values = xbt_str_split(all_power_values_str, ",");
-
- pstate_nb = xbt_dynar_length(all_power_values);
- for (i=0; i< pstate_nb; i++)
- {
- /* retrieve the power values associated with the current pstate */
- current_power_values = xbt_str_split(xbt_dynar_get_as(all_power_values, i, char*), ":");
- xbt_assert(xbt_dynar_length(current_power_values) > 1,
- "Power properties incorrectly defined - could not retrieve min and max power values for host %s",
- cpu_model->generic_resource.name);
-
- /* min_power corresponds to the idle power (cpu load = 0) */
- /* max_power is the power consumed at 100% cpu load */
- min_power = atof(xbt_dynar_get_as(current_power_values, 0, char*));
- max_power = atof(xbt_dynar_get_as(current_power_values, 1, char*));
-
- power_tuple = xbt_dynar_new(sizeof(double), NULL);
- xbt_dynar_push_as(power_tuple, double, min_power);
- xbt_dynar_push_as(power_tuple, double, max_power);
-
- xbt_dynar_push_as(power_range_list, xbt_dynar_t, power_tuple);
- xbt_dynar_free(¤t_power_values);
- }
- xbt_dynar_free(&all_power_values);
- return power_range_list;
-
-}
-
-/**
- * Computes the power consumed by the host according to the current pstate and processor load
- *
- */
-static double cpu_get_current_watts_value(cpu_Cas01_t cpu_model, double cpu_load)
-{
- xbt_dynar_t power_range_list = cpu_model->energy->power_range_watts_list;
-
- if (power_range_list == NULL)
- {
- XBT_DEBUG("No power range properties specified for host %s", cpu_model->generic_resource.name);
- return 0;
- }
- xbt_assert(xbt_dynar_length(power_range_list) == xbt_dynar_length(cpu_model->power_peak_list),
- "The number of power ranges in the properties does not match the number of pstates for host %s",
- cpu_model->generic_resource.name);
-
- /* retrieve the power values associated with the current pstate */
- xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, cpu_model->pstate, xbt_dynar_t);
-
- /* min_power corresponds to the idle power (cpu load = 0) */
- /* max_power is the power consumed at 100% cpu load */
- double min_power = xbt_dynar_get_as(current_power_values, 0, double);
- double max_power = xbt_dynar_get_as(current_power_values, 1, double);
- double power_slope = max_power - min_power;
-
- double current_power = min_power + cpu_load * power_slope;
-
- XBT_DEBUG("[get_current_watts] min_power=%f, max_power=%f, slope=%f", min_power, max_power, power_slope);
- XBT_DEBUG("[get_current_watts] Current power (watts) = %f, load = %f", current_power, cpu_load);
-
- return current_power;
-
-}
-
-/**
- * Updates the total energy consumed as the sum of the current energy and
- * the energy consumed by the current action
- */
-void cpu_update_energy(cpu_Cas01_t cpu_model, double cpu_load)
-{
-
- double start_time = cpu_model->energy->last_updated;
- double finish_time = surf_get_clock();
-
- XBT_DEBUG("[cpu_update_energy] action time interval=(%f-%f), current power peak=%f, current pstate=%d",
- start_time, finish_time, cpu_model->power_peak, cpu_model->pstate);
- double current_energy = cpu_model->energy->total_energy;
- double action_energy = cpu_get_current_watts_value(cpu_model, cpu_load)*(finish_time-start_time);
-
- cpu_model->energy->total_energy = current_energy + action_energy;
- cpu_model->energy->last_updated = finish_time;
-
- XBT_DEBUG("[cpu_update_energy] old_energy_value=%f, action_energy_value=%f", current_energy, action_energy);
-
-}
-
-static void cpu_update_resource_state(void *id,
- tmgr_trace_event_t event_type,
- double value, double date)
-{
- cpu_Cas01_t cpu = id;
- lmm_variable_t var = NULL;
- lmm_element_t elem = NULL;
-
- if (event_type == cpu->power_event) {
- cpu->power_scale = value;
- lmm_update_constraint_bound(surf_cpu_model->model_private->maxmin_system, cpu->constraint,
- cpu->core * cpu->power_scale *
- cpu->power_peak);
-#ifdef HAVE_TRACING
- TRACE_surf_host_set_power(date, cpu->generic_resource.name,
- cpu->core * cpu->power_scale *
- cpu->power_peak);
-#endif
- while ((var = lmm_get_var_from_cnst
- (surf_cpu_model->model_private->maxmin_system, cpu->constraint, &elem))) {
- surf_action_cpu_Cas01_t action = lmm_variable_id(var);
- lmm_update_variable_bound(surf_cpu_model->model_private->maxmin_system,
- GENERIC_LMM_ACTION(action).variable,
- cpu->power_scale * cpu->power_peak);
- }
- if (tmgr_trace_event_free(event_type))
- cpu->power_event = NULL;
- } else if (event_type == cpu->state_event) {
- if (value > 0) {
- if(cpu->state_current == SURF_RESOURCE_OFF)
- xbt_dynar_push_as(host_that_restart, char*, (cpu->generic_resource.name));
- cpu->state_current = SURF_RESOURCE_ON;
- } else {
- lmm_constraint_t cnst = cpu->constraint;
-
- cpu->state_current = SURF_RESOURCE_OFF;
-
- while ((var = lmm_get_var_from_cnst(surf_cpu_model->model_private->maxmin_system, cnst, &elem))) {
- surf_action_t action = lmm_variable_id(var);
-
- if (surf_action_state_get(action) == SURF_ACTION_RUNNING ||
- surf_action_state_get(action) == SURF_ACTION_READY ||
- surf_action_state_get(action) ==
- SURF_ACTION_NOT_IN_THE_SYSTEM) {
- action->finish = date;
- surf_action_state_set(action, SURF_ACTION_FAILED);
- }
- }
- }
- if (tmgr_trace_event_free(event_type))
- cpu->state_event = NULL;
- } else {
- XBT_CRITICAL("Unknown event ! \n");
- xbt_abort();
- }
-
- return;
-}
-
-static surf_action_t cpu_execute(void *cpu, double size)
-{
- surf_action_cpu_Cas01_t action = NULL;
- //xbt_dict_cursor_t cursor = NULL;
- cpu_Cas01_t CPU = surf_cpu_resource_priv(cpu);
- //xbt_dict_t props = CPU->generic_resource.properties;
-
- XBT_IN("(%s,%g)", surf_resource_name(CPU), size);
- action =
- surf_action_new(sizeof(s_surf_action_cpu_Cas01_t), size,
- surf_cpu_model,
- CPU->state_current != SURF_RESOURCE_ON);
-
- GENERIC_LMM_ACTION(action).suspended = 0; /* Should be useless because of the
- calloc but it seems to help valgrind... */
-
- GENERIC_LMM_ACTION(action).variable =
- lmm_variable_new(surf_cpu_model->model_private->maxmin_system, action,
- GENERIC_ACTION(action).priority,
- CPU->power_scale * CPU->power_peak, 1);
- if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {
- GENERIC_LMM_ACTION(action).index_heap = -1;
- GENERIC_LMM_ACTION(action).last_update = surf_get_clock();
- GENERIC_LMM_ACTION(action).last_value = 0.0;
- }
-
- lmm_expand(surf_cpu_model->model_private->maxmin_system, CPU->constraint,
- GENERIC_LMM_ACTION(action).variable, 1.0);
- XBT_OUT();
- return (surf_action_t) action;
-}
-
-static surf_action_t cpu_action_sleep(void *cpu, double duration)
-{
- surf_action_cpu_Cas01_t action = NULL;
-
- if (duration > 0)
- duration = MAX(duration, MAXMIN_PRECISION);
-
- XBT_IN("(%s,%g)", surf_resource_name(surf_cpu_resource_priv(cpu)), duration);
- action = (surf_action_cpu_Cas01_t) cpu_execute(cpu, 1.0);
- // FIXME: sleep variables should not consume 1.0 in lmm_expand
- GENERIC_ACTION(action).max_duration = duration;
- GENERIC_LMM_ACTION(action).suspended = 2;
- if (duration == NO_MAX_DURATION) {
- /* Move to the *end* of the corresponding action set. This convention
- is used to speed up update_resource_state */
- xbt_swag_remove(action, ((surf_action_t) action)->state_set);
- ((surf_action_t) action)->state_set =
- cpu_running_action_set_that_does_not_need_being_checked;
- xbt_swag_insert(action, ((surf_action_t) action)->state_set);
- }
-
- lmm_update_variable_weight(surf_cpu_model->model_private->maxmin_system,
- GENERIC_LMM_ACTION(action).variable, 0.0);
- if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) { // remove action from the heap
- surf_action_lmm_heap_remove(surf_cpu_model->model_private->action_heap,(surf_action_lmm_t)action);
- // this is necessary for a variable with weight 0 since such
- // variables are ignored in lmm and we need to set its max_duration
- // correctly at the next call to share_resources
- xbt_swag_insert_at_head(action,surf_cpu_model->model_private->modified_set);
- }
-
- XBT_OUT();
- return (surf_action_t) action;
-}
-
-static e_surf_resource_state_t cpu_get_state(void *cpu)
-{
- return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->state_current;
-}
-
-static double cpu_get_speed(void *cpu, double load)
-{
- return load * ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak;
-}
-
-static int cpu_get_core(void *cpu)
-{
- return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->core;
-}
-
-
-static double cpu_get_available_speed(void *cpu)
-{
- /* number between 0 and 1 */
- return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_scale;
-}
-
-static double cpu_get_current_power_peak(void *cpu)
-{
- return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak;
-}
-
-static double cpu_get_power_peak_at(void *cpu, int pstate_index)
-{
- xbt_dynar_t plist = ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak_list;
- xbt_assert((pstate_index <= xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
-
- return xbt_dynar_get_as(plist, pstate_index, double);
-}
-
-static int cpu_get_nb_pstates(void *cpu)
-{
- return xbt_dynar_length(((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->power_peak_list);
-}
-
-static void cpu_set_power_peak_at(void *cpu, int pstate_index)
-{
- cpu_Cas01_t cpu_implem = (cpu_Cas01_t)surf_cpu_resource_priv(cpu);
- xbt_dynar_t plist = cpu_implem->power_peak_list;
- xbt_assert((pstate_index <= xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
-
- double new_power_peak = xbt_dynar_get_as(plist, pstate_index, double);
- cpu_implem->pstate = pstate_index;
- cpu_implem->power_peak = new_power_peak;
-}
-
-static double cpu_get_consumed_energy(void *cpu)
-{
- return ((cpu_Cas01_t)surf_cpu_resource_priv(cpu))->energy->total_energy;
-}
-
-static void cpu_finalize(void)
-{
- lmm_system_free(surf_cpu_model->model_private->maxmin_system);
- surf_cpu_model->model_private->maxmin_system = NULL;
-
- if (surf_cpu_model->model_private->action_heap)
- xbt_heap_free(surf_cpu_model->model_private->action_heap);
- xbt_swag_free(surf_cpu_model->model_private->modified_set);
-
- surf_model_exit(surf_cpu_model);
- surf_cpu_model = NULL;
-
- xbt_swag_free(cpu_running_action_set_that_does_not_need_being_checked);
- cpu_running_action_set_that_does_not_need_being_checked = NULL;
-}
-
-static void surf_cpu_model_init_internal()
-{
- s_surf_action_t action;
- s_surf_action_cpu_Cas01_t comp;
-
- char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
- int select =
- xbt_cfg_get_boolean(_sg_cfg_set, "cpu/maxmin_selective_update");
-
- surf_cpu_model = surf_model_init();
-
- if (!strcmp(optim, "Full")) {
- surf_cpu_model->model_private->update_mechanism = UM_FULL;
- surf_cpu_model->model_private->selective_update = select;
- } else if (!strcmp(optim, "Lazy")) {
- surf_cpu_model->model_private->update_mechanism = UM_LAZY;
- surf_cpu_model->model_private->selective_update = 1;
- xbt_assert((select == 1)
- ||
- (xbt_cfg_is_default_value
- (_sg_cfg_set, "cpu/maxmin_selective_update")),
- "Disabling selective update while using the lazy update mechanism is dumb!");
- } else {
- xbt_die("Unsupported optimization (%s) for this model", optim);
- }
-
- cpu_running_action_set_that_does_not_need_being_checked =
- xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
- surf_cpu_model->name = "cpu";
-
- surf_cpu_model->action_unref = surf_action_unref;
- surf_cpu_model->action_cancel = surf_action_cancel;
- surf_cpu_model->action_state_set = surf_action_state_set;
-
- surf_cpu_model->model_private->resource_used = cpu_resource_used;
-
- if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {
- surf_cpu_model->model_private->share_resources =
- cpu_share_resources_lazy;
- surf_cpu_model->model_private->update_actions_state =
- cpu_update_actions_state_lazy;
- } else if (surf_cpu_model->model_private->update_mechanism == UM_FULL) {
- surf_cpu_model->model_private->share_resources =
- cpu_share_resources_full;
- surf_cpu_model->model_private->update_actions_state =
- cpu_update_actions_state_full;
- } else
- xbt_die("Invalid cpu update mechanism!");
-
- surf_cpu_model->model_private->update_resource_state =
- cpu_update_resource_state;
- surf_cpu_model->model_private->finalize = cpu_finalize;
-
- surf_cpu_model->suspend = surf_action_suspend;
- surf_cpu_model->resume = surf_action_resume;
- surf_cpu_model->is_suspended = surf_action_is_suspended;
- surf_cpu_model->set_max_duration = surf_action_set_max_duration;
- surf_cpu_model->set_priority = surf_action_set_priority;
-#ifdef HAVE_TRACING
- surf_cpu_model->set_category = surf_action_set_category;
-#endif
- surf_cpu_model->get_remains = surf_action_get_remains;
-
- surf_cpu_model->extension.cpu.execute = cpu_execute;
- surf_cpu_model->extension.cpu.sleep = cpu_action_sleep;
-
- surf_cpu_model->extension.cpu.get_state = cpu_get_state;
- surf_cpu_model->extension.cpu.get_core = cpu_get_core;
- surf_cpu_model->extension.cpu.get_speed = cpu_get_speed;
- surf_cpu_model->extension.cpu.get_available_speed =
- cpu_get_available_speed;
- surf_cpu_model->extension.cpu.get_current_power_peak = cpu_get_current_power_peak;
- surf_cpu_model->extension.cpu.get_power_peak_at = cpu_get_power_peak_at;
- surf_cpu_model->extension.cpu.get_nb_pstates = cpu_get_nb_pstates;
- surf_cpu_model->extension.cpu.set_power_peak_at = cpu_set_power_peak_at;
- surf_cpu_model->extension.cpu.get_consumed_energy = cpu_get_consumed_energy;
-
- surf_cpu_model->extension.cpu.add_traces = cpu_add_traces_cpu;
-
- if (!surf_cpu_model->model_private->maxmin_system) {
- surf_cpu_model->model_private->maxmin_system = lmm_system_new(surf_cpu_model->model_private->selective_update);
- }
- if (surf_cpu_model->model_private->update_mechanism == UM_LAZY) {
- surf_cpu_model->model_private->action_heap = xbt_heap_new(8, NULL);
- xbt_heap_set_update_callback(surf_cpu_model->model_private->action_heap,
- surf_action_lmm_update_index_heap);
- surf_cpu_model->model_private->modified_set =
- xbt_swag_new(xbt_swag_offset(comp, generic_lmm_action.action_list_hookup));
- surf_cpu_model->model_private->maxmin_system->keep_track = surf_cpu_model->model_private->modified_set;
- }
-}
-
-/*********************************************************************/
-/* Basic sharing model for CPU: that is where all this started... ;) */
-/*********************************************************************/
-/* @InProceedings{casanova01simgrid, */
-/* author = "H. Casanova", */
-/* booktitle = "Proceedings of the IEEE Symposium on Cluster Computing */
-/* and the Grid (CCGrid'01)", */
-/* publisher = "IEEE Computer Society", */
-/* title = "Simgrid: {A} Toolkit for the Simulation of Application */
-/* Scheduling", */
-/* year = "2001", */
-/* month = may, */
-/* note = "Available at */
-/* \url{http://grail.sdsc.edu/papers/simgrid_ccgrid01.ps.gz}." */
-/* } */
-
-void surf_cpu_model_init_Cas01()
-{
- char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
-
- if (surf_cpu_model)
- return;
-
- if (!strcmp(optim, "TI")) {
- surf_cpu_model_init_ti();
- return;
- }
-
- surf_cpu_model_init_internal();
- cpu_define_callbacks();
- xbt_dynar_push(model_list, &surf_cpu_model);
-}
--- /dev/null
+/* Copyright (c) 2009-2011, 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "cpu_cas01.hpp"
+#include "cpu_ti.hpp"
+#include "plugins/energy.hpp"
+#include "maxmin_private.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_cas, surf_cpu,
+ "Logging specific to the SURF CPU IMPROVED module");
+
+/*************
+ * CallBacks *
+ *************/
+
+static void parse_cpu_init(sg_platf_host_cbarg_t host){
+ ((CpuCas01ModelPtr)surf_cpu_model_pm)->parseInit(host);
+}
+
+static void cpu_add_traces_cpu(){
+ surf_cpu_model_pm->addTraces();
+}
+
+static void cpu_define_callbacks()
+{
+ sg_platf_host_add_cb(parse_cpu_init);
+ sg_platf_postparse_add_cb(cpu_add_traces_cpu);
+}
+
+/*********
+ * Model *
+ *********/
+void surf_cpu_model_init_Cas01()
+{
+ char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
+
+ xbt_assert(!surf_cpu_model_pm);
+ xbt_assert(!surf_cpu_model_vm);
+
+ if (!strcmp(optim, "TI")) {
+ surf_cpu_model_init_ti();
+ return;
+ }
+
+ surf_cpu_model_pm = new CpuCas01Model();
+ surf_cpu_model_vm = new CpuCas01Model();
+
+ cpu_define_callbacks();
+ ModelPtr model_pm = static_cast<ModelPtr>(surf_cpu_model_pm);
+ ModelPtr model_vm = static_cast<ModelPtr>(surf_cpu_model_vm);
+ xbt_dynar_push(model_list, &model_pm);
+ xbt_dynar_push(model_list, &model_vm);
+}
+
+CpuCas01Model::CpuCas01Model() : CpuModel("cpu")
+{
+ char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
+ int select = xbt_cfg_get_boolean(_sg_cfg_set, "cpu/maxmin_selective_update");
+
+ if (!strcmp(optim, "Full")) {
+ p_updateMechanism = UM_FULL;
+ m_selectiveUpdate = select;
+ } else if (!strcmp(optim, "Lazy")) {
+ p_updateMechanism = UM_LAZY;
+ m_selectiveUpdate = 1;
+ xbt_assert((select == 1)
+ ||
+ (xbt_cfg_is_default_value
+ (_sg_cfg_set, "cpu/maxmin_selective_update")),
+ "Disabling selective update while using the lazy update mechanism is dumb!");
+ } else {
+ xbt_die("Unsupported optimization (%s) for this model", optim);
+ }
+
+ p_cpuRunningActionSetThatDoesNotNeedBeingChecked = new ActionList();
+
+ if (getUpdateMechanism() == UM_LAZY) {
+ shareResources = &CpuCas01Model::shareResourcesLazy;
+ updateActionsState = &CpuCas01Model::updateActionsStateLazy;
+
+ } else if (getUpdateMechanism() == UM_FULL) {
+ shareResources = &CpuCas01Model::shareResourcesFull;
+ updateActionsState = &CpuCas01Model::updateActionsStateFull;
+ } else
+ xbt_die("Invalid cpu update mechanism!");
+
+ if (!p_maxminSystem) {
+ p_maxminSystem = lmm_system_new(m_selectiveUpdate);
+ }
+
+ if (getUpdateMechanism() == UM_LAZY) {
+ p_actionHeap = xbt_heap_new(8, NULL);
+ xbt_heap_set_update_callback(p_actionHeap, surf_action_lmm_update_index_heap);
+ p_modifiedSet = new ActionLmmList();
+ p_maxminSystem->keep_track = p_modifiedSet;
+ }
+}
+
+CpuCas01Model::~CpuCas01Model()
+{
+ lmm_system_free(p_maxminSystem);
+ p_maxminSystem = NULL;
+
+ if (p_actionHeap)
+ xbt_heap_free(p_actionHeap);
+ delete p_modifiedSet;
+
+ surf_cpu_model_pm = NULL;
+
+ delete p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
+}
+
+void CpuCas01Model::parseInit(sg_platf_host_cbarg_t host)
+{
+ createResource(host->id,
+ host->power_peak,
+ host->pstate,
+ host->power_scale,
+ host->power_trace,
+ host->core_amount,
+ host->initial_state,
+ host->state_trace,
+ host->properties);
+}
+
+CpuPtr CpuCas01Model::createResource(const char *name, xbt_dynar_t power_peak,
+ int pstate, double power_scale,
+ tmgr_trace_t power_trace, int core,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ xbt_dict_t cpu_properties)
+{
+ CpuPtr cpu = NULL;
+ xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
+ "Host '%s' declared several times in the platform file",
+ name);
+ xbt_assert(xbt_dynar_getfirst_as(power_peak, double) > 0.0,
+ "Power has to be >0.0");
+ xbt_assert(core > 0, "Invalid number of cores %d", core);
+
+ cpu = new CpuCas01(this, name, power_peak, pstate, power_scale, power_trace, core, state_initial, state_trace, cpu_properties);
+ xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast<ResourcePtr>(cpu));
+
+ return cpu;
+}
+
+double CpuCas01Model::shareResourcesFull(double /*now*/)
+{
+ return Model::shareResourcesMaxMin(getRunningActionSet(),
+ p_maxminSystem, lmm_solve);
+}
+
+void CpuCas01Model::addTraces()
+{
+ xbt_dict_cursor_t cursor = NULL;
+ char *trace_name, *elm;
+ static int called = 0;
+ if (called)
+ return;
+ called = 1;
+
+ /* connect all traces relative to hosts */
+ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ CpuCas01Ptr host = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+ xbt_assert(host, "Host %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ host->setStateEvent(tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host)));
+ }
+
+ xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ CpuCas01Ptr host = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+ xbt_assert(host, "Host %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ host->setPowerEvent(tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host)));
+ }
+}
+
+/************
+ * Resource *
+ ************/
+CpuCas01::CpuCas01(CpuCas01ModelPtr model, const char *name, xbt_dynar_t powerPeak,
+ int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+ e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+ xbt_dict_t properties)
+: Cpu(model, name, properties,
+ lmm_constraint_new(model->getMaxminSystem(), this, core * powerScale * xbt_dynar_get_as(powerPeak, pstate, double)),
+ core, xbt_dynar_get_as(powerPeak, pstate, double), powerScale) {
+ p_powerEvent = NULL;
+ p_powerPeakList = powerPeak;
+ m_pstate = pstate;
+
+ XBT_DEBUG("CPU create: peak=%f, pstate=%d", m_powerPeak, m_pstate);
+
+ m_core = core;
+ setState(stateInitial);
+ if (powerTrace)
+ p_powerEvent = tmgr_history_add_trace(history, powerTrace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+ if (stateTrace)
+ p_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, static_cast<ResourcePtr>(this));
+}
+
+CpuCas01::~CpuCas01(){
+ if (getModel() == surf_cpu_model_pm)
+ xbt_dynar_free(&p_powerPeakList);
+}
+
+void CpuCas01::setStateEvent(tmgr_trace_event_t stateEvent)
+{
+ p_stateEvent = stateEvent;
+}
+
+void CpuCas01::setPowerEvent(tmgr_trace_event_t powerEvent)
+{
+ p_powerEvent = powerEvent;
+}
+
+xbt_dynar_t CpuCas01::getPowerPeakList(){
+ return p_powerPeakList;
+}
+
+int CpuCas01::getPState()
+{
+ return m_pstate;
+}
+
+bool CpuCas01::isUsed()
+{
+ return lmm_constraint_used(getModel()->getMaxminSystem(), getConstraint());
+}
+
+void CpuCas01::updateState(tmgr_trace_event_t event_type, double value, double date)
+{
+ lmm_variable_t var = NULL;
+ lmm_element_t elem = NULL;
+
+ if (event_type == p_powerEvent) {
+ /* TODO (Hypervisor): do the same thing for constraint_core[i] */
+ xbt_assert(m_core == 1, "FIXME: add power scaling code also for constraint_core[i]");
+
+ m_powerScale = value;
+ lmm_update_constraint_bound(getModel()->getMaxminSystem(), getConstraint(),
+ m_core * m_powerScale *
+ m_powerPeak);
+#ifdef HAVE_TRACING
+ TRACE_surf_host_set_power(date, getName(),
+ m_core * m_powerScale *
+ m_powerPeak);
+#endif
+ while ((var = lmm_get_var_from_cnst
+ (getModel()->getMaxminSystem(), getConstraint(), &elem))) {
+ CpuCas01ActionPtr action = static_cast<CpuCas01ActionPtr>(static_cast<ActionPtr>(lmm_variable_id(var)));
+
+ lmm_update_variable_bound(getModel()->getMaxminSystem(),
+ action->getVariable(),
+ m_powerScale * m_powerPeak);
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_powerEvent = NULL;
+ } else if (event_type == p_stateEvent) {
+ /* TODO (Hypervisor): do the same thing for constraint_core[i] */
+ xbt_assert(m_core == 1, "FIXME: add state change code also for constraint_core[i]");
+
+ if (value > 0) {
+ if(getState() == SURF_RESOURCE_OFF)
+ xbt_dynar_push_as(host_that_restart, char*, (char *)getName());
+ setState(SURF_RESOURCE_ON);
+ } else {
+ lmm_constraint_t cnst = getConstraint();
+
+ setState(SURF_RESOURCE_OFF);
+
+ while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), cnst, &elem))) {
+ ActionPtr action = static_cast<ActionPtr>(lmm_variable_id(var));
+
+ if (action->getState() == SURF_ACTION_RUNNING ||
+ action->getState() == SURF_ACTION_READY ||
+ action->getState() == SURF_ACTION_NOT_IN_THE_SYSTEM) {
+ action->setFinishTime(date);
+ action->setState(SURF_ACTION_FAILED);
+ }
+ }
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_stateEvent = NULL;
+ } else {
+ XBT_CRITICAL("Unknown event ! \n");
+ xbt_abort();
+ }
+
+ return;
+}
+
+CpuActionPtr CpuCas01::execute(double size)
+{
+
+ XBT_IN("(%s,%g)", getName(), size);
+ CpuCas01ActionPtr action = new CpuCas01Action(getModel(), size, getState() != SURF_RESOURCE_ON,
+ m_powerScale * m_powerPeak, getConstraint());
+
+ XBT_OUT();
+ return action;
+}
+
+CpuActionPtr CpuCas01::sleep(double duration)
+{
+ if (duration > 0)
+ duration = MAX(duration, MAXMIN_PRECISION);
+
+ XBT_IN("(%s,%g)", getName(), duration);
+ CpuCas01ActionPtr action = new CpuCas01Action(getModel(), 1.0, getState() != SURF_RESOURCE_ON,
+ m_powerScale * m_powerPeak, getConstraint());
+
+
+ // FIXME: sleep variables should not consume 1.0 in lmm_expand
+ action->m_maxDuration = duration;
+ action->m_suspended = 2;
+ if (duration == NO_MAX_DURATION) {
+ /* Move to the *end* of the corresponding action set. This convention
+ is used to speed up update_resource_state */
+ action->getStateSet()->erase(action->getStateSet()->iterator_to(*action));
+ action->p_stateSet = static_cast<CpuCas01ModelPtr>(getModel())->p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
+ action->getStateSet()->push_back(*action);
+ }
+
+ lmm_update_variable_weight(getModel()->getMaxminSystem(),
+ action->getVariable(), 0.0);
+ if (getModel()->getUpdateMechanism() == UM_LAZY) { // remove action from the heap
+ action->heapRemove(getModel()->getActionHeap());
+ // this is necessary for a variable with weight 0 since such
+ // variables are ignored in lmm and we need to set its max_duration
+ // correctly at the next call to share_resources
+ getModel()->getModifiedSet()->push_front(*action);
+ }
+
+ XBT_OUT();
+ return action;
+}
+
+double CpuCas01::getCurrentPowerPeak()
+{
+ return m_powerPeak;
+}
+
+double CpuCas01::getPowerPeakAt(int pstate_index)
+{
+ xbt_dynar_t plist = p_powerPeakList;
+ xbt_assert((pstate_index <= (int)xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
+
+ return xbt_dynar_get_as(plist, pstate_index, double);
+}
+
+int CpuCas01::getNbPstates()
+{
+ return xbt_dynar_length(p_powerPeakList);
+}
+
+void CpuCas01::setPowerPeakAt(int pstate_index)
+{
+ xbt_dynar_t plist = p_powerPeakList;
+ xbt_assert((pstate_index <= (int)xbt_dynar_length(plist)), "Invalid parameters (pstate index out of bounds)");
+
+ double new_power_peak = xbt_dynar_get_as(plist, pstate_index, double);
+ m_pstate = pstate_index;
+ m_powerPeak = new_power_peak;
+}
+
+/**********
+ * Action *
+ **********/
+
+CpuCas01Action::CpuCas01Action(ModelPtr model, double cost, bool failed, double power, lmm_constraint_t constraint)
+ : CpuAction(model, cost, failed,
+ lmm_variable_new(model->getMaxminSystem(), static_cast<ActionPtr>(this),
+ 1.0, power, 1))
+{
+ m_suspended = 0;
+ if (model->getUpdateMechanism() == UM_LAZY) {
+ m_indexHeap = -1;
+ m_lastUpdate = surf_get_clock();
+ m_lastValue = 0.0;
+ }
+ lmm_expand(model->getMaxminSystem(), constraint, getVariable(), 1.0);
+}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "cpu_interface.hpp"
+
+/***********
+ * Classes *
+ ***********/
+class CpuCas01Model;
+typedef CpuCas01Model *CpuCas01ModelPtr;
+
+class CpuCas01;
+typedef CpuCas01 *CpuCas01Ptr;
+
+class CpuCas01Action;
+typedef CpuCas01Action *CpuCas01ActionPtr;
+
+/*********
+ * Model *
+ *********/
+class CpuCas01Model : public CpuModel {
+public:
+ CpuCas01Model();
+ ~CpuCas01Model();
+
+ double (CpuCas01Model::*shareResources)(double now);
+ void (CpuCas01Model::*updateActionsState)(double now, double delta);
+
+ void parseInit(sg_platf_host_cbarg_t host);
+ CpuPtr createResource(const char *name, xbt_dynar_t power_peak, int pstate,
+ double power_scale,
+ tmgr_trace_t power_trace, int core,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ xbt_dict_t cpu_properties);
+ double shareResourcesFull(double now);
+ void addTraces();
+ ActionListPtr p_cpuRunningActionSetThatDoesNotNeedBeingChecked;
+};
+
+/************
+ * Resource *
+ ************/
+
+class CpuCas01 : public Cpu {
+public:
+ CpuCas01(CpuCas01ModelPtr model, const char *name, xbt_dynar_t power_peak,
+ int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+ e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+ xbt_dict_t properties) ;
+ ~CpuCas01();
+ void updateState(tmgr_trace_event_t event_type, double value, double date);
+ CpuActionPtr execute(double size);
+ CpuActionPtr sleep(double duration);
+
+ double getCurrentPowerPeak();
+ double getPowerPeakAt(int pstate_index);
+ int getNbPstates();
+ void setPowerPeakAt(int pstate_index);
+ bool isUsed();
+ void setStateEvent(tmgr_trace_event_t stateEvent);
+ void setPowerEvent(tmgr_trace_event_t stateEvent);
+ xbt_dynar_t getPowerPeakList();
+
+ int getPState();
+
+private:
+ tmgr_trace_event_t p_stateEvent;
+ tmgr_trace_event_t p_powerEvent;
+ xbt_dynar_t p_powerPeakList; /*< List of supported CPU capacities */
+ int m_pstate; /*< Current pstate (index in the power_peak_list)*/
+};
+
+/**********
+ * Action *
+ **********/
+class CpuCas01Action: public CpuAction {
+ friend CpuActionPtr CpuCas01::execute(double size);
+ friend CpuActionPtr CpuCas01::sleep(double duration);
+public:
+ CpuCas01Action() {};
+ CpuCas01Action(ModelPtr model, double cost, bool failed, double power, lmm_constraint_t constraint);
+
+ ~CpuCas01Action() {};
+};
+++ /dev/null
-
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef _SURF_CPU_CAS01_PRIVATE_H
-#define _SURF_CPU_CAS01_PRIVATE_H
-
-#undef GENERIC_LMM_ACTION
-#undef GENERIC_ACTION
-#undef ACTION_GET_CPU
-#define GENERIC_LMM_ACTION(action) action->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-#define ACTION_GET_CPU(action) ((surf_action_cpu_Cas01_t) action)->cpu
-
-typedef struct surf_action_cpu_cas01 {
- s_surf_action_lmm_t generic_lmm_action;
-} s_surf_action_cpu_Cas01_t, *surf_action_cpu_Cas01_t;
-
-
-/*
- * Energy-related properties for the cpu_cas01 model
- */
-typedef struct energy_cpu_cas01 {
- xbt_dynar_t power_range_watts_list; /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
- double total_energy; /*< Total energy consumed by the host */
- double last_updated; /*< Timestamp of the last energy update event*/
-} s_energy_cpu_cas01_t, *energy_cpu_cas01_t;
-
-
-typedef struct cpu_Cas01 {
- s_surf_resource_t generic_resource;
- s_xbt_swag_hookup_t modified_cpu_hookup;
- double power_peak;
- double power_scale;
- tmgr_trace_event_t power_event;
- int core;
- e_surf_resource_state_t state_current;
- tmgr_trace_event_t state_event;
- lmm_constraint_t constraint;
-
- xbt_dynar_t power_peak_list; /*< List of supported CPU capacities */
- int pstate; /*< Current pstate (index in the power_peak_list)*/
- energy_cpu_cas01_t energy; /*< Structure with energy-consumption data */
-
-} s_cpu_Cas01_t, *cpu_Cas01_t;
-
-xbt_dynar_t cpu_get_watts_range_list(cpu_Cas01_t cpu_model);
-void cpu_update_energy(cpu_Cas01_t cpu_model, double cpu_load);
-
-#endif /* _SURF_CPU_CAS01_PRIVATE_H */
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "cpu_interface.hpp"
+
+XBT_LOG_EXTERNAL_CATEGORY(surf_kernel);
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu, surf,
+ "Logging specific to the SURF cpu module");
+
+CpuModelPtr surf_cpu_model_pm;
+CpuModelPtr surf_cpu_model_vm;
+
+/*************
+ * Callbacks *
+ *************/
+
+CpuPtr getActionCpu(CpuActionPtr action) {
+ return static_cast<CpuPtr>(lmm_constraint_id(lmm_get_cnst_from_var
+ (action->getModel()->getMaxminSystem(),
+ action->getVariable(), 0)));
+}
+
+surf_callback(void, CpuPtr) cpuCreatedCallbacks;
+surf_callback(void, CpuPtr) cpuDestructedCallbacks;
+surf_callback(void, CpuPtr) cpuStateChangedCallbacks;
+surf_callback(void, CpuActionPtr) cpuActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+void CpuModel::updateActionsStateLazy(double now, double /*delta*/)
+{
+ CpuActionPtr action;
+ while ((xbt_heap_size(getActionHeap()) > 0)
+ && (double_equals(xbt_heap_maxkey(getActionHeap()), now))) {
+ action = static_cast<CpuActionPtr>(static_cast<ActionPtr>(xbt_heap_pop(getActionHeap())));
+ XBT_CDEBUG(surf_kernel, "Something happened to action %p", action);
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ CpuPtr cpu = static_cast<CpuPtr>(lmm_constraint_id(lmm_get_cnst_from_var(getMaxminSystem(), action->getVariable(), 0)));
+ TRACE_surf_host_set_utilization(cpu->getName(), action->getCategory(),
+ lmm_variable_getvalue(action->getVariable()),
+ action->getLastUpdate(),
+ now - action->getLastUpdate());
+ }
+#endif
+
+ action->finish();
+ XBT_CDEBUG(surf_kernel, "Action %p finished", action);
+
+ /* set the remains to 0 due to precision problems when updating the remaining amount */
+ action->setRemains(0);
+ action->setState(SURF_ACTION_DONE);
+ action->heapRemove(getActionHeap()); //FIXME: strange call since action was already popped
+ }
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ //defining the last timestamp that we can safely dump to trace file
+ //without losing the event ascending order (considering all CPU's)
+ double smaller = -1;
+ ActionListPtr actionSet = getRunningActionSet();
+ for(ActionList::iterator it(actionSet->begin()), itend(actionSet->end())
+ ; it != itend ; ++it) {
+ action = static_cast<CpuActionPtr>(&*it);
+ if (smaller < 0) {
+ smaller = action->getLastUpdate();
+ continue;
+ }
+ if (action->getLastUpdate() < smaller) {
+ smaller = action->getLastUpdate();
+ }
+ }
+ if (smaller > 0) {
+ TRACE_last_timestamp_to_dump = smaller;
+ }
+ }
+#endif
+ return;
+}
+
+void CpuModel::updateActionsStateFull(double now, double delta)
+{
+ CpuActionPtr action = NULL;
+ ActionListPtr running_actions = getRunningActionSet();
+
+ for(ActionList::iterator it(running_actions->begin()), itNext=it, itend(running_actions->end())
+ ; it != itend ; it=itNext) {
+ ++itNext;
+ action = static_cast<CpuActionPtr>(&*it);
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ CpuPtr x = (CpuPtr) lmm_constraint_id(lmm_get_cnst_from_var
+ (getMaxminSystem(), action->getVariable(), 0));
+
+ TRACE_surf_host_set_utilization(x->getName(),
+ action->getCategory(),
+ lmm_variable_getvalue(action->getVariable()),
+ now - delta,
+ delta);
+ TRACE_last_timestamp_to_dump = now - delta;
+ }
+#endif
+
+ action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
+
+
+ if (action->getMaxDuration() != NO_MAX_DURATION)
+ action->updateMaxDuration(delta);
+
+
+ if ((action->getRemainsNoUpdate() <= 0) &&
+ (lmm_get_variable_weight(action->getVariable()) > 0)) {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ } else if ((action->getMaxDuration() != NO_MAX_DURATION) &&
+ (action->getMaxDuration() <= 0)) {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ }
+ }
+
+ return;
+}
+
+/************
+ * Resource *
+ ************/
+
+Cpu::Cpu(){
+ surf_callback_emit(cpuCreatedCallbacks, this);
+}
+
+Cpu::Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+ int core, double powerPeak, double powerScale)
+ : Resource(model, name, props)
+ , m_core(core)
+ , m_powerPeak(powerPeak)
+ , m_powerScale(powerScale)
+ , p_constraintCore(NULL)
+ , p_constraintCoreId(NULL)
+{
+ surf_callback_emit(cpuCreatedCallbacks, this);
+}
+
+Cpu::Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+ lmm_constraint_t constraint, int core, double powerPeak, double powerScale)
+ : Resource(model, name, props, constraint)
+ , m_core(core)
+ , m_powerPeak(powerPeak)
+ , m_powerScale(powerScale)
+{
+ surf_callback_emit(cpuCreatedCallbacks, this);
+ /* At now, we assume that a VM does not have a multicore CPU. */
+ if (core > 1)
+ xbt_assert(model == surf_cpu_model_pm);
+
+ p_constraintCore = NULL;
+ p_constraintCoreId = NULL;
+ if (model->getUpdateMechanism() != UM_UNDEFINED) {
+ p_constraintCore = xbt_new(lmm_constraint_t, core);
+ p_constraintCoreId = xbt_new(void*, core);
+
+ int i;
+ for (i = 0; i < core; i++) {
+ /* just for a unique id, never used as a string. */
+ p_constraintCoreId[i] = bprintf("%s:%i", name, i);
+ p_constraintCore[i] = lmm_constraint_new(model->getMaxminSystem(), p_constraintCoreId[i], m_powerScale * m_powerPeak);
+ }
+ }
+}
+
+Cpu::~Cpu(){
+ surf_callback_emit(cpuDestructedCallbacks, this);
+ if (p_constraintCoreId){
+ for (int i = 0; i < m_core; i++) {
+ xbt_free(p_constraintCoreId[i]);
+ }
+ xbt_free(p_constraintCore);
+ }
+ if (p_constraintCoreId)
+ xbt_free(p_constraintCoreId);
+}
+
+double Cpu::getSpeed(double load)
+{
+ return load * m_powerPeak;
+}
+
+double Cpu::getAvailableSpeed()
+{
+/* number between 0 and 1 */
+ return m_powerScale;
+}
+
+int Cpu::getCore()
+{
+ return m_core;
+}
+
+void Cpu::setState(e_surf_resource_state_t state)
+{
+ Resource::setState(state);
+ surf_callback_emit(cpuStateChangedCallbacks, this);
+}
+/**********
+ * Action *
+ **********/
+
+void CpuAction::updateRemainingLazy(double now)
+{
+ double delta = 0.0;
+
+ xbt_assert(getStateSet() == getModel()->getRunningActionSet(),
+ "You're updating an action that is not running.");
+
+ /* bogus priority, skip it */
+ xbt_assert(getPriority() > 0,
+ "You're updating an action that seems suspended.");
+
+ delta = now - m_lastUpdate;
+
+ if (m_remains > 0) {
+ XBT_CDEBUG(surf_kernel, "Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
+ double_update(&(m_remains), m_lastValue * delta);
+
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ CpuPtr cpu = static_cast<CpuPtr>(lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0)));
+ TRACE_surf_host_set_utilization(cpu->getName(), getCategory(), m_lastValue, m_lastUpdate, now - m_lastUpdate);
+ }
+#endif
+ XBT_CDEBUG(surf_kernel, "Updating action(%p): remains is now %f", this, m_remains);
+ }
+
+ m_lastUpdate = now;
+ m_lastValue = lmm_variable_getvalue(getVariable());
+}
+
+/*
+ *
+ * This function formulates a constraint problem that pins a given task to
+ * particular cores. Currently, it is possible to pin a task to an exactly one
+ * specific core. The system links the variable object of the task to the
+ * per-core constraint object.
+ *
+ * But, the taskset command on Linux takes a mask value specifying a CPU
+ * affinity setting of a given task. If the mask value is 0x03, the given task
+ * will be executed on the first core (CPU0) or the second core (CPU1) on the
+ * given PM. The schedular will determine appropriate placements of tasks,
+ * considering given CPU affinities and task activities.
+ *
+ * How should the system formulate constraint problems for an affinity to
+ * multiple cores?
+ *
+ * The cpu argument must be the host where the task is being executed. The
+ * action object does not have the information about the location where the
+ * action is being executed.
+ */
+void CpuAction::setAffinity(CpuPtr cpu, unsigned long mask)
+{
+ lmm_variable_t var_obj = getVariable();
+ XBT_IN("(%p,%lx)", this, mask);
+
+ {
+ unsigned long nbits = 0;
+
+ /* FIXME: There is much faster algorithms doing this. */
+ for (int i = 0; i < cpu->m_core; i++) {
+ unsigned long has_affinity = (1UL << i) & mask;
+ if (has_affinity)
+ nbits += 1;
+ }
+
+ if (nbits > 1) {
+ XBT_CRITICAL("Do not specify multiple cores for an affinity mask.");
+ XBT_CRITICAL("See the comment in cpu_action_set_affinity().");
+ DIE_IMPOSSIBLE;
+ }
+ }
+
+ for (int i = 0; i < cpu->m_core; i++) {
+ XBT_DEBUG("clear affinity %p to cpu-%d@%s", this, i, cpu->getName());
+ lmm_shrink(cpu->getModel()->getMaxminSystem(), cpu->p_constraintCore[i], var_obj);
+
+ unsigned long has_affinity = (1UL << i) & mask;
+ if (has_affinity) {
+ /* This function only accepts an affinity setting on the host where the
+ * task is now running. In future, a task might move to another host.
+ * But, at this moment, this function cannot take an affinity setting on
+ * that future host.
+ *
+ * It might be possible to extend the code to allow this function to
+ * accept affinity settings on a future host. We might be able to assign
+ * zero to elem->value to maintain such inactive affinity settings in the
+ * system. But, this will make the system complex. */
+ XBT_DEBUG("set affinity %p to cpu-%d@%s", this, i, cpu->getName());
+ lmm_expand(cpu->getModel()->getMaxminSystem(), cpu->p_constraintCore[i], var_obj, 1.0);
+ }
+ }
+
+ if (cpu->getModel()->getUpdateMechanism() == UM_LAZY) {
+ /* FIXME (hypervisor): Do we need to do something for the LAZY mode? */
+ }
+ XBT_OUT();
+}
+
+void CpuAction::setState(e_surf_action_state_t state){
+ Action::setState(state);
+ surf_callback_emit(cpuActionStateChangedCallbacks, this);
+}
--- /dev/null
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_interface.hpp"
+#include "maxmin_private.hpp"
+
+#ifndef SURF_CPU_INTERFACE_HPP_
+#define SURF_CPU_INTERFACE_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class CpuModel;
+typedef CpuModel *CpuModelPtr;
+
+class Cpu;
+typedef Cpu *CpuPtr;
+
+class CpuAction;
+typedef CpuAction *CpuActionPtr;
+
+class CpuPlugin;
+typedef CpuPlugin *CpuPluginPtr;
+
+/*************
+ * Callbacks *
+ *************/
+CpuPtr getActionCpu(CpuActionPtr action);
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Cpu creation *
+ * @details Callback functions have the following signature: `void(CpuPtr)`
+ */
+extern surf_callback(void, CpuPtr) cpuCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Cpu destruction *
+ * @details Callback functions have the following signature: `void(CpuPtr)`
+ */
+extern surf_callback(void, CpuPtr) cpuDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after Cpu State changed *
+ * @details Callback functions have the following signature: `void(CpuActionPtr)`
+ */
+extern surf_callback(void, CpuPtr) cpuStateChangedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after CpuAction State changed *
+ * @details Callback functions have the following signature: `void(CpuActionPtr)`
+ */
+extern surf_callback(void, CpuActionPtr) cpuActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+ /** @ingroup SURF_cpu_interface
+ * @brief SURF cpu model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class CpuModel : public Model {
+public:
+ /**
+ * @brief CpuModel constructor
+ *
+ * @param name The name of the model
+ */
+ CpuModel(const char *name) : Model(name) {};
+
+ /**
+ * @brief Create a Cpu
+ *
+ * @param name The name of the Cpu
+ *
+ * @return The created Cpu
+ */
+ CpuPtr createResource(string name);
+
+ void setState(e_surf_resource_state_t state);
+
+ void updateActionsStateLazy(double now, double delta);
+ void updateActionsStateFull(double now, double delta);
+
+ virtual void addTraces() =0;
+};
+
+/************
+ * Resource *
+ ************/
+
+/** @ingroup SURF_cpu_interface
+* @brief SURF cpu resource interface class
+* @details A Cpu represent a cpu associated to a workstation
+*/
+class Cpu : public Resource {
+public:
+ /**
+ * @brief Cpu constructor
+ */
+ Cpu();
+
+ /**
+ * @brief Cpu constructor
+ *
+ * @param model The CpuModel associated to this Cpu
+ * @param name The name of the Cpu
+ * @param props Dictionary of properties associated to this Cpu
+ * @param constraint The lmm constraint associated to this Cpu if it is part of a LMM component
+ * @param core The number of core of this Cpu
+ * @param powerPeak The power peak of this Cpu
+ * @param powerScale The power scale of this Cpu
+ */
+ Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+ lmm_constraint_t constraint, int core, double powerPeak, double powerScale);
+
+ /**
+ * @brief Cpu constructor
+ *
+ * @param model The CpuModel associated to this Cpu
+ * @param name The name of the Cpu
+ * @param props Dictionary of properties associated to this Cpu
+ * @param core The number of core of this Cpu
+ * @param powerPeak The power peak of this Cpu in [TODO]
+ * @param powerScale The power scale of this Cpu in [TODO]
+ */
+ Cpu(ModelPtr model, const char *name, xbt_dict_t props,
+ int core, double powerPeak, double powerScale);
+
+ /**
+ * @brief Cpu destructor
+ */
+ ~Cpu();
+
+ /**
+ * @brief Execute some quantity of computation
+ *
+ * @param size The value of the processing amount (in flop) needed to process
+ * @return The CpuAction corresponding to the processing
+ */
+ virtual CpuActionPtr execute(double size)=0;
+
+ /**
+ * @brief Make a process sleep for duration (in seconds)
+ *
+ * @param duration The number of seconds to sleep
+ * @return The CpuAction corresponding to the sleeping
+ */
+ virtual CpuActionPtr sleep(double duration)=0;
+
+ /**
+ * @brief Get the number of cores of the current Cpu
+ *
+ * @return The number of cores of the current Cpu
+ */
+ virtual int getCore();
+
+ /**
+ * @brief Get the speed of the current Cpu
+ * @details [TODO] load * m_powerPeak
+ *
+ * @param load [TODO]
+ *
+ * @return The speed of the current Cpu
+ */
+ virtual double getSpeed(double load);
+
+ /**
+ * @brief Get the available speed of the current Cpu
+ * @details [TODO]
+ *
+ * @return The available speed of the current Cpu
+ */
+ virtual double getAvailableSpeed();
+
+ /**
+ * @brief Get the current Cpu power peak
+ *
+ * @return The current Cpu power peak
+ */
+ virtual double getCurrentPowerPeak()=0;
+
+
+ virtual double getPowerPeakAt(int pstate_index)=0;
+
+ virtual int getNbPstates()=0;
+
+ virtual void setPowerPeakAt(int pstate_index)=0;
+
+ void setState(e_surf_resource_state_t state);
+
+ void addTraces(void);
+ int m_core;
+ double m_powerPeak; /*< CPU power peak */
+ double m_powerScale; /*< Percentage of CPU disponible */
+
+ /* Note (hypervisor): */
+ lmm_constraint_t *p_constraintCore;
+ void **p_constraintCoreId;
+};
+
+/**********
+ * Action *
+ **********/
+
+ /** @ingroup SURF_cpu_interface
+ * @brief SURF Cpu action interface class
+ * @details A CpuAction represent the execution of code on a Cpu
+ */
+class CpuAction : public Action {
+friend CpuPtr getActionCpu(CpuActionPtr action);
+public:
+ /**
+ * @brief CpuAction constructor
+ */
+ CpuAction() {};
+
+ /**
+ * @brief CpuAction constructor
+ *
+ * @param model The CpuModel associated to this CpuAction
+ * @param cost [TODO]
+ * @param failed [TODO]
+ */
+ CpuAction(ModelPtr model, double cost, bool failed)
+ : Action(model, cost, failed) {} //FIXME:REMOVE
+
+ /**
+ * @brief CpuAction constructor
+ *
+ * @param model The CpuModel associated to this CpuAction
+ * @param cost [TODO]
+ * @param failed [TODO]
+ * @param var The lmm variable associated to this CpuAction if it is part of a LMM component
+ */
+ CpuAction(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+ : Action(model, cost, failed, var) {}
+
+ /**
+ * @brief Set the affinity of the current CpuAction
+ * @details [TODO]
+ *
+ * @param cpu [TODO]
+ * @param mask [TODO]
+ */
+ virtual void setAffinity(CpuPtr cpu, unsigned long mask);
+
+ void setState(e_surf_action_state_t state);
+
+ void updateRemainingLazy(double now);
+
+};
+
+#endif /* SURF_CPU_INTERFACE_HPP_ */
+++ /dev/null
-
-/* Copyright (c) 2009-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/*
- commit: e2d6799c4182f00443b3013aadb1c2412372460f
- This commit retrieves the old implementation of CPU_TI with multi-levels.
-*/
-
-#include "surf_private.h"
-#include "trace_mgr_private.h"
-#include "cpu_ti_private.h"
-#include "xbt/heap.h"
-#include "surf/surf_resource.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf,
- "Logging specific to the SURF CPU TRACE INTEGRATION module");
-
-
-static xbt_swag_t
- cpu_ti_running_action_set_that_does_not_need_being_checked = NULL;
-static xbt_swag_t cpu_ti_modified_cpu = NULL;
-static xbt_heap_t cpu_ti_action_heap;
-
-/* prototypes of new trace functions */
-static double surf_cpu_ti_integrate_trace(surf_cpu_ti_tgmr_t trace,
- double a, double b);
-
-
-static double surf_cpu_ti_solve_trace(surf_cpu_ti_tgmr_t trace, double a,
- double amount);
-static double surf_cpu_ti_solve_trace_somewhat_simple(surf_cpu_ti_tgmr_t
- trace, double a,
- double amount);
-
-static void surf_cpu_ti_free_tmgr(surf_cpu_ti_tgmr_t trace);
-
-static double surf_cpu_ti_integrate_trace_simple(surf_cpu_ti_trace_t trace,
- double a, double b);
-static double surf_cpu_ti_integrate_trace_simple_point(surf_cpu_ti_trace_t
- trace, double a);
-static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace,
- double a, double amount);
-static int surf_cpu_ti_binary_search(double *array, double a, int low,
- int high);
-/* end prototypes */
-
-static void surf_cpu_ti_free_trace(surf_cpu_ti_trace_t trace)
-{
- xbt_free(trace->time_points);
- xbt_free(trace->integral);
- xbt_free(trace);
-}
-
-static void surf_cpu_ti_free_tmgr(surf_cpu_ti_tgmr_t trace)
-{
- if (trace->trace)
- surf_cpu_ti_free_trace(trace->trace);
- xbt_free(trace);
-}
-
-static surf_cpu_ti_trace_t surf_cpu_ti_trace_new(tmgr_trace_t power_trace)
-{
- surf_cpu_ti_trace_t trace;
- s_tmgr_event_t val;
- unsigned int cpt;
- double integral = 0;
- double time = 0;
- int i = 0;
- trace = xbt_new0(s_surf_cpu_ti_trace_t, 1);
- trace->time_points =
- xbt_malloc0(sizeof(double) *
- (xbt_dynar_length(power_trace->s_list.event_list) + 1));
- trace->integral =
- xbt_malloc0(sizeof(double) *
- (xbt_dynar_length(power_trace->s_list.event_list) + 1));
- trace->nb_points = xbt_dynar_length(power_trace->s_list.event_list);
- xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
- trace->time_points[i] = time;
- trace->integral[i] = integral;
- integral += val.delta * val.value;
- time += val.delta;
- i++;
- }
- trace->time_points[i] = time;
- trace->integral[i] = integral;
- return trace;
-}
-
-/**
-* \brief Creates a new integration trace from a tmgr_trace_t
-*
-* \param power_trace CPU availability trace
-* \param value Percentage of CPU power available (useful to fixed tracing)
-* \param spacing Initial spacing
-* \return Integration trace structure
-*/
-static surf_cpu_ti_tgmr_t cpu_ti_parse_trace(tmgr_trace_t power_trace,
- double value)
-{
- surf_cpu_ti_tgmr_t trace;
- double total_time = 0.0;
- s_tmgr_event_t val;
- unsigned int cpt;
- trace = xbt_new0(s_surf_cpu_ti_tgmr_t, 1);
-
-/* no availability file, fixed trace */
- if (!power_trace) {
- trace->type = TRACE_FIXED;
- trace->value = value;
- XBT_DEBUG("No availability trace. Constant value = %f", value);
- return trace;
- }
-
- /* only one point available, fixed trace */
- if (xbt_dynar_length(power_trace->s_list.event_list) == 1) {
- xbt_dynar_get_cpy(power_trace->s_list.event_list, 0, &val);
- trace->type = TRACE_FIXED;
- trace->value = val.value;
- return trace;
- }
-
- trace->type = TRACE_DYNAMIC;
- trace->power_trace = power_trace;
-
- /* count the total time of trace file */
- xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
- total_time += val.delta;
- }
- trace->trace = surf_cpu_ti_trace_new(power_trace);
- trace->last_time = total_time;
- trace->total =
- surf_cpu_ti_integrate_trace_simple(trace->trace, 0, total_time);
-
- XBT_DEBUG("Total integral %f, last_time %f ",
- trace->total, trace->last_time);
-
- return trace;
-}
-
-
-static void* cpu_ti_create_resource(const char *name, xbt_dynar_t power_peak,
- int pstate,
- double power_scale,
- tmgr_trace_t power_trace,
- int core,
- e_surf_resource_state_t state_initial,
- tmgr_trace_t state_trace,
- xbt_dict_t cpu_properties)
-{
- tmgr_trace_t empty_trace;
- s_tmgr_event_t val;
- cpu_ti_t cpu = NULL;
- s_surf_action_cpu_ti_t ti_action;
- xbt_assert(core==1,"Multi-core not handled with this model yet");
- xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
- "Host '%s' declared several times in the platform file",
- name);
- xbt_assert(core==1,"Multi-core not handled with this model yet");
- cpu = (cpu_ti_t) surf_resource_new(sizeof(s_cpu_ti_t),
- surf_cpu_model, name,cpu_properties, NULL);
- cpu->action_set =
- xbt_swag_new(xbt_swag_offset(ti_action, cpu_list_hookup));
-
- xbt_dynar_get_cpy(power_peak, 0, &cpu->power_peak);
- xbt_dynar_free(&power_peak); /* kill memory leak */
- //cpu->power_peak = power_peak;
- cpu->pstate = pstate;
- XBT_DEBUG("CPU create: peak=%f, pstate=%d",cpu->power_peak, cpu->pstate);
-
- xbt_assert(cpu->power_peak > 0, "Power has to be >0");
- XBT_DEBUG("power scale %f", power_scale);
- cpu->power_scale = power_scale;
- cpu->avail_trace = cpu_ti_parse_trace(power_trace, power_scale);
- cpu->state_current = state_initial;
- if (state_trace)
- cpu->state_event =
- tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu);
- if (power_trace && xbt_dynar_length(power_trace->s_list.event_list) > 1) {
- /* add a fake trace event if periodicity == 0 */
- xbt_dynar_get_cpy(power_trace->s_list.event_list,
- xbt_dynar_length(power_trace->s_list.event_list) - 1, &val);
- if (val.delta == 0) {
- empty_trace = tmgr_empty_trace_new();
- cpu->power_event =
- tmgr_history_add_trace(history, empty_trace,
- cpu->avail_trace->last_time, 0, cpu);
- }
- }
- xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu);
-
- return xbt_lib_get_elm_or_null(host_lib, name);
-}
-
-
-static void parse_cpu_ti_init(sg_platf_host_cbarg_t host)
-{
- cpu_ti_create_resource(host->id,
- host->power_peak,
- host->pstate,
- host->power_scale,
- host->power_trace,
- host->core_amount,
- host->initial_state,
- host->state_trace,
- host->properties);
-
-}
-
-static void add_traces_cpu_ti(void)
-{
- xbt_dict_cursor_t cursor = NULL;
- char *trace_name, *elm;
-
- static int called = 0;
-
- if (called)
- return;
- called = 1;
-
-/* connect all traces relative to hosts */
- xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- cpu_ti_t cpu = surf_cpu_resource_priv(surf_cpu_resource_by_name(elm));
-
- xbt_assert(cpu, "Host %s undefined", elm);
- xbt_assert(trace, "Trace %s undefined", trace_name);
-
- if (cpu->state_event) {
- XBT_DEBUG("Trace already configured for this CPU(%s), ignoring it",
- elm);
- continue;
- }
- XBT_DEBUG("Add state trace: %s to CPU(%s)", trace_name, elm);
- cpu->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, cpu);
- }
-
- xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- cpu_ti_t cpu = surf_cpu_resource_priv(surf_cpu_resource_by_name(elm));
-
- xbt_assert(cpu, "Host %s undefined", elm);
- xbt_assert(trace, "Trace %s undefined", trace_name);
-
- XBT_DEBUG("Add power trace: %s to CPU(%s)", trace_name, elm);
- if (cpu->avail_trace)
- surf_cpu_ti_free_tmgr(cpu->avail_trace);
-
- cpu->avail_trace = cpu_ti_parse_trace(trace, cpu->power_scale);
-
- /* add a fake trace event if periodicity == 0 */
- if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) {
- s_tmgr_event_t val;
- xbt_dynar_get_cpy(trace->s_list.event_list,
- xbt_dynar_length(trace->s_list.event_list) - 1, &val);
- if (val.delta == 0) {
- tmgr_trace_t empty_trace;
- empty_trace = tmgr_empty_trace_new();
- cpu->power_event =
- tmgr_history_add_trace(history, empty_trace,
- cpu->avail_trace->last_time, 0, cpu);
- }
- }
- }
-}
-
-static void cpu_ti_define_callbacks()
-{
- sg_platf_host_add_cb(parse_cpu_ti_init);
- sg_platf_postparse_add_cb(add_traces_cpu_ti);
-}
-
-static int cpu_ti_resource_used(void *resource_id)
-{
- cpu_ti_t cpu = resource_id;
- return xbt_swag_size(cpu->action_set);
-}
-
-static int cpu_ti_action_unref(surf_action_t action)
-{
- action->refcount--;
- if (!action->refcount) {
- xbt_swag_remove(action, action->state_set);
- /* remove from action_set */
- xbt_swag_remove(action, ((cpu_ti_t)surf_cpu_resource_priv(ACTION_GET_CPU(action)))->action_set);
- /* remove from heap */
- xbt_heap_remove(cpu_ti_action_heap,
- ((surf_action_cpu_ti_t) action)->index_heap);
- xbt_swag_insert(((cpu_ti_t)surf_cpu_resource_priv(ACTION_GET_CPU(action))), cpu_ti_modified_cpu);
- surf_action_free(&action);
- return 1;
- }
- return 0;
-}
-
-static void cpu_ti_action_cancel(surf_action_t action)
-{
- surf_action_state_set(action, SURF_ACTION_FAILED);
- xbt_heap_remove(cpu_ti_action_heap,
- ((surf_action_cpu_ti_t) action)->index_heap);
- xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
- return;
-}
-
-static void cpu_ti_action_state_set(surf_action_t action,
- e_surf_action_state_t state)
-{
- surf_action_state_set(action, state);
- xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
- return;
-}
-
-/**
-* \brief Update the remaining amount of actions
-*
-* \param cpu Cpu on which the actions are running
-* \param now Current time
-*/
-static void cpu_ti_update_remaining_amount(cpu_ti_t cpu, double now)
-{
- double area_total;
- surf_action_cpu_ti_t action;
-
-/* already updated */
- if (cpu->last_update >= now)
- return;
-
-/* calcule the surface */
- area_total =
- surf_cpu_ti_integrate_trace(cpu->avail_trace, cpu->last_update,
- now) * cpu->power_peak;
- XBT_DEBUG("Flops total: %f, Last update %f", area_total,
- cpu->last_update);
-
- xbt_swag_foreach(action, cpu->action_set) {
- surf_action_t generic = (surf_action_t)action;
- /* action not running, skip it */
- if (generic->state_set !=
- surf_cpu_model->states.running_action_set)
- continue;
-
- /* bogus priority, skip it */
- if (generic->priority <= 0)
- continue;
-
- /* action suspended, skip it */
- if (action->suspended != 0)
- continue;
-
- /* action don't need update */
- if (generic->start >= now)
- continue;
-
- /* skip action that are finishing now */
- if (generic->finish >= 0
- && generic->finish <= now)
- continue;
-
- /* update remaining */
- double_update(&(generic->remains),
- area_total / (cpu->sum_priority *
- generic->priority));
- XBT_DEBUG("Update remaining action(%p) remaining %f", action,
- generic->remains);
- }
- cpu->last_update = now;
-#undef GENERIC_ACTION
-}
-
-/**
-* \brief Update the finish date of action if necessary
-*
-* \param cpu Cpu on which the actions are running
-* \param now Current time
-*/
-static void cpu_ti_update_action_finish_date(cpu_ti_t cpu, double now)
-{
-#define GENERIC_ACTION(action) action->generic_action
- surf_action_cpu_ti_t action;
- double sum_priority = 0.0, total_area, min_finish = -1;
-
-/* update remaning amount of actions */
- cpu_ti_update_remaining_amount(cpu, now);
-
- xbt_swag_foreach(action, cpu->action_set) {
- /* action not running, skip it */
- if (GENERIC_ACTION(action).state_set !=
- surf_cpu_model->states.running_action_set)
- continue;
-
- /* bogus priority, skip it */
- if (GENERIC_ACTION(action).priority <= 0)
- continue;
-
- /* action suspended, skip it */
- if (action->suspended != 0)
- continue;
-
- sum_priority += 1.0 / GENERIC_ACTION(action).priority;
- }
- cpu->sum_priority = sum_priority;
-
- xbt_swag_foreach(action, cpu->action_set) {
- min_finish = -1;
- /* action not running, skip it */
- if (GENERIC_ACTION(action).state_set !=
- surf_cpu_model->states.running_action_set)
- continue;
-
- /* verify if the action is really running on cpu */
- if (action->suspended == 0 && GENERIC_ACTION(action).priority > 0) {
- /* total area needed to finish the action. Used in trace integration */
- total_area =
- (GENERIC_ACTION(action).remains) * sum_priority *
- GENERIC_ACTION(action).priority;
-
- total_area /= cpu->power_peak;
-
- GENERIC_ACTION(action).finish =
- surf_cpu_ti_solve_trace(cpu->avail_trace, now, total_area);
- /* verify which event will happen before (max_duration or finish time) */
- if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
- (GENERIC_ACTION(action).start +
- GENERIC_ACTION(action).max_duration <
- GENERIC_ACTION(action).finish))
- min_finish = GENERIC_ACTION(action).start +
- GENERIC_ACTION(action).max_duration;
- else
- min_finish = GENERIC_ACTION(action).finish;
- } else {
- /* put the max duration time on heap */
- if (GENERIC_ACTION(action).max_duration != NO_MAX_DURATION)
- min_finish =
- (GENERIC_ACTION(action).start +
- GENERIC_ACTION(action).max_duration);
- }
- /* add in action heap */
- XBT_DEBUG("action(%p) index %d", action, action->index_heap);
- if (action->index_heap >= 0) {
- surf_action_cpu_ti_t heap_act =
- xbt_heap_remove(cpu_ti_action_heap, action->index_heap);
- if (heap_act != action)
- DIE_IMPOSSIBLE;
- }
- if (min_finish != NO_MAX_DURATION)
- xbt_heap_push(cpu_ti_action_heap, action, min_finish);
-
- XBT_DEBUG
- ("Update finish time: Cpu(%s) Action: %p, Start Time: %f Finish Time: %f Max duration %f",
- cpu->generic_resource.name, action, GENERIC_ACTION(action).start,
- GENERIC_ACTION(action).finish,
- GENERIC_ACTION(action).max_duration);
- }
-/* remove from modified cpu */
- xbt_swag_remove(cpu, cpu_ti_modified_cpu);
-#undef GENERIC_ACTION
-}
-
-static double cpu_ti_share_resources(double now)
-{
- cpu_ti_t cpu, cpu_next;
- double min_action_duration = -1;
-
-/* iterates over modified cpus to update share resources */
- xbt_swag_foreach_safe(cpu, cpu_next, cpu_ti_modified_cpu) {
- cpu_ti_update_action_finish_date(cpu, now);
- }
-/* get the min next event if heap not empty */
- if (xbt_heap_size(cpu_ti_action_heap) > 0)
- min_action_duration = xbt_heap_maxkey(cpu_ti_action_heap) - now;
-
- XBT_DEBUG("Share resources, min next event date: %f", min_action_duration);
-
- return min_action_duration;
-}
-
-static void cpu_ti_update_actions_state(double now, double delta)
-{
-#define GENERIC_ACTION(action) action->generic_action
- surf_action_cpu_ti_t action;
- while ((xbt_heap_size(cpu_ti_action_heap) > 0)
- && (xbt_heap_maxkey(cpu_ti_action_heap) <= now)) {
- action = xbt_heap_pop(cpu_ti_action_heap);
- XBT_DEBUG("Action %p: finish", action);
- GENERIC_ACTION(action).finish = surf_get_clock();
- /* set the remains to 0 due to precision problems when updating the remaining amount */
- GENERIC_ACTION(action).remains = 0;
- cpu_ti_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
- /* update remaining amount of all actions */
- cpu_ti_update_remaining_amount(surf_cpu_resource_priv(action->cpu), surf_get_clock());
- }
-#undef GENERIC_ACTION
-}
-
-static void cpu_ti_update_resource_state(void *id,
- tmgr_trace_event_t event_type,
- double value, double date)
-{
- cpu_ti_t cpu = id;
- surf_action_cpu_ti_t action;
-
- if (event_type == cpu->power_event) {
- tmgr_trace_t power_trace;
- surf_cpu_ti_tgmr_t trace;
- s_tmgr_event_t val;
-
- XBT_DEBUG("Finish trace date: %f value %f date %f", surf_get_clock(),
- value, date);
- /* update remaining of actions and put in modified cpu swag */
- cpu_ti_update_remaining_amount(cpu, date);
- xbt_swag_insert(cpu, cpu_ti_modified_cpu);
-
- power_trace = cpu->avail_trace->power_trace;
- xbt_dynar_get_cpy(power_trace->s_list.event_list,
- xbt_dynar_length(power_trace->s_list.event_list) - 1, &val);
- /* free old trace */
- surf_cpu_ti_free_tmgr(cpu->avail_trace);
- cpu->power_scale = val.value;
-
- trace = xbt_new0(s_surf_cpu_ti_tgmr_t, 1);
- trace->type = TRACE_FIXED;
- trace->value = val.value;
- XBT_DEBUG("value %f", val.value);
-
- cpu->avail_trace = trace;
-
- if (tmgr_trace_event_free(event_type))
- cpu->power_event = NULL;
-
- } else if (event_type == cpu->state_event) {
- if (value > 0) {
- if(cpu->state_current == SURF_RESOURCE_OFF)
- xbt_dynar_push_as(host_that_restart, char*, (cpu->generic_resource.name));
- cpu->state_current = SURF_RESOURCE_ON;
- } else {
- cpu->state_current = SURF_RESOURCE_OFF;
-
- /* put all action running on cpu to failed */
- xbt_swag_foreach(action, cpu->action_set) {
- if (surf_action_state_get((surf_action_t) action) ==
- SURF_ACTION_RUNNING
- || surf_action_state_get((surf_action_t) action) ==
- SURF_ACTION_READY
- || surf_action_state_get((surf_action_t) action) ==
- SURF_ACTION_NOT_IN_THE_SYSTEM) {
- action->generic_action.finish = date;
- cpu_ti_action_state_set((surf_action_t) action,
- SURF_ACTION_FAILED);
- if (action->index_heap >= 0) {
- surf_action_cpu_ti_t heap_act =
- xbt_heap_remove(cpu_ti_action_heap, action->index_heap);
- if (heap_act != action)
- DIE_IMPOSSIBLE;
- }
- }
- }
- }
- if (tmgr_trace_event_free(event_type))
- cpu->state_event = NULL;
- } else {
- XBT_CRITICAL("Unknown event ! \n");
- xbt_abort();
- }
-
- return;
-}
-
-static surf_action_t cpu_ti_execute(void *cpu, double size)
-{
- surf_action_cpu_ti_t action = NULL;
- cpu_ti_t CPU = surf_cpu_resource_priv(cpu);
-
- XBT_IN("(%s,%g)", surf_resource_name(CPU), size);
- action =
- surf_action_new(sizeof(s_surf_action_cpu_ti_t), size, surf_cpu_model,
- CPU->state_current != SURF_RESOURCE_ON);
- action->cpu = cpu;
- action->index_heap = -1;
-
- xbt_swag_insert(CPU, cpu_ti_modified_cpu);
-
- xbt_swag_insert(action, CPU->action_set);
-
- action->suspended = 0; /* Should be useless because of the
- calloc but it seems to help valgrind... */
-
- XBT_OUT();
- return (surf_action_t) action;
-}
-
-static void cpu_ti_action_update_index_heap(void *action, int i)
-{
- ((surf_action_cpu_ti_t) action)->index_heap = i;
-}
-
-static surf_action_t cpu_ti_action_sleep(void *cpu, double duration)
-{
- surf_action_cpu_ti_t action = NULL;
-
- if (duration > 0)
- duration = MAX(duration, MAXMIN_PRECISION);
-
- XBT_IN("(%s,%g)", surf_resource_name(surf_cpu_resource_priv(cpu)), duration);
- action = (surf_action_cpu_ti_t) cpu_ti_execute(cpu, 1.0);
- action->generic_action.max_duration = duration;
- action->suspended = 2;
- if (duration == NO_MAX_DURATION) {
- /* Move to the *end* of the corresponding action set. This convention
- is used to speed up update_resource_state */
- xbt_swag_remove(action, ((surf_action_t) action)->state_set);
- ((surf_action_t) action)->state_set =
- cpu_ti_running_action_set_that_does_not_need_being_checked;
- xbt_swag_insert(action, ((surf_action_t) action)->state_set);
- }
- XBT_OUT();
- return (surf_action_t) action;
-}
-
-static void cpu_ti_action_suspend(surf_action_t action)
-{
- XBT_IN("(%p)", action);
- if (((surf_action_cpu_ti_t) action)->suspended != 2) {
- ((surf_action_cpu_ti_t) action)->suspended = 1;
- xbt_heap_remove(cpu_ti_action_heap,
- ((surf_action_cpu_ti_t) action)->index_heap);
- xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
- }
- XBT_OUT();
-}
-
-static void cpu_ti_action_resume(surf_action_t action)
-{
- XBT_IN("(%p)", action);
- if (((surf_action_cpu_ti_t) action)->suspended != 2) {
- ((surf_action_cpu_ti_t) action)->suspended = 0;
- xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
- }
- XBT_OUT();
-}
-
-static int cpu_ti_action_is_suspended(surf_action_t action)
-{
- return (((surf_action_cpu_ti_t) action)->suspended == 1);
-}
-
-static void cpu_ti_action_set_max_duration(surf_action_t action,
- double duration)
-{
- surf_action_cpu_ti_t ACT = (surf_action_cpu_ti_t) action;
- double min_finish;
-
- XBT_IN("(%p,%g)", action, duration);
-
- action->max_duration = duration;
-
- if (duration >= 0)
- min_finish =
- (action->start + action->max_duration) <
- action->finish ? (action->start +
- action->max_duration) : action->finish;
- else
- min_finish = action->finish;
-
-/* add in action heap */
- if (ACT->index_heap >= 0) {
- surf_action_cpu_ti_t heap_act =
- xbt_heap_remove(cpu_ti_action_heap, ACT->index_heap);
- if (heap_act != ACT)
- DIE_IMPOSSIBLE;
- }
- xbt_heap_push(cpu_ti_action_heap, ACT, min_finish);
-
- XBT_OUT();
-}
-
-static void cpu_ti_action_set_priority(surf_action_t action,
- double priority)
-{
- XBT_IN("(%p,%g)", action, priority);
- action->priority = priority;
- xbt_swag_insert(surf_cpu_resource_priv(ACTION_GET_CPU(action)), cpu_ti_modified_cpu);
- XBT_OUT();
-}
-
-static double cpu_ti_action_get_remains(surf_action_t action)
-{
- XBT_IN("(%p)", action);
- cpu_ti_update_remaining_amount((cpu_ti_t)
- ((surf_action_cpu_ti_t) action)->cpu,
- surf_get_clock());
- XBT_OUT();
- return action->remains;
-}
-
-static e_surf_resource_state_t cpu_ti_get_state(void *cpu)
-{
- return ((cpu_ti_t)surf_cpu_resource_priv(cpu))->state_current;
-}
-
-static double cpu_ti_get_speed(void *cpu, double load)
-{
- return load * ((cpu_ti_t)surf_cpu_resource_priv(cpu))->power_peak;
-}
-
-/**
-* \brief Auxiliary function to update the CPU power scale.
-*
-* This function uses the trace structure to return the power scale at the determined time a.
-* \param trace Trace structure to search the updated power scale
-* \param a Time
-* \return CPU power scale
-*/
-static double surf_cpu_ti_get_power_scale(surf_cpu_ti_tgmr_t trace,
- double a)
-{
- double reduced_a;
- int point;
- s_tmgr_event_t val;
-
- reduced_a = a - floor(a / trace->last_time) * trace->last_time;
- point =
- surf_cpu_ti_binary_search(trace->trace->time_points, reduced_a, 0,
- trace->trace->nb_points - 1);
- xbt_dynar_get_cpy(trace->power_trace->s_list.event_list, point, &val);
- return val.value;
-}
-
-static double cpu_ti_get_available_speed(void *cpu)
-{
- cpu_ti_t CPU = surf_cpu_resource_priv(cpu);
- CPU->power_scale =
- surf_cpu_ti_get_power_scale(CPU->avail_trace, surf_get_clock());
-/* number between 0 and 1 */
- return CPU->power_scale;
-}
-
-static void cpu_ti_finalize(void)
-{
- void **cpu;
- xbt_lib_cursor_t cursor;
- char *key;
-
- xbt_lib_foreach(host_lib, cursor, key, cpu){
- if(cpu[SURF_CPU_LEVEL])
- {
- cpu_ti_t CPU = cpu[SURF_CPU_LEVEL];
- xbt_swag_free(CPU->action_set);
- surf_cpu_ti_free_tmgr(CPU->avail_trace);
- }
- }
-
- surf_model_exit(surf_cpu_model);
- surf_cpu_model = NULL;
-
- xbt_swag_free
- (cpu_ti_running_action_set_that_does_not_need_being_checked);
- xbt_swag_free(cpu_ti_modified_cpu);
- cpu_ti_running_action_set_that_does_not_need_being_checked = NULL;
- xbt_heap_free(cpu_ti_action_heap);
-}
-
-static void surf_cpu_ti_model_init_internal(void)
-{
- s_surf_action_t action;
- s_cpu_ti_t cpu;
-
- surf_cpu_model = surf_model_init();
-
- cpu_ti_running_action_set_that_does_not_need_being_checked =
- xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
- cpu_ti_modified_cpu =
- xbt_swag_new(xbt_swag_offset(cpu, modified_cpu_hookup));
-
- surf_cpu_model->name = "cpu_ti";
-
- surf_cpu_model->action_unref = cpu_ti_action_unref;
- surf_cpu_model->action_cancel = cpu_ti_action_cancel;
- surf_cpu_model->action_state_set = cpu_ti_action_state_set;
-
- surf_cpu_model->model_private->resource_used = cpu_ti_resource_used;
- surf_cpu_model->model_private->share_resources = cpu_ti_share_resources;
- surf_cpu_model->model_private->update_actions_state =
- cpu_ti_update_actions_state;
- surf_cpu_model->model_private->update_resource_state =
- cpu_ti_update_resource_state;
- surf_cpu_model->model_private->finalize = cpu_ti_finalize;
-
- surf_cpu_model->suspend = cpu_ti_action_suspend;
- surf_cpu_model->resume = cpu_ti_action_resume;
- surf_cpu_model->is_suspended = cpu_ti_action_is_suspended;
- surf_cpu_model->set_max_duration = cpu_ti_action_set_max_duration;
- surf_cpu_model->set_priority = cpu_ti_action_set_priority;
- surf_cpu_model->get_remains = cpu_ti_action_get_remains;
-
- surf_cpu_model->extension.cpu.execute = cpu_ti_execute;
- surf_cpu_model->extension.cpu.sleep = cpu_ti_action_sleep;
-
- surf_cpu_model->extension.cpu.get_state = cpu_ti_get_state;
- surf_cpu_model->extension.cpu.get_speed = cpu_ti_get_speed;
- surf_cpu_model->extension.cpu.get_available_speed =
- cpu_ti_get_available_speed;
- surf_cpu_model->extension.cpu.add_traces = add_traces_cpu_ti;
-
- cpu_ti_action_heap = xbt_heap_new(8, NULL);
- xbt_heap_set_update_callback(cpu_ti_action_heap,
- cpu_ti_action_update_index_heap);
-
-}
-
-void surf_cpu_model_init_ti()
-{
- xbt_assert(!surf_cpu_model,"CPU model already initialized. This should not happen.");
- surf_cpu_ti_model_init_internal();
- cpu_ti_define_callbacks();
- xbt_dynar_push(model_list, &surf_cpu_model);
-}
-
-
-/**
-* \brief Integrate trace
-*
-* Wrapper around surf_cpu_integrate_trace_simple() to get
-* the cyclic effect.
-*
-* \param trace Trace structure.
-* \param a Begin of interval
-* \param b End of interval
-* \return the integrate value. -1 if an error occurs.
-*/
-static double surf_cpu_ti_integrate_trace(surf_cpu_ti_tgmr_t trace,
- double a, double b)
-{
- double first_chunk;
- double middle_chunk;
- double last_chunk;
- int a_index, b_index;
-
- if ((a < 0.0) || (a > b)) {
- XBT_CRITICAL
- ("Error, invalid integration interval [%.2f,%.2f]. You probably have a task executing with negative computation amount. Check your code.",
- a, b);
- xbt_abort();
- }
- if (a == b)
- return 0.0;
-
- if (trace->type == TRACE_FIXED) {
- return ((b - a) * trace->value);
- }
-
- if (ceil(a / trace->last_time) == a / trace->last_time)
- a_index = 1 + (int) (ceil(a / trace->last_time));
- else
- a_index = (int) (ceil(a / trace->last_time));
-
- b_index = (int) (floor(b / trace->last_time));
-
- if (a_index > b_index) { /* Same chunk */
- return surf_cpu_ti_integrate_trace_simple(trace->trace,
- a - (a_index -
- 1) * trace->last_time,
- b -
- (b_index) *
- trace->last_time);
- }
-
- first_chunk = surf_cpu_ti_integrate_trace_simple(trace->trace,
- a - (a_index -
- 1) *
- trace->last_time,
- trace->last_time);
- middle_chunk = (b_index - a_index) * trace->total;
- last_chunk = surf_cpu_ti_integrate_trace_simple(trace->trace,
- 0.0,
- b -
- (b_index) *
- trace->last_time);
-
- XBT_DEBUG("first_chunk=%.2f middle_chunk=%.2f last_chunk=%.2f\n",
- first_chunk, middle_chunk, last_chunk);
-
- return (first_chunk + middle_chunk + last_chunk);
-}
-
-/**
- * \brief Auxiliary function to calculate the integral between a and b.
- * It simply calculates the integral at point a and b and returns the difference
- * between them.
- * \param trace Trace structure
- * \param a Initial point
- * \param b Final point
- * \return Integral
-*/
-static double surf_cpu_ti_integrate_trace_simple(surf_cpu_ti_trace_t trace,
- double a, double b)
-{
- return surf_cpu_ti_integrate_trace_simple_point(trace,
- b) -
- surf_cpu_ti_integrate_trace_simple_point(trace, a);
-}
-
-/**
- * \brief Auxiliary function to calculate the integral at point a.
- * \param trace Trace structure
- * \param a point
- * \return Integral
-*/
-static double surf_cpu_ti_integrate_trace_simple_point(surf_cpu_ti_trace_t
- trace, double a)
-{
- double integral = 0;
- int ind;
- double a_aux = a;
- ind =
- surf_cpu_ti_binary_search(trace->time_points, a, 0,
- trace->nb_points - 1);
- integral += trace->integral[ind];
- XBT_DEBUG
- ("a %f ind %d integral %f ind + 1 %f ind %f time +1 %f time %f",
- a, ind, integral, trace->integral[ind + 1], trace->integral[ind],
- trace->time_points[ind + 1], trace->time_points[ind]);
- double_update(&a_aux, trace->time_points[ind]);
- if (a_aux > 0)
- integral +=
- ((trace->integral[ind + 1] -
- trace->integral[ind]) / (trace->time_points[ind + 1] -
- trace->time_points[ind])) * (a -
- trace->
- time_points
- [ind]);
- XBT_DEBUG("Integral a %f = %f", a, integral);
-
- return integral;
-}
-
-/**
-* \brief Calculate the time needed to execute "amount" on cpu.
-*
-* Here, amount can span multiple trace periods
-*
-* \param trace CPU trace structure
-* \param a Initial time
-* \param amount Amount to be executed
-* \return End time
-*/
-static double surf_cpu_ti_solve_trace(surf_cpu_ti_tgmr_t trace, double a,
- double amount)
-{
- int quotient;
- double reduced_b;
- double reduced_amount;
- double reduced_a;
- double b;
-
-/* Fix very small negative numbers */
- if ((a < 0.0) && (a > -EPSILON)) {
- a = 0.0;
- }
- if ((amount < 0.0) && (amount > -EPSILON)) {
- amount = 0.0;
- }
-
-/* Sanity checks */
- if ((a < 0.0) || (amount < 0.0)) {
- XBT_CRITICAL
- ("Error, invalid parameters [a = %.2f, amount = %.2f]. You probably have a task executing with negative computation amount. Check your code.",
- a, amount);
- xbt_abort();
- }
-
-/* At this point, a and amount are positive */
-
- if (amount < EPSILON)
- return a;
-
-/* Is the trace fixed ? */
- if (trace->type == TRACE_FIXED) {
- return (a + (amount / trace->value));
- }
-
- XBT_DEBUG("amount %f total %f", amount, trace->total);
-/* Reduce the problem to one where amount <= trace_total */
- quotient = (int) (floor(amount / trace->total));
- reduced_amount = (trace->total) * ((amount / trace->total) -
- floor(amount / trace->total));
- reduced_a = a - (trace->last_time) * (int) (floor(a / trace->last_time));
-
- XBT_DEBUG("Quotient: %d reduced_amount: %f reduced_a: %f", quotient,
- reduced_amount, reduced_a);
-
-/* Now solve for new_amount which is <= trace_total */
-/*
- fprintf(stderr,"reduced_a = %.2f\n",reduced_a);
- fprintf(stderr,"reduced_amount = %.2f\n",reduced_amount);
- */
- reduced_b =
- surf_cpu_ti_solve_trace_somewhat_simple(trace, reduced_a,
- reduced_amount);
-
-/* Re-map to the original b and amount */
- b = (trace->last_time) * (int) (floor(a / trace->last_time)) +
- (quotient * trace->last_time) + reduced_b;
- return b;
-}
-
-/**
-* \brief Auxiliary function to solve integral
-*
-* Here, amount is <= trace->total
-* and a <=trace->last_time
-*
-*/
-static double surf_cpu_ti_solve_trace_somewhat_simple(surf_cpu_ti_tgmr_t
- trace, double a,
- double amount)
-{
- double amount_till_end;
- double b;
-
- XBT_DEBUG("Solve integral: [%.2f, amount=%.2f]", a, amount);
- amount_till_end =
- surf_cpu_ti_integrate_trace(trace, a, trace->last_time);
-/*
- fprintf(stderr,"amount_till_end=%.2f\n",amount_till_end);
- */
-
- if (amount_till_end > amount) {
- b = surf_cpu_ti_solve_trace_simple(trace->trace, a, amount);
- } else {
- b = trace->last_time +
- surf_cpu_ti_solve_trace_simple(trace->trace, 0.0,
- amount - amount_till_end);
- }
- return b;
-}
-
-/**
- * \brief Auxiliary function to solve integral.
- * It returns the date when the requested amount of flops is available
- * \param trace Trace structure
- * \param a Initial point
- * \param amount Amount of flops
- * \return The date when amount is available.
-*/
-static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace,
- double a, double amount)
-{
- double integral_a;
- int ind;
- double time;
- integral_a = surf_cpu_ti_integrate_trace_simple_point(trace, a);
- ind =
- surf_cpu_ti_binary_search(trace->integral, integral_a + amount, 0,
- trace->nb_points - 1);
- time = trace->time_points[ind];
- time +=
- (integral_a + amount -
- trace->integral[ind]) / ((trace->integral[ind + 1] -
- trace->integral[ind]) /
- (trace->time_points[ind + 1] -
- trace->time_points[ind]));
-
- return time;
-}
-
-/**
- * \brief Binary search in array.
- * It returns the first point of the interval in which "a" is.
- * \param array Array
- * \param a Value to search
- * \param low Low bound to search in array
- * \param high Upper bound to search in array
- * \return Index of point
-*/
-static int surf_cpu_ti_binary_search(double *array, double a, int low,
- int high)
-{
- xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than"
- " high (%d)", low, high);
-
- int mid;
- do {
- mid = low + (high - low) / 2;
- XBT_DEBUG("a %f low %d high %d mid %d value %f", a, low, high, mid,
- array[mid]);
-
- if (array[mid] > a)
- high = mid;
- else
- low = mid;
- }
- while (low < high - 1);
-
- return low;
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "cpu_ti.hpp"
+#include "trace_mgr_private.h"
+#include "xbt/heap.h"
+
+#ifndef SURF_MODEL_CPUTI_H_
+#define SURF_MODEL_CPUTI_H_
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf_cpu,
+ "Logging specific to the SURF CPU TRACE INTEGRATION module");
+
+static void cpu_ti_action_update_index_heap(void *action, int i);
+
+/*********
+ * Trace *
+ *********/
+
+CpuTiTrace::CpuTiTrace(tmgr_trace_t power_trace)
+{
+ s_tmgr_event_t val;
+ unsigned int cpt;
+ double integral = 0;
+ double time = 0;
+ int i = 0;
+ p_timePoints = (double*) xbt_malloc0(sizeof(double) *
+ (xbt_dynar_length(power_trace->s_list.event_list) + 1));
+ p_integral = (double*) xbt_malloc0(sizeof(double) *
+ (xbt_dynar_length(power_trace->s_list.event_list) + 1));
+ m_nbPoints = xbt_dynar_length(power_trace->s_list.event_list);
+ xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
+ p_timePoints[i] = time;
+ p_integral[i] = integral;
+ integral += val.delta * val.value;
+ time += val.delta;
+ i++;
+ }
+ p_timePoints[i] = time;
+ p_integral[i] = integral;
+}
+
+CpuTiTrace::~CpuTiTrace()
+{
+ xbt_free(p_timePoints);
+ xbt_free(p_integral);
+}
+
+CpuTiTgmr::~CpuTiTgmr()
+{
+ if (p_trace)
+ delete p_trace;
+}
+
+/**
+* \brief Integrate trace
+*
+* Wrapper around surf_cpu_integrate_trace_simple() to get
+* the cyclic effect.
+*
+* \param trace Trace structure.
+* \param a Begin of interval
+* \param b End of interval
+* \return the integrate value. -1 if an error occurs.
+*/
+double CpuTiTgmr::integrate(double a, double b)
+{
+ double first_chunk;
+ double middle_chunk;
+ double last_chunk;
+ int a_index, b_index;
+
+ if ((a < 0.0) || (a > b)) {
+ XBT_CRITICAL
+ ("Error, invalid integration interval [%.2f,%.2f]. You probably have a task executing with negative computation amount. Check your code.",
+ a, b);
+ xbt_abort();
+ }
+ if (a == b)
+ return 0.0;
+
+ if (m_type == TRACE_FIXED) {
+ return ((b - a) * m_value);
+ }
+
+ if (ceil(a / m_lastTime) == a / m_lastTime)
+ a_index = 1 + (int) (ceil(a / m_lastTime));
+ else
+ a_index = (int) (ceil(a / m_lastTime));
+
+ b_index = (int) (floor(b / m_lastTime));
+
+ if (a_index > b_index) { /* Same chunk */
+ return p_trace->integrateSimple(a - (a_index -
+ 1) * m_lastTime,
+ b -
+ (b_index) *
+ m_lastTime);
+ }
+
+ first_chunk = p_trace->integrateSimple(a - (a_index -
+ 1) *
+ m_lastTime,
+ m_lastTime);
+ middle_chunk = (b_index - a_index) * m_total;
+ last_chunk = p_trace->integrateSimple(0.0,
+ b -
+ (b_index) *
+ m_lastTime);
+
+ XBT_DEBUG("first_chunk=%.2f middle_chunk=%.2f last_chunk=%.2f\n",
+ first_chunk, middle_chunk, last_chunk);
+
+ return (first_chunk + middle_chunk + last_chunk);
+}
+
+/**
+ * \brief Auxiliary function to calculate the integral between a and b.
+ * It simply calculates the integral at point a and b and returns the difference
+ * between them.
+ * \param trace Trace structure
+ * \param a Initial point
+ * \param b Final point
+ * \return Integral
+*/
+double CpuTiTrace::integrateSimple(double a, double b)
+{
+ return integrateSimplePoint(b) - integrateSimplePoint(a);
+}
+
+/**
+ * \brief Auxiliary function to calculate the integral at point a.
+ * \param trace Trace structure
+ * \param a point
+ * \return Integral
+*/
+double CpuTiTrace::integrateSimplePoint(double a)
+{
+ double integral = 0;
+ int ind;
+ double a_aux = a;
+ ind = binarySearch(p_timePoints, a, 0, m_nbPoints - 1);
+ integral += p_integral[ind];
+ XBT_DEBUG
+ ("a %f ind %d integral %f ind + 1 %f ind %f time +1 %f time %f",
+ a, ind, integral, p_integral[ind + 1], p_integral[ind],
+ p_timePoints[ind + 1], p_timePoints[ind]);
+ double_update(&a_aux, p_timePoints[ind]);
+ if (a_aux > 0)
+ integral +=
+ ((p_integral[ind + 1] -
+ p_integral[ind]) / (p_timePoints[ind + 1] -
+ p_timePoints[ind])) * (a - p_timePoints[ind]);
+ XBT_DEBUG("Integral a %f = %f", a, integral);
+
+ return integral;
+}
+
+/**
+* \brief Calculate the time needed to execute "amount" on cpu.
+*
+* Here, amount can span multiple trace periods
+*
+* \param trace CPU trace structure
+* \param a Initial time
+* \param amount Amount to be executed
+* \return End time
+*/
+double CpuTiTgmr::solve(double a, double amount)
+{
+ int quotient;
+ double reduced_b;
+ double reduced_amount;
+ double reduced_a;
+ double b;
+
+/* Fix very small negative numbers */
+ if ((a < 0.0) && (a > -EPSILON)) {
+ a = 0.0;
+ }
+ if ((amount < 0.0) && (amount > -EPSILON)) {
+ amount = 0.0;
+ }
+
+/* Sanity checks */
+ if ((a < 0.0) || (amount < 0.0)) {
+ XBT_CRITICAL
+ ("Error, invalid parameters [a = %.2f, amount = %.2f]. You probably have a task executing with negative computation amount. Check your code.",
+ a, amount);
+ xbt_abort();
+ }
+
+/* At this point, a and amount are positive */
+
+ if (amount < EPSILON)
+ return a;
+
+/* Is the trace fixed ? */
+ if (m_type == TRACE_FIXED) {
+ return (a + (amount / m_value));
+ }
+
+ XBT_DEBUG("amount %f total %f", amount, m_total);
+/* Reduce the problem to one where amount <= trace_total */
+ quotient = (int) (floor(amount / m_total));
+ reduced_amount = (m_total) * ((amount / m_total) -
+ floor(amount / m_total));
+ reduced_a = a - (m_lastTime) * (int) (floor(a / m_lastTime));
+
+ XBT_DEBUG("Quotient: %d reduced_amount: %f reduced_a: %f", quotient,
+ reduced_amount, reduced_a);
+
+/* Now solve for new_amount which is <= trace_total */
+/*
+ fprintf(stderr,"reduced_a = %.2f\n",reduced_a);
+ fprintf(stderr,"reduced_amount = %.2f\n",reduced_amount);
+ */
+ reduced_b = solveSomewhatSimple(reduced_a, reduced_amount);
+
+/* Re-map to the original b and amount */
+ b = (m_lastTime) * (int) (floor(a / m_lastTime)) +
+ (quotient * m_lastTime) + reduced_b;
+ return b;
+}
+
+/**
+* \brief Auxiliary function to solve integral
+*
+* Here, amount is <= trace->total
+* and a <=trace->last_time
+*
+*/
+double CpuTiTgmr::solveSomewhatSimple(double a, double amount)
+{
+ double amount_till_end;
+ double b;
+
+ XBT_DEBUG("Solve integral: [%.2f, amount=%.2f]", a, amount);
+ amount_till_end = integrate(a, m_lastTime);
+/*
+ fprintf(stderr,"amount_till_end=%.2f\n",amount_till_end);
+ */
+
+ if (amount_till_end > amount) {
+ b = p_trace->solveSimple(a, amount);
+ } else {
+ b = m_lastTime + p_trace->solveSimple(0.0, amount - amount_till_end);
+ }
+ return b;
+}
+
+/**
+ * \brief Auxiliary function to solve integral.
+ * It returns the date when the requested amount of flops is available
+ * \param trace Trace structure
+ * \param a Initial point
+ * \param amount Amount of flops
+ * \return The date when amount is available.
+*/
+double CpuTiTrace::solveSimple(double a, double amount)
+{
+ double integral_a;
+ int ind;
+ double time;
+ integral_a = integrateSimplePoint(a);
+ ind = binarySearch(p_integral, integral_a + amount, 0, m_nbPoints - 1);
+ time = p_timePoints[ind];
+ time +=
+ (integral_a + amount -
+ p_integral[ind]) / ((p_integral[ind + 1] -
+ p_integral[ind]) /
+ (p_timePoints[ind + 1] -
+ p_timePoints[ind]));
+
+ return time;
+}
+
+/**
+* \brief Auxiliary function to update the CPU power scale.
+*
+* This function uses the trace structure to return the power scale at the determined time a.
+* \param trace Trace structure to search the updated power scale
+* \param a Time
+* \return CPU power scale
+*/
+double CpuTiTgmr::getPowerScale(double a)
+{
+ double reduced_a;
+ int point;
+ s_tmgr_event_t val;
+
+ reduced_a = a - floor(a / m_lastTime) * m_lastTime;
+ point = p_trace->binarySearch(p_trace->p_timePoints, reduced_a, 0,
+ p_trace->m_nbPoints - 1);
+ xbt_dynar_get_cpy(p_powerTrace->s_list.event_list, point, &val);
+ return val.value;
+}
+
+/**
+* \brief Creates a new integration trace from a tmgr_trace_t
+*
+* \param power_trace CPU availability trace
+* \param value Percentage of CPU power available (useful to fixed tracing)
+* \param spacing Initial spacing
+* \return Integration trace structure
+*/
+CpuTiTgmr::CpuTiTgmr(tmgr_trace_t power_trace, double value)
+{
+ double total_time = 0.0;
+ s_tmgr_event_t val;
+ unsigned int cpt;
+ p_trace = 0;
+
+/* no availability file, fixed trace */
+ if (!power_trace) {
+ m_type = TRACE_FIXED;
+ m_value = value;
+ XBT_DEBUG("No availability trace. Constant value = %f", value);
+ return;
+ }
+
+ /* only one point available, fixed trace */
+ if (xbt_dynar_length(power_trace->s_list.event_list) == 1) {
+ xbt_dynar_get_cpy(power_trace->s_list.event_list, 0, &val);
+ m_type = TRACE_FIXED;
+ m_value = val.value;
+ return;
+ }
+
+ m_type = TRACE_DYNAMIC;
+ p_powerTrace = power_trace;
+
+ /* count the total time of trace file */
+ xbt_dynar_foreach(power_trace->s_list.event_list, cpt, val) {
+ total_time += val.delta;
+ }
+ p_trace = new CpuTiTrace(power_trace);
+ m_lastTime = total_time;
+ m_total = p_trace->integrateSimple(0, total_time);
+
+ XBT_DEBUG("Total integral %f, last_time %f ",
+ m_total, m_lastTime);
+}
+
+/**
+ * \brief Binary search in array.
+ * It returns the first point of the interval in which "a" is.
+ * \param array Array
+ * \param a Value to search
+ * \param low Low bound to search in array
+ * \param high Upper bound to search in array
+ * \return Index of point
+*/
+int CpuTiTrace::binarySearch(double *array, double a, int low, int high)
+{
+ xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than"
+ " high (%d)", low, high);
+
+ int mid;
+ do {
+ mid = low + (high - low) / 2;
+ XBT_DEBUG("a %f low %d high %d mid %d value %f", a, low, high, mid,
+ array[mid]);
+
+ if (array[mid] > a)
+ high = mid;
+ else
+ low = mid;
+ }
+ while (low < high - 1);
+
+ return low;
+}
+
+/*************
+ * CallBacks *
+ *************/
+
+static void parse_cpu_ti_init(sg_platf_host_cbarg_t host){
+ ((CpuTiModelPtr)surf_cpu_model_pm)->parseInit(host);
+}
+
+static void add_traces_cpu_ti(){
+ surf_cpu_model_pm->addTraces();
+}
+
+static void cpu_ti_define_callbacks()
+{
+ sg_platf_host_add_cb(parse_cpu_ti_init);
+ sg_platf_postparse_add_cb(add_traces_cpu_ti);
+}
+
+/*********
+ * Model *
+ *********/
+
+void surf_cpu_model_init_ti()
+{
+ xbt_assert(!surf_cpu_model_pm,"CPU model already initialized. This should not happen.");
+ xbt_assert(!surf_cpu_model_vm,"CPU model already initialized. This should not happen.");
+
+ surf_cpu_model_pm = new CpuTiModel();
+ surf_cpu_model_vm = new CpuTiModel();
+
+ cpu_ti_define_callbacks();
+ ModelPtr model_pm = static_cast<ModelPtr>(surf_cpu_model_pm);
+ ModelPtr model_vm = static_cast<ModelPtr>(surf_cpu_model_vm);
+ xbt_dynar_push(model_list, &model_pm);
+ xbt_dynar_push(model_list, &model_vm);
+}
+
+CpuTiModel::CpuTiModel() : CpuModel("cpu_ti")
+{
+ CpuTiPtr cpu = NULL;
+
+ p_runningActionSetThatDoesNotNeedBeingChecked = new ActionList();
+
+ p_modifiedCpu =
+ xbt_swag_new(xbt_swag_offset(*cpu, p_modifiedCpuHookup));
+
+ p_tiActionHeap = xbt_heap_new(8, NULL);
+ xbt_heap_set_update_callback(p_tiActionHeap,
+ cpu_ti_action_update_index_heap);
+}
+
+CpuTiModel::~CpuTiModel()
+{
+ surf_cpu_model_pm = NULL;
+
+ delete p_runningActionSetThatDoesNotNeedBeingChecked;
+ xbt_swag_free(p_modifiedCpu);
+ xbt_heap_free(p_tiActionHeap);
+}
+
+void CpuTiModel::parseInit(sg_platf_host_cbarg_t host)
+{
+ createResource(host->id,
+ host->power_peak,
+ host->pstate,
+ host->power_scale,
+ host->power_trace,
+ host->core_amount,
+ host->initial_state,
+ host->state_trace,
+ host->properties);
+}
+
+CpuTiPtr CpuTiModel::createResource(const char *name,
+ xbt_dynar_t powerPeak,
+ int pstate,
+ double powerScale,
+ tmgr_trace_t powerTrace,
+ int core,
+ e_surf_resource_state_t stateInitial,
+ tmgr_trace_t stateTrace,
+ xbt_dict_t cpuProperties)
+{
+ xbt_assert(core==1,"Multi-core not handled with this model yet");
+ xbt_assert(!surf_cpu_resource_priv(surf_cpu_resource_by_name(name)),
+ "Host '%s' declared several times in the platform file",
+ name);
+ CpuTiPtr cpu = new CpuTi(this, name, powerPeak, pstate, powerScale, powerTrace,
+ core, stateInitial, stateTrace, cpuProperties);
+ xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast<ResourcePtr>(cpu));
+ return cpu;
+}
+
+CpuTiActionPtr CpuTiModel::createAction(double /*cost*/, bool /*failed*/)
+{
+ return NULL;//new CpuTiAction(this, cost, failed);
+}
+
+double CpuTiModel::shareResources(double now)
+{
+ void *_cpu, *_cpu_next;
+ double min_action_duration = -1;
+
+/* iterates over modified cpus to update share resources */
+ xbt_swag_foreach_safe(_cpu, _cpu_next, p_modifiedCpu) {
+ static_cast<CpuTiPtr>(_cpu)->updateActionsFinishTime(now);
+ }
+/* get the min next event if heap not empty */
+ if (xbt_heap_size(p_tiActionHeap) > 0)
+ min_action_duration = xbt_heap_maxkey(p_tiActionHeap) - now;
+
+ XBT_DEBUG("Share resources, min next event date: %f", min_action_duration);
+
+ return min_action_duration;
+}
+
+void CpuTiModel::updateActionsState(double now, double /*delta*/)
+{
+ while ((xbt_heap_size(p_tiActionHeap) > 0)
+ && (xbt_heap_maxkey(p_tiActionHeap) <= now)) {
+ CpuTiActionPtr action = (CpuTiActionPtr) xbt_heap_pop(p_tiActionHeap);
+ XBT_DEBUG("Action %p: finish", action);
+ action->finish();
+ /* set the remains to 0 due to precision problems when updating the remaining amount */
+ action->setRemains(0);
+ action->setState(SURF_ACTION_DONE);
+ /* update remaining amount of all actions */
+ action->p_cpu->updateRemainingAmount(surf_get_clock());
+ }
+}
+
+void CpuTiModel::addTraces()
+{
+ xbt_dict_cursor_t cursor = NULL;
+ char *trace_name, *elm;
+
+ static int called = 0;
+
+ if (called)
+ return;
+ called = 1;
+
+/* connect all traces relative to hosts */
+ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ CpuTiPtr cpu = static_cast<CpuTiPtr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+ xbt_assert(cpu, "Host %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ if (cpu->p_stateEvent) {
+ XBT_DEBUG("Trace already configured for this CPU(%s), ignoring it",
+ elm);
+ continue;
+ }
+ XBT_DEBUG("Add state trace: %s to CPU(%s)", trace_name, elm);
+ cpu->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(cpu));
+ }
+
+ xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ CpuTiPtr cpu = static_cast<CpuTiPtr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+ xbt_assert(cpu, "Host %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ XBT_DEBUG("Add power trace: %s to CPU(%s)", trace_name, elm);
+ if (cpu->p_availTrace)
+ delete cpu->p_availTrace;
+
+ cpu->p_availTrace = new CpuTiTgmr(trace, cpu->m_powerScale);
+
+ /* add a fake trace event if periodicity == 0 */
+ if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) {
+ s_tmgr_event_t val;
+ xbt_dynar_get_cpy(trace->s_list.event_list,
+ xbt_dynar_length(trace->s_list.event_list) - 1, &val);
+ if (val.delta == 0) {
+ tmgr_trace_t empty_trace;
+ empty_trace = tmgr_empty_trace_new();
+ cpu->p_powerEvent =
+ tmgr_history_add_trace(history, empty_trace,
+ cpu->p_availTrace->m_lastTime, 0, static_cast<ResourcePtr>(cpu));
+ }
+ }
+ }
+}
+
+/************
+ * Resource *
+ ************/
+CpuTi::CpuTi(CpuTiModelPtr model, const char *name, xbt_dynar_t powerPeak,
+ int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+ e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+ xbt_dict_t properties)
+: Cpu(model, name, properties, core, 0, powerScale)
+{
+ p_powerEvent = NULL;
+ setState(stateInitial);
+ m_powerScale = powerScale;
+ m_core = core;
+ tmgr_trace_t empty_trace;
+ s_tmgr_event_t val;
+ xbt_assert(core==1,"Multi-core not handled with this model yet");
+ XBT_DEBUG("power scale %f", powerScale);
+ p_availTrace = new CpuTiTgmr(powerTrace, powerScale);
+
+ CpuTiActionPtr action = NULL;
+ p_actionSet = xbt_swag_new(xbt_swag_offset(*action, p_cpuListHookup));
+
+ m_lastUpdate = 0;
+
+ xbt_dynar_get_cpy(powerPeak, 0, &m_powerPeak);
+ xbt_dynar_free(&powerPeak); /* kill memory leak */
+ m_pstate = pstate;
+ XBT_DEBUG("CPU create: peak=%f, pstate=%d", m_powerPeak, m_pstate);
+
+ p_modifiedCpuHookup.prev = 0;
+ p_modifiedCpuHookup.next = 0;
+
+ if (stateTrace)
+ p_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, static_cast<ResourcePtr>(this));
+ if (powerTrace && xbt_dynar_length(powerTrace->s_list.event_list) > 1) {
+ // add a fake trace event if periodicity == 0
+ xbt_dynar_get_cpy(powerTrace->s_list.event_list,
+ xbt_dynar_length(powerTrace->s_list.event_list) - 1, &val);
+ if (val.delta == 0) {
+ empty_trace = tmgr_empty_trace_new();
+ p_powerEvent =
+ tmgr_history_add_trace(history, empty_trace,
+ p_availTrace->m_lastTime, 0, static_cast<ResourcePtr>(this));
+ }
+ }
+};
+
+CpuTi::~CpuTi(){
+delete p_availTrace;
+xbt_swag_free(p_actionSet);
+}
+
+void CpuTi::updateState(tmgr_trace_event_t event_type,
+ double value, double date)
+{
+ void *_action;
+ CpuTiActionPtr action;
+
+ if (event_type == p_powerEvent) {
+ tmgr_trace_t power_trace;
+ CpuTiTgmrPtr trace;
+ s_tmgr_event_t val;
+
+ XBT_DEBUG("Finish trace date: %f value %f date %f", surf_get_clock(),
+ value, date);
+ /* update remaining of actions and put in modified cpu swag */
+ updateRemainingAmount(date);
+ xbt_swag_insert(this, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+
+ power_trace = p_availTrace->p_powerTrace;
+ xbt_dynar_get_cpy(power_trace->s_list.event_list,
+ xbt_dynar_length(power_trace->s_list.event_list) - 1, &val);
+ /* free old trace */
+ delete p_availTrace;
+ m_powerScale = val.value;
+
+ trace = new CpuTiTgmr(TRACE_FIXED, val.value);
+ XBT_DEBUG("value %f", val.value);
+
+ p_availTrace = trace;
+
+ if (tmgr_trace_event_free(event_type))
+ p_powerEvent = NULL;
+
+ } else if (event_type == p_stateEvent) {
+ if (value > 0) {
+ if(getState() == SURF_RESOURCE_OFF)
+ xbt_dynar_push_as(host_that_restart, char*, (char *)getName());
+ setState(SURF_RESOURCE_ON);
+ } else {
+ setState(SURF_RESOURCE_OFF);
+
+ /* put all action running on cpu to failed */
+ xbt_swag_foreach(_action, p_actionSet) {
+ action = static_cast<CpuTiActionPtr>(_action);
+ if (action->getState() == SURF_ACTION_RUNNING
+ || action->getState() == SURF_ACTION_READY
+ || action->getState() == SURF_ACTION_NOT_IN_THE_SYSTEM) {
+ action->setFinishTime(date);
+ action->setState(SURF_ACTION_FAILED);
+ if (action->m_indexHeap >= 0) {
+ CpuTiActionPtr heap_act = (CpuTiActionPtr)
+ xbt_heap_remove(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, action->m_indexHeap);
+ if (heap_act != action)
+ DIE_IMPOSSIBLE;
+ }
+ }
+ }
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_stateEvent = NULL;
+ } else {
+ XBT_CRITICAL("Unknown event ! \n");
+ xbt_abort();
+ }
+
+ return;
+}
+
+void CpuTi::updateActionsFinishTime(double now)
+{
+ void *_action;
+ CpuTiActionPtr action;
+ double sum_priority = 0.0, total_area, min_finish = -1;
+
+/* update remaning amount of actions */
+updateRemainingAmount(now);
+
+ xbt_swag_foreach(_action, p_actionSet) {
+ action = static_cast<CpuTiActionPtr>(_action);
+ /* action not running, skip it */
+ if (action->getStateSet() !=
+ surf_cpu_model_pm->getRunningActionSet())
+ continue;
+
+ /* bogus priority, skip it */
+ if (action->getPriority() <= 0)
+ continue;
+
+ /* action suspended, skip it */
+ if (action->m_suspended != 0)
+ continue;
+
+ sum_priority += 1.0 / action->getPriority();
+ }
+ m_sumPriority = sum_priority;
+
+ xbt_swag_foreach(_action, p_actionSet) {
+ action = static_cast<CpuTiActionPtr>(_action);
+ min_finish = -1;
+ /* action not running, skip it */
+ if (action->getStateSet() !=
+ surf_cpu_model_pm->getRunningActionSet())
+ continue;
+
+ /* verify if the action is really running on cpu */
+ if (action->m_suspended == 0 && action->getPriority() > 0) {
+ /* total area needed to finish the action. Used in trace integration */
+ total_area =
+ (action->getRemains()) * sum_priority *
+ action->getPriority();
+
+ total_area /= m_powerPeak;
+
+ action->setFinishTime(p_availTrace->solve(now, total_area));
+ /* verify which event will happen before (max_duration or finish time) */
+ if (action->getMaxDuration() != NO_MAX_DURATION &&
+ action->getStartTime() + action->getMaxDuration() < action->m_finish)
+ min_finish = action->getStartTime() + action->getMaxDuration();
+ else
+ min_finish = action->m_finish;
+ } else {
+ /* put the max duration time on heap */
+ if (action->getMaxDuration() != NO_MAX_DURATION)
+ min_finish = action->getStartTime() + action->getMaxDuration();
+ }
+ /* add in action heap */
+ XBT_DEBUG("action(%p) index %d", action, action->m_indexHeap);
+ if (action->m_indexHeap >= 0) {
+ CpuTiActionPtr heap_act = (CpuTiActionPtr)
+ xbt_heap_remove(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, action->m_indexHeap);
+ if (heap_act != action)
+ DIE_IMPOSSIBLE;
+ }
+ if (min_finish != NO_MAX_DURATION)
+ xbt_heap_push(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, action, min_finish);
+
+ XBT_DEBUG
+ ("Update finish time: Cpu(%s) Action: %p, Start Time: %f Finish Time: %f Max duration %f",
+ getName(), action, action->getStartTime(),
+ action->m_finish,
+ action->getMaxDuration());
+ }
+/* remove from modified cpu */
+ xbt_swag_remove(this, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+}
+
+bool CpuTi::isUsed()
+{
+ return xbt_swag_size(p_actionSet);
+}
+
+
+
+double CpuTi::getAvailableSpeed()
+{
+ m_powerScale = p_availTrace->getPowerScale(surf_get_clock());
+ return Cpu::getAvailableSpeed();
+}
+
+/**
+* \brief Update the remaining amount of actions
+*
+* \param now Current time
+*/
+void CpuTi::updateRemainingAmount(double now)
+{
+ double area_total;
+ void* _action;
+ CpuTiActionPtr action;
+
+ /* already updated */
+ if (m_lastUpdate >= now)
+ return;
+
+/* calcule the surface */
+ area_total = p_availTrace->integrate(m_lastUpdate, now) * m_powerPeak;
+ XBT_DEBUG("Flops total: %f, Last update %f", area_total,
+ m_lastUpdate);
+
+ xbt_swag_foreach(_action, p_actionSet) {
+ action = static_cast<CpuTiActionPtr>(_action);
+ /* action not running, skip it */
+ if (action->getStateSet() !=
+ getModel()->getRunningActionSet())
+ continue;
+
+ /* bogus priority, skip it */
+ if (action->getPriority() <= 0)
+ continue;
+
+ /* action suspended, skip it */
+ if (action->m_suspended != 0)
+ continue;
+
+ /* action don't need update */
+ if (action->getStartTime() >= now)
+ continue;
+
+ /* skip action that are finishing now */
+ if (action->m_finish >= 0
+ && action->m_finish <= now)
+ continue;
+
+ /* update remaining */
+ action->updateRemains(area_total / (m_sumPriority * action->getPriority()));
+ XBT_DEBUG("Update remaining action(%p) remaining %f", action,
+ action->m_remains);
+ }
+ m_lastUpdate = now;
+}
+
+CpuActionPtr CpuTi::execute(double size)
+{
+ XBT_IN("(%s,%g)", getName(), size);
+ CpuTiActionPtr action = new CpuTiAction(static_cast<CpuTiModelPtr>(getModel()), size, getState() != SURF_RESOURCE_ON, this);
+
+ xbt_swag_insert(action, p_actionSet);
+
+ XBT_OUT();
+ return action;
+}
+
+
+CpuActionPtr CpuTi::sleep(double duration)
+{
+ if (duration > 0)
+ duration = MAX(duration, MAXMIN_PRECISION);
+
+ XBT_IN("(%s,%g)", getName(), duration);
+ CpuTiActionPtr action = new CpuTiAction(static_cast<CpuTiModelPtr>(getModel()), 1.0, getState() != SURF_RESOURCE_ON, this);
+
+ action->m_maxDuration = duration;
+ action->m_suspended = 2;
+ if (duration == NO_MAX_DURATION) {
+ /* Move to the *end* of the corresponding action set. This convention
+ is used to speed up update_resource_state */
+ action->getStateSet()->erase(action->getStateSet()->iterator_to(*action));
+ action->p_stateSet = reinterpret_cast<CpuTiModelPtr>(getModel())->p_runningActionSetThatDoesNotNeedBeingChecked;
+ action->getStateSet()->push_back(*static_cast<ActionPtr>(action));
+ }
+
+ xbt_swag_insert(action, p_actionSet);
+
+ XBT_OUT();
+ return action;
+}
+
+/**********
+ * Action *
+ **********/
+
+static void cpu_ti_action_update_index_heap(void *action, int i)
+{
+((CpuTiActionPtr)action)->updateIndexHeap(i);
+}
+
+CpuTiAction::CpuTiAction(CpuTiModelPtr model_, double cost, bool failed,
+ CpuTiPtr cpu)
+ : CpuAction(model_, cost, failed)
+{
+ p_cpuListHookup.next = 0;
+ p_cpuListHookup.prev = 0;
+
+ m_suspended = 0; /* Should be useless because of the
+ calloc but it seems to help valgrind... */
+ p_cpu = cpu;
+ m_indexHeap = -1;
+ xbt_swag_insert(cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+}
+
+void CpuTiAction::updateIndexHeap(int i)
+{
+ m_indexHeap = i;
+}
+
+void CpuTiAction::setState(e_surf_action_state_t state)
+{
+ Action::setState(state);
+ xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+}
+
+int CpuTiAction::unref()
+{
+ m_refcount--;
+ if (!m_refcount) {
+ if (actionHook::is_linked())
+ getStateSet()->erase(getStateSet()->iterator_to(*this));
+ /* remove from action_set */
+ xbt_swag_remove(this, p_cpu->p_actionSet);
+ /* remove from heap */
+ xbt_heap_remove(reinterpret_cast<CpuTiModelPtr>(getModel())->p_tiActionHeap, this->m_indexHeap);
+ xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+ delete this;
+ return 1;
+ }
+ return 0;
+}
+
+void CpuTiAction::cancel()
+{
+ this->setState(SURF_ACTION_FAILED);
+ xbt_heap_remove(getModel()->getActionHeap(), this->m_indexHeap);
+ xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+ return;
+}
+
+void CpuTiAction::recycle()
+{
+ DIE_IMPOSSIBLE;
+}
+
+void CpuTiAction::suspend()
+{
+ XBT_IN("(%p)", this);
+ if (m_suspended != 2) {
+ m_suspended = 1;
+ xbt_heap_remove(getModel()->getActionHeap(), m_indexHeap);
+ xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+ }
+ XBT_OUT();
+}
+
+void CpuTiAction::resume()
+{
+ XBT_IN("(%p)", this);
+ if (m_suspended != 2) {
+ m_suspended = 0;
+ xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+ }
+ XBT_OUT();
+}
+
+bool CpuTiAction::isSuspended()
+{
+ return m_suspended == 1;
+}
+
+void CpuTiAction::setMaxDuration(double duration)
+{
+ double min_finish;
+
+ XBT_IN("(%p,%g)", this, duration);
+
+ m_maxDuration = duration;
+
+ if (duration >= 0)
+ min_finish = (getStartTime() + getMaxDuration()) < getFinishTime() ?
+ (getStartTime() + getMaxDuration()) : getFinishTime();
+ else
+ min_finish = getFinishTime();
+
+/* add in action heap */
+ if (m_indexHeap >= 0) {
+ CpuTiActionPtr heap_act = (CpuTiActionPtr)
+ xbt_heap_remove(getModel()->getActionHeap(), m_indexHeap);
+ if (heap_act != this)
+ DIE_IMPOSSIBLE;
+ }
+ xbt_heap_push(getModel()->getActionHeap(), this, min_finish);
+
+ XBT_OUT();
+}
+
+void CpuTiAction::setPriority(double priority)
+{
+ XBT_IN("(%p,%g)", this, priority);
+ m_priority = priority;
+ xbt_swag_insert(p_cpu, reinterpret_cast<CpuTiModelPtr>(getModel())->p_modifiedCpu);
+ XBT_OUT();
+}
+
+double CpuTiAction::getRemains()
+{
+ XBT_IN("(%p)", this);
+ p_cpu->updateRemainingAmount(surf_get_clock());
+ XBT_OUT();
+ return m_remains;
+}
+
+#endif /* SURF_MODEL_CPUTI_H_ */
+
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "cpu_interface.hpp"
+#include "trace_mgr_private.h"
+#include "surf/surf_routing.h"
+
+/* Epsilon */
+#define EPSILON 0.000000001
+
+/***********
+ * Classes *
+ ***********/
+class CpuTiTrace;
+typedef CpuTiTrace *CpuTiTracePtr;
+
+class CpuTiTgmr;
+typedef CpuTiTgmr *CpuTiTgmrPtr;
+
+class CpuTiModel;
+typedef CpuTiModel *CpuTiModelPtr;
+
+class CpuTi;
+typedef CpuTi *CpuTiPtr;
+
+class CpuTiAction;
+typedef CpuTiAction *CpuTiActionPtr;
+
+/*********
+ * Trace *
+ *********/
+class CpuTiTrace {
+public:
+ CpuTiTrace(tmgr_trace_t powerTrace);
+ ~CpuTiTrace();
+
+ double integrateSimple(double a, double b);
+ double integrateSimplePoint(double a);
+ double solveSimple(double a, double amount);
+
+ double *p_timePoints;
+ double *p_integral;
+ int m_nbPoints;
+ int binarySearch(double *array, double a, int low, int high);
+
+private:
+};
+
+enum trace_type {
+
+ TRACE_FIXED, /*< Trace fixed, no availability file */
+ TRACE_DYNAMIC /*< Dynamic, availability file disponible */
+};
+
+class CpuTiTgmr {
+public:
+ CpuTiTgmr(trace_type type, double value): m_type(type), m_value(value){};
+ CpuTiTgmr(tmgr_trace_t power_trace, double value);
+ ~CpuTiTgmr();
+
+ double integrate(double a, double b);
+ double solve(double a, double amount);
+ double solveSomewhatSimple(double a, double amount);
+ double getPowerScale(double a);
+
+ trace_type m_type;
+ double m_value; /*< Percentage of cpu power disponible. Value fixed between 0 and 1 */
+
+ /* Dynamic */
+ double m_lastTime; /*< Integral interval last point (discret time) */
+ double m_total; /*< Integral total between 0 and last_pointn */
+
+ CpuTiTracePtr p_trace;
+ tmgr_trace_t p_powerTrace;
+};
+
+/*********
+ * Model *
+ *********/
+class CpuTiModel : public CpuModel {
+public:
+ CpuTiModel();
+ ~CpuTiModel();
+
+ void parseInit(sg_platf_host_cbarg_t host);
+ CpuTiPtr createResource(const char *name, xbt_dynar_t powerPeak,
+ int pstate, double power_scale,
+ tmgr_trace_t power_trace, int core,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ xbt_dict_t cpu_properties);
+ CpuTiActionPtr createAction(double cost, bool failed);
+ double shareResources(double now);
+ void updateActionsState(double now, double delta);
+ void addTraces();
+
+ ActionListPtr p_runningActionSetThatDoesNotNeedBeingChecked;
+ xbt_swag_t p_modifiedCpu;
+ xbt_heap_t p_tiActionHeap;
+
+protected:
+ void NotifyResourceTurnedOn(ResourcePtr){};
+ void NotifyResourceTurnedOff(ResourcePtr){};
+
+ void NotifyActionCancel(ActionPtr){};
+ void NotifyActionResume(ActionPtr){};
+ void NotifyActionSuspend(ActionPtr){};
+};
+
+/************
+ * Resource *
+ ************/
+class CpuTi : public Cpu {
+public:
+ CpuTi() {};
+ CpuTi(CpuTiModelPtr model, const char *name, xbt_dynar_t powerPeak,
+ int pstate, double powerScale, tmgr_trace_t powerTrace, int core,
+ e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace,
+ xbt_dict_t properties) ;
+ ~CpuTi();
+
+ void updateState(tmgr_trace_event_t event_type, double value, double date);
+ void updateActionsFinishTime(double now);
+ bool isUsed();
+ void printCpuTiModel();
+ CpuActionPtr execute(double size);
+ CpuActionPtr sleep(double duration);
+ double getAvailableSpeed();
+
+ double getCurrentPowerPeak() {THROW_UNIMPLEMENTED;};
+ double getPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;};
+ int getNbPstates() {THROW_UNIMPLEMENTED;};
+ void setPowerPeakAt(int /*pstate_index*/) {THROW_UNIMPLEMENTED;};
+
+ CpuTiTgmrPtr p_availTrace; /*< Structure with data needed to integrate trace file */
+ tmgr_trace_event_t p_stateEvent; /*< trace file with states events (ON or OFF) */
+ tmgr_trace_event_t p_powerEvent; /*< trace file with availability events */
+ xbt_swag_t p_actionSet; /*< set with all actions running on cpu */
+ s_xbt_swag_hookup_t p_modifiedCpuHookup; /*< hookup to swag that indicates whether share resources must be recalculated or not */
+ double m_sumPriority; /*< the sum of actions' priority that are running on cpu */
+ double m_lastUpdate; /*< last update of actions' remaining amount done */
+
+ int m_pstate; /*< Current pstate (index in the power_peak_list)*/
+ double current_frequency;
+
+ void updateRemainingAmount(double now);
+};
+
+/**********
+ * Action *
+ **********/
+
+class CpuTiAction: public CpuAction {
+ friend CpuActionPtr CpuTi::execute(double size);
+ friend CpuActionPtr CpuTi::sleep(double duration);
+ friend void CpuTi::updateActionsFinishTime(double now);//FIXME
+ friend void CpuTi::updateRemainingAmount(double now);//FIXME
+
+public:
+ CpuTiAction() {};
+ CpuTiAction(CpuTiModelPtr model, double cost, bool failed,
+ CpuTiPtr cpu);
+
+ void setState(e_surf_action_state_t state);
+ int unref();
+ void cancel();
+ void recycle();
+ void updateIndexHeap(int i);
+ void suspend();
+ void resume();
+ bool isSuspended();
+ void setMaxDuration(double duration);
+ void setPriority(double priority);
+ double getRemains();
+ void setAffinity(CpuPtr /*cpu*/, unsigned long /*mask*/) {};
+
+ CpuTiPtr p_cpu;
+ int m_indexHeap;
+ s_xbt_swag_hookup_t p_cpuListHookup;
+ int m_suspended;
+private:
+};
+++ /dev/null
-
-/* Copyright (c) 2009-2010, 2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef _SURF_CPU_TI_PRIVATE_H
-#define _SURF_CPU_TI_PRIVATE_H
-
-typedef struct surf_cpu_ti_trace {
- double *time_points;
- double *integral;
- int nb_points;
-} s_surf_cpu_ti_trace_t, *surf_cpu_ti_trace_t;
-
-/* TRACE */
-typedef struct surf_cpu_ti_tgmr {
- enum trace_type {
- TRACE_FIXED, /*< Trace fixed, no availability file */
- TRACE_DYNAMIC /*< Dynamic, availability file disponible */
- } type;
-
- double value; /*< Percentage of cpu power disponible. Value fixed between 0 and 1 */
-
- /* Dynamic */
- double last_time; /*< Integral interval last point (discret time) */
- double total; /*< Integral total between 0 and last_pointn */
-
- surf_cpu_ti_trace_t trace;
- tmgr_trace_t power_trace;
-
-} s_surf_cpu_ti_tgmr_t, *surf_cpu_ti_tgmr_t;
-
-
-/* CPU with trace integration feature */
-typedef struct cpu_ti {
- s_surf_resource_t generic_resource; /*< Structure with generic data. Needed at begin to interate with SURF */
- double power_peak; /*< CPU power peak */
- int pstate;
- double power_scale; /*< Percentage of CPU disponible */
- surf_cpu_ti_tgmr_t avail_trace; /*< Structure with data needed to integrate trace file */
- e_surf_resource_state_t state_current; /*< CPU current state (ON or OFF) */
- tmgr_trace_event_t state_event; /*< trace file with states events (ON or OFF) */
- tmgr_trace_event_t power_event; /*< trace file with availability events */
- xbt_swag_t action_set; /*< set with all actions running on cpu */
- s_xbt_swag_hookup_t modified_cpu_hookup; /*< hookup to swag that indicacates whether share resources must be recalculated or not */
- double sum_priority; /*< the sum of actions' priority that are running on cpu */
- double last_update; /*< last update of actions' remaining amount done */
- double current_frequency;
-} s_cpu_ti_t, *cpu_ti_t;
-
-typedef struct surf_action_ti {
- s_surf_action_t generic_action;
- s_xbt_swag_hookup_t cpu_list_hookup;
- void *cpu;
- int suspended;
- int index_heap;
-} s_surf_action_cpu_ti_t, *surf_action_cpu_ti_t;
-
-/* Epsilon */
-#define EPSILON 0.000000001
-/* Usefull define to get the cpu where action is running on */
-#define ACTION_GET_CPU(action) ((cpu_ti_t)((surf_action_cpu_ti_t)action)->cpu)
-
-
-#endif /* _SURF_CPU_TI_PRIVATE_H */
-/* Copyright (c) 2007-2011. The SimGrid Team.
+/* Copyright (c) 2007-2011, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include "xbt/sysdep.h"
#include "xbt/log.h"
-#include "maxmin_private.h"
+#include "maxmin_private.hpp"
#include <stdlib.h>
#include <math.h>
void bottleneck_solve(lmm_system_t sys)
{
+ void *_var, *_var_next, *_cnst, *_cnst_next, *_elem;
lmm_variable_t var = NULL;
- lmm_variable_t var_next = NULL;
lmm_constraint_t cnst = NULL;
s_lmm_constraint_t s_cnst;
- lmm_constraint_t cnst_next = NULL;
lmm_element_t elem = NULL;
xbt_swag_t cnst_list = NULL;
xbt_swag_t var_list = NULL;
var_list = &(sys->variable_set);
XBT_DEBUG("Variable set : %d", xbt_swag_size(var_list));
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
int nb = 0;
var->value = 0.0;
XBT_DEBUG("Handling variable %p", var);
cnst_list = &(sys->active_constraint_set);
XBT_DEBUG("Active constraints : %d", xbt_swag_size(cnst_list));
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
xbt_swag_insert(cnst, &(sys->saturated_constraint_set));
}
cnst_list = &(sys->saturated_constraint_set);
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
cnst->remaining = cnst->bound;
cnst->usage = 0.0;
}
}
XBT_DEBUG("******* Constraints to process: %d *******",
xbt_swag_size(cnst_list));
- xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
+ xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
int nb = 0;
XBT_DEBUG("Processing cnst %p ", cnst);
elem_list = &(cnst->element_set);
cnst->usage = 0.0;
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
if (elem->variable->weight <= 0)
break;
if ((elem->value > 0)
cnst->usage, nb);
}
- xbt_swag_foreach_safe(var, var_next, var_list) {
+ xbt_swag_foreach_safe(_var, _var_next, var_list) {
+ var = (lmm_variable_t)_var;
double min_inc =
var->cnsts[0].constraint->usage / var->cnsts[0].value;
for (i = 1; i < var->cnsts_number; i++) {
}
}
- xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
+ xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
XBT_DEBUG("Updating cnst %p ", cnst);
elem_list = &(cnst->element_set);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
if (elem->variable->weight <= 0)
break;
if (cnst->shared) {
XBT_DEBUG("\tGet rid of constraint %p", cnst);
xbt_swag_remove(cnst, cnst_list);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
if (elem->variable->weight <= 0)
break;
if (elem->value > 0) {
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved. */
+/* Copyright (c) 2007-2011, 2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include "gtnets_simulator.h"
#include "gtnets_interface.h"
#ifdef XBT_DEBUG
-/* Copyright (c) 2007-2010. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#ifndef _GTNETS_INTERFACE_H
#define _GTNETS_INTERFACE_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include "xbt/misc.h" /* SG_{BEGIN,END}_DECL() */
+
+SG_BEGIN_DECL()
+
+int gtnets_initialize(int wsize);
+int gtnets_add_link(int id, double bandwidth, double latency);
+int gtnets_add_route(int src, int dst, int *links, int nlink);
+int gtnets_add_router(int id);
+int gtnets_add_onehop_route(int src, int dst, int link);
+int gtnets_create_flow(int src, int dst, long datasize, void *metadata);
+double gtnets_get_time_to_next_flow_completion();
+double gtnets_run_until_next_flow_completion(void ***metadata,
+ int *number_of_flows);
+double gtnets_get_flow_rx(void *metadata);
+
+void gtnets_print_topology(void);
+
+int gtnets_run(double delta);
+int gtnets_finalize();
+void gtnets_set_jitter(double);
+void gtnets_set_jitter_seed(int);
+
+SG_END_DECL()
- int gtnets_initialize(int wsize);
- int gtnets_add_link(int id, double bandwidth, double latency);
- int gtnets_add_route(int src, int dst, int *links, int nlink);
- int gtnets_add_router(int id);
- int gtnets_add_onehop_route(int src, int dst, int link);
- int gtnets_create_flow(int src, int dst, long datasize, void *metadata);
- double gtnets_get_time_to_next_flow_completion();
- double gtnets_run_until_next_flow_completion(void ***metadata,
- int *number_of_flows);
- double gtnets_get_flow_rx(void *metadata);
-
- void gtnets_print_topology(void);
-
- int gtnets_run(double delta);
- int gtnets_finalize();
- void gtnets_set_jitter(double);
- void gtnets_set_jitter_seed(int);
-
-#ifdef __cplusplus
-}
-#endif
#endif
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved. */
+/* Copyright (c) 2007-2011, 2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-/* Copyright (c) 2007-2010. The SimGrid Team.
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
-/* Copyright (c) 2007 Kayo Fujiwara. All rights reserved. */
+/* Copyright (c) 2007-2011, 2014. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-/* Copyright (c) 2007, 2009-2011. The SimGrid Team.
+/* Copyright (c) 2007, 2009-2011, 2013-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#ifndef _GTNETS_TOPOLOGY_H
#define _GTNETS_TOPOLOGY_H
-/* Copyright (c) 2010, 2012-2013. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "instr/instr_private.h"
#ifdef HAVE_TRACING
#include "surf/surf_private.h"
-#include "surf/network_private.h"
#include "xbt/graph.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_routing, instr, "Tracing platform hierarchy");
XBT_DEBUG("Graph extraction disabled by user.");
return;
}
- XBT_DEBUG ("Graph extraction for routing_component = %s", rc->name);
- if (!xbt_dict_is_empty(rc->routing_sons)){
+ XBT_DEBUG ("Graph extraction for routing_component = %s", surf_AS_get_name(rc));
+ if (!xbt_dict_is_empty(surf_AS_get_routing_sons(rc))){
xbt_dict_cursor_t cursor = NULL;
AS_t rc_son;
char *child_name;
//bottom-up recursion
- xbt_dict_foreach(rc->routing_sons, cursor, child_name, rc_son) {
- container_t child_container = xbt_dict_get (container->children, rc_son->name);
+ xbt_dict_foreach(surf_AS_get_routing_sons(rc), cursor, child_name, rc_son) {
+ container_t child_container = xbt_dict_get (container->children, surf_AS_get_name(rc_son));
recursiveGraphExtraction (rc_son, child_container, filter);
}
}
xbt_dict_cursor_t cursor = NULL;
char *edge_name;
- rc->get_graph(graph,nodes,edges,rc);
+ surf_AS_get_graph(rc, graph, nodes, edges);
xbt_dict_foreach(edges,cursor,edge_name,edge) {
linkContainers(PJ_container_get(edge->src->data), PJ_container_get(edge->dst->data), filter);
}
currentContainer = NULL;
xbt_dict_t filter = xbt_dict_new_homogeneous(xbt_free);
XBT_DEBUG ("Starting graph extraction.");
- recursiveGraphExtraction (routing_platf->root, PJ_container_get_root(), filter);
+ recursiveGraphExtraction (surf_platf_get_root(routing_platf), PJ_container_get_root(), filter);
XBT_DEBUG ("Graph extraction finished.");
xbt_dict_free(&filter);
platform_created = 1;
static void recursiveXBTGraphExtraction (xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges,
AS_t rc, container_t container)
{
- if (!xbt_dict_is_empty(rc->routing_sons)){
+ if (!xbt_dict_is_empty(surf_AS_get_routing_sons(rc))){
xbt_dict_cursor_t cursor = NULL;
AS_t rc_son;
char *child_name;
//bottom-up recursion
- xbt_dict_foreach(rc->routing_sons, cursor, child_name, rc_son) {
- container_t child_container = xbt_dict_get (container->children, rc_son->name);
+ xbt_dict_foreach(surf_AS_get_routing_sons(rc), cursor, child_name, rc_son) {
+ container_t child_container = xbt_dict_get (container->children, surf_AS_get_name(rc_son));
recursiveXBTGraphExtraction (graph, nodes, edges, rc_son, child_container);
}
}
- rc->get_graph(graph,nodes,edges,rc);
+ surf_AS_get_graph(rc, graph, nodes, edges);
}
xbt_graph_t instr_routing_platform_graph (void)
xbt_graph_t ret = xbt_graph_new_graph (0, NULL);
xbt_dict_t nodes = xbt_dict_new_homogeneous(NULL);
xbt_dict_t edges = xbt_dict_new_homogeneous(NULL);
- recursiveXBTGraphExtraction (ret, nodes, edges, routing_platf->root, PJ_container_get_root());
+ recursiveXBTGraphExtraction (ret, nodes, edges, surf_platf_get_root(routing_platf), PJ_container_get_root());
xbt_dict_free (&nodes);
xbt_dict_free (&edges);
return ret;
-/* Copyright (c) 2010, 2012. The SimGrid Team.
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "instr/instr_private.h"
#include "surf/surf_private.h"
-#include "surf/network_gtnets_private.h"
+//FIXME:#include "surf/network_gtnets_private.h"
#ifdef HAVE_TRACING
/* to trace gtnets */
void TRACE_surf_gtnets_communicate(void *action, void *src, void *dst)
{
- surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action;
+ /*FIXME:surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action;
gtnets_action->src = src;
- gtnets_action->dst = dst;
+ gtnets_action->dst = dst;*/
}
void TRACE_surf_action(surf_action_t surf_action, const char *category)
if (!category)
return;
- surf_action->category = xbt_strdup(category);
+ surf_action_set_category(surf_action, category);
}
#endif /* HAVE_TRACING */
-/* Copyright (c) 2007-2013. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
*/
#include "xbt/log.h"
#include "xbt/sysdep.h"
-#include "maxmin_private.h"
+#include "maxmin_private.hpp"
#include <stdlib.h>
#ifndef MATH
static int __check_feasible(xbt_swag_t cnst_list, xbt_swag_t var_list,
int warn)
{
+ void *_cnst, *_elem, *_var;
xbt_swag_t elem_list = NULL;
lmm_element_t elem = NULL;
lmm_constraint_t cnst = NULL;
double tmp;
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
tmp = 0;
elem_list = &(cnst->element_set);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
var = elem->variable;
if (var->weight <= 0)
continue;
cnst, tmp - cnst->bound, cnst->lambda);
}
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
if (!var->weight)
break;
if (var->bound < 0)
static double dual_objective(xbt_swag_t var_list, xbt_swag_t cnst_list)
{
+ void *_cnst, *_var;
lmm_constraint_t cnst = NULL;
lmm_variable_t var = NULL;
double obj = 0.0;
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
double sigma_i = 0.0;
int j;
obj += var->mu * var->bound;
}
- xbt_swag_foreach(cnst, cnst_list)
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
obj += cnst->lambda * cnst->bound;
+ }
return obj;
}
* fairness. See docummentation for more details.
*/
xbt_swag_t cnst_list = NULL;
+ void *_cnst;
lmm_constraint_t cnst = NULL;
xbt_swag_t var_list = NULL;
+ void *_var;
lmm_variable_t var = NULL;
/*
* Initialize lambda.
*/
cnst_list = &(sys->active_constraint_set);
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
cnst->lambda = 1.0;
cnst->new_lambda = 2.0;
XBT_DEBUG("#### cnst(%p)->lambda : %e", cnst, cnst->lambda);
*/
var_list = &(sys->variable_set);
i = 0;
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
if (!var->weight)
var->value = 0.0;
else {
/*
* Improve the value of mu_i
*/
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
if (!var->weight)
break;
if (var->bound >= 0) {
/*
* Improve the value of lambda_i
*/
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
XBT_DEBUG("Working on cnst (%p)", cnst);
cnst->new_lambda =
dichotomy(cnst->lambda, partial_diff_lambda, cnst,
*/
XBT_DEBUG("-------------- Check convergence ----------");
overall_modification = 0;
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
if (var->weight <= 0)
var->value = 0.0;
else {
{
int j;
+ void *_elem;
xbt_swag_t elem_list = NULL;
lmm_element_t elem = NULL;
lmm_variable_t var = NULL;
XBT_CDEBUG(surf_lagrange_dichotomy, "Computing diff of cnst (%p)", cnst);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
var = elem->variable;
if (var->weight <= 0)
continue;
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include "xbt/sysdep.h"
#include "xbt/log.h"
#include "xbt/mallocator.h"
-#include "maxmin_private.h"
+#include "maxmin_private.hpp"
#include <stdlib.h>
#include <stdio.h> /* sprintf */
#include <math.h>
lmm_variable_t var = NULL;
lmm_constraint_t cnst = NULL;
- while ((var = extract_variable(sys))) {
+ while ((var = (lmm_variable_t) extract_variable(sys))) {
XBT_WARN
("Variable %p (%d) still in LMM system when freing it: this may be a bug",
var, var->id_int);
lmm_var_free(sys, var);
}
- while ((cnst = extract_constraint(sys)))
+ while ((cnst = (lmm_constraint_t) extract_constraint(sys)))
lmm_cnst_free(sys, cnst);
xbt_mallocator_free(sys->variable_mallocator);
return cnst;
}
-XBT_INLINE void lmm_constraint_shared(lmm_constraint_t cnst)
+void lmm_constraint_shared(lmm_constraint_t cnst)
{
cnst->shared = 0;
}
-XBT_INLINE int lmm_constraint_is_shared(lmm_constraint_t cnst)
+int lmm_constraint_is_shared(lmm_constraint_t cnst)
{
return (cnst->shared);
}
XBT_IN("(sys=%p, id=%p, weight=%f, bound=%f, num_cons =%d)",
sys, id, weight, bound, number_of_constraints);
- var = xbt_mallocator_get(sys->variable_mallocator);
+ var = (lmm_variable_t) xbt_mallocator_get(sys->variable_mallocator);
var->id = id;
var->id_int = Global_debug_id++;
- var->cnsts = xbt_realloc(var->cnsts, number_of_constraints * sizeof(s_lmm_element_t));
+ var->cnsts = (s_lmm_element_t *) xbt_realloc(var->cnsts, number_of_constraints * sizeof(s_lmm_element_t));
for (i = 0; i < number_of_constraints; i++) {
var->cnsts[i].element_set_hookup.next = NULL;
var->cnsts[i].element_set_hookup.prev = NULL;
lmm_var_free(sys, var);
}
-XBT_INLINE double lmm_variable_getvalue(lmm_variable_t var)
+double lmm_variable_getvalue(lmm_variable_t var)
{
return (var->value);
}
-XBT_INLINE double lmm_variable_getbound(lmm_variable_t var)
+double lmm_variable_getbound(lmm_variable_t var)
{
return (var->bound);
}
+/* Replace the content of elem_a with elem_b. The content of elem_b is cleared. */
+static void renew_elem_entry(lmm_element_t elem_a, lmm_element_t elem_b)
+{
+ elem_a->constraint = elem_b->constraint;
+ elem_a->variable = elem_b->variable;
+ elem_a->value = elem_b->value;
+
+ /* If elem_b is in the element_set swag, register the new element to the swag. */
+ if (xbt_swag_remove(elem_b, &(elem_b->constraint->element_set))) {
+ if (elem_a->variable->weight)
+ xbt_swag_insert_at_head(elem_a, &(elem_a->constraint->element_set));
+ else
+ xbt_swag_insert_at_tail(elem_a, &(elem_a->constraint->element_set));
+ }
+
+ if (xbt_swag_remove(elem_b, &(elem_b->constraint->active_element_set))) {
+ if (elem_a->variable->weight)
+ xbt_swag_insert_at_head(elem_a, &(elem_a->constraint->active_element_set));
+ else
+ xbt_swag_insert_at_tail(elem_a, &(elem_a->constraint->active_element_set));
+ }
+
+ elem_b->constraint = NULL;
+ elem_b->variable = NULL;
+ elem_b->value = 0;
+}
+
+void lmm_shrink(lmm_system_t sys, lmm_constraint_t cnst,
+ lmm_variable_t var)
+{
+ lmm_element_t elem = NULL;
+ int found = 0;
+
+ int i;
+ for (i = 0; i < var->cnsts_number; i++) {
+ elem = &(var->cnsts[i]);
+ if (elem->constraint == cnst) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found) {
+ XBT_DEBUG("cnst %p is not found in var %p", cnst, var);
+ return;
+ }
+
+ sys->modified = 1;
+
+ XBT_DEBUG("remove elem(value %f, cnst %p, var %p) in var %p",
+ elem->value, elem->constraint, elem->variable, var);
+
+
+
+ /* We are going to change the constraint object and the variable object.
+ * Propagate this change to other objects. Calling here (not after
+ * modification) is correct? */
+ lmm_update_modified_set(sys, cnst);
+ lmm_update_modified_set(sys, var->cnsts[0].constraint); // will look up element_set of this constraint, and then each var in the element_set, and each var->cnsts[i].
+
+
+
+ /* now var->cnsts[i] is not necessary any more */
+
+ xbt_swag_remove(elem, &(elem->constraint->element_set));
+ xbt_swag_remove(elem, &(elem->constraint->active_element_set));
+ elem->constraint = NULL;
+ elem->variable = NULL;
+ elem->value = 0;
+
+
+
+ /* We do not want to have an empty element entry before the last entry. So,
+ * plug up the hole with the last one. */
+ if (i < var->cnsts_number - 1)
+ renew_elem_entry(&var->cnsts[i], &var->cnsts[var->cnsts_number - 1]);
+
+ var->cnsts_number -= 1;
+
+
+ if (xbt_swag_size(&(cnst->element_set)) == 0)
+ make_constraint_inactive(sys, cnst);
+}
+
void lmm_expand(lmm_system_t sys, lmm_constraint_t cnst,
lmm_variable_t var, double value)
{
lmm_expand(sys, cnst, var, value);
}
-void lmm_elem_set_value(lmm_system_t sys, lmm_constraint_t cnst,
- lmm_variable_t var, double value)
-{
- int i;
-
- for (i = 0; i < var->cnsts_number; i++)
- if (var->cnsts[i].constraint == cnst)
- break;
-
- if (i < var->cnsts_number) {
- var->cnsts[i].value = value;
- sys->modified = 1;
- lmm_update_modified_set(sys, cnst);
- } else
- DIE_IMPOSSIBLE;
-}
-
-XBT_INLINE lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t sys,
+lmm_constraint_t lmm_get_cnst_from_var(lmm_system_t /*sys*/,
lmm_variable_t var,
int num)
{
return NULL;
}
-XBT_INLINE double lmm_get_cnst_weight_from_var(lmm_system_t sys,
+double lmm_get_cnst_weight_from_var(lmm_system_t /*sys*/,
lmm_variable_t var,
int num)
{
return 0.0;
}
-XBT_INLINE int lmm_get_number_of_cnst_from_var(lmm_system_t sys,
+int lmm_get_number_of_cnst_from_var(lmm_system_t /*sys*/,
lmm_variable_t var)
{
return (var->cnsts_number);
}
-lmm_variable_t lmm_get_var_from_cnst(lmm_system_t sys,
+lmm_variable_t lmm_get_var_from_cnst(lmm_system_t /*sys*/,
lmm_constraint_t cnst,
lmm_element_t * elem)
{
if (!(*elem))
- *elem = xbt_swag_getFirst(&(cnst->element_set));
+ *elem = (lmm_element_t) xbt_swag_getFirst(&(cnst->element_set));
else
- *elem = xbt_swag_getNext(*elem, cnst->element_set.offset);
+ *elem = (lmm_element_t) xbt_swag_getNext(*elem, cnst->element_set.offset);
if (*elem)
return (*elem)->variable;
else
return NULL;
}
-XBT_INLINE void *lmm_constraint_id(lmm_constraint_t cnst)
+void *lmm_constraint_id(lmm_constraint_t cnst)
{
return cnst->id;
}
-XBT_INLINE void *lmm_variable_id(lmm_variable_t var)
+void *lmm_variable_id(lmm_variable_t var)
{
return var->id;
}
} else if (*min_usage == usage) {
if(saturated_constraint_set->pos == saturated_constraint_set->size) { // realloc the size
saturated_constraint_set->size *= 2;
- saturated_constraint_set->data = xbt_realloc(saturated_constraint_set->data, (saturated_constraint_set->size) * sizeof(int));
+ saturated_constraint_set->data = (int*) xbt_realloc(saturated_constraint_set->data, (saturated_constraint_set->size) * sizeof(int));
}
saturated_constraint_set->data[saturated_constraint_set->pos] = cnst_light_num;
saturated_constraint_set->pos++;
lmm_system_t sys)
{
lmm_constraint_light_t cnst = NULL;
+ void *_elem;
lmm_element_t elem = NULL;
xbt_swag_t elem_list = NULL;
int i;
for(i = 0; i< saturated_constraint_set->pos; i++){
cnst = &cnst_light_tab[saturated_constraint_set->data[i]];
elem_list = &(cnst->cnst->active_element_set);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
if (elem->variable->weight <= 0)
break;
if ((elem->value > 0))
void lmm_print(lmm_system_t sys)
{
+ void *_cnst, *_elem, *_var;
lmm_constraint_t cnst = NULL;
lmm_element_t elem = NULL;
lmm_variable_t var = NULL;
xbt_swag_t var_list = NULL;
xbt_swag_t elem_list = NULL;
char print_buf[1024];
- char *trace_buf = xbt_malloc0(sizeof(char));
+ char *trace_buf = (char*) xbt_malloc0(sizeof(char));
double sum = 0.0;
/* Printing Objective */
var_list = &(sys->variable_set);
sprintf(print_buf, "MAX-MIN ( ");
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
sprintf(print_buf, "'%d'(%f) ", var->id_int, var->weight);
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
}
sprintf(print_buf, ")");
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
XBT_DEBUG("%20s", trace_buf);
XBT_DEBUG("Constraints");
/* Printing Constraints */
cnst_list = &(sys->active_constraint_set);
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
sum = 0.0;
elem_list = &(cnst->element_set);
sprintf(print_buf, "\t");
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
sprintf(print_buf, "%s(",(cnst->shared)?"":"max");
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf,
strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
sprintf(print_buf, "%f.'%d'(%f) %s ", elem->value,
elem->variable->id_int, elem->variable->value,(cnst->shared)?"+":",");
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf,
strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
sum = MAX(sum,elem->value * elem->variable->value);
}
sprintf(print_buf, "0) <= %f ('%d')", cnst->bound, cnst->id_int);
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf, strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
if (!cnst->shared) {
sprintf(print_buf, " [MAX-Constraint]");
- trace_buf =
+ trace_buf = (char*)
xbt_realloc(trace_buf,
strlen(trace_buf) + strlen(print_buf) + 1);
strcat(trace_buf, print_buf);
XBT_DEBUG("Variables");
/* Printing Result */
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
if (var->bound > 0) {
XBT_DEBUG("'%d'(%f) : %f (<=%f)", var->id_int, var->weight, var->value,
var->bound);
void lmm_solve(lmm_system_t sys)
{
+ void *_var, *_cnst, *_cnst_next, *_elem;
lmm_variable_t var = NULL;
lmm_constraint_t cnst = NULL;
- lmm_constraint_t cnst_next = NULL;
lmm_element_t elem = NULL;
xbt_swag_t cnst_list = NULL;
xbt_swag_t var_list = NULL;
XBT_DEBUG("Active constraints : %d", xbt_swag_size(cnst_list));
/* Init: Only modified code portions */
- xbt_swag_foreach(cnst, cnst_list) {
+ xbt_swag_foreach(_cnst, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
elem_list = &(cnst->element_set);
//XBT_DEBUG("Variable set : %d", xbt_swag_size(elem_list));
- xbt_swag_foreach(elem, elem_list) {
- var = elem->variable;
+ xbt_swag_foreach(_elem, elem_list) {
+ var = ((lmm_element_t)_elem)->variable;
if (var->weight <= 0.0)
break;
var->value = 0.0;
saturated_constraint_set->size = 5;
saturated_constraint_set->data = xbt_new0(int, saturated_constraint_set->size);
- xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) {
+ xbt_swag_foreach_safe(_cnst, _cnst_next, cnst_list) {
+ cnst = (lmm_constraint_t)_cnst;
/* INIT */
cnst->remaining = cnst->bound;
if (cnst->remaining == 0)
continue;
cnst->usage = 0;
elem_list = &(cnst->element_set);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
/* 0-weighted elements (ie, sleep actions) are at the end of the swag and we don't want to consider them */
if (elem->variable->weight <= 0)
break;
cnst->usage = elem->value / elem->variable->weight;
make_elem_active(elem);
- if (sys->keep_track)
- xbt_swag_insert(elem->variable->id, sys->keep_track);
+ ActionPtr action = static_cast<ActionPtr>(elem->variable->id);
+ if (sys->keep_track && !action->is_linked())
+ sys->keep_track->push_back(*action);
}
}
XBT_DEBUG("Constraint Usage '%d' : %f", cnst->id_int, cnst->usage);
/* Fix the variables that have to be */
var_list = &(sys->saturated_variable_set);
- xbt_swag_foreach(var, var_list) {
+ xbt_swag_foreach(_var, var_list) {
+ var = (lmm_variable_t)_var;
if (var->weight <= 0.0)
DIE_IMPOSSIBLE;
/* First check if some of these variables have reach their upper
}
- while ((var = xbt_swag_getFirst(var_list))) {
+ while ((var = (lmm_variable_t)xbt_swag_getFirst(var_list))) {
int i;
if (min_bound < 0) {
cnst->usage = 0.0;
make_elem_inactive(elem);
elem_list = &(cnst->element_set);
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
if (elem->variable->weight <= 0 || elem->variable->value > 0)
break;
if (elem->value > 0)
XBT_OUT();
}
-XBT_INLINE double lmm_get_variable_weight(lmm_variable_t var)
+double lmm_get_variable_weight(lmm_variable_t var)
{
return var->weight;
}
-XBT_INLINE void lmm_update_constraint_bound(lmm_system_t sys,
+void lmm_update_constraint_bound(lmm_system_t sys,
lmm_constraint_t cnst,
double bound)
{
cnst->bound = bound;
}
-XBT_INLINE int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst)
+int lmm_constraint_used(lmm_system_t sys, lmm_constraint_t cnst)
{
return xbt_swag_belongs(cnst, &(sys->active_constraint_set));
}
XBT_INLINE lmm_constraint_t lmm_get_first_active_constraint(lmm_system_t
sys)
{
- return xbt_swag_getFirst(&(sys->active_constraint_set));
+ return (lmm_constraint_t)xbt_swag_getFirst(&(sys->active_constraint_set));
}
XBT_INLINE lmm_constraint_t lmm_get_next_active_constraint(lmm_system_t
lmm_constraint_t
cnst)
{
- return xbt_swag_getNext(cnst, (sys->active_constraint_set).offset);
+ return (lmm_constraint_t)xbt_swag_getNext(cnst, (sys->active_constraint_set).offset);
}
#ifdef HAVE_LATENCY_BOUND_TRACKING
static void lmm_update_modified_set_rec(lmm_system_t sys,
lmm_constraint_t cnst)
{
- lmm_element_t elem;
+ void* _elem;
- xbt_swag_foreach(elem, &cnst->element_set) {
- lmm_variable_t var = elem->variable;
+ xbt_swag_foreach(_elem, &cnst->element_set) {
+ lmm_variable_t var = ((lmm_element_t)_elem)->variable;
s_lmm_element_t *cnsts = var->cnsts;
int i;
for (i = 0; var->visited != sys->visited_counter
{
if (++sys->visited_counter == 1) {
/* the counter wrapped around, reset each variable->visited */
- lmm_variable_t var;
- xbt_swag_foreach(var, &sys->variable_set)
- var->visited = 0;
+ void *_var;
+ xbt_swag_foreach(_var, &sys->variable_set)
+ ((lmm_variable_t)_var)->visited = 0;
}
xbt_swag_reset(&sys->modified_constraint_set);
}
double lmm_constraint_get_usage(lmm_constraint_t cnst) {
double usage = 0.0;
xbt_swag_t elem_list = &(cnst->element_set);
+ void *_elem;
lmm_element_t elem = NULL;
- xbt_swag_foreach(elem, elem_list) {
+ xbt_swag_foreach(_elem, elem_list) {
+ elem = (lmm_element_t)_elem;
/* 0-weighted elements (ie, sleep actions) are at the end of the swag and we don't want to consider them */
if (elem->variable->weight <= 0)
break;
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "surf/maxmin.h"
#include "xbt/swag.h"
#include "xbt/mallocator.h"
+#include "surf_interface.hpp"
+/** @ingroup SURF_lmm
+ * @brief LMM element
+ */
typedef struct lmm_element {
/* hookup to constraint */
s_xbt_swag_hookup_t element_set_hookup;
lmm_constraint_t cnst;
} s_lmm_constraint_light_t;
+/** @ingroup SURF_lmm
+ * @brief LMM constraint
+ */
typedef struct lmm_constraint {
/* hookup to system */
s_xbt_swag_hookup_t constraint_set_hookup;
lmm_constraint_light_t cnst_light;
} s_lmm_constraint_t;
+/** @ingroup SURF_lmm
+ * @brief LMM variable
+ */
typedef struct lmm_variable {
/* hookup to system */
s_xbt_swag_hookup_t variable_set_hookup;
/* \end{For Lagrange only} */
} s_lmm_variable_t;
+/** @ingroup SURF_lmm
+ * @brief LMM system
+ */
typedef struct lmm_system {
int modified;
int selective_update_active; /* flag to update partially the system only selecting changed portions */
s_xbt_swag_t saturated_variable_set; /* a list of lmm_variable_t */
s_xbt_swag_t saturated_constraint_set; /* a list of lmm_constraint_t_t */
- xbt_swag_t keep_track;
+ ActionLmmListPtr keep_track;
xbt_mallocator_t variable_mallocator;
} s_lmm_system_t;
do { xbt_swag_remove(cnst, &sys->active_constraint_set); \
xbt_swag_remove(cnst, &sys->modified_constraint_set); } while (0)
+/** @ingroup SURF_lmm
+ * @brief Print informations about a lmm system
+ *
+ * @param sys A lmm system
+ */
void lmm_print(lmm_system_t sys);
extern double (*func_f_def) (lmm_variable_t, double);
+++ /dev/null
-
-/*
- * Network with improved management of tasks, IM (Improved Management).
- * Uses a heap to store actions so that the share_resources is faster.
- * This model automatically sets the selective update flag to 1 and is
- * highly dependent on the maxmin lmm module.
- */
-
-/* Copyright (c) 2004-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "network_private.h"
-#include "xbt/log.h"
-#include "xbt/str.h"
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-#include "maxmin_private.h"
-#include "surf/surfxml_parse_values.h"
-#include "surf/surf_resource.h"
-#include "surf/surf_resource_lmm.h"
-#include "simgrid/sg_config.h"
-
-#undef GENERIC_LMM_ACTION
-#undef GENERIC_ACTION
-#define GENERIC_LMM_ACTION(action) (action)->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
- "Logging specific to the SURF network module");
-
-surf_model_t surf_network_model = NULL;
-static void (*network_solve) (lmm_system_t) = NULL;
-
-xbt_dynar_t smpi_bw_factor = NULL;
-xbt_dynar_t smpi_lat_factor = NULL;
-
-typedef struct s_smpi_factor *smpi_factor_t;
-typedef struct s_smpi_factor {
- long factor;
- double value;
-} s_smpi_factor_t;
-
-
-double sg_sender_gap = 0.0;
-double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
-double sg_bandwidth_factor = 1.0; /* default value; can be set by model or from command line */
-double sg_weight_S_parameter = 0.0; /* default value; can be set by model or from command line */
-
-double sg_tcp_gamma = 0.0;
-int sg_network_crosstraffic = 0;
-
-xbt_dict_t gap_lookup = NULL;
-
-/******************************************************************************/
-/* Factors callbacks */
-/******************************************************************************/
-static double constant_latency_factor(double size)
-{
- return sg_latency_factor;
-}
-
-static double constant_bandwidth_factor(double size)
-{
- return sg_bandwidth_factor;
-}
-
-static double constant_bandwidth_constraint(double rate, double bound,
- double size)
-{
- return rate;
-}
-
-/**********************/
-/* SMPI callbacks */
-/**********************/
-
-static int factor_cmp(const void *pa, const void *pb)
-{
- return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor);
-}
-
-
-static xbt_dynar_t parse_factor(const char *smpi_coef_string)
-{
- char *value = NULL;
- unsigned int iter = 0;
- s_smpi_factor_t fact;
- xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL;
-
- smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
- radical_elements = xbt_str_split(smpi_coef_string, ";");
- xbt_dynar_foreach(radical_elements, iter, value) {
-
- radical_elements2 = xbt_str_split(value, ":");
- if (xbt_dynar_length(radical_elements2) != 2)
- xbt_die("Malformed radical for smpi factor!");
- fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *));
- fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *));
- xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
- XBT_DEBUG("smpi_factor:\t%ld : %f", fact.factor, fact.value);
- xbt_dynar_free(&radical_elements2);
- }
- xbt_dynar_free(&radical_elements);
- iter=0;
- xbt_dynar_sort(smpi_factor, &factor_cmp);
- xbt_dynar_foreach(smpi_factor, iter, fact) {
- XBT_DEBUG("ordered smpi_factor:\t%ld : %f", fact.factor, fact.value);
-
- }
- return smpi_factor;
-}
-
-static double smpi_bandwidth_factor(double size)
-{
- if (!smpi_bw_factor)
- smpi_bw_factor =
- parse_factor(sg_cfg_get_string("smpi/bw_factor"));
-
- unsigned int iter = 0;
- s_smpi_factor_t fact;
- double current=1.0;
- xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
- if (size <= fact.factor) {
- XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
- return current;
- }else
- current=fact.value;
- }
- XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
-
- return current;
-}
-
-static double smpi_latency_factor(double size)
-{
- if (!smpi_lat_factor)
- smpi_lat_factor =
- parse_factor(sg_cfg_get_string("smpi/lat_factor"));
-
- unsigned int iter = 0;
- s_smpi_factor_t fact;
- double current=1.0;
- xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
- if (size <= fact.factor) {
- XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
- return current;
- }else
- current=fact.value;
- }
- XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
-
- return current;
-}
-
-/**--------- <copy/paste C code snippet in surf/network.c> -----------*/
-
-static double smpi_bandwidth_constraint(double rate, double bound,
- double size)
-{
- return rate < 0 ? bound : min(bound, rate * smpi_bandwidth_factor(size));
-}
-
-static double (*latency_factor_callback) (double) =
- &constant_latency_factor;
-static double (*bandwidth_factor_callback) (double) =
- &constant_bandwidth_factor;
-static double (*bandwidth_constraint_callback) (double, double, double) =
- &constant_bandwidth_constraint;
-
-static void (*gap_append) (double, const link_CM02_t,
- surf_action_network_CM02_t) = NULL;
-
-static void *net_create_resource(const char *name,
- double bw_initial,
- tmgr_trace_t bw_trace,
- double lat_initial,
- tmgr_trace_t lat_trace,
- e_surf_resource_state_t
- state_initial,
- tmgr_trace_t state_trace,
- e_surf_link_sharing_policy_t
- policy, xbt_dict_t properties)
-{
- link_CM02_t nw_link = (link_CM02_t)
- surf_resource_lmm_new(sizeof(s_link_CM02_t),
- surf_network_model, name, properties,
- surf_network_model->model_private->maxmin_system,
- sg_bandwidth_factor * bw_initial,
- history,
- state_initial, state_trace,
- bw_initial, bw_trace);
-
- xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
- "Link '%s' declared several times in the platform file.",
- name);
-
- nw_link->lat_current = lat_initial;
- if (lat_trace)
- nw_link->lat_event =
- tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link);
-
- if (policy == SURF_LINK_FATPIPE)
- lmm_constraint_shared(nw_link->lmm_resource.constraint);
-
- xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, nw_link);
- XBT_DEBUG("Create link '%s'",name);
-
- return nw_link;
-}
-
-static void net_parse_link_init(sg_platf_link_cbarg_t link)
-{
- if (link->policy == SURF_LINK_FULLDUPLEX) {
- char *link_id;
- link_id = bprintf("%s_UP", link->id);
- net_create_resource(link_id,
- link->bandwidth,
- link->bandwidth_trace,
- link->latency,
- link->latency_trace,
- link->state,
- link->state_trace, link->policy, link->properties);
- xbt_free(link_id);
- link_id = bprintf("%s_DOWN", link->id);
- net_create_resource(link_id,
- link->bandwidth,
- link->bandwidth_trace,
- link->latency,
- link->latency_trace,
- link->state,
- link->state_trace, link->policy, link->properties);
- xbt_free(link_id);
- } else {
- net_create_resource(link->id,
- link->bandwidth,
- link->bandwidth_trace,
- link->latency,
- link->latency_trace,
- link->state,
- link->state_trace, link->policy, link->properties);
- }
-}
-
-static void net_add_traces(void)
-{
- xbt_dict_cursor_t cursor = NULL;
- char *trace_name, *elm;
-
- static int called = 0;
- if (called)
- return;
- called = 1;
-
- /* connect all traces relative to network */
- xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
- xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
- trace_name, elm);
- xbt_assert(trace,
- "Cannot connect trace %s to link %s: trace undefined",
- trace_name, elm);
-
- link->lmm_resource.state_event =
- tmgr_history_add_trace(history, trace, 0.0, 0, link);
- }
-
- xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
- xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
- trace_name, elm);
- xbt_assert(trace,
- "Cannot connect trace %s to link %s: trace undefined",
- trace_name, elm);
-
- link->lmm_resource.power.event =
- tmgr_history_add_trace(history, trace, 0.0, 0, link);
- }
-
- xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
- tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
- link_CM02_t link = xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
-
- xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
- trace_name, elm);
- xbt_assert(trace,
- "Cannot connect trace %s to link %s: trace undefined",
- trace_name, elm);
-
- link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
- }
-}
-
-static void net_define_callbacks(void)
-{
- /* Figuring out the network links */
- sg_platf_link_add_cb(net_parse_link_init);
- sg_platf_postparse_add_cb(net_add_traces);
-}
-
-static int net_resource_used(void *resource_id)
-{
- return lmm_constraint_used(surf_network_model->model_private->maxmin_system, ((surf_resource_lmm_t)
- resource_id)->
- constraint);
-}
-
-void net_action_recycle(surf_action_t action)
-{
- return;
-}
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-int net_get_link_latency_limited(surf_action_t action)
-{
- return action->latency_limited;
-}
-#endif
-
-static double net_share_resources_full(double now)
-{
- s_surf_action_lmm_t s_action;
- surf_action_network_CM02_t action = NULL;
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
- double min;
-
- min = generic_maxmin_share_resources(running_actions,
- xbt_swag_offset(s_action,
- variable),
- surf_network_model->model_private->maxmin_system,
- network_solve);
-
-#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + xbt_swag_offset(s_action, variable) )))
-
- xbt_swag_foreach(action, running_actions) {
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- if (lmm_is_variable_limited_by_latency(GENERIC_LMM_ACTION(action).variable)) {
- action->latency_limited = 1;
- } else {
- action->latency_limited = 0;
- }
-#endif
- if (action->latency > 0) {
- min = (min < 0) ? action->latency : min(min, action->latency);
- }
- }
-
- XBT_DEBUG("Min of share resources %f", min);
-
- return min;
-}
-
-static double net_share_resources_lazy(double now)
-{
- return generic_share_resources_lazy(now, surf_network_model);
-}
-
-static void net_update_actions_state_full(double now, double delta)
-{
- generic_update_actions_state_full(now, delta, surf_network_model);
-}
-
-static void net_update_actions_state_lazy(double now, double delta)
-{
- generic_update_actions_state_lazy(now, delta, surf_network_model);
-}
-
-static void net_update_resource_state(void *id,
- tmgr_trace_event_t event_type,
- double value, double date)
-{
- link_CM02_t nw_link = id;
- /* printf("[" "%g" "] Asking to update network card \"%s\" with value " */
- /* "%g" " for event %p\n", surf_get_clock(), nw_link->name, */
- /* value, event_type); */
-
- if (event_type == nw_link->lmm_resource.power.event) {
- double delta =
- sg_weight_S_parameter / value - sg_weight_S_parameter /
- (nw_link->lmm_resource.power.peak *
- nw_link->lmm_resource.power.scale);
- lmm_variable_t var = NULL;
- lmm_element_t elem = NULL;
- surf_action_network_CM02_t action = NULL;
-
- nw_link->lmm_resource.power.peak = value;
- lmm_update_constraint_bound(surf_network_model->model_private->maxmin_system,
- nw_link->lmm_resource.constraint,
- sg_bandwidth_factor *
- (nw_link->lmm_resource.power.peak *
- nw_link->lmm_resource.power.scale));
-#ifdef HAVE_TRACING
- TRACE_surf_link_set_bandwidth(date,
- (char
- *) (((nw_link->lmm_resource).
- generic_resource).name),
- sg_bandwidth_factor *
- (nw_link->lmm_resource.power.peak *
- nw_link->lmm_resource.power.scale));
-#endif
- if (sg_weight_S_parameter > 0) {
- while ((var = lmm_get_var_from_cnst
- (surf_network_model->model_private->maxmin_system, nw_link->lmm_resource.constraint,
- &elem))) {
- action = lmm_variable_id(var);
- action->weight += delta;
- if (!(GENERIC_LMM_ACTION(action).suspended))
- lmm_update_variable_weight(surf_network_model->model_private->maxmin_system,
- GENERIC_LMM_ACTION(action).variable, action->weight);
- }
- }
- if (tmgr_trace_event_free(event_type))
- nw_link->lmm_resource.power.event = NULL;
- } else if (event_type == nw_link->lat_event) {
- double delta = value - nw_link->lat_current;
- lmm_variable_t var = NULL;
- lmm_element_t elem = NULL;
- surf_action_network_CM02_t action = NULL;
-
- nw_link->lat_current = value;
- while ((var = lmm_get_var_from_cnst
- (surf_network_model->model_private->maxmin_system, nw_link->lmm_resource.constraint,
- &elem))) {
- action = lmm_variable_id(var);
- action->lat_current += delta;
- action->weight += delta;
- if (action->rate < 0)
- lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
- sg_tcp_gamma / (2.0 *
- action->lat_current));
- else {
- lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
- min(action->rate,
- sg_tcp_gamma / (2.0 *
- action->
- lat_current)));
-
- if (action->rate < sg_tcp_gamma / (2.0 * action->lat_current)) {
- XBT_INFO("Flow is limited BYBANDWIDTH");
- } else {
- XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f",
- action->lat_current);
- }
- }
- if (!(GENERIC_LMM_ACTION(action).suspended))
- lmm_update_variable_weight(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
- action->weight);
-
- }
- if (tmgr_trace_event_free(event_type))
- nw_link->lat_event = NULL;
- } else if (event_type == nw_link->lmm_resource.state_event) {
- if (value > 0)
- nw_link->lmm_resource.state_current = SURF_RESOURCE_ON;
- else {
- lmm_constraint_t cnst = nw_link->lmm_resource.constraint;
- lmm_variable_t var = NULL;
- lmm_element_t elem = NULL;
-
- nw_link->lmm_resource.state_current = SURF_RESOURCE_OFF;
- while ((var = lmm_get_var_from_cnst
- (surf_network_model->model_private->maxmin_system, cnst, &elem))) {
- surf_action_t action = lmm_variable_id(var);
-
- if (surf_action_state_get(action) == SURF_ACTION_RUNNING ||
- surf_action_state_get(action) == SURF_ACTION_READY) {
- action->finish = date;
- surf_network_model->action_state_set(action, SURF_ACTION_FAILED);
- }
- }
- }
- if (tmgr_trace_event_free(event_type))
- nw_link->lmm_resource.state_event = NULL;
- } else {
- XBT_CRITICAL("Unknown event ! \n");
- xbt_abort();
- }
-
- XBT_DEBUG
- ("There were a resource state event, need to update actions related to the constraint (%p)",
- nw_link->lmm_resource.constraint);
- return;
-}
-
-
-static surf_action_t net_communicate(sg_routing_edge_t src,
- sg_routing_edge_t dst,
- double size, double rate)
-{
- unsigned int i;
- link_CM02_t link;
- int failed = 0;
- surf_action_network_CM02_t action = NULL;
- double bandwidth_bound;
- double latency = 0.0;
- xbt_dynar_t back_route = NULL;
- int constraints_per_variable = 0;
-
- xbt_dynar_t route = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
-
- XBT_IN("(%s,%s,%g,%g)", src->name, dst->name, size, rate);
-
- routing_get_route_and_latency(src, dst, &route, &latency);
- xbt_assert(!xbt_dynar_is_empty(route) || latency,
- "You're trying to send data from %s to %s but there is no connection at all between these two hosts.",
- src->name, dst->name);
-
- xbt_dynar_foreach(route, i, link) {
- if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) {
- failed = 1;
- break;
- }
- }
- if (sg_network_crosstraffic == 1) {
- routing_get_route_and_latency(dst, src, &back_route, NULL);
- xbt_dynar_foreach(back_route, i, link) {
- if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) {
- failed = 1;
- break;
- }
- }
- }
-
- action =
- surf_action_new(sizeof(s_surf_action_network_CM02_t), size,
- surf_network_model, failed);
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- action->latency_limited = 0;
-#endif
- action->weight = action->latency = latency;
-
- xbt_swag_insert(action, ((surf_action_t)action)->state_set);
- action->rate = rate;
- if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
- GENERIC_LMM_ACTION(action).index_heap = -1;
- GENERIC_LMM_ACTION(action).last_update = surf_get_clock();
- }
-
- bandwidth_bound = -1.0;
- if (sg_weight_S_parameter > 0) {
- xbt_dynar_foreach(route, i, link) {
- action->weight +=
- sg_weight_S_parameter /
- (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
- }
- }
- xbt_dynar_foreach(route, i, link) {
- double bb = bandwidth_factor_callback(size) *
- (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
- bandwidth_bound =
- (bandwidth_bound < 0.0) ? bb : min(bandwidth_bound, bb);
- }
-
- action->lat_current = action->latency;
- action->latency *= latency_factor_callback(size);
- action->rate =
- bandwidth_constraint_callback(action->rate, bandwidth_bound, size);
- if (gap_append) {
- xbt_assert(!xbt_dynar_is_empty(route),
- "Using a model with a gap (e.g., SMPI) with a platform without links (e.g. vivaldi)!!!");
-
- link = *(link_CM02_t *) xbt_dynar_get_ptr(route, 0);
- gap_append(size, link, action);
- XBT_DEBUG("Comm %p: %s -> %s gap=%f (lat=%f)",
- action, src->name, dst->name, action->sender.gap,
- action->latency);
- }
-
- constraints_per_variable = xbt_dynar_length(route);
- if (back_route != NULL)
- constraints_per_variable += xbt_dynar_length(back_route);
-
- if (action->latency > 0) {
- GENERIC_LMM_ACTION(action).variable =
- lmm_variable_new(surf_network_model->model_private->maxmin_system, action, 0.0, -1.0,
- constraints_per_variable);
- if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
- // add to the heap the event when the latency is payed
- XBT_DEBUG("Added action (%p) one latency event at date %f", action,
- action->latency + GENERIC_LMM_ACTION(action).last_update);
- surf_action_lmm_heap_insert(surf_network_model->model_private->action_heap,(surf_action_lmm_t)action, action->latency + GENERIC_LMM_ACTION(action).last_update,
- xbt_dynar_is_empty(route) ? NORMAL : LATENCY);
- }
- } else
- GENERIC_LMM_ACTION(action).variable =
- lmm_variable_new(surf_network_model->model_private->maxmin_system, action, 1.0, -1.0,
- constraints_per_variable);
-
- if (action->rate < 0) {
- lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
- (action->lat_current > 0) ?
- sg_tcp_gamma / (2.0 *
- action->lat_current) : -1.0);
- } else {
- lmm_update_variable_bound(surf_network_model->model_private->maxmin_system, GENERIC_LMM_ACTION(action).variable,
- (action->lat_current > 0) ?
- min(action->rate,
- sg_tcp_gamma / (2.0 *
- action->lat_current))
- : action->rate);
- }
-
- xbt_dynar_foreach(route, i, link) {
- lmm_expand(surf_network_model->model_private->maxmin_system, link->lmm_resource.constraint,
- GENERIC_LMM_ACTION(action).variable, 1.0);
- }
-
- if (sg_network_crosstraffic == 1) {
- XBT_DEBUG("Fullduplex active adding backward flow using 5%%");
- xbt_dynar_foreach(back_route, i, link) {
- lmm_expand(surf_network_model->model_private->maxmin_system, link->lmm_resource.constraint,
- GENERIC_LMM_ACTION(action).variable, .05);
- }
- }
-
- xbt_dynar_free(&route);
- XBT_OUT();
-
- return (surf_action_t) action;
-}
-
-static xbt_dynar_t net_get_route(void *src, void *dst)
-{
- xbt_dynar_t route = NULL;
- routing_get_route_and_latency(src, dst, &route, NULL);
- return route;
-}
-
-static double net_get_link_bandwidth(const void *link)
-{
- surf_resource_lmm_t lmm = (surf_resource_lmm_t) link;
- return lmm->power.peak * lmm->power.scale;
-}
-
-static double net_get_link_latency(const void *link)
-{
- return ((link_CM02_t) link)->lat_current;
-}
-
-static int net_link_shared(const void *link)
-{
- return
- lmm_constraint_is_shared(((surf_resource_lmm_t) link)->constraint);
-}
-
-static void net_finalize(void)
-{
- lmm_system_free(surf_network_model->model_private->maxmin_system);
- surf_network_model->model_private->maxmin_system = NULL;
-
- if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
- xbt_heap_free(surf_network_model->model_private->action_heap);
- xbt_swag_free(surf_network_model->model_private->modified_set);
- }
-
- surf_model_exit(surf_network_model);
- surf_network_model = NULL;
-
- xbt_dict_free(&gap_lookup);
- xbt_dynar_free(&smpi_bw_factor);
- xbt_dynar_free(&smpi_lat_factor);
-}
-
-static void smpi_gap_append(double size, const link_CM02_t link,
- surf_action_network_CM02_t action)
-{
- const char *src = link->lmm_resource.generic_resource.name;
- xbt_fifo_t fifo;
- //surf_action_network_CM02_t last_action;
- //double bw;
-
- if (sg_sender_gap > 0.0) {
- if (!gap_lookup) {
- gap_lookup = xbt_dict_new_homogeneous(NULL);
- }
- fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src);
- action->sender.gap = 0.0;
- if (fifo && xbt_fifo_size(fifo) > 0) {
- /* Compute gap from last send */
- /*last_action =
- (surf_action_network_CM02_t)
- xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));*/
- // bw = net_get_link_bandwidth(link);
- action->sender.gap = sg_sender_gap;
- /* max(sg_sender_gap,last_action->sender.size / bw);*/
- action->latency += action->sender.gap;
- }
- /* Append action as last send */
- /*action->sender.link_name = link->lmm_resource.generic_resource.name;
- fifo =
- (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
- action->sender.link_name);
- if (!fifo) {
- fifo = xbt_fifo_new();
- xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL);
- }
- action->sender.fifo_item = xbt_fifo_push(fifo, action);*/
- action->sender.size = size;
- }
-}
-
-static void smpi_gap_remove(surf_action_lmm_t lmm_action)
-{
- xbt_fifo_t fifo;
- size_t size;
- surf_action_network_CM02_t action = (surf_action_network_CM02_t)(lmm_action);
-
- if (sg_sender_gap > 0.0 && action->sender.link_name
- && action->sender.fifo_item) {
- fifo =
- (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
- action->sender.link_name);
- xbt_fifo_remove_item(fifo, action->sender.fifo_item);
- size = xbt_fifo_size(fifo);
- if (size == 0) {
- xbt_fifo_free(fifo);
- xbt_dict_remove(gap_lookup, action->sender.link_name);
- size = xbt_dict_length(gap_lookup);
- if (size == 0) {
- xbt_dict_free(&gap_lookup);
- }
- }
- }
-}
-
-static void set_update_mechanism(void)
-{
- char *optim = xbt_cfg_get_string(_sg_cfg_set, "network/optim");
- int select =
- xbt_cfg_get_boolean(_sg_cfg_set, "network/maxmin_selective_update");
-
- if (!strcmp(optim, "Full")) {
- surf_network_model->model_private->update_mechanism = UM_FULL;
- surf_network_model->model_private->selective_update = select;
- } else if (!strcmp(optim, "Lazy")) {
- surf_network_model->model_private->update_mechanism = UM_LAZY;
- surf_network_model->model_private->selective_update = 1;
- xbt_assert((select == 1)
- ||
- (xbt_cfg_is_default_value
- (_sg_cfg_set, "network/maxmin_selective_update")),
- "Disabling selective update while using the lazy update mechanism is dumb!");
- } else {
- xbt_die("Unsupported optimization (%s) for this model", optim);
- }
-}
-
-static void surf_network_model_init_internal(void)
-{
- s_surf_action_network_CM02_t comm;
- surf_network_model = surf_model_init();
-
- set_update_mechanism();
-
- surf_network_model->name = "network";
- surf_network_model->action_unref = surf_action_unref;
- surf_network_model->action_cancel = surf_action_cancel;
- surf_network_model->action_recycle = net_action_recycle;
-
- surf_network_model->get_remains = surf_action_get_remains;
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- surf_network_model->get_latency_limited = net_get_link_latency_limited;
-#endif
-#ifdef HAVE_TRACING
- surf_network_model->set_category = surf_action_set_category;
-#endif
-
- surf_network_model->model_private->resource_used = net_resource_used;
- if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
- surf_network_model->model_private->share_resources =
- net_share_resources_lazy;
- surf_network_model->model_private->update_actions_state =
- net_update_actions_state_lazy;
- } else if (surf_network_model->model_private->update_mechanism == UM_FULL) {
- surf_network_model->model_private->share_resources =
- net_share_resources_full;
- surf_network_model->model_private->update_actions_state =
- net_update_actions_state_full;
- }
-
- surf_network_model->model_private->update_resource_state =
- net_update_resource_state;
- surf_network_model->model_private->finalize = net_finalize;
-
- surf_network_model->suspend = surf_action_suspend;
- surf_network_model->resume = surf_action_resume;
- surf_network_model->is_suspended = surf_action_is_suspended;
- surf_cpu_model->set_max_duration = surf_action_set_max_duration;
-
- surf_network_model->extension.network.communicate = net_communicate;
- surf_network_model->extension.network.get_route = net_get_route;
- surf_network_model->extension.network.get_link_bandwidth =
- net_get_link_bandwidth;
- surf_network_model->extension.network.get_link_latency =
- net_get_link_latency;
- surf_network_model->extension.network.link_shared = net_link_shared;
- surf_network_model->extension.network.add_traces = net_add_traces;
-
- if (!surf_network_model->model_private->maxmin_system)
- surf_network_model->model_private->maxmin_system = lmm_system_new(surf_network_model->model_private->selective_update);
-
- routing_model_create(net_create_resource("__loopback__",
- 498000000, NULL, 0.000015, NULL,
- SURF_RESOURCE_ON, NULL,
- SURF_LINK_FATPIPE, NULL));
-
- if (surf_network_model->model_private->update_mechanism == UM_LAZY) {
- surf_network_model->model_private->action_heap = xbt_heap_new(8, NULL);
- xbt_heap_set_update_callback(surf_network_model->model_private->action_heap,
- surf_action_lmm_update_index_heap);
- surf_network_model->model_private->modified_set =
- xbt_swag_new(xbt_swag_offset(comm, generic_lmm_action.action_list_hookup));
- surf_network_model->model_private->maxmin_system->keep_track = surf_network_model->model_private->modified_set;
- }
-
- surf_network_model->gap_remove = NULL;
-}
-
-/************************************************************************/
-/* New model based on LV08 and experimental results of MPI ping-pongs */
-/************************************************************************/
-/* @Inproceedings{smpi_ipdps, */
-/* author={Pierre-Nicolas Clauss and Mark Stillwell and Stéphane Genaud and Frédéric Suter and Henri Casanova and Martin Quinson}, */
-/* title={Single Node On-Line Simulation of {MPI} Applications with SMPI}, */
-/* booktitle={25th IEEE International Parallel and Distributed Processing Symposium (IPDPS'11)}, */
-/* address={Anchorage (Alaska) USA}, */
-/* month=may, */
-/* year={2011} */
-/* } */
-void surf_network_model_init_SMPI(void)
-{
-
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- latency_factor_callback = &smpi_latency_factor;
- bandwidth_factor_callback = &smpi_bandwidth_factor;
- bandwidth_constraint_callback = &smpi_bandwidth_constraint;
- gap_append = &smpi_gap_append;
- surf_network_model->gap_remove = &smpi_gap_remove;
- net_define_callbacks();
- xbt_dynar_push(model_list, &surf_network_model);
- network_solve = lmm_solve;
-
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", 10e-6);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
-}
-
-/************************************************************************/
-/* New model based on optimizations discussed during Pedro Velho's thesis*/
-/************************************************************************/
-/* @techreport{VELHO:2011:HAL-00646896:1, */
-/* url = {http://hal.inria.fr/hal-00646896/en/}, */
-/* title = {{Flow-level network models: have we reached the limits?}}, */
-/* author = {Velho, Pedro and Schnorr, Lucas and Casanova, Henri and Legrand, Arnaud}, */
-/* type = {Rapport de recherche}, */
-/* institution = {INRIA}, */
-/* number = {RR-7821}, */
-/* year = {2011}, */
-/* month = Nov, */
-/* pdf = {http://hal.inria.fr/hal-00646896/PDF/rr-validity.pdf}, */
-/* } */
-void surf_network_model_init_LegrandVelho(void)
-{
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- net_define_callbacks();
- xbt_dynar_push(model_list, &surf_network_model);
- network_solve = lmm_solve;
-
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor",
- 13.01);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
- 0.97);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 20537);
-}
-
-/***************************************************************************/
-/* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */
-/***************************************************************************/
-/* @TechReport{ rr-lip2002-40, */
-/* author = {Henri Casanova and Loris Marchal}, */
-/* institution = {LIP}, */
-/* title = {A Network Model for Simulation of Grid Application}, */
-/* number = {2002-40}, */
-/* month = {oct}, */
-/* year = {2002} */
-/* } */
-void surf_network_model_init_CM02(void)
-{
-
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- net_define_callbacks();
- xbt_dynar_push(model_list, &surf_network_model);
- network_solve = lmm_solve;
-
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 1.0);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
- 1.0);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 0.0);
-}
-
-/***************************************************************************/
-/* The models from Steven H. Low */
-/***************************************************************************/
-/* @article{Low03, */
-/* author={Steven H. Low}, */
-/* title={A Duality Model of {TCP} and Queue Management Algorithms}, */
-/* year={2003}, */
-/* journal={{IEEE/ACM} Transactions on Networking}, */
-/* volume={11}, number={4}, */
-/* } */
-void surf_network_model_init_Reno(void)
-{
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- net_define_callbacks();
-
- xbt_dynar_push(model_list, &surf_network_model);
- lmm_set_default_protocol_function(func_reno_f, func_reno_fp,
- func_reno_fpi);
- network_solve = lagrange_solve;
-
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
- 0.92);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
-}
-
-
-void surf_network_model_init_Reno2(void)
-{
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- net_define_callbacks();
-
- xbt_dynar_push(model_list, &surf_network_model);
- lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp,
- func_reno2_fpi);
- network_solve = lagrange_solve;
-
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
- 0.92);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S_parameter",
- 8775);
-}
-
-void surf_network_model_init_Vegas(void)
-{
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- net_define_callbacks();
-
- xbt_dynar_push(model_list, &surf_network_model);
- lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp,
- func_vegas_fpi);
- network_solve = lagrange_solve;
-
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
- 0.92);
- xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_cm02.hpp"
+#include "maxmin_private.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
+
+double sg_sender_gap = 0.0;
+double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
+double sg_bandwidth_factor = 1.0; /* default value; can be set by model or from command line */
+double sg_weight_S_parameter = 0.0; /* default value; can be set by model or from command line */
+
+double sg_tcp_gamma = 0.0;
+int sg_network_crosstraffic = 0;
+
+/*************
+ * CallBacks *
+ *************/
+
+static void net_parse_link_init(sg_platf_link_cbarg_t link){
+ if (link->policy == SURF_LINK_FULLDUPLEX) {
+ char *link_id;
+ link_id = bprintf("%s_UP", link->id);
+ surf_network_model->createResource(link_id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace, link->policy, link->properties);
+ xbt_free(link_id);
+ link_id = bprintf("%s_DOWN", link->id);
+ surf_network_model->createResource(link_id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace, link->policy, link->properties);
+ xbt_free(link_id);
+ } else {
+ surf_network_model->createResource(link->id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace, link->policy, link->properties);
+ }
+}
+
+static void net_add_traces(void){
+ xbt_dict_cursor_t cursor = NULL;
+ char *trace_name, *elm;
+
+ static int called = 0;
+ if (called)
+ return;
+ called = 1;
+
+ /* connect all traces relative to network */
+ xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(
+ xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+ xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
+ trace_name, elm);
+ xbt_assert(trace,
+ "Cannot connect trace %s to link %s: trace undefined",
+ trace_name, elm);
+
+ link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+ }
+
+ xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(
+ xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+ xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
+ trace_name, elm);
+ xbt_assert(trace,
+ "Cannot connect trace %s to link %s: trace undefined",
+ trace_name, elm);
+
+ link->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+ }
+
+ xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(
+ xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+ xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
+ trace_name, elm);
+ xbt_assert(trace,
+ "Cannot connect trace %s to link %s: trace undefined",
+ trace_name, elm);
+
+ link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+ }
+}
+
+void net_define_callbacks(void)
+{
+ /* Figuring out the network links */
+ sg_platf_link_add_cb(net_parse_link_init);
+ sg_platf_postparse_add_cb(net_add_traces);
+}
+
+/*********
+ * Model *
+ *********/
+
+/************************************************************************/
+/* New model based on optimizations discussed during Pedro Velho's thesis*/
+/************************************************************************/
+/* @techreport{VELHO:2011:HAL-00646896:1, */
+/* url = {http://hal.inria.fr/hal-00646896/en/}, */
+/* title = {{Flow-level network models: have we reached the limits?}}, */
+/* author = {Velho, Pedro and Schnorr, Lucas and Casanova, Henri and Legrand, Arnaud}, */
+/* type = {Rapport de recherche}, */
+/* institution = {INRIA}, */
+/* number = {RR-7821}, */
+/* year = {2011}, */
+/* month = Nov, */
+/* pdf = {http://hal.inria.fr/hal-00646896/PDF/rr-validity.pdf}, */
+/* } */
+void surf_network_model_init_LegrandVelho(void)
+{
+ if (surf_network_model)
+ return;
+
+ surf_network_model = new NetworkCm02Model();
+ net_define_callbacks();
+ ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+ xbt_dynar_push(model_list, &model);
+
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor",
+ 13.01);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+ 0.97);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 20537);
+}
+
+/***************************************************************************/
+/* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */
+/***************************************************************************/
+/* @TechReport{ rr-lip2002-40, */
+/* author = {Henri Casanova and Loris Marchal}, */
+/* institution = {LIP}, */
+/* title = {A Network Model for Simulation of Grid Application}, */
+/* number = {2002-40}, */
+/* month = {oct}, */
+/* year = {2002} */
+/* } */
+void surf_network_model_init_CM02(void)
+{
+
+ if (surf_network_model)
+ return;
+
+ surf_network_model = new NetworkCm02Model();
+ net_define_callbacks();
+ ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+ xbt_dynar_push(model_list, &model);
+
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 1.0);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+ 1.0);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 0.0);
+}
+
+/***************************************************************************/
+/* The models from Steven H. Low */
+/***************************************************************************/
+/* @article{Low03, */
+/* author={Steven H. Low}, */
+/* title={A Duality Model of {TCP} and Queue Management Algorithms}, */
+/* year={2003}, */
+/* journal={{IEEE/ACM} Transactions on Networking}, */
+/* volume={11}, number={4}, */
+/* } */
+void surf_network_model_init_Reno(void)
+{
+ if (surf_network_model)
+ return;
+
+ surf_network_model = new NetworkCm02Model();
+ net_define_callbacks();
+ ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+ xbt_dynar_push(model_list, &model);
+ lmm_set_default_protocol_function(func_reno_f, func_reno_fp,
+ func_reno_fpi);
+ surf_network_model->f_networkSolve = lagrange_solve;
+
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+ 0.92);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
+}
+
+
+void surf_network_model_init_Reno2(void)
+{
+ if (surf_network_model)
+ return;
+
+ surf_network_model = new NetworkCm02Model();
+ net_define_callbacks();
+ ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+ xbt_dynar_push(model_list, &model);
+ lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp,
+ func_reno2_fpi);
+ surf_network_model->f_networkSolve = lagrange_solve;
+
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+ 0.92);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S_parameter",
+ 8775);
+}
+
+void surf_network_model_init_Vegas(void)
+{
+ if (surf_network_model)
+ return;
+
+ surf_network_model = new NetworkCm02Model();
+ net_define_callbacks();
+ ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+ xbt_dynar_push(model_list, &model);
+ lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp,
+ func_vegas_fpi);
+ surf_network_model->f_networkSolve = lagrange_solve;
+
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/latency_factor", 10.4);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/bandwidth_factor",
+ 0.92);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
+}
+
+void NetworkCm02Model::initialize()
+{
+ char *optim = xbt_cfg_get_string(_sg_cfg_set, "network/optim");
+ int select =
+ xbt_cfg_get_boolean(_sg_cfg_set, "network/maxmin_selective_update");
+
+ if (!strcmp(optim, "Full")) {
+ p_updateMechanism = UM_FULL;
+ m_selectiveUpdate = select;
+ } else if (!strcmp(optim, "Lazy")) {
+ p_updateMechanism = UM_LAZY;
+ m_selectiveUpdate = 1;
+ xbt_assert((select == 1)
+ ||
+ (xbt_cfg_is_default_value
+ (_sg_cfg_set, "network/maxmin_selective_update")),
+ "Disabling selective update while using the lazy update mechanism is dumb!");
+ } else {
+ xbt_die("Unsupported optimization (%s) for this model", optim);
+ }
+
+ if (!p_maxminSystem)
+ p_maxminSystem = lmm_system_new(m_selectiveUpdate);
+
+ const char* lb_name = "__loopback__";
+ routing_model_create(static_cast<ResourcePtr>(createResource(lb_name,
+ 498000000, NULL, 0.000015, NULL,
+ SURF_RESOURCE_ON, NULL,
+ SURF_LINK_FATPIPE, NULL)));
+
+ if (p_updateMechanism == UM_LAZY) {
+ p_actionHeap = xbt_heap_new(8, NULL);
+ xbt_heap_set_update_callback(p_actionHeap, surf_action_lmm_update_index_heap);
+ p_modifiedSet = new ActionLmmList();
+ p_maxminSystem->keep_track = p_modifiedSet;
+ }
+
+ m_haveGap = false;
+}
+
+NetworkLinkPtr NetworkCm02Model::createResource(const char *name,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy,
+ xbt_dict_t properties)
+{
+ xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
+ "Link '%s' declared several times in the platform file.",
+ name);
+
+ NetworkCm02LinkPtr nw_link =
+ new NetworkCm02Link(this, name, properties, p_maxminSystem, sg_bandwidth_factor * bw_initial, history,
+ state_initial, state_trace, bw_initial, bw_trace, lat_initial, lat_trace, policy);
+
+
+ xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, static_cast<ResourcePtr>(nw_link));
+ XBT_DEBUG("Create link '%s'",name);
+
+ return nw_link;
+}
+
+void NetworkCm02Model::updateActionsStateLazy(double now, double /*delta*/)
+{
+ NetworkCm02ActionPtr action;
+ while ((xbt_heap_size(p_actionHeap) > 0)
+ && (double_equals(xbt_heap_maxkey(p_actionHeap), now))) {
+ action = (NetworkCm02ActionPtr) xbt_heap_pop(p_actionHeap);
+ XBT_DEBUG("Something happened to action %p", action);
+#ifdef HAVE_TRACING
+ if (TRACE_is_enabled()) {
+ int n = lmm_get_number_of_cnst_from_var(p_maxminSystem, action->getVariable());
+ int i;
+ for (i = 0; i < n; i++){
+ lmm_constraint_t constraint = lmm_get_cnst_from_var(p_maxminSystem,
+ action->getVariable(),
+ i);
+ NetworkCm02LinkPtr link = static_cast<NetworkCm02LinkPtr>(lmm_constraint_id(constraint));
+ TRACE_surf_link_set_utilization(link->getName(),
+ action->getCategory(),
+ (lmm_variable_getvalue(action->getVariable())*
+ lmm_get_cnst_weight_from_var(p_maxminSystem,
+ action->getVariable(),
+ i)),
+ action->getLastUpdate(),
+ now - action->getLastUpdate());
+ }
+ }
+#endif
+
+ // if I am wearing a latency hat
+ if (action->getHat() == LATENCY) {
+ XBT_DEBUG("Latency paid for action %p. Activating", action);
+ lmm_update_variable_weight(p_maxminSystem, action->getVariable(), action->m_weight);
+ action->heapRemove(p_actionHeap);
+ action->refreshLastUpdate();
+
+ // if I am wearing a max_duration or normal hat
+ } else if (action->getHat() == MAX_DURATION ||
+ action->getHat() == NORMAL) {
+ // no need to communicate anymore
+ // assume that flows that reached max_duration have remaining of 0
+ XBT_DEBUG("Action %p finished", action);
+ action->setRemains(0);
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ action->heapRemove(p_actionHeap);
+
+ action->gapRemove();
+ }
+ }
+ return;
+}
+
+ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate)
+{
+ unsigned int i;
+ void *_link;
+ NetworkCm02LinkPtr link;
+ int failed = 0;
+ NetworkCm02ActionPtr action = NULL;
+ double bandwidth_bound;
+ double latency = 0.0;
+ xbt_dynar_t back_route = NULL;
+ int constraints_per_variable = 0;
+
+ xbt_dynar_t route = xbt_dynar_new(sizeof(RoutingEdgePtr), NULL);
+
+ XBT_IN("(%s,%s,%g,%g)", src->getName(), dst->getName(), size, rate);
+
+ routing_platf->getRouteAndLatency(src, dst, &route, &latency);
+ xbt_assert(!xbt_dynar_is_empty(route) || latency,
+ "You're trying to send data from %s to %s but there is no connection at all between these two hosts.",
+ src->getName(), dst->getName());
+
+ xbt_dynar_foreach(route, i, _link) {
+ link = static_cast<NetworkCm02LinkPtr>(_link);
+ if (link->getState() == SURF_RESOURCE_OFF) {
+ failed = 1;
+ break;
+ }
+ }
+ if (sg_network_crosstraffic == 1) {
+ routing_platf->getRouteAndLatency(dst, src, &back_route, NULL);
+ xbt_dynar_foreach(back_route, i, _link) {
+ link = static_cast<NetworkCm02LinkPtr>(_link);
+ if (link->getState() == SURF_RESOURCE_OFF) {
+ failed = 1;
+ break;
+ }
+ }
+ }
+
+ action = new NetworkCm02Action(this, size, failed);
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ action->m_latencyLimited = 0;
+#endif
+ action->m_weight = action->m_latency = latency;
+
+ action->m_rate = rate;
+ if (p_updateMechanism == UM_LAZY) {
+ action->m_indexHeap = -1;
+ action->m_lastUpdate = surf_get_clock();
+ }
+
+ bandwidth_bound = -1.0;
+ if (sg_weight_S_parameter > 0) {
+ xbt_dynar_foreach(route, i, _link) {
+ link = static_cast<NetworkCm02LinkPtr>(_link);
+ action->m_weight += sg_weight_S_parameter / link->getBandwidth();
+ }
+ }
+ xbt_dynar_foreach(route, i, _link) {
+ link = static_cast<NetworkCm02LinkPtr>(_link);
+ double bb = bandwidthFactor(size) * link->getBandwidth(); //(link->p_power.peak * link->p_power.scale);
+ bandwidth_bound =
+ (bandwidth_bound < 0.0) ? bb : min(bandwidth_bound, bb);
+ }
+
+ action->m_latCurrent = action->m_latency;
+ action->m_latency *= latencyFactor(size);
+ action->m_rate = bandwidthConstraint(action->m_rate, bandwidth_bound, size);
+ if (m_haveGap) {
+ xbt_assert(!xbt_dynar_is_empty(route),
+ "Using a model with a gap (e.g., SMPI) with a platform without links (e.g. vivaldi)!!!");
+
+ link = *static_cast<NetworkCm02LinkPtr *>(xbt_dynar_get_ptr(route, 0));
+ gapAppend(size, link, action);
+ XBT_DEBUG("Comm %p: %s -> %s gap=%f (lat=%f)",
+ action, src->getName(), dst->getName(), action->m_senderGap,
+ action->m_latency);
+ }
+
+ constraints_per_variable = xbt_dynar_length(route);
+ if (back_route != NULL)
+ constraints_per_variable += xbt_dynar_length(back_route);
+
+ if (action->m_latency > 0) {
+ action->p_variable = lmm_variable_new(p_maxminSystem, static_cast<ActionPtr>(action), 0.0, -1.0,
+ constraints_per_variable);
+ if (p_updateMechanism == UM_LAZY) {
+ // add to the heap the event when the latency is payed
+ XBT_DEBUG("Added action (%p) one latency event at date %f", action,
+ action->m_latency + action->m_lastUpdate);
+ action->heapInsert(p_actionHeap, action->m_latency + action->m_lastUpdate, xbt_dynar_is_empty(route) ? NORMAL : LATENCY);
+ }
+ } else
+ action->p_variable = lmm_variable_new(p_maxminSystem, static_cast<ActionPtr>(action), 1.0, -1.0, constraints_per_variable);
+
+ if (action->m_rate < 0) {
+ lmm_update_variable_bound(p_maxminSystem, action->getVariable(), (action->m_latCurrent > 0) ? sg_tcp_gamma / (2.0 * action->m_latCurrent) : -1.0);
+ } else {
+ lmm_update_variable_bound(p_maxminSystem, action->getVariable(), (action->m_latCurrent > 0) ? min(action->m_rate, sg_tcp_gamma / (2.0 * action->m_latCurrent)) : action->m_rate);
+ }
+
+ xbt_dynar_foreach(route, i, _link) {
+ link = static_cast<NetworkCm02LinkPtr>(_link);
+ lmm_expand(p_maxminSystem, link->getConstraint(), action->getVariable(), 1.0);
+ }
+
+ if (sg_network_crosstraffic == 1) {
+ XBT_DEBUG("Fullduplex active adding backward flow using 5%%");
+ xbt_dynar_foreach(back_route, i, _link) {
+ link = static_cast<NetworkCm02LinkPtr>(_link);
+ lmm_expand(p_maxminSystem, link->getConstraint(), action->getVariable(), .05);
+ }
+ }
+
+ xbt_dynar_free(&route);
+ XBT_OUT();
+
+ return action;
+}
+
+
+
+/************
+ * Resource *
+ ************/
+NetworkCm02Link::NetworkCm02Link(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props,
+ lmm_system_t system,
+ double constraint_value,
+ tmgr_history_t history,
+ e_surf_resource_state_t state_init,
+ tmgr_trace_t state_trace,
+ double metric_peak,
+ tmgr_trace_t metric_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_link_sharing_policy_t policy)
+: NetworkLink(model, name, props, lmm_constraint_new(system, this, constraint_value), history, state_trace)
+{
+ setState(state_init);
+
+ p_power.scale = 1.0;
+ p_power.peak = metric_peak;
+ if (metric_trace)
+ p_power.event = tmgr_history_add_trace(history, metric_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+ else
+ p_power.event = NULL;
+
+ m_latCurrent = lat_initial;
+ if (lat_trace)
+ p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+ if (policy == SURF_LINK_FATPIPE)
+ lmm_constraint_shared(getConstraint());
+}
+
+
+
+void NetworkCm02Link::updateState(tmgr_trace_event_t event_type,
+ double value, double date)
+{
+ /* printf("[" "%g" "] Asking to update network card \"%s\" with value " */
+ /* "%g" " for event %p\n", surf_get_clock(), nw_link->name, */
+ /* value, event_type); */
+
+ if (event_type == p_power.event) {
+ double delta =
+ sg_weight_S_parameter / value - sg_weight_S_parameter /
+ (p_power.peak * p_power.scale);
+ lmm_variable_t var = NULL;
+ lmm_element_t elem = NULL;
+ NetworkCm02ActionPtr action = NULL;
+
+ p_power.peak = value;
+ lmm_update_constraint_bound(getModel()->getMaxminSystem(),
+ getConstraint(),
+ sg_bandwidth_factor *
+ (p_power.peak * p_power.scale));
+#ifdef HAVE_TRACING
+ TRACE_surf_link_set_bandwidth(date, getName(), sg_bandwidth_factor * p_power.peak * p_power.scale);
+#endif
+ if (sg_weight_S_parameter > 0) {
+ while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) {
+ action = (NetworkCm02ActionPtr) lmm_variable_id(var);
+ action->m_weight += delta;
+ if (!action->isSuspended())
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight);
+ }
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_power.event = NULL;
+ } else if (event_type == p_latEvent) {
+ double delta = value - m_latCurrent;
+ lmm_variable_t var = NULL;
+ lmm_element_t elem = NULL;
+ NetworkCm02ActionPtr action = NULL;
+
+ m_latCurrent = value;
+ while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), getConstraint(), &elem))) {
+ action = (NetworkCm02ActionPtr) lmm_variable_id(var);
+ action->m_latCurrent += delta;
+ action->m_weight += delta;
+ if (action->m_rate < 0)
+ lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(), sg_tcp_gamma / (2.0 * action->m_latCurrent));
+ else {
+ lmm_update_variable_bound(getModel()->getMaxminSystem(), action->getVariable(),
+ min(action->m_rate, sg_tcp_gamma / (2.0 * action->m_latCurrent)));
+
+ if (action->m_rate < sg_tcp_gamma / (2.0 * action->m_latCurrent)) {
+ XBT_INFO("Flow is limited BYBANDWIDTH");
+ } else {
+ XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f",
+ action->m_latCurrent);
+ }
+ }
+ if (!action->isSuspended())
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), action->getVariable(), action->m_weight);
+
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_latEvent = NULL;
+ } else if (event_type == p_stateEvent) {
+ if (value > 0)
+ setState(SURF_RESOURCE_ON);
+ else {
+ lmm_constraint_t cnst = getConstraint();
+ lmm_variable_t var = NULL;
+ lmm_element_t elem = NULL;
+
+ setState(SURF_RESOURCE_OFF);
+ while ((var = lmm_get_var_from_cnst(getModel()->getMaxminSystem(), cnst, &elem))) {
+ ActionPtr action = (ActionPtr) lmm_variable_id(var);
+
+ if (action->getState() == SURF_ACTION_RUNNING ||
+ action->getState() == SURF_ACTION_READY) {
+ action->setFinishTime(date);
+ action->setState(SURF_ACTION_FAILED);
+ }
+ }
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_stateEvent = NULL;
+ } else {
+ XBT_CRITICAL("Unknown event ! \n");
+ xbt_abort();
+ }
+
+ XBT_DEBUG
+ ("There were a resource state event, need to update actions related to the constraint (%p)",
+ getConstraint());
+ return;
+}
+
+/**********
+ * Action *
+ **********/
+void NetworkCm02Action::updateRemainingLazy(double now)
+{
+ double delta = 0.0;
+
+ if (m_suspended != 0)
+ return;
+
+ delta = now - m_lastUpdate;
+
+ if (m_remains > 0) {
+ XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
+ double_update(&(m_remains), m_lastValue * delta);
+
+ XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains);
+ }
+
+ if (m_maxDuration != NO_MAX_DURATION)
+ double_update(&m_maxDuration, delta);
+
+ if (m_remains <= 0 &&
+ (lmm_get_variable_weight(getVariable()) > 0)) {
+ finish();
+ setState(SURF_ACTION_DONE);
+
+ heapRemove(getModel()->getActionHeap());
+ } else if (((m_maxDuration != NO_MAX_DURATION)
+ && (m_maxDuration <= 0))) {
+ finish();
+ setState(SURF_ACTION_DONE);
+ heapRemove(getModel()->getActionHeap());
+ }
+
+ m_lastUpdate = now;
+ m_lastValue = lmm_variable_getvalue(getVariable());
+}
+void NetworkCm02Action::recycle()
+{
+ return;
+}
+
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_interface.hpp"
+#include "xbt/fifo.h"
+#include "xbt/graph.h"
+
+#ifndef SURF_NETWORK_CM02_HPP_
+#define SURF_NETWORK_CM02_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkCm02Model;
+typedef NetworkCm02Model *NetworkCm02ModelPtr;
+
+class NetworkCm02Link;
+typedef NetworkCm02Link *NetworkCm02LinkPtr;
+
+class NetworkCm02Action;
+typedef NetworkCm02Action *NetworkCm02ActionPtr;
+
+/*********
+ * Tools *
+ *********/
+
+void net_define_callbacks(void);
+
+/*********
+ * Model *
+ *********/
+class NetworkCm02Model : public NetworkModel {
+private:
+ void initialize();
+public:
+ NetworkCm02Model(int /*i*/) : NetworkModel("network") {
+ f_networkSolve = lmm_solve;
+ m_haveGap = false;
+ };//FIXME: add network clean interface
+ NetworkCm02Model(const char *name) : NetworkModel(name) {
+ this->initialize();
+ }
+ NetworkCm02Model() : NetworkModel("network") {
+ this->initialize();
+ }
+ ~NetworkCm02Model() {
+ }
+ NetworkLinkPtr createResource(const char *name,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy,
+ xbt_dict_t properties);
+ void updateActionsStateLazy(double now, double delta);
+ ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate);
+};
+
+/************
+ * Resource *
+ ************/
+
+class NetworkCm02Link : public NetworkLink {
+public:
+ NetworkCm02Link(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props,
+ lmm_system_t system,
+ double constraint_value,
+ tmgr_history_t history,
+ e_surf_resource_state_t state_init,
+ tmgr_trace_t state_trace,
+ double metric_peak,
+ tmgr_trace_t metric_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_link_sharing_policy_t policy);
+ void updateState(tmgr_trace_event_t event_type, double value, double date);
+};
+
+
+/**********
+ * Action *
+ **********/
+
+class NetworkCm02Action : public NetworkAction {
+ friend ActionPtr NetworkCm02Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate);
+
+public:
+ NetworkCm02Action(ModelPtr model, double cost, bool failed)
+ : NetworkAction(model, cost, failed) {};
+ void updateRemainingLazy(double now);
+ void recycle();
+};
+
+#endif /* SURF_NETWORK_CM02_HPP_ */
+++ /dev/null
-/* Copyright (c) 2008-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "surf_private.h"
-#include "surf/random_mgr.h"
-#include "xbt/dict.h"
-#include "xbt/str.h"
-#include "xbt/log.h"
-
-typedef struct surf_action_network_Constant {
- s_surf_action_t generic_action;
- double latency;
- double lat_init;
- int suspended;
-} s_surf_action_network_Constant_t, *surf_action_network_Constant_t;
-
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
-static int host_number_int = 0;
-
-static void netcste_count_hosts(sg_platf_host_cbarg_t h) {
- host_number_int++;
-}
-
-static void netcste_define_callbacks(void) {
- sg_platf_host_add_cb(netcste_count_hosts);
-}
-
-static int netcste_resource_used(void *resource_id)
-{
- return 0;
-}
-
-static int netcste_action_unref(surf_action_t action)
-{
- action->refcount--;
- if (!action->refcount) {
- xbt_swag_remove(action, action->state_set);
- surf_action_free(&action);
- return 1;
- }
- return 0;
-}
-
-static void netcste_action_cancel(surf_action_t action)
-{
- return;
-}
-
-static double netcste_share_resources(double now)
-{
- surf_action_network_Constant_t action = NULL;
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
- double min = -1.0;
-
- xbt_swag_foreach(action, running_actions) {
- if (action->latency > 0) {
- if (min < 0)
- min = action->latency;
- else if (action->latency < min)
- min = action->latency;
- }
- }
-
- return min;
-}
-
-static void netcste_update_actions_state(double now, double delta)
-{
- surf_action_network_Constant_t action = NULL;
- surf_action_network_Constant_t next_action = NULL;
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
-
- xbt_swag_foreach_safe(action, next_action, running_actions) {
- if (action->latency > 0) {
- if (action->latency > delta) {
- double_update(&(action->latency), delta);
- } else {
- action->latency = 0.0;
- }
- }
- double_update(&(action->generic_action.remains),
- action->generic_action.cost * delta / action->lat_init);
- if (action->generic_action.max_duration != NO_MAX_DURATION)
- double_update(&(action->generic_action.max_duration), delta);
-
- if (action->generic_action.remains <= 0) {
- action->generic_action.finish = surf_get_clock();
- surf_network_model->action_state_set((surf_action_t) action,
- SURF_ACTION_DONE);
- } else if ((action->generic_action.max_duration != NO_MAX_DURATION)
- && (action->generic_action.max_duration <= 0)) {
- action->generic_action.finish = surf_get_clock();
- surf_network_model->action_state_set((surf_action_t) action,
- SURF_ACTION_DONE);
- }
- }
-}
-
-static void netcste_update_resource_state(void *id,
- tmgr_trace_event_t event_type,
- double value, double time)
-{
- DIE_IMPOSSIBLE;
-}
-
-static surf_action_t netcste_communicate(sg_routing_edge_t src,
- sg_routing_edge_t dst,
- double size, double rate)
-{
- surf_action_network_Constant_t action = NULL;
-
- char *src_name = src->name;
- char *dst_name = dst->name;
-
- XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate);
-
- action =
- surf_action_new(sizeof(s_surf_action_network_Constant_t), size,
- surf_network_model, 0);
-
- action->suspended = 0;
-
- action->latency = sg_latency_factor;
- action->lat_init = action->latency;
-
- if (action->latency <= 0.0) {
- action->generic_action.state_set =
- surf_network_model->states.done_action_set;
- xbt_swag_insert(action, action->generic_action.state_set);
- }
-
- XBT_OUT();
-
- return (surf_action_t) action;
-}
-
-#ifdef HAVE_TRACING
-static void netcste_action_set_category(surf_action_t action, const char *category)
-{
- //ignore completely the categories in constant model, they are not traced
-}
-#endif
-
-static double netcste_get_link_bandwidth(const void *link)
-{
- DIE_IMPOSSIBLE;
- return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
-}
-
-static double netcste_get_link_latency(const void *link)
-{
- DIE_IMPOSSIBLE;
- return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
-}
-
-static int link_shared(const void *link)
-{
- DIE_IMPOSSIBLE;
- return -1; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
-}
-
-static void netcste_action_suspend(surf_action_t action)
-{
- ((surf_action_network_Constant_t) action)->suspended = 1;
-}
-
-static void netcste_action_resume(surf_action_t action)
-{
- if (((surf_action_network_Constant_t) action)->suspended)
- ((surf_action_network_Constant_t) action)->suspended = 0;
-}
-
-static int netcste_action_is_suspended(surf_action_t action)
-{
- return ((surf_action_network_Constant_t) action)->suspended;
-}
-
-static void netcste_finalize(void)
-{
- surf_model_exit(surf_network_model);
- surf_network_model = NULL;
-}
-
-
-
-void surf_network_model_init_Constant()
-{
- xbt_assert(surf_network_model == NULL);
- if (surf_network_model)
- return;
- surf_network_model = surf_model_init();
-
- surf_network_model->name = "constant time network";
- surf_network_model->action_unref = netcste_action_unref;
- surf_network_model->action_cancel = netcste_action_cancel;
- surf_network_model->action_recycle = net_action_recycle;
- surf_network_model->get_remains = surf_action_get_remains;
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- surf_network_model->get_latency_limited = net_get_link_latency_limited;
-#endif
-
- surf_network_model->model_private->resource_used = netcste_resource_used;
- surf_network_model->model_private->share_resources =
- netcste_share_resources;
- surf_network_model->model_private->update_actions_state =
- netcste_update_actions_state;
- surf_network_model->model_private->update_resource_state =
- netcste_update_resource_state;
- surf_network_model->model_private->finalize = netcste_finalize;
-
- surf_network_model->suspend = netcste_action_suspend;
- surf_network_model->resume = netcste_action_resume;
- surf_network_model->is_suspended = netcste_action_is_suspended;
- surf_cpu_model->set_max_duration = surf_action_set_max_duration;
-
- surf_network_model->extension.network.communicate = netcste_communicate;
- surf_network_model->extension.network.get_link_bandwidth =
- netcste_get_link_bandwidth;
- surf_network_model->extension.network.get_link_latency =
- netcste_get_link_latency;
- surf_network_model->extension.network.link_shared = link_shared;
-#ifdef HAVE_TRACING
- surf_network_model->set_category = netcste_action_set_category;
-#endif
-
- netcste_define_callbacks();
- xbt_dynar_push(model_list, &surf_network_model);
-
- routing_model_create(NULL);
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_constant.hpp"
+#include "surf/random_mgr.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
+static int host_number_int = 0;
+
+static void netcste_count_hosts(sg_platf_host_cbarg_t /*h*/) {
+ host_number_int++;
+}
+
+/*********
+ * Model *
+ *********/
+void surf_network_model_init_Constant()
+{
+ xbt_assert(surf_network_model == NULL);
+ surf_network_model = new NetworkConstantModel();
+
+ sg_platf_host_add_cb(netcste_count_hosts);
+
+ ModelPtr model = static_cast<ModelPtr>(surf_network_model);
+ xbt_dynar_push(model_list, &model);
+}
+
+double NetworkConstantModel::shareResources(double /*now*/)
+{
+ NetworkConstantActionPtr action = NULL;
+ double min = -1.0;
+
+ ActionListPtr actionSet = getRunningActionSet();
+ for(ActionList::iterator it(actionSet->begin()), itend(actionSet->end())
+ ; it != itend ; ++it) {
+ action = static_cast<NetworkConstantActionPtr>(&*it);
+ if (action->m_latency > 0) {
+ if (min < 0)
+ min = action->m_latency;
+ else if (action->m_latency < min)
+ min = action->m_latency;
+ }
+ }
+
+ return min;
+}
+
+void NetworkConstantModel::updateActionsState(double /*now*/, double delta)
+{
+ NetworkConstantActionPtr action = NULL;
+ ActionListPtr actionSet = getRunningActionSet();
+ for(ActionList::iterator it(actionSet->begin()), itNext=it, itend(actionSet->end())
+ ; it != itend ; it=itNext) {
+ ++itNext;
+ action = static_cast<NetworkConstantActionPtr>(&*it);
+ if (action->m_latency > 0) {
+ if (action->m_latency > delta) {
+ double_update(&(action->m_latency), delta);
+ } else {
+ action->m_latency = 0.0;
+ }
+ }
+ action->updateRemains(action->getCost() * delta / action->m_latInit);
+ if (action->getMaxDuration() != NO_MAX_DURATION)
+ action->updateMaxDuration(delta);
+
+ if (action->getRemainsNoUpdate() <= 0) {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ } else if ((action->getMaxDuration() != NO_MAX_DURATION)
+ && (action->getMaxDuration() <= 0)) {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ }
+ }
+}
+
+ActionPtr NetworkConstantModel::communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate)
+{
+ char *src_name = src->getName();
+ char *dst_name = dst->getName();
+
+ XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate);
+ NetworkConstantActionPtr action = new NetworkConstantAction(this, size, sg_latency_factor);
+ XBT_OUT();
+
+ return action;
+}
+
+/************
+ * Resource *
+ ************/
+bool NetworkConstantLink::isUsed()
+{
+ return 0;
+}
+
+void NetworkConstantLink::updateState(tmgr_trace_event_t /*event_type*/,
+ double /*value*/, double /*time*/)
+{
+ DIE_IMPOSSIBLE;
+}
+
+double NetworkConstantLink::getBandwidth()
+{
+ DIE_IMPOSSIBLE;
+ return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
+}
+
+double NetworkConstantLink::getLatency()
+{
+ DIE_IMPOSSIBLE;
+ return -1.0; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
+}
+
+bool NetworkConstantLink::isShared()
+{
+ DIE_IMPOSSIBLE;
+ return -1; /* useless since DIE actually abort(), but eclipse prefer to have a useless and harmless return */
+}
+
+/**********
+ * Action *
+ **********/
+
+int NetworkConstantAction::unref()
+{
+ m_refcount--;
+ if (!m_refcount) {
+ if (actionHook::is_linked())
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ delete this;
+ return 1;
+ }
+ return 0;
+}
+
+void NetworkConstantAction::cancel()
+{
+ return;
+}
+
+#ifdef HAVE_TRACING
+void NetworkConstantAction::setCategory(const char */*category*/)
+{
+ //ignore completely the categories in constant model, they are not traced
+}
+#endif
+
+void NetworkConstantAction::suspend()
+{
+ m_suspended = true;
+}
+
+void NetworkConstantAction::resume()
+{
+ if (m_suspended)
+ m_suspended = false;
+}
+
+void NetworkConstantAction::recycle()
+{
+ return;
+}
+
+bool NetworkConstantAction::isSuspended()
+{
+ return m_suspended;
+}
+
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_cm02.hpp"
+
+#ifndef NETWORK_CONSTANT_HPP_
+#define NETWORK_CONSTANT_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkConstantModel;
+typedef NetworkConstantModel *NetworkConstantModelPtr;
+
+class NetworkConstantLink;
+typedef NetworkConstantLink *NetworkConstantLinkPtr;
+
+class NetworkConstantAction;
+typedef NetworkConstantAction *NetworkConstantActionPtr;
+
+/*********
+ * Model *
+ *********/
+class NetworkConstantModel : public NetworkCm02Model {
+public:
+ NetworkConstantModel()
+ : NetworkCm02Model("constant time network")
+ {
+ p_updateMechanism = UM_UNDEFINED;
+ };
+ double shareResources(double now);
+ void updateActionsState(double now, double delta);
+ ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate);
+ void gapRemove(ActionPtr action);
+ //FIXME:virtual void addTraces() =0;
+};
+
+/************
+ * Resource *
+ ************/
+class NetworkConstantLink : public NetworkCm02Link {
+public:
+ NetworkConstantLink(NetworkCm02ModelPtr model, const char* name, xbt_dict_t properties);
+ bool isUsed();
+ void updateState(tmgr_trace_event_t event_type, double value, double date);
+ double getBandwidth();
+ double getLatency();
+ bool isShared();
+};
+
+/**********
+ * Action *
+ **********/
+class NetworkConstantAction : public NetworkCm02Action {
+public:
+ NetworkConstantAction(NetworkConstantModelPtr model_, double size, double latency)
+ : NetworkCm02Action(model_, size, false)
+ , m_latInit(latency)
+ {
+ m_latency = latency;
+ if (m_latency <= 0.0) {
+ p_stateSet = getModel()->getDoneActionSet();
+ p_stateSet->push_back(*this);
+ }
+ p_variable = NULL;
+ };
+ int unref();
+ void recycle();
+ void cancel();
+ void setCategory(const char *category);
+ void suspend();
+ void resume();
+ bool isSuspended();
+ double m_latInit;
+ int m_suspended;
+};
+
+#endif /* NETWORK_CONSTANT_HPP_ */
+++ /dev/null
-/* Copyright (c) 2007-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "network_gtnets_private.h"
-#include "gtnets/gtnets_interface.h"
-#include "xbt/str.h"
-#include "surf/surfxml_parse_values.h"
-
-static double time_to_next_flow_completion = -1;
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets, surf,
- "Logging specific to the SURF network GTNetS module");
-
-extern routing_platf_t routing_platf;
-
-double sg_gtnets_jitter = 0.0;
-int sg_gtnets_jitter_seed = 10;
-
-static void link_new(const char *name, double bw, double lat, xbt_dict_t props)
-{
- static int link_count = -1;
- network_link_GTNETS_t gtnets_link;
-
- if (xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL)) {
- return;
- }
-
- XBT_DEBUG("Scanning link name %s", name);
-
-
- gtnets_link = xbt_new0(s_network_link_GTNETS_t, 1);
- gtnets_link->generic_resource.name = xbt_strdup(name);
- gtnets_link->generic_resource.properties = props;
- gtnets_link->bw_current = bw;
- gtnets_link->lat_current = lat;
-
- link_count++;
-
- XBT_DEBUG("Adding new link, linkid %d, name %s, latency %g, bandwidth %g",
- link_count, name, lat, bw);
-
- if (gtnets_add_link(link_count, bw, lat)) {
- xbt_die("Cannot create GTNetS link");
- }
- gtnets_link->id = link_count;
-
- xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, gtnets_link);
-}
-
-static void route_new(int src_id, int dst_id, xbt_dynar_t links,
- int nb_link)
-{
- network_link_GTNETS_t link;
- unsigned int cursor;
- int i = 0;
- int *gtnets_links;
-
- XBT_IN("(src_id=%d, dst_id=%d, links=%p, nb_link=%d)",
- src_id, dst_id, links, nb_link);
-
- /* Build the list of gtnets link IDs */
- gtnets_links = xbt_new0(int, nb_link);
- i = 0;
- xbt_dynar_foreach(links, cursor, link) {
- gtnets_links[i++] = link->id;
- }
-
- if (gtnets_add_route(src_id, dst_id, gtnets_links, nb_link)) {
- xbt_die("Cannot create GTNetS route");
- }
- XBT_OUT();
-}
-
-static void route_onehop_new(int src_id, int dst_id,
- network_link_GTNETS_t link)
-{
- if (gtnets_add_onehop_route(src_id, dst_id, link->id)) {
- xbt_die("Cannot create GTNetS route");
- }
-}
-
-/* Parse the XML for a network link */
-static void parse_link_init(sg_platf_link_cbarg_t link)
-{
- XBT_DEBUG("link_gtnets");
-
- if (link->bandwidth_trace)
- XBT_INFO
- ("The GTNetS network model doesn't support bandwidth state traces");
- if (link->latency_trace)
- XBT_INFO("The GTNetS network model doesn't support latency state traces");
- if (link->state_trace)
- XBT_INFO("The GTNetS network model doesn't support link state traces");
-
- if (link->policy == SURF_LINK_FULLDUPLEX)
- {
- link_new(bprintf("%s_UP",link->id), link->bandwidth, link->latency, current_property_set);
- link_new(bprintf("%s_DOWN",link->id), link->bandwidth, link->latency, current_property_set);
-
- }
- else link_new(link->id, link->bandwidth, link->latency, current_property_set);
- current_property_set = NULL;
-}
-
-/* Create the gtnets topology based on routing strategy */
-static void create_gtnets_topology(void)
-{
- XBT_DEBUG("Starting topology generation");
-// FIXME: We should take the list of hosts/routers (in the routing module), number the elements of this list,
-// and then you can use the id to reimplement properly the following GTNets calls
-
- //get the onelinks from the parsed platform
- xbt_dynar_t onelink_routes = routing_platf->get_onelink_routes();
- if (!onelink_routes)
- return;
-
- //save them in trace file
- onelink_t onelink;
- unsigned int iter;
- xbt_dynar_foreach(onelink_routes, iter, onelink) {
- void *link = onelink->link_ptr;
-
- if(onelink->src->id != onelink->dst->id){
- XBT_DEBUG("Link (#%p), src (#%s), dst (#%s), src_id = %d, dst_id = %d",
- link,
- onelink->src->name,
- onelink->dst->name,
- onelink->src->id,
- onelink->dst->id);
- XBT_DEBUG("Calling one link route");
- if(onelink->src->rc_type == SURF_NETWORK_ELEMENT_ROUTER){
- gtnets_add_router(onelink->src->id);
- }
- if(onelink->dst->rc_type == SURF_NETWORK_ELEMENT_ROUTER){
- gtnets_add_router(onelink->dst->id);
- }
- route_onehop_new(onelink->src->id, onelink->dst->id, (network_link_GTNETS_t)(link));
- }
- }
-
- if (XBT_LOG_ISENABLED(surf_network_gtnets, xbt_log_priority_debug)) {
- gtnets_print_topology();
- }
-}
-
-/* Main XML parsing */
-static void define_callbacks(void)
-{
- /* Figuring out the network links */
- sg_platf_link_add_cb (&parse_link_init);
- sg_platf_postparse_add_cb(&create_gtnets_topology);
-}
-
-static int resource_used(void *resource_id)
-{
- xbt_die("The resource_used feature is not implemented in GTNets model");
-}
-
-static int action_unref(surf_action_t action)
-{
- action->refcount--;
- if (!action->refcount) {
- xbt_swag_remove(action, action->state_set);
-#ifdef HAVE_TRACING
- xbt_free(action->category);
-#endif
- surf_action_free(&action);
- return 1;
- }
- return 0;
-}
-
-static void action_cancel(surf_action_t action)
-{
- xbt_die("Cannot cancel GTNetS flow");
- return;
-}
-
-static void action_recycle(surf_action_t action)
-{
- xbt_die("Cannot recycle GTNetS flow");
- return;
-}
-
-static double action_get_remains(surf_action_t action)
-{
- return action->remains;
-}
-
-static void action_state_set(surf_action_t action,
- e_surf_action_state_t state)
-{
- surf_action_state_set(action, state);
-}
-
-static double share_resources(double now)
-{
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
-
- //get the first relevant value from the running_actions list
- if (!xbt_swag_size(running_actions))
- return -1.0;
-
- xbt_assert(time_to_next_flow_completion,
- "Time to next flow completion not initialized!\n");
-
- XBT_DEBUG("Calling gtnets_get_time_to_next_flow_completion");
- time_to_next_flow_completion = gtnets_get_time_to_next_flow_completion();
- XBT_DEBUG("gtnets_get_time_to_next_flow_completion received %g",
- time_to_next_flow_completion);
-
- return time_to_next_flow_completion;
-}
-
-static void update_actions_state(double now, double delta)
-{
- surf_action_network_GTNETS_t action = NULL;
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
-
- /* If there are no running flows, just return */
- if (time_to_next_flow_completion < 0.0) {
- return;
- }
-
- /* if delta == time_to_next_flow_completion, too. */
- if (time_to_next_flow_completion <= delta) { /* run until the first flow completes */
- void **metadata;
- int i, num_flows;
-
- num_flows = 0;
-
- if (gtnets_run_until_next_flow_completion(&metadata, &num_flows)) {
- xbt_die("Cannot run GTNetS simulation until next flow completion");
- }
- if (num_flows < 1) {
- xbt_die("GTNetS simulation couldn't find a flow that would complete");
- }
-
- xbt_swag_foreach(action, running_actions) {
- XBT_DEBUG("Action (%p) remains old value: %f", action,
- action->generic_action.remains);
- double sent = gtnets_get_flow_rx(action);
-
- XBT_DEBUG("Sent value returned by GTNetS : %f", sent);
-
-#ifdef HAVE_TRACING
- action->last_remains = action->generic_action.remains;
-#endif
-
- //need to trust this remain value
- if (sent == 0) {
- action->generic_action.remains = 0;
- } else {
- action->generic_action.remains =
- action->generic_action.cost - sent;
- }
-
- // verify that this action is a finishing action.
- int found=0;
- for (i = 0; i < num_flows; i++) {
- if(action == (surf_action_network_GTNETS_t) (metadata[i])){
- found = 1;
- break;
- }
- }
-
- // indeed this action have not yet started
- // because of that we need to fix the remaining to the
- // original total cost
- if(found != 1 && action->generic_action.remains == 0 ){
- action->generic_action.remains = action->generic_action.cost;
- }
-
- XBT_DEBUG("Action (%p) remains new value: %f", action,
- action->generic_action.remains);
-
-#ifdef HAVE_TRACING
- if (TRACE_is_enabled()) {
- double last_amount_sent = (action->generic_action.cost - action->last_remains);
- double amount_sent = (action->generic_action.cost - action->generic_action.remains);
-
- // tracing resource utilization
- xbt_dynar_t route = NULL;
-
- routing_get_route_and_latency (action->src, action->dst, &route, NULL);
-
- unsigned int i;
- for (i = 0; i < xbt_dynar_length (route); i++){
- network_link_GTNETS_t *link = ((network_link_GTNETS_t*)xbt_dynar_get_ptr (route, i));
- TRACE_surf_link_set_utilization ((*link)->generic_resource.name,
- ((surf_action_t) action)->category,
- (amount_sent - last_amount_sent)/(delta),
- now-delta,
- delta);
- }
- }
-#endif
-
-
- }
-
- for (i = 0; i < num_flows; i++) {
- action = (surf_action_network_GTNETS_t) (metadata[i]);
-
-
-
- action->generic_action.finish = now + time_to_next_flow_completion;
- action_state_set((surf_action_t) action, SURF_ACTION_DONE);
- XBT_DEBUG("----> Action (%p) just terminated", action);
-
- }
-
-
- } else { /* run for a given number of seconds */
- if (gtnets_run(delta)) {
- xbt_die("Cannot run GTNetS simulation");
- }
- }
-
- return;
-}
-
-static void update_resource_state(void *id,
- tmgr_trace_event_t event_type,
- double value, double date)
-{
- xbt_die("Cannot update model state for GTNetS simulation");
-}
-
-/* Max durations are not supported */
-static surf_action_t communicate(sg_routing_edge_t src_card,
- sg_routing_edge_t dst_card,
- double size, double rate)
-{
- surf_action_network_GTNETS_t action = NULL;
-
- int src = src_card->id;
- int dst = dst_card->id;
- char *src_name = src_card->name;
- char *dst_name = dst_card->name;
-
- xbt_assert((src >= 0
- && dst >= 0), "Either src or dst have invalid id (id<0)");
-
- XBT_DEBUG("Setting flow src %d \"%s\", dst %d \"%s\"", src, src_name, dst,
- dst_name);
-
- xbt_dynar_t route = NULL;
-
- routing_get_route_and_latency(src_card, dst_card, &route, NULL);
-
- route_new(src, dst, route, xbt_dynar_length(route));
-
- action =
- surf_action_new(sizeof(s_surf_action_network_GTNETS_t), size,
- surf_network_model, 0);
-
-#ifdef HAVE_TRACING
- action->last_remains = 0;
-#endif
-
- /* Add a flow to the GTNets Simulation, associated to this action */
- if (gtnets_create_flow(src, dst, size, (void *) action) < 0) {
- xbt_die("Not route between host %s and host %s", src_name, dst_name);
- }
-#ifdef HAVE_TRACING
- TRACE_surf_gtnets_communicate(action, src_card, dst_card);
-#endif
-
- return (surf_action_t) action;
-}
-
-/* Suspend a flow() */
-static void action_suspend(surf_action_t action)
-{
- THROW_UNIMPLEMENTED;
-}
-
-/* Resume a flow() */
-static void action_resume(surf_action_t action)
-{
- THROW_UNIMPLEMENTED;
-}
-
-/* Test whether a flow is suspended */
-static int action_is_suspended(surf_action_t action)
-{
- return 0;
-}
-
-#ifdef HAVE_TRACING
-static void gtnets_action_set_category(surf_action_t action, const char *category)
-{
- action->category = xbt_strdup (category);
-}
-#endif
-
-static void finalize(void)
-{
- gtnets_finalize();
-}
-
-static void surf_network_model_init_internal(void)
-{
- surf_network_model = surf_model_init();
-
- surf_network_model->name = "network GTNetS";
- surf_network_model->action_unref = action_unref;
- surf_network_model->action_cancel = action_cancel;
- surf_network_model->action_recycle = action_recycle;
- surf_network_model->action_state_set = action_state_set;
- surf_network_model->get_remains = action_get_remains;
-
- surf_network_model->model_private->resource_used = resource_used;
- surf_network_model->model_private->share_resources = share_resources;
- surf_network_model->model_private->update_actions_state =
- update_actions_state;
- surf_network_model->model_private->update_resource_state =
- update_resource_state;
- surf_network_model->model_private->finalize = finalize;
-
- surf_network_model->suspend = action_suspend;
- surf_network_model->resume = action_resume;
- surf_network_model->is_suspended = action_is_suspended;
-#ifdef HAVE_TRACING
- surf_network_model->set_category = gtnets_action_set_category;
-#endif
-
- surf_network_model->extension.network.communicate = communicate;
-
- /* Added the initialization for GTNetS interface */
- if (gtnets_initialize(sg_tcp_gamma)) {
- xbt_die("Impossible to initialize GTNetS interface");
- }
-
- routing_model_create(NULL);
-}
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-static int get_latency_limited(surf_action_t action)
-{
- return 0;
-}
-#endif
-
-void surf_network_model_init_GTNETS(void)
-{
- if (surf_network_model)
- return;
-
- surf_network_model_init_internal();
- define_callbacks();
- xbt_dynar_push(model_list, &surf_network_model);
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- surf_network_model->get_latency_limited = get_latency_limited;
-#endif
-
- if (sg_gtnets_jitter > 0.0) {
- gtnets_set_jitter(sg_gtnets_jitter);
- gtnets_set_jitter_seed(sg_gtnets_jitter_seed);
- }
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_gtnets.hpp"
+
+static double time_to_next_flow_completion = -1;
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets, surf,
+ "Logging specific to the SURF network GTNetS module");
+
+extern routing_platf_t routing_platf;
+
+double sg_gtnets_jitter = 0.0;
+int sg_gtnets_jitter_seed = 10;
+
+/*********
+ * Model *
+ *********/
+
+void newRoute(int src_id, int dst_id,
+ xbt_dynar_t links, int nb_link)
+{
+ void *_link;
+ NetworkGTNetsLinkPtr link;
+ unsigned int cursor;
+ int i = 0;
+ int *gtnets_links;
+
+ XBT_IN("(src_id=%d, dst_id=%d, links=%p, nb_link=%d)",
+ src_id, dst_id, links, nb_link);
+
+ /* Build the list of gtnets link IDs */
+ gtnets_links = xbt_new0(int, nb_link);
+ i = 0;
+ xbt_dynar_foreach(links, cursor, _link) {
+ link = (NetworkGTNetsLinkPtr) _link;
+ gtnets_links[i++] = link->m_id;
+ }
+
+ if (gtnets_add_route(src_id, dst_id, gtnets_links, nb_link)) {
+ xbt_die("Cannot create GTNetS route");
+ }
+ XBT_OUT();
+}
+
+void newRouteOnehop(int src_id, int dst_id,
+ NetworkGTNetsLinkPtr link)
+{
+ if (gtnets_add_onehop_route(src_id, dst_id, link->m_id)) {
+ xbt_die("Cannot create GTNetS route");
+ }
+}
+
+int NetworkGTNetsModel::addLink(ind id, double bandwidth, double latency)
+{
+ double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS).
+
+ map<int,GTNETS_Link*>::iterator iter = p_links.find(id);
+ xbt_assert((iter == p_links.end()), "Link %d already exists", id);
+
+ if(iter == p_links.end()) {
+ GTNETS_Link* link= new GTNETS_Link(id);
+ p_links[id] = link;
+ }
+
+ XBT_DEBUG("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency);
+ p_gtnetsLinks_[id] = new Linkp2p(bw, latency);
+ if(jitter_ > 0){
+ XBT_DEBUG("Using jitter %f, and seed %u", jitter_, jitter_seed_);
+ double min = -1*jitter_*latency;
+ double max = jitter_*latency;
+ uniform_jitter_generator_[id] = new Uniform(min,max);
+ gtnets_links_[id]->Jitter((const Random &) *(uniform_jitter_generator_[id]));
+ }
+
+ return 0;
+}
+
+/************
+ * Resource *
+ ************/
+NetworkGTNetsLink::NetworkGTNetsLink(NetworkGTNetsModelPtr model, const char* name, double bw, double lat, xbt_dict_t properties)
+ :NetworkCm02Link(model, name, properties), m_bwCurrent(bw), m_latCurrent(lat)
+{
+
+ static int link_count = -1;
+
+ if (xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL)) {
+ return;
+ }
+
+ XBT_DEBUG("Scanning link name %s", name);
+
+ link_count++;
+
+ XBT_DEBUG("Adding new link, linkid %d, name %s, latency %g, bandwidth %g",
+ link_count, name, lat, bw);
+
+
+
+ if (gtnets_add_link(link_count, bw, lat)) {
+ xbt_die("Cannot create GTNetS link");
+ }
+ m_id = link_count;
+
+ xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, this);
+}
+
+/**********
+ * Action *
+ **********/
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network.hpp"
+
+#ifndef NETWORK_GTNETS_HPP_
+#define NETWORK_GTNETS_HPP_
+
+#include "simulator.h" // Definitions for the Simulator Object
+#include "node.h" // Definitions for the Node Object
+#include "linkp2p.h" // Definitions for point-to-point link objects
+#include "ratetimeparse.h" // Definitions for Rate and Time objects
+#include "application-tcpserver.h" // Definitions for TCPServer application
+#include "application-tcpsend.h" // Definitions for TCP Sending application
+#include "tcp-tahoe.h" // Definitions for TCP Tahoe
+#include "tcp-reno.h"
+#include "tcp-newreno.h"
+#include "event.h"
+#include "routing-manual.h"
+#include "red.h"
+
+xbt_dict_t network_card_ids;
+
+/***********
+ * Classes *
+ ***********/
+class NetworkGTNetsModel;
+typedef NetworkGTNetsModel *NetworkGTNetsModelPtr;
+
+class NetworkGTNetsLink;
+typedef NetworkGTNetsLink *NetworkGTNetsLinkPtr;
+
+class NetworkGTNetsAction;
+typedef NetworkGTNetsAction *NetworkGTNetsActionPtr;
+
+class NetworkGTNetsActionLmm;
+typedef NetworkGTNetsActionLmm *NetworkGTNetsActionLmmPtr;
+
+/*********
+ * Model *
+ *********/
+class NetworkGTNetsModel : public NetworkCm02Model {
+public:
+ NetworkGTNetsModel() : NetworkCm02Model("constant time network") {};
+ int addLink(int id, double bandwidth, double latency);
+ int addOnehop_route(int src, int dst, int link);
+ int addRoute(int src, int dst, int *links, int nlink);
+ int addRouter(int id);
+ int createFlow(int src, int dst, long datasize, void *metadata);
+ double getTimeToNextFlowCompletion();
+ int runUntilNextFlowCompletion(void ***metadata,
+ int *number_of_flows);
+ int run(double deltat);
+ // returns the total received by the TCPServer peer of the given action
+ double gtNetsGetFlowRx(void *metadata);
+ void createGTNetsTopology();
+ void printTopology();
+ void setJitter(double);
+ void setJitterSeed(int);
+private:
+ void addNodes();
+ void nodeConnect();
+
+ bool nodeInclude(int);
+ bool linkInclude(int);
+ Simulator *p_sim;
+ GTNETS_Topology *p_topo;
+ RoutingManual *p_rm;
+ REDQueue *p_redQueue;
+ int m_nnode;
+ int m_isTopology;
+ int m_nflow;
+ double m_jitter;
+ int m_jitterSeed;
+ map<int, Uniform*> p_uniformJitterGenerator;
+
+ map<int, TCPServer*> p_gtnetsServers;
+ map<int, TCPSend*> p_gtnetsClients;
+ map<int, Linkp2p*> p_gtnetsLinks_;
+ map<int, Node*> p_gtnetsNodes;
+ map<void*, int> p_gtnetsActionToFlow;
+
+ map <int, void*> p_gtnetsMetadata;
+
+ // From Topology
+ int m_nodeID;
+ map<int, GTNETS_Link*> p_links;
+ vector<GTNETS_Node*> p_nodes;
+ map<int, int> p_hosts; //hostid->nodeid
+ set<int > p_routers;
+};
+
+/************
+ * Resource *
+ ************/
+class NetworkGTNetsLink : public NetworkCm02Link {
+public:
+ NetworkGTNetsLink(NetworkGTNetsModelPtr model, const char* name, double bw, double lat, xbt_dict_t properties);
+ /* Using this object with the public part of
+ model does not make sense */
+ double m_bwCurrent;
+ double m_latCurrent;
+ int m_id;
+};
+
+/**********
+ * Action *
+ **********/
+class NetworkGTNetsAction : public NetworkCm02Action {
+public:
+ NetworkGTNetsAction(NetworkGTNetsModelPtr model, double latency){};
+
+ double m_latency;
+ double m_latCurrent;
+#ifdef HAVE_TRACING
+ int m_lastRemains;
+#endif
+ lmm_variable_t p_variable;
+ double m_rate;
+ int m_suspended;
+#ifdef HAVE_TRACING
+ RoutingEdgePtr src;
+ RoutingEdgePtr dst;
+#endif //HAVE_TRACING
+};
+
+#endif /* NETWORK_GTNETS_HPP_ */
+++ /dev/null
-/* Copyright (c) 2007-2012. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef _SURF_NETWORK_GTNETS_PRIVATE_H
-#define _SURF_NETWORK_GTNETS_PRIVATE_H
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-
-typedef struct network_link_GTNETS {
- s_surf_resource_t generic_resource; /* Must remain first to allow casting */
- /* Using this object with the public part of
- model does not make sense */
- double bw_current;
- double lat_current;
- int id;
-} s_network_link_GTNETS_t, *network_link_GTNETS_t;
-
-typedef struct surf_action_network_GTNETS {
- s_surf_action_t generic_action;
- double latency;
- double lat_current;
-#ifdef HAVE_TRACING
- int last_remains;
-#endif
- lmm_variable_t variable;
- double rate;
- int suspended;
-#ifdef HAVE_TRACING
- sg_routing_edge_t src;
- sg_routing_edge_t dst;
-#endif //HAVE_TRACING
-} s_surf_action_network_GTNETS_t, *surf_action_network_GTNETS_t;
-
-xbt_dict_t network_card_ids;
-
-
-
-#endif /* _SURF_NETWORK_PRIVATE_H */
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_interface.hpp"
+#include "simgrid/sg_config.h"
+
+#ifndef NETWORK_INTERFACE_CPP_
+#define NETWORK_INTERFACE_CPP_
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
+ "Logging specific to the SURF network module");
+
+/*************
+ * Callbacks *
+ *************/
+
+surf_callback(void, NetworkLinkPtr) networkLinkCreatedCallbacks;
+surf_callback(void, NetworkLinkPtr) networkLinkDestructedCallbacks;
+surf_callback(void, NetworkLinkPtr) networkLinkStateChangedCallbacks;
+surf_callback(void, NetworkActionPtr) networkActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+
+NetworkModelPtr surf_network_model = NULL;
+
+xbt_dynar_t NetworkModel::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst)
+{
+ xbt_dynar_t route = NULL;
+ routing_platf->getRouteAndLatency(src, dst, &route, NULL);
+ return route;
+}
+
+double NetworkModel::latencyFactor(double /*size*/) {
+ return sg_latency_factor;
+}
+
+double NetworkModel::bandwidthFactor(double /*size*/) {
+ return sg_bandwidth_factor;
+}
+
+double NetworkModel::bandwidthConstraint(double rate, double /*bound*/, double /*size*/) {
+ return rate;
+}
+
+/************
+ * Resource *
+ ************/
+
+NetworkLink::NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props)
+: Resource(model, name, props)
+, p_latEvent(NULL)
+{
+ surf_callback_emit(networkLinkCreatedCallbacks, this);
+}
+
+NetworkLink::NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props,
+ lmm_constraint_t constraint,
+ tmgr_history_t history,
+ tmgr_trace_t state_trace)
+: Resource(model, name, props, constraint),
+ p_latEvent(NULL)
+{
+ surf_callback_emit(networkLinkCreatedCallbacks, this);
+ if (state_trace)
+ p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+}
+
+NetworkLink::~NetworkLink()
+{
+ surf_callback_emit(networkLinkDestructedCallbacks, this);
+}
+
+bool NetworkLink::isUsed()
+{
+ return lmm_constraint_used(getModel()->getMaxminSystem(), getConstraint());
+}
+
+double NetworkLink::getLatency()
+{
+ return m_latCurrent;
+}
+
+double NetworkLink::getBandwidth()
+{
+ return p_power.peak * p_power.scale;
+}
+
+bool NetworkLink::isShared()
+{
+ return lmm_constraint_is_shared(getConstraint());
+}
+
+void NetworkLink::setState(e_surf_resource_state_t state){
+ Resource::setState(state);
+ surf_callback_emit(networkLinkStateChangedCallbacks, this);
+}
+
+/**********
+ * Action *
+ **********/
+
+void NetworkAction::setState(e_surf_action_state_t state){
+ Action::setState(state);
+ surf_callback_emit(networkActionStateChangedCallbacks, this);
+}
+
+#endif /* NETWORK_INTERFACE_CPP_ */
--- /dev/null
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_interface.hpp"
+#include "surf_routing.hpp"
+
+#ifndef SURF_NETWORK_INTERFACE_HPP_
+#define SURF_NETWORK_INTERFACE_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkModel;
+typedef NetworkModel *NetworkModelPtr;
+
+class NetworkLink;
+typedef NetworkLink *NetworkLinkPtr;
+
+class NetworkAction;
+typedef NetworkAction *NetworkActionPtr;
+
+/*************
+ * Callbacks *
+ *************/
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkLink creation *
+ * @details Callback functions have the following signature: `void(NetworkLinkPtr)`
+ */
+extern surf_callback(void, NetworkLinkPtr) networkLinkCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkLink destruction *
+ * @details Callback functions have the following signature: `void(NetworkLinkPtr)`
+ */
+extern surf_callback(void, NetworkLinkPtr) networkLinkDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkLink State changed *
+ * @details Callback functions have the following signature: `void(NetworkLinkActionPtr)`
+ */
+extern surf_callback(void, NetworkLinkPtr) networkLinkStateChangedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after NetworkAction State changed *
+ * @details Callback functions have the following signature: `void(NetworkActionPtr)`
+ */
+extern surf_callback(void, NetworkActionPtr) networkActionStateChangedCallbacks;
+
+/*********
+ * Tools *
+ *********/
+
+void net_define_callbacks(void);
+
+/*********
+ * Model *
+ *********/
+/** @ingroup SURF_network_interface
+ * @brief SURF network model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class NetworkModel : public Model {
+public:
+ /**
+ * @brief NetworkModel constructor
+ */
+ NetworkModel() : Model("network") {
+ };
+
+ /**
+ * @brief NetworkModel constructor
+ *
+ * @param name The name of the NetworkModel
+ */
+ NetworkModel(const char *name) : Model(name) {
+ f_networkSolve = lmm_solve;
+ m_haveGap = false;
+ };
+
+ /**
+ * @brief The destructor of the NetworkModel
+ */
+ ~NetworkModel() {
+ if (p_maxminSystem)
+ lmm_system_free(p_maxminSystem);
+ if (p_actionHeap)
+ xbt_heap_free(p_actionHeap);
+ if (p_modifiedSet)
+ delete p_modifiedSet;
+ }
+
+ /**
+ * @brief Create a NetworkLink
+ *
+ * @param name The name of the NetworkLink
+ * @param bw_initial The initial bandwidth of the NetworkLink in bytes per second
+ * @param bw_trace The trace associated to the NetworkLink bandwidth [TODO]
+ * @param lat_initial The initial latency of the NetworkLink in seconds
+ * @param lat_trace The trace associated to the NetworkLink latency [TODO]
+ * @param state_initial The initial NetworkLink (state)[e_surf_resource_state_t]
+ * @param state_trace The trace associated to the NetworkLink (state)[e_surf_resource_state_t] [TODO]
+ * @param policy The sharing policy of the NetworkLink
+ * @param properties Dictionary of properties associated to this Resource
+ * @return The created NetworkLink
+ */
+ virtual NetworkLinkPtr createResource(const char *name,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy,
+ xbt_dict_t properties)=0;
+
+
+ virtual void gapAppend(double /*size*/, const NetworkLinkPtr /*link*/, NetworkActionPtr /*action*/) {};
+
+ /**
+ * @brief Create a communication between two [TODO]
+ * @details [TODO]
+ *
+ * @param src The source [TODO]
+ * @param dst The destination [TODO]
+ * @param size The size of the communication in bytes
+ * @param rate The
+ * @return The action representing the communication
+ */
+ virtual ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate)=0;
+
+ /**
+ * @brief Get the route between two RoutingEdge
+ * @details [TODO]
+ *
+ * @param src [TODO]
+ * @param dst [TODO]
+ *
+ * @return A xbt_dynar_t of [TODO]
+ */
+ virtual xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst); //FIXME: kill field? That is done by the routing nowadays
+
+ /**
+ * @brief Function pointer to the function to use to solve the lmm_system_t
+ *
+ * @param system The lmm_system_t to solve
+ */
+ void (*f_networkSolve)(lmm_system_t);
+
+ /**
+ * @brief [brief description]
+ * @details [long description]
+ *
+ * @param size [description]
+ * @return [description]
+ */
+ virtual double latencyFactor(double size);
+
+ /**
+ * @brief [brief description]
+ * @details [long description]
+ *
+ * @param size [description]
+ * @return [description]
+ */
+ virtual double bandwidthFactor(double size);
+
+ /**
+ * @brief [brief description]
+ * @details [long description]
+ *
+ * @param rate [description]
+ * @param bound [description]
+ * @param size [description]
+ * @return [description]
+ */
+ virtual double bandwidthConstraint(double rate, double bound, double size);
+ bool m_haveGap;
+};
+
+/************
+ * Resource *
+ ************/
+ /** @ingroup SURF_network_interface
+ * @brief SURF network link interface class
+ * @details A NetworkLink represent the link between two [Workstations](\ref Workstation)
+ */
+class NetworkLink : public Resource {
+public:
+ /**
+ * @brief NetworkLink constructor
+ *
+ * @param model The CpuModel associated to this NetworkLink
+ * @param name The name of the NetworkLink
+ * @param props Dictionary of properties associated to this NetworkLink
+ */
+ NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props);
+
+ /**
+ * @brief NetworkLink constructor
+ *
+ * @param model The CpuModel associated to this NetworkLink
+ * @param name The name of the NetworkLink
+ * @param props Dictionary of properties associated to this NetworkLink
+ * @param constraint The lmm constraint associated to this Cpu if it is part of a LMM component
+ * @param history [TODO]
+ * @param state_trace [TODO]
+ */
+ NetworkLink(NetworkModelPtr model, const char *name, xbt_dict_t props,
+ lmm_constraint_t constraint,
+ tmgr_history_t history,
+ tmgr_trace_t state_trace);
+
+ /**
+ * @brief NetworkLink destructor
+ */
+ ~NetworkLink();
+
+ /**
+ * @brief Get the bandwidth in bytes per second of current NetworkLink
+ *
+ * @return The bandwith in bytes per second of the current NetworkLink
+ */
+ virtual double getBandwidth();
+
+ /**
+ * @brief Get the latency in seconds of current NetworkLink
+ *
+ * @return The latency in seconds of the current NetworkLink
+ */
+ virtual double getLatency();
+
+ /**
+ * @brief Check if the NetworkLink is shared
+ * @details [long description]
+ *
+ * @return true if the current NetwokrLink is shared, false otherwise
+ */
+ virtual bool isShared();
+
+ /**
+ * @brief Check if the NetworkLink is used
+ *
+ * @return true if the current NetwokrLink is used, false otherwise
+ */
+ bool isUsed();
+
+ void setState(e_surf_resource_state_t state);
+
+ /* Using this object with the public part of
+ model does not make sense */
+ double m_latCurrent;
+ tmgr_trace_event_t p_latEvent;
+
+ /* LMM */
+ tmgr_trace_event_t p_stateEvent;
+ s_surf_metric_t p_power;
+};
+
+/**********
+ * Action *
+ **********/
+/** @ingroup SURF_network_interface
+ * @brief SURF network action interface class
+ * @details A NetworkAction represent a communication bettween two [Workstations](\ref Workstation)
+ */
+class NetworkAction : public Action {
+public:
+ /**
+ * @brief NetworkAction constructor
+ *
+ * @param model The NetworkModel associated to this NetworkAction
+ * @param cost The cost of this NetworkAction in [TODO]
+ * @param failed [description]
+ */
+ NetworkAction(ModelPtr model, double cost, bool failed)
+ : Action(model, cost, failed) {}
+
+ /**
+ * @brief NetworkAction constructor
+ *
+ * @param model The NetworkModel associated to this NetworkAction
+ * @param cost The cost of this NetworkAction in [TODO]
+ * @param failed [description]
+ * @param var The lmm variable associated to this Action if it is part of a LMM component
+ */
+ NetworkAction(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+ : Action(model, cost, failed, var) {};
+
+ void setState(e_surf_action_state_t state);
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ /**
+ * @brief Check if the action is limited by latency.
+ *
+ * @return 1 if action is limited by latency, 0 otherwise
+ */
+ virtual int getLatencyLimited() {return m_latencyLimited;}
+#endif
+
+ double m_latency;
+ double m_latCurrent;
+ double m_weight;
+ double m_rate;
+ const char* p_senderLinkName;
+ double m_senderGap;
+ double m_senderSize;
+ xbt_fifo_item_t p_senderFifoItem;
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ int m_latencyLimited;
+#endif
+
+};
+
+#endif /* SURF_NETWORK_INTERFACE_HPP_ */
+
+
/* Copyright (c) 2007-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
+ *
+ * This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
+#include "network_ns3.hpp"
#include "surf_private.h"
-#include "surf/maxmin.h"
-#include "surf/ns3/ns3_interface.h"
-#include "xbt/lib.h"
-#include "surf/network_ns3_private.h"
-#include "xbt/str.h"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf,
+ "Logging specific to the SURF network NS3 module");
extern xbt_lib_t host_lib;
extern xbt_lib_t link_lib;
extern xbt_lib_t as_router_lib;
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf,
- "Logging specific to the SURF network NS3 module");
-
-extern routing_platf_t routing_platf;
extern xbt_dict_t dict_socket;
+xbt_dynar_t IPV4addr;
static double time_to_next_flow_completion = -1;
-static double ns3_share_resources(double min);
-static void ns3_update_actions_state(double now, double delta);
-static void finalize(void);
-static surf_action_t ns3_communicate(sg_routing_edge_t src_elm,
- sg_routing_edge_t dst_elm,
- double size, double rate);
-static void action_suspend(surf_action_t action);
-static void action_resume(surf_action_t action);
-static int action_is_suspended(surf_action_t action);
-static int action_unref(surf_action_t action);
-
-xbt_dynar_t IPV4addr;
+/*************
+ * Callbacks *
+ *************/
static void replace_bdw_ns3(char ** bdw)
{
if(!IPV4addr) IPV4addr = xbt_dynar_new(sizeof(char*),free);
- tmgr_trace_t bw_trace;
- tmgr_trace_t state_trace;
- tmgr_trace_t lat_trace;
-
- bw_trace = link->bandwidth_trace;
- lat_trace = link->latency_trace;
- state_trace = link->state_trace;
-
- if (bw_trace)
- XBT_INFO("The NS3 network model doesn't support bandwidth state traces");
- if (lat_trace)
- XBT_INFO("The NS3 network model doesn't support latency state traces");
- if (state_trace)
- XBT_INFO("The NS3 network model doesn't support link state traces");
-
- ns3_link_t link_ns3 = xbt_new0(s_ns3_link_t,1);;
- link_ns3->id = xbt_strdup((char*)(link->id));
- link_ns3->bdw = bprintf("%f",link->bandwidth);
- link_ns3->lat = bprintf("%f",link->latency);
-
- surf_ns3_link_t l = xbt_new0(s_surf_ns3_link_t,1);
- l->generic_resource.name = xbt_strdup(link->id);
- l->generic_resource.properties = current_property_set;
- l->data = link_ns3;
- l->created = 1;
-
- xbt_lib_set(link_lib,link->id,NS3_LINK_LEVEL,link_ns3);
- xbt_lib_set(link_lib,link->id,SURF_LINK_LEVEL,l);
+ NetworkLinkPtr net_link = surf_network_model->createResource(link->id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace,
+ link->policy,
+ link->properties);
+ xbt_lib_set(link_lib, link->id, SURF_LINK_LEVEL, net_link);
}
static void parse_ns3_add_router(sg_platf_router_cbarg_t router)
router_id = bprintf("ns3_%s%d%s", cluster_prefix, elmts, cluster_suffix);
XBT_DEBUG("Create link from '%s' to '%s'",host_id,router_id);
- ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,host_id, NS3_HOST_LEVEL);
- ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,router_id,NS3_HOST_LEVEL);
+ ns3_nodes_t host_src = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,host_id, NS3_HOST_LEVEL));
+ ns3_nodes_t host_dst = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,router_id,NS3_HOST_LEVEL));
if(host_src && host_dst){}
else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
replace_bdw_ns3(&bw);
ns3_add_cluster(bw,lat,cluster->id);
xbt_free(lat);
- xbt_free(bw);
-}
-
-static double ns3_get_link_latency (const void *link)
-{
- double lat;
- //XBT_DEBUG("link_id:%s link_lat:%s link_bdw:%s",((surf_ns3_link_t)link)->data->id,((surf_ns3_link_t)link)->data->lat,((surf_ns3_link_t)link)->data->bdw);
- sscanf(((surf_ns3_link_t)link)->data->lat,"%lg",&lat);
- return lat;
-}
-static double ns3_get_link_bandwidth (const void *link)
-{
- double bdw;
- //XBT_DEBUG("link_id:%s link_lat:%s link_bdw:%s",((surf_ns3_link_t)link)->data->id,((surf_ns3_link_t)link)->data->lat,((surf_ns3_link_t)link)->data->bdw);
- sscanf(((surf_ns3_link_t)link)->data->bdw,"%lg",&bdw);
- return bdw;
-}
-
-static xbt_dynar_t ns3_get_route(void *src_card, void *dst_card)
-{
- xbt_dynar_t route = NULL;
- routing_get_route_and_latency(src_card, dst_card, &route, NULL);
- return route;
-}
-
-static void parse_ns3_end_platform(void)
-{
- ns3_end_platform();
+ xbt_free(bw);
}
/* Create the ns3 topology based on routing strategy */
xbt_dynar_shrink(IPV4addr,0);
//get the onelinks from the parsed platform
- xbt_dynar_t onelink_routes = routing_platf->get_onelink_routes();
+ xbt_dynar_t onelink_routes = routing_platf->getOneLinkRoutes();
if (!onelink_routes)
xbt_die("There is no routes!");
XBT_DEBUG("Have get_onelink_routes, found %ld routes",onelink_routes->used);
//save them in trace file
- onelink_t onelink;
+ OnelinkPtr onelink;
unsigned int iter;
xbt_dynar_foreach(onelink_routes, iter, onelink) {
- char *src = onelink->src->name;
- char *dst = onelink->dst->name;
- void *link = onelink->link_ptr;
- if( strcmp(src,dst) && ((surf_ns3_link_t)link)->created){
- XBT_DEBUG("Route from '%s' to '%s' with link '%s'",src,dst,((surf_ns3_link_t)link)->data->id);
- char * link_bdw = xbt_strdup(((surf_ns3_link_t)link)->data->bdw);
- char * link_lat = xbt_strdup(((surf_ns3_link_t)link)->data->lat);
+ char *src = onelink->p_src->getName();
+ char *dst = onelink->p_dst->getName();
+ NetworkNS3LinkPtr link = static_cast<NetworkNS3LinkPtr>(onelink->p_link);
+
+ if (strcmp(src,dst) && link->m_created){
+ XBT_DEBUG("Route from '%s' to '%s' with link '%s'", src, dst, link->getName());
+ char * link_bdw = xbt_strdup(link->p_bdw);
+ char * link_lat = xbt_strdup(link->p_lat);
replace_lat_ns3(&link_lat);
replace_bdw_ns3(&link_bdw);
- ((surf_ns3_link_t)link)->created = 0;
+ link->m_created = 0;
// XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id);
- XBT_DEBUG("\tLink (%s) bdw:%s lat:%s",((surf_ns3_link_t)link)->data->id,
- link_bdw,
- link_lat
- );
+ XBT_DEBUG("\tLink (%s) bdw:%s lat:%s", link->getName(), link_bdw, link_lat);
//create link ns3
- ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,src,NS3_HOST_LEVEL);
- if(!host_src) host_src = xbt_lib_get_or_null(as_router_lib,src,NS3_ASR_LEVEL);
- ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,dst,NS3_HOST_LEVEL);
- if(!host_dst) host_dst = xbt_lib_get_or_null(as_router_lib,dst,NS3_ASR_LEVEL);
+ ns3_nodes_t host_src = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,src,NS3_HOST_LEVEL));
+ if(!host_src) host_src = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(as_router_lib,src,NS3_ASR_LEVEL));
+ ns3_nodes_t host_dst = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(host_lib,dst,NS3_HOST_LEVEL));
+ if(!host_dst) host_dst = static_cast<ns3_nodes_t>(xbt_lib_get_or_null(as_router_lib,dst,NS3_ASR_LEVEL));
if(host_src && host_dst){}
else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
}
}
+static void parse_ns3_end_platform(void)
+{
+ ns3_end_platform();
+}
+
static void define_callbacks_ns3(void)
{
sg_platf_host_add_cb (&parse_ns3_add_host);
sg_platf_postparse_add_cb(&parse_ns3_end_platform); //InitializeRoutes
}
+/*********
+ * Model *
+ *********/
static void free_ns3_link(void * elmts)
{
- ns3_link_t link = elmts;
- free(link->id);
- free(link->bdw);
- free(link->lat);
- free(link);
+ delete static_cast<NetworkNS3LinkPtr>(elmts);
}
static void free_ns3_host(void * elmts)
{
- ns3_nodes_t host = elmts;
+ ns3_nodes_t host = static_cast<ns3_nodes_t>(elmts);
free(host);
}
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-static int ns3_get_link_latency_limited(surf_action_t action)
-{
- return 0;
-}
-#endif
-
-#ifdef HAVE_TRACING
-static void ns3_action_set_category(surf_action_t action, const char *category)
-{
- action->category = xbt_strdup (category);
-}
-#endif
-
void surf_network_model_init_NS3()
{
if (surf_network_model)
return;
- surf_network_model = surf_model_init();
- surf_network_model->name = "network NS3";
- surf_network_model->extension.network.get_link_latency = ns3_get_link_latency;
- surf_network_model->extension.network.get_link_bandwidth = ns3_get_link_bandwidth;
- surf_network_model->extension.network.get_route = ns3_get_route;
-
- surf_network_model->model_private->share_resources = ns3_share_resources;
- surf_network_model->model_private->update_actions_state = ns3_update_actions_state;
- surf_network_model->model_private->finalize = finalize;
-
- surf_network_model->suspend = action_suspend;
- surf_network_model->resume = action_resume;
- surf_network_model->is_suspended = action_is_suspended;
- surf_network_model->action_unref = action_unref;
- surf_network_model->extension.network.communicate = ns3_communicate;
-
-#ifdef HAVE_TRACING
- surf_network_model->set_category = ns3_action_set_category;
-#endif
+ surf_network_model = new NetworkNS3Model();
- /* Added the initialization for NS3 interface */
+ xbt_dynar_push(model_list, &surf_network_model);
+}
+NetworkNS3Model::NetworkNS3Model() : NetworkModel("network NS3") {
if (ns3_initialize(xbt_cfg_get_string(_sg_cfg_set, "ns3/TcpModel"))) {
xbt_die("Impossible to initialize NS3 interface");
}
-
routing_model_create(NULL);
define_callbacks_ns3();
NS3_HOST_LEVEL = xbt_lib_add_level(host_lib,(void_f_pvoid_t)free_ns3_host);
NS3_ASR_LEVEL = xbt_lib_add_level(as_router_lib,(void_f_pvoid_t)free_ns3_host);
NS3_LINK_LEVEL = xbt_lib_add_level(link_lib,(void_f_pvoid_t)free_ns3_link);
-
- xbt_dynar_push(model_list, &surf_network_model);
-
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- surf_network_model->get_latency_limited = ns3_get_link_latency_limited;
-#endif
}
-static void finalize(void)
-{
+NetworkNS3Model::~NetworkNS3Model() {
ns3_finalize();
xbt_dynar_free_container(&IPV4addr);
xbt_dict_free(&dict_socket);
}
-static double ns3_share_resources(double min)
+NetworkLinkPtr NetworkNS3Model::createResource(const char *name,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy,
+ xbt_dict_t properties){
+ if (bw_trace)
+ XBT_INFO("The NS3 network model doesn't support bandwidth state traces");
+ if (lat_trace)
+ XBT_INFO("The NS3 network model doesn't support latency state traces");
+ if (state_trace)
+ XBT_INFO("The NS3 network model doesn't support link state traces");
+ return new NetworkNS3Link(this, name, properties, bw_initial, lat_initial);
+}
+
+xbt_dynar_t NetworkNS3Model::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst)
{
- XBT_DEBUG("ns3_share_resources");
+ xbt_dynar_t route = NULL;
+ routing_get_route_and_latency(src, dst, &route, NULL);
+ //routing_platf->getRouteAndLatency(src, dst, &route, NULL);
+ return route;
+}
+
+ActionPtr NetworkNS3Model::communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate)
+{
+ XBT_DEBUG("Communicate from %s to %s", src->getName(), dst->getName());
+ NetworkNS3ActionPtr action = new NetworkNS3Action(this, size, 0);
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
+ ns3_create_flow(src->getName(), dst->getName(), surf_get_clock(), size, action);
+
+#ifdef HAVE_TRACING
+ action->m_lastSent = 0;
+ action->p_srcElm = src;
+ action->p_dstElm = dst;
+#endif
+
+ return (surf_action_t) action;
+}
+
+double NetworkNS3Model::shareResources(double now)
+{
+ XBT_DEBUG("ns3_share_resources");
//get the first relevant value from the running_actions list
- if (!xbt_swag_size(running_actions) || min == 0.0)
+ if (!getRunningActionSet()->size() || now == 0.0)
return -1.0;
else
do {
- ns3_simulator(min);
- time_to_next_flow_completion = ns3_time() - surf_get_clock();
- } while(double_equals(time_to_next_flow_completion,0));
+ ns3_simulator(now);
+ time_to_next_flow_completion = ns3_time() - surf_get_clock();//FIXME: use now instead ?
+ } while(double_equals(time_to_next_flow_completion, 0));
- XBT_DEBUG("min : %f",min);
- XBT_DEBUG("ns3 time : %f",ns3_time());
- XBT_DEBUG("surf time : %f",surf_get_clock());
- XBT_DEBUG("Next completion %f :",time_to_next_flow_completion);
+ XBT_DEBUG("min : %f", now);
+ XBT_DEBUG("ns3 time : %f", ns3_time());
+ XBT_DEBUG("surf time : %f", surf_get_clock());
+ XBT_DEBUG("Next completion %f :", time_to_next_flow_completion);
return time_to_next_flow_completion;
}
-static void ns3_update_actions_state(double now, double delta)
+void NetworkNS3Model::updateActionsState(double now, double delta)
{
xbt_dict_cursor_t cursor = NULL;
char *key;
static xbt_dynar_t socket_to_destroy = NULL;
if(!socket_to_destroy) socket_to_destroy = xbt_dynar_new(sizeof(char*),NULL);
- surf_action_network_ns3_t action = NULL;
- xbt_swag_t running_actions =
- surf_network_model->states.running_action_set;
-
/* If there are no running flows, just return */
- if (!xbt_swag_size(running_actions)) {
+ if (!getRunningActionSet()->size()) {
while(double_positive(now-ns3_time())) {
ns3_simulator(now-ns3_time());
}
return;
}
+ NetworkNS3ActionPtr action;
xbt_dict_foreach(dict_socket,cursor,key,data){
- action = (surf_action_network_ns3_t)ns3_get_socket_action(data);
+ action = static_cast<NetworkNS3ActionPtr>(ns3_get_socket_action(data));
XBT_DEBUG("Processing socket %p (action %p)",data,action);
- action->generic_action.remains = action->generic_action.cost - ns3_get_socket_sent(data);
-
-#ifdef HAVE_TRACING
- if (TRACE_is_enabled() &&
- surf_action_state_get(&(action->generic_action)) == SURF_ACTION_RUNNING){
- double data_sent = ns3_get_socket_sent(data);
- double data_delta_sent = data_sent - action->last_sent;
-
- xbt_dynar_t route = NULL;
-
- routing_get_route_and_latency (action->src_elm, action->dst_elm, &route, NULL);
- unsigned int i;
- for (i = 0; i < xbt_dynar_length (route); i++){
- surf_ns3_link_t *link = ((surf_ns3_link_t*)xbt_dynar_get_ptr (route, i));
- TRACE_surf_link_set_utilization ((*link)->generic_resource.name,
- ((surf_action_t) action)->category,
- (data_delta_sent)/delta,
- now-delta,
- delta);
+ action->setRemains(action->getCost() - ns3_get_socket_sent(data));
+
+ #ifdef HAVE_TRACING
+ if (TRACE_is_enabled() &&
+ action->getState() == SURF_ACTION_RUNNING){
+ double data_sent = ns3_get_socket_sent(data);
+ double data_delta_sent = data_sent - action->m_lastSent;
+
+ xbt_dynar_t route = NULL;
+
+ routing_get_route_and_latency (action->p_srcElm, action->p_dstElm, &route, NULL);
+ unsigned int i;
+ for (i = 0; i < xbt_dynar_length (route); i++){
+ NetworkNS3LinkPtr link = ((NetworkNS3LinkPtr)xbt_dynar_get_ptr (route, i));
+ TRACE_surf_link_set_utilization (link->getName(),
+ action->getCategory(),
+ (data_delta_sent)/delta,
+ now-delta,
+ delta);
+ }
+ action->m_lastSent = data_sent;
}
- action->last_sent = data_sent;
- }
-#endif
+ #endif
if(ns3_get_socket_is_finished(data) == 1){
xbt_dynar_push(socket_to_destroy,&key);
XBT_DEBUG("Destroy socket %p of action %p", key, action);
- action->generic_action.finish = now;
- surf_action_state_set(&(action->generic_action), SURF_ACTION_DONE);
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
}
}
xbt_dynar_pop(socket_to_destroy,&key);
void *data = xbt_dict_get (dict_socket, key);
- surf_action_network_ns3_t action = (surf_action_network_ns3_t)ns3_get_socket_action(data);
+ action = static_cast<NetworkNS3ActionPtr>(ns3_get_socket_action(data));
XBT_DEBUG ("Removing socket %p of action %p", key, action);
- xbt_dict_remove(dict_socket,key);
+ xbt_dict_remove(dict_socket, key);
}
return;
}
-/* Max durations are not supported */
-static surf_action_t ns3_communicate(sg_routing_edge_t src_elm,
- sg_routing_edge_t dst_elm,
- double size, double rate)
+/************
+ * Resource *
+ ************/
+
+NetworkNS3Link::NetworkNS3Link(NetworkNS3ModelPtr model, const char *name, xbt_dict_t props,
+ double bw_initial, double lat_initial)
+ : NetworkLink(model, name, props)
+ , p_bdw(bprintf("%f", bw_initial))
+ , p_lat(bprintf("%f", lat_initial))
+ , m_created(1)
{
- surf_action_network_ns3_t action = NULL;
+}
- XBT_DEBUG("Communicate from %s to %s", src_elm->name, dst_elm->name);
- action = surf_action_new(sizeof(s_surf_action_network_ns3_t), size, surf_network_model, 0);
+NetworkNS3Link::~NetworkNS3Link()
+{
+}
- ns3_create_flow(src_elm->name, dst_elm->name, surf_get_clock(), size, action);
+void NetworkNS3Link::updateState(tmgr_trace_event_t event_type, double value, double date)
+{
-#ifdef HAVE_TRACING
- action->last_sent = 0;
- action->src_elm = src_elm;
- action->dst_elm = dst_elm;
-#endif
+}
+double NetworkNS3Link::getLatency()
+{
- return (surf_action_t) action;
}
+double NetworkNS3Link::getBandwidth()
+{
+
+}
+
+/**********
+ * Action *
+ **********/
+
+NetworkNS3Action::NetworkNS3Action(ModelPtr model, double cost, bool failed)
+: NetworkAction(model, cost, failed)
+{}
-/* Suspend a flow() */
-static void action_suspend(surf_action_t action)
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ int NetworkNS3Action::getLatencyLimited() {
+ return m_latencyLimited;
+ }
+#endif
+
+ void NetworkNS3Action::suspend()
{
THROW_UNIMPLEMENTED;
}
-/* Resume a flow() */
-static void action_resume(surf_action_t action)
+void NetworkNS3Action::resume()
{
THROW_UNIMPLEMENTED;
}
-/* Test whether a flow is suspended */
-static int action_is_suspended(surf_action_t action)
+ /* Test whether a flow is suspended */
+bool NetworkNS3Action::isSuspended()
{
return 0;
}
-static int action_unref(surf_action_t action)
+int NetworkNS3Action::unref()
{
- action->refcount--;
- if (!action->refcount) {
- xbt_swag_remove(action, action->state_set);
-
-#ifdef HAVE_TRACING
- xbt_free(action->category);
-#endif
- XBT_DEBUG ("Removing action %p", action);
- surf_action_free(&action);
+ m_refcount--;
+ if (!m_refcount) {
+ if (actionHook::is_linked())
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ XBT_DEBUG ("Removing action %p", this);
+ delete this;
return 1;
}
return 0;
--- /dev/null
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+#include "network_interface.hpp"
+#include "surf/ns3/ns3_interface.h"
+
+#ifndef NETWORK_NS3_HPP_
+#define NETWORK_NS3_HPP_
+
+/***********
+ * Classes *
+ ***********/
+class NetworkNS3Model;
+typedef NetworkNS3Model *NetworkNS3ModelPtr;
+
+class NetworkNS3Link;
+typedef NetworkNS3Link *NetworkNS3LinkPtr;
+
+class NetworkNS3Action;
+typedef NetworkNS3Action *NetworkNS3ActionPtr;
+
+/*********
+ * Tools *
+ *********/
+
+void net_define_callbacks(void);
+
+/*********
+ * Model *
+ *********/
+
+class NetworkNS3Model : public NetworkModel {
+public:
+ NetworkNS3Model();
+
+ ~NetworkNS3Model();
+ NetworkLinkPtr createResource(const char *name,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy,
+ xbt_dict_t properties);
+ xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst);
+ ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst,
+ double size, double rate);
+ double shareResources(double now);
+ void updateActionsState(double now, double delta);
+};
+
+/************
+ * Resource *
+ ************/
+class NetworkNS3Link : public NetworkLink {
+public:
+ NetworkNS3Link(NetworkNS3ModelPtr model, const char *name, xbt_dict_t props,
+ double bw_initial, double lat_initial);
+ ~NetworkNS3Link();
+
+ void updateState(tmgr_trace_event_t event_type, double value, double date);
+ double getLatency();
+ double getBandwidth();
+
+//private:
+ char *p_id;
+ char *p_lat;
+ char *p_bdw;
+ int m_created;
+};
+
+/**********
+ * Action *
+ **********/
+class NetworkNS3Action : public NetworkAction {
+public:
+ NetworkNS3Action(ModelPtr model, double cost, bool failed);
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ int getLatencyLimited();
+#endif
+
+bool isSuspended();
+int unref();
+void suspend();
+void resume();
+
+//private:
+#ifdef HAVE_TRACING
+ double m_lastSent;
+ RoutingEdgePtr p_srcElm;
+ RoutingEdgePtr p_dstElm;
+#endif //HAVE_TRACING
+};
+
+
+#endif /* NETWORK_NS3_HPP_ */
+++ /dev/null
-/* Copyright (c) 2007-2012. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef _SURF_NETWORK_NS3_PRIVATE_H
-#define _SURF_NETWORK_NS3_PRIVATE_H
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-
-typedef struct ns3_link{
- char * id;
- char * lat;
- char * bdw;
-}s_ns3_link_t, *ns3_link_t;
-
-typedef struct surf_ns3_link{
- s_surf_resource_t generic_resource;
- ns3_link_t data;
- int created;
-}s_surf_ns3_link_t, *surf_ns3_link_t;
-
-typedef struct surf_action_network_ns3 {
- s_surf_action_t generic_action;
-#ifdef HAVE_TRACING
- double last_sent;
- sg_routing_edge_t src_elm;
- sg_routing_edge_t dst_elm;
-#endif //HAVE_TRACING
-} s_surf_action_network_ns3_t, *surf_action_network_ns3_t;
-
-#endif /* _SURF_NETWORK_NS3_PRIVATE_H */
+++ /dev/null
-/* Copyright (c) 2004-2012. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#ifndef _SURF_NETWORK_PRIVATE_H
-#define _SURF_NETWORK_PRIVATE_H
-
-#include "surf_private.h"
-#include "xbt/dict.h"
-#include "xbt/fifo.h"
-
-typedef struct network_link_CM02 {
- s_surf_resource_lmm_t lmm_resource; /* must remain first to be added to a trace */
-
- /* Using this object with the public part of
- model does not make sense */
- double lat_current;
- tmgr_trace_event_t lat_event;
-} s_link_CM02_t, *link_CM02_t;
-
-typedef struct surf_action_network_CM02 {
- s_surf_action_lmm_t generic_lmm_action;
- double latency;
- double lat_current;
- double weight;
- double rate;
- struct {
- const char* link_name;
- double gap;
- double size;
- xbt_fifo_item_t fifo_item;
- } sender;
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- int latency_limited;
-#endif
-} s_surf_action_network_CM02_t, *surf_action_network_CM02_t;
-
-#endif /* _SURF_NETWORK_PRIVATE_H */
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_smpi.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
+
+xbt_dynar_t smpi_bw_factor = NULL;
+xbt_dynar_t smpi_lat_factor = NULL;
+
+typedef struct s_smpi_factor *smpi_factor_t;
+typedef struct s_smpi_factor {
+ long factor;
+ double value;
+} s_smpi_factor_t;
+
+xbt_dict_t gap_lookup = NULL;
+
+static int factor_cmp(const void *pa, const void *pb)
+{
+ return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 :
+ (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0;
+}
+
+
+static xbt_dynar_t parse_factor(const char *smpi_coef_string)
+{
+ char *value = NULL;
+ unsigned int iter = 0;
+ s_smpi_factor_t fact;
+ xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL;
+
+ smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL);
+ radical_elements = xbt_str_split(smpi_coef_string, ";");
+ xbt_dynar_foreach(radical_elements, iter, value) {
+
+ radical_elements2 = xbt_str_split(value, ":");
+ if (xbt_dynar_length(radical_elements2) != 2)
+ xbt_die("Malformed radical for smpi factor!");
+ fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *));
+ fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *));
+ xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
+ XBT_DEBUG("smpi_factor:\t%ld : %f", fact.factor, fact.value);
+ xbt_dynar_free(&radical_elements2);
+ }
+ xbt_dynar_free(&radical_elements);
+ iter=0;
+ xbt_dynar_sort(smpi_factor, &factor_cmp);
+ xbt_dynar_foreach(smpi_factor, iter, fact) {
+ XBT_DEBUG("ordered smpi_factor:\t%ld : %f", fact.factor, fact.value);
+
+ }
+ return smpi_factor;
+}
+
+/*********
+ * Model *
+ *********/
+
+/************************************************************************/
+/* New model based on LV08 and experimental results of MPI ping-pongs */
+/************************************************************************/
+/* @Inproceedings{smpi_ipdps, */
+/* author={Pierre-Nicolas Clauss and Mark Stillwell and Stéphane Genaud and Frédéric Suter and Henri Casanova and Martin Quinson}, */
+/* title={Single Node On-Line Simulation of {MPI} Applications with SMPI}, */
+/* booktitle={25th IEEE International Parallel and Distributed Processing Symposium (IPDPS'11)}, */
+/* address={Anchorage (Alaska) USA}, */
+/* month=may, */
+/* year={2011} */
+/* } */
+void surf_network_model_init_SMPI(void)
+{
+
+ if (surf_network_model)
+ return;
+ surf_network_model = new NetworkSmpiModel();
+ net_define_callbacks();
+ xbt_dynar_push(model_list, &surf_network_model);
+ //network_solve = lmm_solve;
+
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", 10e-6);
+ xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
+}
+
+NetworkSmpiModel::NetworkSmpiModel()
+ : NetworkCm02Model() {
+ m_haveGap=true;
+}
+
+NetworkSmpiModel::~NetworkSmpiModel(){
+ if (gap_lookup) {
+ xbt_dict_free(&gap_lookup);
+ }
+ if (smpi_bw_factor) {
+ xbt_dynar_free(&smpi_bw_factor);
+ smpi_bw_factor = NULL;
+ }
+ if (smpi_lat_factor) {
+ xbt_dynar_free(&smpi_lat_factor);
+ smpi_lat_factor = NULL;
+ }
+}
+
+void NetworkSmpiModel::gapAppend(double size, const NetworkLinkPtr link, NetworkActionPtr action)
+{
+ const char *src = link->getName();
+ xbt_fifo_t fifo;
+ //surf_action_network_CM02_t last_action;
+ //double bw;
+
+ if (sg_sender_gap > 0.0) {
+ if (!gap_lookup) {
+ gap_lookup = xbt_dict_new_homogeneous(NULL);
+ }
+ fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src);
+ action->m_senderGap = 0.0;
+ if (fifo && xbt_fifo_size(fifo) > 0) {
+ /* Compute gap from last send */
+ /*last_action =
+ (surf_action_network_CM02_t)
+ xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));*/
+ // bw = net_get_link_bandwidth(link);
+ action->m_senderGap = sg_sender_gap;
+ /* max(sg_sender_gap,last_action->sender.size / bw);*/
+ action->m_latency += action->m_senderGap;
+ }
+ /* Append action as last send */
+ /*action->sender.link_name = link->lmm_resource.generic_resource.name;
+ fifo =
+ (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
+ action->sender.link_name);
+ if (!fifo) {
+ fifo = xbt_fifo_new();
+ xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL);
+ }
+ action->sender.fifo_item = xbt_fifo_push(fifo, action);*/
+ action->m_senderSize = size;
+ }
+}
+
+void NetworkSmpiModel::gapRemove(ActionPtr lmm_action)
+{
+ xbt_fifo_t fifo;
+ size_t size;
+ NetworkCm02ActionPtr action = static_cast<NetworkCm02ActionPtr>(lmm_action);
+
+ if (sg_sender_gap > 0.0 && action->p_senderLinkName
+ && action->p_senderFifoItem) {
+ fifo =
+ (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup,
+ action->p_senderLinkName);
+ xbt_fifo_remove_item(fifo, action->p_senderFifoItem);
+ size = xbt_fifo_size(fifo);
+ if (size == 0) {
+ xbt_fifo_free(fifo);
+ xbt_dict_remove(gap_lookup, action->p_senderLinkName);
+ size = xbt_dict_length(gap_lookup);
+ if (size == 0) {
+ xbt_dict_free(&gap_lookup);
+ }
+ }
+ }
+}
+
+double NetworkSmpiModel::bandwidthFactor(double size)
+{
+ if (!smpi_bw_factor)
+ smpi_bw_factor =
+ parse_factor(sg_cfg_get_string("smpi/bw_factor"));
+
+ unsigned int iter = 0;
+ s_smpi_factor_t fact;
+ double current=1.0;
+ xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
+ if (size <= fact.factor) {
+ XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
+ return current;
+ }else
+ current=fact.value;
+ }
+ XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
+
+ return current;
+}
+
+double NetworkSmpiModel::latencyFactor(double size)
+{
+ if (!smpi_lat_factor)
+ smpi_lat_factor =
+ parse_factor(sg_cfg_get_string("smpi/lat_factor"));
+
+ unsigned int iter = 0;
+ s_smpi_factor_t fact;
+ double current=1.0;
+ xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
+ if (size <= fact.factor) {
+ XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
+ return current;
+ }else
+ current=fact.value;
+ }
+ XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
+
+ return current;
+}
+
+double NetworkSmpiModel::bandwidthConstraint(double rate, double bound, double size)
+{
+ return rate < 0 ? bound : min(bound, rate * bandwidthFactor(size));
+}
+
+/************
+ * Resource *
+ ************/
+
+
+
+/**********
+ * Action *
+ **********/
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "network_cm02.hpp"
+
+/***********
+ * Classes *
+ ***********/
+
+class NetworkSmpiModel;
+typedef NetworkSmpiModel *NetworkSmpiModelPtr;
+
+/*********
+ * Tools *
+ *********/
+
+/*********
+ * Model *
+ *********/
+
+class NetworkSmpiModel : public NetworkCm02Model {
+public:
+ NetworkSmpiModel();
+ ~NetworkSmpiModel();
+
+ void gapAppend(double size, const NetworkLinkPtr link, NetworkActionPtr action);
+ void gapRemove(ActionPtr action);
+ double latencyFactor(double size);
+ double bandwidthFactor(double size);
+ double bandwidthConstraint(double rate, double bound, double size);
+ void communicateCallBack() {};
+};
+
+
+/************
+ * Resource *
+ ************/
+
+
+/**********
+ * Action *
+ **********/
+
+
+
+++ /dev/null
-/* Copyright (c) 2004-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-/* ********************************************************************* */
-/* TUTORIAL: New model */
-/* ********************************************************************* */
-
-#include "xbt/ex.h"
-#include "xbt/dict.h"
-#include "portable.h"
-#include "surf_private.h"
-#include "new_model_private.h"
-#include "surf/surf_resource.h"
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_new_model, surf,
- "Logging specific to the SURF new model module");
-
-surf_model_t surf_new_model = NULL;
-lmm_system_t new_model_maxmin_system = NULL;
-static int new_model_selective_update = 0;
-static xbt_swag_t
- new_model_running_action_set_that_does_not_need_being_checked = NULL;
-
-#define GENERIC_LMM_ACTION(action) action->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-
-static void new_model_action_state_set(surf_action_t action, e_surf_action_state_t state);
-
-static surf_action_t new_model_action_execute ()
-{
- THROW_UNIMPLEMENTED;
- return NULL;
-}
-
-static surf_action_t new_model_action_fct()
-{
- surf_action_t action = new_model_action_execute();
- return action;
-}
-
-static void* new_model_create_resource(const char* id, const char* model,const char* type_id,const char* content_name)
-{
- THROW_UNIMPLEMENTED;
- return NULL;
-}
-
-static void new_model_finalize(void)
-{
- lmm_system_free(new_model_maxmin_system);
- new_model_maxmin_system = NULL;
-
- surf_model_exit(surf_new_model);
- surf_new_model = NULL;
-
- xbt_swag_free
- (new_model_running_action_set_that_does_not_need_being_checked);
- new_model_running_action_set_that_does_not_need_being_checked = NULL;
-}
-
-static void new_model_update_actions_state(double now, double delta)
-{
- return;
-}
-
-static double new_model_share_resources(double NOW)
-{
- return -1;
-}
-
-static int new_model_resource_used(void *resource_id)
-{
- THROW_UNIMPLEMENTED;
- return 0;
-}
-
-static void new_model_resources_state(void *id, tmgr_trace_event_t event_type,
- double value, double time)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static int new_model_action_unref(surf_action_t action)
-{
- THROW_UNIMPLEMENTED;
- return 0;
-}
-
-static void new_model_action_cancel(surf_action_t action)
-{
- surf_action_state_set(action, SURF_ACTION_FAILED);
- return;
-}
-
-static void new_model_action_state_set(surf_action_t action, e_surf_action_state_t state)
-{
- surf_action_state_set(action, state);
- return;
-}
-
-static void new_model_action_suspend(surf_action_t action)
-{
- XBT_IN("(%p)", action);
- if (((surf_action_lmm_t) action)->suspended != 2) {
- lmm_update_variable_weight(new_model_maxmin_system,
- ((surf_action_lmm_t) action)->variable,
- 0.0);
- ((surf_action_lmm_t) action)->suspended = 1;
- }
- XBT_OUT();
-}
-
-static void new_model_action_resume(surf_action_t action)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static int new_model_action_is_suspended(surf_action_t action)
-{
- return (((surf_action_lmm_t) action)->suspended == 1);
-}
-
-static void new_model_action_set_max_duration(surf_action_t action, double duration)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static void new_model_action_set_priority(surf_action_t action, double priority)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static void new_model_define_callbacks()
-{
-}
-
-static void surf_new_model_init_internal(void)
-{
- s_surf_action_t action;
-
- XBT_DEBUG("surf_new_model_model_init_internal");
- surf_new_model = surf_model_init();
-
- new_model_running_action_set_that_does_not_need_being_checked =
- xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
- surf_new_model->name = "New Model";
- surf_new_model->action_unref = new_model_action_unref;
- surf_new_model->action_cancel = new_model_action_cancel;
- surf_new_model->action_state_set = new_model_action_state_set;
-
- surf_new_model->model_private->finalize = new_model_finalize;
- surf_new_model->model_private->update_actions_state = new_model_update_actions_state;
- surf_new_model->model_private->share_resources = new_model_share_resources;
- surf_new_model->model_private->resource_used = new_model_resource_used;
- surf_new_model->model_private->update_resource_state = new_model_resources_state;
-
- surf_new_model->suspend = new_model_action_suspend;
- surf_new_model->resume = new_model_action_resume;
- surf_new_model->is_suspended = new_model_action_is_suspended;
- surf_new_model->set_max_duration = new_model_action_set_max_duration;
- surf_new_model->set_priority = new_model_action_set_priority;
-
- surf_new_model->extension.new_model.fct = new_model_action_fct;
- surf_new_model->extension.new_model.create_resource = new_model_create_resource;
-
- if (!new_model_maxmin_system) {
- new_model_maxmin_system = lmm_system_new(new_model_selective_update);
- }
-
-}
-
-void surf_new_model_init_default(void)
-{
- surf_new_model_init_internal();
- new_model_define_callbacks();
-
- xbt_dynar_push(model_list, &surf_new_model);
-}
+++ /dev/null
-/*
- * TUTORIAL: New model
- * new_model_private.h
- *
- * Created on: 12 October 2012
- * Author: navarro
- */
-
-#ifndef NEW_MODEL_PRIVATE_H_
-#define NEW_MODEL_PRIVATE_H_
-
-
-
-#endif /* NEW_MODEL_PRIVATE_H_ */
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2008 INRIA
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
-#include "ns3/abort.h"
+#include <ns3/abort.h>
#include "ns3/log.h"
#include "ns3/simulator.h"
#include "ns3/point-to-point-net-device.h"
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2008 INRIA
*
-/* 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
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
-
MyPointToPointHelper pointToPoint;
NetDeviceContainer netA;
-/* 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
void * data;
}s_ns3_nodes_t, *ns3_nodes_t;
-#ifdef __cplusplus
-extern "C" {
-#endif
+SG_BEGIN_DECL()
XBT_PUBLIC(int) ns3_finalize(void);
XBT_PUBLIC(int) ns3_initialize(const char* TcpProtocol);
char * bw,char * lat);
XBT_PUBLIC(void *) ns3_end_platform(void);
XBT_PUBLIC(void *) ns3_add_cluster(char * bw,char * lat,const char *id);
-#ifdef __cplusplus
-}
-#endif
+
+SG_END_DECL()
#endif
-/* 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
-/* 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
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2010 Regents of the University of California
*
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/* Copyright (c) 2011, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*
* Copyright (c) 2010 Regents of the University of California
*
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "simgrid/platf_generator.h"
#include "platf_generator_private.h"
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef SG_PLATF_GEN_PRIVATE_H
#define SG_PLATF_GEN_PRIVATE_H
--- /dev/null
+/* Copyright (c) 2010, 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "energy.hpp"
+#include "../cpu_cas01.hpp"
+
+/** @addtogroup SURF_plugin_energy
+ *
+ *
+ * BlaBla energy
+ */
+
+XBT_LOG_EXTERNAL_CATEGORY(surf_kernel);
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_energy, surf,
+ "Logging specific to the SURF energy plugin");
+
+std::map<CpuPtr, CpuEnergyPtr> *surf_energy=NULL;
+
+static void energyCpuCreatedCallback(CpuPtr cpu){
+ (*surf_energy)[cpu] = new CpuEnergy(cpu);
+}
+
+static void energyCpuDestructedCallback(CpuPtr cpu){
+ std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(cpu);
+ xbt_assert(cpuIt != surf_energy->end(), "The cpu is not in surf_energy.");
+ XBT_INFO("Total energy (Joules) of host %s: %f", cpu->getName(), cpuIt->second->getConsumedEnergy());
+ delete cpuIt->second;
+ surf_energy->erase(cpuIt);
+}
+
+static void energyCpuActionStateChangedCallback(CpuActionPtr action){
+ CpuPtr cpu = getActionCpu(action);
+ CpuEnergyPtr cpu_energy = (*surf_energy)[cpu];
+
+ if(cpu_energy->last_updated < surf_get_clock()) {
+ double cpu_load = lmm_constraint_get_usage(cpu->getConstraint()) / cpu->m_powerPeak;
+ double start_time = cpu_energy->last_updated;
+ double finish_time = surf_get_clock();
+
+ /*XBT_DEBUG("[cpu_update_energy] action time interval=(%f-%f), current power peak=%f, current pstate=%d",
+ start_time, finish_time, cpu->m_powerPeak, cpu->m_pstate);*/
+ XBT_DEBUG("[cpu_update_energy] action time interval=(%f-%f), current power peak=%f",
+ start_time, finish_time, cpu->m_powerPeak);
+ double current_energy = cpu_energy->total_energy;
+ double action_energy = cpu_energy->getCurrentWattsValue(cpu_load)*(finish_time-start_time);
+
+ cpu_energy->total_energy = current_energy + action_energy;
+ cpu_energy->last_updated = finish_time;
+
+ XBT_DEBUG("[cpu_update_energy] old_energy_value=%f, action_energy_value=%f", current_energy, action_energy);
+ }
+}
+
+static void sg_energy_plugin_exit()
+{
+ delete surf_energy;
+ surf_energy = NULL;
+}
+
+/** \ingroup SURF_plugin_energy
+ * \brief Enable energy plugin
+ * \details Enable energy plugin to get joules consumption of each cpu.
+ */
+void sg_energy_plugin_init() {
+ if (surf_energy == NULL) {
+ surf_energy = new std::map<CpuPtr, CpuEnergyPtr>();
+ surf_callback_connect(cpuCreatedCallbacks, energyCpuCreatedCallback);
+ surf_callback_connect(cpuDestructedCallbacks, energyCpuDestructedCallback);
+ surf_callback_connect(cpuActionStateChangedCallbacks, energyCpuActionStateChangedCallback);
+ surf_callback_connect(surfExitCallbacks, sg_energy_plugin_exit);
+ }
+}
+
+/**
+ *
+ */
+CpuEnergy::CpuEnergy(CpuPtr ptr)
+ : cpu(ptr)
+{
+ total_energy = 0;
+ power_range_watts_list = getWattsRangeList();
+ last_updated = surf_get_clock();
+}
+
+CpuEnergy::~CpuEnergy(){
+ unsigned int iter;
+ xbt_dynar_t power_tuple = NULL;
+ xbt_dynar_foreach(power_range_watts_list, iter, power_tuple)
+ xbt_dynar_free(&power_tuple);
+ xbt_dynar_free(&power_range_watts_list);
+}
+
+
+/**
+ * Computes the power consumed by the host according to the current pstate and processor load
+ *
+ */
+double CpuEnergy::getCurrentWattsValue(double cpu_load)
+{
+ xbt_dynar_t power_range_list = power_range_watts_list;
+
+ if (power_range_list == NULL)
+ {
+ XBT_DEBUG("No power range properties specified for host %s", cpu->getName());
+ return 0;
+ }
+ /*xbt_assert(xbt_dynar_length(power_range_list) == xbt_dynar_length(cpu->p_powerPeakList),
+ "The number of power ranges in the properties does not match the number of pstates for host %s",
+ cpu->getName());*/
+
+ /* retrieve the power values associated with the current pstate */
+ xbt_dynar_t current_power_values = xbt_dynar_get_as(power_range_list, static_cast<CpuCas01Ptr>(cpu)->getPState(), xbt_dynar_t);
+
+ /* min_power corresponds to the idle power (cpu load = 0) */
+ /* max_power is the power consumed at 100% cpu load */
+ double min_power = xbt_dynar_get_as(current_power_values, 0, double);
+ double max_power = xbt_dynar_get_as(current_power_values, 1, double);
+ double power_slope = max_power - min_power;
+
+ double current_power = min_power + cpu_load * power_slope;
+
+ XBT_DEBUG("[get_current_watts] min_power=%f, max_power=%f, slope=%f", min_power, max_power, power_slope);
+ XBT_DEBUG("[get_current_watts] Current power (watts) = %f, load = %f", current_power, cpu_load);
+
+ return current_power;
+}
+
+double CpuEnergy::getConsumedEnergy()
+{
+ return total_energy;
+}
+
+xbt_dynar_t CpuEnergy::getWattsRangeList()
+{
+ xbt_dynar_t power_range_list;
+ xbt_dynar_t power_tuple;
+ int i = 0, pstate_nb=0;
+ xbt_dynar_t current_power_values;
+ double min_power, max_power;
+
+ if (cpu->getProperties() == NULL)
+ return NULL;
+
+ char* all_power_values_str = (char*)xbt_dict_get_or_null(cpu->getProperties(), "power_per_state");
+
+ if (all_power_values_str == NULL)
+ return NULL;
+
+
+ power_range_list = xbt_dynar_new(sizeof(xbt_dynar_t), NULL);
+ xbt_dynar_t all_power_values = xbt_str_split(all_power_values_str, ",");
+
+ pstate_nb = xbt_dynar_length(all_power_values);
+ for (i=0; i< pstate_nb; i++)
+ {
+ /* retrieve the power values associated with the current pstate */
+ current_power_values = xbt_str_split(xbt_dynar_get_as(all_power_values, i, char*), ":");
+ xbt_assert(xbt_dynar_length(current_power_values) > 1,
+ "Power properties incorrectly defined - could not retrieve min and max power values for host %s",
+ cpu->getName());
+
+ /* min_power corresponds to the idle power (cpu load = 0) */
+ /* max_power is the power consumed at 100% cpu load */
+ min_power = atof(xbt_dynar_get_as(current_power_values, 0, char*));
+ max_power = atof(xbt_dynar_get_as(current_power_values, 1, char*));
+
+ power_tuple = xbt_dynar_new(sizeof(double), NULL);
+ xbt_dynar_push_as(power_tuple, double, min_power);
+ xbt_dynar_push_as(power_tuple, double, max_power);
+
+ xbt_dynar_push_as(power_range_list, xbt_dynar_t, power_tuple);
+ xbt_dynar_free(¤t_power_values);
+ }
+ xbt_dynar_free(&all_power_values);
+ return power_range_list;
+}
--- /dev/null
+/* Copyright (c) 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "../cpu_interface.hpp"
+#include <map>
+
+#ifndef CALLBACK_HPP_
+#define CALLBACK_HPP_
+
+class CpuEnergy;
+typedef CpuEnergy *CpuEnergyPtr;
+
+extern std::map<CpuPtr, CpuEnergyPtr> *surf_energy;
+
+class CpuEnergy {
+public:
+ CpuEnergy(CpuPtr ptr);
+ ~CpuEnergy();
+
+ double getCurrentWattsValue(double cpu_load);
+ double getConsumedEnergy();
+ xbt_dynar_t getWattsRangeList();
+
+ xbt_dynar_t power_range_watts_list; /*< List of (min_power,max_power) pairs corresponding to each cpu pstate */
+ double total_energy; /*< Total energy consumed by the host */
+ double last_updated; /*< Timestamp of the last energy update event*/
+ CpuPtr cpu;
+};
+
+#endif /* CALLBACK_HPP_ */
-/* Copyright (c) 2007-2012. The SimGrid Team.
+/* Copyright (c) 2007-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
+ * under the terms of the license (GNU LGPL) which comes with this package. */
#include "surf/random_mgr.h"
#include "xbt/sysdep.h"
-/* 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
<!ELEMENT AS ((prop*),(((AS|include|storage_type|storage|link|backbone|cabinet|cluster|peer|trace|trace_connect)*,(ASroute|trace|trace_connect|bypassASroute)*,(trace|trace_connect)*)|((include|storage_type|storage|host|gpu|cabinet|router|link|backbone|trace|trace_connect|host_link)*,(route|trace|trace_connect|bypassRoute)*)))>
<!ATTLIST AS id CDATA #REQUIRED>
-<!ATTLIST AS routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster) "None">
+<!ATTLIST AS routing (Full|Floyd|Dijkstra|DijkstraCache|None|Vivaldi|Cluster|Cluster_torus) #REQUIRED>
-<!ELEMENT storage_type (prop*)>
+<!ELEMENT storage_type ((model_prop|prop)*)>
<!ATTLIST storage_type id CDATA #REQUIRED>
<!ATTLIST storage_type model CDATA #REQUIRED>
<!ATTLIST storage_type size CDATA #REQUIRED>
<!ATTLIST cluster bw CDATA #REQUIRED>
<!ATTLIST cluster lat CDATA #REQUIRED>
<!ATTLIST cluster sharing_policy (SHARED|FULLDUPLEX|FATPIPE) "FULLDUPLEX">
+<!ATTLIST cluster topology (FLAT|TORUS) "FLAT">
+<!ATTLIST cluster topo_parameters CDATA "">
<!ATTLIST cluster bb_bw CDATA "">
<!ATTLIST cluster bb_lat CDATA "">
<!ATTLIST cluster bb_sharing_policy (SHARED|FATPIPE) "SHARED">
<!ELEMENT prop EMPTY>
<!ATTLIST prop id CDATA #REQUIRED> <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
<!ATTLIST prop value CDATA #REQUIRED>
+
+<!ELEMENT model_prop EMPTY>
+<!ATTLIST model_prop id CDATA #REQUIRED> <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
+<!ATTLIST model_prop value CDATA #REQUIRED>
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 568
-#define YY_END_OF_BUFFER 569
+#define YY_NUM_RULES 589
+#define YY_END_OF_BUFFER 590
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[3323] =
+static yyconst flex_int16_t yy_accept[3458] =
{ 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 569, 567,
- 15, 10, 10, 15, 15, 547, 10, 547, 5, 6,
- 5, 8, 9, 8, 563, 555, 556, 564, 561, 564,
- 562, 566, 555, 556, 566, 567, 22, 10, 22, 22,
- 22, 20, 22, 26, 10, 26, 26, 567, 26, 567,
-
- 567, 26, 33, 10, 33, 33, 33, 31, 33, 37,
- 10, 37, 37, 48, 10, 48, 48, 48, 46, 48,
- 48, 48, 564, 563, 78, 10, 78, 78, 78, 76,
- 78, 78, 78, 78, 78, 82, 10, 82, 101, 10,
- 101, 101, 101, 99, 101, 101, 101, 105, 10, 105,
- 126, 10, 126, 126, 126, 124, 126, 126, 130, 10,
- 130, 130, 567, 130, 567, 130, 130, 567, 567, 130,
- 567, 130, 567, 130, 145, 10, 145, 145, 145, 143,
- 145, 145, 145, 145, 149, 10, 149, 149, 162, 10,
- 162, 162, 162, 160, 162, 162, 162, 166, 10, 166,
-
- 166, 175, 10, 175, 175, 175, 173, 175, 175, 179,
- 10, 179, 188, 10, 188, 188, 188, 186, 188, 188,
- 192, 10, 192, 217, 10, 217, 217, 217, 215, 217,
- 217, 217, 217, 217, 221, 10, 221, 567, 221, 228,
- 10, 228, 228, 228, 226, 228, 232, 10, 232, 243,
- 10, 243, 243, 243, 241, 243, 243, 243, 247, 10,
- 247, 294, 10, 294, 294, 294, 292, 294, 294, 294,
- 294, 294, 294, 294, 294, 298, 10, 298, 298, 317,
- 10, 317, 317, 317, 315, 317, 317, 317, 317, 317,
- 317, 321, 10, 321, 342, 10, 342, 342, 342, 340,
-
- 342, 342, 342, 342, 342, 342, 342, 346, 10, 346,
- 355, 10, 355, 355, 355, 353, 355, 355, 359, 10,
- 359, 370, 10, 370, 370, 370, 368, 370, 370, 370,
- 374, 10, 374, 401, 10, 401, 401, 401, 399, 401,
- 401, 401, 401, 405, 10, 405, 405, 418, 10, 418,
- 418, 418, 416, 418, 418, 422, 10, 422, 567, 422,
- 439, 10, 439, 439, 439, 437, 439, 439, 439, 443,
- 10, 443, 443, 456, 10, 456, 456, 456, 454, 456,
- 456, 460, 10, 460, 469, 10, 469, 469, 469, 467,
- 469, 469, 473, 10, 473, 473, 486, 10, 486, 486,
-
- 486, 484, 486, 486, 486, 490, 10, 490, 490, 507,
- 10, 507, 507, 507, 505, 507, 507, 507, 507, 507,
- 511, 10, 511, 567, 511, 518, 10, 518, 518, 518,
- 516, 518, 522, 10, 522, 529, 10, 529, 529, 529,
- 527, 529, 533, 10, 533, 533, 542, 10, 542, 542,
- 542, 540, 542, 542, 546, 10, 546, 10, 0, 2,
- 2, 0, 4, 7, 558, 557, 0, 0, 0, 0,
- 0, 0, 0, 21, 23, 23, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 590, 588, 15, 10, 10, 15, 15, 568,
+ 10, 568, 5, 6, 5, 8, 9, 8, 584, 576,
+ 577, 585, 582, 585, 583, 587, 576, 577, 587, 588,
+ 22, 10, 22, 22, 22, 20, 22, 26, 10, 26,
+
+ 26, 588, 26, 588, 588, 26, 33, 10, 33, 33,
+ 33, 31, 33, 37, 10, 37, 37, 48, 10, 48,
+ 48, 48, 46, 48, 48, 48, 585, 584, 78, 10,
+ 78, 78, 78, 76, 78, 78, 78, 78, 78, 82,
+ 10, 82, 101, 10, 101, 101, 101, 99, 101, 101,
+ 101, 105, 10, 105, 128, 10, 128, 128, 128, 126,
+ 128, 128, 132, 10, 132, 132, 588, 132, 588, 132,
+ 132, 588, 588, 132, 588, 132, 588, 132, 147, 10,
+ 147, 147, 147, 145, 147, 147, 147, 147, 151, 10,
+ 151, 588, 151, 164, 10, 164, 164, 164, 162, 164,
+
+ 164, 164, 168, 10, 168, 168, 177, 10, 177, 177,
+ 177, 175, 177, 177, 181, 10, 181, 190, 10, 190,
+ 190, 190, 188, 190, 190, 194, 10, 194, 219, 10,
+ 219, 219, 219, 217, 219, 219, 219, 219, 219, 223,
+ 10, 223, 588, 223, 230, 10, 230, 230, 230, 228,
+ 230, 234, 10, 234, 245, 10, 245, 245, 245, 243,
+ 245, 245, 245, 249, 10, 249, 302, 10, 302, 302,
+ 302, 300, 302, 302, 302, 302, 302, 302, 302, 302,
+ 302, 306, 10, 306, 306, 325, 10, 325, 325, 325,
+ 323, 325, 325, 325, 325, 325, 325, 329, 10, 329,
+
+ 350, 10, 350, 350, 350, 348, 350, 350, 350, 350,
+ 350, 350, 350, 354, 10, 354, 363, 10, 363, 363,
+ 363, 361, 363, 363, 367, 10, 367, 378, 10, 378,
+ 378, 378, 376, 378, 378, 378, 382, 10, 382, 409,
+ 10, 409, 409, 409, 407, 409, 409, 409, 409, 413,
+ 10, 413, 413, 426, 10, 426, 426, 426, 424, 426,
+ 426, 430, 10, 430, 588, 430, 447, 10, 447, 447,
+ 447, 445, 447, 447, 447, 451, 10, 451, 451, 464,
+ 10, 464, 464, 464, 462, 464, 464, 468, 10, 468,
+ 477, 10, 477, 477, 477, 475, 477, 477, 481, 10,
+
+ 481, 481, 494, 10, 494, 494, 494, 492, 494, 494,
+ 494, 498, 10, 498, 498, 515, 10, 515, 515, 515,
+ 513, 515, 515, 515, 515, 515, 519, 10, 519, 588,
+ 519, 526, 10, 526, 526, 526, 524, 526, 530, 10,
+ 530, 537, 10, 537, 537, 537, 535, 537, 541, 10,
+ 541, 541, 550, 10, 550, 550, 550, 548, 550, 550,
+ 554, 10, 554, 563, 10, 563, 563, 563, 561, 563,
+ 563, 567, 10, 567, 10, 0, 2, 2, 0, 4,
+ 7, 579, 578, 0, 0, 0, 0, 0, 0, 0,
+ 21, 23, 23, 0, 0, 0, 0, 0, 0, 0,
- 32, 34, 34, 0, 47, 49, 49, 49, 49, 0,
- 0, 0, 77, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 0, 100, 102, 102, 102, 102, 0, 125,
- 127, 127, 127, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 144, 146, 146, 146, 146, 146, 0, 161,
- 163, 163, 163, 163, 0, 174, 176, 176, 176, 0,
- 187, 189, 189, 189, 0, 216, 218, 218, 218, 218,
- 218, 218, 218, 0, 0, 227, 229, 229, 0, 242,
- 244, 244, 244, 244, 0, 293, 295, 295, 295, 295,
-
- 295, 295, 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 0, 316, 318, 318, 318, 318, 318, 318,
- 318, 318, 0, 341, 343, 343, 343, 343, 343, 343,
- 343, 343, 0, 354, 356, 356, 356, 0, 369, 371,
- 371, 371, 371, 0, 400, 402, 402, 402, 402, 402,
- 402, 0, 417, 419, 419, 419, 419, 0, 0, 438,
- 440, 440, 440, 440, 440, 0, 455, 457, 457, 457,
- 0, 468, 470, 470, 470, 0, 485, 487, 487, 487,
- 487, 0, 506, 508, 508, 508, 508, 508, 508, 0,
- 0, 517, 519, 519, 0, 528, 530, 530, 0, 541,
-
- 543, 543, 543, 0, 0, 0, 0, 0, 3, 0,
- 0, 0, 0, 0, 0, 0, 565, 0, 23, 0,
- 0, 107, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 32, 34, 34,
+ 0, 47, 49, 49, 49, 49, 0, 0, 0, 77,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 0,
+ 100, 102, 102, 102, 102, 0, 127, 129, 129, 129,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 106, 0, 0, 0, 0, 0, 0,
- 34, 0, 0, 49, 0, 0, 49, 0, 0, 0,
- 560, 79, 0, 0, 79, 79, 79, 79, 79, 79,
- 0, 0, 102, 102, 102, 0, 0, 0, 0, 127,
- 0, 0, 107, 0, 0, 0, 0, 0, 0, 0,
- 0, 106, 0, 0, 0, 0, 146, 0, 0, 146,
-
- 146, 0, 0, 163, 0, 0, 163, 0, 0, 176,
- 176, 0, 0, 189, 189, 0, 0, 218, 218, 218,
- 0, 0, 218, 218, 218, 0, 0, 0, 0, 229,
- 0, 0, 244, 0, 0, 0, 0, 0, 0, 295,
- 295, 0, 0, 295, 0, 0, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 0, 0, 0, 0,
- 0, 0, 318, 318, 318, 318, 318, 0, 0, 343,
- 343, 343, 0, 0, 343, 343, 343, 0, 0, 356,
- 0, 0, 0, 0, 371, 0, 0, 371, 0, 0,
- 402, 0, 0, 402, 402, 402, 0, 0, 419, 419,
-
- 419, 0, 0, 0, 440, 440, 440, 440, 0, 0,
- 457, 0, 0, 0, 0, 470, 470, 0, 0, 487,
- 487, 487, 0, 0, 508, 508, 508, 508, 508, 0,
- 0, 0, 519, 0, 0, 0, 0, 0, 0, 0,
- 0, 543, 0, 0, 0, 14, 1, 0, 0, 553,
- 0, 0, 0, 550, 549, 0, 0, 23, 0, 0,
- 25, 0, 107, 0, 0, 0, 0, 0, 0, 0,
- 222, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 106, 0, 0, 0, 0,
- 0, 0, 34, 0, 0, 36, 0, 49, 0, 41,
-
- 40, 49, 0, 0, 0, 51, 0, 79, 0, 55,
- 54, 0, 0, 79, 0, 0, 79, 79, 79, 0,
- 0, 81, 0, 102, 102, 102, 0, 0, 104, 0,
- 0, 109, 108, 127, 0, 0, 129, 0, 0, 0,
- 0, 223, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 146, 0, 134, 133, 146, 146, 0, 0, 148,
- 0, 163, 0, 153, 152, 163, 0, 0, 165, 0,
- 176, 176, 0, 0, 178, 0, 189, 189, 0, 0,
- 191, 0, 218, 218, 218, 0, 196, 195, 218, 218,
- 218, 0, 0, 220, 0, 0, 0, 229, 0, 0,
-
- 231, 0, 244, 0, 236, 235, 0, 238, 237, 0,
- 0, 246, 0, 295, 295, 295, 295, 0, 263, 262,
- 295, 0, 251, 250, 0, 0, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 0, 0, 297, 0, 0,
- 312, 311, 0, 302, 301, 0, 0, 318, 318, 318,
- 318, 0, 0, 320, 0, 343, 343, 343, 343, 0,
- 325, 324, 0, 0, 343, 343, 0, 0, 345, 0,
- 356, 0, 350, 349, 0, 0, 358, 0, 371, 0,
- 363, 362, 371, 0, 0, 373, 0, 402, 0, 378,
- 377, 402, 402, 402, 0, 0, 404, 0, 0, 0,
-
- 0, 0, 419, 0, 0, 421, 0, 0, 0, 0,
- 440, 440, 0, 0, 440, 0, 0, 442, 0, 457,
- 0, 447, 446, 0, 0, 459, 0, 0, 0, 0,
- 0, 0, 0, 472, 0, 0, 0, 487, 487, 0,
- 0, 0, 0, 489, 0, 508, 508, 508, 508, 508,
- 0, 0, 510, 0, 0, 519, 0, 0, 521, 0,
- 0, 526, 525, 0, 0, 532, 0, 0, 537, 536,
- 543, 0, 0, 545, 0, 0, 0, 554, 548, 0,
- 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
- 0, 222, 193, 0, 375, 0, 0, 323, 0, 0,
-
- 534, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 322, 0, 0, 0, 0, 0, 0, 0, 49, 0,
- 0, 79, 0, 59, 58, 0, 0, 0, 57, 56,
- 79, 0, 0, 79, 0, 102, 0, 0, 102, 0,
- 127, 0, 128, 0, 0, 0, 223, 194, 376, 535,
- 0, 0, 0, 0, 0, 0, 146, 146, 0, 0,
- 0, 163, 163, 0, 0, 0, 176, 0, 0, 0,
- 189, 0, 218, 218, 0, 0, 218, 218, 218, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 295, 295,
- 295, 295, 0, 0, 0, 265, 264, 295, 295, 295,
-
- 295, 295, 295, 295, 295, 295, 0, 0, 314, 313,
- 318, 318, 318, 318, 0, 343, 343, 343, 343, 0,
- 333, 332, 343, 343, 0, 356, 0, 371, 371, 0,
- 402, 402, 402, 402, 0, 0, 411, 410, 0, 409,
- 408, 419, 0, 375, 0, 428, 427, 440, 440, 0,
- 426, 425, 440, 0, 457, 0, 0, 466, 465, 0,
- 464, 463, 0, 0, 479, 478, 487, 487, 0, 477,
- 476, 0, 508, 0, 0, 508, 508, 508, 0, 0,
- 519, 0, 0, 543, 0, 0, 0, 0, 12, 0,
- 551, 552, 0, 23, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 193, 0, 0, 375, 0, 167, 0, 323,
- 0, 0, 534, 0, 406, 0, 39, 0, 0, 0,
- 0, 0, 322, 0, 38, 0, 30, 29, 0, 0,
- 43, 42, 49, 0, 0, 79, 0, 61, 60, 79,
- 0, 65, 64, 79, 0, 102, 0, 0, 0, 0,
- 0, 0, 127, 0, 0, 0, 194, 0, 376, 535,
- 407, 0, 0, 0, 407, 406, 146, 0, 0, 0,
- 138, 137, 0, 163, 163, 0, 0, 172, 171, 176,
- 0, 0, 185, 184, 189, 0, 218, 218, 0, 200,
- 199, 0, 0, 218, 0, 0, 218, 0, 168, 0,
-
- 0, 225, 224, 0, 230, 0, 240, 239, 0, 295,
- 0, 0, 295, 295, 0, 261, 260, 295, 295, 0,
- 0, 295, 295, 295, 295, 295, 295, 0, 0, 0,
- 318, 318, 318, 0, 343, 0, 0, 343, 343, 0,
- 0, 343, 0, 356, 0, 371, 371, 0, 402, 402,
- 402, 0, 0, 402, 0, 419, 0, 0, 440, 440,
- 440, 0, 457, 0, 0, 487, 487, 0, 508, 0,
- 494, 493, 508, 508, 508, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 11, 0, 23,
- 0, 0, 0, 0, 0, 0, 0, 524, 0, 0,
-
- 0, 167, 0, 0, 0, 53, 406, 347, 0, 39,
- 0, 523, 52, 0, 0, 0, 0, 38, 0, 0,
- 49, 0, 0, 79, 79, 79, 0, 102, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 96, 95, 0,
- 127, 0, 0, 0, 0, 407, 348, 0, 0, 0,
- 146, 0, 136, 135, 0, 163, 0, 0, 0, 176,
- 0, 0, 0, 0, 218, 218, 0, 198, 197, 0,
- 0, 0, 0, 0, 218, 0, 219, 168, 0, 0,
- 295, 0, 273, 272, 0, 0, 295, 295, 295, 0,
- 259, 258, 0, 0, 295, 295, 295, 295, 0, 0,
-
- 0, 0, 310, 309, 0, 0, 318, 0, 0, 0,
- 343, 0, 329, 328, 0, 0, 343, 0, 327, 326,
- 343, 0, 344, 356, 0, 371, 371, 0, 402, 402,
- 402, 0, 0, 0, 402, 0, 403, 419, 0, 0,
- 0, 0, 0, 0, 440, 0, 457, 0, 0, 0,
- 0, 0, 0, 0, 508, 508, 508, 508, 0, 0,
- 0, 515, 514, 0, 0, 0, 539, 538, 0, 544,
- 0, 0, 0, 0, 0, 0, 0, 423, 0, 0,
- 0, 0, 300, 249, 524, 0, 28, 0, 0, 0,
- 492, 53, 347, 150, 0, 523, 52, 299, 248, 27,
-
- 491, 0, 0, 49, 0, 0, 50, 79, 0, 0,
- 79, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 424, 0, 0,
- 0, 0, 348, 151, 0, 0, 146, 0, 0, 0,
- 163, 0, 155, 154, 0, 176, 0, 177, 0, 183,
- 182, 0, 218, 218, 0, 214, 213, 0, 0, 218,
- 0, 0, 295, 0, 275, 274, 295, 295, 295, 0,
- 253, 252, 0, 0, 295, 295, 295, 0, 255, 254,
- 0, 0, 304, 303, 0, 0, 0, 306, 305, 0,
- 343, 0, 331, 330, 343, 343, 356, 0, 371, 0,
-
- 0, 0, 402, 0, 0, 402, 402, 0, 0, 402,
- 419, 0, 420, 0, 0, 432, 431, 0, 430, 429,
- 440, 0, 457, 0, 0, 0, 483, 482, 0, 481,
- 480, 0, 508, 508, 508, 508, 0, 0, 0, 0,
- 0, 0, 0, 17, 0, 19, 18, 0, 423, 512,
- 360, 0, 0, 300, 249, 0, 28, 444, 180, 16,
- 492, 150, 0, 0, 299, 248, 27, 491, 0, 0,
- 49, 559, 79, 0, 67, 66, 79, 0, 80, 0,
- 98, 97, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 424, 361, 0, 0,
-
- 0, 151, 0, 0, 140, 139, 146, 0, 0, 157,
- 156, 163, 0, 176, 0, 218, 218, 0, 0, 0,
- 0, 218, 181, 0, 295, 295, 295, 295, 0, 257,
- 256, 295, 295, 295, 0, 0, 308, 307, 0, 343,
- 343, 343, 356, 0, 357, 371, 0, 367, 366, 0,
- 402, 0, 384, 383, 402, 402, 0, 0, 0, 0,
- 402, 419, 445, 440, 0, 457, 0, 0, 0, 0,
- 0, 508, 508, 508, 0, 513, 0, 0, 531, 0,
- 0, 0, 17, 0, 512, 360, 0, 0, 233, 444,
- 180, 16, 0, 0, 0, 0, 35, 49, 0, 0,
-
- 79, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 146,
+ 148, 148, 148, 148, 148, 0, 0, 163, 165, 165,
+ 165, 165, 0, 176, 178, 178, 178, 0, 189, 191,
+ 191, 191, 0, 218, 220, 220, 220, 220, 220, 220,
+
+ 220, 0, 0, 229, 231, 231, 0, 244, 246, 246,
+ 246, 246, 0, 301, 303, 303, 303, 303, 303, 303,
+ 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+ 303, 0, 324, 326, 326, 326, 326, 326, 326, 326,
+ 326, 0, 349, 351, 351, 351, 351, 351, 351, 351,
+ 351, 0, 362, 364, 364, 364, 0, 377, 379, 379,
+ 379, 379, 0, 408, 410, 410, 410, 410, 410, 410,
+ 0, 425, 427, 427, 427, 427, 0, 0, 446, 448,
+ 448, 448, 448, 448, 0, 463, 465, 465, 465, 0,
+ 476, 478, 478, 478, 0, 493, 495, 495, 495, 495,
+
+ 0, 514, 516, 516, 516, 516, 516, 516, 0, 0,
+ 525, 527, 527, 0, 536, 538, 538, 0, 549, 551,
+ 551, 551, 0, 562, 564, 564, 564, 0, 0, 0,
+ 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 586, 0, 23, 0, 0, 107, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 361, 0, 0, 234, 0, 146, 0, 163,
- 0, 164, 0, 0, 0, 218, 218, 0, 206, 0,
- 205, 218, 181, 0, 295, 295, 295, 295, 295, 0,
- 0, 295, 295, 0, 296, 0, 319, 343, 343, 343,
- 356, 0, 0, 0, 0, 0, 402, 402, 402, 0,
- 388, 0, 387, 402, 419, 445, 440, 0, 441, 0,
- 0, 0, 0, 0, 0, 496, 495, 0, 0, 508,
- 508, 0, 509, 513, 0, 0, 0, 0, 0, 24,
-
- 0, 0, 233, 0, 0, 0, 49, 0, 0, 0,
- 79, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 106, 0, 0,
+ 0, 0, 0, 0, 34, 0, 0, 49, 0, 0,
+ 49, 0, 0, 0, 581, 79, 0, 0, 79, 79,
+ 79, 79, 79, 79, 0, 0, 102, 102, 102, 0,
+
+ 0, 0, 0, 129, 0, 0, 107, 0, 0, 0,
+ 0, 0, 0, 0, 0, 106, 0, 0, 0, 0,
+ 148, 0, 0, 148, 148, 0, 0, 0, 165, 0,
+ 0, 165, 0, 0, 178, 178, 0, 0, 191, 191,
+ 0, 0, 220, 220, 220, 0, 0, 220, 220, 220,
+ 0, 0, 0, 0, 231, 0, 0, 246, 0, 0,
+ 0, 0, 0, 0, 303, 303, 0, 0, 303, 0,
+ 0, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+ 303, 303, 0, 0, 0, 0, 0, 0, 326, 326,
+ 326, 326, 326, 0, 0, 351, 351, 351, 0, 0,
+
+ 351, 351, 351, 0, 0, 364, 0, 0, 0, 0,
+ 379, 0, 0, 379, 0, 0, 410, 0, 0, 410,
+ 410, 410, 0, 0, 427, 427, 427, 0, 0, 0,
+ 448, 448, 448, 448, 0, 0, 465, 0, 0, 0,
+ 0, 478, 478, 0, 0, 495, 495, 495, 0, 0,
+ 516, 516, 516, 516, 516, 0, 0, 0, 527, 0,
+ 0, 0, 0, 0, 0, 0, 0, 551, 0, 0,
+ 0, 0, 564, 0, 0, 0, 14, 1, 0, 0,
+ 574, 0, 0, 0, 571, 570, 0, 0, 23, 0,
+ 0, 25, 0, 107, 0, 0, 0, 0, 0, 0,
+
+ 0, 224, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 106, 0, 0,
+ 0, 0, 0, 0, 34, 0, 0, 36, 0, 49,
+ 0, 41, 40, 49, 0, 0, 0, 51, 0, 79,
+ 0, 55, 54, 0, 0, 79, 0, 0, 79, 79,
+ 79, 0, 0, 81, 0, 102, 102, 102, 0, 0,
+ 104, 0, 0, 109, 108, 129, 0, 0, 131, 0,
+ 0, 0, 0, 225, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 148, 0, 136, 135, 148, 148, 0,
+ 0, 150, 0, 0, 165, 0, 155, 154, 165, 0,
+
+ 0, 167, 0, 178, 178, 0, 0, 180, 0, 191,
+ 191, 0, 0, 193, 0, 220, 220, 220, 0, 198,
+ 197, 220, 220, 220, 0, 0, 222, 0, 0, 0,
+ 231, 0, 0, 233, 0, 246, 0, 238, 237, 0,
+ 240, 239, 0, 0, 248, 0, 303, 303, 303, 303,
+ 0, 265, 264, 303, 0, 253, 252, 0, 0, 303,
+ 303, 303, 303, 303, 303, 303, 303, 303, 303, 0,
+ 0, 305, 0, 0, 320, 319, 0, 310, 309, 0,
+ 0, 326, 326, 326, 326, 0, 0, 328, 0, 351,
+ 351, 351, 351, 0, 333, 332, 0, 0, 351, 351,
+
+ 0, 0, 353, 0, 364, 0, 358, 357, 0, 0,
+ 366, 0, 379, 0, 371, 370, 379, 0, 0, 381,
+ 0, 410, 0, 386, 385, 410, 410, 410, 0, 0,
+ 412, 0, 0, 0, 0, 0, 427, 0, 0, 429,
+ 0, 0, 0, 0, 448, 448, 0, 0, 448, 0,
+ 0, 450, 0, 465, 0, 455, 454, 0, 0, 467,
+ 0, 0, 0, 0, 0, 0, 0, 480, 0, 0,
+ 0, 495, 495, 0, 0, 0, 0, 497, 0, 516,
+ 516, 516, 516, 516, 0, 0, 518, 0, 0, 527,
+ 0, 0, 529, 0, 0, 534, 533, 0, 0, 540,
+
+ 0, 0, 545, 544, 551, 0, 0, 553, 0, 0,
+ 558, 557, 564, 0, 0, 566, 0, 0, 0, 575,
+ 569, 0, 0, 0, 23, 0, 0, 0, 0, 0,
+ 0, 0, 0, 224, 195, 0, 383, 0, 0, 0,
+ 331, 0, 0, 542, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 330, 0, 0, 0, 0, 0, 0,
+ 0, 49, 0, 0, 79, 0, 59, 58, 0, 0,
+ 0, 57, 56, 79, 0, 0, 79, 0, 102, 0,
+ 0, 102, 0, 129, 0, 130, 0, 0, 0, 225,
+ 196, 384, 543, 0, 0, 0, 0, 0, 0, 148,
+
+ 148, 0, 0, 0, 0, 165, 165, 0, 0, 0,
+ 178, 0, 0, 0, 191, 0, 220, 220, 0, 0,
+ 220, 220, 220, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 303, 303, 303, 303, 0, 0, 0, 267,
+ 266, 303, 303, 303, 303, 303, 303, 303, 303, 303,
+ 303, 303, 0, 0, 322, 321, 326, 326, 326, 326,
+ 0, 351, 351, 351, 351, 0, 341, 340, 351, 351,
+ 0, 364, 0, 379, 379, 0, 410, 410, 410, 410,
+ 0, 0, 419, 418, 0, 417, 416, 427, 0, 383,
+ 0, 436, 435, 448, 448, 0, 434, 433, 448, 0,
+
+ 465, 0, 0, 474, 473, 0, 472, 471, 0, 0,
+ 487, 486, 495, 495, 0, 485, 484, 0, 516, 0,
+ 0, 516, 516, 516, 0, 0, 527, 0, 0, 551,
+ 0, 564, 0, 0, 0, 0, 12, 0, 572, 573,
+ 0, 23, 0, 0, 0, 0, 0, 0, 0, 0,
+ 195, 0, 0, 383, 0, 0, 169, 0, 331, 0,
+ 0, 542, 0, 414, 0, 39, 0, 0, 0, 0,
+ 0, 330, 0, 38, 0, 30, 29, 0, 0, 43,
+ 42, 49, 0, 0, 79, 0, 61, 60, 79, 0,
+ 65, 64, 79, 0, 102, 0, 0, 0, 0, 0,
+
+ 0, 129, 0, 0, 0, 196, 0, 384, 543, 415,
+ 0, 0, 0, 415, 414, 148, 0, 0, 0, 140,
+ 139, 0, 0, 165, 165, 0, 0, 174, 173, 178,
+ 0, 0, 187, 186, 191, 0, 220, 220, 0, 202,
+ 201, 0, 0, 220, 0, 0, 220, 0, 170, 0,
+ 0, 227, 226, 0, 232, 0, 242, 241, 0, 303,
+ 0, 0, 303, 303, 0, 263, 262, 303, 303, 0,
+ 0, 303, 303, 303, 303, 303, 303, 303, 303, 0,
+ 0, 0, 326, 326, 326, 0, 351, 0, 0, 351,
+ 351, 0, 0, 351, 0, 364, 0, 379, 379, 0,
+
+ 410, 410, 410, 0, 0, 410, 0, 427, 0, 0,
+ 448, 448, 448, 0, 465, 0, 0, 495, 495, 0,
+ 516, 0, 502, 501, 516, 516, 516, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 234, 0, 146, 0,
- 163, 0, 170, 169, 0, 190, 218, 218, 208, 207,
- 0, 0, 0, 295, 295, 295, 295, 295, 0, 285,
- 284, 295, 0, 0, 343, 343, 0, 0, 356, 0,
- 365, 364, 0, 372, 0, 380, 379, 402, 402, 402,
- 390, 389, 0, 0, 419, 440, 0, 0, 0, 0,
- 458, 0, 0, 0, 500, 499, 0, 0, 0, 0,
-
- 0, 520, 0, 0, 0, 0, 461, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 0,
- 0, 0, 0, 88, 0, 0, 0, 0, 87, 0,
+ 0, 0, 11, 0, 23, 0, 0, 0, 0, 0,
+ 0, 0, 532, 0, 0, 0, 0, 169, 0, 0,
+ 0, 53, 414, 355, 0, 39, 0, 531, 52, 0,
+ 0, 0, 0, 38, 0, 0, 49, 0, 0, 79,
+ 79, 79, 0, 102, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 96, 95, 0, 129, 0, 0, 0,
+
+ 0, 415, 356, 0, 0, 0, 148, 0, 138, 137,
+ 0, 0, 165, 0, 0, 0, 178, 0, 0, 0,
+ 0, 220, 220, 0, 200, 199, 0, 0, 0, 0,
+ 0, 220, 0, 221, 170, 0, 0, 303, 0, 281,
+ 280, 0, 0, 303, 303, 303, 0, 261, 260, 0,
+ 0, 303, 303, 303, 303, 0, 0, 303, 303, 0,
+ 0, 318, 317, 0, 0, 326, 0, 0, 0, 351,
+ 0, 337, 336, 0, 0, 351, 0, 335, 334, 351,
+ 0, 352, 364, 0, 379, 379, 0, 410, 410, 410,
+ 0, 0, 0, 410, 0, 411, 427, 0, 0, 0,
+
+ 0, 0, 0, 448, 0, 465, 0, 0, 0, 0,
+ 0, 0, 0, 516, 516, 516, 516, 0, 0, 0,
+ 523, 522, 0, 0, 0, 547, 546, 0, 552, 0,
+ 560, 559, 0, 0, 0, 0, 0, 0, 0, 0,
+ 431, 0, 0, 0, 0, 308, 251, 532, 0, 28,
+ 0, 0, 0, 0, 500, 53, 355, 152, 0, 531,
+ 52, 307, 250, 27, 499, 0, 0, 49, 0, 0,
+ 50, 79, 0, 0, 79, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 462, 0, 146, 0, 163, 218, 0,
- 0, 0, 210, 209, 0, 245, 295, 295, 295, 0,
- 0, 295, 295, 0, 283, 282, 343, 0, 0, 0,
- 339, 338, 0, 0, 402, 402, 402, 0, 392, 391,
+ 0, 432, 0, 0, 0, 0, 356, 153, 0, 0,
+
+ 148, 0, 0, 0, 0, 165, 0, 157, 156, 0,
+ 178, 0, 179, 0, 185, 184, 0, 220, 220, 0,
+ 216, 215, 0, 0, 220, 0, 0, 303, 0, 283,
+ 282, 303, 303, 303, 0, 255, 254, 0, 0, 303,
+ 303, 303, 0, 257, 256, 303, 303, 0, 0, 312,
+ 311, 0, 0, 0, 314, 313, 0, 351, 0, 339,
+ 338, 351, 351, 364, 0, 379, 0, 0, 0, 410,
+ 0, 0, 410, 410, 0, 0, 410, 427, 0, 428,
+ 0, 0, 440, 439, 0, 438, 437, 448, 0, 465,
+ 0, 0, 0, 491, 490, 0, 489, 488, 0, 516,
+
+ 516, 516, 516, 0, 0, 0, 0, 0, 0, 0,
+ 0, 17, 0, 19, 18, 0, 431, 520, 368, 0,
+ 0, 308, 251, 0, 28, 452, 0, 182, 16, 500,
+ 152, 0, 0, 307, 250, 27, 499, 0, 0, 49,
+ 580, 79, 0, 67, 66, 79, 0, 80, 0, 98,
+ 97, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 432, 369, 0, 0, 0,
+ 153, 0, 0, 142, 141, 148, 0, 0, 0, 159,
+ 158, 165, 0, 178, 0, 220, 220, 0, 0, 0,
+ 0, 220, 183, 0, 303, 303, 303, 303, 0, 259,
+
+ 258, 303, 303, 303, 303, 0, 0, 0, 0, 316,
+ 315, 0, 351, 351, 351, 364, 0, 365, 379, 0,
+ 375, 374, 0, 410, 0, 392, 391, 410, 410, 0,
+ 0, 0, 0, 410, 427, 453, 448, 0, 465, 0,
+ 0, 0, 0, 0, 516, 516, 516, 0, 521, 0,
+ 0, 539, 0, 0, 0, 0, 17, 0, 520, 368,
+ 0, 0, 235, 452, 0, 182, 16, 0, 0, 0,
+ 0, 35, 49, 0, 0, 79, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 498, 497, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 369, 0, 0,
+
+ 236, 0, 148, 0, 0, 165, 0, 166, 0, 0,
+ 0, 220, 220, 0, 208, 0, 207, 220, 183, 0,
+ 303, 303, 303, 303, 303, 0, 0, 303, 303, 303,
+ 0, 0, 0, 0, 304, 0, 327, 351, 351, 351,
+ 364, 0, 0, 0, 0, 0, 410, 410, 410, 0,
+ 396, 0, 395, 410, 427, 453, 448, 0, 449, 0,
+ 0, 0, 0, 0, 0, 504, 503, 0, 0, 516,
+ 516, 0, 517, 521, 0, 0, 0, 0, 0, 0,
+ 24, 0, 0, 235, 555, 0, 0, 0, 49, 0,
+ 0, 0, 79, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 461, 131, 0, 0, 0, 45, 44, 0,
- 0, 0, 0, 0, 0, 0, 0, 79, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 236, 0,
+ 148, 0, 556, 165, 0, 172, 171, 0, 192, 220,
+ 220, 210, 209, 0, 0, 0, 303, 303, 303, 303,
+ 303, 0, 293, 292, 303, 0, 0, 303, 0, 0,
+ 0, 0, 351, 351, 0, 0, 364, 0, 373, 372,
+ 0, 380, 0, 388, 387, 410, 410, 410, 398, 397,
+ 0, 0, 427, 448, 0, 0, 0, 0, 466, 0,
+ 0, 0, 508, 507, 0, 0, 0, 0, 0, 528,
+ 0, 0, 0, 0, 0, 469, 555, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 79, 0,
+ 0, 0, 0, 88, 0, 0, 0, 0, 87, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 462, 132, 0, 0, 0, 0, 0, 0, 0, 218,
- 0, 212, 211, 295, 295, 0, 0, 0, 289, 288,
- 0, 0, 295, 343, 0, 335, 334, 0, 352, 351,
- 402, 0, 0, 402, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 470, 0, 148, 0, 556, 165, 220,
+ 0, 0, 0, 212, 211, 0, 247, 303, 303, 303,
+ 0, 0, 303, 303, 0, 291, 290, 303, 0, 0,
+ 0, 0, 351, 0, 0, 0, 347, 346, 0, 0,
+ 410, 410, 410, 0, 400, 399, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 474, 131, 84, 83,
+ 0, 0, 506, 505, 0, 0, 0, 0, 0, 469,
+ 133, 0, 0, 0, 45, 44, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 470, 134, 0,
+ 0, 0, 0, 0, 0, 0, 220, 0, 214, 213,
+ 303, 303, 0, 0, 0, 297, 296, 0, 0, 303,
+ 303, 0, 0, 0, 0, 351, 0, 343, 342, 0,
+ 360, 359, 410, 0, 0, 410, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 94, 0, 0, 0, 93, 0, 0, 0,
- 0, 0, 111, 119, 0, 0, 0, 0, 110, 118,
- 0, 475, 132, 0, 142, 141, 0, 0, 159, 158,
- 0, 202, 201, 218, 295, 295, 0, 287, 286, 0,
- 291, 290, 295, 343, 402, 0, 386, 385, 402, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 449,
- 0, 0, 448, 0, 471, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 474, 84, 83, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 62,
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 113,
- 0, 0, 0, 112, 0, 475, 0, 147, 218, 295,
- 295, 0, 0, 343, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 565, 0, 0, 0, 0,
+
+ 482, 133, 84, 83, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 94, 0, 0, 0,
+ 93, 0, 0, 0, 0, 0, 111, 119, 0, 0,
+ 0, 0, 110, 118, 0, 483, 134, 0, 144, 143,
+ 0, 0, 161, 160, 0, 204, 203, 220, 303, 303,
+ 0, 295, 294, 0, 299, 298, 303, 303, 0, 0,
+ 0, 0, 351, 410, 0, 394, 393, 410, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 457, 0,
+ 0, 456, 0, 479, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 482, 84, 83, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 63, 62, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 113, 0,
+ 0, 0, 112, 0, 483, 0, 149, 220, 303, 303,
+ 0, 0, 303, 275, 0, 274, 0, 351, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 75, 71, 0, 0, 74, 70, 0, 92,
- 0, 0, 91, 0, 0, 0, 103, 0, 0, 0,
- 0, 0, 0, 218, 295, 295, 0, 0, 0, 343,
- 0, 382, 381, 0, 0, 0, 415, 0, 414, 0,
- 436, 0, 435, 0, 451, 453, 450, 452, 0, 488,
-
- 502, 0, 501, 0, 0, 0, 0, 12, 0, 12,
- 0, 0, 0, 0, 0, 86, 90, 85, 89, 123,
- 0, 121, 122, 0, 120, 218, 295, 295, 0, 0,
- 0, 0, 343, 0, 0, 0, 0, 413, 412, 434,
- 433, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 115, 0, 114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 75, 71, 0, 0,
+ 74, 70, 0, 92, 0, 0, 91, 0, 0, 0,
+ 103, 0, 0, 0, 0, 0, 0, 220, 303, 303,
+ 0, 0, 0, 0, 0, 277, 276, 351, 0, 390,
+
+ 389, 0, 0, 0, 423, 0, 422, 0, 444, 0,
+ 443, 0, 459, 461, 458, 460, 0, 496, 510, 0,
+ 509, 0, 0, 0, 0, 12, 0, 12, 0, 0,
+ 0, 0, 0, 86, 90, 85, 89, 123, 0, 0,
+ 121, 122, 0, 0, 120, 220, 303, 303, 0, 0,
+ 0, 0, 0, 279, 278, 351, 0, 0, 0, 0,
+ 421, 420, 442, 441, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 115, 0, 0, 114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 69, 0, 68, 0, 0, 0, 0, 204, 203, 0,
- 281, 280, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 337, 336, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 11, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 69, 0, 68, 0, 0,
+ 0, 0, 0, 0, 206, 205, 0, 289, 288, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 345,
+ 344, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 504, 503, 0, 73, 72, 0,
+ 0, 0, 0, 512, 511, 0, 73, 72, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 117, 116, 0,
- 0, 0, 0, 0, 0, 267, 0, 0, 266, 0,
- 0, 394, 0, 0, 393, 0, 0, 0, 0, 0,
-
- 271, 0, 270, 0, 396, 0, 395, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 277,
- 0, 276, 0, 0, 0, 0, 0, 0, 279, 278,
- 269, 268, 398, 397, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 125, 117, 124, 116, 0, 0, 0, 0, 0, 0,
+ 269, 0, 0, 268, 0, 0, 402, 0, 0, 401,
+ 0, 0, 0, 0, 0, 273, 0, 272, 0, 404,
+ 0, 403, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 285, 0, 284, 0, 0, 0,
+ 0, 0, 0, 287, 286, 271, 270, 406, 405, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 0
+ 0, 0, 0, 0, 0, 13, 0
} ;
static yyconst flex_int32_t yy_ec[256] =
5, 5, 5, 5
} ;
-static yyconst flex_int16_t yy_base[3816] =
+static yyconst flex_int16_t yy_base[3970] =
{ 0,
0, 0, 0, 3, 6, 9, 12, 29, 16, 19,
14, 17, 33, 36, 49, 55, 45, 61, 66, 72,
2219, 2222, 2225, 2229, 2276, 2279, 2282, 2286, 3217, 3284,
2333, 2336, 2339, 2343, 2346, 2393, 2396, 2399, 3351, 3421,
2403, 2406, 3491, 3548, 2453, 2456, 2459, 2463, 2466, 2520,
- 2523, 2526, 3605, 3675, 2530, 2533, 0, 0, 8437,12292,
- 12292, 95, 100, 29, 41,12292, 103, 51,12292,12292,
- 8426,12292,12292, 8414,12292, 8429, 8428, 202,12292,12292,
- 12292,12292, 8422, 8422, 8372, 153,12292, 161, 8398, 0,
- 145,12292, 8363,12292, 165, 3741, 73, 2540, 315, 357,
-
- 8392, 8339,12292, 168, 8379, 0, 152,12292, 8341,12292,
- 261, 8384, 31,12292, 266, 8375, 0, 245,12292, 8314,
- 8314, 8312, 421, 8305,12292, 269, 8331, 0, 340,12292,
- 8296, 8292, 271, 8294, 238,12292, 441, 484,12292, 504,
- 8321, 0, 401,12292, 8276, 8278, 8267,12292, 561, 548,
- 12292, 571, 8304, 0, 481,12292, 8271, 8259,12292, 628,
- 3805, 8255, 163, 2542, 567, 206, 38, 8306, 954, 2533,
- 639, 907, 437, 79,12292, 634, 8287, 0, 546,12292,
- 8243, 8249, 8237, 8241,12292, 638, 313, 368,12292, 697,
- 8276, 0, 549,12292, 8232, 8241, 8214,12292, 704, 426,
-
- 497,12292, 707, 8259, 0, 747,12292, 8229, 8208,12292,
- 767, 753,12292, 773, 8250, 0, 757,12292, 8220, 8194,
- 12292, 831, 818,12292, 838, 8238, 0, 758,12292, 8183,
- 8176, 8181, 251, 8164,12292, 841, 559, 825, 530,12292,
- 906, 8210, 0, 815,12292, 8162,12292, 914, 891,12292,
- 977, 8186, 0, 953,12292, 8142, 8142, 8129,12292, 981,
- 965,12292, 1021, 8171, 0, 966,12292, 8120, 203, 8125,
- 8131, 378, 85, 311, 972,12292, 1040, 564, 814,12292,
- 1044, 8152, 0, 1032,12292, 8098, 8111, 8112, 157, 8109,
- 8087,12292, 1048, 1086,12292, 1106, 8132, 0, 1033,12292,
-
- 8080, 8068, 8075, 8080, 8082, 8055, 8049,12292, 1111, 1099,
- 12292, 1114, 8095, 0, 1100,12292, 8047, 8057,12292, 1156,
- 1160,12292, 1173, 8087, 0, 1157,12292, 8052, 8047, 8046,
- 12292, 1180, 1228,12292, 1183, 8073, 0, 1158,12292, 8043,
- 8038, 8033, 15,12292, 1186, 899, 963,12292, 1241, 8059,
- 0, 1225,12292, 8007, 181,12292, 1248, 1243, 432, 303,
- 12292, 1308, 8053, 0, 1226,12292, 7994, 7989, 299,12292,
- 1311, 1229, 350,12292, 1314, 8038, 0, 1303,12292, 7993,
- 7997,12292, 1319, 1362,12292, 1375, 8018, 0, 1359,12292,
- 7970, 7968,12292, 1382, 1378, 676,12292, 1445, 8006, 0,
-
- 1360,12292, 7949, 7944, 7938,12292, 1448, 1446, 685,12292,
- 1494, 7983, 0, 1370,12292, 7932, 7933, 7938, 7931, 7924,
- 12292, 1513, 1514, 560, 1007,12292, 1517, 7970, 0, 1438,
- 12292, 7936,12292, 1520, 1559,12292, 1579, 7964, 0, 1506,
- 12292, 7926,12292, 1584, 1210, 1236,12292, 1587, 7957, 0,
- 1563,12292, 7923, 7915,12292, 1645, 1632, 1648, 677, 7891,
- 12292, 7951, 7935,12292,12292,12292, 1641, 375, 7885, 7880,
- 7878, 7925, 7877,12292, 0, 7868, 7864, 7888, 7859, 104,
- 1037, 7853, 7853, 7852, 7852, 889, 1646, 1105, 7839, 7840,
- 1393, 1307, 7865, 1510, 7836, 1649, 7830, 1647, 1708, 1709,
-
- 12292, 0, 7831, 7833,12292, 0, 7828, 2098, 7810, 666,
- 7806, 7850,12292, 0, 7806, 2165, 7794, 7815, 7801, 7794,
- 7789, 7789, 7773,12292, 0, 7772, 7762, 7773, 7749,12292,
- 0, 2232, 7747, 7791, 7772, 172, 7742, 7741, 7746, 1719,
- 1319, 7726, 1720, 7754, 707, 724, 814, 841, 1577, 1651,
- 1701, 888,12292, 0, 7729, 2289, 7734, 7711, 7713,12292,
- 0, 7717, 2592, 7713, 7701,12292, 0, 7704, 7700, 7698,
- 12292, 0, 7686, 7682, 7683,12292, 0, 7686, 758, 2598,
- 7662, 7660, 7678, 7661, 897,12292, 0, 7655, 7659,12292,
- 0, 7635, 2654, 2657, 7649,12292, 0, 7654, 7654, 2660,
-
- 7634, 2663, 7628, 7633, 7627, 7608, 7625, 7624, 7601, 7620,
- 7617, 7604, 7603,12292, 0, 2666, 2721, 7569, 7565, 7580,
- 7579, 7570, 7572,12292, 0, 7563, 7563, 7544, 2724, 7537,
- 7533, 7545, 7529,12292, 0, 7528, 2727, 7517,12292, 0,
- 7520, 2730, 7512, 7529,12292, 0, 7511, 2733, 7503, 7520,
- 7514, 7502,12292, 0, 7489, 7505, 7489, 7483, 7490,12292,
- 0, 7468, 7487, 7482, 7471, 7507,12292, 0, 7457, 2788,
- 7448,12292, 0, 7439, 7454, 7446,12292, 0, 7427, 7445,
- 7437, 7437,12292, 0, 7419, 7413, 7418, 7422, 7420, 7400,
- 7397,12292, 0, 7401, 7411,12292, 0, 2791, 7407,12292,
-
- 0, 2794, 7392, 7382, 7425, 7433, 1807, 7370,12292, 1833,
- 0, 7364, 7364, 7408, 7392, 7345,12292, 7357, 7324, 2797,
- 2801, 1981, 7335, 7337, 7319, 7332, 7306, 7312, 7300, 7297,
- 7312, 7299, 7274, 7274, 7287, 7282, 7266, 7265, 7255, 7259,
- 7269, 7243, 7240, 1990, 7244, 7224, 7240, 7237, 7218, 7221,
- 7215, 2855, 2860, 7210, 2864, 2048, 7205, 7236, 2868, 2912,
- 12292, 7194, 2915, 2117, 2921, 7184, 2924, 7187, 7187, 7189,
- 2927, 2983, 7175, 7178, 7178, 2969, 2972, 2978, 2184, 7159,
- 3037, 3040, 2363, 7175, 7148, 7141, 7142, 7144, 7137, 7116,
- 7115, 2423, 7113, 7111, 7085, 7081, 7077, 2996, 2618, 7091,
-
- 7089, 3044, 3047, 7048, 3050, 2685, 7061, 3103, 3106, 7060,
- 7040, 3114, 3117, 7052, 7050, 3129, 3173, 7045, 7018, 7029,
- 3109, 2755, 7027, 7030, 7009, 3179, 3183, 7003, 7002, 7006,
- 3186, 3245, 6992, 3239, 2822, 3248, 3002, 3252, 3257, 6994,
- 1920, 3304, 3068, 6993, 3308, 3137, 3313, 6985, 6966, 6975,
- 6972, 6961, 6947, 6948, 6941, 6954, 3322, 3383, 3331, 3205,
- 3371, 3374, 3389, 3392, 3397, 3450, 3459, 3444, 3468, 6940,
- 37, 6930, 3454, 3403, 3512, 6938, 6922, 3516, 3519, 6922,
- 3522, 3411, 3525, 3571, 6925, 3574, 3473, 6923, 3577, 3580,
- 6917, 3583, 3481, 6909, 6894, 6882, 3628, 3634, 3637, 3640,
-
- 3695, 3643, 3698, 6887, 3701, 3705, 3708, 3732, 3713, 3727,
- 6894, 3735, 3662, 3738, 3765, 3746, 3775, 3779, 3784, 3809,
- 3812, 3816, 3821, 3830, 6885, 6867, 6873, 6877, 6864, 3843,
- 3872, 6868, 6853, 3878, 3881, 3834, 3884, 3892, 3902, 3840,
- 3905, 6847, 3913, 3916, 6885,12292,12292, 1070, 6843,12292,
- 6885, 6880, 6829,12292,12292, 6826, 6818, 6828, 3921, 3924,
- 12292, 3928, 1714, 6791, 6783, 6789, 6794, 6784, 6769, 6781,
- 1779, 6765, 6756, 6756, 6732, 6720, 6716, 6712, 446, 6723,
- 6706, 6697, 6711, 6701, 6677, 1849, 6671, 6655, 6660, 6645,
- 1381, 6659, 3947, 3950, 3953,12292, 3956, 3959, 3965,12292,
-
- 12292, 3977, 6681, 3981, 3984,12292, 3988, 6635, 3991,12292,
- 12292, 4007, 4010, 4019, 4025, 4030, 6649, 4039, 6642, 4043,
- 4046,12292, 4049, 6638, 4052, 6636, 4057, 4070,12292, 4076,
- 4079,12292,12292, 6631, 4089, 4095,12292, 4098, 6623, 6619,
- 6625, 1852, 6604, 6612, 1449, 6601, 6593, 6609, 6607, 6583,
- 6578, 6591, 4101,12292,12292, 6583, 4110, 4117, 4120,12292,
- 4124, 6588, 4129,12292,12292, 6600, 4139, 4143,12292, 4146,
- 4149, 4152, 4158, 4170,12292, 4173, 4177, 4180, 4200, 4203,
- 12292, 4209, 6568, 6574, 4212, 4215,12292,12292, 6559, 6555,
- 6569, 4223, 4230,12292, 4233, 6558, 6552, 4236, 4242, 4245,
-
- 12292, 4254, 4257, 4264,12292,12292, 4276,12292,12292, 4284,
- 4287,12292, 4290, 6547, 6535, 6555, 6539, 4293,12292,12292,
- 4309, 4312,12292,12292, 4322, 4327, 6525, 6538, 6521, 6519,
- 6523, 6517, 6508, 6511, 6501, 4335, 4340,12292, 4343, 4347,
- 12292,12292, 4362,12292,12292, 4370, 4373, 6490, 6498, 6497,
- 6490, 4381, 4384,12292, 4388, 6485, 6477, 6465, 6481, 4391,
- 12292,12292, 4403, 4407, 6465, 6473, 4415, 4421,12292, 4424,
- 6473, 4427,12292,12292, 4443, 4446,12292, 4449, 6449, 4452,
- 12292,12292, 6457, 4468, 4471,12292, 4476, 6446, 4480,12292,
- 12292, 6441, 6444, 6441, 4490, 4495,12292, 4499, 4502, 4505,
-
- 4520, 4526, 6434, 4534, 4538,12292, 4542, 6426, 4545, 4563,
- 6413, 6412, 4549, 4571, 6406, 4579, 4582,12292, 4585, 6407,
- 4588,12292,12292, 4604, 4610,12292, 4613, 4616, 4619, 4634,
- 4637, 4645, 4652,12292, 4656, 4659, 4664, 6371, 6369, 4677,
- 4680, 4688, 4691,12292, 4695, 6354, 4698, 6369, 6367, 6346,
- 4701, 4710,12292, 4720, 6333, 6347, 4723, 4729,12292, 4732,
- 4735,12292,12292, 4743, 4751,12292, 4754, 4758,12292,12292,
- 6346, 4766, 4773,12292, 4776, 1099, 4786,12292,12292, 6379,
- 6378, 6332, 6263, 4795, 6229, 6236, 6245, 6203, 6150, 6131,
- 6085, 2057, 2250, 6049, 2307, 6047, 6032, 2483, 6031, 5953,
-
- 2492, 5912, 5878, 5881, 5739, 5734, 5704, 5620, 5613, 5561,
- 2495, 5575, 13, 4798, 4816, 4801, 4807, 4825, 37, 172,
- 4833, 268, 4838,12292,12292, 4846, 4853, 4864,12292,12292,
- 333, 4872, 4876, 346, 4884, 343, 4890, 4893, 4903, 4908,
- 384, 4810,12292, 409, 449, 460, 2626, 2629, 2693, 2696,
- 497, 507, 551, 576, 631, 632, 667, 4911, 4914, 4917,
- 4935, 693, 715, 4938, 4941, 4944, 757, 4959, 4962, 4965,
- 779, 4973, 797, 835, 4980, 4983, 4992, 844, 5003, 5006,
- 834, 854, 5010, 5014, 5028, 5031, 5035, 5043, 981, 5050,
- 963, 984, 5053, 5056, 5064,12292,12292, 1039, 1046, 5073,
-
- 1050, 1117, 1107, 1145, 1186, 1164, 5076, 5079,12292,12292,
- 5087, 5091, 5095, 5098, 5101, 1205, 5105, 1188, 1200, 5116,
- 12292,12292, 5126, 1250, 5129, 1244, 5132, 1262, 1290, 5135,
- 1331, 1338, 1330, 5138, 5144, 5163,12292,12292, 5171,12292,
- 12292, 1341, 5158, 2763, 5179,12292,12292, 1356, 1382, 5187,
- 12292,12292, 1367, 5195, 1368, 5202, 5205,12292,12292, 5214,
- 12292,12292, 5225, 5228,12292,12292, 1386, 1406, 5237,12292,
- 12292, 5245, 1403, 5248, 5251, 1409, 1435, 1453, 5260, 1442,
- 5266, 5269, 5273, 5279, 5284, 1739, 1484, 5288,12292, 1524,
- 12292,12292, 1502, 1505, 5293, 1525, 1541, 1548, 1567, 1582,
-
- 1585, 1590, 2830, 1613, 1636, 2874, 1646, 2882, 1686, 2887,
- 1695, 1710, 2933, 1717, 3010, 1732, 3266, 1749, 1758, 1775,
- 1777, 1779, 3078, 1766, 3540, 5297,12292,12292, 5312, 5315,
- 12292,12292, 1780, 1798, 5326, 1773, 5331,12292,12292, 1782,
- 5347,12292,12292, 1774, 5340, 1781, 5359, 2516, 2779, 5367,
- 5371, 5380, 1892, 1894, 1908, 1906, 3279, 1914, 3342, 3530,
- 5385, 1921, 1919, 1922, 5388, 5391, 1922, 5394, 5402, 5412,
- 12292,12292, 5420, 1928, 5423, 5426, 5432,12292,12292, 1961,
- 5441, 5446,12292,12292, 5460, 5456, 1979, 1975, 5464,12292,
- 12292, 5478, 5481, 5489, 5492, 5496, 1984, 5510, 3670, 1991,
-
- 5514,12292,12292, 5522,12292, 5525,12292,12292, 5533, 1991,
- 5536, 5541, 5554, 1977, 5557,12292,12292, 1987, 2012, 5565,
- 5568, 5576, 2021, 2048, 2049, 2051, 5583, 5586, 5589, 5594,
- 5607, 5610, 5613, 5616, 2057, 5619, 5631, 5639, 2046, 5642,
- 5646, 2056, 5660, 2056, 5663, 2072, 2054, 5669, 2076, 2057,
- 2076, 5672, 5684, 2094, 5692, 2097, 5695, 2120, 5698, 5701,
- 5704, 5707, 2115, 5726, 5722, 5730, 5733, 5736, 2111, 5741,
- 12292,12292, 2118, 2117, 2117, 5751, 2138, 5756, 5759, 5775,
- 5778, 5781, 5784, 5803, 2178, 2177, 2252,12292, 2128, 5806,
- 5809, 2142, 2168, 2176, 2274, 2173, 2176, 3771, 2187, 2195,
-
- 2181, 4553, 2200, 2221, 2228, 5812, 5815, 5818, 2246, 5824,
- 2250, 5828, 5835, 2238, 2263, 2291, 2285, 5838, 2302, 5841,
- 2305, 2336, 5844, 2299, 5847, 2311, 5850, 5854, 2347, 2335,
- 2382, 2336, 2367, 2377, 2442, 2379, 5865,12292,12292, 5874,
- 5877, 2363, 2356, 2453, 2365, 5880, 5883, 2375, 2454, 2518,
- 5886, 5895,12292,12292, 5904, 5910, 5913, 5917, 5933, 2401,
- 5936, 5941, 5945, 5959, 2375, 2400, 5962,12292,12292, 5970,
- 5974, 5988, 2437, 2442, 2425, 5982,12292, 5996, 2433, 6001,
- 2459, 6007,12292,12292, 6015, 6020, 2474, 2494, 2484, 6029,
- 12292,12292, 6037, 6040, 6048, 2501, 2511, 2504, 6051, 6056,
-
- 6069, 6072,12292,12292, 6080, 6084, 6092, 6098, 6101, 6110,
- 2506, 6117,12292,12292, 6125, 6129, 2516, 6137,12292,12292,
- 2509, 6145,12292, 2540, 6148, 2522, 6151, 6154, 2525, 6157,
- 2550, 6169, 2567, 2569, 2550, 6177,12292, 2552, 6180, 2544,
- 6183, 6186, 6204, 6207, 2558, 6216, 2553, 6222, 6225, 6228,
- 6231, 6246, 6249, 6257, 2556, 2562, 2556, 2569, 6260, 2588,
- 6265,12292,12292, 6279, 6283, 6287,12292,12292, 6298,12292,
- 2652, 2809, 2651, 2613, 6302, 6305, 6313, 6326, 2607, 2630,
- 2645, 2627, 6332, 6337, 6340, 2630, 6343, 2631, 2685, 2678,
- 6346, 6349, 6352, 6355, 2679, 6358, 6361, 6364, 6367, 6370,
-
- 6373, 2681, 6378, 2688, 2704, 6381,12292, 2685, 6385, 6388,
- 2705, 6403, 6406, 6409, 2720, 2721, 2722, 2728, 2741, 2771,
- 2770, 2778, 2784, 2779, 6417, 6424, 6430, 6438, 2774, 2791,
- 2788, 2803, 6442, 6445, 6448, 6451, 2801, 6459, 6462, 6467,
- 2805, 6480,12292,12292, 6488, 2822, 6493,12292, 6496,12292,
- 12292, 6507, 2819, 2840, 6512,12292,12292, 2906, 2956, 2860,
- 2868, 6520, 2882, 6526,12292,12292, 2883, 2886, 2900, 6540,
- 12292,12292, 6534, 6548, 2913, 2913, 2919, 6557,12292,12292,
- 6565, 6569,12292,12292, 6577, 6580, 6588,12292,12292, 6596,
- 2924, 6599,12292,12292, 2920, 2930, 2925, 6607, 2938, 6610,
-
- 6615, 6630, 2946, 6633, 6636, 2953, 2945, 3031, 3038, 2950,
- 2994, 6645,12292, 2993, 6651,12292,12292, 6664,12292,12292,
- 3005, 6659, 2997, 6673, 6678, 6681,12292,12292, 6693,12292,
- 12292, 6701, 6705, 6711, 6715, 6723, 6729, 2993, 6733, 6736,
- 6741, 3079, 3055, 6744, 6748,12292,12292, 6756, 6763, 6766,
- 6769, 3012, 3045, 6775, 6783, 3065, 6786, 6789, 6795, 6798,
- 6801, 6804, 3057, 3065, 6807, 6810, 6816, 6819, 3074, 6822,
- 3076,12292, 6825, 6828,12292,12292, 6836, 6843,12292, 6847,
- 12292,12292, 3120, 3107, 3122, 3134, 3146, 3148, 3138, 3153,
- 3152, 3165, 6855, 6858, 3294, 6841, 6867, 6870, 3126, 3125,
-
- 3136, 6875, 3130, 6878,12292,12292, 3127, 6886, 6889,12292,
- 12292, 3128, 6897, 6905, 6908, 3147, 3157, 3185, 3207, 3188,
- 3207, 3180, 6911, 6917, 3182, 3189, 3188, 3289, 6923,12292,
- 12292, 6936, 3190, 3204, 6939, 6942,12292,12292, 6950, 3205,
- 3213, 3221, 3222, 6954,12292, 6961, 6969,12292,12292, 6964,
- 6979, 6983,12292,12292, 6991, 6997, 3251, 3273, 3273, 3304,
- 7000, 3273, 7003, 3279, 7009, 7018, 7021, 7029, 7032, 7036,
- 7041, 7054, 7059, 7062, 7065, 7072, 7084, 7087,12292, 7091,
- 3398, 3347, 7094, 7097, 7106, 7116, 3274, 3273, 7119, 7122,
- 7125, 7128, 3275, 3317, 3319, 7131,12292, 3309, 7134, 7137,
-
- 3327, 3345, 3341, 3367, 3362, 3381, 3394, 3396, 3414, 3407,
- 3421, 7145, 3400, 3408, 3420, 3403, 3417, 3421, 3429, 3529,
- 3467, 3478, 7154, 3477, 3478, 7157, 3474, 3500, 7160, 3506,
- 7164,12292, 7167, 7170, 7179, 3503, 3523, 3586,12292, 3587,
- 12292, 7185, 7188, 7191, 3531, 3553, 3541, 3533, 3572, 7194,
- 7199, 3567, 7212, 7215,12292, 7218,12292, 3560, 3566, 7221,
- 3568, 7230, 7239, 7249, 7252, 7255, 7263, 7270, 7273, 3643,
- 12292, 3641,12292, 7276, 3593, 7281, 3595, 7284,12292, 7294,
- 7297, 7305, 7308, 7312, 7317,12292,12292, 7332, 7335, 7343,
- 7346, 7350,12292, 7353, 7356, 3699, 3649, 3650, 7364,12292,
-
- 3588, 3605, 7369, 3596, 3608, 3614, 7377, 7383, 3814, 3864,
- 3660, 3695, 3704, 3704, 3721, 3738, 3722, 3733, 3736, 3742,
- 3761, 7391, 3702, 3718, 3717, 3724, 3727, 3725, 3731, 3745,
- 3743, 3761, 3767, 3760, 3771, 3795, 7395, 3787, 3805, 7398,
- 3814, 7401,12292,12292, 7410,12292, 3795, 7413,12292,12292,
- 7417, 7420, 7431, 3797, 3813, 3819, 7435, 3823, 7438,12292,
- 12292, 3840, 7446, 7453, 3827, 7464, 7470, 7473, 7482, 7488,
- 12292,12292, 7496,12292, 7500,12292,12292, 7508, 7511, 7515,
- 12292,12292, 7518, 7522, 7536, 7539, 7542, 3904, 3964, 7550,
- 12292, 7557, 7564, 7572,12292,12292, 7583, 7586, 7594, 7597,
-
- 7606,12292, 3893, 3944, 3955, 3842, 7612, 3868, 3883, 3884,
- 7615, 7626, 3899, 3904, 3980, 3905, 3910, 3996, 3910, 3973,
- 3961, 3975, 3982,12292, 4000, 3988, 3990, 4015,12292, 7618,
- 3995, 4005, 3992, 4007, 4015, 4021, 4008, 4017, 4011, 4026,
- 4034, 4040, 4026, 7637, 4042, 7640, 7643, 7646, 7649, 7653,
- 7658, 7671,12292,12292, 7679,12292, 4058, 4045, 7682, 7685,
- 7689, 7706, 4065, 7709,12292,12292, 4069, 7717, 7720, 7728,
- 12292,12292, 7736, 7739, 7747, 7750, 7754, 7758,12292,12292,
- 7768, 7772, 7780, 7786, 4094, 4098, 4099, 4103, 4121, 4121,
- 7794, 7798, 7806, 4160, 4170, 7817,12292,12292, 4249, 4145,
-
- 7825, 4111, 7828, 7831, 4099, 4101, 7834,12292,12292, 4148,
- 4151, 4153, 4161, 4169, 4157, 4159, 4169, 7846, 4182, 4206,
- 4224, 4219, 4211, 4230, 4245, 4241, 7849, 4196, 4204, 4220,
- 4269, 4275, 4223, 4216, 4231, 4249, 4294, 4296, 4246, 4255,
- 7852, 7855, 7858, 7869, 7877, 7880, 7883, 7891, 7899, 4255,
- 7909,12292,12292, 4265, 4260, 7917, 7920, 7929,12292,12292,
- 7937, 7940, 4249, 4273, 7948,12292,12292, 7956,12292,12292,
- 7964, 7967, 7970, 7978, 7985, 4313, 4317, 7996, 4324, 4335,
- 4289, 4299, 4329, 4297, 4319, 4352, 8004, 8007, 4337, 4352,
- 4351, 4370, 4378, 8010, 8016, 8019, 8029, 8038, 8041, 8044,
-
- 4364, 4376, 4378, 4375, 4380, 4394, 4396, 4395, 8050, 8053,
- 4408, 4409,12292, 4410, 4413, 4413,12292, 4427, 8061, 4406,
- 4392, 4456,12292,12292, 4412, 4412, 4399, 4459,12292,12292,
- 4424, 8064, 8068, 8074,12292,12292, 8082, 8085,12292,12292,
- 8094,12292,12292, 4424, 4428, 4430, 8102,12292,12292, 8110,
- 12292,12292, 8118, 4433, 8121, 8124,12292,12292, 8132, 4459,
- 4474, 4476, 4487, 4480, 4491, 4484, 4499, 4491, 4505,12292,
- 4498, 4508,12292, 8139,12292, 8142, 4517, 4511, 4533, 4521,
- 4581, 8145, 8151, 8164, 8195, 8242, 8172, 8175, 8178, 4538,
- 4564, 4565, 4536, 4553, 4570, 4584, 4555, 8183,12292,12292,
-
- 4590, 4565, 4567, 4594, 4571, 4576, 8206, 4544, 4560,12292,
- 4570, 4563, 4565,12292, 4575, 8215, 8218,12292, 4574, 4582,
- 4594, 8221, 8225, 4590, 8233, 8262, 8253, 8271, 4646, 4618,
- 4655, 4630, 4665, 4635, 4668, 4646, 4681, 4682, 4697, 4698,
- 8279, 4703, 4670, 4707, 4678, 4699, 8288, 4722, 4764, 8308,
- 8355, 4715,12292,12292, 4710, 4736,12292,12292, 4713,12292,
- 4760, 4766,12292, 4772, 4773, 8282,12292, 4779, 4742, 4786,
- 4785, 4746, 4799, 4770, 4771, 4759, 8328, 4806, 4819, 4785,
- 8336,12292,12292, 8344, 4825, 4833,12292, 4837,12292, 4842,
- 12292, 4848,12292, 4860,12292,12292,12292,12292, 8301,12292,
-
- 12292, 4849,12292, 4855, 4863, 4883, 4880, 4875, 4971, 4881,
- 8366, 4883, 4882, 4910, 4901,12292,12292,12292,12292,12292,
- 4925,12292,12292, 4948,12292, 8375, 8378, 8381, 4910, 4900,
- 4913, 4905, 8386, 4956, 4923, 4978, 4927,12292,12292,12292,
- 12292, 4932, 4935, 8389, 4982, 4969, 4989, 8404, 4996, 4981,
- 5006, 5002,12292, 4976,12292, 4978, 8408, 8411, 8419, 8426,
- 8437, 8440, 4988, 5007, 5020, 5003, 5016, 5039, 8448, 8456,
- 5024, 5038, 5062, 5046, 5054, 5090, 5073, 5075, 8451, 5096,
- 12292, 5089,12292, 5092, 5076, 5099, 8466,12292,12292, 8474,
- 12292,12292, 8482, 5129, 5132, 5114, 5120, 5116, 5139, 5146,
-
- 5146, 8490,12292,12292, 5150, 5159, 5163, 5165, 5177, 5174,
- 5207, 5210, 5239,12292, 5215, 5215, 5169, 5177, 5213, 5207,
- 5216, 5213, 5214, 5231, 5240, 5248, 5254, 5276, 5275, 5282,
- 5283, 5280, 5287, 5294,12292,12292, 5306,12292,12292, 5269,
- 5270, 5285, 5309, 5296, 5317, 5315, 5313, 5330, 5320, 5318,
- 5339, 5329, 5326, 5347, 5339, 5337, 5360, 5379, 5395, 5393,
- 5370, 5371, 5373, 5374, 5391, 5383, 5425, 5406, 5400, 5430,
- 5421, 5416, 5450, 5439, 5434, 5463, 5481,12292,12292, 5444,
- 5451, 5448, 5460, 5482, 5456,12292, 5494, 5471,12292, 5500,
- 5477,12292, 5506, 5486,12292, 5512, 5484, 5508, 5504, 5523,
-
- 12292, 5523,12292, 5525,12292, 5526,12292, 5528, 8498, 5536,
- 5558, 5539, 5566, 5532, 5538, 5539, 5550, 8501, 5593,12292,
- 5592,12292, 5598, 5596, 5601, 5615, 5636, 5657,12292,12292,
- 12292,12292,12292,12292, 5611, 5698, 5701, 5731, 5605, 5737,
- 5631, 5637, 5648, 5702, 5752, 5782, 5664, 5835, 5776, 5777,
- 5804, 5839, 5840, 5855, 5619, 5843, 5871, 5898, 5607, 5721,
- 5922, 5930, 5872, 5926, 5947, 5973, 5932, 5949, 5962, 6000,
- 6025, 6037, 5994, 5995, 5976, 6057, 5950, 6049, 6017, 6104,
- 6043, 6071, 6077, 6088, 6142, 6144, 6105, 6183, 6010, 6147,
- 6149, 6178, 6184, 6226, 6221, 6246, 6219, 6237, 5842, 6116,
-
- 6201, 6223, 6259, 6358, 6255, 6373, 5905, 6202, 6299, 6311,
- 6436, 6452, 6252, 6409, 6454, 6455, 6317, 6016, 8509, 8512,
- 12292,12292, 8532, 8541, 8550, 8559, 8568, 8577, 8586, 8595,
- 8604, 8613, 8622, 8631, 8640, 8649, 8658, 8667, 8676, 8685,
- 8694, 8703, 8712, 8721, 8730, 8739, 8748, 8757, 8766, 8775,
- 8784, 8793, 8802, 8811, 8820, 8829, 8838, 8847, 8856, 8865,
- 8874, 8883, 8892, 8901, 8910, 8919, 8928, 8937, 8946, 8955,
- 8964, 8973, 8982, 8991, 9000, 9009, 9018, 9027, 9036, 9045,
- 9054, 9063, 9072, 9079, 9086, 9093, 9100, 9107, 9114, 9121,
- 9128, 9135, 9142, 9149, 9156, 9163, 9170, 9177, 9184, 9191,
-
- 9198, 9205, 9212, 9219, 9226, 9233, 9240, 9247, 9254, 9261,
- 9268, 9277, 9284, 9289, 9296, 9301, 9308, 9313, 9320, 9325,
- 9332, 9337, 9344, 9349, 9356, 9361, 9368, 9373, 9380, 9385,
- 9392, 9397, 9404, 9409, 9416, 9421, 9428, 9433, 9440, 9445,
- 9452, 9457, 9464, 9469, 9476, 9481, 9488, 9493, 9500, 9505,
- 9512, 9517, 9524, 9529, 9536, 9541, 9548, 9553, 9560, 9565,
- 9572, 9577, 9584, 9589, 9596, 9601, 9608, 9613, 9622, 9628,
- 9635, 9643, 9650, 9658, 9665, 9673, 9680, 9688, 9695, 9703,
- 9710, 9718, 9725, 9733, 9740, 9748, 9755, 9763, 9770, 9778,
- 9785, 9793, 9800, 9808, 9815, 9823, 9830, 9838, 9846, 9854,
-
- 9861, 9869, 9876, 9884, 9891, 9899, 9906, 9914, 9922, 9930,
- 9938, 9946, 9953, 9961, 9969, 9977, 9985, 9993,10000,10008,
- 10015,10023,10031,10038,10046,10055,10061,10068,10076,10084,
- 10092,10100,10108,10115,10123,10130,10138,10145,10153,10160,
- 10168,10175,10183,10191,10199,10207,10215,10222,10230,10238,
- 10246,10254,10262,10269,10277,10284,10292,10299,10307,10314,
- 10322,10329,10337,10344,10352,10359,10367,10374,10382,10389,
- 10397,10405,10412,10420,10427,10435,10442,10450,10458,10465,
- 10473,10482,10491,10498,10506,10514,10521,10529,10536,10544,
- 10551,10559,10566,10573,10581,10588,10596,10603,10611,10618,
-
- 10626,10633,10641,10649,10657,10664,10672,10680,10688,10695,
- 10703,10710,10718,10725,10733,10740,10748,10755,10763,10770,
- 10778,10785,10793,10801,10808,10816,10823,10831,10839,10847,
- 10855,10863,10871,10880,10889,10896,10904,10912,10919,10927,
- 10934,10942,10949,10957,10964,10971,10979,10986,10994,11001,
- 11009,11017,11025,11032,11040,11048,11055,11063,11071,11079,
- 11086,11094,11101,11109,11116,11124,11131,11139,11146,11154,
- 11162,11170,11177,11185,11193,11201,11209,11216,11224,11232,
- 11240,11248,11257,11266,11274,11282,11290,11297,11305,11312,
- 11320,11328,11336,11344,11352,11360,11368,11376,11383,11391,
-
- 11399,11406,11414,11421,11429,11437,11445,11452,11459,11467,
- 11474,11482,11489,11496,11504,11511,11519,11526,11534,11542,
- 11550,11557,11565,11573,11581,11590,11599,11607,11615,11622,
- 11629,11637,11645,11652,11660,11667,11675,11682,11690,11697,
- 11705,11712,11720,11728,11735,11742,11750,11757,11765,11772,
- 11779,11786,11794,11801,11809,11817,11825,11833,11841,11849,
- 11857,11866,11875,11883,11891,11898,11906,11914,11921,11929,
- 11936,11944,11952,11960,11967,11975,11982,11990,11998,12005,
- 12012,12020,12028,12036,12043,12050,12058,12066,12074,12082,
- 12090,12098,12106,12114,12123,12132,12140,12147,12154,12162,
-
- 12169,12177,12184,12192,12199,12207,12214,12221,12228,12237,
- 12246,12255,12264,12273,12282
+ 2523, 2526, 3605, 3675, 2530, 2533, 3745, 3815, 2587, 2590,
+ 0, 0, 9416,12593,12593, 95, 100, 29, 41,12593,
+ 103, 51,12593,12593, 9405,12593,12593, 9394,12593, 9405,
+ 9405, 202,12593,12593,12593,12593, 9403, 9399, 9354, 153,
+ 12593, 161, 9380, 0, 145,12593, 9342,12593, 165, 3881,
+
+ 73, 2599, 315, 357, 9382, 9329,12593, 168, 9368, 0,
+ 152,12593, 9330,12593, 261, 9374, 31,12593, 266, 9361,
+ 0, 245,12593, 9323, 9327, 9321, 421, 9326,12593, 269,
+ 9352, 0, 340,12593, 9314, 9314, 271, 9316, 238,12593,
+ 441, 484,12593, 504, 9340, 0, 401,12593, 9299, 9301,
+ 9287,12593, 561, 548,12593, 571, 9332, 0, 481,12593,
+ 9299, 9283,12593, 628, 3945, 9281, 163, 2533, 567, 206,
+ 38, 9332, 954, 2607, 639, 907, 437, 79,12593, 634,
+ 9319, 0, 546,12593, 9275, 9285, 9269, 9274,12593, 638,
+ 313, 559, 368,12593, 697, 9310, 0, 549,12593, 9262,
+
+ 9272, 9250,12593, 704, 426, 497,12593, 707, 9298, 0,
+ 747,12593, 9268, 9248,12593, 767, 753,12593, 773, 9291,
+ 0, 757,12593, 9261, 9236,12593, 831, 818,12593, 838,
+ 9284, 0, 758,12593, 9233, 9239, 9245, 251, 9228,12593,
+ 841, 466, 9234, 530,12593, 906, 9270, 0, 815,12593,
+ 9240,12593, 914, 891,12593, 977, 9268, 0, 816,12593,
+ 9220, 9230, 9217,12593, 981, 965,12593, 1021, 9256, 0,
+ 881,12593, 9205, 203, 9211, 9217, 378, 85, 639, 972,
+ 9205,12593, 1040, 564, 814,12593, 1044, 9247, 0, 953,
+ 12593, 9191, 9209, 9211, 157, 8639, 8618,12593, 1048, 1086,
+
+ 12593, 1106, 8665, 0, 966,12593, 8614, 8612, 8619, 8629,
+ 8631, 8616, 8609,12593, 1111, 1099,12593, 1114, 8656, 0,
+ 1032,12593, 8611, 8614,12593, 1156, 1160,12593, 1173, 8645,
+ 0, 1033,12593, 8614, 8603, 8604,12593, 1180, 1228,12593,
+ 1183, 8632, 0, 1100,12593, 8601, 8593, 8595, 15,12593,
+ 1186, 899, 963,12593, 1241, 8622, 0, 1157,12593, 8569,
+ 181,12593, 1244, 1243, 432, 303,12593, 1248, 8614, 0,
+ 1158,12593, 8563, 8557, 299,12593, 1308, 1229, 350,12593,
+ 1311, 8607, 0, 1295,12593, 8560, 8554,12593, 1315, 1362,
+ 12593, 1319, 8585, 0, 1303,12593, 8528, 8528,12593, 1375,
+
+ 1378, 685,12593, 1378, 8572, 0, 1363,12593, 8517, 8511,
+ 8513,12593, 1445, 1438, 744,12593, 1449, 8557, 0, 1365,
+ 12593, 8503, 8508, 8503, 8497, 8485,12593, 1454, 1447, 560,
+ 1007,12593, 1511, 8527, 0, 1370,12593, 8492,12593, 1517,
+ 1559,12593, 1520, 8520, 0, 1495,12593, 8480,12593, 1579,
+ 1210, 1433,12593, 1584, 8511, 0, 1496,12593, 8477, 8475,
+ 12593, 1587, 1632,12593, 1645, 8503, 0, 1563,12593, 8469,
+ 8463,12593, 1648, 1633, 1707, 719, 8437,12593, 8496, 8467,
+ 12593,12593,12593, 1700, 375, 8418, 8416, 8410, 8457, 8416,
+ 12593, 0, 8408, 8396, 8420, 8382, 104, 1037, 8383, 8380,
+
+ 8379, 8383, 889, 1646, 1105, 8371, 8371, 1510, 1577, 8397,
+ 1701, 8372, 1709, 8361, 1719, 1720, 1721,12593, 0, 8362,
+ 8364,12593, 0, 8359, 2098, 8344, 666, 8341, 8387,12593,
+ 0, 8336, 2165, 8321, 8330, 8311, 8320, 8317, 8299, 8280,
+ 12593, 0, 8292, 8272, 8284, 8263,12593, 0, 2232, 8261,
+ 8306, 8284, 172, 8248, 8246, 8246, 1777, 1639, 8233, 1778,
+ 8259, 724, 814, 841, 888, 1770, 1792, 1779, 1046,12593,
+ 0, 8234, 2289, 8240, 8216, 8212, 897,12593, 0, 8216,
+ 2596, 8208, 8204,12593, 0, 8197, 8194, 8194,12593, 0,
+ 8189, 8185, 8186,12593, 0, 8192, 621, 2614, 8168, 8167,
+
+ 8184, 8176, 1027,12593, 0, 8169, 8167,12593, 0, 8148,
+ 2656, 2666, 8158,12593, 0, 8164, 8153, 2674, 8134, 2680,
+ 8130, 8117, 8114, 8103, 8118, 8117, 8097, 8095, 8094, 8087,
+ 8071, 8082,12593, 0, 2721, 2724, 8060, 8056, 8072, 8065,
+ 8062, 8063,12593, 0, 8059, 8058, 8038, 2727, 8032, 8027,
+ 8041, 8025,12593, 0, 8020, 2730, 8015,12593, 0, 8018,
+ 2733, 8010, 8023,12593, 0, 8006, 2788, 7997, 8011, 8010,
+ 7988,12593, 0, 7979, 7994, 7979, 7973, 7976,12593, 0,
+ 7964, 7973, 7951, 7939, 7976,12593, 0, 7931, 2791, 7935,
+ 12593, 0, 7912, 7922, 7922,12593, 0, 7902, 7910, 7906,
+
+ 7897,12593, 0, 7884, 7869, 7875, 7877, 7875, 7858, 7847,
+ 12593, 0, 7851, 7857,12593, 0, 2794, 7854,12593, 0,
+ 2797, 7835, 7830,12593, 0, 2800, 7832, 7823, 7863, 7867,
+ 1558, 7811,12593, 1833, 0, 7807, 7797, 7840, 7835, 7788,
+ 12593, 7796, 7776, 2600, 2855, 1981, 7787, 7788, 7766, 7755,
+ 7734, 7737, 7726, 7726, 7741, 7712, 330, 7705, 7710, 7713,
+ 7697, 7690, 7682, 7686, 7699, 7684, 7682, 1990, 7693, 7672,
+ 7676, 7673, 7661, 7674, 7668, 2858, 2863, 7667, 2866, 2048,
+ 7661, 7682, 2869, 2914,12593, 7652, 2917, 2117, 2924, 7633,
+ 2927, 7637, 7640, 7635, 2920, 2983, 7621, 7628, 7624, 2969,
+
+ 2972, 2975, 2184, 7606, 2979, 3037, 2363, 7617, 7603, 7596,
+ 7590, 7594, 7588, 7581, 7581, 2423, 7575, 7573, 7566, 7565,
+ 7564, 3040, 2550, 7574, 7573, 3044, 3047, 1070, 7550, 3050,
+ 2621, 7564, 3103, 3106, 7562, 7548, 3114, 3117, 7559, 7558,
+ 3129, 3173, 7548, 7531, 7543, 3109, 2685, 7541, 7540, 7520,
+ 3179, 3183, 1340, 7504, 7518, 3186, 3245, 7504, 3239, 2755,
+ 3248, 2822, 3252, 3257, 7508, 1920, 3304, 3002, 7510, 3308,
+ 3068, 3313, 7491, 7483, 7479, 7477, 7472, 7460, 7451, 7448,
+ 7457, 7447, 3322, 3383, 3331, 3137, 3371, 3205, 3374, 3392,
+ 3397, 3450, 3459, 3444, 3468, 7451, 37, 7433, 3454, 3403,
+
+ 3512, 7445, 7427, 3516, 3519, 7428, 3522, 3411, 3525, 3571,
+ 7440, 3574, 3473, 7432, 3577, 3580, 7425, 3583, 3481, 7423,
+ 7408, 7405, 3628, 3634, 3637, 3640, 3700, 3643, 3704, 7408,
+ 3695, 3723, 3709, 3770, 3713, 3766, 7415, 3774, 3662, 3777,
+ 3780, 3792, 3836, 3839, 3843, 3846, 3854, 3849, 3867, 3878,
+ 7413, 7384, 7391, 7395, 7375, 3872, 3887, 7385, 7364, 3875,
+ 3897, 3906, 3732, 3909, 3920, 3916, 3804, 7363, 3924, 3952,
+ 3956, 3967, 7361, 3977, 3983, 7403,12593,12593, 1210, 7350,
+ 12593, 7387, 7386, 7334,12593,12593, 7332, 7330, 7333, 3987,
+ 4012,12593, 4017, 1714, 7325, 7318, 7325, 7329, 7306, 7289,
+
+ 7300, 1781, 7282, 7282, 7271, 7269, 7258, 7237, 7223, 7218,
+ 446, 7229, 7212, 7208, 7222, 7215, 7215, 2057, 7197, 7185,
+ 7190, 7179, 716, 7183, 4020, 4023, 4027,12593, 4031, 4038,
+ 4046,12593,12593, 4056, 7208, 4059, 4065,12593, 4068, 7156,
+ 4074,12593,12593, 4087, 4090, 4099, 4105, 4119, 7167, 4108,
+ 7165, 4111, 4130,12593, 4133, 7153, 4136, 7151, 4139, 4142,
+ 12593, 4145, 4154,12593,12593, 7146, 4164, 4167,12593, 4170,
+ 7136, 7139, 7144, 2250, 7124, 7131, 1922, 7104, 7101, 7116,
+ 7115, 7094, 7087, 7100, 4173,12593,12593, 7088, 4189, 4194,
+ 4197,12593, 4200, 7093, 7090, 4203,12593,12593, 7105, 4219,
+
+ 4222,12593, 4225, 4228, 4231, 4234, 4249,12593, 4253, 4256,
+ 4262, 4274, 4280,12593, 4283, 7074, 7073, 4287, 4293,12593,
+ 12593, 7058, 7054, 7064, 4305, 4308,12593, 4311, 7048, 7046,
+ 4314, 4317, 4332,12593, 4336, 4339, 4344,12593,12593, 4357,
+ 12593,12593, 4365, 4368,12593, 4371, 7047, 7025, 7046, 7037,
+ 4377,12593,12593, 4390, 4393,12593,12593, 4404, 4408, 7024,
+ 7040, 7023, 7024, 7028, 7007, 7002, 7004, 6992, 1376, 4416,
+ 4422,12593, 4425, 4428,12593,12593, 4437,12593,12593, 4445,
+ 4448, 6982, 6989, 6987, 6973, 4456, 4459,12593, 4463, 6958,
+ 6954, 6943, 6955, 4466,12593,12593, 4478, 4482, 6939, 6947,
+
+ 4496, 4499,12593, 4502, 6947, 4505,12593,12593, 4521, 4524,
+ 12593, 4527, 6912, 4530,12593,12593, 6898, 4546, 4549,12593,
+ 4554, 6888, 4558,12593,12593, 6888, 6884, 6886, 4568, 4573,
+ 12593, 4577, 4580, 4583, 4598, 4604, 6885, 4612, 4616,12593,
+ 4620, 6864, 4623, 4641, 6852, 6847, 4627, 4649, 6832, 4657,
+ 4660,12593, 4663, 6833, 4666,12593,12593, 4682, 4688,12593,
+ 4691, 4694, 4697, 4712, 4715, 4723, 4730,12593, 4734, 4737,
+ 4742, 6800, 6800, 4755, 4758, 4766, 4769,12593, 4773, 6794,
+ 4776, 6802, 6796, 6776, 4779, 4788,12593, 4798, 6773, 6774,
+ 4801, 4807,12593, 4810, 4813,12593,12593, 4821, 4829,12593,
+
+ 4832, 4836,12593,12593, 6754, 4844, 4851,12593, 4854, 4864,
+ 12593,12593, 6733, 4873, 4876,12593, 4879, 1216, 4882,12593,
+ 12593, 6749, 6747, 6707, 6670, 4885, 6588, 6592, 6517, 6486,
+ 6486, 6397, 6407, 2307, 2483, 6285, 2492, 6194, 6168, 6087,
+ 2495, 12, 36, 2559, 131, 264, 311, 352, 389, 436,
+ 488, 488, 549, 2562, 590, 632, 4888, 4906, 4916, 4919,
+ 4923, 703, 802, 4931, 782, 4937,12593,12593, 4945, 4952,
+ 4963,12593,12593, 797, 4971, 4975, 836, 4983, 830, 4989,
+ 4992, 5002, 5007, 835, 5010,12593, 851, 980, 964, 2662,
+ 2693, 2763, 2830, 980, 1043, 1099, 1106, 1154, 1178, 1192,
+
+ 5013, 5020, 5034, 5042, 1197, 1236, 1249, 5045, 5048, 5051,
+ 1286, 5066, 5069, 5072, 1304, 5080, 1315, 1308, 5087, 5090,
+ 5099, 1332, 5110, 5113, 1320, 1323, 5117, 5121, 5135, 5138,
+ 5142, 5150, 1383, 5157, 1365, 1386, 5160, 5163, 5171,12593,
+ 12593, 1389, 1394, 5180, 1382, 1411, 1411, 1430, 1455, 1432,
+ 1462, 1464, 5183, 5186,12593,12593, 5194, 5198, 5202, 5205,
+ 5208, 1495, 5212, 1495, 1508, 5223,12593,12593, 5233, 1519,
+ 5236, 1536, 5239, 1554, 1583, 5242, 1578, 1604, 1594, 5245,
+ 5251, 5270,12593,12593, 5278,12593,12593, 1605, 5265, 3010,
+ 5286,12593,12593, 1628, 1646, 5294,12593,12593, 1632, 5302,
+
+ 1639, 5309, 5312,12593,12593, 5321,12593,12593, 5332, 5335,
+ 12593,12593, 1667, 1707, 5344,12593,12593, 5352, 1702, 5355,
+ 5358, 1709, 1721, 1756, 5367, 1766, 5373, 5376, 5380, 5386,
+ 5391, 5395, 5400, 1951, 1829, 5404,12593, 1831,12593,12593,
+ 1790, 1792, 5413, 1788, 1894, 1899, 1907, 1923, 1936, 1935,
+ 3076, 1954, 1977, 3266, 1986, 1990, 3279, 1991, 3342, 1978,
+ 1976, 3377, 1992, 3530, 2008, 3540, 2026, 2035, 2051, 2052,
+ 2055, 3380, 2041, 3670, 5419,12593,12593, 5427, 5433,12593,
+ 12593, 2053, 2078, 5446, 2056, 5456,12593,12593, 2067, 5466,
+ 12593,12593, 2058, 5474, 2062, 5477, 2851, 3945, 5485, 5489,
+
+ 5498, 2076, 2080, 2100, 2104, 3727, 2112, 4268, 4631, 5503,
+ 2119, 2108, 2110, 5506, 5509, 2117, 5512, 5517, 5526,12593,
+ 12593, 5536, 2143, 2126, 5539, 5542, 5546,12593,12593, 2142,
+ 5557, 5561,12593,12593, 5576, 5579, 2147, 2136, 5584,12593,
+ 12593, 5594, 5598, 5607, 5612, 5615, 2161, 5626, 5016, 2181,
+ 5630,12593,12593, 5638,12593, 5645,12593,12593, 5653, 2188,
+ 5657, 5660, 5668, 2173, 5675,12593,12593, 2175, 2191, 5686,
+ 5689, 5700, 2184, 2200, 2194, 2201, 5704, 2223, 2232, 5707,
+ 5710, 5722, 5713, 5718, 5731, 5736, 2245, 5739, 5742, 5750,
+ 2234, 5757, 5761, 2244, 5769, 2237, 5777, 2249, 2232, 5781,
+
+ 2254, 2239, 2274, 5784, 5790, 2290, 5802, 2286, 5805, 2302,
+ 5808, 5813, 5816, 5834, 2298, 5837, 5840, 5843, 5846, 5849,
+ 2293, 5864,12593,12593, 2301, 2302, 2300, 5872, 2316, 5875,
+ 5884, 5893, 5898, 5902, 5906, 5920, 5924, 5927, 5942, 2352,
+ 2351, 2396,12593, 2338, 5945, 5948, 2359, 2353, 2356, 2450,
+ 2354, 2362, 5935, 2374, 2379, 2396, 2409, 5954, 2420, 2410,
+ 2411, 5957, 5963, 5967, 2429, 5970, 2440, 5973, 5976, 2424,
+ 2450, 2486, 2475, 5979, 2492, 5983, 2498, 2536, 5986, 2532,
+ 5989, 2539, 5992, 5995, 2584, 2571, 2649, 2573, 2588, 2576,
+ 2668, 2586, 6013,12593,12593, 6021, 6024, 2573, 2566, 2716,
+
+ 2574, 6027, 6030, 2579, 2717, 2722, 6035, 6042,12593,12593,
+ 6053, 2597, 6056, 6059, 6062, 6077, 2632, 6082, 6086, 6089,
+ 6097, 2615, 2625, 6107,12593,12593, 6116, 6119, 6127, 2656,
+ 2664, 2660, 6135,12593, 6138, 2687, 6141, 2688, 6145,12593,
+ 12593, 6154, 6160, 2693, 2703, 2703, 6168,12593,12593, 6176,
+ 6179, 6187, 2706, 2736, 2748, 6190, 6194, 2740, 2735, 6208,
+ 6211,12593,12593, 6219, 6223, 6231, 6237, 6240, 6249, 2752,
+ 6256,12593,12593, 6264, 6268, 2763, 6276,12593,12593, 2760,
+ 6284,12593, 2769, 6287, 2753, 6290, 6293, 2754, 6296, 2779,
+ 6308, 2793, 2794, 2794, 6316,12593, 2806, 6319, 2796, 6322,
+
+ 6325, 6343, 6346, 2819, 6355, 2814, 6361, 6364, 6367, 6370,
+ 6385, 6388, 6396, 2817, 2825, 2821, 2834, 6399, 2846, 6404,
+ 12593,12593, 6418, 6422, 6426,12593,12593, 6437,12593, 6441,
+ 12593,12593, 6449, 2915, 2894, 2922, 2871, 6456, 6470, 6478,
+ 6452, 2865, 2884, 2908, 2885, 6481, 6484, 6487, 2903, 6490,
+ 2922, 2924, 2938, 2932, 6497, 6500, 6503, 6506, 2934, 6509,
+ 6512, 6515, 6518, 6521, 6524, 2935, 6527, 2943, 2956, 6530,
+ 12593, 2941, 6533, 6536, 2960, 6553, 6556, 6559, 2975, 2976,
+ 3005, 3020, 3013, 3025, 3022, 3025, 3031, 3030, 6567, 6574,
+ 6579, 6587, 3022, 3042, 3019, 3037, 6592, 6595, 6598, 6601,
+
+ 3046, 6609, 3056, 6612, 6617, 3056, 6630,12593,12593, 6638,
+ 3073, 6643,12593, 6646,12593,12593, 6657, 3067, 3068, 6662,
+ 12593,12593, 3157, 3177, 3082, 3091, 6670, 3085, 6676,12593,
+ 12593, 3085, 3088, 3118, 6690,12593,12593, 6684, 6698, 3120,
+ 3109, 3118, 6707,12593,12593, 3130, 6715, 6718, 6722,12593,
+ 12593, 6733, 6737, 6745,12593,12593, 6753, 3131, 6756,12593,
+ 12593, 3126, 3135, 3130, 6765, 3144, 6768, 6772, 6786, 3145,
+ 6789, 6792, 3156, 3149, 3218, 3239, 3155, 3165, 6800,12593,
+ 3171, 6807,12593,12593, 6820,12593,12593, 3188, 6815, 3182,
+ 6829, 6834, 6837,12593,12593, 6849,12593,12593, 6857, 6861,
+
+ 6867, 6871, 6879, 6885, 3189, 6889, 6892, 6897, 6904, 3255,
+ 3321, 6900, 6912,12593,12593, 6923, 6926, 6929, 6932, 3196,
+ 3209, 6942, 6945, 3220, 6951, 6954, 3237, 6960, 6963, 6966,
+ 6969, 3245, 3252, 6972, 6975, 6978, 6983, 3257, 6986, 3253,
+ 12593, 6989, 6992,12593,12593, 7000, 7007,12593, 7011,12593,
+ 12593, 3297, 3288, 3303, 3304, 3311, 3314, 3308, 3323, 3335,
+ 3363, 7019, 7022, 5419, 5856, 7030, 7033, 3325, 3323, 3343,
+ 7038, 3336, 7041,12593,12593, 3335, 7049, 3347, 7052,12593,
+ 12593, 3345, 7060, 7068, 7063, 3362, 3384, 3417, 3443, 3423,
+ 3446, 3406, 7071, 7074, 3403, 3410, 3409, 3480, 7082,12593,
+
+ 12593, 7096, 3411, 3427, 3420, 7099, 7102, 7110, 7117,12593,
+ 12593, 7125, 3429, 3436, 3482, 3493, 7129,12593, 7135, 7138,
+ 12593,12593, 7148, 7154, 7157,12593,12593, 7167, 7172, 3520,
+ 3558, 3543, 3562, 7175, 3540, 7178, 3541, 7185, 7181, 7193,
+ 7205, 7212, 7208, 7217, 7227, 7234, 7237, 7240, 7245, 7255,
+ 7259,12593, 7262, 7268, 3581, 3578, 7274, 7281, 7289, 7292,
+ 3529, 3531, 7295, 7300, 3539, 7303, 7306, 3531, 3559, 3565,
+ 7309,12593, 3555, 7312, 7315, 3592, 3607, 3605, 3620, 3609,
+ 3620, 3617, 3613, 3632, 3621, 3632, 7323, 3640, 3644, 3743,
+ 3642, 3652, 3650, 3663, 3828, 3660, 3680, 7331, 3676, 3672,
+
+ 7334, 3670, 3680, 7337, 3707, 3721, 7342,12593, 7345, 7349,
+ 7357, 3719, 3721, 3792,12593, 3790,12593, 7363, 7366, 7369,
+ 3733, 3756, 3747, 3743, 3795, 7372, 7377, 3794, 7390, 3807,
+ 7393, 3856, 3906, 7404,12593, 7409,12593, 3796, 3799, 7412,
+ 3800, 7415, 7433, 7418, 7441, 7444, 3830, 3834, 3844, 3899,
+ 12593, 3905,12593, 7452, 3855, 7423, 3874, 7455,12593, 7459,
+ 7463, 7477, 7480, 7484, 7487,12593,12593, 7499, 7503, 7511,
+ 7517, 7520,12593, 7523, 7531, 7535, 3932, 3941, 3945, 7539,
+ 12593, 3870, 3890, 7542, 7550, 3898, 3911, 3924, 7554, 7558,
+ 4049, 4091, 3921, 3958, 3971, 3975, 3982, 4004, 3987, 4006,
+
+ 4012, 4016, 4035, 7566, 3976, 3995, 3991, 3996, 4002, 3995,
+ 4004, 4023, 4023, 4035, 4035, 4028, 4031, 4051, 7572, 4041,
+ 4067, 7575, 7578, 4077, 7581,12593,12593, 7589,12593, 4078,
+ 7597,12593,12593, 7600, 7604, 7618, 4079, 4090, 4102, 7621,
+ 4096, 7627,12593,12593, 4121, 7639, 7643, 4112, 4148, 4147,
+ 4152, 4150, 4115, 7651, 7657, 7660, 7669, 7675,12593,12593,
+ 7683,12593, 7687,12593,12593, 4132, 4157, 4154,12593,12593,
+ 7695, 7698, 7706, 7709, 7713, 4452, 4613, 7727,12593, 7730,
+ 7733, 7736,12593,12593, 7752, 7755, 7763, 7766, 7774,12593,
+ 7777, 4195, 4199, 4242, 4145, 7781, 7784, 4163, 4167, 4189,
+
+ 7787, 7798, 4203, 4207, 4310, 4208, 4212, 4322, 4187, 4242,
+ 4226, 4229, 4237,12593, 4268, 4256, 4256, 4263,12593, 7806,
+ 4256, 4265, 4253, 4267, 4276, 4281, 4282, 4295, 4282, 4302,
+ 4311, 4316, 4308, 7809, 4324, 7812, 7815, 7818, 7821, 7825,
+ 7830, 7844, 7852,12593,12593, 7860,12593, 4334, 4321, 7863,
+ 7866, 7872, 7884, 4336, 7887,12593,12593, 4336, 4368, 4360,
+ 4378, 4363, 4355, 7895, 7898, 7906,12593,12593, 7914, 7917,
+ 4344, 7925, 4362, 7928,12593,12593, 7936, 7939, 7947, 7950,
+ 4379, 4380, 4384, 4386, 4397, 4398, 7958, 7961, 7965, 4521,
+ 4540, 7973,12593,12593, 7981, 4424, 4435, 7984, 4400, 7834,
+
+ 7987, 4388, 4403, 7990,12593,12593, 4451, 4439, 4443, 4461,
+ 4473, 4461, 4475, 4484, 8003, 4475, 4495, 4512, 4498, 4481,
+ 4513, 4528, 4516, 8006, 4472, 4475, 4491, 4539, 4548, 4503,
+ 4500, 4506, 4538, 4582, 4585, 4535, 4545, 8010, 8013, 8016,
+ 8025, 8021, 8034, 8040, 8048, 8052, 4549, 8060,12593,12593,
+ 4550, 4549, 8068, 8073, 8082,12593,12593, 8090, 8093, 4538,
+ 4546, 4581, 4587, 4597, 4600, 4595, 8101,12593,12593, 8109,
+ 12593,12593, 4603, 8117, 8120, 4584, 8128, 4636, 4643, 8136,
+ 4675, 4677, 4630, 4639, 4670, 4636, 4647, 4678, 8144, 8147,
+ 4674, 4679, 4677, 4683, 8150,12593, 4743, 8153, 8156, 8159,
+
+ 8178, 8181, 8184, 8187, 4688, 4702, 4705, 4696, 4707, 4721,
+ 4724, 4713, 8190, 8193, 4726, 4735,12593, 4736, 4755, 4755,
+ 12593, 4757, 8201, 4735, 4726, 4790,12593,12593, 4754, 4754,
+ 4752, 4817,12593,12593, 4776, 8204, 8208, 8214,12593,12593,
+ 8222, 8225,12593,12593, 8234,12593,12593, 4772, 4786, 4787,
+ 8242,12593,12593, 8250,12593,12593, 8258, 4783, 4845, 4820,
+ 4851, 4823, 4806, 8261, 8264,12593,12593, 8272, 4833, 4846,
+ 4859, 4871, 4862, 4874, 4865, 4878, 4871, 4885,12593, 4878,
+ 4888,12593, 8279,12593, 8282, 4890, 4885, 4902, 4891, 4917,
+ 8285, 8291, 8304, 8335, 8382, 8312, 8315, 8318, 4917, 4938,
+
+ 4939, 4910, 4927, 4948, 4950, 4920, 8323,12593,12593, 4956,
+ 4930, 4935, 4961, 4938, 4950, 8346, 4922, 4923,12593, 4940,
+ 4933, 4934,12593, 4945, 8355, 8358,12593, 4947, 4965, 4975,
+ 8361, 8365, 8373,12593, 5022,12593, 5020, 4971, 8393, 8402,
+ 8411, 8414, 5027, 4995, 5032, 5003, 5050, 5020, 5052, 5024,
+ 5058, 5060, 5068, 5070, 8422, 5074, 5045, 5078, 5055, 5084,
+ 8429, 5129, 5089, 8449, 8496, 5083,12593,12593, 5067, 5093,
+ 12593,12593, 5072,12593, 5116, 5120,12593, 5122, 5123, 8442,
+ 12593, 5172, 5085, 5141, 5182, 5107, 5159, 5118, 5140, 5121,
+ 8469, 5195, 5236, 8461, 8479,12593,12593, 5166, 8516,12593,
+
+ 12593, 8524, 5239, 5281,12593, 5217,12593, 5224,12593, 5251,
+ 12593, 5249,12593,12593,12593,12593, 8487,12593,12593, 5238,
+ 12593, 5239, 5271, 5311, 5322, 5277, 5331, 5277, 8490, 5279,
+ 5273, 5294, 5293,12593,12593,12593,12593,12593, 5258, 5339,
+ 12593,12593, 5260, 5403,12593, 8532, 8535, 8542, 5344, 5320,
+ 5369, 5344, 8546,12593,12593, 8554, 5391, 5357, 5397, 5380,
+ 12593,12593,12593,12593, 5388, 5402, 8560, 5435, 5430, 5443,
+ 8563, 5450, 5441, 5455, 5449, 5410,12593, 5433, 5421,12593,
+ 5436, 8566, 8572, 8584, 8587, 8595, 8598, 5450, 5464, 5481,
+ 5477, 5489, 5502, 8606, 8609, 5485, 5494, 5511, 5494, 5503,
+
+ 5525, 5513, 5514, 8617, 5537,12593, 5532,12593, 5534, 5505,
+ 5522, 5508, 5525, 8620,12593,12593, 8629,12593,12593, 8637,
+ 5567, 5581, 5547, 5556, 5554, 5566, 5572, 5574, 8645,12593,
+ 12593, 5585, 5590, 5589, 5598, 5604, 5600, 5637, 5635, 5630,
+ 12593, 5646, 5644, 5596, 5611, 5599, 5618, 5658, 5653, 5661,
+ 5656, 5656, 5669, 5670, 5667, 5674, 5674, 5688, 5705, 5710,
+ 5717, 5724, 5729,12593,12593, 5775,12593,12593, 5690, 5709,
+ 5699, 5715, 5734, 5755, 5742, 5768, 5754, 5759, 5777, 5776,
+ 5780, 5798, 5787, 5785, 5803, 5792, 5792, 5809, 5844, 5849,
+ 5850, 5850, 5852, 5826, 5833, 5835, 5851, 5873, 5874, 5908,
+
+ 5891, 5882, 5911, 5906, 5897, 5929, 5915, 5905, 5944, 5981,
+ 12593,12593,12593,12593, 5933, 5958, 5970, 5978, 5999, 5976,
+ 12593, 6001, 5980,12593, 6012, 5987,12593, 6012, 6003,12593,
+ 6062, 6003, 6017, 6010, 6024,12593, 6024,12593, 6026,12593,
+ 6041,12593, 6044, 8655, 6046, 6068, 6050, 6068, 6043, 6050,
+ 6059, 6062, 8658, 6101,12593, 6103,12593, 6108, 6106, 6118,
+ 6117, 6130, 6148,12593,12593,12593,12593,12593,12593, 6107,
+ 6139, 6140, 6156, 6167, 6199, 6285, 6317, 6225, 6235, 6261,
+ 6264, 6132, 6310, 6145, 6283, 6196, 6255, 6288, 6340, 6164,
+ 6198, 6358, 6360, 6286, 6331, 6385, 6398, 6391, 6394, 6373,
+
+ 6413, 6185, 6322, 6475, 6526, 6441, 6529, 6114, 6417, 6617,
+ 6624, 6552, 6610, 6416, 6544, 6559, 6588, 6618, 6649, 6312,
+ 6602, 6678, 6694, 6414, 6661, 6604, 6663, 6531, 6554, 6315,
+ 6656, 6675, 6688, 6566, 6636, 6722, 6724, 6664, 6733, 6743,
+ 6777, 6730, 6760, 6794, 6836, 6763, 6805, 6808, 6810, 6890,
+ 6977, 6442, 6902, 8666, 8669,12593,12593, 8689, 8698, 8707,
+ 8716, 8725, 8734, 8743, 8752, 8761, 8770, 8779, 8788, 8797,
+ 8806, 8815, 8824, 8833, 8842, 8851, 8860, 8869, 8878, 8887,
+ 8896, 8905, 8914, 8923, 8932, 8941, 8950, 8959, 8968, 8977,
+ 8986, 8995, 9004, 9013, 9022, 9031, 9040, 9049, 9058, 9067,
+
+ 9076, 9085, 9094, 9103, 9112, 9121, 9130, 9139, 9148, 9157,
+ 9166, 9175, 9184, 9193, 9202, 9211, 9220, 9229, 9238, 9247,
+ 9254, 9261, 9268, 9275, 9282, 9289, 9296, 9303, 9310, 9317,
+ 9324, 9331, 9338, 9345, 9352, 9359, 9366, 9373, 9380, 9387,
+ 9394, 9401, 9408, 9415, 9422, 9429, 9436, 9443, 9450, 9459,
+ 9466, 9471, 9478, 9483, 9490, 9495, 9502, 9507, 9514, 9519,
+ 9526, 9531, 9538, 9543, 9550, 9555, 9562, 9567, 9574, 9579,
+ 9586, 9591, 9598, 9603, 9610, 9615, 9622, 9627, 9634, 9639,
+ 9646, 9651, 9658, 9663, 9670, 9675, 9682, 9687, 9694, 9699,
+ 9706, 9711, 9718, 9723, 9730, 9735, 9742, 9747, 9754, 9759,
+
+ 9766, 9771, 9778, 9783, 9790, 9795, 9802, 9807, 9816, 9822,
+ 9829, 9837, 9844, 9852, 9859, 9867, 9874, 9882, 9889, 9897,
+ 9904, 9912, 9919, 9927, 9934, 9942, 9949, 9957, 9964, 9972,
+ 9979, 9987, 9994,10002,10009,10017,10024,10032,10040,10048,
+ 10055,10063,10070,10078,10085,10093,10100,10108,10116,10124,
+ 10132,10140,10147,10155,10163,10171,10179,10187,10194,10202,
+ 10209,10217,10225,10232,10240,10247,10255,10264,10270,10277,
+ 10285,10293,10301,10309,10317,10324,10332,10339,10347,10354,
+ 10362,10369,10377,10384,10392,10400,10408,10416,10424,10431,
+ 10439,10447,10455,10463,10471,10478,10486,10493,10501,10508,
+
+ 10516,10523,10531,10538,10546,10553,10561,10568,10576,10583,
+ 10591,10598,10606,10614,10621,10629,10636,10644,10651,10659,
+ 10667,10674,10682,10689,10697,10706,10715,10722,10730,10738,
+ 10745,10753,10760,10768,10775,10783,10790,10797,10805,10812,
+ 10820,10827,10835,10842,10850,10857,10865,10873,10881,10888,
+ 10896,10904,10912,10919,10927,10934,10942,10949,10957,10964,
+ 10972,10979,10987,10994,11002,11009,11017,11025,11032,11040,
+ 11047,11055,11063,11071,11079,11087,11095,11103,11111,11120,
+ 11129,11136,11144,11152,11159,11167,11174,11182,11189,11197,
+ 11204,11211,11219,11226,11234,11241,11249,11257,11265,11272,
+
+ 11280,11288,11295,11303,11311,11319,11326,11334,11341,11349,
+ 11356,11364,11371,11379,11386,11394,11402,11410,11417,11425,
+ 11433,11441,11449,11456,11464,11472,11480,11488,11496,11505,
+ 11514,11522,11530,11538,11545,11553,11560,11568,11576,11584,
+ 11592,11600,11608,11616,11624,11631,11639,11647,11654,11662,
+ 11669,11677,11685,11693,11700,11707,11715,11722,11730,11737,
+ 11744,11752,11759,11767,11774,11782,11790,11798,11805,11813,
+ 11821,11829,11837,11846,11855,11863,11871,11878,11885,11893,
+ 11901,11908,11916,11923,11931,11938,11946,11953,11961,11968,
+ 11976,11984,11991,11998,12006,12013,12021,12028,12035,12042,
+
+ 12050,12057,12065,12073,12081,12089,12097,12105,12113,12121,
+ 12130,12139,12147,12155,12162,12170,12178,12185,12193,12200,
+ 12208,12216,12224,12231,12239,12246,12254,12262,12269,12276,
+ 12284,12292,12300,12307,12314,12322,12330,12338,12346,12354,
+ 12362,12370,12378,12386,12395,12404,12412,12419,12426,12434,
+ 12441,12449,12456,12464,12471,12479,12486,12493,12500,12508,
+ 12515,12522,12529,12538,12547,12556,12565,12574,12583
} ;
-static yyconst flex_int16_t yy_def[3816] =
+static yyconst flex_int16_t yy_def[3970] =
{ 0,
- 3323, 3323, 3324, 3324, 3324, 3324, 3325, 3325, 3326, 3326,
- 3327, 3327, 3328, 3328, 3328, 3328, 3329, 3329, 3323, 3323,
- 3330, 3330, 3331, 3331, 3331, 3331, 3323, 3323, 3331, 3331,
- 3331, 3331, 3323, 3323, 3331, 3331, 3323, 3323, 3331, 3331,
- 3331, 3331, 3332, 3332, 3333, 3333, 3323, 3323, 3333, 3333,
- 3333, 3333, 3334, 3334, 3328, 3328, 3335, 3335, 3336, 3336,
- 3337, 3337, 3338, 3338, 3339, 3339, 3340, 3340, 3340, 3340,
- 3323, 3323, 3340, 3340, 3340, 3340, 3323, 3323, 3340, 3340,
- 3340, 3340, 3323, 3323, 3340, 3340, 3323, 3323, 3340, 3340,
- 3340, 3340, 3323, 3323, 3340, 3340, 3323, 3323, 3340, 3340,
-
- 3340, 3340, 3341, 3341, 3342, 3342, 3323, 3323, 3342, 3342,
- 3342, 3342, 3343, 3343, 3344, 3344, 3323, 3323, 3344, 3344,
- 3344, 3344, 3345, 3345, 3346, 3346, 3347, 3347, 3348, 3348,
- 3349, 3349, 3350, 3350, 3323, 3323, 3350, 3350, 3350, 3350,
- 3351, 3351, 3352, 3352, 3353, 3353, 3354, 3354, 3322, 149,
- 3355, 3355, 3323, 3323, 3355, 3355, 3355, 3355, 3356, 3356,
- 3357, 3357, 3358, 3358, 3359, 3359, 3360, 3360, 3361, 3361,
- 3362, 3362, 3363, 3363, 3364, 3364, 3365, 3365, 3323, 3323,
- 3365, 3365, 3365, 3365, 3366, 3366, 3367, 3367, 3323, 3323,
- 3367, 3367, 3367, 3367, 3368, 3368, 3369, 3369, 3323, 3323,
-
- 3369, 3369, 3369, 3369, 3370, 3370, 3371, 3371, 3372, 3372,
- 3373, 3373, 3323, 3323, 3373, 3373, 3373, 3373, 3374, 3374,
- 3375, 3375, 3323, 3323, 3375, 3375, 3375, 3375, 3376, 3376,
- 3377, 3377, 3323, 3323, 3377, 3377, 3377, 3377, 3378, 3378,
- 3379, 3379, 3380, 3380, 3381, 3381, 3323, 3323, 3381, 3381,
- 3381, 3381, 3382, 3382, 3383, 3383, 3323, 3323, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3384,
- 3322, 3322, 3384, 3322, 3322, 3322, 296, 296, 298, 296,
-
- 299, 299, 3322, 3322, 3322, 3385, 3322, 3322, 3385, 3322,
- 3322, 300, 299, 3322, 3322, 3322, 3386, 3322, 3322, 3386,
- 3386, 3386, 3322, 3322, 3322, 3322, 3322, 3387, 3322, 3322,
- 3387, 3387, 3387, 3387, 3387, 3322, 3322, 3322, 3322, 3322,
- 3322, 3388, 3322, 3322, 3388, 3388, 3388, 3322, 3322, 3322,
- 3322, 3322, 3322, 3389, 3322, 3322, 3389, 3389, 3322, 3322,
- 3322, 361, 299, 299, 300, 365, 364, 364, 364, 364,
- 365, 371, 369, 369, 3322, 3322, 3322, 3390, 3322, 3322,
- 3390, 3390, 3390, 3390, 3322, 3322, 299, 299, 3322, 3322,
- 3322, 3391, 3322, 3322, 3391, 3391, 3391, 3322, 3322, 299,
-
- 299, 3322, 3322, 3322, 3392, 3322, 3322, 3392, 3392, 3322,
- 3322, 3322, 3322, 3322, 3322, 3393, 3322, 3322, 3393, 3393,
- 3322, 3322, 3322, 3322, 3322, 3322, 3394, 3322, 3322, 3394,
- 3394, 3394, 3394, 3394, 3322, 3322, 299, 299, 299, 3322,
- 3322, 3322, 3395, 3322, 3322, 3395, 3322, 3322, 3322, 3322,
- 3322, 3322, 3396, 3322, 3322, 3396, 3396, 3396, 3322, 3322,
- 3322, 3322, 3322, 3322, 3397, 3322, 3322, 3397, 3397, 3397,
- 3397, 3397, 3397, 3397, 3397, 3322, 3322, 299, 299, 3322,
- 3322, 3322, 3398, 3322, 3322, 3398, 3398, 3398, 3398, 3398,
- 3398, 3322, 3322, 3322, 3322, 3322, 3322, 3399, 3322, 3322,
-
- 3399, 3399, 3399, 3399, 3399, 3399, 3399, 3322, 3322, 3322,
- 3322, 3322, 3322, 3400, 3322, 3322, 3400, 3400, 3322, 3322,
- 3322, 3322, 3322, 3322, 3401, 3322, 3322, 3401, 3401, 3401,
- 3322, 3322, 3322, 3322, 3322, 3322, 3402, 3322, 3322, 3402,
- 3402, 3402, 3402, 3322, 3322, 299, 299, 3322, 3322, 3322,
- 3403, 3322, 3322, 3403, 3403, 3322, 3322, 299, 369, 369,
- 3322, 3322, 3322, 3404, 3322, 3322, 3404, 3404, 3404, 3322,
- 3322, 369, 369, 3322, 3322, 3322, 3405, 3322, 3322, 3405,
- 3405, 3322, 3322, 3322, 3322, 3322, 3322, 3406, 3322, 3322,
- 3406, 3406, 3322, 3322, 369, 369, 3322, 3322, 3322, 3407,
-
- 3322, 3322, 3407, 3407, 3407, 3322, 3322, 369, 369, 3322,
- 3322, 3322, 3408, 3322, 3322, 3408, 3408, 3408, 3408, 3408,
- 3322, 3322, 299, 438, 299, 3322, 3322, 3322, 3409, 3322,
- 3322, 3409, 3322, 3322, 3322, 3322, 3322, 3322, 3410, 3322,
- 3322, 3410, 3322, 3322, 299, 299, 3322, 3322, 3322, 3411,
- 3322, 3322, 3411, 3411, 3322, 3322, 3322, 3322, 3412, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3413, 3413, 3414, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3415, 3415, 3416, 3322, 3417, 3417, 3417, 3417, 3322,
- 3418, 3322, 3322, 3419, 3419, 3419, 3419, 3419, 3419, 3419,
- 3419, 3419, 3420, 3322, 3421, 3421, 3421, 3421, 3422, 3322,
- 3423, 3423, 3423, 3424, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3425, 3425, 3425, 3425, 3425, 3426, 3322,
- 3427, 3427, 3427, 3427, 3428, 3322, 3429, 3429, 3429, 3430,
- 3322, 3431, 3431, 3431, 3432, 3322, 3433, 3433, 3433, 3433,
- 3433, 3433, 3433, 3434, 3322, 3322, 3435, 3435, 3436, 3322,
- 3437, 3437, 3437, 3437, 3438, 3322, 3439, 3439, 3439, 3439,
-
- 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439, 3439,
- 3439, 3439, 3440, 3322, 3441, 3441, 3441, 3441, 3441, 3441,
- 3441, 3441, 3442, 3322, 3443, 3443, 3443, 3443, 3443, 3443,
- 3443, 3443, 3444, 3322, 3445, 3445, 3445, 3446, 3322, 3447,
- 3447, 3447, 3447, 3448, 3322, 3449, 3449, 3449, 3449, 3449,
- 3449, 3450, 3322, 3451, 3451, 3451, 3451, 3452, 3322, 3322,
- 3453, 3453, 3453, 3453, 3453, 3454, 3322, 3455, 3455, 3455,
- 3456, 3322, 3457, 3457, 3457, 3458, 3322, 3459, 3459, 3459,
- 3459, 3460, 3322, 3461, 3461, 3461, 3461, 3461, 3461, 3462,
- 3322, 3322, 3463, 3463, 3464, 3322, 3465, 3465, 3466, 3322,
-
- 3467, 3467, 3467, 3468, 3469, 3322, 3469, 3322, 3322, 3322,
- 3470, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3471, 3472,
- 3472, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3473, 3474, 3474, 3475, 3322, 3322, 3475, 3322, 3476, 3476,
- 3322, 3477, 3322, 3322, 3477, 3477, 3477, 3477, 3477, 3477,
- 3478, 3478, 3479, 3479, 3479, 3480, 3480, 3322, 3322, 3481,
- 3482, 3482, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3483, 3322, 3322, 3483,
-
- 3483, 3484, 3484, 3485, 3322, 3322, 3485, 3486, 3486, 3487,
- 3487, 3488, 3488, 3489, 3489, 3490, 3490, 3491, 3491, 3491,
- 3322, 3322, 3491, 3491, 3491, 3492, 3492, 3322, 3322, 3493,
- 3494, 3494, 3495, 3322, 3322, 3322, 3322, 3496, 3496, 3497,
- 3497, 3322, 3322, 3497, 3322, 3322, 3497, 3497, 3497, 3497,
- 3497, 3497, 3497, 3497, 3497, 3497, 3498, 3498, 3322, 3322,
- 3322, 3322, 3499, 3499, 3499, 3499, 3499, 3500, 3500, 3501,
- 3501, 3501, 3322, 3322, 3501, 3501, 3501, 3502, 3502, 3503,
- 3322, 3322, 3504, 3504, 3505, 3322, 3322, 3505, 3506, 3506,
- 3507, 3322, 3322, 3507, 3507, 3507, 3508, 3508, 3509, 3509,
-
- 3509, 3510, 3510, 3322, 3511, 3511, 3511, 3511, 3512, 3512,
- 3513, 3322, 3322, 3514, 3514, 3515, 3515, 3516, 3516, 3517,
- 3517, 3517, 3518, 3518, 3519, 3519, 3519, 3519, 3519, 3520,
- 3520, 3322, 3521, 3522, 3522, 3322, 3322, 3523, 3523, 3322,
- 3322, 3524, 3525, 3525, 3526, 3322, 3322, 3526, 3322, 3322,
- 3527, 3322, 3322, 3322, 3322, 3322, 3322, 3528, 3322, 3529,
- 3322, 3529, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3530, 3322, 3531, 3322, 3531, 3532, 3322, 3322,
-
- 3322, 3532, 3322, 3322, 3533, 3322, 3533, 3534, 3322, 3322,
- 3322, 3322, 3322, 3534, 3322, 3322, 3534, 3534, 3534, 3322,
- 3535, 3322, 3535, 3536, 3536, 3536, 3322, 3537, 3322, 3537,
- 3322, 3322, 3322, 3538, 3322, 3539, 3322, 3539, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3540, 3322, 3322, 3322, 3540, 3540, 3322, 3541, 3322,
- 3541, 3542, 3322, 3322, 3322, 3542, 3322, 3543, 3322, 3543,
- 3544, 3544, 3322, 3545, 3322, 3545, 3546, 3546, 3322, 3547,
- 3322, 3547, 3548, 3548, 3548, 3322, 3322, 3322, 3548, 3548,
- 3548, 3322, 3549, 3322, 3549, 3322, 3322, 3550, 3322, 3551,
-
- 3322, 3551, 3552, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3553, 3322, 3553, 3554, 3554, 3554, 3554, 3322, 3322, 3322,
- 3554, 3322, 3322, 3322, 3322, 3322, 3554, 3554, 3554, 3554,
- 3554, 3554, 3554, 3554, 3554, 3322, 3555, 3322, 3555, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3556, 3556, 3556,
- 3556, 3322, 3557, 3322, 3557, 3558, 3558, 3558, 3558, 3322,
- 3322, 3322, 3322, 3322, 3558, 3558, 3322, 3559, 3322, 3559,
- 3560, 3322, 3322, 3322, 3322, 3561, 3322, 3561, 3562, 3322,
- 3322, 3322, 3562, 3322, 3563, 3322, 3563, 3564, 3322, 3322,
- 3322, 3564, 3564, 3564, 3322, 3565, 3322, 3565, 3322, 3322,
-
- 3322, 3322, 3566, 3322, 3567, 3322, 3567, 3322, 3322, 3322,
- 3568, 3568, 3322, 3322, 3568, 3322, 3569, 3322, 3569, 3570,
- 3322, 3322, 3322, 3322, 3571, 3322, 3571, 3322, 3322, 3322,
- 3322, 3322, 3572, 3322, 3572, 3322, 3322, 3573, 3573, 3322,
- 3322, 3322, 3574, 3322, 3574, 3575, 3575, 3575, 3575, 3575,
- 3322, 3576, 3322, 3576, 3322, 3577, 3322, 3578, 3322, 3578,
- 3322, 3322, 3322, 3322, 3579, 3322, 3579, 3322, 3322, 3322,
- 3580, 3322, 3581, 3322, 3581, 3582, 3583, 3322, 3322, 3322,
- 3322, 3322, 3584, 3585, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3586, 3322, 3322, 3587, 3322,
- 3588, 3589, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3589, 3322, 3322, 3589, 3590, 3591, 3322, 3322, 3591, 3592,
- 3593, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3594, 3594, 3322, 3322,
- 3595, 3596, 3596, 3597, 3322, 3322, 3598, 3599, 3322, 3322,
- 3600, 3601, 3602, 3602, 3322, 3322, 3602, 3602, 3602, 3603,
- 3322, 3322, 3322, 3322, 3604, 3322, 3322, 3605, 3606, 3606,
- 3606, 3606, 3322, 3322, 3322, 3322, 3322, 3606, 3606, 3606,
-
- 3606, 3606, 3606, 3606, 3606, 3606, 3607, 3322, 3322, 3322,
- 3608, 3608, 3608, 3608, 3609, 3610, 3610, 3610, 3610, 3322,
- 3322, 3322, 3610, 3610, 3611, 3612, 3613, 3614, 3614, 3615,
- 3616, 3616, 3616, 3616, 3617, 3322, 3322, 3322, 3322, 3322,
- 3322, 3618, 3619, 3322, 3322, 3322, 3322, 3620, 3620, 3322,
- 3322, 3322, 3620, 3621, 3622, 3623, 3322, 3322, 3322, 3322,
- 3322, 3322, 3624, 3322, 3322, 3322, 3625, 3625, 3322, 3322,
- 3322, 3626, 3627, 3322, 3322, 3627, 3627, 3627, 3628, 3322,
- 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3635, 3322, 3635,
- 3322, 3322, 3322, 3636, 3637, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3638, 3322,
- 3322, 3322, 3639, 3322, 3640, 3641, 3322, 3322, 3322, 3641,
- 3322, 3322, 3322, 3641, 3642, 3643, 3322, 3322, 3322, 3322,
- 3322, 3644, 3645, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3646, 3322, 3322, 3322,
- 3322, 3322, 3647, 3648, 3648, 3649, 3322, 3322, 3322, 3650,
- 3651, 3322, 3322, 3322, 3652, 3653, 3654, 3654, 3322, 3322,
- 3322, 3322, 3322, 3654, 3322, 3322, 3654, 3655, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3656, 3657,
- 3322, 3322, 3657, 3657, 3322, 3322, 3322, 3657, 3657, 3322,
- 3322, 3657, 3657, 3657, 3657, 3657, 3657, 3658, 3322, 3322,
- 3659, 3659, 3659, 3660, 3661, 3322, 3322, 3661, 3661, 3322,
- 3322, 3661, 3662, 3663, 3664, 3665, 3665, 3666, 3667, 3667,
- 3667, 3322, 3322, 3667, 3668, 3669, 3670, 3322, 3671, 3671,
- 3671, 3672, 3673, 3674, 3675, 3676, 3676, 3677, 3678, 3322,
- 3322, 3322, 3678, 3678, 3678, 3679, 3322, 3322, 3322, 3680,
- 3681, 3322, 3322, 3682, 3683, 3684, 3684, 3322, 3322, 3685,
- 3686, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3687,
- 3688, 3322, 3689, 3690, 3690, 3690, 3691, 3692, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3693,
- 3694, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3695, 3322, 3322, 3322, 3696, 3697, 3322, 3322, 3698, 3699,
- 3700, 3322, 3322, 3701, 3702, 3702, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3702, 3322, 3322, 3322, 3322, 3703,
- 3704, 3322, 3322, 3322, 3322, 3322, 3704, 3704, 3704, 3322,
- 3322, 3322, 3322, 3322, 3704, 3704, 3704, 3704, 3322, 3322,
-
- 3705, 3322, 3322, 3322, 3322, 3322, 3706, 3322, 3322, 3707,
- 3708, 3322, 3322, 3322, 3322, 3322, 3708, 3322, 3322, 3322,
- 3708, 3322, 3322, 3709, 3710, 3711, 3711, 3712, 3713, 3713,
- 3713, 3322, 3322, 3322, 3713, 3322, 3322, 3714, 3715, 3322,
- 3322, 3322, 3322, 3322, 3716, 3717, 3718, 3719, 3720, 3322,
- 3322, 3322, 3322, 3721, 3722, 3722, 3722, 3722, 3723, 3322,
- 3322, 3322, 3322, 3724, 3725, 3322, 3322, 3322, 3322, 3322,
- 3726, 3727, 3727, 3322, 3322, 3322, 3728, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3729, 3730, 3322, 3322, 3322, 3731, 3322, 3322,
- 3731, 3732, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3733, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3734, 3735, 3322, 3322,
- 3736, 3322, 3322, 3322, 3737, 3738, 3322, 3322, 3322, 3322,
- 3322, 3739, 3740, 3740, 3322, 3322, 3322, 3322, 3322, 3740,
- 3322, 3741, 3742, 3322, 3322, 3322, 3742, 3742, 3742, 3322,
- 3322, 3322, 3322, 3322, 3742, 3742, 3742, 3322, 3322, 3322,
- 3743, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3744,
- 3745, 3322, 3322, 3322, 3745, 3745, 3746, 3747, 3748, 3322,
-
- 3322, 3749, 3750, 3322, 3322, 3750, 3750, 3322, 3322, 3750,
- 3751, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3752, 3753, 3754, 3755, 3756, 3322, 3322, 3322, 3322, 3322,
- 3322, 3757, 3758, 3758, 3758, 3758, 3759, 3322, 3760, 3761,
- 3762, 3763, 3763, 3322, 3322, 3322, 3322, 3764, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3765,
- 3766, 3322, 3767, 3322, 3322, 3322, 3767, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3768, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3769, 3770, 3322, 3322,
- 3322, 3771, 3772, 3773, 3774, 3775, 3775, 3322, 3322, 3322,
- 3322, 3775, 3322, 3776, 3777, 3777, 3777, 3777, 3322, 3322,
- 3322, 3777, 3777, 3777, 3778, 3322, 3322, 3322, 3779, 3780,
- 3780, 3780, 3781, 3322, 3322, 3782, 3322, 3322, 3322, 3783,
- 3784, 3322, 3322, 3322, 3784, 3784, 3322, 3322, 3322, 3322,
- 3784, 3785, 3322, 3786, 3787, 3788, 3789, 3790, 3791, 3322,
- 3322, 3792, 3792, 3792, 3793, 3322, 3794, 3322, 3322, 3795,
- 3796, 3796, 3322, 3797, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3798, 3322, 3322,
-
- 3799, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3800, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3801, 3802, 3803,
- 3322, 3322, 3322, 3322, 3804, 3805, 3805, 3322, 3322, 3322,
- 3322, 3805, 3322, 3806, 3807, 3807, 3807, 3807, 3807, 3322,
- 3322, 3807, 3807, 3322, 3322, 3322, 3322, 3808, 3808, 3808,
- 3809, 3322, 3322, 3783, 3322, 3322, 3784, 3784, 3784, 3322,
- 3322, 3322, 3322, 3784, 3785, 3322, 3786, 3322, 3322, 3322,
- 3322, 3789, 3790, 3791, 3322, 3322, 3322, 3322, 3322, 3792,
- 3792, 3322, 3322, 3322, 3794, 3795, 3796, 3796, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3798, 3322, 3322, 3322,
- 3799, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3800, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3801, 3802,
- 3803, 3322, 3322, 3322, 3322, 3322, 3805, 3805, 3322, 3322,
- 3322, 3322, 3806, 3807, 3807, 3807, 3807, 3807, 3322, 3322,
- 3322, 3807, 3322, 3322, 3808, 3808, 3322, 3322, 3809, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3784, 3784, 3784,
- 3322, 3322, 3322, 3322, 3785, 3786, 3322, 3322, 3322, 3322,
- 3322, 3790, 3791, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3795, 3796, 3796, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3799, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3800,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3801, 3802, 3803, 3805, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3807, 3807, 3807, 3322,
- 3322, 3807, 3807, 3322, 3322, 3322, 3808, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3784, 3784, 3784, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3790, 3791, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3796,
-
- 3796, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3799, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3800, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3802, 3322, 3322, 3322, 3322, 3805,
- 3322, 3322, 3322, 3807, 3807, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3807, 3808, 3322, 3322, 3322, 3322, 3322, 3322,
- 3784, 3322, 3322, 3784, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3790, 3791, 3322, 3322,
- 3322, 3322, 3795, 3796, 3796, 3796, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3800, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3802, 3322, 3322, 3322,
- 3322, 3322, 3322, 3805, 3807, 3807, 3322, 3322, 3322, 3322,
- 3322, 3322, 3807, 3808, 3784, 3322, 3322, 3322, 3784, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3791, 3322, 3322, 3322, 3322,
- 3795, 3796, 3796, 3796, 3810, 3811, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3800, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3805, 3807,
- 3807, 3322, 3322, 3808, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3791, 3322, 3322, 3322, 3322, 3795, 3796, 3812, 3813, 3810,
- 3811, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3805, 3807, 3807, 3322, 3322, 3322, 3808,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3795, 3812, 3796, 3814, 3813, 3815,
- 3796, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3805, 3807, 3807, 3322, 3322,
- 3322, 3322, 3808, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3795, 3814, 3322, 3815, 3796, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3795, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3795, 3795, 3322, 3322,
- 3322, 3322, 3322, 3322, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
-
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3322, 0, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322
+ 3458, 3458, 3459, 3459, 3459, 3459, 3460, 3460, 3461, 3461,
+ 3462, 3462, 3463, 3463, 3463, 3463, 3464, 3464, 3458, 3458,
+ 3465, 3465, 3466, 3466, 3466, 3466, 3458, 3458, 3466, 3466,
+ 3466, 3466, 3458, 3458, 3466, 3466, 3458, 3458, 3466, 3466,
+ 3466, 3466, 3467, 3467, 3468, 3468, 3458, 3458, 3468, 3468,
+ 3468, 3468, 3469, 3469, 3463, 3463, 3470, 3470, 3471, 3471,
+ 3472, 3472, 3473, 3473, 3474, 3474, 3475, 3475, 3475, 3475,
+ 3458, 3458, 3475, 3475, 3475, 3475, 3458, 3458, 3475, 3475,
+ 3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475,
+ 3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475,
+
+ 3475, 3475, 3476, 3476, 3477, 3477, 3458, 3458, 3477, 3477,
+ 3477, 3477, 3478, 3478, 3479, 3479, 3458, 3458, 3479, 3479,
+ 3479, 3479, 3480, 3480, 3481, 3481, 3482, 3482, 3483, 3483,
+ 3484, 3484, 3485, 3485, 3458, 3458, 3485, 3485, 3485, 3485,
+ 3486, 3486, 3487, 3487, 3488, 3488, 3489, 3489, 3457, 149,
+ 3490, 3490, 3458, 3458, 3490, 3490, 3490, 3490, 3491, 3491,
+ 3492, 3492, 3493, 3493, 3494, 3494, 3495, 3495, 3496, 3496,
+ 3497, 3497, 3498, 3498, 3499, 3499, 3500, 3500, 3458, 3458,
+ 3500, 3500, 3500, 3500, 3501, 3501, 3502, 3502, 3458, 3458,
+ 3502, 3502, 3502, 3502, 3503, 3503, 3504, 3504, 3458, 3458,
+
+ 3504, 3504, 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507,
+ 3508, 3508, 3458, 3458, 3508, 3508, 3508, 3508, 3509, 3509,
+ 3510, 3510, 3458, 3458, 3510, 3510, 3510, 3510, 3511, 3511,
+ 3512, 3512, 3458, 3458, 3512, 3512, 3512, 3512, 3513, 3513,
+ 3514, 3514, 3515, 3515, 3516, 3516, 3458, 3458, 3516, 3516,
+ 3516, 3516, 3517, 3517, 3518, 3518, 3519, 3519, 3520, 3520,
+ 3458, 3458, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3521, 3457, 3457, 3521, 3457, 3457, 3457,
+
+ 300, 300, 302, 300, 303, 303, 3457, 3457, 3457, 3522,
+ 3457, 3457, 3522, 3457, 3457, 304, 303, 3457, 3457, 3457,
+ 3523, 3457, 3457, 3523, 3523, 3523, 3457, 3457, 3457, 3457,
+ 3457, 3524, 3457, 3457, 3524, 3524, 3524, 3524, 3524, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3525, 3457, 3457, 3525, 3525,
+ 3525, 3457, 3457, 3457, 3457, 3457, 3457, 3526, 3457, 3457,
+ 3526, 3526, 3457, 3457, 3457, 365, 303, 303, 304, 369,
+ 368, 368, 368, 368, 369, 375, 373, 373, 3457, 3457,
+ 3457, 3527, 3457, 3457, 3527, 3527, 3527, 3527, 3457, 3457,
+ 303, 303, 303, 3457, 3457, 3457, 3528, 3457, 3457, 3528,
+
+ 3528, 3528, 3457, 3457, 303, 303, 3457, 3457, 3457, 3529,
+ 3457, 3457, 3529, 3529, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3530, 3457, 3457, 3530, 3530, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3531, 3457, 3457, 3531, 3531, 3531, 3531, 3531, 3457,
+ 3457, 392, 392, 303, 3457, 3457, 3457, 3532, 3457, 3457,
+ 3532, 3457, 3457, 3457, 3457, 3457, 3457, 3533, 3457, 3457,
+ 3533, 3533, 3533, 3457, 3457, 3457, 3457, 3457, 3457, 3534,
+ 3457, 3457, 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3534,
+ 3534, 3457, 3457, 303, 303, 3457, 3457, 3457, 3535, 3457,
+ 3457, 3535, 3535, 3535, 3535, 3535, 3535, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3536, 3457, 3457, 3536, 3536, 3536, 3536,
+ 3536, 3536, 3536, 3457, 3457, 3457, 3457, 3457, 3457, 3537,
+ 3457, 3457, 3537, 3537, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3538, 3457, 3457, 3538, 3538, 3538, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3539, 3457, 3457, 3539, 3539, 3539, 3539, 3457,
+ 3457, 303, 303, 3457, 3457, 3457, 3540, 3457, 3457, 3540,
+ 3540, 3457, 3457, 303, 373, 373, 3457, 3457, 3457, 3541,
+ 3457, 3457, 3541, 3541, 3541, 3457, 3457, 373, 373, 3457,
+ 3457, 3457, 3542, 3457, 3457, 3542, 3542, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3543, 3457, 3457, 3543, 3543, 3457, 3457,
+
+ 373, 373, 3457, 3457, 3457, 3544, 3457, 3457, 3544, 3544,
+ 3544, 3457, 3457, 373, 373, 3457, 3457, 3457, 3545, 3457,
+ 3457, 3545, 3545, 3545, 3545, 3545, 3457, 3457, 303, 392,
+ 303, 3457, 3457, 3457, 3546, 3457, 3457, 3546, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3547, 3457, 3457, 3547, 3457, 3457,
+ 303, 303, 3457, 3457, 3457, 3548, 3457, 3457, 3548, 3548,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3549, 3457, 3457, 3549,
+ 3549, 3457, 3457, 3457, 3457, 3550, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3551, 3551, 3552, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3553, 3553,
+ 3554, 3457, 3555, 3555, 3555, 3555, 3457, 3556, 3457, 3457,
+ 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3558,
+ 3457, 3559, 3559, 3559, 3559, 3560, 3457, 3561, 3561, 3561,
+ 3562, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3563, 3563, 3563, 3563, 3563, 3564, 3457, 3457, 3565, 3565,
+ 3565, 3565, 3566, 3457, 3567, 3567, 3567, 3568, 3457, 3569,
+ 3569, 3569, 3570, 3457, 3571, 3571, 3571, 3571, 3571, 3571,
+
+ 3571, 3572, 3457, 3457, 3573, 3573, 3574, 3457, 3575, 3575,
+ 3575, 3575, 3576, 3457, 3577, 3577, 3577, 3577, 3577, 3577,
+ 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577,
+ 3577, 3578, 3457, 3579, 3579, 3579, 3579, 3579, 3579, 3579,
+ 3579, 3580, 3457, 3581, 3581, 3581, 3581, 3581, 3581, 3581,
+ 3581, 3582, 3457, 3583, 3583, 3583, 3584, 3457, 3585, 3585,
+ 3585, 3585, 3586, 3457, 3587, 3587, 3587, 3587, 3587, 3587,
+ 3588, 3457, 3589, 3589, 3589, 3589, 3590, 3457, 3457, 3591,
+ 3591, 3591, 3591, 3591, 3592, 3457, 3593, 3593, 3593, 3594,
+ 3457, 3595, 3595, 3595, 3596, 3457, 3597, 3597, 3597, 3597,
+
+ 3598, 3457, 3599, 3599, 3599, 3599, 3599, 3599, 3600, 3457,
+ 3457, 3601, 3601, 3602, 3457, 3603, 3603, 3604, 3457, 3605,
+ 3605, 3605, 3606, 3457, 3607, 3607, 3607, 3608, 3609, 3457,
+ 3609, 3457, 3457, 3457, 3610, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3611, 3612, 3612, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3613, 3614, 3614, 3615, 3457, 3457,
+ 3615, 3457, 3616, 3616, 3457, 3617, 3457, 3457, 3617, 3617,
+ 3617, 3617, 3617, 3617, 3618, 3618, 3619, 3619, 3619, 3620,
+
+ 3620, 3457, 3457, 3621, 3622, 3622, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3623, 3457, 3457, 3623, 3623, 3624, 3624, 3457, 3625, 3457,
+ 3457, 3625, 3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629,
+ 3630, 3630, 3631, 3631, 3631, 3457, 3457, 3631, 3631, 3631,
+ 3632, 3632, 3457, 3457, 3633, 3634, 3634, 3635, 3457, 3457,
+ 3457, 3457, 3636, 3636, 3637, 3637, 3457, 3457, 3637, 3457,
+ 3457, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637,
+ 3637, 3637, 3638, 3638, 3457, 3457, 3457, 3457, 3639, 3639,
+ 3639, 3639, 3639, 3640, 3640, 3641, 3641, 3641, 3457, 3457,
+
+ 3641, 3641, 3641, 3642, 3642, 3643, 3457, 3457, 3644, 3644,
+ 3645, 3457, 3457, 3645, 3646, 3646, 3647, 3457, 3457, 3647,
+ 3647, 3647, 3648, 3648, 3649, 3649, 3649, 3650, 3650, 3457,
+ 3651, 3651, 3651, 3651, 3652, 3652, 3653, 3457, 3457, 3654,
+ 3654, 3655, 3655, 3656, 3656, 3657, 3657, 3657, 3658, 3658,
+ 3659, 3659, 3659, 3659, 3659, 3660, 3660, 3457, 3661, 3662,
+ 3662, 3457, 3457, 3663, 3663, 3457, 3457, 3664, 3665, 3665,
+ 3457, 3457, 3666, 3667, 3667, 3668, 3457, 3457, 3668, 3457,
+ 3457, 3669, 3457, 3457, 3457, 3457, 3457, 3457, 3670, 3457,
+ 3671, 3457, 3671, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3672, 3457, 3673, 3457, 3673, 3674,
+ 3457, 3457, 3457, 3674, 3457, 3457, 3675, 3457, 3675, 3676,
+ 3457, 3457, 3457, 3457, 3457, 3676, 3457, 3457, 3676, 3676,
+ 3676, 3457, 3677, 3457, 3677, 3678, 3678, 3678, 3457, 3679,
+ 3457, 3679, 3457, 3457, 3457, 3680, 3457, 3681, 3457, 3681,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3682, 3457, 3457, 3457, 3682, 3682, 3457,
+ 3683, 3457, 3683, 3457, 3684, 3457, 3457, 3457, 3684, 3457,
+
+ 3685, 3457, 3685, 3686, 3686, 3457, 3687, 3457, 3687, 3688,
+ 3688, 3457, 3689, 3457, 3689, 3690, 3690, 3690, 3457, 3457,
+ 3457, 3690, 3690, 3690, 3457, 3691, 3457, 3691, 3457, 3457,
+ 3692, 3457, 3693, 3457, 3693, 3694, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3695, 3457, 3695, 3696, 3696, 3696, 3696,
+ 3457, 3457, 3457, 3696, 3457, 3457, 3457, 3457, 3457, 3696,
+ 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3457,
+ 3697, 3457, 3697, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3698, 3698, 3698, 3698, 3457, 3699, 3457, 3699, 3700,
+ 3700, 3700, 3700, 3457, 3457, 3457, 3457, 3457, 3700, 3700,
+
+ 3457, 3701, 3457, 3701, 3702, 3457, 3457, 3457, 3457, 3703,
+ 3457, 3703, 3704, 3457, 3457, 3457, 3704, 3457, 3705, 3457,
+ 3705, 3706, 3457, 3457, 3457, 3706, 3706, 3706, 3457, 3707,
+ 3457, 3707, 3457, 3457, 3457, 3457, 3708, 3457, 3709, 3457,
+ 3709, 3457, 3457, 3457, 3710, 3710, 3457, 3457, 3710, 3457,
+ 3711, 3457, 3711, 3712, 3457, 3457, 3457, 3457, 3713, 3457,
+ 3713, 3457, 3457, 3457, 3457, 3457, 3714, 3457, 3714, 3457,
+ 3457, 3715, 3715, 3457, 3457, 3457, 3716, 3457, 3716, 3717,
+ 3717, 3717, 3717, 3717, 3457, 3718, 3457, 3718, 3457, 3719,
+ 3457, 3720, 3457, 3720, 3457, 3457, 3457, 3457, 3721, 3457,
+
+ 3721, 3457, 3457, 3457, 3722, 3457, 3723, 3457, 3723, 3457,
+ 3457, 3457, 3724, 3457, 3725, 3457, 3725, 3726, 3727, 3457,
+ 3457, 3457, 3457, 3457, 3728, 3729, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3730, 3457,
+ 3457, 3731, 3457, 3732, 3733, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3733, 3457, 3457, 3733, 3734, 3735, 3457,
+ 3457, 3735, 3736, 3737, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3738,
+
+ 3738, 3457, 3457, 3739, 3457, 3740, 3740, 3741, 3457, 3457,
+ 3742, 3743, 3457, 3457, 3744, 3745, 3746, 3746, 3457, 3457,
+ 3746, 3746, 3746, 3747, 3457, 3457, 3457, 3457, 3748, 3457,
+ 3457, 3749, 3750, 3750, 3750, 3750, 3457, 3457, 3457, 3457,
+ 3457, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750,
+ 3750, 3750, 3751, 3457, 3457, 3457, 3752, 3752, 3752, 3752,
+ 3753, 3754, 3754, 3754, 3754, 3457, 3457, 3457, 3754, 3754,
+ 3755, 3756, 3757, 3758, 3758, 3759, 3760, 3760, 3760, 3760,
+ 3761, 3457, 3457, 3457, 3457, 3457, 3457, 3762, 3763, 3457,
+ 3457, 3457, 3457, 3764, 3764, 3457, 3457, 3457, 3764, 3765,
+
+ 3766, 3767, 3457, 3457, 3457, 3457, 3457, 3457, 3768, 3457,
+ 3457, 3457, 3769, 3769, 3457, 3457, 3457, 3770, 3771, 3457,
+ 3457, 3771, 3771, 3771, 3772, 3457, 3773, 3774, 3775, 3776,
+ 3777, 3778, 3779, 3780, 3781, 3781, 3457, 3781, 3457, 3457,
+ 3457, 3782, 3783, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3784, 3457, 3457,
+ 3457, 3785, 3457, 3786, 3787, 3457, 3457, 3457, 3787, 3457,
+ 3457, 3457, 3787, 3788, 3789, 3457, 3457, 3457, 3457, 3457,
+
+ 3790, 3791, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3792, 3457, 3457, 3457, 3457,
+ 3457, 3793, 3457, 3794, 3794, 3795, 3457, 3457, 3457, 3796,
+ 3797, 3457, 3457, 3457, 3798, 3799, 3800, 3800, 3457, 3457,
+ 3457, 3457, 3457, 3800, 3457, 3457, 3800, 3801, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3802, 3803,
+ 3457, 3457, 3803, 3803, 3457, 3457, 3457, 3803, 3803, 3457,
+ 3457, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3804,
+ 3457, 3457, 3805, 3805, 3805, 3806, 3807, 3457, 3457, 3807,
+ 3807, 3457, 3457, 3807, 3808, 3809, 3810, 3811, 3811, 3812,
+
+ 3813, 3813, 3813, 3457, 3457, 3813, 3814, 3815, 3816, 3457,
+ 3817, 3817, 3817, 3818, 3819, 3820, 3821, 3822, 3822, 3823,
+ 3824, 3457, 3457, 3457, 3824, 3824, 3824, 3825, 3457, 3457,
+ 3457, 3826, 3827, 3457, 3457, 3828, 3457, 3457, 3829, 3830,
+ 3831, 3831, 3457, 3457, 3832, 3833, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3834, 3835, 3457, 3836, 3837,
+ 3837, 3837, 3838, 3839, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3840, 3841, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3842, 3457, 3457, 3457,
+ 3843, 3457, 3844, 3457, 3457, 3845, 3846, 3847, 3457, 3457,
+ 3848, 3849, 3849, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3849, 3457, 3457, 3457, 3457, 3850, 3851, 3457, 3457,
+ 3457, 3457, 3457, 3851, 3851, 3851, 3457, 3457, 3457, 3457,
+ 3457, 3851, 3851, 3851, 3851, 3457, 3457, 3851, 3851, 3852,
+ 3457, 3457, 3457, 3457, 3457, 3853, 3457, 3457, 3854, 3855,
+ 3457, 3457, 3457, 3457, 3457, 3855, 3457, 3457, 3457, 3855,
+ 3457, 3457, 3856, 3857, 3858, 3858, 3859, 3860, 3860, 3860,
+ 3457, 3457, 3457, 3860, 3457, 3457, 3861, 3862, 3457, 3457,
+
+ 3457, 3457, 3457, 3863, 3864, 3865, 3866, 3867, 3457, 3457,
+ 3457, 3457, 3868, 3869, 3869, 3869, 3869, 3870, 3457, 3457,
+ 3457, 3457, 3871, 3872, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3873, 3874, 3875, 3875, 3457, 3457, 3457, 3876,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3877, 3878, 3457, 3457,
+ 3457, 3879, 3457, 3457, 3879, 3880, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3881, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3882, 3883, 3457, 3457, 3457, 3884, 3457, 3457, 3457, 3885,
+ 3886, 3457, 3457, 3457, 3457, 3457, 3887, 3888, 3888, 3457,
+ 3457, 3457, 3457, 3457, 3888, 3457, 3889, 3890, 3457, 3457,
+ 3457, 3890, 3890, 3890, 3457, 3457, 3457, 3457, 3457, 3890,
+ 3890, 3890, 3457, 3457, 3457, 3890, 3890, 3891, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3892, 3893, 3457, 3457,
+ 3457, 3893, 3893, 3894, 3895, 3896, 3457, 3457, 3897, 3898,
+ 3457, 3457, 3898, 3898, 3457, 3457, 3898, 3899, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3900, 3901, 3902,
+ 3903, 3904, 3457, 3457, 3457, 3457, 3457, 3457, 3905, 3906,
+
+ 3906, 3906, 3906, 3907, 3457, 3908, 3909, 3910, 3911, 3912,
+ 3912, 3457, 3457, 3457, 3457, 3913, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3914, 3915,
+ 3457, 3916, 3457, 3457, 3457, 3916, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3917, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3918, 3919, 3457, 3457, 3457,
+ 3457, 3920, 3921, 3922, 3923, 3924, 3924, 3457, 3457, 3457,
+ 3457, 3924, 3457, 3925, 3926, 3926, 3926, 3926, 3457, 3457,
+
+ 3457, 3926, 3926, 3926, 3926, 3457, 3457, 3927, 3457, 3457,
+ 3457, 3928, 3929, 3929, 3929, 3930, 3457, 3457, 3931, 3457,
+ 3457, 3457, 3932, 3933, 3457, 3457, 3457, 3933, 3933, 3457,
+ 3457, 3457, 3457, 3933, 3934, 3457, 3935, 3936, 3937, 3938,
+ 3939, 3940, 3457, 3457, 3941, 3941, 3941, 3942, 3457, 3943,
+ 3457, 3457, 3944, 3945, 3946, 3946, 3457, 3947, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3948, 3457, 3457, 3949, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457,
+ 3954, 3955, 3955, 3457, 3457, 3457, 3457, 3955, 3457, 3956,
+ 3957, 3957, 3957, 3957, 3957, 3457, 3457, 3957, 3957, 3957,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3958, 3958,
+ 3959, 3457, 3457, 3960, 3457, 3457, 3961, 3961, 3961, 3457,
+ 3457, 3457, 3457, 3961, 3962, 3457, 3963, 3457, 3457, 3457,
+ 3457, 3938, 3939, 3940, 3457, 3457, 3457, 3457, 3457, 3941,
+ 3941, 3457, 3457, 3457, 3943, 3944, 3945, 3946, 3946, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3948, 3457,
+ 3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457, 3457, 3955,
+ 3955, 3457, 3457, 3457, 3457, 3956, 3957, 3957, 3957, 3957,
+ 3957, 3457, 3457, 3457, 3957, 3457, 3457, 3957, 3457, 3457,
+ 3457, 3457, 3958, 3958, 3457, 3457, 3959, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3961, 3961, 3961, 3457, 3457,
+ 3457, 3457, 3962, 3963, 3457, 3457, 3457, 3457, 3457, 3939,
+ 3940, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3944, 3945, 3946, 3946, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3949, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3950,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3951, 3952, 3457, 3953, 3955,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3957,
+ 3457, 3457, 3957, 3957, 3457, 3457, 3457, 3957, 3457, 3457,
+ 3457, 3457, 3958, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3961, 3961, 3961, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3944, 3945, 3946, 3946, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3952, 3457, 3457, 3457, 3457, 3955, 3457, 3457, 3457,
+ 3957, 3957, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957,
+ 3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3961, 3457, 3457, 3961, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3946, 3946, 3946,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3952, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3457, 3457,
+ 3457, 3457, 3958, 3961, 3457, 3457, 3457, 3961, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945,
+ 3946, 3946, 3946, 3964, 3965, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
+ 3457, 3457, 3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945,
+ 3946, 3966, 3967, 3964, 3965, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3945, 3966, 3946, 3968, 3967, 3969, 3946, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3968, 3457, 3969,
+ 3946, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3945, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945,
+ 3945, 3945, 3945, 3945, 3945, 3457, 0, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457
} ;
-static yyconst flex_int16_t yy_nxt[12367] =
+static yyconst flex_int16_t yy_nxt[12668] =
{ 0,
- 3322, 262, 263, 262, 262, 263, 262, 262, 263, 262,
- 262, 263, 262, 267, 263, 267, 273, 264, 270, 273,
- 264, 270, 3322, 265, 3322, 271, 265, 3322, 271, 268,
- 267, 263, 267, 659, 274, 276, 277, 274, 276, 277,
- 278, 279, 704, 278, 279, 659, 268, 283, 284, 660,
- 280, 276, 277, 280, 281, 662, 278, 276, 277, 693,
- 281, 661, 278, 283, 284, 1725, 280, 263, 263, 263,
- 850, 661, 280, 263, 263, 263, 295, 263, 295, 295,
- 263, 295, 851, 286, 295, 263, 295, 680, 1733, 286,
- 734, 285, 296, 1357, 696, 296, 658, 658, 658, 1358,
-
- 297, 658, 658, 658, 658, 658, 658, 285, 287, 288,
- 263, 288, 287, 287, 287, 287, 287, 287, 287, 289,
- 287, 287, 287, 691, 287, 291, 287, 292, 287, 295,
- 263, 295, 263, 263, 263, 263, 263, 263, 692, 295,
- 263, 295, 295, 263, 295, 297, 697, 806, 298, 662,
- 807, 298, 924, 287, 287, 296, 662, 662, 296, 295,
- 263, 295, 658, 658, 658, 661, 658, 658, 658, 658,
- 658, 658, 661, 661, 3322, 299, 925, 293, 287, 288,
- 263, 288, 287, 287, 287, 287, 287, 287, 287, 289,
- 287, 287, 287, 1734, 287, 291, 287, 292, 287, 295,
-
- 263, 295, 263, 263, 263, 263, 263, 263, 667, 295,
- 263, 295, 295, 263, 295, 299, 673, 734, 300, 819,
- 984, 300, 820, 287, 287, 297, 743, 735, 297, 263,
- 263, 263, 263, 263, 263, 295, 263, 295, 295, 263,
- 295, 295, 263, 295, 985, 301, 856, 293, 301, 662,
- 668, 299, 799, 857, 299, 747, 669, 302, 295, 263,
- 295, 670, 658, 658, 658, 661, 671, 658, 658, 658,
- 658, 658, 658, 800, 302, 303, 304, 263, 304, 303,
- 303, 303, 303, 303, 303, 303, 305, 303, 303, 303,
- 721, 303, 307, 303, 308, 303, 311, 263, 311, 311,
-
- 263, 311, 263, 263, 263, 722, 263, 263, 263, 311,
- 263, 311, 312, 781, 858, 312, 1736, 782, 300, 717,
- 303, 303, 300, 718, 759, 312, 677, 719, 309, 303,
- 304, 263, 304, 303, 303, 303, 303, 303, 303, 303,
- 305, 303, 303, 303, 662, 303, 307, 303, 308, 303,
- 311, 263, 311, 311, 263, 311, 311, 263, 311, 808,
- 661, 866, 276, 277, 864, 698, 312, 278, 3322, 313,
- 697, 865, 313, 809, 303, 303, 743, 323, 699, 759,
- 692, 1740, 309, 314, 315, 263, 315, 314, 314, 314,
- 314, 314, 314, 314, 316, 314, 314, 314, 1744, 314,
-
- 318, 314, 319, 314, 1746, 662, 324, 691, 337, 263,
- 337, 337, 263, 337, 349, 263, 349, 697, 276, 277,
- 700, 661, 692, 278, 338, 710, 803, 338, 314, 314,
- 350, 696, 711, 323, 804, 912, 320, 765, 913, 321,
- 805, 661, 658, 658, 658, 1753, 322, 314, 315, 263,
- 315, 314, 314, 314, 314, 314, 314, 314, 316, 314,
- 314, 314, 324, 314, 318, 314, 319, 314, 349, 263,
- 349, 360, 263, 360, 360, 263, 360, 1754, 360, 263,
- 360, 360, 263, 360, 350, 662, 748, 361, 662, 743,
- 361, 859, 314, 314, 362, 723, 1500, 362, 1755, 697,
-
- 320, 661, 749, 321, 661, 658, 658, 658, 765, 1501,
- 322, 325, 326, 263, 326, 325, 325, 325, 325, 325,
- 325, 325, 327, 325, 325, 325, 1756, 325, 329, 325,
- 330, 325, 263, 263, 263, 263, 263, 263, 360, 263,
- 360, 784, 360, 263, 360, 360, 263, 360, 363, 1761,
- 662, 363, 662, 662, 361, 1762, 325, 325, 361, 729,
- 696, 364, 658, 658, 658, 331, 661, 332, 661, 661,
- 784, 333, 658, 658, 658, 813, 334, 335, 325, 326,
- 263, 326, 325, 325, 325, 325, 325, 325, 325, 327,
- 325, 325, 325, 696, 325, 329, 325, 330, 325, 360,
-
- 263, 360, 263, 263, 263, 263, 263, 263, 891, 360,
- 263, 360, 360, 263, 360, 364, 746, 1763, 365, 785,
- 686, 365, 743, 325, 325, 366, 739, 743, 366, 658,
- 658, 658, 331, 742, 332, 658, 658, 658, 333, 658,
- 658, 658, 1764, 334, 335, 339, 340, 263, 340, 339,
- 339, 339, 339, 339, 339, 339, 341, 339, 339, 339,
- 693, 339, 343, 339, 344, 339, 360, 263, 360, 360,
- 263, 360, 263, 263, 263, 906, 263, 263, 263, 360,
- 263, 360, 367, 1765, 1766, 367, 906, 876, 368, 750,
- 339, 339, 368, 737, 738, 364, 882, 345, 658, 658,
-
- 658, 907, 696, 346, 751, 658, 658, 658, 658, 658,
- 658, 958, 347, 339, 340, 263, 340, 339, 339, 339,
- 339, 339, 339, 339, 341, 339, 339, 339, 1767, 339,
- 343, 339, 344, 339, 360, 263, 360, 263, 263, 263,
- 263, 263, 263, 697, 360, 263, 360, 360, 263, 360,
- 364, 662, 697, 369, 1774, 924, 369, 662, 339, 339,
- 367, 662, 662, 367, 770, 345, 1775, 661, 658, 658,
- 658, 346, 984, 661, 658, 658, 658, 661, 661, 993,
- 347, 351, 352, 263, 352, 351, 351, 351, 351, 351,
- 351, 351, 353, 351, 351, 351, 925, 351, 355, 351,
-
- 356, 351, 360, 263, 360, 360, 263, 360, 263, 263,
- 263, 1780, 263, 263, 263, 360, 263, 360, 370, 662,
- 1019, 370, 662, 1020, 371, 813, 351, 351, 371, 775,
- 1785, 372, 658, 658, 658, 661, 3322, 357, 661, 658,
- 658, 658, 658, 658, 658, 1787, 358, 351, 352, 263,
- 352, 351, 351, 351, 351, 351, 351, 351, 353, 351,
- 351, 351, 984, 351, 355, 351, 356, 351, 360, 263,
- 360, 263, 263, 263, 263, 263, 263, 696, 360, 263,
- 360, 360, 263, 360, 372, 785, 993, 373, 743, 924,
- 373, 1788, 351, 351, 370, 662, 1794, 370, 360, 263,
-
- 360, 1799, 789, 357, 360, 263, 360, 658, 658, 658,
- 852, 661, 358, 994, 374, 658, 658, 658, 734, 1800,
- 374, 375, 376, 263, 376, 375, 375, 375, 375, 375,
- 375, 375, 377, 375, 375, 375, 984, 375, 379, 375,
- 380, 375, 386, 263, 386, 386, 263, 386, 263, 263,
- 263, 933, 263, 263, 263, 934, 752, 662, 387, 1028,
- 994, 387, 743, 1029, 363, 3322, 375, 375, 363, 662,
- 662, 381, 741, 661, 852, 693, 795, 382, 658, 658,
- 658, 383, 658, 658, 658, 661, 661, 384, 375, 376,
- 263, 376, 375, 375, 375, 375, 375, 375, 375, 377,
-
- 375, 375, 375, 680, 375, 379, 375, 380, 375, 386,
- 263, 386, 386, 263, 386, 386, 263, 386, 890, 386,
- 263, 386, 658, 658, 658, 387, 696, 810, 387, 1810,
- 1813, 388, 1814, 375, 375, 388, 662, 662, 381, 811,
- 812, 658, 658, 658, 382, 658, 658, 658, 383, 658,
- 658, 658, 661, 661, 384, 389, 390, 263, 390, 389,
- 389, 389, 389, 389, 389, 389, 391, 389, 389, 389,
- 696, 389, 393, 389, 394, 389, 399, 263, 399, 399,
- 263, 399, 263, 263, 263, 926, 263, 263, 263, 1146,
- 662, 1818, 400, 1476, 1819, 400, 927, 823, 363, 928,
-
- 389, 389, 363, 662, 662, 395, 661, 658, 658, 658,
- 833, 396, 658, 658, 658, 658, 658, 658, 1146, 661,
- 661, 1822, 397, 389, 390, 263, 390, 389, 389, 389,
- 389, 389, 389, 389, 391, 389, 389, 389, 1686, 389,
- 393, 389, 394, 389, 399, 263, 399, 399, 263, 399,
- 399, 263, 399, 938, 399, 263, 399, 658, 658, 658,
- 400, 662, 662, 400, 662, 1823, 401, 939, 389, 389,
- 401, 838, 1824, 395, 658, 658, 658, 661, 661, 396,
- 661, 658, 658, 658, 658, 658, 658, 658, 658, 658,
- 397, 402, 403, 263, 403, 402, 402, 402, 402, 402,
-
- 402, 402, 404, 402, 402, 402, 1825, 402, 406, 402,
- 407, 402, 411, 263, 411, 411, 263, 411, 422, 263,
- 422, 899, 422, 263, 422, 436, 263, 436, 412, 662,
- 662, 412, 662, 1826, 423, 1827, 402, 402, 423, 844,
- 866, 437, 658, 658, 658, 661, 661, 899, 661, 658,
- 658, 658, 408, 1835, 858, 1838, 1839, 409, 402, 403,
- 263, 403, 402, 402, 402, 402, 402, 402, 402, 404,
- 402, 402, 402, 743, 402, 406, 402, 407, 402, 436,
- 263, 436, 263, 263, 263, 263, 263, 263, 859, 436,
- 263, 436, 436, 263, 436, 437, 697, 1842, 438, 696,
-
- 1844, 438, 859, 402, 402, 437, 696, 662, 437, 658,
- 658, 658, 658, 658, 658, 658, 658, 658, 1846, 408,
- 658, 658, 658, 661, 409, 413, 414, 263, 414, 413,
- 413, 413, 413, 413, 413, 413, 415, 413, 413, 413,
- 1847, 413, 417, 413, 418, 413, 436, 263, 436, 436,
- 263, 436, 448, 263, 448, 943, 448, 263, 448, 460,
- 263, 460, 439, 662, 662, 439, 662, 943, 449, 939,
- 413, 413, 449, 871, 662, 461, 658, 658, 658, 661,
- 661, 990, 661, 658, 658, 658, 419, 1849, 1850, 876,
- 661, 1851, 420, 413, 414, 263, 414, 413, 413, 413,
-
- 413, 413, 413, 413, 415, 413, 413, 413, 1856, 413,
- 417, 413, 418, 413, 460, 263, 460, 477, 263, 477,
- 477, 263, 477, 1859, 263, 263, 263, 263, 263, 263,
- 461, 1512, 1860, 478, 1861, 1863, 478, 859, 413, 413,
- 363, 926, 662, 363, 1501, 697, 658, 658, 658, 658,
- 658, 658, 927, 1866, 419, 942, 1867, 882, 661, 1869,
- 420, 424, 425, 263, 425, 424, 424, 424, 424, 424,
- 424, 424, 426, 424, 424, 424, 1873, 424, 428, 424,
- 429, 424, 477, 263, 477, 477, 263, 477, 477, 263,
- 477, 1874, 477, 263, 477, 658, 658, 658, 478, 1512,
-
- 1875, 478, 1877, 1689, 479, 859, 424, 424, 479, 430,
- 662, 431, 1550, 697, 658, 658, 658, 432, 658, 658,
- 658, 658, 658, 658, 433, 890, 661, 434, 424, 425,
- 263, 425, 424, 424, 424, 424, 424, 424, 424, 426,
- 424, 424, 424, 1888, 424, 428, 424, 429, 424, 493,
- 263, 493, 493, 263, 493, 509, 263, 509, 945, 509,
- 263, 509, 891, 662, 1889, 494, 1890, 662, 494, 946,
- 895, 510, 928, 424, 424, 510, 430, 743, 431, 661,
- 658, 658, 658, 661, 432, 658, 658, 658, 658, 658,
- 658, 433, 1892, 1893, 434, 440, 441, 263, 441, 440,
-
- 440, 440, 440, 440, 440, 440, 442, 440, 440, 440,
- 1894, 440, 444, 440, 445, 440, 520, 263, 520, 520,
- 263, 520, 532, 263, 532, 943, 532, 263, 532, 545,
- 263, 545, 521, 1895, 1896, 521, 662, 1897, 533, 995,
- 440, 440, 533, 904, 1898, 546, 658, 658, 658, 658,
- 658, 658, 661, 910, 910, 910, 446, 440, 441, 263,
- 441, 440, 440, 440, 440, 440, 440, 440, 442, 440,
- 440, 440, 1899, 440, 444, 440, 445, 440, 545, 263,
- 545, 263, 263, 263, 263, 263, 263, 1900, 545, 263,
- 545, 545, 263, 545, 546, 945, 1901, 363, 935, 926,
-
- 363, 948, 440, 440, 546, 936, 946, 546, 936, 942,
- 946, 937, 911, 942, 949, 1163, 1163, 1163, 446, 450,
- 451, 263, 451, 450, 450, 450, 450, 450, 450, 450,
- 452, 450, 450, 450, 1903, 450, 454, 450, 455, 450,
- 545, 263, 545, 545, 263, 545, 557, 263, 557, 943,
- 557, 263, 557, 263, 263, 263, 547, 1904, 1146, 547,
- 948, 935, 558, 996, 450, 450, 558, 936, 936, 559,
- 456, 935, 948, 937, 949, 457, 1905, 1906, 936, 936,
- 1492, 1492, 1492, 1885, 989, 989, 1909, 458, 450, 451,
- 263, 451, 450, 450, 450, 450, 450, 450, 450, 452,
-
- 450, 450, 450, 1912, 450, 454, 450, 455, 450, 263,
- 263, 263, 557, 263, 557, 557, 263, 557, 1913, 557,
- 263, 557, 557, 263, 557, 559, 1146, 1914, 558, 1915,
- 1916, 558, 1917, 450, 450, 560, 1921, 1922, 560, 456,
- 1924, 1925, 1148, 1926, 457, 910, 910, 910, 1928, 1150,
- 1186, 1186, 1186, 1547, 1547, 1547, 458, 462, 463, 263,
- 463, 462, 462, 462, 462, 462, 462, 462, 464, 462,
- 462, 462, 465, 462, 466, 462, 467, 462, 465, 465,
- 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
- 465, 465, 465, 465, 465, 465, 465, 465, 465, 465,
-
- 465, 465, 462, 462, 465, 468, 469, 470, 465, 465,
- 465, 465, 465, 471, 465, 465, 472, 465, 465, 465,
- 473, 465, 474, 475, 465, 465, 465, 465, 465, 465,
- 465, 480, 481, 263, 481, 480, 480, 480, 480, 480,
- 480, 480, 482, 480, 480, 480, 1941, 480, 484, 480,
- 485, 480, 571, 263, 571, 571, 263, 571, 263, 263,
- 263, 1942, 263, 263, 263, 571, 263, 571, 572, 1315,
- 1943, 572, 1944, 1945, 559, 1948, 480, 480, 559, 1316,
- 486, 572, 1163, 1163, 1163, 1949, 1317, 487, 1950, 1951,
- 488, 1186, 1186, 1186, 489, 1956, 490, 491, 480, 481,
-
- 263, 481, 480, 480, 480, 480, 480, 480, 480, 482,
- 480, 480, 480, 1960, 480, 484, 480, 485, 480, 571,
- 263, 571, 571, 263, 571, 571, 263, 571, 1965, 583,
- 263, 583, 583, 263, 583, 572, 1966, 1975, 573, 1979,
- 1981, 573, 1987, 480, 480, 584, 1164, 486, 584, 1199,
- 1199, 1199, 1988, 1200, 487, 1164, 1201, 488, 1492, 1492,
- 1492, 489, 1989, 490, 491, 495, 496, 263, 496, 495,
- 495, 495, 495, 495, 495, 495, 497, 495, 495, 495,
- 1995, 495, 499, 495, 500, 495, 594, 263, 594, 594,
- 263, 594, 263, 263, 263, 1996, 263, 263, 263, 955,
-
- 955, 955, 595, 1997, 1998, 595, 2011, 2017, 559, 2021,
- 495, 495, 559, 501, 502, 503, 956, 2024, 1209, 1209,
- 1209, 504, 1210, 2026, 505, 1211, 2027, 2029, 506, 2030,
- 2031, 507, 495, 496, 263, 496, 495, 495, 495, 495,
- 495, 495, 495, 497, 495, 495, 495, 2035, 495, 499,
- 495, 500, 495, 594, 263, 594, 594, 263, 594, 594,
- 263, 594, 2038, 594, 263, 594, 963, 963, 963, 595,
- 2040, 2047, 595, 2055, 2056, 596, 2057, 495, 495, 596,
- 501, 502, 503, 964, 2058, 1231, 1231, 1231, 504, 1232,
- 2060, 505, 1233, 2074, 2078, 506, 1689, 1146, 507, 511,
-
- 512, 263, 512, 511, 511, 511, 511, 511, 511, 511,
- 513, 511, 511, 511, 2071, 511, 515, 511, 516, 511,
- 607, 263, 607, 607, 263, 607, 263, 263, 263, 2079,
- 263, 263, 263, 978, 978, 978, 608, 2080, 2072, 608,
- 2083, 2084, 559, 2086, 511, 511, 559, 2087, 2088, 517,
- 979, 1703, 1703, 1703, 2089, 518, 511, 512, 263, 512,
- 511, 511, 511, 511, 511, 511, 511, 513, 511, 511,
- 511, 1689, 511, 515, 511, 516, 511, 607, 263, 607,
- 607, 263, 607, 607, 263, 607, 2090, 607, 263, 607,
- 998, 998, 998, 608, 2091, 2081, 608, 1704, 2094, 609,
-
- 2095, 511, 511, 609, 2073, 2098, 517, 999, 1706, 1706,
- 1706, 2082, 518, 522, 523, 263, 523, 522, 522, 522,
- 522, 522, 522, 522, 524, 522, 522, 522, 2099, 522,
- 526, 522, 527, 522, 622, 263, 622, 622, 263, 622,
- 263, 263, 263, 2100, 263, 263, 263, 622, 263, 622,
- 623, 2101, 2102, 623, 1707, 2104, 624, 2105, 522, 522,
- 624, 2108, 528, 623, 1163, 1163, 1163, 2111, 2115, 529,
- 2116, 2119, 530, 522, 523, 263, 523, 522, 522, 522,
- 522, 522, 522, 522, 524, 522, 522, 522, 2120, 522,
- 526, 522, 527, 522, 622, 263, 622, 622, 263, 622,
-
- 622, 263, 622, 2117, 634, 263, 634, 634, 263, 634,
- 623, 2118, 2121, 625, 2124, 2128, 625, 2129, 522, 522,
- 635, 2132, 528, 635, 1186, 1186, 1186, 2134, 1239, 529,
- 2146, 2153, 530, 534, 535, 263, 535, 534, 534, 534,
- 534, 534, 534, 534, 536, 534, 534, 534, 2154, 534,
- 538, 534, 539, 534, 644, 263, 644, 644, 263, 644,
- 263, 263, 263, 2122, 263, 263, 263, 644, 263, 644,
- 645, 2123, 2158, 645, 2130, 2130, 363, 2159, 534, 534,
- 363, 2160, 540, 645, 1710, 1710, 1710, 2161, 1239, 541,
- 2131, 2082, 542, 1713, 1713, 1713, 1723, 1723, 1723, 543,
-
- 534, 535, 263, 535, 534, 534, 534, 534, 534, 534,
- 534, 536, 534, 534, 534, 2163, 534, 538, 534, 539,
- 534, 644, 263, 644, 644, 263, 644, 644, 263, 644,
- 2167, 656, 263, 656, 656, 263, 656, 645, 1929, 2081,
- 646, 2168, 2169, 646, 1930, 534, 534, 657, 1931, 540,
- 657, 3322, 1932, 734, 693, 2131, 541, 2175, 2176, 542,
- 2177, 693, 2191, 744, 2195, 2196, 543, 548, 549, 263,
- 549, 548, 548, 548, 548, 548, 548, 548, 550, 548,
- 548, 548, 748, 548, 552, 548, 553, 548, 2197, 2199,
- 694, 745, 2203, 1005, 1005, 1005, 695, 2207, 749, 1021,
-
- 1021, 1021, 2208, 696, 2209, 696, 2210, 697, 2211, 690,
- 1006, 2214, 548, 548, 2221, 2223, 1022, 2233, 554, 1253,
- 1253, 1253, 2234, 1254, 2235, 2236, 1255, 1547, 1547, 1547,
- 1757, 1757, 1757, 555, 548, 549, 263, 549, 548, 548,
- 548, 548, 548, 548, 548, 550, 548, 548, 548, 2238,
- 548, 552, 548, 553, 548, 1034, 1034, 1034, 1036, 1036,
- 1036, 1042, 1042, 1042, 1045, 1045, 1045, 1059, 1059, 1059,
- 1689, 1146, 1035, 2244, 2250, 1037, 1758, 2241, 1043, 548,
- 548, 1046, 2251, 2252, 1060, 554, 1263, 1263, 1263, 2253,
- 1264, 2256, 2258, 1265, 1759, 1759, 1759, 1760, 1760, 1760,
-
- 555, 561, 562, 263, 562, 561, 561, 561, 561, 561,
- 561, 561, 563, 561, 561, 561, 2243, 561, 565, 561,
- 566, 561, 1061, 1061, 1061, 1073, 1073, 1073, 1081, 1081,
- 1081, 1086, 1086, 1086, 1092, 1092, 1092, 2259, 2260, 1062,
- 1707, 2264, 1074, 2269, 2271, 1082, 561, 561, 1087, 2272,
- 2273, 1093, 567, 2277, 2283, 568, 1286, 1286, 1286, 2284,
- 1287, 2285, 2286, 1288, 1706, 1706, 1706, 569, 561, 562,
- 263, 562, 561, 561, 561, 561, 561, 561, 561, 563,
- 561, 561, 561, 2287, 561, 565, 561, 566, 561, 1112,
- 1112, 1112, 1136, 1136, 1136, 1140, 1140, 1140, 1159, 1159,
-
- 1159, 1933, 1159, 1159, 1159, 2288, 1113, 1934, 2289, 1137,
- 1858, 1935, 1141, 561, 561, 1936, 1161, 2290, 2291, 567,
- 1161, 2292, 568, 1304, 1304, 1304, 2298, 1305, 1689, 2299,
- 1306, 1703, 1703, 1703, 569, 574, 575, 263, 575, 574,
- 574, 574, 574, 574, 574, 574, 576, 574, 574, 574,
- 2300, 574, 578, 574, 579, 574, 1194, 1194, 1194, 2242,
- 1162, 1194, 1194, 1194, 2301, 955, 955, 955, 2307, 1204,
- 1204, 1204, 2312, 2314, 1196, 1706, 1706, 1706, 2316, 1196,
- 574, 574, 956, 1902, 1902, 1902, 580, 1206, 1710, 1710,
- 1710, 581, 574, 575, 263, 575, 574, 574, 574, 574,
-
- 574, 574, 574, 576, 574, 574, 574, 2317, 574, 578,
- 574, 579, 574, 1204, 1204, 1204, 963, 963, 963, 2322,
- 2323, 1197, 1212, 1212, 1212, 1215, 1215, 1215, 1220, 1220,
- 1220, 1206, 2318, 964, 1713, 1713, 1713, 574, 574, 1213,
- 2319, 2325, 1216, 580, 2326, 2327, 1222, 2328, 581, 585,
- 586, 263, 586, 585, 585, 585, 585, 585, 585, 585,
- 587, 585, 585, 585, 2332, 585, 589, 585, 590, 585,
- 1227, 1227, 1227, 1227, 1227, 1227, 2333, 1207, 2334, 978,
- 978, 978, 2320, 2340, 1220, 1220, 1220, 2341, 1229, 2342,
- 2321, 1229, 2343, 2346, 585, 585, 979, 998, 998, 998,
-
- 591, 2351, 1222, 1307, 1307, 1307, 2355, 1308, 2356, 2361,
- 1309, 1907, 1907, 1907, 999, 592, 585, 586, 263, 586,
- 585, 585, 585, 585, 585, 585, 585, 587, 585, 585,
- 585, 1223, 585, 589, 585, 590, 585, 1230, 1235, 1235,
- 1235, 1235, 1235, 1235, 2362, 1258, 1258, 1258, 1258, 1258,
- 1258, 1005, 1005, 1005, 2363, 2364, 1237, 2357, 2366, 1237,
- 2376, 585, 585, 1260, 2359, 2358, 1260, 591, 1006, 1318,
- 1318, 1318, 2360, 1319, 1689, 1908, 1320, 2387, 1238, 1723,
- 1723, 1723, 592, 597, 598, 263, 598, 597, 597, 597,
- 597, 597, 597, 597, 599, 597, 597, 597, 1689, 597,
-
- 601, 597, 602, 597, 1267, 1267, 1267, 1267, 1267, 1267,
- 1021, 1021, 1021, 2388, 1261, 1273, 1273, 1273, 1273, 1273,
- 1273, 2382, 1269, 2389, 2393, 1269, 2394, 1022, 597, 597,
- 1279, 1279, 1279, 1275, 603, 2395, 1275, 604, 1322, 1322,
- 1322, 2381, 1323, 2398, 2402, 1324, 2403, 2404, 1281, 605,
- 597, 598, 263, 598, 597, 597, 597, 597, 597, 597,
- 597, 599, 597, 597, 597, 2405, 597, 601, 597, 602,
- 597, 2406, 2407, 1270, 1279, 1279, 1279, 2408, 2409, 1276,
- 1292, 1292, 1292, 2410, 1292, 1292, 1292, 1299, 1299, 1299,
- 2411, 2424, 1281, 2425, 2426, 597, 597, 2427, 1294, 2428,
-
- 2430, 603, 1294, 2436, 604, 1301, 1340, 1340, 1340, 2437,
- 1341, 2438, 2439, 1342, 2440, 2441, 605, 610, 611, 263,
- 611, 610, 610, 610, 610, 610, 610, 610, 612, 610,
- 610, 610, 2442, 610, 614, 610, 615, 610, 2445, 1282,
- 1034, 1034, 1034, 2446, 2447, 1295, 1299, 1299, 1299, 1036,
- 1036, 1036, 2452, 1310, 1310, 1310, 2453, 1035, 1310, 1310,
- 1310, 2458, 610, 610, 1301, 2459, 1037, 1910, 1910, 1910,
- 616, 1312, 617, 2460, 2461, 618, 1312, 2470, 2471, 619,
- 1757, 1757, 1757, 620, 610, 611, 263, 611, 610, 610,
- 610, 610, 610, 610, 610, 612, 610, 610, 610, 2472,
-
- 610, 614, 610, 615, 610, 1042, 1042, 1042, 1302, 1045,
- 1045, 1045, 2473, 1911, 1325, 1325, 1325, 2413, 2414, 1313,
- 2415, 2475, 1043, 1336, 1336, 1336, 1046, 2477, 2416, 610,
- 610, 1326, 1059, 1059, 1059, 2417, 2501, 616, 2448, 617,
- 2502, 1338, 618, 1759, 1759, 1759, 619, 2504, 2449, 1060,
- 620, 626, 627, 263, 627, 626, 626, 626, 626, 626,
- 626, 626, 628, 626, 626, 626, 1689, 626, 630, 626,
- 631, 626, 1061, 1061, 1061, 1343, 1343, 1343, 2505, 1344,
- 2506, 2507, 1345, 2511, 1336, 1336, 1336, 2512, 2513, 1062,
- 1346, 1346, 1346, 3322, 3322, 3322, 626, 626, 3322, 3322,
-
- 3322, 2514, 1338, 2498, 1360, 1360, 1360, 1347, 1361, 2515,
- 3322, 1362, 1372, 1372, 1372, 3322, 1373, 1689, 2516, 1374,
- 632, 626, 627, 263, 627, 626, 626, 626, 626, 626,
- 626, 626, 628, 626, 626, 626, 2517, 626, 630, 626,
- 631, 626, 1339, 2518, 1348, 1352, 1352, 1352, 2519, 2497,
- 1349, 3322, 3322, 3322, 2520, 1073, 1073, 1073, 2521, 2523,
- 3322, 3322, 3322, 1354, 2524, 2527, 626, 626, 3322, 1352,
- 1352, 1352, 1074, 2528, 1380, 1380, 1380, 3322, 1381, 2525,
- 2529, 1382, 1389, 1389, 1389, 2530, 1390, 1354, 2526, 1391,
- 632, 636, 637, 263, 637, 636, 636, 636, 636, 636,
-
- 636, 636, 638, 636, 636, 636, 1350, 636, 640, 636,
- 641, 636, 1351, 1363, 1363, 1363, 1355, 1367, 1367, 1367,
- 1367, 1367, 1367, 1081, 1081, 1081, 1375, 1375, 1375, 2533,
- 1364, 1760, 1760, 1760, 2534, 1369, 636, 636, 1369, 2535,
- 1082, 1918, 1918, 1918, 1377, 2536, 2538, 642, 636, 637,
- 263, 637, 636, 636, 636, 636, 636, 636, 636, 638,
- 636, 636, 636, 2539, 636, 640, 636, 641, 636, 2541,
- 2547, 1370, 1375, 1375, 1375, 1086, 1086, 1086, 1384, 1384,
- 1384, 1384, 1384, 1384, 1092, 1092, 1092, 1919, 2531, 2548,
- 1377, 2549, 1087, 636, 636, 2550, 1386, 2532, 2554, 1386,
-
- 2555, 1093, 2556, 2557, 642, 647, 648, 263, 648, 647,
- 647, 647, 647, 647, 647, 647, 649, 647, 647, 647,
- 2558, 647, 651, 647, 652, 647, 2562, 2565, 1387, 1395,
- 1395, 1395, 2566, 1378, 2569, 1395, 1395, 1395, 1399, 1399,
- 1399, 1401, 1401, 1401, 1404, 1404, 1404, 1397, 2581, 2582,
- 647, 647, 2585, 1397, 2586, 1400, 2606, 2607, 1402, 2608,
- 2609, 653, 1406, 1421, 1421, 1421, 2610, 1422, 1689, 1689,
- 1423, 1978, 1978, 1978, 654, 647, 648, 263, 648, 647,
- 647, 647, 647, 647, 647, 647, 649, 647, 647, 647,
- 1398, 647, 651, 647, 652, 647, 3322, 3322, 3322, 1404,
-
- 1404, 1404, 1409, 1409, 1409, 2604, 3322, 3322, 3322, 1413,
- 1413, 1413, 2605, 3322, 1416, 1416, 1416, 1406, 1146, 1410,
- 647, 647, 2619, 3322, 2620, 2621, 1414, 2622, 1416, 1416,
- 1416, 653, 1418, 3322, 3322, 3322, 1112, 1112, 1112, 1424,
- 1424, 1424, 2623, 2624, 654, 662, 1418, 1428, 1428, 1428,
- 3322, 2625, 677, 1113, 2626, 1403, 1411, 1426, 2603, 2627,
- 1407, 661, 678, 2628, 1429, 1419, 1424, 1424, 1424, 2629,
- 2631, 1412, 2085, 2085, 2085, 2632, 1430, 1430, 1430, 2633,
- 1432, 1432, 1432, 2634, 1426, 1432, 1432, 1432, 2635, 679,
- 680, 681, 1415, 1431, 2636, 682, 683, 684, 1434, 2637,
-
- 685, 686, 2638, 1434, 687, 2639, 688, 689, 690, 662,
- 1436, 1436, 1436, 3322, 3322, 3322, 734, 1440, 1440, 1440,
- 2640, 1427, 1442, 1442, 1442, 661, 735, 1437, 2641, 2642,
- 3322, 1442, 1442, 1442, 1441, 1136, 1136, 1136, 2613, 2643,
- 1444, 1140, 1140, 1140, 1451, 1451, 1451, 2644, 2614, 1444,
- 2645, 2615, 1137, 679, 736, 691, 1435, 2646, 1141, 737,
- 738, 684, 1453, 1438, 739, 686, 2648, 2649, 740, 2657,
- 741, 742, 690, 1451, 1451, 1451, 2658, 2659, 1439, 1457,
- 1457, 1457, 1457, 1457, 1457, 1461, 1461, 1461, 2616, 1462,
- 2662, 1453, 1463, 1464, 1464, 1464, 2663, 1459, 2617, 2667,
-
- 1459, 2618, 1445, 1464, 1464, 1464, 1468, 1468, 1468, 2702,
- 1469, 1466, 1146, 1470, 1472, 1472, 1472, 1472, 1472, 1472,
- 2704, 1466, 1159, 1159, 1159, 1159, 1159, 1159, 2685, 1159,
- 1159, 1159, 1474, 2705, 2706, 1474, 2710, 1454, 2686, 2711,
- 1161, 2699, 2714, 1161, 2687, 2715, 1460, 1161, 1514, 1514,
- 1514, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1517, 1517, 1517, 1689, 1467, 1515, 1199, 1199, 1199, 1196,
- 1200, 2718, 1196, 1201, 1689, 1196, 1484, 1518, 3322, 3322,
- 3322, 1475, 1204, 1204, 1204, 1204, 1204, 1204, 2688, 1204,
- 1204, 1204, 1209, 1209, 1209, 3322, 1210, 2719, 2689, 1211,
-
- 1206, 2712, 2720, 1206, 2690, 2700, 1516, 1206, 1212, 1212,
- 1212, 1523, 1523, 1523, 2713, 1524, 2701, 2716, 1525, 2721,
- 1526, 1526, 1526, 2722, 2723, 1213, 1215, 1215, 1215, 2724,
- 2717, 1528, 1528, 1528, 2725, 1529, 1521, 1527, 1530, 1519,
- 1532, 1532, 1532, 1216, 1220, 1220, 1220, 1220, 1220, 1220,
- 1220, 1220, 1220, 1537, 1537, 1537, 2726, 1533, 1227, 1227,
- 1227, 2728, 1222, 2729, 2730, 1222, 2731, 2732, 1222, 2733,
- 1538, 1227, 1227, 1227, 2734, 2735, 1229, 1227, 1227, 1227,
- 1231, 1231, 1231, 2736, 1232, 2737, 2738, 1233, 2739, 1229,
- 1235, 1235, 1235, 2740, 2742, 1229, 1235, 1235, 1235, 1542,
-
- 1542, 1542, 1253, 1253, 1253, 2754, 1254, 2755, 1237, 1255,
- 1535, 1559, 1559, 1559, 1237, 2763, 2764, 1543, 1258, 1258,
- 1258, 1258, 1258, 1258, 1540, 1258, 1258, 1258, 1560, 2781,
- 1263, 1263, 1263, 2782, 1264, 2783, 1260, 1265, 2784, 1260,
- 1267, 1267, 1267, 1260, 1267, 1267, 1267, 1267, 1267, 1267,
- 1565, 1565, 1565, 3322, 3322, 3322, 2785, 2786, 1269, 1273,
- 1273, 1273, 1269, 2797, 1689, 1269, 2799, 1566, 2800, 2801,
- 3322, 1273, 1273, 1273, 1273, 1273, 1273, 1275, 1569, 1569,
- 1569, 3322, 3322, 3322, 2789, 2802, 1561, 2803, 2804, 1275,
- 2805, 2806, 1275, 2807, 2791, 1570, 2808, 2790, 3322, 2794,
-
- 1567, 1279, 1279, 1279, 1279, 1279, 1279, 2792, 1564, 1571,
- 1279, 1279, 1279, 1575, 1575, 1575, 1286, 1286, 1286, 1281,
- 1287, 2811, 1281, 1288, 1292, 1292, 1292, 2812, 1281, 2813,
- 1576, 1292, 1292, 1292, 1292, 1292, 1292, 1583, 1583, 1583,
- 2814, 1568, 1294, 1299, 1299, 1299, 1299, 1299, 1299, 1294,
- 2815, 2816, 1294, 2817, 1584, 1299, 1299, 1299, 1586, 1586,
- 1586, 1301, 2818, 2820, 1301, 1304, 1304, 1304, 1146, 1305,
- 2821, 2822, 1306, 1301, 2823, 1587, 1572, 1307, 1307, 1307,
- 2824, 1308, 2825, 2826, 1309, 1310, 1310, 1310, 1310, 1310,
- 1310, 1310, 1310, 1310, 1318, 1318, 1318, 2827, 1319, 1580,
-
- 2828, 1320, 2829, 1312, 2830, 2831, 1312, 2832, 2844, 1312,
- 1593, 1593, 1593, 1322, 1322, 1322, 2793, 1323, 2845, 2846,
- 1324, 2853, 1585, 1325, 1325, 1325, 2854, 1594, 1595, 1595,
- 1595, 2868, 1596, 2869, 2870, 1597, 1336, 1336, 1336, 2871,
- 1326, 1336, 1336, 1336, 1336, 1336, 1336, 2860, 1340, 1340,
- 1340, 2862, 1341, 2872, 1338, 1342, 1588, 2861, 2864, 1338,
- 2873, 2863, 1338, 1343, 1343, 1343, 2877, 1344, 2865, 2866,
- 1345, 1346, 1346, 1346, 1608, 1608, 1608, 2878, 1609, 2867,
- 2879, 1610, 1352, 1352, 1352, 1352, 1352, 1352, 1347, 1352,
- 1352, 1352, 1360, 1360, 1360, 2880, 1361, 1146, 2890, 1362,
-
- 1354, 2891, 2892, 1354, 1363, 1363, 1363, 1354, 1620, 1620,
- 1620, 1607, 1621, 2893, 2894, 1622, 1367, 1367, 1367, 2895,
- 2896, 1364, 1367, 1367, 1367, 1367, 1367, 1367, 1372, 1372,
- 1372, 2881, 1373, 2897, 1369, 1374, 2901, 1615, 2902, 2903,
- 1369, 2904, 2905, 1369, 1375, 1375, 1375, 1375, 1375, 1375,
- 1375, 1375, 1375, 1380, 1380, 1380, 2906, 1381, 2908, 2909,
- 1382, 2910, 1377, 2911, 2912, 1377, 2913, 2914, 1377, 1384,
- 1384, 1384, 1384, 1384, 1384, 2915, 1625, 1384, 1384, 1384,
- 2919, 1389, 1389, 1389, 2920, 1390, 2921, 1386, 1391, 2924,
- 1386, 1395, 1395, 1395, 2929, 1386, 1395, 1395, 1395, 2930,
-
- 1395, 1395, 1395, 1399, 1399, 1399, 1636, 1636, 1636, 1397,
- 1637, 2931, 2932, 1638, 1397, 2933, 2934, 1627, 1397, 2935,
- 1400, 1401, 1401, 1401, 2936, 2937, 1630, 1639, 1639, 1639,
- 2938, 1640, 2939, 2940, 1641, 1404, 1404, 1404, 1402, 1404,
- 1404, 1404, 2942, 1404, 1404, 1404, 1409, 1409, 1409, 2943,
- 1413, 1413, 1413, 1406, 1902, 1902, 1902, 1406, 2944, 2945,
- 1635, 1406, 2952, 1410, 1645, 1645, 1645, 1414, 1646, 2953,
- 2954, 1647, 1650, 1650, 1650, 2955, 1651, 2956, 2957, 1652,
- 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1421,
- 1421, 1421, 2958, 1422, 2959, 2960, 1423, 2961, 1418, 2962,
-
- 1146, 1418, 2963, 2964, 1418, 1424, 1424, 1424, 2965, 2968,
- 1643, 1424, 1424, 1424, 1424, 1424, 1424, 1428, 1428, 1428,
- 1657, 1657, 1657, 1426, 1658, 2969, 2970, 1659, 2971, 1426,
- 2972, 2973, 1426, 2974, 1429, 1430, 1430, 1430, 1660, 1660,
- 1660, 2975, 1661, 2946, 2976, 1662, 1432, 1432, 1432, 2980,
- 1654, 2987, 1431, 1432, 1432, 1432, 2988, 1432, 1432, 1432,
- 1436, 1436, 1436, 2989, 1434, 1664, 1664, 1664, 2990, 1665,
- 2991, 1434, 1666, 2992, 1656, 1434, 2993, 1437, 1440, 1440,
- 1440, 1669, 1669, 1669, 2994, 1670, 2995, 2996, 1671, 1442,
- 1442, 1442, 1442, 1442, 1442, 1441, 1442, 1442, 1442, 1674,
-
- 1674, 1674, 1451, 1451, 1451, 2997, 2998, 1444, 3001, 3002,
- 1444, 1451, 1451, 1451, 1444, 3003, 1675, 3004, 1146, 1663,
- 1453, 1451, 1451, 1451, 1457, 1457, 1457, 3007, 3012, 1453,
- 1457, 1457, 1457, 1457, 1457, 1457, 1461, 1461, 1461, 1453,
- 1462, 3008, 1459, 1463, 1464, 1464, 1464, 3013, 1459, 3014,
- 3015, 1459, 1464, 1464, 1464, 1464, 1464, 1464, 1672, 1468,
- 1468, 1468, 1466, 1469, 3005, 3016, 1470, 1472, 1472, 1472,
- 1466, 3017, 3007, 1466, 1472, 1472, 1472, 1472, 1472, 1472,
- 3018, 3019, 1679, 3010, 3020, 1474, 1682, 1688, 1688, 1688,
- 3021, 3022, 1474, 3023, 3024, 1474, 1159, 1159, 1159, 1514,
-
- 1514, 1514, 1194, 1194, 1194, 1689, 1690, 3025, 1517, 1517,
- 1517, 1542, 1542, 1542, 1161, 1683, 1515, 1726, 1726, 1726,
- 1196, 1727, 3026, 3027, 1728, 1518, 1730, 1730, 1730, 1543,
- 1731, 3028, 3029, 1732, 1204, 1204, 1204, 3033, 1685, 1523,
- 1523, 1523, 3038, 1524, 3030, 3031, 1525, 1526, 1526, 1526,
- 3039, 3034, 1206, 3040, 1737, 1737, 1737, 3032, 1738, 3036,
- 1729, 1739, 1695, 3035, 1527, 1528, 1528, 1528, 3041, 1529,
- 3042, 3037, 1530, 1532, 1532, 1532, 3043, 1741, 1741, 1741,
- 3046, 1742, 1146, 1735, 1743, 1220, 1220, 1220, 3007, 3046,
- 1533, 1537, 1537, 1537, 1747, 1747, 1747, 3049, 1748, 1689,
-
- 1690, 1749, 3008, 1222, 1750, 1750, 1750, 3050, 1538, 1227,
- 1227, 1227, 1768, 1768, 1768, 1559, 1559, 1559, 1770, 1770,
- 1770, 1751, 1771, 3044, 3051, 1772, 3052, 1229, 3065, 1769,
- 3053, 3063, 1560, 3068, 3066, 1745, 1258, 1258, 1258, 1267,
- 1267, 1267, 1565, 1565, 1565, 1777, 1777, 1777, 3054, 1778,
- 3064, 3073, 1779, 3067, 1260, 3076, 3055, 1269, 1752, 1566,
- 1273, 1273, 1273, 1569, 1569, 1569, 1782, 1782, 1782, 3077,
- 1783, 3056, 3078, 1784, 1279, 1279, 1279, 3071, 1275, 3007,
- 1570, 1575, 1575, 1575, 1789, 1789, 1789, 3046, 1790, 3080,
- 3010, 1791, 1281, 1792, 1792, 1792, 3072, 3046, 1576, 3074,
-
- 1773, 3081, 3082, 1776, 1795, 1795, 1795, 1292, 1292, 1292,
- 1793, 1583, 1583, 1583, 3083, 1801, 1801, 1801, 3075, 1802,
- 1781, 1796, 1803, 3084, 3085, 1294, 3086, 3096, 1584, 1804,
- 1804, 1804, 1586, 1586, 1586, 1786, 1806, 1806, 1806, 3097,
- 1807, 3098, 3099, 1808, 1310, 1310, 1310, 1805, 3100, 1587,
- 1797, 1811, 1811, 1811, 1593, 1593, 1593, 1815, 1815, 1815,
- 3101, 1816, 1312, 3105, 1817, 1595, 1595, 1595, 1812, 1596,
- 3106, 1594, 1597, 1798, 1820, 1820, 1820, 1336, 1336, 1336,
- 1608, 1608, 1608, 3107, 1609, 3108, 3109, 1610, 1829, 1829,
- 1829, 1821, 3322, 3322, 3322, 1338, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 1352, 1352, 1352, 1830, 1836, 1836, 1836, 3322,
- 1809, 3110, 3111, 3322, 3112, 3114, 3322, 1620, 1620, 1620,
- 1354, 1621, 3115, 1837, 1622, 3116, 3117, 1840, 1840, 1840,
- 1367, 1367, 1367, 1375, 1375, 1375, 1384, 1384, 1384, 1852,
- 1852, 1852, 1828, 1832, 1841, 1395, 1395, 1395, 1369, 3118,
- 3123, 1377, 3124, 3125, 1386, 3119, 1853, 1834, 3121, 1404,
- 1404, 1404, 1831, 1397, 1636, 1636, 1636, 3120, 1637, 1833,
- 3122, 1638, 1639, 1639, 1639, 3126, 1640, 1406, 3127, 1641,
- 1645, 1645, 1645, 3128, 1646, 1854, 3129, 1647, 1650, 1650,
- 1650, 3130, 1651, 1848, 1843, 1652, 1416, 1416, 1416, 1845,
-
- 3131, 3132, 1855, 1424, 1424, 1424, 1657, 1657, 1657, 3133,
- 1658, 3134, 3135, 1659, 1418, 1660, 1660, 1660, 3136, 1661,
- 3138, 1426, 1662, 3139, 3140, 1857, 1432, 1432, 1432, 1664,
- 1664, 1664, 3141, 1665, 3142, 3143, 1666, 3144, 1669, 1669,
- 1669, 3145, 1670, 3146, 1434, 1671, 1442, 1442, 1442, 1674,
- 1674, 1674, 1870, 1870, 1870, 3147, 1871, 1862, 1146, 1872,
- 1864, 1451, 1451, 1451, 1444, 3148, 1675, 1878, 1878, 1878,
- 1457, 1457, 1457, 1865, 1464, 1464, 1464, 3149, 3150, 1453,
- 1882, 1882, 1882, 3137, 1879, 1472, 1472, 1472, 1459, 1688,
- 1688, 1688, 1466, 1868, 1159, 1159, 1159, 1883, 1726, 1726,
-
- 1726, 3151, 1727, 1474, 3152, 1728, 3153, 1689, 3154, 3155,
- 1876, 3156, 1161, 1194, 1194, 1194, 1730, 1730, 1730, 3157,
- 1731, 3159, 3160, 1732, 3161, 1146, 1881, 1204, 1204, 1204,
- 3162, 1196, 1737, 1737, 1737, 3163, 1738, 1880, 3164, 1739,
- 1886, 1220, 1220, 1220, 3158, 1206, 1891, 1884, 1741, 1741,
- 1741, 3165, 1742, 3166, 3167, 1743, 3168, 1887, 3169, 1222,
- 1747, 1747, 1747, 3170, 1748, 3171, 3172, 1749, 1750, 1750,
- 1750, 3173, 1937, 1937, 1937, 3174, 1938, 3175, 1923, 1939,
- 1920, 1227, 1227, 1227, 3176, 1751, 1946, 1946, 1946, 1946,
- 1946, 1946, 1907, 1907, 1907, 1768, 1768, 1768, 1146, 1229,
-
- 3178, 3179, 1927, 1952, 1952, 1952, 3180, 1953, 3181, 3182,
- 1954, 3183, 1769, 1770, 1770, 1770, 3184, 1771, 3177, 3185,
- 1772, 1258, 1258, 1258, 1957, 1957, 1957, 1267, 1267, 1267,
- 3186, 3187, 1940, 1777, 1777, 1777, 3188, 1778, 3189, 1260,
- 1779, 1958, 1273, 1273, 1273, 1269, 3190, 1782, 1782, 1782,
- 1947, 1783, 3191, 1908, 1784, 3192, 1947, 1279, 1279, 1279,
- 1275, 1962, 1962, 1962, 3193, 1789, 1789, 1789, 1955, 1790,
- 3194, 3195, 1791, 3197, 1959, 1281, 3198, 3199, 1963, 1792,
- 1792, 1792, 1967, 1967, 1967, 3200, 1968, 3201, 3202, 1969,
- 1970, 1970, 1970, 1795, 1795, 1795, 1793, 1972, 1972, 1972,
-
- 1146, 1973, 3203, 3204, 1974, 3205, 3196, 1971, 1961, 3206,
- 1796, 1976, 1976, 1976, 3207, 1801, 1801, 1801, 3208, 1802,
- 3210, 1964, 1803, 1804, 1804, 1804, 1806, 1806, 1806, 1977,
- 1807, 1146, 3211, 1808, 1310, 1310, 1310, 1811, 1811, 1811,
- 3212, 1805, 1982, 1982, 1982, 3209, 1983, 3213, 3214, 1984,
- 3215, 3216, 1312, 3217, 1812, 1985, 1985, 1985, 1815, 1815,
- 1815, 3219, 1816, 3220, 3221, 1817, 1820, 1820, 1820, 1990,
- 1990, 1990, 1986, 1991, 3222, 3223, 1992, 1993, 1993, 1993,
- 1980, 3224, 3225, 1821, 1999, 1999, 1999, 1336, 1336, 1336,
- 1829, 1829, 1829, 3226, 1994, 2002, 2002, 2002, 3229, 2003,
-
- 3230, 2000, 2004, 3231, 3232, 1338, 3233, 1830, 2005, 2005,
- 2005, 3322, 3322, 3322, 2008, 2008, 2008, 1352, 1352, 1352,
- 1836, 1836, 1836, 3234, 1146, 2006, 1146, 1724, 3322, 1722,
- 1146, 2009, 2012, 2012, 2012, 1354, 2013, 1837, 1146, 2014,
- 2015, 2015, 2015, 1840, 1840, 1840, 3243, 2018, 2018, 2018,
- 1146, 2019, 3244, 2001, 2020, 1146, 1146, 2016, 3261, 3245,
- 1841, 2022, 2022, 2022, 1375, 1375, 1375, 1146, 3241, 2007,
- 1384, 1384, 1384, 1852, 1852, 1852, 1146, 2010, 3237, 2023,
- 1721, 1720, 1377, 1146, 3257, 2032, 2032, 2032, 1386, 2033,
- 1853, 3235, 2034, 2036, 2036, 2036, 1404, 1404, 1404, 2041,
-
- 2041, 2041, 2043, 2043, 2043, 3322, 3322, 3322, 1416, 1416,
- 1416, 2037, 3236, 3246, 1406, 2025, 2042, 1146, 2028, 2044,
- 1146, 1146, 3322, 1432, 1432, 1432, 1418, 1424, 1424, 1424,
- 3249, 2050, 2050, 2050, 2052, 2052, 2052, 1442, 1442, 1442,
- 1146, 1434, 1870, 1870, 1870, 1426, 1871, 2039, 2051, 1872,
- 1146, 2053, 1451, 1451, 1451, 1444, 1146, 1878, 1878, 1878,
- 2061, 2061, 2061, 3247, 2062, 3238, 1719, 2063, 3239, 2045,
- 1453, 1146, 3262, 2048, 1879, 2046, 1457, 1457, 1457, 1464,
- 1464, 1464, 1882, 1882, 1882, 2066, 2066, 2066, 2049, 2067,
- 1718, 1717, 2068, 3248, 1459, 1146, 1146, 1466, 3240, 1883,
-
- 3242, 1146, 2054, 2059, 2069, 2069, 2069, 2075, 2075, 2075,
- 1159, 1159, 1159, 2092, 2092, 2092, 1907, 1907, 1907, 2093,
- 2093, 2093, 2070, 1146, 2076, 1910, 1910, 1910, 1161, 2096,
- 2096, 2096, 3251, 3252, 2065, 2064, 2097, 2097, 2097, 1918,
- 1918, 1918, 1194, 1194, 1194, 2106, 2106, 2106, 2109, 2109,
- 2109, 1220, 1220, 1220, 1146, 2113, 2113, 2113, 1146, 1146,
- 1196, 1146, 1146, 2107, 3253, 2110, 1937, 1937, 1937, 1222,
- 1938, 2077, 2114, 1939, 1146, 1227, 1227, 1227, 2126, 2126,
- 2126, 1946, 1946, 1946, 2133, 2133, 2133, 2135, 2135, 2135,
- 1146, 1146, 2103, 1229, 3255, 2127, 1952, 1952, 1952, 3254,
-
- 1953, 3250, 3301, 1954, 2136, 1258, 1258, 1258, 3258, 3256,
- 2112, 2139, 2139, 2139, 1957, 1957, 1957, 1146, 2142, 2142,
- 2142, 2125, 2143, 1260, 1146, 2144, 3265, 3259, 2140, 1716,
- 1715, 1958, 3263, 2137, 1267, 1267, 1267, 2147, 2147, 2147,
- 3264, 1146, 1962, 1962, 1962, 1146, 2149, 2149, 2149, 1146,
- 2150, 1146, 1269, 2151, 3260, 2148, 3309, 2141, 2138, 1963,
- 1279, 1279, 1279, 1967, 1967, 1967, 1146, 1968, 1146, 1146,
- 1969, 1970, 1970, 1970, 1714, 2155, 2155, 2155, 1281, 2156,
- 3266, 1146, 2157, 1976, 1976, 1976, 3277, 2145, 1971, 1972,
- 1972, 1972, 1146, 1973, 3269, 1146, 1974, 1978, 1978, 1978,
-
- 3267, 1977, 1310, 1310, 1310, 1712, 3279, 2152, 1982, 1982,
- 1982, 3270, 1983, 1146, 1146, 1984, 1985, 1985, 1985, 1146,
- 1312, 2164, 2164, 2164, 3319, 2165, 3268, 3271, 2166, 1146,
- 1990, 1990, 1990, 1986, 1991, 1146, 1146, 1992, 1993, 1993,
- 1993, 2170, 2170, 2170, 1146, 2171, 3275, 3276, 2172, 2173,
- 2173, 2173, 1999, 1999, 1999, 1994, 1146, 2178, 2178, 2178,
- 2162, 2179, 1146, 3291, 2180, 3272, 2174, 3278, 1146, 2000,
- 1336, 1336, 1336, 2002, 2002, 2002, 1146, 2003, 3281, 3273,
- 2004, 2005, 2005, 2005, 1711, 2182, 2182, 2182, 1338, 2183,
- 1146, 3274, 2184, 2185, 2185, 2185, 1146, 1709, 2006, 2008,
-
- 2008, 2008, 2187, 2187, 2187, 3280, 2188, 1146, 3283, 2189,
- 2186, 1352, 1352, 1352, 1708, 3289, 2009, 1705, 2012, 2012,
- 2012, 2181, 2013, 1146, 1146, 2014, 2015, 2015, 2015, 1354,
- 2192, 2192, 2192, 3285, 2193, 1146, 3284, 2194, 2018, 2018,
- 2018, 1702, 2019, 2016, 3286, 2020, 2022, 2022, 2022, 1375,
- 1375, 1375, 2200, 2200, 2200, 1384, 1384, 1384, 2204, 2204,
- 2204, 1146, 2190, 1146, 2023, 3282, 1146, 1377, 1146, 2201,
- 2032, 2032, 2032, 1386, 2033, 2205, 3302, 2034, 2036, 2036,
- 2036, 2212, 2212, 2212, 2041, 2041, 2041, 2215, 2215, 2215,
- 3287, 2216, 3288, 3290, 2217, 3295, 2037, 1146, 1701, 2213,
-
- 3292, 2042, 1146, 1146, 2206, 2043, 2043, 2043, 2218, 2218,
- 2218, 1700, 2219, 2198, 3293, 2220, 2202, 1416, 1416, 1416,
- 1146, 1146, 2044, 1424, 1424, 1424, 1432, 1432, 1432, 2050,
- 2050, 2050, 2226, 2226, 2226, 1418, 2227, 3296, 1146, 2228,
- 1146, 1426, 1146, 3294, 1434, 1146, 2051, 2052, 2052, 2052,
- 2229, 2229, 2229, 3310, 2230, 3303, 1146, 2231, 1442, 1442,
- 1442, 1451, 1451, 1451, 2053, 1146, 2061, 2061, 2061, 1699,
- 2062, 1146, 2224, 2063, 1146, 3299, 1444, 3304, 1146, 1453,
- 1457, 1457, 1457, 2222, 1464, 1464, 1464, 3297, 2066, 2066,
- 2066, 2225, 2067, 3300, 1698, 2068, 1697, 1696, 1459, 2069,
-
- 2069, 2069, 1466, 2075, 2075, 2075, 2245, 2245, 2245, 3311,
- 2246, 3307, 3298, 2247, 1159, 1159, 1159, 2070, 1146, 3315,
- 2076, 3312, 3319, 2232, 3305, 1694, 2237, 2249, 2249, 2249,
- 1146, 2239, 1161, 2254, 2254, 2254, 1146, 2240, 2255, 2255,
- 2255, 2085, 2085, 2085, 2257, 2257, 2257, 2261, 2261, 2261,
- 2092, 2092, 2092, 2093, 2093, 2093, 2262, 2262, 2262, 2096,
- 2096, 2096, 2097, 2097, 2097, 2265, 2265, 2265, 2266, 2266,
- 2266, 2267, 2267, 2267, 2268, 2268, 2268, 1146, 2248, 1194,
- 1194, 1194, 2106, 2106, 2106, 1693, 2109, 2109, 2109, 2274,
- 2274, 2274, 1146, 2275, 1692, 1691, 2276, 1196, 1684, 1681,
-
- 2107, 1680, 2263, 2110, 2278, 2278, 2278, 2113, 2113, 2113,
- 2280, 2280, 2280, 1678, 2281, 1677, 1676, 2282, 1227, 1227,
- 1227, 1673, 2279, 3306, 2114, 2126, 2126, 2126, 1146, 3308,
- 2270, 2294, 2294, 2294, 1668, 2295, 1229, 1667, 2296, 2297,
- 2297, 2297, 2127, 2133, 2133, 2133, 2302, 2302, 2302, 2135,
- 2135, 2135, 2304, 2304, 2304, 1146, 2305, 1655, 1653, 2306,
- 1258, 1258, 1258, 2139, 2139, 2139, 2136, 2293, 2309, 2309,
- 2309, 1146, 2310, 1146, 1146, 2311, 3316, 1649, 1260, 1648,
- 2140, 2142, 2142, 2142, 1644, 2143, 1642, 3313, 2144, 1267,
- 1267, 1267, 2303, 1634, 2147, 2147, 2147, 2149, 2149, 2149,
-
- 1633, 2150, 1632, 3314, 2151, 3317, 3318, 1269, 1279, 1279,
- 1279, 2308, 2148, 2155, 2155, 2155, 1631, 2156, 1629, 1628,
- 2157, 1310, 1310, 1310, 1626, 1624, 1281, 2164, 2164, 2164,
- 1623, 2165, 1619, 1618, 2166, 2173, 2173, 2173, 1617, 1312,
- 2313, 2170, 2170, 2170, 1616, 2171, 1614, 1613, 2172, 2329,
- 2329, 2329, 2174, 2330, 1612, 1611, 2331, 1606, 2178, 2178,
- 2178, 2315, 2179, 1605, 1604, 2180, 1336, 1336, 1336, 1603,
- 2182, 2182, 2182, 1602, 2183, 1601, 2324, 2184, 2185, 2185,
- 2185, 2336, 2336, 2336, 1338, 2337, 1600, 1599, 2338, 2187,
- 2187, 2187, 1598, 2188, 1592, 2186, 2189, 1352, 1352, 1352,
-
- 2192, 2192, 2192, 1591, 2193, 1590, 1589, 2194, 2344, 2344,
- 2344, 2200, 2200, 2200, 1582, 1354, 2347, 2347, 2347, 1581,
- 2348, 1579, 1578, 2349, 1577, 1574, 2345, 1573, 2201, 1563,
- 2335, 1384, 1384, 1384, 2204, 2204, 2204, 2352, 2352, 2352,
- 1562, 2353, 1558, 1557, 2354, 1556, 2212, 2212, 2212, 1386,
- 1555, 2205, 2215, 2215, 2215, 1554, 2216, 1553, 1552, 2217,
- 1416, 1416, 1416, 2339, 2213, 2218, 2218, 2218, 1551, 2219,
- 1549, 1548, 2220, 1546, 1424, 1424, 1424, 1545, 1418, 1432,
- 1432, 1432, 2226, 2226, 2226, 1544, 2227, 1541, 1539, 2228,
- 1536, 2350, 1426, 1534, 2229, 2229, 2229, 1434, 2230, 1531,
-
- 1522, 2231, 1442, 1442, 1442, 1520, 2370, 2370, 2370, 1513,
- 1511, 2365, 3322, 3322, 3322, 2368, 3322, 3322, 3322, 1510,
- 1444, 1509, 2369, 2371, 3322, 3322, 3322, 1508, 1507, 3322,
- 1451, 1451, 1451, 3322, 1457, 1457, 1457, 2378, 2378, 2378,
- 2367, 3322, 2380, 2380, 2380, 2383, 2383, 2383, 1453, 2245,
- 2245, 2245, 1459, 2246, 1506, 2379, 2247, 1159, 1159, 1159,
- 1146, 1505, 1504, 2372, 2249, 2249, 2249, 2385, 2385, 2385,
- 2386, 2386, 2386, 1503, 1502, 1161, 2254, 2254, 2254, 1499,
- 2373, 1498, 1497, 2374, 2255, 2255, 2255, 2257, 2257, 2257,
- 2390, 2390, 2390, 1496, 2377, 2375, 2391, 2391, 2391, 2392,
-
- 2392, 2392, 2261, 2261, 2261, 2262, 2262, 2262, 2265, 2265,
- 2265, 2266, 2266, 2266, 1495, 1494, 2384, 2267, 2267, 2267,
- 2268, 2268, 2268, 2396, 2396, 2396, 2399, 2399, 2399, 2274,
- 2274, 2274, 1493, 2275, 1491, 1490, 2276, 3322, 3322, 3322,
- 1489, 2397, 1488, 2400, 2278, 2278, 2278, 1487, 2280, 2280,
- 2280, 1486, 2281, 1485, 3322, 2282, 1227, 1227, 1227, 2294,
- 2294, 2294, 2279, 2295, 2418, 2419, 2296, 2420, 2297, 2297,
- 2297, 2423, 2423, 2423, 1229, 2421, 2302, 2302, 2302, 2304,
- 2304, 2304, 2422, 2305, 1483, 1482, 2306, 1258, 1258, 1258,
- 2309, 2309, 2309, 1481, 2310, 1480, 1479, 2311, 2431, 2431,
-
- 2431, 1478, 1477, 2401, 1146, 1260, 2433, 2433, 2433, 1279,
- 1279, 1279, 2443, 2443, 2443, 1471, 2432, 2412, 1310, 1310,
- 1310, 1456, 1455, 2434, 2329, 2329, 2329, 1281, 2330, 1450,
- 1449, 2331, 1448, 2429, 1447, 1446, 1312, 2450, 2450, 2450,
- 2454, 2454, 2454, 2336, 2336, 2336, 1420, 2337, 1408, 1394,
- 2338, 2456, 2456, 2456, 2451, 2344, 2344, 2344, 2455, 1393,
- 2435, 1392, 2462, 2462, 2462, 1384, 1384, 1384, 1388, 2457,
- 2347, 2347, 2347, 2345, 2348, 1383, 1379, 2349, 2444, 2463,
- 2465, 2465, 2465, 1386, 2352, 2352, 2352, 1371, 2353, 1366,
- 1365, 2354, 3322, 3322, 3322, 1359, 1356, 2466, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 2476, 2476, 2476, 1335, 1334, 3322,
- 2478, 2478, 2478, 1333, 1332, 3322, 2464, 1331, 3322, 2480,
- 2480, 2480, 1424, 1424, 1424, 1330, 2467, 1329, 2479, 1328,
- 1432, 1432, 1432, 1442, 1442, 1442, 2481, 2370, 2370, 2370,
- 1426, 1327, 2485, 2485, 2485, 1321, 2486, 2468, 1434, 2487,
- 1314, 1444, 2474, 1303, 2371, 2488, 2488, 2488, 1298, 2469,
- 3322, 3322, 3322, 3322, 3322, 3322, 2492, 2492, 2492, 1297,
- 2484, 1296, 2489, 2494, 2494, 2494, 1291, 3322, 1290, 1289,
- 3322, 1285, 2482, 1284, 2493, 1457, 1457, 1457, 2378, 2378,
- 2378, 2483, 2380, 2380, 2380, 2383, 2383, 2383, 2499, 2499,
-
- 2499, 1283, 1278, 1459, 1277, 1272, 2379, 2385, 2385, 2385,
- 1146, 2490, 1271, 1266, 2491, 1262, 2500, 2386, 2386, 2386,
- 2503, 2503, 2503, 2390, 2390, 2390, 2391, 2391, 2391, 2392,
- 2392, 2392, 2396, 2396, 2396, 2399, 2399, 2399, 2508, 2508,
- 2508, 1257, 2509, 1256, 1252, 2510, 1227, 1227, 1227, 1251,
- 2397, 2495, 2400, 1250, 2496, 2423, 2423, 2423, 2537, 2537,
- 2537, 1258, 1258, 1258, 1229, 2431, 2431, 2431, 2433, 2433,
- 2433, 2542, 2542, 2542, 1249, 2543, 1248, 1247, 2544, 1260,
- 2545, 2545, 2545, 2432, 1246, 2434, 2551, 2551, 2551, 2443,
- 2443, 2443, 1310, 1310, 1310, 2450, 2450, 2450, 2546, 1245,
-
- 2559, 2559, 2559, 2552, 2560, 1244, 2522, 2561, 1243, 1242,
- 1312, 1241, 2451, 2563, 2563, 2563, 2454, 2454, 2454, 2456,
- 2456, 2456, 2567, 2567, 2567, 1240, 1234, 2540, 1226, 1225,
- 2564, 2462, 2462, 2462, 2455, 1224, 1219, 2457, 1218, 2568,
- 2570, 2570, 2570, 1217, 2571, 1214, 1208, 2572, 2463, 2553,
- 2573, 2573, 2573, 2465, 2465, 2465, 2575, 2575, 2575, 1203,
- 2576, 1202, 1198, 2577, 3322, 3322, 3322, 1193, 2574, 1192,
- 2466, 3322, 3322, 3322, 3322, 3322, 3322, 2583, 2583, 2583,
- 1191, 3322, 2476, 2476, 2476, 2478, 2478, 2478, 3322, 1190,
- 1189, 3322, 1188, 1187, 2584, 2480, 2480, 2480, 2587, 2587,
-
- 2587, 1185, 2588, 2479, 1184, 2589, 2590, 2590, 2590, 1432,
- 1432, 1432, 2481, 1442, 1442, 1442, 2578, 1183, 2485, 2485,
- 2485, 1182, 2486, 1181, 2591, 2487, 1180, 1434, 1179, 2579,
- 1178, 1444, 2580, 2488, 2488, 2488, 2594, 2594, 2594, 1177,
- 2595, 1176, 1175, 2596, 2597, 2597, 2597, 2599, 2599, 2599,
- 2489, 2492, 2492, 2492, 2494, 2494, 2494, 2601, 2601, 2601,
- 1174, 2598, 1173, 1172, 2600, 2499, 2499, 2499, 1171, 2493,
- 2503, 2503, 2503, 1170, 1169, 2602, 2592, 2593, 2611, 2611,
- 2611, 1168, 1167, 2500, 2508, 2508, 2508, 1166, 2509, 1165,
- 1158, 2510, 1227, 1227, 1227, 2612, 2537, 2537, 2537, 1258,
-
- 1258, 1258, 2542, 2542, 2542, 1157, 2543, 1156, 1155, 2544,
- 1229, 2545, 2545, 2545, 2650, 2650, 2650, 1260, 2551, 2551,
- 2551, 2652, 2652, 2652, 1154, 2653, 1153, 1152, 2654, 2546,
- 1149, 2651, 2655, 2655, 2655, 2552, 2660, 2660, 2660, 2559,
- 2559, 2559, 1147, 2560, 1146, 1144, 2561, 2563, 2563, 2563,
- 2656, 1142, 2630, 2661, 2664, 2664, 2664, 1139, 2665, 1135,
- 1133, 2666, 1132, 1131, 2564, 2668, 2668, 2668, 1129, 1128,
- 2647, 2567, 2567, 2567, 2670, 2670, 2670, 1127, 2671, 1126,
- 1125, 2672, 2669, 2673, 2673, 2673, 1124, 1122, 2568, 2570,
- 2570, 2570, 1121, 2571, 1120, 1119, 2572, 2573, 2573, 2573,
-
- 2674, 2575, 2575, 2575, 1117, 2576, 1116, 1115, 2577, 3322,
- 3322, 3322, 3322, 3322, 3322, 2574, 3322, 3322, 3322, 2583,
- 2583, 2583, 1111, 2678, 2678, 2678, 3322, 2679, 1110, 3322,
- 2680, 1108, 1107, 3322, 1106, 1105, 2584, 2681, 2681, 2681,
- 2683, 2683, 2683, 2587, 2587, 2587, 1104, 2588, 1103, 1101,
- 2589, 2590, 2590, 2590, 2682, 1100, 1099, 2684, 1432, 1432,
- 1432, 1098, 1096, 2676, 2675, 1442, 1442, 1442, 1095, 2591,
- 1094, 2677, 1091, 2594, 2594, 2594, 1434, 2595, 1090, 1088,
- 2596, 1085, 1084, 1444, 2597, 2597, 2597, 2693, 2693, 2693,
- 1080, 2694, 1079, 1077, 2695, 2599, 2599, 2599, 2696, 2696,
-
- 2696, 2598, 2697, 1076, 1075, 2698, 1072, 2601, 2601, 2601,
- 1071, 1070, 2600, 2703, 2703, 2703, 2611, 2611, 2611, 1227,
- 1227, 1227, 1069, 1067, 2691, 2602, 2692, 2707, 2707, 2707,
- 1066, 2708, 1065, 2612, 2709, 1064, 1063, 1229, 2741, 2741,
- 2741, 2743, 2743, 2743, 1258, 1258, 1258, 2746, 2746, 2746,
- 2748, 2748, 2748, 1058, 2650, 2650, 2650, 1056, 2744, 2751,
- 2751, 2751, 1260, 2752, 2747, 1055, 2753, 2749, 1054, 1053,
- 2727, 2651, 2652, 2652, 2652, 1052, 2653, 1051, 1050, 2654,
- 2655, 2655, 2655, 2756, 2756, 2756, 2660, 2660, 2660, 1049,
- 2758, 2758, 2758, 1048, 2759, 1047, 2750, 2760, 2656, 1044,
-
- 2757, 1041, 1040, 2661, 1039, 1033, 2745, 2761, 2761, 2761,
- 2664, 2664, 2664, 1032, 2665, 1030, 1027, 2666, 2668, 2668,
- 2668, 2765, 2765, 2765, 2762, 2766, 1025, 1024, 2767, 2670,
- 2670, 2670, 1023, 2671, 1018, 2669, 2672, 2673, 2673, 2673,
- 2768, 2768, 2768, 1017, 2769, 1015, 1014, 2770, 3322, 3322,
- 3322, 2772, 2772, 2772, 2674, 3322, 3322, 3322, 1013, 2678,
- 2678, 2678, 1011, 2679, 1010, 3322, 2680, 1009, 2773, 2681,
- 2681, 2681, 3322, 2775, 2775, 2775, 1007, 2776, 1004, 1003,
- 2777, 2683, 2683, 2683, 1001, 1000, 2682, 2778, 2778, 2778,
- 997, 2779, 992, 991, 2780, 1432, 1432, 1432, 2684, 1442,
-
- 1442, 1442, 988, 987, 2774, 986, 2771, 2693, 2693, 2693,
- 983, 2694, 982, 1434, 2695, 980, 977, 1444, 2696, 2696,
- 2696, 975, 2697, 974, 973, 2698, 2795, 2795, 2795, 2703,
- 2703, 2703, 2798, 2798, 2798, 2707, 2707, 2707, 972, 2708,
- 970, 969, 2709, 2796, 1689, 968, 2787, 2809, 2809, 2809,
- 1227, 1227, 1227, 2741, 2741, 2741, 2833, 2833, 2833, 2743,
- 2743, 2743, 967, 966, 2810, 965, 2788, 962, 1229, 961,
- 2834, 2834, 2834, 960, 2835, 957, 2744, 2836, 1258, 1258,
- 1258, 2746, 2746, 2746, 2838, 2838, 2838, 954, 2839, 953,
- 951, 2840, 2748, 2748, 2748, 950, 1260, 947, 2747, 2819,
-
- 2841, 2841, 2841, 944, 2842, 941, 940, 2843, 932, 2749,
- 2751, 2751, 2751, 931, 2752, 930, 929, 2753, 2756, 2756,
- 2756, 2847, 2847, 2847, 923, 2848, 922, 921, 2849, 2837,
- 2758, 2758, 2758, 919, 2759, 2757, 918, 2760, 2761, 2761,
- 2761, 2850, 2850, 2850, 917, 2851, 916, 915, 2852, 2765,
- 2765, 2765, 914, 2766, 909, 2762, 2767, 2768, 2768, 2768,
- 906, 2769, 908, 903, 2770, 3322, 3322, 3322, 2772, 2772,
- 2772, 2856, 2856, 2856, 902, 2857, 900, 898, 2858, 3322,
- 3322, 3322, 3322, 896, 894, 2773, 2775, 2775, 2775, 892,
- 2776, 889, 888, 2777, 887, 886, 3322, 2778, 2778, 2778,
-
- 885, 2779, 883, 881, 2780, 2874, 2874, 2874, 1442, 1442,
- 1442, 2882, 2882, 2882, 880, 879, 2855, 2795, 2795, 2795,
- 2884, 2884, 2884, 2875, 2885, 877, 1444, 2886, 2883, 1689,
- 2887, 2887, 2887, 875, 2796, 1689, 874, 872, 1689, 2798,
- 2798, 2798, 2888, 2888, 2888, 2889, 2889, 2889, 870, 869,
- 2859, 2809, 2809, 2809, 2898, 2898, 2898, 867, 2899, 863,
- 862, 2900, 1227, 1227, 1227, 2916, 2916, 2916, 2810, 2833,
- 2833, 2833, 860, 855, 2876, 2834, 2834, 2834, 853, 2835,
- 1229, 849, 2836, 2917, 2917, 2917, 2838, 2838, 2838, 848,
- 2839, 847, 845, 2840, 843, 2841, 2841, 2841, 842, 2842,
-
- 841, 2918, 2843, 2847, 2847, 2847, 839, 2848, 837, 836,
- 2849, 2850, 2850, 2850, 834, 2851, 832, 831, 2852, 2922,
- 2922, 2922, 2925, 2925, 2925, 2856, 2856, 2856, 2907, 2857,
- 830, 829, 2858, 2927, 2927, 2927, 2923, 828, 827, 2926,
- 2874, 2874, 2874, 1442, 1442, 1442, 2882, 2882, 2882, 826,
- 2928, 824, 2947, 2947, 2947, 822, 2948, 821, 2875, 2949,
- 818, 1444, 817, 2883, 1689, 2884, 2884, 2884, 816, 2885,
- 1689, 814, 2886, 2887, 2887, 2887, 2888, 2888, 2888, 2889,
- 2889, 2889, 802, 1689, 2898, 2898, 2898, 801, 2899, 798,
- 796, 2900, 794, 793, 2941, 1687, 1687, 1687, 1687, 1687,
-
- 1687, 1687, 1687, 1687, 792, 790, 1687, 2966, 2966, 2966,
- 788, 1687, 1687, 1687, 1689, 1687, 2916, 2916, 2916, 2917,
- 2917, 2917, 2922, 2922, 2922, 2967, 2977, 2977, 2977, 786,
- 2978, 783, 780, 2979, 2925, 2925, 2925, 2918, 779, 2923,
- 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
- 1687, 2926, 778, 1687, 2927, 2927, 2927, 776, 1687, 1687,
- 1687, 1689, 1687, 2981, 2981, 2981, 774, 2982, 773, 771,
- 2983, 2928, 2984, 2984, 2984, 769, 2985, 768, 766, 2986,
- 2999, 2999, 2999, 2966, 2966, 2966, 764, 1687, 1687, 2947,
- 2947, 2947, 763, 2948, 762, 760, 2949, 758, 3000, 757,
-
- 756, 2967, 2999, 2999, 2999, 755, 753, 1689, 1687, 1687,
- 1687, 1687, 1687, 3011, 1687, 1687, 1687, 3322, 700, 1687,
- 3000, 733, 732, 730, 1687, 1687, 1687, 1689, 1687, 2977,
- 2977, 2977, 728, 2978, 727, 726, 2979, 2981, 2981, 2981,
- 724, 2982, 720, 716, 2983, 2984, 2984, 2984, 715, 2985,
- 713, 712, 2986, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
- 1687, 1687, 1687, 3011, 709, 708, 1687, 3048, 3048, 3048,
- 707, 1687, 1687, 1687, 1689, 1687, 3057, 3057, 3057, 3059,
- 3059, 3059, 3061, 3061, 3061, 1689, 1690, 3069, 3069, 3069,
- 3079, 3079, 3079, 3058, 705, 704, 3060, 703, 701, 3062,
-
- 1687, 1687, 696, 3322, 3070, 3048, 3048, 3048, 1146, 3057,
- 3057, 3057, 3087, 3087, 3087, 676, 3088, 674, 672, 3089,
- 3059, 3059, 3059, 1689, 666, 665, 3058, 3090, 3090, 3090,
- 666, 3091, 665, 664, 3092, 663, 3322, 3060, 3061, 3061,
- 3061, 3093, 3093, 3093, 3322, 3094, 3322, 3322, 3095, 3069,
- 3069, 3069, 3079, 3079, 3079, 3062, 1886, 3102, 3102, 3102,
- 3322, 3103, 3322, 3322, 3104, 3322, 3070, 3087, 3087, 3087,
- 1146, 3088, 3322, 3322, 3089, 3090, 3090, 3090, 3322, 3091,
- 3322, 3322, 3092, 3093, 3093, 3093, 3322, 3094, 3322, 3113,
- 3095, 3102, 3102, 3102, 3322, 3103, 3322, 3322, 3104, 3218,
-
- 3218, 3218, 3218, 3218, 3218, 3322, 3227, 3322, 3322, 3228,
- 3320, 3320, 3320, 3320, 3320, 3320, 3322, 1146, 3322, 3322,
- 1146, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3321, 3322,
- 3322, 3321, 260, 260, 260, 260, 260, 260, 260, 260,
- 260, 261, 261, 261, 261, 261, 261, 261, 261, 261,
- 266, 266, 266, 266, 266, 266, 266, 266, 266, 269,
- 269, 269, 269, 269, 269, 269, 269, 269, 272, 272,
- 272, 272, 272, 272, 272, 272, 272, 275, 275, 275,
- 275, 275, 275, 275, 275, 275, 282, 282, 282, 282,
- 282, 282, 282, 282, 282, 290, 290, 290, 290, 290,
-
- 290, 290, 290, 290, 294, 294, 294, 294, 294, 294,
- 294, 294, 294, 306, 306, 306, 306, 306, 306, 306,
- 306, 306, 310, 310, 310, 310, 310, 310, 310, 310,
- 310, 317, 317, 317, 317, 317, 317, 317, 317, 317,
- 328, 328, 328, 328, 328, 328, 328, 328, 328, 336,
- 336, 336, 336, 336, 336, 336, 336, 336, 342, 342,
- 342, 342, 342, 342, 342, 342, 342, 348, 348, 348,
- 348, 348, 348, 348, 348, 348, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 359, 359, 359, 359, 359,
- 359, 359, 359, 359, 378, 378, 378, 378, 378, 378,
-
- 378, 378, 378, 385, 385, 385, 385, 385, 385, 385,
- 385, 385, 392, 392, 392, 392, 392, 392, 392, 392,
- 392, 398, 398, 398, 398, 398, 398, 398, 398, 398,
- 405, 405, 405, 405, 405, 405, 405, 405, 405, 410,
- 410, 410, 410, 410, 410, 410, 410, 410, 416, 416,
- 416, 416, 416, 416, 416, 416, 416, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 427, 427, 427, 427,
- 427, 427, 427, 427, 427, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 443, 443, 443, 443, 443, 443,
- 443, 443, 443, 447, 447, 447, 447, 447, 447, 447,
-
- 447, 447, 453, 453, 453, 453, 453, 453, 453, 453,
- 453, 459, 459, 459, 459, 459, 459, 459, 459, 459,
- 476, 476, 476, 476, 476, 476, 476, 476, 476, 483,
- 483, 483, 483, 483, 483, 483, 483, 483, 492, 492,
- 492, 492, 492, 492, 492, 492, 492, 498, 498, 498,
- 498, 498, 498, 498, 498, 498, 508, 508, 508, 508,
- 508, 508, 508, 508, 508, 514, 514, 514, 514, 514,
- 514, 514, 514, 514, 519, 519, 519, 519, 519, 519,
- 519, 519, 519, 525, 525, 525, 525, 525, 525, 525,
- 525, 525, 531, 531, 531, 531, 531, 531, 531, 531,
-
- 531, 537, 537, 537, 537, 537, 537, 537, 537, 537,
- 544, 544, 544, 544, 544, 544, 544, 544, 544, 551,
- 551, 551, 551, 551, 551, 551, 551, 551, 556, 556,
- 556, 556, 556, 556, 556, 556, 556, 564, 564, 564,
- 564, 564, 564, 564, 564, 564, 570, 570, 570, 570,
- 570, 570, 570, 570, 570, 577, 577, 577, 577, 577,
- 577, 577, 577, 577, 582, 582, 582, 582, 582, 582,
- 582, 582, 582, 588, 588, 588, 588, 588, 588, 588,
- 588, 588, 593, 593, 593, 593, 593, 593, 593, 593,
- 593, 600, 600, 600, 600, 600, 600, 600, 600, 600,
-
- 606, 606, 606, 606, 606, 606, 606, 606, 606, 613,
- 613, 613, 613, 613, 613, 613, 613, 613, 621, 621,
- 621, 621, 621, 621, 621, 621, 621, 629, 629, 629,
- 629, 629, 629, 629, 629, 629, 633, 633, 633, 633,
- 633, 633, 633, 633, 633, 639, 639, 639, 639, 639,
- 639, 639, 639, 639, 643, 643, 643, 643, 643, 643,
- 643, 643, 643, 650, 650, 650, 650, 650, 650, 650,
- 650, 650, 655, 655, 655, 655, 655, 655, 655, 655,
- 655, 675, 675, 675, 3322, 3322, 3322, 675, 702, 702,
- 702, 3322, 3322, 3322, 702, 706, 706, 706, 3322, 3322,
-
- 3322, 706, 714, 714, 714, 3322, 3322, 3322, 714, 725,
- 725, 725, 3322, 3322, 3322, 725, 731, 731, 731, 3322,
- 3322, 3322, 731, 754, 754, 754, 3322, 3322, 3322, 754,
- 761, 761, 761, 3322, 3322, 3322, 761, 767, 767, 767,
- 3322, 3322, 3322, 767, 772, 772, 772, 3322, 3322, 3322,
- 772, 777, 777, 777, 3322, 3322, 3322, 777, 787, 787,
- 787, 3322, 3322, 3322, 787, 791, 791, 791, 3322, 3322,
- 3322, 791, 797, 797, 797, 3322, 3322, 3322, 797, 815,
- 815, 815, 3322, 3322, 3322, 815, 825, 825, 825, 3322,
- 3322, 3322, 825, 835, 835, 835, 3322, 3322, 3322, 835,
-
- 840, 840, 840, 3322, 3322, 3322, 840, 846, 846, 846,
- 3322, 3322, 3322, 846, 854, 854, 854, 3322, 3322, 3322,
- 854, 861, 861, 861, 3322, 3322, 3322, 861, 868, 868,
- 868, 3322, 3322, 3322, 868, 873, 873, 873, 3322, 3322,
- 3322, 873, 878, 878, 878, 3322, 3322, 3322, 878, 884,
- 884, 884, 3322, 3322, 3322, 884, 893, 893, 893, 3322,
- 3322, 3322, 893, 897, 897, 897, 3322, 3322, 3322, 897,
- 901, 901, 901, 3322, 3322, 3322, 901, 905, 905, 905,
- 905, 905, 905, 905, 3322, 905, 675, 675, 675, 3322,
- 3322, 3322, 675, 920, 3322, 3322, 3322, 920, 702, 702,
-
- 702, 3322, 3322, 3322, 702, 952, 3322, 3322, 3322, 952,
- 706, 706, 706, 3322, 3322, 3322, 706, 959, 3322, 3322,
- 3322, 959, 714, 714, 714, 3322, 3322, 3322, 714, 971,
- 3322, 3322, 3322, 971, 725, 725, 725, 3322, 3322, 3322,
- 725, 976, 3322, 3322, 3322, 976, 731, 731, 731, 3322,
- 3322, 3322, 731, 981, 3322, 3322, 3322, 981, 754, 754,
- 754, 3322, 3322, 3322, 754, 1002, 3322, 3322, 3322, 1002,
- 761, 761, 761, 3322, 3322, 3322, 761, 1008, 3322, 3322,
- 3322, 1008, 767, 767, 767, 3322, 3322, 3322, 767, 1012,
- 3322, 3322, 3322, 1012, 772, 772, 772, 3322, 3322, 3322,
-
- 772, 1016, 3322, 3322, 3322, 1016, 777, 777, 777, 3322,
- 3322, 3322, 777, 1026, 3322, 3322, 3322, 1026, 787, 787,
- 787, 3322, 3322, 3322, 787, 1031, 3322, 3322, 3322, 1031,
- 791, 791, 791, 3322, 3322, 3322, 791, 1038, 3322, 3322,
- 3322, 1038, 797, 797, 797, 3322, 3322, 3322, 797, 1057,
- 3322, 3322, 3322, 1057, 815, 815, 815, 3322, 3322, 3322,
- 815, 1068, 3322, 3322, 3322, 1068, 825, 825, 825, 3322,
- 3322, 3322, 825, 1078, 3322, 3322, 3322, 1078, 835, 835,
- 835, 3322, 3322, 3322, 835, 1083, 3322, 3322, 3322, 1083,
- 840, 840, 840, 3322, 3322, 3322, 840, 1089, 3322, 3322,
-
- 3322, 1089, 846, 846, 846, 3322, 3322, 3322, 846, 1097,
- 3322, 3322, 3322, 1097, 854, 854, 854, 3322, 3322, 3322,
- 854, 1102, 3322, 3322, 3322, 1102, 861, 861, 861, 3322,
- 3322, 3322, 861, 1109, 3322, 3322, 3322, 1109, 868, 868,
- 868, 3322, 3322, 3322, 868, 1114, 3322, 3322, 3322, 1114,
- 873, 873, 873, 3322, 3322, 3322, 873, 1118, 3322, 3322,
- 3322, 1118, 878, 878, 878, 3322, 3322, 3322, 878, 1123,
- 3322, 3322, 3322, 1123, 884, 884, 884, 3322, 3322, 3322,
- 884, 1130, 3322, 3322, 3322, 1130, 893, 893, 893, 3322,
- 3322, 3322, 893, 1134, 3322, 3322, 3322, 1134, 897, 897,
-
- 897, 3322, 3322, 3322, 897, 1138, 3322, 3322, 3322, 1138,
- 901, 901, 901, 3322, 3322, 3322, 901, 1143, 3322, 3322,
- 3322, 1143, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
- 1145, 1151, 3322, 3322, 3322, 3322, 1151, 675, 675, 675,
- 3322, 3322, 3322, 675, 1160, 1160, 1160, 1160, 3322, 3322,
- 1160, 1160, 702, 702, 702, 3322, 3322, 3322, 702, 1195,
- 1195, 1195, 1195, 3322, 3322, 1195, 1195, 706, 706, 706,
- 3322, 3322, 3322, 706, 1205, 1205, 1205, 1205, 3322, 3322,
- 1205, 1205, 714, 714, 714, 3322, 3322, 3322, 714, 1221,
- 1221, 1221, 1221, 3322, 3322, 1221, 1221, 725, 725, 725,
-
- 3322, 3322, 3322, 725, 1228, 1228, 1228, 1228, 3322, 3322,
- 1228, 1228, 731, 731, 731, 3322, 3322, 3322, 731, 1236,
- 1236, 1236, 1236, 3322, 3322, 1236, 1236, 754, 754, 754,
- 3322, 3322, 3322, 754, 1259, 1259, 1259, 1259, 3322, 3322,
- 1259, 1259, 761, 761, 761, 3322, 3322, 3322, 761, 1268,
- 1268, 1268, 1268, 3322, 3322, 1268, 1268, 767, 767, 767,
- 3322, 3322, 3322, 767, 1274, 1274, 1274, 1274, 3322, 3322,
- 1274, 1274, 772, 772, 772, 3322, 3322, 3322, 772, 1280,
- 1280, 1280, 1280, 3322, 3322, 1280, 1280, 777, 777, 777,
- 3322, 3322, 3322, 777, 1293, 1293, 1293, 1293, 3322, 3322,
-
- 1293, 1293, 787, 787, 787, 3322, 3322, 3322, 787, 1300,
- 1300, 1300, 1300, 3322, 3322, 1300, 1300, 791, 791, 791,
- 3322, 3322, 3322, 791, 1311, 1311, 1311, 1311, 3322, 3322,
- 1311, 1311, 797, 797, 797, 3322, 3322, 3322, 797, 1337,
- 1337, 1337, 1337, 3322, 3322, 1337, 1337, 815, 815, 815,
- 815, 3322, 815, 3322, 815, 1353, 1353, 1353, 1353, 3322,
- 3322, 1353, 1353, 825, 825, 825, 3322, 3322, 3322, 825,
- 1368, 1368, 1368, 1368, 3322, 3322, 1368, 1368, 835, 835,
- 835, 3322, 3322, 3322, 835, 1376, 1376, 1376, 1376, 3322,
- 3322, 1376, 1376, 840, 840, 840, 3322, 3322, 3322, 840,
-
- 1385, 1385, 1385, 1385, 3322, 3322, 1385, 1385, 846, 846,
- 846, 3322, 3322, 3322, 846, 1396, 1396, 1396, 1396, 3322,
- 3322, 1396, 1396, 854, 854, 854, 854, 3322, 854, 3322,
- 854, 1405, 1405, 1405, 1405, 3322, 3322, 1405, 1405, 861,
- 861, 861, 861, 3322, 861, 3322, 861, 1417, 1417, 1417,
- 1417, 3322, 3322, 1417, 1417, 868, 868, 868, 3322, 3322,
- 3322, 868, 1425, 1425, 1425, 1425, 3322, 3322, 1425, 1425,
- 873, 873, 873, 873, 3322, 873, 3322, 873, 1433, 1433,
- 1433, 1433, 3322, 3322, 1433, 1433, 878, 878, 878, 878,
- 3322, 878, 3322, 878, 1443, 1443, 1443, 1443, 3322, 3322,
-
- 1443, 1443, 884, 884, 884, 3322, 3322, 3322, 884, 1452,
- 1452, 1452, 1452, 3322, 3322, 1452, 1452, 893, 893, 893,
- 3322, 3322, 3322, 893, 1458, 1458, 1458, 1458, 3322, 3322,
- 1458, 1458, 1465, 1465, 1465, 1465, 3322, 3322, 1465, 1465,
- 901, 901, 901, 3322, 3322, 3322, 901, 1473, 1473, 1473,
- 1473, 3322, 3322, 1473, 1473, 1145, 1145, 1145, 1145, 1145,
- 1145, 1145, 1145, 1145, 1151, 3322, 1151, 3322, 3322, 1151,
- 675, 675, 675, 3322, 3322, 3322, 675, 1160, 1160, 1160,
- 1160, 3322, 3322, 1160, 1160, 702, 702, 702, 702, 3322,
- 702, 3322, 702, 1195, 1195, 1195, 1195, 3322, 3322, 1195,
-
- 1195, 706, 706, 706, 706, 3322, 706, 3322, 706, 1205,
- 1205, 1205, 1205, 3322, 3322, 1205, 1205, 714, 714, 714,
- 3322, 3322, 3322, 714, 1221, 1221, 1221, 1221, 3322, 3322,
- 1221, 1221, 725, 725, 725, 3322, 3322, 3322, 725, 1228,
- 1228, 1228, 1228, 3322, 3322, 1228, 1228, 731, 731, 731,
- 3322, 3322, 3322, 731, 1236, 1236, 1236, 1236, 3322, 3322,
- 1236, 1236, 754, 754, 754, 3322, 3322, 3322, 754, 1259,
- 1259, 1259, 1259, 3322, 3322, 1259, 1259, 761, 761, 761,
- 3322, 3322, 3322, 761, 1268, 1268, 1268, 1268, 3322, 3322,
- 1268, 1268, 767, 767, 767, 767, 3322, 767, 3322, 767,
-
- 1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274, 772, 772,
- 772, 772, 3322, 772, 3322, 772, 1280, 1280, 1280, 1280,
- 3322, 3322, 1280, 1280, 777, 777, 777, 3322, 3322, 3322,
- 777, 1293, 1293, 1293, 1293, 3322, 3322, 1293, 1293, 787,
- 787, 787, 787, 3322, 787, 3322, 787, 1300, 1300, 1300,
- 1300, 3322, 3322, 1300, 1300, 791, 791, 791, 791, 3322,
- 791, 3322, 791, 1311, 1311, 1311, 1311, 3322, 3322, 1311,
- 1311, 797, 797, 797, 3322, 3322, 3322, 797, 1337, 1337,
- 1337, 1337, 3322, 3322, 1337, 1337, 815, 815, 815, 3322,
- 3322, 3322, 815, 1353, 1353, 1353, 1353, 3322, 3322, 1353,
-
- 1353, 825, 825, 825, 3322, 3322, 3322, 825, 1368, 1368,
- 1368, 1368, 3322, 3322, 1368, 1368, 835, 835, 835, 3322,
- 3322, 3322, 835, 1376, 1376, 1376, 1376, 3322, 3322, 1376,
- 1376, 840, 840, 840, 3322, 3322, 3322, 840, 1385, 1385,
- 1385, 1385, 3322, 3322, 1385, 1385, 846, 846, 846, 3322,
- 3322, 3322, 846, 1396, 1396, 1396, 1396, 3322, 3322, 1396,
- 1396, 854, 854, 854, 3322, 3322, 3322, 854, 1405, 1405,
- 1405, 1405, 3322, 3322, 1405, 1405, 861, 861, 861, 3322,
- 3322, 3322, 861, 1417, 1417, 1417, 1417, 3322, 3322, 1417,
- 1417, 868, 868, 868, 3322, 3322, 3322, 868, 1425, 1425,
-
- 1425, 1425, 3322, 3322, 1425, 1425, 1433, 1433, 1433, 1433,
- 3322, 3322, 1433, 1433, 878, 878, 878, 3322, 3322, 3322,
- 878, 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443, 884,
- 884, 884, 3322, 3322, 3322, 884, 1452, 1452, 1452, 1452,
- 3322, 3322, 1452, 1452, 893, 893, 893, 3322, 3322, 3322,
- 893, 1458, 1458, 1458, 1458, 3322, 3322, 1458, 1458, 1465,
- 1465, 1465, 1465, 3322, 3322, 1465, 1465, 901, 901, 901,
- 3322, 3322, 3322, 901, 1473, 1473, 1473, 1473, 3322, 3322,
- 1473, 1473, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
- 1145, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
-
- 675, 675, 675, 3322, 3322, 3322, 675, 1160, 1160, 1160,
- 1160, 3322, 3322, 1160, 1160, 1195, 1195, 1195, 1195, 3322,
- 3322, 1195, 1195, 706, 706, 706, 3322, 3322, 3322, 706,
- 1205, 1205, 1205, 1205, 3322, 3322, 1205, 1205, 714, 714,
- 714, 3322, 3322, 3322, 714, 1221, 1221, 1221, 1221, 3322,
- 3322, 1221, 1221, 725, 725, 725, 3322, 3322, 3322, 725,
- 1228, 1228, 1228, 1228, 3322, 3322, 1228, 1228, 731, 731,
- 731, 3322, 3322, 3322, 731, 754, 754, 754, 3322, 3322,
- 3322, 754, 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259,
- 761, 761, 761, 3322, 3322, 3322, 761, 1268, 1268, 1268,
-
- 1268, 3322, 3322, 1268, 1268, 767, 767, 767, 3322, 3322,
- 3322, 767, 1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274,
- 772, 772, 772, 3322, 3322, 3322, 772, 1280, 1280, 1280,
- 1280, 3322, 3322, 1280, 1280, 777, 777, 777, 3322, 3322,
- 3322, 777, 1293, 1293, 1293, 1293, 3322, 3322, 1293, 1293,
- 1300, 1300, 1300, 1300, 3322, 3322, 1300, 1300, 1311, 1311,
- 1311, 1311, 3322, 3322, 1311, 1311, 797, 797, 797, 3322,
- 3322, 3322, 797, 1337, 1337, 1337, 1337, 3322, 3322, 1337,
- 1337, 815, 815, 815, 815, 3322, 815, 3322, 815, 1353,
- 1353, 1353, 1353, 3322, 3322, 1353, 1353, 825, 825, 825,
-
- 3322, 3322, 3322, 825, 1368, 1368, 1368, 1368, 3322, 3322,
- 1368, 1368, 835, 835, 835, 3322, 3322, 3322, 835, 1376,
- 1376, 1376, 1376, 3322, 3322, 1376, 1376, 840, 840, 840,
- 3322, 3322, 3322, 840, 1385, 1385, 1385, 1385, 3322, 3322,
- 1385, 1385, 846, 846, 846, 3322, 3322, 3322, 846, 1396,
- 1396, 1396, 1396, 3322, 3322, 1396, 1396, 854, 854, 854,
- 3322, 3322, 3322, 854, 1405, 1405, 1405, 1405, 3322, 3322,
- 1405, 1405, 861, 861, 861, 3322, 3322, 3322, 861, 1417,
- 1417, 1417, 1417, 3322, 3322, 1417, 1417, 868, 868, 868,
- 3322, 3322, 3322, 868, 1425, 1425, 1425, 1425, 3322, 3322,
-
- 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322, 1433, 1433,
- 878, 878, 878, 3322, 3322, 3322, 878, 1443, 1443, 1443,
- 1443, 3322, 3322, 1443, 1443, 884, 884, 884, 3322, 3322,
- 3322, 884, 1452, 1452, 1452, 1452, 3322, 3322, 1452, 1452,
- 893, 893, 893, 893, 3322, 893, 3322, 893, 1458, 1458,
- 1458, 1458, 3322, 3322, 1458, 1458, 1465, 1465, 1465, 1465,
- 3322, 3322, 1465, 1465, 901, 901, 901, 901, 3322, 901,
- 3322, 901, 1473, 1473, 1473, 1473, 3322, 3322, 1473, 1473,
- 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1687,
- 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 675, 675,
-
- 675, 3322, 3322, 3322, 675, 1160, 1160, 1160, 1160, 3322,
- 3322, 1160, 1160, 1195, 1195, 1195, 1195, 3322, 3322, 1195,
- 1195, 706, 706, 706, 3322, 3322, 3322, 706, 1205, 1205,
- 1205, 1205, 3322, 3322, 1205, 1205, 714, 714, 714, 3322,
- 3322, 3322, 714, 1221, 1221, 1221, 1221, 3322, 3322, 1221,
- 1221, 725, 725, 725, 3322, 3322, 3322, 725, 1228, 1228,
- 1228, 1228, 3322, 3322, 1228, 1228, 731, 731, 731, 3322,
- 3322, 3322, 731, 754, 754, 754, 3322, 3322, 3322, 754,
- 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259, 761, 761,
- 761, 3322, 3322, 3322, 761, 1268, 1268, 1268, 1268, 3322,
-
- 3322, 1268, 1268, 767, 767, 767, 3322, 3322, 3322, 767,
- 1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274, 772, 772,
- 772, 772, 3322, 772, 3322, 772, 1280, 1280, 1280, 1280,
- 3322, 3322, 1280, 1280, 777, 777, 777, 3322, 3322, 3322,
- 777, 1293, 1293, 1293, 1293, 3322, 3322, 1293, 1293, 1311,
- 1311, 1311, 1311, 3322, 3322, 1311, 1311, 797, 797, 797,
- 3322, 3322, 3322, 797, 1337, 1337, 1337, 1337, 3322, 3322,
- 1337, 1337, 815, 815, 815, 815, 3322, 815, 3322, 815,
- 1353, 1353, 1353, 1353, 3322, 3322, 1353, 1353, 825, 825,
- 825, 3322, 3322, 3322, 825, 1368, 1368, 1368, 1368, 3322,
-
- 3322, 1368, 1368, 835, 835, 835, 3322, 3322, 3322, 835,
- 1376, 1376, 1376, 1376, 3322, 3322, 1376, 1376, 840, 840,
- 840, 3322, 3322, 3322, 840, 1385, 1385, 1385, 1385, 3322,
- 3322, 1385, 1385, 846, 846, 846, 3322, 3322, 3322, 846,
- 1396, 1396, 1396, 1396, 3322, 3322, 1396, 1396, 854, 854,
- 854, 3322, 3322, 3322, 854, 1405, 1405, 1405, 1405, 3322,
- 3322, 1405, 1405, 861, 861, 861, 861, 3322, 861, 3322,
- 861, 1417, 1417, 1417, 1417, 3322, 3322, 1417, 1417, 868,
- 868, 868, 3322, 3322, 3322, 868, 1425, 1425, 1425, 1425,
- 3322, 3322, 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322,
-
- 1433, 1433, 878, 878, 878, 878, 3322, 878, 3322, 878,
- 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443, 884, 884,
- 884, 3322, 3322, 3322, 884, 1452, 1452, 1452, 1452, 3322,
- 3322, 1452, 1452, 1458, 1458, 1458, 1458, 3322, 3322, 1458,
- 1458, 1465, 1465, 1465, 1465, 3322, 3322, 1465, 1465, 1473,
- 1473, 1473, 1473, 3322, 3322, 1473, 1473, 1145, 1145, 1145,
- 1145, 1145, 1145, 1145, 1145, 1145, 1687, 1687, 1687, 1687,
- 1687, 1687, 1687, 1687, 1687, 675, 675, 675, 675, 3322,
- 675, 3322, 675, 1160, 1160, 1160, 1160, 3322, 3322, 1160,
- 1160, 1195, 1195, 1195, 1195, 3322, 3322, 1195, 1195, 706,
-
- 706, 706, 3322, 3322, 3322, 706, 1205, 1205, 1205, 1205,
- 3322, 3322, 1205, 1205, 714, 714, 714, 3322, 3322, 3322,
- 714, 1221, 1221, 1221, 1221, 3322, 3322, 1221, 1221, 725,
- 725, 725, 725, 3322, 725, 3322, 725, 1228, 1228, 1228,
- 1228, 3322, 3322, 1228, 1228, 731, 731, 731, 731, 3322,
- 731, 3322, 731, 754, 754, 754, 754, 3322, 754, 3322,
- 754, 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259, 761,
- 761, 761, 761, 3322, 761, 3322, 761, 1268, 1268, 1268,
- 1268, 3322, 3322, 1268, 1268, 767, 767, 767, 3322, 3322,
- 3322, 767, 1274, 1274, 1274, 1274, 3322, 3322, 1274, 1274,
-
- 1280, 1280, 1280, 1280, 3322, 3322, 1280, 1280, 777, 777,
- 777, 3322, 3322, 3322, 777, 1311, 1311, 1311, 1311, 3322,
- 3322, 1311, 1311, 797, 797, 797, 3322, 3322, 3322, 797,
- 1337, 1337, 1337, 1337, 3322, 3322, 1337, 1337, 815, 815,
- 815, 815, 3322, 815, 3322, 815, 1353, 1353, 1353, 1353,
- 3322, 3322, 1353, 1353, 825, 825, 825, 3322, 3322, 3322,
- 825, 835, 835, 835, 3322, 3322, 3322, 835, 1376, 1376,
- 1376, 1376, 3322, 3322, 1376, 1376, 840, 840, 840, 3322,
- 3322, 3322, 840, 1385, 1385, 1385, 1385, 3322, 3322, 1385,
- 1385, 846, 846, 846, 3322, 3322, 3322, 846, 854, 854,
-
- 854, 3322, 3322, 3322, 854, 1405, 1405, 1405, 1405, 3322,
- 3322, 1405, 1405, 861, 861, 861, 3322, 3322, 3322, 861,
- 1417, 1417, 1417, 1417, 3322, 3322, 1417, 1417, 868, 868,
- 868, 3322, 3322, 3322, 868, 1425, 1425, 1425, 1425, 3322,
- 3322, 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322, 1433,
- 1433, 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443, 884,
- 884, 884, 3322, 3322, 3322, 884, 1452, 1452, 1452, 1452,
- 3322, 3322, 1452, 1452, 1458, 1458, 1458, 1458, 3322, 3322,
- 1458, 1458, 1465, 1465, 1465, 1465, 3322, 3322, 1465, 1465,
- 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1687,
-
- 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1160, 1160,
- 1160, 1160, 3322, 3322, 1160, 1160, 1195, 1195, 1195, 1195,
- 3322, 3322, 1195, 1195, 706, 706, 706, 3322, 3322, 3322,
- 706, 714, 714, 714, 3322, 3322, 3322, 714, 1221, 1221,
- 1221, 1221, 3322, 3322, 1221, 1221, 1228, 1228, 1228, 1228,
- 3322, 3322, 1228, 1228, 754, 754, 754, 3322, 3322, 3322,
- 754, 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259, 761,
- 761, 761, 3322, 3322, 3322, 761, 1268, 1268, 1268, 1268,
- 3322, 3322, 1268, 1268, 767, 767, 767, 3322, 3322, 3322,
- 767, 1280, 1280, 1280, 1280, 3322, 3322, 1280, 1280, 777,
-
- 777, 777, 3322, 3322, 3322, 777, 1311, 1311, 1311, 1311,
- 3322, 3322, 1311, 1311, 797, 797, 797, 3322, 3322, 3322,
- 797, 1337, 1337, 1337, 1337, 3322, 3322, 1337, 1337, 1353,
- 1353, 1353, 1353, 3322, 3322, 1353, 1353, 825, 825, 825,
- 3322, 3322, 3322, 825, 835, 835, 835, 3322, 3322, 3322,
- 835, 1376, 1376, 1376, 1376, 3322, 3322, 1376, 1376, 840,
- 840, 840, 3322, 3322, 3322, 840, 1385, 1385, 1385, 1385,
- 3322, 3322, 1385, 1385, 846, 846, 846, 3322, 3322, 3322,
- 846, 854, 854, 854, 3322, 3322, 3322, 854, 861, 861,
- 861, 3322, 3322, 3322, 861, 1417, 1417, 1417, 1417, 3322,
-
- 3322, 1417, 1417, 868, 868, 868, 3322, 3322, 3322, 868,
- 1425, 1425, 1425, 1425, 3322, 3322, 1425, 1425, 1433, 1433,
- 1433, 1433, 3322, 3322, 1433, 1433, 1443, 1443, 1443, 1443,
- 3322, 3322, 1443, 1443, 884, 884, 884, 884, 3322, 884,
- 3322, 884, 1452, 1452, 1452, 1452, 3322, 3322, 1452, 1452,
- 1458, 1458, 1458, 1458, 3322, 3322, 1458, 1458, 1465, 1465,
- 1465, 1465, 3322, 3322, 1465, 1465, 1145, 1145, 1145, 1145,
- 1145, 1145, 1145, 1145, 1145, 1687, 1687, 1687, 1687, 1687,
- 1687, 1687, 1687, 1687, 1160, 1160, 1160, 1160, 3322, 3322,
- 1160, 1160, 1195, 1195, 1195, 1195, 3322, 3322, 1195, 1195,
-
- 706, 706, 706, 3322, 3322, 3322, 706, 714, 714, 714,
- 714, 3322, 714, 3322, 714, 1228, 1228, 1228, 1228, 3322,
- 3322, 1228, 1228, 754, 754, 754, 3322, 3322, 3322, 754,
- 1259, 1259, 1259, 1259, 3322, 3322, 1259, 1259, 761, 761,
- 761, 3322, 3322, 3322, 761, 1268, 1268, 1268, 1268, 3322,
- 3322, 1268, 1268, 767, 767, 767, 767, 3322, 767, 3322,
- 767, 1280, 1280, 1280, 1280, 3322, 3322, 1280, 1280, 777,
- 777, 777, 3322, 3322, 3322, 777, 1311, 1311, 1311, 1311,
- 3322, 3322, 1311, 1311, 797, 797, 797, 3322, 3322, 3322,
- 797, 1337, 1337, 1337, 1337, 3322, 3322, 1337, 1337, 1353,
-
- 1353, 1353, 1353, 3322, 3322, 1353, 1353, 825, 825, 825,
- 3322, 3322, 3322, 825, 835, 835, 835, 3322, 3322, 3322,
- 835, 840, 840, 840, 840, 3322, 840, 3322, 840, 1385,
- 1385, 1385, 1385, 3322, 3322, 1385, 1385, 846, 846, 846,
- 846, 3322, 846, 3322, 846, 854, 854, 854, 3322, 3322,
- 3322, 854, 861, 861, 861, 3322, 3322, 3322, 861, 1417,
- 1417, 1417, 1417, 3322, 3322, 1417, 1417, 868, 868, 868,
- 868, 3322, 868, 3322, 868, 1425, 1425, 1425, 1425, 3322,
- 3322, 1425, 1425, 1433, 1433, 1433, 1433, 3322, 3322, 1433,
- 1433, 1443, 1443, 1443, 1443, 3322, 3322, 1443, 1443, 884,
-
- 884, 884, 884, 3322, 884, 3322, 884, 1452, 1452, 1452,
- 1452, 3322, 3322, 1452, 1452, 1458, 1458, 1458, 1458, 3322,
- 3322, 1458, 1458, 1145, 1145, 1145, 1145, 1145, 1145, 1145,
- 1145, 1145, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687,
- 1687, 1160, 1160, 1160, 1160, 3322, 3322, 1160, 1160, 706,
- 706, 706, 3322, 3322, 3322, 706, 714, 714, 714, 3322,
- 3322, 3322, 714, 1228, 1228, 1228, 1228, 3322, 3322, 1228,
- 1228, 754, 754, 754, 3322, 3322, 3322, 754, 1259, 1259,
- 1259, 1259, 3322, 3322, 1259, 1259, 761, 761, 761, 3322,
- 3322, 3322, 761, 1280, 1280, 1280, 1280, 3322, 3322, 1280,
-
- 1280, 777, 777, 777, 3322, 3322, 3322, 777, 1311, 1311,
- 1311, 1311, 3322, 3322, 1311, 1311, 797, 797, 797, 3322,
- 3322, 3322, 797, 825, 825, 825, 3322, 3322, 3322, 825,
- 835, 835, 835, 3322, 3322, 3322, 835, 2950, 2950, 2950,
- 2950, 2950, 2950, 2950, 2950, 2950, 2951, 2951, 2951, 2951,
- 2951, 2951, 2951, 2951, 2951, 3006, 3006, 3006, 3006, 3006,
- 3006, 3006, 3006, 3006, 3009, 3009, 3009, 3009, 3009, 3009,
- 3009, 3009, 3009, 3045, 3045, 3045, 3045, 3045, 3045, 3045,
- 3045, 3045, 3047, 3047, 3047, 3047, 3047, 3047, 3047, 3047,
- 3047, 259, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322
+ 3457, 266, 267, 266, 266, 267, 266, 266, 267, 266,
+ 266, 267, 266, 271, 267, 271, 277, 268, 274, 277,
+ 268, 274, 3457, 269, 3457, 275, 269, 3457, 275, 272,
+ 271, 267, 271, 676, 278, 280, 281, 278, 280, 281,
+ 282, 283, 721, 282, 283, 676, 272, 287, 288, 677,
+ 284, 280, 281, 284, 285, 679, 282, 280, 281, 710,
+ 285, 678, 282, 287, 288, 1760, 284, 267, 267, 267,
+ 869, 678, 284, 267, 267, 267, 299, 267, 299, 299,
+ 267, 299, 870, 290, 299, 267, 299, 697, 1761, 290,
+ 751, 289, 300, 1391, 713, 300, 675, 675, 675, 1392,
+
+ 301, 675, 675, 675, 675, 675, 675, 289, 291, 292,
+ 267, 292, 291, 291, 291, 291, 291, 291, 291, 293,
+ 291, 291, 291, 708, 291, 295, 291, 296, 291, 299,
+ 267, 299, 267, 267, 267, 267, 267, 267, 709, 299,
+ 267, 299, 299, 267, 299, 301, 714, 824, 302, 679,
+ 825, 302, 948, 291, 291, 300, 679, 679, 300, 299,
+ 267, 299, 675, 675, 675, 678, 675, 675, 675, 675,
+ 675, 675, 678, 678, 3457, 303, 949, 297, 291, 292,
+ 267, 292, 291, 291, 291, 291, 291, 291, 291, 293,
+ 291, 291, 291, 1763, 291, 295, 291, 296, 291, 299,
+
+ 267, 299, 267, 267, 267, 267, 267, 267, 684, 299,
+ 267, 299, 299, 267, 299, 303, 690, 751, 304, 838,
+ 1008, 304, 839, 291, 291, 301, 760, 752, 301, 267,
+ 267, 267, 267, 267, 267, 299, 267, 299, 299, 267,
+ 299, 299, 267, 299, 1009, 305, 875, 297, 305, 679,
+ 685, 303, 817, 876, 303, 764, 686, 306, 299, 267,
+ 299, 687, 675, 675, 675, 678, 688, 675, 675, 675,
+ 675, 675, 675, 818, 306, 307, 308, 267, 308, 307,
+ 307, 307, 307, 307, 307, 307, 309, 307, 307, 307,
+ 738, 307, 311, 307, 312, 307, 315, 267, 315, 315,
+
+ 267, 315, 267, 267, 267, 739, 267, 267, 267, 315,
+ 267, 315, 316, 799, 877, 316, 1764, 800, 304, 734,
+ 307, 307, 304, 735, 776, 316, 694, 736, 313, 307,
+ 308, 267, 308, 307, 307, 307, 307, 307, 307, 307,
+ 309, 307, 307, 307, 679, 307, 311, 307, 312, 307,
+ 315, 267, 315, 315, 267, 315, 315, 267, 315, 1765,
+ 678, 885, 280, 281, 883, 715, 316, 282, 3457, 317,
+ 714, 884, 317, 777, 307, 307, 760, 327, 716, 776,
+ 709, 1206, 313, 318, 319, 267, 319, 318, 318, 318,
+ 318, 318, 318, 318, 320, 318, 318, 318, 1207, 318,
+
+ 322, 318, 323, 318, 1766, 679, 328, 708, 341, 267,
+ 341, 341, 267, 341, 353, 267, 353, 714, 280, 281,
+ 717, 678, 709, 282, 342, 727, 821, 342, 318, 318,
+ 354, 713, 728, 327, 822, 936, 324, 783, 937, 325,
+ 823, 678, 675, 675, 675, 1767, 326, 318, 319, 267,
+ 319, 318, 318, 318, 318, 318, 318, 318, 320, 318,
+ 318, 318, 328, 318, 322, 318, 323, 318, 353, 267,
+ 353, 364, 267, 364, 364, 267, 364, 802, 364, 267,
+ 364, 364, 267, 364, 354, 679, 765, 365, 679, 760,
+ 365, 878, 318, 318, 366, 740, 1543, 366, 1768, 714,
+
+ 324, 678, 766, 325, 678, 675, 675, 675, 783, 1544,
+ 326, 329, 330, 267, 330, 329, 329, 329, 329, 329,
+ 329, 329, 331, 329, 329, 329, 803, 329, 333, 329,
+ 334, 329, 267, 267, 267, 267, 267, 267, 364, 267,
+ 364, 802, 364, 267, 364, 364, 267, 364, 367, 1769,
+ 679, 367, 679, 679, 365, 1770, 329, 329, 365, 746,
+ 713, 368, 675, 675, 675, 335, 678, 336, 678, 678,
+ 3457, 337, 675, 675, 675, 832, 338, 339, 329, 330,
+ 267, 330, 329, 329, 329, 329, 329, 329, 329, 331,
+ 329, 329, 329, 713, 329, 333, 329, 334, 329, 364,
+
+ 267, 364, 267, 267, 267, 267, 267, 267, 910, 364,
+ 267, 364, 364, 267, 364, 368, 763, 1771, 369, 777,
+ 703, 369, 760, 329, 329, 370, 756, 760, 370, 675,
+ 675, 675, 335, 759, 336, 675, 675, 675, 337, 675,
+ 675, 675, 1773, 338, 339, 343, 344, 267, 344, 343,
+ 343, 343, 343, 343, 343, 343, 345, 343, 343, 343,
+ 710, 343, 347, 343, 348, 343, 364, 267, 364, 364,
+ 267, 364, 267, 267, 267, 930, 267, 267, 267, 364,
+ 267, 364, 371, 1044, 1774, 371, 1045, 826, 372, 767,
+ 343, 343, 372, 754, 755, 368, 895, 349, 675, 675,
+
+ 675, 827, 713, 350, 768, 675, 675, 675, 675, 675,
+ 675, 982, 351, 343, 344, 267, 344, 343, 343, 343,
+ 343, 343, 343, 343, 345, 343, 343, 343, 930, 343,
+ 347, 343, 348, 343, 364, 267, 364, 267, 267, 267,
+ 267, 267, 267, 931, 364, 267, 364, 364, 267, 364,
+ 368, 679, 714, 373, 1782, 901, 373, 679, 343, 343,
+ 371, 679, 679, 371, 788, 349, 1555, 678, 675, 675,
+ 675, 350, 948, 678, 675, 675, 675, 678, 678, 1544,
+ 351, 355, 356, 267, 356, 355, 355, 355, 355, 355,
+ 355, 355, 357, 355, 355, 355, 1017, 355, 359, 355,
+
+ 360, 355, 364, 267, 364, 364, 267, 364, 267, 267,
+ 267, 714, 267, 267, 267, 364, 267, 364, 374, 679,
+ 679, 374, 679, 1783, 375, 832, 355, 355, 375, 793,
+ 1785, 376, 675, 675, 675, 678, 678, 361, 678, 675,
+ 675, 675, 675, 675, 675, 1789, 362, 355, 356, 267,
+ 356, 355, 355, 355, 355, 355, 355, 355, 357, 355,
+ 355, 355, 1008, 355, 359, 355, 360, 355, 364, 267,
+ 364, 267, 267, 267, 267, 267, 267, 713, 364, 267,
+ 364, 364, 267, 364, 376, 679, 949, 377, 1793, 1008,
+ 377, 1795, 355, 355, 374, 679, 1802, 374, 364, 267,
+
+ 364, 678, 807, 361, 364, 267, 364, 675, 675, 675,
+ 871, 678, 362, 1017, 378, 675, 675, 675, 751, 1803,
+ 378, 379, 380, 267, 380, 379, 379, 379, 379, 379,
+ 379, 379, 381, 379, 379, 379, 948, 379, 383, 379,
+ 384, 379, 390, 267, 390, 390, 267, 390, 267, 267,
+ 267, 957, 267, 267, 267, 958, 769, 679, 391, 1028,
+ 1018, 391, 760, 958, 392, 3457, 379, 379, 392, 679,
+ 679, 385, 758, 678, 871, 710, 813, 386, 675, 675,
+ 675, 387, 675, 675, 675, 678, 678, 388, 379, 380,
+ 267, 380, 379, 379, 379, 379, 379, 379, 379, 381,
+
+ 379, 379, 379, 697, 379, 383, 379, 384, 379, 390,
+ 267, 390, 390, 267, 390, 390, 267, 390, 909, 390,
+ 267, 390, 675, 675, 675, 391, 713, 828, 391, 1804,
+ 1805, 393, 1810, 379, 379, 393, 679, 679, 385, 829,
+ 830, 675, 675, 675, 386, 675, 675, 675, 387, 675,
+ 675, 675, 678, 678, 388, 394, 395, 267, 395, 394,
+ 394, 394, 394, 394, 394, 394, 396, 394, 394, 394,
+ 713, 394, 398, 394, 399, 394, 404, 267, 404, 404,
+ 267, 404, 267, 267, 267, 950, 267, 267, 267, 1053,
+ 679, 1811, 405, 1054, 1008, 405, 951, 842, 367, 952,
+
+ 394, 394, 367, 679, 679, 400, 678, 675, 675, 675,
+ 852, 401, 675, 675, 675, 675, 675, 675, 1018, 678,
+ 678, 1294, 402, 394, 395, 267, 395, 394, 394, 394,
+ 394, 394, 394, 394, 396, 394, 394, 394, 1207, 394,
+ 398, 394, 399, 394, 404, 267, 404, 404, 267, 404,
+ 404, 267, 404, 962, 404, 267, 404, 675, 675, 675,
+ 405, 679, 679, 405, 679, 1812, 406, 963, 394, 394,
+ 406, 857, 1813, 400, 675, 675, 675, 678, 678, 401,
+ 678, 675, 675, 675, 675, 675, 675, 675, 675, 675,
+ 402, 407, 408, 267, 408, 407, 407, 407, 407, 407,
+
+ 407, 407, 409, 407, 407, 407, 1814, 407, 411, 407,
+ 412, 407, 416, 267, 416, 416, 267, 416, 427, 267,
+ 427, 918, 427, 267, 427, 441, 267, 441, 417, 1177,
+ 1815, 417, 679, 1518, 428, 1177, 407, 407, 428, 863,
+ 885, 442, 675, 675, 675, 675, 675, 675, 678, 675,
+ 675, 675, 413, 1816, 877, 1734, 1823, 414, 407, 408,
+ 267, 408, 407, 407, 407, 407, 407, 407, 407, 409,
+ 407, 407, 407, 760, 407, 411, 407, 412, 407, 441,
+ 267, 441, 267, 267, 267, 267, 267, 267, 878, 441,
+ 267, 441, 441, 267, 441, 442, 714, 1824, 443, 679,
+
+ 1825, 443, 878, 407, 407, 442, 713, 679, 442, 675,
+ 675, 675, 675, 675, 675, 678, 675, 675, 675, 413,
+ 675, 675, 675, 678, 414, 418, 419, 267, 419, 418,
+ 418, 418, 418, 418, 418, 418, 420, 418, 418, 418,
+ 1830, 418, 422, 418, 423, 418, 441, 267, 441, 441,
+ 267, 441, 453, 267, 453, 1835, 453, 267, 453, 465,
+ 267, 465, 444, 1837, 1838, 444, 679, 679, 454, 679,
+ 418, 418, 454, 890, 679, 466, 675, 675, 675, 675,
+ 675, 675, 678, 678, 1844, 678, 424, 1849, 1850, 895,
+ 678, 1206, 425, 418, 419, 267, 419, 418, 418, 418,
+
+ 418, 418, 418, 418, 420, 418, 418, 418, 1329, 418,
+ 422, 418, 423, 418, 465, 267, 465, 483, 267, 483,
+ 483, 267, 483, 1651, 267, 267, 267, 267, 267, 267,
+ 466, 1860, 1863, 484, 1864, 1652, 484, 878, 418, 418,
+ 367, 1868, 1869, 367, 918, 714, 675, 675, 675, 901,
+ 675, 675, 675, 1872, 424, 675, 675, 675, 909, 1873,
+ 425, 429, 430, 267, 430, 429, 429, 429, 429, 429,
+ 429, 429, 431, 429, 429, 429, 1874, 429, 433, 429,
+ 434, 429, 483, 267, 483, 483, 267, 483, 483, 267,
+ 483, 1875, 483, 267, 483, 910, 713, 878, 484, 679,
+
+ 679, 484, 1876, 1877, 485, 714, 429, 429, 485, 435,
+ 760, 436, 675, 675, 675, 678, 678, 437, 675, 675,
+ 675, 675, 675, 675, 438, 1878, 1879, 439, 429, 430,
+ 267, 430, 429, 429, 429, 429, 429, 429, 429, 431,
+ 429, 429, 429, 1887, 429, 433, 429, 434, 429, 499,
+ 267, 499, 499, 267, 499, 515, 267, 515, 950, 515,
+ 267, 515, 1890, 679, 1891, 500, 1894, 679, 500, 951,
+ 914, 516, 966, 429, 429, 516, 435, 1177, 436, 678,
+ 675, 675, 675, 678, 437, 675, 675, 675, 675, 675,
+ 675, 438, 1896, 1179, 439, 445, 446, 267, 446, 445,
+
+ 445, 445, 445, 445, 445, 445, 447, 445, 445, 445,
+ 1898, 445, 449, 445, 450, 445, 526, 267, 526, 526,
+ 267, 526, 538, 267, 538, 967, 538, 267, 538, 551,
+ 267, 551, 527, 1899, 1901, 527, 679, 679, 539, 963,
+ 445, 445, 539, 923, 928, 552, 675, 675, 675, 675,
+ 675, 675, 678, 678, 1902, 1903, 451, 445, 446, 267,
+ 446, 445, 445, 445, 445, 445, 445, 445, 447, 445,
+ 445, 445, 1908, 445, 449, 445, 450, 445, 551, 267,
+ 551, 267, 267, 267, 267, 267, 267, 967, 551, 267,
+ 551, 551, 267, 551, 552, 1911, 1912, 367, 959, 1913,
+
+ 367, 1014, 445, 445, 552, 960, 1915, 552, 675, 675,
+ 675, 961, 934, 934, 934, 1194, 1194, 1194, 451, 455,
+ 456, 267, 456, 455, 455, 455, 455, 455, 455, 455,
+ 457, 455, 455, 455, 1918, 455, 459, 455, 460, 455,
+ 551, 267, 551, 551, 267, 551, 563, 267, 563, 969,
+ 563, 267, 563, 267, 267, 267, 553, 1919, 1921, 553,
+ 970, 972, 564, 952, 455, 455, 564, 969, 960, 565,
+ 461, 935, 972, 959, 973, 462, 1925, 1926, 970, 960,
+ 960, 966, 1534, 1534, 1534, 961, 973, 463, 455, 456,
+ 267, 456, 455, 455, 455, 455, 455, 455, 455, 457,
+
+ 455, 455, 455, 1927, 455, 459, 455, 460, 455, 267,
+ 267, 267, 563, 267, 563, 563, 267, 563, 967, 563,
+ 267, 563, 563, 267, 563, 565, 1929, 967, 564, 959,
+ 972, 564, 1019, 455, 455, 566, 960, 960, 566, 461,
+ 950, 1020, 1013, 1013, 462, 934, 934, 934, 1737, 1181,
+ 1943, 970, 1944, 1945, 966, 1947, 463, 467, 468, 267,
+ 468, 467, 467, 467, 467, 467, 467, 467, 469, 467,
+ 467, 467, 470, 467, 471, 467, 472, 467, 470, 470,
+ 470, 470, 470, 470, 470, 470, 470, 470, 470, 470,
+ 470, 470, 470, 470, 470, 470, 470, 470, 470, 470,
+
+ 470, 470, 467, 467, 470, 473, 474, 475, 470, 470,
+ 470, 470, 470, 476, 470, 470, 477, 470, 470, 470,
+ 478, 470, 479, 480, 481, 470, 470, 470, 470, 470,
+ 470, 486, 487, 267, 487, 486, 486, 486, 486, 486,
+ 486, 486, 488, 486, 486, 486, 1948, 486, 490, 486,
+ 491, 486, 577, 267, 577, 577, 267, 577, 267, 267,
+ 267, 1949, 267, 267, 267, 577, 267, 577, 578, 1348,
+ 1177, 578, 1555, 1950, 565, 1951, 486, 486, 565, 1349,
+ 492, 578, 1194, 1194, 1194, 1593, 1350, 493, 1952, 1953,
+ 494, 1218, 1218, 1218, 495, 1940, 496, 497, 486, 487,
+
+ 267, 487, 486, 486, 486, 486, 486, 486, 486, 488,
+ 486, 486, 486, 1954, 486, 490, 486, 491, 486, 577,
+ 267, 577, 577, 267, 577, 577, 267, 577, 1955, 589,
+ 267, 589, 589, 267, 589, 578, 1956, 1957, 579, 1959,
+ 1960, 579, 1961, 486, 486, 590, 1195, 492, 590, 1231,
+ 1231, 1231, 1962, 1232, 493, 1195, 1233, 494, 1218, 1218,
+ 1218, 495, 1965, 496, 497, 501, 502, 267, 502, 501,
+ 501, 501, 501, 501, 501, 501, 503, 501, 501, 501,
+ 1968, 501, 505, 501, 506, 501, 600, 267, 600, 600,
+ 267, 600, 267, 267, 267, 1969, 267, 267, 267, 979,
+
+ 979, 979, 601, 1970, 1971, 601, 1972, 1973, 565, 1977,
+ 501, 501, 565, 507, 508, 509, 980, 1978, 1241, 1241,
+ 1241, 510, 1242, 1980, 511, 1243, 1981, 1982, 512, 1984,
+ 1997, 513, 501, 502, 267, 502, 501, 501, 501, 501,
+ 501, 501, 501, 503, 501, 501, 501, 1998, 501, 505,
+ 501, 506, 501, 600, 267, 600, 600, 267, 600, 600,
+ 267, 600, 1999, 600, 267, 600, 987, 987, 987, 601,
+ 2000, 2001, 601, 2004, 2005, 602, 2006, 501, 501, 602,
+ 507, 508, 509, 988, 2007, 1263, 1263, 1263, 510, 1264,
+ 2012, 511, 1265, 2013, 2017, 512, 2022, 2023, 513, 517,
+
+ 518, 267, 518, 517, 517, 517, 517, 517, 517, 517,
+ 519, 517, 517, 517, 2032, 517, 521, 517, 522, 517,
+ 613, 267, 613, 613, 267, 613, 267, 267, 267, 2036,
+ 267, 267, 267, 1002, 1002, 1002, 614, 2038, 2044, 614,
+ 2045, 2046, 565, 2052, 517, 517, 565, 2053, 2054, 523,
+ 1003, 1590, 1590, 1590, 2055, 524, 517, 518, 267, 518,
+ 517, 517, 517, 517, 517, 517, 517, 519, 517, 517,
+ 517, 2058, 517, 521, 517, 522, 517, 613, 267, 613,
+ 613, 267, 613, 613, 267, 613, 2059, 613, 267, 613,
+ 1022, 1022, 1022, 614, 2070, 2076, 614, 2080, 2083, 615,
+
+ 2085, 517, 517, 615, 2086, 2088, 523, 1023, 1534, 1534,
+ 1534, 2089, 524, 528, 529, 267, 529, 528, 528, 528,
+ 528, 528, 528, 528, 530, 528, 528, 528, 2090, 528,
+ 532, 528, 533, 528, 628, 267, 628, 628, 267, 628,
+ 267, 267, 267, 2094, 267, 267, 267, 628, 267, 628,
+ 629, 2097, 2099, 629, 2106, 2114, 630, 2115, 528, 528,
+ 630, 2116, 534, 629, 1194, 1194, 1194, 2117, 2119, 535,
+ 1737, 1177, 536, 528, 529, 267, 529, 528, 528, 528,
+ 528, 528, 528, 528, 530, 528, 528, 528, 2134, 528,
+ 532, 528, 533, 528, 628, 267, 628, 628, 267, 628,
+
+ 628, 267, 628, 2137, 640, 267, 640, 640, 267, 640,
+ 629, 2141, 2135, 631, 2142, 1737, 631, 2143, 528, 528,
+ 641, 2146, 534, 641, 1218, 1218, 1218, 2147, 1271, 535,
+ 2149, 2150, 536, 540, 541, 267, 541, 540, 540, 540,
+ 540, 540, 540, 540, 542, 540, 540, 540, 2136, 540,
+ 544, 540, 545, 540, 650, 267, 650, 650, 267, 650,
+ 267, 267, 267, 2151, 267, 267, 267, 650, 267, 650,
+ 651, 2144, 2152, 651, 2153, 2154, 367, 2155, 540, 540,
+ 367, 2158, 546, 651, 1751, 1751, 1751, 2145, 1271, 547,
+ 2159, 2162, 548, 1754, 1754, 1754, 1759, 1759, 1759, 549,
+
+ 540, 541, 267, 541, 540, 540, 540, 540, 540, 540,
+ 540, 542, 540, 540, 540, 2163, 540, 544, 540, 545,
+ 540, 650, 267, 650, 650, 267, 650, 650, 267, 650,
+ 1752, 662, 267, 662, 662, 267, 662, 651, 2164, 1755,
+ 652, 2165, 2166, 652, 751, 540, 540, 663, 2168, 546,
+ 663, 1285, 1285, 1285, 761, 1286, 547, 2169, 1287, 548,
+ 1762, 1762, 1762, 1772, 1772, 1772, 549, 554, 555, 267,
+ 555, 554, 554, 554, 554, 554, 554, 554, 556, 554,
+ 554, 554, 762, 554, 558, 554, 559, 554, 673, 267,
+ 673, 673, 267, 673, 2172, 2175, 713, 1030, 1030, 1030,
+
+ 707, 1190, 1190, 1190, 674, 2179, 2180, 674, 2183, 2184,
+ 3457, 2185, 554, 554, 1031, 1046, 1046, 1046, 560, 1192,
+ 710, 2188, 1296, 1296, 1296, 2192, 1297, 2193, 710, 1298,
+ 2196, 2198, 1047, 561, 554, 555, 267, 555, 554, 554,
+ 554, 554, 554, 554, 554, 556, 554, 554, 554, 711,
+ 554, 558, 554, 559, 554, 712, 765, 1059, 1059, 1059,
+ 2203, 2211, 713, 1590, 1590, 1590, 714, 1061, 1061, 1061,
+ 2181, 2218, 766, 2219, 1060, 1067, 1067, 1067, 2182, 554,
+ 554, 1070, 1070, 1070, 1062, 560, 1319, 1319, 1319, 2186,
+ 1320, 2223, 1068, 1321, 1806, 1806, 1806, 2187, 1071, 2224,
+
+ 561, 567, 568, 267, 568, 567, 567, 567, 567, 567,
+ 567, 567, 569, 567, 567, 567, 2225, 567, 571, 567,
+ 572, 567, 1085, 1085, 1085, 1087, 1087, 1087, 1099, 1099,
+ 1099, 1107, 1107, 1107, 1112, 1112, 1112, 2194, 2194, 1086,
+ 1807, 2226, 1088, 2144, 2228, 1100, 567, 567, 1108, 2232,
+ 2233, 1113, 573, 2195, 2145, 574, 1337, 1337, 1337, 2195,
+ 1338, 2234, 2240, 1339, 1808, 1808, 1808, 575, 567, 568,
+ 267, 568, 567, 567, 567, 567, 567, 567, 567, 569,
+ 567, 567, 567, 2241, 567, 571, 567, 572, 567, 1118,
+ 1118, 1118, 1138, 1138, 1138, 1162, 1162, 1162, 1166, 1166,
+
+ 1166, 1171, 1171, 1171, 2242, 2246, 1119, 2247, 2258, 1139,
+ 1755, 2262, 1163, 567, 567, 1167, 2263, 2264, 1172, 573,
+ 2266, 2270, 574, 1340, 1340, 1340, 2274, 1341, 2275, 2276,
+ 1342, 1809, 1809, 1809, 575, 580, 581, 267, 581, 580,
+ 580, 580, 580, 580, 580, 580, 582, 580, 580, 580,
+ 2277, 580, 584, 580, 585, 580, 1190, 1190, 1190, 1226,
+ 1226, 1226, 2278, 2281, 1226, 1226, 1226, 979, 979, 979,
+ 1236, 1236, 1236, 1985, 1192, 2288, 2290, 1228, 2300, 1986,
+ 580, 580, 1228, 1987, 980, 2301, 586, 1988, 1238, 2302,
+ 2303, 587, 580, 581, 267, 581, 580, 580, 580, 580,
+
+ 580, 580, 580, 582, 580, 580, 580, 2305, 580, 584,
+ 580, 585, 580, 1737, 1193, 1236, 1236, 1236, 987, 987,
+ 987, 1252, 1252, 1252, 1229, 1244, 1244, 1244, 1247, 1247,
+ 1247, 2312, 2318, 1238, 1177, 988, 2319, 580, 580, 1254,
+ 2309, 1737, 1245, 586, 2310, 1248, 2320, 2321, 587, 591,
+ 592, 267, 592, 591, 591, 591, 591, 591, 591, 591,
+ 593, 591, 591, 591, 2324, 591, 595, 591, 596, 591,
+ 1259, 1259, 1259, 1259, 1259, 1259, 1002, 1002, 1002, 1239,
+ 1267, 1267, 1267, 2326, 1252, 1252, 1252, 2311, 1261, 2327,
+ 2328, 1261, 2329, 1003, 591, 591, 2333, 2338, 1269, 2340,
+
+ 597, 2341, 1254, 1351, 1351, 1351, 2342, 1352, 2346, 2352,
+ 1353, 1754, 1754, 1754, 2353, 598, 591, 592, 267, 592,
+ 591, 591, 591, 591, 591, 591, 591, 593, 591, 591,
+ 591, 1255, 591, 595, 591, 596, 591, 1262, 1267, 1267,
+ 1267, 1022, 1022, 1022, 2354, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1030, 1030, 1030, 2355, 2356, 1269, 1910, 1023, 2357,
+ 2358, 591, 591, 1292, 2359, 2360, 1292, 597, 1031, 1355,
+ 1355, 1355, 2361, 1356, 2367, 1270, 1357, 1751, 1751, 1751,
+ 2368, 2369, 598, 603, 604, 267, 604, 603, 603, 603,
+ 603, 603, 603, 603, 605, 603, 603, 603, 2370, 603,
+
+ 607, 603, 608, 603, 1300, 1300, 1300, 1300, 1300, 1300,
+ 1046, 1046, 1046, 2376, 1293, 1306, 1306, 1306, 1306, 1306,
+ 1306, 2378, 1302, 2382, 2384, 1302, 2386, 1047, 603, 603,
+ 1312, 1312, 1312, 1308, 609, 2387, 1308, 610, 1374, 1374,
+ 1374, 2392, 1375, 2393, 2395, 1376, 2396, 2397, 1314, 611,
+ 603, 604, 267, 604, 603, 603, 603, 603, 603, 603,
+ 603, 605, 603, 603, 603, 2398, 603, 607, 603, 608,
+ 603, 2402, 2403, 1303, 1312, 1312, 1312, 2404, 2405, 1309,
+ 1325, 1325, 1325, 2388, 1325, 1325, 1325, 1332, 1332, 1332,
+ 2413, 2389, 1314, 2414, 2415, 603, 603, 2416, 1327, 2419,
+
+ 2424, 609, 1327, 2390, 610, 1334, 1377, 1377, 1377, 2428,
+ 1378, 2391, 2429, 1379, 2434, 2435, 611, 616, 617, 267,
+ 617, 616, 616, 616, 616, 616, 616, 616, 618, 616,
+ 616, 616, 2436, 616, 620, 616, 621, 616, 2437, 1315,
+ 1059, 1059, 1059, 2439, 2430, 1328, 1332, 1332, 1332, 1061,
+ 1061, 1061, 2431, 1343, 1343, 1343, 2449, 1060, 1343, 1343,
+ 1343, 2461, 616, 616, 1334, 2432, 1062, 1754, 1754, 1754,
+ 622, 1345, 623, 2433, 1737, 624, 1345, 2462, 2463, 625,
+ 1958, 1958, 1958, 626, 616, 617, 267, 617, 616, 616,
+ 616, 616, 616, 616, 616, 618, 616, 616, 616, 2465,
+
+ 616, 620, 616, 621, 616, 1067, 1067, 1067, 1335, 1070,
+ 1070, 1070, 2468, 2469, 1358, 1358, 1358, 2455, 2470, 1346,
+ 2473, 2477, 1068, 1370, 1370, 1370, 1071, 2478, 2479, 616,
+ 616, 1359, 1085, 1085, 1085, 2480, 2481, 622, 2482, 623,
+ 1737, 1372, 624, 1759, 1759, 1759, 625, 2483, 2484, 1086,
+ 626, 632, 633, 267, 633, 632, 632, 632, 632, 632,
+ 632, 632, 634, 632, 632, 632, 2485, 632, 636, 632,
+ 637, 632, 1087, 1087, 1087, 1380, 1380, 1380, 1762, 1762,
+ 1762, 1772, 1772, 1772, 1370, 1370, 1370, 2456, 2486, 1088,
+ 2499, 2500, 1381, 3457, 3457, 3457, 632, 632, 3457, 3457,
+
+ 3457, 2501, 1372, 2502, 1394, 1394, 1394, 2503, 1395, 2505,
+ 3457, 1396, 1406, 1406, 1406, 3457, 1407, 2506, 2512, 1408,
+ 638, 632, 633, 267, 633, 632, 632, 632, 632, 632,
+ 632, 632, 634, 632, 632, 632, 2513, 632, 636, 632,
+ 637, 632, 1373, 2514, 1382, 1386, 1386, 1386, 2515, 2516,
+ 1383, 3457, 3457, 3457, 2517, 1099, 1099, 1099, 2518, 2521,
+ 3457, 3457, 3457, 1388, 2522, 2523, 632, 632, 3457, 1386,
+ 1386, 1386, 1100, 2528, 1414, 1414, 1414, 3457, 1415, 2529,
+ 2530, 1416, 1423, 1423, 1423, 2538, 1424, 1388, 2539, 1425,
+ 638, 642, 643, 267, 643, 642, 642, 642, 642, 642,
+
+ 642, 642, 644, 642, 642, 642, 1384, 642, 646, 642,
+ 647, 642, 1385, 1397, 1397, 1397, 1389, 1401, 1401, 1401,
+ 1401, 1401, 1401, 1107, 1107, 1107, 1409, 1409, 1409, 2524,
+ 1398, 1963, 1963, 1963, 2540, 1403, 642, 642, 1403, 2525,
+ 1108, 1966, 1966, 1966, 1411, 2541, 2550, 648, 642, 643,
+ 267, 643, 642, 642, 642, 642, 642, 642, 642, 644,
+ 642, 642, 642, 2551, 642, 646, 642, 647, 642, 2552,
+ 2553, 1404, 1409, 1409, 1409, 1112, 1112, 1112, 1418, 1418,
+ 1418, 1418, 1418, 1418, 1118, 1118, 1118, 1967, 2555, 2557,
+ 1411, 2582, 1113, 642, 642, 1964, 1420, 1737, 2583, 1420,
+
+ 1737, 1119, 2585, 2586, 648, 653, 654, 267, 654, 653,
+ 653, 653, 653, 653, 653, 653, 655, 653, 653, 653,
+ 2587, 653, 657, 653, 658, 653, 2588, 2589, 1421, 1429,
+ 1429, 1429, 2578, 1412, 2579, 1429, 1429, 1429, 1433, 1433,
+ 1433, 1435, 1435, 1435, 1438, 1438, 1438, 1431, 2593, 2594,
+ 653, 653, 2595, 1431, 2596, 1434, 2597, 2598, 1436, 2599,
+ 2600, 659, 1440, 1455, 1455, 1455, 2601, 1456, 2602, 2603,
+ 1457, 1974, 1974, 1974, 660, 653, 654, 267, 654, 653,
+ 653, 653, 653, 653, 653, 653, 655, 653, 653, 653,
+ 1432, 653, 657, 653, 658, 653, 1443, 1443, 1443, 2605,
+
+ 2606, 3457, 3457, 3457, 2609, 1438, 1438, 1438, 2610, 2611,
+ 1447, 1447, 1447, 1444, 1450, 1450, 1450, 1975, 3457, 2612,
+ 653, 653, 2615, 1440, 3457, 3457, 3457, 1448, 1806, 1806,
+ 1806, 659, 1452, 1495, 1495, 1495, 2616, 1496, 2617, 2618,
+ 1497, 3457, 2620, 2621, 660, 664, 665, 267, 665, 664,
+ 664, 664, 664, 664, 664, 664, 666, 664, 664, 664,
+ 1437, 664, 668, 664, 669, 664, 1441, 1450, 1450, 1450,
+ 2623, 3457, 3457, 3457, 1445, 1138, 1138, 1138, 1458, 1458,
+ 1458, 1458, 1458, 1458, 2624, 1452, 2630, 2631, 3457, 1446,
+ 664, 664, 1139, 1462, 1462, 1462, 1460, 2632, 2633, 1460,
+
+ 2637, 670, 2607, 2638, 1453, 1502, 1502, 1502, 2639, 1503,
+ 1463, 2608, 1504, 2640, 671, 664, 665, 267, 665, 664,
+ 664, 664, 664, 664, 664, 664, 666, 664, 664, 664,
+ 1449, 664, 668, 664, 669, 664, 1461, 1464, 1464, 1464,
+ 1466, 1466, 1466, 2641, 1466, 1466, 1466, 1470, 1470, 1470,
+ 1474, 1474, 1474, 2645, 1465, 3457, 3457, 3457, 1468, 2648,
+ 664, 664, 1468, 2653, 1471, 2654, 2657, 1475, 1476, 1476,
+ 1476, 670, 3457, 1485, 1485, 1485, 1491, 1491, 1491, 1476,
+ 1476, 1476, 2649, 2666, 671, 679, 1478, 2613, 1485, 1485,
+ 1485, 1487, 694, 2667, 1493, 2650, 2614, 1478, 1491, 1491,
+
+ 1491, 678, 695, 2668, 2669, 1472, 1487, 1162, 1162, 1162,
+ 1498, 1498, 1498, 2670, 2673, 1469, 1493, 1166, 1166, 1166,
+ 1473, 1498, 1498, 1498, 1163, 1506, 1506, 1506, 1500, 696,
+ 697, 698, 2651, 2674, 1167, 699, 700, 701, 2695, 1500,
+ 702, 703, 2696, 1508, 704, 2652, 705, 706, 707, 679,
+ 1479, 1177, 1488, 1506, 1506, 1506, 751, 1171, 1171, 1171,
+ 1737, 2698, 1494, 2699, 1737, 678, 752, 1989, 1510, 1510,
+ 1510, 1508, 1511, 1990, 1172, 1512, 2700, 1991, 1514, 1514,
+ 1514, 1992, 1501, 2709, 1514, 1514, 1514, 2710, 1190, 1190,
+ 1190, 2692, 2711, 696, 753, 708, 1516, 2693, 2712, 754,
+
+ 755, 701, 1516, 2713, 756, 703, 1192, 2694, 757, 2714,
+ 758, 759, 707, 1190, 1190, 1190, 2715, 1509, 1190, 1190,
+ 1190, 1557, 1557, 1557, 1226, 1226, 1226, 2716, 1226, 1226,
+ 1226, 1192, 1226, 1226, 1226, 2717, 1192, 2718, 1558, 1560,
+ 1560, 1560, 1228, 2719, 2721, 1517, 1228, 1231, 1231, 1231,
+ 1228, 1232, 2722, 2723, 1233, 2724, 1561, 3457, 3457, 3457,
+ 1236, 1236, 1236, 2725, 2726, 1526, 1236, 1236, 1236, 1236,
+ 1236, 1236, 2727, 2703, 3457, 1241, 1241, 1241, 1238, 1242,
+ 2728, 1559, 1243, 2704, 1238, 2729, 2705, 1238, 1244, 1244,
+ 1244, 1566, 1566, 1566, 2730, 1567, 2731, 2732, 1568, 2733,
+
+ 1569, 1569, 1569, 2734, 2735, 1245, 1247, 1247, 1247, 1575,
+ 1575, 1575, 1252, 1252, 1252, 2706, 1564, 1570, 1562, 2736,
+ 1571, 1571, 1571, 1248, 1572, 2707, 1576, 1573, 2708, 2739,
+ 1254, 1252, 1252, 1252, 1252, 1252, 1252, 1580, 1580, 1580,
+ 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1254,
+ 2740, 2748, 1254, 2749, 1581, 1263, 1263, 1263, 1261, 1264,
+ 2750, 1261, 1265, 2753, 1261, 1267, 1267, 1267, 1267, 1267,
+ 1267, 1585, 1585, 1585, 1285, 1285, 1285, 2754, 1286, 2758,
+ 2759, 1287, 2760, 1269, 2761, 2762, 1269, 2763, 2771, 1586,
+ 1602, 1602, 1602, 1583, 1578, 1290, 1290, 1290, 1290, 1290,
+
+ 1290, 1290, 1290, 1290, 1296, 1296, 1296, 1603, 1297, 2772,
+ 2773, 1298, 2799, 1292, 1177, 2801, 1292, 2802, 1737, 1292,
+ 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1609,
+ 1609, 1609, 3457, 3457, 3457, 1306, 1306, 1306, 1302, 2803,
+ 2807, 1302, 2808, 2796, 1302, 2811, 1610, 2812, 2815, 3457,
+ 1306, 1306, 1306, 1308, 1306, 1306, 1306, 1613, 1613, 1613,
+ 2797, 1737, 1604, 3457, 3457, 3457, 2816, 2817, 1308, 1808,
+ 1808, 1808, 1308, 2818, 1614, 1312, 1312, 1312, 2819, 1611,
+ 3457, 1312, 1312, 1312, 1312, 1312, 1312, 1608, 1619, 1619,
+ 1619, 1615, 2820, 1314, 1319, 1319, 1319, 2821, 1320, 1314,
+
+ 2822, 1321, 1314, 2798, 2823, 1620, 1325, 1325, 1325, 1325,
+ 1325, 1325, 1325, 1325, 1325, 1627, 1627, 1627, 1332, 1332,
+ 1332, 1612, 2825, 2826, 1327, 2827, 2828, 1327, 2829, 2830,
+ 1327, 2809, 1628, 1332, 1332, 1332, 1334, 1332, 1332, 1332,
+ 1630, 1630, 1630, 2813, 2810, 1337, 1337, 1337, 2831, 1338,
+ 1616, 1334, 1339, 2832, 2833, 1334, 2814, 1631, 1340, 1340,
+ 1340, 2834, 1341, 2835, 2836, 1342, 1343, 1343, 1343, 1343,
+ 1343, 1343, 1343, 1343, 1343, 2837, 2839, 1624, 1351, 1351,
+ 1351, 2851, 1352, 2852, 1345, 1353, 2860, 1345, 2861, 2862,
+ 1345, 1637, 1637, 1637, 1355, 1355, 1355, 2863, 1356, 2864,
+
+ 2865, 1357, 2866, 2873, 1629, 1358, 1358, 1358, 1638, 1639,
+ 1639, 1639, 2876, 1640, 2883, 2884, 1641, 1370, 1370, 1370,
+ 2885, 2886, 1359, 1370, 1370, 1370, 1370, 1370, 1370, 1374,
+ 1374, 1374, 2887, 1375, 2888, 1372, 1376, 1632, 1377, 1377,
+ 1377, 1372, 1378, 1177, 1372, 1379, 1380, 1380, 1380, 1654,
+ 1654, 1654, 2901, 1655, 1737, 2903, 1656, 1386, 1386, 1386,
+ 1386, 1386, 1386, 1381, 1386, 1386, 1386, 1394, 1394, 1394,
+ 2904, 1395, 2905, 2906, 1396, 1388, 2781, 2907, 1388, 1397,
+ 1397, 1397, 1388, 1666, 1666, 1666, 2782, 1667, 2908, 2898,
+ 1668, 2897, 2783, 1653, 2909, 2910, 1398, 1401, 1401, 1401,
+
+ 1401, 1401, 1401, 1401, 1401, 1401, 1406, 1406, 1406, 2911,
+ 1407, 2912, 1661, 1408, 2915, 1403, 2916, 2917, 1403, 2918,
+ 2919, 1403, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409,
+ 1409, 1414, 1414, 1414, 2920, 1415, 2921, 2922, 1416, 2924,
+ 1411, 2925, 2926, 1411, 2927, 2891, 1411, 1418, 1418, 1418,
+ 1418, 1418, 1418, 2928, 1671, 1418, 1418, 1418, 2892, 1423,
+ 1423, 1423, 2929, 1424, 2893, 1420, 1425, 2930, 1420, 1429,
+ 1429, 1429, 2931, 1420, 1429, 1429, 1429, 2894, 1429, 1429,
+ 1429, 1433, 1433, 1433, 1682, 1682, 1682, 1431, 1683, 2932,
+ 2933, 1684, 1431, 2934, 2935, 1673, 1431, 2936, 1434, 1435,
+
+ 1435, 1435, 2948, 2949, 1676, 1685, 1685, 1685, 2950, 1686,
+ 2957, 2958, 1687, 1438, 1438, 1438, 1436, 1438, 1438, 1438,
+ 2959, 1438, 1438, 1438, 1443, 1443, 1443, 2960, 1447, 1447,
+ 1447, 1440, 1809, 1809, 1809, 1440, 2961, 2784, 1681, 1440,
+ 2962, 1444, 1691, 1691, 1691, 1448, 1692, 2785, 2963, 1693,
+ 1696, 1696, 1696, 2786, 1697, 2964, 2968, 1698, 1450, 1450,
+ 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1455, 1455, 1455,
+ 2969, 1456, 2977, 2978, 1457, 2979, 1452, 2971, 2980, 1452,
+ 2970, 2981, 1452, 1458, 1458, 1458, 2982, 2972, 1689, 1458,
+ 1458, 1458, 1458, 1458, 1458, 1462, 1462, 1462, 1703, 1703,
+
+ 1703, 1460, 1704, 2986, 2987, 1705, 2988, 1460, 2989, 2973,
+ 1460, 2975, 1463, 1464, 1464, 1464, 1706, 1706, 1706, 2974,
+ 1707, 2976, 2999, 1708, 1466, 1466, 1466, 3000, 1700, 3001,
+ 1465, 1466, 1466, 1466, 3002, 1466, 1466, 1466, 1470, 1470,
+ 1470, 3003, 1468, 1710, 1710, 1710, 3004, 1711, 3005, 1468,
+ 1712, 3006, 1702, 1468, 3010, 1471, 1474, 1474, 1474, 1715,
+ 1715, 1715, 1177, 1716, 3011, 3012, 1717, 1476, 1476, 1476,
+ 1476, 1476, 1476, 1475, 1476, 1476, 1476, 1720, 1720, 1720,
+ 1485, 1485, 1485, 3013, 3014, 1478, 3015, 3017, 1478, 1485,
+ 1485, 1485, 1478, 3018, 1721, 3019, 2990, 1709, 1487, 1485,
+
+ 1485, 1485, 1491, 1491, 1491, 3020, 3021, 1487, 1491, 1491,
+ 1491, 1491, 1491, 1491, 1495, 1495, 1495, 1487, 1496, 3022,
+ 1493, 1497, 1498, 1498, 1498, 3023, 1493, 3024, 3028, 1493,
+ 1498, 1498, 1498, 1498, 1498, 1498, 1718, 1502, 1502, 1502,
+ 1500, 1503, 3029, 3030, 1504, 1506, 1506, 1506, 1500, 3033,
+ 3034, 1500, 1506, 1506, 1506, 1506, 1506, 1506, 3035, 3036,
+ 1725, 3037, 3038, 1508, 1728, 1510, 1510, 1510, 3043, 1511,
+ 1508, 3044, 1512, 1508, 1514, 1514, 1514, 1514, 1514, 1514,
+ 1514, 1514, 1514, 1736, 1736, 1736, 1190, 1190, 1190, 1557,
+ 1557, 1557, 1516, 1729, 3045, 1516, 3046, 3047, 1516, 3048,
+
+ 3049, 1737, 1738, 3050, 1192, 3051, 1558, 1775, 1775, 1775,
+ 3052, 1776, 3053, 3054, 1777, 3056, 1731, 1226, 1226, 1226,
+ 1560, 1560, 1560, 3057, 1779, 1779, 1779, 3058, 1780, 3059,
+ 1733, 1781, 1236, 1236, 1236, 1228, 1177, 1561, 1566, 1566,
+ 1566, 3066, 1567, 3067, 3068, 1568, 1569, 1569, 1569, 3069,
+ 1238, 3070, 1743, 1786, 1786, 1786, 3071, 1787, 3072, 3073,
+ 1788, 3074, 3075, 1570, 1571, 1571, 1571, 3076, 1572, 3077,
+ 3078, 1573, 1575, 1575, 1575, 1778, 1790, 1790, 1790, 3060,
+ 1791, 1784, 3079, 1792, 1252, 1252, 1252, 3082, 3083, 1576,
+ 1580, 1580, 1580, 1796, 1796, 1796, 3084, 1797, 3085, 3086,
+
+ 1798, 3087, 1254, 1799, 1799, 1799, 3088, 1581, 1259, 1259,
+ 1259, 1585, 1585, 1585, 1817, 1817, 1817, 2035, 2035, 2035,
+ 1800, 1602, 1602, 1602, 3089, 3090, 1261, 3096, 3097, 1586,
+ 3098, 1818, 3105, 3106, 1794, 1819, 1819, 1819, 1603, 1820,
+ 3107, 3108, 1821, 1290, 1290, 1290, 1300, 1300, 1300, 1609,
+ 1609, 1609, 1827, 1827, 1827, 3109, 1828, 1801, 3110, 1829,
+ 3111, 1292, 3112, 3113, 1302, 3114, 1610, 1306, 1306, 1306,
+ 1613, 1613, 1613, 1832, 1832, 1832, 3115, 1833, 3116, 3119,
+ 1834, 1312, 1312, 1312, 3120, 1308, 3121, 1614, 1619, 1619,
+ 1619, 1839, 1839, 1839, 3122, 1840, 3130, 3125, 1841, 1314,
+
+ 1842, 1842, 1842, 1177, 3131, 1620, 3132, 1822, 3128, 3133,
+ 1826, 1845, 1845, 1845, 1325, 1325, 1325, 1843, 1627, 1627,
+ 1627, 3134, 1851, 1851, 1851, 3135, 1852, 1831, 1846, 1853,
+ 3136, 3137, 1327, 3140, 3125, 1628, 1854, 1854, 1854, 1630,
+ 1630, 1630, 1836, 1856, 1856, 1856, 3141, 1857, 3126, 3123,
+ 1858, 1343, 1343, 1343, 1855, 3144, 1631, 1847, 1861, 1861,
+ 1861, 1637, 1637, 1637, 1865, 1865, 1865, 3145, 1866, 1345,
+ 3146, 1867, 1639, 1639, 1639, 1862, 1640, 3138, 1638, 1641,
+ 1848, 1870, 1870, 1870, 1370, 1370, 1370, 1654, 1654, 1654,
+ 3142, 1655, 3147, 3148, 1656, 1881, 1881, 1881, 1871, 3457,
+
+ 3457, 3457, 1372, 3457, 3457, 3457, 3457, 3457, 3457, 1386,
+ 1386, 1386, 1882, 1888, 1888, 1888, 3457, 1859, 3156, 3139,
+ 3457, 3149, 3161, 3457, 1666, 1666, 1666, 1388, 1667, 3143,
+ 1889, 1668, 3162, 3150, 1892, 1892, 1892, 1401, 1401, 1401,
+ 1409, 1409, 1409, 1418, 1418, 1418, 1904, 1904, 1904, 1880,
+ 1884, 1893, 1429, 1429, 1429, 1403, 3163, 3164, 1411, 3165,
+ 3166, 1420, 3151, 1905, 1886, 3157, 1438, 1438, 1438, 1883,
+ 1431, 1682, 1682, 1682, 3152, 1683, 1885, 3158, 1684, 1685,
+ 1685, 1685, 3169, 1686, 1440, 3169, 1687, 1691, 1691, 1691,
+ 1177, 1692, 1906, 3172, 1693, 1696, 1696, 1696, 3173, 1697,
+
+ 1900, 1895, 1698, 1450, 1450, 1450, 1897, 3159, 3174, 1907,
+ 1458, 1458, 1458, 1703, 1703, 1703, 3125, 1704, 3175, 3160,
+ 1705, 1452, 1706, 1706, 1706, 3176, 1707, 3179, 1460, 1708,
+ 3126, 3167, 1909, 1466, 1466, 1466, 1710, 1710, 1710, 3125,
+ 1711, 1737, 1738, 1712, 3177, 1715, 1715, 1715, 3190, 1716,
+ 3128, 1468, 1717, 1476, 1476, 1476, 1720, 1720, 1720, 1922,
+ 1922, 1922, 3178, 1923, 1914, 3188, 1924, 1916, 1485, 1485,
+ 1485, 1478, 3193, 1721, 1930, 1930, 1930, 1491, 1491, 1491,
+ 1917, 1498, 1498, 1498, 3189, 3198, 1487, 1934, 1934, 1934,
+ 3191, 1931, 1506, 1506, 1506, 1493, 1937, 1937, 1937, 1500,
+
+ 1920, 1514, 1514, 1514, 1935, 1736, 1736, 1736, 3201, 3192,
+ 1508, 3180, 3196, 1938, 1190, 1190, 1190, 1928, 3199, 1516,
+ 1775, 1775, 1775, 1737, 1776, 3202, 3181, 1777, 1226, 1226,
+ 1226, 3197, 1192, 1933, 1779, 1779, 1779, 3200, 1780, 3203,
+ 3169, 1781, 2488, 2489, 1932, 2490, 1228, 1236, 1236, 1236,
+ 3205, 3169, 1939, 2491, 1936, 3206, 1941, 1786, 1786, 1786,
+ 2492, 1787, 3207, 3208, 1788, 1238, 1946, 1790, 1790, 1790,
+ 3209, 1791, 3210, 1942, 1792, 1252, 1252, 1252, 1796, 1796,
+ 1796, 3211, 1797, 3212, 3213, 1798, 1799, 1799, 1799, 3223,
+ 1993, 1993, 1993, 1254, 1994, 1976, 3224, 1995, 1979, 1259,
+
+ 1259, 1259, 3225, 1800, 2002, 2002, 2002, 2002, 2002, 2002,
+ 1963, 1963, 1963, 1817, 1817, 1817, 3226, 1261, 2008, 2008,
+ 2008, 3227, 2009, 3228, 3232, 2010, 3233, 1819, 1819, 1819,
+ 1818, 1820, 3234, 3235, 1821, 3236, 1983, 1290, 1290, 1290,
+ 2014, 2014, 2014, 1300, 1300, 1300, 3237, 1827, 1827, 1827,
+ 1996, 1828, 3238, 3239, 1829, 1292, 3241, 2015, 1306, 1306,
+ 1306, 1302, 1832, 1832, 1832, 3242, 1833, 3243, 2003, 1834,
+ 3244, 1964, 3245, 3246, 2003, 3247, 1308, 2019, 2019, 2019,
+ 1312, 1312, 1312, 3252, 2011, 1839, 1839, 1839, 3253, 1840,
+ 2016, 3254, 1841, 3248, 2020, 1842, 1842, 1842, 1314, 2024,
+
+ 2024, 2024, 3255, 2025, 3256, 3249, 2026, 3250, 2027, 2027,
+ 2027, 3257, 1843, 1845, 1845, 1845, 2029, 2029, 2029, 3251,
+ 2030, 3258, 3259, 2031, 2018, 2028, 3260, 2033, 2033, 2033,
+ 1846, 1851, 1851, 1851, 3261, 1852, 3262, 3263, 1853, 1854,
+ 1854, 1854, 3264, 3265, 2021, 2034, 1856, 1856, 1856, 1177,
+ 1857, 3267, 3268, 1858, 1343, 1343, 1343, 1855, 1861, 1861,
+ 1861, 2039, 2039, 2039, 3269, 2040, 3270, 3271, 2041, 2042,
+ 2042, 2042, 1345, 3272, 3266, 1862, 1865, 1865, 1865, 3273,
+ 1866, 3274, 3275, 1867, 3276, 3277, 2043, 1870, 1870, 1870,
+ 2047, 2047, 2047, 3278, 2048, 3279, 3280, 2049, 3281, 3282,
+
+ 2037, 2050, 2050, 2050, 1871, 2056, 2056, 2056, 1370, 1370,
+ 1370, 1881, 1881, 1881, 2064, 2064, 2064, 3283, 2051, 3457,
+ 3457, 3457, 2057, 2061, 2061, 2061, 1372, 2062, 1882, 3284,
+ 2063, 2065, 2067, 2067, 2067, 3285, 3457, 1386, 1386, 1386,
+ 1888, 1888, 1888, 2071, 2071, 2071, 3286, 2072, 3287, 2068,
+ 2073, 2074, 2074, 2074, 3288, 1388, 3290, 1889, 1892, 1892,
+ 1892, 3291, 2077, 2077, 2077, 3292, 2078, 3293, 2075, 2079,
+ 2081, 2081, 2081, 3294, 2060, 1893, 3295, 2066, 1409, 1409,
+ 1409, 3296, 1418, 1418, 1418, 1904, 1904, 1904, 2082, 3297,
+ 3298, 2091, 2091, 2091, 1177, 2092, 1411, 2069, 2093, 3299,
+
+ 1420, 3300, 1905, 2095, 2095, 2095, 1438, 1438, 1438, 2100,
+ 2100, 2100, 3301, 3289, 2102, 2102, 2102, 3457, 3457, 3457,
+ 3302, 2096, 3303, 3304, 1440, 3305, 2101, 3306, 3307, 2084,
+ 2087, 2103, 3308, 3309, 3457, 1450, 1450, 1450, 1458, 1458,
+ 1458, 1466, 1466, 1466, 2109, 2109, 2109, 2111, 2111, 2111,
+ 1476, 1476, 1476, 1452, 3311, 3312, 1460, 2098, 3313, 1468,
+ 3314, 2110, 3315, 1177, 2112, 1922, 1922, 1922, 1478, 1923,
+ 3316, 3317, 1924, 1485, 1485, 1485, 1930, 1930, 1930, 2493,
+ 2494, 2104, 2495, 3310, 2107, 2120, 2120, 2120, 3318, 2121,
+ 2496, 1487, 2122, 1931, 1491, 1491, 1491, 2497, 3319, 1498,
+
+ 1498, 1498, 2105, 1934, 1934, 1934, 2108, 2125, 2125, 2125,
+ 3320, 2126, 1493, 3321, 2127, 2113, 3322, 1500, 3323, 3324,
+ 1935, 2128, 2128, 2128, 2118, 1937, 1937, 1937, 2130, 2130,
+ 2130, 3325, 2131, 3326, 3327, 2132, 2148, 2148, 2148, 2129,
+ 3328, 3329, 1938, 1514, 1514, 1514, 2138, 2138, 2138, 1190,
+ 1190, 1190, 3330, 2123, 2124, 1958, 1958, 1958, 2156, 2156,
+ 2156, 1516, 3332, 2139, 1963, 1963, 1963, 1192, 2157, 2157,
+ 2157, 1966, 1966, 1966, 2160, 2160, 2160, 2161, 2161, 2161,
+ 1974, 1974, 1974, 3333, 1226, 1226, 1226, 2170, 2170, 2170,
+ 2173, 2173, 2173, 1252, 1252, 1252, 2177, 2177, 2177, 3334,
+
+ 1177, 2133, 1228, 3335, 3336, 2171, 3331, 2174, 3337, 3338,
+ 2140, 1254, 3339, 2178, 1993, 1993, 1993, 3340, 1994, 3341,
+ 3342, 1995, 1259, 1259, 1259, 2190, 2190, 2190, 2002, 2002,
+ 2002, 2197, 2197, 2197, 2167, 3343, 2199, 2199, 2199, 3345,
+ 1261, 3346, 2191, 2008, 2008, 2008, 3347, 2009, 3348, 3349,
+ 2010, 3350, 2176, 2200, 1290, 1290, 1290, 2204, 2204, 2204,
+ 2014, 2014, 2014, 2207, 2207, 2207, 3351, 2208, 2189, 3352,
+ 2209, 3354, 1292, 3355, 2205, 3356, 3357, 2015, 1300, 1300,
+ 1300, 1177, 2201, 2212, 2212, 2212, 3358, 2019, 2019, 2019,
+ 2214, 2214, 2214, 3359, 2215, 3344, 1302, 2216, 1312, 1312,
+
+ 1312, 2213, 3360, 2206, 2020, 3361, 3364, 2202, 2024, 2024,
+ 2024, 3365, 2025, 3366, 3367, 2026, 1314, 2027, 2027, 2027,
+ 2220, 2220, 2220, 3368, 2221, 3369, 1177, 2222, 2029, 2029,
+ 2029, 2210, 2030, 1177, 2028, 2031, 2033, 2033, 2033, 2035,
+ 2035, 2035, 1343, 1343, 1343, 2217, 2039, 2039, 2039, 1177,
+ 2040, 1177, 1758, 2041, 2034, 2042, 2042, 2042, 1177, 1177,
+ 1345, 2229, 2229, 2229, 1177, 2230, 3410, 1177, 2231, 2047,
+ 2047, 2047, 2043, 2048, 3372, 1177, 2049, 2050, 2050, 2050,
+ 2235, 2235, 2235, 1177, 2236, 3370, 1177, 2237, 2238, 2238,
+ 2238, 2056, 2056, 2056, 2051, 2243, 2243, 2243, 3384, 2244,
+
+ 2227, 3386, 2245, 3371, 1177, 2239, 3373, 3374, 2057, 1370,
+ 1370, 1370, 2061, 2061, 2061, 1177, 2062, 1177, 1177, 2063,
+ 2064, 2064, 2064, 3375, 2249, 2249, 2249, 1372, 2250, 3392,
+ 3376, 2251, 2252, 2252, 2252, 1757, 3380, 2065, 2067, 2067,
+ 2067, 2254, 2254, 2254, 1177, 2255, 3381, 3404, 2256, 2253,
+ 1386, 1386, 1386, 1756, 1177, 2068, 3388, 2071, 2071, 2071,
+ 2248, 2072, 3377, 3393, 2073, 2074, 2074, 2074, 1388, 2259,
+ 2259, 2259, 3382, 2260, 1177, 3383, 2261, 2077, 2077, 2077,
+ 1177, 2078, 2075, 1177, 2079, 2081, 2081, 2081, 1409, 1409,
+ 1409, 2267, 2267, 2267, 1418, 1418, 1418, 2271, 2271, 2271,
+
+ 3378, 2257, 1177, 2082, 1177, 1177, 1411, 1177, 2268, 2091,
+ 2091, 2091, 1420, 2092, 2272, 3389, 2093, 2095, 2095, 2095,
+ 2279, 2279, 2279, 2100, 2100, 2100, 2282, 2282, 2282, 1177,
+ 2283, 1177, 3379, 2284, 1177, 2096, 1177, 3396, 2280, 3387,
+ 2101, 1177, 3390, 2273, 2102, 2102, 2102, 2285, 2285, 2285,
+ 1177, 2286, 2265, 1753, 2287, 2269, 1450, 1450, 1450, 1177,
+ 3422, 2103, 1458, 1458, 1458, 1466, 1466, 1466, 2109, 2109,
+ 2109, 2293, 2293, 2293, 1452, 2294, 3385, 1177, 2295, 1177,
+ 1460, 3432, 3397, 1468, 3405, 2110, 2111, 2111, 2111, 2296,
+ 2296, 2296, 1177, 2297, 3391, 3398, 2298, 1476, 1476, 1476,
+
+ 1485, 1485, 1485, 2112, 1177, 2120, 2120, 2120, 3399, 2121,
+ 1177, 2291, 2122, 1177, 3394, 1478, 3395, 1177, 1487, 1491,
+ 1491, 1491, 2289, 1498, 1498, 1498, 3402, 2125, 2125, 2125,
+ 2292, 2126, 1177, 1177, 2127, 1177, 1177, 1493, 2128, 2128,
+ 2128, 1500, 2130, 2130, 2130, 3400, 2131, 3454, 3401, 2132,
+ 1514, 1514, 1514, 2317, 2317, 2317, 2129, 2138, 2138, 2138,
+ 1177, 1177, 2299, 1750, 1749, 2304, 3403, 3426, 1516, 3411,
+ 2306, 2313, 2313, 2313, 2139, 2314, 2307, 3416, 2315, 1190,
+ 1190, 1190, 2322, 2322, 2322, 2323, 2323, 2323, 2148, 2148,
+ 2148, 2325, 2325, 2325, 1177, 3408, 2308, 1192, 2330, 2330,
+
+ 2330, 2156, 2156, 2156, 2157, 2157, 2157, 2331, 2331, 2331,
+ 2160, 2160, 2160, 2161, 2161, 2161, 2334, 2334, 2334, 2335,
+ 2335, 2335, 2336, 2336, 2336, 2337, 2337, 2337, 1226, 1226,
+ 1226, 2170, 2170, 2170, 2173, 2173, 2173, 2343, 2343, 2343,
+ 3406, 2344, 3430, 2316, 2345, 1177, 1228, 1748, 1177, 2171,
+ 1177, 2174, 1747, 2332, 2347, 2347, 2347, 2177, 2177, 2177,
+ 2349, 2349, 2349, 1177, 2350, 3431, 1746, 2351, 1259, 1259,
+ 1259, 1177, 2348, 1177, 2178, 2190, 2190, 2190, 1177, 2339,
+ 2363, 2363, 2363, 3409, 2364, 1177, 1261, 2365, 2366, 2366,
+ 2366, 3407, 2191, 2197, 2197, 2197, 2371, 2371, 2371, 2199,
+
+ 2199, 2199, 2373, 2373, 2373, 3417, 2374, 1177, 3414, 2375,
+ 1290, 1290, 1290, 2204, 2204, 2204, 2200, 2362, 2379, 2379,
+ 2379, 1177, 2380, 1177, 3418, 2381, 3436, 3412, 1292, 1177,
+ 2205, 2207, 2207, 2207, 3413, 2208, 1177, 1177, 2209, 1300,
+ 1300, 1300, 2372, 1177, 2212, 2212, 2212, 2214, 2214, 2214,
+ 3423, 2215, 1745, 3419, 2216, 1177, 1744, 1302, 1312, 1312,
+ 1312, 2377, 2213, 2220, 2220, 2220, 3415, 2221, 1177, 3428,
+ 2222, 1343, 1343, 1343, 3420, 1177, 1314, 2229, 2229, 2229,
+ 1177, 2230, 1177, 1177, 2231, 2238, 2238, 2238, 3424, 1345,
+ 2383, 2235, 2235, 2235, 1177, 2236, 3437, 1177, 2237, 2399,
+
+ 2399, 2399, 2239, 2400, 3425, 3421, 2401, 1177, 2243, 2243,
+ 2243, 2385, 2244, 1177, 3427, 2245, 2406, 2406, 2406, 1370,
+ 1370, 1370, 3433, 2249, 2249, 2249, 2394, 2250, 3429, 3440,
+ 2251, 3434, 1742, 2407, 2252, 2252, 2252, 1372, 2409, 2409,
+ 2409, 1177, 2410, 1177, 3435, 2411, 2254, 2254, 2254, 1177,
+ 2255, 2253, 1177, 2256, 1386, 1386, 1386, 2259, 2259, 2259,
+ 1741, 2260, 1177, 1740, 2261, 1739, 2417, 2417, 2417, 2267,
+ 2267, 2267, 1388, 2420, 2420, 2420, 3438, 2421, 3439, 1177,
+ 2422, 3444, 1177, 2408, 2418, 1732, 2268, 1418, 1418, 1418,
+ 2271, 2271, 2271, 2425, 2425, 2425, 1177, 2426, 3441, 3442,
+
+ 2427, 2279, 2279, 2279, 3446, 1420, 1730, 2272, 2282, 2282,
+ 2282, 3445, 2283, 1177, 3448, 2284, 1450, 1450, 1450, 2280,
+ 2412, 2285, 2285, 2285, 1177, 2286, 1727, 1177, 2287, 1177,
+ 1458, 1458, 1458, 3443, 1452, 1466, 1466, 1466, 2293, 2293,
+ 2293, 1726, 2294, 1724, 1723, 2295, 3447, 2423, 1460, 1722,
+ 2296, 2296, 2296, 1468, 2297, 1177, 3449, 2298, 1476, 1476,
+ 1476, 1719, 2443, 2443, 2443, 1714, 1713, 2438, 3457, 3457,
+ 3457, 2441, 3457, 3457, 3457, 3450, 1478, 3451, 2442, 2444,
+ 3457, 3457, 3457, 1701, 1699, 3457, 1485, 1485, 1485, 3457,
+ 1491, 1491, 1491, 2451, 2451, 2451, 2440, 3457, 1514, 1514,
+
+ 1514, 2457, 2457, 2457, 1487, 2454, 2454, 2454, 1493, 1177,
+ 3454, 2452, 1695, 2313, 2313, 2313, 1516, 2314, 1694, 2445,
+ 2315, 1177, 1690, 1177, 1190, 1190, 1190, 2317, 2317, 2317,
+ 2459, 2459, 2459, 2460, 2460, 2460, 2446, 1688, 1680, 2447,
+ 1679, 3452, 1192, 2322, 2322, 2322, 2323, 2323, 2323, 1678,
+ 2450, 2448, 2325, 2325, 2325, 2464, 2464, 2464, 1677, 1675,
+ 2453, 2466, 2466, 2466, 2467, 2467, 2467, 2330, 2330, 2330,
+ 2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336,
+ 2336, 2336, 1674, 2458, 2337, 2337, 2337, 2471, 2471, 2471,
+ 2474, 2474, 2474, 2343, 2343, 2343, 1177, 2344, 1672, 1670,
+
+ 2345, 3457, 3457, 3457, 1669, 2472, 1665, 2475, 2347, 2347,
+ 2347, 1664, 2349, 2349, 2349, 1663, 2350, 1662, 3457, 2351,
+ 1259, 1259, 1259, 2363, 2363, 2363, 2348, 2364, 3453, 1660,
+ 2365, 2366, 2366, 2366, 2498, 2498, 2498, 1659, 1261, 2371,
+ 2371, 2371, 2373, 2373, 2373, 1658, 2374, 1657, 1650, 2375,
+ 1290, 1290, 1290, 2379, 2379, 2379, 1649, 2380, 1648, 1647,
+ 2381, 2507, 2507, 2507, 1312, 1312, 1312, 2476, 1292, 2509,
+ 2509, 2509, 2519, 2519, 2519, 1343, 1343, 1343, 1646, 2508,
+ 1645, 2487, 1314, 2399, 2399, 2399, 2510, 2400, 1644, 1643,
+ 2401, 1642, 1636, 1345, 1635, 1634, 2504, 2526, 2526, 2526,
+
+ 2406, 2406, 2406, 2531, 2531, 2531, 1633, 2532, 1626, 1625,
+ 2533, 2534, 2534, 2534, 2527, 2511, 1623, 2407, 2409, 2409,
+ 2409, 1622, 2410, 1621, 1618, 2411, 2536, 2536, 2536, 2535,
+ 2417, 2417, 2417, 1617, 1607, 2520, 2542, 2542, 2542, 2420,
+ 2420, 2420, 1606, 2421, 2537, 1605, 2422, 1601, 2418, 1418,
+ 1418, 1418, 1600, 2543, 1599, 2545, 2545, 2545, 2425, 2425,
+ 2425, 1598, 2426, 1597, 1596, 2427, 1595, 1420, 3457, 3457,
+ 3457, 1594, 2546, 3457, 3457, 3457, 3457, 3457, 3457, 2556,
+ 2556, 2556, 2560, 2560, 2560, 3457, 2558, 2558, 2558, 1592,
+ 3457, 1591, 1589, 3457, 1458, 1458, 1458, 1588, 1587, 2561,
+
+ 2544, 2547, 1584, 1582, 2559, 1579, 1466, 1466, 1466, 2443,
+ 2443, 2443, 1460, 1476, 1476, 1476, 1577, 1574, 2565, 2565,
+ 2565, 1565, 2566, 2548, 1468, 2567, 2444, 2554, 2568, 2568,
+ 2568, 1478, 1563, 1556, 2549, 3457, 3457, 3457, 3457, 3457,
+ 3457, 2572, 2572, 2572, 1554, 2569, 2574, 2574, 2574, 1553,
+ 2564, 1552, 3457, 1551, 2562, 3457, 1491, 1491, 1491, 2573,
+ 2451, 2451, 2451, 1514, 1514, 1514, 1550, 2563, 1549, 2454,
+ 2454, 2454, 1548, 1547, 1493, 2457, 2457, 2457, 2452, 1546,
+ 1545, 1516, 2580, 2580, 2580, 1542, 2570, 1177, 1541, 2571,
+ 2459, 2459, 2459, 2460, 2460, 2460, 2584, 2584, 2584, 1540,
+
+ 2581, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467,
+ 2471, 2471, 2471, 2474, 2474, 2474, 2590, 2590, 2590, 1539,
+ 2591, 1538, 2575, 2592, 1259, 1259, 1259, 2576, 2472, 1537,
+ 2475, 2577, 2498, 2498, 2498, 2619, 2619, 2619, 1290, 1290,
+ 1290, 1536, 1261, 2507, 2507, 2507, 2509, 2509, 2509, 1535,
+ 2625, 2625, 2625, 1533, 2626, 1532, 1292, 2627, 2628, 2628,
+ 2628, 2508, 1531, 2510, 2634, 2634, 2634, 2519, 2519, 2519,
+ 1343, 1343, 1343, 2526, 2526, 2526, 2629, 1530, 2642, 2642,
+ 2642, 2635, 2643, 1529, 2604, 2644, 1528, 1527, 1345, 1525,
+ 2527, 2646, 2646, 2646, 2531, 2531, 2531, 1524, 2532, 1523,
+
+ 1522, 2533, 1521, 1520, 2622, 2534, 2534, 2534, 2647, 1519,
+ 2536, 2536, 2536, 2655, 2655, 2655, 2542, 2542, 2542, 2661,
+ 2661, 2661, 1177, 2535, 2556, 2556, 2556, 2636, 2537, 1513,
+ 2656, 1505, 1490, 2543, 2658, 2658, 2658, 2662, 2659, 1489,
+ 1484, 2660, 2545, 2545, 2545, 2663, 2663, 2663, 1483, 2664,
+ 1482, 1481, 2665, 2671, 2671, 2671, 2558, 2558, 2558, 2546,
+ 2560, 2560, 2560, 1480, 2675, 2675, 2675, 1454, 2676, 1442,
+ 2672, 2677, 1428, 1427, 2559, 1426, 1422, 2561, 2678, 2678,
+ 2678, 1466, 1466, 1466, 1417, 1476, 1476, 1476, 2565, 2565,
+ 2565, 1413, 2566, 1405, 1400, 2567, 2679, 1399, 1393, 1468,
+
+ 2568, 2568, 2568, 1478, 2682, 2682, 2682, 1390, 2683, 1369,
+ 1368, 2684, 2685, 2685, 2685, 1367, 1366, 2569, 2687, 2687,
+ 2687, 2572, 2572, 2572, 2574, 2574, 2574, 1365, 1364, 2686,
+ 1363, 1362, 2689, 2689, 2689, 2688, 1514, 1514, 1514, 2573,
+ 2580, 2580, 2580, 2584, 2584, 2584, 1361, 1360, 2680, 2681,
+ 2690, 2697, 2697, 2697, 1516, 2701, 2701, 2701, 2581, 2590,
+ 2590, 2590, 1354, 2591, 1347, 1336, 2592, 1259, 1259, 1259,
+ 1331, 1330, 2702, 2619, 2619, 2619, 1290, 1290, 1290, 2738,
+ 2738, 2738, 2625, 2625, 2625, 1261, 2626, 1324, 1323, 2627,
+ 2628, 2628, 2628, 1322, 1292, 1318, 1317, 2691, 2741, 2741,
+
+ 2741, 2634, 2634, 2634, 1316, 2743, 2743, 2743, 2629, 2744,
+ 1311, 1310, 2745, 1305, 1304, 2742, 1299, 1295, 2635, 2746,
+ 2746, 2746, 2751, 2751, 2751, 1289, 1288, 2720, 2642, 2642,
+ 2642, 1284, 2643, 1283, 1282, 2644, 1281, 2747, 1280, 2752,
+ 2646, 2646, 2646, 1279, 2755, 2755, 2755, 2737, 2756, 1278,
+ 1277, 2757, 2764, 2764, 2764, 1276, 1275, 2647, 2655, 2655,
+ 2655, 2766, 2766, 2766, 1274, 2767, 1273, 1272, 2768, 2765,
+ 2769, 2769, 2769, 1266, 1258, 2656, 2658, 2658, 2658, 1257,
+ 2659, 1256, 1251, 2660, 2661, 2661, 2661, 2770, 2663, 2663,
+ 2663, 1250, 2664, 1249, 1246, 2665, 2671, 2671, 2671, 2774,
+
+ 2774, 2774, 2662, 2775, 1240, 1235, 2776, 2777, 2777, 2777,
+ 2779, 2779, 2779, 2672, 2675, 2675, 2675, 1234, 2676, 1230,
+ 1225, 2677, 1224, 1223, 2778, 1222, 1221, 2780, 2678, 2678,
+ 2678, 1466, 1466, 1466, 1476, 1476, 1476, 2682, 2682, 2682,
+ 1220, 2683, 1219, 1217, 2684, 1216, 2679, 1215, 1214, 1468,
+ 1213, 1212, 1478, 2685, 2685, 2685, 2789, 2789, 2789, 1211,
+ 2790, 1210, 1209, 2791, 2687, 2687, 2687, 2792, 2792, 2792,
+ 2686, 2793, 1208, 1205, 2794, 2689, 2689, 2689, 1514, 1514,
+ 1514, 2688, 2800, 2800, 2800, 2697, 2697, 2697, 2701, 2701,
+ 2701, 1204, 1203, 2690, 1202, 2788, 1516, 2787, 1201, 2804,
+
+ 2804, 2804, 1200, 2805, 1199, 2702, 2806, 1259, 1259, 1259,
+ 2838, 2838, 2838, 2840, 2840, 2840, 1290, 1290, 1290, 2738,
+ 2738, 2738, 2843, 2843, 2843, 1261, 2845, 2845, 2845, 1198,
+ 2841, 2741, 2741, 2741, 1292, 2800, 2800, 2800, 1197, 2844,
+ 2795, 1196, 1189, 2846, 1188, 2848, 2848, 2848, 2742, 2849,
+ 1187, 1186, 2850, 2743, 2743, 2743, 1185, 2744, 2824, 1184,
+ 2745, 2746, 2746, 2746, 2853, 2853, 2853, 2751, 2751, 2751,
+ 1183, 1180, 2847, 2855, 2855, 2855, 1178, 2856, 2842, 2747,
+ 2857, 2854, 1177, 1175, 2752, 2858, 2858, 2858, 2755, 2755,
+ 2755, 1173, 2756, 1170, 1168, 2757, 2764, 2764, 2764, 2867,
+
+ 2867, 2867, 2859, 2868, 1165, 1161, 2869, 2766, 2766, 2766,
+ 1159, 2767, 1158, 2765, 2768, 2769, 2769, 2769, 2870, 2870,
+ 2870, 1157, 2871, 1155, 1154, 2872, 2874, 2874, 2874, 2774,
+ 2774, 2774, 2770, 2775, 1153, 1152, 2776, 2777, 2777, 2777,
+ 2877, 2877, 2877, 2875, 2878, 1151, 1150, 2879, 2779, 2779,
+ 2779, 2880, 2880, 2880, 2778, 2881, 1148, 1147, 2882, 1466,
+ 1466, 1466, 1476, 1476, 1476, 2780, 2789, 2789, 2789, 1146,
+ 2790, 1145, 1143, 2791, 2792, 2792, 2792, 1468, 2793, 1142,
+ 1478, 2794, 2895, 2895, 2895, 2899, 2899, 2899, 2902, 2902,
+ 2902, 2804, 2804, 2804, 1141, 2805, 1137, 1136, 2806, 1134,
+
+ 2896, 1133, 2900, 1737, 2913, 2913, 2913, 1259, 1259, 1259,
+ 2889, 2838, 2838, 2838, 2937, 2937, 2937, 2840, 2840, 2840,
+ 1132, 2914, 1290, 1290, 1290, 1261, 2938, 2938, 2938, 2890,
+ 2939, 1131, 1130, 2940, 2841, 2843, 2843, 2843, 1129, 1127,
+ 1292, 2942, 2942, 2942, 1126, 2943, 1125, 1124, 2944, 2845,
+ 2845, 2845, 2844, 2945, 2945, 2945, 2923, 2946, 1122, 1121,
+ 2947, 2848, 2848, 2848, 1120, 2849, 2846, 1117, 2850, 2853,
+ 2853, 2853, 1116, 2941, 2951, 2951, 2951, 1114, 2952, 1111,
+ 1110, 2953, 1106, 2855, 2855, 2855, 2854, 2856, 1105, 1103,
+ 2857, 2858, 2858, 2858, 2954, 2954, 2954, 1102, 2955, 1101,
+
+ 1098, 2956, 2867, 2867, 2867, 1097, 2868, 1096, 2859, 2869,
+ 2870, 2870, 2870, 1095, 2871, 1093, 1092, 2872, 2874, 2874,
+ 2874, 2965, 2965, 2965, 1091, 2966, 1090, 1089, 2967, 2877,
+ 2877, 2877, 1084, 2878, 1082, 2875, 2879, 2880, 2880, 2880,
+ 1081, 2881, 1080, 1079, 2882, 2983, 2983, 2983, 1476, 1476,
+ 1476, 2895, 2895, 2895, 2991, 2991, 2991, 2899, 2899, 2899,
+ 2993, 2993, 2993, 2984, 2994, 1078, 1478, 2995, 1077, 2896,
+ 1076, 2992, 1737, 1075, 2900, 1737, 1074, 1073, 1737, 2996,
+ 2996, 2996, 2902, 2902, 2902, 2997, 2997, 2997, 2998, 2998,
+ 2998, 2913, 2913, 2913, 3007, 3007, 3007, 1072, 3008, 1069,
+
+ 1066, 3009, 1259, 1259, 1259, 3025, 3025, 3025, 2914, 2937,
+ 2937, 2937, 1065, 1064, 2985, 2938, 2938, 2938, 1058, 2939,
+ 1261, 1057, 2940, 3026, 3026, 3026, 2942, 2942, 2942, 1055,
+ 2943, 1052, 1050, 2944, 1049, 2945, 2945, 2945, 1048, 2946,
+ 1043, 3027, 2947, 2951, 2951, 2951, 1042, 2952, 1040, 1039,
+ 2953, 2954, 2954, 2954, 1038, 2955, 1036, 1035, 2956, 3031,
+ 3031, 3031, 3039, 3039, 3039, 2965, 2965, 2965, 3016, 2966,
+ 1034, 1032, 2967, 3041, 3041, 3041, 3032, 1029, 1027, 3040,
+ 2983, 2983, 2983, 1476, 1476, 1476, 2991, 2991, 2991, 1025,
+ 3042, 1024, 3061, 3061, 3061, 1021, 3062, 1016, 2984, 3063,
+
+ 1015, 1478, 1012, 2992, 1737, 2993, 2993, 2993, 1011, 2994,
+ 1737, 1010, 2995, 2996, 2996, 2996, 2997, 2997, 2997, 2998,
+ 2998, 2998, 1007, 1737, 3007, 3007, 3007, 1006, 3008, 1004,
+ 1001, 3009, 999, 998, 3055, 1735, 1735, 1735, 1735, 1735,
+ 1735, 1735, 1735, 1735, 997, 996, 1735, 3080, 3080, 3080,
+ 994, 1735, 1735, 1735, 1737, 1735, 3025, 3025, 3025, 3026,
+ 3026, 3026, 3031, 3031, 3031, 3081, 3091, 3091, 3091, 993,
+ 3092, 992, 991, 3093, 3094, 3094, 3094, 3027, 990, 3032,
+ 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735,
+ 1735, 3095, 989, 1735, 3039, 3039, 3039, 986, 1735, 1735,
+
+ 1735, 1737, 1735, 3099, 3099, 3099, 985, 3100, 984, 981,
+ 3101, 3040, 3041, 3041, 3041, 3102, 3102, 3102, 978, 3103,
+ 977, 975, 3104, 3117, 3117, 3117, 974, 1735, 1735, 3042,
+ 3061, 3061, 3061, 971, 3062, 968, 965, 3063, 964, 956,
+ 955, 3118, 954, 3080, 3080, 3080, 953, 947, 1737, 1735,
+ 1735, 1735, 1735, 1735, 3129, 1735, 1735, 1735, 946, 945,
+ 1735, 3081, 3094, 3094, 3094, 1735, 1735, 1735, 1737, 1735,
+ 3091, 3091, 3091, 943, 3092, 942, 941, 3093, 940, 3095,
+ 3153, 3153, 3153, 939, 3154, 938, 933, 3155, 3117, 3117,
+ 3117, 3171, 3171, 3171, 1735, 1735, 1735, 1735, 1735, 1735,
+
+ 1735, 1735, 1735, 1735, 3129, 930, 3118, 1735, 932, 1737,
+ 1738, 927, 1735, 1735, 1735, 1737, 1735, 3099, 3099, 3099,
+ 926, 3100, 924, 922, 3101, 3102, 3102, 3102, 921, 3103,
+ 919, 917, 3104, 3182, 3182, 3182, 3184, 3184, 3184, 915,
+ 913, 1735, 1735, 3186, 3186, 3186, 911, 3153, 3153, 3153,
+ 3183, 3154, 908, 3185, 3155, 3194, 3194, 3194, 907, 906,
+ 3187, 3204, 3204, 3204, 3171, 3171, 3171, 3182, 3182, 3182,
+ 905, 904, 3195, 3214, 3214, 3214, 902, 3215, 900, 1177,
+ 3216, 899, 1737, 898, 3183, 3184, 3184, 3184, 3217, 3217,
+ 3217, 896, 3218, 894, 893, 3219, 3186, 3186, 3186, 3220,
+
+ 3220, 3220, 3185, 3221, 891, 889, 3222, 3194, 3194, 3194,
+ 3229, 3229, 3229, 3187, 3230, 1941, 888, 3231, 3204, 3204,
+ 3204, 3214, 3214, 3214, 3195, 3215, 886, 882, 3216, 881,
+ 3217, 3217, 3217, 879, 3218, 874, 1177, 3219, 3220, 3220,
+ 3220, 872, 3221, 868, 867, 3222, 3229, 3229, 3229, 866,
+ 3230, 864, 862, 3231, 861, 3240, 3353, 3353, 3353, 3353,
+ 3353, 3353, 860, 3362, 858, 856, 3363, 3455, 3455, 3455,
+ 3455, 3455, 3455, 855, 1177, 853, 851, 1177, 850, 849,
+ 848, 847, 846, 845, 843, 3456, 841, 840, 3456, 264,
+ 264, 264, 264, 264, 264, 264, 264, 264, 265, 265,
+
+ 265, 265, 265, 265, 265, 265, 265, 270, 270, 270,
+ 270, 270, 270, 270, 270, 270, 273, 273, 273, 273,
+ 273, 273, 273, 273, 273, 276, 276, 276, 276, 276,
+ 276, 276, 276, 276, 279, 279, 279, 279, 279, 279,
+ 279, 279, 279, 286, 286, 286, 286, 286, 286, 286,
+ 286, 286, 294, 294, 294, 294, 294, 294, 294, 294,
+ 294, 298, 298, 298, 298, 298, 298, 298, 298, 298,
+ 310, 310, 310, 310, 310, 310, 310, 310, 310, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 321, 321,
+ 321, 321, 321, 321, 321, 321, 321, 332, 332, 332,
+
+ 332, 332, 332, 332, 332, 332, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 346, 346, 346, 346, 346,
+ 346, 346, 346, 346, 352, 352, 352, 352, 352, 352,
+ 352, 352, 352, 358, 358, 358, 358, 358, 358, 358,
+ 358, 358, 363, 363, 363, 363, 363, 363, 363, 363,
+ 363, 382, 382, 382, 382, 382, 382, 382, 382, 382,
+ 389, 389, 389, 389, 389, 389, 389, 389, 389, 397,
+ 397, 397, 397, 397, 397, 397, 397, 397, 403, 403,
+ 403, 403, 403, 403, 403, 403, 403, 410, 410, 410,
+ 410, 410, 410, 410, 410, 410, 415, 415, 415, 415,
+
+ 415, 415, 415, 415, 415, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 432, 432, 432, 432, 432, 432, 432,
+ 432, 432, 440, 440, 440, 440, 440, 440, 440, 440,
+ 440, 448, 448, 448, 448, 448, 448, 448, 448, 448,
+ 452, 452, 452, 452, 452, 452, 452, 452, 452, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458, 464, 464,
+ 464, 464, 464, 464, 464, 464, 464, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 489, 489, 489, 489,
+ 489, 489, 489, 489, 489, 498, 498, 498, 498, 498,
+
+ 498, 498, 498, 498, 504, 504, 504, 504, 504, 504,
+ 504, 504, 504, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 525, 525, 525, 525, 525, 525, 525, 525, 525,
+ 531, 531, 531, 531, 531, 531, 531, 531, 531, 537,
+ 537, 537, 537, 537, 537, 537, 537, 537, 543, 543,
+ 543, 543, 543, 543, 543, 543, 543, 550, 550, 550,
+ 550, 550, 550, 550, 550, 550, 557, 557, 557, 557,
+ 557, 557, 557, 557, 557, 562, 562, 562, 562, 562,
+ 562, 562, 562, 562, 570, 570, 570, 570, 570, 570,
+
+ 570, 570, 570, 576, 576, 576, 576, 576, 576, 576,
+ 576, 576, 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 588, 588, 588, 588, 588, 588, 588, 588, 588,
+ 594, 594, 594, 594, 594, 594, 594, 594, 594, 599,
+ 599, 599, 599, 599, 599, 599, 599, 599, 606, 606,
+ 606, 606, 606, 606, 606, 606, 606, 612, 612, 612,
+ 612, 612, 612, 612, 612, 612, 619, 619, 619, 619,
+ 619, 619, 619, 619, 619, 627, 627, 627, 627, 627,
+ 627, 627, 627, 627, 635, 635, 635, 635, 635, 635,
+ 635, 635, 635, 639, 639, 639, 639, 639, 639, 639,
+
+ 639, 639, 645, 645, 645, 645, 645, 645, 645, 645,
+ 645, 649, 649, 649, 649, 649, 649, 649, 649, 649,
+ 656, 656, 656, 656, 656, 656, 656, 656, 656, 661,
+ 661, 661, 661, 661, 661, 661, 661, 661, 667, 667,
+ 667, 667, 667, 667, 667, 667, 667, 672, 672, 672,
+ 672, 672, 672, 672, 672, 672, 692, 692, 692, 837,
+ 836, 835, 692, 719, 719, 719, 833, 831, 820, 719,
+ 723, 723, 723, 819, 816, 814, 723, 731, 731, 731,
+ 812, 811, 810, 731, 742, 742, 742, 808, 806, 804,
+ 742, 748, 748, 748, 803, 801, 798, 748, 771, 771,
+
+ 771, 797, 796, 794, 771, 779, 779, 779, 792, 791,
+ 789, 779, 785, 785, 785, 787, 786, 784, 785, 790,
+ 790, 790, 782, 781, 780, 790, 795, 795, 795, 778,
+ 775, 774, 795, 805, 805, 805, 773, 772, 770, 805,
+ 809, 809, 809, 3457, 717, 750, 809, 815, 815, 815,
+ 749, 747, 745, 815, 834, 834, 834, 744, 743, 741,
+ 834, 844, 844, 844, 737, 733, 732, 844, 854, 854,
+ 854, 730, 729, 726, 854, 859, 859, 859, 725, 724,
+ 722, 859, 865, 865, 865, 721, 720, 718, 865, 873,
+ 873, 873, 713, 3457, 693, 873, 880, 880, 880, 691,
+
+ 689, 683, 880, 887, 887, 887, 682, 683, 682, 887,
+ 892, 892, 892, 681, 680, 3457, 892, 897, 897, 897,
+ 3457, 3457, 3457, 897, 903, 903, 903, 3457, 3457, 3457,
+ 903, 912, 912, 912, 3457, 3457, 3457, 912, 916, 916,
+ 916, 3457, 3457, 3457, 916, 920, 920, 920, 3457, 3457,
+ 3457, 920, 925, 925, 925, 3457, 3457, 3457, 925, 929,
+ 929, 929, 929, 929, 929, 929, 3457, 929, 692, 692,
+ 692, 3457, 3457, 3457, 692, 944, 3457, 3457, 3457, 944,
+ 719, 719, 719, 3457, 3457, 3457, 719, 976, 3457, 3457,
+ 3457, 976, 723, 723, 723, 3457, 3457, 3457, 723, 983,
+
+ 3457, 3457, 3457, 983, 731, 731, 731, 3457, 3457, 3457,
+ 731, 995, 3457, 3457, 3457, 995, 742, 742, 742, 3457,
+ 3457, 3457, 742, 1000, 3457, 3457, 3457, 1000, 748, 748,
+ 748, 3457, 3457, 3457, 748, 1005, 3457, 3457, 3457, 1005,
+ 771, 771, 771, 3457, 3457, 3457, 771, 1026, 3457, 3457,
+ 3457, 1026, 779, 779, 779, 3457, 3457, 3457, 779, 1033,
+ 3457, 3457, 3457, 1033, 785, 785, 785, 3457, 3457, 3457,
+ 785, 1037, 3457, 3457, 3457, 1037, 790, 790, 790, 3457,
+ 3457, 3457, 790, 1041, 3457, 3457, 3457, 1041, 795, 795,
+ 795, 3457, 3457, 3457, 795, 1051, 3457, 3457, 3457, 1051,
+
+ 805, 805, 805, 3457, 3457, 3457, 805, 1056, 3457, 3457,
+ 3457, 1056, 809, 809, 809, 3457, 3457, 3457, 809, 1063,
+ 3457, 3457, 3457, 1063, 815, 815, 815, 3457, 3457, 3457,
+ 815, 1083, 3457, 3457, 3457, 1083, 834, 834, 834, 3457,
+ 3457, 3457, 834, 1094, 3457, 3457, 3457, 1094, 844, 844,
+ 844, 3457, 3457, 3457, 844, 1104, 3457, 3457, 3457, 1104,
+ 854, 854, 854, 3457, 3457, 3457, 854, 1109, 3457, 3457,
+ 3457, 1109, 859, 859, 859, 3457, 3457, 3457, 859, 1115,
+ 3457, 3457, 3457, 1115, 865, 865, 865, 3457, 3457, 3457,
+ 865, 1123, 3457, 3457, 3457, 1123, 873, 873, 873, 3457,
+
+ 3457, 3457, 873, 1128, 3457, 3457, 3457, 1128, 880, 880,
+ 880, 3457, 3457, 3457, 880, 1135, 3457, 3457, 3457, 1135,
+ 887, 887, 887, 3457, 3457, 3457, 887, 1140, 3457, 3457,
+ 3457, 1140, 892, 892, 892, 3457, 3457, 3457, 892, 1144,
+ 3457, 3457, 3457, 1144, 897, 897, 897, 3457, 3457, 3457,
+ 897, 1149, 3457, 3457, 3457, 1149, 903, 903, 903, 3457,
+ 3457, 3457, 903, 1156, 3457, 3457, 3457, 1156, 912, 912,
+ 912, 3457, 3457, 3457, 912, 1160, 3457, 3457, 3457, 1160,
+ 916, 916, 916, 3457, 3457, 3457, 916, 1164, 3457, 3457,
+ 3457, 1164, 920, 920, 920, 3457, 3457, 3457, 920, 1169,
+
+ 3457, 3457, 3457, 1169, 925, 925, 925, 3457, 3457, 3457,
+ 925, 1174, 3457, 3457, 3457, 1174, 1176, 1176, 1176, 1176,
+ 1176, 1176, 1176, 1176, 1176, 1182, 3457, 3457, 3457, 3457,
+ 1182, 692, 692, 692, 3457, 3457, 3457, 692, 1191, 1191,
+ 1191, 1191, 3457, 3457, 1191, 1191, 719, 719, 719, 3457,
+ 3457, 3457, 719, 1227, 1227, 1227, 1227, 3457, 3457, 1227,
+ 1227, 723, 723, 723, 3457, 3457, 3457, 723, 1237, 1237,
+ 1237, 1237, 3457, 3457, 1237, 1237, 731, 731, 731, 3457,
+ 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
+ 1253, 742, 742, 742, 3457, 3457, 3457, 742, 1260, 1260,
+
+ 1260, 1260, 3457, 3457, 1260, 1260, 748, 748, 748, 3457,
+ 3457, 3457, 748, 1268, 1268, 1268, 1268, 3457, 3457, 1268,
+ 1268, 771, 771, 771, 3457, 3457, 3457, 771, 1291, 1291,
+ 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, 779, 3457,
+ 3457, 3457, 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301,
+ 1301, 785, 785, 785, 3457, 3457, 3457, 785, 1307, 1307,
+ 1307, 1307, 3457, 3457, 1307, 1307, 790, 790, 790, 3457,
+ 3457, 3457, 790, 1313, 1313, 1313, 1313, 3457, 3457, 1313,
+ 1313, 795, 795, 795, 3457, 3457, 3457, 795, 1326, 1326,
+ 1326, 1326, 3457, 3457, 1326, 1326, 805, 805, 805, 3457,
+
+ 3457, 3457, 805, 1333, 1333, 1333, 1333, 3457, 3457, 1333,
+ 1333, 809, 809, 809, 3457, 3457, 3457, 809, 1344, 1344,
+ 1344, 1344, 3457, 3457, 1344, 1344, 815, 815, 815, 3457,
+ 3457, 3457, 815, 1371, 1371, 1371, 1371, 3457, 3457, 1371,
+ 1371, 834, 834, 834, 834, 3457, 834, 3457, 834, 1387,
+ 1387, 1387, 1387, 3457, 3457, 1387, 1387, 844, 844, 844,
+ 3457, 3457, 3457, 844, 1402, 1402, 1402, 1402, 3457, 3457,
+ 1402, 1402, 854, 854, 854, 3457, 3457, 3457, 854, 1410,
+ 1410, 1410, 1410, 3457, 3457, 1410, 1410, 859, 859, 859,
+ 3457, 3457, 3457, 859, 1419, 1419, 1419, 1419, 3457, 3457,
+
+ 1419, 1419, 865, 865, 865, 3457, 3457, 3457, 865, 1430,
+ 1430, 1430, 1430, 3457, 3457, 1430, 1430, 873, 873, 873,
+ 873, 3457, 873, 3457, 873, 1439, 1439, 1439, 1439, 3457,
+ 3457, 1439, 1439, 880, 880, 880, 880, 3457, 880, 3457,
+ 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, 887,
+ 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, 1459,
+ 3457, 3457, 1459, 1459, 892, 892, 892, 892, 3457, 892,
+ 3457, 892, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467,
+ 897, 897, 897, 897, 3457, 897, 3457, 897, 1477, 1477,
+ 1477, 1477, 3457, 3457, 1477, 1477, 903, 903, 903, 3457,
+
+ 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457, 3457, 1486,
+ 1486, 912, 912, 912, 3457, 3457, 3457, 912, 1492, 1492,
+ 1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499,
+ 3457, 3457, 1499, 1499, 920, 920, 920, 3457, 3457, 3457,
+ 920, 1507, 1507, 1507, 1507, 3457, 3457, 1507, 1507, 925,
+ 925, 925, 3457, 3457, 3457, 925, 1515, 1515, 1515, 1515,
+ 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176, 1176,
+ 1176, 1176, 1176, 1182, 3457, 1182, 3457, 3457, 1182, 692,
+ 692, 692, 3457, 3457, 3457, 692, 1191, 1191, 1191, 1191,
+ 3457, 3457, 1191, 1191, 719, 719, 719, 719, 3457, 719,
+
+ 3457, 719, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227,
+ 723, 723, 723, 723, 3457, 723, 3457, 723, 1237, 1237,
+ 1237, 1237, 3457, 3457, 1237, 1237, 731, 731, 731, 3457,
+ 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
+ 1253, 742, 742, 742, 3457, 3457, 3457, 742, 1260, 1260,
+ 1260, 1260, 3457, 3457, 1260, 1260, 748, 748, 748, 3457,
+ 3457, 3457, 748, 1268, 1268, 1268, 1268, 3457, 3457, 1268,
+ 1268, 771, 771, 771, 3457, 3457, 3457, 771, 1291, 1291,
+ 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, 779, 3457,
+ 3457, 3457, 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301,
+
+ 1301, 785, 785, 785, 785, 3457, 785, 3457, 785, 1307,
+ 1307, 1307, 1307, 3457, 3457, 1307, 1307, 790, 790, 790,
+ 790, 3457, 790, 3457, 790, 1313, 1313, 1313, 1313, 3457,
+ 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, 795,
+ 1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326, 805, 805,
+ 805, 805, 3457, 805, 3457, 805, 1333, 1333, 1333, 1333,
+ 3457, 3457, 1333, 1333, 809, 809, 809, 809, 3457, 809,
+ 3457, 809, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
+ 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, 1371,
+ 1371, 3457, 3457, 1371, 1371, 834, 834, 834, 3457, 3457,
+
+ 3457, 834, 1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387,
+ 844, 844, 844, 3457, 3457, 3457, 844, 1402, 1402, 1402,
+ 1402, 3457, 3457, 1402, 1402, 854, 854, 854, 3457, 3457,
+ 3457, 854, 1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410,
+ 859, 859, 859, 3457, 3457, 3457, 859, 1419, 1419, 1419,
+ 1419, 3457, 3457, 1419, 1419, 865, 865, 865, 3457, 3457,
+ 3457, 865, 1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430,
+ 873, 873, 873, 3457, 3457, 3457, 873, 1439, 1439, 1439,
+ 1439, 3457, 3457, 1439, 1439, 880, 880, 880, 3457, 3457,
+ 3457, 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451,
+
+ 887, 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459,
+ 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457,
+ 3457, 1467, 1467, 897, 897, 897, 3457, 3457, 3457, 897,
+ 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, 903,
+ 903, 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457,
+ 3457, 1486, 1486, 912, 912, 912, 3457, 3457, 3457, 912,
+ 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499,
+ 1499, 1499, 3457, 3457, 1499, 1499, 920, 920, 920, 3457,
+ 3457, 3457, 920, 1507, 1507, 1507, 1507, 3457, 3457, 1507,
+ 1507, 925, 925, 925, 3457, 3457, 3457, 925, 1515, 1515,
+
+ 1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176,
+ 1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735,
+ 1735, 1735, 1735, 1735, 692, 692, 692, 3457, 3457, 3457,
+ 692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227,
+ 1227, 1227, 1227, 3457, 3457, 1227, 1227, 723, 723, 723,
+ 3457, 3457, 3457, 723, 1237, 1237, 1237, 1237, 3457, 3457,
+ 1237, 1237, 731, 731, 731, 3457, 3457, 3457, 731, 1253,
+ 1253, 1253, 1253, 3457, 3457, 1253, 1253, 742, 742, 742,
+ 3457, 3457, 3457, 742, 1260, 1260, 1260, 1260, 3457, 3457,
+ 1260, 1260, 748, 748, 748, 3457, 3457, 3457, 748, 771,
+
+ 771, 771, 3457, 3457, 3457, 771, 1291, 1291, 1291, 1291,
+ 3457, 3457, 1291, 1291, 779, 779, 779, 3457, 3457, 3457,
+ 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301, 785,
+ 785, 785, 3457, 3457, 3457, 785, 1307, 1307, 1307, 1307,
+ 3457, 3457, 1307, 1307, 790, 790, 790, 3457, 3457, 3457,
+ 790, 1313, 1313, 1313, 1313, 3457, 3457, 1313, 1313, 795,
+ 795, 795, 3457, 3457, 3457, 795, 1326, 1326, 1326, 1326,
+ 3457, 3457, 1326, 1326, 1333, 1333, 1333, 1333, 3457, 3457,
+ 1333, 1333, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
+ 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, 1371,
+
+ 1371, 3457, 3457, 1371, 1371, 834, 834, 834, 834, 3457,
+ 834, 3457, 834, 1387, 1387, 1387, 1387, 3457, 3457, 1387,
+ 1387, 844, 844, 844, 3457, 3457, 3457, 844, 1402, 1402,
+ 1402, 1402, 3457, 3457, 1402, 1402, 854, 854, 854, 3457,
+ 3457, 3457, 854, 1410, 1410, 1410, 1410, 3457, 3457, 1410,
+ 1410, 859, 859, 859, 3457, 3457, 3457, 859, 1419, 1419,
+ 1419, 1419, 3457, 3457, 1419, 1419, 865, 865, 865, 3457,
+ 3457, 3457, 865, 1430, 1430, 1430, 1430, 3457, 3457, 1430,
+ 1430, 873, 873, 873, 3457, 3457, 3457, 873, 1439, 1439,
+ 1439, 1439, 3457, 3457, 1439, 1439, 880, 880, 880, 3457,
+
+ 3457, 3457, 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451,
+ 1451, 887, 887, 887, 3457, 3457, 3457, 887, 1459, 1459,
+ 1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467,
+ 3457, 3457, 1467, 1467, 897, 897, 897, 3457, 3457, 3457,
+ 897, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903,
+ 903, 903, 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486,
+ 3457, 3457, 1486, 1486, 912, 912, 912, 912, 3457, 912,
+ 3457, 912, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492,
+ 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 920, 920,
+ 920, 920, 3457, 920, 3457, 920, 1507, 1507, 1507, 1507,
+
+ 3457, 3457, 1507, 1507, 925, 925, 925, 925, 3457, 925,
+ 3457, 925, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515,
+ 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735,
+ 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 692, 692,
+ 692, 3457, 3457, 3457, 692, 1191, 1191, 1191, 1191, 3457,
+ 3457, 1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227,
+ 1227, 723, 723, 723, 3457, 3457, 3457, 723, 1237, 1237,
+ 1237, 1237, 3457, 3457, 1237, 1237, 731, 731, 731, 3457,
+ 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, 1253,
+ 1253, 742, 742, 742, 3457, 3457, 3457, 742, 1260, 1260,
+
+ 1260, 1260, 3457, 3457, 1260, 1260, 748, 748, 748, 3457,
+ 3457, 3457, 748, 771, 771, 771, 3457, 3457, 3457, 771,
+ 1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291, 779, 779,
+ 779, 3457, 3457, 3457, 779, 1301, 1301, 1301, 1301, 3457,
+ 3457, 1301, 1301, 785, 785, 785, 3457, 3457, 3457, 785,
+ 1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307, 790, 790,
+ 790, 790, 3457, 790, 3457, 790, 1313, 1313, 1313, 1313,
+ 3457, 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457,
+ 795, 1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326, 1344,
+ 1344, 1344, 1344, 3457, 3457, 1344, 1344, 815, 815, 815,
+
+ 3457, 3457, 3457, 815, 1371, 1371, 1371, 1371, 3457, 3457,
+ 1371, 1371, 834, 834, 834, 834, 3457, 834, 3457, 834,
+ 1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387, 844, 844,
+ 844, 3457, 3457, 3457, 844, 1402, 1402, 1402, 1402, 3457,
+ 3457, 1402, 1402, 854, 854, 854, 3457, 3457, 3457, 854,
+ 1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410, 859, 859,
+ 859, 3457, 3457, 3457, 859, 1419, 1419, 1419, 1419, 3457,
+ 3457, 1419, 1419, 865, 865, 865, 3457, 3457, 3457, 865,
+ 1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430, 873, 873,
+ 873, 3457, 3457, 3457, 873, 1439, 1439, 1439, 1439, 3457,
+
+ 3457, 1439, 1439, 880, 880, 880, 880, 3457, 880, 3457,
+ 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, 887,
+ 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, 1459,
+ 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457,
+ 1467, 1467, 897, 897, 897, 897, 3457, 897, 3457, 897,
+ 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, 903,
+ 903, 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457,
+ 3457, 1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492,
+ 1492, 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1507,
+ 1507, 1507, 1507, 3457, 3457, 1507, 1507, 1515, 1515, 1515,
+
+ 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176,
+ 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735,
+ 1735, 1735, 1735, 692, 692, 692, 692, 3457, 692, 3457,
+ 692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227,
+ 1227, 1227, 1227, 3457, 3457, 1227, 1227, 723, 723, 723,
+ 3457, 3457, 3457, 723, 1237, 1237, 1237, 1237, 3457, 3457,
+ 1237, 1237, 731, 731, 731, 3457, 3457, 3457, 731, 1253,
+ 1253, 1253, 1253, 3457, 3457, 1253, 1253, 742, 742, 742,
+ 742, 3457, 742, 3457, 742, 1260, 1260, 1260, 1260, 3457,
+ 3457, 1260, 1260, 748, 748, 748, 748, 3457, 748, 3457,
+
+ 748, 771, 771, 771, 771, 3457, 771, 3457, 771, 1291,
+ 1291, 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, 779,
+ 779, 3457, 779, 3457, 779, 1301, 1301, 1301, 1301, 3457,
+ 3457, 1301, 1301, 785, 785, 785, 3457, 3457, 3457, 785,
+ 1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307, 1313, 1313,
+ 1313, 1313, 3457, 3457, 1313, 1313, 795, 795, 795, 3457,
+ 3457, 3457, 795, 1344, 1344, 1344, 1344, 3457, 3457, 1344,
+ 1344, 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371,
+ 1371, 1371, 3457, 3457, 1371, 1371, 834, 834, 834, 834,
+ 3457, 834, 3457, 834, 1387, 1387, 1387, 1387, 3457, 3457,
+
+ 1387, 1387, 844, 844, 844, 3457, 3457, 3457, 844, 854,
+ 854, 854, 3457, 3457, 3457, 854, 1410, 1410, 1410, 1410,
+ 3457, 3457, 1410, 1410, 859, 859, 859, 3457, 3457, 3457,
+ 859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419, 865,
+ 865, 865, 3457, 3457, 3457, 865, 873, 873, 873, 3457,
+ 3457, 3457, 873, 1439, 1439, 1439, 1439, 3457, 3457, 1439,
+ 1439, 880, 880, 880, 3457, 3457, 3457, 880, 1451, 1451,
+ 1451, 1451, 3457, 3457, 1451, 1451, 887, 887, 887, 3457,
+ 3457, 3457, 887, 1459, 1459, 1459, 1459, 3457, 3457, 1459,
+ 1459, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467, 1477,
+
+ 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, 903, 903,
+ 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457, 3457,
+ 1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492,
+ 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1515, 1515,
+ 1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176,
+ 1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735,
+ 1735, 1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457,
+ 1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227,
+ 723, 723, 723, 3457, 3457, 3457, 723, 731, 731, 731,
+ 3457, 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457,
+
+ 1253, 1253, 1260, 1260, 1260, 1260, 3457, 3457, 1260, 1260,
+ 771, 771, 771, 3457, 3457, 3457, 771, 1291, 1291, 1291,
+ 1291, 3457, 3457, 1291, 1291, 779, 779, 779, 3457, 3457,
+ 3457, 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301,
+ 785, 785, 785, 3457, 3457, 3457, 785, 1313, 1313, 1313,
+ 1313, 3457, 3457, 1313, 1313, 795, 795, 795, 3457, 3457,
+ 3457, 795, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344,
+ 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, 1371,
+ 1371, 3457, 3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457,
+ 3457, 1387, 1387, 844, 844, 844, 3457, 3457, 3457, 844,
+
+ 854, 854, 854, 3457, 3457, 3457, 854, 1410, 1410, 1410,
+ 1410, 3457, 3457, 1410, 1410, 859, 859, 859, 3457, 3457,
+ 3457, 859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419,
+ 865, 865, 865, 3457, 3457, 3457, 865, 873, 873, 873,
+ 3457, 3457, 3457, 873, 880, 880, 880, 3457, 3457, 3457,
+ 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, 887,
+ 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, 1459,
+ 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457,
+ 1467, 1467, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477,
+ 903, 903, 903, 903, 3457, 903, 3457, 903, 1486, 1486,
+
+ 1486, 1486, 3457, 3457, 1486, 1486, 1492, 1492, 1492, 1492,
+ 3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499, 3457, 3457,
+ 1499, 1499, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515,
+ 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735,
+ 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1191, 1191,
+ 1191, 1191, 3457, 3457, 1191, 1191, 1227, 1227, 1227, 1227,
+ 3457, 3457, 1227, 1227, 723, 723, 723, 3457, 3457, 3457,
+ 723, 731, 731, 731, 731, 3457, 731, 3457, 731, 1260,
+ 1260, 1260, 1260, 3457, 3457, 1260, 1260, 771, 771, 771,
+ 3457, 3457, 3457, 771, 1291, 1291, 1291, 1291, 3457, 3457,
+
+ 1291, 1291, 779, 779, 779, 3457, 3457, 3457, 779, 1301,
+ 1301, 1301, 1301, 3457, 3457, 1301, 1301, 785, 785, 785,
+ 785, 3457, 785, 3457, 785, 1313, 1313, 1313, 1313, 3457,
+ 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, 795,
+ 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, 815, 815,
+ 815, 3457, 3457, 3457, 815, 1371, 1371, 1371, 1371, 3457,
+ 3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457, 3457, 1387,
+ 1387, 844, 844, 844, 3457, 3457, 3457, 844, 854, 854,
+ 854, 3457, 3457, 3457, 854, 859, 859, 859, 859, 3457,
+ 859, 3457, 859, 1419, 1419, 1419, 1419, 3457, 3457, 1419,
+
+ 1419, 865, 865, 865, 865, 3457, 865, 3457, 865, 873,
+ 873, 873, 3457, 3457, 3457, 873, 880, 880, 880, 3457,
+ 3457, 3457, 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451,
+ 1451, 887, 887, 887, 887, 3457, 887, 3457, 887, 1459,
+ 1459, 1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467,
+ 1467, 3457, 3457, 1467, 1467, 1477, 1477, 1477, 1477, 3457,
+ 3457, 1477, 1477, 903, 903, 903, 903, 3457, 903, 3457,
+ 903, 1486, 1486, 1486, 1486, 3457, 3457, 1486, 1486, 1492,
+ 1492, 1492, 1492, 3457, 3457, 1492, 1492, 1515, 1515, 1515,
+ 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176,
+
+ 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735,
+ 1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457, 1191,
+ 1191, 723, 723, 723, 3457, 3457, 3457, 723, 731, 731,
+ 731, 3457, 3457, 3457, 731, 1260, 1260, 1260, 1260, 3457,
+ 3457, 1260, 1260, 771, 771, 771, 3457, 3457, 3457, 771,
+ 1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291, 779, 779,
+ 779, 3457, 3457, 3457, 779, 1313, 1313, 1313, 1313, 3457,
+ 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, 795,
+ 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, 815, 815,
+ 815, 3457, 3457, 3457, 815, 844, 844, 844, 3457, 3457,
+
+ 3457, 844, 854, 854, 854, 3457, 3457, 3457, 854, 1419,
+ 1419, 1419, 1419, 3457, 3457, 1419, 1419, 865, 865, 865,
+ 3457, 3457, 3457, 865, 873, 873, 873, 3457, 3457, 3457,
+ 873, 880, 880, 880, 3457, 3457, 3457, 880, 3064, 3064,
+ 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3065, 3065, 3065,
+ 3065, 3065, 3065, 3065, 3065, 3065, 3124, 3124, 3124, 3124,
+ 3124, 3124, 3124, 3124, 3124, 3127, 3127, 3127, 3127, 3127,
+ 3127, 3127, 3127, 3127, 3168, 3168, 3168, 3168, 3168, 3168,
+ 3168, 3168, 3168, 3170, 3170, 3170, 3170, 3170, 3170, 3170,
+ 3170, 3170, 263, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457
} ;
-static yyconst flex_int16_t yy_chk[12367] =
+static yyconst flex_int16_t yy_chk[12668] =
{ 0,
0, 3, 3, 3, 4, 4, 4, 5, 5, 5,
6, 6, 6, 7, 7, 7, 11, 3, 9, 12,
4, 10, 0, 5, 0, 9, 6, 0, 10, 7,
- 8, 8, 8, 264, 11, 13, 13, 12, 14, 14,
- 13, 13, 313, 14, 14, 265, 8, 17, 17, 264,
- 13, 15, 15, 14, 15, 268, 15, 16, 16, 367,
- 16, 265, 16, 18, 18, 1513, 15, 19, 19, 19,
- 543, 268, 16, 20, 20, 20, 23, 23, 23, 24,
- 24, 24, 543, 19, 25, 25, 25, 367, 1519, 20,
- 374, 17, 23, 1071, 313, 24, 262, 262, 262, 1071,
-
- 25, 263, 263, 263, 267, 267, 267, 18, 21, 21,
+ 8, 8, 8, 268, 11, 13, 13, 12, 14, 14,
+ 13, 13, 317, 14, 14, 269, 8, 17, 17, 268,
+ 13, 15, 15, 14, 15, 272, 15, 16, 16, 371,
+ 16, 269, 16, 18, 18, 1542, 15, 19, 19, 19,
+ 549, 272, 16, 20, 20, 20, 23, 23, 23, 24,
+ 24, 24, 549, 19, 25, 25, 25, 371, 1543, 20,
+ 378, 17, 23, 1097, 317, 24, 266, 266, 266, 1097,
+
+ 25, 267, 267, 267, 271, 271, 271, 18, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
- 21, 21, 21, 297, 21, 21, 21, 21, 21, 26,
- 26, 26, 27, 27, 27, 28, 28, 28, 297, 29,
- 29, 29, 30, 30, 30, 26, 374, 473, 27, 291,
- 473, 28, 680, 21, 21, 29, 307, 286, 30, 31,
- 31, 31, 288, 288, 288, 291, 295, 295, 295, 304,
- 304, 304, 307, 286, 363, 31, 680, 21, 22, 22,
+ 21, 21, 21, 301, 21, 21, 21, 21, 21, 26,
+ 26, 26, 27, 27, 27, 28, 28, 28, 301, 29,
+ 29, 29, 30, 30, 30, 26, 378, 478, 27, 295,
+ 478, 28, 697, 21, 21, 29, 311, 290, 30, 31,
+ 31, 31, 292, 292, 292, 295, 299, 299, 299, 308,
+ 308, 308, 311, 290, 367, 31, 697, 21, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 1520, 22, 22, 22, 22, 22, 32,
+ 22, 22, 22, 1545, 22, 22, 22, 22, 22, 32,
- 32, 32, 33, 33, 33, 34, 34, 34, 278, 35,
- 35, 35, 36, 36, 36, 32, 286, 366, 33, 489,
- 736, 34, 489, 22, 22, 35, 363, 366, 36, 37,
+ 32, 32, 33, 33, 33, 34, 34, 34, 282, 35,
+ 35, 35, 36, 36, 36, 32, 290, 370, 33, 495,
+ 753, 34, 495, 22, 22, 35, 367, 370, 36, 37,
37, 37, 38, 38, 38, 39, 39, 39, 40, 40,
- 40, 41, 41, 41, 736, 37, 555, 22, 38, 318,
- 278, 39, 469, 555, 40, 366, 278, 41, 42, 42,
- 42, 278, 311, 311, 311, 318, 278, 315, 315, 315,
- 326, 326, 326, 469, 42, 43, 43, 43, 43, 43,
+ 40, 41, 41, 41, 753, 37, 561, 22, 38, 322,
+ 282, 39, 474, 561, 40, 370, 282, 41, 42, 42,
+ 42, 282, 315, 315, 315, 322, 282, 319, 319, 319,
+ 330, 330, 330, 474, 42, 43, 43, 43, 43, 43,
43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 335, 43, 43, 43, 43, 43, 45, 45, 45, 46,
+ 339, 43, 43, 43, 43, 43, 45, 45, 45, 46,
- 46, 46, 47, 47, 47, 335, 48, 48, 48, 49,
- 49, 49, 45, 433, 560, 46, 1522, 433, 47, 333,
- 43, 43, 48, 333, 387, 49, 299, 333, 43, 44,
+ 46, 46, 47, 47, 47, 339, 48, 48, 48, 49,
+ 49, 49, 45, 438, 566, 46, 1546, 438, 47, 337,
+ 43, 43, 48, 337, 391, 49, 303, 337, 43, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 329, 44, 44, 44, 44, 44,
- 50, 50, 50, 51, 51, 51, 52, 52, 52, 474,
- 329, 573, 55, 55, 569, 299, 50, 55, 300, 51,
- 560, 569, 52, 474, 44, 44, 387, 55, 299, 388,
- 299, 1531, 44, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 1534, 53,
-
- 53, 53, 53, 53, 1536, 343, 55, 300, 59, 59,
- 59, 60, 60, 60, 63, 63, 63, 573, 56, 56,
- 300, 343, 300, 56, 59, 323, 472, 60, 53, 53,
- 63, 388, 323, 56, 472, 668, 53, 400, 668, 53,
- 472, 323, 337, 337, 337, 1541, 53, 54, 54, 54,
+ 44, 44, 44, 44, 333, 44, 44, 44, 44, 44,
+ 50, 50, 50, 51, 51, 51, 52, 52, 52, 1547,
+ 333, 579, 55, 55, 575, 303, 50, 55, 304, 51,
+ 566, 575, 52, 391, 44, 44, 391, 55, 303, 393,
+ 303, 957, 44, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 957, 53,
+
+ 53, 53, 53, 53, 1548, 347, 55, 304, 59, 59,
+ 59, 60, 60, 60, 63, 63, 63, 579, 56, 56,
+ 304, 347, 304, 56, 59, 327, 477, 60, 53, 53,
+ 63, 393, 327, 56, 477, 685, 53, 405, 685, 53,
+ 477, 327, 341, 341, 341, 1549, 53, 54, 54, 54,
54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
54, 54, 56, 54, 54, 54, 54, 54, 64, 64,
- 64, 67, 67, 67, 68, 68, 68, 1544, 69, 69,
- 69, 70, 70, 70, 64, 355, 373, 67, 338, 400,
- 68, 559, 54, 54, 69, 338, 1179, 70, 1545, 559,
+ 64, 67, 67, 67, 68, 68, 68, 442, 69, 69,
+ 69, 70, 70, 70, 64, 359, 377, 67, 342, 405,
+ 68, 565, 54, 54, 69, 342, 1211, 70, 1550, 565,
- 54, 355, 373, 54, 338, 340, 340, 340, 401, 1179,
+ 54, 359, 377, 54, 342, 344, 344, 344, 406, 1211,
54, 57, 57, 57, 57, 57, 57, 57, 57, 57,
- 57, 57, 57, 57, 57, 57, 1546, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 442, 57, 57, 57,
57, 57, 71, 71, 71, 72, 72, 72, 73, 73,
- 73, 439, 74, 74, 74, 75, 75, 75, 71, 1551,
- 379, 72, 350, 393, 73, 1552, 57, 57, 74, 350,
- 401, 75, 349, 349, 349, 57, 379, 57, 350, 393,
- 437, 57, 352, 352, 352, 478, 57, 57, 58, 58,
+ 73, 444, 74, 74, 74, 75, 75, 75, 71, 1551,
+ 383, 72, 354, 398, 73, 1552, 57, 57, 74, 354,
+ 406, 75, 353, 353, 353, 57, 383, 57, 354, 398,
+ 392, 57, 356, 356, 356, 484, 57, 57, 58, 58,
58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
- 58, 58, 58, 439, 58, 58, 58, 58, 58, 76,
+ 58, 58, 58, 444, 58, 58, 58, 58, 58, 76,
- 76, 76, 77, 77, 77, 78, 78, 78, 624, 79,
- 79, 79, 80, 80, 80, 76, 365, 1553, 77, 437,
- 624, 78, 437, 58, 58, 79, 365, 478, 80, 360,
- 360, 360, 58, 365, 58, 376, 376, 376, 58, 386,
- 386, 386, 1554, 58, 58, 61, 61, 61, 61, 61,
+ 76, 76, 77, 77, 77, 78, 78, 78, 630, 79,
+ 79, 79, 80, 80, 80, 76, 369, 1553, 77, 392,
+ 630, 78, 392, 58, 58, 79, 369, 484, 80, 364,
+ 364, 364, 58, 369, 58, 380, 380, 380, 58, 390,
+ 390, 390, 1555, 58, 58, 61, 61, 61, 61, 61,
61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
- 371, 61, 61, 61, 61, 61, 81, 81, 81, 82,
- 82, 82, 83, 83, 83, 710, 84, 84, 84, 85,
- 85, 85, 81, 1555, 1556, 82, 659, 596, 83, 371,
- 61, 61, 84, 371, 371, 85, 609, 61, 390, 390,
-
- 390, 659, 371, 61, 371, 399, 399, 399, 403, 403,
- 403, 710, 61, 62, 62, 62, 62, 62, 62, 62,
- 62, 62, 62, 62, 62, 62, 62, 62, 1557, 62,
+ 375, 61, 61, 61, 61, 61, 81, 81, 81, 82,
+ 82, 82, 83, 83, 83, 727, 84, 84, 84, 85,
+ 85, 85, 81, 797, 1556, 82, 797, 479, 83, 375,
+ 61, 61, 84, 375, 375, 85, 602, 61, 395, 395,
+
+ 395, 479, 375, 61, 375, 404, 404, 404, 408, 408,
+ 408, 727, 61, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62, 676, 62,
62, 62, 62, 62, 86, 86, 86, 87, 87, 87,
- 88, 88, 88, 596, 89, 89, 89, 90, 90, 90,
- 86, 406, 609, 87, 1562, 745, 88, 412, 62, 62,
- 89, 417, 428, 90, 412, 62, 1563, 406, 411, 411,
- 411, 62, 746, 412, 414, 414, 414, 417, 428, 745,
+ 88, 88, 88, 676, 89, 89, 89, 90, 90, 90,
+ 86, 411, 602, 87, 1562, 615, 88, 417, 62, 62,
+ 89, 422, 433, 90, 417, 62, 1223, 411, 416, 416,
+ 416, 62, 762, 417, 419, 419, 419, 422, 433, 1223,
62, 65, 65, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 746, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 762, 65, 65, 65,
65, 65, 91, 91, 91, 92, 92, 92, 93, 93,
- 93, 1567, 94, 94, 94, 95, 95, 95, 91, 444,
- 779, 92, 423, 779, 93, 479, 65, 65, 94, 423,
- 1571, 95, 422, 422, 422, 444, 438, 65, 423, 425,
- 425, 425, 436, 436, 436, 1573, 65, 66, 66, 66,
+ 93, 615, 94, 94, 94, 95, 95, 95, 91, 449,
+ 459, 92, 428, 1563, 93, 485, 65, 65, 94, 428,
+ 1565, 95, 427, 427, 427, 449, 459, 65, 428, 430,
+ 430, 430, 441, 441, 441, 1574, 65, 66, 66, 66,
66, 66, 66, 66, 66, 66, 66, 66, 66, 66,
- 66, 66, 747, 66, 66, 66, 66, 66, 96, 96,
- 96, 97, 97, 97, 98, 98, 98, 479, 99, 99,
- 99, 100, 100, 100, 96, 438, 747, 97, 438, 748,
- 98, 1574, 66, 66, 99, 449, 1578, 100, 101, 101,
+ 66, 66, 763, 66, 66, 66, 66, 66, 96, 96,
+ 96, 97, 97, 97, 98, 98, 98, 485, 99, 99,
+ 99, 100, 100, 100, 96, 471, 763, 97, 1577, 764,
+ 98, 1579, 66, 66, 99, 454, 1584, 100, 101, 101,
- 101, 1581, 449, 66, 102, 102, 102, 441, 441, 441,
- 546, 449, 66, 748, 101, 448, 448, 448, 372, 1582,
+ 101, 471, 454, 66, 102, 102, 102, 446, 446, 446,
+ 552, 454, 66, 764, 101, 453, 453, 453, 376, 1587,
102, 103, 103, 103, 103, 103, 103, 103, 103, 103,
- 103, 103, 103, 103, 103, 103, 752, 103, 103, 103,
+ 103, 103, 103, 103, 103, 103, 765, 103, 103, 103,
103, 103, 105, 105, 105, 106, 106, 106, 107, 107,
- 107, 686, 108, 108, 108, 686, 372, 454, 105, 785,
- 752, 106, 546, 785, 107, 369, 103, 103, 108, 461,
- 466, 103, 372, 454, 547, 369, 461, 103, 451, 451,
- 451, 103, 460, 460, 460, 461, 466, 103, 104, 104,
+ 107, 703, 108, 108, 108, 703, 376, 490, 105, 777,
+ 765, 106, 552, 777, 107, 373, 103, 103, 108, 466,
+ 505, 103, 376, 490, 553, 373, 466, 103, 456, 456,
+ 456, 103, 465, 465, 465, 466, 505, 103, 104, 104,
104, 104, 104, 104, 104, 104, 104, 104, 104, 104,
- 104, 104, 104, 369, 104, 104, 104, 104, 104, 109,
- 109, 109, 110, 110, 110, 111, 111, 111, 625, 112,
- 112, 112, 463, 463, 463, 109, 547, 475, 110, 1589,
- 1591, 111, 1592, 104, 104, 112, 484, 499, 104, 475,
- 475, 477, 477, 477, 104, 481, 481, 481, 104, 493,
- 493, 493, 484, 499, 104, 113, 113, 113, 113, 113,
+ 104, 104, 104, 373, 104, 104, 104, 104, 104, 109,
+ 109, 109, 110, 110, 110, 111, 111, 111, 631, 112,
+ 112, 112, 468, 468, 468, 109, 553, 480, 110, 1588,
+ 1589, 111, 1594, 104, 104, 112, 521, 532, 104, 480,
+ 480, 483, 483, 483, 104, 487, 487, 487, 104, 499,
+ 499, 499, 521, 532, 104, 113, 113, 113, 113, 113,
113, 113, 113, 113, 113, 113, 113, 113, 113, 113,
- 625, 113, 113, 113, 113, 113, 115, 115, 115, 116,
- 116, 116, 117, 117, 117, 681, 118, 118, 118, 1148,
- 494, 1598, 115, 1148, 1599, 116, 681, 494, 117, 681,
-
- 113, 113, 118, 510, 515, 113, 494, 496, 496, 496,
- 510, 113, 509, 509, 509, 512, 512, 512, 1476, 510,
- 515, 1601, 113, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114, 1476, 114,
+ 631, 113, 113, 113, 113, 113, 115, 115, 115, 116,
+ 116, 116, 117, 117, 117, 698, 118, 118, 118, 803,
+ 500, 1595, 115, 803, 769, 116, 698, 500, 117, 698,
+
+ 113, 113, 118, 516, 544, 113, 500, 502, 502, 502,
+ 516, 113, 515, 515, 515, 518, 518, 518, 769, 516,
+ 544, 1028, 113, 114, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 114, 114, 114, 114, 114, 1028, 114,
114, 114, 114, 114, 119, 119, 119, 120, 120, 120,
- 121, 121, 121, 688, 122, 122, 122, 520, 520, 520,
- 119, 526, 538, 120, 521, 1602, 121, 688, 114, 114,
- 122, 521, 1603, 114, 523, 523, 523, 526, 538, 114,
- 521, 532, 532, 532, 535, 535, 535, 545, 545, 545,
+ 121, 121, 121, 705, 122, 122, 122, 526, 526, 526,
+ 119, 558, 571, 120, 527, 1596, 121, 705, 114, 114,
+ 122, 527, 1597, 114, 529, 529, 529, 558, 571, 114,
+ 527, 538, 538, 538, 541, 541, 541, 551, 551, 551,
114, 123, 123, 123, 123, 123, 123, 123, 123, 123,
- 123, 123, 123, 123, 123, 123, 1604, 123, 123, 123,
+ 123, 123, 123, 123, 123, 123, 1598, 123, 123, 123,
123, 123, 125, 125, 125, 126, 126, 126, 129, 129,
- 129, 645, 130, 130, 130, 133, 133, 133, 125, 552,
- 565, 126, 533, 1605, 129, 1606, 123, 123, 130, 533,
- 572, 133, 549, 549, 549, 552, 565, 646, 533, 557,
- 557, 557, 123, 1616, 558, 1618, 1619, 123, 124, 124,
+ 129, 651, 130, 130, 130, 133, 133, 133, 125, 1179,
+ 1599, 126, 539, 1179, 129, 1518, 123, 123, 130, 539,
+ 578, 133, 555, 555, 555, 563, 563, 563, 539, 568,
+ 568, 568, 123, 1600, 564, 1518, 1605, 123, 124, 124,
124, 124, 124, 124, 124, 124, 124, 124, 124, 124,
- 124, 124, 124, 645, 124, 124, 124, 124, 124, 134,
- 134, 134, 135, 135, 135, 136, 136, 136, 572, 137,
- 137, 137, 138, 138, 138, 134, 572, 1624, 135, 646,
+ 124, 124, 124, 651, 124, 124, 124, 124, 124, 134,
+ 134, 134, 135, 135, 135, 136, 136, 136, 578, 137,
+ 137, 137, 138, 138, 138, 134, 578, 1606, 135, 584,
- 1626, 136, 558, 124, 124, 137, 558, 578, 138, 562,
- 562, 562, 571, 571, 571, 575, 575, 575, 1628, 124,
- 583, 583, 583, 578, 124, 127, 127, 127, 127, 127,
+ 1607, 136, 564, 124, 124, 137, 564, 595, 138, 577,
+ 577, 577, 581, 581, 581, 584, 589, 589, 589, 124,
+ 592, 592, 592, 595, 124, 127, 127, 127, 127, 127,
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
- 1629, 127, 127, 127, 127, 127, 139, 139, 139, 140,
- 140, 140, 143, 143, 143, 692, 144, 144, 144, 147,
- 147, 147, 139, 589, 601, 140, 584, 741, 143, 692,
- 127, 127, 144, 584, 614, 147, 586, 586, 586, 589,
- 601, 741, 584, 594, 594, 594, 127, 1631, 1632, 595,
- 614, 1633, 127, 128, 128, 128, 128, 128, 128, 128,
-
- 128, 128, 128, 128, 128, 128, 128, 128, 1642, 128,
+ 1611, 127, 127, 127, 127, 127, 139, 139, 139, 140,
+ 140, 140, 143, 143, 143, 1615, 144, 144, 144, 147,
+ 147, 147, 139, 1617, 1618, 140, 590, 607, 143, 620,
+ 127, 127, 144, 590, 636, 147, 600, 600, 600, 604,
+ 604, 604, 590, 607, 1622, 620, 127, 1625, 1626, 601,
+ 636, 1053, 127, 128, 128, 128, 128, 128, 128, 128,
+
+ 128, 128, 128, 128, 128, 128, 128, 128, 1053, 128,
128, 128, 128, 128, 148, 148, 148, 151, 151, 151,
- 152, 152, 152, 1648, 153, 153, 153, 154, 154, 154,
- 148, 1191, 1649, 151, 1653, 1655, 152, 595, 128, 128,
- 153, 691, 630, 154, 1191, 595, 598, 598, 598, 607,
- 607, 607, 691, 1667, 128, 691, 1668, 608, 630, 1673,
+ 152, 152, 152, 1369, 153, 153, 153, 154, 154, 154,
+ 148, 1633, 1635, 151, 1636, 1369, 152, 601, 128, 128,
+ 153, 1642, 1643, 154, 652, 601, 613, 613, 613, 614,
+ 617, 617, 617, 1645, 128, 628, 628, 628, 629, 1646,
128, 131, 131, 131, 131, 131, 131, 131, 131, 131,
- 131, 131, 131, 131, 131, 131, 1676, 131, 131, 131,
+ 131, 131, 131, 131, 131, 131, 1647, 131, 131, 131,
131, 131, 155, 155, 155, 156, 156, 156, 157, 157,
- 157, 1677, 158, 158, 158, 611, 611, 611, 155, 1245,
+ 157, 1648, 158, 158, 158, 629, 652, 614, 155, 646,
- 1678, 156, 1680, 1687, 157, 608, 131, 131, 158, 131,
- 640, 131, 1245, 608, 622, 622, 622, 131, 627, 627,
- 627, 634, 634, 634, 131, 623, 640, 131, 132, 132,
+ 657, 156, 1649, 1650, 157, 614, 131, 131, 158, 131,
+ 629, 131, 633, 633, 633, 646, 657, 131, 640, 640,
+ 640, 643, 643, 643, 131, 1651, 1652, 131, 132, 132,
132, 132, 132, 132, 132, 132, 132, 132, 132, 132,
- 132, 132, 132, 1690, 132, 132, 132, 132, 132, 161,
- 161, 161, 162, 162, 162, 165, 165, 165, 694, 166,
- 166, 166, 623, 635, 1693, 161, 1694, 651, 162, 694,
- 635, 165, 694, 132, 132, 166, 132, 623, 132, 635,
- 637, 637, 637, 651, 132, 644, 644, 644, 648, 648,
- 648, 132, 1696, 1697, 132, 141, 141, 141, 141, 141,
+ 132, 132, 132, 1662, 132, 132, 132, 132, 132, 161,
+ 161, 161, 162, 162, 162, 165, 165, 165, 708, 166,
+ 166, 166, 1664, 641, 1665, 161, 1670, 668, 162, 708,
+ 641, 165, 708, 132, 132, 166, 132, 931, 132, 641,
+ 650, 650, 650, 668, 132, 654, 654, 654, 662, 662,
+ 662, 132, 1672, 931, 132, 141, 141, 141, 141, 141,
141, 141, 141, 141, 141, 141, 141, 141, 141, 141,
- 1698, 141, 141, 141, 141, 141, 169, 169, 169, 170,
- 170, 170, 173, 173, 173, 749, 174, 174, 174, 177,
- 177, 177, 169, 1699, 1700, 170, 657, 1701, 173, 749,
- 141, 141, 174, 657, 1702, 177, 656, 656, 656, 658,
- 658, 658, 657, 667, 667, 667, 141, 142, 142, 142,
+ 1674, 141, 141, 141, 141, 141, 169, 169, 169, 170,
+ 170, 170, 173, 173, 173, 709, 174, 174, 174, 177,
+ 177, 177, 169, 1675, 1677, 170, 663, 674, 173, 709,
+ 141, 141, 174, 663, 674, 177, 665, 665, 665, 673,
+ 673, 673, 663, 674, 1678, 1679, 141, 142, 142, 142,
142, 142, 142, 142, 142, 142, 142, 142, 142, 142,
- 142, 142, 1704, 142, 142, 142, 142, 142, 178, 178,
- 178, 179, 179, 179, 180, 180, 180, 1705, 181, 181,
- 181, 182, 182, 182, 178, 698, 1707, 179, 687, 750,
+ 142, 142, 1688, 142, 142, 142, 142, 142, 178, 178,
+ 178, 179, 179, 179, 180, 180, 180, 758, 181, 181,
+ 181, 182, 182, 182, 178, 1694, 1695, 179, 704, 1699,
- 180, 696, 142, 142, 181, 687, 698, 182, 696, 698,
- 750, 687, 667, 750, 696, 1163, 1163, 1163, 142, 145,
+ 180, 758, 142, 142, 181, 704, 1701, 182, 675, 675,
+ 675, 704, 684, 684, 684, 1194, 1194, 1194, 142, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
- 145, 145, 145, 145, 1709, 145, 145, 145, 145, 145,
- 183, 183, 183, 184, 184, 184, 187, 187, 187, 751,
- 188, 188, 188, 189, 189, 189, 183, 1711, 1686, 184,
- 699, 700, 187, 751, 145, 145, 188, 699, 700, 189,
- 145, 740, 743, 699, 700, 145, 1712, 1714, 740, 743,
- 1171, 1171, 1171, 1686, 740, 743, 1716, 145, 146, 146,
+ 145, 145, 145, 145, 1713, 145, 145, 145, 145, 145,
+ 183, 183, 183, 184, 184, 184, 187, 187, 187, 711,
+ 188, 188, 188, 189, 189, 189, 183, 1714, 1719, 184,
+ 711, 713, 187, 711, 145, 145, 188, 715, 713, 189,
+ 145, 684, 716, 717, 713, 145, 1722, 1723, 715, 716,
+ 717, 715, 1202, 1202, 1202, 716, 717, 145, 146, 146,
146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 146, 146, 1718, 146, 146, 146, 146, 146, 190,
- 190, 190, 191, 191, 191, 192, 192, 192, 1719, 193,
- 193, 193, 194, 194, 194, 190, 907, 1720, 191, 1721,
- 1722, 192, 1724, 146, 146, 193, 1733, 1734, 194, 146,
- 1736, 1740, 907, 1744, 146, 910, 910, 910, 1746, 910,
- 1186, 1186, 1186, 1242, 1242, 1242, 146, 149, 149, 149,
+ 146, 146, 146, 1724, 146, 146, 146, 146, 146, 190,
+ 190, 190, 191, 191, 191, 192, 192, 192, 766, 193,
+ 193, 193, 194, 194, 194, 190, 1726, 768, 191, 757,
+ 760, 192, 766, 146, 146, 193, 757, 760, 194, 146,
+ 767, 768, 757, 760, 146, 934, 934, 934, 1735, 934,
+ 1738, 767, 1741, 1742, 767, 1744, 146, 149, 149, 149,
149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
149, 149, 149, 149, 149, 149, 149, 149, 149, 149,
149, 159, 159, 159, 159, 159, 159, 159, 159, 159,
- 159, 159, 159, 159, 159, 159, 1753, 159, 159, 159,
+ 159, 159, 159, 159, 159, 159, 1745, 159, 159, 159,
159, 159, 197, 197, 197, 198, 198, 198, 199, 199,
- 199, 1754, 200, 200, 200, 201, 201, 201, 197, 1041,
- 1755, 198, 1756, 1758, 199, 1762, 159, 159, 200, 1041,
- 159, 201, 922, 922, 922, 1763, 1041, 159, 1764, 1767,
- 159, 944, 944, 944, 159, 1774, 159, 159, 160, 160,
+ 199, 1746, 200, 200, 200, 201, 201, 201, 197, 1066,
+ 1734, 198, 1277, 1747, 199, 1748, 159, 159, 200, 1066,
+ 159, 201, 946, 946, 946, 1277, 1066, 159, 1749, 1750,
+ 159, 968, 968, 968, 159, 1734, 159, 159, 160, 160,
160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 1780, 160, 160, 160, 160, 160, 202,
- 202, 202, 203, 203, 203, 204, 204, 204, 1787, 207,
- 207, 207, 208, 208, 208, 202, 1788, 1797, 203, 1800,
- 1810, 204, 1814, 160, 160, 207, 922, 160, 208, 956,
- 956, 956, 1818, 956, 160, 944, 956, 160, 1492, 1492,
- 1492, 160, 1819, 160, 160, 163, 163, 163, 163, 163,
+ 160, 160, 160, 1752, 160, 160, 160, 160, 160, 202,
+ 202, 202, 203, 203, 203, 204, 204, 204, 1753, 207,
+ 207, 207, 208, 208, 208, 202, 1755, 1756, 203, 1758,
+ 1760, 204, 1761, 160, 160, 207, 946, 160, 208, 980,
+ 980, 980, 1763, 980, 160, 968, 980, 160, 1218, 1218,
+ 1218, 160, 1765, 160, 160, 163, 163, 163, 163, 163,
163, 163, 163, 163, 163, 163, 163, 163, 163, 163,
- 1823, 163, 163, 163, 163, 163, 211, 211, 211, 212,
- 212, 212, 213, 213, 213, 1824, 214, 214, 214, 708,
-
- 708, 708, 211, 1825, 1826, 212, 1835, 1839, 213, 1842,
- 163, 163, 214, 163, 163, 163, 708, 1844, 964, 964,
- 964, 163, 964, 1846, 163, 964, 1847, 1849, 163, 1850,
- 1851, 163, 164, 164, 164, 164, 164, 164, 164, 164,
- 164, 164, 164, 164, 164, 164, 164, 1854, 164, 164,
+ 1767, 163, 163, 163, 163, 163, 211, 211, 211, 212,
+ 212, 212, 213, 213, 213, 1768, 214, 214, 214, 725,
+
+ 725, 725, 211, 1769, 1770, 212, 1771, 1773, 213, 1782,
+ 163, 163, 214, 163, 163, 163, 725, 1783, 988, 988,
+ 988, 163, 988, 1785, 163, 988, 1789, 1793, 163, 1795,
+ 1802, 163, 164, 164, 164, 164, 164, 164, 164, 164,
+ 164, 164, 164, 164, 164, 164, 164, 1803, 164, 164,
164, 164, 164, 215, 215, 215, 216, 216, 216, 217,
- 217, 217, 1856, 218, 218, 218, 716, 716, 716, 215,
- 1858, 1863, 216, 1869, 1873, 217, 1874, 164, 164, 218,
- 164, 164, 164, 716, 1875, 979, 979, 979, 164, 979,
- 1877, 164, 979, 1889, 1892, 164, 1886, 1885, 164, 167,
+ 217, 217, 1804, 218, 218, 218, 733, 733, 733, 215,
+ 1805, 1807, 216, 1811, 1812, 217, 1813, 164, 164, 218,
+ 164, 164, 164, 733, 1816, 1003, 1003, 1003, 164, 1003,
+ 1823, 164, 1003, 1824, 1830, 164, 1837, 1838, 164, 167,
167, 167, 167, 167, 167, 167, 167, 167, 167, 167,
- 167, 167, 167, 167, 1885, 167, 167, 167, 167, 167,
- 221, 221, 221, 222, 222, 222, 223, 223, 223, 1893,
- 224, 224, 224, 732, 732, 732, 221, 1894, 1886, 222,
- 1896, 1897, 223, 1899, 167, 167, 224, 1900, 1901, 167,
- 732, 1493, 1493, 1493, 1903, 167, 168, 168, 168, 168,
+ 167, 167, 167, 167, 1847, 167, 167, 167, 167, 167,
+ 221, 221, 221, 222, 222, 222, 223, 223, 223, 1850,
+ 224, 224, 224, 749, 749, 749, 221, 1860, 1864, 222,
+ 1868, 1869, 223, 1873, 167, 167, 224, 1874, 1875, 167,
+ 749, 1274, 1274, 1274, 1876, 167, 168, 168, 168, 168,
168, 168, 168, 168, 168, 168, 168, 168, 168, 168,
- 168, 1887, 168, 168, 168, 168, 168, 225, 225, 225,
- 226, 226, 226, 227, 227, 227, 1904, 228, 228, 228,
- 756, 756, 756, 225, 1905, 1895, 226, 1493, 1909, 227,
+ 168, 1878, 168, 168, 168, 168, 168, 225, 225, 225,
+ 226, 226, 226, 227, 227, 227, 1879, 228, 228, 228,
+ 773, 773, 773, 225, 1887, 1891, 226, 1894, 1896, 227,
- 1911, 168, 168, 228, 1887, 1914, 168, 756, 1495, 1495,
- 1495, 1895, 168, 171, 171, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 1915, 171,
+ 1898, 168, 168, 228, 1899, 1901, 168, 773, 1534, 1534,
+ 1534, 1902, 168, 171, 171, 171, 171, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 171, 1903, 171,
171, 171, 171, 171, 231, 231, 231, 232, 232, 232,
- 233, 233, 233, 1916, 234, 234, 234, 235, 235, 235,
- 231, 1917, 1919, 232, 1495, 1921, 233, 1922, 171, 171,
- 234, 1924, 171, 235, 983, 983, 983, 1926, 1929, 171,
- 1930, 1932, 171, 172, 172, 172, 172, 172, 172, 172,
- 172, 172, 172, 172, 172, 172, 172, 172, 1933, 172,
+ 233, 233, 233, 1906, 234, 234, 234, 235, 235, 235,
+ 231, 1908, 1910, 232, 1915, 1921, 233, 1925, 171, 171,
+ 234, 1926, 171, 235, 1007, 1007, 1007, 1927, 1929, 171,
+ 1941, 1940, 171, 172, 172, 172, 172, 172, 172, 172,
+ 172, 172, 172, 172, 172, 172, 172, 172, 1940, 172,
172, 172, 172, 172, 236, 236, 236, 237, 237, 237,
- 238, 238, 238, 1931, 241, 241, 241, 242, 242, 242,
- 236, 1931, 1934, 237, 1936, 1942, 238, 1943, 172, 172,
- 241, 1945, 172, 242, 992, 992, 992, 1948, 983, 172,
- 1960, 1965, 172, 175, 175, 175, 175, 175, 175, 175,
- 175, 175, 175, 175, 175, 175, 175, 175, 1966, 175,
+ 238, 238, 238, 1944, 241, 241, 241, 242, 242, 242,
+ 236, 1947, 1941, 237, 1948, 1942, 238, 1949, 172, 172,
+ 241, 1951, 172, 242, 1016, 1016, 1016, 1952, 1007, 172,
+ 1954, 1955, 172, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 1942, 175,
175, 175, 175, 175, 245, 245, 245, 246, 246, 246,
- 247, 247, 247, 1935, 248, 248, 248, 249, 249, 249,
- 245, 1935, 1973, 246, 1944, 1949, 247, 1974, 175, 175,
- 248, 1975, 175, 249, 1498, 1498, 1498, 1979, 992, 175,
- 1944, 1949, 175, 1501, 1501, 1501, 1511, 1511, 1511, 175,
+ 247, 247, 247, 1956, 248, 248, 248, 249, 249, 249,
+ 245, 1950, 1957, 246, 1959, 1960, 247, 1961, 175, 175,
+ 248, 1965, 175, 249, 1535, 1535, 1535, 1950, 1016, 175,
+ 1967, 1970, 175, 1537, 1537, 1537, 1541, 1541, 1541, 175,
176, 176, 176, 176, 176, 176, 176, 176, 176, 176,
- 176, 176, 176, 176, 176, 1981, 176, 176, 176, 176,
+ 176, 176, 176, 176, 176, 1971, 176, 176, 176, 176,
176, 250, 250, 250, 251, 251, 251, 252, 252, 252,
- 1987, 255, 255, 255, 256, 256, 256, 250, 1748, 1950,
- 251, 1988, 1989, 252, 1748, 176, 176, 255, 1748, 176,
- 256, 298, 1748, 364, 370, 1950, 176, 1996, 1997, 176,
- 1998, 298, 2011, 364, 2017, 2021, 176, 185, 185, 185,
+ 1535, 255, 255, 255, 256, 256, 256, 250, 1972, 1537,
+ 251, 1973, 1975, 252, 368, 176, 176, 255, 1977, 176,
+ 256, 1023, 1023, 1023, 368, 1023, 176, 1978, 1023, 176,
+ 1544, 1544, 1544, 1554, 1554, 1554, 176, 185, 185, 185,
185, 185, 185, 185, 185, 185, 185, 185, 185, 185,
- 185, 185, 370, 185, 185, 185, 185, 185, 2024, 2026,
- 298, 364, 2029, 763, 763, 763, 298, 2031, 370, 780,
-
- 780, 780, 2033, 298, 2034, 364, 2035, 298, 2038, 364,
- 763, 2040, 185, 185, 2045, 2047, 780, 2055, 185, 999,
- 999, 999, 2056, 999, 2057, 2058, 999, 1547, 1547, 1547,
- 1548, 1548, 1548, 185, 186, 186, 186, 186, 186, 186,
- 186, 186, 186, 186, 186, 186, 186, 186, 186, 2060,
- 186, 186, 186, 186, 186, 793, 793, 793, 794, 794,
- 794, 800, 800, 800, 802, 802, 802, 816, 816, 816,
- 2073, 2071, 793, 2074, 2079, 794, 1548, 2071, 800, 186,
- 186, 802, 2080, 2081, 816, 186, 1006, 1006, 1006, 2082,
- 1006, 2086, 2088, 1006, 1549, 1549, 1549, 1550, 1550, 1550,
+ 185, 185, 368, 185, 185, 185, 185, 185, 259, 259,
+ 259, 260, 260, 260, 1980, 1982, 368, 781, 781, 781,
+
+ 368, 944, 944, 944, 259, 1985, 1986, 260, 1988, 1989,
+ 302, 1990, 185, 185, 781, 798, 798, 798, 185, 944,
+ 302, 1992, 1031, 1031, 1031, 1998, 1031, 1999, 374, 1031,
+ 2001, 2004, 798, 185, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186, 186, 302,
+ 186, 186, 186, 186, 186, 302, 374, 811, 811, 811,
+ 2012, 2017, 302, 1590, 1590, 1590, 302, 812, 812, 812,
+ 1987, 2022, 374, 2023, 811, 818, 818, 818, 1987, 186,
+ 186, 820, 820, 820, 812, 186, 1047, 1047, 1047, 1991,
+ 1047, 2030, 818, 1047, 1591, 1591, 1591, 1991, 820, 2031,
186, 195, 195, 195, 195, 195, 195, 195, 195, 195,
- 195, 195, 195, 195, 195, 195, 2073, 195, 195, 195,
- 195, 195, 817, 817, 817, 829, 829, 829, 837, 837,
- 837, 842, 842, 842, 848, 848, 848, 2089, 2090, 817,
- 1549, 2095, 829, 2102, 2104, 837, 195, 195, 842, 2105,
- 2108, 848, 195, 2111, 2115, 195, 1022, 1022, 1022, 2116,
- 1022, 2117, 2118, 1022, 1644, 1644, 1644, 195, 196, 196,
+ 195, 195, 195, 195, 195, 195, 2032, 195, 195, 195,
+ 195, 195, 835, 835, 835, 836, 836, 836, 848, 848,
+ 848, 856, 856, 856, 861, 861, 861, 2000, 2005, 835,
+ 1591, 2036, 836, 2006, 2038, 848, 195, 195, 856, 2044,
+ 2045, 861, 195, 2000, 2005, 195, 1060, 1060, 1060, 2006,
+ 1060, 2046, 2053, 1060, 1592, 1592, 1592, 195, 196, 196,
196, 196, 196, 196, 196, 196, 196, 196, 196, 196,
- 196, 196, 196, 2119, 196, 196, 196, 196, 196, 870,
- 870, 870, 898, 898, 898, 902, 902, 902, 920, 920,
+ 196, 196, 196, 2054, 196, 196, 196, 196, 196, 867,
+ 867, 867, 889, 889, 889, 917, 917, 917, 921, 921,
- 920, 1749, 921, 921, 921, 2120, 870, 1749, 2121, 898,
- 1644, 1749, 902, 196, 196, 1749, 920, 2122, 2123, 196,
- 921, 2124, 196, 1035, 1035, 1035, 2129, 1035, 2072, 2130,
- 1035, 1703, 1703, 1703, 196, 205, 205, 205, 205, 205,
+ 921, 926, 926, 926, 2055, 2058, 867, 2059, 2070, 889,
+ 1592, 2076, 917, 196, 196, 921, 2080, 2083, 926, 196,
+ 2085, 2088, 196, 1062, 1062, 1062, 2090, 1062, 2092, 2093,
+ 1062, 1593, 1593, 1593, 196, 205, 205, 205, 205, 205,
205, 205, 205, 205, 205, 205, 205, 205, 205, 205,
- 2131, 205, 205, 205, 205, 205, 952, 952, 952, 2072,
- 921, 953, 953, 953, 2132, 955, 955, 955, 2137, 959,
- 959, 959, 2141, 2146, 952, 1706, 1706, 1706, 2153, 953,
- 205, 205, 955, 1708, 1708, 1708, 205, 959, 1710, 1710,
- 1710, 205, 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 206, 206, 206, 206, 2154, 206, 206,
- 206, 206, 206, 960, 960, 960, 963, 963, 963, 2160,
- 2161, 953, 965, 965, 965, 967, 967, 967, 971, 971,
- 971, 960, 2158, 963, 1713, 1713, 1713, 206, 206, 965,
- 2158, 2163, 967, 206, 2167, 2168, 971, 2169, 206, 209,
+ 2094, 205, 205, 205, 205, 205, 945, 945, 945, 976,
+ 976, 976, 2097, 2099, 977, 977, 977, 979, 979, 979,
+ 983, 983, 983, 1797, 945, 2104, 2106, 976, 2114, 1797,
+ 205, 205, 977, 1797, 979, 2115, 205, 1797, 983, 2116,
+ 2117, 205, 206, 206, 206, 206, 206, 206, 206, 206,
+
+ 206, 206, 206, 206, 206, 206, 206, 2119, 206, 206,
+ 206, 206, 206, 2135, 945, 984, 984, 984, 987, 987,
+ 987, 995, 995, 995, 977, 989, 989, 989, 991, 991,
+ 991, 2137, 2142, 984, 2134, 987, 2143, 206, 206, 995,
+ 2134, 2136, 989, 206, 2135, 991, 2144, 2145, 206, 209,
209, 209, 209, 209, 209, 209, 209, 209, 209, 209,
- 209, 209, 209, 209, 2175, 209, 209, 209, 209, 209,
- 976, 976, 976, 977, 977, 977, 2176, 960, 2177, 978,
- 978, 978, 2159, 2191, 972, 972, 972, 2195, 976, 2196,
- 2159, 977, 2197, 2199, 209, 209, 978, 998, 998, 998,
+ 209, 209, 209, 209, 2149, 209, 209, 209, 209, 209,
+ 1000, 1000, 1000, 1001, 1001, 1001, 1002, 1002, 1002, 984,
+ 1005, 1005, 1005, 2151, 996, 996, 996, 2136, 1000, 2152,
+ 2153, 1001, 2154, 1002, 209, 209, 2159, 2166, 1005, 2168,
- 209, 2203, 972, 1037, 1037, 1037, 2206, 1037, 2207, 2210,
- 1037, 1715, 1715, 1715, 998, 209, 210, 210, 210, 210,
+ 209, 2169, 996, 1068, 1068, 1068, 2172, 1068, 2175, 2179,
+ 1068, 1690, 1690, 1690, 2180, 209, 210, 210, 210, 210,
210, 210, 210, 210, 210, 210, 210, 210, 210, 210,
- 210, 972, 210, 210, 210, 210, 210, 977, 981, 981,
- 981, 982, 982, 982, 2211, 1002, 1002, 1002, 1003, 1003,
- 1003, 1005, 1005, 1005, 2214, 2221, 981, 2208, 2223, 982,
- 2238, 210, 210, 1002, 2209, 2208, 1003, 210, 1005, 1043,
- 1043, 1043, 2209, 1043, 2243, 1715, 1043, 2252, 982, 1723,
- 1723, 1723, 210, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219, 2242, 219,
-
- 219, 219, 219, 219, 1008, 1008, 1008, 1009, 1009, 1009,
- 1021, 1021, 1021, 2253, 1003, 1012, 1012, 1012, 1013, 1013,
- 1013, 2243, 1008, 2256, 2263, 1009, 2264, 1021, 219, 219,
- 1016, 1016, 1016, 1012, 219, 2269, 1013, 219, 1046, 1046,
- 1046, 2242, 1046, 2271, 2283, 1046, 2284, 2285, 1016, 219,
+ 210, 996, 210, 210, 210, 210, 210, 1001, 1006, 1006,
+ 1006, 1022, 1022, 1022, 2181, 1026, 1026, 1026, 1027, 1027,
+ 1027, 1030, 1030, 1030, 2182, 2183, 1006, 1690, 1022, 2184,
+ 2185, 210, 210, 1026, 2186, 2187, 1027, 210, 1030, 1071,
+ 1071, 1071, 2188, 1071, 2193, 1006, 1071, 1751, 1751, 1751,
+ 2194, 2195, 210, 219, 219, 219, 219, 219, 219, 219,
+ 219, 219, 219, 219, 219, 219, 219, 219, 2196, 219,
+
+ 219, 219, 219, 219, 1033, 1033, 1033, 1034, 1034, 1034,
+ 1046, 1046, 1046, 2201, 1027, 1037, 1037, 1037, 1038, 1038,
+ 1038, 2203, 1033, 2206, 2211, 1034, 2218, 1046, 219, 219,
+ 1041, 1041, 1041, 1037, 219, 2219, 1038, 219, 1086, 1086,
+ 1086, 2225, 1086, 2226, 2228, 1086, 2232, 2233, 1041, 219,
220, 220, 220, 220, 220, 220, 220, 220, 220, 220,
- 220, 220, 220, 220, 220, 2286, 220, 220, 220, 220,
- 220, 2287, 2288, 1009, 1017, 1017, 1017, 2289, 2290, 1013,
- 1026, 1026, 1026, 2291, 1027, 1027, 1027, 1031, 1031, 1031,
- 2292, 2299, 1017, 2300, 2301, 220, 220, 2303, 1026, 2307,
+ 220, 220, 220, 220, 220, 2234, 220, 220, 220, 220,
+ 220, 2240, 2241, 1034, 1042, 1042, 1042, 2242, 2246, 1038,
+ 1051, 1051, 1051, 2223, 1052, 1052, 1052, 1056, 1056, 1056,
+ 2258, 2223, 1042, 2262, 2263, 220, 220, 2264, 1051, 2266,
- 2312, 220, 1027, 2316, 220, 1031, 1060, 1060, 1060, 2317,
- 1060, 2318, 2319, 1060, 2320, 2321, 220, 229, 229, 229,
+ 2270, 220, 1052, 2224, 220, 1056, 1088, 1088, 1088, 2273,
+ 1088, 2224, 2274, 1088, 2277, 2278, 220, 229, 229, 229,
229, 229, 229, 229, 229, 229, 229, 229, 229, 229,
- 229, 229, 2322, 229, 229, 229, 229, 229, 2325, 1017,
- 1034, 1034, 1034, 2326, 2327, 1027, 1032, 1032, 1032, 1036,
- 1036, 1036, 2333, 1038, 1038, 1038, 2334, 1034, 1039, 1039,
- 1039, 2340, 229, 229, 1032, 2341, 1036, 1717, 1717, 1717,
- 229, 1038, 229, 2342, 2343, 229, 1039, 2357, 2358, 229,
+ 229, 229, 2281, 229, 229, 229, 229, 229, 2288, 1042,
+ 1059, 1059, 1059, 2290, 2275, 1052, 1057, 1057, 1057, 1061,
+ 1061, 1061, 2275, 1063, 1063, 1063, 2305, 1059, 1064, 1064,
+ 1064, 2320, 229, 229, 1057, 2276, 1061, 1754, 1754, 1754,
+ 229, 1063, 229, 2276, 2310, 229, 1064, 2321, 2324, 229,
1757, 1757, 1757, 229, 230, 230, 230, 230, 230, 230,
- 230, 230, 230, 230, 230, 230, 230, 230, 230, 2359,
+ 230, 230, 230, 230, 230, 230, 230, 230, 230, 2327,
- 230, 230, 230, 230, 230, 1042, 1042, 1042, 1032, 1045,
- 1045, 1045, 2360, 1717, 1047, 1047, 1047, 2295, 2295, 1039,
- 2295, 2362, 1042, 1057, 1057, 1057, 1045, 2364, 2295, 230,
- 230, 1047, 1059, 1059, 1059, 2295, 2387, 230, 2328, 230,
- 2388, 1057, 230, 1759, 1759, 1759, 230, 2393, 2328, 1059,
+ 230, 230, 230, 230, 230, 1067, 1067, 1067, 1057, 1070,
+ 1070, 1070, 2332, 2333, 1072, 1072, 1072, 2310, 2338, 1064,
+ 2340, 2352, 1067, 1083, 1083, 1083, 1070, 2353, 2354, 230,
+ 230, 1072, 1085, 1085, 1085, 2355, 2356, 230, 2357, 230,
+ 2311, 1083, 230, 1759, 1759, 1759, 230, 2358, 2359, 1085,
230, 239, 239, 239, 239, 239, 239, 239, 239, 239,
- 239, 239, 239, 239, 239, 239, 2382, 239, 239, 239,
- 239, 239, 1061, 1061, 1061, 1062, 1062, 1062, 2394, 1062,
- 2395, 2398, 1062, 2401, 1058, 1058, 1058, 2402, 2403, 1061,
- 1063, 1063, 1063, 1064, 1064, 1064, 239, 239, 1065, 1065,
+ 239, 239, 239, 239, 239, 239, 2360, 239, 239, 239,
+ 239, 239, 1087, 1087, 1087, 1089, 1089, 1089, 1762, 1762,
+ 1762, 1772, 1772, 1772, 1084, 1084, 1084, 2311, 2361, 1087,
+ 2368, 2369, 1089, 1090, 1090, 1090, 239, 239, 1091, 1091,
- 1065, 2404, 1058, 2382, 1074, 1074, 1074, 1063, 1074, 2405,
- 1064, 1074, 1082, 1082, 1082, 1065, 1082, 2381, 2406, 1082,
+ 1091, 2370, 1084, 2372, 1100, 1100, 1100, 2376, 1100, 2378,
+ 1090, 1100, 1108, 1108, 1108, 1091, 1108, 2382, 2386, 1108,
239, 240, 240, 240, 240, 240, 240, 240, 240, 240,
- 240, 240, 240, 240, 240, 240, 2407, 240, 240, 240,
- 240, 240, 1058, 2408, 1064, 1068, 1068, 1068, 2409, 2381,
- 1065, 1066, 1066, 1066, 2410, 1073, 1073, 1073, 2411, 2413,
- 1067, 1067, 1067, 1068, 2414, 2416, 240, 240, 1066, 1069,
- 1069, 1069, 1073, 2417, 1087, 1087, 1087, 1067, 1087, 2415,
- 2418, 1087, 1093, 1093, 1093, 2419, 1093, 1069, 2415, 1093,
+ 240, 240, 240, 240, 240, 240, 2387, 240, 240, 240,
+ 240, 240, 1084, 2388, 1090, 1094, 1094, 1094, 2389, 2390,
+ 1091, 1092, 1092, 1092, 2391, 1099, 1099, 1099, 2392, 2395,
+ 1093, 1093, 1093, 1094, 2396, 2397, 240, 240, 1092, 1095,
+ 1095, 1095, 1099, 2403, 1113, 1113, 1113, 1093, 1113, 2404,
+ 2405, 1113, 1119, 1119, 1119, 2413, 1119, 1095, 2414, 1119,
240, 243, 243, 243, 243, 243, 243, 243, 243, 243,
- 243, 243, 243, 243, 243, 243, 1066, 243, 243, 243,
- 243, 243, 1067, 1075, 1075, 1075, 1069, 1078, 1078, 1078,
- 1079, 1079, 1079, 1081, 1081, 1081, 1083, 1083, 1083, 2421,
- 1075, 1760, 1760, 1760, 2422, 1078, 243, 243, 1079, 2424,
- 1081, 1725, 1725, 1725, 1083, 2425, 2427, 243, 244, 244,
+ 243, 243, 243, 243, 243, 243, 1092, 243, 243, 243,
+ 243, 243, 1093, 1101, 1101, 1101, 1095, 1104, 1104, 1104,
+ 1105, 1105, 1105, 1107, 1107, 1107, 1109, 1109, 1109, 2398,
+ 1101, 1764, 1764, 1764, 2415, 1104, 243, 243, 1105, 2398,
+ 1107, 1766, 1766, 1766, 1109, 2416, 2430, 243, 244, 244,
244, 244, 244, 244, 244, 244, 244, 244, 244, 244,
- 244, 244, 244, 2428, 244, 244, 244, 244, 244, 2430,
- 2436, 1079, 1084, 1084, 1084, 1086, 1086, 1086, 1089, 1089,
- 1089, 1090, 1090, 1090, 1092, 1092, 1092, 1725, 2420, 2437,
- 1084, 2438, 1086, 244, 244, 2440, 1089, 2420, 2445, 1090,
+ 244, 244, 244, 2431, 244, 244, 244, 244, 244, 2432,
+ 2433, 1105, 1110, 1110, 1110, 1112, 1112, 1112, 1115, 1115,
+ 1115, 1116, 1116, 1116, 1118, 1118, 1118, 1766, 2435, 2437,
+ 1110, 2461, 1112, 244, 244, 1764, 1115, 2456, 2462, 1116,
- 2446, 1092, 2447, 2448, 244, 253, 253, 253, 253, 253,
+ 2455, 1118, 2465, 2468, 244, 253, 253, 253, 253, 253,
253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
- 2449, 253, 253, 253, 253, 253, 2452, 2458, 1090, 1097,
- 1097, 1097, 2459, 1084, 2461, 1098, 1098, 1098, 1099, 1099,
- 1099, 1100, 1100, 1100, 1102, 1102, 1102, 1097, 2470, 2472,
- 253, 253, 2475, 1098, 2477, 1099, 2501, 2502, 1100, 2504,
- 2505, 253, 1102, 1113, 1113, 1113, 2506, 1113, 2497, 2498,
- 1113, 1799, 1799, 1799, 253, 254, 254, 254, 254, 254,
+ 2469, 253, 253, 253, 253, 253, 2470, 2473, 1116, 1123,
+ 1123, 1123, 2455, 1110, 2456, 1124, 1124, 1124, 1125, 1125,
+ 1125, 1126, 1126, 1126, 1128, 1128, 1128, 1123, 2476, 2477,
+ 253, 253, 2478, 1124, 2479, 1125, 2480, 2481, 1126, 2482,
+ 2483, 253, 1128, 1139, 1139, 1139, 2484, 1139, 2485, 2486,
+ 1139, 1774, 1774, 1774, 253, 254, 254, 254, 254, 254,
254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
- 1098, 254, 254, 254, 254, 254, 1101, 1101, 1101, 1103,
-
- 1103, 1103, 1105, 1105, 1105, 2497, 1106, 1106, 1106, 1107,
- 1107, 1107, 2498, 1101, 1109, 1109, 1109, 1103, 2496, 1105,
- 254, 254, 2511, 1106, 2512, 2513, 1107, 2514, 1110, 1110,
- 1110, 254, 1109, 1108, 1108, 1108, 1112, 1112, 1112, 1114,
- 1114, 1114, 2515, 2516, 254, 296, 1110, 1116, 1116, 1116,
- 1108, 2517, 296, 1112, 2518, 1101, 1106, 1114, 2496, 2519,
- 1103, 296, 296, 2520, 1116, 1110, 1115, 1115, 1115, 2521,
- 2523, 1106, 1898, 1898, 1898, 2524, 1117, 1117, 1117, 2525,
- 1118, 1118, 1118, 2526, 1115, 1119, 1119, 1119, 2527, 296,
- 296, 296, 1108, 1117, 2528, 296, 296, 296, 1118, 2529,
-
- 296, 296, 2530, 1119, 296, 2531, 296, 296, 296, 361,
- 1120, 1120, 1120, 1121, 1121, 1121, 361, 1122, 1122, 1122,
- 2532, 1115, 1123, 1123, 1123, 361, 361, 1120, 2533, 2534,
- 1121, 1124, 1124, 1124, 1122, 1136, 1136, 1136, 2509, 2535,
- 1123, 1140, 1140, 1140, 1130, 1130, 1130, 2536, 2509, 1124,
- 2538, 2509, 1136, 361, 361, 361, 1119, 2539, 1140, 361,
- 361, 361, 1130, 1121, 361, 361, 2541, 2547, 361, 2554,
- 361, 361, 361, 1131, 1131, 1131, 2555, 2556, 1121, 1134,
- 1134, 1134, 1135, 1135, 1135, 1137, 1137, 1137, 2510, 1137,
- 2558, 1131, 1137, 1138, 1138, 1138, 2562, 1134, 2510, 2565,
-
- 1135, 2510, 1124, 1139, 1139, 1139, 1141, 1141, 1141, 2606,
- 1141, 1138, 2603, 1141, 1143, 1143, 1143, 1144, 1144, 1144,
- 2608, 1139, 1159, 1159, 1159, 1160, 1160, 1160, 2588, 1162,
- 1162, 1162, 1143, 2609, 2610, 1144, 2613, 1131, 2588, 2614,
- 1159, 2603, 2616, 1160, 2588, 2617, 1135, 1162, 1193, 1193,
- 1193, 1194, 1194, 1194, 1195, 1195, 1195, 1197, 1197, 1197,
- 1198, 1198, 1198, 2604, 1139, 1193, 1199, 1199, 1199, 1194,
- 1199, 2619, 1195, 1199, 2605, 1197, 1162, 1198, 1202, 1202,
- 1202, 1144, 1204, 1204, 1204, 1205, 1205, 1205, 2589, 1207,
- 1207, 1207, 1209, 1209, 1209, 1202, 1209, 2620, 2589, 1209,
-
- 1204, 2615, 2621, 1205, 2589, 2604, 1197, 1207, 1212, 1212,
- 1212, 1213, 1213, 1213, 2615, 1213, 2605, 2618, 1213, 2622,
- 1214, 1214, 1214, 2623, 2625, 1212, 1215, 1215, 1215, 2626,
- 2618, 1216, 1216, 1216, 2627, 1216, 1207, 1214, 1216, 1202,
- 1218, 1218, 1218, 1215, 1220, 1220, 1220, 1221, 1221, 1221,
- 1223, 1223, 1223, 1225, 1225, 1225, 2628, 1218, 1227, 1227,
- 1227, 2631, 1220, 2632, 2633, 1221, 2634, 2635, 1223, 2636,
- 1225, 1228, 1228, 1228, 2637, 2638, 1227, 1230, 1230, 1230,
- 1231, 1231, 1231, 2639, 1231, 2640, 2641, 1231, 2642, 1228,
- 1235, 1235, 1235, 2643, 2645, 1230, 1236, 1236, 1236, 1238,
-
- 1238, 1238, 1253, 1253, 1253, 2657, 1253, 2658, 1235, 1253,
- 1223, 1257, 1257, 1257, 1236, 2663, 2667, 1238, 1258, 1258,
- 1258, 1259, 1259, 1259, 1230, 1261, 1261, 1261, 1257, 2685,
- 1263, 1263, 1263, 2686, 1263, 2687, 1258, 1263, 2688, 1259,
- 1267, 1267, 1267, 1261, 1268, 1268, 1268, 1270, 1270, 1270,
- 1271, 1271, 1271, 1272, 1272, 1272, 2689, 2690, 1267, 1273,
- 1273, 1273, 1268, 2702, 2700, 1270, 2705, 1271, 2706, 2710,
- 1272, 1274, 1274, 1274, 1276, 1276, 1276, 1273, 1277, 1277,
- 1277, 1278, 1278, 1278, 2694, 2711, 1261, 2712, 2713, 1274,
- 2714, 2715, 1276, 2716, 2695, 1277, 2717, 2694, 1278, 2700,
-
- 1272, 1279, 1279, 1279, 1280, 1280, 1280, 2695, 1270, 1278,
- 1282, 1282, 1282, 1285, 1285, 1285, 1286, 1286, 1286, 1279,
- 1286, 2719, 1280, 1286, 1292, 1292, 1292, 2720, 1282, 2721,
- 1285, 1293, 1293, 1293, 1295, 1295, 1295, 1298, 1298, 1298,
- 2722, 1276, 1292, 1299, 1299, 1299, 1300, 1300, 1300, 1293,
- 2723, 2724, 1295, 2725, 1298, 1302, 1302, 1302, 1303, 1303,
- 1303, 1299, 2726, 2728, 1300, 1304, 1304, 1304, 2699, 1304,
- 2729, 2730, 1304, 1302, 2731, 1303, 1282, 1307, 1307, 1307,
- 2732, 1307, 2733, 2734, 1307, 1310, 1310, 1310, 1311, 1311,
- 1311, 1313, 1313, 1313, 1318, 1318, 1318, 2735, 1318, 1295,
-
- 2736, 1318, 2737, 1310, 2738, 2739, 1311, 2740, 2750, 1313,
- 1321, 1321, 1321, 1322, 1322, 1322, 2699, 1322, 2754, 2755,
- 1322, 2763, 1302, 1325, 1325, 1325, 2764, 1321, 1326, 1326,
- 1326, 2781, 1326, 2782, 2783, 1326, 1336, 1336, 1336, 2784,
- 1325, 1337, 1337, 1337, 1339, 1339, 1339, 2776, 1340, 1340,
- 1340, 2777, 1340, 2785, 1336, 1340, 1313, 2776, 2779, 1337,
- 2786, 2777, 1339, 1343, 1343, 1343, 2789, 1343, 2779, 2780,
- 1343, 1346, 1346, 1346, 1347, 1347, 1347, 2790, 1347, 2780,
- 2791, 1347, 1352, 1352, 1352, 1353, 1353, 1353, 1346, 1355,
- 1355, 1355, 1360, 1360, 1360, 2792, 1360, 2793, 2801, 1360,
-
- 1352, 2802, 2803, 1353, 1363, 1363, 1363, 1355, 1364, 1364,
- 1364, 1339, 1364, 2804, 2805, 1364, 1367, 1367, 1367, 2806,
- 2807, 1363, 1368, 1368, 1368, 1370, 1370, 1370, 1372, 1372,
- 1372, 2793, 1372, 2808, 1367, 1372, 2811, 1355, 2812, 2814,
- 1368, 2815, 2816, 1370, 1375, 1375, 1375, 1376, 1376, 1376,
- 1378, 1378, 1378, 1380, 1380, 1380, 2818, 1380, 2820, 2821,
- 1380, 2822, 1375, 2825, 2826, 1376, 2827, 2828, 1378, 1384,
- 1384, 1384, 1385, 1385, 1385, 2831, 1370, 1387, 1387, 1387,
- 2844, 1389, 1389, 1389, 2845, 1389, 2846, 1384, 1389, 2854,
- 1385, 1395, 1395, 1395, 2860, 1387, 1396, 1396, 1396, 2861,
-
- 1398, 1398, 1398, 1399, 1399, 1399, 1400, 1400, 1400, 1395,
- 1400, 2862, 2863, 1400, 1396, 2864, 2865, 1378, 1398, 2866,
- 1399, 1401, 1401, 1401, 2867, 2868, 1387, 1402, 1402, 1402,
- 2869, 1402, 2871, 2872, 1402, 1404, 1404, 1404, 1401, 1405,
- 1405, 1405, 2877, 1407, 1407, 1407, 1409, 1409, 1409, 2878,
- 1413, 1413, 1413, 1404, 1902, 1902, 1902, 1405, 2879, 2880,
- 1398, 1407, 2890, 1409, 1410, 1410, 1410, 1413, 1410, 2891,
- 2892, 1410, 1414, 1414, 1414, 2893, 1414, 2894, 2895, 1414,
- 1416, 1416, 1416, 1417, 1417, 1417, 1419, 1419, 1419, 1421,
- 1421, 1421, 2896, 1421, 2897, 2901, 1421, 2902, 1416, 2903,
-
- 2881, 1417, 2904, 2905, 1419, 1424, 1424, 1424, 2906, 2908,
- 1407, 1425, 1425, 1425, 1427, 1427, 1427, 1428, 1428, 1428,
- 1429, 1429, 1429, 1424, 1429, 2909, 2911, 1429, 2912, 1425,
- 2913, 2915, 1427, 2919, 1428, 1430, 1430, 1430, 1431, 1431,
- 1431, 2920, 1431, 2881, 2921, 1431, 1432, 1432, 1432, 2924,
- 1419, 2929, 1430, 1433, 1433, 1433, 2930, 1435, 1435, 1435,
- 1436, 1436, 1436, 2931, 1432, 1437, 1437, 1437, 2932, 1437,
- 2933, 1433, 1437, 2934, 1427, 1435, 2935, 1436, 1440, 1440,
- 1440, 1441, 1441, 1441, 2936, 1441, 2937, 2938, 1441, 1442,
- 1442, 1442, 1443, 1443, 1443, 1440, 1445, 1445, 1445, 1447,
-
- 1447, 1447, 1451, 1451, 1451, 2939, 2940, 1442, 2942, 2943,
- 1443, 1452, 1452, 1452, 1445, 2944, 1447, 2945, 2946, 1435,
- 1451, 1454, 1454, 1454, 1457, 1457, 1457, 2948, 2952, 1452,
- 1458, 1458, 1458, 1460, 1460, 1460, 1461, 1461, 1461, 1454,
- 1461, 2948, 1457, 1461, 1464, 1464, 1464, 2955, 1458, 2956,
- 2959, 1460, 1465, 1465, 1465, 1467, 1467, 1467, 1445, 1468,
- 1468, 1468, 1464, 1468, 2946, 2961, 1468, 1472, 1472, 1472,
- 1465, 2962, 2949, 1467, 1473, 1473, 1473, 1475, 1475, 1475,
- 2964, 2965, 1454, 2949, 2968, 1472, 1460, 1477, 1477, 1477,
- 2969, 2970, 1473, 2971, 2972, 1475, 1484, 1484, 1484, 1514,
-
- 1514, 1514, 1516, 1516, 1516, 1477, 1477, 2973, 1517, 1517,
- 1517, 1542, 1542, 1542, 1484, 1467, 1514, 1515, 1515, 1515,
- 1516, 1515, 2974, 2975, 1515, 1517, 1518, 1518, 1518, 1542,
- 1518, 2976, 2978, 1518, 1521, 1521, 1521, 2980, 1475, 1523,
- 1523, 1523, 2988, 1523, 2978, 2979, 1523, 1526, 1526, 1526,
- 2990, 2985, 1521, 2992, 1527, 1527, 1527, 2979, 1527, 2986,
- 1516, 1527, 1484, 2985, 1526, 1528, 1528, 1528, 2994, 1528,
- 3002, 2986, 1528, 1532, 1532, 1532, 3004, 1533, 1533, 1533,
- 3008, 1533, 3005, 1521, 1533, 1535, 1535, 1535, 3006, 3010,
- 1532, 1537, 1537, 1537, 1538, 1538, 1538, 3012, 1538, 3007,
-
- 3007, 1538, 3006, 1535, 1539, 1539, 1539, 3013, 1537, 1540,
- 1540, 1540, 1558, 1558, 1558, 1559, 1559, 1559, 1560, 1560,
- 1560, 1539, 1560, 3005, 3014, 1560, 3015, 1540, 3030, 1558,
- 3021, 3029, 1559, 3032, 3031, 1535, 1561, 1561, 1561, 1564,
- 1564, 1564, 1565, 1565, 1565, 1566, 1566, 1566, 3021, 1566,
- 3029, 3035, 1566, 3031, 1561, 3037, 3024, 1564, 1540, 1565,
- 1568, 1568, 1568, 1569, 1569, 1569, 1570, 1570, 1570, 3042,
- 1570, 3024, 3043, 1570, 1572, 1572, 1572, 3034, 1568, 3009,
- 1569, 1575, 1575, 1575, 1576, 1576, 1576, 3045, 1576, 3046,
- 3009, 1576, 1572, 1577, 1577, 1577, 3034, 3047, 1575, 3036,
-
- 1561, 3049, 3050, 1564, 1579, 1579, 1579, 1580, 1580, 1580,
- 1577, 1583, 1583, 1583, 3051, 1584, 1584, 1584, 3036, 1584,
- 1568, 1579, 1584, 3052, 3054, 1580, 3056, 3063, 1583, 1585,
- 1585, 1585, 1586, 1586, 1586, 1572, 1587, 1587, 1587, 3064,
- 1587, 3065, 3066, 1587, 1588, 1588, 1588, 1585, 3067, 1586,
- 1579, 1590, 1590, 1590, 1593, 1593, 1593, 1594, 1594, 1594,
- 3068, 1594, 1588, 3071, 1594, 1595, 1595, 1595, 1590, 1595,
- 3072, 1593, 1595, 1580, 1600, 1600, 1600, 1607, 1607, 1607,
- 1608, 1608, 1608, 3073, 1608, 3074, 3075, 1608, 1611, 1611,
- 1611, 1600, 1612, 1612, 1612, 1607, 1613, 1613, 1613, 1614,
-
- 1614, 1614, 1615, 1615, 1615, 1611, 1617, 1617, 1617, 1612,
- 1588, 3076, 3077, 1613, 3078, 3080, 1614, 1620, 1620, 1620,
- 1615, 1620, 3082, 1617, 1620, 3084, 3085, 1623, 1623, 1623,
- 1625, 1625, 1625, 1627, 1627, 1627, 1630, 1630, 1630, 1634,
- 1634, 1634, 1607, 1613, 1623, 1635, 1635, 1635, 1625, 3086,
- 3096, 1627, 3097, 3098, 1630, 3094, 1634, 1615, 3095, 1643,
- 1643, 1643, 1612, 1635, 1636, 1636, 1636, 3094, 1636, 1614,
- 3095, 1636, 1639, 1639, 1639, 3099, 1639, 1643, 3100, 1639,
- 1645, 1645, 1645, 3101, 1645, 1634, 3105, 1645, 1650, 1650,
- 1650, 3106, 1650, 1630, 1625, 1650, 1654, 1654, 1654, 1627,
-
- 3107, 3108, 1635, 1656, 1656, 1656, 1657, 1657, 1657, 3109,
- 1657, 3110, 3111, 1657, 1654, 1660, 1660, 1660, 3112, 1660,
- 3115, 1656, 1660, 3116, 3117, 1643, 1663, 1663, 1663, 1664,
- 1664, 1664, 3118, 1664, 3119, 3120, 1664, 3121, 1669, 1669,
- 1669, 3122, 1669, 3123, 1663, 1669, 1672, 1672, 1672, 1674,
- 1674, 1674, 1675, 1675, 1675, 3124, 1675, 1654, 3113, 1675,
- 1656, 1679, 1679, 1679, 1672, 3125, 1674, 1681, 1681, 1681,
- 1682, 1682, 1682, 1663, 1683, 1683, 1683, 3126, 3127, 1679,
- 1684, 1684, 1684, 3113, 1681, 1685, 1685, 1685, 1682, 1688,
- 1688, 1688, 1683, 1672, 1695, 1695, 1695, 1684, 1726, 1726,
-
- 1726, 3128, 1726, 1685, 3129, 1726, 3130, 1688, 3131, 3132,
- 1679, 3133, 1695, 1729, 1729, 1729, 1730, 1730, 1730, 3134,
- 1730, 3140, 3141, 1730, 3142, 3137, 1683, 1735, 1735, 1735,
- 3143, 1729, 1737, 1737, 1737, 3144, 1737, 1682, 3145, 1737,
- 1688, 1745, 1745, 1745, 3137, 1735, 1695, 1685, 1741, 1741,
- 1741, 3146, 1741, 3147, 3148, 1741, 3149, 1688, 3150, 1745,
- 1747, 1747, 1747, 3151, 1747, 3152, 3153, 1747, 1750, 1750,
- 1750, 3154, 1751, 1751, 1751, 3155, 1751, 3156, 1735, 1751,
- 1729, 1752, 1752, 1752, 3157, 1750, 1761, 1761, 1761, 1765,
- 1765, 1765, 1766, 1766, 1766, 1768, 1768, 1768, 3158, 1752,
-
- 3159, 3160, 1745, 1769, 1769, 1769, 3161, 1769, 3162, 3163,
- 1769, 3164, 1768, 1770, 1770, 1770, 3165, 1770, 3158, 3166,
- 1770, 1773, 1773, 1773, 1775, 1775, 1775, 1776, 1776, 1776,
- 3167, 3168, 1752, 1777, 1777, 1777, 3169, 1777, 3170, 1773,
- 1777, 1775, 1781, 1781, 1781, 1776, 3171, 1782, 1782, 1782,
- 1761, 1782, 3172, 1765, 1782, 3173, 1766, 1786, 1786, 1786,
- 1781, 1785, 1785, 1785, 3174, 1789, 1789, 1789, 1773, 1789,
- 3175, 3176, 1789, 3180, 1776, 1786, 3181, 3182, 1785, 1792,
- 1792, 1792, 1793, 1793, 1793, 3183, 1793, 3184, 3185, 1793,
- 1794, 1794, 1794, 1795, 1795, 1795, 1792, 1796, 1796, 1796,
-
- 3177, 1796, 3187, 3188, 1796, 3190, 3177, 1794, 1781, 3191,
- 1795, 1798, 1798, 1798, 3193, 1801, 1801, 1801, 3194, 1801,
- 3197, 1786, 1801, 1804, 1804, 1804, 1806, 1806, 1806, 1798,
- 1806, 3196, 3198, 1806, 1809, 1809, 1809, 1811, 1811, 1811,
- 3199, 1804, 1812, 1812, 1812, 3196, 1812, 3200, 3202, 1812,
- 3204, 3206, 1809, 3208, 1811, 1813, 1813, 1813, 1815, 1815,
- 1815, 3210, 1815, 3211, 3212, 1815, 1820, 1820, 1820, 1821,
- 1821, 1821, 1813, 1821, 3213, 3214, 1821, 1822, 1822, 1822,
- 1809, 3215, 3216, 1820, 1827, 1827, 1827, 1828, 1828, 1828,
- 1829, 1829, 1829, 3217, 1822, 1830, 1830, 1830, 3219, 1830,
-
- 3221, 1827, 1830, 3223, 3224, 1828, 3225, 1829, 1831, 1831,
- 1831, 1832, 1832, 1832, 1833, 1833, 1833, 1834, 1834, 1834,
- 1836, 1836, 1836, 3226, 3239, 1831, 3259, 1512, 1832, 1510,
- 3235, 1833, 1837, 1837, 1837, 1834, 1837, 1836, 3255, 1837,
- 1838, 1838, 1838, 1840, 1840, 1840, 3241, 1841, 1841, 1841,
- 3241, 1841, 3242, 1828, 1841, 3227, 3242, 1838, 3259, 3243,
- 1840, 1843, 1843, 1843, 1845, 1845, 1845, 3243, 3239, 1832,
- 1848, 1848, 1848, 1852, 1852, 1852, 3228, 1834, 3235, 1843,
- 1509, 1508, 1845, 3247, 3255, 1853, 1853, 1853, 1848, 1853,
- 1852, 3227, 1853, 1855, 1855, 1855, 1857, 1857, 1857, 1859,
-
- 1859, 1859, 1860, 1860, 1860, 1861, 1861, 1861, 1862, 1862,
- 1862, 1855, 3228, 3244, 1857, 1845, 1859, 3236, 1848, 1860,
- 3237, 3244, 1861, 1865, 1865, 1865, 1862, 1864, 1864, 1864,
- 3247, 1866, 1866, 1866, 1867, 1867, 1867, 1868, 1868, 1868,
- 3260, 1865, 1870, 1870, 1870, 1864, 1870, 1857, 1866, 1870,
- 3238, 1867, 1876, 1876, 1876, 1868, 3240, 1878, 1878, 1878,
- 1879, 1879, 1879, 3245, 1879, 3236, 1507, 1879, 3237, 1861,
- 1876, 3245, 3260, 1864, 1878, 1862, 1880, 1880, 1880, 1881,
- 1881, 1881, 1882, 1882, 1882, 1883, 1883, 1883, 1865, 1883,
- 1506, 1505, 1883, 3246, 1880, 3249, 3250, 1881, 3238, 1882,
-
- 3240, 3246, 1868, 1876, 1884, 1884, 1884, 1890, 1890, 1890,
- 1891, 1891, 1891, 1906, 1906, 1906, 1907, 1907, 1907, 1908,
- 1908, 1908, 1884, 3251, 1890, 1910, 1910, 1910, 1891, 1912,
- 1912, 1912, 3249, 3250, 1881, 1880, 1913, 1913, 1913, 1918,
- 1918, 1918, 1920, 1920, 1920, 1923, 1923, 1923, 1925, 1925,
- 1925, 1927, 1927, 1927, 3248, 1928, 1928, 1928, 3252, 3253,
- 1920, 3299, 3256, 1923, 3251, 1925, 1937, 1937, 1937, 1927,
- 1937, 1891, 1928, 1937, 3254, 1940, 1940, 1940, 1941, 1941,
- 1941, 1946, 1946, 1946, 1947, 1947, 1947, 1951, 1951, 1951,
- 3257, 3263, 1920, 1940, 3253, 1941, 1952, 1952, 1952, 3252,
-
- 1952, 3248, 3299, 1952, 1951, 1955, 1955, 1955, 3256, 3254,
- 1927, 1956, 1956, 1956, 1957, 1957, 1957, 3258, 1958, 1958,
- 1958, 1940, 1958, 1955, 3307, 1958, 3263, 3257, 1956, 1504,
- 1503, 1957, 3261, 1951, 1959, 1959, 1959, 1961, 1961, 1961,
- 3262, 3261, 1962, 1962, 1962, 3264, 1963, 1963, 1963, 3262,
- 1963, 3267, 1959, 1963, 3258, 1961, 3307, 1956, 1955, 1962,
- 1964, 1964, 1964, 1967, 1967, 1967, 3265, 1967, 3268, 3277,
- 1967, 1970, 1970, 1970, 1502, 1971, 1971, 1971, 1964, 1971,
- 3264, 3269, 1971, 1976, 1976, 1976, 3275, 1959, 1970, 1972,
- 1972, 1972, 3266, 1972, 3267, 3275, 1972, 1978, 1978, 1978,
-
- 3265, 1976, 1980, 1980, 1980, 1500, 3277, 1964, 1982, 1982,
- 1982, 3268, 1982, 3273, 3274, 1982, 1985, 1985, 1985, 3270,
- 1980, 1986, 1986, 1986, 3318, 1986, 3266, 3269, 1986, 3289,
- 1990, 1990, 1990, 1985, 1990, 3318, 3279, 1990, 1993, 1993,
- 1993, 1994, 1994, 1994, 3271, 1994, 3273, 3274, 1994, 1995,
- 1995, 1995, 1999, 1999, 1999, 1993, 3272, 2000, 2000, 2000,
- 1980, 2000, 3281, 3289, 2000, 3270, 1995, 3276, 3278, 1999,
- 2001, 2001, 2001, 2002, 2002, 2002, 3276, 2002, 3279, 3271,
- 2002, 2005, 2005, 2005, 1499, 2006, 2006, 2006, 2001, 2006,
- 3282, 3272, 2006, 2007, 2007, 2007, 3283, 1497, 2005, 2008,
-
- 2008, 2008, 2009, 2009, 2009, 3278, 2009, 3284, 3281, 2009,
- 2007, 2010, 2010, 2010, 1496, 3287, 2008, 1494, 2012, 2012,
- 2012, 2001, 2012, 3280, 3287, 2012, 2015, 2015, 2015, 2010,
- 2016, 2016, 2016, 3283, 2016, 3300, 3282, 2016, 2018, 2018,
- 2018, 1491, 2018, 2015, 3284, 2018, 2022, 2022, 2022, 2025,
- 2025, 2025, 2027, 2027, 2027, 2028, 2028, 2028, 2030, 2030,
- 2030, 3285, 2010, 3286, 2022, 3280, 3290, 2025, 3291, 2027,
- 2032, 2032, 2032, 2028, 2032, 2030, 3300, 2032, 2036, 2036,
- 2036, 2039, 2039, 2039, 2041, 2041, 2041, 2042, 2042, 2042,
- 3285, 2042, 3286, 3288, 2042, 3293, 2036, 3292, 1490, 2039,
-
- 3290, 2041, 3288, 3293, 2030, 2043, 2043, 2043, 2044, 2044,
- 2044, 1489, 2044, 2025, 3291, 2044, 2028, 2046, 2046, 2046,
- 3301, 3308, 2043, 2048, 2048, 2048, 2049, 2049, 2049, 2050,
- 2050, 2050, 2051, 2051, 2051, 2046, 2051, 3294, 3297, 2051,
- 3295, 2048, 3302, 3292, 2049, 3294, 2050, 2052, 2052, 2052,
- 2053, 2053, 2053, 3308, 2053, 3301, 3298, 2053, 2054, 2054,
- 2054, 2059, 2059, 2059, 2052, 3296, 2061, 2061, 2061, 1488,
- 2061, 3313, 2048, 2061, 3305, 3297, 2054, 3302, 3303, 2059,
- 2064, 2064, 2064, 2046, 2065, 2065, 2065, 3295, 2066, 2066,
- 2066, 2049, 2066, 3298, 1487, 2066, 1486, 1485, 2064, 2069,
-
- 2069, 2069, 2065, 2075, 2075, 2075, 2076, 2076, 2076, 3309,
- 2076, 3305, 3296, 2076, 2077, 2077, 2077, 2069, 3309, 3313,
- 2075, 3310, 3317, 2054, 3303, 1483, 2059, 2078, 2078, 2078,
- 3310, 2064, 2077, 2083, 2083, 2083, 3317, 2065, 2084, 2084,
- 2084, 2085, 2085, 2085, 2087, 2087, 2087, 2091, 2091, 2091,
- 2092, 2092, 2092, 2093, 2093, 2093, 2094, 2094, 2094, 2096,
- 2096, 2096, 2097, 2097, 2097, 2098, 2098, 2098, 2099, 2099,
- 2099, 2100, 2100, 2100, 2101, 2101, 2101, 3304, 2077, 2103,
- 2103, 2103, 2106, 2106, 2106, 1482, 2109, 2109, 2109, 2110,
- 2110, 2110, 3306, 2110, 1481, 1480, 2110, 2103, 1471, 1456,
-
- 2106, 1455, 2094, 2109, 2112, 2112, 2112, 2113, 2113, 2113,
- 2114, 2114, 2114, 1450, 2114, 1449, 1448, 2114, 2125, 2125,
- 2125, 1446, 2112, 3304, 2113, 2126, 2126, 2126, 3314, 3306,
- 2103, 2127, 2127, 2127, 1439, 2127, 2125, 1438, 2127, 2128,
- 2128, 2128, 2126, 2133, 2133, 2133, 2134, 2134, 2134, 2135,
- 2135, 2135, 2136, 2136, 2136, 3311, 2136, 1420, 1415, 2136,
- 2138, 2138, 2138, 2139, 2139, 2139, 2135, 2125, 2140, 2140,
- 2140, 3312, 2140, 3315, 3316, 2140, 3314, 1412, 2138, 1411,
- 2139, 2142, 2142, 2142, 1408, 2142, 1403, 3311, 2142, 2145,
- 2145, 2145, 2134, 1394, 2147, 2147, 2147, 2149, 2149, 2149,
-
- 1393, 2149, 1392, 3312, 2149, 3315, 3316, 2145, 2152, 2152,
- 2152, 2138, 2147, 2155, 2155, 2155, 1388, 2155, 1383, 1379,
- 2155, 2162, 2162, 2162, 1371, 1366, 2152, 2164, 2164, 2164,
- 1365, 2164, 1359, 1358, 2164, 2173, 2173, 2173, 1357, 2162,
- 2145, 2170, 2170, 2170, 1356, 2170, 1351, 1350, 2170, 2174,
- 2174, 2174, 2173, 2174, 1349, 1348, 2174, 1335, 2178, 2178,
- 2178, 2152, 2178, 1334, 1333, 2178, 2181, 2181, 2181, 1332,
- 2182, 2182, 2182, 1331, 2182, 1330, 2162, 2182, 2185, 2185,
- 2185, 2186, 2186, 2186, 2181, 2186, 1329, 1328, 2186, 2187,
- 2187, 2187, 1327, 2187, 1317, 2185, 2187, 2190, 2190, 2190,
-
- 2192, 2192, 2192, 1316, 2192, 1315, 1314, 2192, 2198, 2198,
- 2198, 2200, 2200, 2200, 1297, 2190, 2201, 2201, 2201, 1296,
- 2201, 1291, 1290, 2201, 1289, 1284, 2198, 1283, 2200, 1266,
- 2181, 2202, 2202, 2202, 2204, 2204, 2204, 2205, 2205, 2205,
- 1262, 2205, 1256, 1252, 2205, 1251, 2212, 2212, 2212, 2202,
- 1250, 2204, 2215, 2215, 2215, 1249, 2215, 1248, 1247, 2215,
- 2222, 2222, 2222, 2190, 2212, 2218, 2218, 2218, 1246, 2218,
- 1244, 1243, 2218, 1241, 2224, 2224, 2224, 1240, 2222, 2225,
- 2225, 2225, 2226, 2226, 2226, 1239, 2226, 1234, 1226, 2226,
- 1224, 2202, 2224, 1219, 2229, 2229, 2229, 2225, 2229, 1217,
-
- 1208, 2229, 2232, 2232, 2232, 1203, 2233, 2233, 2233, 1192,
- 1190, 2222, 2234, 2234, 2234, 2225, 2235, 2235, 2235, 1189,
- 2232, 1188, 2232, 2233, 2236, 2236, 2236, 1187, 1185, 2234,
- 2237, 2237, 2237, 2235, 2239, 2239, 2239, 2240, 2240, 2240,
- 2224, 2236, 2241, 2241, 2241, 2244, 2244, 2244, 2237, 2245,
- 2245, 2245, 2239, 2245, 1184, 2240, 2245, 2248, 2248, 2248,
- 2241, 1183, 1182, 2234, 2249, 2249, 2249, 2250, 2250, 2250,
- 2251, 2251, 2251, 1181, 1180, 2248, 2254, 2254, 2254, 1178,
- 2235, 1177, 1176, 2236, 2255, 2255, 2255, 2257, 2257, 2257,
- 2258, 2258, 2258, 1175, 2239, 2237, 2259, 2259, 2259, 2260,
-
- 2260, 2260, 2261, 2261, 2261, 2262, 2262, 2262, 2265, 2265,
- 2265, 2266, 2266, 2266, 1174, 1173, 2248, 2267, 2267, 2267,
- 2268, 2268, 2268, 2270, 2270, 2270, 2273, 2273, 2273, 2274,
- 2274, 2274, 1172, 2274, 1170, 1169, 2274, 2277, 2277, 2277,
- 1168, 2270, 1167, 2273, 2278, 2278, 2278, 1166, 2280, 2280,
- 2280, 1165, 2280, 1164, 2277, 2280, 2293, 2293, 2293, 2294,
- 2294, 2294, 2278, 2294, 2296, 2296, 2294, 2296, 2297, 2297,
- 2297, 2298, 2298, 2298, 2293, 2296, 2302, 2302, 2302, 2304,
- 2304, 2304, 2296, 2304, 1158, 1157, 2304, 2308, 2308, 2308,
- 2309, 2309, 2309, 1156, 2309, 1153, 1152, 2309, 2313, 2313,
-
- 2313, 1151, 1149, 2277, 1145, 2308, 2314, 2314, 2314, 2315,
- 2315, 2315, 2323, 2323, 2323, 1142, 2313, 2293, 2324, 2324,
- 2324, 1133, 1132, 2314, 2329, 2329, 2329, 2315, 2329, 1129,
- 1128, 2329, 1127, 2308, 1126, 1125, 2324, 2332, 2332, 2332,
- 2335, 2335, 2335, 2336, 2336, 2336, 1111, 2336, 1104, 1096,
- 2336, 2339, 2339, 2339, 2332, 2344, 2344, 2344, 2335, 1095,
- 2315, 1094, 2346, 2346, 2346, 2350, 2350, 2350, 1091, 2339,
- 2347, 2347, 2347, 2344, 2347, 1088, 1085, 2347, 2324, 2346,
- 2351, 2351, 2351, 2350, 2352, 2352, 2352, 1080, 2352, 1077,
- 1076, 2352, 2355, 2355, 2355, 1072, 1070, 2351, 2356, 2356,
-
- 2356, 2361, 2361, 2361, 2363, 2363, 2363, 1056, 1055, 2355,
- 2365, 2365, 2365, 1054, 1053, 2356, 2350, 1052, 2361, 2366,
- 2366, 2366, 2367, 2367, 2367, 1051, 2351, 1050, 2365, 1049,
- 2368, 2368, 2368, 2369, 2369, 2369, 2366, 2370, 2370, 2370,
- 2367, 1048, 2371, 2371, 2371, 1044, 2371, 2355, 2368, 2371,
- 1040, 2369, 2361, 1033, 2370, 2372, 2372, 2372, 1030, 2356,
- 2373, 2373, 2373, 2374, 2374, 2374, 2375, 2375, 2375, 1029,
- 2369, 1028, 2372, 2376, 2376, 2376, 1025, 2373, 1024, 1023,
- 2374, 1020, 2367, 1019, 2375, 2377, 2377, 2377, 2378, 2378,
- 2378, 2368, 2380, 2380, 2380, 2383, 2383, 2383, 2384, 2384,
-
- 2384, 1018, 1015, 2377, 1014, 1011, 2378, 2385, 2385, 2385,
- 2380, 2373, 1010, 1007, 2374, 1004, 2384, 2386, 2386, 2386,
- 2389, 2389, 2389, 2390, 2390, 2390, 2391, 2391, 2391, 2392,
- 2392, 2392, 2396, 2396, 2396, 2399, 2399, 2399, 2400, 2400,
- 2400, 1001, 2400, 1000, 997, 2400, 2412, 2412, 2412, 996,
- 2396, 2377, 2399, 995, 2380, 2423, 2423, 2423, 2426, 2426,
- 2426, 2429, 2429, 2429, 2412, 2431, 2431, 2431, 2433, 2433,
- 2433, 2434, 2434, 2434, 994, 2434, 993, 991, 2434, 2429,
- 2435, 2435, 2435, 2431, 990, 2433, 2442, 2442, 2442, 2443,
- 2443, 2443, 2444, 2444, 2444, 2450, 2450, 2450, 2435, 989,
-
- 2451, 2451, 2451, 2442, 2451, 988, 2412, 2451, 987, 986,
- 2444, 985, 2450, 2453, 2453, 2453, 2454, 2454, 2454, 2456,
- 2456, 2456, 2460, 2460, 2460, 984, 980, 2429, 975, 974,
- 2453, 2462, 2462, 2462, 2454, 973, 970, 2456, 969, 2460,
- 2463, 2463, 2463, 968, 2463, 966, 962, 2463, 2462, 2444,
- 2464, 2464, 2464, 2465, 2465, 2465, 2466, 2466, 2466, 958,
- 2466, 957, 954, 2466, 2467, 2467, 2467, 951, 2464, 950,
- 2465, 2468, 2468, 2468, 2469, 2469, 2469, 2474, 2474, 2474,
- 949, 2467, 2476, 2476, 2476, 2478, 2478, 2478, 2468, 948,
- 947, 2469, 946, 945, 2474, 2480, 2480, 2480, 2481, 2481,
-
- 2481, 943, 2481, 2478, 942, 2481, 2482, 2482, 2482, 2483,
- 2483, 2483, 2480, 2484, 2484, 2484, 2467, 941, 2485, 2485,
- 2485, 940, 2485, 939, 2482, 2485, 938, 2483, 937, 2468,
- 936, 2484, 2469, 2488, 2488, 2488, 2489, 2489, 2489, 935,
- 2489, 934, 933, 2489, 2490, 2490, 2490, 2491, 2491, 2491,
- 2488, 2492, 2492, 2492, 2494, 2494, 2494, 2495, 2495, 2495,
- 932, 2490, 931, 930, 2491, 2499, 2499, 2499, 929, 2492,
- 2503, 2503, 2503, 928, 927, 2495, 2483, 2484, 2507, 2507,
- 2507, 926, 925, 2499, 2508, 2508, 2508, 924, 2508, 923,
- 919, 2508, 2522, 2522, 2522, 2507, 2537, 2537, 2537, 2540,
-
- 2540, 2540, 2542, 2542, 2542, 918, 2542, 916, 915, 2542,
- 2522, 2545, 2545, 2545, 2548, 2548, 2548, 2540, 2551, 2551,
- 2551, 2552, 2552, 2552, 914, 2552, 913, 912, 2552, 2545,
- 908, 2548, 2553, 2553, 2553, 2551, 2557, 2557, 2557, 2559,
- 2559, 2559, 906, 2559, 905, 904, 2559, 2563, 2563, 2563,
- 2553, 903, 2522, 2557, 2564, 2564, 2564, 899, 2564, 895,
- 894, 2564, 891, 890, 2563, 2566, 2566, 2566, 889, 888,
- 2540, 2567, 2567, 2567, 2568, 2568, 2568, 887, 2568, 886,
- 885, 2568, 2566, 2569, 2569, 2569, 882, 881, 2567, 2570,
- 2570, 2570, 880, 2570, 879, 876, 2570, 2573, 2573, 2573,
-
- 2569, 2575, 2575, 2575, 875, 2575, 874, 871, 2575, 2578,
- 2578, 2578, 2579, 2579, 2579, 2573, 2580, 2580, 2580, 2583,
- 2583, 2583, 869, 2584, 2584, 2584, 2578, 2584, 866, 2579,
- 2584, 865, 864, 2580, 863, 862, 2583, 2585, 2585, 2585,
- 2586, 2586, 2586, 2587, 2587, 2587, 859, 2587, 858, 857,
- 2587, 2590, 2590, 2590, 2585, 856, 855, 2586, 2592, 2592,
- 2592, 852, 851, 2579, 2578, 2593, 2593, 2593, 850, 2590,
- 849, 2580, 847, 2594, 2594, 2594, 2592, 2594, 844, 843,
- 2594, 841, 838, 2593, 2597, 2597, 2597, 2598, 2598, 2598,
- 836, 2598, 833, 832, 2598, 2599, 2599, 2599, 2600, 2600,
-
- 2600, 2597, 2600, 831, 830, 2600, 828, 2601, 2601, 2601,
- 827, 826, 2599, 2607, 2607, 2607, 2611, 2611, 2611, 2630,
- 2630, 2630, 823, 822, 2592, 2601, 2593, 2612, 2612, 2612,
- 821, 2612, 820, 2611, 2612, 819, 818, 2630, 2644, 2644,
- 2644, 2646, 2646, 2646, 2647, 2647, 2647, 2648, 2648, 2648,
- 2649, 2649, 2649, 813, 2650, 2650, 2650, 812, 2646, 2651,
- 2651, 2651, 2647, 2651, 2648, 811, 2651, 2649, 810, 809,
- 2630, 2650, 2652, 2652, 2652, 808, 2652, 807, 806, 2652,
- 2655, 2655, 2655, 2659, 2659, 2659, 2660, 2660, 2660, 805,
- 2661, 2661, 2661, 804, 2661, 803, 2649, 2661, 2655, 801,
-
- 2659, 799, 798, 2660, 795, 792, 2647, 2662, 2662, 2662,
- 2664, 2664, 2664, 789, 2664, 788, 784, 2664, 2668, 2668,
- 2668, 2669, 2669, 2669, 2662, 2669, 783, 782, 2669, 2670,
- 2670, 2670, 781, 2670, 778, 2668, 2670, 2673, 2673, 2673,
- 2674, 2674, 2674, 775, 2674, 774, 773, 2674, 2675, 2675,
- 2675, 2676, 2676, 2676, 2673, 2677, 2677, 2677, 770, 2678,
- 2678, 2678, 769, 2678, 768, 2675, 2678, 765, 2676, 2681,
- 2681, 2681, 2677, 2682, 2682, 2682, 764, 2682, 762, 759,
- 2682, 2683, 2683, 2683, 758, 757, 2681, 2684, 2684, 2684,
- 755, 2684, 744, 742, 2684, 2691, 2691, 2691, 2683, 2692,
-
- 2692, 2692, 739, 738, 2677, 737, 2675, 2693, 2693, 2693,
- 735, 2693, 734, 2691, 2693, 733, 729, 2692, 2696, 2696,
- 2696, 728, 2696, 727, 726, 2696, 2701, 2701, 2701, 2703,
- 2703, 2703, 2704, 2704, 2704, 2707, 2707, 2707, 723, 2707,
- 722, 721, 2707, 2701, 2701, 720, 2691, 2718, 2718, 2718,
- 2727, 2727, 2727, 2741, 2741, 2741, 2742, 2742, 2742, 2743,
- 2743, 2743, 719, 718, 2718, 717, 2692, 715, 2727, 712,
- 2744, 2744, 2744, 711, 2744, 709, 2743, 2744, 2745, 2745,
- 2745, 2746, 2746, 2746, 2747, 2747, 2747, 707, 2747, 704,
- 703, 2747, 2748, 2748, 2748, 697, 2745, 695, 2746, 2727,
-
- 2749, 2749, 2749, 693, 2749, 690, 689, 2749, 685, 2748,
- 2751, 2751, 2751, 684, 2751, 683, 682, 2751, 2756, 2756,
- 2756, 2757, 2757, 2757, 679, 2757, 678, 677, 2757, 2745,
- 2758, 2758, 2758, 676, 2758, 2756, 673, 2758, 2761, 2761,
- 2761, 2762, 2762, 2762, 672, 2762, 671, 670, 2762, 2765,
- 2765, 2765, 669, 2765, 663, 2761, 2765, 2768, 2768, 2768,
- 662, 2768, 660, 654, 2768, 2771, 2771, 2771, 2772, 2772,
- 2772, 2773, 2773, 2773, 653, 2773, 649, 642, 2773, 2774,
- 2774, 2774, 2771, 638, 632, 2772, 2775, 2775, 2775, 628,
- 2775, 620, 619, 2775, 618, 617, 2774, 2778, 2778, 2778,
-
- 616, 2778, 612, 605, 2778, 2787, 2787, 2787, 2788, 2788,
- 2788, 2794, 2794, 2794, 604, 603, 2771, 2795, 2795, 2795,
- 2796, 2796, 2796, 2787, 2796, 599, 2788, 2796, 2794, 2794,
- 2797, 2797, 2797, 592, 2795, 2795, 591, 587, 2796, 2798,
- 2798, 2798, 2799, 2799, 2799, 2800, 2800, 2800, 581, 580,
- 2774, 2809, 2809, 2809, 2810, 2810, 2810, 576, 2810, 568,
- 567, 2810, 2819, 2819, 2819, 2832, 2832, 2832, 2809, 2833,
- 2833, 2833, 563, 554, 2788, 2834, 2834, 2834, 550, 2834,
- 2819, 542, 2834, 2837, 2837, 2837, 2838, 2838, 2838, 541,
- 2838, 540, 536, 2838, 530, 2841, 2841, 2841, 529, 2841,
-
- 528, 2837, 2841, 2847, 2847, 2847, 524, 2847, 518, 517,
- 2847, 2850, 2850, 2850, 513, 2850, 507, 506, 2850, 2853,
- 2853, 2853, 2855, 2855, 2855, 2856, 2856, 2856, 2819, 2856,
- 505, 504, 2856, 2859, 2859, 2859, 2853, 503, 502, 2855,
- 2874, 2874, 2874, 2876, 2876, 2876, 2882, 2882, 2882, 501,
- 2859, 497, 2883, 2883, 2883, 491, 2883, 490, 2874, 2883,
- 488, 2876, 487, 2882, 2882, 2884, 2884, 2884, 486, 2884,
- 2883, 482, 2884, 2887, 2887, 2887, 2888, 2888, 2888, 2889,
- 2889, 2889, 471, 2884, 2898, 2898, 2898, 470, 2898, 468,
- 464, 2898, 458, 457, 2876, 2885, 2885, 2885, 2885, 2885,
-
- 2885, 2885, 2885, 2885, 456, 452, 2885, 2907, 2907, 2907,
- 446, 2885, 2885, 2885, 2885, 2885, 2916, 2916, 2916, 2917,
- 2917, 2917, 2922, 2922, 2922, 2907, 2923, 2923, 2923, 442,
- 2923, 434, 432, 2923, 2925, 2925, 2925, 2917, 431, 2922,
- 2885, 2885, 2886, 2886, 2886, 2886, 2886, 2886, 2886, 2886,
- 2886, 2925, 430, 2886, 2927, 2927, 2927, 426, 2886, 2886,
- 2886, 2886, 2886, 2926, 2926, 2926, 420, 2926, 419, 415,
- 2926, 2927, 2928, 2928, 2928, 409, 2928, 408, 404, 2928,
- 2941, 2941, 2941, 2966, 2966, 2966, 397, 2886, 2886, 2947,
- 2947, 2947, 396, 2947, 395, 391, 2947, 384, 2941, 383,
-
- 382, 2966, 2999, 2999, 2999, 381, 377, 2947, 2950, 2950,
- 2950, 2950, 2950, 2950, 2950, 2950, 2950, 368, 362, 2950,
- 2999, 358, 357, 353, 2950, 2950, 2950, 2950, 2950, 2977,
- 2977, 2977, 347, 2977, 346, 345, 2977, 2981, 2981, 2981,
- 341, 2981, 334, 332, 2981, 2984, 2984, 2984, 331, 2984,
- 327, 324, 2984, 2950, 2950, 2951, 2951, 2951, 2951, 2951,
- 2951, 2951, 2951, 2951, 322, 321, 2951, 3011, 3011, 3011,
- 320, 2951, 2951, 2951, 2951, 2951, 3026, 3026, 3026, 3027,
- 3027, 3027, 3028, 3028, 3028, 3011, 3011, 3033, 3033, 3033,
- 3044, 3044, 3044, 3026, 316, 312, 3027, 309, 305, 3028,
-
- 2951, 2951, 302, 301, 3033, 3048, 3048, 3048, 3044, 3057,
- 3057, 3057, 3058, 3058, 3058, 293, 3058, 289, 285, 3058,
- 3059, 3059, 3059, 3048, 284, 283, 3057, 3060, 3060, 3060,
- 277, 3060, 276, 274, 3060, 271, 259, 3059, 3061, 3061,
- 3061, 3062, 3062, 3062, 0, 3062, 0, 0, 3062, 3069,
- 3069, 3069, 3079, 3079, 3079, 3061, 3048, 3070, 3070, 3070,
- 0, 3070, 0, 0, 3070, 0, 3069, 3087, 3087, 3087,
- 3079, 3087, 0, 0, 3087, 3090, 3090, 3090, 0, 3090,
- 0, 0, 3090, 3093, 3093, 3093, 0, 3093, 0, 3079,
- 3093, 3102, 3102, 3102, 0, 3102, 0, 0, 3102, 3209,
-
- 3209, 3209, 3218, 3218, 3218, 0, 3218, 0, 0, 3218,
- 3319, 3319, 3319, 3320, 3320, 3320, 0, 3209, 0, 0,
- 3218, 0, 0, 0, 0, 0, 0, 0, 3319, 0,
- 0, 3320, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323,
- 3323, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324, 3324,
- 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3325, 3326,
- 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3327, 3327,
- 3327, 3327, 3327, 3327, 3327, 3327, 3327, 3328, 3328, 3328,
- 3328, 3328, 3328, 3328, 3328, 3328, 3329, 3329, 3329, 3329,
- 3329, 3329, 3329, 3329, 3329, 3330, 3330, 3330, 3330, 3330,
-
- 3330, 3330, 3330, 3330, 3331, 3331, 3331, 3331, 3331, 3331,
- 3331, 3331, 3331, 3332, 3332, 3332, 3332, 3332, 3332, 3332,
- 3332, 3332, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333,
- 3333, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334, 3334,
- 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3336,
- 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3337, 3337,
- 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3338, 3338, 3338,
- 3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339, 3339, 3339,
- 3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340, 3340, 3340,
- 3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341, 3341, 3341,
-
- 3341, 3341, 3341, 3342, 3342, 3342, 3342, 3342, 3342, 3342,
- 3342, 3342, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343,
- 3343, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344, 3344,
- 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3346,
- 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3347, 3347,
- 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3348, 3348, 3348,
- 3348, 3348, 3348, 3348, 3348, 3348, 3349, 3349, 3349, 3349,
- 3349, 3349, 3349, 3349, 3349, 3350, 3350, 3350, 3350, 3350,
- 3350, 3350, 3350, 3350, 3351, 3351, 3351, 3351, 3351, 3351,
- 3351, 3351, 3351, 3352, 3352, 3352, 3352, 3352, 3352, 3352,
-
- 3352, 3352, 3353, 3353, 3353, 3353, 3353, 3353, 3353, 3353,
- 3353, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354, 3354,
- 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3356,
- 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3357, 3357,
- 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3358, 3358, 3358,
- 3358, 3358, 3358, 3358, 3358, 3358, 3359, 3359, 3359, 3359,
- 3359, 3359, 3359, 3359, 3359, 3360, 3360, 3360, 3360, 3360,
- 3360, 3360, 3360, 3360, 3361, 3361, 3361, 3361, 3361, 3361,
- 3361, 3361, 3361, 3362, 3362, 3362, 3362, 3362, 3362, 3362,
- 3362, 3362, 3363, 3363, 3363, 3363, 3363, 3363, 3363, 3363,
-
- 3363, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364, 3364,
- 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3366,
- 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3367, 3367,
- 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3368, 3368, 3368,
- 3368, 3368, 3368, 3368, 3368, 3368, 3369, 3369, 3369, 3369,
- 3369, 3369, 3369, 3369, 3369, 3370, 3370, 3370, 3370, 3370,
- 3370, 3370, 3370, 3370, 3371, 3371, 3371, 3371, 3371, 3371,
- 3371, 3371, 3371, 3372, 3372, 3372, 3372, 3372, 3372, 3372,
- 3372, 3372, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373,
- 3373, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374,
-
- 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3376,
- 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3377, 3377,
- 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3378, 3378, 3378,
- 3378, 3378, 3378, 3378, 3378, 3378, 3379, 3379, 3379, 3379,
- 3379, 3379, 3379, 3379, 3379, 3380, 3380, 3380, 3380, 3380,
- 3380, 3380, 3380, 3380, 3381, 3381, 3381, 3381, 3381, 3381,
- 3381, 3381, 3381, 3382, 3382, 3382, 3382, 3382, 3382, 3382,
- 3382, 3382, 3383, 3383, 3383, 3383, 3383, 3383, 3383, 3383,
- 3383, 3384, 3384, 3384, 0, 0, 0, 3384, 3385, 3385,
- 3385, 0, 0, 0, 3385, 3386, 3386, 3386, 0, 0,
-
- 0, 3386, 3387, 3387, 3387, 0, 0, 0, 3387, 3388,
- 3388, 3388, 0, 0, 0, 3388, 3389, 3389, 3389, 0,
- 0, 0, 3389, 3390, 3390, 3390, 0, 0, 0, 3390,
- 3391, 3391, 3391, 0, 0, 0, 3391, 3392, 3392, 3392,
- 0, 0, 0, 3392, 3393, 3393, 3393, 0, 0, 0,
- 3393, 3394, 3394, 3394, 0, 0, 0, 3394, 3395, 3395,
- 3395, 0, 0, 0, 3395, 3396, 3396, 3396, 0, 0,
- 0, 3396, 3397, 3397, 3397, 0, 0, 0, 3397, 3398,
- 3398, 3398, 0, 0, 0, 3398, 3399, 3399, 3399, 0,
- 0, 0, 3399, 3400, 3400, 3400, 0, 0, 0, 3400,
-
- 3401, 3401, 3401, 0, 0, 0, 3401, 3402, 3402, 3402,
- 0, 0, 0, 3402, 3403, 3403, 3403, 0, 0, 0,
- 3403, 3404, 3404, 3404, 0, 0, 0, 3404, 3405, 3405,
- 3405, 0, 0, 0, 3405, 3406, 3406, 3406, 0, 0,
- 0, 3406, 3407, 3407, 3407, 0, 0, 0, 3407, 3408,
- 3408, 3408, 0, 0, 0, 3408, 3409, 3409, 3409, 0,
- 0, 0, 3409, 3410, 3410, 3410, 0, 0, 0, 3410,
- 3411, 3411, 3411, 0, 0, 0, 3411, 3412, 3412, 3412,
- 3412, 3412, 3412, 3412, 0, 3412, 3413, 3413, 3413, 0,
- 0, 0, 3413, 3414, 0, 0, 0, 3414, 3415, 3415,
-
- 3415, 0, 0, 0, 3415, 3416, 0, 0, 0, 3416,
- 3417, 3417, 3417, 0, 0, 0, 3417, 3418, 0, 0,
- 0, 3418, 3419, 3419, 3419, 0, 0, 0, 3419, 3420,
- 0, 0, 0, 3420, 3421, 3421, 3421, 0, 0, 0,
- 3421, 3422, 0, 0, 0, 3422, 3423, 3423, 3423, 0,
- 0, 0, 3423, 3424, 0, 0, 0, 3424, 3425, 3425,
- 3425, 0, 0, 0, 3425, 3426, 0, 0, 0, 3426,
- 3427, 3427, 3427, 0, 0, 0, 3427, 3428, 0, 0,
- 0, 3428, 3429, 3429, 3429, 0, 0, 0, 3429, 3430,
- 0, 0, 0, 3430, 3431, 3431, 3431, 0, 0, 0,
-
- 3431, 3432, 0, 0, 0, 3432, 3433, 3433, 3433, 0,
- 0, 0, 3433, 3434, 0, 0, 0, 3434, 3435, 3435,
- 3435, 0, 0, 0, 3435, 3436, 0, 0, 0, 3436,
- 3437, 3437, 3437, 0, 0, 0, 3437, 3438, 0, 0,
- 0, 3438, 3439, 3439, 3439, 0, 0, 0, 3439, 3440,
- 0, 0, 0, 3440, 3441, 3441, 3441, 0, 0, 0,
- 3441, 3442, 0, 0, 0, 3442, 3443, 3443, 3443, 0,
- 0, 0, 3443, 3444, 0, 0, 0, 3444, 3445, 3445,
- 3445, 0, 0, 0, 3445, 3446, 0, 0, 0, 3446,
- 3447, 3447, 3447, 0, 0, 0, 3447, 3448, 0, 0,
-
- 0, 3448, 3449, 3449, 3449, 0, 0, 0, 3449, 3450,
- 0, 0, 0, 3450, 3451, 3451, 3451, 0, 0, 0,
- 3451, 3452, 0, 0, 0, 3452, 3453, 3453, 3453, 0,
- 0, 0, 3453, 3454, 0, 0, 0, 3454, 3455, 3455,
- 3455, 0, 0, 0, 3455, 3456, 0, 0, 0, 3456,
- 3457, 3457, 3457, 0, 0, 0, 3457, 3458, 0, 0,
- 0, 3458, 3459, 3459, 3459, 0, 0, 0, 3459, 3460,
- 0, 0, 0, 3460, 3461, 3461, 3461, 0, 0, 0,
- 3461, 3462, 0, 0, 0, 3462, 3463, 3463, 3463, 0,
- 0, 0, 3463, 3464, 0, 0, 0, 3464, 3465, 3465,
-
- 3465, 0, 0, 0, 3465, 3466, 0, 0, 0, 3466,
- 3467, 3467, 3467, 0, 0, 0, 3467, 3468, 0, 0,
- 0, 3468, 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3469,
- 3469, 3470, 0, 0, 0, 0, 3470, 3471, 3471, 3471,
- 0, 0, 0, 3471, 3472, 3472, 3472, 3472, 0, 0,
- 3472, 3472, 3473, 3473, 3473, 0, 0, 0, 3473, 3474,
- 3474, 3474, 3474, 0, 0, 3474, 3474, 3475, 3475, 3475,
- 0, 0, 0, 3475, 3476, 3476, 3476, 3476, 0, 0,
- 3476, 3476, 3477, 3477, 3477, 0, 0, 0, 3477, 3478,
- 3478, 3478, 3478, 0, 0, 3478, 3478, 3479, 3479, 3479,
-
- 0, 0, 0, 3479, 3480, 3480, 3480, 3480, 0, 0,
- 3480, 3480, 3481, 3481, 3481, 0, 0, 0, 3481, 3482,
- 3482, 3482, 3482, 0, 0, 3482, 3482, 3483, 3483, 3483,
- 0, 0, 0, 3483, 3484, 3484, 3484, 3484, 0, 0,
- 3484, 3484, 3485, 3485, 3485, 0, 0, 0, 3485, 3486,
- 3486, 3486, 3486, 0, 0, 3486, 3486, 3487, 3487, 3487,
- 0, 0, 0, 3487, 3488, 3488, 3488, 3488, 0, 0,
- 3488, 3488, 3489, 3489, 3489, 0, 0, 0, 3489, 3490,
- 3490, 3490, 3490, 0, 0, 3490, 3490, 3491, 3491, 3491,
- 0, 0, 0, 3491, 3492, 3492, 3492, 3492, 0, 0,
-
- 3492, 3492, 3493, 3493, 3493, 0, 0, 0, 3493, 3494,
- 3494, 3494, 3494, 0, 0, 3494, 3494, 3495, 3495, 3495,
- 0, 0, 0, 3495, 3496, 3496, 3496, 3496, 0, 0,
- 3496, 3496, 3497, 3497, 3497, 0, 0, 0, 3497, 3498,
- 3498, 3498, 3498, 0, 0, 3498, 3498, 3499, 3499, 3499,
- 3499, 0, 3499, 0, 3499, 3500, 3500, 3500, 3500, 0,
- 0, 3500, 3500, 3501, 3501, 3501, 0, 0, 0, 3501,
- 3502, 3502, 3502, 3502, 0, 0, 3502, 3502, 3503, 3503,
- 3503, 0, 0, 0, 3503, 3504, 3504, 3504, 3504, 0,
- 0, 3504, 3504, 3505, 3505, 3505, 0, 0, 0, 3505,
-
- 3506, 3506, 3506, 3506, 0, 0, 3506, 3506, 3507, 3507,
- 3507, 0, 0, 0, 3507, 3508, 3508, 3508, 3508, 0,
- 0, 3508, 3508, 3509, 3509, 3509, 3509, 0, 3509, 0,
- 3509, 3510, 3510, 3510, 3510, 0, 0, 3510, 3510, 3511,
- 3511, 3511, 3511, 0, 3511, 0, 3511, 3512, 3512, 3512,
- 3512, 0, 0, 3512, 3512, 3513, 3513, 3513, 0, 0,
- 0, 3513, 3514, 3514, 3514, 3514, 0, 0, 3514, 3514,
- 3515, 3515, 3515, 3515, 0, 3515, 0, 3515, 3516, 3516,
- 3516, 3516, 0, 0, 3516, 3516, 3517, 3517, 3517, 3517,
- 0, 3517, 0, 3517, 3518, 3518, 3518, 3518, 0, 0,
-
- 3518, 3518, 3519, 3519, 3519, 0, 0, 0, 3519, 3520,
- 3520, 3520, 3520, 0, 0, 3520, 3520, 3521, 3521, 3521,
- 0, 0, 0, 3521, 3522, 3522, 3522, 3522, 0, 0,
- 3522, 3522, 3523, 3523, 3523, 3523, 0, 0, 3523, 3523,
- 3524, 3524, 3524, 0, 0, 0, 3524, 3525, 3525, 3525,
- 3525, 0, 0, 3525, 3525, 3526, 3526, 3526, 3526, 3526,
- 3526, 3526, 3526, 3526, 3527, 0, 3527, 0, 0, 3527,
- 3528, 3528, 3528, 0, 0, 0, 3528, 3529, 3529, 3529,
- 3529, 0, 0, 3529, 3529, 3530, 3530, 3530, 3530, 0,
- 3530, 0, 3530, 3531, 3531, 3531, 3531, 0, 0, 3531,
-
- 3531, 3532, 3532, 3532, 3532, 0, 3532, 0, 3532, 3533,
- 3533, 3533, 3533, 0, 0, 3533, 3533, 3534, 3534, 3534,
- 0, 0, 0, 3534, 3535, 3535, 3535, 3535, 0, 0,
- 3535, 3535, 3536, 3536, 3536, 0, 0, 0, 3536, 3537,
- 3537, 3537, 3537, 0, 0, 3537, 3537, 3538, 3538, 3538,
- 0, 0, 0, 3538, 3539, 3539, 3539, 3539, 0, 0,
- 3539, 3539, 3540, 3540, 3540, 0, 0, 0, 3540, 3541,
- 3541, 3541, 3541, 0, 0, 3541, 3541, 3542, 3542, 3542,
- 0, 0, 0, 3542, 3543, 3543, 3543, 3543, 0, 0,
- 3543, 3543, 3544, 3544, 3544, 3544, 0, 3544, 0, 3544,
-
- 3545, 3545, 3545, 3545, 0, 0, 3545, 3545, 3546, 3546,
- 3546, 3546, 0, 3546, 0, 3546, 3547, 3547, 3547, 3547,
- 0, 0, 3547, 3547, 3548, 3548, 3548, 0, 0, 0,
- 3548, 3549, 3549, 3549, 3549, 0, 0, 3549, 3549, 3550,
- 3550, 3550, 3550, 0, 3550, 0, 3550, 3551, 3551, 3551,
- 3551, 0, 0, 3551, 3551, 3552, 3552, 3552, 3552, 0,
- 3552, 0, 3552, 3553, 3553, 3553, 3553, 0, 0, 3553,
- 3553, 3554, 3554, 3554, 0, 0, 0, 3554, 3555, 3555,
- 3555, 3555, 0, 0, 3555, 3555, 3556, 3556, 3556, 0,
- 0, 0, 3556, 3557, 3557, 3557, 3557, 0, 0, 3557,
-
- 3557, 3558, 3558, 3558, 0, 0, 0, 3558, 3559, 3559,
- 3559, 3559, 0, 0, 3559, 3559, 3560, 3560, 3560, 0,
- 0, 0, 3560, 3561, 3561, 3561, 3561, 0, 0, 3561,
- 3561, 3562, 3562, 3562, 0, 0, 0, 3562, 3563, 3563,
- 3563, 3563, 0, 0, 3563, 3563, 3564, 3564, 3564, 0,
- 0, 0, 3564, 3565, 3565, 3565, 3565, 0, 0, 3565,
- 3565, 3566, 3566, 3566, 0, 0, 0, 3566, 3567, 3567,
- 3567, 3567, 0, 0, 3567, 3567, 3568, 3568, 3568, 0,
- 0, 0, 3568, 3569, 3569, 3569, 3569, 0, 0, 3569,
- 3569, 3570, 3570, 3570, 0, 0, 0, 3570, 3571, 3571,
-
- 3571, 3571, 0, 0, 3571, 3571, 3572, 3572, 3572, 3572,
- 0, 0, 3572, 3572, 3573, 3573, 3573, 0, 0, 0,
- 3573, 3574, 3574, 3574, 3574, 0, 0, 3574, 3574, 3575,
- 3575, 3575, 0, 0, 0, 3575, 3576, 3576, 3576, 3576,
- 0, 0, 3576, 3576, 3577, 3577, 3577, 0, 0, 0,
- 3577, 3578, 3578, 3578, 3578, 0, 0, 3578, 3578, 3579,
- 3579, 3579, 3579, 0, 0, 3579, 3579, 3580, 3580, 3580,
- 0, 0, 0, 3580, 3581, 3581, 3581, 3581, 0, 0,
- 3581, 3581, 3582, 3582, 3582, 3582, 3582, 3582, 3582, 3582,
- 3582, 3583, 3583, 3583, 3583, 3583, 3583, 3583, 3583, 3583,
-
- 3584, 3584, 3584, 0, 0, 0, 3584, 3585, 3585, 3585,
- 3585, 0, 0, 3585, 3585, 3586, 3586, 3586, 3586, 0,
- 0, 3586, 3586, 3587, 3587, 3587, 0, 0, 0, 3587,
- 3588, 3588, 3588, 3588, 0, 0, 3588, 3588, 3589, 3589,
- 3589, 0, 0, 0, 3589, 3590, 3590, 3590, 3590, 0,
- 0, 3590, 3590, 3591, 3591, 3591, 0, 0, 0, 3591,
- 3592, 3592, 3592, 3592, 0, 0, 3592, 3592, 3593, 3593,
- 3593, 0, 0, 0, 3593, 3594, 3594, 3594, 0, 0,
- 0, 3594, 3595, 3595, 3595, 3595, 0, 0, 3595, 3595,
- 3596, 3596, 3596, 0, 0, 0, 3596, 3597, 3597, 3597,
-
- 3597, 0, 0, 3597, 3597, 3598, 3598, 3598, 0, 0,
- 0, 3598, 3599, 3599, 3599, 3599, 0, 0, 3599, 3599,
- 3600, 3600, 3600, 0, 0, 0, 3600, 3601, 3601, 3601,
- 3601, 0, 0, 3601, 3601, 3602, 3602, 3602, 0, 0,
- 0, 3602, 3603, 3603, 3603, 3603, 0, 0, 3603, 3603,
- 3604, 3604, 3604, 3604, 0, 0, 3604, 3604, 3605, 3605,
- 3605, 3605, 0, 0, 3605, 3605, 3606, 3606, 3606, 0,
- 0, 0, 3606, 3607, 3607, 3607, 3607, 0, 0, 3607,
- 3607, 3608, 3608, 3608, 3608, 0, 3608, 0, 3608, 3609,
- 3609, 3609, 3609, 0, 0, 3609, 3609, 3610, 3610, 3610,
-
- 0, 0, 0, 3610, 3611, 3611, 3611, 3611, 0, 0,
- 3611, 3611, 3612, 3612, 3612, 0, 0, 0, 3612, 3613,
- 3613, 3613, 3613, 0, 0, 3613, 3613, 3614, 3614, 3614,
- 0, 0, 0, 3614, 3615, 3615, 3615, 3615, 0, 0,
- 3615, 3615, 3616, 3616, 3616, 0, 0, 0, 3616, 3617,
- 3617, 3617, 3617, 0, 0, 3617, 3617, 3618, 3618, 3618,
- 0, 0, 0, 3618, 3619, 3619, 3619, 3619, 0, 0,
- 3619, 3619, 3620, 3620, 3620, 0, 0, 0, 3620, 3621,
- 3621, 3621, 3621, 0, 0, 3621, 3621, 3622, 3622, 3622,
- 0, 0, 0, 3622, 3623, 3623, 3623, 3623, 0, 0,
-
- 3623, 3623, 3624, 3624, 3624, 3624, 0, 0, 3624, 3624,
- 3625, 3625, 3625, 0, 0, 0, 3625, 3626, 3626, 3626,
- 3626, 0, 0, 3626, 3626, 3627, 3627, 3627, 0, 0,
- 0, 3627, 3628, 3628, 3628, 3628, 0, 0, 3628, 3628,
- 3629, 3629, 3629, 3629, 0, 3629, 0, 3629, 3630, 3630,
- 3630, 3630, 0, 0, 3630, 3630, 3631, 3631, 3631, 3631,
- 0, 0, 3631, 3631, 3632, 3632, 3632, 3632, 0, 3632,
- 0, 3632, 3633, 3633, 3633, 3633, 0, 0, 3633, 3633,
- 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3635,
- 3635, 3635, 3635, 3635, 3635, 3635, 3635, 3635, 3636, 3636,
-
- 3636, 0, 0, 0, 3636, 3637, 3637, 3637, 3637, 0,
- 0, 3637, 3637, 3638, 3638, 3638, 3638, 0, 0, 3638,
- 3638, 3639, 3639, 3639, 0, 0, 0, 3639, 3640, 3640,
- 3640, 3640, 0, 0, 3640, 3640, 3641, 3641, 3641, 0,
- 0, 0, 3641, 3642, 3642, 3642, 3642, 0, 0, 3642,
- 3642, 3643, 3643, 3643, 0, 0, 0, 3643, 3644, 3644,
- 3644, 3644, 0, 0, 3644, 3644, 3645, 3645, 3645, 0,
- 0, 0, 3645, 3646, 3646, 3646, 0, 0, 0, 3646,
- 3647, 3647, 3647, 3647, 0, 0, 3647, 3647, 3648, 3648,
- 3648, 0, 0, 0, 3648, 3649, 3649, 3649, 3649, 0,
-
- 0, 3649, 3649, 3650, 3650, 3650, 0, 0, 0, 3650,
- 3651, 3651, 3651, 3651, 0, 0, 3651, 3651, 3652, 3652,
- 3652, 3652, 0, 3652, 0, 3652, 3653, 3653, 3653, 3653,
- 0, 0, 3653, 3653, 3654, 3654, 3654, 0, 0, 0,
- 3654, 3655, 3655, 3655, 3655, 0, 0, 3655, 3655, 3656,
- 3656, 3656, 3656, 0, 0, 3656, 3656, 3657, 3657, 3657,
- 0, 0, 0, 3657, 3658, 3658, 3658, 3658, 0, 0,
- 3658, 3658, 3659, 3659, 3659, 3659, 0, 3659, 0, 3659,
- 3660, 3660, 3660, 3660, 0, 0, 3660, 3660, 3661, 3661,
- 3661, 0, 0, 0, 3661, 3662, 3662, 3662, 3662, 0,
-
- 0, 3662, 3662, 3663, 3663, 3663, 0, 0, 0, 3663,
- 3664, 3664, 3664, 3664, 0, 0, 3664, 3664, 3665, 3665,
- 3665, 0, 0, 0, 3665, 3666, 3666, 3666, 3666, 0,
- 0, 3666, 3666, 3667, 3667, 3667, 0, 0, 0, 3667,
- 3668, 3668, 3668, 3668, 0, 0, 3668, 3668, 3669, 3669,
- 3669, 0, 0, 0, 3669, 3670, 3670, 3670, 3670, 0,
- 0, 3670, 3670, 3671, 3671, 3671, 3671, 0, 3671, 0,
- 3671, 3672, 3672, 3672, 3672, 0, 0, 3672, 3672, 3673,
- 3673, 3673, 0, 0, 0, 3673, 3674, 3674, 3674, 3674,
- 0, 0, 3674, 3674, 3675, 3675, 3675, 3675, 0, 0,
-
- 3675, 3675, 3676, 3676, 3676, 3676, 0, 3676, 0, 3676,
- 3677, 3677, 3677, 3677, 0, 0, 3677, 3677, 3678, 3678,
- 3678, 0, 0, 0, 3678, 3679, 3679, 3679, 3679, 0,
- 0, 3679, 3679, 3680, 3680, 3680, 3680, 0, 0, 3680,
- 3680, 3681, 3681, 3681, 3681, 0, 0, 3681, 3681, 3682,
- 3682, 3682, 3682, 0, 0, 3682, 3682, 3683, 3683, 3683,
- 3683, 3683, 3683, 3683, 3683, 3683, 3684, 3684, 3684, 3684,
- 3684, 3684, 3684, 3684, 3684, 3685, 3685, 3685, 3685, 0,
- 3685, 0, 3685, 3686, 3686, 3686, 3686, 0, 0, 3686,
- 3686, 3687, 3687, 3687, 3687, 0, 0, 3687, 3687, 3688,
-
- 3688, 3688, 0, 0, 0, 3688, 3689, 3689, 3689, 3689,
- 0, 0, 3689, 3689, 3690, 3690, 3690, 0, 0, 0,
- 3690, 3691, 3691, 3691, 3691, 0, 0, 3691, 3691, 3692,
- 3692, 3692, 3692, 0, 3692, 0, 3692, 3693, 3693, 3693,
- 3693, 0, 0, 3693, 3693, 3694, 3694, 3694, 3694, 0,
- 3694, 0, 3694, 3695, 3695, 3695, 3695, 0, 3695, 0,
- 3695, 3696, 3696, 3696, 3696, 0, 0, 3696, 3696, 3697,
- 3697, 3697, 3697, 0, 3697, 0, 3697, 3698, 3698, 3698,
- 3698, 0, 0, 3698, 3698, 3699, 3699, 3699, 0, 0,
- 0, 3699, 3700, 3700, 3700, 3700, 0, 0, 3700, 3700,
-
- 3701, 3701, 3701, 3701, 0, 0, 3701, 3701, 3702, 3702,
- 3702, 0, 0, 0, 3702, 3703, 3703, 3703, 3703, 0,
- 0, 3703, 3703, 3704, 3704, 3704, 0, 0, 0, 3704,
- 3705, 3705, 3705, 3705, 0, 0, 3705, 3705, 3706, 3706,
- 3706, 3706, 0, 3706, 0, 3706, 3707, 3707, 3707, 3707,
- 0, 0, 3707, 3707, 3708, 3708, 3708, 0, 0, 0,
- 3708, 3709, 3709, 3709, 0, 0, 0, 3709, 3710, 3710,
- 3710, 3710, 0, 0, 3710, 3710, 3711, 3711, 3711, 0,
- 0, 0, 3711, 3712, 3712, 3712, 3712, 0, 0, 3712,
- 3712, 3713, 3713, 3713, 0, 0, 0, 3713, 3714, 3714,
-
- 3714, 0, 0, 0, 3714, 3715, 3715, 3715, 3715, 0,
- 0, 3715, 3715, 3716, 3716, 3716, 0, 0, 0, 3716,
- 3717, 3717, 3717, 3717, 0, 0, 3717, 3717, 3718, 3718,
- 3718, 0, 0, 0, 3718, 3719, 3719, 3719, 3719, 0,
- 0, 3719, 3719, 3720, 3720, 3720, 3720, 0, 0, 3720,
- 3720, 3721, 3721, 3721, 3721, 0, 0, 3721, 3721, 3722,
- 3722, 3722, 0, 0, 0, 3722, 3723, 3723, 3723, 3723,
- 0, 0, 3723, 3723, 3724, 3724, 3724, 3724, 0, 0,
- 3724, 3724, 3725, 3725, 3725, 3725, 0, 0, 3725, 3725,
- 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3726, 3727,
-
- 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3728, 3728,
- 3728, 3728, 0, 0, 3728, 3728, 3729, 3729, 3729, 3729,
- 0, 0, 3729, 3729, 3730, 3730, 3730, 0, 0, 0,
- 3730, 3731, 3731, 3731, 0, 0, 0, 3731, 3732, 3732,
- 3732, 3732, 0, 0, 3732, 3732, 3733, 3733, 3733, 3733,
- 0, 0, 3733, 3733, 3734, 3734, 3734, 0, 0, 0,
- 3734, 3735, 3735, 3735, 3735, 0, 0, 3735, 3735, 3736,
- 3736, 3736, 0, 0, 0, 3736, 3737, 3737, 3737, 3737,
- 0, 0, 3737, 3737, 3738, 3738, 3738, 0, 0, 0,
- 3738, 3739, 3739, 3739, 3739, 0, 0, 3739, 3739, 3740,
-
- 3740, 3740, 0, 0, 0, 3740, 3741, 3741, 3741, 3741,
- 0, 0, 3741, 3741, 3742, 3742, 3742, 0, 0, 0,
- 3742, 3743, 3743, 3743, 3743, 0, 0, 3743, 3743, 3744,
- 3744, 3744, 3744, 0, 0, 3744, 3744, 3745, 3745, 3745,
- 0, 0, 0, 3745, 3746, 3746, 3746, 0, 0, 0,
- 3746, 3747, 3747, 3747, 3747, 0, 0, 3747, 3747, 3748,
- 3748, 3748, 0, 0, 0, 3748, 3749, 3749, 3749, 3749,
- 0, 0, 3749, 3749, 3750, 3750, 3750, 0, 0, 0,
- 3750, 3751, 3751, 3751, 0, 0, 0, 3751, 3752, 3752,
- 3752, 0, 0, 0, 3752, 3753, 3753, 3753, 3753, 0,
-
- 0, 3753, 3753, 3754, 3754, 3754, 0, 0, 0, 3754,
- 3755, 3755, 3755, 3755, 0, 0, 3755, 3755, 3756, 3756,
- 3756, 3756, 0, 0, 3756, 3756, 3757, 3757, 3757, 3757,
- 0, 0, 3757, 3757, 3758, 3758, 3758, 3758, 0, 3758,
- 0, 3758, 3759, 3759, 3759, 3759, 0, 0, 3759, 3759,
- 3760, 3760, 3760, 3760, 0, 0, 3760, 3760, 3761, 3761,
- 3761, 3761, 0, 0, 3761, 3761, 3762, 3762, 3762, 3762,
- 3762, 3762, 3762, 3762, 3762, 3763, 3763, 3763, 3763, 3763,
- 3763, 3763, 3763, 3763, 3764, 3764, 3764, 3764, 0, 0,
- 3764, 3764, 3765, 3765, 3765, 3765, 0, 0, 3765, 3765,
-
- 3766, 3766, 3766, 0, 0, 0, 3766, 3767, 3767, 3767,
- 3767, 0, 3767, 0, 3767, 3768, 3768, 3768, 3768, 0,
- 0, 3768, 3768, 3769, 3769, 3769, 0, 0, 0, 3769,
- 3770, 3770, 3770, 3770, 0, 0, 3770, 3770, 3771, 3771,
- 3771, 0, 0, 0, 3771, 3772, 3772, 3772, 3772, 0,
- 0, 3772, 3772, 3773, 3773, 3773, 3773, 0, 3773, 0,
- 3773, 3774, 3774, 3774, 3774, 0, 0, 3774, 3774, 3775,
- 3775, 3775, 0, 0, 0, 3775, 3776, 3776, 3776, 3776,
- 0, 0, 3776, 3776, 3777, 3777, 3777, 0, 0, 0,
- 3777, 3778, 3778, 3778, 3778, 0, 0, 3778, 3778, 3779,
-
- 3779, 3779, 3779, 0, 0, 3779, 3779, 3780, 3780, 3780,
- 0, 0, 0, 3780, 3781, 3781, 3781, 0, 0, 0,
- 3781, 3782, 3782, 3782, 3782, 0, 3782, 0, 3782, 3783,
- 3783, 3783, 3783, 0, 0, 3783, 3783, 3784, 3784, 3784,
- 3784, 0, 3784, 0, 3784, 3785, 3785, 3785, 0, 0,
- 0, 3785, 3786, 3786, 3786, 0, 0, 0, 3786, 3787,
- 3787, 3787, 3787, 0, 0, 3787, 3787, 3788, 3788, 3788,
- 3788, 0, 3788, 0, 3788, 3789, 3789, 3789, 3789, 0,
- 0, 3789, 3789, 3790, 3790, 3790, 3790, 0, 0, 3790,
- 3790, 3791, 3791, 3791, 3791, 0, 0, 3791, 3791, 3792,
-
- 3792, 3792, 3792, 0, 3792, 0, 3792, 3793, 3793, 3793,
- 3793, 0, 0, 3793, 3793, 3794, 3794, 3794, 3794, 0,
- 0, 3794, 3794, 3795, 3795, 3795, 3795, 3795, 3795, 3795,
- 3795, 3795, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796,
- 3796, 3797, 3797, 3797, 3797, 0, 0, 3797, 3797, 3798,
- 3798, 3798, 0, 0, 0, 3798, 3799, 3799, 3799, 0,
- 0, 0, 3799, 3800, 3800, 3800, 3800, 0, 0, 3800,
- 3800, 3801, 3801, 3801, 0, 0, 0, 3801, 3802, 3802,
- 3802, 3802, 0, 0, 3802, 3802, 3803, 3803, 3803, 0,
- 0, 0, 3803, 3804, 3804, 3804, 3804, 0, 0, 3804,
-
- 3804, 3805, 3805, 3805, 0, 0, 0, 3805, 3806, 3806,
- 3806, 3806, 0, 0, 3806, 3806, 3807, 3807, 3807, 0,
- 0, 0, 3807, 3808, 3808, 3808, 0, 0, 0, 3808,
- 3809, 3809, 3809, 0, 0, 0, 3809, 3810, 3810, 3810,
- 3810, 3810, 3810, 3810, 3810, 3810, 3811, 3811, 3811, 3811,
- 3811, 3811, 3811, 3811, 3811, 3812, 3812, 3812, 3812, 3812,
- 3812, 3812, 3812, 3812, 3813, 3813, 3813, 3813, 3813, 3813,
- 3813, 3813, 3813, 3814, 3814, 3814, 3814, 3814, 3814, 3814,
- 3814, 3814, 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815,
- 3815, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
-
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3322,
- 3322, 3322, 3322, 3322, 3322, 3322
+ 1124, 254, 254, 254, 254, 254, 1131, 1131, 1131, 2488,
+
+ 2489, 1127, 1127, 1127, 2491, 1129, 1129, 1129, 2492, 2493,
+ 1133, 1133, 1133, 1131, 1135, 1135, 1135, 1774, 1127, 2494,
+ 254, 254, 2496, 1129, 1132, 1132, 1132, 1133, 1806, 1806,
+ 1806, 254, 1135, 1163, 1163, 1163, 2497, 1163, 2499, 2500,
+ 1163, 1132, 2502, 2503, 254, 257, 257, 257, 257, 257,
+ 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
+ 1127, 257, 257, 257, 257, 257, 1129, 1136, 1136, 1136,
+ 2505, 1134, 1134, 1134, 1132, 1138, 1138, 1138, 1140, 1140,
+ 1140, 1141, 1141, 1141, 2506, 1136, 2512, 2513, 1134, 1132,
+ 257, 257, 1138, 1142, 1142, 1142, 1140, 2514, 2516, 1141,
+
+ 2521, 257, 2490, 2522, 1136, 1167, 1167, 1167, 2523, 1167,
+ 1142, 2490, 1167, 2524, 257, 258, 258, 258, 258, 258,
+ 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
+ 1134, 258, 258, 258, 258, 258, 1141, 1143, 1143, 1143,
+ 1144, 1144, 1144, 2525, 1145, 1145, 1145, 1146, 1146, 1146,
+ 1148, 1148, 1148, 2528, 1143, 1147, 1147, 1147, 1144, 2530,
+ 258, 258, 1145, 2538, 1146, 2539, 2541, 1148, 1149, 1149,
+ 1149, 258, 1147, 1156, 1156, 1156, 1160, 1160, 1160, 1150,
+ 1150, 1150, 2532, 2547, 258, 300, 1149, 2495, 1157, 1157,
+ 1157, 1156, 300, 2548, 1160, 2532, 2495, 1150, 1161, 1161,
+
+ 1161, 300, 300, 2549, 2550, 1147, 1157, 1162, 1162, 1162,
+ 1164, 1164, 1164, 2552, 2555, 1145, 1161, 1166, 1166, 1166,
+ 1147, 1165, 1165, 1165, 1162, 1169, 1169, 1169, 1164, 300,
+ 300, 300, 2533, 2557, 1166, 300, 300, 300, 2582, 1165,
+ 300, 300, 2583, 1169, 300, 2533, 300, 300, 300, 365,
+ 1150, 2577, 1157, 1170, 1170, 1170, 365, 1171, 1171, 1171,
+ 2578, 2586, 1161, 2587, 2579, 365, 365, 1798, 1172, 1172,
+ 1172, 1170, 1172, 1798, 1171, 1172, 2588, 1798, 1174, 1174,
+ 1174, 1798, 1165, 2593, 1175, 1175, 1175, 2594, 1190, 1190,
+ 1190, 2577, 2595, 365, 365, 365, 1174, 2578, 2596, 365,
+
+ 365, 365, 1175, 2597, 365, 365, 1190, 2579, 365, 2598,
+ 365, 365, 365, 1191, 1191, 1191, 2599, 1170, 1193, 1193,
+ 1193, 1225, 1225, 1225, 1226, 1226, 1226, 2600, 1227, 1227,
+ 1227, 1191, 1229, 1229, 1229, 2601, 1193, 2602, 1225, 1230,
+ 1230, 1230, 1226, 2603, 2605, 1175, 1227, 1231, 1231, 1231,
+ 1229, 1231, 2606, 2607, 1231, 2608, 1230, 1234, 1234, 1234,
+ 1236, 1236, 1236, 2609, 2610, 1193, 1237, 1237, 1237, 1239,
+ 1239, 1239, 2611, 2591, 1234, 1241, 1241, 1241, 1236, 1241,
+ 2612, 1229, 1241, 2591, 1237, 2613, 2591, 1239, 1244, 1244,
+ 1244, 1245, 1245, 1245, 2614, 1245, 2615, 2616, 1245, 2617,
+
+ 1246, 1246, 1246, 2618, 2620, 1244, 1247, 1247, 1247, 1250,
+ 1250, 1250, 1252, 1252, 1252, 2592, 1239, 1246, 1234, 2621,
+ 1248, 1248, 1248, 1247, 1248, 2592, 1250, 1248, 2592, 2624,
+ 1252, 1253, 1253, 1253, 1255, 1255, 1255, 1257, 1257, 1257,
+ 1259, 1259, 1259, 1260, 1260, 1260, 1262, 1262, 1262, 1253,
+ 2630, 2637, 1255, 2638, 1257, 1263, 1263, 1263, 1259, 1263,
+ 2639, 1260, 1263, 2641, 1262, 1267, 1267, 1267, 1268, 1268,
+ 1268, 1270, 1270, 1270, 1285, 1285, 1285, 2645, 1285, 2648,
+ 2649, 1285, 2650, 1267, 2651, 2652, 1268, 2653, 2666, 1270,
+ 1289, 1289, 1289, 1262, 1255, 1290, 1290, 1290, 1291, 1291,
+
+ 1291, 1293, 1293, 1293, 1296, 1296, 1296, 1289, 1296, 2667,
+ 2668, 1296, 2695, 1290, 2692, 2698, 1291, 2699, 2693, 1293,
+ 1300, 1300, 1300, 1301, 1301, 1301, 1303, 1303, 1303, 1304,
+ 1304, 1304, 1305, 1305, 1305, 1306, 1306, 1306, 1300, 2700,
+ 2703, 1301, 2704, 2692, 1303, 2706, 1304, 2707, 2709, 1305,
+ 1307, 1307, 1307, 1306, 1309, 1309, 1309, 1310, 1310, 1310,
+ 2693, 2694, 1293, 1311, 1311, 1311, 2710, 2711, 1307, 1808,
+ 1808, 1808, 1309, 2712, 1310, 1312, 1312, 1312, 2713, 1305,
+ 1311, 1313, 1313, 1313, 1315, 1315, 1315, 1303, 1318, 1318,
+ 1318, 1311, 2715, 1312, 1319, 1319, 1319, 2716, 1319, 1313,
+
+ 2717, 1319, 1315, 2694, 2718, 1318, 1325, 1325, 1325, 1326,
+ 1326, 1326, 1328, 1328, 1328, 1331, 1331, 1331, 1332, 1332,
+ 1332, 1309, 2721, 2722, 1325, 2723, 2724, 1326, 2725, 2726,
+ 1328, 2705, 1331, 1333, 1333, 1333, 1332, 1335, 1335, 1335,
+ 1336, 1336, 1336, 2708, 2705, 1337, 1337, 1337, 2727, 1337,
+ 1315, 1333, 1337, 2728, 2729, 1335, 2708, 1336, 1340, 1340,
+ 1340, 2730, 1340, 2731, 2732, 1340, 1343, 1343, 1343, 1344,
+ 1344, 1344, 1346, 1346, 1346, 2733, 2735, 1328, 1351, 1351,
+ 1351, 2748, 1351, 2749, 1343, 1351, 2754, 1344, 2758, 2759,
+ 1346, 1354, 1354, 1354, 1355, 1355, 1355, 2760, 1355, 2761,
+
+ 2762, 1355, 2763, 2771, 1335, 1358, 1358, 1358, 1354, 1359,
+ 1359, 1359, 2773, 1359, 2781, 2782, 1359, 1370, 1370, 1370,
+ 2783, 2784, 1358, 1371, 1371, 1371, 1373, 1373, 1373, 1374,
+ 1374, 1374, 2785, 1374, 2786, 1370, 1374, 1346, 1377, 1377,
+ 1377, 1371, 1377, 2796, 1373, 1377, 1380, 1380, 1380, 1381,
+ 1381, 1381, 2799, 1381, 2797, 2802, 1381, 1386, 1386, 1386,
+ 1387, 1387, 1387, 1380, 1389, 1389, 1389, 1394, 1394, 1394,
+ 2803, 1394, 2807, 2808, 1394, 1386, 2676, 2809, 1387, 1397,
+ 1397, 1397, 1389, 1398, 1398, 1398, 2676, 1398, 2810, 2797,
+ 1398, 2796, 2676, 1373, 2811, 2812, 1397, 1401, 1401, 1401,
+
+ 1402, 1402, 1402, 1404, 1404, 1404, 1406, 1406, 1406, 2813,
+ 1406, 2814, 1389, 1406, 2816, 1401, 2817, 2818, 1402, 2819,
+ 2820, 1404, 1409, 1409, 1409, 1410, 1410, 1410, 1412, 1412,
+ 1412, 1414, 1414, 1414, 2821, 1414, 2822, 2823, 1414, 2825,
+ 1409, 2826, 2827, 1410, 2828, 2790, 1412, 1418, 1418, 1418,
+ 1419, 1419, 1419, 2829, 1404, 1421, 1421, 1421, 2790, 1423,
+ 1423, 1423, 2830, 1423, 2791, 1418, 1423, 2831, 1419, 1429,
+ 1429, 1429, 2832, 1421, 1430, 1430, 1430, 2791, 1432, 1432,
+ 1432, 1433, 1433, 1433, 1434, 1434, 1434, 1429, 1434, 2833,
+ 2834, 1434, 1430, 2835, 2836, 1412, 1432, 2837, 1433, 1435,
+
+ 1435, 1435, 2847, 2851, 1421, 1436, 1436, 1436, 2852, 1436,
+ 2860, 2861, 1436, 1438, 1438, 1438, 1435, 1439, 1439, 1439,
+ 2862, 1441, 1441, 1441, 1443, 1443, 1443, 2863, 1447, 1447,
+ 1447, 1438, 1809, 1809, 1809, 1439, 2864, 2677, 1432, 1441,
+ 2865, 1443, 1444, 1444, 1444, 1447, 1444, 2677, 2866, 1444,
+ 1448, 1448, 1448, 2677, 1448, 2873, 2876, 1448, 1450, 1450,
+ 1450, 1451, 1451, 1451, 1453, 1453, 1453, 1455, 1455, 1455,
+ 2878, 1455, 2883, 2884, 1455, 2885, 1450, 2879, 2886, 1451,
+ 2878, 2887, 1453, 1458, 1458, 1458, 2888, 2879, 1441, 1459,
+ 1459, 1459, 1461, 1461, 1461, 1462, 1462, 1462, 1463, 1463,
+
+ 1463, 1458, 1463, 2891, 2892, 1463, 2893, 1459, 2894, 2881,
+ 1461, 2882, 1462, 1464, 1464, 1464, 1465, 1465, 1465, 2881,
+ 1465, 2882, 2905, 1465, 1466, 1466, 1466, 2906, 1453, 2907,
+ 1464, 1467, 1467, 1467, 2908, 1469, 1469, 1469, 1470, 1470,
+ 1470, 2909, 1466, 1471, 1471, 1471, 2910, 1471, 2911, 1467,
+ 1471, 2912, 1461, 1469, 2915, 1470, 1474, 1474, 1474, 1475,
+ 1475, 1475, 2897, 1475, 2916, 2918, 1475, 1476, 1476, 1476,
+ 1477, 1477, 1477, 1474, 1479, 1479, 1479, 1481, 1481, 1481,
+ 1485, 1485, 1485, 2919, 2920, 1476, 2922, 2924, 1477, 1486,
+ 1486, 1486, 1479, 2925, 1481, 2926, 2897, 1469, 1485, 1488,
+
+ 1488, 1488, 1491, 1491, 1491, 2929, 2930, 1486, 1492, 1492,
+ 1492, 1494, 1494, 1494, 1495, 1495, 1495, 1488, 1495, 2931,
+ 1491, 1495, 1498, 1498, 1498, 2932, 1492, 2935, 2948, 1494,
+ 1499, 1499, 1499, 1501, 1501, 1501, 1479, 1502, 1502, 1502,
+ 1498, 1502, 2949, 2950, 1502, 1506, 1506, 1506, 1499, 2958,
+ 2959, 1501, 1507, 1507, 1507, 1509, 1509, 1509, 2960, 2961,
+ 1488, 2962, 2963, 1506, 1494, 1510, 1510, 1510, 2969, 1510,
+ 1507, 2970, 1510, 1509, 1514, 1514, 1514, 1515, 1515, 1515,
+ 1517, 1517, 1517, 1519, 1519, 1519, 1526, 1526, 1526, 1557,
+ 1557, 1557, 1514, 1501, 2971, 1515, 2972, 2973, 1517, 2974,
+
+ 2975, 1519, 1519, 2976, 1526, 2977, 1557, 1558, 1558, 1558,
+ 2978, 1558, 2980, 2981, 1558, 2986, 1509, 1559, 1559, 1559,
+ 1560, 1560, 1560, 2987, 1561, 1561, 1561, 2988, 1561, 2989,
+ 1517, 1561, 1564, 1564, 1564, 1559, 2990, 1560, 1566, 1566,
+ 1566, 2999, 1566, 3000, 3001, 1566, 1569, 1569, 1569, 3002,
+ 1564, 3003, 1526, 1570, 1570, 1570, 3004, 1570, 3005, 3006,
+ 1570, 3010, 3011, 1569, 1571, 1571, 1571, 3012, 1571, 3013,
+ 3014, 1571, 1575, 1575, 1575, 1559, 1576, 1576, 1576, 2990,
+ 1576, 1564, 3015, 1576, 1578, 1578, 1578, 3017, 3018, 1575,
+ 1580, 1580, 1580, 1581, 1581, 1581, 3020, 1581, 3021, 3022,
+
+ 1581, 3024, 1578, 1582, 1582, 1582, 3028, 1580, 1583, 1583,
+ 1583, 1585, 1585, 1585, 1601, 1601, 1601, 1849, 1849, 1849,
+ 1582, 1602, 1602, 1602, 3029, 3030, 1583, 3035, 3037, 1585,
+ 3038, 1601, 3043, 3044, 1578, 1603, 1603, 1603, 1602, 1603,
+ 3045, 3046, 1603, 1604, 1604, 1604, 1608, 1608, 1608, 1609,
+ 1609, 1609, 1610, 1610, 1610, 3047, 1610, 1583, 3048, 1610,
+ 3049, 1604, 3050, 3051, 1608, 3052, 1609, 1612, 1612, 1612,
+ 1613, 1613, 1613, 1614, 1614, 1614, 3053, 1614, 3054, 3056,
+ 1614, 1616, 1616, 1616, 3057, 1612, 3058, 1613, 1619, 1619,
+ 1619, 1620, 1620, 1620, 3059, 1620, 3066, 3063, 1620, 1616,
+
+ 1621, 1621, 1621, 3060, 3069, 1619, 3070, 1604, 3063, 3073,
+ 1608, 1623, 1623, 1623, 1624, 1624, 1624, 1621, 1627, 1627,
+ 1627, 3075, 1628, 1628, 1628, 3076, 1628, 1612, 1623, 1628,
+ 3078, 3079, 1624, 3083, 3062, 1627, 1629, 1629, 1629, 1630,
+ 1630, 1630, 1616, 1631, 1631, 1631, 3084, 1631, 3062, 3060,
+ 1631, 1632, 1632, 1632, 1629, 3086, 1630, 1623, 1634, 1634,
+ 1634, 1637, 1637, 1637, 1638, 1638, 1638, 3087, 1638, 1632,
+ 3088, 1638, 1639, 1639, 1639, 1634, 1639, 3082, 1637, 1639,
+ 1624, 1644, 1644, 1644, 1653, 1653, 1653, 1654, 1654, 1654,
+ 3085, 1654, 3089, 3090, 1654, 1657, 1657, 1657, 1644, 1658,
+
+ 1658, 1658, 1653, 1659, 1659, 1659, 1660, 1660, 1660, 1661,
+ 1661, 1661, 1657, 1663, 1663, 1663, 1658, 1632, 3098, 3082,
+ 1659, 3092, 3106, 1660, 1666, 1666, 1666, 1661, 1666, 3085,
+ 1663, 1666, 3108, 3092, 1669, 1669, 1669, 1671, 1671, 1671,
+ 1673, 1673, 1673, 1676, 1676, 1676, 1680, 1680, 1680, 1653,
+ 1659, 1669, 1681, 1681, 1681, 1671, 3110, 3112, 1673, 3120,
+ 3122, 1676, 3093, 1680, 1661, 3103, 1689, 1689, 1689, 1658,
+ 1681, 1682, 1682, 1682, 3093, 1682, 1660, 3103, 1682, 1685,
+ 1685, 1685, 3126, 1685, 1689, 3128, 1685, 1691, 1691, 1691,
+ 3123, 1691, 1680, 3130, 1691, 1696, 1696, 1696, 3131, 1696,
+
+ 1676, 1671, 1696, 1700, 1700, 1700, 1673, 3104, 3132, 1681,
+ 1702, 1702, 1702, 1703, 1703, 1703, 3124, 1703, 3133, 3104,
+ 1703, 1700, 1706, 1706, 1706, 3139, 1706, 3143, 1702, 1706,
+ 3124, 3123, 1689, 1709, 1709, 1709, 1710, 1710, 1710, 3127,
+ 1710, 3125, 3125, 1710, 3140, 1715, 1715, 1715, 3150, 1715,
+ 3127, 1709, 1715, 1718, 1718, 1718, 1720, 1720, 1720, 1721,
+ 1721, 1721, 3140, 1721, 1700, 3149, 1721, 1702, 1725, 1725,
+ 1725, 1718, 3152, 1720, 1727, 1727, 1727, 1728, 1728, 1728,
+ 1709, 1729, 1729, 1729, 3149, 3158, 1725, 1730, 1730, 1730,
+ 3151, 1727, 1731, 1731, 1731, 1728, 1732, 1732, 1732, 1729,
+
+ 1718, 1733, 1733, 1733, 1730, 1736, 1736, 1736, 3160, 3151,
+ 1731, 3144, 3157, 1732, 1743, 1743, 1743, 1725, 3159, 1733,
+ 1775, 1775, 1775, 1736, 1775, 3165, 3144, 1775, 1778, 1778,
+ 1778, 3157, 1743, 1729, 1779, 1779, 1779, 3159, 1779, 3166,
+ 3168, 1779, 2364, 2364, 1728, 2364, 1778, 1784, 1784, 1784,
+ 3169, 3170, 1733, 2364, 1731, 3172, 1736, 1786, 1786, 1786,
+ 2364, 1786, 3173, 3174, 1786, 1784, 1743, 1790, 1790, 1790,
+ 3175, 1790, 3176, 1736, 1790, 1794, 1794, 1794, 1796, 1796,
+ 1796, 3178, 1796, 3179, 3181, 1796, 1799, 1799, 1799, 3188,
+ 1800, 1800, 1800, 1794, 1800, 1778, 3189, 1800, 1784, 1801,
+
+ 1801, 1801, 3190, 1799, 1810, 1810, 1810, 1814, 1814, 1814,
+ 1815, 1815, 1815, 1817, 1817, 1817, 3191, 1801, 1818, 1818,
+ 1818, 3192, 1818, 3193, 3196, 1818, 3197, 1819, 1819, 1819,
+ 1817, 1819, 3198, 3199, 1819, 3200, 1794, 1822, 1822, 1822,
+ 1825, 1825, 1825, 1826, 1826, 1826, 3201, 1827, 1827, 1827,
+ 1801, 1827, 3202, 3203, 1827, 1822, 3205, 1825, 1831, 1831,
+ 1831, 1826, 1832, 1832, 1832, 3207, 1832, 3209, 1810, 1832,
+ 3210, 1814, 3211, 3212, 1815, 3213, 1831, 1835, 1835, 1835,
+ 1836, 1836, 1836, 3223, 1822, 1839, 1839, 1839, 3224, 1839,
+ 1826, 3225, 1839, 3221, 1835, 1842, 1842, 1842, 1836, 1843,
+
+ 1843, 1843, 3226, 1843, 3227, 3221, 1843, 3222, 1844, 1844,
+ 1844, 3228, 1842, 1845, 1845, 1845, 1846, 1846, 1846, 3222,
+ 1846, 3232, 3233, 1846, 1831, 1844, 3234, 1848, 1848, 1848,
+ 1845, 1851, 1851, 1851, 3235, 1851, 3236, 3237, 1851, 1854,
+ 1854, 1854, 3238, 3239, 1836, 1848, 1856, 1856, 1856, 3240,
+ 1856, 3242, 3243, 1856, 1859, 1859, 1859, 1854, 1861, 1861,
+ 1861, 1862, 1862, 1862, 3244, 1862, 3245, 3246, 1862, 1863,
+ 1863, 1863, 1859, 3247, 3240, 1861, 1865, 1865, 1865, 3248,
+ 1865, 3249, 3250, 1865, 3251, 3252, 1863, 1870, 1870, 1870,
+ 1871, 1871, 1871, 3253, 1871, 3254, 3255, 1871, 3256, 3257,
+
+ 1859, 1872, 1872, 1872, 1870, 1877, 1877, 1877, 1880, 1880,
+ 1880, 1881, 1881, 1881, 1883, 1883, 1883, 3258, 1872, 1884,
+ 1884, 1884, 1877, 1882, 1882, 1882, 1880, 1882, 1881, 3259,
+ 1882, 1883, 1885, 1885, 1885, 3260, 1884, 1886, 1886, 1886,
+ 1888, 1888, 1888, 1889, 1889, 1889, 3261, 1889, 3262, 1885,
+ 1889, 1890, 1890, 1890, 3263, 1886, 3269, 1888, 1892, 1892,
+ 1892, 3270, 1893, 1893, 1893, 3271, 1893, 3272, 1890, 1893,
+ 1895, 1895, 1895, 3273, 1880, 1892, 3274, 1884, 1897, 1897,
+ 1897, 3275, 1900, 1900, 1900, 1904, 1904, 1904, 1895, 3276,
+ 3277, 1905, 1905, 1905, 3266, 1905, 1897, 1886, 1905, 3278,
+
+ 1900, 3279, 1904, 1907, 1907, 1907, 1909, 1909, 1909, 1911,
+ 1911, 1911, 3280, 3266, 1912, 1912, 1912, 1913, 1913, 1913,
+ 3281, 1907, 3282, 3283, 1909, 3284, 1911, 3285, 3286, 1897,
+ 1900, 1912, 3287, 3288, 1913, 1914, 1914, 1914, 1916, 1916,
+ 1916, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919, 1919,
+ 1920, 1920, 1920, 1914, 3290, 3291, 1916, 1909, 3292, 1917,
+ 3293, 1918, 3294, 3289, 1919, 1922, 1922, 1922, 1920, 1922,
+ 3295, 3296, 1922, 1928, 1928, 1928, 1930, 1930, 1930, 2365,
+ 2365, 1913, 2365, 3289, 1916, 1931, 1931, 1931, 3297, 1931,
+ 2365, 1928, 1931, 1930, 1932, 1932, 1932, 2365, 3298, 1933,
+
+ 1933, 1933, 1914, 1934, 1934, 1934, 1917, 1935, 1935, 1935,
+ 3299, 1935, 1932, 3300, 1935, 1920, 3301, 1933, 3302, 3303,
+ 1934, 1936, 1936, 1936, 1928, 1937, 1937, 1937, 1938, 1938,
+ 1938, 3304, 1938, 3305, 3306, 1938, 1953, 1953, 1953, 1936,
+ 3307, 3308, 1937, 1939, 1939, 1939, 1945, 1945, 1945, 1946,
+ 1946, 1946, 3309, 1932, 1933, 1958, 1958, 1958, 1962, 1962,
+ 1962, 1939, 3315, 1945, 1963, 1963, 1963, 1946, 1964, 1964,
+ 1964, 1966, 1966, 1966, 1968, 1968, 1968, 1969, 1969, 1969,
+ 1974, 1974, 1974, 3316, 1976, 1976, 1976, 1979, 1979, 1979,
+ 1981, 1981, 1981, 1983, 1983, 1983, 1984, 1984, 1984, 3317,
+
+ 3310, 1939, 1976, 3318, 3319, 1979, 3310, 1981, 3320, 3322,
+ 1946, 1983, 3323, 1984, 1993, 1993, 1993, 3325, 1993, 3326,
+ 3328, 1993, 1996, 1996, 1996, 1997, 1997, 1997, 2002, 2002,
+ 2002, 2003, 2003, 2003, 1976, 3329, 2007, 2007, 2007, 3332,
+ 1996, 3333, 1997, 2008, 2008, 2008, 3334, 2008, 3335, 3337,
+ 2008, 3339, 1983, 2007, 2011, 2011, 2011, 2013, 2013, 2013,
+ 2014, 2014, 2014, 2015, 2015, 2015, 3341, 2015, 1996, 3343,
+ 2015, 3345, 2011, 3346, 2013, 3347, 3348, 2014, 2016, 2016,
+ 2016, 3331, 2007, 2018, 2018, 2018, 3349, 2019, 2019, 2019,
+ 2020, 2020, 2020, 3350, 2020, 3331, 2016, 2020, 2021, 2021,
+
+ 2021, 2018, 3351, 2013, 2019, 3352, 3354, 2011, 2024, 2024,
+ 2024, 3356, 2024, 3358, 3359, 2024, 2021, 2027, 2027, 2027,
+ 2028, 2028, 2028, 3360, 2028, 3361, 3370, 2028, 2029, 2029,
+ 2029, 2016, 2029, 3408, 2027, 2029, 2033, 2033, 2033, 2035,
+ 2035, 2035, 2037, 2037, 2037, 2021, 2039, 2039, 2039, 3362,
+ 2039, 3382, 1540, 2039, 2033, 2042, 2042, 2042, 3371, 3372,
+ 2037, 2043, 2043, 2043, 3384, 2043, 3408, 3363, 2043, 2047,
+ 2047, 2047, 2042, 2047, 3370, 3373, 2047, 2050, 2050, 2050,
+ 2051, 2051, 2051, 3390, 2051, 3362, 3374, 2051, 2052, 2052,
+ 2052, 2056, 2056, 2056, 2050, 2057, 2057, 2057, 3382, 2057,
+
+ 2037, 3384, 2057, 3363, 3402, 2052, 3371, 3372, 2056, 2060,
+ 2060, 2060, 2061, 2061, 2061, 3386, 2061, 3391, 3375, 2061,
+ 2064, 2064, 2064, 3373, 2065, 2065, 2065, 2060, 2065, 3390,
+ 3374, 2065, 2066, 2066, 2066, 1539, 3378, 2064, 2067, 2067,
+ 2067, 2068, 2068, 2068, 3378, 2068, 3379, 3402, 2068, 2066,
+ 2069, 2069, 2069, 1538, 3379, 2067, 3386, 2071, 2071, 2071,
+ 2060, 2071, 3375, 3391, 2071, 2074, 2074, 2074, 2069, 2075,
+ 2075, 2075, 3380, 2075, 3387, 3381, 2075, 2077, 2077, 2077,
+ 3380, 2077, 2074, 3381, 2077, 2081, 2081, 2081, 2084, 2084,
+ 2084, 2086, 2086, 2086, 2087, 2087, 2087, 2089, 2089, 2089,
+
+ 3376, 2069, 3385, 2081, 3376, 3394, 2084, 3388, 2086, 2091,
+ 2091, 2091, 2087, 2091, 2089, 3387, 2091, 2095, 2095, 2095,
+ 2098, 2098, 2098, 2100, 2100, 2100, 2101, 2101, 2101, 3383,
+ 2101, 3420, 3377, 2101, 3430, 2095, 3377, 3394, 2098, 3385,
+ 2100, 3403, 3388, 2089, 2102, 2102, 2102, 2103, 2103, 2103,
+ 3395, 2103, 2084, 1536, 2103, 2087, 2105, 2105, 2105, 3389,
+ 3420, 2102, 2107, 2107, 2107, 2108, 2108, 2108, 2109, 2109,
+ 2109, 2110, 2110, 2110, 2105, 2110, 3383, 3392, 2110, 3393,
+ 2107, 3430, 3395, 2108, 3403, 2109, 2111, 2111, 2111, 2112,
+ 2112, 2112, 3400, 2112, 3389, 3396, 2112, 2113, 2113, 2113,
+
+ 2118, 2118, 2118, 2111, 3396, 2120, 2120, 2120, 3397, 2120,
+ 3398, 2107, 2120, 3399, 3392, 2113, 3393, 3397, 2118, 2123,
+ 2123, 2123, 2105, 2124, 2124, 2124, 3400, 2125, 2125, 2125,
+ 2108, 2125, 3401, 3424, 2125, 3414, 3409, 2123, 2128, 2128,
+ 2128, 2124, 2130, 2130, 2130, 3398, 2130, 3452, 3399, 2130,
+ 2133, 2133, 2133, 2141, 2141, 2141, 2128, 2138, 2138, 2138,
+ 3406, 3452, 2113, 1533, 1532, 2118, 3401, 3424, 2133, 3409,
+ 2123, 2139, 2139, 2139, 2138, 2139, 2124, 3414, 2139, 2140,
+ 2140, 2140, 2146, 2146, 2146, 2147, 2147, 2147, 2148, 2148,
+ 2148, 2150, 2150, 2150, 3404, 3406, 2133, 2140, 2155, 2155,
+
+ 2155, 2156, 2156, 2156, 2157, 2157, 2157, 2158, 2158, 2158,
+ 2160, 2160, 2160, 2161, 2161, 2161, 2162, 2162, 2162, 2163,
+ 2163, 2163, 2164, 2164, 2164, 2165, 2165, 2165, 2167, 2167,
+ 2167, 2170, 2170, 2170, 2173, 2173, 2173, 2174, 2174, 2174,
+ 3404, 2174, 3428, 2140, 2174, 3405, 2167, 1531, 3407, 2170,
+ 3428, 2173, 1530, 2158, 2176, 2176, 2176, 2177, 2177, 2177,
+ 2178, 2178, 2178, 3415, 2178, 3429, 1529, 2178, 2189, 2189,
+ 2189, 3412, 2176, 3429, 2177, 2190, 2190, 2190, 3416, 2167,
+ 2191, 2191, 2191, 3407, 2191, 3434, 2189, 2191, 2192, 2192,
+ 2192, 3405, 2190, 2197, 2197, 2197, 2198, 2198, 2198, 2199,
+
+ 2199, 2199, 2200, 2200, 2200, 3415, 2200, 3417, 3412, 2200,
+ 2202, 2202, 2202, 2204, 2204, 2204, 2199, 2189, 2205, 2205,
+ 2205, 3421, 2205, 3426, 3416, 2205, 3434, 3410, 2202, 3413,
+ 2204, 2207, 2207, 2207, 3411, 2207, 3410, 3418, 2207, 2210,
+ 2210, 2210, 2198, 3411, 2212, 2212, 2212, 2214, 2214, 2214,
+ 3421, 2214, 1528, 3417, 2214, 3435, 1527, 2210, 2217, 2217,
+ 2217, 2202, 2212, 2220, 2220, 2220, 3413, 2220, 3419, 3426,
+ 2220, 2227, 2227, 2227, 3418, 3431, 2217, 2229, 2229, 2229,
+ 3425, 2229, 3427, 3438, 2229, 2238, 2238, 2238, 3422, 2227,
+ 2210, 2235, 2235, 2235, 3432, 2235, 3435, 3422, 2235, 2239,
+
+ 2239, 2239, 2238, 2239, 3423, 3419, 2239, 3433, 2243, 2243,
+ 2243, 2217, 2243, 3423, 3425, 2243, 2247, 2247, 2247, 2248,
+ 2248, 2248, 3431, 2249, 2249, 2249, 2227, 2249, 3427, 3438,
+ 2249, 3432, 1525, 2247, 2252, 2252, 2252, 2248, 2253, 2253,
+ 2253, 3436, 2253, 3437, 3433, 2253, 2254, 2254, 2254, 3442,
+ 2254, 2252, 3439, 2254, 2257, 2257, 2257, 2259, 2259, 2259,
+ 1524, 2259, 3440, 1523, 2259, 1522, 2265, 2265, 2265, 2267,
+ 2267, 2267, 2257, 2268, 2268, 2268, 3436, 2268, 3437, 3443,
+ 2268, 3442, 3446, 2248, 2265, 1513, 2267, 2269, 2269, 2269,
+ 2271, 2271, 2271, 2272, 2272, 2272, 3441, 2272, 3439, 3440,
+
+ 2272, 2279, 2279, 2279, 3444, 2269, 1505, 2271, 2282, 2282,
+ 2282, 3443, 2282, 3444, 3446, 2282, 2289, 2289, 2289, 2279,
+ 2257, 2285, 2285, 2285, 3447, 2285, 1490, 3448, 2285, 3449,
+ 2291, 2291, 2291, 3441, 2289, 2292, 2292, 2292, 2293, 2293,
+ 2293, 1489, 2293, 1484, 1483, 2293, 3445, 2269, 2291, 1482,
+ 2296, 2296, 2296, 2292, 2296, 3445, 3447, 2296, 2299, 2299,
+ 2299, 1480, 2300, 2300, 2300, 1473, 1472, 2289, 2301, 2301,
+ 2301, 2292, 2302, 2302, 2302, 3448, 2299, 3449, 2299, 2300,
+ 2303, 2303, 2303, 1454, 1449, 2301, 2304, 2304, 2304, 2302,
+ 2306, 2306, 2306, 2307, 2307, 2307, 2291, 2303, 2308, 2308,
+
+ 2308, 2312, 2312, 2312, 2304, 2309, 2309, 2309, 2306, 3450,
+ 3453, 2307, 1446, 2313, 2313, 2313, 2308, 2313, 1445, 2301,
+ 2313, 3453, 1442, 2309, 2316, 2316, 2316, 2317, 2317, 2317,
+ 2318, 2318, 2318, 2319, 2319, 2319, 2302, 1437, 1428, 2303,
+ 1427, 3450, 2316, 2322, 2322, 2322, 2323, 2323, 2323, 1426,
+ 2306, 2304, 2325, 2325, 2325, 2326, 2326, 2326, 1422, 1417,
+ 2308, 2328, 2328, 2328, 2329, 2329, 2329, 2330, 2330, 2330,
+ 2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336,
+ 2336, 2336, 1413, 2316, 2337, 2337, 2337, 2339, 2339, 2339,
+ 2342, 2342, 2342, 2343, 2343, 2343, 3451, 2343, 1405, 1400,
+
+ 2343, 2346, 2346, 2346, 1399, 2339, 1393, 2342, 2347, 2347,
+ 2347, 1392, 2349, 2349, 2349, 1391, 2349, 1390, 2346, 2349,
+ 2362, 2362, 2362, 2363, 2363, 2363, 2347, 2363, 3451, 1385,
+ 2363, 2366, 2366, 2366, 2367, 2367, 2367, 1384, 2362, 2371,
+ 2371, 2371, 2373, 2373, 2373, 1383, 2373, 1382, 1368, 2373,
+ 2377, 2377, 2377, 2379, 2379, 2379, 1367, 2379, 1366, 1365,
+ 2379, 2383, 2383, 2383, 2385, 2385, 2385, 2346, 2377, 2384,
+ 2384, 2384, 2393, 2393, 2393, 2394, 2394, 2394, 1364, 2383,
+ 1363, 2362, 2385, 2399, 2399, 2399, 2384, 2399, 1362, 1361,
+ 2399, 1360, 1350, 2394, 1349, 1348, 2377, 2402, 2402, 2402,
+
+ 2406, 2406, 2406, 2407, 2407, 2407, 1347, 2407, 1330, 1329,
+ 2407, 2408, 2408, 2408, 2402, 2385, 1324, 2406, 2409, 2409,
+ 2409, 1323, 2409, 1322, 1317, 2409, 2412, 2412, 2412, 2408,
+ 2417, 2417, 2417, 1316, 1299, 2394, 2419, 2419, 2419, 2420,
+ 2420, 2420, 1295, 2420, 2412, 1294, 2420, 1288, 2417, 2423,
+ 2423, 2423, 1284, 2419, 1283, 2424, 2424, 2424, 2425, 2425,
+ 2425, 1282, 2425, 1281, 1280, 2425, 1279, 2423, 2428, 2428,
+ 2428, 1278, 2424, 2429, 2429, 2429, 2434, 2434, 2434, 2436,
+ 2436, 2436, 2439, 2439, 2439, 2428, 2438, 2438, 2438, 1276,
+ 2429, 1275, 1273, 2434, 2440, 2440, 2440, 1272, 1271, 2439,
+
+ 2423, 2424, 1266, 1258, 2438, 1256, 2441, 2441, 2441, 2443,
+ 2443, 2443, 2440, 2442, 2442, 2442, 1251, 1249, 2444, 2444,
+ 2444, 1240, 2444, 2428, 2441, 2444, 2443, 2434, 2445, 2445,
+ 2445, 2442, 1235, 1224, 2429, 2446, 2446, 2446, 2447, 2447,
+ 2447, 2448, 2448, 2448, 1222, 2445, 2449, 2449, 2449, 1221,
+ 2442, 1220, 2446, 1219, 2440, 2447, 2450, 2450, 2450, 2448,
+ 2451, 2451, 2451, 2453, 2453, 2453, 1217, 2441, 1216, 2454,
+ 2454, 2454, 1215, 1214, 2450, 2457, 2457, 2457, 2451, 1213,
+ 1212, 2453, 2458, 2458, 2458, 1210, 2446, 2454, 1209, 2447,
+ 2459, 2459, 2459, 2460, 2460, 2460, 2463, 2463, 2463, 1208,
+
+ 2458, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467,
+ 2471, 2471, 2471, 2474, 2474, 2474, 2475, 2475, 2475, 1207,
+ 2475, 1206, 2450, 2475, 2487, 2487, 2487, 2453, 2471, 1205,
+ 2474, 2454, 2498, 2498, 2498, 2501, 2501, 2501, 2504, 2504,
+ 2504, 1204, 2487, 2507, 2507, 2507, 2509, 2509, 2509, 1203,
+ 2510, 2510, 2510, 1201, 2510, 1200, 2504, 2510, 2511, 2511,
+ 2511, 2507, 1199, 2509, 2518, 2518, 2518, 2519, 2519, 2519,
+ 2520, 2520, 2520, 2526, 2526, 2526, 2511, 1198, 2527, 2527,
+ 2527, 2518, 2527, 1197, 2487, 2527, 1196, 1195, 2520, 1189,
+ 2526, 2529, 2529, 2529, 2531, 2531, 2531, 1188, 2531, 1187,
+
+ 1184, 2531, 1183, 1182, 2504, 2534, 2534, 2534, 2529, 1180,
+ 2536, 2536, 2536, 2540, 2540, 2540, 2542, 2542, 2542, 2544,
+ 2544, 2544, 1176, 2534, 2556, 2556, 2556, 2520, 2536, 1173,
+ 2540, 1168, 1159, 2542, 2543, 2543, 2543, 2544, 2543, 1158,
+ 1155, 2543, 2545, 2545, 2545, 2546, 2546, 2546, 1154, 2546,
+ 1153, 1152, 2546, 2554, 2554, 2554, 2558, 2558, 2558, 2545,
+ 2560, 2560, 2560, 1151, 2561, 2561, 2561, 1137, 2561, 1130,
+ 2554, 2561, 1122, 1121, 2558, 1120, 1117, 2560, 2562, 2562,
+ 2562, 2563, 2563, 2563, 1114, 2564, 2564, 2564, 2565, 2565,
+ 2565, 1111, 2565, 1106, 1103, 2565, 2562, 1102, 1098, 2563,
+
+ 2568, 2568, 2568, 2564, 2569, 2569, 2569, 1096, 2569, 1082,
+ 1081, 2569, 2570, 2570, 2570, 1080, 1079, 2568, 2571, 2571,
+ 2571, 2572, 2572, 2572, 2574, 2574, 2574, 1078, 1077, 2570,
+ 1076, 1075, 2575, 2575, 2575, 2571, 2576, 2576, 2576, 2572,
+ 2580, 2580, 2580, 2584, 2584, 2584, 1074, 1073, 2563, 2564,
+ 2575, 2585, 2585, 2585, 2576, 2589, 2589, 2589, 2580, 2590,
+ 2590, 2590, 1069, 2590, 1065, 1058, 2590, 2604, 2604, 2604,
+ 1055, 1054, 2589, 2619, 2619, 2619, 2622, 2622, 2622, 2623,
+ 2623, 2623, 2625, 2625, 2625, 2604, 2625, 1050, 1049, 2625,
+ 2628, 2628, 2628, 1048, 2622, 1045, 1044, 2576, 2631, 2631,
+
+ 2631, 2634, 2634, 2634, 1043, 2635, 2635, 2635, 2628, 2635,
+ 1040, 1039, 2635, 1036, 1035, 2631, 1032, 1029, 2634, 2636,
+ 2636, 2636, 2640, 2640, 2640, 1025, 1024, 2604, 2642, 2642,
+ 2642, 1021, 2642, 1020, 1019, 2642, 1018, 2636, 1017, 2640,
+ 2646, 2646, 2646, 1015, 2647, 2647, 2647, 2622, 2647, 1014,
+ 1013, 2647, 2654, 2654, 2654, 1012, 1011, 2646, 2655, 2655,
+ 2655, 2656, 2656, 2656, 1010, 2656, 1009, 1008, 2656, 2654,
+ 2657, 2657, 2657, 1004, 999, 2655, 2658, 2658, 2658, 998,
+ 2658, 997, 994, 2658, 2661, 2661, 2661, 2657, 2663, 2663,
+ 2663, 993, 2663, 992, 990, 2663, 2671, 2671, 2671, 2672,
+
+ 2672, 2672, 2661, 2672, 986, 982, 2672, 2673, 2673, 2673,
+ 2674, 2674, 2674, 2671, 2675, 2675, 2675, 981, 2675, 978,
+ 975, 2675, 974, 973, 2673, 972, 971, 2674, 2678, 2678,
+ 2678, 2680, 2680, 2680, 2681, 2681, 2681, 2682, 2682, 2682,
+ 970, 2682, 969, 967, 2682, 966, 2678, 965, 964, 2680,
+ 963, 962, 2681, 2685, 2685, 2685, 2686, 2686, 2686, 961,
+ 2686, 960, 959, 2686, 2687, 2687, 2687, 2688, 2688, 2688,
+ 2685, 2688, 958, 956, 2688, 2689, 2689, 2689, 2691, 2691,
+ 2691, 2687, 2696, 2696, 2696, 2697, 2697, 2697, 2701, 2701,
+ 2701, 955, 954, 2689, 953, 2681, 2691, 2680, 952, 2702,
+
+ 2702, 2702, 951, 2702, 950, 2701, 2702, 2720, 2720, 2720,
+ 2734, 2734, 2734, 2736, 2736, 2736, 2737, 2737, 2737, 2738,
+ 2738, 2738, 2739, 2739, 2739, 2720, 2740, 2740, 2740, 949,
+ 2736, 2741, 2741, 2741, 2737, 2800, 2800, 2800, 948, 2739,
+ 2691, 947, 943, 2740, 942, 2742, 2742, 2742, 2741, 2742,
+ 940, 939, 2742, 2743, 2743, 2743, 938, 2743, 2720, 937,
+ 2743, 2746, 2746, 2746, 2750, 2750, 2750, 2751, 2751, 2751,
+ 936, 932, 2740, 2752, 2752, 2752, 930, 2752, 2737, 2746,
+ 2752, 2750, 929, 928, 2751, 2753, 2753, 2753, 2755, 2755,
+ 2755, 927, 2755, 923, 922, 2755, 2764, 2764, 2764, 2765,
+
+ 2765, 2765, 2753, 2765, 918, 914, 2765, 2766, 2766, 2766,
+ 913, 2766, 910, 2764, 2766, 2769, 2769, 2769, 2770, 2770,
+ 2770, 909, 2770, 908, 907, 2770, 2772, 2772, 2772, 2774,
+ 2774, 2774, 2769, 2774, 906, 905, 2774, 2777, 2777, 2777,
+ 2778, 2778, 2778, 2772, 2778, 904, 901, 2778, 2779, 2779,
+ 2779, 2780, 2780, 2780, 2777, 2780, 900, 899, 2780, 2787,
+ 2787, 2787, 2788, 2788, 2788, 2779, 2789, 2789, 2789, 898,
+ 2789, 895, 894, 2789, 2792, 2792, 2792, 2787, 2792, 893,
+ 2788, 2792, 2795, 2795, 2795, 2798, 2798, 2798, 2801, 2801,
+ 2801, 2804, 2804, 2804, 890, 2804, 888, 885, 2804, 884,
+
+ 2795, 883, 2798, 2798, 2815, 2815, 2815, 2824, 2824, 2824,
+ 2787, 2838, 2838, 2838, 2839, 2839, 2839, 2840, 2840, 2840,
+ 882, 2815, 2842, 2842, 2842, 2824, 2841, 2841, 2841, 2788,
+ 2841, 881, 878, 2841, 2840, 2843, 2843, 2843, 877, 876,
+ 2842, 2844, 2844, 2844, 875, 2844, 874, 871, 2844, 2845,
+ 2845, 2845, 2843, 2846, 2846, 2846, 2824, 2846, 870, 869,
+ 2846, 2848, 2848, 2848, 868, 2848, 2845, 866, 2848, 2853,
+ 2853, 2853, 863, 2842, 2854, 2854, 2854, 862, 2854, 860,
+ 857, 2854, 855, 2855, 2855, 2855, 2853, 2855, 852, 851,
+ 2855, 2858, 2858, 2858, 2859, 2859, 2859, 850, 2859, 849,
+
+ 847, 2859, 2867, 2867, 2867, 846, 2867, 845, 2858, 2867,
+ 2870, 2870, 2870, 842, 2870, 841, 840, 2870, 2874, 2874,
+ 2874, 2875, 2875, 2875, 839, 2875, 838, 837, 2875, 2877,
+ 2877, 2877, 832, 2877, 831, 2874, 2877, 2880, 2880, 2880,
+ 830, 2880, 829, 828, 2880, 2889, 2889, 2889, 2890, 2890,
+ 2890, 2895, 2895, 2895, 2898, 2898, 2898, 2899, 2899, 2899,
+ 2900, 2900, 2900, 2889, 2900, 827, 2890, 2900, 826, 2895,
+ 825, 2898, 2898, 824, 2899, 2899, 823, 822, 2900, 2901,
+ 2901, 2901, 2902, 2902, 2902, 2903, 2903, 2903, 2904, 2904,
+ 2904, 2913, 2913, 2913, 2914, 2914, 2914, 821, 2914, 819,
+
+ 817, 2914, 2923, 2923, 2923, 2936, 2936, 2936, 2913, 2937,
+ 2937, 2937, 816, 813, 2890, 2938, 2938, 2938, 810, 2938,
+ 2923, 807, 2938, 2941, 2941, 2941, 2942, 2942, 2942, 806,
+ 2942, 802, 801, 2942, 800, 2945, 2945, 2945, 799, 2945,
+ 796, 2941, 2945, 2951, 2951, 2951, 793, 2951, 792, 791,
+ 2951, 2954, 2954, 2954, 788, 2954, 787, 786, 2954, 2957,
+ 2957, 2957, 2964, 2964, 2964, 2965, 2965, 2965, 2923, 2965,
+ 783, 782, 2965, 2968, 2968, 2968, 2957, 780, 776, 2964,
+ 2983, 2983, 2983, 2985, 2985, 2985, 2991, 2991, 2991, 775,
+ 2968, 774, 2992, 2992, 2992, 772, 2992, 761, 2983, 2992,
+
+ 759, 2985, 756, 2991, 2991, 2993, 2993, 2993, 755, 2993,
+ 2992, 754, 2993, 2996, 2996, 2996, 2997, 2997, 2997, 2998,
+ 2998, 2998, 752, 2993, 3007, 3007, 3007, 751, 3007, 750,
+ 746, 3007, 745, 744, 2985, 2994, 2994, 2994, 2994, 2994,
+ 2994, 2994, 2994, 2994, 743, 740, 2994, 3016, 3016, 3016,
+ 739, 2994, 2994, 2994, 2994, 2994, 3025, 3025, 3025, 3026,
+ 3026, 3026, 3031, 3031, 3031, 3016, 3032, 3032, 3032, 738,
+ 3032, 737, 736, 3032, 3033, 3033, 3033, 3026, 735, 3031,
+ 2994, 2994, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995,
+ 2995, 3033, 734, 2995, 3039, 3039, 3039, 732, 2995, 2995,
+
+ 2995, 2995, 2995, 3040, 3040, 3040, 729, 3040, 728, 726,
+ 3040, 3039, 3041, 3041, 3041, 3042, 3042, 3042, 724, 3042,
+ 721, 720, 3042, 3055, 3055, 3055, 714, 2995, 2995, 3041,
+ 3061, 3061, 3061, 712, 3061, 710, 707, 3061, 706, 702,
+ 701, 3055, 700, 3080, 3080, 3080, 699, 696, 3061, 3064,
+ 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064, 695, 694,
+ 3064, 3080, 3094, 3094, 3094, 3064, 3064, 3064, 3064, 3064,
+ 3091, 3091, 3091, 693, 3091, 690, 689, 3091, 688, 3094,
+ 3095, 3095, 3095, 687, 3095, 686, 680, 3095, 3117, 3117,
+ 3117, 3129, 3129, 3129, 3064, 3064, 3065, 3065, 3065, 3065,
+
+ 3065, 3065, 3065, 3065, 3065, 679, 3117, 3065, 677, 3129,
+ 3129, 671, 3065, 3065, 3065, 3065, 3065, 3099, 3099, 3099,
+ 670, 3099, 666, 660, 3099, 3102, 3102, 3102, 659, 3102,
+ 655, 648, 3102, 3146, 3146, 3146, 3147, 3147, 3147, 644,
+ 638, 3065, 3065, 3148, 3148, 3148, 634, 3153, 3153, 3153,
+ 3146, 3153, 626, 3147, 3153, 3156, 3156, 3156, 625, 624,
+ 3148, 3167, 3167, 3167, 3171, 3171, 3171, 3182, 3182, 3182,
+ 623, 622, 3156, 3183, 3183, 3183, 618, 3183, 611, 3167,
+ 3183, 610, 3171, 609, 3182, 3184, 3184, 3184, 3185, 3185,
+ 3185, 605, 3185, 598, 597, 3185, 3186, 3186, 3186, 3187,
+
+ 3187, 3187, 3184, 3187, 593, 587, 3187, 3194, 3194, 3194,
+ 3195, 3195, 3195, 3186, 3195, 3171, 586, 3195, 3204, 3204,
+ 3204, 3214, 3214, 3214, 3194, 3214, 582, 574, 3214, 573,
+ 3217, 3217, 3217, 569, 3217, 560, 3204, 3217, 3220, 3220,
+ 3220, 556, 3220, 548, 547, 3220, 3229, 3229, 3229, 546,
+ 3229, 542, 536, 3229, 535, 3204, 3344, 3344, 3344, 3353,
+ 3353, 3353, 534, 3353, 530, 524, 3353, 3454, 3454, 3454,
+ 3455, 3455, 3455, 523, 3344, 519, 513, 3353, 512, 511,
+ 510, 509, 508, 507, 503, 3454, 497, 496, 3455, 3458,
+ 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3459, 3459,
+
+ 3459, 3459, 3459, 3459, 3459, 3459, 3459, 3460, 3460, 3460,
+ 3460, 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3461, 3461,
+ 3461, 3461, 3461, 3461, 3461, 3462, 3462, 3462, 3462, 3462,
+ 3462, 3462, 3462, 3462, 3463, 3463, 3463, 3463, 3463, 3463,
+ 3463, 3463, 3463, 3464, 3464, 3464, 3464, 3464, 3464, 3464,
+ 3464, 3464, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465,
+ 3465, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466,
+ 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3468,
+ 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3469, 3469,
+ 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3470, 3470, 3470,
+
+ 3470, 3470, 3470, 3470, 3470, 3470, 3471, 3471, 3471, 3471,
+ 3471, 3471, 3471, 3471, 3471, 3472, 3472, 3472, 3472, 3472,
+ 3472, 3472, 3472, 3472, 3473, 3473, 3473, 3473, 3473, 3473,
+ 3473, 3473, 3473, 3474, 3474, 3474, 3474, 3474, 3474, 3474,
+ 3474, 3474, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475,
+ 3475, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476,
+ 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3478,
+ 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3479, 3479,
+ 3479, 3479, 3479, 3479, 3479, 3479, 3479, 3480, 3480, 3480,
+ 3480, 3480, 3480, 3480, 3480, 3480, 3481, 3481, 3481, 3481,
+
+ 3481, 3481, 3481, 3481, 3481, 3482, 3482, 3482, 3482, 3482,
+ 3482, 3482, 3482, 3482, 3483, 3483, 3483, 3483, 3483, 3483,
+ 3483, 3483, 3483, 3484, 3484, 3484, 3484, 3484, 3484, 3484,
+ 3484, 3484, 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485,
+ 3485, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486,
+ 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3488,
+ 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489,
+ 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490,
+ 3490, 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3491, 3491,
+ 3491, 3491, 3491, 3491, 3491, 3492, 3492, 3492, 3492, 3492,
+
+ 3492, 3492, 3492, 3492, 3493, 3493, 3493, 3493, 3493, 3493,
+ 3493, 3493, 3493, 3494, 3494, 3494, 3494, 3494, 3494, 3494,
+ 3494, 3494, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495,
+ 3495, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496,
+ 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3498,
+ 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3499, 3499,
+ 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3500, 3500, 3500,
+ 3500, 3500, 3500, 3500, 3500, 3500, 3501, 3501, 3501, 3501,
+ 3501, 3501, 3501, 3501, 3501, 3502, 3502, 3502, 3502, 3502,
+ 3502, 3502, 3502, 3502, 3503, 3503, 3503, 3503, 3503, 3503,
+
+ 3503, 3503, 3503, 3504, 3504, 3504, 3504, 3504, 3504, 3504,
+ 3504, 3504, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505,
+ 3505, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506,
+ 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3508,
+ 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3509, 3509,
+ 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3510, 3510, 3510,
+ 3510, 3510, 3510, 3510, 3510, 3510, 3511, 3511, 3511, 3511,
+ 3511, 3511, 3511, 3511, 3511, 3512, 3512, 3512, 3512, 3512,
+ 3512, 3512, 3512, 3512, 3513, 3513, 3513, 3513, 3513, 3513,
+ 3513, 3513, 3513, 3514, 3514, 3514, 3514, 3514, 3514, 3514,
+
+ 3514, 3514, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515,
+ 3515, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516,
+ 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3518,
+ 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3519, 3519,
+ 3519, 3519, 3519, 3519, 3519, 3519, 3519, 3520, 3520, 3520,
+ 3520, 3520, 3520, 3520, 3520, 3520, 3521, 3521, 3521, 494,
+ 493, 492, 3521, 3522, 3522, 3522, 488, 481, 476, 3522,
+ 3523, 3523, 3523, 475, 473, 469, 3523, 3524, 3524, 3524,
+ 463, 462, 461, 3524, 3525, 3525, 3525, 457, 451, 447,
+ 3525, 3526, 3526, 3526, 443, 439, 437, 3526, 3527, 3527,
+
+ 3527, 436, 435, 431, 3527, 3528, 3528, 3528, 425, 424,
+ 420, 3528, 3529, 3529, 3529, 414, 413, 409, 3529, 3530,
+ 3530, 3530, 402, 401, 400, 3530, 3531, 3531, 3531, 396,
+ 388, 387, 3531, 3532, 3532, 3532, 386, 385, 381, 3532,
+ 3533, 3533, 3533, 372, 366, 362, 3533, 3534, 3534, 3534,
+ 361, 357, 351, 3534, 3535, 3535, 3535, 350, 349, 345,
+ 3535, 3536, 3536, 3536, 338, 336, 335, 3536, 3537, 3537,
+ 3537, 331, 328, 326, 3537, 3538, 3538, 3538, 325, 324,
+ 320, 3538, 3539, 3539, 3539, 316, 313, 309, 3539, 3540,
+ 3540, 3540, 306, 305, 297, 3540, 3541, 3541, 3541, 293,
+
+ 289, 288, 3541, 3542, 3542, 3542, 287, 281, 280, 3542,
+ 3543, 3543, 3543, 278, 275, 263, 3543, 3544, 3544, 3544,
+ 0, 0, 0, 3544, 3545, 3545, 3545, 0, 0, 0,
+ 3545, 3546, 3546, 3546, 0, 0, 0, 3546, 3547, 3547,
+ 3547, 0, 0, 0, 3547, 3548, 3548, 3548, 0, 0,
+ 0, 3548, 3549, 3549, 3549, 0, 0, 0, 3549, 3550,
+ 3550, 3550, 3550, 3550, 3550, 3550, 0, 3550, 3551, 3551,
+ 3551, 0, 0, 0, 3551, 3552, 0, 0, 0, 3552,
+ 3553, 3553, 3553, 0, 0, 0, 3553, 3554, 0, 0,
+ 0, 3554, 3555, 3555, 3555, 0, 0, 0, 3555, 3556,
+
+ 0, 0, 0, 3556, 3557, 3557, 3557, 0, 0, 0,
+ 3557, 3558, 0, 0, 0, 3558, 3559, 3559, 3559, 0,
+ 0, 0, 3559, 3560, 0, 0, 0, 3560, 3561, 3561,
+ 3561, 0, 0, 0, 3561, 3562, 0, 0, 0, 3562,
+ 3563, 3563, 3563, 0, 0, 0, 3563, 3564, 0, 0,
+ 0, 3564, 3565, 3565, 3565, 0, 0, 0, 3565, 3566,
+ 0, 0, 0, 3566, 3567, 3567, 3567, 0, 0, 0,
+ 3567, 3568, 0, 0, 0, 3568, 3569, 3569, 3569, 0,
+ 0, 0, 3569, 3570, 0, 0, 0, 3570, 3571, 3571,
+ 3571, 0, 0, 0, 3571, 3572, 0, 0, 0, 3572,
+
+ 3573, 3573, 3573, 0, 0, 0, 3573, 3574, 0, 0,
+ 0, 3574, 3575, 3575, 3575, 0, 0, 0, 3575, 3576,
+ 0, 0, 0, 3576, 3577, 3577, 3577, 0, 0, 0,
+ 3577, 3578, 0, 0, 0, 3578, 3579, 3579, 3579, 0,
+ 0, 0, 3579, 3580, 0, 0, 0, 3580, 3581, 3581,
+ 3581, 0, 0, 0, 3581, 3582, 0, 0, 0, 3582,
+ 3583, 3583, 3583, 0, 0, 0, 3583, 3584, 0, 0,
+ 0, 3584, 3585, 3585, 3585, 0, 0, 0, 3585, 3586,
+ 0, 0, 0, 3586, 3587, 3587, 3587, 0, 0, 0,
+ 3587, 3588, 0, 0, 0, 3588, 3589, 3589, 3589, 0,
+
+ 0, 0, 3589, 3590, 0, 0, 0, 3590, 3591, 3591,
+ 3591, 0, 0, 0, 3591, 3592, 0, 0, 0, 3592,
+ 3593, 3593, 3593, 0, 0, 0, 3593, 3594, 0, 0,
+ 0, 3594, 3595, 3595, 3595, 0, 0, 0, 3595, 3596,
+ 0, 0, 0, 3596, 3597, 3597, 3597, 0, 0, 0,
+ 3597, 3598, 0, 0, 0, 3598, 3599, 3599, 3599, 0,
+ 0, 0, 3599, 3600, 0, 0, 0, 3600, 3601, 3601,
+ 3601, 0, 0, 0, 3601, 3602, 0, 0, 0, 3602,
+ 3603, 3603, 3603, 0, 0, 0, 3603, 3604, 0, 0,
+ 0, 3604, 3605, 3605, 3605, 0, 0, 0, 3605, 3606,
+
+ 0, 0, 0, 3606, 3607, 3607, 3607, 0, 0, 0,
+ 3607, 3608, 0, 0, 0, 3608, 3609, 3609, 3609, 3609,
+ 3609, 3609, 3609, 3609, 3609, 3610, 0, 0, 0, 0,
+ 3610, 3611, 3611, 3611, 0, 0, 0, 3611, 3612, 3612,
+ 3612, 3612, 0, 0, 3612, 3612, 3613, 3613, 3613, 0,
+ 0, 0, 3613, 3614, 3614, 3614, 3614, 0, 0, 3614,
+ 3614, 3615, 3615, 3615, 0, 0, 0, 3615, 3616, 3616,
+ 3616, 3616, 0, 0, 3616, 3616, 3617, 3617, 3617, 0,
+ 0, 0, 3617, 3618, 3618, 3618, 3618, 0, 0, 3618,
+ 3618, 3619, 3619, 3619, 0, 0, 0, 3619, 3620, 3620,
+
+ 3620, 3620, 0, 0, 3620, 3620, 3621, 3621, 3621, 0,
+ 0, 0, 3621, 3622, 3622, 3622, 3622, 0, 0, 3622,
+ 3622, 3623, 3623, 3623, 0, 0, 0, 3623, 3624, 3624,
+ 3624, 3624, 0, 0, 3624, 3624, 3625, 3625, 3625, 0,
+ 0, 0, 3625, 3626, 3626, 3626, 3626, 0, 0, 3626,
+ 3626, 3627, 3627, 3627, 0, 0, 0, 3627, 3628, 3628,
+ 3628, 3628, 0, 0, 3628, 3628, 3629, 3629, 3629, 0,
+ 0, 0, 3629, 3630, 3630, 3630, 3630, 0, 0, 3630,
+ 3630, 3631, 3631, 3631, 0, 0, 0, 3631, 3632, 3632,
+ 3632, 3632, 0, 0, 3632, 3632, 3633, 3633, 3633, 0,
+
+ 0, 0, 3633, 3634, 3634, 3634, 3634, 0, 0, 3634,
+ 3634, 3635, 3635, 3635, 0, 0, 0, 3635, 3636, 3636,
+ 3636, 3636, 0, 0, 3636, 3636, 3637, 3637, 3637, 0,
+ 0, 0, 3637, 3638, 3638, 3638, 3638, 0, 0, 3638,
+ 3638, 3639, 3639, 3639, 3639, 0, 3639, 0, 3639, 3640,
+ 3640, 3640, 3640, 0, 0, 3640, 3640, 3641, 3641, 3641,
+ 0, 0, 0, 3641, 3642, 3642, 3642, 3642, 0, 0,
+ 3642, 3642, 3643, 3643, 3643, 0, 0, 0, 3643, 3644,
+ 3644, 3644, 3644, 0, 0, 3644, 3644, 3645, 3645, 3645,
+ 0, 0, 0, 3645, 3646, 3646, 3646, 3646, 0, 0,
+
+ 3646, 3646, 3647, 3647, 3647, 0, 0, 0, 3647, 3648,
+ 3648, 3648, 3648, 0, 0, 3648, 3648, 3649, 3649, 3649,
+ 3649, 0, 3649, 0, 3649, 3650, 3650, 3650, 3650, 0,
+ 0, 3650, 3650, 3651, 3651, 3651, 3651, 0, 3651, 0,
+ 3651, 3652, 3652, 3652, 3652, 0, 0, 3652, 3652, 3653,
+ 3653, 3653, 0, 0, 0, 3653, 3654, 3654, 3654, 3654,
+ 0, 0, 3654, 3654, 3655, 3655, 3655, 3655, 0, 3655,
+ 0, 3655, 3656, 3656, 3656, 3656, 0, 0, 3656, 3656,
+ 3657, 3657, 3657, 3657, 0, 3657, 0, 3657, 3658, 3658,
+ 3658, 3658, 0, 0, 3658, 3658, 3659, 3659, 3659, 0,
+
+ 0, 0, 3659, 3660, 3660, 3660, 3660, 0, 0, 3660,
+ 3660, 3661, 3661, 3661, 0, 0, 0, 3661, 3662, 3662,
+ 3662, 3662, 0, 0, 3662, 3662, 3663, 3663, 3663, 3663,
+ 0, 0, 3663, 3663, 3664, 3664, 3664, 0, 0, 0,
+ 3664, 3665, 3665, 3665, 3665, 0, 0, 3665, 3665, 3666,
+ 3666, 3666, 0, 0, 0, 3666, 3667, 3667, 3667, 3667,
+ 0, 0, 3667, 3667, 3668, 3668, 3668, 3668, 3668, 3668,
+ 3668, 3668, 3668, 3669, 0, 3669, 0, 0, 3669, 3670,
+ 3670, 3670, 0, 0, 0, 3670, 3671, 3671, 3671, 3671,
+ 0, 0, 3671, 3671, 3672, 3672, 3672, 3672, 0, 3672,
+
+ 0, 3672, 3673, 3673, 3673, 3673, 0, 0, 3673, 3673,
+ 3674, 3674, 3674, 3674, 0, 3674, 0, 3674, 3675, 3675,
+ 3675, 3675, 0, 0, 3675, 3675, 3676, 3676, 3676, 0,
+ 0, 0, 3676, 3677, 3677, 3677, 3677, 0, 0, 3677,
+ 3677, 3678, 3678, 3678, 0, 0, 0, 3678, 3679, 3679,
+ 3679, 3679, 0, 0, 3679, 3679, 3680, 3680, 3680, 0,
+ 0, 0, 3680, 3681, 3681, 3681, 3681, 0, 0, 3681,
+ 3681, 3682, 3682, 3682, 0, 0, 0, 3682, 3683, 3683,
+ 3683, 3683, 0, 0, 3683, 3683, 3684, 3684, 3684, 0,
+ 0, 0, 3684, 3685, 3685, 3685, 3685, 0, 0, 3685,
+
+ 3685, 3686, 3686, 3686, 3686, 0, 3686, 0, 3686, 3687,
+ 3687, 3687, 3687, 0, 0, 3687, 3687, 3688, 3688, 3688,
+ 3688, 0, 3688, 0, 3688, 3689, 3689, 3689, 3689, 0,
+ 0, 3689, 3689, 3690, 3690, 3690, 0, 0, 0, 3690,
+ 3691, 3691, 3691, 3691, 0, 0, 3691, 3691, 3692, 3692,
+ 3692, 3692, 0, 3692, 0, 3692, 3693, 3693, 3693, 3693,
+ 0, 0, 3693, 3693, 3694, 3694, 3694, 3694, 0, 3694,
+ 0, 3694, 3695, 3695, 3695, 3695, 0, 0, 3695, 3695,
+ 3696, 3696, 3696, 0, 0, 0, 3696, 3697, 3697, 3697,
+ 3697, 0, 0, 3697, 3697, 3698, 3698, 3698, 0, 0,
+
+ 0, 3698, 3699, 3699, 3699, 3699, 0, 0, 3699, 3699,
+ 3700, 3700, 3700, 0, 0, 0, 3700, 3701, 3701, 3701,
+ 3701, 0, 0, 3701, 3701, 3702, 3702, 3702, 0, 0,
+ 0, 3702, 3703, 3703, 3703, 3703, 0, 0, 3703, 3703,
+ 3704, 3704, 3704, 0, 0, 0, 3704, 3705, 3705, 3705,
+ 3705, 0, 0, 3705, 3705, 3706, 3706, 3706, 0, 0,
+ 0, 3706, 3707, 3707, 3707, 3707, 0, 0, 3707, 3707,
+ 3708, 3708, 3708, 0, 0, 0, 3708, 3709, 3709, 3709,
+ 3709, 0, 0, 3709, 3709, 3710, 3710, 3710, 0, 0,
+ 0, 3710, 3711, 3711, 3711, 3711, 0, 0, 3711, 3711,
+
+ 3712, 3712, 3712, 0, 0, 0, 3712, 3713, 3713, 3713,
+ 3713, 0, 0, 3713, 3713, 3714, 3714, 3714, 3714, 0,
+ 0, 3714, 3714, 3715, 3715, 3715, 0, 0, 0, 3715,
+ 3716, 3716, 3716, 3716, 0, 0, 3716, 3716, 3717, 3717,
+ 3717, 0, 0, 0, 3717, 3718, 3718, 3718, 3718, 0,
+ 0, 3718, 3718, 3719, 3719, 3719, 0, 0, 0, 3719,
+ 3720, 3720, 3720, 3720, 0, 0, 3720, 3720, 3721, 3721,
+ 3721, 3721, 0, 0, 3721, 3721, 3722, 3722, 3722, 0,
+ 0, 0, 3722, 3723, 3723, 3723, 3723, 0, 0, 3723,
+ 3723, 3724, 3724, 3724, 0, 0, 0, 3724, 3725, 3725,
+
+ 3725, 3725, 0, 0, 3725, 3725, 3726, 3726, 3726, 3726,
+ 3726, 3726, 3726, 3726, 3726, 3727, 3727, 3727, 3727, 3727,
+ 3727, 3727, 3727, 3727, 3728, 3728, 3728, 0, 0, 0,
+ 3728, 3729, 3729, 3729, 3729, 0, 0, 3729, 3729, 3730,
+ 3730, 3730, 3730, 0, 0, 3730, 3730, 3731, 3731, 3731,
+ 0, 0, 0, 3731, 3732, 3732, 3732, 3732, 0, 0,
+ 3732, 3732, 3733, 3733, 3733, 0, 0, 0, 3733, 3734,
+ 3734, 3734, 3734, 0, 0, 3734, 3734, 3735, 3735, 3735,
+ 0, 0, 0, 3735, 3736, 3736, 3736, 3736, 0, 0,
+ 3736, 3736, 3737, 3737, 3737, 0, 0, 0, 3737, 3738,
+
+ 3738, 3738, 0, 0, 0, 3738, 3739, 3739, 3739, 3739,
+ 0, 0, 3739, 3739, 3740, 3740, 3740, 0, 0, 0,
+ 3740, 3741, 3741, 3741, 3741, 0, 0, 3741, 3741, 3742,
+ 3742, 3742, 0, 0, 0, 3742, 3743, 3743, 3743, 3743,
+ 0, 0, 3743, 3743, 3744, 3744, 3744, 0, 0, 0,
+ 3744, 3745, 3745, 3745, 3745, 0, 0, 3745, 3745, 3746,
+ 3746, 3746, 0, 0, 0, 3746, 3747, 3747, 3747, 3747,
+ 0, 0, 3747, 3747, 3748, 3748, 3748, 3748, 0, 0,
+ 3748, 3748, 3749, 3749, 3749, 3749, 0, 0, 3749, 3749,
+ 3750, 3750, 3750, 0, 0, 0, 3750, 3751, 3751, 3751,
+
+ 3751, 0, 0, 3751, 3751, 3752, 3752, 3752, 3752, 0,
+ 3752, 0, 3752, 3753, 3753, 3753, 3753, 0, 0, 3753,
+ 3753, 3754, 3754, 3754, 0, 0, 0, 3754, 3755, 3755,
+ 3755, 3755, 0, 0, 3755, 3755, 3756, 3756, 3756, 0,
+ 0, 0, 3756, 3757, 3757, 3757, 3757, 0, 0, 3757,
+ 3757, 3758, 3758, 3758, 0, 0, 0, 3758, 3759, 3759,
+ 3759, 3759, 0, 0, 3759, 3759, 3760, 3760, 3760, 0,
+ 0, 0, 3760, 3761, 3761, 3761, 3761, 0, 0, 3761,
+ 3761, 3762, 3762, 3762, 0, 0, 0, 3762, 3763, 3763,
+ 3763, 3763, 0, 0, 3763, 3763, 3764, 3764, 3764, 0,
+
+ 0, 0, 3764, 3765, 3765, 3765, 3765, 0, 0, 3765,
+ 3765, 3766, 3766, 3766, 0, 0, 0, 3766, 3767, 3767,
+ 3767, 3767, 0, 0, 3767, 3767, 3768, 3768, 3768, 3768,
+ 0, 0, 3768, 3768, 3769, 3769, 3769, 0, 0, 0,
+ 3769, 3770, 3770, 3770, 3770, 0, 0, 3770, 3770, 3771,
+ 3771, 3771, 0, 0, 0, 3771, 3772, 3772, 3772, 3772,
+ 0, 0, 3772, 3772, 3773, 3773, 3773, 3773, 0, 3773,
+ 0, 3773, 3774, 3774, 3774, 3774, 0, 0, 3774, 3774,
+ 3775, 3775, 3775, 3775, 0, 0, 3775, 3775, 3776, 3776,
+ 3776, 3776, 0, 3776, 0, 3776, 3777, 3777, 3777, 3777,
+
+ 0, 0, 3777, 3777, 3778, 3778, 3778, 3778, 0, 3778,
+ 0, 3778, 3779, 3779, 3779, 3779, 0, 0, 3779, 3779,
+ 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3781,
+ 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3782, 3782,
+ 3782, 0, 0, 0, 3782, 3783, 3783, 3783, 3783, 0,
+ 0, 3783, 3783, 3784, 3784, 3784, 3784, 0, 0, 3784,
+ 3784, 3785, 3785, 3785, 0, 0, 0, 3785, 3786, 3786,
+ 3786, 3786, 0, 0, 3786, 3786, 3787, 3787, 3787, 0,
+ 0, 0, 3787, 3788, 3788, 3788, 3788, 0, 0, 3788,
+ 3788, 3789, 3789, 3789, 0, 0, 0, 3789, 3790, 3790,
+
+ 3790, 3790, 0, 0, 3790, 3790, 3791, 3791, 3791, 0,
+ 0, 0, 3791, 3792, 3792, 3792, 0, 0, 0, 3792,
+ 3793, 3793, 3793, 3793, 0, 0, 3793, 3793, 3794, 3794,
+ 3794, 0, 0, 0, 3794, 3795, 3795, 3795, 3795, 0,
+ 0, 3795, 3795, 3796, 3796, 3796, 0, 0, 0, 3796,
+ 3797, 3797, 3797, 3797, 0, 0, 3797, 3797, 3798, 3798,
+ 3798, 3798, 0, 3798, 0, 3798, 3799, 3799, 3799, 3799,
+ 0, 0, 3799, 3799, 3800, 3800, 3800, 0, 0, 0,
+ 3800, 3801, 3801, 3801, 3801, 0, 0, 3801, 3801, 3802,
+ 3802, 3802, 3802, 0, 0, 3802, 3802, 3803, 3803, 3803,
+
+ 0, 0, 0, 3803, 3804, 3804, 3804, 3804, 0, 0,
+ 3804, 3804, 3805, 3805, 3805, 3805, 0, 3805, 0, 3805,
+ 3806, 3806, 3806, 3806, 0, 0, 3806, 3806, 3807, 3807,
+ 3807, 0, 0, 0, 3807, 3808, 3808, 3808, 3808, 0,
+ 0, 3808, 3808, 3809, 3809, 3809, 0, 0, 0, 3809,
+ 3810, 3810, 3810, 3810, 0, 0, 3810, 3810, 3811, 3811,
+ 3811, 0, 0, 0, 3811, 3812, 3812, 3812, 3812, 0,
+ 0, 3812, 3812, 3813, 3813, 3813, 0, 0, 0, 3813,
+ 3814, 3814, 3814, 3814, 0, 0, 3814, 3814, 3815, 3815,
+ 3815, 0, 0, 0, 3815, 3816, 3816, 3816, 3816, 0,
+
+ 0, 3816, 3816, 3817, 3817, 3817, 3817, 0, 3817, 0,
+ 3817, 3818, 3818, 3818, 3818, 0, 0, 3818, 3818, 3819,
+ 3819, 3819, 0, 0, 0, 3819, 3820, 3820, 3820, 3820,
+ 0, 0, 3820, 3820, 3821, 3821, 3821, 3821, 0, 0,
+ 3821, 3821, 3822, 3822, 3822, 3822, 0, 3822, 0, 3822,
+ 3823, 3823, 3823, 3823, 0, 0, 3823, 3823, 3824, 3824,
+ 3824, 0, 0, 0, 3824, 3825, 3825, 3825, 3825, 0,
+ 0, 3825, 3825, 3826, 3826, 3826, 3826, 0, 0, 3826,
+ 3826, 3827, 3827, 3827, 3827, 0, 0, 3827, 3827, 3828,
+ 3828, 3828, 3828, 0, 0, 3828, 3828, 3829, 3829, 3829,
+
+ 3829, 0, 0, 3829, 3829, 3830, 3830, 3830, 3830, 3830,
+ 3830, 3830, 3830, 3830, 3831, 3831, 3831, 3831, 3831, 3831,
+ 3831, 3831, 3831, 3832, 3832, 3832, 3832, 0, 3832, 0,
+ 3832, 3833, 3833, 3833, 3833, 0, 0, 3833, 3833, 3834,
+ 3834, 3834, 3834, 0, 0, 3834, 3834, 3835, 3835, 3835,
+ 0, 0, 0, 3835, 3836, 3836, 3836, 3836, 0, 0,
+ 3836, 3836, 3837, 3837, 3837, 0, 0, 0, 3837, 3838,
+ 3838, 3838, 3838, 0, 0, 3838, 3838, 3839, 3839, 3839,
+ 3839, 0, 3839, 0, 3839, 3840, 3840, 3840, 3840, 0,
+ 0, 3840, 3840, 3841, 3841, 3841, 3841, 0, 3841, 0,
+
+ 3841, 3842, 3842, 3842, 3842, 0, 3842, 0, 3842, 3843,
+ 3843, 3843, 3843, 0, 0, 3843, 3843, 3844, 3844, 3844,
+ 3844, 0, 3844, 0, 3844, 3845, 3845, 3845, 3845, 0,
+ 0, 3845, 3845, 3846, 3846, 3846, 0, 0, 0, 3846,
+ 3847, 3847, 3847, 3847, 0, 0, 3847, 3847, 3848, 3848,
+ 3848, 3848, 0, 0, 3848, 3848, 3849, 3849, 3849, 0,
+ 0, 0, 3849, 3850, 3850, 3850, 3850, 0, 0, 3850,
+ 3850, 3851, 3851, 3851, 0, 0, 0, 3851, 3852, 3852,
+ 3852, 3852, 0, 0, 3852, 3852, 3853, 3853, 3853, 3853,
+ 0, 3853, 0, 3853, 3854, 3854, 3854, 3854, 0, 0,
+
+ 3854, 3854, 3855, 3855, 3855, 0, 0, 0, 3855, 3856,
+ 3856, 3856, 0, 0, 0, 3856, 3857, 3857, 3857, 3857,
+ 0, 0, 3857, 3857, 3858, 3858, 3858, 0, 0, 0,
+ 3858, 3859, 3859, 3859, 3859, 0, 0, 3859, 3859, 3860,
+ 3860, 3860, 0, 0, 0, 3860, 3861, 3861, 3861, 0,
+ 0, 0, 3861, 3862, 3862, 3862, 3862, 0, 0, 3862,
+ 3862, 3863, 3863, 3863, 0, 0, 0, 3863, 3864, 3864,
+ 3864, 3864, 0, 0, 3864, 3864, 3865, 3865, 3865, 0,
+ 0, 0, 3865, 3866, 3866, 3866, 3866, 0, 0, 3866,
+ 3866, 3867, 3867, 3867, 3867, 0, 0, 3867, 3867, 3868,
+
+ 3868, 3868, 3868, 0, 0, 3868, 3868, 3869, 3869, 3869,
+ 0, 0, 0, 3869, 3870, 3870, 3870, 3870, 0, 0,
+ 3870, 3870, 3871, 3871, 3871, 3871, 0, 0, 3871, 3871,
+ 3872, 3872, 3872, 3872, 0, 0, 3872, 3872, 3873, 3873,
+ 3873, 3873, 0, 0, 3873, 3873, 3874, 3874, 3874, 3874,
+ 3874, 3874, 3874, 3874, 3874, 3875, 3875, 3875, 3875, 3875,
+ 3875, 3875, 3875, 3875, 3876, 3876, 3876, 3876, 0, 0,
+ 3876, 3876, 3877, 3877, 3877, 3877, 0, 0, 3877, 3877,
+ 3878, 3878, 3878, 0, 0, 0, 3878, 3879, 3879, 3879,
+ 0, 0, 0, 3879, 3880, 3880, 3880, 3880, 0, 0,
+
+ 3880, 3880, 3881, 3881, 3881, 3881, 0, 0, 3881, 3881,
+ 3882, 3882, 3882, 0, 0, 0, 3882, 3883, 3883, 3883,
+ 3883, 0, 0, 3883, 3883, 3884, 3884, 3884, 0, 0,
+ 0, 3884, 3885, 3885, 3885, 3885, 0, 0, 3885, 3885,
+ 3886, 3886, 3886, 0, 0, 0, 3886, 3887, 3887, 3887,
+ 3887, 0, 0, 3887, 3887, 3888, 3888, 3888, 0, 0,
+ 0, 3888, 3889, 3889, 3889, 3889, 0, 0, 3889, 3889,
+ 3890, 3890, 3890, 0, 0, 0, 3890, 3891, 3891, 3891,
+ 3891, 0, 0, 3891, 3891, 3892, 3892, 3892, 3892, 0,
+ 0, 3892, 3892, 3893, 3893, 3893, 0, 0, 0, 3893,
+
+ 3894, 3894, 3894, 0, 0, 0, 3894, 3895, 3895, 3895,
+ 3895, 0, 0, 3895, 3895, 3896, 3896, 3896, 0, 0,
+ 0, 3896, 3897, 3897, 3897, 3897, 0, 0, 3897, 3897,
+ 3898, 3898, 3898, 0, 0, 0, 3898, 3899, 3899, 3899,
+ 0, 0, 0, 3899, 3900, 3900, 3900, 0, 0, 0,
+ 3900, 3901, 3901, 3901, 3901, 0, 0, 3901, 3901, 3902,
+ 3902, 3902, 0, 0, 0, 3902, 3903, 3903, 3903, 3903,
+ 0, 0, 3903, 3903, 3904, 3904, 3904, 3904, 0, 0,
+ 3904, 3904, 3905, 3905, 3905, 3905, 0, 0, 3905, 3905,
+ 3906, 3906, 3906, 3906, 0, 3906, 0, 3906, 3907, 3907,
+
+ 3907, 3907, 0, 0, 3907, 3907, 3908, 3908, 3908, 3908,
+ 0, 0, 3908, 3908, 3909, 3909, 3909, 3909, 0, 0,
+ 3909, 3909, 3910, 3910, 3910, 3910, 0, 0, 3910, 3910,
+ 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3912,
+ 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3913, 3913,
+ 3913, 3913, 0, 0, 3913, 3913, 3914, 3914, 3914, 3914,
+ 0, 0, 3914, 3914, 3915, 3915, 3915, 0, 0, 0,
+ 3915, 3916, 3916, 3916, 3916, 0, 3916, 0, 3916, 3917,
+ 3917, 3917, 3917, 0, 0, 3917, 3917, 3918, 3918, 3918,
+ 0, 0, 0, 3918, 3919, 3919, 3919, 3919, 0, 0,
+
+ 3919, 3919, 3920, 3920, 3920, 0, 0, 0, 3920, 3921,
+ 3921, 3921, 3921, 0, 0, 3921, 3921, 3922, 3922, 3922,
+ 3922, 0, 3922, 0, 3922, 3923, 3923, 3923, 3923, 0,
+ 0, 3923, 3923, 3924, 3924, 3924, 0, 0, 0, 3924,
+ 3925, 3925, 3925, 3925, 0, 0, 3925, 3925, 3926, 3926,
+ 3926, 0, 0, 0, 3926, 3927, 3927, 3927, 3927, 0,
+ 0, 3927, 3927, 3928, 3928, 3928, 3928, 0, 0, 3928,
+ 3928, 3929, 3929, 3929, 0, 0, 0, 3929, 3930, 3930,
+ 3930, 0, 0, 0, 3930, 3931, 3931, 3931, 3931, 0,
+ 3931, 0, 3931, 3932, 3932, 3932, 3932, 0, 0, 3932,
+
+ 3932, 3933, 3933, 3933, 3933, 0, 3933, 0, 3933, 3934,
+ 3934, 3934, 0, 0, 0, 3934, 3935, 3935, 3935, 0,
+ 0, 0, 3935, 3936, 3936, 3936, 3936, 0, 0, 3936,
+ 3936, 3937, 3937, 3937, 3937, 0, 3937, 0, 3937, 3938,
+ 3938, 3938, 3938, 0, 0, 3938, 3938, 3939, 3939, 3939,
+ 3939, 0, 0, 3939, 3939, 3940, 3940, 3940, 3940, 0,
+ 0, 3940, 3940, 3941, 3941, 3941, 3941, 0, 3941, 0,
+ 3941, 3942, 3942, 3942, 3942, 0, 0, 3942, 3942, 3943,
+ 3943, 3943, 3943, 0, 0, 3943, 3943, 3944, 3944, 3944,
+ 3944, 0, 0, 3944, 3944, 3945, 3945, 3945, 3945, 3945,
+
+ 3945, 3945, 3945, 3945, 3946, 3946, 3946, 3946, 3946, 3946,
+ 3946, 3946, 3946, 3947, 3947, 3947, 3947, 0, 0, 3947,
+ 3947, 3948, 3948, 3948, 0, 0, 0, 3948, 3949, 3949,
+ 3949, 0, 0, 0, 3949, 3950, 3950, 3950, 3950, 0,
+ 0, 3950, 3950, 3951, 3951, 3951, 0, 0, 0, 3951,
+ 3952, 3952, 3952, 3952, 0, 0, 3952, 3952, 3953, 3953,
+ 3953, 0, 0, 0, 3953, 3954, 3954, 3954, 3954, 0,
+ 0, 3954, 3954, 3955, 3955, 3955, 0, 0, 0, 3955,
+ 3956, 3956, 3956, 3956, 0, 0, 3956, 3956, 3957, 3957,
+ 3957, 0, 0, 0, 3957, 3958, 3958, 3958, 0, 0,
+
+ 0, 3958, 3959, 3959, 3959, 0, 0, 0, 3959, 3960,
+ 3960, 3960, 3960, 0, 0, 3960, 3960, 3961, 3961, 3961,
+ 0, 0, 0, 3961, 3962, 3962, 3962, 0, 0, 0,
+ 3962, 3963, 3963, 3963, 0, 0, 0, 3963, 3964, 3964,
+ 3964, 3964, 3964, 3964, 3964, 3964, 3964, 3965, 3965, 3965,
+ 3965, 3965, 3965, 3965, 3965, 3965, 3966, 3966, 3966, 3966,
+ 3966, 3966, 3966, 3966, 3966, 3967, 3967, 3967, 3967, 3967,
+ 3967, 3967, 3967, 3967, 3968, 3968, 3968, 3968, 3968, 3968,
+ 3968, 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969,
+ 3969, 3969, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457,
+ 3457, 3457, 3457, 3457, 3457, 3457, 3457
} ;
/* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[569] =
+static yyconst flex_int32_t yy_rule_can_match_eol[590] =
{ 0,
0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0,
1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
- 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
+ 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
- 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
- 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
- 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
- 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
- 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
- 0, 0, 0, 1, 0, 0, 0, 1, 0, };
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
+ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0,
+ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1,
+ 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, };
static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;
AT_surfxml_peer_availability___file AX_surfxml_peer_availability___file;
#define A_surfxml_peer_availability___file (surfxml_bufferstack + AX_surfxml_peer_availability___file)
short int surfxml_peer_availability___file_isset;
+AT_surfxml_model___prop_value AX_surfxml_model___prop_value;
+#define A_surfxml_model___prop_value (surfxml_bufferstack + AX_surfxml_model___prop_value)
+short int surfxml_model___prop_value_isset;
AT_surfxml_link___ctn_direction AX_surfxml_link___ctn_direction;
#define A_surfxml_link___ctn_direction AX_surfxml_link___ctn_direction
short int surfxml_link___ctn_direction_isset;
AT_surfxml_host___link_id AX_surfxml_host___link_id;
#define A_surfxml_host___link_id (surfxml_bufferstack + AX_surfxml_host___link_id)
short int surfxml_host___link_id_isset;
+AT_surfxml_model___prop_id AX_surfxml_model___prop_id;
+#define A_surfxml_model___prop_id (surfxml_bufferstack + AX_surfxml_model___prop_id)
+short int surfxml_model___prop_id_isset;
AT_surfxml_ASroute_src AX_surfxml_ASroute_src;
#define A_surfxml_ASroute_src (surfxml_bufferstack + AX_surfxml_ASroute_src)
short int surfxml_ASroute_src_isset;
AT_surfxml_link_id AX_surfxml_link_id;
#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id)
short int surfxml_link_id_isset;
+AT_surfxml_cluster_topology AX_surfxml_cluster_topology;
+#define A_surfxml_cluster_topology AX_surfxml_cluster_topology
+short int surfxml_cluster_topology_isset;
AT_surfxml_process_host AX_surfxml_process_host;
#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host)
short int surfxml_process_host_isset;
AT_surfxml_cluster_power AX_surfxml_cluster_power;
#define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power)
short int surfxml_cluster_power_isset;
+AT_surfxml_cluster_topo___parameters AX_surfxml_cluster_topo___parameters;
+#define A_surfxml_cluster_topo___parameters (surfxml_bufferstack + AX_surfxml_cluster_topo___parameters)
+short int surfxml_cluster_topo___parameters_isset;
AT_surfxml_process_function AX_surfxml_process_function;
#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function)
short int surfxml_process_function_isset;
#define E_surfxml_config 125
#define AL_surfxml_prop 126
#define E_surfxml_prop 127
-#define IMPOSSIBLE 128
+#define AL_surfxml_model___prop 128
+#define E_surfxml_model___prop 129
+#define IMPOSSIBLE 130
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
surfxml_statenames[E_surfxml_config] = "config";
surfxml_statenames[AL_surfxml_prop] = NULL;
surfxml_statenames[E_surfxml_prop] = "prop";
+ surfxml_statenames[AL_surfxml_model___prop] = NULL;
+ surfxml_statenames[E_surfxml_model___prop] = "model_prop";
}
/* COMMENTS and PIs: handled uniformly for efficiency. */
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 3323 )
+ if ( yy_current_state >= 3458 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_base[yy_current_state] != 12292 );
+ while ( yy_base[yy_current_state] != 12593 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
{
AX_surfxml_AS_id = 0;
surfxml_AS_id_isset = 0;
- AX_surfxml_AS_routing = A_surfxml_AS_routing_None;
+ AX_surfxml_AS_routing = AU_surfxml_AS_routing;
surfxml_AS_routing_isset = 0;
ENTER(AL_surfxml_AS); pushbuffer(0);
}
A_surfxml_AS_routing = A_surfxml_AS_routing_Cluster;
YY_BREAK
case 124:
+/* rule 124 can match eol */
+case 125:
+/* rule 125 can match eol */
+YY_RULE_SETUP
+A_surfxml_AS_routing = A_surfxml_AS_routing_Cluster___torus;
+ YY_BREAK
+case 126:
YY_RULE_SETUP
{
if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element.");
+ if (!AX_surfxml_AS_routing) FAIL("Required attribute `routing' not set for `AS' element.");
LEAVE; STag_surfxml_AS();surfxml_pcdata_ix = 0; ENTER(S_surfxml_AS);
}
YY_BREAK
-case 125:
+case 127:
YY_RULE_SETUP
{
if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element.");
+ if (!AX_surfxml_AS_routing) FAIL("Required attribute `routing' not set for `AS' element.");
LEAVE; STag_surfxml_AS(); surfxml_pcdata_ix = 0; ETag_surfxml_AS(); popbuffer(); /* attribute */
switch (YY_START) {
case S_surfxml_AS_1: case S_surfxml_AS_5: case S_surfxml_AS: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_6); break;
}
}
YY_BREAK
-case 126:
+case 128:
YY_RULE_SETUP
FAIL("Unexpected character `%c' in attribute list of AS element.", surf_parse_text[0]);
YY_BREAK
-case 127:
+case 129:
YY_RULE_SETUP
FAIL("Bad attribute `%s' in `AS' element start tag.",surf_parse_text);
YY_BREAK
FAIL("EOF in attribute list of `AS' element.");
YY_BREAK
-case 128:
-/* rule 128 can match eol */
+case 130:
+/* rule 130 can match eol */
YY_RULE_SETUP
{
LEAVE;
}
}
YY_BREAK
-case 129:
-/* rule 129 can match eol */
+case 131:
+/* rule 131 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</AS>' expected.",surf_parse_text);
YY_BREAK
-case 130:
+case 132:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</AS>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</AS>' expected.");
YY_BREAK
-case 131:
-/* rule 131 can match eol */
+case 133:
+/* rule 133 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <storage_type> is not allowed here.");
YY_BREAK
-case 132:
-/* rule 132 can match eol */
+case 134:
+/* rule 134 can match eol */
YY_RULE_SETUP
{
AX_surfxml_storage___type_id = 0;
}
YY_BREAK
-case 133:
-/* rule 133 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id);
- YY_BREAK
-case 134:
-/* rule 134 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id);
- YY_BREAK
case 135:
/* rule 135 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model);
+if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id);
YY_BREAK
case 136:
/* rule 136 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model);
+if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage___type>");} surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id);
YY_BREAK
case 137:
/* rule 137 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size);
+if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model);
YY_BREAK
case 138:
/* rule 138 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size);
+if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in <surfxml_storage___type>");} surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model);
YY_BREAK
case 139:
/* rule 139 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content);
+if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size);
YY_BREAK
case 140:
/* rule 140 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content);
+if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in <surfxml_storage___type>");} surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size);
YY_BREAK
case 141:
/* rule 141 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content___type);
+if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content);
YY_BREAK
case 142:
/* rule 142 can match eol */
YY_RULE_SETUP
-if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content___type);
+if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage___type>");} surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content);
YY_BREAK
case 143:
+/* rule 143 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content___type);
+ YY_BREAK
+case 144:
+/* rule 144 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage___type>");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content___type);
+ YY_BREAK
+case 145:
YY_RULE_SETUP
{
if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type);
}
YY_BREAK
-case 144:
+case 146:
YY_RULE_SETUP
{
if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element.");
}
}
YY_BREAK
-case 145:
+case 147:
YY_RULE_SETUP
FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]);
YY_BREAK
-case 146:
+case 148:
YY_RULE_SETUP
FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text);
YY_BREAK
FAIL("EOF in attribute list of `storage_type' element.");
YY_BREAK
-case 147:
-/* rule 147 can match eol */
+case 149:
+/* rule 149 can match eol */
YY_RULE_SETUP
{
LEAVE;
}
}
YY_BREAK
-case 148:
-/* rule 148 can match eol */
+case 150:
+/* rule 150 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</storage_type>' expected.",surf_parse_text);
YY_BREAK
-case 149:
+case 151:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</storage_type>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage_type>' expected.");
YY_BREAK
-case 150:
-/* rule 150 can match eol */
+case 152:
+/* rule 152 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <storage> is not allowed here.");
YY_BREAK
-case 151:
-/* rule 151 can match eol */
+case 153:
+/* rule 153 can match eol */
YY_RULE_SETUP
{
AX_surfxml_storage_id = 0;
}
YY_BREAK
-case 152:
-/* rule 152 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
- YY_BREAK
-case 153:
-/* rule 153 can match eol */
-YY_RULE_SETUP
-if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
- YY_BREAK
case 154:
/* rule 154 can match eol */
YY_RULE_SETUP
-if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
+if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id);
YY_BREAK
case 155:
/* rule 155 can match eol */
YY_RULE_SETUP
-if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
+if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_storage>");} surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id);
YY_BREAK
case 156:
/* rule 156 can match eol */
YY_RULE_SETUP
-if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
+if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId);
YY_BREAK
case 157:
/* rule 157 can match eol */
YY_RULE_SETUP
-if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
+if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_storage>");} surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId);
YY_BREAK
case 158:
/* rule 158 can match eol */
YY_RULE_SETUP
-if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
+if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content);
YY_BREAK
case 159:
/* rule 159 can match eol */
YY_RULE_SETUP
-if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
+if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in <surfxml_storage>");} surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content);
YY_BREAK
case 160:
+/* rule 160 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type);
+ YY_BREAK
+case 161:
+/* rule 161 can match eol */
+YY_RULE_SETUP
+if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in <surfxml_storage>");} surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type);
+ YY_BREAK
+case 162:
YY_RULE_SETUP
{
if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage);
}
YY_BREAK
-case 161:
+case 163:
YY_RULE_SETUP
{
if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element.");
}
}
YY_BREAK
-case 162:
+case 164:
YY_RULE_SETUP
FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]);
YY_BREAK
-case 163:
+case 165:
YY_RULE_SETUP
FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text);
YY_BREAK
FAIL("EOF in attribute list of `storage' element.");
YY_BREAK
-case 164:
-/* rule 164 can match eol */
+case 166:
+/* rule 166 can match eol */
YY_RULE_SETUP
{
LEAVE;
}
}
YY_BREAK
-case 165:
-/* rule 165 can match eol */
+case 167:
+/* rule 167 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</storage>' expected.",surf_parse_text);
YY_BREAK
-case 166:
+case 168:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</storage>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</storage>' expected.");
YY_BREAK
-case 167:
-/* rule 167 can match eol */
+case 169:
+/* rule 169 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <mount> is not allowed here.");
YY_BREAK
-case 168:
-/* rule 168 can match eol */
+case 170:
+/* rule 170 can match eol */
YY_RULE_SETUP
{
AX_surfxml_mount_storageId = 0;
}
YY_BREAK
-case 169:
-/* rule 169 can match eol */
+case 171:
+/* rule 171 can match eol */
YY_RULE_SETUP
if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId);
YY_BREAK
-case 170:
-/* rule 170 can match eol */
+case 172:
+/* rule 172 can match eol */
YY_RULE_SETUP
if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in <surfxml_mount>");} surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId);
YY_BREAK
-case 171:
-/* rule 171 can match eol */
+case 173:
+/* rule 173 can match eol */
YY_RULE_SETUP
if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name);
YY_BREAK
-case 172:
-/* rule 172 can match eol */
+case 174:
+/* rule 174 can match eol */
YY_RULE_SETUP
if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mount>");} surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name);
YY_BREAK
-case 173:
+case 175:
YY_RULE_SETUP
{
if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 178:
-/* rule 178 can match eol */
+case 180:
+/* rule 180 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</mount>' expected.",surf_parse_text);
YY_BREAK
-case 179:
+case 181:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</mount>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mount>' expected.");
YY_BREAK
-case 180:
-/* rule 180 can match eol */
+case 182:
+/* rule 182 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <mstorage> is not allowed here.");
YY_BREAK
-case 181:
-/* rule 181 can match eol */
+case 183:
+/* rule 183 can match eol */
YY_RULE_SETUP
{
AX_surfxml_mstorage_typeId = 0;
}
YY_BREAK
-case 182:
-/* rule 182 can match eol */
+case 184:
+/* rule 184 can match eol */
YY_RULE_SETUP
if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_mstorage>");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_typeId);
YY_BREAK
-case 183:
-/* rule 183 can match eol */
+case 185:
+/* rule 185 can match eol */
YY_RULE_SETUP
if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in <surfxml_mstorage>");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_typeId);
YY_BREAK
-case 184:
-/* rule 184 can match eol */
+case 186:
+/* rule 186 can match eol */
YY_RULE_SETUP
if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mstorage>");} surfxml_mstorage_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_name);
YY_BREAK
-case 185:
-/* rule 185 can match eol */
+case 187:
+/* rule 187 can match eol */
YY_RULE_SETUP
if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_mstorage>");} surfxml_mstorage_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_name);
YY_BREAK
-case 186:
+case 188:
YY_RULE_SETUP
{
if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 191:
-/* rule 191 can match eol */
+case 193:
+/* rule 193 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</mstorage>' expected.",surf_parse_text);
YY_BREAK
-case 192:
+case 194:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</mstorage>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</mstorage>' expected.");
YY_BREAK
-case 193:
-/* rule 193 can match eol */
+case 195:
+/* rule 195 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <host> is not allowed here.");
YY_BREAK
-case 194:
-/* rule 194 can match eol */
+case 196:
+/* rule 196 can match eol */
YY_RULE_SETUP
{
AX_surfxml_host_id = 0;
}
YY_BREAK
-case 195:
-/* rule 195 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
- YY_BREAK
-case 196:
-/* rule 196 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
- YY_BREAK
case 197:
/* rule 197 can match eol */
YY_RULE_SETUP
-if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
+if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id);
YY_BREAK
case 198:
/* rule 198 can match eol */
YY_RULE_SETUP
-if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
+if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host>");} surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id);
YY_BREAK
case 199:
/* rule 199 can match eol */
YY_RULE_SETUP
-if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
+if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power);
YY_BREAK
case 200:
/* rule 200 can match eol */
YY_RULE_SETUP
-if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
+if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_host>");} surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power);
YY_BREAK
case 201:
/* rule 201 can match eol */
YY_RULE_SETUP
-if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
+if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core);
YY_BREAK
case 202:
/* rule 202 can match eol */
YY_RULE_SETUP
-if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
+if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_host>");} surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core);
YY_BREAK
case 203:
/* rule 203 can match eol */
YY_RULE_SETUP
-if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
+if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability);
YY_BREAK
case 204:
/* rule 204 can match eol */
YY_RULE_SETUP
-if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
+if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in <surfxml_host>");} surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability);
YY_BREAK
case 205:
/* rule 205 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file);
+ YY_BREAK
case 206:
/* rule 206 can match eol */
YY_RULE_SETUP
-A_surfxml_host_state = A_surfxml_host_state_ON;
+if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_host>");} surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file);
YY_BREAK
case 207:
/* rule 207 can match eol */
case 208:
/* rule 208 can match eol */
YY_RULE_SETUP
-A_surfxml_host_state = A_surfxml_host_state_OFF;
+A_surfxml_host_state = A_surfxml_host_state_ON;
YY_BREAK
case 209:
/* rule 209 can match eol */
-YY_RULE_SETUP
-if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
- YY_BREAK
case 210:
/* rule 210 can match eol */
YY_RULE_SETUP
-if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
+A_surfxml_host_state = A_surfxml_host_state_OFF;
YY_BREAK
case 211:
/* rule 211 can match eol */
YY_RULE_SETUP
-if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
+if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file);
YY_BREAK
case 212:
/* rule 212 can match eol */
YY_RULE_SETUP
-if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
+if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_host>");} surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file);
YY_BREAK
case 213:
/* rule 213 can match eol */
YY_RULE_SETUP
-if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
+if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates);
YY_BREAK
case 214:
/* rule 214 can match eol */
YY_RULE_SETUP
-if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
+if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_host>");} surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates);
YY_BREAK
case 215:
+/* rule 215 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate);
+ YY_BREAK
+case 216:
+/* rule 216 can match eol */
+YY_RULE_SETUP
+if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in <surfxml_host>");} surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate);
+ YY_BREAK
+case 217:
YY_RULE_SETUP
{
if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 220:
-/* rule 220 can match eol */
+case 222:
+/* rule 222 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</host>' expected.",surf_parse_text);
YY_BREAK
-case 221:
+case 223:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</host>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host>' expected.");
YY_BREAK
-case 222:
-/* rule 222 can match eol */
+case 224:
+/* rule 224 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <gpu> is not allowed here.");
YY_BREAK
-case 223:
-/* rule 223 can match eol */
+case 225:
+/* rule 225 can match eol */
YY_RULE_SETUP
{
AX_surfxml_gpu_name = 0;
}
YY_BREAK
-case 224:
-/* rule 224 can match eol */
+case 226:
+/* rule 226 can match eol */
YY_RULE_SETUP
if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");} surfxml_gpu_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name);
YY_BREAK
-case 225:
-/* rule 225 can match eol */
+case 227:
+/* rule 227 can match eol */
YY_RULE_SETUP
if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in <surfxml_gpu>");} surfxml_gpu_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name);
YY_BREAK
-case 226:
+case 228:
YY_RULE_SETUP
{
if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
LEAVE; STag_surfxml_gpu();surfxml_pcdata_ix = 0; ENTER(E_surfxml_gpu);
}
YY_BREAK
-case 227:
+case 229:
YY_RULE_SETUP
{
if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element.");
}
}
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
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;
}
}
YY_BREAK
-case 231:
-/* rule 231 can match eol */
+case 233:
+/* rule 233 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</gpu>' expected.",surf_parse_text);
YY_BREAK
-case 232:
+case 234:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</gpu>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</gpu>' expected.");
YY_BREAK
-case 233:
-/* rule 233 can match eol */
+case 235:
+/* rule 235 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <host_link> is not allowed here.");
YY_BREAK
-case 234:
-/* rule 234 can match eol */
+case 236:
+/* rule 236 can match eol */
YY_RULE_SETUP
{
AX_surfxml_host___link_id = 0;
}
YY_BREAK
-case 235:
-/* rule 235 can match eol */
+case 237:
+/* rule 237 can match eol */
YY_RULE_SETUP
if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id);
YY_BREAK
-case 236:
-/* rule 236 can match eol */
+case 238:
+/* rule 238 can match eol */
YY_RULE_SETUP
if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_host___link>");} surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id);
YY_BREAK
-case 237:
-/* rule 237 can match eol */
+case 239:
+/* rule 239 can match eol */
YY_RULE_SETUP
if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up);
YY_BREAK
-case 238:
-/* rule 238 can match eol */
+case 240:
+/* rule 240 can match eol */
YY_RULE_SETUP
if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in <surfxml_host___link>");} surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up);
YY_BREAK
-case 239:
-/* rule 239 can match eol */
+case 241:
+/* rule 241 can match eol */
YY_RULE_SETUP
if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down);
YY_BREAK
-case 240:
-/* rule 240 can match eol */
+case 242:
+/* rule 242 can match eol */
YY_RULE_SETUP
if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in <surfxml_host___link>");} surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down);
YY_BREAK
-case 241:
+case 243:
YY_RULE_SETUP
{
if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 246:
-/* rule 246 can match eol */
+case 248:
+/* rule 248 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</host_link>' expected.",surf_parse_text);
YY_BREAK
-case 247:
+case 249:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</host_link>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</host_link>' expected.");
YY_BREAK
-case 248:
-/* rule 248 can match eol */
+case 250:
+/* rule 250 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <cluster> is not allowed here.");
YY_BREAK
-case 249:
-/* rule 249 can match eol */
+case 251:
+/* rule 251 can match eol */
YY_RULE_SETUP
{
AX_surfxml_cluster_id = 0;
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;
}
YY_BREAK
-case 250:
-/* rule 250 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
- YY_BREAK
-case 251:
-/* rule 251 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
- YY_BREAK
case 252:
/* rule 252 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
+if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id);
YY_BREAK
case 253:
/* rule 253 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
+if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cluster>");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id);
YY_BREAK
case 254:
/* rule 254 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
+if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix);
YY_BREAK
case 255:
/* rule 255 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
+if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cluster>");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix);
YY_BREAK
case 256:
/* rule 256 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
+if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix);
YY_BREAK
case 257:
/* rule 257 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
+if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cluster>");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix);
YY_BREAK
case 258:
/* rule 258 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
+if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical);
YY_BREAK
case 259:
/* rule 259 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
+if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cluster>");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical);
YY_BREAK
case 260:
/* rule 260 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
+if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power);
YY_BREAK
case 261:
/* rule 261 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
+if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cluster>");} surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power);
YY_BREAK
case 262:
/* rule 262 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
+if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core);
YY_BREAK
case 263:
/* rule 263 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
+if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in <surfxml_cluster>");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core);
YY_BREAK
case 264:
/* rule 264 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw);
YY_BREAK
case 265:
/* rule 265 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
+if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cluster>");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw);
YY_BREAK
case 266:
/* rule 266 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat);
+ YY_BREAK
case 267:
/* rule 267 can match eol */
YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
+if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cluster>");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat);
YY_BREAK
case 268:
/* rule 268 can match eol */
case 269:
/* rule 269 can match eol */
YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED;
YY_BREAK
case 270:
/* rule 270 can match eol */
case 271:
/* rule 271 can match eol */
YY_RULE_SETUP
-A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX;
YY_BREAK
case 272:
/* rule 272 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
- YY_BREAK
case 273:
/* rule 273 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
+A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE;
YY_BREAK
case 274:
/* rule 274 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
- YY_BREAK
case 275:
/* rule 275 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT;
YY_BREAK
case 276:
/* rule 276 can match eol */
case 277:
/* rule 277 can match eol */
YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
+A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS;
YY_BREAK
case 278:
/* rule 278 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters);
+ YY_BREAK
case 279:
/* rule 279 can match eol */
YY_RULE_SETUP
-A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
+if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in <surfxml_cluster>");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters);
YY_BREAK
case 280:
/* rule 280 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file);
+if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw);
YY_BREAK
case 281:
/* rule 281 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file);
+if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in <surfxml_cluster>");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw);
YY_BREAK
case 282:
/* rule 282 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file);
+if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat);
YY_BREAK
case 283:
/* rule 283 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file);
+if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in <surfxml_cluster>");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat);
YY_BREAK
case 284:
/* rule 284 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
- YY_BREAK
case 285:
/* rule 285 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED;
YY_BREAK
case 286:
/* rule 286 can match eol */
-YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
- YY_BREAK
case 287:
/* rule 287 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
+A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE;
YY_BREAK
case 288:
/* rule 288 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file);
YY_BREAK
case 289:
/* rule 289 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_cluster>");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file);
YY_BREAK
case 290:
/* rule 290 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file);
YY_BREAK
case 291:
/* rule 291 can match eol */
YY_RULE_SETUP
-if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_cluster>");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file);
YY_BREAK
case 292:
+/* rule 292 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id);
+ YY_BREAK
+case 293:
+/* rule 293 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in <surfxml_cluster>");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id);
+ YY_BREAK
+case 294:
+/* rule 294 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link);
+ YY_BREAK
+case 295:
+/* rule 295 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in <surfxml_cluster>");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link);
+ YY_BREAK
+case 296:
+/* rule 296 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+ YY_BREAK
+case 297:
+/* rule 297 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in <surfxml_cluster>");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw);
+ YY_BREAK
+case 298:
+/* rule 298 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+ YY_BREAK
+case 299:
+/* rule 299 can match eol */
+YY_RULE_SETUP
+if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in <surfxml_cluster>");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat);
+ YY_BREAK
+case 300:
YY_RULE_SETUP
{
if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 297:
-/* rule 297 can match eol */
+case 305:
+/* rule 305 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</cluster>' expected.",surf_parse_text);
YY_BREAK
-case 298:
+case 306:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</cluster>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cluster>' expected.");
YY_BREAK
-case 299:
-/* rule 299 can match eol */
+case 307:
+/* rule 307 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <cabinet> is not allowed here.");
YY_BREAK
-case 300:
-/* rule 300 can match eol */
+case 308:
+/* rule 308 can match eol */
YY_RULE_SETUP
{
AX_surfxml_cabinet_id = 0;
}
YY_BREAK
-case 301:
-/* rule 301 can match eol */
+case 309:
+/* rule 309 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id);
YY_BREAK
-case 302:
-/* rule 302 can match eol */
+case 310:
+/* rule 310 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_cabinet>");} surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id);
YY_BREAK
-case 303:
-/* rule 303 can match eol */
+case 311:
+/* rule 311 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix);
YY_BREAK
-case 304:
-/* rule 304 can match eol */
+case 312:
+/* rule 312 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in <surfxml_cabinet>");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix);
YY_BREAK
-case 305:
-/* rule 305 can match eol */
+case 313:
+/* rule 313 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix);
YY_BREAK
-case 306:
-/* rule 306 can match eol */
+case 314:
+/* rule 314 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in <surfxml_cabinet>");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix);
YY_BREAK
-case 307:
-/* rule 307 can match eol */
+case 315:
+/* rule 315 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical);
YY_BREAK
-case 308:
-/* rule 308 can match eol */
+case 316:
+/* rule 316 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in <surfxml_cabinet>");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical);
YY_BREAK
-case 309:
-/* rule 309 can match eol */
+case 317:
+/* rule 317 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power);
YY_BREAK
-case 310:
-/* rule 310 can match eol */
+case 318:
+/* rule 318 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_cabinet>");} surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power);
YY_BREAK
-case 311:
-/* rule 311 can match eol */
+case 319:
+/* rule 319 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw);
YY_BREAK
-case 312:
-/* rule 312 can match eol */
+case 320:
+/* rule 320 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in <surfxml_cabinet>");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw);
YY_BREAK
-case 313:
-/* rule 313 can match eol */
+case 321:
+/* rule 321 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat);
YY_BREAK
-case 314:
-/* rule 314 can match eol */
+case 322:
+/* rule 322 can match eol */
YY_RULE_SETUP
if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_cabinet>");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat);
YY_BREAK
-case 315:
+case 323:
YY_RULE_SETUP
{
if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 320:
-/* rule 320 can match eol */
+case 328:
+/* rule 328 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</cabinet>' expected.",surf_parse_text);
YY_BREAK
-case 321:
+case 329:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</cabinet>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</cabinet>' expected.");
YY_BREAK
-case 322:
-/* rule 322 can match eol */
+case 330:
+/* rule 330 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <peer> is not allowed here.");
YY_BREAK
-case 323:
-/* rule 323 can match eol */
+case 331:
+/* rule 331 can match eol */
YY_RULE_SETUP
{
AX_surfxml_peer_id = 0;
}
YY_BREAK
-case 324:
-/* rule 324 can match eol */
+case 332:
+/* rule 332 can match eol */
YY_RULE_SETUP
if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id);
YY_BREAK
-case 325:
-/* rule 325 can match eol */
+case 333:
+/* rule 333 can match eol */
YY_RULE_SETUP
if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_peer>");} surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id);
YY_BREAK
-case 326:
-/* rule 326 can match eol */
+case 334:
+/* rule 334 can match eol */
YY_RULE_SETUP
if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power);
YY_BREAK
-case 327:
-/* rule 327 can match eol */
+case 335:
+/* rule 335 can match eol */
YY_RULE_SETUP
if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in <surfxml_peer>");} surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power);
YY_BREAK
-case 328:
-/* rule 328 can match eol */
+case 336:
+/* rule 336 can match eol */
YY_RULE_SETUP
if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in);
YY_BREAK
-case 329:
-/* rule 329 can match eol */
+case 337:
+/* rule 337 can match eol */
YY_RULE_SETUP
if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in <surfxml_peer>");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in);
YY_BREAK
-case 330:
-/* rule 330 can match eol */
+case 338:
+/* rule 338 can match eol */
YY_RULE_SETUP
if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out);
YY_BREAK
-case 331:
-/* rule 331 can match eol */
+case 339:
+/* rule 339 can match eol */
YY_RULE_SETUP
if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in <surfxml_peer>");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out);
YY_BREAK
-case 332:
-/* rule 332 can match eol */
+case 340:
+/* rule 340 can match eol */
YY_RULE_SETUP
if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat);
YY_BREAK
-case 333:
-/* rule 333 can match eol */
+case 341:
+/* rule 341 can match eol */
YY_RULE_SETUP
if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in <surfxml_peer>");} surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat);
YY_BREAK
-case 334:
-/* rule 334 can match eol */
+case 342:
+/* rule 342 can match eol */
YY_RULE_SETUP
if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates);
YY_BREAK
-case 335:
-/* rule 335 can match eol */
+case 343:
+/* rule 343 can match eol */
YY_RULE_SETUP
if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_peer>");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates);
YY_BREAK
-case 336:
-/* rule 336 can match eol */
+case 344:
+/* rule 344 can match eol */
YY_RULE_SETUP
if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file);
YY_BREAK
-case 337:
-/* rule 337 can match eol */
+case 345:
+/* rule 345 can match eol */
YY_RULE_SETUP
if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in <surfxml_peer>");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file);
YY_BREAK
-case 338:
-/* rule 338 can match eol */
+case 346:
+/* rule 346 can match eol */
YY_RULE_SETUP
if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file);
YY_BREAK
-case 339:
-/* rule 339 can match eol */
+case 347:
+/* rule 347 can match eol */
YY_RULE_SETUP
if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_peer>");} surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file);
YY_BREAK
-case 340:
+case 348:
YY_RULE_SETUP
{
if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 345:
-/* rule 345 can match eol */
+case 353:
+/* rule 353 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</peer>' expected.",surf_parse_text);
YY_BREAK
-case 346:
+case 354:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</peer>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</peer>' expected.");
YY_BREAK
-case 347:
-/* rule 347 can match eol */
+case 355:
+/* rule 355 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <router> is not allowed here.");
YY_BREAK
-case 348:
-/* rule 348 can match eol */
+case 356:
+/* rule 356 can match eol */
YY_RULE_SETUP
{
AX_surfxml_router_id = 0;
}
YY_BREAK
-case 349:
-/* rule 349 can match eol */
+case 357:
+/* rule 357 can match eol */
YY_RULE_SETUP
if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id);
YY_BREAK
-case 350:
-/* rule 350 can match eol */
+case 358:
+/* rule 358 can match eol */
YY_RULE_SETUP
if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_router>");} surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id);
YY_BREAK
-case 351:
-/* rule 351 can match eol */
+case 359:
+/* rule 359 can match eol */
YY_RULE_SETUP
if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates);
YY_BREAK
-case 352:
-/* rule 352 can match eol */
+case 360:
+/* rule 360 can match eol */
YY_RULE_SETUP
if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in <surfxml_router>");} surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates);
YY_BREAK
-case 353:
+case 361:
YY_RULE_SETUP
{
if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router);
}
YY_BREAK
-case 354:
+case 362:
YY_RULE_SETUP
{
if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element.");
}
}
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
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;
}
}
YY_BREAK
-case 358:
-/* rule 358 can match eol */
+case 366:
+/* rule 366 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</router>' expected.",surf_parse_text);
YY_BREAK
-case 359:
+case 367:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</router>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</router>' expected.");
YY_BREAK
-case 360:
-/* rule 360 can match eol */
+case 368:
+/* rule 368 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <backbone> is not allowed here.");
YY_BREAK
-case 361:
-/* rule 361 can match eol */
+case 369:
+/* rule 369 can match eol */
YY_RULE_SETUP
{
AX_surfxml_backbone_id = 0;
}
YY_BREAK
-case 362:
-/* rule 362 can match eol */
+case 370:
+/* rule 370 can match eol */
YY_RULE_SETUP
if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id);
YY_BREAK
-case 363:
-/* rule 363 can match eol */
+case 371:
+/* rule 371 can match eol */
YY_RULE_SETUP
if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_backbone>");} surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id);
YY_BREAK
-case 364:
-/* rule 364 can match eol */
+case 372:
+/* rule 372 can match eol */
YY_RULE_SETUP
if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth);
YY_BREAK
-case 365:
-/* rule 365 can match eol */
+case 373:
+/* rule 373 can match eol */
YY_RULE_SETUP
if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_backbone>");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth);
YY_BREAK
-case 366:
-/* rule 366 can match eol */
+case 374:
+/* rule 374 can match eol */
YY_RULE_SETUP
if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency);
YY_BREAK
-case 367:
-/* rule 367 can match eol */
+case 375:
+/* rule 375 can match eol */
YY_RULE_SETUP
if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_backbone>");} surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency);
YY_BREAK
-case 368:
+case 376:
YY_RULE_SETUP
{
if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 373:
-/* rule 373 can match eol */
+case 381:
+/* rule 381 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</backbone>' expected.",surf_parse_text);
YY_BREAK
-case 374:
+case 382:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</backbone>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</backbone>' expected.");
YY_BREAK
-case 375:
-/* rule 375 can match eol */
+case 383:
+/* rule 383 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <link> is not allowed here.");
YY_BREAK
-case 376:
-/* rule 376 can match eol */
+case 384:
+/* rule 384 can match eol */
YY_RULE_SETUP
{
AX_surfxml_link_id = 0;
}
YY_BREAK
-case 377:
-/* rule 377 can match eol */
+case 385:
+/* rule 385 can match eol */
YY_RULE_SETUP
if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id);
YY_BREAK
-case 378:
-/* rule 378 can match eol */
+case 386:
+/* rule 386 can match eol */
YY_RULE_SETUP
if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link>");} surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id);
YY_BREAK
-case 379:
-/* rule 379 can match eol */
+case 387:
+/* rule 387 can match eol */
YY_RULE_SETUP
if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth);
YY_BREAK
-case 380:
-/* rule 380 can match eol */
+case 388:
+/* rule 388 can match eol */
YY_RULE_SETUP
if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in <surfxml_link>");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth);
YY_BREAK
-case 381:
-/* rule 381 can match eol */
+case 389:
+/* rule 389 can match eol */
YY_RULE_SETUP
if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file);
YY_BREAK
-case 382:
-/* rule 382 can match eol */
+case 390:
+/* rule 390 can match eol */
YY_RULE_SETUP
if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in <surfxml_link>");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file);
YY_BREAK
-case 383:
-/* rule 383 can match eol */
+case 391:
+/* rule 391 can match eol */
YY_RULE_SETUP
if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency);
YY_BREAK
-case 384:
-/* rule 384 can match eol */
+case 392:
+/* rule 392 can match eol */
YY_RULE_SETUP
if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in <surfxml_link>");} surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency);
YY_BREAK
-case 385:
-/* rule 385 can match eol */
+case 393:
+/* rule 393 can match eol */
YY_RULE_SETUP
if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file);
YY_BREAK
-case 386:
-/* rule 386 can match eol */
+case 394:
+/* rule 394 can match eol */
YY_RULE_SETUP
if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in <surfxml_link>");} surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file);
YY_BREAK
-case 387:
-/* rule 387 can match eol */
-case 388:
-/* rule 388 can match eol */
+case 395:
+/* rule 395 can match eol */
+case 396:
+/* rule 396 can match eol */
YY_RULE_SETUP
A_surfxml_link_state = A_surfxml_link_state_ON;
YY_BREAK
-case 389:
-/* rule 389 can match eol */
-case 390:
-/* rule 390 can match eol */
+case 397:
+/* rule 397 can match eol */
+case 398:
+/* rule 398 can match eol */
YY_RULE_SETUP
A_surfxml_link_state = A_surfxml_link_state_OFF;
YY_BREAK
-case 391:
-/* rule 391 can match eol */
+case 399:
+/* rule 399 can match eol */
YY_RULE_SETUP
if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file);
YY_BREAK
-case 392:
-/* rule 392 can match eol */
+case 400:
+/* rule 400 can match eol */
YY_RULE_SETUP
if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in <surfxml_link>");} surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file);
YY_BREAK
-case 393:
-/* rule 393 can match eol */
-case 394:
-/* rule 394 can match eol */
+case 401:
+/* rule 401 can match eol */
+case 402:
+/* rule 402 can match eol */
YY_RULE_SETUP
A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED;
YY_BREAK
-case 395:
-/* rule 395 can match eol */
-case 396:
-/* rule 396 can match eol */
+case 403:
+/* rule 403 can match eol */
+case 404:
+/* rule 404 can match eol */
YY_RULE_SETUP
A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE;
YY_BREAK
-case 397:
-/* rule 397 can match eol */
-case 398:
-/* rule 398 can match eol */
+case 405:
+/* rule 405 can match eol */
+case 406:
+/* rule 406 can match eol */
YY_RULE_SETUP
A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX;
YY_BREAK
-case 399:
+case 407:
YY_RULE_SETUP
{
if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 404:
-/* rule 404 can match eol */
+case 412:
+/* rule 412 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</link>' expected.",surf_parse_text);
YY_BREAK
-case 405:
+case 413:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</link>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link>' expected.");
YY_BREAK
-case 406:
-/* rule 406 can match eol */
+case 414:
+/* rule 414 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <route> is not allowed here.");
YY_BREAK
-case 407:
-/* rule 407 can match eol */
+case 415:
+/* rule 415 can match eol */
YY_RULE_SETUP
{
AX_surfxml_route_src = 0;
}
YY_BREAK
-case 408:
-/* rule 408 can match eol */
+case 416:
+/* rule 416 can match eol */
YY_RULE_SETUP
if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src);
YY_BREAK
-case 409:
-/* rule 409 can match eol */
+case 417:
+/* rule 417 can match eol */
YY_RULE_SETUP
if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_route>");} surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src);
YY_BREAK
-case 410:
-/* rule 410 can match eol */
+case 418:
+/* rule 418 can match eol */
YY_RULE_SETUP
if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst);
YY_BREAK
-case 411:
-/* rule 411 can match eol */
+case 419:
+/* rule 419 can match eol */
YY_RULE_SETUP
if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_route>");} surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst);
YY_BREAK
-case 412:
-/* rule 412 can match eol */
-case 413:
-/* rule 413 can match eol */
+case 420:
+/* rule 420 can match eol */
+case 421:
+/* rule 421 can match eol */
YY_RULE_SETUP
A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES;
YY_BREAK
-case 414:
-/* rule 414 can match eol */
-case 415:
-/* rule 415 can match eol */
+case 422:
+/* rule 422 can match eol */
+case 423:
+/* rule 423 can match eol */
YY_RULE_SETUP
A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO;
YY_BREAK
-case 416:
+case 424:
YY_RULE_SETUP
{
if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 421:
-/* rule 421 can match eol */
+case 429:
+/* rule 429 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</route>' expected.",surf_parse_text);
YY_BREAK
-case 422:
+case 430:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</route>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</route>' expected.");
YY_BREAK
-case 423:
-/* rule 423 can match eol */
+case 431:
+/* rule 431 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <ASroute> is not allowed here.");
YY_BREAK
-case 424:
-/* rule 424 can match eol */
+case 432:
+/* rule 432 can match eol */
YY_RULE_SETUP
{
AX_surfxml_ASroute_src = 0;
}
YY_BREAK
-case 425:
-/* rule 425 can match eol */
+case 433:
+/* rule 433 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src);
YY_BREAK
-case 426:
-/* rule 426 can match eol */
+case 434:
+/* rule 434 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_ASroute>");} surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src);
YY_BREAK
-case 427:
-/* rule 427 can match eol */
+case 435:
+/* rule 435 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst);
YY_BREAK
-case 428:
-/* rule 428 can match eol */
+case 436:
+/* rule 436 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_ASroute>");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst);
YY_BREAK
-case 429:
-/* rule 429 can match eol */
+case 437:
+/* rule 437 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src);
YY_BREAK
-case 430:
-/* rule 430 can match eol */
+case 438:
+/* rule 438 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_ASroute>");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src);
YY_BREAK
-case 431:
-/* rule 431 can match eol */
+case 439:
+/* rule 439 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst);
YY_BREAK
-case 432:
-/* rule 432 can match eol */
+case 440:
+/* rule 440 can match eol */
YY_RULE_SETUP
if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_ASroute>");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst);
YY_BREAK
-case 433:
-/* rule 433 can match eol */
-case 434:
-/* rule 434 can match eol */
+case 441:
+/* rule 441 can match eol */
+case 442:
+/* rule 442 can match eol */
YY_RULE_SETUP
A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES;
YY_BREAK
-case 435:
-/* rule 435 can match eol */
-case 436:
-/* rule 436 can match eol */
+case 443:
+/* rule 443 can match eol */
+case 444:
+/* rule 444 can match eol */
YY_RULE_SETUP
A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO;
YY_BREAK
-case 437:
+case 445:
YY_RULE_SETUP
{
if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 442:
-/* rule 442 can match eol */
+case 450:
+/* rule 450 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</ASroute>' expected.",surf_parse_text);
YY_BREAK
-case 443:
+case 451:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</ASroute>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</ASroute>' expected.");
YY_BREAK
-case 444:
-/* rule 444 can match eol */
+case 452:
+/* rule 452 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <link_ctn> is not allowed here.");
YY_BREAK
-case 445:
-/* rule 445 can match eol */
+case 453:
+/* rule 453 can match eol */
YY_RULE_SETUP
{
AX_surfxml_link___ctn_id = 0;
}
YY_BREAK
-case 446:
-/* rule 446 can match eol */
+case 454:
+/* rule 454 can match eol */
YY_RULE_SETUP
if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id);
YY_BREAK
-case 447:
-/* rule 447 can match eol */
+case 455:
+/* rule 455 can match eol */
YY_RULE_SETUP
if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_link___ctn>");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id);
YY_BREAK
-case 448:
-/* rule 448 can match eol */
-case 449:
-/* rule 449 can match eol */
+case 456:
+/* rule 456 can match eol */
+case 457:
+/* rule 457 can match eol */
YY_RULE_SETUP
A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP;
YY_BREAK
-case 450:
-/* rule 450 can match eol */
-case 451:
-/* rule 451 can match eol */
+case 458:
+/* rule 458 can match eol */
+case 459:
+/* rule 459 can match eol */
YY_RULE_SETUP
A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN;
YY_BREAK
-case 452:
-/* rule 452 can match eol */
-case 453:
-/* rule 453 can match eol */
+case 460:
+/* rule 460 can match eol */
+case 461:
+/* rule 461 can match eol */
YY_RULE_SETUP
A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE;
YY_BREAK
-case 454:
+case 462:
YY_RULE_SETUP
{
if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn);
}
YY_BREAK
-case 455:
+case 463:
YY_RULE_SETUP
{
if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element.");
}
}
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
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;
}
}
YY_BREAK
-case 459:
-/* rule 459 can match eol */
+case 467:
+/* rule 467 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</link_ctn>' expected.",surf_parse_text);
YY_BREAK
-case 460:
+case 468:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</link_ctn>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</link_ctn>' expected.");
YY_BREAK
-case 461:
-/* rule 461 can match eol */
+case 469:
+/* rule 469 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <bypassRoute> is not allowed here.");
YY_BREAK
-case 462:
-/* rule 462 can match eol */
+case 470:
+/* rule 470 can match eol */
YY_RULE_SETUP
{
AX_surfxml_bypassRoute_src = 0;
}
YY_BREAK
-case 463:
-/* rule 463 can match eol */
+case 471:
+/* rule 471 can match eol */
YY_RULE_SETUP
if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src);
YY_BREAK
-case 464:
-/* rule 464 can match eol */
+case 472:
+/* rule 472 can match eol */
YY_RULE_SETUP
if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassRoute>");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src);
YY_BREAK
-case 465:
-/* rule 465 can match eol */
+case 473:
+/* rule 473 can match eol */
YY_RULE_SETUP
if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst);
YY_BREAK
-case 466:
-/* rule 466 can match eol */
+case 474:
+/* rule 474 can match eol */
YY_RULE_SETUP
if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassRoute>");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst);
YY_BREAK
-case 467:
+case 475:
YY_RULE_SETUP
{
if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 472:
-/* rule 472 can match eol */
+case 480:
+/* rule 480 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</bypassRoute>' expected.",surf_parse_text);
YY_BREAK
-case 473:
+case 481:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</bypassRoute>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassRoute>' expected.");
YY_BREAK
-case 474:
-/* rule 474 can match eol */
+case 482:
+/* rule 482 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <bypassASroute> is not allowed here.");
YY_BREAK
-case 475:
-/* rule 475 can match eol */
+case 483:
+/* rule 483 can match eol */
YY_RULE_SETUP
{
AX_surfxml_bypassASroute_src = 0;
}
YY_BREAK
-case 476:
-/* rule 476 can match eol */
+case 484:
+/* rule 484 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src);
YY_BREAK
-case 477:
-/* rule 477 can match eol */
+case 485:
+/* rule 485 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in <surfxml_bypassASroute>");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src);
YY_BREAK
-case 478:
-/* rule 478 can match eol */
+case 486:
+/* rule 486 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst);
YY_BREAK
-case 479:
-/* rule 479 can match eol */
+case 487:
+/* rule 487 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst);
YY_BREAK
-case 480:
-/* rule 480 can match eol */
+case 488:
+/* rule 488 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
YY_BREAK
-case 481:
-/* rule 481 can match eol */
+case 489:
+/* rule 489 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src);
YY_BREAK
-case 482:
-/* rule 482 can match eol */
+case 490:
+/* rule 490 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
YY_BREAK
-case 483:
-/* rule 483 can match eol */
+case 491:
+/* rule 491 can match eol */
YY_RULE_SETUP
if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in <surfxml_bypassASroute>");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst);
YY_BREAK
-case 484:
+case 492:
YY_RULE_SETUP
{
if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 489:
-/* rule 489 can match eol */
+case 497:
+/* rule 497 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</bypassASroute>' expected.",surf_parse_text);
YY_BREAK
-case 490:
+case 498:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</bypassASroute>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</bypassASroute>' expected.");
YY_BREAK
-case 491:
-/* rule 491 can match eol */
+case 499:
+/* rule 499 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <process> is not allowed here.");
YY_BREAK
-case 492:
-/* rule 492 can match eol */
+case 500:
+/* rule 500 can match eol */
YY_RULE_SETUP
{
AX_surfxml_process_host = 0;
}
YY_BREAK
-case 493:
-/* rule 493 can match eol */
+case 501:
+/* rule 501 can match eol */
YY_RULE_SETUP
if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host);
YY_BREAK
-case 494:
-/* rule 494 can match eol */
+case 502:
+/* rule 502 can match eol */
YY_RULE_SETUP
if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in <surfxml_process>");} surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host);
YY_BREAK
-case 495:
-/* rule 495 can match eol */
+case 503:
+/* rule 503 can match eol */
YY_RULE_SETUP
if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function);
YY_BREAK
-case 496:
-/* rule 496 can match eol */
+case 504:
+/* rule 504 can match eol */
YY_RULE_SETUP
if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in <surfxml_process>");} surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function);
YY_BREAK
-case 497:
-/* rule 497 can match eol */
+case 505:
+/* rule 505 can match eol */
YY_RULE_SETUP
if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time);
YY_BREAK
-case 498:
-/* rule 498 can match eol */
+case 506:
+/* rule 506 can match eol */
YY_RULE_SETUP
if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in <surfxml_process>");} surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time);
YY_BREAK
-case 499:
-/* rule 499 can match eol */
+case 507:
+/* rule 507 can match eol */
YY_RULE_SETUP
if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time);
YY_BREAK
-case 500:
-/* rule 500 can match eol */
+case 508:
+/* rule 508 can match eol */
YY_RULE_SETUP
if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in <surfxml_process>");} surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time);
YY_BREAK
-case 501:
-/* rule 501 can match eol */
-case 502:
-/* rule 502 can match eol */
+case 509:
+/* rule 509 can match eol */
+case 510:
+/* rule 510 can match eol */
YY_RULE_SETUP
A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE;
YY_BREAK
-case 503:
-/* rule 503 can match eol */
-case 504:
-/* rule 504 can match eol */
+case 511:
+/* rule 511 can match eol */
+case 512:
+/* rule 512 can match eol */
YY_RULE_SETUP
A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART;
YY_BREAK
-case 505:
+case 513:
YY_RULE_SETUP
{
if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 510:
-/* rule 510 can match eol */
+case 518:
+/* rule 518 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</process>' expected.",surf_parse_text);
YY_BREAK
-case 511:
+case 519:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</process>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</process>' expected.");
YY_BREAK
-case 512:
-/* rule 512 can match eol */
+case 520:
+/* rule 520 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <argument> is not allowed here.");
YY_BREAK
-case 513:
-/* rule 513 can match eol */
+case 521:
+/* rule 521 can match eol */
YY_RULE_SETUP
{
AX_surfxml_argument_value = 0;
}
YY_BREAK
-case 514:
-/* rule 514 can match eol */
+case 522:
+/* rule 522 can match eol */
YY_RULE_SETUP
if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value);
YY_BREAK
-case 515:
-/* rule 515 can match eol */
+case 523:
+/* rule 523 can match eol */
YY_RULE_SETUP
if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_argument>");} surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value);
YY_BREAK
-case 516:
+case 524:
YY_RULE_SETUP
{
if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument);
}
YY_BREAK
-case 517:
+case 525:
YY_RULE_SETUP
{
if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element.");
}
}
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
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;
}
}
YY_BREAK
-case 521:
-/* rule 521 can match eol */
+case 529:
+/* rule 529 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</argument>' expected.",surf_parse_text);
YY_BREAK
-case 522:
+case 530:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</argument>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</argument>' expected.");
YY_BREAK
-case 523:
-/* rule 523 can match eol */
+case 531:
+/* rule 531 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <config> is not allowed here.");
YY_BREAK
-case 524:
-/* rule 524 can match eol */
+case 532:
+/* rule 532 can match eol */
YY_RULE_SETUP
{
AX_surfxml_config_id = 0;
}
YY_BREAK
-case 525:
-/* rule 525 can match eol */
+case 533:
+/* rule 533 can match eol */
YY_RULE_SETUP
if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id);
YY_BREAK
-case 526:
-/* rule 526 can match eol */
+case 534:
+/* rule 534 can match eol */
YY_RULE_SETUP
if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_config>");} surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id);
YY_BREAK
-case 527:
+case 535:
YY_RULE_SETUP
{
LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config);
}
YY_BREAK
-case 528:
+case 536:
YY_RULE_SETUP
{
LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */
}
}
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
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;
}
}
YY_BREAK
-case 532:
-/* rule 532 can match eol */
+case 540:
+/* rule 540 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</config>' expected.",surf_parse_text);
YY_BREAK
-case 533:
+case 541:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</config>' expected.",surf_parse_text[0]);
YY_BREAK
/* <!-- <!ATTLIST prop key CDATA #REQUIRED> -->
* <!-- <!ATTLIST prop key CDATA #REQUIRED> --> */
-case 534:
-/* rule 534 can match eol */
+case 542:
+/* rule 542 can match eol */
YY_RULE_SETUP
FAIL("Starting tag <prop> is not allowed here.");
YY_BREAK
-case 535:
-/* rule 535 can match eol */
+case 543:
+/* rule 543 can match eol */
YY_RULE_SETUP
{
AX_surfxml_prop_id = 0;
}
YY_BREAK
-case 536:
-/* rule 536 can match eol */
+case 544:
+/* rule 544 can match eol */
YY_RULE_SETUP
if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id);
YY_BREAK
-case 537:
-/* rule 537 can match eol */
+case 545:
+/* rule 545 can match eol */
YY_RULE_SETUP
if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_prop>");} surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id);
YY_BREAK
-case 538:
-/* rule 538 can match eol */
+case 546:
+/* rule 546 can match eol */
YY_RULE_SETUP
if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value);
YY_BREAK
-case 539:
-/* rule 539 can match eol */
+case 547:
+/* rule 547 can match eol */
YY_RULE_SETUP
if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_prop>");} surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value);
YY_BREAK
-case 540:
+case 548:
YY_RULE_SETUP
{
if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element.");
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.");
}
}
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
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;
}
}
YY_BREAK
-case 545:
-/* rule 545 can match eol */
+case 553:
+/* rule 553 can match eol */
YY_RULE_SETUP
FAIL("Unexpected end-tag `%s': `</prop>' expected.",surf_parse_text);
YY_BREAK
-case 546:
+case 554:
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</prop>' expected.",surf_parse_text[0]);
YY_BREAK
if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</prop>' expected.");
YY_BREAK
+/* <!-- <!ATTLIST model_prop key CDATA #REQUIRED> -->
+ * <!-- <!ATTLIST model_prop key CDATA #REQUIRED> --> */
+case 555:
+/* rule 555 can match eol */
+YY_RULE_SETUP
+FAIL("Starting tag <model_prop> is not allowed here.");
+ YY_BREAK
+case 556:
+/* rule 556 can match eol */
+YY_RULE_SETUP
+{
+ AX_surfxml_model___prop_id = 0;
+ surfxml_model___prop_id_isset = 0;
+ AX_surfxml_model___prop_value = 0;
+ surfxml_model___prop_value_isset = 0;
+ ENTER(AL_surfxml_model___prop); pushbuffer(0);
+ }
+ YY_BREAK
+
+case 557:
+/* rule 557 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id);
+ YY_BREAK
+case 558:
+/* rule 558 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in <surfxml_model___prop>");} surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id);
+ YY_BREAK
+case 559:
+/* rule 559 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value);
+ YY_BREAK
+case 560:
+/* rule 560 can match eol */
+YY_RULE_SETUP
+if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in <surfxml_model___prop>");} surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value);
+ YY_BREAK
+case 561:
+YY_RULE_SETUP
+{
+ if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
+ if (!AX_surfxml_model___prop_value) FAIL("Required attribute `value' not set for `model_prop' element.");
+ LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop);
+ }
+ YY_BREAK
+case 562:
+YY_RULE_SETUP
+{
+ if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element.");
+ if (!AX_surfxml_model___prop_value) FAIL("Required attribute `value' not set for `model_prop' element.");
+ LEAVE; STag_surfxml_model___prop(); surfxml_pcdata_ix = 0; ETag_surfxml_model___prop(); popbuffer(); /* attribute */
+ switch (YY_START) {
+ case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
+ }
+ }
+ YY_BREAK
+case 563:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]);
+ YY_BREAK
+case 564:
+YY_RULE_SETUP
+FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text);
+ YY_BREAK
+case YY_STATE_EOF(AL_surfxml_model___prop):
+FAIL("EOF in attribute list of `model_prop' element.");
+ YY_BREAK
+
+case 565:
+/* rule 565 can match eol */
+YY_RULE_SETUP
+{
+ LEAVE;
+ ETag_surfxml_model___prop();
+ popbuffer(); /* attribute */
+ switch (YY_START) {
+ case S_surfxml_storage___type_1: case S_surfxml_storage___type: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break;
+ }
+ }
+ YY_BREAK
+case 566:
+/* rule 566 can match eol */
+YY_RULE_SETUP
+FAIL("Unexpected end-tag `%s': `</model_prop>' expected.",surf_parse_text);
+ YY_BREAK
+case 567:
+YY_RULE_SETUP
+FAIL("Unexpected character `%c': `</model_prop>' expected.",surf_parse_text[0]);
+ YY_BREAK
+case YY_STATE_EOF(E_surfxml_model___prop):
+if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `</model_prop>' expected.");
+ YY_BREAK
+
/* EPILOG: after the root element. */
-case 547:
+case 568:
YY_RULE_SETUP
{SET(PROLOG); yyless(0); CLEANUP; return -1;}
YY_BREAK
/* 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
FAIL("EOF in literal (\"'\" expected).");
YY_BREAK
-case 562:
+case 583:
YY_RULE_SETUP
BUFFERDONE; LEAVE;
YY_BREAK
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
/* 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
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];
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;
}
+++ /dev/null
-/* Copyright (c) 2004-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "xbt/ex.h"
-#include "xbt/dict.h"
-#include "portable.h"
-#include "surf_private.h"
-#include "storage_private.h"
-#include "surf/surf_resource.h"
-#include <inttypes.h>
-
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf,
- "Logging specific to the SURF storage module");
-
-xbt_lib_t storage_lib;
-int ROUTING_STORAGE_LEVEL; //Routing for storagelevel
-int ROUTING_STORAGE_HOST_LEVEL;
-int SURF_STORAGE_LEVEL;
-xbt_lib_t storage_type_lib;
-int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level
-
-xbt_dynar_t mount_list = NULL; /* temporary store of current mount storage */
-
-surf_model_t surf_storage_model = NULL;
-lmm_system_t storage_maxmin_system = NULL;
-static int storage_selective_update = 0;
-static xbt_swag_t
- storage_running_action_set_that_does_not_need_being_checked = NULL;
-
-static xbt_dynar_t storage_list;
-
-#define GENERIC_LMM_ACTION(action) action->generic_lmm_action
-#define GENERIC_ACTION(action) GENERIC_LMM_ACTION(action).generic_action
-
-static xbt_dict_t parse_storage_content(char *filename, sg_storage_size_t *used_size);
-static int storage_action_unref(surf_action_t action);
-static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state);
-static surf_action_t storage_action_execute (void *storage, sg_storage_size_t size, e_surf_action_storage_type_t type);
-
-static surf_action_t storage_action_ls(void *storage, const char* path)
-{
- surf_action_t action = storage_action_execute(storage,0, LS);
- action->ls_dict = NULL;
- xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free);
-
- char* key;
- sg_storage_size_t size = 0;
- xbt_dict_cursor_t cursor = NULL;
-
- xbt_dynar_t dyn = NULL;
- char* file = NULL;
-
- // for each file in the storage content
- xbt_dict_foreach(((storage_t)storage)->content,cursor,key,size){
- // Search if file start with the prefix 'path'
- if(xbt_str_start_with(key,path)){
- file = &key[strlen(path)];
-
- // Split file with '/'
- dyn = xbt_str_split(file,"/");
- file = xbt_dynar_get_as(dyn,0,char*);
-
- // file
- if(xbt_dynar_length(dyn) == 1){
- sg_storage_size_t *psize = xbt_new(sg_storage_size_t,1);
- *psize=size;
- xbt_dict_set(ls_dict,file,psize,NULL);
- }
- // Directory
- else
- {
- // if directory does not exist yet in the dictionary
- if(!xbt_dict_get_or_null(ls_dict,file))
- xbt_dict_set(ls_dict,file,NULL,NULL);
- }
- xbt_dynar_free(&dyn);
- }
- }
-
- action->ls_dict = ls_dict;
- return action;
-}
-
-static surf_action_t storage_action_open(void *storage, const char* mount,
- const char* path)
-{
- XBT_DEBUG("\tOpen file '%s'",path);
- xbt_dict_t content_dict = ((storage_t)storage)->content;
- sg_storage_size_t size, *psize;
- psize = (sg_storage_size_t*) xbt_dict_get_or_null(content_dict, path);
- if (psize)
- size = *psize;
- else {
- // if file does not exist create an empty file
- psize = xbt_new(sg_storage_size_t,1);
- size = 0;
- *psize = size;
- xbt_dict_set(content_dict,path,psize,NULL);
- XBT_DEBUG("File '%s' was not found, file created.",path);
- }
- surf_file_t file = xbt_new0(s_surf_file_t,1);
- file->name = xbt_strdup(path);
- file->size = size;
- file->mount = xbt_strdup(mount);
-
- surf_action_t action = storage_action_execute(storage,0, OPEN);
- action->file = (void *)file;
- return action;
-}
-
-static surf_action_t storage_action_close(void *storage, surf_file_t fd)
-{
- char *filename = fd->name;
- XBT_DEBUG("\tClose file '%s' size '%" PRIu64 "'", filename, fd->size);
- // unref write actions from storage
- surf_action_storage_t write_action;
- unsigned int i;
- xbt_dynar_foreach(((storage_t)storage)->write_actions,i,write_action) {
- if ((write_action->generic_lmm_action.generic_action.file) == fd) {
- xbt_dynar_cursor_rm(((storage_t)storage)->write_actions, &i);
- storage_action_unref((surf_action_t) write_action);
- }
- }
- free(fd->name);
- free(fd->mount);
- xbt_free(fd);
- surf_action_t action = storage_action_execute(storage,0, CLOSE);
- return action;
-}
-
-static surf_action_t storage_action_read(void *storage, surf_file_t fd, sg_storage_size_t size)
-{
- if(size > fd->size)
- size = fd->size;
- surf_action_t action = storage_action_execute(storage,size,READ);
- return action;
-}
-
-static surf_action_t storage_action_write(void *storage, surf_file_t fd, sg_storage_size_t size)
-{
- char *filename = fd->name;
- XBT_DEBUG("\tWrite file '%s' size '%" PRIu64 "/%" PRIu64 "'",
- filename, size, fd->size);
-
- surf_action_t action = storage_action_execute(storage,size,WRITE);
- action->file = fd;
-
- // If the storage is full
- if(((storage_t)storage)->used_size==((storage_t)storage)->size) {
- storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
- }
- return action;
-}
-
-static surf_action_t storage_action_execute (void *storage, sg_storage_size_t size, e_surf_action_storage_type_t type)
-{
- surf_action_storage_t action = NULL;
- storage_t STORAGE = storage;
-
- XBT_IN("(%s,%" PRIu64, surf_resource_name(STORAGE), size);
- action =
- surf_action_new(sizeof(s_surf_action_storage_t), size, surf_storage_model,
- STORAGE->state_current != SURF_RESOURCE_ON);
-
- // Save the storage on action
- action->storage = storage;
- GENERIC_LMM_ACTION(action).suspended = 0; /* Should be useless because of the
- calloc but it seems to help valgrind... */
-
- GENERIC_LMM_ACTION(action).variable =
- lmm_variable_new(storage_maxmin_system, action, 1.0, -1.0 , 3);
-
- // Must be less than the max bandwidth for all actions
- lmm_expand(storage_maxmin_system, STORAGE->constraint,
- GENERIC_LMM_ACTION(action).variable, 1.0);
-
- switch(type) {
- case OPEN:
- case CLOSE:
- case STAT:
- case LS:
- break;
- case READ:
- lmm_expand(storage_maxmin_system, STORAGE->constraint_read,
- GENERIC_LMM_ACTION(action).variable, 1.0);
- break;
- case WRITE:
- lmm_expand(storage_maxmin_system, STORAGE->constraint_write,
- GENERIC_LMM_ACTION(action).variable, 1.0);
- xbt_dynar_push(((storage_t)storage)->write_actions,&action);
- surf_action_ref((surf_action_t) action);
- break;
- }
- action->type = type;
- XBT_OUT();
- return (surf_action_t) action;
-}
-
-static xbt_dict_t storage_get_properties(const void *storage)
-{
- return surf_resource_properties(surf_storage_resource_priv(storage));
-}
-
-static xbt_dict_t storage_get_content(void *storage)
-{
- /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
- /*surf_action_t action = storage_action_execute(storage,0, LS);*/
-
- void *storage_resource = surf_storage_resource_priv(storage);
- xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL);
- xbt_dict_cursor_t cursor = NULL;
- char *file;
- sg_storage_size_t *psize;
-
- xbt_dict_foreach(((storage_t)storage_resource)->content, cursor, file, psize){
- xbt_dict_set(content_dict,file,psize,NULL);
- }
- return content_dict;
-}
-
-static sg_storage_size_t storage_get_size(void *storage){
- void *storage_resource = surf_storage_resource_priv(storage);
- return ((storage_t)storage_resource)->size;
-}
-
-static void* storage_create_resource(const char* id, const char* model,
- const char* type_id, const char* content_name, const char* content_type, xbt_dict_t properties){
- storage_t storage = NULL;
-
- xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)),
- "Storage '%s' declared several times in the platform file",
- id);
- storage = (storage_t) surf_resource_new(sizeof(s_storage_t),
- surf_storage_model, id, properties, NULL);
-
- storage->state_current = SURF_RESOURCE_ON;
- storage->used_size = 0;
- storage->size = 0;
- storage->write_actions = xbt_dynar_new(sizeof(char *),NULL);
-
- storage_type_t storage_type = xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
- double Bread =
- surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,"Bread"));
- double Bwrite =
- surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,"Bwrite"));
- double Bconnection =
- surf_parse_get_bandwidth(xbt_dict_get(storage_type->properties,
- "Bconnection"));
- XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%lu'",Bconnection,Bread,Bwrite,(unsigned long)storage_type->size);
- storage->constraint = lmm_constraint_new(storage_maxmin_system, storage, Bconnection);
- storage->constraint_read = lmm_constraint_new(storage_maxmin_system, storage, Bread);
- storage->constraint_write = lmm_constraint_new(storage_maxmin_system, storage, Bwrite);
- storage->content = parse_storage_content((char*)content_name,&(storage->used_size));
- storage->content_type = xbt_strdup(content_type);
- storage->size = storage_type->size;
- storage->type_id = xbt_strdup(type_id);
-
- xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, storage);
-
- XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' \n\t\tmodel '%s' \n\t\tproperties '%p'\n\t\tBread '%f'\n",
- id,
- model,
- type_id,
- storage_type->properties,
- Bread);
-
- if (!storage_list)
- storage_list = xbt_dynar_new(sizeof(char *),NULL);
- xbt_dynar_push(storage_list,&storage);
-
- return storage;
-}
-
-static void storage_finalize(void)
-{
- lmm_system_free(storage_maxmin_system);
- storage_maxmin_system = NULL;
-
- surf_model_exit(surf_storage_model);
- surf_storage_model = NULL;
-
- xbt_dynar_free(&storage_list);
-
- xbt_swag_free
- (storage_running_action_set_that_does_not_need_being_checked);
- storage_running_action_set_that_does_not_need_being_checked = NULL;
-}
-
-static void storage_update_actions_state(double now, double delta)
-{
- surf_action_storage_t action = NULL;
- surf_action_storage_t next_action = NULL;
- xbt_swag_t running_actions = surf_storage_model->states.running_action_set;
-
-
- xbt_swag_foreach_safe(action, next_action, running_actions) {
- if(action->type == WRITE)
- {
- // Update the disk usage
- // Update the file size
- // Update the storage content (with file size)
- double rate = lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable);
- /* Hack to avoid rounding differences between x86 and x86_64
- * (note that the next sizes are of type sg_storage_size_t). */
- long incr = delta * rate + MAXMIN_PRECISION;
- ((storage_t)(action->storage))->used_size += incr; // disk usage
- ((surf_action_t)action)->file->size += incr; // file size
-
- sg_storage_size_t *psize = xbt_new(sg_storage_size_t,1);
- *psize = ((surf_action_t)action)->file->size;
-
- xbt_dict_t content_dict = ((storage_t)(action->storage))->content;
- xbt_dict_set(content_dict,((surf_action_t)action)->file->name,psize,NULL);
- }
-
- double_update(&(GENERIC_ACTION(action).remains),
- lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable) * delta);
-
- if (GENERIC_LMM_ACTION(action).generic_action.max_duration != NO_MAX_DURATION)
- double_update(&(GENERIC_ACTION(action).max_duration), delta);
-
- if(GENERIC_ACTION(action).remains > 0 &&
- lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0 &&
- ((storage_t)action->storage)->used_size == ((storage_t)action->storage)->size)
- {
- GENERIC_ACTION(action).finish = surf_get_clock();
- storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
- } else if ((GENERIC_ACTION(action).remains <= 0) &&
- (lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0))
- {
- GENERIC_ACTION(action).finish = surf_get_clock();
- storage_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
- } else if ((GENERIC_ACTION(action).max_duration != NO_MAX_DURATION) &&
- (GENERIC_ACTION(action).max_duration <= 0))
- {
- GENERIC_ACTION(action).finish = surf_get_clock();
- storage_action_state_set((surf_action_t) action, SURF_ACTION_DONE);
- }
- }
-
- return;
-}
-
-static double storage_share_resources(double NOW)
-{
- XBT_DEBUG("storage_share_resources %f",NOW);
- s_surf_action_storage_t action;
- unsigned int i,j;
- storage_t storage;
- surf_action_storage_t write_action;
-
- double min_completion = generic_maxmin_share_resources(surf_storage_model->states.running_action_set,
- xbt_swag_offset(action, generic_lmm_action.variable),
- storage_maxmin_system, lmm_solve);
-
- double rate;
- // Foreach disk
- xbt_dynar_foreach(storage_list,i,storage)
- {
- rate = 0;
- // Foreach write action on disk
- xbt_dynar_foreach(storage->write_actions,j,write_action)
- {
- rate += lmm_variable_getvalue(write_action->generic_lmm_action.variable);
- }
- if(rate > 0)
- min_completion = MIN(min_completion, (storage->size-storage->used_size)/rate);
- }
-
- return min_completion;
-}
-
-static int storage_resource_used(void *resource_id)
-{
- THROW_UNIMPLEMENTED;
- return 0;
-}
-
-static void storage_resources_state(void *id, tmgr_trace_event_t event_type,
- double value, double time)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static int storage_action_unref(surf_action_t action)
-{
- action->refcount--;
- if (!action->refcount) {
- xbt_swag_remove(action, action->state_set);
- if (((surf_action_lmm_t) action)->variable)
- lmm_variable_free(storage_maxmin_system,
- ((surf_action_lmm_t) action)->variable);
-#ifdef HAVE_TRACING
- xbt_free(action->category);
-#endif
- surf_action_free(&action);
- return 1;
- }
- return 0;
-}
-
-static void storage_action_cancel(surf_action_t action)
-{
- surf_action_state_set(action, SURF_ACTION_FAILED);
- return;
-}
-
-static void storage_action_state_set(surf_action_t action, e_surf_action_state_t state)
-{
- surf_action_state_set(action, state);
- return;
-}
-
-static void storage_action_suspend(surf_action_t action)
-{
- XBT_IN("(%p)", action);
- if (((surf_action_lmm_t) action)->suspended != 2) {
- lmm_update_variable_weight(storage_maxmin_system,
- ((surf_action_lmm_t) action)->variable,
- 0.0);
- ((surf_action_lmm_t) action)->suspended = 1;
- }
- XBT_OUT();
-}
-
-static void storage_action_resume(surf_action_t action)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static int storage_action_is_suspended(surf_action_t action)
-{
- return (((surf_action_lmm_t) action)->suspended == 1);
-}
-
-static void storage_action_set_max_duration(surf_action_t action, double duration)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static void storage_action_set_priority(surf_action_t action, double priority)
-{
- THROW_UNIMPLEMENTED;
-}
-
-static void parse_storage_init(sg_platf_storage_cbarg_t storage)
-{
- void* stype = xbt_lib_get_or_null(storage_type_lib,
- storage->type_id,
- ROUTING_STORAGE_TYPE_LEVEL);
- if(!stype) xbt_die("No storage type '%s'",storage->type_id);
-
- // if storage content is not specified use the content of storage_type if exist
- if(!strcmp(storage->content,"") && strcmp(((storage_type_t) stype)->content,"")){
- storage->content = ((storage_type_t) stype)->content;
- storage->content_type = ((storage_type_t) stype)->content_type;
- XBT_DEBUG("For disk '%s' content is empty, inherit the content (of type %s) from storage type '%s' ",
- storage->id,((storage_type_t) stype)->content_type,
- ((storage_type_t) stype)->type_id);
- }
-
- XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' "
- "\n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tcontent_type '%s' "
- "\n\t\tproperties '%p'\n",
- storage->id,
- ((storage_type_t) stype)->model,
- ((storage_type_t) stype)->type_id,
- storage->content,
- storage->content_type,
- ((storage_type_t) stype)->properties);
-
- storage_create_resource(storage->id,
- ((storage_type_t) stype)->model,
- ((storage_type_t) stype)->type_id,
- storage->content,
- storage->content_type,
- storage->properties);
-}
-
-static void parse_mstorage_init(sg_platf_mstorage_cbarg_t mstorage)
-{
- XBT_DEBUG("parse_mstorage_init");
-}
-
-static void parse_storage_type_init(sg_platf_storage_type_cbarg_t storagetype_)
-{
- XBT_DEBUG("parse_storage_type_init");
-}
-
-static void parse_mount_init(sg_platf_mount_cbarg_t mount)
-{
- XBT_DEBUG("parse_mount_init");
-}
-
-static void storage_define_callbacks()
-{
- sg_platf_storage_add_cb(parse_storage_init);
- sg_platf_storage_type_add_cb(parse_storage_type_init);
- sg_platf_mstorage_add_cb(parse_mstorage_init);
- sg_platf_mount_add_cb(parse_mount_init);
-}
-
-static void surf_storage_model_init_internal(void)
-{
- s_surf_action_t action;
-
- XBT_DEBUG("surf_storage_model_init_internal");
- surf_storage_model = surf_model_init();
-
- storage_running_action_set_that_does_not_need_being_checked =
- xbt_swag_new(xbt_swag_offset(action, state_hookup));
-
- surf_storage_model->name = "Storage";
- surf_storage_model->action_unref = storage_action_unref;
- surf_storage_model->action_cancel = storage_action_cancel;
- surf_storage_model->action_state_set = storage_action_state_set;
-
- surf_storage_model->model_private->finalize = storage_finalize;
- surf_storage_model->model_private->update_actions_state = storage_update_actions_state;
- surf_storage_model->model_private->share_resources = storage_share_resources;
- surf_storage_model->model_private->resource_used = storage_resource_used;
- surf_storage_model->model_private->update_resource_state = storage_resources_state;
-
- surf_storage_model->suspend = storage_action_suspend;
- surf_storage_model->resume = storage_action_resume;
- surf_storage_model->is_suspended = storage_action_is_suspended;
- surf_storage_model->set_max_duration = storage_action_set_max_duration;
- surf_storage_model->set_priority = storage_action_set_priority;
-
- surf_storage_model->extension.storage.open = storage_action_open;
- surf_storage_model->extension.storage.close = storage_action_close;
- surf_storage_model->extension.storage.read = storage_action_read;
- surf_storage_model->extension.storage.write = storage_action_write;
- surf_storage_model->extension.storage.ls = storage_action_ls;
- surf_storage_model->extension.storage.get_properties = storage_get_properties;
- surf_storage_model->extension.storage.get_content = storage_get_content;
- surf_storage_model->extension.storage.get_size = storage_get_size;
- if (!storage_maxmin_system) {
- storage_maxmin_system = lmm_system_new(storage_selective_update);
- }
-}
-
-void surf_storage_model_init_default(void)
-{
- surf_storage_model_init_internal();
- storage_define_callbacks();
-
- xbt_dynar_push(model_list, &surf_storage_model);
-}
-
-static void storage_parse_storage(sg_platf_storage_cbarg_t storage)
-{
- xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL),
- "Reading a storage, processing unit \"%s\" already exists", storage->id);
-
- // Verification of an existing type_id
-#ifndef NDEBUG
- void* storage_type = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL);
-#endif
- xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id);
-
- XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'",
- storage->id,
- storage->type_id,
- storage->content);
-
- xbt_lib_set(storage_lib,
- storage->id,
- ROUTING_STORAGE_LEVEL,
- (void *) xbt_strdup(storage->type_id));
-}
-
-static xbt_dict_t parse_storage_content(char *filename, sg_storage_size_t *used_size)
-{
- *used_size = 0;
- if ((!filename) || (strcmp(filename, "") == 0))
- return NULL;
-
- xbt_dict_t parse_content = xbt_dict_new_homogeneous(xbt_free);
- FILE *file = NULL;
-
- file = surf_fopen(filename, "r");
- xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename,
- xbt_str_join(surf_path, ":"));
-
- char *line = NULL;
- size_t len = 0;
- ssize_t read;
- char path[1024];
- sg_storage_size_t size;
-
- while ((read = xbt_getline(&line, &len, file)) != -1) {
- if (read){
- if (sscanf(line,"%s %" SCNu64, path, &size) == 2) {
- *used_size += size;
- sg_storage_size_t *psize = xbt_new(sg_storage_size_t, 1);
- *psize = size;
- xbt_dict_set(parse_content,path,psize,NULL);
- } else {
- xbt_die("Be sure of passing a good format for content file.\n");
- }
- }
- }
- free(line);
- fclose(file);
- return parse_content;
-}
-
-static void storage_parse_storage_type(sg_platf_storage_type_cbarg_t storage_type)
-{
- xbt_assert(!xbt_lib_get_or_null(storage_type_lib, storage_type->id,ROUTING_STORAGE_TYPE_LEVEL),
- "Reading a storage type, processing unit \"%s\" already exists", storage_type->id);
-
- storage_type_t stype = xbt_new0(s_storage_type_t, 1);
- stype->model = xbt_strdup(storage_type->model);
- stype->properties = storage_type->properties;
- stype->content = xbt_strdup(storage_type->content);
- stype->content_type = xbt_strdup(storage_type->content_type);
- stype->type_id = xbt_strdup(storage_type->id);
- stype->size = storage_type->size;
-
- XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s', "
- "content '%s', and content_type '%s'",
- stype->type_id,
- stype->model,
- storage_type->content,
- storage_type->content_type);
-
- xbt_lib_set(storage_type_lib,
- stype->type_id,
- ROUTING_STORAGE_TYPE_LEVEL,
- (void *) stype);
-}
-static void storage_parse_mstorage(sg_platf_mstorage_cbarg_t mstorage)
-{
- THROW_UNIMPLEMENTED;
-// mount_t mnt = xbt_new0(s_mount_t, 1);
-// mnt->id = xbt_strdup(mstorage->type_id);
-// mnt->name = xbt_strdup(mstorage->name);
-//
-// if(!mount_list){
-// XBT_DEBUG("Creata a Mount list for %s",A_surfxml_host_id);
-// mount_list = xbt_dynar_new(sizeof(char *), NULL);
-// }
-// xbt_dynar_push(mount_list,(void *) mnt);
-// free(mnt->id);
-// free(mnt->name);
-// xbt_free(mnt);
-// XBT_DEBUG("ROUTING Mount a storage name '%s' with type_id '%s'",mstorage->name, mstorage->id);
-}
-
-static void mount_free(void *p)
-{
- mount_t mnt = p;
- xbt_free(mnt->name);
-}
-
-static void storage_parse_mount(sg_platf_mount_cbarg_t mount)
-{
- // Verification of an existing storage
-#ifndef NDEBUG
- void* storage = xbt_lib_get_or_null(storage_lib, mount->storageId,ROUTING_STORAGE_LEVEL);
-#endif
- xbt_assert(storage,"Disk id \"%s\" does not exists", mount->storageId);
-
- XBT_DEBUG("ROUTING Mount '%s' on '%s'",mount->storageId, mount->name);
-
- s_mount_t mnt;
- mnt.storage =
- surf_storage_resource_priv(surf_storage_resource_by_name(mount->storageId));
- mnt.name = xbt_strdup(mount->name);
-
- if(!mount_list){
- XBT_DEBUG("Create a Mount list for %s",A_surfxml_host_id);
- mount_list = xbt_dynar_new(sizeof(s_mount_t), mount_free);
- }
- xbt_dynar_push(mount_list,&mnt);
-}
-
-static XBT_INLINE void routing_storage_type_free(void *r)
-{
- storage_type_t stype = r;
- free(stype->model);
- free(stype->type_id);
- free(stype->content);
- free(stype->content_type);
- xbt_dict_free(&(stype->properties));
- free(stype);
-}
-
-static XBT_INLINE void surf_storage_resource_free(void *r)
-{
- // specific to storage
- storage_t storage = r;
- xbt_dict_free(&storage->content);
- xbt_dynar_free(&storage->write_actions);
- free(storage->type_id);
- free(storage->content_type);
- // generic resource
- surf_resource_free(r);
-}
-
-static XBT_INLINE void routing_storage_host_free(void *r)
-{
- xbt_dynar_t dyn = r;
- xbt_dynar_free(&dyn);
-}
-
-void storage_register_callbacks() {
-
- ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free);
- ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib,routing_storage_host_free);
- ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib,routing_storage_type_free);
- SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_storage_resource_free);
-
- sg_platf_storage_add_cb(storage_parse_storage);
- sg_platf_mstorage_add_cb(storage_parse_mstorage);
- sg_platf_storage_type_add_cb(storage_parse_storage_type);
- sg_platf_mount_add_cb(storage_parse_mount);
-}
-
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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_ */
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "storage_n11.hpp"
+#include "surf_private.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_storage);
+
+static int storage_selective_update = 0;
+static xbt_swag_t storage_running_action_set_that_does_not_need_being_checked = NULL;
+
+/*************
+ * CallBacks *
+ *************/
+
+static XBT_INLINE void routing_storage_type_free(void *r)
+{
+ storage_type_t stype = (storage_type_t) r;
+ free(stype->model);
+ free(stype->type_id);
+ free(stype->content);
+ free(stype->content_type);
+ xbt_dict_free(&(stype->properties));
+ xbt_dict_free(&(stype->model_properties));
+ free(stype);
+}
+
+static XBT_INLINE void surf_storage_resource_free(void *r)
+{
+ // specific to storage
+ StoragePtr storage = static_cast<StoragePtr>(r);
+ // generic resource
+ delete storage;
+}
+
+static XBT_INLINE void routing_storage_host_free(void *r)
+{
+ xbt_dynar_t dyn = (xbt_dynar_t) r;
+ xbt_dynar_free(&dyn);
+}
+
+static void parse_storage_init(sg_platf_storage_cbarg_t storage)
+{
+ void* stype = xbt_lib_get_or_null(storage_type_lib,
+ storage->type_id,
+ ROUTING_STORAGE_TYPE_LEVEL);
+ if(!stype) xbt_die("No storage type '%s'",storage->type_id);
+
+ // if storage content is not specified use the content of storage_type if exist
+ if(!strcmp(storage->content,"") && strcmp(((storage_type_t) stype)->content,"")){
+ storage->content = ((storage_type_t) stype)->content;
+ storage->content_type = ((storage_type_t) stype)->content_type;
+ XBT_DEBUG("For disk '%s' content is empty, inherit the content (of type %s) from storage type '%s' ",
+ storage->id,((storage_type_t) stype)->content_type,
+ ((storage_type_t) stype)->type_id);
+ }
+
+ XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' "
+ "\n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tcontent_type '%s' "
+ "\n\t\tproperties '%p''\n",
+ storage->id,
+ ((storage_type_t) stype)->model,
+ ((storage_type_t) stype)->type_id,
+ storage->content,
+ storage->content_type,
+ storage->properties);
+
+ surf_storage_model->createResource(storage->id,
+ ((storage_type_t) stype)->type_id,
+ storage->content,
+ storage->content_type,
+ storage->properties);
+}
+
+static void parse_mstorage_init(sg_platf_mstorage_cbarg_t /*mstorage*/)
+{
+ XBT_DEBUG("parse_mstorage_init");
+}
+
+static void parse_storage_type_init(sg_platf_storage_type_cbarg_t /*storagetype_*/)
+{
+ XBT_DEBUG("parse_storage_type_init");
+}
+
+static void parse_mount_init(sg_platf_mount_cbarg_t /*mount*/)
+{
+ XBT_DEBUG("parse_mount_init");
+}
+
+static void storage_parse_storage(sg_platf_storage_cbarg_t storage)
+{
+ xbt_assert(!xbt_lib_get_or_null(storage_lib, storage->id,ROUTING_STORAGE_LEVEL),
+ "Reading a storage, processing unit \"%s\" already exists", storage->id);
+
+ // Verification of an existing type_id
+#ifndef NDEBUG
+ void* storage_type = xbt_lib_get_or_null(storage_type_lib, storage->type_id,ROUTING_STORAGE_TYPE_LEVEL);
+#endif
+ xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id);
+
+ XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'",
+ storage->id,
+ storage->type_id,
+ storage->content);
+
+ xbt_lib_set(storage_lib,
+ storage->id,
+ ROUTING_STORAGE_LEVEL,
+ (void *) xbt_strdup(storage->type_id));
+}
+
+static void storage_parse_storage_type(sg_platf_storage_type_cbarg_t storage_type)
+{
+ xbt_assert(!xbt_lib_get_or_null(storage_type_lib, storage_type->id,ROUTING_STORAGE_TYPE_LEVEL),
+ "Reading a storage type, processing unit \"%s\" already exists", storage_type->id);
+
+ storage_type_t stype = xbt_new0(s_storage_type_t, 1);
+ stype->model = xbt_strdup(storage_type->model);
+ stype->properties = storage_type->properties;
+ stype->content = xbt_strdup(storage_type->content);
+ stype->content_type = xbt_strdup(storage_type->content_type);
+ stype->type_id = xbt_strdup(storage_type->id);
+ stype->size = storage_type->size;
+ stype->model_properties = storage_type->model_properties;
+
+ XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s', "
+ "content '%s', and content_type '%s'",
+ stype->type_id,
+ stype->model,
+ storage_type->content,
+ storage_type->content_type);
+
+ xbt_lib_set(storage_type_lib,
+ stype->type_id,
+ ROUTING_STORAGE_TYPE_LEVEL,
+ (void *) stype);
+}
+
+static void storage_parse_mstorage(sg_platf_mstorage_cbarg_t /*mstorage*/)
+{
+ THROW_UNIMPLEMENTED;
+// mount_t mnt = xbt_new0(s_mount_t, 1);
+// mnt->id = xbt_strdup(mstorage->type_id);
+// mnt->name = xbt_strdup(mstorage->name);
+//
+// if(!mount_list){
+// XBT_DEBUG("Creata a Mount list for %s",A_surfxml_host_id);
+// mount_list = xbt_dynar_new(sizeof(char *), NULL);
+// }
+// xbt_dynar_push(mount_list,(void *) mnt);
+// free(mnt->id);
+// free(mnt->name);
+// xbt_free(mnt);
+// XBT_DEBUG("ROUTING Mount a storage name '%s' with type_id '%s'",mstorage->name, mstorage->id);
+}
+
+static void mount_free(void *p)
+{
+ mount_t mnt = (mount_t) p;
+ xbt_free(mnt->name);
+}
+
+static void storage_parse_mount(sg_platf_mount_cbarg_t mount)
+{
+ // Verification of an existing storage
+#ifndef NDEBUG
+ void* storage = xbt_lib_get_or_null(storage_lib, mount->storageId, ROUTING_STORAGE_LEVEL);
+#endif
+ xbt_assert(storage,"Disk id \"%s\" does not exists", mount->storageId);
+
+ XBT_DEBUG("ROUTING Mount '%s' on '%s'",mount->storageId, mount->name);
+
+ s_mount_t mnt;
+ mnt.storage = surf_storage_resource_priv(surf_storage_resource_by_name(mount->storageId));
+ mnt.name = xbt_strdup(mount->name);
+
+ if(!mount_list){
+ XBT_DEBUG("Create a Mount list for %s",A_surfxml_host_id);
+ mount_list = xbt_dynar_new(sizeof(s_mount_t), mount_free);
+ }
+ xbt_dynar_push(mount_list, &mnt);
+}
+
+static void storage_define_callbacks()
+{
+ sg_platf_storage_add_cb(parse_storage_init);
+ sg_platf_storage_type_add_cb(parse_storage_type_init);
+ sg_platf_mstorage_add_cb(parse_mstorage_init);
+ sg_platf_mount_add_cb(parse_mount_init);
+}
+
+void storage_register_callbacks() {
+
+ ROUTING_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,xbt_free);
+ ROUTING_STORAGE_HOST_LEVEL = xbt_lib_add_level(storage_lib, routing_storage_host_free);
+ ROUTING_STORAGE_TYPE_LEVEL = xbt_lib_add_level(storage_type_lib, routing_storage_type_free);
+ SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, surf_storage_resource_free);
+
+ sg_platf_storage_add_cb(storage_parse_storage);
+ sg_platf_mstorage_add_cb(storage_parse_mstorage);
+ sg_platf_storage_type_add_cb(storage_parse_storage_type);
+ sg_platf_mount_add_cb(storage_parse_mount);
+}
+
+/*********
+ * Model *
+ *********/
+
+void surf_storage_model_init_default(void)
+{
+ surf_storage_model = new StorageN11Model();
+ storage_define_callbacks();
+ xbt_dynar_push(model_list, &surf_storage_model);
+}
+
+StorageN11Model::StorageN11Model() : StorageModel() {
+ ActionPtr action = NULL;
+
+ XBT_DEBUG("surf_storage_model_init_internal");
+
+ storage_running_action_set_that_does_not_need_being_checked =
+ xbt_swag_new(xbt_swag_offset(*action, p_stateHookup));
+ if (!p_maxminSystem) {
+ p_maxminSystem = lmm_system_new(storage_selective_update);
+ }
+}
+
+StorageN11Model::~StorageN11Model(){
+ xbt_swag_free(storage_running_action_set_that_does_not_need_being_checked);
+ storage_running_action_set_that_does_not_need_being_checked = NULL;
+}
+
+StoragePtr StorageN11Model::createResource(const char* id, const char* type_id,
+ const char* content_name, const char* content_type, xbt_dict_t properties)
+{
+
+ xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)),
+ "Storage '%s' declared several times in the platform file",
+ id);
+
+ storage_type_t storage_type = (storage_type_t) xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
+
+ double Bread = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bread"));
+ double Bwrite = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bwrite"));
+ double Bconnection = surf_parse_get_bandwidth((char*)xbt_dict_get(storage_type->model_properties, "Bconnection"));
+
+ StoragePtr storage = new StorageN11(this, id, properties, p_maxminSystem,
+ Bread, Bwrite, Bconnection,
+ type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size);
+
+ xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, static_cast<ResourcePtr>(storage));
+
+ XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s'\n\t\tproperties '%p'\n\t\tBread '%f'\n",
+ id,
+ type_id,
+ properties,
+ Bread);
+
+ if(!p_storageList)
+ p_storageList = xbt_dynar_new(sizeof(char *),NULL);
+ xbt_dynar_push(p_storageList, &storage);
+
+ return storage;
+}
+
+double StorageN11Model::shareResources(double now)
+{
+ XBT_DEBUG("storage_share_resources %f", now);
+ unsigned int i, j;
+ StoragePtr storage;
+ void *_write_action;
+ StorageActionPtr write_action;
+
+ double min_completion = shareResourcesMaxMin(getRunningActionSet(),
+ p_maxminSystem, lmm_solve);
+
+ double rate;
+ // Foreach disk
+ xbt_dynar_foreach(p_storageList,i,storage)
+ {
+ rate = 0;
+ // Foreach write action on disk
+ xbt_dynar_foreach(storage->p_writeActions, j, _write_action)
+ {
+ write_action = static_cast<StorageActionPtr>(_write_action);
+ rate += lmm_variable_getvalue(write_action->getVariable());
+ }
+ if(rate > 0)
+ min_completion = MIN(min_completion, (storage->m_size-storage->m_usedSize)/rate);
+ }
+
+ return min_completion;
+}
+
+void StorageN11Model::updateActionsState(double /*now*/, double delta)
+{
+ StorageActionPtr action = NULL;
+
+ ActionListPtr actionSet = getRunningActionSet();
+ for(ActionList::iterator it(actionSet->begin()), itNext=it, itend(actionSet->end())
+ ; it != itend ; it=itNext) {
+ ++itNext;
+ action = static_cast<StorageActionPtr>(&*it);
+ if(action->m_type == WRITE)
+ {
+ // Update the disk usage
+ // Update the file size
+ // For each action of type write
+ double rate = lmm_variable_getvalue(action->getVariable());
+ /* Hack to avoid rounding differences between x86 and x86_64
+ * (note that the next sizes are of type sg_size_t). */
+ long incr = delta * rate + MAXMIN_PRECISION;
+ action->p_storage->m_usedSize += incr; // disk usage
+ action->p_file->size += incr; // file size
+
+ sg_size_t *psize = xbt_new(sg_size_t,1);
+ *psize = action->p_file->size;
+ xbt_dict_t content_dict = action->p_storage->p_content;
+ xbt_dict_set(content_dict, action->p_file->name, psize, NULL);
+ }
+
+ action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
+
+ if (action->getMaxDuration() != NO_MAX_DURATION)
+ action->updateMaxDuration(delta);
+
+ if(action->getRemainsNoUpdate() > 0 &&
+ lmm_get_variable_weight(action->getVariable()) > 0 &&
+ action->p_storage->m_usedSize == action->p_storage->m_size)
+ {
+ action->finish();
+ action->setState(SURF_ACTION_FAILED);
+ } else if ((action->getRemainsNoUpdate() <= 0) &&
+ (lmm_get_variable_weight(action->getVariable()) > 0))
+ {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ } else if ((action->getMaxDuration() != NO_MAX_DURATION) &&
+ (action->getMaxDuration() <= 0))
+ {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ }
+ }
+ return;
+}
+
+/************
+ * Resource *
+ ************/
+
+StorageN11::StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties,
+ lmm_system_t maxminSystem, double bread, double bwrite, double bconnection,
+ const char* type_id, char *content_name, char *content_type, sg_size_t size)
+ : Storage(model, name, properties,
+ maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size) {
+ XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size);
+}
+
+StorageActionPtr StorageN11::ls(const char* path)
+{
+ StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, LS);
+
+ action->p_lsDict = NULL;
+ xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free);
+
+ char* key;
+ sg_size_t size = 0;
+ xbt_dict_cursor_t cursor = NULL;
+
+ xbt_dynar_t dyn = NULL;
+ char* file = NULL;
+
+ // for each file in the storage content
+ xbt_dict_foreach(p_content,cursor,key,size){
+ // Search if file start with the prefix 'path'
+ if(xbt_str_start_with(key,path)){
+ file = &key[strlen(path)];
+
+ // Split file with '/'
+ dyn = xbt_str_split(file,"/");
+ file = xbt_dynar_get_as(dyn,0,char*);
+
+ // file
+ if(xbt_dynar_length(dyn) == 1){
+ sg_size_t *psize = xbt_new(sg_size_t, 1);
+ *psize=size;
+ xbt_dict_set(ls_dict, file, psize, NULL);
+ }
+ // Directory
+ else
+ {
+ // if directory does not exist yet in the dictionary
+ if(!xbt_dict_get_or_null(ls_dict,file))
+ xbt_dict_set(ls_dict,file,NULL,NULL);
+ }
+ xbt_dynar_free(&dyn);
+ }
+ }
+
+ action->p_lsDict = ls_dict;
+ return action;
+}
+
+StorageActionPtr StorageN11::open(const char* mount, const char* path)
+{
+ XBT_DEBUG("\tOpen file '%s'",path);
+ sg_size_t size, *psize;
+ psize = (sg_size_t*) xbt_dict_get_or_null(p_content, path);
+ // if file does not exist create an empty file
+ if(psize)
+ size = *psize;
+ else {
+ psize = xbt_new(sg_size_t,1);
+ size = 0;
+ *psize = size;
+ xbt_dict_set(p_content, path, psize, NULL);
+ XBT_DEBUG("File '%s' was not found, file created.",path);
+ }
+ surf_file_t file = xbt_new0(s_surf_file_t,1);
+ file->name = xbt_strdup(path);
+ file->size = size;
+ file->mount = xbt_strdup(mount);
+ file->current_position = 0;
+
+ StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, OPEN);
+ action->p_file = file;
+ return action;
+}
+
+StorageActionPtr StorageN11::close(surf_file_t fd)
+{
+ char *filename = fd->name;
+ XBT_DEBUG("\tClose file '%s' size '%llu'", filename, fd->size);
+ // unref write actions from storage
+ void *_write_action;
+ StorageActionPtr write_action;
+ unsigned int i;
+ xbt_dynar_foreach(p_writeActions, i, _write_action) {
+ write_action = static_cast<StorageActionPtr>(static_cast<ActionPtr>(_write_action));
+ if ((write_action->p_file) == fd) {
+ xbt_dynar_cursor_rm(p_writeActions, &i);
+ write_action->unref();
+ }
+ }
+ free(fd->name);
+ free(fd->mount);
+ xbt_free(fd);
+ StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, CLOSE);
+ return action;
+}
+
+StorageActionPtr StorageN11::read(surf_file_t fd, sg_size_t size)
+{
+ if(size > fd->size){
+ size = fd->size;
+ fd->current_position = fd->size;
+ }
+ else
+ fd->current_position += size;
+
+ StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, READ);
+ return action;
+}
+
+StorageActionPtr StorageN11::write(surf_file_t fd, sg_size_t size)
+{
+ char *filename = fd->name;
+ XBT_DEBUG("\tWrite file '%s' size '%llu/%llu'",filename,size,fd->size);
+
+ StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, WRITE);
+ action->p_file = fd;
+ fd->current_position += size;
+ // If the storage is full
+ if(m_usedSize==m_size) {
+ action->setState(SURF_ACTION_FAILED);
+ }
+ return action;
+}
+
+void StorageN11::rename(const char *src, const char *dest)
+{
+ sg_size_t *psize, *new_psize;
+ psize = (sg_size_t*) xbt_dict_get_or_null(p_content,src);
+ new_psize = xbt_new(sg_size_t, 1);
+ *new_psize = *psize;
+ if (psize){// src file exists
+ xbt_dict_remove(p_content, src);
+ xbt_dict_set(p_content, dest, new_psize,NULL);
+ XBT_DEBUG("Change file name from %s to %s, size '%llu'",src, dest, *psize);
+ }
+ else
+ XBT_DEBUG("File %s doesn't exist",src);
+}
+
+xbt_dict_t StorageN11::getContent()
+{
+ /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */
+ /*surf_action_t action = storage_action_execute(storage,0, LS);*/
+
+ xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL);
+ xbt_dict_cursor_t cursor = NULL;
+ char *file;
+ sg_size_t *psize;
+
+ xbt_dict_foreach(p_content, cursor, file, psize){
+ xbt_dict_set(content_dict,file,psize,NULL);
+ }
+ return content_dict;
+}
+
+sg_size_t StorageN11::getSize(){
+ return m_size;
+}
+
+/**********
+ * Action *
+ **********/
+
+StorageN11Action::StorageN11Action(ModelPtr model, double cost, bool failed, StoragePtr storage, e_surf_action_storage_type_t type)
+ : StorageAction(model, cost, failed,
+ lmm_variable_new(model->getMaxminSystem(), this, 1.0, -1.0 , 3),
+ storage, type) {
+ XBT_IN("(%s,%g", storage->getName(), cost);
+
+ // Must be less than the max bandwidth for all actions
+ lmm_expand(model->getMaxminSystem(), storage->getConstraint(), getVariable(), 1.0);
+ switch(type) {
+ case OPEN:
+ case CLOSE:
+ case STAT:
+ case LS:
+ break;
+ case READ:
+ lmm_expand(model->getMaxminSystem(), storage->p_constraintRead,
+ getVariable(), 1.0);
+ break;
+ case WRITE:
+ lmm_expand(model->getMaxminSystem(), storage->p_constraintWrite,
+ getVariable(), 1.0);
+ ActionPtr action = this;
+ xbt_dynar_push(storage->p_writeActions, &action);
+ ref();
+ break;
+ }
+ XBT_OUT();
+}
+
+int StorageN11Action::unref()
+{
+ m_refcount--;
+ if (!m_refcount) {
+ if (actionHook::is_linked())
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ if (getVariable())
+ lmm_variable_free(getModel()->getMaxminSystem(), getVariable());
+#ifdef HAVE_TRACING
+ xbt_free(getCategory());
+#endif
+ delete this;
+ return 1;
+ }
+ return 0;
+}
+
+void StorageN11Action::cancel()
+{
+ setState(SURF_ACTION_FAILED);
+ return;
+}
+
+void StorageN11Action::suspend()
+{
+ XBT_IN("(%p)", this);
+ if (m_suspended != 2) {
+ lmm_update_variable_weight(getModel()->getMaxminSystem(),
+ getVariable(),
+ 0.0);
+ m_suspended = 1;
+ }
+ XBT_OUT();
+}
+
+void StorageN11Action::resume()
+{
+ THROW_UNIMPLEMENTED;
+}
+
+bool StorageN11Action::isSuspended()
+{
+ return m_suspended == 1;
+}
+
+void StorageN11Action::setMaxDuration(double /*duration*/)
+{
+ THROW_UNIMPLEMENTED;
+}
+
+void StorageN11Action::setPriority(double /*priority*/)
+{
+ THROW_UNIMPLEMENTED;
+}
+
--- /dev/null
+/* 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_ */
+++ /dev/null
-/* 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_ */
+++ /dev/null
-/* Copyright (c) 2004-2013. The SimGrid Team.
- * All rights reserved. */
-
-/* This program is free software; you can redistribute it and/or modify it
- * under the terms of the license (GNU LGPL) which comes with this package. */
-
-#include "surf_private.h"
-#include "xbt/module.h"
-#include "mc/mc.h"
-#include "simix/smx_host_private.h"
-#include "surf/surf_resource.h"
-#include "xbt/xbt_os_thread.h"
-#include "simgrid/sg_config.h"
-
-#include <ctype.h>
-
-XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
- "Logging specific to SURF (kernel)");
-
-/* Additional declarations for Windows portability. */
-
-#ifndef MAX_DRIVE
-#define MAX_DRIVE 26
-#endif
-
-#ifdef _XBT_WIN32
-#include <windows.h>
-static const char *disk_drives_letter_table[MAX_DRIVE] = {
- "A:\\",
- "B:\\",
- "C:\\",
- "D:\\",
- "E:\\",
- "F:\\",
- "G:\\",
- "H:\\",
- "I:\\",
- "J:\\",
- "K:\\",
- "L:\\",
- "M:\\",
- "N:\\",
- "O:\\",
- "P:\\",
- "Q:\\",
- "R:\\",
- "S:\\",
- "T:\\",
- "U:\\",
- "V:\\",
- "W:\\",
- "X:\\",
- "Y:\\",
- "Z:\\"
-};
-#endif /* #ifdef _XBT_WIN32 */
-
-/*
- * Returns the initial path. On Windows the initial path is
- * the current directory for the current process in the other
- * case the function returns "./" that represents the current
- * directory on Unix/Linux platforms.
- */
-
-const char *__surf_get_initial_path(void)
-{
-
-#ifdef _XBT_WIN32
- unsigned i;
- char current_directory[MAX_PATH + 1] = { 0 };
- unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory);
- char root[4] = { 0 };
-
- if (!len)
- return NULL;
-
- strncpy(root, current_directory, 3);
-
- for (i = 0; i < MAX_DRIVE; i++) {
- if (toupper(root[0]) == disk_drives_letter_table[i][0])
- return disk_drives_letter_table[i];
- }
-
- return NULL;
-#else
- return "./";
-#endif
-}
-
-/* The __surf_is_absolute_file_path() returns 1 if
- * file_path is a absolute file path, in the other
- * case the function returns 0.
- */
-int __surf_is_absolute_file_path(const char *file_path)
-{
-#ifdef _XBT_WIN32
- WIN32_FIND_DATA wfd = { 0 };
- HANDLE hFile = FindFirstFile(file_path, &wfd);
-
- if (INVALID_HANDLE_VALUE == hFile)
- return 0;
-
- FindClose(hFile);
- return 1;
-#else
- return (file_path[0] == '/');
-#endif
-}
-
-double NOW = 0;
-
-xbt_dynar_t model_list = NULL;
-tmgr_history_t history = NULL;
-lmm_system_t maxmin_system = NULL;
-xbt_dynar_t surf_path = NULL;
-xbt_dynar_t host_that_restart = NULL;
-xbt_dict_t watched_hosts_lib;
-
-/* Don't forget to update the option description in smx_config when you change this */
-s_surf_model_description_t surf_network_model_description[] = {
- {"LV08",
- "Realistic network analytic model (slow-start modeled by multiplying latency by 10.4, bandwidth by .92; bottleneck sharing uses a payload of S=8775 for evaluating RTT). ",
- surf_network_model_init_LegrandVelho},
- {"Constant",
- "Simplistic network model where all communication take a constant time (one second). This model provides the lowest realism, but is (marginally) faster.",
- surf_network_model_init_Constant},
- {"SMPI",
- "Realistic network model specifically tailored for HPC settings (accurate modeling of slow start with correction factors on three intervals: < 1KiB, < 64 KiB, >= 64 KiB)",
- surf_network_model_init_SMPI},
- {"CM02",
- "Legacy network analytic model (Very similar to LV08, but without corrective factors. The timings of small messages are thus poorly modeled).",
- surf_network_model_init_CM02},
-#ifdef HAVE_GTNETS
- {"GTNets",
- "Network pseudo-model using the GTNets simulator instead of an analytic model",
- surf_network_model_init_GTNETS},
-#endif
-#ifdef HAVE_NS3
- {"NS3",
- "Network pseudo-model using the NS3 tcp model instead of an analytic model",
- surf_network_model_init_NS3},
-#endif
- {"Reno",
- "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
- surf_network_model_init_Reno},
- {"Reno2",
- "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
- surf_network_model_init_Reno2},
- {"Vegas",
- "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
- surf_network_model_init_Vegas},
- {NULL, NULL, NULL} /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_cpu_model_description[] = {
- {"Cas01",
- "Simplistic CPU model (time=size/power).",
- surf_cpu_model_init_Cas01},
- {NULL, NULL, NULL} /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_workstation_model_description[] = {
- {"default",
- "Default workstation model. Currently, CPU:Cas01 and network:LV08 (with cross traffic enabled)",
- surf_workstation_model_init_current_default},
- {"compound",
- "Workstation model that is automatically chosen if you change the network and CPU models",
- surf_workstation_model_init_compound},
- {"ptask_L07", "Workstation model somehow similar to Cas01+CM02 but allowing parallel tasks",
- surf_workstation_model_init_ptask_L07},
- {NULL, NULL, NULL} /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_optimization_mode_description[] = {
- {"Lazy",
- "Lazy action management (partial invalidation in lmm + heap in action remaining).",
- NULL},
- {"TI",
- "Trace integration. Highly optimized mode when using availability traces (only available for the Cas01 CPU model for now).",
- NULL},
- {"Full",
- "Full update of remaining and variables. Slow but may be useful when debugging.",
- NULL},
- {NULL, NULL, NULL} /* this array must be NULL terminated */
-};
-
-s_surf_model_description_t surf_storage_model_description[] = {
- {"default",
- "Simplistic storage model.",
- surf_storage_model_init_default},
- {NULL, NULL, NULL} /* this array must be NULL terminated */
-};
-
-/* ********************************************************************* */
-/* TUTORIAL: New model */
-s_surf_model_description_t surf_new_model_description[] = {
- {"default",
- "Tutorial model.",
- surf_new_model_init_default},
- {NULL, NULL, NULL} /* this array must be NULL terminated */
-};
-/* ********************************************************************* */
-
-#ifdef CONTEXT_THREADS
-static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */
-#endif
-
-static double *surf_mins = NULL; /* return value of share_resources for each model */
-static int surf_min_index; /* current index in surf_mins */
-static double min; /* duration determined by surf_solve */
-
-static void surf_share_resources(surf_model_t model);
-static void surf_update_actions_state(surf_model_t model);
-
-/** Displays the long description of all registered models, and quit */
-void model_help(const char *category, s_surf_model_description_t * table)
-{
- int i;
- printf("Long description of the %s models accepted by this simulator:\n",
- category);
- for (i = 0; table[i].name; i++)
- printf(" %s: %s\n", table[i].name, table[i].description);
-}
-
-int find_model_description(s_surf_model_description_t * table,
- const char *name)
-{
- int i;
- char *name_list = NULL;
-
- for (i = 0; table[i].name; i++)
- if (!strcmp(name, table[i].name)) {
- return i;
- }
- if (!table[0].name)
- xbt_die("No model is valid! This is a bug.");
- name_list = xbt_strdup(table[0].name);
- for (i = 1; table[i].name; i++) {
- name_list =
- xbt_realloc(name_list,
- strlen(name_list) + strlen(table[i].name) + 3);
- strcat(name_list, ", ");
- strcat(name_list, table[i].name);
- }
- xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list);
- return -1;
-}
-
-double generic_maxmin_share_resources(xbt_swag_t running_actions,
- size_t offset,
- lmm_system_t sys,
- void (*solve) (lmm_system_t))
-{
- surf_action_t action = NULL;
- double min = -1;
- double value = -1;
-#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
-
- solve(sys);
-
- xbt_swag_foreach(action, running_actions) {
- value = lmm_variable_getvalue(VARIABLE(action));
- if ((value > 0) || (action->max_duration >= 0))
- break;
- }
-
- if (!action)
- return -1.0;
-
- if (value > 0) {
- if (action->remains > 0)
- min = action->remains / value;
- else
- min = 0.0;
- if ((action->max_duration >= 0) && (action->max_duration < min))
- min = action->max_duration;
- } else
- min = action->max_duration;
-
-
- for (action = xbt_swag_getNext(action, running_actions->offset);
- action;
- action = xbt_swag_getNext(action, running_actions->offset)) {
- value = lmm_variable_getvalue(VARIABLE(action));
- if (value > 0) {
- if (action->remains > 0)
- value = action->remains / value;
- else
- value = 0.0;
- if (value < min) {
- min = value;
- XBT_DEBUG("Updating min (value) with %p: %f", action, min);
- }
- }
- if ((action->max_duration >= 0) && (action->max_duration < min)) {
- min = action->max_duration;
- XBT_DEBUG("Updating min (duration) with %p: %f", action, min);
- }
- }
- XBT_DEBUG("min value : %f", min);
-
-#undef VARIABLE
- return min;
-}
-
-double generic_share_resources_lazy(double now, surf_model_t model)
-{
- surf_action_lmm_t action = NULL;
- double min = -1;
- double value;
-
- XBT_DEBUG
- ("Before share resources, the size of modified actions set is %d",
- xbt_swag_size(model->model_private->modified_set));
-
- lmm_solve(model->model_private->maxmin_system);
-
- XBT_DEBUG
- ("After share resources, The size of modified actions set is %d",
- xbt_swag_size(model->model_private->modified_set));
-
- while((action = xbt_swag_extract(model->model_private->modified_set))) {
- int max_dur_flag = 0;
-
- if (action->generic_action.state_set !=
- model->states.running_action_set)
- continue;
-
- /* bogus priority, skip it */
- if (action->generic_action.priority <= 0)
- continue;
-
- generic_update_action_remaining_lazy(action,now);
-
- min = -1;
- value = lmm_variable_getvalue(action->variable);
- if (value > 0) {
- if (action->generic_action.remains > 0) {
- value = action->generic_action.remains / value;
- min = now + value;
- } else {
- value = 0.0;
- min = now;
- }
- }
-
- if ((action->generic_action.max_duration != NO_MAX_DURATION)
- && (min == -1
- || action->generic_action.start +
- action->generic_action.max_duration < min)) {
- min = action->generic_action.start +
- action->generic_action.max_duration;
- max_dur_flag = 1;
- }
-
- XBT_DEBUG("Action(%p) Start %f Finish %f Max_duration %f", action,
- action->generic_action.start, now + value,
- action->generic_action.max_duration);
-
- if (min != -1) {
- surf_action_lmm_heap_remove(model->model_private->action_heap,action);
- surf_action_lmm_heap_insert(model->model_private->action_heap,action, min, max_dur_flag ? MAX_DURATION : NORMAL);
- XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min,
- now);
- } else DIE_IMPOSSIBLE;
- }
-
- //hereafter must have already the min value for this resource model
- if (xbt_heap_size(model->model_private->action_heap) > 0)
- min = xbt_heap_maxkey(model->model_private->action_heap) - now;
- else
- min = -1;
-
- XBT_DEBUG("The minimum with the HEAP %f", min);
-
- return min;
-}
-static XBT_INLINE void routing_asr_host_free(void *p)
-{
- sg_routing_edge_t elm = p;
- free(elm->name);
- xbt_free(elm);
-}
-
-static XBT_INLINE void routing_asr_prop_free(void *p)
-{
- xbt_dict_t elm = p;
- xbt_dict_free(&elm);
-}
-
-void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
- *ver_major = SIMGRID_VERSION_MAJOR;
- *ver_minor = SIMGRID_VERSION_MINOR;
- *ver_patch = SIMGRID_VERSION_PATCH;
-}
-
-void surf_init(int *argc, char **argv)
-{
- XBT_DEBUG("Create all Libs");
- host_lib = xbt_lib_new();
- link_lib = xbt_lib_new();
- as_router_lib = xbt_lib_new();
- storage_lib = xbt_lib_new();
- storage_type_lib = xbt_lib_new();
- watched_hosts_lib = xbt_dict_new_homogeneous(NULL);
-
- XBT_DEBUG("Add routing levels");
- ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
- ROUTING_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
- ROUTING_PROP_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_prop_free);
-
- XBT_DEBUG("Add SURF levels");
- SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
- SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
- SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
-
- xbt_init(argc, argv);
- if (!model_list)
- model_list = xbt_dynar_new(sizeof(surf_model_private_t), NULL);
- if (!history)
- history = tmgr_history_new();
-
-#ifdef HAVE_TRACING
- TRACE_add_start_function(TRACE_surf_alloc);
- TRACE_add_end_function(TRACE_surf_release);
-#endif
-
- sg_config_init(argc, argv);
-
- surf_action_init();
- if (MC_is_active())
- MC_memory_init();
-}
-
-#ifdef _XBT_WIN32
-# define FILE_DELIM "\\"
-#else
-# define FILE_DELIM "/" /* FIXME: move to better location */
-#endif
-
-FILE *surf_fopen(const char *name, const char *mode)
-{
- unsigned int cpt;
- char *path_elm = NULL;
- char *buff;
- FILE *file = NULL;
-
- xbt_assert(name);
-
- if (__surf_is_absolute_file_path(name)) /* don't mess with absolute file names */
- return fopen(name, mode);
-
- /* search relative files in the path */
- xbt_dynar_foreach(surf_path, cpt, path_elm) {
- buff = bprintf("%s" FILE_DELIM "%s", path_elm, name);
- file = fopen(buff, mode);
- free(buff);
-
- if (file)
- return file;
- }
- return NULL;
-}
-
-void surf_exit(void)
-{
- unsigned int iter;
- surf_model_t model = NULL;
-
-#ifdef HAVE_TRACING
- TRACE_end(); /* Just in case it was not called by the upper
- * layer (or there is no upper layer) */
-#endif
-
- sg_config_finalize();
-
- xbt_dynar_foreach(model_list, iter, model)
- model->model_private->finalize();
- xbt_dynar_free(&model_list);
- routing_exit();
-
- if (maxmin_system) {
- lmm_system_free(maxmin_system);
- maxmin_system = NULL;
- }
- if (history) {
- tmgr_history_free(history);
- history = NULL;
- }
- surf_action_exit();
-
-#ifdef CONTEXT_THREADS
- xbt_parmap_destroy(surf_parmap);
- xbt_free(surf_mins);
- surf_mins = NULL;
-#endif
- xbt_dynar_free(&host_that_restart);
- xbt_dynar_free(&surf_path);
-
- xbt_lib_free(&host_lib);
- xbt_lib_free(&link_lib);
- xbt_lib_free(&as_router_lib);
- xbt_lib_free(&storage_lib);
- xbt_lib_free(&storage_type_lib);
-
- xbt_dict_free(&watched_hosts_lib);
-
- tmgr_finalize();
- surf_parse_lex_destroy();
- surf_parse_free_callbacks();
-
- NOW = 0; /* Just in case the user plans to restart the simulation afterward */
-}
-
-void surf_presolve(void)
-{
- double next_event_date = -1.0;
- tmgr_trace_event_t event = NULL;
- double value = -1.0;
- surf_resource_t resource = NULL;
- surf_model_t model = NULL;
- unsigned int iter;
-
- XBT_DEBUG
- ("First Run! Let's \"purge\" events and put models in the right state");
- while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
- if (next_event_date > NOW)
- break;
- while ((event =
- tmgr_history_get_next_event_leq(history, next_event_date,
- &value,
- (void **) &resource))) {
- if (value >= 0){
- resource->model->model_private->update_resource_state(resource,
- event, value,
- NOW);
- }
- }
- }
- xbt_dynar_foreach(model_list, iter, model)
- model->model_private->update_actions_state(NOW, 0.0);
-}
-
-double surf_solve(double max_date)
-{
- min = -1.0; /* duration */
- double next_event_date = -1.0;
- double model_next_action_end = -1.0;
- double value = -1.0;
- surf_resource_t resource = NULL;
- surf_model_t model = NULL;
- tmgr_trace_event_t event = NULL;
- unsigned int iter;
-
- if(!host_that_restart)
- host_that_restart = xbt_dynar_new(sizeof(char*), NULL);
-
- if (max_date != -1.0 && max_date != NOW) {
- min = max_date - NOW;
- }
-
- XBT_DEBUG("Looking for next action end for all models except NS3");
-
- if (surf_mins == NULL) {
- surf_mins = xbt_new(double, xbt_dynar_length(model_list));
- }
- surf_min_index = 0;
-
- /* sequential version */
- xbt_dynar_foreach(model_list, iter, model) {
- surf_share_resources(model);
- }
-
- unsigned i;
- for (i = 0; i < xbt_dynar_length(model_list); i++) {
- if ((min < 0.0 || surf_mins[i] < min)
- && surf_mins[i] >= 0.0) {
- min = surf_mins[i];
- }
- }
-
- XBT_DEBUG("Min for resources (remember that NS3 don't update that value) : %f", min);
-
- XBT_DEBUG("Looking for next trace event");
-
- do {
- XBT_DEBUG("Next TRACE event : %f", next_event_date);
-
- next_event_date = tmgr_history_next_date(history);
-
- if(surf_network_model->name && !strcmp(surf_network_model->name,"network NS3")){
- if(next_event_date!=-1.0 && min!=-1.0) {
- min = MIN(next_event_date - NOW, min);
- } else{
- min = MAX(next_event_date - NOW, min);
- }
-
- XBT_DEBUG("Run for network at most %f", min);
- // run until min or next flow
- model_next_action_end = surf_network_model->model_private->share_resources(min);
-
- XBT_DEBUG("Min for network : %f", model_next_action_end);
- if(model_next_action_end>=0.0)
- min = model_next_action_end;
- }
-
- if (next_event_date < 0.0) {
- XBT_DEBUG("no next TRACE event. Stop searching for it");
- break;
- }
-
- if ((min == -1.0) || (next_event_date > NOW + min)) break;
-
- XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)",min, NOW, next_event_date);
- while ((event =
- tmgr_history_get_next_event_leq(history, next_event_date,
- &value,
- (void **) &resource))) {
- if (resource->model->model_private->resource_used(resource) ||
- xbt_dict_get_or_null(watched_hosts_lib,resource->name)
- ) {
- min = next_event_date - NOW;
- XBT_DEBUG
- ("This event will modify model state. Next event set to %f",
- min);
- }
- /* update state of model_obj according to new value. Does not touch lmm.
- It will be modified if needed when updating actions */
- XBT_DEBUG("Calling update_resource_state for resource %s with min %f",
- resource->name, min);
-
- resource->model->model_private->update_resource_state(resource,
- event, value,
- next_event_date);
- }
- } while (1);
-
- /* FIXME: Moved this test to here to avoid stopping simulation if there are actions running on cpus and all cpus are with availability = 0.
- * This may cause an infinite loop if one cpu has a trace with periodicity = 0 and the other a trace with periodicity > 0.
- * The options are: all traces with same periodicity(0 or >0) or we need to change the way how the events are managed */
- if (min == -1.0) {
- XBT_DEBUG("No next event at all. Bail out now.");
- return -1.0;
- }
-
- XBT_DEBUG("Duration set to %f", min);
-
- NOW = NOW + min;
-
- /* sequential version */
- xbt_dynar_foreach(model_list, iter, model) {
- surf_update_actions_state(model);
- }
-
-#ifdef HAVE_TRACING
- TRACE_paje_dump_buffer (0);
-#endif
-
- return min;
-}
-
-XBT_INLINE double surf_get_clock(void)
-{
- return NOW;
-}
-
-static void surf_share_resources(surf_model_t model)
-{
- double next_action_end = -1.0;
- int i = __sync_fetch_and_add(&surf_min_index, 1);
- if (strcmp(model->name,"network NS3")) {
- XBT_DEBUG("Running for Resource [%s]", model->name);
- next_action_end = model->model_private->share_resources(NOW);
- XBT_DEBUG("Resource [%s] : next action end = %f",
- model->name, next_action_end);
- }
- surf_mins[i] = next_action_end;
-}
-
-static void surf_update_actions_state(surf_model_t model)
-{
- model->model_private->update_actions_state(NOW, min);
-}
-
+++ /dev/null
-/* 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;
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_interface.hpp"
+#include "workstation_interface.hpp"
+#include "vm_workstation_interface.hpp"
+#include "network_interface.hpp"
+#include "surf_routing_cluster.hpp"
+#include "instr/instr_private.h"
+#include "plugins/energy.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_kernel);
+
+/*********
+ * TOOLS *
+ *********/
+
+static CpuPtr get_casted_cpu(surf_resource_t resource){
+ return static_cast<CpuPtr>(surf_cpu_resource_priv(resource));
+}
+
+static WorkstationPtr get_casted_workstation(surf_resource_t resource){
+ return static_cast<WorkstationPtr>(surf_workstation_resource_priv(resource));
+}
+
+static WorkstationVMPtr get_casted_vm_workstation(surf_resource_t resource){
+ return static_cast<WorkstationVMPtr>(surf_workstation_resource_priv(resource));
+}
+
+char *surf_routing_edge_name(sg_routing_edge_t edge){
+ return edge->getName();
+}
+
+#ifdef CONTEXT_THREADS
+//FIXME:keeporremove static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */
+#endif
+
+extern double NOW;
+extern double *surf_mins; /* return value of share_resources for each model */
+extern int surf_min_index; /* current index in surf_mins */
+extern double surf_min; /* duration determined by surf_solve */
+
+void surf_presolve(void)
+{
+ double next_event_date = -1.0;
+ tmgr_trace_event_t event = NULL;
+ double value = -1.0;
+ ResourcePtr resource = NULL;
+ ModelPtr model = NULL;
+ unsigned int iter;
+
+ XBT_DEBUG
+ ("First Run! Let's \"purge\" events and put models in the right state");
+ while ((next_event_date = tmgr_history_next_date(history)) != -1.0) {
+ if (next_event_date > NOW)
+ break;
+ while ((event =
+ tmgr_history_get_next_event_leq(history, next_event_date,
+ &value,
+ (void **) &resource))) {
+ if (value >= 0){
+ resource->updateState(event, value, NOW);
+ }
+ }
+ }
+ xbt_dynar_foreach(model_list, iter, model)
+ model->updateActionsState(NOW, 0.0);
+}
+
+static void surf_share_resources(surf_model_t model)
+{
+ double next_action_end = -1.0;
+ int i = __sync_fetch_and_add(&surf_min_index, 1);
+ if (strcmp(model->getName(), "network NS3")) {
+ XBT_DEBUG("Running for Resource [%s]", model->getName());
+ next_action_end = model->shareResources(NOW);
+ XBT_DEBUG("Resource [%s] : next action end = %f",
+ model->getName(), next_action_end);
+ }
+ surf_mins[i] = next_action_end;
+}
+
+static void surf_update_actions_state(surf_model_t model)
+{
+ model->updateActionsState(NOW, surf_min);
+}
+
+double surf_solve(double max_date)
+{
+ surf_min = -1.0; /* duration */
+ double next_event_date = -1.0;
+ double model_next_action_end = -1.0;
+ double value = -1.0;
+ ResourcePtr resource = NULL;
+ ModelPtr model = NULL;
+ tmgr_trace_event_t event = NULL;
+ unsigned int iter;
+
+ if(!host_that_restart)
+ host_that_restart = xbt_dynar_new(sizeof(char*), NULL);
+
+ if (max_date != -1.0 && max_date != NOW) {
+ surf_min = max_date - NOW;
+ }
+
+ XBT_DEBUG("Looking for next action end for all models except NS3");
+
+ if (surf_mins == NULL) {
+ surf_mins = xbt_new(double, xbt_dynar_length(model_list_invoke));
+ }
+ surf_min_index = 0;
+
+ /* sequential version */
+ xbt_dynar_foreach(model_list_invoke, iter, model) {
+ surf_share_resources(static_cast<ModelPtr>(model));
+ }
+
+ unsigned i;
+ for (i = 0; i < xbt_dynar_length(model_list_invoke); i++) {
+ if ((surf_min < 0.0 || surf_mins[i] < surf_min)
+ && surf_mins[i] >= 0.0) {
+ surf_min = surf_mins[i];
+ }
+ }
+
+ XBT_DEBUG("Min for resources (remember that NS3 don't update that value) : %f", surf_min);
+
+ XBT_DEBUG("Looking for next trace event");
+
+ do {
+ XBT_DEBUG("Next TRACE event : %f", next_event_date);
+
+ next_event_date = tmgr_history_next_date(history);
+
+ if(!strcmp(surf_network_model->getName(), "network NS3")){
+ if(next_event_date!=-1.0 && surf_min!=-1.0) {
+ surf_min = MIN(next_event_date - NOW, surf_min);
+ } else{
+ surf_min = MAX(next_event_date - NOW, surf_min);
+ }
+
+ XBT_DEBUG("Run for network at most %f", surf_min);
+ // run until min or next flow
+ model_next_action_end = surf_network_model->shareResources(surf_min);
+
+ XBT_DEBUG("Min for network : %f", model_next_action_end);
+ if(model_next_action_end>=0.0)
+ surf_min = model_next_action_end;
+ }
+
+ if (next_event_date < 0.0) {
+ XBT_DEBUG("no next TRACE event. Stop searching for it");
+ break;
+ }
+
+ if ((surf_min == -1.0) || (next_event_date > NOW + surf_min)) break;
+
+ XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)", surf_min, NOW, next_event_date);
+ while ((event =
+ tmgr_history_get_next_event_leq(history, next_event_date,
+ &value,
+ (void **) &resource))) {
+ if (resource->isUsed() || xbt_dict_get_or_null(watched_hosts_lib, resource->getName())) {
+ surf_min = next_event_date - NOW;
+ XBT_DEBUG
+ ("This event will modify model state. Next event set to %f",
+ surf_min);
+ }
+ /* update state of model_obj according to new value. Does not touch lmm.
+ It will be modified if needed when updating actions */
+ XBT_DEBUG("Calling update_resource_state for resource %s with min %f",
+ resource->getName(), surf_min);
+ resource->updateState(event, value, next_event_date);
+ }
+ } while (1);
+
+ /* FIXME: Moved this test to here to avoid stopping simulation if there are actions running on cpus and all cpus are with availability = 0.
+ * This may cause an infinite loop if one cpu has a trace with periodicity = 0 and the other a trace with periodicity > 0.
+ * The options are: all traces with same periodicity(0 or >0) or we need to change the way how the events are managed */
+ if (surf_min == -1.0) {
+ XBT_DEBUG("No next event at all. Bail out now.");
+ return -1.0;
+ }
+
+ XBT_DEBUG("Duration set to %f", surf_min);
+
+ NOW = NOW + surf_min;
+ /* FIXME: model_list or model_list_invoke? revisit here later */
+ /* sequential version */
+ xbt_dynar_foreach(model_list, iter, model) {
+ surf_update_actions_state(model);
+ }
+
+#ifdef HAVE_TRACING
+ TRACE_paje_dump_buffer (0);
+#endif
+
+ return surf_min;
+}
+
+void routing_get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst,
+ xbt_dynar_t * route, double *latency){
+ routing_platf->getRouteAndLatency(src, dst, route, latency);
+}
+
+/*********
+ * MODEL *
+ *********/
+
+surf_model_t surf_resource_model(const void *host, int level) {
+ /* If level is SURF_WKS_LEVEL, ws is a workstation_CLM03 object. It has
+ * surf_resource at the generic_resource field. */
+ ResourcePtr ws = static_cast<ResourcePtr>(xbt_lib_get_level((xbt_dictelm_t) host, level));
+ return ws->getModel();
+}
+
+void *surf_as_cluster_get_backbone(AS_t as){
+ return static_cast<AsClusterPtr>(as)->p_backbone;
+}
+
+void surf_as_cluster_set_backbone(AS_t as, void* backbone){
+ static_cast<AsClusterPtr>(as)->p_backbone = static_cast<NetworkLinkPtr>(backbone);
+}
+
+const char *surf_model_name(surf_model_t model){
+ return model->getName();
+}
+
+surf_action_t surf_model_extract_done_action_set(surf_model_t model){
+ if (model->getDoneActionSet()->empty())
+ return NULL;
+ surf_action_t res = &model->getDoneActionSet()->front();
+ model->getDoneActionSet()->pop_front();
+ return res;
+}
+
+surf_action_t surf_model_extract_failed_action_set(surf_model_t model){
+ if (model->getFailedActionSet()->empty())
+ return NULL;
+ surf_action_t res = &model->getFailedActionSet()->front();
+ model->getFailedActionSet()->pop_front();
+ return res;
+}
+
+surf_action_t surf_model_extract_ready_action_set(surf_model_t model){
+ if (model->getReadyActionSet()->empty())
+ return NULL;
+ surf_action_t res = &model->getReadyActionSet()->front();
+ model->getReadyActionSet()->pop_front();
+ return res;
+}
+
+surf_action_t surf_model_extract_running_action_set(surf_model_t model){
+ if (model->getRunningActionSet()->empty())
+ return NULL;
+ surf_action_t res = &model->getRunningActionSet()->front();
+ model->getRunningActionSet()->pop_front();
+ return res;
+}
+
+int surf_model_running_action_set_size(surf_model_t model){
+ return model->getRunningActionSet()->size();
+}
+
+surf_action_t surf_workstation_model_execute_parallel_task(surf_workstation_model_t model,
+ int workstation_nb,
+ void **workstation_list,
+ double *computation_amount,
+ double *communication_amount,
+ double rate){
+ return static_cast<ActionPtr>(model->executeParallelTask(workstation_nb, workstation_list, computation_amount, communication_amount, rate));
+}
+
+surf_action_t surf_workstation_model_communicate(surf_workstation_model_t model, surf_resource_t src, surf_resource_t dst, double size, double rate){
+ return model->communicate(get_casted_workstation(src), get_casted_workstation(dst), size, rate);
+}
+
+xbt_dynar_t surf_workstation_model_get_route(surf_workstation_model_t model,
+ surf_resource_t src, surf_resource_t dst){
+ return model->getRoute(get_casted_workstation(src), get_casted_workstation(dst));
+}
+
+void surf_vm_workstation_model_create(const char *name, surf_resource_t ind_phys_host){
+ surf_vm_workstation_model->createResource(name, ind_phys_host);
+}
+
+surf_action_t surf_network_model_communicate(surf_network_model_t model, sg_routing_edge_t src, sg_routing_edge_t dst, double size, double rate){
+ return model->communicate(src, dst, size, rate);
+}
+
+const char *surf_resource_name(surf_cpp_resource_t resource){
+ return resource->getName();
+}
+
+xbt_dict_t surf_resource_get_properties(surf_cpp_resource_t resource){
+ return resource->getProperties();
+}
+
+e_surf_resource_state_t surf_resource_get_state(surf_cpp_resource_t resource){
+ return resource->getState();
+}
+
+void surf_resource_set_state(surf_cpp_resource_t resource, e_surf_resource_state_t state){
+ resource->setState(state);
+}
+
+surf_action_t surf_workstation_sleep(surf_resource_t resource, double duration){
+ return get_casted_workstation(resource)->sleep(duration);
+}
+
+double surf_workstation_get_speed(surf_resource_t resource, double load){
+ return get_casted_workstation(resource)->getSpeed(load);
+}
+
+double surf_workstation_get_available_speed(surf_resource_t resource){
+ return get_casted_workstation(resource)->getAvailableSpeed();
+}
+
+int surf_workstation_get_core(surf_resource_t resource){
+ return get_casted_workstation(resource)->getCore();
+}
+
+surf_action_t surf_workstation_execute(surf_resource_t resource, double size){
+ return get_casted_workstation(resource)->execute(size);
+}
+
+double surf_workstation_get_current_power_peak(surf_resource_t resource){
+ return get_casted_workstation(resource)->getCurrentPowerPeak();
+}
+
+double surf_workstation_get_power_peak_at(surf_resource_t resource, int pstate_index){
+ return get_casted_workstation(resource)->getPowerPeakAt(pstate_index);
+}
+
+int surf_workstation_get_nb_pstates(surf_resource_t resource){
+ return get_casted_workstation(resource)->getNbPstates();
+}
+
+void surf_workstation_set_power_peak_at(surf_resource_t resource, int pstate_index){
+ return get_casted_workstation(resource)->setPowerPeakAt(pstate_index);
+}
+
+double surf_workstation_get_consumed_energy(surf_resource_t resource){
+ xbt_assert(surf_energy!=NULL, "The Energy plugin is not active.");
+ std::map<CpuPtr, CpuEnergyPtr>::iterator cpuIt = surf_energy->find(get_casted_workstation(resource)->p_cpu);
+ return cpuIt->second->getConsumedEnergy();
+}
+
+xbt_dict_t surf_workstation_get_storage_list(surf_resource_t workstation){
+ return get_casted_workstation(workstation)->getStorageList();
+}
+
+surf_action_t surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path){
+ return get_casted_workstation(workstation)->open(mount, path);
+}
+
+surf_action_t surf_workstation_close(surf_resource_t workstation, surf_file_t fd){
+ return get_casted_workstation(workstation)->close(fd);
+}
+
+int surf_workstation_unlink(surf_resource_t workstation, surf_file_t fd){
+ return get_casted_workstation(workstation)->unlink(fd);
+}
+
+surf_action_t surf_workstation_ls(surf_resource_t workstation, const char* mount, const char *path){
+ return get_casted_workstation(workstation)->ls(mount, path);
+}
+
+size_t surf_workstation_get_size(surf_resource_t workstation, surf_file_t fd){
+ return get_casted_workstation(workstation)->getSize(fd);
+}
+
+surf_action_t surf_workstation_read(surf_resource_t resource, surf_file_t fd, sg_size_t size){
+ return get_casted_workstation(resource)->read(fd, size);
+}
+
+surf_action_t surf_workstation_write(surf_resource_t resource, surf_file_t fd, sg_size_t size){
+ return get_casted_workstation(resource)->write(fd, size);
+}
+
+xbt_dynar_t surf_workstation_get_info(surf_resource_t resource, surf_file_t fd){
+ return get_casted_workstation(resource)->getInfo(fd);
+}
+
+sg_size_t surf_workstation_get_free_size(surf_resource_t resource, const char* name){
+ return get_casted_workstation(resource)->getFreeSize(name);
+}
+
+sg_size_t surf_workstation_get_used_size(surf_resource_t resource, const char* name){
+ return get_casted_workstation(resource)->getUsedSize(name);
+}
+
+size_t surf_workstation_file_tell(surf_resource_t workstation, surf_file_t fd){
+ return get_casted_workstation(workstation)->fileTell(fd);
+}
+
+int surf_workstation_file_seek(surf_resource_t workstation, surf_file_t fd, sg_size_t offset, int origin){
+ return get_casted_workstation(workstation)->fileSeek(fd, offset, origin);
+}
+
+xbt_dynar_t surf_workstation_get_vms(surf_resource_t resource){
+ return get_casted_workstation(resource)->getVms();
+}
+
+void surf_workstation_get_params(surf_resource_t resource, ws_params_t params){
+ get_casted_workstation(resource)->getParams(params);
+}
+
+void surf_workstation_set_params(surf_resource_t resource, ws_params_t params){
+ get_casted_workstation(resource)->setParams(params);
+}
+
+void surf_vm_workstation_destroy(surf_resource_t resource){
+ delete get_casted_vm_workstation(resource);
+}
+
+void surf_vm_workstation_suspend(surf_resource_t resource){
+ get_casted_vm_workstation(resource)->suspend();
+}
+
+void surf_vm_workstation_resume(surf_resource_t resource){
+ get_casted_vm_workstation(resource)->resume();
+}
+
+void surf_vm_workstation_save(surf_resource_t resource){
+ get_casted_vm_workstation(resource)->save();
+}
+
+void surf_vm_workstation_restore(surf_resource_t resource){
+ get_casted_vm_workstation(resource)->restore();
+}
+
+void surf_vm_workstation_migrate(surf_resource_t resource, surf_resource_t ind_vm_ws_dest){
+ get_casted_vm_workstation(resource)->migrate(ind_vm_ws_dest);
+}
+
+surf_resource_t surf_vm_workstation_get_pm(surf_resource_t resource){
+ return get_casted_vm_workstation(resource)->getPm();
+}
+
+void surf_vm_workstation_set_bound(surf_resource_t resource, double bound){
+ return get_casted_vm_workstation(resource)->setBound(bound);
+}
+
+void surf_vm_workstation_set_affinity(surf_resource_t resource, surf_resource_t cpu, unsigned long mask){
+ return get_casted_vm_workstation(resource)->setAffinity(get_casted_cpu(cpu), mask);
+}
+
+int surf_network_link_is_shared(surf_cpp_resource_t link){
+ return static_cast<NetworkLinkPtr>(link)->isShared();
+}
+
+double surf_network_link_get_bandwidth(surf_cpp_resource_t link){
+ return static_cast<NetworkLinkPtr>(link)->getBandwidth();
+}
+
+double surf_network_link_get_latency(surf_cpp_resource_t link){
+ return static_cast<NetworkLinkPtr>(link)->getLatency();
+}
+
+xbt_dict_t surf_storage_get_content(surf_resource_t resource){
+ return static_cast<StoragePtr>(surf_storage_resource_priv(resource))->getContent();
+}
+
+sg_size_t surf_storage_get_size(surf_resource_t resource){
+ return static_cast<StoragePtr>(surf_storage_resource_priv(resource))->getSize();
+}
+
+void surf_storage_rename(surf_resource_t resource, const char* src, const char* dest){
+ static_cast<StoragePtr>(surf_storage_resource_priv(resource))->rename(src, dest);
+}
+
+surf_action_t surf_cpu_execute(surf_resource_t cpu, double size){
+ return get_casted_cpu(cpu)->execute(size);
+}
+
+surf_action_t surf_cpu_sleep(surf_resource_t cpu, double duration){
+ return get_casted_cpu(cpu)->sleep(duration);
+}
+
+double surf_action_get_start_time(surf_action_t action){
+ return action->getStartTime();
+}
+
+double surf_action_get_finish_time(surf_action_t action){
+ return action->getFinishTime();
+}
+
+double surf_action_get_remains(surf_action_t action){
+ return action->getRemains();
+}
+
+void surf_action_unref(surf_action_t action){
+ action->unref();
+}
+
+void surf_action_suspend(surf_action_t action){
+ action->suspend();
+}
+
+void surf_action_resume(surf_action_t action){
+ action->resume();
+}
+
+void surf_action_cancel(surf_action_t action){
+ action->cancel();
+}
+
+void surf_action_set_priority(surf_action_t action, double priority){
+ action->setPriority(priority);
+}
+
+void surf_action_set_category(surf_action_t action, const char *category){
+ action->setCategory(category);
+}
+
+void *surf_action_get_data(surf_action_t action){
+ return action->getData();
+}
+
+void surf_action_set_data(surf_action_t action, void *data){
+ action->setData(data);
+}
+
+e_surf_action_state_t surf_action_get_state(surf_action_t action){
+ return action->getState();
+}
+
+double surf_action_get_cost(surf_action_t action){
+ return action->getCost();
+}
+
+void surf_cpu_action_set_affinity(surf_action_t action, surf_resource_t cpu, unsigned long mask) {
+ static_cast<CpuActionPtr>(action)->setAffinity(get_casted_cpu(cpu), mask);
+}
+
+void surf_cpu_action_set_bound(surf_action_t action, double bound) {
+ static_cast<CpuActionPtr>(action)->setBound(bound);
+}
+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+double surf_network_action_get_latency_limited(surf_action_t action) {
+ return static_cast<NetworkActionPtr>(action)->getLatencyLimited();
+}
+#endif
+
+surf_file_t surf_storage_action_get_file(surf_action_t action){
+ return static_cast<StorageActionPtr>(action)->p_file;
+}
+
+xbt_dict_t surf_storage_action_get_ls_dict(surf_action_t action){
+ return static_cast<StorageActionPtr>(action)->p_lsDict;
+}
--- /dev/null
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_private.h"
+#include "surf_interface.hpp"
+#include "network_interface.hpp"
+#include "cpu_interface.hpp"
+#include "workstation_interface.hpp"
+#include "vm_workstation_interface.hpp"
+#include "simix/smx_host_private.h"
+#include "surf_routing.hpp"
+#include "simgrid/sg_config.h"
+#include "mc/mc.h"
+
+XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf,
+ "Logging specific to SURF (kernel)");
+
+/*********
+ * Utils *
+ *********/
+
+/* This function is a pimple that we ought to fix. But it won't be easy.
+ *
+ * The surf_solve() function does properly return the set of actions that changed.
+ * Instead, each model change a global data, and then the caller of surf_solve must
+ * pick into these sets of action_failed and action_done.
+ *
+ * This was not clean but ok as long as we didn't had to restart the processes when the resource comes back up.
+ * We worked by putting sentinel actions on every resources we are interested in,
+ * so that surf informs us if/when the corresponding resource fails.
+ *
+ * But this does not work to get Simix informed of when a resource comes back up, and this is where this pimple comes.
+ * We have a set of resources that are currently down and for which simix needs to know when it comes back up.
+ * And the current function is called *at every simulation step* to sweep over that set, searching for a resource
+ * that was turned back up in the meanwhile. This is UGLY and slow.
+ *
+ * The proper solution would be to not rely on globals for the action_failed and action_done swags.
+ * They must be passed as parameter by the caller (the handling of these actions in simix may let you
+ * think that these two sets can be merged, but their handling in SimDag induce the contrary unless this
+ * simdag code can check by itself whether the action is done of failed -- seems very doable, but yet more
+ * cleanup to do).
+ *
+ * Once surf_solve() is passed the set of actions that changed, you want to add a new set of resources back up
+ * as parameter to this function. You also want to add a boolean field "restart_watched" to each resource, and
+ * make sure that whenever a resource with this field enabled comes back up, it's added to that set so that Simix
+ * sees it and react accordingly. This would kill that need for surf to call simix.
+ *
+ */
+
+/*static void remove_watched_host(void *key)
+{
+ xbt_dict_remove(watched_hosts_lib, *(char**)key);
+}*/
+
+/*void surf_watched_hosts(void)
+{
+ char *key;
+ void *host;
+ xbt_dict_cursor_t cursor;
+ xbt_dynar_t hosts = xbt_dynar_new(sizeof(char*), NULL);
+
+ XBT_DEBUG("Check for host SURF_RESOURCE_ON on watched_hosts_lib");
+ xbt_dict_foreach(watched_hosts_lib, cursor, key, host)
+ {
+ if(SIMIX_host_get_state((smx_host_t)host) == SURF_RESOURCE_ON){
+ XBT_INFO("Restart processes on host: %s", SIMIX_host_get_name((smx_host_t)host));
+ SIMIX_host_autorestart((smx_host_t)host);
+ xbt_dynar_push_as(hosts, char*, key);
+ }
+ else
+ XBT_DEBUG("See SURF_RESOURCE_OFF on host: %s",key);
+ }
+ xbt_dynar_map(hosts, remove_watched_host);
+ xbt_dynar_free(&hosts);
+}*/
+
+/* model_list_invoke contains only surf_workstation and surf_vm_workstation.
+ * The callback functions of cpu_model and network_model will be called from
+ * those of these workstation models. */
+xbt_dynar_t model_list = NULL; /* for destroying all models correctly */
+xbt_dynar_t model_list_invoke = NULL; /* for invoking callbacks */
+
+tmgr_history_t history = NULL;
+lmm_system_t maxmin_system = NULL;
+xbt_dynar_t surf_path = NULL;
+xbt_dynar_t host_that_restart = NULL;
+xbt_dict_t watched_hosts_lib;
+
+surf_callback(void, void) surfExitCallbacks;
+
+s_surf_model_description_t surf_plugin_description[] = {
+ {"Energy",
+ "Cpu energy consumption.",
+ sg_energy_plugin_init},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+/* Don't forget to update the option description in smx_config when you change this */
+s_surf_model_description_t surf_network_model_description[] = {
+ {"LV08",
+ "Realistic network analytic model (slow-start modeled by multiplying latency by 10.4, bandwidth by .92; bottleneck sharing uses a payload of S=8775 for evaluating RTT). ",
+ surf_network_model_init_LegrandVelho},
+ {"Constant",
+ "Simplistic network model where all communication take a constant time (one second). This model provides the lowest realism, but is (marginally) faster.",
+ surf_network_model_init_Constant},
+ {"SMPI",
+ "Realistic network model specifically tailored for HPC settings (accurate modeling of slow start with correction factors on three intervals: < 1KiB, < 64 KiB, >= 64 KiB)",
+ surf_network_model_init_SMPI},
+ {"CM02",
+ "Legacy network analytic model (Very similar to LV08, but without corrective factors. The timings of small messages are thus poorly modeled).",
+ surf_network_model_init_CM02},
+#ifdef HAVE_GTNETS
+ {"GTNets",
+ "Network pseudo-model using the GTNets simulator instead of an analytic model",
+ surf_network_model_init_GTNETS},
+#endif
+#ifdef HAVE_NS3
+ {"NS3",
+ "Network pseudo-model using the NS3 tcp model instead of an analytic model",
+ surf_network_model_init_NS3},
+#endif
+ {"Reno",
+ "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
+ surf_network_model_init_Reno},
+ {"Reno2",
+ "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
+ surf_network_model_init_Reno2},
+ {"Vegas",
+ "Model from Steven H. Low using lagrange_solve instead of lmm_solve (experts only; check the code for more info).",
+ surf_network_model_init_Vegas},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_cpu_model_description[] = {
+ {"Cas01",
+ "Simplistic CPU model (time=size/power).",
+ surf_cpu_model_init_Cas01},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_workstation_model_description[] = {
+ {"default",
+ "Default workstation model. Currently, CPU:Cas01 and network:LV08 (with cross traffic enabled)",
+ surf_workstation_model_init_current_default},
+ {"compound",
+ "Workstation model that is automatically chosen if you change the network and CPU models",
+ surf_workstation_model_init_compound},
+ {"ptask_L07", "Workstation model somehow similar to Cas01+CM02 but allowing parallel tasks",
+ surf_workstation_model_init_ptask_L07},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_vm_workstation_model_description[] = {
+ {"default",
+ "Default vm workstation model.",
+ surf_vm_workstation_model_init_current_default},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_optimization_mode_description[] = {
+ {"Lazy",
+ "Lazy action management (partial invalidation in lmm + heap in action remaining).",
+ NULL},
+ {"TI",
+ "Trace integration. Highly optimized mode when using availability traces (only available for the Cas01 CPU model for now).",
+ NULL},
+ {"Full",
+ "Full update of remaining and variables. Slow but may be useful when debugging.",
+ NULL},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_surf_model_description_t surf_storage_model_description[] = {
+ {"default",
+ "Simplistic storage model.",
+ surf_storage_model_init_default},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+#ifdef CONTEXT_THREADS
+static xbt_parmap_t surf_parmap = NULL; /* parallel map on models */
+#endif
+
+double NOW = 0;
+double *surf_mins = NULL; /* return value of share_resources for each model */
+int surf_min_index; /* current index in surf_mins */
+double surf_min; /* duration determined by surf_solve */
+
+double surf_get_clock(void)
+{
+ return NOW;
+}
+
+#ifdef _XBT_WIN32
+# define FILE_DELIM "\\"
+#else
+# define FILE_DELIM "/" /* FIXME: move to better location */
+#endif
+
+FILE *surf_fopen(const char *name, const char *mode)
+{
+ unsigned int cpt;
+ char *path_elm = NULL;
+ char *buff;
+ FILE *file = NULL;
+
+ xbt_assert(name);
+
+ if (__surf_is_absolute_file_path(name)) /* don't mess with absolute file names */
+ return fopen(name, mode);
+
+ /* search relative files in the path */
+ xbt_dynar_foreach(surf_path, cpt, path_elm) {
+ buff = bprintf("%s" FILE_DELIM "%s", path_elm, name);
+ file = fopen(buff, mode);
+ free(buff);
+
+ if (file)
+ return file;
+ }
+ return NULL;
+}
+
+
+#ifndef MAX_DRIVE
+#define MAX_DRIVE 26
+#endif
+
+#ifdef _XBT_WIN32
+#include <windows.h>
+static const char *disk_drives_letter_table[MAX_DRIVE] = {
+ "A:\\",
+ "B:\\",
+ "C:\\",
+ "D:\\",
+ "E:\\",
+ "F:\\",
+ "G:\\",
+ "H:\\",
+ "I:\\",
+ "J:\\",
+ "K:\\",
+ "L:\\",
+ "M:\\",
+ "N:\\",
+ "O:\\",
+ "P:\\",
+ "Q:\\",
+ "R:\\",
+ "S:\\",
+ "T:\\",
+ "U:\\",
+ "V:\\",
+ "W:\\",
+ "X:\\",
+ "Y:\\",
+ "Z:\\"
+};
+#endif
+
+/*
+ * Returns the initial path. On Windows the initial path is
+ * the current directory for the current process in the other
+ * case the function returns "./" that represents the current
+ * directory on Unix/Linux platforms.
+ */
+
+const char *__surf_get_initial_path(void)
+{
+
+#ifdef _XBT_WIN32
+ unsigned i;
+ char current_directory[MAX_PATH + 1] = { 0 };
+ unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory);
+ char root[4] = { 0 };
+
+ if (!len)
+ return NULL;
+
+ strncpy(root, current_directory, 3);
+
+ for (i = 0; i < MAX_DRIVE; i++) {
+ if (toupper(root[0]) == disk_drives_letter_table[i][0])
+ return disk_drives_letter_table[i];
+ }
+
+ return NULL;
+#else
+ return "./";
+#endif
+}
+
+/* The __surf_is_absolute_file_path() returns 1 if
+ * file_path is a absolute file path, in the other
+ * case the function returns 0.
+ */
+int __surf_is_absolute_file_path(const char *file_path)
+{
+#ifdef _XBT_WIN32
+ WIN32_FIND_DATA wfd = { 0 };
+ HANDLE hFile = FindFirstFile(file_path, &wfd);
+
+ if (INVALID_HANDLE_VALUE == hFile)
+ return 0;
+
+ FindClose(hFile);
+ return 1;
+#else
+ return (file_path[0] == '/');
+#endif
+}
+
+/** Displays the long description of all registered models, and quit */
+void model_help(const char *category, s_surf_model_description_t * table)
+{
+ int i;
+ printf("Long description of the %s models accepted by this simulator:\n",
+ category);
+ for (i = 0; table[i].name; i++)
+ printf(" %s: %s\n", table[i].name, table[i].description);
+}
+
+int find_model_description(s_surf_model_description_t * table,
+ const char *name)
+{
+ int i;
+ char *name_list = NULL;
+
+ for (i = 0; table[i].name; i++)
+ if (!strcmp(name, table[i].name)) {
+ return i;
+ }
+ name_list = strdup(table[0].name);
+ for (i = 1; table[i].name; i++) {
+ name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3);
+ strcat(name_list, ", ");
+ strcat(name_list, table[i].name);
+ }
+ xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list);
+ return -1;
+}
+
+static XBT_INLINE void routing_asr_host_free(void *p)
+{
+ delete ((RoutingEdgePtr) p);
+}
+
+static XBT_INLINE void routing_asr_prop_free(void *p)
+{
+ xbt_dict_t elm = (xbt_dict_t) p;
+ xbt_dict_free(&elm);
+}
+
+static XBT_INLINE void surf_cpu_free(void *r)
+{
+ delete static_cast<CpuPtr>(r);
+}
+
+static XBT_INLINE void surf_link_free(void *r)
+{
+ delete static_cast<NetworkLinkPtr>(r);
+}
+
+static XBT_INLINE void surf_workstation_free(void *r)
+{
+ delete static_cast<WorkstationPtr>(r);
+}
+
+
+void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
+ *ver_major = SIMGRID_VERSION_MAJOR;
+ *ver_minor = SIMGRID_VERSION_MINOR;
+ *ver_patch = SIMGRID_VERSION_PATCH;
+}
+
+void surf_init(int *argc, char **argv)
+{
+ XBT_DEBUG("Create all Libs");
+ host_lib = xbt_lib_new();
+ link_lib = xbt_lib_new();
+ as_router_lib = xbt_lib_new();
+ storage_lib = xbt_lib_new();
+ storage_type_lib = xbt_lib_new();
+ watched_hosts_lib = xbt_dict_new_homogeneous(NULL);
+
+ XBT_DEBUG("Add routing levels");
+ ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
+ ROUTING_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
+ ROUTING_PROP_ASR_LEVEL = xbt_lib_add_level(as_router_lib,routing_asr_prop_free);
+
+ XBT_DEBUG("Add SURF levels");
+ SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_cpu_free);
+ SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_workstation_free);
+ SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_link_free);
+
+ xbt_init(argc, argv);
+ if (!model_list)
+ model_list = xbt_dynar_new(sizeof(ModelPtr), NULL);
+ if (!model_list_invoke)
+ model_list_invoke = xbt_dynar_new(sizeof(ModelPtr), NULL);
+ if (!history)
+ history = tmgr_history_new();
+
+#ifdef HAVE_TRACING
+ TRACE_add_start_function(TRACE_surf_alloc);
+ TRACE_add_end_function(TRACE_surf_release);
+#endif
+
+ sg_config_init(argc, argv);
+
+ if (MC_is_active())
+ MC_memory_init();
+}
+
+void surf_exit(void)
+{
+ unsigned int iter;
+ ModelPtr model = NULL;
+
+#ifdef HAVE_TRACING
+ TRACE_end(); /* Just in case it was not called by the upper
+ * layer (or there is no upper layer) */
+#endif
+
+ sg_config_finalize();
+
+ xbt_dynar_free(&host_that_restart);
+ xbt_dynar_free(&surf_path);
+
+ xbt_lib_free(&host_lib);
+ xbt_lib_free(&link_lib);
+ xbt_lib_free(&as_router_lib);
+ xbt_lib_free(&storage_lib);
+ xbt_lib_free(&storage_type_lib);
+
+ xbt_dict_free(&watched_hosts_lib);
+
+ xbt_dynar_foreach(model_list, iter, model)
+ delete model;
+ xbt_dynar_free(&model_list);
+ xbt_dynar_free(&model_list_invoke);
+ routing_exit();
+
+ surf_callback_emit(surfExitCallbacks);
+
+ if (maxmin_system) {
+ lmm_system_free(maxmin_system);
+ maxmin_system = NULL;
+ }
+ if (history) {
+ tmgr_history_free(history);
+ history = NULL;
+ }
+
+#ifdef CONTEXT_THREADS
+ xbt_parmap_destroy(surf_parmap);
+#endif
+
+ xbt_free(surf_mins);
+ surf_mins = NULL;
+
+ tmgr_finalize();
+ surf_parse_lex_destroy();
+ surf_parse_free_callbacks();
+
+ NOW = 0; /* Just in case the user plans to restart the simulation afterward */
+}
+
+/*********
+ * Model *
+ *********/
+
+Model::Model(const char *name)
+ : p_maxminSystem(NULL)
+ , p_name(name)
+{
+ p_readyActionSet = new ActionList();
+ p_runningActionSet = new ActionList();
+ p_failedActionSet = new ActionList();
+ p_doneActionSet = new ActionList();
+
+ p_modifiedSet = NULL;
+ p_actionHeap = NULL;
+ p_updateMechanism = UM_UNDEFINED;
+ m_selectiveUpdate = 0;
+}
+
+Model::~Model(){
+ delete p_readyActionSet;
+ delete p_runningActionSet;
+ delete p_failedActionSet;
+ delete p_doneActionSet;
+}
+
+double Model::shareResources(double now)
+{
+ //FIXME: set the good function once and for all
+ if (p_updateMechanism == UM_LAZY)
+ return shareResourcesLazy(now);
+ else if (p_updateMechanism == UM_FULL)
+ return shareResourcesFull(now);
+ else
+ xbt_die("Invalid cpu update mechanism!");
+}
+
+double Model::shareResourcesLazy(double now)
+{
+ ActionPtr action = NULL;
+ double min = -1;
+ double value;
+
+ XBT_DEBUG
+ ("Before share resources, the size of modified actions set is %zd",
+ p_modifiedSet->size());
+
+ lmm_solve(p_maxminSystem);
+
+ XBT_DEBUG
+ ("After share resources, The size of modified actions set is %zd",
+ p_modifiedSet->size());
+
+ while(!p_modifiedSet->empty()) {
+ action = &(p_modifiedSet->front());
+ p_modifiedSet->pop_front();
+ int max_dur_flag = 0;
+
+ if (action->getStateSet() != p_runningActionSet)
+ continue;
+
+ /* bogus priority, skip it */
+ if (action->getPriority() <= 0)
+ continue;
+
+ action->updateRemainingLazy(now);
+
+ min = -1;
+ value = lmm_variable_getvalue(action->getVariable());
+ if (value > 0) {
+ if (action->getRemains() > 0) {
+ value = action->getRemainsNoUpdate() / value;
+ min = now + value;
+ } else {
+ value = 0.0;
+ min = now;
+ }
+ }
+
+ if ((action->getMaxDuration() != NO_MAX_DURATION)
+ && (min == -1
+ || action->getStartTime() +
+ action->getMaxDuration() < min)) {
+ min = action->getStartTime() +
+ action->getMaxDuration();
+ max_dur_flag = 1;
+ }
+
+ XBT_DEBUG("Action(%p) Start %f Finish %f Max_duration %f", action,
+ action->getStartTime(), now + value,
+ action->getMaxDuration());
+
+ if (min != -1) {
+ action->heapRemove(p_actionHeap);
+ action->heapInsert(p_actionHeap, min, max_dur_flag ? MAX_DURATION : NORMAL);
+ XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min,
+ now);
+ } else DIE_IMPOSSIBLE;
+ }
+
+ //hereafter must have already the min value for this resource model
+ if (xbt_heap_size(p_actionHeap) > 0)
+ min = xbt_heap_maxkey(p_actionHeap) - now;
+ else
+ min = -1;
+
+ XBT_DEBUG("The minimum with the HEAP %f", min);
+
+ return min;
+}
+
+double Model::shareResourcesFull(double /*now*/) {
+ THROW_UNIMPLEMENTED;
+}
+
+double Model::shareResourcesMaxMin(ActionListPtr running_actions,
+ lmm_system_t sys,
+ void (*solve) (lmm_system_t))
+{
+ ActionPtr action = NULL;
+ double min = -1;
+ double value = -1;
+
+ solve(sys);
+
+ ActionList::iterator it(running_actions->begin()), itend(running_actions->end());
+ for(; it != itend ; ++it) {
+ action = &*it;
+ value = lmm_variable_getvalue(action->getVariable());
+ if ((value > 0) || (action->getMaxDuration() >= 0))
+ break;
+ }
+
+ if (!action)
+ return -1.0;
+
+ if (value > 0) {
+ if (action->getRemains() > 0)
+ min = action->getRemainsNoUpdate() / value;
+ else
+ min = 0.0;
+ if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min))
+ min = action->getMaxDuration();
+ } else
+ min = action->getMaxDuration();
+
+
+ for (++it; it != itend; ++it) {
+ action = &*it;
+ value = lmm_variable_getvalue(action->getVariable());
+ if (value > 0) {
+ if (action->getRemains() > 0)
+ value = action->getRemainsNoUpdate() / value;
+ else
+ value = 0.0;
+ if (value < min) {
+ min = value;
+ XBT_DEBUG("Updating min (value) with %p: %f", action, min);
+ }
+ }
+ if ((action->getMaxDuration() >= 0) && (action->getMaxDuration() < min)) {
+ min = action->getMaxDuration();
+ XBT_DEBUG("Updating min (duration) with %p: %f", action, min);
+ }
+ }
+ XBT_DEBUG("min value : %f", min);
+
+ return min;
+}
+
+void Model::updateActionsState(double now, double delta)
+{
+ if (p_updateMechanism == UM_FULL)
+ updateActionsStateFull(now, delta);
+ else if (p_updateMechanism == UM_LAZY)
+ updateActionsStateLazy(now, delta);
+ else
+ xbt_die("Invalid cpu update mechanism!");
+}
+
+void Model::updateActionsStateLazy(double /*now*/, double /*delta*/)
+{
+}
+
+void Model::updateActionsStateFull(double /*now*/, double /*delta*/)
+{
+}
+
+/************
+ * Resource *
+ ************/
+
+Resource::Resource()
+: p_name(NULL), p_properties(NULL), p_model(NULL)
+{}
+
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props)
+ : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ , m_running(true), m_stateCurrent(SURF_RESOURCE_ON)
+{}
+
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint)
+ : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ , m_running(true), m_stateCurrent(SURF_RESOURCE_ON), p_constraint(constraint)
+{}
+
+Resource::Resource(ModelPtr model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit)
+ : p_name(xbt_strdup(name)), p_properties(props), p_model(model)
+ , m_running(true), m_stateCurrent(stateInit)
+{}
+
+Resource::~Resource() {
+ xbt_free((void*)p_name);
+ xbt_dict_free(&p_properties);
+}
+
+e_surf_resource_state_t Resource::getState()
+{
+ return m_stateCurrent;
+}
+
+void Resource::setState(e_surf_resource_state_t state)
+{
+ m_stateCurrent = state;
+}
+
+bool Resource::isOn()
+{
+ return m_running;
+}
+
+void Resource::turnOn()
+{
+ if (!m_running) {
+ m_running = true;
+ }
+}
+
+void Resource::turnOff()
+{
+ if (m_running) {
+ m_running = false;
+ }
+}
+
+ModelPtr Resource::getModel() {
+ return p_model;
+}
+
+const char *Resource::getName() {
+ return p_name;
+}
+
+xbt_dict_t Resource::getProperties() {
+ if (p_properties==NULL)
+ p_properties = xbt_dict_new();
+ return p_properties;
+}
+
+lmm_constraint_t Resource::getConstraint() {
+ return p_constraint;
+}
+
+/**********
+ * Action *
+ **********/
+
+const char *surf_action_state_names[6] = {
+ "SURF_ACTION_READY",
+ "SURF_ACTION_RUNNING",
+ "SURF_ACTION_FAILED",
+ "SURF_ACTION_DONE",
+ "SURF_ACTION_TO_FREE",
+ "SURF_ACTION_NOT_IN_THE_SYSTEM"
+};
+
+Action::Action()
+: m_refcount(1)
+{}
+
+Action::Action(ModelPtr model, double cost, bool failed)
+ : m_priority(1.0)
+ , m_refcount(1)
+ , m_remains(cost)
+ , m_maxDuration(NO_MAX_DURATION)
+ , m_finish(-1.0)
+ , m_failed(failed)
+ , m_start(surf_get_clock())
+ , m_cost(cost)
+ , p_model(model)
+ , p_data(NULL)
+ , p_variable(NULL)
+ , m_lastValue(0)
+ , m_lastUpdate(0)
+ , m_suspended(false)
+{
+ #ifdef HAVE_TRACING
+ p_category = NULL;
+ #endif
+ p_stateHookup.prev = 0;
+ p_stateHookup.next = 0;
+ if (failed)
+ p_stateSet = getModel()->getFailedActionSet();
+ else
+ p_stateSet = getModel()->getRunningActionSet();
+
+ p_stateSet->push_back(*this);
+}
+
+Action::Action(ModelPtr model, double cost, bool failed, lmm_variable_t var)
+ : m_priority(1.0)
+ , m_refcount(1)
+ , m_remains(cost)
+ , m_maxDuration(NO_MAX_DURATION)
+ , m_finish(-1.0)
+ , m_failed(failed)
+ , m_start(surf_get_clock())
+ , m_cost(cost)
+ , p_model(model)
+ , p_data(NULL)
+ , p_variable(var)
+ , m_lastValue(0)
+ , m_lastUpdate(0)
+ , m_suspended(false)
+{
+ #ifdef HAVE_TRACING
+ p_category = NULL;
+ #endif
+ p_stateHookup.prev = 0;
+ p_stateHookup.next = 0;
+ if (failed)
+ p_stateSet = getModel()->getFailedActionSet();
+ else
+ p_stateSet = getModel()->getRunningActionSet();
+
+ p_stateSet->push_back(*this);
+}
+
+Action::~Action() {
+#ifdef HAVE_TRACING
+ xbt_free(p_category);
+#endif
+}
+
+void Action::finish() {
+ m_finish = surf_get_clock();
+}
+
+e_surf_action_state_t Action::getState()
+{
+ if (p_stateSet == getModel()->getReadyActionSet())
+ return SURF_ACTION_READY;
+ if (p_stateSet == getModel()->getRunningActionSet())
+ return SURF_ACTION_RUNNING;
+ if (p_stateSet == getModel()->getFailedActionSet())
+ return SURF_ACTION_FAILED;
+ if (p_stateSet == getModel()->getDoneActionSet())
+ return SURF_ACTION_DONE;
+ return SURF_ACTION_NOT_IN_THE_SYSTEM;
+}
+
+void Action::setState(e_surf_action_state_t state)
+{
+ //surf_action_state_t action_state = &(action->model_type->states);
+ XBT_IN("(%p,%s)", this, surf_action_state_names[state]);
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ if (state == SURF_ACTION_READY)
+ p_stateSet = getModel()->getReadyActionSet();
+ else if (state == SURF_ACTION_RUNNING)
+ p_stateSet = getModel()->getRunningActionSet();
+ else if (state == SURF_ACTION_FAILED)
+ p_stateSet = getModel()->getFailedActionSet();
+ else if (state == SURF_ACTION_DONE)
+ p_stateSet = getModel()->getDoneActionSet();
+ else
+ p_stateSet = NULL;
+
+ if (p_stateSet)
+ p_stateSet->push_back(*this);
+ XBT_OUT();
+}
+
+double Action::getBound()
+{
+ return (p_variable) ? lmm_variable_getbound(p_variable) : 0;
+}
+
+void Action::setBound(double bound)
+{
+ XBT_IN("(%p,%g)", this, bound);
+ if (p_variable)
+ lmm_update_variable_bound(getModel()->getMaxminSystem(), getVariable(), bound);
+
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
+ XBT_OUT();
+}
+
+double Action::getStartTime()
+{
+ return m_start;
+}
+
+double Action::getFinishTime()
+{
+ /* keep the function behavior, some models (cpu_ti) change the finish time before the action end */
+ return m_remains == 0 ? m_finish : -1;
+}
+
+void Action::setData(void* data)
+{
+ p_data = data;
+}
+
+#ifdef HAVE_TRACING
+void Action::setCategory(const char *category)
+{
+ XBT_IN("(%p,%s)", this, category);
+ p_category = xbt_strdup(category);
+ XBT_OUT();
+}
+#endif
+
+void Action::ref(){
+ m_refcount++;
+}
+
+void Action::setMaxDuration(double duration)
+{
+ XBT_IN("(%p,%g)", this, duration);
+ m_maxDuration = duration;
+ if (getModel()->getUpdateMechanism() == UM_LAZY) // remove action from the heap
+ heapRemove(getModel()->getActionHeap());
+ XBT_OUT();
+}
+
+void Action::gapRemove() {}
+
+void Action::setPriority(double priority)
+{
+ XBT_IN("(%p,%g)", this, priority);
+ m_priority = priority;
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), priority);
+
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
+ XBT_OUT();
+}
+
+void Action::cancel(){
+ setState(SURF_ACTION_FAILED);
+ if (getModel()->getUpdateMechanism() == UM_LAZY) {
+ if (actionLmmHook::is_linked())
+ getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
+ heapRemove(getModel()->getActionHeap());
+ }
+}
+
+int Action::unref(){
+ m_refcount--;
+ if (!m_refcount) {
+ if (actionHook::is_linked())
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ if (getVariable())
+ lmm_variable_free(getModel()->getMaxminSystem(), getVariable());
+ if (getModel()->getUpdateMechanism() == UM_LAZY) {
+ /* remove from heap */
+ heapRemove(getModel()->getActionHeap());
+ if (actionLmmHook::is_linked())
+ getModel()->getModifiedSet()->erase(getModel()->getModifiedSet()->iterator_to(*this));
+ }
+ delete this;
+ return 1;
+ }
+ return 0;
+}
+
+void Action::suspend()
+{
+ XBT_IN("(%p)", this);
+ if (m_suspended != 2) {
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), 0.0);
+ m_suspended = 1;
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
+ }
+ XBT_OUT();
+}
+
+void Action::resume()
+{
+ XBT_IN("(%p)", this);
+ if (m_suspended != 2) {
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), m_priority);
+ m_suspended = 0;
+ if (getModel()->getUpdateMechanism() == UM_LAZY)
+ heapRemove(getModel()->getActionHeap());
+ }
+ XBT_OUT();
+}
+
+bool Action::isSuspended()
+{
+ return m_suspended == 1;
+}
+/* insert action on heap using a given key and a hat (heap_action_type)
+ * a hat can be of three types for communications:
+ *
+ * NORMAL = this is a normal heap entry stating the date to finish transmitting
+ * LATENCY = this is a heap entry to warn us when the latency is payed
+ * MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached
+ */
+void Action::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat)
+{
+ m_hat = hat;
+ xbt_heap_push(heap, this, key);
+}
+
+void Action::heapRemove(xbt_heap_t heap)
+{
+ m_hat = NOTSET;
+ if (m_indexHeap >= 0) {
+ xbt_heap_remove(heap, m_indexHeap);
+ }
+}
+
+/* added to manage the communication action's heap */
+void surf_action_lmm_update_index_heap(void *action, int i) {
+ ((ActionPtr)action)->updateIndexHeap(i);
+}
+
+void Action::updateIndexHeap(int i) {
+ m_indexHeap = i;
+}
+
+double Action::getRemains()
+{
+ XBT_IN("(%p)", this);
+ /* update remains before return it */
+ if (getModel()->getUpdateMechanism() == UM_LAZY) /* update remains before return it */
+ updateRemainingLazy(surf_get_clock());
+ XBT_OUT();
+ return m_remains;
+}
+
+double Action::getRemainsNoUpdate()
+{
+ return m_remains;
+}
+
+//FIXME split code in the right places
+void Action::updateRemainingLazy(double now)
+{
+ double delta = 0.0;
+
+ if(getModel() == static_cast<ModelPtr>(surf_network_model))
+ {
+ if (m_suspended != 0)
+ return;
+ }
+ else
+ {
+ xbt_assert(p_stateSet == getModel()->getRunningActionSet(),
+ "You're updating an action that is not running.");
+
+ /* bogus priority, skip it */
+ xbt_assert(m_priority > 0,
+ "You're updating an action that seems suspended.");
+ }
+
+ delta = now - m_lastUpdate;
+
+ if (m_remains > 0) {
+ XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, m_remains, m_lastUpdate);
+ double_update(&m_remains, m_lastValue * delta);
+
+#ifdef HAVE_TRACING
+ if (getModel() == static_cast<ModelPtr>(surf_cpu_model_pm) && TRACE_is_enabled()) {
+ ResourcePtr cpu = static_cast<ResourcePtr>(lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0)));
+ TRACE_surf_host_set_utilization(cpu->getName(), getCategory(), m_lastValue, m_lastUpdate, now - m_lastUpdate);
+ }
+#endif
+ XBT_DEBUG("Updating action(%p): remains is now %f", this, m_remains);
+ }
+
+ if(getModel() == static_cast<ModelPtr>(surf_network_model))
+ {
+ if (m_maxDuration != NO_MAX_DURATION)
+ double_update(&m_maxDuration, delta);
+
+ //FIXME: duplicated code
+ if ((m_remains <= 0) &&
+ (lmm_get_variable_weight(getVariable()) > 0)) {
+ finish();
+ setState(SURF_ACTION_DONE);
+ heapRemove(getModel()->getActionHeap());
+ } else if (((m_maxDuration != NO_MAX_DURATION)
+ && (m_maxDuration <= 0))) {
+ finish();
+ setState(SURF_ACTION_DONE);
+ heapRemove(getModel()->getActionHeap());
+ }
+ }
+
+ m_lastUpdate = now;
+ m_lastValue = lmm_variable_getvalue(getVariable());
+}
+
--- /dev/null
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SURF_MODEL_H_
+#define SURF_MODEL_H_
+
+#include <xbt.h>
+#include <string>
+#include <vector>
+#include <memory>
+#include <boost/function.hpp>
+#include <boost/intrusive/list.hpp>
+#include "surf/trace_mgr.h"
+#include "xbt/lib.h"
+#include "surf/surf_routing.h"
+#include "simgrid/platf_interface.h"
+#include "surf/surf.h"
+#include "surf/surf_private.h"
+#include "internal_config.h"
+
+#ifdef LIBSIGC
+#include <sigc++/sigc++.h>
+#define surf_callback(arg1, ...) sigc::signal<arg1,__VA_ARGS__>
+#define surf_callback_connect(callback, fun_ptr) callback.connect(sigc::ptr_fun(fun_ptr))
+#define surf_callback_emit(callback, ...) callback.emit(__VA_ARGS__)
+#else
+#include <boost/signals2.hpp>
+#define surf_callback(arg1, ...) boost::signals2::signal<arg1(__VA_ARGS__)>
+#define surf_callback_connect(callback, fun_ptr) callback.connect(fun_ptr)
+#define surf_callback_emit(callback, ...) callback(__VA_ARGS__)
+#endif
+
+extern tmgr_history_t history;
+#define NO_MAX_DURATION -1.0
+
+using namespace std;
+
+/*********
+ * Utils *
+ *********/
+
+/* user-visible parameters */
+extern double sg_tcp_gamma;
+extern double sg_sender_gap;
+extern double sg_latency_factor;
+extern double sg_bandwidth_factor;
+extern double sg_weight_S_parameter;
+extern int sg_network_crosstraffic;
+#ifdef HAVE_GTNETS
+extern double sg_gtnets_jitter;
+extern int sg_gtnets_jitter_seed;
+#endif
+extern xbt_dynar_t surf_path;
+
+extern "C" {
+XBT_PUBLIC(double) surf_get_clock(void);
+}
+
+extern double sg_sender_gap;
+XBT_PUBLIC(int) SURF_CPU_LEVEL; //Surf cpu level
+
+extern surf_callback(void, void) surfExitCallbacks;
+
+int __surf_is_absolute_file_path(const char *file_path);
+
+/***********
+ * Classes *
+ ***********/
+//class Model;
+typedef Model* ModelPtr;
+
+//class Resource;
+typedef Resource* ResourcePtr;
+
+//class Action;
+typedef Action* ActionPtr;
+
+typedef boost::intrusive::list<Action> ActionList;
+typedef ActionList* ActionListPtr;
+typedef boost::intrusive::list_base_hook<> actionHook;
+
+struct lmmTag;
+typedef boost::intrusive::list<Action, boost::intrusive::base_hook<boost::intrusive::list_base_hook<boost::intrusive::tag<lmmTag> > > > ActionLmmList;
+typedef ActionLmmList* ActionLmmListPtr;
+typedef boost::intrusive::list_base_hook<boost::intrusive::tag<lmmTag> > actionLmmHook;
+
+
+enum heap_action_type{
+ LATENCY = 100,
+ MAX_DURATION,
+ NORMAL,
+ NOTSET
+};
+
+/*********
+ * Trace *
+ *********/
+/* For the trace and trace:connect tag (store their content till the end of the parsing) */
+XBT_PUBLIC_DATA(xbt_dict_t) traces_set_list;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_host_avail;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_power;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_link_avail;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_bandwidth;
+XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_latency;
+
+/*********
+ * Model *
+ *********/
+XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
+
+/** @ingroup SURF_interface
+ * @brief SURF model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class Model {
+public:
+ /**
+ * @brief Model constructor
+ *
+ * @param name the name of the model
+ */
+ Model(const char *name);
+
+ /**
+ * @brief Model destructor
+ */
+ virtual ~Model();
+
+ /**
+ * @brief Get the name of the current Model
+ *
+ * @return The name of the current Model
+ */
+ const char *getName() {return p_name;}
+
+ /**
+ * @brief Get the set of [actions](@ref Action) in *ready* state
+ *
+ * @return The set of [actions](@ref Action) in *ready* state
+ */
+ virtual ActionListPtr getReadyActionSet() {return p_readyActionSet;}
+
+ /**
+ * @brief Get the set of [actions](@ref Action) in *running* state
+ *
+ * @return The set of [actions](@ref Action) in *running* state
+ */
+ virtual ActionListPtr getRunningActionSet() {return p_runningActionSet;}
+
+ /**
+ * @brief Get the set of [actions](@ref Action) in *failed* state
+ *
+ * @return The set of [actions](@ref Action) in *failed* state
+ */
+ virtual ActionListPtr getFailedActionSet() {return p_failedActionSet;}
+
+ /**
+ * @brief Get the set of [actions](@ref Action) in *done* state
+ *
+ * @return The set of [actions](@ref Action) in *done* state
+ */
+ virtual ActionListPtr getDoneActionSet() {return p_doneActionSet;}
+
+ /**
+ * @brief Get the set of modified [actions](@ref Action)
+ *
+ * @return The set of modified [actions](@ref Action)
+ */
+ virtual ActionLmmListPtr getModifiedSet() {return p_modifiedSet;}
+
+ /**
+ * @brief Get the maxmin system of the current Model
+ *
+ * @return The maxmin system of the current Model
+ */
+ lmm_system_t getMaxminSystem() {return p_maxminSystem;}
+
+ /**
+ * @brief Get the update mechanism of the current Model
+ * @see e_UM_t
+ *
+ * @return [description]
+ */
+ e_UM_t getUpdateMechanism() {return p_updateMechanism;}
+
+ /**
+ * @brief Get Action heap
+ * @details [TODO]
+ *
+ * @return The Action heap
+ */
+ xbt_heap_t getActionHeap() {return p_actionHeap;}
+
+ /**
+ * @brief share the resources
+ * @details Share the resources between the actions
+ *
+ * @param now [TODO]
+ * @return the date of the next action will finish
+ */
+ virtual double shareResources(double now);
+ virtual double shareResourcesLazy(double now);
+ virtual double shareResourcesFull(double now);
+ double shareResourcesMaxMin(ActionListPtr running_actions,
+ lmm_system_t sys,
+ void (*solve) (lmm_system_t));
+
+ /**
+ * @brief Update state of actions
+ * @details [TODO]
+ *
+ * @param now [TODO]
+ * @param delta [TODO]
+ */
+ virtual void updateActionsState(double now, double delta);
+ virtual void updateActionsStateLazy(double now, double delta);
+ virtual void updateActionsStateFull(double now, double delta);
+
+protected:
+ ActionLmmListPtr p_modifiedSet;
+ lmm_system_t p_maxminSystem;
+ e_UM_t p_updateMechanism;
+ int m_selectiveUpdate;
+ xbt_heap_t p_actionHeap;
+
+private:
+ const char *p_name;
+
+ ActionListPtr p_readyActionSet; /**< Actions in state SURF_ACTION_READY */
+ ActionListPtr p_runningActionSet; /**< Actions in state SURF_ACTION_RUNNING */
+ ActionListPtr p_failedActionSet; /**< Actions in state SURF_ACTION_FAILED */
+ ActionListPtr p_doneActionSet; /**< Actions in state SURF_ACTION_DONE */
+};
+
+/************
+ * Resource *
+ ************/
+
+/** @ingroup SURF_interface
+ * @brief Resource which have a metric handled by a maxmin system
+ */
+typedef struct {
+ double scale; /**< The scale of the metric */
+ double peak; /**< The peak of the metric */
+ tmgr_trace_event_t event; /**< The associated trace event associated to the metric */
+} s_surf_metric_t;
+
+/** @ingroup SURF_interface
+ * @brief SURF resource interface class
+ * @details A resource represent an element of a component (e.g.: a link for the network)
+ */
+class Resource {
+public:
+ /**
+ * @brief Resource constructor
+ */
+ Resource();
+
+ /**
+ * @brief Resource constructor
+ *
+ * @param model Model associated to this Resource
+ * @param name The name of the Resource
+ * @param props Dictionary of properties associated to this Resource
+ */
+ Resource(ModelPtr model, const char *name, xbt_dict_t props);
+
+ /**
+ * @brief Resource constructor
+ *
+ * @param model Model associated to this Resource
+ * @param name The name of the Resource
+ * @param props Dictionary of properties associated to this Resource
+ * @param constraint The lmm constraint associated to this Resource if it is part of a LMM component
+ */
+ Resource(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint);
+
+ /**
+ * @brief Resource constructor
+ *
+ * @param model Model associated to this Resource
+ * @param name The name of the Resource
+ * @param props Dictionary of properties associated to this Resource
+ * @param stateInit the initial state of the Resource
+ */
+ Resource(ModelPtr model, const char *name, xbt_dict_t props, e_surf_resource_state_t stateInit);
+
+ /**
+ * @brief Resource destructor
+ */
+ virtual ~Resource();
+
+ /**
+ * @brief Get the Model of the current Resource
+ *
+ * @return The Model of the current Resource
+ */
+ ModelPtr getModel();
+
+ /**
+ * @brief Get the name of the current Resource
+ *
+ * @return The name of the current Resource
+ */
+ const char *getName();
+
+ /**
+ * @brief Get the properties of the current Resource
+ *
+ * @return The properties of the current Resource
+ */
+ virtual xbt_dict_t getProperties();
+
+ /**
+ * @brief Update the state of the current Resource
+ * @details [TODO]
+ *
+ * @param event_type [TODO]
+ * @param value [TODO]
+ * @param date [TODO]
+ */
+ virtual void updateState(tmgr_trace_event_t event_type, double value, double date)=0;
+
+ /**
+ * @brief Check if the current Resource is used
+ * @return true if the current Resource is used, false otherwise
+ */
+ virtual bool isUsed()=0;
+
+ /**
+ * @brief Check if the current Resource is active
+ *
+ * @return true if the current Resource is active, false otherwise
+ */
+ bool isOn();
+
+ /**
+ * @brief Turn on the current Resource
+ */
+ void turnOn();
+
+ /**
+ * @brief Turn off the current Resource
+ */
+ void turnOff();
+
+ /**
+ * @brief Get the [state](\ref e_surf_resource_state_t) of the current Resource
+ *
+ * @return The state of the currenrt Resource
+ */
+ virtual e_surf_resource_state_t getState();
+
+ /**
+ * @brief Set the [state](\ref e_surf_resource_state_t) of the current Resource
+ *
+ * @param state The new state of the current Resource
+ */
+ virtual void setState(e_surf_resource_state_t state);
+
+private:
+ const char *p_name;
+ xbt_dict_t p_properties;
+ ModelPtr p_model;
+ void *p_resource;
+ bool m_running;
+ e_surf_resource_state_t m_stateCurrent;
+
+ /* LMM */
+public:
+ /**
+ * @brief Get the lmm constraint associated to this Resource if it is part of a LMM component
+ *
+ * @return The lmm constraint associated to this Resource
+ */
+ lmm_constraint_t getConstraint();
+private:
+ lmm_constraint_t p_constraint;
+};
+
+/**********
+ * Action *
+ **********/
+void surf_action_lmm_update_index_heap(void *action, int i);
+
+/** @ingroup SURF_interface
+ * @brief SURF action interface class
+ * @details An action is an event generated by a resource (e.g.: a communication for the network)
+ */
+class Action : public actionHook, public actionLmmHook {
+public:
+ /**
+ * @brief Action constructor
+ */
+ Action();
+
+ /**
+ * @brief Action constructor
+ *
+ * @param model The Model associated to this Action
+ * @param cost The cost of the Action
+ * @param failed If the action is impossible (e.g.: execute something on a switched off workstation)
+ */
+ Action(ModelPtr model, double cost, bool failed);
+
+ /**
+ * @brief Action constructor
+ *
+ * @param model The Model associated to this Action
+ * @param cost The cost of the Action
+ * @param failed If the action is impossible (e.g.: execute something on a switched off workstation)
+ * @param var The lmm variable associated to this Action if it is part of a LMM component
+ */
+ Action(ModelPtr model, double cost, bool failed, lmm_variable_t var);
+
+ /**
+ * @brief Action destructor
+ */
+ virtual ~Action();
+
+ /**
+ * @brief Finish the action
+ */
+ void finish();
+
+ /**
+ * @brief Get the [state](\ref e_surf_action_state_t) of the current Action
+ *
+ * @return The state of the current Action
+ */
+ e_surf_action_state_t getState(); /**< get the state*/
+
+ /**
+ * @brief Set the [state](\ref e_surf_action_state_t) of the current Action
+ *
+ * @param state The new state of the current Action
+ */
+ virtual void setState(e_surf_action_state_t state);
+
+ /**
+ * @brief Get the bound of the current Action
+ *
+ * @return The bound of the current Action
+ */
+ double getBound();
+
+ /**
+ * @brief Set the bound of the current Action
+ *
+ * @param bound The new bound of the current Action
+ */
+ void setBound(double bound);
+
+ /**
+ * @brief Get the start time of the current action
+ *
+ * @return The start time of the current action
+ */
+ double getStartTime();
+
+ /**
+ * @brief Get the finish time of the current action
+ *
+ * @return The finish time of the current action
+ */
+ double getFinishTime();
+
+ /**
+ * @brief Get the data associated to the current action
+ *
+ * @return The data associated to the current action
+ */
+ void *getData() {return p_data;}
+
+ /**
+ * @brief Set the data associated to the current action
+ *
+ * @param data The new data associated to the current action
+ */
+ void setData(void* data);
+
+ /**
+ * @brief Get the maximum duration of the current action
+ *
+ * @return The maximum duration of the current action
+ */
+ double getMaxDuration() {return m_maxDuration;}
+
+ /**
+ * @brief Get the category associated to the current action
+ *
+ * @return The category associated to the current action
+ */
+ char *getCategory() {return p_category;}
+
+ /**
+ * @brief Get the cost of the current action
+ *
+ * @return The cost of the current action
+ */
+ double getCost() {return m_cost;}
+
+ /**
+ * @brief Set the cost of the current action
+ *
+ * @param cost The new cost of the current action
+ */
+ void setCost(double cost) {m_cost = cost;}
+
+ /**
+ * @brief Update the maximum duration of the current action
+ *
+ * @param delta [TODO]
+ */
+ void updateMaxDuration(double delta) {double_update(&m_maxDuration, delta);}
+
+ /**
+ * @brief Update the remaining time of the current action
+ *
+ * @param delta [TODO]
+ */
+ void updateRemains(double delta) {double_update(&m_remains, delta);}
+
+ /**
+ * @brief Set the remaining time of the current action
+ *
+ * @param value The new remaining time of the current action
+ */
+ void setRemains(double value) {m_remains = value;}
+
+ /**
+ * @brief Set the finish time of the current action
+ *
+ * @param value The new Finush time of the current action
+ */
+ void setFinishTime(double value) {m_finish = value;}
+
+ /**
+ * @brief Add a reference to the current action
+ */
+ void ref();
+
+ /**
+ * @brief Remove a reference to the current action
+ * @details If the Action has no more reference, we destroy it
+ *
+ * @return true if the action was destroyed and false if someone still has references on it
+ */
+ virtual int unref();
+
+ /**
+ * @brief Cancel the current Action if running
+ */
+ virtual void cancel();
+
+ /**
+ * @brief Recycle an Action
+ */
+ virtual void recycle(){};
+
+ /**
+ * @brief Suspend the current Action
+ */
+ virtual void suspend();
+
+ /**
+ * @brief Resume the current Action
+ */
+ virtual void resume();
+
+ /**
+ * @brief Check if the current action is running
+ *
+ * @return true if the current Action is suspended, false otherwise
+ */
+ virtual bool isSuspended();
+
+ /**
+ * @brief Set the maximum duration of the current Action
+ *
+ * @param duration The new maximum duration of the current Action
+ */
+ virtual void setMaxDuration(double duration);
+
+ /**
+ * @brief Set the priority of the current Action
+ *
+ * @param priority The new priority of the current Action
+ */
+ virtual void setPriority(double priority);
+
+#ifdef HAVE_TRACING
+ /**
+ * @brief Set the category of the current Action
+ *
+ * @param category The new category of the current Action
+ */
+ void setCategory(const char *category);
+#endif
+
+ /**
+ * @brief Get the remaining time of the current action after updating the resource
+ *
+ * @return The remaining time
+ */
+ virtual double getRemains();
+
+ /**
+ * @brief Get the remaining time of the current action without updating the resource
+ *
+ * @return The remaining time
+ */
+ double getRemainsNoUpdate();
+
+ /**
+ * @brief Get the priority of the current Action
+ *
+ * @return The priority of the current Action
+ */
+ double getPriority() {return m_priority;};
+
+ /**
+ * @brief Get the state set in which the action is
+ * @details [TODO]
+ *
+ * @return The state set in which the action is
+ */
+ ActionListPtr getStateSet() {return p_stateSet;};
+
+ s_xbt_swag_hookup_t p_stateHookup;
+
+protected:
+ ActionListPtr p_stateSet;
+ double m_priority; /**< priority (1.0 by default) */
+ int m_refcount;
+ double m_remains; /**< How much of that cost remains to be done in the currently running task */
+ double m_maxDuration; /*< max_duration (may fluctuate until the task is completed) */
+ double m_finish; /**< finish time : this is modified during the run and fluctuates until the task is completed */
+
+ ModelPtr getModel() {return p_model;}
+
+private:
+ int resourceUsed(void *resource_id);
+
+ /**
+ * @brief Share the resources to the actions
+ * @details [TODO]
+ *
+ * @param now [TODO]
+ * @return in how much time the next action may terminatedescription]
+ */
+ double shareResources(double now);
+
+ /**
+ * @brief Update the current action state
+ * @details [TODO]
+ *
+ * @param now [TODO]
+ * @param delta [TODO]
+ */
+ void updateActionsState(double now, double delta);
+
+ /**
+ * @brief Update the [TODO]
+ * @details [TODO]
+ *
+ * @param id [TODO]
+ * @param event_type [TODO]
+ * @param value [TODO]
+ * @param time [TODO]
+ */
+ void updateResourceState(void *id, tmgr_trace_event_t event_type,
+ double value, double time);
+
+ ActionLmmListPtr p_modifiedSet;
+ xbt_heap_t p_actionHeap;
+ int m_selectiveUpdate;
+ bool m_failed;
+ double m_start; /**< start time */
+ char *p_category; /**< tracing category for categorized resource utilization monitoring */
+
+ #ifdef HAVE_LATENCY_BOUND_TRACKING
+ int m_latencyLimited; /**< Set to 1 if is limited by latency, 0 otherwise */
+ #endif
+ double m_cost;
+ ModelPtr p_model;
+ void *p_data; /**< for your convenience */
+
+ /* LMM */
+public:
+ virtual void updateRemainingLazy(double now);
+ void heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat);
+ void heapRemove(xbt_heap_t heap);
+ void updateIndexHeap(int i);
+ lmm_variable_t getVariable() {return p_variable;}
+ double getLastUpdate() {return m_lastUpdate;}
+ void refreshLastUpdate() {m_lastUpdate = surf_get_clock();}
+ enum heap_action_type getHat() {return m_hat;}
+ bool is_linked() {return actionLmmHook::is_linked();}
+ void gapRemove();
+
+protected:
+ lmm_variable_t p_variable;
+ double m_lastValue;
+ double m_lastUpdate;
+ int m_suspended;
+ int m_indexHeap;
+ enum heap_action_type m_hat;
+};
+
+#endif /* SURF_MODEL_H_ */
+++ /dev/null
-
-/* 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);
-}
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+
#ifndef _SURF_SURF_PRIVATE_H
#define _SURF_SURF_PRIVATE_H
#define NO_MAX_DURATION -1.0
+SG_BEGIN_DECL()
+
extern xbt_dict_t watched_hosts_lib;
extern const char *surf_action_state_names[6];
+/** @ingroup SURF_interface
+ * @brief Possible update mechanisms
+ */
typedef enum {
- UM_FULL,
- UM_LAZY,
- UM_UNDEFINED
+ UM_FULL, /**< [TODO] */
+ UM_LAZY, /**< [TODO] */
+ UM_UNDEFINED /**< Mechanism not defined */
} e_UM_t;
-typedef struct surf_model_private {
- int (*resource_used) (void *resource_id);
- /* Share the resources to the actions and return in how much time
- the next action may terminate */
- double (*share_resources) (double now);
- /* Update the actions' state */
- void (*update_actions_state) (double now, double delta);
- void (*update_resource_state) (void *id, tmgr_trace_event_t event_type,
- double value, double time);
- void (*finalize) (void);
-
- lmm_system_t maxmin_system;
- e_UM_t update_mechanism;
- xbt_swag_t modified_set;
- xbt_heap_t action_heap;
- int selective_update;
-
-} s_surf_model_private_t;
-
-double generic_maxmin_share_resources(xbt_swag_t running_actions,
- size_t offset,
- lmm_system_t sys,
- void (*solve) (lmm_system_t));
-double generic_share_resources_lazy(double now, surf_model_t model);
-
/* Generic functions common to all models */
-void surf_action_init(void);
-void surf_action_exit(void);
-e_surf_action_state_t surf_action_state_get(surf_action_t action); /* cannot declare inline since we use a pointer to it */
-double surf_action_get_start_time(surf_action_t action); /* cannot declare inline since we use a pointer to it */
-double surf_action_get_finish_time(surf_action_t action); /* cannot declare inline since we use a pointer to it */
-void surf_action_free(surf_action_t * action);
-void surf_action_state_set(surf_action_t action,
- e_surf_action_state_t state);
-void surf_action_data_set(surf_action_t action, void *data); /* cannot declare inline since we use a pointer to it */
-
-void surf_action_lmm_update_index_heap(void *action, int i); /* callback for heap management shared by cpu and net models */
-void surf_action_lmm_heap_insert(xbt_heap_t heap, surf_action_lmm_t action,
- double key, enum heap_action_type hat);
-void surf_action_lmm_heap_remove(xbt_heap_t heap,surf_action_lmm_t action);
-
-void surf_action_cancel(surf_action_t action);
-int surf_action_unref(surf_action_t action);
-void surf_action_suspend(surf_action_t action);
-void surf_action_resume(surf_action_t action);
-int surf_action_is_suspended(surf_action_t action);
-void surf_action_set_max_duration(surf_action_t action, double duration);
-void surf_action_set_priority(surf_action_t action, double priority);
-#ifdef HAVE_TRACING
-void surf_action_set_category(surf_action_t action,
- const char *category);
-#endif
-double surf_action_get_remains(surf_action_t action);
-void update_resource_energy(surf_model_t model, surf_action_lmm_t action);
-void generic_update_action_remaining_lazy( surf_action_lmm_t action, double now);
-void generic_update_actions_state_lazy(double now, double delta, surf_model_t model);
-void generic_update_actions_state_full(double now, double delta, surf_model_t model);
FILE *surf_fopen(const char *name, const char *mode);
extern tmgr_history_t history;
-//void surf_config_init(int *argc, char **argv);
-//void surf_config_finalize(void);
-//void surf_config(const char *name, va_list pa);
-
-void net_action_recycle(surf_action_t action);
-#ifdef HAVE_LATENCY_BOUND_TRACKING
-int net_get_link_latency_limited(surf_action_t action);
-#endif
-
/* The __surf_is_absolute_file_path() returns 1 if
* file_path is a absolute file path, in the other
* case the function returns 0.
*/
int __surf_is_absolute_file_path(const char *file_path);
-typedef struct s_routing_edge {
- AS_t rc_component;
- e_surf_network_element_type_t rc_type;
- int id;
- char *name;
-} s_routing_edge_t;
-
-/*
- * Link of lenght 1, alongside with its source and destination. This is mainly usefull in the bindings to gtnets and ns3
- */
-typedef struct s_onelink {
- sg_routing_edge_t src;
- sg_routing_edge_t dst;
- void *link_ptr;
-} s_onelink_t, *onelink_t;
-
/**
* Routing logic
*/
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);
/**
* 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;
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 */
-/* 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"
/**
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;
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);
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[] = {
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}
};
*/
static void parse_S_host_link(sg_platf_host_link_cbarg_t host)
{
- sg_routing_edge_t info = NULL;
- info = xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL);
- xbt_assert(info, "Host '%s' not found!",host->id);
- xbt_assert(current_routing->model_desc == &routing_models[SURF_MODEL_CLUSTER] ||
- current_routing->model_desc == &routing_models[SURF_MODEL_VIVALDI],
+ RoutingEdgePtr info = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL));
+ xbt_assert(info, "Host '%s' not found!", host->id);
+ xbt_assert(current_routing->p_modelDesc == &routing_models[SURF_MODEL_CLUSTER] ||
+ current_routing->p_modelDesc == &routing_models[SURF_MODEL_VIVALDI],
"You have to be in model Cluster to use tag host_link!");
s_surf_parsing_link_up_down_t link_up_down;
link_up_down.link_up = xbt_lib_get_or_null(link_lib, host->link_up, SURF_LINK_LEVEL);
link_up_down.link_down = xbt_lib_get_or_null(link_lib, host->link_down, SURF_LINK_LEVEL);
- link_up_down.limiter_link = NULL;
- link_up_down.loopback_link = NULL;
xbt_assert(link_up_down.link_up, "Link '%s' not found!",host->link_up);
xbt_assert(link_up_down.link_down, "Link '%s' not found!",host->link_down);
- if(!current_routing->link_up_down_list)
- current_routing->link_up_down_list = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+ if(!current_routing->p_linkUpDownList)
+ current_routing->p_linkUpDownList = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
// If dynar is is greater than edge id and if the host_link is already defined
- if(xbt_dynar_length(current_routing->link_up_down_list) > info->id &&
- xbt_dynar_get_as(current_routing->link_up_down_list,info->id,void*))
+ if((int)xbt_dynar_length(current_routing->p_linkUpDownList) > info->getId() &&
+ xbt_dynar_get_as(current_routing->p_linkUpDownList, info->getId(), void*))
xbt_die("Host_link for '%s' is already defined!",host->id);
- XBT_DEBUG("Push Host_link for host '%s' to position %d",info->name,info->id);
- xbt_dynar_set_as(current_routing->link_up_down_list,info->id,s_surf_parsing_link_up_down_t,link_up_down);
+ XBT_DEBUG("Push Host_link for host '%s' to position %d", info->getName(), info->getId());
+ xbt_dynar_set_as(current_routing->p_linkUpDownList, info->getId(), s_surf_parsing_link_up_down_t, link_up_down);
}
/**
*/
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);
*/
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;
*/
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);
}
/**
*/
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);
}
/**
*/
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);
}
/**
*/
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)
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
/* 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;
}
* 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;
}
}
/**
* \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,
{
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;
/**
* \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) {
/* 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;
}
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;
// 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
*
* 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);
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;
}
/* ************************* 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)
{
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;
xbt_dict_set(patterns, "suffix", xbt_strdup(cluster->suffix), NULL);
}
- XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", cluster->id);
+ /* parse the topology attribute. If we are not in a flat cluster,
+ * switch to the right mode and initialize the routing with
+ * the parameters in topo_parameters attribute
+ */
s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER;
AS.id = cluster->id;
- AS.routing = A_surfxml_AS_routing_Cluster;
- sg_platf_new_AS_begin(&AS);
- current_routing->link_up_down_list
+ if(cluster->topology == SURF_CLUSTER_TORUS){
+ XBT_DEBUG("<AS id=\"%s\"\trouting=\"Torus_Cluster\">", cluster->id);
+ AS.routing = A_surfxml_AS_routing_Cluster___torus;
+ sg_platf_new_AS_begin(&AS);
+ ((AsClusterTorusPtr)current_routing)->parse_specific_arguments(cluster);
+ }else{
+ XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", cluster->id);
+ AS.routing = A_surfxml_AS_routing_Cluster;
+ sg_platf_new_AS_begin(&AS);
+ }
+
+ if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
+ ((AsClusterPtr)current_routing)->p_nb_links_per_node++;
+ ((AsClusterPtr)current_routing)->p_has_loopback=1;
+ }
+
+ if(cluster->limiter_link!=0){
+ ((AsClusterPtr)current_routing)->p_nb_links_per_node++;
+ ((AsClusterPtr)current_routing)->p_has_limiter=1;
+ }
+
+
+
+ current_routing->p_linkUpDownList
= xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
//Make all hosts
XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,
cluster->bw, cluster->lat);
- memset(&link, 0, sizeof(link));
- link.id = link_id;
- link.bandwidth = cluster->bw;
- link.latency = cluster->lat;
- link.state = SURF_RESOURCE_ON;
- link.policy = cluster->sharing_policy;
- sg_platf_new_link(&link);
- s_surf_parsing_link_up_down_t info;
+ s_surf_parsing_link_up_down_t info_lim, info_loop;
+ // All links are saved in a matrix;
+ // every row describes a single node; every node
+ // may have multiple links.
+ // the first column may store a link from x to x if p_has_loopback is set
+ // the second column may store a limiter link if p_has_limiter is set
+ // other columns are to store one or more link for the node
- if (link.policy == SURF_LINK_FULLDUPLEX) {
- char *tmp_link = bprintf("%s_UP", link_id);
- info.link_up =
- xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
- free(tmp_link);
- tmp_link = bprintf("%s_DOWN", link_id);
- info.link_down =
- xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
- free(tmp_link);
- } else {
- info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
- info.link_down = info.link_up;
- }
-
- if(cluster->limiter_link!=0){
- char *tmp_link = bprintf("%s_limiter", link_id);
- XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
+ //add a loopback link
+ if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
+ char *tmp_link = bprintf("%s_loopback", link_id);
+ XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
cluster->limiter_link);
-
+
memset(&link, 0, sizeof(link));
link.id = tmp_link;
- link.bandwidth = cluster->limiter_link;
- link.latency = 0;
+ link.bandwidth = cluster->loopback_bw;
+ link.latency = cluster->loopback_lat;
link.state = SURF_RESOURCE_ON;
- link.policy = SURF_LINK_SHARED;
+ link.policy = SURF_LINK_FATPIPE;
sg_platf_new_link(&link);
- info.limiter_link =
+ info_loop.link_up =
xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ info_loop.link_down = info_loop.link_up;
free(tmp_link);
- }else{
- info.limiter_link =NULL;
+ xbt_dynar_set(current_routing->p_linkUpDownList, rankId*((AsClusterPtr)current_routing)->p_nb_links_per_node, &info_loop);
}
-
- if(cluster->loopback_bw!=0 || cluster->loopback_lat!=0){
- char *tmp_link = bprintf("%s_loopback", link_id);
- XBT_DEBUG("<loopback\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
+
+ //add a limiter link (shared link to account for maximal bandwidth of the node)
+ if(cluster->limiter_link!=0){
+ char *tmp_link = bprintf("%s_limiter", link_id);
+ XBT_DEBUG("<limiter\tid=\"%s\"\tbw=\"%f\"/>", tmp_link,
cluster->limiter_link);
-
+
memset(&link, 0, sizeof(link));
link.id = tmp_link;
- link.bandwidth = cluster->loopback_bw;
- link.latency = cluster->loopback_lat;
+ link.bandwidth = cluster->limiter_link;
+ link.latency = 0;
link.state = SURF_RESOURCE_ON;
- link.policy = SURF_LINK_FATPIPE;
+ link.policy = SURF_LINK_SHARED;
sg_platf_new_link(&link);
- info.loopback_link =
+ info_lim.link_up =
xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ info_lim.link_down = info_lim.link_up;
free(tmp_link);
- }else{
- info.loopback_link =NULL;
+ xbt_dynar_set(current_routing->p_linkUpDownList,
+ rankId*((AsClusterPtr)current_routing)->p_nb_links_per_node + ((AsClusterPtr)current_routing)->p_has_loopback ,
+ &info_lim);
+
}
-
- xbt_dynar_push(current_routing->link_up_down_list,&info);
+
+
+ //call the cluster function that adds the others links
+
+ ((AsClusterPtr)current_routing)->create_links_for_node(cluster, i, rankId, rankId*
+ ((AsClusterPtr)current_routing)->p_nb_links_per_node
+ + ((AsClusterPtr)current_routing)->p_has_loopback
+ + ((AsClusterPtr)current_routing)->p_has_limiter );
+
xbt_free(link_id);
xbt_free(host_id);
+ rankId++;
}
xbt_dynar_free(&radical_ends);
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
AS.routing = A_surfxml_AS_routing_Cluster;
sg_platf_new_AS_begin(&AS);
- current_routing->link_up_down_list
- = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+ current_routing->p_linkUpDownList = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\"/>", host_id, peer->power);
s_sg_platf_host_cbarg_t host;
router.id = router_id;
router.coord = peer->coord;
sg_platf_new_router(&router);
- ((as_cluster_t)current_routing)->router = xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL);
+ static_cast<AsClusterPtr>(current_routing)->p_router = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(as_router_lib, router.id, ROUTING_ASR_LEVEL));
XBT_DEBUG("</AS>");
sg_platf_new_AS_end();
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()
{
* 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);
+}
+
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_interface.hpp"
+#include <float.h>
+
+#ifndef NETWORK_ROUTING_HPP_
+#define NETWORK_ROUTING_HPP_
+
+void routing_model_create( void *loopback);
+
+/* ************************************************************************** */
+/* ************************* GRAPH EXPORTING FUNCTIONS ********************** */
+xbt_node_t new_xbt_graph_node (xbt_graph_t graph, const char *name, xbt_dict_t nodes);
+xbt_edge_t new_xbt_graph_edge (xbt_graph_t graph, xbt_node_t s, xbt_node_t d, xbt_dict_t edges);
+
+/***********
+ * Classes *
+ ***********/
+
+/* Note: As and RoutingEdge are declard as struct instead of class, to keep
+ compatibility with C files where they are mentioned. */
+struct As;
+typedef As *AsPtr;
+
+class RoutingModelDescription;
+typedef RoutingModelDescription *RoutingModelDescriptionPtr;
+
+struct RoutingEdge;
+typedef RoutingEdge *RoutingEdgePtr;
+
+class Onelink;
+typedef Onelink *OnelinkPtr;
+
+class RoutingPlatf;
+typedef RoutingPlatf *RoutingPlatfPtr;
+
+/** @ingroup SURF_routing_interface
+ * @brief The Autonomous System (AS) routing interface
+ * @details [TODO]
+ */
+struct As {
+public:
+ xbt_dynar_t p_indexNetworkElm;
+ xbt_dict_t p_bypassRoutes; /* store bypass routes */
+ routing_model_description_t p_modelDesc;
+ e_surf_routing_hierarchy_t p_hierarchy;
+ char *p_name;
+ AsPtr p_routingFather;
+ xbt_dict_t p_routingSons;
+ RoutingEdgePtr p_netElem;
+ xbt_dynar_t p_linkUpDownList;
+
+ /**
+ * @brief The As constructor
+ */
+ As(){};
+
+ /**
+ * @brief The As destructor
+ */
+ virtual ~As(){
+ xbt_free(p_name);
+ };
+
+ /**
+ * @brief Get the route and latency between two RoutingEdgs
+ * @details [long description]
+ *
+ * @param src [description]
+ * @param dst [description]
+ * @param into [description]
+ * @param latency [description]
+ */
+ virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency)=0;
+ virtual xbt_dynar_t getOneLinkRoutes()=0;
+ virtual void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)=0;
+ virtual sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat)=0;
+
+ /* The parser calls the following functions to inform the routing models
+ * that a new element is added to the AS currently built.
+ *
+ * Of course, only the routing model of this AS is informed, not every ones */
+ virtual int parsePU(RoutingEdgePtr elm)=0; /* A host or a router, whatever */
+ virtual int parseAS( RoutingEdgePtr elm)=0;
+ virtual void parseRoute(sg_platf_route_cbarg_t route)=0;
+ virtual void parseASroute(sg_platf_route_cbarg_t route)=0;
+ virtual void parseBypassroute(sg_platf_route_cbarg_t e_route)=0;
+};
+
+/** @ingroup SURF_routing_interface
+ * @brief A routing edge
+ * @details [long description]
+ */
+struct RoutingEdge {
+public:
+ virtual ~RoutingEdge(){};
+ virtual int getId()=0;
+ virtual int *getIdPtr()=0;
+ virtual void setId(int id)=0;
+ virtual char *getName()=0;
+ virtual AsPtr getRcComponent()=0;
+ virtual e_surf_network_element_type_t getRcType()=0;
+};
+
+struct RoutingEdgeImpl : public RoutingEdge {
+public:
+ RoutingEdgeImpl(char *name, int id, e_surf_network_element_type_t rcType, AsPtr rcComponent)
+ : p_rcComponent(rcComponent), p_rcType(rcType), m_id(id), p_name(name) {}
+ ~RoutingEdgeImpl() { xbt_free(p_name);};
+
+ int getId() {return m_id;}
+ int *getIdPtr() {return &m_id;}
+ void setId(int id) {m_id = id;}
+ char *getName() {return p_name;}
+ AsPtr getRcComponent() {return p_rcComponent;}
+ e_surf_network_element_type_t getRcType() {return p_rcType;}
+private:
+ AsPtr p_rcComponent;
+ e_surf_network_element_type_t p_rcType;
+ int m_id;
+ char *p_name;
+};
+
+struct RoutingEdgeWrapper : public RoutingEdge {
+public:
+ RoutingEdgeWrapper(RoutingEdge *re) : p_re(re){}
+ ~RoutingEdgeWrapper(){}
+ int getId() {return p_re->getId();}
+ int *getIdPtr() {return p_re->getIdPtr();}
+ void setId(int id) {p_re->setId(id);}
+ char *getName() {return p_re->getName();}
+ AsPtr getRcComponent() {return p_re->getRcComponent();}
+ e_surf_network_element_type_t getRcType() {return p_re->getRcType();}
+private:
+ RoutingEdge *p_re;
+};
+
+/** @ingroup SURF_routing_interface
+ * @brief Link of lenght 1, alongside with its source and destination. This is mainly usefull in the bindings to gtnets and ns3
+ */
+class Onelink {
+public:
+ Onelink(void *link, RoutingEdgePtr src, RoutingEdgePtr dst)
+ : p_src(src), p_dst(dst), p_link(link) {};
+ RoutingEdgePtr p_src;
+ RoutingEdgePtr p_dst;
+ void *p_link;
+};
+
+/** @ingroup SURF_routing_interface
+ * @brief The class representing a whole routing platform
+ */
+class RoutingPlatf {
+public:
+ ~RoutingPlatf();
+ AsPtr p_root;
+ void *p_loopback;
+ xbt_dynar_t p_lastRoute;
+ xbt_dynar_t getOneLinkRoutes(void);
+ xbt_dynar_t recursiveGetOneLinkRoutes(AsPtr rc);
+ void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, xbt_dynar_t * links, double *latency);
+};
+
+#endif /* NETWORK_ROUTING_HPP_ */
+++ /dev/null
-/* 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;
-}
--- /dev/null
+/* Copyright (c) 2009-2011, 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_routing_cluster.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster, surf, "Routing part of surf");
+
+/* This routing is specifically setup to represent clusters, aka homogeneous sets of machines
+ * Note that a router is created, easing the interconnexion with the rest of the world.
+ */
+
+AS_t model_cluster_create(void)
+{
+ return new AsCluster();
+}
+
+/* Creation routing model functions */
+AsCluster::AsCluster() : AsNone()
+{
+ p_backbone = 0;
+ p_loopback = 0;
+ p_router = 0;
+ p_has_limiter = 0;
+ p_has_loopback = 0;
+ p_nb_links_per_node = 1;
+}
+
+/* Business methods */
+void AsCluster::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat)
+{
+ s_surf_parsing_link_up_down_t info;
+ XBT_VERB("cluster_get_route_and_latency from '%s'[%d] to '%s'[%d]",
+ src->getName(), src->getId(), dst->getName(), dst->getId());
+
+ if (src->getRcType() != SURF_NETWORK_ELEMENT_ROUTER) { // No specific link for router
+
+ if((src->getId() == dst->getId()) && p_has_loopback ){
+ info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node, s_surf_parsing_link_up_down_t);
+ xbt_dynar_push_as(route->link_list, void *, info.link_up);
+ if (lat)
+ *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+ return;
+ }
+
+
+ if (p_has_limiter){ // limiter for sender
+ info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node + p_has_loopback, s_surf_parsing_link_up_down_t);
+ xbt_dynar_push_as(route->link_list, void *, info.link_up);
+ }
+
+ info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node + p_has_loopback + p_has_limiter, s_surf_parsing_link_up_down_t);
+ if (info.link_up) { // link up
+ xbt_dynar_push_as(route->link_list, void *, info.link_up);
+ if (lat)
+ *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+ }
+
+ }
+
+ if (p_backbone) {
+ xbt_dynar_push_as(route->link_list, void *, static_cast<ResourcePtr>(p_backbone));
+ if (lat)
+ *lat += p_backbone->getLatency();
+ }
+
+ if (dst->getRcType() != SURF_NETWORK_ELEMENT_ROUTER) { // No specific link for router
+ info = xbt_dynar_get_as(p_linkUpDownList, dst->getId() * p_nb_links_per_node + p_has_loopback + p_has_limiter, s_surf_parsing_link_up_down_t);
+
+ if (info.link_down) { // link down
+ xbt_dynar_push_as(route->link_list, void *, info.link_down);
+ if (lat)
+ *lat += static_cast<NetworkLinkPtr>(info.link_down)->getLatency();
+ }
+ if (p_has_limiter){ // limiter for receiver
+ info = xbt_dynar_get_as(p_linkUpDownList, dst->getId() * p_nb_links_per_node + p_has_loopback, s_surf_parsing_link_up_down_t);
+ xbt_dynar_push_as(route->link_list, void *, info.link_up);
+ }
+ }
+}
+
+void AsCluster::getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)
+{
+ int isrc;
+ int table_size = xbt_dynar_length(p_indexNetworkElm);
+
+ RoutingEdgePtr src;
+ xbt_node_t current, previous, backboneNode = NULL, routerNode;
+ s_surf_parsing_link_up_down_t info;
+
+ xbt_assert(p_router,"Malformed cluster");
+
+ /* create the router */
+ char *link_name = p_router->getName();
+ routerNode = new_xbt_graph_node(graph, link_name, nodes);
+
+ if(p_backbone) {
+ const char *link_nameR = p_backbone->getName();
+ backboneNode = new_xbt_graph_node(graph, link_nameR, nodes);
+
+ new_xbt_graph_edge(graph, routerNode, backboneNode, edges);
+ }
+
+ for (isrc = 0; isrc < table_size; isrc++) {
+ src = xbt_dynar_get_as(p_indexNetworkElm, isrc, RoutingEdgePtr);
+
+ if (src->getRcType() != SURF_NETWORK_ELEMENT_ROUTER) {
+ previous = new_xbt_graph_node(graph, src->getName(), nodes);
+
+ info = xbt_dynar_get_as(p_linkUpDownList, src->getId(), s_surf_parsing_link_up_down_t);
+
+ if (info.link_up) { // link up
+
+ const char *link_name = static_cast<ResourcePtr>(info.link_up)->getName();
+ current = new_xbt_graph_node(graph, link_name, nodes);
+ new_xbt_graph_edge(graph, previous, current, edges);
+
+ if (p_backbone) {
+ new_xbt_graph_edge(graph, current, backboneNode, edges);
+ } else {
+ new_xbt_graph_edge(graph, current, routerNode, edges);
+ }
+
+ }
+
+ if (info.link_down) { // link down
+ const char *link_name = static_cast<ResourcePtr>(info.link_down)->getName();
+ current = new_xbt_graph_node(graph, link_name, nodes);
+ new_xbt_graph_edge(graph, previous, current, edges);
+
+ if (p_backbone) {
+ new_xbt_graph_edge(graph, current, backboneNode, edges);
+ } else {
+ new_xbt_graph_edge(graph, current, routerNode, edges);
+ }
+ }
+ }
+
+ }
+}
+
+void AsCluster::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int , int position){
+ s_sg_platf_link_cbarg_t link;
+ s_surf_parsing_link_up_down_t info;
+ char* link_id = bprintf("%s_link_%d", cluster->id, id);
+
+ memset(&link, 0, sizeof(link));
+ link.id = link_id;
+ link.bandwidth = cluster->bw;
+ link.latency = cluster->lat;
+ link.state = SURF_RESOURCE_ON;
+ link.policy = cluster->sharing_policy;
+ sg_platf_new_link(&link);
+
+ if (link.policy == SURF_LINK_FULLDUPLEX) {
+ char *tmp_link = bprintf("%s_UP", link_id);
+ info.link_up = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ xbt_free(tmp_link);
+ tmp_link = bprintf("%s_DOWN", link_id);
+ info.link_down = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ xbt_free(tmp_link);
+ } else {
+ info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+ info.link_down = info.link_up;
+ }
+ xbt_dynar_set(p_linkUpDownList, position, &info);
+ xbt_free(link_id);
+}
+
+int AsCluster::parsePU(RoutingEdgePtr elm) {
+ XBT_DEBUG("Load process unit \"%s\"", elm->getName());
+ xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+ return xbt_dynar_length(p_indexNetworkElm)-1;
+}
+
+int AsCluster::parseAS(RoutingEdgePtr elm) {
+ XBT_DEBUG("Load Autonomous system \"%s\"", elm->getName());
+ xbt_dynar_push_as(p_indexNetworkElm, RoutingEdgePtr, elm);
+ return xbt_dynar_length(p_indexNetworkElm)-1;
+}
+
--- /dev/null
+/* 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_ */
--- /dev/null
+/* Copyright (c) 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_routing_cluster_torus.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_cluster_torus, surf_route_cluster, "Torus Routing part of surf");
+
+
+inline unsigned int* rankId_to_coords(int rankId, xbt_dynar_t dimensions) {
+
+ unsigned int i = 0, cur_dim_size = 1, dim_size_product = 1;
+ unsigned int* coords = (unsigned int*)malloc(xbt_dynar_length(dimensions)*sizeof(unsigned int));
+ for (i = 0; i < xbt_dynar_length(dimensions); i++) {
+ cur_dim_size = xbt_dynar_get_as(dimensions, i, int);
+ coords[i] = (rankId / dim_size_product) % cur_dim_size;
+ dim_size_product *= cur_dim_size;
+ }
+
+ return coords;
+}
+
+
+AS_t model_torus_cluster_create(void)
+{
+ return new AsClusterTorus();
+}
+
+/* Creation routing model functions */
+AsClusterTorus::AsClusterTorus() : AsCluster()
+{
+ p_dimensions = NULL;
+}
+
+/* Creation routing model functions */
+AsClusterTorus::~AsClusterTorus()
+{
+ if(p_dimensions) xbt_dynar_free(&p_dimensions);
+}
+
+
+void AsClusterTorus::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position){
+ s_sg_platf_link_cbarg_t link;
+ char* link_id;
+ unsigned int j = 0;
+ /**
+ * Create all links that exist in the torus.
+ * Each rank creates #dimensions-1 links
+ */
+ int neighbour_rank_id = 0; // The other node the link connects
+ int current_dimension = 0, // which dimension are we currently in?
+ // we need to iterate over all dimensions
+ // and create all links there
+ dim_product = 1; // Needed to calculate the next neighbour_id
+ for (j = 0; j < xbt_dynar_length(p_dimensions); j++) {
+
+ memset(&link, 0, sizeof(link));
+ current_dimension = xbt_dynar_get_as(p_dimensions, j, int);
+ neighbour_rank_id = ( ((int) rank / dim_product) % current_dimension == current_dimension-1) ? rank - (current_dimension-1)*dim_product : rank + dim_product;
+ //name of neighbour is not right for non contiguous cluster radicals (as id != rank in this case)
+ link_id = bprintf("%s_link_from_%i_to_%i", cluster->id, id, neighbour_rank_id);
+ link.id = link_id;
+ link.bandwidth = cluster->bw;
+ link.latency = cluster->lat;
+ link.state = SURF_RESOURCE_ON;
+ link.policy = cluster->sharing_policy;
+ sg_platf_new_link(&link);
+ s_surf_parsing_link_up_down_t info;
+ if (link.policy == SURF_LINK_FULLDUPLEX) {
+ char *tmp_link = bprintf("%s_UP", link_id);
+ info.link_up =
+ xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ free(tmp_link);
+ tmp_link = bprintf("%s_DOWN", link_id);
+ info.link_down =
+ xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ free(tmp_link);
+ } else {
+ info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+ info.link_down = info.link_up;
+ }
+ /**
+ * Add the link to its appropriate position;
+ * note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?)
+ * holds the link "rankId->rankId"
+ */
+ xbt_dynar_set(p_linkUpDownList, position
+ + j,
+ &info);
+ dim_product *= current_dimension;
+ xbt_free(link_id);
+ }
+ rank++;
+}
+
+void AsClusterTorus::parse_specific_arguments(sg_platf_cluster_cbarg_t cluster){
+
+ unsigned int iter;
+ char *groups;
+ xbt_dynar_t dimensions = xbt_str_split(cluster->topo_parameters, ",");
+
+ if (!xbt_dynar_is_empty(dimensions)) {
+ p_dimensions= xbt_dynar_new(sizeof(int), NULL);
+ /**
+ * We are in a torus cluster
+ * Parse attribute dimensions="dim1,dim2,dim3,...,dimN"
+ * and safe it in a dynarray.
+ * Additionally, we need to know how many ranks we have in total
+ */
+ xbt_dynar_foreach(dimensions, iter, groups) {
+ int tmp = surf_parse_get_int(xbt_dynar_get_as(dimensions, iter, char *));
+ xbt_dynar_set_as(p_dimensions, iter, int, tmp);
+ }
+
+ p_nb_links_per_node = xbt_dynar_length(p_dimensions);
+
+ }
+ xbt_dynar_free(&dimensions);
+}
+
+void AsClusterTorus::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat){
+
+ XBT_VERB("torus_get_route_and_latency from '%s'[%d] to '%s'[%d]",
+ src->getName(), src->getId(),
+ dst->getName(), dst->getId());
+
+ if (dst->getRcType() == SURF_NETWORK_ELEMENT_ROUTER || src->getRcType() == SURF_NETWORK_ELEMENT_ROUTER) return;
+
+ if((src->getId() == dst->getId()) && p_has_loopback ){
+ s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(p_linkUpDownList, src->getId() * p_nb_links_per_node, s_surf_parsing_link_up_down_t);
+ xbt_dynar_push_as(route->link_list, void *, info.link_up);
+
+ if (lat)
+ *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+ return;
+ }
+
+
+ /**
+ * Dimension based routing routes through each dimension consecutively
+ * TODO Change to dynamic assignment
+ */
+ unsigned int j, cur_dim, dim_product = 1;
+ int current_node = src->getId();
+ int unsigned next_node = 0;
+ /**
+ * Arrays that hold the coordinates of the current node and
+ * the target; comparing the values at the i-th position of
+ * both arrays, we can easily assess whether we need to route
+ * into this dimension or not.
+ */
+ unsigned int* myCoords, *targetCoords;
+ myCoords = rankId_to_coords(src->getId(), p_dimensions);
+ targetCoords = rankId_to_coords(dst->getId(), p_dimensions);
+ /**
+ * linkOffset describes the offset where the link
+ * we want to use is stored
+ * (+1 is added because each node has a link from itself to itself,
+ * which can only be the case if src->m_id == dst->m_id -- see above
+ * for this special case)
+ */
+ int nodeOffset = (xbt_dynar_length(p_dimensions)+1)*src->getId();
+
+ int linkOffset = nodeOffset;
+ bool use_lnk_up = false; // Is this link of the form "cur -> next" or "next -> cur"?
+ // false means: next -> cur
+ while (current_node != dst->getId()) {
+ dim_product = 1; // First, we will route in x-dimension
+ for (j = 0; j < xbt_dynar_length(p_dimensions); j++) {
+ cur_dim = xbt_dynar_get_as(p_dimensions, j, int);
+
+ // current_node/dim_product = position in current dimension
+ if ((current_node/dim_product) % cur_dim != (dst->getId()/dim_product) % cur_dim) {
+
+ if (( targetCoords[j] > myCoords[j] && targetCoords[j] <= myCoords[j]+cur_dim/2) // Is the target node on the right, without the wrap-around?
+ || ( myCoords[j] > cur_dim/2 && (myCoords[j]+cur_dim/2)%cur_dim >= targetCoords[j] )) { // Or do we need to use the wrap around to reach it?
+ if ((current_node / dim_product) % cur_dim == cur_dim-1)
+ next_node = (current_node+dim_product-dim_product*cur_dim);
+ else
+ next_node = (current_node+dim_product);
+
+ // HERE: We use *CURRENT* node for calculation (as opposed to next_node)
+ nodeOffset = current_node*(p_nb_links_per_node);
+ linkOffset = nodeOffset+p_has_loopback+p_has_limiter+j;
+ use_lnk_up = true;
+ assert(linkOffset >= 0);
+ }
+ else { // Route to the left
+ if ((current_node / dim_product) % cur_dim == 0)
+ next_node = (current_node-dim_product+dim_product*cur_dim);
+ else
+ next_node = (current_node-dim_product);
+
+ // HERE: We use *next* node for calculation (as opposed to current_node!)
+ nodeOffset = next_node*(p_nb_links_per_node);
+ linkOffset = nodeOffset+j+p_has_loopback+p_has_limiter;
+ use_lnk_up = false;
+
+ assert(linkOffset >= 0);
+ }
+ XBT_DEBUG("torus_get_route_and_latency - current_node: %i, next_node: %u, linkOffset is %i",
+ current_node, next_node, linkOffset);
+
+ break;
+ }
+
+ dim_product *= cur_dim;
+ }
+
+ s_surf_parsing_link_up_down_t info;
+
+ if (p_has_limiter){ // limiter for sender
+ info = xbt_dynar_get_as(p_linkUpDownList, nodeOffset + p_has_loopback, s_surf_parsing_link_up_down_t);
+ xbt_dynar_push_as(route->link_list, void *, info.link_up);
+ }
+
+ info = xbt_dynar_get_as(p_linkUpDownList,linkOffset, s_surf_parsing_link_up_down_t);
+
+ if (use_lnk_up == false)
+ xbt_dynar_push_as(route->link_list,void*,info.link_down);
+ else
+ xbt_dynar_push_as(route->link_list,void*,info.link_up);
+
+ current_node = next_node;
+ next_node = 0;
+ }
+ free(myCoords);
+ free(targetCoords);
+
+
+
+ return;
+}
--- /dev/null
+/* 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
-/* 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)
}
}
+AS_t model_dijkstra_create(void){
+ return new AsDijkstra(0);
+}
+
+AS_t model_dijkstracache_create(void){
+ return new AsDijkstra(1);
+}
+
+void model_dijkstra_both_end(AS_t as)
+{
+ AsDijkstraPtr THIS_AS = static_cast<AsDijkstraPtr>(as);
+ xbt_node_t node = NULL;
+ unsigned int cursor2;
+ xbt_dynar_t nodes = NULL;
+
+ /* Create the topology graph */
+ if(!THIS_AS->p_routeGraph)
+ THIS_AS->p_routeGraph = xbt_graph_new_graph(1, NULL);
+ if(!THIS_AS->p_graphNodeMap)
+ THIS_AS->p_graphNodeMap = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
+
+ if (THIS_AS->m_cached && !THIS_AS->p_routeCache)
+ THIS_AS->p_routeCache = xbt_dict_new_homogeneous(&route_cache_elem_free);
+
+ /* Add the loopback if needed */
+ if (routing_platf->p_loopback && as->p_hierarchy == SURF_ROUTING_BASE)
+ THIS_AS->addLoopback();
+
+ /* initialize graph indexes in nodes after graph has been built */
+ nodes = xbt_graph_get_nodes(THIS_AS->p_routeGraph);
+
+ xbt_dynar_foreach(nodes, cursor2, node) {
+ graph_node_data_t data = (graph_node_data_t) xbt_graph_node_get_data(node);
+ data->graph_id = cursor2;
+ }
+}
+
/* Utility functions */
-static xbt_node_t route_graph_new_node(as_dijkstra_t as,
- int id, int graph_id)
+xbt_node_t AsDijkstra::routeGraphNewNode(int id, int graph_id)
{
xbt_node_t node = NULL;
graph_node_data_t data = NULL;
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;
/* 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));
/* 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;
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);
}
}
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;
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;
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);
xbt_dynar_foreach(links, cpt, link) {
xbt_dynar_unshift(route->link_list, &link);
if (lat)
- *lat += surf_network_model->extension.network.get_link_latency(link);
+ *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
}
}
- if (as->cached) {
+ if (m_cached) {
/*check if there is a cached predecessor list avail */
elm = (route_cache_element_t)
- xbt_dict_get_or_null_ext(as->route_cache, (char *) (&src_id),
+ xbt_dict_get_or_null_ext(p_routeCache, (char *) (&src_id),
sizeof(int));
}
/* 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;
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 */
}
/* 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;
if (v == dst_node_id)
first_gw = gw_dst;
- if (asg->hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id
- && strcmp(gw_dst->name, prev_gw_src->name)) {
+ if (p_hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id
+ && strcmp(gw_dst->getName(), prev_gw_src->getName())) {
xbt_dynar_t e_route_as_to_as=NULL;
- routing_get_route_and_latency(gw_dst_net_elm, prev_gw_src_net_elm, &e_route_as_to_as, NULL);
+
+ routing_platf->getRouteAndLatency(gw_dst_net_elm, prev_gw_src_net_elm, &e_route_as_to_as, NULL);
if (edge == NULL)
- THROWF(arg_error,0,"No route from '%s' to '%s'",src->name,dst->name);
+ THROWF(arg_error,0,"No route from '%s' to '%s'", src->getName(), dst->getName());
links = e_route_as_to_as;
int pos = 0;
xbt_dynar_foreach(links, cpt, link) {
xbt_dynar_insert_at(route->link_list, pos, &link);
if (lat)
- *lat += surf_network_model->extension.network.get_link_latency(link);
+ *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
pos++;
}
}
xbt_dynar_foreach(links, cpt, link) {
xbt_dynar_unshift(route->link_list, &link);
if (lat)
- *lat += surf_network_model->extension.network.get_link_latency(link);
+ *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
}
size++;
}
- if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
+ if (p_hierarchy == SURF_ROUTING_RECURSIVE) {
route->gw_src = gw_src;
route->gw_dst = first_gw;
}
- if (as->cached && elm == NULL) {
+ if (m_cached && elm == NULL) {
/* add to predecessor list of the current src-host to cache */
elm = xbt_new0(struct route_cache_element, 1);
elm->pred_arr = pred_arr;
elm->size = size;
- xbt_dict_set_ext(as->route_cache, (char *) (&src_id), sizeof(int),
+ xbt_dict_set_ext(p_routeCache, (char *) (&src_id), sizeof(int),
(xbt_set_elm_t) elm, NULL);
}
- if (!as->cached)
+ if (!m_cached)
xbt_free(pred_arr);
}
-static void dijkstra_finalize(AS_t asg)
+AsDijkstra::~AsDijkstra()
{
- as_dijkstra_t as = (as_dijkstra_t) asg;
-
- xbt_graph_free_graph(as->route_graph, &xbt_free,
+ xbt_graph_free_graph(p_routeGraph, &xbt_free,
&graph_edge_data_free, &xbt_free);
- xbt_dict_free(&as->graph_node_map);
- if (as->cached)
- xbt_dict_free(&as->route_cache);
-
- model_generic_finalize(asg);
+ xbt_dict_free(&p_graphNodeMap);
+ if (m_cached)
+ xbt_dict_free(&p_routeCache);
}
/* Creation routing model functions */
-AS_t model_dijkstra_both_create(int cached)
-{
- as_dijkstra_t new_component = (as_dijkstra_t)
- model_generic_create_sized(sizeof(s_as_dijkstra_t));
+AsDijkstra::AsDijkstra() : AsGeneric(), m_cached(0) {
+ p_routeGraph = NULL;
+ p_graphNodeMap = NULL;
+ p_routeCache = NULL;
+}
- new_component->generic_routing.parse_route = model_dijkstra_both_parse_route;
+AsDijkstra::AsDijkstra(int cached) : AsGeneric(), m_cached(cached)
+{
+ p_routeGraph = NULL;
+ p_graphNodeMap = NULL;
+ p_routeCache = NULL;
+ /*new_component->generic_routing.parse_route = model_dijkstra_both_parse_route;
new_component->generic_routing.parse_ASroute = model_dijkstra_both_parse_route;
new_component->generic_routing.get_route_and_latency = dijkstra_get_route_and_latency;
new_component->generic_routing.get_onelink_routes =
dijkstra_get_onelink_routes;
new_component->generic_routing.get_graph = generic_get_graph;
new_component->generic_routing.finalize = dijkstra_finalize;
- new_component->cached = cached;
-
- return (AS_t)new_component;
+ new_component->cached = cached;*/
}
-AS_t model_dijkstra_create(void)
+void AsDijkstra::end()
{
- return model_dijkstra_both_create(0);
-}
-
-AS_t model_dijkstracache_create(void)
-{
- return model_dijkstra_both_create(1);
-}
-
-void model_dijkstra_both_end(AS_t as)
-{
- as_dijkstra_t THIS_AS = (as_dijkstra_t) as;
-
xbt_node_t node = NULL;
unsigned int cursor2;
xbt_dynar_t nodes = NULL;
/* Create the topology graph */
- if(!THIS_AS->route_graph)
- THIS_AS->route_graph = xbt_graph_new_graph(1, NULL);
- if(!THIS_AS->graph_node_map)
- THIS_AS->graph_node_map = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
+ if(!p_routeGraph)
+ p_routeGraph = xbt_graph_new_graph(1, NULL);
+ if(!p_graphNodeMap)
+ p_graphNodeMap = xbt_dict_new_homogeneous(&graph_node_map_elem_free);
- if (THIS_AS->cached && !THIS_AS->route_cache)
- THIS_AS->route_cache = xbt_dict_new_homogeneous(&route_cache_elem_free);
+ if (m_cached && !p_routeCache)
+ p_routeCache = xbt_dict_new_homogeneous(&route_cache_elem_free);
/* Add the loopback if needed */
- if (routing_platf->loopback && as->hierarchy == SURF_ROUTING_BASE)
- add_loopback_dijkstra(THIS_AS);
+ if (routing_platf->p_loopback && p_hierarchy == SURF_ROUTING_BASE)
+ addLoopback();
/* initialize graph indexes in nodes after graph has been built */
- nodes = xbt_graph_get_nodes(THIS_AS->route_graph);
+ nodes = xbt_graph_get_nodes(p_routeGraph);
xbt_dynar_foreach(nodes, cursor2, node) {
- graph_node_data_t data = xbt_graph_node_get_data(node);
+ graph_node_data_t data = (graph_node_data_t) xbt_graph_node_get_data(node);
data->graph_id = cursor2;
}
}
-void model_dijkstra_both_parse_route (AS_t asg, sg_platf_route_cbarg_t route)
+
+void AsDijkstra::parseASroute(sg_platf_route_cbarg_t route)
+{
+ parseRoute(route);
+}
+
+void AsDijkstra::parseRoute(sg_platf_route_cbarg_t route)
{
char *src = (char*)(route->src);
char *dst = (char*)(route->dst);
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);
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)
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);
}
--- /dev/null
+/* 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_ */
-/* Copyright (c) 2009-2013. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include "surf_routing_private.h"
-
-/* Global vars */
-extern routing_platf_t routing_platf;
+#include "surf_routing_floyd.hpp"
+#include "network_interface.hpp"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_floyd, surf, "Routing part of surf");
-#define TO_FLOYD_COST(i,j) (as->cost_table)[(i)+(j)*table_size]
-#define TO_FLOYD_PRED(i,j) (as->predecessor_table)[(i)+(j)*table_size]
-#define TO_FLOYD_LINK(i,j) (as->link_table)[(i)+(j)*table_size]
+#define TO_FLOYD_COST(i,j) (p_costTable)[(i)+(j)*table_size]
+#define TO_FLOYD_PRED(i,j) (p_predecessorTable)[(i)+(j)*table_size]
+#define TO_FLOYD_LINK(i,j) (p_linkTable)[(i)+(j)*table_size]
-/* Routing model structure */
+AS_t model_floyd_create(void)
+{
+ return new AsFloyd();
+}
-typedef struct {
- s_as_t generic_routing;
- /* vars for calculate the floyd algorithm. */
- int *predecessor_table;
- double *cost_table;
- sg_platf_route_cbarg_t *link_table;
-} s_as_floyd_t, *as_floyd_t;
+void model_floyd_end(AS_t current_routing)
+{
+ static_cast<AsFloydPtr>(current_routing)->end();
+}
+
+AsFloyd::AsFloyd(): AsGeneric() {
+ p_predecessorTable = NULL;
+ p_costTable = NULL;
+ p_linkTable = NULL;
+}
-static void floyd_get_route_and_latency(AS_t asg, sg_routing_edge_t src, sg_routing_edge_t dst,
- sg_platf_route_cbarg_t res, double *lat);
+AsFloyd::~AsFloyd(){
+ int i, j;
+ int table_size;
+ table_size = (int)xbt_dynar_length(p_indexNetworkElm);
+ /* Delete link_table */
+ for (i = 0; i < table_size; i++)
+ for (j = 0; j < table_size; j++)
+ generic_free_route(TO_FLOYD_LINK(i, j));
+ xbt_free(p_linkTable);
+ /* Delete bypass dict */
+ xbt_dict_free(&p_bypassRoutes);
+ /* Delete predecessor and cost table */
+ xbt_free(p_predecessorTable);
+ xbt_free(p_costTable);
+}
/* Business methods */
-static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
+xbt_dynar_t AsFloyd::getOneLinkRoutes()
{
- xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
+ xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free);
sg_platf_route_cbarg_t route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
int src,dst;
sg_routing_edge_t src_elm, dst_elm;
- int table_size = xbt_dynar_length(asg->index_network_elm);
+ int table_size = xbt_dynar_length(p_indexNetworkElm);
for(src=0; src < table_size; src++) {
for(dst=0; dst< table_size; dst++) {
xbt_dynar_reset(route->link_list);
- src_elm = xbt_dynar_get_as(asg->index_network_elm,src,sg_routing_edge_t);
- dst_elm = xbt_dynar_get_as(asg->index_network_elm,dst,sg_routing_edge_t);
- floyd_get_route_and_latency(asg, src_elm, dst_elm, route, NULL);
+ src_elm = xbt_dynar_get_as(p_indexNetworkElm, src, RoutingEdgePtr);
+ dst_elm = xbt_dynar_get_as(p_indexNetworkElm, dst, RoutingEdgePtr);
+ this->getRouteAndLatency(src_elm, dst_elm, route, NULL);
if (xbt_dynar_length(route->link_list) == 1) {
void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
- onelink_t onelink = xbt_new0(s_onelink_t, 1);
- onelink->link_ptr = link;
- if (asg->hierarchy == SURF_ROUTING_BASE) {
- onelink->src = src_elm;
- onelink->dst = dst_elm;
- } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
- onelink->src = route->gw_src;
- onelink->dst = route->gw_dst;
- }
+ OnelinkPtr onelink;
+ if (p_hierarchy == SURF_ROUTING_BASE)
+ onelink = new Onelink(link, src_elm, dst_elm);
+ else if (p_hierarchy == SURF_ROUTING_RECURSIVE)
+ onelink = new Onelink(link, route->gw_src, route->gw_dst);
+ else
+ onelink = new Onelink(link, NULL, NULL);
xbt_dynar_push(ret, &onelink);
}
}
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;
}
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);
}
xbt_dynar_foreach(links, cpt, link) {
xbt_dynar_push_as(res->link_list, sg_routing_link_t, link);
if (lat)
- *lat += surf_network_model->extension.network.get_link_latency(link);
+ *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
}
prev_dst_gw = e_route->gw_dst;
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);
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++)
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;
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);
}
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);
+ }
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/* 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_ */
-/* 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,
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;
xbt_dynar_foreach(e_route->link_list, cpt, link) {
xbt_dynar_push(res->link_list, &link);
if (lat)
- *lat += surf_network_model->extension.network.get_link_latency(link);
+ *lat += static_cast<NetworkLinkPtr>(link)->getLatency();
}
}
}
-static void full_finalize(AS_t rc)
-{
- routing_component_full_t routing = (routing_component_full_t) rc;
- size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
- int i, j;
- if (routing) {
- /* Delete routing table */
- for (i = 0; i < table_size; i++)
- for (j = 0; j < table_size; j++)
- generic_free_route(TO_ROUTE_FULL(i, j));
- xbt_free(routing->routing_table);
- model_generic_finalize(rc);
- }
-}
-
-/* Creation routing model functions */
-
-AS_t model_full_create(void)
-{
- routing_component_full_t new_component = (routing_component_full_t)
- model_generic_create_sized(sizeof(s_routing_component_full_t));
-
- new_component->generic_routing.parse_route = model_full_set_route;
- new_component->generic_routing.parse_ASroute = model_full_set_route;
- new_component->generic_routing.get_route_and_latency =
- full_get_route_and_latency;
- new_component->generic_routing.get_graph = generic_get_graph;
-
- new_component->generic_routing.get_onelink_routes = full_get_onelink_routes;
- new_component->generic_routing.finalize = full_finalize;
-
- return (AS_t) new_component;
-}
-
-void model_full_end(AS_t current_routing)
-{
- unsigned int i;
- sg_platf_route_cbarg_t e_route;
-
- /* set utils vars */
- routing_component_full_t routing =
- ((routing_component_full_t) current_routing);
- size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
-
- /* Create table if necessary */
- if (!routing->routing_table)
- routing->routing_table = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size);
-
- /* Add the loopback if needed */
- if (routing_platf->loopback && current_routing->hierarchy == SURF_ROUTING_BASE) {
- for (i = 0; i < table_size; i++) {
- e_route = TO_ROUTE_FULL(i, i);
- if (!e_route) {
- e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1);
- e_route->gw_src = NULL;
- e_route->gw_dst = NULL;
- e_route->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
- xbt_dynar_push(e_route->link_list, &routing_platf->loopback);
- TO_ROUTE_FULL(i, i) = e_route;
- }
- }
- }
+void AsFull::parseASroute(sg_platf_route_cbarg_t route){
+ parseRoute(route);
}
static int full_pointer_resource_cmp(const void *a, const void *b)
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 =
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. "
// 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)
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,
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);
}
+
+
+
+
--- /dev/null
+/* 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_ */
-/* 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
#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);
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);
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));
/* ************************************************************************** */
/* *********************** 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;
}
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;
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) {
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;
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);
}
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);
}
}
-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;
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)
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)
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;
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();
}
}
/* ************************************************************************** */
/* ************************* 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;
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;
}
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;
}
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);
}
--- /dev/null
+/* 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_ */
+++ /dev/null
-/* 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);
-}
-
--- /dev/null
+/* 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);
+}
+
--- /dev/null
+/* 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_ */
-/* 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
#include <float.h>
#include "internal_config.h"
-#include "surf_private.h"
+#include "surf_interface.hpp"
#include "xbt/dynar.h"
#include "xbt/str.h"
#include "xbt/config.h"
/* ************************************************** */
/* ************** 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 **************** */
+++ /dev/null
-/* 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;
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "surf_routing_vivaldi.hpp"
+#include "network_interface.hpp"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf");
+
+static XBT_INLINE double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) {
+ double src_coord, dst_coord;
+
+ src_coord = xbt_dynar_get_as(src, index, double);
+ dst_coord = xbt_dynar_get_as(dst, index, double);
+
+ return (src_coord-dst_coord)*(src_coord-dst_coord);
+}
+
+AS_t model_vivaldi_create(void)
+{
+ return new AsVivaldi();
+}
+
+void AsVivaldi::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat)
+{
+ s_surf_parsing_link_up_down_t info;
+
+ XBT_DEBUG("vivaldi_get_route_and_latency from '%s'[%d] '%s'[%d]",
+ src->getName(), src->getId(), dst->getName(), dst->getId());
+
+ if(src->getRcType() == SURF_NETWORK_ELEMENT_AS) {
+ char *src_name = ROUTER_PEER(src->getName());
+ char *dst_name = ROUTER_PEER(dst->getName());
+ route->gw_src = (sg_routing_edge_t) xbt_lib_get_or_null(as_router_lib, src_name, ROUTING_ASR_LEVEL);
+ route->gw_dst = (sg_routing_edge_t) xbt_lib_get_or_null(as_router_lib, dst_name, ROUTING_ASR_LEVEL);
+ xbt_free(src_name);
+ xbt_free(dst_name);
+ }
+
+ double euclidean_dist;
+ xbt_dynar_t src_ctn, dst_ctn;
+ char *tmp_src_name, *tmp_dst_name;
+
+ if(src->getRcType() == SURF_NETWORK_ELEMENT_HOST){
+ tmp_src_name = HOST_PEER(src->getName());
+
+ if(p_linkUpDownList){
+ info = xbt_dynar_get_as(p_linkUpDownList, src->getId(), s_surf_parsing_link_up_down_t);
+ if(info.link_up) { // link up
+ xbt_dynar_push_as(route->link_list, void*, info.link_up);
+ if (lat)
+ *lat += static_cast<NetworkLinkPtr>(info.link_up)->getLatency();
+ }
+ }
+ src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_src_name, COORD_HOST_LEVEL);
+ if(!src_ctn ) src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, src->getName(), COORD_HOST_LEVEL);
+ }
+ else if(src->getRcType() == SURF_NETWORK_ELEMENT_ROUTER || src->getRcType() == SURF_NETWORK_ELEMENT_AS){
+ tmp_src_name = ROUTER_PEER(src->getName());
+ src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_src_name, COORD_ASR_LEVEL);
+ }
+ else{
+ THROW_IMPOSSIBLE;
+ }
+
+ if(dst->getRcType() == SURF_NETWORK_ELEMENT_HOST){
+ tmp_dst_name = HOST_PEER(dst->getName());
+
+ if(p_linkUpDownList){
+ info = xbt_dynar_get_as(p_linkUpDownList, dst->getId(), s_surf_parsing_link_up_down_t);
+ if(info.link_down) { // link down
+ xbt_dynar_push_as(route->link_list,void*,info.link_down);
+ if (lat)
+ *lat += static_cast<NetworkLinkPtr>(info.link_down)->getLatency();
+ }
+ }
+ dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_dst_name, COORD_HOST_LEVEL);
+ if(!dst_ctn ) dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, dst->getName(), COORD_HOST_LEVEL);
+ }
+ else if(dst->getRcType() == SURF_NETWORK_ELEMENT_ROUTER || dst->getRcType() == SURF_NETWORK_ELEMENT_AS){
+ tmp_dst_name = ROUTER_PEER(dst->getName());
+ dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_dst_name, COORD_ASR_LEVEL);
+ }
+ else{
+ THROW_IMPOSSIBLE;
+ }
+
+ xbt_assert(src_ctn,"No coordinate found for element '%s'",tmp_src_name);
+ xbt_assert(dst_ctn,"No coordinate found for element '%s'",tmp_dst_name);
+ free(tmp_src_name);
+ free(tmp_dst_name);
+
+ euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn))
+ + fabs(xbt_dynar_get_as(src_ctn, 2, double))+fabs(xbt_dynar_get_as(dst_ctn, 2, double));
+
+ if (lat){
+ XBT_DEBUG("Updating latency %f += %f",*lat,euclidean_dist);
+ *lat += euclidean_dist / 1000.0; //From .ms to .s
+ }
+}
+
+int AsVivaldi::parsePU(RoutingEdgePtr elm) {
+ XBT_DEBUG("Load process unit \"%s\"", elm->getName());
+ xbt_dynar_push_as(p_indexNetworkElm, sg_routing_edge_t, elm);
+ return xbt_dynar_length(p_indexNetworkElm)-1;
+}
--- /dev/null
+/* 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_ */
-/* 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
#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,
/* 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];
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)
{
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)
{
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) {
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)
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 */
-/* 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
-/* 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
-/* 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
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "vm_workstation_hl13.hpp"
+#include "cpu_cas01.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_vm_workstation);
+
+void surf_vm_workstation_model_init_current_default(void){
+ if (surf_cpu_model_vm) {
+ surf_vm_workstation_model = new WorkstationVMHL13Model();
+ ModelPtr model = static_cast<ModelPtr>(surf_vm_workstation_model);
+
+ xbt_dynar_push(model_list, &model);
+ xbt_dynar_push(model_list_invoke, &model);
+ }
+}
+
+/*********
+ * Model *
+ *********/
+
+WorkstationVMHL13Model::WorkstationVMHL13Model() : WorkstationVMModel() {
+ p_cpuModel = surf_cpu_model_vm;
+}
+
+void WorkstationVMHL13Model::updateActionsState(double /*now*/, double /*delta*/){
+ return;
+}
+
+xbt_dynar_t WorkstationVMHL13Model::getRoute(WorkstationPtr src, WorkstationPtr dst){
+ XBT_DEBUG("ws_get_route");
+ return surf_network_model->getRoute(src->p_netElm, dst->p_netElm);
+}
+
+ActionPtr WorkstationVMHL13Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){
+ return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate);
+}
+
+/* ind means ''indirect'' that this is a reference on the whole dict_elm
+ * structure (i.e not on the surf_resource_private infos) */
+
+void WorkstationVMHL13Model::createResource(const char *name, void *ind_phys_workstation)
+{
+ WorkstationVMHL13Ptr ws = new WorkstationVMHL13(this, name, NULL, static_cast<surf_resource_t>(ind_phys_workstation));
+
+ xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast<ResourcePtr>(ws));
+
+ /* TODO:
+ * - check how network requests are scheduled between distinct processes competing for the same card.
+ */
+}
+
+static inline double get_solved_value(CpuActionPtr cpu_action)
+{
+ return cpu_action->getVariable()->value;
+}
+
+/* In the real world, processes on the guest operating system will be somewhat
+ * degraded due to virtualization overhead. The total CPU share that these
+ * processes get is smaller than that of the VM process gets on a host
+ * operating system. */
+// const double virt_overhead = 0.95;
+const double virt_overhead = 1;
+
+double WorkstationVMHL13Model::shareResources(double now)
+{
+ /* TODO: udpate action's cost with the total cost of processes on the VM. */
+
+
+ /* 0. Make sure that we already calculated the resource share at the physical
+ * machine layer. */
+ {
+ ModelPtr ws_model = static_cast<ModelPtr>(surf_workstation_model);
+ ModelPtr vm_ws_model = static_cast<ModelPtr>(surf_vm_workstation_model);
+ unsigned int index_of_pm_ws_model = xbt_dynar_search(model_list_invoke, &ws_model);
+ unsigned int index_of_vm_ws_model = xbt_dynar_search(model_list_invoke, &vm_ws_model);
+ xbt_assert((index_of_pm_ws_model < index_of_vm_ws_model), "Cannot assume surf_workstation_model comes before");
+
+ /* Another option is that we call sub_ws->share_resource() here. The
+ * share_resource() function has no side-effect. We can call it here to
+ * ensure that. */
+ }
+
+
+ /* 1. Now we know how many resource should be assigned to each virtual
+ * machine. We update constraints of the virtual machine layer.
+ *
+ *
+ * If we have two virtual machine (VM1 and VM2) on a physical machine (PM1).
+ * X1 + X2 = C (Equation 1)
+ * where
+ * the resource share of VM1: X1
+ * the resource share of VM2: X2
+ * the capacity of PM1: C
+ *
+ * Then, if we have two process (P1 and P2) on VM1.
+ * X1_1 + X1_2 = X1 (Equation 2)
+ * where
+ * the resource share of P1: X1_1
+ * the resource share of P2: X1_2
+ * the capacity of VM1: X1
+ *
+ * Equation 1 was solved in the physical machine layer.
+ * Equation 2 is solved in the virtual machine layer (here).
+ * X1 must be passed to the virtual machine laye as a constraint value.
+ *
+ **/
+
+ /* iterate for all virtual machines */
+ for (WorkstationVMModel::vm_list_t::iterator iter =
+ WorkstationVMModel::ws_vms.begin();
+ iter != WorkstationVMModel::ws_vms.end(); ++iter) {
+
+ WorkstationVMPtr ws_vm = &*iter;
+ CpuPtr cpu = static_cast<CpuPtr>(ws_vm->p_cpu);
+ xbt_assert(cpu, "cpu-less workstation");
+
+ double solved_value = get_solved_value(static_cast<CpuActionPtr>(ws_vm->p_action));
+ XBT_DEBUG("assign %f to vm %s @ pm %s", solved_value,
+ ws_vm->getName(), ws_vm->p_subWs->getName());
+
+ // TODO: check lmm_update_constraint_bound() works fine instead of the below manual substitution.
+ // cpu_cas01->constraint->bound = solved_value;
+ xbt_assert(cpu->getModel() == static_cast<ModelPtr>(surf_cpu_model_vm));
+ lmm_system_t vcpu_system = cpu->getModel()->getMaxminSystem();
+ lmm_update_constraint_bound(vcpu_system, cpu->getConstraint(), virt_overhead * solved_value);
+ }
+
+
+ /* 2. Calculate resource share at the virtual machine layer. */
+ adjustWeightOfDummyCpuActions();
+
+ double min_by_cpu = p_cpuModel->shareResources(now);
+ double min_by_net = (strcmp(surf_network_model->getName(), "network NS3")) ? surf_network_model->shareResources(now) : -1;
+ double min_by_sto = -1;
+ if (p_cpuModel == surf_cpu_model_pm)
+ min_by_sto = surf_storage_model->shareResources(now);
+
+ XBT_DEBUG("model %p, %s min_by_cpu %f, %s min_by_net %f, %s min_by_sto %f",
+ this, surf_cpu_model_pm->getName(), min_by_cpu,
+ surf_network_model->getName(), min_by_net,
+ surf_storage_model->getName(), min_by_sto);
+
+ double ret = max(max(min_by_cpu, min_by_net), min_by_sto);
+ if (min_by_cpu >= 0.0 && min_by_cpu < ret)
+ ret = min_by_cpu;
+ if (min_by_net >= 0.0 && min_by_net < ret)
+ ret = min_by_net;
+ if (min_by_sto >= 0.0 && min_by_sto < ret)
+ ret = min_by_sto;
+
+ /* FIXME: 3. do we have to re-initialize our cpu_action object? */
+#if 0
+ /* iterate for all virtual machines */
+ for (WorkstationVMModel::vm_list_t::iterator iter =
+ WorkstationVMModel::ws_vms.begin();
+ iter != WorkstationVMModel::ws_vms.end(); ++iter) {
+
+ {
+#if 0
+ WorkstationVM2013Ptr ws_vm2013 = static_cast<WorkstationVM2013Ptr>(&*iter);
+ XBT_INFO("cost %f remains %f start %f finish %f", ws_vm2013->cpu_action->cost,
+ ws_vm2013->cpu_action->remains,
+ ws_vm2013->cpu_action->start,
+ ws_vm2013->cpu_action->finish
+ );
+#endif
+#if 0
+ void *ind_sub_host = xbt_lib_get_elm_or_null(host_lib, ws_vm2013->sub_ws->generic_resource.getName);
+ surf_cpu_model_pm->action_unref(ws_vm2013->cpu_action);
+ /* FIXME: this means busy loop? */
+ // ws_vm2013->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_sub_host, GUESTOS_NOISE);
+ ws_vm2013->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_sub_host, 0);
+#endif
+
+ }
+ }
+#endif
+
+
+ return ret;
+}
+
+ActionPtr WorkstationVMHL13Model::executeParallelTask(int workstation_nb,
+ void **workstation_list,
+ double *computation_amount,
+ double *communication_amount,
+ double rate){
+#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0)
+ if ((workstation_nb == 1)
+ && (cost_or_zero(communication_amount, 0) == 0.0))
+ return ((WorkstationCLM03Ptr)workstation_list[0])->execute(computation_amount[0]);
+ else if ((workstation_nb == 1)
+ && (cost_or_zero(computation_amount, 0) == 0.0))
+ return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[0],communication_amount[0], rate);
+ else if ((workstation_nb == 2)
+ && (cost_or_zero(computation_amount, 0) == 0.0)
+ && (cost_or_zero(computation_amount, 1) == 0.0)) {
+ int i,nb = 0;
+ double value = 0.0;
+
+ for (i = 0; i < workstation_nb * workstation_nb; i++) {
+ if (cost_or_zero(communication_amount, i) > 0.0) {
+ nb++;
+ value = cost_or_zero(communication_amount, i);
+ }
+ }
+ if (nb == 1)
+ return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[1],value, rate);
+ }
+#undef cost_or_zero
+
+ THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */
+ return NULL;
+}
+
+/************
+ * Resource *
+ ************/
+
+WorkstationVMHL13::WorkstationVMHL13(WorkstationVMModelPtr model, const char* name, xbt_dict_t props,
+ surf_resource_t ind_phys_workstation)
+ : WorkstationVM(model, name, props, NULL, NULL)
+{
+ WorkstationPtr sub_ws = static_cast<WorkstationPtr>(surf_workstation_resource_priv(ind_phys_workstation));
+
+ /* Currently, we assume a VM has no storage. */
+ p_storage = NULL;
+
+ /* Currently, a VM uses the network resource of its physical host. In
+ * host_lib, this network resource object is refered from two different keys.
+ * When deregistering the reference that points the network resource object
+ * from the VM name, we have to make sure that the system does not call the
+ * free callback for the network resource object. The network resource object
+ * is still used by the physical machine. */
+ p_netElm = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, sub_ws->getName(), ROUTING_HOST_LEVEL));
+ xbt_lib_set(host_lib, name, ROUTING_HOST_LEVEL, p_netElm);
+
+ p_subWs = sub_ws;
+ p_currentState = SURF_VM_STATE_CREATED;
+
+ // //// CPU RELATED STUFF ////
+ // Roughly, create a vcpu resource by using the values of the sub_cpu one.
+ CpuCas01Ptr sub_cpu = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(ind_phys_workstation));
+
+ /* We can assume one core and cas01 cpu for the first step.
+ * Do xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, cpu) if you get the resource. */
+
+ p_cpu = static_cast<CpuCas01ModelPtr>(surf_cpu_model_vm)->createResource(name, // name
+ sub_cpu->getPowerPeakList(), // host->power_peak,
+ sub_cpu->getPState(),
+ 1, // host->power_scale,
+ NULL, // host->power_trace,
+ 1, // host->core_amount,
+ SURF_RESOURCE_ON, // host->initial_state,
+ NULL, // host->state_trace,
+ NULL); // host->properties,
+
+ /* We create cpu_action corresponding to a VM process on the host operating system. */
+ /* FIXME: TODO: we have to peridocally input GUESTOS_NOISE to the system? how ? */
+ // vm_ws->cpu_action = surf_cpu_model_pm->extension.cpu.execute(ind_phys_workstation, GUESTOS_NOISE);
+ p_action = static_cast<CpuActionPtr>(sub_cpu->execute(0));
+
+ /* The SURF_WKS_LEVEL at host_lib saves workstation_CLM03 objects. Please
+ * note workstation_VM2013 objects, inheriting the workstation_CLM03
+ * structure, are also saved there.
+ *
+ * If you want to get a workstation_VM2013 object from host_lib, see
+ * ws->generic_resouce.model->type first. If it is
+ * SURF_MODEL_TYPE_VM_WORKSTATION, you can cast ws to vm_ws. */
+ XBT_INFO("Create VM(%s)@PM(%s) with %ld mounted disks", name, sub_ws->getName(), xbt_dynar_length(p_storage));
+}
+
+/*
+ * A physical host does not disapper in the current SimGrid code, but a VM may
+ * disapper during a simulation.
+ */
+WorkstationVMHL13::~WorkstationVMHL13()
+{
+ /* ind_phys_workstation equals to smx_host_t */
+ surf_resource_t ind_vm_workstation = xbt_lib_get_elm_or_null(host_lib, getName());
+
+ /* Before clearing the entries in host_lib, we have to pick up resources. */
+ CpuCas01Ptr cpu = static_cast<CpuCas01Ptr>(surf_cpu_resource_priv(ind_vm_workstation));
+
+ /* We deregister objects from host_lib, without invoking the freeing callback
+ * of each level.
+ *
+ * Do not call xbt_lib_remove() here. It deletes all levels of the key,
+ * including MSG_HOST_LEVEL and others. We should unregister only what we know.
+ */
+ xbt_lib_unset(host_lib, getName(), SURF_CPU_LEVEL, 0);
+ xbt_lib_unset(host_lib, getName(), ROUTING_HOST_LEVEL, 0);
+ xbt_lib_unset(host_lib, getName(), SURF_WKS_LEVEL, 0);
+
+ /* TODO: comment out when VM stroage is implemented. */
+ // xbt_lib_unset(host_lib, name, SURF_STORAGE_LEVEL, 0);
+
+
+ /* Free the cpu_action of the VM. */
+ int ret = p_action->unref();
+ xbt_assert(ret == 1, "Bug: some resource still remains");
+
+ /* Free the cpu resource of the VM. If using power_trace, we will have to */
+ delete cpu;
+
+ /* Free the network resource of the VM. */
+ // Nothing has to be done, because net_elmts is just a pointer on the physical one
+
+ /* Free the storage resource of the VM. */
+ // Not relevant yet
+
+ /* Free the workstation resource of the VM. */
+}
+
+void WorkstationVMHL13::updateState(tmgr_trace_event_t /*event_type*/, double /*value*/, double /*date*/) {
+ THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */
+}
+
+bool WorkstationVMHL13::isUsed() {
+ THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */
+ return -1;
+}
+
+e_surf_resource_state_t WorkstationVMHL13::getState()
+{
+ return (e_surf_resource_state_t) p_currentState;
+}
+
+void WorkstationVMHL13::setState(e_surf_resource_state_t state)
+{
+ p_currentState = (e_surf_vm_state_t) state;
+}
+
+void WorkstationVMHL13::suspend()
+{
+ p_action->suspend();
+ p_currentState = SURF_VM_STATE_SUSPENDED;
+}
+
+void WorkstationVMHL13::resume()
+{
+ p_action->resume();
+ p_currentState = SURF_VM_STATE_RUNNING;
+}
+
+void WorkstationVMHL13::save()
+{
+ p_currentState = SURF_VM_STATE_SAVING;
+
+ /* FIXME: do something here */
+ p_action->suspend();
+ p_currentState = SURF_VM_STATE_SAVED;
+}
+
+void WorkstationVMHL13::restore()
+{
+ p_currentState = SURF_VM_STATE_RESTORING;
+
+ /* FIXME: do something here */
+ p_action->resume();
+ p_currentState = SURF_VM_STATE_RUNNING;
+}
+
+/*
+ * Update the physical host of the given VM
+ */
+void WorkstationVMHL13::migrate(surf_resource_t ind_dst_pm)
+{
+ /* ind_phys_workstation equals to smx_host_t */
+ WorkstationPtr ws_dst = static_cast<WorkstationPtr>(surf_workstation_resource_priv(ind_dst_pm));
+ const char *vm_name = getName();
+ const char *pm_name_src = p_subWs->getName();
+ const char *pm_name_dst = ws_dst->getName();
+
+ xbt_assert(ws_dst);
+
+ /* do something */
+
+ /* update net_elm with that of the destination physical host */
+ RoutingEdgePtr old_net_elm = p_netElm;
+ RoutingEdgePtr new_net_elm = static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, pm_name_dst, ROUTING_HOST_LEVEL));
+ xbt_assert(new_net_elm);
+
+ /* Unregister the current net_elm from host_lib. Do not call the free callback. */
+ xbt_lib_unset(host_lib, vm_name, ROUTING_HOST_LEVEL, 0);
+
+ /* Then, resister the new one. */
+ p_netElm = new_net_elm;
+ xbt_lib_set(host_lib, vm_name, ROUTING_HOST_LEVEL, p_netElm);
+
+ p_subWs = ws_dst;
+
+ /* Update vcpu's action for the new pm */
+ {
+#if 0
+ XBT_INFO("cpu_action->remains %g", p_action->remains);
+ XBT_INFO("cost %f remains %f start %f finish %f", p_action->cost,
+ p_action->remains,
+ p_action->start,
+ p_action->finish
+ );
+ XBT_INFO("cpu_action state %d", surf_action_get_state(p_action));
+#endif
+
+ /* create a cpu action bound to the pm model at the destination. */
+ CpuActionPtr new_cpu_action = static_cast<CpuActionPtr>(
+ static_cast<CpuPtr>(surf_cpu_resource_priv(ind_dst_pm))->execute(0));
+
+ e_surf_action_state_t state = p_action->getState();
+ if (state != SURF_ACTION_DONE)
+ XBT_CRITICAL("FIXME: may need a proper handling, %d", state);
+ if (p_action->getRemainsNoUpdate() > 0)
+ XBT_CRITICAL("FIXME: need copy the state(?), %f", p_action->getRemainsNoUpdate());
+
+ /* keep the bound value of the cpu action of the VM. */
+ double old_bound = p_action->getBound();
+ if (old_bound != 0) {
+ XBT_INFO("migrate VM(%s): set bound (%f) at %s", vm_name, old_bound, pm_name_dst);
+ new_cpu_action->setBound(old_bound);
+ }
+
+ int ret = p_action->unref();
+ xbt_assert(ret == 1, "Bug: some resource still remains");
+
+ p_action = new_cpu_action;
+ }
+
+ XBT_DEBUG("migrate VM(%s): change net_elm (%p to %p)", vm_name, old_net_elm, new_net_elm);
+ XBT_DEBUG("migrate VM(%s): change PM (%s to %s)", vm_name, pm_name_src, pm_name_dst);
+}
+
+void WorkstationVMHL13::setBound(double bound){
+ p_action->setBound(bound);
+}
+
+void WorkstationVMHL13::setAffinity(CpuPtr cpu, unsigned long mask){
+ p_action->setAffinity(cpu, mask);
+}
+
+/*
+ * A surf level object will be useless in the upper layer. Returing the
+ * dict_elm of the host.
+ **/
+surf_resource_t WorkstationVMHL13::getPm()
+{
+ return xbt_lib_get_elm_or_null(host_lib, p_subWs->getName());
+}
+
+/* Adding a task to a VM updates the VCPU task on its physical machine. */
+ActionPtr WorkstationVMHL13::execute(double size)
+{
+ double old_cost = p_action->getCost();
+ double new_cost = old_cost + size;
+
+ XBT_DEBUG("VM(%s)@PM(%s): update dummy action's cost (%f -> %f)",
+ getName(), p_subWs->getName(),
+ old_cost, new_cost);
+
+ p_action->setCost(new_cost);
+
+ return p_cpu->execute(size);
+}
+
+ActionPtr WorkstationVMHL13::sleep(double duration) {
+ return p_cpu->sleep(duration);
+}
+
+/**********
+ * Action *
+ **********/
+
+//FIME:: handle action cancel
+
--- /dev/null
+/* 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_ */
--- /dev/null
+/* 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
+
--- /dev/null
+/* Copyright (c) 2004-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "workstation_interface.hpp"
+
+#ifndef VM_WORKSTATION_INTERFACE_HPP_
+#define VM_WORKSTATION_INTERFACE_HPP_
+
+#define GUESTOS_NOISE 100 // This value corresponds to the cost of the global action associated to the VM
+ // It corresponds to the cost of a VM running no tasks.
+
+void surf_vm_workstation_model_init(void);
+
+/***********
+ * Classes *
+ ***********/
+
+class WorkstationVMModel;
+typedef WorkstationVMModel *WorkstationVMModelPtr;
+
+class WorkstationVM;
+typedef WorkstationVM *WorkstationVMPtr;
+
+class WorkstationVMLmm;
+typedef WorkstationVMLmm *WorkstationVMLmmPtr;
+
+/*************
+ * Callbacks *
+ *************/
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationVM creation *
+ * @details Callback functions have the following signature: `void(WorkstationVMPtr)`
+ */
+extern surf_callback(void, WorkstationVMPtr) workstationVMCreatedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationVM destruction *
+ * @details Callback functions have the following signature: `void(WorkstationVMPtr)`
+ */
+extern surf_callback(void, WorkstationVMPtr) workstationVMDestructedCallbacks;
+
+/** @ingroup SURF_callbacks
+ * @brief Callbacks handler which emit the callbacks after WorkstationVM State changed *
+ * @details Callback functions have the following signature: `void(WorkstationVMActionPtr)`
+ */
+extern surf_callback(void, WorkstationVMPtr) workstationVMStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+/** @ingroup SURF_vm_workstation_interface
+ * @brief SURF workstation VM model interface class
+ * @details A model is an object which handle the interactions between its Resources and its Actions
+ */
+class WorkstationVMModel : public WorkstationModel {
+public:
+ /**
+ * @brief WorkstationVMModel consrtuctor
+ */
+ WorkstationVMModel();
+
+ /**
+ * @brief WorkstationVMModel consrtuctor
+ */
+ ~WorkstationVMModel(){};
+
+ /**
+ * @brief Create a new WorkstationVM
+ *
+ * @param name The name of the new WorkstationVM
+ * @param ind_phys_workstation The workstation hosting the VM
+ *
+ */
+ virtual void createResource(const char *name, void *ind_phys_workstation)=0;
+
+ void adjustWeightOfDummyCpuActions() {};
+
+ typedef boost::intrusive::list<WorkstationVM,
+ boost::intrusive::constant_time_size<false> >
+ vm_list_t;
+ static vm_list_t ws_vms;
+};
+
+/************
+ * Resource *
+ ************/
+
+/** @ingroup SURF_vm_workstation_interface
+ * @brief SURF workstation VM interface class
+ * @details A workstation VM represent an virtual machine
+ */
+class WorkstationVM : public Workstation,
+ public boost::intrusive::list_base_hook<> {
+public:
+ /**
+ * @brief WorkstationVM consrtructor
+ *
+ * @param model WorkstationModel associated to this Workstation
+ * @param name The name of the Workstation
+ * @param props Dictionary of properties associated to this Workstation
+ * @param netElm The RoutingEdge associated to this Workstation
+ * @param cpu The Cpu associated to this Workstation
+ */
+ WorkstationVM(ModelPtr model, const char *name, xbt_dict_t props,
+ RoutingEdgePtr netElm, CpuPtr cpu);
+
+ /**
+ * @brief WdorkstationVM destructor
+ */
+ ~WorkstationVM();
+
+ void setState(e_surf_resource_state_t state);
+
+ /**
+ * @brief Suspend the VM
+ */
+ virtual void suspend()=0;
+
+ /**
+ * @brief Resume the VM
+ */
+ virtual void resume()=0;
+
+ /**
+ * @brief Save the VM (Not yet implemented)
+ */
+ virtual void save()=0;
+
+ /**
+ * @brief Restore the VM (Not yet implemented)
+ */
+ virtual void restore()=0;
+
+ /**
+ * @brief Migrate the VM to the destination host
+ *
+ * @param ind_vm_ws_dest The destination host
+ */
+ virtual void migrate(surf_resource_t ind_vm_ws_dest)=0;
+
+ /**
+ * @brief Get the physical machine hosting the VM
+ * @return The physical machine hosting the VM
+ */
+ virtual surf_resource_t getPm()=0;
+
+ virtual void setBound(double bound)=0;
+ virtual void setAffinity(CpuPtr cpu, unsigned long mask)=0;
+
+ /* The workstation object of the lower layer */
+ CpuActionPtr p_action;
+ WorkstationPtr p_subWs; // Pointer to the ''host'' OS
+ e_surf_vm_state_t p_currentState;
+};
+
+/**********
+ * Action *
+ **********/
+
+#endif /* VM_WORKSTATION_INTERFACE_HPP_ */
+++ /dev/null
-/* 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);
-}
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "workstation_clm03.hpp"
+#include "vm_workstation_interface.hpp"
+#include "cpu_cas01.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_workstation);
+
+/*************
+ * CallBacks *
+ *************/
+
+static void workstation_new(sg_platf_host_cbarg_t host){
+ reinterpret_cast<WorkstationCLM03ModelPtr>(surf_workstation_model)->createResource(host->id);
+}
+
+/*********
+ * Model *
+ *********/
+
+void surf_workstation_model_init_current_default(void)
+{
+ surf_workstation_model = new WorkstationCLM03Model();
+ xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", "yes");
+ surf_cpu_model_init_Cas01();
+ surf_network_model_init_LegrandVelho();
+ surf_workstation_model->p_cpuModel = surf_cpu_model_pm;
+
+ ModelPtr model = static_cast<ModelPtr>(surf_workstation_model);
+ xbt_dynar_push(model_list, &model);
+ xbt_dynar_push(model_list_invoke, &model);
+ sg_platf_host_add_cb(workstation_new);
+}
+
+void surf_workstation_model_init_compound()
+{
+
+ xbt_assert(surf_cpu_model_pm, "No CPU model defined yet!");
+ xbt_assert(surf_network_model, "No network model defined yet!");
+ surf_workstation_model = new WorkstationCLM03Model();
+
+ ModelPtr model = static_cast<ModelPtr>(surf_workstation_model);
+ xbt_dynar_push(model_list, &model);
+ xbt_dynar_push(model_list_invoke, &model);
+ sg_platf_host_add_cb(workstation_new);
+}
+
+WorkstationCLM03Model::WorkstationCLM03Model(const char *name)
+ : WorkstationModel(name)
+{}
+
+
+WorkstationCLM03Model::WorkstationCLM03Model()
+ : WorkstationModel("Workstation")
+{
+}
+
+WorkstationCLM03Model::~WorkstationCLM03Model()
+{}
+
+void WorkstationCLM03Model::parseInit(sg_platf_host_cbarg_t host){
+ createResource(host->id);
+}
+
+WorkstationPtr WorkstationCLM03Model::createResource(const char *name){
+
+ WorkstationPtr workstation = new WorkstationCLM03(surf_workstation_model, name, NULL,
+ (xbt_dynar_t)xbt_lib_get_or_null(storage_lib, name, ROUTING_STORAGE_HOST_LEVEL),
+ (RoutingEdgePtr)xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL),
+ static_cast<CpuPtr>(xbt_lib_get_or_null(host_lib, name, SURF_CPU_LEVEL)));
+ XBT_DEBUG("Create workstation %s with %ld mounted disks", name, xbt_dynar_length(workstation->p_storage));
+ xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast<ResourcePtr>(workstation));
+ return workstation;
+}
+
+double WorkstationCLM03Model::shareResources(double now){
+ adjustWeightOfDummyCpuActions();
+
+ double min_by_cpu = p_cpuModel->shareResources(now);
+ double min_by_net = (strcmp(surf_network_model->getName(), "network NS3")) ? surf_network_model->shareResources(now) : -1;
+ double min_by_sto = -1;
+ if (p_cpuModel == surf_cpu_model_pm)
+ min_by_sto = surf_storage_model->shareResources(now);
+
+ XBT_DEBUG("model %p, %s min_by_cpu %f, %s min_by_net %f, %s min_by_sto %f",
+ this, surf_cpu_model_pm->getName(), min_by_cpu,
+ surf_network_model->getName(), min_by_net,
+ surf_storage_model->getName(), min_by_sto);
+
+ double res = max(max(min_by_cpu, min_by_net), min_by_sto);
+ if (min_by_cpu >= 0.0 && min_by_cpu < res)
+ res = min_by_cpu;
+ if (min_by_net >= 0.0 && min_by_net < res)
+ res = min_by_net;
+ if (min_by_sto >= 0.0 && min_by_sto < res)
+ res = min_by_sto;
+ return res;
+}
+
+void WorkstationCLM03Model::updateActionsState(double /*now*/, double /*delta*/){
+ return;
+}
+
+ActionPtr WorkstationCLM03Model::executeParallelTask(int workstation_nb,
+ void **workstation_list,
+ double *computation_amount,
+ double *communication_amount,
+ double rate){
+#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0)
+ if ((workstation_nb == 1)
+ && (cost_or_zero(communication_amount, 0) == 0.0))
+ return ((WorkstationCLM03Ptr)workstation_list[0])->execute(computation_amount[0]);
+ else if ((workstation_nb == 1)
+ && (cost_or_zero(computation_amount, 0) == 0.0))
+ return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[0],communication_amount[0], rate);
+ else if ((workstation_nb == 2)
+ && (cost_or_zero(computation_amount, 0) == 0.0)
+ && (cost_or_zero(computation_amount, 1) == 0.0)) {
+ int i,nb = 0;
+ double value = 0.0;
+
+ for (i = 0; i < workstation_nb * workstation_nb; i++) {
+ if (cost_or_zero(communication_amount, i) > 0.0) {
+ nb++;
+ value = cost_or_zero(communication_amount, i);
+ }
+ }
+ if (nb == 1)
+ return communicate((WorkstationCLM03Ptr)workstation_list[0], (WorkstationCLM03Ptr)workstation_list[1],value, rate);
+ }
+#undef cost_or_zero
+
+ THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */
+ return NULL;
+}
+
+/* returns an array of network_link_CM02_t */
+xbt_dynar_t WorkstationCLM03Model::getRoute(WorkstationPtr src, WorkstationPtr dst)
+{
+ XBT_DEBUG("ws_get_route");
+ return surf_network_model->getRoute(src->p_netElm, dst->p_netElm);
+}
+
+ActionPtr WorkstationCLM03Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){
+ return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate);
+}
+
+
+
+/************
+ * Resource *
+ ************/
+WorkstationCLM03::WorkstationCLM03(WorkstationModelPtr model, const char* name, xbt_dict_t properties, xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu)
+ : Workstation(model, name, properties, storage, netElm, cpu) {}
+
+bool WorkstationCLM03::isUsed(){
+ THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */
+ return -1;
+}
+
+void WorkstationCLM03::updateState(tmgr_trace_event_t /*event_type*/, double /*value*/, double /*date*/){
+ THROW_IMPOSSIBLE; /* This model does not implement parallel tasks */
+}
+
+ActionPtr WorkstationCLM03::execute(double size) {
+ return p_cpu->execute(size);
+}
+
+ActionPtr WorkstationCLM03::sleep(double duration) {
+ return p_cpu->sleep(duration);
+}
+
+e_surf_resource_state_t WorkstationCLM03::getState() {
+ return p_cpu->getState();
+}
+
+/**********
+ * Action *
+ **********/
--- /dev/null
+/* 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_ */
--- /dev/null
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "workstation_interface.hpp"
+#include "vm_workstation_interface.hpp"
+#include "cpu_cas01.hpp"
+#include "simgrid/sg_config.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf,
+ "Logging specific to the SURF workstation module");
+
+WorkstationModelPtr surf_workstation_model = NULL;
+
+/*************
+ * Callbacks *
+ *************/
+
+surf_callback(void, WorkstationPtr) workstationCreatedCallbacks;
+surf_callback(void, WorkstationPtr) workstationDestructedCallbacks;
+surf_callback(void, WorkstationPtr) workstationStateChangedCallbacks;
+surf_callback(void, WorkstationActionPtr) workstationActionStateChangedCallbacks;
+
+/*********
+ * Model *
+ *********/
+WorkstationModel::WorkstationModel(const char *name)
+ : Model(name)
+{
+ p_cpuModel = surf_cpu_model_pm;
+}
+
+WorkstationModel::WorkstationModel()
+: Model("Workstation") {
+ p_cpuModel = surf_cpu_model_pm;
+}
+
+WorkstationModel::~WorkstationModel() {
+}
+
+/* Each VM has a dummy CPU action on the PM layer. This CPU action works as the
+ * constraint (capacity) of the VM in the PM layer. If the VM does not have any
+ * active task, the dummy CPU action must be deactivated, so that the VM does
+ * not get any CPU share in the PM layer. */
+void WorkstationModel::adjustWeightOfDummyCpuActions()
+{
+ /* iterate for all virtual machines */
+ for (WorkstationVMModel::vm_list_t::iterator iter =
+ WorkstationVMModel::ws_vms.begin();
+ iter != WorkstationVMModel::ws_vms.end(); ++iter) {
+
+ WorkstationVMPtr ws_vm = &*iter;
+ CpuCas01Ptr cpu_cas01 = static_cast<CpuCas01Ptr>(ws_vm->p_cpu);
+ xbt_assert(cpu_cas01, "cpu-less workstation");
+
+ int is_active = lmm_constraint_used(cpu_cas01->getModel()->getMaxminSystem(), cpu_cas01->getConstraint());
+ // int is_active_old = constraint_is_active(cpu_cas01);
+
+ // {
+ // xbt_assert(is_active == is_active_old, "%d %d", is_active, is_active_old);
+ // }
+
+ if (is_active) {
+ /* some tasks exist on this VM */
+ XBT_DEBUG("set the weight of the dummy CPU action on PM to 1");
+
+ /* FIXME: we shoud use lmm_update_variable_weight() ? */
+ /* FIXME: If we assgign 1.05 and 0.05, the system makes apparently wrong values. */
+ ws_vm->p_action->setPriority(1);
+
+ } else {
+ /* no task exits on this VM */
+ XBT_DEBUG("set the weight of the dummy CPU action on PM to 0");
+
+ ws_vm->p_action->setPriority(0);
+ }
+ }
+}
+
+/************
+ * Resource *
+ ************/
+Workstation::Workstation()
+{
+ surf_callback_emit(workstationCreatedCallbacks, this);
+}
+
+Workstation::Workstation(ModelPtr model, const char *name, xbt_dict_t props,
+ xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu)
+ : Resource(model, name, props)
+ , p_storage(storage), p_netElm(netElm), p_cpu(cpu)
+{
+ p_params.ramsize = 0;
+ surf_callback_emit(workstationCreatedCallbacks, this);
+}
+
+Workstation::Workstation(ModelPtr model, const char *name, xbt_dict_t props, lmm_constraint_t constraint,
+ xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu)
+ : Resource(model, name, props, constraint)
+ , p_storage(storage), p_netElm(netElm), p_cpu(cpu)
+{
+ p_params.ramsize = 0;
+ surf_callback_emit(workstationCreatedCallbacks, this);
+}
+
+Workstation::~Workstation(){
+ surf_callback_emit(workstationDestructedCallbacks, this);
+}
+
+void Workstation::setState(e_surf_resource_state_t state){
+ Resource::setState(state);
+ surf_callback_emit(workstationStateChangedCallbacks, this);
+}
+
+int Workstation::getCore(){
+ return p_cpu->getCore();
+}
+
+double Workstation::getSpeed(double load){
+ return p_cpu->getSpeed(load);
+}
+
+double Workstation::getAvailableSpeed(){
+ return p_cpu->getAvailableSpeed();
+}
+
+double Workstation::getCurrentPowerPeak()
+{
+ return p_cpu->getCurrentPowerPeak();
+}
+
+double Workstation::getPowerPeakAt(int pstate_index)
+{
+ return p_cpu->getPowerPeakAt(pstate_index);
+}
+
+int Workstation::getNbPstates()
+{
+ return p_cpu->getNbPstates();
+}
+
+void Workstation::setPowerPeakAt(int pstate_index)
+{
+ p_cpu->setPowerPeakAt(pstate_index);
+}
+
+xbt_dict_t Workstation::getProperties()
+{
+ return p_cpu->getProperties();
+}
+
+StoragePtr Workstation::findStorageOnMountList(const char* mount)
+{
+ StoragePtr st = NULL;
+ s_mount_t mnt;
+ unsigned int cursor;
+
+ XBT_DEBUG("Search for storage name '%s' on '%s'", mount, getName());
+ xbt_dynar_foreach(p_storage,cursor,mnt)
+ {
+ XBT_DEBUG("See '%s'",mnt.name);
+ if(!strcmp(mount,mnt.name)){
+ st = static_cast<StoragePtr>(mnt.storage);
+ break;
+ }
+ }
+ if(!st) xbt_die("Can't find mount '%s' for '%s'", mount, getName());
+ return st;
+}
+
+xbt_dict_t Workstation::getStorageList()
+{
+ s_mount_t mnt;
+ unsigned int i;
+ xbt_dict_t storage_list = xbt_dict_new_homogeneous(NULL);
+ char *storage_name = NULL;
+
+ xbt_dynar_foreach(p_storage,i,mnt){
+ storage_name = (char *)static_cast<StoragePtr>(mnt.storage)->getName();
+ xbt_dict_set(storage_list,mnt.name,storage_name,NULL);
+ }
+ return storage_list;
+}
+
+ActionPtr Workstation::open(const char* mount, const char* path) {
+ StoragePtr st = findStorageOnMountList(mount);
+ XBT_DEBUG("OPEN on disk '%s'", st->getName());
+ return st->open(mount, path);
+}
+
+ActionPtr Workstation::close(surf_file_t fd) {
+ StoragePtr st = findStorageOnMountList(fd->mount);
+ XBT_DEBUG("CLOSE on disk '%s'",st->getName());
+ return st->close(fd);
+}
+
+ActionPtr Workstation::read(surf_file_t fd, sg_size_t size) {
+ StoragePtr st = findStorageOnMountList(fd->mount);
+ XBT_DEBUG("READ on disk '%s'",st->getName());
+ return st->read(fd, size);
+}
+
+ActionPtr Workstation::write(surf_file_t fd, sg_size_t size) {
+ StoragePtr st = findStorageOnMountList(fd->mount);
+ XBT_DEBUG("WRITE on disk '%s'",st->getName());
+ return st->write(fd, size);
+}
+
+int Workstation::unlink(surf_file_t fd) {
+ if (!fd){
+ XBT_WARN("No such file descriptor. Impossible to unlink");
+ return 0;
+ } else {
+// XBT_INFO("%s %zu", fd->storage, fd->size);
+ StoragePtr st = findStorageOnMountList(fd->mount);
+ /* Check if the file is on this storage */
+ if (!xbt_dict_get_or_null(st->p_content, fd->name)){
+ XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name,
+ st->getName());
+ return 0;
+ } else {
+ XBT_DEBUG("UNLINK on disk '%s'",st->getName());
+ st->m_usedSize -= fd->size;
+
+ // Remove the file from storage
+ xbt_dict_remove(st->p_content, fd->name);
+
+ free(fd->name);
+ free(fd->mount);
+ xbt_free(fd);
+ return 1;
+ }
+ }
+}
+
+ActionPtr Workstation::ls(const char* mount, const char *path){
+ XBT_DEBUG("LS on mount '%s' and file '%s'", mount, path);
+ StoragePtr st = findStorageOnMountList(mount);
+ return st->ls(path);
+}
+
+sg_size_t Workstation::getSize(surf_file_t fd){
+ return fd->size;
+}
+
+xbt_dynar_t Workstation::getInfo( surf_file_t fd)
+{
+ StoragePtr st = findStorageOnMountList(fd->mount);
+ sg_size_t *psize = xbt_new(sg_size_t, 1);
+ *psize = fd->size;
+ xbt_dynar_t info = xbt_dynar_new(sizeof(void*), NULL);
+ xbt_dynar_push_as(info, sg_size_t *, psize);
+ xbt_dynar_push_as(info, void *, fd->mount);
+ xbt_dynar_push_as(info, void *, (void *)st->getName());
+ xbt_dynar_push_as(info, void *, st->p_typeId);
+ xbt_dynar_push_as(info, void *, st->p_contentType);
+
+ return info;
+}
+
+sg_size_t Workstation::fileTell(surf_file_t fd){
+ return fd->current_position;
+}
+
+int Workstation::fileSeek(surf_file_t fd, sg_size_t offset, int origin){
+
+ switch (origin) {
+ case SEEK_SET:
+ fd->current_position = 0;
+ return MSG_OK;
+ case SEEK_CUR:
+ if(offset > fd->size)
+ offset = fd->size;
+ fd->current_position = offset;
+ return MSG_OK;
+ case SEEK_END:
+ fd->current_position = fd->size;
+ return MSG_OK;
+ default:
+ return MSG_TASK_CANCELED;
+ }
+}
+
+sg_size_t Workstation::getFreeSize(const char* name)
+{
+ StoragePtr st = findStorageOnMountList(name);
+ return st->m_size - st->m_usedSize;
+}
+
+sg_size_t Workstation::getUsedSize(const char* name)
+{
+ StoragePtr st = findStorageOnMountList(name);
+ return st->m_usedSize;
+}
+
+xbt_dynar_t Workstation::getVms()
+{
+ xbt_dynar_t dyn = xbt_dynar_new(sizeof(smx_host_t), NULL);
+
+ /* iterate for all virtual machines */
+ for (WorkstationVMModel::vm_list_t::iterator iter =
+ WorkstationVMModel::ws_vms.begin();
+ iter != WorkstationVMModel::ws_vms.end(); ++iter) {
+
+ WorkstationVMPtr ws_vm = &*iter;
+ if (this == ws_vm-> p_subWs)
+ xbt_dynar_push(dyn, &ws_vm->p_subWs);
+ }
+
+ return dyn;
+}
+
+void Workstation::getParams(ws_params_t params)
+{
+ *params = p_params;
+}
+
+void Workstation::setParams(ws_params_t params)
+{
+ /* may check something here. */
+ p_params = *params;
+}
+
+/**********
+ * Action *
+ **********/
+
+void WorkstationAction::setState(e_surf_action_state_t state){
+ Action::setState(state);
+ surf_callback_emit(workstationActionStateChangedCallbacks, this);
+}
--- /dev/null
+/* 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_ */
+++ /dev/null
-/* 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);
-}
--- /dev/null
+/* Copyright (c) 2007-2010, 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "workstation_ptask_L07.hpp"
+#include "cpu_interface.hpp"
+#include "surf_routing.hpp"
+
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_workstation);
+
+static int ptask_host_count = 0;
+static xbt_dict_t ptask_parallel_task_link_set = NULL;
+lmm_system_t ptask_maxmin_system = NULL;
+
+WorkstationL07Model::WorkstationL07Model() : WorkstationModel("Workstation ptask_L07") {
+ if (!ptask_maxmin_system)
+ ptask_maxmin_system = lmm_system_new(1);
+ surf_workstation_model = NULL;
+ surf_network_model = new NetworkL07Model();
+ surf_cpu_model_pm = new CpuL07Model();
+ routing_model_create(static_cast<ResourcePtr>(surf_network_model->createResource("__loopback__",
+ 498000000, NULL,
+ 0.000015, NULL,
+ SURF_RESOURCE_ON, NULL,
+ SURF_LINK_FATPIPE, NULL)));
+ p_cpuModel = surf_cpu_model_pm;
+}
+
+WorkstationL07Model::~WorkstationL07Model() {
+ xbt_dict_free(&ptask_parallel_task_link_set);
+
+ delete surf_cpu_model_pm;
+ delete surf_network_model;
+ ptask_host_count = 0;
+
+ if (ptask_maxmin_system) {
+ lmm_system_free(ptask_maxmin_system);
+ ptask_maxmin_system = NULL;
+ }
+}
+
+double WorkstationL07Model::shareResources(double /*now*/)
+{
+ WorkstationL07ActionPtr action;
+
+ ActionListPtr running_actions = getRunningActionSet();
+ double min = this->shareResourcesMaxMin(running_actions,
+ ptask_maxmin_system,
+ bottleneck_solve);
+
+ for(ActionList::iterator it(running_actions->begin()), itend(running_actions->end())
+ ; it != itend ; ++it) {
+ action = static_cast<WorkstationL07ActionPtr>(&*it);
+ if (action->m_latency > 0) {
+ if (min < 0) {
+ min = action->m_latency;
+ XBT_DEBUG("Updating min (value) with %p (start %f): %f", action,
+ action->getStartTime(), min);
+ } else if (action->m_latency < min) {
+ min = action->m_latency;
+ XBT_DEBUG("Updating min (latency) with %p (start %f): %f", action,
+ action->getStartTime(), min);
+ }
+ }
+ }
+
+ XBT_DEBUG("min value : %f", min);
+
+ return min;
+}
+
+void WorkstationL07Model::updateActionsState(double /*now*/, double delta)
+{
+ double deltap = 0.0;
+ WorkstationL07ActionPtr action;
+
+ ActionListPtr actionSet = getRunningActionSet();
+
+ for(ActionList::iterator it(actionSet->begin()), itNext = it, itend(actionSet->end())
+ ; it != itend ; it=itNext) {
+ ++itNext;
+ action = static_cast<WorkstationL07ActionPtr>(&*it);
+ deltap = delta;
+ if (action->m_latency > 0) {
+ if (action->m_latency > deltap) {
+ double_update(&(action->m_latency), deltap);
+ deltap = 0.0;
+ } else {
+ double_update(&(deltap), action->m_latency);
+ action->m_latency = 0.0;
+ }
+ if ((action->m_latency == 0.0) && (action->isSuspended() == 0)) {
+ action->updateBound();
+ lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 1.0);
+ }
+ }
+ XBT_DEBUG("Action (%p) : remains (%g) updated by %g.",
+ action, action->getRemains(), lmm_variable_getvalue(action->getVariable()) * delta);
+ action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta);
+
+ if (action->getMaxDuration() != NO_MAX_DURATION)
+ action->updateMaxDuration(delta);
+
+ XBT_DEBUG("Action (%p) : remains (%g).",
+ action, action->getRemains());
+ if ((action->getRemains() <= 0) &&
+ (lmm_get_variable_weight(action->getVariable()) > 0)) {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ } else if ((action->getMaxDuration() != NO_MAX_DURATION) &&
+ (action->getMaxDuration() <= 0)) {
+ action->finish();
+ action->setState(SURF_ACTION_DONE);
+ } else {
+ /* Need to check that none of the model has failed */
+ lmm_constraint_t cnst = NULL;
+ int i = 0;
+ void *constraint_id = NULL;
+
+ while ((cnst = lmm_get_cnst_from_var(ptask_maxmin_system, action->getVariable(),
+ i++))) {
+ constraint_id = lmm_constraint_id(cnst);
+
+ if (static_cast<WorkstationPtr>(constraint_id)->getState() == SURF_RESOURCE_OFF) {
+ XBT_DEBUG("Action (%p) Failed!!", action);
+ action->finish();
+ action->setState(SURF_ACTION_FAILED);
+ break;
+ }
+ }
+ }
+ }
+ return;
+}
+
+ActionPtr WorkstationL07Model::executeParallelTask(int workstation_nb,
+ void **workstation_list,
+ double
+ *computation_amount, double
+ *communication_amount,
+ double rate)
+{
+ WorkstationL07ActionPtr action;
+ int i, j;
+ unsigned int cpt;
+ int nb_link = 0;
+ int nb_host = 0;
+ double latency = 0.0;
+
+ if (ptask_parallel_task_link_set == NULL)
+ ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL);
+
+ xbt_dict_reset(ptask_parallel_task_link_set);
+
+ /* Compute the number of affected resources... */
+ for (i = 0; i < workstation_nb; i++) {
+ for (j = 0; j < workstation_nb; j++) {
+ xbt_dynar_t route=NULL;
+
+ if (communication_amount[i * workstation_nb + j] > 0) {
+ double lat=0.0;
+ unsigned int cpt;
+ void *_link;
+ LinkL07Ptr link;
+
+ routing_platf->getRouteAndLatency(static_cast<WorkstationL07Ptr>(workstation_list[i])->p_netElm,
+ static_cast<WorkstationL07Ptr>(workstation_list[j])->p_netElm,
+ &route,
+ &lat);
+ latency = MAX(latency, lat);
+
+ xbt_dynar_foreach(route, cpt, _link) {
+ link = static_cast<LinkL07Ptr>(_link);
+ xbt_dict_set(ptask_parallel_task_link_set, link->getName(), link, NULL);
+ }
+ }
+ }
+ }
+
+ nb_link = xbt_dict_length(ptask_parallel_task_link_set);
+ xbt_dict_reset(ptask_parallel_task_link_set);
+
+ for (i = 0; i < workstation_nb; i++)
+ if (computation_amount[i] > 0)
+ nb_host++;
+
+ action = new WorkstationL07Action(this, 1, 0);
+ XBT_DEBUG("Creating a parallel task (%p) with %d cpus and %d links.",
+ action, workstation_nb, nb_link);
+ action->m_suspended = 0; /* Should be useless because of the
+ calloc but it seems to help valgrind... */
+ action->m_workstationNb = workstation_nb;
+ action->p_workstationList = (WorkstationPtr *) workstation_list;
+ action->p_computationAmount = computation_amount;
+ action->p_communicationAmount = communication_amount;
+ action->m_latency = latency;
+ action->m_rate = rate;
+
+ action->p_variable = lmm_variable_new(ptask_maxmin_system, action, 1.0,
+ (action->m_rate > 0) ? action->m_rate : -1.0,
+ workstation_nb + nb_link);
+
+ if (action->m_latency > 0)
+ lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 0.0);
+
+ for (i = 0; i < workstation_nb; i++)
+ lmm_expand(ptask_maxmin_system,
+ static_cast<CpuPtr>(static_cast<WorkstationL07Ptr>(workstation_list[i])->p_cpu)->getConstraint(),
+ action->getVariable(), computation_amount[i]);
+
+ for (i = 0; i < workstation_nb; i++) {
+ for (j = 0; j < workstation_nb; j++) {
+ void *_link;
+ LinkL07Ptr link;
+
+ xbt_dynar_t route=NULL;
+ if (communication_amount[i * workstation_nb + j] == 0.0)
+ continue;
+
+ routing_platf->getRouteAndLatency(static_cast<WorkstationL07Ptr>(workstation_list[i])->p_netElm,
+ static_cast<WorkstationL07Ptr>(workstation_list[j])->p_netElm,
+ &route, NULL);
+
+ xbt_dynar_foreach(route, cpt, _link) {
+ link = static_cast<LinkL07Ptr>(_link);
+ lmm_expand_add(ptask_maxmin_system, link->getConstraint(),
+ action->getVariable(),
+ communication_amount[i * workstation_nb + j]);
+ }
+ }
+ }
+
+ if (nb_link + nb_host == 0) {
+ action->setCost(1.0);
+ action->setRemains(0.0);
+ }
+
+ return static_cast<ActionPtr>(action);
+}
+
+ResourcePtr WorkstationL07Model::createResource(const char *name, double /*power_scale*/,
+ double /*power_initial*/,
+ tmgr_trace_t /*power_trace*/,
+ e_surf_resource_state_t /*state_initial*/,
+ tmgr_trace_t /*state_trace*/,
+ xbt_dict_t /*cpu_properties*/)
+{
+ WorkstationL07Ptr wk = NULL;
+ xbt_assert(!surf_workstation_resource_priv(surf_workstation_resource_by_name(name)),
+ "Host '%s' declared several times in the platform file.",
+ name);
+
+ wk = new WorkstationL07(this, name, NULL,
+ static_cast<RoutingEdgePtr>(xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL)),
+ static_cast<CpuPtr>(xbt_lib_get_or_null(host_lib, name, SURF_CPU_LEVEL)));
+
+ xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast<ResourcePtr>(wk));
+
+ return wk;//FIXME:xbt_lib_get_elm_or_null(host_lib, name);
+}
+
+ActionPtr WorkstationL07Model::communicate(WorkstationPtr src, WorkstationPtr dst,
+ double size, double rate)
+{
+ void **workstation_list = xbt_new0(void *, 2);
+ double *computation_amount = xbt_new0(double, 2);
+ double *communication_amount = xbt_new0(double, 4);
+ ActionPtr res = NULL;
+
+ workstation_list[0] = static_cast<ResourcePtr>(src);
+ workstation_list[1] = static_cast<ResourcePtr>(dst);
+ communication_amount[1] = size;
+
+ res = executeParallelTask(2, workstation_list,
+ computation_amount,
+ communication_amount, rate);
+
+ return res;
+}
+
+xbt_dynar_t WorkstationL07Model::getRoute(WorkstationPtr src, WorkstationPtr dst)
+{
+ xbt_dynar_t route=NULL;
+ routing_platf->getRouteAndLatency(src->p_netElm, dst->p_netElm, &route, NULL);
+ return route;
+}
+
+ResourcePtr CpuL07Model::createResource(const char *name, double power_scale,
+ double power_initial,
+ tmgr_trace_t power_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ xbt_dict_t cpu_properties)
+{
+ xbt_assert(!surf_workstation_resource_priv(surf_workstation_resource_by_name(name)),
+ "Host '%s' declared several times in the platform file.",
+ name);
+
+ CpuL07Ptr cpu = new CpuL07(this, name, cpu_properties,
+ power_scale, power_initial, power_trace,state_initial, state_trace);
+
+ xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast<ResourcePtr>(cpu));
+
+ return cpu;//FIXME:xbt_lib_get_elm_or_null(host_lib, name);
+}
+
+NetworkLinkPtr NetworkL07Model::createResource(const char *name,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t
+ state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy,
+ xbt_dict_t properties)
+{
+ xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
+ "Link '%s' declared several times in the platform file.",
+ name);
+
+ LinkL07Ptr nw_link = new LinkL07(this, name, properties,
+ bw_initial, bw_trace,
+ lat_initial, lat_trace,
+ state_initial, state_trace,
+ policy);
+
+ xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, static_cast<ResourcePtr>(nw_link));
+ return nw_link;
+}
+
+void WorkstationL07Model::addTraces()
+{
+ xbt_dict_cursor_t cursor = NULL;
+ char *trace_name, *elm;
+
+ if (!trace_connect_list_host_avail)
+ return;
+
+ /* Connect traces relative to cpu */
+ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ CpuL07Ptr host = static_cast<CpuL07Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+ xbt_assert(host, "Host %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ host->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host));
+ }
+
+ xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ CpuL07Ptr host = static_cast<CpuL07Ptr>(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)));
+
+ xbt_assert(host, "Host %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ host->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(host));
+ }
+
+ /* Connect traces relative to network */
+ xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ LinkL07Ptr link = static_cast<LinkL07Ptr>(xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+ xbt_assert(link, "Link %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+ }
+
+ xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ LinkL07Ptr link = static_cast<LinkL07Ptr>(xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+ xbt_assert(link, "Link %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ link->p_bwEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+ }
+
+ xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
+ tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name);
+ LinkL07Ptr link = static_cast<LinkL07Ptr>(xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL));
+
+ xbt_assert(link, "Link %s undefined", elm);
+ xbt_assert(trace, "Trace %s undefined", trace_name);
+
+ link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast<ResourcePtr>(link));
+ }
+}
+
+/************
+ * Resource *
+ ************/
+
+WorkstationL07::WorkstationL07(WorkstationModelPtr model, const char* name, xbt_dict_t props, RoutingEdgePtr netElm, CpuPtr cpu)
+ : Workstation(model, name, props, NULL, netElm, cpu)
+{
+}
+
+double WorkstationL07::getPowerPeakAt(int /*pstate_index*/)
+{
+ XBT_DEBUG("[ws_get_power_peak_at] Not implemented for workstation_ptask_L07");
+ return 0.0;
+}
+
+int WorkstationL07::getNbPstates()
+{
+ XBT_DEBUG("[ws_get_nb_pstates] Not implemented for workstation_ptask_L07");
+ return 0.0;
+}
+
+void WorkstationL07::setPowerPeakAt(int /*pstate_index*/)
+{
+ XBT_DEBUG("[ws_set_power_peak_at] Not implemented for workstation_ptask_L07");
+}
+
+double WorkstationL07::getConsumedEnergy()
+{
+ XBT_DEBUG("[ws_get_consumed_energy] Not implemented for workstation_ptask_L07");
+ return 0.0;
+}
+
+CpuL07::CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t props,
+ double power_scale,
+ double power_initial, tmgr_trace_t power_trace,
+ e_surf_resource_state_t state_initial, tmgr_trace_t state_trace)
+ : Cpu(model, name, props, lmm_constraint_new(ptask_maxmin_system, this, power_initial * power_scale),
+ 1, 0, 0)
+{
+ p_power.scale = power_scale;
+ xbt_assert(p_power.scale > 0, "Power has to be >0");
+
+ m_powerCurrent = power_initial;
+ if (power_trace)
+ p_power.event = tmgr_history_add_trace(history, power_trace, 0.0, 0,
+ static_cast<ResourcePtr>(this));
+ else
+ p_power.event = NULL;
+
+ setState(state_initial);
+ if (state_trace)
+ p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+}
+
+LinkL07::LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props,
+ double bw_initial,
+ tmgr_trace_t bw_trace,
+ double lat_initial,
+ tmgr_trace_t lat_trace,
+ e_surf_resource_state_t state_initial,
+ tmgr_trace_t state_trace,
+ e_surf_link_sharing_policy_t policy)
+ : NetworkLink(model, name, props, lmm_constraint_new(ptask_maxmin_system, this, bw_initial), history, state_trace)
+{
+ m_bwCurrent = bw_initial;
+ if (bw_trace)
+ p_bwEvent = tmgr_history_add_trace(history, bw_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+ setState(state_initial);
+ m_latCurrent = lat_initial;
+
+ if (lat_trace)
+ p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, static_cast<ResourcePtr>(this));
+
+ if (policy == SURF_LINK_FATPIPE)
+ lmm_constraint_shared(getConstraint());
+}
+
+bool CpuL07::isUsed(){
+ return lmm_constraint_used(ptask_maxmin_system, getConstraint());
+}
+
+bool LinkL07::isUsed(){
+ return lmm_constraint_used(ptask_maxmin_system, getConstraint());
+}
+
+void CpuL07::updateState(tmgr_trace_event_t event_type, double value, double /*date*/){
+ XBT_DEBUG("Updating cpu %s (%p) with value %g", getName(), this, value);
+ if (event_type == p_power.event) {
+ m_powerCurrent = value;
+ lmm_update_constraint_bound(ptask_maxmin_system, getConstraint(), m_powerCurrent * p_power.scale);
+ if (tmgr_trace_event_free(event_type))
+ p_power.event = NULL;
+ } else if (event_type == p_stateEvent) {
+ if (value > 0)
+ setState(SURF_RESOURCE_ON);
+ else
+ setState(SURF_RESOURCE_OFF);
+ if (tmgr_trace_event_free(event_type))
+ p_stateEvent = NULL;
+ } else {
+ XBT_CRITICAL("Unknown event ! \n");
+ xbt_abort();
+ }
+ return;
+}
+
+void LinkL07::updateState(tmgr_trace_event_t event_type, double value, double date){
+ XBT_DEBUG("Updating link %s (%p) with value=%f for date=%g", getName(), this, value, date);
+ if (event_type == p_bwEvent) {
+ m_bwCurrent = value;
+ lmm_update_constraint_bound(ptask_maxmin_system, getConstraint(), m_bwCurrent);
+ if (tmgr_trace_event_free(event_type))
+ p_bwEvent = NULL;
+ } else if (event_type == p_latEvent) {
+ lmm_variable_t var = NULL;
+ WorkstationL07ActionPtr action;
+ lmm_element_t elem = NULL;
+
+ m_latCurrent = value;
+ while ((var = lmm_get_var_from_cnst(ptask_maxmin_system, getConstraint(), &elem))) {
+ action = (WorkstationL07ActionPtr) lmm_variable_id(var);
+ action->updateBound();
+ }
+ if (tmgr_trace_event_free(event_type))
+ p_latEvent = NULL;
+ } else if (event_type == p_stateEvent) {
+ if (value > 0)
+ setState(SURF_RESOURCE_ON);
+ else
+ setState(SURF_RESOURCE_OFF);
+ if (tmgr_trace_event_free(event_type))
+ p_stateEvent = NULL;
+ } else {
+ XBT_CRITICAL("Unknown event ! \n");
+ xbt_abort();
+ }
+ return;
+}
+
+e_surf_resource_state_t WorkstationL07::getState()
+{
+ return p_cpu->getState();
+}
+
+double CpuL07::getSpeed(double load)
+{
+ return load * p_power.scale;
+}
+
+double CpuL07::getAvailableSpeed()
+{
+ return m_powerCurrent;
+}
+
+ActionPtr WorkstationL07::execute(double size)
+{
+ void **workstation_list = xbt_new0(void *, 1);
+ double *computation_amount = xbt_new0(double, 1);
+ double *communication_amount = xbt_new0(double, 1);
+
+ workstation_list[0] = static_cast<ResourcePtr>(this);
+ communication_amount[0] = 0.0;
+ computation_amount[0] = size;
+
+ return static_cast<WorkstationL07ModelPtr>(getModel())->executeParallelTask(1, workstation_list,
+ computation_amount,
+ communication_amount, -1);
+}
+
+ActionPtr WorkstationL07::sleep(double duration)
+{
+ WorkstationL07ActionPtr action = NULL;
+
+ XBT_IN("(%s,%g)", getName(), duration);
+
+ action = static_cast<WorkstationL07ActionPtr>(execute(1.0));
+ action->m_maxDuration = duration;
+ action->m_suspended = 2;
+ lmm_update_variable_weight(ptask_maxmin_system, action->getVariable(), 0.0);
+
+ XBT_OUT();
+ return action;
+}
+
+double LinkL07::getBandwidth()
+{
+ return m_bwCurrent;
+}
+
+double LinkL07::getLatency()
+{
+ return m_latCurrent;
+}
+
+bool LinkL07::isShared()
+{
+ return lmm_constraint_is_shared(getConstraint());
+}
+
+/**********
+ * Action *
+ **********/
+
+WorkstationL07Action::~WorkstationL07Action(){
+ free(p_workstationList);
+ free(p_communicationAmount);
+ free(p_computationAmount);
+}
+
+void WorkstationL07Action::updateBound()
+{
+ double lat_current = 0.0;
+ double lat_bound = -1.0;
+ int i, j;
+
+ for (i = 0; i < m_workstationNb; i++) {
+ for (j = 0; j < m_workstationNb; j++) {
+ xbt_dynar_t route=NULL;
+
+ if (p_communicationAmount[i * m_workstationNb + j] > 0) {
+ double lat = 0.0;
+ routing_platf->getRouteAndLatency(static_cast<WorkstationL07Ptr>(((void**)p_workstationList)[i])->p_netElm,
+ static_cast<WorkstationL07Ptr>(((void**)p_workstationList)[j])->p_netElm,
+ &route, &lat);
+
+ lat_current = MAX(lat_current, lat * p_communicationAmount[i * m_workstationNb + j]);
+ }
+ }
+ }
+ lat_bound = sg_tcp_gamma / (2.0 * lat_current);
+ XBT_DEBUG("action (%p) : lat_bound = %g", this, lat_bound);
+ if ((m_latency == 0.0) && (m_suspended == 0)) {
+ if (m_rate < 0)
+ lmm_update_variable_bound(ptask_maxmin_system, getVariable(), lat_bound);
+ else
+ lmm_update_variable_bound(ptask_maxmin_system, getVariable(), min(m_rate, lat_bound));
+ }
+}
+
+int WorkstationL07Action::unref()
+{
+ m_refcount--;
+ if (!m_refcount) {
+ if (actionHook::is_linked())
+ p_stateSet->erase(p_stateSet->iterator_to(*this));
+ if (getVariable())
+ lmm_variable_free(ptask_maxmin_system, getVariable());
+ delete this;
+ return 1;
+ }
+ return 0;
+}
+
+void WorkstationL07Action::cancel()
+{
+ setState(SURF_ACTION_FAILED);
+ return;
+}
+
+void WorkstationL07Action::suspend()
+{
+ XBT_IN("(%p))", this);
+ if (m_suspended != 2) {
+ m_suspended = 1;
+ lmm_update_variable_weight(ptask_maxmin_system, getVariable(), 0.0);
+ }
+ XBT_OUT();
+}
+
+void WorkstationL07Action::resume()
+{
+ XBT_IN("(%p)", this);
+ if (m_suspended != 2) {
+ lmm_update_variable_weight(ptask_maxmin_system, getVariable(), 1.0);
+ m_suspended = 0;
+ }
+ XBT_OUT();
+}
+
+bool WorkstationL07Action::isSuspended()
+{
+ return m_suspended == 1;
+}
+
+void WorkstationL07Action::setMaxDuration(double duration)
+{ /* FIXME: should inherit */
+ XBT_IN("(%p,%g)", this, duration);
+ m_maxDuration = duration;
+ XBT_OUT();
+}
+
+void WorkstationL07Action::setPriority(double priority)
+{ /* FIXME: should inherit */
+ XBT_IN("(%p,%g)", this, priority);
+ m_priority = priority;
+ XBT_OUT();
+}
+
+double WorkstationL07Action::getRemains()
+{
+ XBT_IN("(%p)", this);
+ XBT_OUT();
+ return m_remains;
+}
+
+/*FIXME:remove static void ptask_finalize(void)
+{
+ xbt_dict_free(&ptask_parallel_task_link_set);
+
+ delete surf_workstation_model;
+ surf_workstation_model = NULL;
+ delete surf_network_model;
+ surf_network_model = NULL;
+
+ ptask_host_count = 0;
+
+ if (ptask_maxmin_system) {
+ lmm_system_free(ptask_maxmin_system);
+ ptask_maxmin_system = NULL;
+ }
+ }*/
+
+/**************************************/
+/******* Resource Private **********/
+/**************************************/
+
+/**************************************/
+/*** Resource Creation & Destruction **/
+/**************************************/
+
+static void ptask_parse_workstation_init(sg_platf_host_cbarg_t host)
+{
+ double power_peak = xbt_dynar_get_as(host->power_peak, host->pstate, double);
+ //cpu->power_peak = power_peak;
+ xbt_dynar_free(&(host->power_peak)); /* kill memory leak */
+ static_cast<WorkstationL07ModelPtr>(surf_workstation_model)->createResource(
+ host->id,
+ power_peak,
+ host->power_scale,
+ host->power_trace,
+ host->initial_state,
+ host->state_trace,
+ host->properties);
+}
+
+static void ptask_parse_cpu_init(sg_platf_host_cbarg_t host)
+{
+ double power_peak = xbt_dynar_get_as(host->power_peak, host->pstate, double);
+ static_cast<CpuL07ModelPtr>(surf_cpu_model_pm)->createResource(
+ host->id,
+ power_peak,
+ host->power_scale,
+ host->power_trace,
+ host->initial_state,
+ host->state_trace,
+ host->properties);
+}
+
+
+
+static void ptask_parse_link_init(sg_platf_link_cbarg_t link)
+{
+ if (link->policy == SURF_LINK_FULLDUPLEX) {
+ char *link_id;
+ link_id = bprintf("%s_UP", link->id);
+ static_cast<NetworkL07ModelPtr>(surf_network_model)->createResource(link_id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace,
+ link->policy,
+ link->properties);
+ xbt_free(link_id);
+ link_id = bprintf("%s_DOWN", link->id);
+ static_cast<NetworkL07ModelPtr>(surf_network_model)->createResource(link_id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace,
+ link->policy,
+ NULL); /* FIXME: We need to deep copy the
+ * properties or we won't be able to free
+ * it */
+ xbt_free(link_id);
+ } else {
+ static_cast<NetworkL07ModelPtr>(surf_network_model)->createResource(link->id,
+ link->bandwidth,
+ link->bandwidth_trace,
+ link->latency,
+ link->latency_trace,
+ link->state,
+ link->state_trace,
+ link->policy,
+ link->properties);
+ }
+
+ current_property_set = NULL;
+}
+
+static void ptask_add_traces(){
+ static_cast<WorkstationL07ModelPtr>(surf_workstation_model)->addTraces();
+}
+
+static void ptask_define_callbacks()
+{
+ sg_platf_host_add_cb(ptask_parse_cpu_init);
+ sg_platf_host_add_cb(ptask_parse_workstation_init);
+ sg_platf_link_add_cb(ptask_parse_link_init);
+ sg_platf_postparse_add_cb(ptask_add_traces);
+}
+
+/**************************************/
+/*************** Generic **************/
+/**************************************/
+void surf_workstation_model_init_ptask_L07(void)
+{
+ XBT_INFO("surf_workstation_model_init_ptask_L07");
+ xbt_assert(!surf_cpu_model_pm, "CPU model type already defined");
+ xbt_assert(!surf_network_model, "network model type already defined");
+ ptask_define_callbacks();
+ surf_workstation_model = new WorkstationL07Model();
+ ModelPtr model = static_cast<ModelPtr>(surf_workstation_model);
+ xbt_dynar_push(model_list, &model);
+ xbt_dynar_push(model_list_invoke, &model);
+}
--- /dev/null
+/* 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_ */
/* 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
+/* 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
{
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
/* 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
#define YY_RESTORE_YY_MORE_OFFSET
char *xbt_automaton_parser_text;
#line 1 "parserPromela.lex"
-#line 4 "parserPromela.lex"
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+#line 10 "parserPromela.lex"
#include <stdio.h>
extern YYSTYPE yylval;
-#line 533 "automaton_lexer.yy.c"
+#line 537 "automaton_lexer.yy.c"
#define INITIAL 0
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) )
{
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); }
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();
#define YYTABLES_NAME "yytables"
-#line 71 "parserPromela.lex"
+#line 77 "parserPromela.lex"
/* methods for implementation of automaton from promela description */
-/* Copyright (c) 2011-2013. The SimGrid Team.
+/* Copyright (c) 2011-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "xbt/automaton.h"
+#include <errno.h>
+#include <string.h> /* strerror */
static xbt_automaton_t parsed_automaton;
char* state_id_src;
#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();
}
+/* 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
%{
-/* A Bison parser, made by GNU Bison 2.7.12-4996. */
+/* A Bison parser, made by GNU Bison 3.0.2. */
/* Bison implementation for Yacc-like parsers in C
-
- Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-
+
+ Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
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. */
#define YYBISON 1
/* Bison version. */
-#define YYBISON_VERSION "2.7.12-4996"
+#define YYBISON_VERSION "3.0.2"
/* Skeleton name. */
#define YYSKELETON_NAME "yacc.c"
#define yyparse xbt_automaton_parser_parse
#define yylex xbt_automaton_parser_lex
#define yyerror xbt_automaton_parser_error
-#define yylval xbt_automaton_parser_lval
-#define yychar xbt_automaton_parser_char
#define yydebug xbt_automaton_parser_debug
#define yynerrs xbt_automaton_parser_nerrs
+#define yylval xbt_automaton_parser_lval
+#define yychar xbt_automaton_parser_char
+
/* Copy the first part of user declarations. */
-/* Line 371 of yacc.c */
-#line 1 "parserPromela.yacc"
+#line 7 "parserPromela.yacc" /* yacc.c:339 */
#include "automaton_lexer.yy.c"
void yyerror(const char *s);
-/* Line 371 of yacc.c */
-#line 84 "parserPromela.tab.cacc"
+#line 83 "parserPromela.tab.cacc" /* yacc.c:339 */
-# ifndef YY_NULL
+# ifndef YY_NULLPTR
# if defined __cplusplus && 201103L <= __cplusplus
-# define YY_NULL nullptr
+# define YY_NULLPTR nullptr
# else
-# define YY_NULL 0
+# define YY_NULLPTR 0
# endif
# endif
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
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
#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
# define YYSIZE_T __SIZE_TYPE__
# elif defined size_t
# define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
+# elif ! defined YYSIZE_T
# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
# define YYSIZE_T size_t
# else
# 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
# 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. */
# define alloca _alloca
# else
# define YYSTACK_ALLOC alloca
-# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
- || defined __cplusplus || defined _MSC_VER)
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
/* Use EXIT_SUCCESS as a witness for stdlib.h. */
# ifndef EXIT_SUCCESS
# 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
# endif
# if (defined __cplusplus && ! defined EXIT_SUCCESS \
&& ! ((defined YYMALLOC || defined malloc) \
- && (defined YYFREE || defined free)))
+ && (defined YYFREE || defined free)))
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
# ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
# 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
#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
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
for (yyi = 0; yyi < (Count); yyi++) \
(Dst)[yyi] = (Src)[yyi]; \
} \
- while (YYID (0))
+ while (0)
# endif
# endif
#endif /* !YYCOPY_NEEDED */
#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,
};
#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
"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,
};
# 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,
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,
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,
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,
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)
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
# 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);
# ifdef YYPRINT
if (yytype < YYNTOKENS)
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
- YYUSE (yyoutput);
# endif
YYUSE (yytype);
}
| 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, ")");
| 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++)
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. */
/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
+#ifndef YYINITDEPTH
# define YYINITDEPTH 200
#endif
# 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++)
# 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;
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: ;
}
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
int yycount = 0;
/* There are many possibilities here to consider:
- - Assume YYFAIL is not used. It's too flawed to consider. See
- <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
- for details. YYERROR is fine as it does not invoke this
- function.
- If this state is a consistent state with a default action, then
the only way this function was invoked is if the default action
is an error action. In that case, don't check for expected
}
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;
| 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
}
/* 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;
| 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. */
#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
# 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 */
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));
if (yychar == YYEMPTY)
{
YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
+ yychar = yylex ();
}
if (yychar <= YYEOF)
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
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
*++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. */
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. */
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
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;
| 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);
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
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 */
-/* A Bison parser, made by GNU Bison 2.7.12-4996. */
+/* A Bison parser, made by GNU Bison 3.0.2. */
/* Bison interface for Yacc-like parsers in C
-
- Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-
+
+ Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED
-/* Enabling traces. */
+/* Debug traces. */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
extern int xbt_automaton_parser_debug;
#endif
-/* Tokens. */
+/* Token type. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
- /* Put the tokens into the symbol table, so that GDB and other debuggers
- know about them. */
- enum yytokentype {
- NEVER = 258,
- IF = 259,
- FI = 260,
- IMPLIES = 261,
- GOTO = 262,
- AND = 263,
- OR = 264,
- NOT = 265,
- LEFT_PAR = 266,
- RIGHT_PAR = 267,
- CASE = 268,
- COLON = 269,
- SEMI_COLON = 270,
- CASE_TRUE = 271,
- LEFT_BRACE = 272,
- RIGHT_BRACE = 273,
- LITT_ENT = 274,
- LITT_CHAINE = 275,
- LITT_REEL = 276,
- ID = 277
- };
+ enum yytokentype
+ {
+ NEVER = 258,
+ IF = 259,
+ FI = 260,
+ IMPLIES = 261,
+ GOTO = 262,
+ AND = 263,
+ OR = 264,
+ NOT = 265,
+ LEFT_PAR = 266,
+ RIGHT_PAR = 267,
+ CASE = 268,
+ COLON = 269,
+ SEMI_COLON = 270,
+ CASE_TRUE = 271,
+ LEFT_BRACE = 272,
+ RIGHT_BRACE = 273,
+ LITT_ENT = 274,
+ LITT_CHAINE = 275,
+ LITT_REEL = 276,
+ ID = 277
+ };
#endif
-
+/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
+typedef union YYSTYPE YYSTYPE;
+union YYSTYPE
{
-/* Line 2053 of yacc.c */
-#line 10 "parserPromela.yacc"
+#line 16 "parserPromela.yacc" /* yacc.c:1909 */
double real;
int integer;
char* string;
xbt_automaton_exp_label_t label;
-
-/* Line 2053 of yacc.c */
-#line 87 "parserPromela.tab.hacc"
-} YYSTYPE;
+#line 84 "parserPromela.tab.hacc" /* yacc.c:1909 */
+};
# define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif
+
extern YYSTYPE xbt_automaton_parser_lval;
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int xbt_automaton_parser_parse (void *YYPARSE_PARAM);
-#else
-int xbt_automaton_parser_parse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
int xbt_automaton_parser_parse (void);
-#else
-int xbt_automaton_parser_parse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED */
+/* 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"
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
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.
}
/** @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);
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 *))
/* ex - Exception Handling */
-/* Copyright (c) 2005-2013. The SimGrid Team. */
+/* Copyright (c) 2005-2014. The SimGrid Team.
+ * All rights reserved. */
+
/* Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com> */
/* Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/> */
/* Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/> */
return "tracing error";
case io_error:
return "io error";
+ case vm_error:
+ return "vm error";
+
}
return "INVALID ERROR";
}
/* 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
-/* 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
-/* 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
/* 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
-/* 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
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] =
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
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 */
YY_RULE_SETUP
FAIL("Unexpected character `%c': `</graph>' expected.",xbt_graph_parse_text[0]);
YY_BREAK
-case YY_STATE_EOF(S_graphxml_graph_1):
-case YY_STATE_EOF(E_graphxml_graph):
case YY_STATE_EOF(S_graphxml_graph_3):
-case YY_STATE_EOF(S_graphxml_graph_5):
+case YY_STATE_EOF(E_graphxml_graph):
+case YY_STATE_EOF(S_graphxml_graph_1):
case YY_STATE_EOF(S_graphxml_graph):
+case YY_STATE_EOF(S_graphxml_graph_5):
FAIL("Premature EOF: `</graph>' expected.");
YY_BREAK
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;
}
}
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;
}
}
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;
}
}
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;
}
}
-/* 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
/* 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
-/* 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
/* 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
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);
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);
+}
/* log - a generic logging facility in the spirit of log4j */
-/* Copyright (c) 2004-2013. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-
#include <stdarg.h>
#include <ctype.h>
#include <stdio.h> /* snprintf */
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);
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 */
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);
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);
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 */
-/* 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
/* 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
/* 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
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
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();
}
/* 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
/* 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
-/* 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
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <sys/types.h>
#include <fcntl.h> /* After sys/types.h, at least for dpx/2. */
#include <sys/stat.h>
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){
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
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
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
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
-/* Copyright (c) 2004-2005, 2007, 2009-2013. The SimGrid Team.
+/* Copyright (c) 2004-2005, 2007, 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "internal_config.h"
#include <unistd.h>
/* 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
+/* Copyright (c) 2010-2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stddef.h>
#include <stdio.h>
#include <string.h>
+/* 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"
+/* 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
-/* Copyright (c) 2004-2012. The SimGrid Team.
+/* Copyright (c) 2004-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "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
+/* Copyright (c) 2010-2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
/*\r
* win32-ucontext: Unix ucontext_t operations on Windows platforms\r
* Copyright(C) 2007 Panagiotis E. Hadjidoukas\r
/* 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
/* 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
/* 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
/* 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"
/* 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
/* 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
/* 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
/* 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
/* 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
-/* 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
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)
return ret;
}
+int _xbt_replay_is_active(void){
+ return is_replay_active;
+}
xbt_replay_reader_t xbt_replay_reader_new(const char *filename)
{
void _xbt_replay_action_init(void)
{
+ is_replay_active = 1;
action_funs = xbt_dict_new_homogeneous(NULL);
action_queues = xbt_dict_new_homogeneous(NULL);
}
/* 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
/* 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
*/
/* 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
/* 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
/* 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
/* 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
/* 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
-/* 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
-/* 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
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
)
set(teshsuite_src
${teshsuite_src}
- ${CMAKE_CURRENT_SOURCE_DIR}/storage.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/storage_basic.c
PARENT_SCOPE
)
set(bin_files
<platform version="3">
<AS id="AS0" routing="Full">
<!-- STORAGE TYPES -->
- <storage_type id="crucial" model="SSD" size="500">
- <prop id="Bwrite" value="30000000" /> <!-- 30Mo/s -->
- <prop id="Bread" value="100000000" /> <!-- 100Mo/s -->
- <prop id="Bconnection" value="150000000" /> <!-- 150Mo/s -->
+ <storage_type id="crucial" model="SSD" size="500GiB">
+ <model_prop id="Bwrite" value="30000000" /> <!-- 30Mo/s -->
+ <model_prop id="Bread" value="100000000" /> <!-- 100Mo/s -->
+ <model_prop id="Bconnection" value="150000000" /> <!-- 150Mo/s -->
</storage_type>
- <storage_type id="single_HDD" model="linear_no_lat" size="500GiB" content_type="txt_unix">
- <prop id="Bwrite" value="30MBps" />
- <prop id="Bread" value="100MBps" />
- <prop id="Bconnection" value="150MBps" />
+ <storage_type id="single_HDD" model="linear_no_lat" size="750GiB" content_type="txt_unix">
+ <model_prop id="Bwrite" value="30MBps" />
+ <model_prop id="Bread" value="100MBps" />
+ <model_prop id="Bconnection" value="150MBps" />
</storage_type>
<storage_type id="single_SSD" model="linear_no_lat"
- content="content/storage_content.txt" size="500GiB">
- <prop id="Bwrite" value="30MBps" />
- <prop id="Bread" value="100MBps" />
- <prop id="Bconnection" value="150MBps" />
+ content="content/storage_content.txt" size="300GiB">
+ <model_prop id="Bwrite" value="30MBps" />
+ <model_prop id="Bread" value="100MBps" />
+ <model_prop id="Bconnection" value="150MBps" />
</storage_type>
<!-- DISKS -->
- <storage id="cdisk" typeId="single_HDD" content="msg/storage/storage_content_c.txt">
- <prop id="filename" value="prop.xml"/>
- <prop id="date" value="31-08-12"/>
- <prop id="author" value="pnavarro"/>
+ <storage id="cdisk" typeId="single_HDD" content="msg/storage/storage_content_c.txt" />
+
+ <storage id="sdisk1" typeId="single_SSD" content="msg/storage/storage_content_s1.txt">
+ <prop id="usage" value="File system"/>
+ </storage>
+
+ <storage id="sdisk2" typeId="single_HDD" content="msg/storage/storage_content_s2.txt" >
+ <prop id="usage" value="Cache"/>
</storage>
- <storage id="sdisk1" typeId="single_SSD" content="msg/storage/storage_content_s1.txt" />
- <storage id="sdisk2" typeId="single_HDD" content="msg/storage/storage_content_s2.txt" />
<!-- HOSTS -->
<host id="client" power="1000000000">
+++ /dev/null
-$ 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
+/* 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);
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;
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);
}
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.");
}
}
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);
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);
}
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;
}
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");
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);
}
to_execute = NULL;
}
- display_storage_info(MSG_host_self());
+ storage_info(MSG_host_self());
return 1;
}
--- /dev/null
+$ 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
+
-./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
-./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
-./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
-/* 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
+/* Copyright (c) 2013-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
-/* 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
// Routers
xbt_lib_foreach(as_router_lib, cursor_src, key, value1) {
- if(((sg_routing_edge_t)xbt_lib_get_or_null(as_router_lib, key,
- ROUTING_ASR_LEVEL))->rc_type == SURF_NETWORK_ELEMENT_ROUTER)
+ if(surf_routing_edge_get_rc_type(xbt_lib_get_or_null(as_router_lib, key,
+ ROUTING_ASR_LEVEL)) == SURF_NETWORK_ELEMENT_ROUTER)
{
printf(" <router id=\"%s\"/>\n",key);
}
{
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);
}
{
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);
}
{
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);
}
{
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);
}
> </route>
> </AS>
> </platform>
+
+
+$ ${bindir:=.}/flatifier$EXEEXT ${srcdir:=.}/examples/platforms/torus_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n"
+> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07
+> <?xml version='1.0'?>
+> <!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
+> <platform version="3">
+> <AS id="AS0" routing="Full">
+> <host id="bob0.hamburger.edu" power="1000000000"/>
+> <host id="bob1.hamburger.edu" power="1000000000"/>
+> <host id="bob10.hamburger.edu" power="1000000000"/>
+> <host id="bob11.hamburger.edu" power="1000000000"/>
+> <host id="bob2.hamburger.edu" power="1000000000"/>
+> <host id="bob3.hamburger.edu" power="1000000000"/>
+> <host id="bob4.hamburger.edu" power="1000000000"/>
+> <host id="bob5.hamburger.edu" power="1000000000"/>
+> <host id="bob6.hamburger.edu" power="1000000000"/>
+> <host id="bob7.hamburger.edu" power="1000000000"/>
+> <host id="bob8.hamburger.edu" power="1000000000"/>
+> <host id="bob9.hamburger.edu" power="1000000000"/>
+> <router id="bobbob_cluster_router.hamburger.edu"/>
+> <link id="__loopback__" bandwidth="498000000" latency="0.000015000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_0_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_10_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_11_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_1_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_2_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_3_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_4_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_5_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_6_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_7_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_8_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_9_loopback" bandwidth="100000000" latency="0.000000000" sharing_policy="FATPIPE"/>
+> <link id="bob_cluster_link_from_0_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_0_to_1_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_0_to_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_0_to_3_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_0_to_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_0_to_6_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_10_to_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_10_to_11_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_10_to_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_10_to_4_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_10_to_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_10_to_7_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_11_to_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_11_to_5_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_11_to_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_11_to_8_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_11_to_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_11_to_9_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_1_to_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_1_to_2_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_1_to_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_1_to_4_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_1_to_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_1_to_7_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_2_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_2_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_2_to_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_2_to_5_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_2_to_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_2_to_8_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_3_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_3_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_3_to_4_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_3_to_4_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_3_to_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_3_to_9_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_4_to_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_4_to_10_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_4_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_4_to_1_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_4_to_5_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_4_to_5_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_5_to_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_5_to_11_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_5_to_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_5_to_2_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_5_to_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_5_to_3_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_6_to_0_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_6_to_0_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_6_to_7_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_6_to_7_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_6_to_9_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_6_to_9_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_7_to_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_7_to_10_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_7_to_1_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_7_to_1_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_7_to_8_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_7_to_8_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_8_to_11_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_8_to_11_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_8_to_2_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_8_to_2_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_8_to_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_8_to_6_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_9_to_10_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_9_to_10_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_9_to_3_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_9_to_3_UP" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_9_to_6_DOWN" bandwidth="125000000" latency="0.000050000"/>
+> <link id="bob_cluster_link_from_9_to_6_UP" bandwidth="125000000" latency="0.000050000"/>
+> <route src="bob1.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_1_loopback"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_4_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_UP"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+> </route>
+> <route src="bob1.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_3_loopback"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+> </route>
+> <route src="bob3.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_5_loopback"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_3_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+> </route>
+> <route src="bob5.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_7_loopback"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_UP"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_DOWN"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_UP"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_10_UP"/>
+> </route>
+> <route src="bob7.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_9_loopback"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_UP"/>
+> </route>
+> <route src="bob9.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_UP"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_11_loopback"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_11_to_9_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_DOWN"/>
+> </route>
+> <route src="bob11.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_3_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_0_loopback"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_1_UP"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+> </route>
+> <route src="bob0.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_5_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_UP"/><link_ctn id="bob_cluster_link_from_0_to_3_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_2_loopback"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_0_UP"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_2_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_4_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+> </route>
+> <route src="bob2.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_1_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_3_to_9_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_4_loopback"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_3_to_4_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_3_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_5_UP"/><link_ctn id="bob_cluster_link_from_2_to_5_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_10_UP"/>
+> </route>
+> <route src="bob4.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_UP"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_UP"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_9_UP"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/><link_ctn id="bob_cluster_link_from_8_to_11_UP"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_6_loopback"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_DOWN"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_6_to_7_UP"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/>
+> </route>
+> <route src="bob6.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_UP"/><link_ctn id="bob_cluster_link_from_6_to_9_UP"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_11_UP"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_UP"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/><link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_8_to_6_UP"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_8_loopback"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_8_DOWN"/><link_ctn id="bob_cluster_link_from_7_to_10_UP"/>
+> </route>
+> <route src="bob8.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob1.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_1_to_7_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob3.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_3_to_9_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob5.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_UP"/><link_ctn id="bob_cluster_link_from_5_to_11_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob7.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_7_to_10_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob9.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob11.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_UP"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob0.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/><link_ctn id="bob_cluster_link_from_0_to_6_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob2.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/><link_ctn id="bob_cluster_link_from_2_to_8_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob4.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_4_to_10_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob6.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_9_to_10_DOWN"/><link_ctn id="bob_cluster_link_from_6_to_9_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob8.hamburger.edu">
+> <link_ctn id="bob_cluster_link_from_10_to_11_UP"/><link_ctn id="bob_cluster_link_from_8_to_11_DOWN"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bob10.hamburger.edu">
+> <link_ctn id="bob_cluster_link_10_loopback"/>
+> </route>
+> <route src="bob10.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bobbob_cluster_router.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob1.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob3.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob5.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob7.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob9.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob11.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob0.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob2.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob4.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob6.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob8.hamburger.edu">
+>
+> </route>
+> <route src="bobbob_cluster_router.hamburger.edu" dst="bob10.hamburger.edu">
+>
+> </route>
+> </AS>
+> </platform>
-/* 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
/* 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
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]
> [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
> [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 {} \;
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]
> [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
> [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
-/* 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
! 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
-/* 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
! 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
+/* Copyright (c) 2012, 2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <mpi.h>
-/* 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
! 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
! 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
+/* 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
-/* 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
-/* 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
! 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
-/* -*- 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.
! 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
-/* 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
! 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)
-/* 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
# (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
# 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
# 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
-/* 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
! 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
-/* 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
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 {
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.
-/* 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
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 {
-/* Copyright (c) 2009-2012. The SimGrid Team.
+/* Copyright (c) 2009-2014. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-/* This example should be instructive to learn about SMPI_SAMPLE_LOCAL and
+/* This example should be instructive to learn about SMPI_SAMPLE_LOCAL and
SMPI_SAMPLE_GLOBAL macros for execution sampling */
#include <stdio.h>
#include <mpi.h>
+static double compute(double d0)
+{
+ double d = d0;
+ int j;
+ for (j = 0; j < 100 * 1000 * 1000; j++) { /* 100 kflop */
+ if (d < 100000) {
+ d = d * d;
+ } else {
+ d = 2;
+ }
+ }
+ return d;
+}
+
int main(int argc, char *argv[])
{
- int i,j;
+ int verbose;
+ int i, n;
double d;
MPI_Init(&argc, &argv);
+ verbose = argc <= 1;
+ MPI_Comm_size(MPI_COMM_WORLD, &n);
d = 2.0;
- for (i=0;i<5;i++) {
- SMPI_SAMPLE_GLOBAL(3,-1) { // I want no more than 3 benchs (thres<0)
- fprintf(stderr,"[rank:%d] Run the first computation. It's globally benched, and I want no more than 3 benchmarks (thres<0)\n", smpi_process_index());
-
- for (j=0;j<100*1000*1000;j++) { // 100 kflop
- if (d < 100000) {
- d = d * d;
- } else {
- d = 2;
- }
- }
+ for (i = 0; i < 5; i++) {
+ /* I want no more than n + 1 benchs (thres < 0) */
+ SMPI_SAMPLE_GLOBAL(n + 1, -1) {
+ if (verbose)
+ fprintf(stderr, "(%12.6f) [rank:%d]", MPI_Wtime(), smpi_process_index());
+ else
+ fprintf(stderr, "(0)");
+ fprintf(stderr, " Run the first computation. It's globally benched, "
+ "and I want no more than %d benchmarks (thres<0)\n", n + 1);
+ d = compute(2.0);
}
}
- for (i=0;i<5;i++) {
- SMPI_SAMPLE_LOCAL(0, 0.1) { // I want the standard error to go below 0.1 second. Two tests at least will be run (count is not >0)
- fprintf(stderr,"[rank:%d] Run the first (locally benched) computation. It's locally benched, and I want the standard error to go below 0.1 second (count is not >0)\n", smpi_process_index());
- for (j=0;j<100*1000*1000;j++) { // 100 kflop
- if (d < 100000) {
- d = d * d;
- } else {
- d = 2;
- }
- }
+ n = 0;
+ for (i = 0; i < 5; i++) {
+ /* I want the standard error to go below 0.1 second.
+ * Two tests at least will be run (count is not > 0) */
+ SMPI_SAMPLE_LOCAL(0, 0.1) {
+ if (verbose || n++ < 2) {
+ if (verbose)
+ fprintf(stderr, "(%12.6f)", MPI_Wtime());
+ else
+ fprintf(stderr, "(1)");
+ fprintf(stderr,
+ " [rank:%d] Run the first (locally benched) computation. "
+ "It's locally benched, and I want the standard error to go "
+ "below 0.1 second (count is not >0)\n", smpi_process_index());
+ }
+ d = compute(d);
}
}
-
- fprintf(stderr,"[%d] The result of the computation is: %f\n", smpi_process_index(), d);
+
+ if (verbose)
+ fprintf(stderr, "(%12.6f) [rank:%d] The result of the computation is: %f\n",
+ MPI_Wtime(), smpi_process_index(), d);
+ else
+ fprintf(stderr, "(2) [rank:%d] Done.\n", smpi_process_index());
MPI_Finalize();
return 0;
-/* 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
-/* 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
! 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
-/* 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
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'
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include "mpi.h"
#define SIZE 4
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'
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include "mpi.h"
${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)
+
+
+
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()
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()
#include "mpi.h"
#include "mpitest.h"
+#include "smpi_cocci.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef HAVE_SYS_TIME_H
#define MAX_BUF (32 * 1024 * 1024)
#define LOOPS 10
-__thread char * sbuf, * rbuf;
-__thread int * recvcounts, * displs;
-int errs = 0;
+SMPI_VARINIT_GLOBAL(sbuf, char*);
+SMPI_VARINIT_GLOBAL(rbuf, char*);
+SMPI_VARINIT_GLOBAL(recvcounts, int*);
+SMPI_VARINIT_GLOBAL(displs, int*);
+SMPI_VARINIT_GLOBAL_AND_SET(errs, int, 0);
/* #define dprintf printf */
#define dprintf(...)
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);
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;
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);
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) {
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;
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;
}
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:
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);
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()
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()
{
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,
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,
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,
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,
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,
#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
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
${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
- )
+)
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()
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)
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()
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()
set(txt_files
${txt_files}
${CMAKE_CURRENT_SOURCE_DIR}/testlist
- ${CMAKE_CURRENT_SOURCE_DIR}/../util/mtestf.f
PARENT_SCOPE
)
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()
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()
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()
--- /dev/null
+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
+ )
logical dbgflag
integer wrank
common /mtest/ dbgflag, wrank
+ integer myindex
+ common /grr/ myindex
call MPI_Initialized( flag, ierr )
if (.not. flag) then
endif
dbgflag = .false.
+ myindex = 0
call MPI_Comm_rank( MPI_COMM_WORLD, wrank, ierr )
end
C
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()
)
set(txt_files
${txt_files}
- ${CMAKE_CURRENT_SOURCE_DIR}/../util/mtestf90.f90
${CMAKE_CURRENT_SOURCE_DIR}/testlist
PARENT_SCOPE
)
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)
program main
use mpi
- integer errs, ierr, toterr
+ integer errs, ierr
integer maxsize
parameter (maxsize=1024)
integer recvbuf
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()
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()
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()
--- /dev/null
+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
+ )
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()
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()
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()
#include "mpi.h"
#include "mpitestconf.h"
#include "mpitest.h"
+#include "smpi_cocci.h"
#if defined(HAVE_STDIO_H) || defined(STDC_HEADERS)
#include <stdio.h>
#endif
/* 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
}
/* 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 */
}
else {
if (val >= 0) {
- verbose = val;
+ SMPI_VARGET_GLOBAL(verbose) = val;
}
else {
fprintf( stderr, "Warning: %s not valid for MPITEST_VERBOSE\n",
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,
/* Print rusage data if set */
if (getenv( "MPITEST_RUSAGE" )) {
- usageOutput = 1;
+ SMPI_VARGET_GLOBAL(usageOutput) = 1;
}
}
/*
fflush( stdout );
}
- if (usageOutput)
+ if (SMPI_VARGET_GLOBAL(usageOutput))
MTestResourceSummary( stdout );
*/
int MTestReturnValue( int errors )
{
- if (returnWithVal) return errors ? 1 : 0;
+ if (SMPI_VARGET_GLOBAL(returnWithVal)) return errors ? 1 : 0;
return 0;
}
/* ------------------------------------------------------------------------ */
* 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 */
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;
break;
#endif
default:
- datatype_index = -1;
+ SMPI_VARGET_GLOBAL(datatype_index) = -1;
}
if (!sendtype->InitBuf) {
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.
*/
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 */
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)++];
}
/* ----------------------------------------------------------------------- */
* 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"
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 */
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 */
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
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 );
*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;
/* Other ideas: dup of self, cart comm, graph comm */
default:
*comm = MPI_COMM_NULL;
- intraCommIdx = -1;
+ SMPI_VARGET_GLOBAL(intraCommIdx) = -1;
break;
}
done = 1;
}
else {
- intraCommName = "MPI_COMM_NULL";
+ SMPI_VARGET_GLOBAL(intraCommName) = "MPI_COMM_NULL";
isBasic = 1;
done = 1;
}
/* 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 */
}
}
- return intraCommIdx;
+ return SMPI_VARGET_GLOBAL(intraCommIdx);
}
/*
/* Return the name of an intra communicator */
const char *MTestGetIntracommName( void )
{
- return intraCommName;
+ return SMPI_VARGET_GLOBAL(intraCommName);
}
/*
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 );
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;
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;
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;
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;
/* 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;
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;
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;
default:
*comm = MPI_COMM_NULL;
- interCommIdx = -1;
+ SMPI_VARGET_GLOBAL(interCommIdx) = -1;
break;
}
if (size + remsize >= min_size) done = 1;
}
else {
- interCommName = "MPI_COMM_NULL";
+ SMPI_VARGET_GLOBAL(interCommName) = "MPI_COMM_NULL";
done = 1;
}
/* 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 */
}
}
- 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
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;
}
}
{
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);
{
#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
/*
* 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:
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:
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 )
}
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) {
}
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
/* 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
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'
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]
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <mpi.h>
# 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
! 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
! 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
-/* 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
! 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 ]
+/* 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.
*
! 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)
+/* 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
*
! 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.
-/* 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
/* 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
-/* 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
! 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'
-/* 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
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)
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include "mpi.h"
-/* 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
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'
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include "mpi.h"
#define SIZE 4
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)
### 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)
/* 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
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include "xbt/mmalloc.h"
#include "xbt.h"
#include <stdio.h>
/* 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
/* 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
/* 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
/* 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
/* 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
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));
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 {
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");
/* 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
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 {
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;
}
}
/* 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
/* 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
/* 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
/* 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
+/* Copyright (c) 2012-2014. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
#include <stdio.h>
#include <stdlib.h>
#include <xbt/dynar.h>
#!/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";
#!/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;
#!/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
fi
if [ $# -lt 1 -o $# -gt 3 ]; then
- cat <<EOF
+ cat >&2 <<EOF
Usage: $0 [-batch] archive.tar.gz [git_url [git_reference]]
EOF
exit 1
archive=$1
if [ ! -r "$archive" ]; then
- printf 'File not found: %s\n' "$archive"
+ printf 'File not found: %s\n' "$archive" >&2
exit 1
fi
esac
if [ ! -r "$exclude" ]; then
- printf 'File not found: %s\n' "$exclude"
+ printf 'File not found: %s\n' "$exclude" >&2
exit 1
fi
# lines beginning with '+ ' are expected in git only
# each line is an extended regexp that should match full file names
+- \.gitversion
- Makefile
- doc/html/.*
+ \.cproject
+ \.gitignore
+ \.project
++ COPYRIGHT.template
+ README\.(coding|git)
+ mk_win-dist.sh
+ tools/check_dist_archive
+ tools/check_dist_archive\.exclude
++ tools/generate-multi-jar\.py
++ tools/normalize-pointers\.py
++ tools/update_copyright_header
+ tools/spell/.*
#! /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;
#!/usr/bin/perl -w
+# Copyright (c) 2005, 2012-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
($#ARGV >= 1) or die "Usage: index_create.pl <input-tag-file> <output-doc-file>";
my($type) = "";
#!/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;
}
# Retrieve all the file names, and add their content to $data
my $data;
-open FILES, "find ../src/ ../tools/ ../include/ -name '*.c'|" || die "Cannot search for the source file names: $!\n";
+open FILES, "find ../src/ ../tools/ ../include/ -name '*.c' -o -name '*.cpp' |" || die "Cannot search for the source file names: $!\n";
while (my $file=<FILES>) {
chomp $file;
parse_file($file);
#!/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}"
--- /dev/null
+#!/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()
-/* 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
#!/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.
--- /dev/null
+#!/usr/bin/python
+
+# Copyright (c) 2013-2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+"""
+Tool for normalizing pointers such as two runs have the same 'addresses'
+
+first address encountered will be replaced by 0X0000001, second by 0X0000002, ...
+
+"""
+
+import sys, re
+
+if len(sys.argv)!=2:
+ print "Usage ./normalize-pointers.py <filename>"
+ sys.exit(1)
+
+f = open(sys.argv[1])
+t = f.read()
+f.close()
+
+r = re.compile(r"0x[0-9a-f]+")
+s = r.search(t)
+offset = 0
+pointers = {}
+while (s):
+ if s.group() not in pointers:
+ pointers[s.group()] = "0X%07d"%len(pointers)
+ print t[offset:s.start()],
+ print pointers[s.group()],
+ offset = s.end()
+ s = r.search(t, offset)
+
+print t[offset:]
+
+
+
+
#!/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
#! /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;
#!/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
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:
# ,----
# 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
=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.
#!/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.
#!/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.
Memset
memuse
ment
-mergesort
-MERGESORT
merr
messageSize
messageSizes
prio
prioritarily
PriorityClass
-PRIu
priv
PRN
PRNG
-(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
#!/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;
/* 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
/* 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
/* 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
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)
/* 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
/* 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
--- /dev/null
+#!/bin/bash
+
+# Copyright (c) 2014. The SimGrid Team.
+# All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+if [ "$1" = "-t" ]; then
+ template=$2
+ shift 2
+else
+ template=$(git rev-parse --show-toplevel)/COPYRIGHT.template
+fi
+
+if [ $# -eq 0 ]; then
+ cat >&2 <<EOF
+Usage: $0 [-t COPYRIGHT.template] files...
+EOF
+ exit 1
+fi
+
+if [ ! -r "$template" ]; then
+ printf 'File not found: %s\n' "$template" >&2
+ exit 1
+fi
+
+printf 'Using template: %s\n' "$template"
+
+now=$(date +%Y)
+
+get_dates() {
+ local file=$1
+ local date
+ sed -n '/Copyright.*SimGrid/{
+ s/.*(c) \([[:digit:], -]*\).*/\1/
+ s/[, ]\+/\n/g
+ p
+ }' "$file" \
+ | while read date; do
+ case "$date" in
+ "")
+ ;;
+ *-*)
+ seq ${date/-/ }
+ ;;
+ *)
+ echo $date
+ ;;
+ esac
+ done
+ git log --format=%ad "$file" | cut -d\ -f5 | uniq
+ echo $now
+}
+
+format_dates() {
+ local first
+ local last
+ local next
+ read first
+ last=$first
+ while read next; do
+ if [ $next -eq $((last + 1)) ]; then
+ last=$next
+ else
+ if [ $first -eq $last ]; then
+ printf '%d, ' $first
+ else
+ printf '%d-%d, ' $first $last
+ fi
+ first=$next
+ last=$first
+ fi
+ done
+ if [ $first -eq $last ]; then
+ printf '%d\n' $first
+ else
+ printf '%d-%d\n' $first $last
+ fi
+}
+
+tmp_head=$(mktemp)
+tmp_copy=$(mktemp)
+tmp_foot=$(mktemp)
+trap "rm -f \"$tmp_head\" \"$tmp_copy\" \"$tmp_foot\"" EXIT
+
+for file; do
+ echo "########## $file ##########"
+
+ if [ ! -f "$file" ]; then
+ echo "!!! skip"
+ continue
+ fi
+
+ if head -n 1 "$file" | grep -q '^#!'; then
+ script=1
+ else
+ script=0
+ fi
+
+ ### 1. create new template
+ dates=$(get_dates "$file" | sort -u | format_dates)
+ sed "s/(c) [[:digit:], -]*\./(c) $dates./" "$template" > "$tmp_copy"
+ printf '\n' >> "$tmp_copy"
+
+ # fix comments for scripts
+ if [ $script = 1 ]; then
+ sed -i 's!^..!#!;s! *\*/!!' "$tmp_copy"
+ fi
+
+ ### 2. copy file body
+ if grep -q 'Copyright.*SimGrid' "$file"; then
+ sed '/Copyright.*SimGrid/,$d' "$file" > "$tmp_head"
+ sed -i '${\!^/\* *$!d}' "$tmp_head"
+ sed '1,/the terms of the license/d' "$file" > "$tmp_foot"
+ elif [ $script = 1 ]; then
+ head -n 1 "$file" > "$tmp_head"
+ tail -n +2 "$file" > "$tmp_foot"
+ printf '\n' >> "$tmp_head"
+ else
+ :> "$tmp_head"
+ cp "$file" "$tmp_foot"
+ fi
+ sed -i '1{\!^ *\*/!d};/[^[:space:]]/,$!d' "$tmp_foot"
+
+ ### 3. concatenate new template and file body into $file
+# cat "$tmp_head"
+# cat "$tmp_copy"
+# cat "$tmp_foot"
+ cat "$tmp_head" "$tmp_copy" "$tmp_foot" > $file
+done
+
+cat <<EOF
+
+All files processed.
+
+*** DO NOT FORGET TO DOUBLE CHECK CHANGES BEFORE DOING ANY COMMIT! ***
+
+EOF