From: Martin Quinson Date: Thu, 20 Oct 2011 08:25:30 +0000 (+0200) Subject: merge branches X-Git-Tag: exp_20120216~559 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f783ed4680c6862a1b7543237e89d1221334bae0?hp=270b319983f1f35c5ec8c9616c6defa1251b92dc merge branches --- diff --git a/.gitignore b/.gitignore index c6bdbe95e0..f25af124a2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,19 @@ *.mk *.swp *.patch +*.plist +*.trace + +################################################ +### Maintainer mode +src/simdag/dax_dtd.l +src/surf/simgrid_dtd.l +src/xbt/graphxml.l + +################################################ +### Jedule +examples/simdag/scheduling/simgrid.jed +teshsuite/simdag/platforms/simgrid.jed ################################################ ### Libraries links @@ -30,6 +43,7 @@ src/supernovae_*.c ### Generated files _*.c include/simgrid_config.h +include/xbt/version.h include/instr/tracing_config.h include/smpi/smpif.h src/context_sysv_config.h @@ -51,6 +65,7 @@ _CPack_Packages/ CMakeFiles CMakeCache.txt DartConfiguration.tcl +simgrid.nsi Testing/ Makefile bin/ @@ -69,6 +84,18 @@ buildtools/Cmake/test_prog/prog_va_copy.c ### Documentation doc/all_bib.html doc/logcategories.sh +doc/realtoc.sh +doc/tmp.realtoc +doc/using_bib.html +doc/Doxyfile +doc/footer.html +*.doc.toc +doc/latex/ +doc/html +doc/index-API.doc +doc/index.php +doc/simgrid.tag +doc/simgrid_modules.map doc/publis_core.bib doc/publis_core_bib.html doc/publis_count.html @@ -76,11 +103,6 @@ doc/publis_extern.bib doc/publis_extern_bib.html doc/publis_intra.bib doc/publis_intra_bib.html -doc/realtoc.sh -doc/tmp.realtoc -doc/using_bib.html -doc/Doxyfile -doc/footer.html ################################################ ### Specific of project @@ -186,6 +208,7 @@ examples/msg/mc/bugged2 examples/msg/mc/bugged1 examples/msg/parallel_contexts/pcontexts examples/msg/parallel_contexts/pcontexts2 +examples/msg/pmm/msg_pmm examples/simdag/ex_sd_test examples/simdag/ex_sd_test2 examples/simdag/metaxml/sd_meta @@ -193,6 +216,7 @@ examples/simdag/properties/sd_prop examples/simdag/sd_test examples/simdag/sd_test2 examples/simdag/dax/dax_test +examples/simdag/goal/goal_test examples/simdag/scheduling/minmin_test examples/smpi/reduce examples/smpi/bcast @@ -276,3 +300,28 @@ test_sg examples/smpi/smpi_traced.trace examples/simdag/dot/simulate_dot teshsuite/simdag/platforms/graphicator + +#########################################"" +## tutorial files +doc/gtut-files/01-bones_client +doc/gtut-files/01-bones_server +doc/gtut-files/02-simple_client +doc/gtut-files/02-simple_server +doc/gtut-files/03-args_client +doc/gtut-files/03-args_server +doc/gtut-files/04-callback_client +doc/gtut-files/04-callback_server +doc/gtut-files/05-globals_client +doc/gtut-files/05-globals_server +doc/gtut-files/06-logs_client +doc/gtut-files/06-logs_server +doc/gtut-files/07-timers_client +doc/gtut-files/07-timers_server +doc/gtut-files/08-exceptions_client +doc/gtut-files/08-exceptions_server +doc/gtut-files/09-simpledata_client +doc/gtut-files/09-simpledata_server +doc/gtut-files/10-rpc_client +doc/gtut-files/10-rpc_server +doc/gtut-files/11-explicitwait_client +doc/gtut-files/11-explicitwait_server diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ae37c9e03..db45e7ee91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,23 +7,35 @@ project(simgrid CXX C) set(CMAKE_C_FLAGS "" CACHE TYPE INTERNAL FORCE) set(CMAKE_CXX_FLAGS "" CACHE TYPE INTERNAL FORCE) set(CMAKE_EXE_LINKER_FLAGS "" CACHE TYPE INTERNAL FORCE) -### Version 3.5.99, aka 3.6 svn + +## Mapping version number -> version name +# 3.5.99 -> alpha1 (oops) +# 3.5.9{1,2} -> beta{1,2} +# 3.5.9{3,4,5} -> rc{1,2,3} +# 3.6.{0,1,2} -> release 3.6, 3.6.1, 3.6.2 + set(SIMGRID_VERSION_MAJOR "3") -set(SIMGRID_VERSION_MINOR "5") -set(SIMGRID_VERSION_PATCH "99") -set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}") +set(SIMGRID_VERSION_MINOR "6") +set(SIMGRID_VERSION_PATCH "2") + +if(${SIMGRID_VERSION_PATCH} EQUAL "0") + set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}") +else(${SIMGRID_VERSION_PATCH} EQUAL "0") + set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}") +endif(${SIMGRID_VERSION_PATCH} EQUAL "0") set(libsimgrid_version "${release_version}") set(libgras_version "${release_version}") set(libsmpi_version "${release_version}") set(GCC_NEED_VERSION "4.0") +set(APPLE_NEED_GCC_VERSION "4.6") ### SET THE LIBRARY EXTENSION AND GCC VERSION if(APPLE) #MAC - set(GCC_NEED_VERSION "4.5") set(LIB_EXE "dylib") else(APPLE) if(WIN32) #WINDOWS set(LIB_EXE "a") + set(BIN_EXE ".exe") else(WIN32) #UNIX set(LIB_EXE "so") endif(WIN32) @@ -107,12 +119,12 @@ endif(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/) ### Check 32bits or 64bits INCLUDE (CheckTypeSize) -CHECK_TYPE_SIZE("long" SIZEOF_LONG) -IF(SIZEOF_LONG EQUAL 4) +CHECK_TYPE_SIZE("void*" SIZEOF_VOIDSTAR) +IF(SIZEOF_VOIDSTAR EQUAL 4) SET(ARCH_32_BITS 1) -ELSE(SIZEOF_LONG EQUAL 4) +ELSE(SIZEOF_VOIDSTAR EQUAL 4) SET(ARCH_32_BITS 0) -ENDIF(SIZEOF_LONG EQUAL 4) +ENDIF(SIZEOF_VOIDSTAR EQUAL 4) if(WIN32) @@ -159,9 +171,12 @@ if(WIN32) if(ARCH_32_BITS) ### Arch 32bits set(_WIN32 1) + set(NSIS_WIN_VERSION "win32") else(ARCH_32_BITS) ### Arch 64bits set(_WIN64 1) + set(NSIS_WIN_VERSION "win64") endif(ARCH_32_BITS) + set(_XBT_WIN32 1) @@ -215,12 +230,7 @@ endif(NOT WIN32) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeExe.cmake) ### Make tests -if(NOT WIN32) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/AddTests.cmake) -else(NOT WIN32) - -endif(NOT WIN32) - include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/CTestConfig.cmake) ### Setup the distrib diff --git a/COPYING b/COPYING index 7f936320c3..37b50f0024 100644 --- a/COPYING +++ b/COPYING @@ -7,6 +7,30 @@ Some perticular files distributed with the project have other licenses. More specifically, these files are listed below, along with their license. +========================================================================= + +We have embeded pcre 8.12 library into the windows installer. + +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. +Release 8 of PCRE is distributed under the terms of the "BSD" licence. +The basic library functions are written in C and are freestanding. Also +included in the distribution is a set of C++ wrapper functions. + +/* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY 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. +*/ + ========================================================================== The file src/xbt/snprintf.c contains this license text: diff --git a/ChangeLog b/ChangeLog index 35da57939d..b3d154b6c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,14 +1,98 @@ -SimGrid (3.6) unstable; urgency=low +SimGrid (3.7) NOT RELEASED; urgency=low + + Models: + * Use the partial invalidation optimization by default for the + network too. Should produce the exact same results, only faster. + + SimDag: + * Performance boost by using a swag internally to compute the set of + tasks that are finished and should constitute the return value of + SD_simulate. + + -- $date Da SimGrid team + +SimGrid (3.6.2) stable; urgency=low + + The "Not coding new stuff allows to polish old things" release. + + General + * New bindings to the NS3 packet level simulator (experimental) + * Use the raw (efficient) execution contextes instead of the sysv + (portable) ones when possible. + * libpcre is now mandatory in any cases since not using it led to + severe performance loss and possibly other issues + * Update the XML platforms: + - G5K: include the lastest machine in Nancy + - GridPP and LCG: new platforms + * Documentation was partially updated, at least (more to come) + + Bug fixes, cosmetics and small improvements + * Free terminated processes before the end of the simulation to avoid + exhausting the memory of users having very dynamic amount of + processes. + * Bug fix and cosmetics about canceling non-running tasks + * Bug fix about the dot loader's issues when using libcgraph + + Portability + * Create an installer for windows with nsis (amd64 and win32) + - Add an hello world project to illustrate simgrid project creation. + - Embed libpcre into the Simgrid installer to avoid + its compilation burden + * The raw execution contextes should work on Apple now + * Port to Windows 64 bits + - Sysv contextes now have an implementation for this arch + - GRAS communication features now support this arch + * Drop support for borland compiler on windows + - this code was not maintained, and we kinda depend on gcc nowadays + * Fix portability issues on kfreebsd/gnu: build error about semaphores + * Fix portability issue on unstable ubuntu: linker became picky on + argument order + + -- Wed Oct 5 15:51:01 CEST 2011 Da SimGrid team + + +SimGrid (3.6.1) stable; urgency=low + + The "Oops, we broke Macs too" release + + Portability + * Fixed contextes detection so that raw ones are used when possible + * On Mac, do not use Posix Ucontextes with gcc v4.[1-5] since this + leads to a strange error, with user code segfaulting sometimes when + the generated code is not perfectly aligned (which is not + controlable from the user side, depends on the amount of code) + + XBT + * New macro: CATCH_ANONYMOUS, which is like CATCH(e) but without argument. + + -- Mon Jun 27 13:59:03 CEST 2011 Da SimGrid team + +SimGrid (3.6) stable; urgency=medium + + The Summer Release, also known as the "OMG! They Killed Kenny!" version + + Java and Ruby: + * Bindings now constitute their own package, separated from the main one. + Rationale: reduce our maintainance nightmare by reducing the module coupling + They will soon be released on their own on gforge. + * In the meanwhile: + svn co svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-java + svn co svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-ruby + + GRAS: It is not considered as stable anymore, but experimental. Sorry. + * It's not quite deprecated for now because we have no replacement, + but it may soon become the case. + + SMPI + * New MPI functions supported: MPI_Comm_disconnect, MPI_Comm_get_name + * Fortran: New user-level cache variable to store the rank of the running + process. This improves performance by an order of magnitude. + * C: New coccinelle script to automatically locate and modifiy global and + local static variables. + * Improved SMPI network model with a sender-side gap to account for multiple + parallel sends. MSG - * Change the prototypes of action replay. Sorry for inconvenience, - but this is really more efficient this way (and to adapt your code, - you just have to fix the initialization, that shouldn't be too long) - * Kill the braindead MSG_task_refcount_dec() function. I guess nobody - ever managed to do anything useful with it. - * New function MSG_comm_testany(). Similarly to MSG_comm_waitany(), it - takes a dynar of communications. It returns immediately and gives the - index of a finished communication (if any). * New function MSG_comm_get_status(). MSG_comm_test() and MSG_comm_testany() only say if a communication is finished, no matter whether it succeeded or failed. You can call MSG_comm_get_status() to know the status of a finished @@ -17,12 +101,21 @@ SimGrid (3.6) unstable; urgency=low communication is detached, you are never notified of its success or failure and the memory is released automatically once it is finished. This function is useful when you don't care about the end nor the success of a - communication you send. + communication. + * Change the prototypes of action replay. Sorry for inconvenience, + but this is really more efficient this way (and to adapt your code, + you just have to fix the initialization, that shouldn't be too long) + * Kill the braindead MSG_task_refcount_dec() function. I guess nobody + ever managed to do anything useful with it. + * New function MSG_comm_testany(). Similarly to MSG_comm_waitany(), it + takes a dynar of communications. It returns immediately and gives the + index of a finished communication (if any). + * New example: a basic implementation of the Chord P2P algorithm. SURF * New model for multi-core CPUs. You can now use the core attribute to precise the number of cores of a host. This is a basic model. Every - process running on the host receive at most the power provided in + process running on the host receives at most the power provided in the DTD (throughput<=power). Total throughput of process cannot exceed power * num_cores. * New peer tag. This peer tag creates a tiny AS comprising a host and a @@ -34,7 +127,7 @@ SimGrid (3.6) unstable; urgency=low into a Vivaldi routing model (based on the rule-based model). This allows to combine Vivaldi based latencies with last-mile platforms. - Simix + SIMIX * Added a check for NaN of IEEE754 infinite in the double entries of the smx_user.c file * Introduce a new context factory "raw", highly inspirated from the @@ -49,14 +142,17 @@ SimGrid (3.6) unstable; urgency=low with N parallel threads (the default is 1, meaning no parallelism). * Allow to decide dynamically between sequential and parallel modes. When nthreads > 1, you can use --cfg=contexts/threshold:P to run the user - processes in parallel only when their number is greater than or equal to P. + processes in parallel only when their number is greater than or equal to P + (the default is 2). + * Added a check for NaN of IEEE754 infinite in the double entries of + the smx_user.c file XBT * New command line option: if you pass --cfg=verbose-exit:0, SimGrid won't output the state of processes when interrupted with Ctrl-C * Add a new function xbt_dynar_to_array that transforms a dynar into a NULL-terminated array. This may solve backward compatibility issues - due to the change to return type of SD_Simulate. See also: + due to the change to return type of SD_simulate. See also: http://lists.gforge.inria.fr/pipermail/simgrid-user/2010-December/002206.html * Add new macros with variable number of arguments. - in xbt/log.h: XBT_DEBUG, XBT_VERB, XBT_INFO, etc. @@ -66,6 +162,8 @@ SimGrid (3.6) unstable; urgency=low Define XBT_USE_DEPRECATED if you want to use the old numbered macros like INFO1, INFO2, etc. * Change xbt_die() to accept a format string with arguments, just like printf. + * New data structure: xbt_lib_t, like a dict but more general and with better + memory handling. INSTR * New configuration options @@ -75,7 +173,8 @@ SimGrid (3.6) unstable; urgency=low * XBT logging makes tracing error checks easier, new root log hierarchy: instr * New TRACE_user_link_variable interface: User provides the name of the link and the tracing variable to attach to it - * the declaration of tracing categories must be done after the environment creation + * the declaration of tracing categories must be done after the environment + creation * simpler tracing interface, just one way to declare categories TRACE_category or TRACE_category_with_color, it is up to you * links in the trace file are again identified by their names @@ -85,6 +184,14 @@ SimGrid (3.6) unstable; urgency=low these options generate traces that are suited to gantt-charts, such as the space-time view of Paje * The experimental option tracing/msg/volume is deprecated its functionality may be reincorporated if needed + * Buffering + The tracing generates a trace file with unordered timestamped events, + because of the way the core simulator (surf) works. A script available + at the tools directory (fix-paje-trace.sh) can be used to put the events + in order. We have changed the tracing so it can generate ordered timestamped + events in the final trace, but depending on the simulator (and how much time + is simulated) that can lead to a huge memory utilization. It is desactivated + by default, but it can be activated using the --cfg=tracing/buffer:1 switch. Build Infrastructure * Define a SIMGRID_VERSION macro in simgrid_config.h. @@ -95,8 +202,10 @@ SimGrid (3.6) unstable; urgency=low - current value: 30600 for 3.06.00, aka 3.6 * Define macro MAKE_SIMGRID_VERSION(major, minor, patch) to help building a number that can be compared with SIMGRID_VERSION. + * Add a build option -Denable_debug (set to ON by default): when set to OFF, + assertions and verbose/debug logging events are disabled at compile time. - -- Da SimGrid team + -- Tue Jun 21 08:57:43 CEST 2011 Da SimGrid team SimGrid (3.5) stable; urgency=medium diff --git a/NEWS b/NEWS index cd9cc3a7b9..d24f363fba 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,59 @@ + + + _ _____ __ ____ +__ _____ _ __ ___(_) ___ _ __ |___ / / /_ |___ \ +\ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \| '_ \ __) | + \ V / __/ | \__ \ | (_) | | | | ___) | (_) | / __/ + \_/ \___|_| |___/_|\___/|_| |_| |____(_)___(_)_____| + Oct 5 2011 + +The "Not coding new stuff allows to polish old things" release. + + * Portability to Mac and Windows improved. + * Possible misconfigurations (contextes, libPCRE) made impossible by + removing the option or providing sane default value. + * Exerimental support to NS3 simulator as a backend. + + _ _____ __ _ +__ _____ _ __ ___(_) ___ _ __ |___ / / /_ / | +\ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \| '_ \ | | + \ V / __/ | \__ \ | (_) | | | | ___) | (_) || | + \_/ \___|_| |___/_|\___/|_| |_| |____(_)___(_)_| + Jun 27 2011 + +The "Oops, we broke Macs too" release. +Bug fix to an issue preventing SimGrid from working on Mac OSX. + + _ _____ __ +__ _____ _ __ ___(_) ___ _ __ |___ / / /_ +\ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \| '_ \ + \ V / __/ | \__ \ | (_) | | | | ___) | (_) | + \_/ \___|_| |___/_|\___/|_| |_| |____(_)___/ + Jun 21 2011 + +The "OMG! They Killed Kenny!" version. Major changes: + + * Java and Ruby bindings were removed from the main archive + - They are now distributed separately + * GRAS is not considered as stable anymore, but experimental. Sorry. + * First support for parallel simulation: + - Can run the user code of any simulation in parallel. + - Basic support for multi-cores hosts in platform files + * Improved P2P support: + - Peer tag in platform files for DSL connected nodes + - Vivaldi routing scheme for lightweigted yet accurate models + * Improved SMPI: Faster Fortran, automatic privatization of C globals + * Tracing: trace contains the full platform hierarchy + exactly as declared using the ASes of the platform file + +Plus numerous other goodies (check the ChangeLog for details) + _ _____ ____ __ _____ _ __ ___(_) ___ _ __ |___ / | ___| \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ |___ \ \ V / __/ | \__ \ | (_) | | | | ___) | ___) | \_/ \___|_| |___/_|\___/|_| |_| |____(_)____/ + 01 Dec 2010 The "Winter in Frejus" release. Also known as "ANR/ADT funding helps" Major changes are: @@ -22,12 +73,12 @@ Major changes are: - Windows port: should be usable now but still considered experimental - Autotools have now been completely removed - _ _____ _ _ _ __ _____ _ __ ___(_) ___ _ __ |___ /| || | / | \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \| || |_ | | \ V / __/ | \__ \ | (_) | | | | ___) |__ _|| | \_/ \___|_| |___/_|\___/|_| |_| |____(_) |_|(_)_| + 04 May 2010 The "Polishing easter eggs is probably a good idea" release. This is a bug fixes release only. @@ -36,7 +87,7 @@ __ _____ _ __ ___(_) ___ _ __ |___ /| || | \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \| || |_ \ V / __/ | \__ \ | (_) | | | | ___) |__ _| \_/ \___|_| |___/_|\___/|_| |_| |____(_) |_| - + 28 Apr 2010 The "Easter in Cargese" release. Also known as (major changes): @@ -52,7 +103,8 @@ __ _____ _ __ ___(_) ___ _ __ |___ / |___ /| || | \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ |_ \| || |_ \ V / __/ | \__ \ | (_) | | | | ___) | ___) |__ _| \_/ \___|_| |___/_|\___/|_| |_| |____(_)____(_) |_| - + 24 Dec 2009 + The "Desktop Grid needs love too" release (also called "Xmas release"). Most important changes: * Big speedup through lazy evaluation of the linear models @@ -66,7 +118,8 @@ __ _____ _ __ ___(_) ___ _ __ |___ / |___ / |___ / \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ |_ \ |_ \ \ V / __/ | \__ \ | (_) | | | | ___) | ___) | ___) | \_/ \___|_| |___/_|\___/|_| |_| |____(_)____(_)____/ - + 20 Aug 2009 + The "Need for Speed" release. Big speedup through some function inlining. @@ -75,7 +128,8 @@ __ _____ _ __ ___(_) ___ _ __ |___ / |___ / |___ \ \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ |_ \ __) | \ V / __/ | \__ \ | (_) | | | | ___) | ___) | / __/ \_/ \___|_| |___/_|\___/|_| |_| |____(_)____(_)_____| - + 19 Aug 2009 + The "Simplicity does not preceed complexity, but follows it" release. Most important changes: * surf and simix modules reworked for simplification. @@ -89,7 +143,7 @@ __ _____ _ __ ___(_) ___ _ __ |___ / |___ / / | \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ |_ \ | | \ V / __/ | \__ \ | (_) | | | | ___) | ___) || | \_/ \___|_| |___/_|\___/|_| |_| |____(_)____(_)_| - + 27 Jun 2009 This dot release is mainly a maintainance one. Most important changes: * We fixed a large amount of bugs all around @@ -113,12 +167,12 @@ fixed in a latter release. __ _____ _ __ ___(_) ___ _ __ |___ / |___ / \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ |_ \ \ V / __/ | \__ \ | (_) | | | | ___) | ___) | - \_/ \___|_| |___/_|\___/|_| |_| |____(_)____/ + \_/ \___|_| |___/_|\___/|_| |_| |____(_)____/ _ _ _ _ _ _ _ | |___ __ _ __| |_ ___ __| | | || | ' \| / -_) _` (_-< ' \/ -_) _` | \_,_|_||_|_\___\__,_/__/_||_\___\__,_| - + Mar 16 2007 homepage: http://simgrid.gforge.inria.fr/ download: http://gforge.inria.fr/frs/?group_id=12 diff --git a/README.git b/README.git new file mode 100644 index 0000000000..7e11c81ccb --- /dev/null +++ b/README.git @@ -0,0 +1,185 @@ +Using Git for SimGrid +===================== + +SimGrid developement tree is now managed with Git. +So, you need to use Git to : + +- follow the last development of SimGrid +- propose some new commit to SimGrid developpers + + +Installing Git and finding documentation +---------------------------------------- +Refer to your OS documentation for installing Git. + +On Debian/Unbuntu, you can install the following packages : + apt-get install git-core git-gui gitk git-email + +Git website is http://git.or.cz/ . A **lot** of documentation is available on +this website. You can read for example the +link:http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html[Tutorial +Introduction to Git] to begin with Git. + + +Setting up GIT on your computer +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Be sure that git will use your right name and email for commits: + + git config --global user.name "Firstname Lastname" + git config --global user.email Firstname.Lastname@imag.fr + +Note: the "--global" switch ensure that these setups will be used for all +git projects. You can change these settings per project without this flags +(see "man gitconfig" for more information) + + +Getting a working copy of SimGrid developement tree +------------------------------------------------ + +Read-only access: + git clone git://scm.gforge.inria.fr/simgrid/simgrid.git +Read-write access (for people with account on the forge and in the SimGrid +project): + git clone git+ssh://USER@scm.gforge.inria.fr//gitroot//simgrid/simgrid.git +(replace USER by your login name on the forge) + +Note: due to the distributed nature of Git, it is probably better to checkout +with a read-only access and later push in the official repo with another +"remote" setup (see later). + +Creating a commit +~~~~~~~~~~~~~~~~~ +A commit is a self-contained modification of the sources associated to +meta-data such as author, date, message, etc. + +Several rules must be repected as much as possible : + +- all commits in public branches should lead to a state where "make" + works (required in order git-bisect to be useful) +- all commits in public branches must never be rebased (use "git revert" if you + need to revert a public commit) +- each commit should contain only one logical modification +- this modification must be described in the log message. The first line of the + log is a summary, the second line should be empty, the next lines can + describe more precisely the modifications. + + +Your first line of commit message can begin with a [flag] telling which global +part of SimGrid you are changing. It can be for example [doc], [network], [build +system], [bugfix], etc. + +[bugfix] commits will probably be considered to be also applied in the last +stable branch. + +If you need to modify your commits (changeset) before publishing them (better +log message, splitting/merging of commits, ...), you can use : + +- "git gui" to modify (ammend) the last commit (check the good box) +- "gitk" to cherry pick interresting commits (right-clic on interesting + commits) and (re)create a linear branch +- "git rebase -i" to merge/split/reorder commits in a linear branch +- your email or your feet to go ask for help ;-) + + +Writing in the official repo +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +People with an accound on the forge (and in the SimGrid group) are allowed +to publish their changes in the main repo. However, they can only +create/modify/remove heads under refs/heads/$forge_login/* + +Global branches $global such as 'master', 'stable-*', ... are only writable +if they are a subset of a refs/heads/$forge_login/official/$global . +Restrictions to push to these global branches can be added if required. + +To publish some commit, the easiest way is to create a "remote" config +such as: + git remote add inria-forge git+ssh://$forge_login@scm.gforge.inria.fr//gitroot//simgrid/simgrid.git + +And then, you should add to the configuration (in the [remote "sourceforge"] +section of .git/config) some lines such as (replace $forge_login by your +login on the forge): + push = refs/heads/master:refs/heads/$forge_login/wip/master + push = refs/heads/public/*:refs/heads/$forge_login/* + push = +refs/heads/wip/*:refs/heads/$forge_login/wip/* +The idea here is to establish a correspondance between local heads and remote +heads. As said before, remote heads **must** match refs/heads/$forge_login/* +in order the push to succeed. + +Note: you can also add the previous config directly into the [remote "origin"] +section if your clone has been done with the ssh protocol. + +You can create one-to-one correspondances (lines 1) or global correspondances +(lines 2 and 3) as you wish. If you add a '+' in front of the line (line 3), +then non fast-forward updates will be allowed. See 'man git-push' for more +information. + +You can them push your commits with: + git push sourceforge + + +To summary, with this setup: +- local branch named master is pushed to '$forge_login/wip/master' +- local branches named 'public/*' are pushed to '$forge_login/*' +- local branches named 'wip/*' are pushed to '$forge_login/wip/*' +- other local branches are not pushed + +Putting something in the 'master', 'stable-*', ... branches +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Just create a branch that merge the current 'master', 'stable-*', ... branch +(called $global in this text) you want to update, push it first as +$forge_login/official/$global and then push it as $global. + With the previous example setup, if you want to update 'master' to include +your current commit, you have to type something like: + git merge sourceforge/master + git push sourceforge HEAD:$forge_login/official/master + git push sourceforge HEAD:master +You can also add some config in .git/config such as + push = refs/heads/user-master:refs/heads/$forge_login/official/master + push = refs/heads/global-master:refs/heads/master + + You can also ask one official maintainer of this branch to pull from your one +(ie publish your branch and give its name to the official maintainers). + +Note: take care to ask to push only well commented, well formed changeset. +Use 'git-rebase' to cleanup your branch if needed. Do not hesitate to ask for +help if you do not know how to do it. + +Publishing branches +~~~~~~~~~~~~~~~~~~~ +There is mainly two reasons for which you might want to publish some of your +commits: + +- to merge your work into the main (master) developement branch. You must then +ensure that the branch you want to publish is ready to be merged (well +commented, well formed, bug free changeset) and then ask for a merge (see +previous paragraph). If 'make' does not produce a working binary, you should +reconsider seriously your request. + +Even if your work is not merged immediately, you should never rebase this +branch (ie only fast-forward commits should be done). SimGrid developers should +use public/* heads to track these kind of works; + +- to allow you/other people to test some experimental features. Rebase can +occurs here, so other developers must never merge from theses branches unless +they really know what they do. SimGrid developers should use wip/* heads to +track these kind of works; + +To summary: commits in public/* heads (and 'master', 'stable-*' heads) must +never be rebased as they can be used by other people. Take care before +pushing such heads! + +Essential commands +------------------ + +You can probably do most of your work with the following commands: + +- git clone: get a new repo +- git gui: commit some changes (graphical program) + You can very easily modify your last commit with this program +- gitk: look at commits and manage branches (graphical program) +- git rebase: rewrite/reorganize your (not yet public) commits +- git fetch: get upstream changes +- git merge: merge commits present on other branches +- git pull: do a fetch and a merge +- git push: publish your changes + diff --git a/buildtools/Cmake/AddTests.cmake b/buildtools/Cmake/AddTests.cmake index f1bb101e97..06b05c27da 100644 --- a/buildtools/Cmake/AddTests.cmake +++ b/buildtools/Cmake/AddTests.cmake @@ -9,7 +9,7 @@ if(enable_smpi AND NOT WIN32) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff" OUTPUT_VARIABLE "OKITOKI") exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun" OUTPUT_VARIABLE "OKITOKI") endif(enable_smpi AND NOT WIN32) - + ### For code coverage ### Set some variables SET(UPDATE_TYPE "svn") @@ -24,381 +24,404 @@ INCLUDE(CTest) ENABLE_TESTING() if(NOT enable_memcheck) -ADD_TEST(tesh-self-basic ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" basic.tesh) -ADD_TEST(tesh-self-cd ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/cd.tesh) -ADD_TEST(tesh-self-IO-broken-pipe ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" IO-broken-pipe.tesh) -ADD_TEST(tesh-self-IO-orders ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/IO-orders.tesh) -ADD_TEST(tesh-self-IO-bigsize ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" IO-bigsize.tesh) -ADD_TEST(tesh-self-set-return ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" set-return.tesh) -ADD_TEST(tesh-self-set-signal ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" set-signal.tesh) -ADD_TEST(tesh-self-set-timeout ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" set-timeout.tesh) -ADD_TEST(tesh-self-set-ignore-output ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/set-ignore-output.tesh) -ADD_TEST(tesh-self-catch-return ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-return.tesh) -ADD_TEST(tesh-self-catch-signal ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-signal.tesh) -ADD_TEST(tesh-self-catch-timeout ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-timeout.tesh) -ADD_TEST(tesh-self-catch-wrong-output ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-wrong-output.tesh) -ADD_TEST(tesh-self-bg-basic ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" bg-basic.tesh) -ADD_TEST(tesh-self-bg-set-signal ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" bg-set-signal.tesh) -ADD_TEST(tesh-self-background ${CMAKE_BINARY_DIR}/bin/tesh --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" background.tesh) +ADD_TEST(tesh-self-basic ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/bin --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" basic.tesh) +ADD_TEST(tesh-self-cd ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/cd.tesh) +ADD_TEST(tesh-self-IO-broken-pipe ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" IO-broken-pipe.tesh) +ADD_TEST(tesh-self-IO-orders ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/IO-orders.tesh) +ADD_TEST(tesh-self-IO-bigsize ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" IO-bigsize.tesh) +ADD_TEST(tesh-self-set-return ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" set-return.tesh) +ADD_TEST(tesh-self-set-signal ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" set-signal.tesh) +ADD_TEST(tesh-self-set-timeout ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" set-timeout.tesh) +ADD_TEST(tesh-self-set-ignore-output ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/set-ignore-output.tesh) +ADD_TEST(tesh-self-catch-return ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-return.tesh) +ADD_TEST(tesh-self-catch-signal ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-signal.tesh) +ADD_TEST(tesh-self-catch-timeout ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-timeout.tesh) +ADD_TEST(tesh-self-catch-wrong-output ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_BINARY_DIR}/bin" ${CMAKE_HOME_DIRECTORY}/tools/tesh/catch-wrong-output.tesh) +ADD_TEST(tesh-self-bg-basic ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" bg-basic.tesh) +ADD_TEST(tesh-self-bg-set-signal ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" bg-set-signal.tesh) +ADD_TEST(tesh-self-background ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd "${CMAKE_HOME_DIRECTORY}/tools/tesh" background.tesh) # BEGIN TESH TESTS # teshsuite/xbt -ADD_TEST(tesh-log-large ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/log_large_test.tesh) -ADD_TEST(tesh-log-parallel ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/parallel_log_crashtest.tesh) +ADD_TEST(tesh-log-large ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/log_large_test.tesh) +ADD_TEST(tesh-log-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/parallel_log_crashtest.tesh) # teshsuite/gras/datadesc directory -ADD_TEST(tesh-gras-dd-mem ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_mem.tesh) -ADD_TEST(tesh-gras-dd-rw ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_rw.tesh) -ADD_TEST(tesh-gras-dd-r-little32-4 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh) -ADD_TEST(tesh-gras-dd-r-little64 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_little64.tesh) -ADD_TEST(tesh-gras-dd-r-big32-8-4 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh) +ADD_TEST(tesh-gras-dd-mem ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_mem.tesh) +ADD_TEST(tesh-gras-dd-rw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_rw.tesh) +ADD_TEST(tesh-gras-dd-r-little32-4 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh) +ADD_TEST(tesh-gras-dd-r-little64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_little64.tesh) +ADD_TEST(tesh-gras-dd-r-big32-8-4 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh) IF(${ARCH_32_BITS}) - ADD_TEST(tesh-gras-msg-handle-sg-32 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_32.tesh) + ADD_TEST(tesh-gras-msg-handle-sg-32 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_32.tesh) ELSE(${ARCH_32_BITS}) - ADD_TEST(tesh-gras-msg-handle-sg-64 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_64.tesh) + ADD_TEST(tesh-gras-msg-handle-sg-64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_64.tesh) ENDIF(${ARCH_32_BITS}) -ADD_TEST(tesh-gras-empty-main-rl ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_rl.tesh) -ADD_TEST(tesh-gras-empty-main-sg ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_sg.tesh) +ADD_TEST(tesh-gras-empty-main-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_rl.tesh) +ADD_TEST(tesh-gras-empty-main-sg ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_sg.tesh) IF(${ARCH_32_BITS}) - ADD_TEST(tesh-gras-small-sleep-sg-32 ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_32.tesh) + ADD_TEST(tesh-gras-small-sleep-sg-32 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_32.tesh) ELSE(${ARCH_32_BITS}) - ADD_TEST(tesh-gras-small-sleep-sg-64 ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_64.tesh) + ADD_TEST(tesh-gras-small-sleep-sg-64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_64.tesh) ENDIF(${ARCH_32_BITS}) # GRAS examples -ADD_TEST(gras-ping-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_rl.tesh) -ADD_TEST(gras-rpc-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_rl.tesh) -ADD_TEST(gras-spawn-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_rl.tesh) -ADD_TEST(gras-timer-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_rl.tesh) -ADD_TEST(gras-chrono-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_rl.tesh) -ADD_TEST(gras-simple-token-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_rl.tesh) -ADD_TEST(gras-mmrpc-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_rl.tesh) -ADD_TEST(gras-all2all-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_rl.tesh) -ADD_TEST(gras-pmm-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_rl.tesh) -ADD_TEST(gras-synchro-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_rl.tesh) -ADD_TEST(gras-properties-rl ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_rl.tesh) +ADD_TEST(gras-ping-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_rl.tesh) +ADD_TEST(gras-rpc-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_rl.tesh) +ADD_TEST(gras-spawn-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_rl.tesh) +ADD_TEST(gras-timer-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_rl.tesh) +ADD_TEST(gras-chrono-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_rl.tesh) +ADD_TEST(gras-simple-token-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_rl.tesh) +ADD_TEST(gras-mmrpc-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_rl.tesh) +ADD_TEST(gras-all2all-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_rl.tesh) +ADD_TEST(gras-pmm-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_rl.tesh) +ADD_TEST(gras-synchro-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_rl.tesh) +ADD_TEST(gras-properties-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_rl.tesh) # BEGIN CONTEXTS FACTORY -ADD_TEST(tesh-msg-get-sender-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) -ADD_TEST(tesh-msg-get-sender-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) -ADD_TEST(tesh-msg-get-sender-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) -ADD_TEST(tesh-simdag-reinit-costs-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/test_reinit_costs.tesh) -ADD_TEST(tesh-simdag-reinit-costs-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/test_reinit_costs.tesh) -ADD_TEST(tesh-simdag-reinit-costs-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/test_reinit_costs.tesh) -ADD_TEST(tesh-simdag-parser-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) -ADD_TEST(tesh-simdag-parser-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) -ADD_TEST(tesh-simdag-parser-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) -ADD_TEST(tesh-simdag-parser-bogus-symmetric-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) -ADD_TEST(tesh-simdag-parser-bogus-symmetric-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) -ADD_TEST(tesh-simdag-parser-bogus-symmetric-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) -ADD_TEST(tesh-simdag-parser-sym-full-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_sym_full.tesh) -ADD_TEST(tesh-simdag-parser-sym-full-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_sym_full.tesh) -ADD_TEST(tesh-simdag-parser-sym-full-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_sym_full.tesh) -ADD_TEST(tesh-simdag-flatifier-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh) -ADD_TEST(tesh-simdag-flatifier-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh) -ADD_TEST(tesh-simdag-flatifier-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh) -ADD_TEST(tesh-simdag-full-links-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms get_full_link.tesh) -ADD_TEST(tesh-simdag-full-links-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms get_full_link.tesh) -ADD_TEST(tesh-simdag-full-links-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms get_full_link.tesh) -ADD_TEST(tesh-simdag-basic0-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic0.tesh) -ADD_TEST(tesh-simdag-basic0-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic0.tesh) -ADD_TEST(tesh-simdag-basic0-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic0.tesh) -ADD_TEST(tesh-simdag-basic1-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic1.tesh) -ADD_TEST(tesh-simdag-basic1-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic1.tesh) -ADD_TEST(tesh-simdag-basic1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic1.tesh) -ADD_TEST(tesh-simdag-basic2-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic2.tesh) -ADD_TEST(tesh-simdag-basic2-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic2.tesh) -ADD_TEST(tesh-simdag-basic2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic2.tesh) -ADD_TEST(tesh-simdag-basic3-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic3.tesh) -ADD_TEST(tesh-simdag-basic3-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic3.tesh) -ADD_TEST(tesh-simdag-basic3-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic3.tesh) -ADD_TEST(tesh-simdag-basic4-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic4.tesh) -ADD_TEST(tesh-simdag-basic4-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic4.tesh) -ADD_TEST(tesh-simdag-basic4-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic4.tesh) -ADD_TEST(tesh-simdag-basic5-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic5.tesh) -ADD_TEST(tesh-simdag-basic5-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic5.tesh) -ADD_TEST(tesh-simdag-basic5-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic5.tesh) -ADD_TEST(tesh-simdag-basic6-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic6.tesh) -ADD_TEST(tesh-simdag-basic6-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic6.tesh) -ADD_TEST(tesh-simdag-basic6-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic6.tesh) -ADD_TEST(tesh-simdag-p2p-1-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency1.tesh) -ADD_TEST(tesh-simdag-p2p-1-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency1.tesh) -ADD_TEST(tesh-simdag-p2p-1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency1.tesh) -ADD_TEST(tesh-simdag-p2p-2-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency2.tesh) -ADD_TEST(tesh-simdag-p2p-2-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency2.tesh) -ADD_TEST(tesh-simdag-p2p-2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency2.tesh) -ADD_TEST(tesh-simdag-p2p-3-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency3.tesh) -ADD_TEST(tesh-simdag-p2p-3-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency3.tesh) -ADD_TEST(tesh-simdag-p2p-3-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency3.tesh) -ADD_TEST(tesh-simdag-p2p-4-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency_bound.tesh) -ADD_TEST(tesh-simdag-p2p-4-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency_bound.tesh) -ADD_TEST(tesh-simdag-p2p-4-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency_bound.tesh) -ADD_TEST(tesh-simdag-mxn-1-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_all2all.tesh) -ADD_TEST(tesh-simdag-mxn-1-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_all2all.tesh) -ADD_TEST(tesh-simdag-mxn-1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_all2all.tesh) -ADD_TEST(tesh-simdag-mxn-2-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_independent_comm.tesh) -ADD_TEST(tesh-simdag-mxn-2-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_independent_comm.tesh) -ADD_TEST(tesh-simdag-mxn-2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_independent_comm.tesh) -ADD_TEST(tesh-simdag-mxn-3-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_scatter.tesh) -ADD_TEST(tesh-simdag-mxn-3-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_scatter.tesh) -ADD_TEST(tesh-simdag-mxn-3-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_scatter.tesh) -ADD_TEST(tesh-simdag-par-1-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_seq.tesh) -ADD_TEST(tesh-simdag-par-1-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_seq.tesh) -ADD_TEST(tesh-simdag-par-1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_seq.tesh) -ADD_TEST(tesh-simdag-par-2-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_par.tesh) -ADD_TEST(tesh-simdag-par-2-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_par.tesh) -ADD_TEST(tesh-simdag-par-2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_par.tesh) +ADD_TEST(tesh-msg-get-sender-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) +ADD_TEST(tesh-simdag-reinit-costs-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/test_reinit_costs.tesh) +ADD_TEST(tesh-simdag-parser-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) +if(HAVE_RAWCTX) + ADD_TEST(tesh-msg-get-sender-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) + ADD_TEST(tesh-simdag-reinit-costs-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/test_reinit_costs.tesh) + ADD_TEST(tesh-simdag-parser-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) +endif(HAVE_RAWCTX) +if(HAVE_UCONTEXT_H) + ADD_TEST(tesh-msg-get-sender-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) + ADD_TEST(tesh-simdag-reinit-costs-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/test_reinit_costs.tesh) + ADD_TEST(tesh-simdag-parser-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) +endif(HAVE_UCONTEXT_H) + +IF(enable_debug) # these tests need the assertion mechanism + if(HAVE_RAWCTX) + ADD_TEST(tesh-simdag-parser-bogus-symmetric-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) + endif(HAVE_RAWCTX) + if(HAVE_UCONTEXT_H) + ADD_TEST(tesh-simdag-parser-bogus-symmetric-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) + endif(HAVE_UCONTEXT_H) + ADD_TEST(tesh-simdag-parser-bogus-symmetric-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) +ENDIF(enable_debug) + +ADD_TEST(tesh-simdag-parser-sym-full ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_sym_full.tesh) +ADD_TEST(tesh-simdag-flatifier ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh) +ADD_TEST(tesh-simdag-full-links ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms get_full_link.tesh) +ADD_TEST(tesh-simdag-basic0 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic0.tesh) +ADD_TEST(tesh-simdag-basic1 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic1.tesh) +ADD_TEST(tesh-simdag-basic2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic2.tesh) +ADD_TEST(tesh-simdag-basic3 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic3.tesh) +ADD_TEST(tesh-simdag-basic4 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic4.tesh) +ADD_TEST(tesh-simdag-basic5 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic5.tesh) +ADD_TEST(tesh-simdag-basic6 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/basic6.tesh) +ADD_TEST(tesh-simdag-p2p-1 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency1.tesh) +ADD_TEST(tesh-simdag-p2p-2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency2.tesh) +ADD_TEST(tesh-simdag-p2p-3 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency3.tesh) +ADD_TEST(tesh-simdag-p2p-4 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/p2p/test_latency_bound.tesh) +ADD_TEST(tesh-simdag-mxn-1 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_all2all.tesh) +ADD_TEST(tesh-simdag-mxn-2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_independent_comm.tesh) +ADD_TEST(tesh-simdag-mxn-3 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn/test_intra_scatter.tesh) +ADD_TEST(tesh-simdag-par-1 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_seq.tesh) +ADD_TEST(tesh-simdag-par-2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask/test_comp_only_par.tesh) # MSG examples -ADD_TEST(msg-sendrecv-CLM03-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh) -ADD_TEST(msg-sendrecv-CLM03-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --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-sendrecv-CLM03-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --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-sendrecv-Vegas-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Vegas.tesh) -ADD_TEST(msg-sendrecv-Vegas-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Vegas.tesh) -ADD_TEST(msg-sendrecv-Vegas-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Vegas.tesh) -ADD_TEST(msg-sendrecv-Reno-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Reno.tesh) -ADD_TEST(msg-sendrecv-Reno-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Reno.tesh) -ADD_TEST(msg-sendrecv-Reno-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Reno.tesh) -ADD_TEST(msg-suspend-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/suspend/suspend.tesh) -ADD_TEST(msg-suspend-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/suspend/suspend.tesh) -ADD_TEST(msg-suspend-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/suspend/suspend.tesh) -ADD_TEST(msg-masterslave-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave.tesh) -ADD_TEST(msg-masterslave-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave.tesh) -ADD_TEST(msg-masterslave-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave.tesh) -ADD_TEST(msg-masterslave-forwarder-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_forwarder.tesh) -ADD_TEST(msg-masterslave-forwarder-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_forwarder.tesh) -ADD_TEST(msg-masterslave-forwarder-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_forwarder.tesh) -ADD_TEST(msg-masterslave-failure-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure.tesh) -ADD_TEST(msg-masterslave-failure-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure.tesh) -ADD_TEST(msg-masterslave-failure-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure.tesh) -ADD_TEST(msg-masterslave-bypass-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_bypass.tesh) -ADD_TEST(msg-masterslave-bypass-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_bypass.tesh) -ADD_TEST(msg-masterslave-bypass-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_bypass.tesh) -ADD_TEST(msg-masterslave-mailbox-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox.tesh) -ADD_TEST(msg-masterslave-mailbox-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox.tesh) -ADD_TEST(msg-masterslave-mailbox-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox.tesh) -ADD_TEST(msg-masterslave-vivaldi-raw ${CMAKE_BINARY_DIR}/bin/tesh --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-vivaldi-thread ${CMAKE_BINARY_DIR}/bin/tesh --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-vivaldi-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --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-multicore-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_multicore.tesh) -ADD_TEST(msg-masterslave-multicore-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_multicore.tesh) -ADD_TEST(msg-masterslave-multicore-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_multicore.tesh) -ADD_TEST(msg-migration-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) -ADD_TEST(msg-migration-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) -ADD_TEST(msg-migration-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --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-ptask-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) -ADD_TEST(msg-ptask-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) -ADD_TEST(msg-ptask-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) -ADD_TEST(msg-priority-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/priority/priority.tesh) -ADD_TEST(msg-priority-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/priority/priority.tesh) -ADD_TEST(msg-priority-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/priority/priority.tesh) -ADD_TEST(msg-properties-raw ${CMAKE_BINARY_DIR}/bin/tesh --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-properties-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --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-properties-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --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-icomms-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/icomms --cd ${CMAKE_BINARY_DIR}/examples/msg/icomms ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer.tesh) -ADD_TEST(msg-icomms-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/icomms --cd ${CMAKE_BINARY_DIR}/examples/msg/icomms ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer.tesh) -ADD_TEST(msg-icomms-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/icomms --cd ${CMAKE_BINARY_DIR}/examples/msg/icomms ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer.tesh) -ADD_TEST(msg-actions-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/actions --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/actions actions.tesh) -ADD_TEST(msg-actions-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/actions --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/actions actions.tesh) -ADD_TEST(msg-actions-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/actions --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/actions actions.tesh) -ADD_TEST(msg-masterslave-cpu-ti-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti.tesh) -ADD_TEST(msg-masterslave-cpu-ti-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti.tesh) -ADD_TEST(msg-masterslave-cpu-ti-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti.tesh) -ADD_TEST(msg-trace-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg trace/trace.tesh) -ADD_TEST(msg-trace-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg trace/trace.tesh) -ADD_TEST(msg-trace-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg trace/trace.tesh) -ADD_TEST(msg-token-ring-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) -ADD_TEST(msg-token-ring-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) -ADD_TEST(msg-token-ring-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) +ADD_TEST(msg-sendrecv-CLM03-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh) +ADD_TEST(msg-sendrecv-Vegas-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Vegas.tesh) +ADD_TEST(msg-sendrecv-Reno-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Reno.tesh) +ADD_TEST(msg-suspend-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/suspend/suspend.tesh) +ADD_TEST(msg-masterslave-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave.tesh) +ADD_TEST(msg-masterslave-forwarder-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_forwarder.tesh) +ADD_TEST(msg-masterslave-failure-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure.tesh) +ADD_TEST(msg-masterslave-bypass-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_bypass.tesh) +ADD_TEST(msg-masterslave-mailbox-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox.tesh) + +if(HAVE_UCONTEXT_H) + ADD_TEST(msg-sendrecv-CLM03-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh) + ADD_TEST(msg-sendrecv-Vegas-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Vegas.tesh) + ADD_TEST(msg-sendrecv-Reno-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Reno.tesh) + ADD_TEST(msg-suspend-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/suspend/suspend.tesh) + ADD_TEST(msg-masterslave-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave.tesh) + ADD_TEST(msg-masterslave-forwarder-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_forwarder.tesh) + ADD_TEST(msg-masterslave-failure-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure.tesh) + ADD_TEST(msg-masterslave-bypass-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_bypass.tesh) + ADD_TEST(msg-masterslave-mailbox-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox.tesh) +endif(HAVE_UCONTEXT_H) + +if(HAVE_RAWCTX) + ADD_TEST(msg-sendrecv-CLM03-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh) + ADD_TEST(msg-sendrecv-Vegas-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Vegas.tesh) + ADD_TEST(msg-sendrecv-Reno-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_Reno.tesh) + ADD_TEST(msg-suspend-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/suspend/suspend.tesh) + ADD_TEST(msg-masterslave-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave.tesh) + ADD_TEST(msg-masterslave-forwarder-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_forwarder.tesh) + ADD_TEST(msg-masterslave-failure-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure.tesh) + ADD_TEST(msg-masterslave-bypass-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_bypass.tesh) + ADD_TEST(msg-masterslave-mailbox-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox.tesh) +endif(HAVE_RAWCTX) + +if (enable_pcre) + ADD_TEST(msg-masterslave-vivaldi-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh) + ADD_TEST(msg-token-ring-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) + if(HAVE_RAWCTX) + ADD_TEST(msg-masterslave-vivaldi-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh) + ADD_TEST(msg-token-ring-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) + endif(HAVE_RAWCTX) + if(HAVE_UCONTEXT_H) + ADD_TEST(msg-masterslave-vivaldi-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh) + ADD_TEST(msg-token-ring-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) + endif(HAVE_UCONTEXT_H) +endif (enable_pcre) + +ADD_TEST(msg-masterslave-multicore-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_multicore.tesh) +ADD_TEST(msg-migration-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) +ADD_TEST(msg-ptask-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) +ADD_TEST(msg-priority-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/priority/priority.tesh) +ADD_TEST(msg-properties-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/properties/msg_prop.tesh) +ADD_TEST(msg-icomms-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/icomms --cd ${CMAKE_BINARY_DIR}/examples/msg/icomms ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer.tesh) +ADD_TEST(msg-actions-thread ${CMAKE_BINARY_DIR}/bin/tesh ${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-masterslave-cpu-ti-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti.tesh) +ADD_TEST(msg-trace-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg trace/trace.tesh) +ADD_TEST(msg-chord-thread ${CMAKE_BINARY_DIR}/bin/tesh ${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-thread-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${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) +if(HAVE_UCONTEXT_H) + ADD_TEST(msg-masterslave-multicore-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_multicore.tesh) + ADD_TEST(msg-migration-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) + ADD_TEST(msg-ptask-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) + ADD_TEST(msg-priority-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/priority/priority.tesh) + ADD_TEST(msg-properties-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/properties/msg_prop.tesh) + ADD_TEST(msg-icomms-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/icomms --cd ${CMAKE_BINARY_DIR}/examples/msg/icomms ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer.tesh) + ADD_TEST(msg-actions-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${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-masterslave-cpu-ti-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti.tesh) + ADD_TEST(msg-trace-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg trace/trace.tesh) + ADD_TEST(msg-chord-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${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-ucontext-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${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) +endif(HAVE_UCONTEXT_H) +if(HAVE_RAWCTX) + ADD_TEST(msg-masterslave-multicore-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_multicore.tesh) + ADD_TEST(msg-migration-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) + ADD_TEST(msg-ptask-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) + ADD_TEST(msg-priority-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/priority/priority.tesh) + ADD_TEST(msg-actions-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/actions --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/actions actions.tesh) + ADD_TEST(msg-icomms-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/icomms --cd ${CMAKE_BINARY_DIR}/examples/msg/icomms ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer.tesh) + ADD_TEST(msg-properties-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/properties/msg_prop.tesh) + ADD_TEST(msg-masterslave-cpu-ti-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti.tesh) + ADD_TEST(msg-trace-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg trace/trace.tesh) + ADD_TEST(msg-chord-raw ${CMAKE_BINARY_DIR}/bin/tesh ${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-raw-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${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) +endif(HAVE_RAWCTX) IF(${ARCH_32_BITS}) -ADD_TEST(gras-ping-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) -ADD_TEST(gras-ping-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) -ADD_TEST(gras-ping-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) -ADD_TEST(gras-rpc-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) -ADD_TEST(gras-rpc-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) -ADD_TEST(gras-rpc-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) -ADD_TEST(gras-spawn-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh) -ADD_TEST(gras-spawn-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh) -ADD_TEST(gras-spawn-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh) -ADD_TEST(gras-timer-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh) -ADD_TEST(gras-timer-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh) -ADD_TEST(gras-timer-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh) -ADD_TEST(gras-chrono-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh) -ADD_TEST(gras-chrono-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh) -ADD_TEST(gras-chrono-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh) -ADD_TEST(gras-simple-token-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh) -ADD_TEST(gras-simple-token-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh) -ADD_TEST(gras-simple-token-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh) -ADD_TEST(gras-mmrpc-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh) -ADD_TEST(gras-mmrpc-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh) -ADD_TEST(gras-mmrpc-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh) -ADD_TEST(gras-all2all-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) -ADD_TEST(gras-all2all-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) -ADD_TEST(gras-all2all-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) -ADD_TEST(gras-pmm-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) -ADD_TEST(gras-pmm-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) -ADD_TEST(gras-pmm-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) -ADD_TEST(gras-synchro-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) -ADD_TEST(gras-synchro-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) -ADD_TEST(gras-synchro-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) +ADD_TEST(gras-ping-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) +ADD_TEST(gras-rpc-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) +ADD_TEST(gras-spawn-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh) +ADD_TEST(gras-timer-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh) +ADD_TEST(gras-chrono-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh) +ADD_TEST(gras-simple-token-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh) +ADD_TEST(gras-mmrpc-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh) +ADD_TEST(gras-all2all-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) +ADD_TEST(gras-pmm-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) +ADD_TEST(gras-synchro-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) +if(HAVE_UCONTEXT_H) + ADD_TEST(gras-ping-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) + ADD_TEST(gras-rpc-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) + ADD_TEST(gras-spawn-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh) + ADD_TEST(gras-timer-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh) + ADD_TEST(gras-chrono-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh) + ADD_TEST(gras-simple-token-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh) + ADD_TEST(gras-mmrpc-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh) + ADD_TEST(gras-all2all-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) + ADD_TEST(gras-pmm-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) + ADD_TEST(gras-synchro-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) +endif(HAVE_UCONTEXT_H) +if(HAVE_RAWCTX) + ADD_TEST(gras-ping-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) + ADD_TEST(gras-rpc-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) + ADD_TEST(gras-spawn-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_32.tesh) + ADD_TEST(gras-timer-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_32.tesh) + ADD_TEST(gras-chrono-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_32.tesh) + ADD_TEST(gras-simple-token-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_32.tesh) + ADD_TEST(gras-mmrpc-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_32.tesh) + ADD_TEST(gras-all2all-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) + ADD_TEST(gras-pmm-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) + ADD_TEST(gras-synchro-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) +endif(HAVE_RAWCTX) + ELSE(${ARCH_32_BITS}) -ADD_TEST(gras-ping-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) -ADD_TEST(gras-ping-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) -ADD_TEST(gras-ping-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) -ADD_TEST(gras-rpc-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) -ADD_TEST(gras-rpc-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) -ADD_TEST(gras-rpc-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) -ADD_TEST(gras-spawn-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) -ADD_TEST(gras-spawn-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) -ADD_TEST(gras-spawn-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) -ADD_TEST(gras-timer-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh) -ADD_TEST(gras-timer-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh) -ADD_TEST(gras-timer-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh) -ADD_TEST(gras-chrono-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh) -ADD_TEST(gras-chrono-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh) -ADD_TEST(gras-chrono-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh) -ADD_TEST(gras-simple-token-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh) -ADD_TEST(gras-simple-token-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh) -ADD_TEST(gras-simple-token-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh) -ADD_TEST(gras-mmrpc-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh) -ADD_TEST(gras-mmrpc-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh) -ADD_TEST(gras-mmrpc-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh) -ADD_TEST(gras-all2all-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) -ADD_TEST(gras-all2all-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) -ADD_TEST(gras-all2all-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) -ADD_TEST(gras-pmm-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) -ADD_TEST(gras-pmm-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) -ADD_TEST(gras-pmm-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) -ADD_TEST(gras-synchro-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) -ADD_TEST(gras-synchro-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) -ADD_TEST(gras-synchro-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) +ADD_TEST(gras-ping-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) +ADD_TEST(gras-rpc-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) +ADD_TEST(gras-spawn-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) +ADD_TEST(gras-timer-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh) +ADD_TEST(gras-chrono-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh) +ADD_TEST(gras-simple-token-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh) +ADD_TEST(gras-mmrpc-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh) +ADD_TEST(gras-all2all-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) +ADD_TEST(gras-pmm-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) +ADD_TEST(gras-synchro-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) +if(HAVE_UCONTEXT_H) + ADD_TEST(gras-ping-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) + ADD_TEST(gras-rpc-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) + ADD_TEST(gras-spawn-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) + ADD_TEST(gras-timer-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh) + ADD_TEST(gras-chrono-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh) + ADD_TEST(gras-simple-token-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh) + ADD_TEST(gras-mmrpc-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh) + ADD_TEST(gras-all2all-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) + ADD_TEST(gras-pmm-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) + ADD_TEST(gras-synchro-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) +endif(HAVE_UCONTEXT_H) +if(HAVE_RAWCTX) + ADD_TEST(gras-ping-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) + ADD_TEST(gras-rpc-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) + ADD_TEST(gras-spawn-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) + ADD_TEST(gras-timer-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/timer --cd ${CMAKE_BINARY_DIR}/examples/gras/timer ${CMAKE_HOME_DIRECTORY}/examples/gras/timer/test_sg_64.tesh) + ADD_TEST(gras-chrono-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/chrono --cd ${CMAKE_BINARY_DIR}/examples/gras/chrono ${CMAKE_HOME_DIRECTORY}/examples/gras/chrono/test_sg_64.tesh) + ADD_TEST(gras-simple-token-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token --cd ${CMAKE_BINARY_DIR}/examples/gras/mutual_exclusion/simple_token ${CMAKE_HOME_DIRECTORY}/examples/gras/mutual_exclusion/simple_token/test_sg_64.tesh) + ADD_TEST(gras-mmrpc-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc --cd ${CMAKE_BINARY_DIR}/examples/gras/mmrpc ${CMAKE_HOME_DIRECTORY}/examples/gras/mmrpc/test_sg_64.tesh) + ADD_TEST(gras-all2all-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) + ADD_TEST(gras-pmm-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) + ADD_TEST(gras-synchro-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) +endif(HAVE_RAWCTX) + ENDIF(${ARCH_32_BITS}) -ADD_TEST(gras-properties-sg-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) -ADD_TEST(gras-properties-sg-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) -ADD_TEST(gras-properties-sg-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) +ADD_TEST(gras-properties-sg-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) +if(HAVE_UCONTEXT_H) + ADD_TEST(gras-properties-sg-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) +endif(HAVE_UCONTEXT_H) +if(HAVE_RAWCTX) + ADD_TEST(gras-properties-sg-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) +endif(HAVE_RAWCTX) # amok examples -ADD_TEST(amok-bandwidth-rl-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_rl.tesh) -ADD_TEST(amok-bandwidth-rl-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_rl.tesh) -ADD_TEST(amok-bandwidth-rl-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_rl.tesh) -ADD_TEST(amok-saturate-rl-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_rl.tesh) -ADD_TEST(amok-saturate-rl-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_rl.tesh) -ADD_TEST(amok-saturate-rl-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_rl.tesh) +ADD_TEST(amok-bandwidth-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_rl.tesh) +ADD_TEST(amok-saturate-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_rl.tesh) + IF(${ARCH_32_BITS}) -ADD_TEST(amok-bandwidth-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) -ADD_TEST(amok-bandwidth-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) -ADD_TEST(amok-bandwidth-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) -ADD_TEST(amok-saturate-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) -ADD_TEST(amok-saturate-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) -ADD_TEST(amok-saturate-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) + ADD_TEST(amok-bandwidth-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) + ADD_TEST(amok-saturate-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) + if(HAVE_RAWCTX) + ADD_TEST(amok-bandwidth-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) + ADD_TEST(amok-saturate-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) + endif(HAVE_RAWCTX) + if(HAVE_UCONTEXT_H) + ADD_TEST(amok-bandwidth-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) + ADD_TEST(amok-saturate-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) + endif(HAVE_UCONTEXT_H) ELSE(${ARCH_32_BITS}) -ADD_TEST(amok-bandwidth-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) -ADD_TEST(amok-bandwidth-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) -ADD_TEST(amok-bandwidth-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) -ADD_TEST(amok-saturate-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) -ADD_TEST(amok-saturate-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) -ADD_TEST(amok-saturate-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) + ADD_TEST(amok-bandwidth-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) + ADD_TEST(amok-saturate-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) + if(HAVE_RAWCTX) + ADD_TEST(amok-bandwidth-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) + ADD_TEST(amok-saturate-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) + endif(HAVE_RAWCTX) + if(HAVE_UCONTEXT_H) + ADD_TEST(amok-saturate-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) + ADD_TEST(amok-bandwidth-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) + endif(HAVE_UCONTEXT_H) ENDIF(${ARCH_32_BITS}) # simdag examples -ADD_TEST(simdag-test-simdag-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag.tesh) -ADD_TEST(simdag-test-simdag-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag.tesh) -ADD_TEST(simdag-test-simdag-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag.tesh) -ADD_TEST(simdag-test-simdag2-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag2.tesh) -ADD_TEST(simdag-test-simdag2-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag2.tesh) -ADD_TEST(simdag-test-simdag2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag2.tesh) -ADD_TEST(simdag-test-simdag-seq-access-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_seq_access.tesh) -ADD_TEST(simdag-test-simdag-seq-access-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_seq_access.tesh) -ADD_TEST(simdag-test-simdag-seq-access-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_seq_access.tesh) -ADD_TEST(simdag-test-prop-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/properties/test_prop.tesh) -ADD_TEST(simdag-test-prop-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/properties/test_prop.tesh) -ADD_TEST(simdag-test-prop-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/properties/test_prop.tesh) -ADD_TEST(simdag-minmin-test-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/simdag/scheduling --cd ${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling test_minmin.tesh) -ADD_TEST(simdag-minmin-test-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/simdag/scheduling --cd ${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling test_minmin.tesh) -ADD_TEST(simdag-minmin-test-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/simdag/scheduling --cd ${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling test_minmin.tesh) +ADD_TEST(simdag-test-simdag ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag.tesh) +ADD_TEST(simdag-test-simdag2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag2.tesh) +ADD_TEST(simdag-test-simdag-seq-access ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_seq_access.tesh) +ADD_TEST(simdag-test-prop ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/properties/test_prop.tesh) +ADD_TEST(simdag-minmin-test ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/simdag/scheduling --cd ${CMAKE_HOME_DIRECTORY}/examples/simdag/scheduling test_minmin.tesh) if(HAVE_GTNETS) -ADD_TEST(msg-gtnets-waxman-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) -ADD_TEST(msg-gtnets-waxman-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) -ADD_TEST(msg-gtnets-waxman-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) -ADD_TEST(msg-gtnets-dogbone-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) -ADD_TEST(msg-gtnets-dogbone-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) -ADD_TEST(msg-gtnets-dogbone-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) -ADD_TEST(msg-gtnets-onelink-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) -ADD_TEST(msg-gtnets-onelink-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) -ADD_TEST(msg-gtnets-onelink-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) -ADD_TEST(msg-gtnets-dogbone-lv08-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) -ADD_TEST(msg-gtnets-dogbone-lv08-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) -ADD_TEST(msg-gtnets-dogbone-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) -ADD_TEST(msg-gtnets-onelink-lv08-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) -ADD_TEST(msg-gtnets-onelink-lv08-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) -ADD_TEST(msg-gtnets-onelink-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) -ADD_TEST(msg-gtnets-fullduplex-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-fullduplex.tesh) -ADD_TEST(msg-gtnets-fullduplex-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-fullduplex.tesh) -ADD_TEST(msg-gtnets-fullduplex-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-fullduplex.tesh) +ADD_TEST(msg-gtnets-waxman-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) +ADD_TEST(msg-gtnets-dogbone-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) +ADD_TEST(msg-gtnets-onelink-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) +ADD_TEST(msg-gtnets-dogbone-lv08-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) +ADD_TEST(msg-gtnets-onelink-lv08-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) +ADD_TEST(msg-gtnets-fullduplex-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-fullduplex.tesh) +if(HAVE_UCONTEXT_H) + ADD_TEST(msg-gtnets-waxman-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) + ADD_TEST(msg-gtnets-dogbone-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) + ADD_TEST(msg-gtnets-onelink-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) + ADD_TEST(msg-gtnets-dogbone-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) + ADD_TEST(msg-gtnets-onelink-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) + ADD_TEST(msg-gtnets-fullduplex-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-fullduplex.tesh) +endif(HAVE_UCONTEXT_H) +if(HAVE_RAWCTX) + ADD_TEST(msg-gtnets-waxman-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) + ADD_TEST(msg-gtnets-dogbone-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) + ADD_TEST(msg-gtnets-onelink-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) + ADD_TEST(msg-gtnets-dogbone-lv08-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) + ADD_TEST(msg-gtnets-onelink-lv08-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) + ADD_TEST(msg-gtnets-fullduplex-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-fullduplex.tesh) +endif(HAVE_RAWCTX) + if(HAVE_TRACING) - ADD_TEST(msg-tracing-gtnets-waxman ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-waxman.tesh) - ADD_TEST(msg-tracing-gtnets-dogbone ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-dogbone-gtnets.tesh) - ADD_TEST(msg-tracing-gtnets-onelink ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-gtnets.tesh) - ADD_TEST(msg-tracing-gtnets-dogbone-lv08 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-dogbone-lv08.tesh) - ADD_TEST(msg-tracing-gtnets-onelink-lv08 ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-lv08.tesh) + ADD_TEST(msg-tracing-gtnets-waxman ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-waxman.tesh) + ADD_TEST(msg-tracing-gtnets-dogbone ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-dogbone-gtnets.tesh) + ADD_TEST(msg-tracing-gtnets-onelink ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-gtnets.tesh) + ADD_TEST(msg-tracing-gtnets-dogbone-lv08 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-dogbone-lv08.tesh) + ADD_TEST(msg-tracing-gtnets-onelink-lv08 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-lv08.tesh) endif(HAVE_TRACING) endif(HAVE_GTNETS) +if(HAVE_NS3) +ADD_TEST(msg-ns3-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh) +ADD_TEST(msg-ns3-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh) +ADD_TEST(msg-ns3-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh) +endif(HAVE_NS3) + IF(HAVE_TRACING) - ADD_TEST(tracing-ms ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/ms.tesh) - ADD_TEST(tracing-categories ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/categories.tesh) - ADD_TEST(tracing-volume ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/volume.tesh) - ADD_TEST(tracing-tasks ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/tasks.tesh) - ADD_TEST(tracing-process-migration ${CMAKE_BINARY_DIR}/bin/tesh --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/procmig.tesh) + ADD_TEST(tracing-ms ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/ms.tesh) + ADD_TEST(tracing-categories ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/categories.tesh) + ADD_TEST(tracing-tasks ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/tasks.tesh) + ADD_TEST(tracing-process-migration ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/procmig.tesh) + ADD_TEST(graphicator ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin --cd ${CMAKE_HOME_DIRECTORY}/tools/graphicator graphicator.tesh) ENDIF(HAVE_TRACING) # Lua examples if(HAVE_LUA) -ADD_TEST(lua-masterslave ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_HOME_DIRECTORY}/examples/lua/masterslave master_slave.tesh) -ADD_TEST(lua-mult-matrix ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_HOME_DIRECTORY}/examples/lua/multi_matrix mult_matrix.tesh) -ADD_TEST(lua-masterslave-bypass ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_HOME_DIRECTORY}/examples/lua/console master_slave_bypass.tesh) -ADD_TEST(lua-msg-masterslave-console ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/msg/masterslave --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_console.tesh) +ADD_TEST(lua-masterslave ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_HOME_DIRECTORY}/examples/lua/masterslave master_slave.tesh) +ADD_TEST(lua-mult-matrix ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_HOME_DIRECTORY}/examples/lua/multi_matrix mult_matrix.tesh) +ADD_TEST(lua-masterslave-bypass ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_HOME_DIRECTORY}/examples/lua/console master_slave_bypass.tesh) +ADD_TEST(lua-msg-masterslave-console ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/msg/masterslave --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_console.tesh) set_tests_properties(lua-masterslave PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") set_tests_properties(lua-mult-matrix PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") set_tests_properties(lua-masterslave-bypass PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") set_tests_properties(lua-msg-masterslave-console PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") endif(HAVE_LUA) -add_test(graphicator ${CMAKE_BINARY_DIR}/bin/tesh --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin --cd ${CMAKE_HOME_DIRECTORY}/tools/graphicator graphicator.tesh) - - # END TESH TESTS if(enable_smpi) # smpi examples -ADD_TEST(smpi-bcast-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/bcast.tesh) -ADD_TEST(smpi-bcast-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/bcast.tesh) -ADD_TEST(smpi-bcast-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/bcast.tesh) -ADD_TEST(smpi-reduce-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/reduce.tesh) -ADD_TEST(smpi-reduce-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/reduce.tesh) -ADD_TEST(smpi-reduce-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/reduce.tesh) +ADD_TEST(smpi-bcast-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/bcast.tesh) +ADD_TEST(smpi-reduce-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/reduce.tesh) +if(HAVE_RAWCTX) + ADD_TEST(smpi-bcast-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/bcast.tesh) + ADD_TEST(smpi-reduce-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/reduce.tesh) +endif(HAVE_RAWCTX) +if(HAVE_UCONTEXT_H) + ADD_TEST(smpi-bcast-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/bcast.tesh) + ADD_TEST(smpi-reduce-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/reduce.tesh) +endif(HAVE_UCONTEXT_H) if(HAVE_TRACING) - ADD_TEST(smpi-tracing-ptp ${CMAKE_BINARY_DIR}/bin/tesh --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/smpi_traced.tesh) + ADD_TEST(smpi-tracing-ptp ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/smpi_traced.tesh) endif(HAVE_TRACING) endif(enable_smpi) # examples/msg/mc if(HAVE_MC) -ADD_TEST(mc-bugged1-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) -ADD_TEST(mc-bugged1-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) -ADD_TEST(mc-bugged1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) -ADD_TEST(mc-bugged2-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) -ADD_TEST(mc-bugged2-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) -ADD_TEST(mc-bugged2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) -ADD_TEST(mc-centralized-raw ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) -ADD_TEST(mc-centralized-thread ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) -ADD_TEST(mc-centralized-ucontext ${CMAKE_BINARY_DIR}/bin/tesh --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) +ADD_TEST(mc-bugged1-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) +ADD_TEST(mc-bugged2-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) +ADD_TEST(mc-centralized-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) +if(HAVE_UCONTEXT_H) + ADD_TEST(mc-bugged1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) + ADD_TEST(mc-bugged2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) + ADD_TEST(mc-centralized-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) +endif(HAVE_UCONTEXT_H) +if(HAVE_RAWCTX) + ADD_TEST(mc-bugged1-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) + ADD_TEST(mc-bugged2-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) + ADD_TEST(mc-centralized-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) +endif(HAVE_RAWCTX) endif(HAVE_MC) @@ -407,16 +430,42 @@ endif(HAVE_MC) ### # Amok is broken in RL since before v3.3 (should fix it one day) -set_tests_properties(amok-bandwidth-rl-raw amok-bandwidth-rl-thread amok-bandwidth-rl-ucontext PROPERTIES WILL_FAIL true) -set_tests_properties(amok-saturate-rl-raw amok-saturate-rl-thread amok-saturate-rl-ucontext PROPERTIES WILL_FAIL true) +set_tests_properties(amok-bandwidth-rl amok-saturate-rl PROPERTIES WILL_FAIL true) if(${ARCH_32_BITS}) -set_tests_properties(amok-bandwidth-sg-32-raw amok-bandwidth-sg-32-thread amok-bandwidth-sg-32-ucontext PROPERTIES WILL_FAIL true) -set_tests_properties(amok-saturate-sg-32-raw amok-saturate-sg-32-thread amok-saturate-sg-32-ucontext PROPERTIES WILL_FAIL true) + set_tests_properties(amok-bandwidth-sg-32-thread PROPERTIES WILL_FAIL true) + set_tests_properties(amok-saturate-sg-32-thread PROPERTIES WILL_FAIL true) + if(HAVE_UCONTEXT_H) + set_tests_properties(amok-bandwidth-sg-32-ucontext amok-saturate-sg-32-ucontext PROPERTIES WILL_FAIL true) + endif(HAVE_UCONTEXT_H) + if(HAVE_RAWCTX) + set_tests_properties(amok-bandwidth-sg-32-raw amok-saturate-sg-32-raw PROPERTIES WILL_FAIL true) + endif(HAVE_RAWCTX) else(${ARCH_32_BITS}) -set_tests_properties(amok-bandwidth-sg-64-raw amok-bandwidth-sg-64-thread amok-bandwidth-sg-64-ucontext PROPERTIES WILL_FAIL true) -set_tests_properties(amok-saturate-sg-64-raw amok-saturate-sg-64-thread amok-saturate-sg-64-ucontext PROPERTIES WILL_FAIL true) + set_tests_properties(amok-bandwidth-sg-64-thread PROPERTIES WILL_FAIL true) + set_tests_properties(amok-saturate-sg-64-thread PROPERTIES WILL_FAIL true) + if(HAVE_UCONTEXT_H) + set_tests_properties(amok-bandwidth-sg-64-ucontext amok-saturate-sg-64-ucontext PROPERTIES WILL_FAIL true) + endif(HAVE_UCONTEXT_H) + if(HAVE_RAWCTX) + set_tests_properties(amok-bandwidth-sg-64-raw amok-saturate-sg-64-raw PROPERTIES WILL_FAIL true) + endif(HAVE_RAWCTX) endif(${ARCH_32_BITS}) +# Those tests are broken : set to "fail" for release v3.6 +if(release) +if(HAVE_MC) + set_tests_properties(mc-bugged1-thread PROPERTIES WILL_FAIL true) + set_tests_properties(mc-bugged2-thread PROPERTIES WILL_FAIL true) + set_tests_properties(mc-centralized-thread PROPERTIES WILL_FAIL true) + if(HAVE_UCONTEXT_H) + set_tests_properties(mc-centralized-ucontext PROPERTIES WILL_FAIL true) + endif(HAVE_UCONTEXT_H) + if(HAVE_RAWCTX) + set_tests_properties(mc-centralized-raw PROPERTIES WILL_FAIL true) + endif(HAVE_RAWCTX) +endif(HAVE_MC) +endif(release) + endif(NOT enable_memcheck) ADD_TEST(tesh-simdag-full-links01 ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters.xml FULL_LINK) diff --git a/buildtools/Cmake/AddTestsWin.cmake b/buildtools/Cmake/AddTestsWin.cmake index e50ed697bf..9174abb7ac 100644 --- a/buildtools/Cmake/AddTestsWin.cmake +++ b/buildtools/Cmake/AddTestsWin.cmake @@ -33,7 +33,11 @@ ENABLE_TESTING() ADD_TEST(tesh-msg-get-sender perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite msg/get_sender.tesh) ADD_TEST(tesh-simdag-reinit-costs perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite simdag/network/test_reinit_costs.tesh) ADD_TEST(tesh-simdag-parser perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test.tesh) + +IF(enable_debug) ADD_TEST(tesh-simdag-parser-bogus-symmetric perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) +ENDIF(enable_debug) + ADD_TEST(tesh-simdag-parser-sym-full perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_sym_full.tesh) ADD_TEST(tesh-simdag-flatifier perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh) ADD_TEST(tesh-simdag-full-links perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms get_full_link.tesh) @@ -74,7 +78,6 @@ ADD_TEST(msg-icomms-waitany ${CMAKE_HOME_DIRECTORY}/examples/msg/icomms/peer3 ${ IF(HAVE_TRACING) ADD_TEST(tracing-ms perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/ms.tesh) ADD_TEST(tracing-categories perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/categories.tesh) - ADD_TEST(tracing-volume perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/volume.tesh) ADD_TEST(tracing-tasks perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/tasks.tesh) ADD_TEST(tracing-process-migration perl ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/tesh.pl ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/procmig.tesh) ENDIF(HAVE_TRACING) diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index 43a8707265..57c7461e45 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -3,6 +3,59 @@ ${CMAKE_MODULE_PATH} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Modules ) +# x86_64 +# x86 +# i.86 +IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86") + IF(${ARCH_32_BITS}) + set(PROCESSOR_i686 1) + set(SIMGRID_SYSTEM_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}") + message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}") + ELSE(${ARCH_32_BITS}) + message(STATUS "System processor: amd64") + set(SIMGRID_SYSTEM_PROCESSOR "amd64") + set(PROCESSOR_x86_64 1) + set(PROCESSOR_i686 0) + ENDIF(${ARCH_32_BITS}) + set(HAVE_RAWCTX 1) + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha") + message(STATUS "System processor: alpha") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") + # Subdir is "arm" for both big-endian (arm) and little-endian (armel). + message(STATUS "System processor: arm") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") + # mips* machines are bi-endian mostly so processor does not tell + # endianess of the underlying system. + message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}" "mips" "mipsel" "mipseb") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") + message(STATUS "System processor: ppc64") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") + message(STATUS "System processor: ppc") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc") + # Both flavours can run on the same processor + message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}" "sparc" "sparcv9") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(parisc|hppa)") + message(STATUS "System processor: parisc" "parisc64") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390") + # s390 binaries can run on s390x machines + message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}" "s390" "s390x") + +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh") + message(STATUS "System processor: sh") + +ELSE(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") #PROCESSOR NOT fIND + message(STATUS "PROCESSOR NOT FOUND: ${CMAKE_SYSTEM_PROCESSOR}") + +ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86") + message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}") include(CheckFunctionExists) @@ -14,9 +67,9 @@ include(TestBigEndian) TEST_BIG_ENDIAN(BIGENDIAN) include(FindGraphviz) -if(enable_pcre) include(FindPCRE) -endif(enable_pcre) + +set(HAVE_GTNETS 0) if(enable_gtnets) include(FindGTnets) endif(enable_gtnets) @@ -26,10 +79,15 @@ endif(enable_smpi) if(enable_lua) include(FindLua51Simgrid) endif(enable_lua) +set(HAVE_NS3 0) +if(enable_ns3) + include(FindNS3) +endif(enable_ns3) # Checks for header libraries functions. CHECK_LIBRARY_EXISTS(pthread pthread_create "" pthread) CHECK_LIBRARY_EXISTS(pthread sem_init "" HAVE_SEM_INIT_LIB) +CHECK_LIBRARY_EXISTS(pthread sem_open "" HAVE_SEM_OPEN_LIB) CHECK_LIBRARY_EXISTS(pthread sem_timedwait "" HAVE_SEM_TIMEDWAIT_LIB) CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_MUTEX_TIMEDLOCK_LIB) CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_POSIX_GETTIME) @@ -45,6 +103,7 @@ CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE("windows.h" HAVE_WINDOWS_H) CHECK_INCLUDE_FILE("winsock.h" HAVE_WINSOCK_H) CHECK_INCLUDE_FILE("winsock2.h" HAVE_WINSOCK2_H) +CHECK_INCLUDE_FILE("WinDef.h" HAVE_WINDEF_H) CHECK_INCLUDE_FILE("errno.h" HAVE_ERRNO_H) CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H) CHECK_INCLUDE_FILE("execinfo.h" HAVE_EXECINFO_H) @@ -61,7 +120,6 @@ CHECK_INCLUDE_FILE("ucontext.h" HAVE_UCONTEXT_H) CHECK_INCLUDE_FILE("stdio.h" HAVE_STDIO_H) CHECK_INCLUDE_FILE("linux/futex.h" HAVE_FUTEX_H) - CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) CHECK_FUNCTION_EXISTS(usleep HAVE_USLEEP) CHECK_FUNCTION_EXISTS(getdtablesize HAVE_GETDTABLESIZE) @@ -75,6 +133,22 @@ CHECK_FUNCTION_EXISTS(asprintf HAVE_ASPRINTF) CHECK_FUNCTION_EXISTS(vasprintf HAVE_VASPRINTF) CHECK_FUNCTION_EXISTS(makecontext HAVE_MAKECONTEXT) CHECK_FUNCTION_EXISTS(mmap HAVE_MMAP) +CHECK_FUNCTION_EXISTS(mergesort HAVE_MERGESORT) + +#Check if __thread is defined +exec_program("${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_thread_storage.c" + OUTPUT_VARIABLE HAVE_thread_storage_run) +if(HAVE_thread_storage_run) + set(HAVE_THREAD_LOCAL_STORAGE 0) +else(HAVE_thread_storage_run) + set(HAVE_THREAD_LOCAL_STORAGE 1) +endif(HAVE_thread_storage_run) + +# 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") + 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") if(WIN32) #THOSE FILES ARE FUNCTIONS ARE NOT DETECTED BUT THEY SHOULD... set(HAVE_UCONTEXT_H 1) @@ -131,18 +205,51 @@ elseif(pthread) endif(pthread) if(pthread) - ### HAVE_SEM_INIT + ### Test that we have a way to create semaphores + if(HAVE_SEM_OPEN_LIB) + exec_program("${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_open.c -lpthread -o testprog" + OUTPUT_VARIABLE HAVE_SEM_OPEN_run) + if(HAVE_SEM_OPEN_run) + set(HAVE_SEM_OPEN 0) + message(STATUS "Warning: sem_open not compilable") + else(HAVE_SEM_OPEN_run) + exec_program("./testprog" RETURN_VALUE HAVE_SEM_OPEN_run2 OUTPUT_VARIABLE var_compil) + if(HAVE_SEM_OPEN_run2) + set(HAVE_SEM_OPEN 0) + message(STATUS "Warning: sem_open not executable") + else(HAVE_SEM_OPEN_run2) + set(HAVE_SEM_OPEN 1) + endif(HAVE_SEM_OPEN_run2) + endif(HAVE_SEM_OPEN_run) + else(HAVE_SEM_OPEN_LIB) + set(HAVE_SEM_OPEN 0) + endif(HAVE_SEM_OPEN_LIB) + if(HAVE_SEM_INIT_LIB) - exec_program("${CMAKE_C_COMPILER} -lpthread ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_init.c" OUTPUT_VARIABLE HAVE_SEM_INIT_run) + exec_program("${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_init.c -lpthread -o testprog" + OUTPUT_VARIABLE HAVE_SEM_INIT_run) if(HAVE_SEM_INIT_run) set(HAVE_SEM_INIT 0) + message(STATUS "Warning: sem_init not compilable") else(HAVE_SEM_INIT_run) - set(HAVE_SEM_INIT 1) + exec_program("./testprog" RETURN_VALUE HAVE_SEM_INIT_run OUTPUT_VARIABLE var_compil) + if(HAVE_SEM_INIT_run) + set(HAVE_SEM_INIT 0) + message(STATUS "Warning: sem_init not executable") + else(HAVE_SEM_INIT_run) + set(HAVE_SEM_INIT 1) + endif(HAVE_SEM_INIT_run) endif(HAVE_SEM_INIT_run) + else(HAVE_SEM_INIT_LIB) + set(HAVE_SEM_INIT 0) endif(HAVE_SEM_INIT_LIB) - ### HAVE_SEM_TIMEDWAIT + if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT) + message(FATAL_ERROR "Semaphores are not usable (neither sem_open nor sem_init is both compilable and executable), but they are mandatory to threads (you may need to mount /dev).") + endif(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT) + + ### Test that we have a way to timewait for semaphores if(HAVE_SEM_TIMEDWAIT_LIB) exec_program("${CMAKE_C_COMPILER} -lpthread ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_sem_timedwait.c" OUTPUT_VARIABLE HAVE_SEM_TIMEDWAIT_run) @@ -197,11 +304,12 @@ ELSE(CMAKE_CROSSCOMPILING) file(READ "${simgrid_BINARY_DIR}/conftestval" mcsc) STRING(REPLACE "\n" "" mcsc "${mcsc}") if(mcsc) - set(mcsc "yes") - elseif(mcsc) + set(mcsc "yes") + set(HAVE_UCONTEXT_H 1) + else(mcsc) set(mcsc "no") endif(mcsc) - else(EXISTS "${simgrid_BINARY_DIR}/conftestval" AND COMPILE_mcsc_VAR) + else(EXISTS "${simgrid_BINARY_DIR}/conftestval" AND COMPILE_mcsc_VAR) set(mcsc "no") endif(EXISTS "${simgrid_BINARY_DIR}/conftestval" AND COMPILE_mcsc_VAR) ENDIF(CMAKE_CROSSCOMPILING) @@ -241,38 +349,21 @@ endif(pthread) ############### ## SVN version check ## -if(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn) - find_file(SVN ".svn" ${CMAKE_HOME_DIRECTORY}) - exec_program("svnversion ${CMAKE_HOME_DIRECTORY}" OUTPUT_VARIABLE "SVN_VERSION") - message(STATUS "svn version ${SVN_VERSION}") -else(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn) - exec_program("git config --get svn-remote.svn.url" - OUTPUT_VARIABLE url - RETURN_VALUE ret) -endif(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn) +if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/) +exec_program("git remote | head -n 1" OUTPUT_VARIABLE remote RETURN_VALUE ret) +exec_program("git config --get remote.${remote}.url" OUTPUT_VARIABLE url RETURN_VALUE ret) if(url) exec_program("git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log --oneline -1" OUTPUT_VARIABLE "GIT_VERSION") + message(STATUS "Git version: ${GIT_VERSION}") exec_program("git --git-dir=${CMAKE_HOME_DIRECTORY}/.git log -n 1 --format=%ai ." OUTPUT_VARIABLE "GIT_DATE") - + message(STATUS "Git date: ${GIT_DATE}") string(REGEX REPLACE " .*" "" GIT_VERSION "${GIT_VERSION}") STRING(REPLACE " +0000" "" GIT_DATE ${GIT_DATE}) STRING(REPLACE " " "~" GIT_DATE ${GIT_DATE}) STRING(REPLACE ":" "-" GIT_DATE ${GIT_DATE}) - - exec_program("git svn info" ${CMAKE_HOME_DIRECTORY} - OUTPUT_VARIABLE "GIT_SVN_VERSION") - string(REPLACE "\n" ";" GIT_SVN_VERSION ${GIT_SVN_VERSION}) - foreach(line ${GIT_SVN_VERSION}) - string(REGEX MATCH "^Revision:.*" line_good ${line}) - if(line_good) - string(REPLACE "Revision: " "" - line_good ${line_good}) - set(SVN_VERSION ${line_good}) - endif(line_good) - endforeach(line ${GIT_SVN_VERSION}) endif(url) - +endif(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/) ################################### ## SimGrid and GRAS specific checks @@ -293,6 +384,36 @@ else(BIGENDIAN) set(GRAS_BIGENDIAN 0) endif(BIGENDIAN) +# The syntax of this magic string is given in src/gras/DataDesc/ddt_convert.c +# It kinda matches the values that the gras_arch_desc_t structure can take + +# Basically, the syntax is one char l or B for endianness (little or Big) +# then there is a bunch of blocks separated by _. +# C block is for char, I block for integers, P block for pointers and +# D block for floating points +# For each block there is an amount of chuncks separated by :, each of +# them describing a data size. For example there is only one chunk +# in the char block, because no architecture provide several sizes +# of chars. In integer block, there is 4 chunks: "short int", "int", +# "long int", "long long int". There is 2 pointer chunks for data +# pointers and pointers on functions (thanks to the AMD64 madness). +# Thee two floating points chuncks are for "float" and "double". +# Each chunk is of the form datasize/minimal_alignment_size + +# These informations are used to convert a data stream from one +# formalism to another. Only the GRAS_ARCH is transfered in the +# stream, and it it of cruxial importance to keep these detection +# information here synchronized with the data hardcoded in the +# source in src/gras/DataDesc/ddt_convert.c + +# If you add something here (like a previously unknown architecture), +# please add it to the source code too. +# Please do not modify stuff here since it'd break the GRAS protocol. +# If you really need to change stuff, please also bump +# GRAS_PROTOCOL_VERSION in src/gras/Msg/msg_interface.h + +SET(GRAS_THISARCH "none") + if(val_big MATCHES "l_C:1/1:_I:2/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1:") #gras_arch=0; gras_size=32; gras_arch_name=little32_1; SET(GRAS_ARCH_32_BITS 1) @@ -318,38 +439,47 @@ if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") SET(GRAS_ARCH_32_BITS 0) SET(GRAS_THISARCH 4) endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") +if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8:") + #gras_arch=5; gras_size=64; gras_arch_name=little64_2; + SET(GRAS_ARCH_32_BITS 0) + SET(GRAS_THISARCH 5) +endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8:") if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:") - #gras_arch=5; gras_size=32; gras_arch_name=big32; + #gras_arch=6; gras_size=32; gras_arch_name=big32_8; SET(GRAS_ARCH_32_BITS 1) - SET(GRAS_THISARCH 5) + SET(GRAS_THISARCH 6) endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:") if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:") - #gras_arch=6; gras_size=32; gras_arch_name=big32_8_4; + #gras_arch=7; gras_size=32; gras_arch_name=big32_8_4; SET(GRAS_ARCH_32_BITS 1) - SET(GRAS_THISARCH 6) + SET(GRAS_THISARCH 7) endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:") if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:") - #gras_arch=7; gras_size=32; gras_arch_name=big32_4; + #gras_arch=8; gras_size=32; gras_arch_name=big32_4; SET(GRAS_ARCH_32_BITS 1) - SET(GRAS_THISARCH 7) + SET(GRAS_THISARCH 8) endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:") if(val_big MATCHES "B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:") - #gras_arch=8; gras_size=32; gras_arch_name=big32_2; + #gras_arch=9; gras_size=32; gras_arch_name=big32_2; SET(GRAS_ARCH_32_BITS 1) - SET(GRAS_THISARCH 8) + SET(GRAS_THISARCH 9) endif(val_big MATCHES "B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:") if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") - #gras_arch=9; gras_size=64; gras_arch_name=big64; + #gras_arch=10; gras_size=64; gras_arch_name=big64; SET(GRAS_ARCH_32_BITS 0) - SET(GRAS_THISARCH 9) + SET(GRAS_THISARCH 10) endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:") - #gras_arch=10;gras_size=64; gras_arch_name=big64_8_4; + #gras_arch=11; gras_size=64; gras_arch_name=big64_8_4; SET(GRAS_ARCH_32_BITS 0) - SET(GRAS_THISARCH 10) + SET(GRAS_THISARCH 11) endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:") +if(GRAS_THISARCH MATCHES "none") + message(STATUS "architecture: ${val_big}") + message(FATAL_ERROR "GRAS_THISARCH is empty: '${GRAS_THISARCH}'") +endif(GRAS_THISARCH MATCHES "none") # Check architecture signature end try_run(RUN_GRAS_VAR COMPILE_GRAS_VAR @@ -377,7 +507,7 @@ set(makecontext_CPPFLAGS_2 "") if(HAVE_MAKECONTEXT OR WIN32) set(makecontext_CPPFLAGS "-DTEST_makecontext") if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - set(makecontext_CPPFLAGS_2 "-DOSX") + set(makecontext_CPPFLAGS_2 "-D_XOPEN_SOURCE") endif(CMAKE_SYSTEM_NAME MATCHES "Darwin") if(WIN32 AND __VISUALC__) @@ -481,9 +611,9 @@ foreach(fct ${diff_va}) } va_end(ap); } - int main(int argc, char *argv[]) + int main(void) { - test("test", 1, 2, 3, 4, 5, 6, 7, 8, 9); + test(\"test\", 1, 2, 3, 4, 5, 6, 7, 8, 9); exit(0); }" ) @@ -618,6 +748,16 @@ if(ADDR2LINE) set(ADDR2LINE "${ADDR2LINE}/addr2line") endif(ADDR2LINE) + + +### Check if OSX can compile with ucontext (with gcc 4.[1-5] it is broken) +if(APPLE) + if(APPLE_NEED_GCC_VERSION GREATER COMPILER_C_VERSION_MAJOR_MINOR) + message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)") + set(HAVE_UCONTEXT_H 0) + endif(APPLE_NEED_GCC_VERSION GREATER COMPILER_C_VERSION_MAJOR_MINOR) +endif(APPLE) + ### File to create configure_file("${CMAKE_HOME_DIRECTORY}/src/context_sysv_config.h.in" "${CMAKE_BINARY_DIR}/src/context_sysv_config.h" @ONLY IMMEDIATE) @@ -635,7 +775,7 @@ set(includedir ${CMAKE_INSTALL_PREFIX}/include) set(top_builddir ${CMAKE_HOME_DIRECTORY}) set(libdir ${exec_prefix}/lib) set(CMAKE_LINKARGS "${CMAKE_BINARY_DIR}/lib") -set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:${GTNETS_LIB_PATH}:$LD_LIBRARY_PATH") +set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH") configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/smpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/smpif.h @ONLY) configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpicc.in ${CMAKE_BINARY_DIR}/bin/smpicc @ONLY) @@ -648,11 +788,19 @@ exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpif2c" OUTPUT_VARIABLE OKITO exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff" OUTPUT_VARIABLE OKITOKI) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun" OUTPUT_VARIABLE OKITOKI) -set(generate_files_to_clean -${CMAKE_BINARY_DIR}/src/context_sysv_config.h -${CMAKE_BINARY_DIR}/src/gras_config.h -${CMAKE_BINARY_DIR}/include/simgrid_config.h -${CMAKE_BINARY_DIR}/include/smpi/smpif.h +set(generated_headers_to_install + ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/smpif.h + ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h +) + +set(generated_headers + ${CMAKE_CURRENT_BINARY_DIR}/src/context_sysv_config.h + ${CMAKE_CURRENT_BINARY_DIR}/src/gras_config.h +) + +set(generated_files_to_clean +${generated_headers} +${generated_headers_to_install} ${CMAKE_BINARY_DIR}/bin/smpicc ${CMAKE_BINARY_DIR}/bin/smpif2c ${CMAKE_BINARY_DIR}/bin/smpiff @@ -670,14 +818,24 @@ else("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/hostfile ${CMAKE_BINARY_DIR}/examples/smpi/hostfile COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/small_platform.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform.xml COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/small_platform_with_routers.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform_with_routers.xml COPYONLY) + configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/tracing/platform.xml ${CMAKE_BINARY_DIR}/examples/msg/tracing/platform.xml COPYONLY) - set(generate_files_to_clean - ${generate_files_to_clean} + set(generated_files_to_clean + ${generated_files_to_clean} ${CMAKE_BINARY_DIR}/examples/smpi/hostfile ${CMAKE_BINARY_DIR}/examples/msg/small_platform.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform_with_routers.xml + ${CMAKE_BINARY_DIR}/examples/msg/tracing/platform.xml ) endif("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES -"${generate_files_to_clean}") +"${generated_files_to_clean}") + + +IF(${ARCH_32_BITS}) + set(WIN_ARCH "32") +ELSE(${ARCH_32_BITS}) + set(WIN_ARCH "64") +ENDIF(${ARCH_32_BITS}) +configure_file("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/simgrid.nsi.in" "${CMAKE_BINARY_DIR}/simgrid.nsi" @ONLY IMMEDIATE) diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index e443309bc2..c43b79afd2 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -8,7 +8,6 @@ set(EXTRA_DIST src/xbt/fifo_private.h src/xbt/graph_private.h src/xbt/graphxml_parse.c - src/xbt/graphxml.l src/xbt/graphxml.c src/xbt/graphxml.dtd src/xbt/log_private.h @@ -40,7 +39,6 @@ set(EXTRA_DIST src/surf/trace_mgr_private.h src/surf/surf_private.h src/surf/surfxml_parse.c - src/surf/simgrid_dtd.l src/surf/simgrid_dtd.c src/surf/simgrid.dtd src/surf/network_private.h @@ -49,6 +47,7 @@ set(EXTRA_DIST src/surf/gtnets/gtnets_simulator.h src/surf/gtnets/gtnets_topology.h src/surf/cpu_ti_private.h + src/surf/surf_routing_private.h src/include/surf/surf_resource.h src/include/surf/datatypes.h src/include/surf/maxmin.h @@ -67,7 +66,6 @@ set(EXTRA_DIST src/msg/mailbox.h src/simdag/private.h src/simdag/dax.dtd - src/simdag/dax_dtd.l src/simdag/dax_dtd.h src/simdag/dax_dtd.c src/gras/DataDesc/ddt_parse.yy.l @@ -90,6 +88,20 @@ set(EXTRA_DIST src/smpi/smpi_mpi_dt_private.h src/smpi/README src/mk_supernovae.pl + + examples/gras/ping/ping.h + examples/gras/console/ping.h + examples/gras/mmrpc/mmrpc.h + + tools/gras/gras_stub_generator.h + tools/tesh/run_context.h + tools/tesh/tesh.h + + src/surf/network_ns3_private.h + src/surf/ns3/ns3_interface.h + src/surf/ns3/ns3_simulator.h + src/surf/ns3/my-point-to-point-helper.h + src/surf/ns3/red-queue.h ) set(XBT_RL_SRC @@ -183,10 +195,23 @@ set(GTNETS_SRC src/surf/network_gtnets.c ) +set(NS3_SRC + src/surf/network_ns3.c + src/surf/ns3/ns3_interface.cc + src/surf/ns3/ns3_simulator.cc + src/surf/ns3/red-queue.cc + src/surf/ns3/my-point-to-point-helper.cc +) + set(SURF_SRC src/surf/surf_model.c src/surf/surf_action.c src/surf/surf_routing.c + src/surf/surf_routing_full.c + src/surf/surf_routing_floyd.c + src/surf/surf_routing_rulebased.c + src/surf/surf_routing_dijkstra.c + src/surf/surf_routing_none.c src/surf/surf_config.c src/surf/maxmin.c src/surf/fair_bottleneck.c @@ -307,8 +332,6 @@ set(TRACING_SRC src/instr/instr_paje_trace.c src/instr/instr_msg_task.c src/instr/instr_msg_process.c - src/instr/instr_msg_volume.c - src/instr/instr_smx.c src/instr/instr_surf.c src/instr/instr_smpi.c src/instr/instr_simdag.c @@ -344,7 +367,7 @@ set(RNGSTREAM_SRC src/rngstreams/RngStream.c ) -set(install_HEADERS +set(headers_to_install include/xbt/misc.h include/xbt/sysdep.h include/xbt/virtu.h @@ -364,6 +387,7 @@ set(install_HEADERS include/xbt/graph.h include/xbt/fifo.h include/xbt/swag.h + include/xbt/lib.h include/xbt/matrix.h include/xbt/peer.h include/xbt/config.h @@ -384,11 +408,12 @@ set(install_HEADERS include/simdag/simdag.h include/simdag/datatypes.h include/smpi/smpi.h - ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/smpif.h include/smpi/mpi.h include/smpi/mpif.h + include/smpi/smpi_cocci.h include/surf/surfxml_parse.h include/surf/simgrid_dtd.h + include/surf/surf_routing.h include/gras/datadesc.h include/gras/transport.h include/gras/virtu.h @@ -400,13 +425,16 @@ set(install_HEADERS include/amok/peermanagement.h include/amok/bandwidth.h include/instr/instr.h - ${CMAKE_CURRENT_BINARY_DIR}/include/simgrid_config.h include/gras.h include/xbt.h include/simix/simix.h include/simix/datatypes.h include/simix/context.h ) +set(source_of_generated_headers + include/simgrid_config.h.in + include/smpi/smpif.h.in + src/context_sysv_config.h.in) ### depend of some variables setted upper # -->CONTEXT_THREADS CONTEXT_UCONTEXT @@ -472,6 +500,13 @@ if(HAVE_MC) ) endif(HAVE_MC) +if(HAVE_NS3) + set(simgrid_sources + ${simgrid_sources} + ${NS3_SRC} + ) +endif(HAVE_NS3) + # WINDOWS if(WIN32) set(simgrid_sources @@ -514,13 +549,20 @@ file(GLOB_RECURSE examples_to_install_in_doc "examples/*README" ) + + set(DOC_SOURCES - doc/contrib.doc - doc/FAQ.doc + doc/installSimgrid.doc + doc/bindings.doc + doc/options.doc + doc/use.doc + doc/tracing.doc + doc/pls.doc doc/gtut-howto-design.doc doc/gtut-howto.doc doc/gtut-introduction.doc doc/gtut-main.doc + doc/gtut-tour-00-install.doc doc/gtut-tour-01-bones.doc doc/gtut-tour-02-simple.doc doc/gtut-tour-03-args.doc @@ -539,7 +581,7 @@ set(DOC_SOURCES doc/gtut-tour-16-exchangecb.doc doc/gtut-tour.doc doc/gtut-tour-recap-messages.doc - doc/history.doc + #doc/index-API.doc doc/index.doc doc/module-amok.doc @@ -549,8 +591,6 @@ set(DOC_SOURCES doc/modules.doc doc/module-surf.doc doc/module-xbt.doc - doc/people.doc - doc/publis.doc doc/gtut-files/01-bones.c doc/gtut-files/01-bones.output @@ -591,20 +631,20 @@ set(DOC_SOURCES doc/webcruft/Paje_MSG_screenshot.jpg doc/webcruft/Paje_MSG_screenshot_thn.jpg doc/webcruft/poster_thumbnail.png - doc/webcruft/robots.txt doc/webcruft/simgrid_logo.png doc/webcruft/simgrid_logo_small.png + doc/triva-graph_configuration.png + doc/triva-graph_visualization.png + doc/simgrid.css doc/Doxyfile.in doc/footer.html.in - tools/doxygen/bibtex2html_table_count.pl tools/doxygen/doxygen_postprocesser.pl tools/doxygen/index_create.pl tools/doxygen/toc_create.pl tools/doxygen/bibtex2html_wrapper.pl tools/doxygen/fig2dev_postprocessor.pl - tools/doxygen/index_php.pl tools/doxygen/xbt_log_extract_hierarchy.pl ) @@ -647,17 +687,6 @@ set(add_src_files src/simix/smx_context_sysv_private.h ) -file(GLOB_RECURSE include_files -"include/*.h" -"teshsuite/*.h" -"testsuite/*.h" -"tools/*.h" -"examples/*.h" -"examples/*.hpp" -"src/*.h.in" -"include/*.h.in" -) - file(GLOB_RECURSE xml_files "examples/*.xml" "include/*.xml" @@ -681,13 +710,8 @@ set(txt_files "testsuite/surf/trace_A.txt" "testsuite/surf/trace_B.txt" "examples/smpi/hostfile" -"examples/msg/procmig.trace" -"examples/msg/volume.trace" -"examples/msg/ms.trace" "examples/msg/trace/file.trace" "examples/msg/link5_state.trace" -"examples/msg/categories.trace" -"examples/msg/tasks.trace" "examples/msg/fafard_state.trace" "examples/msg/jupiter_state.trace" "examples/msg/actions/actions_allReduce.txt" @@ -713,6 +737,10 @@ set(txt_files "teshsuite/gras/small_sleep/test_sg_64.tesh" "teshsuite/simdag/platforms/bob.fail" "teshsuite/simdag/platforms/bob.trace" +"teshsuite/simdag/platforms/bob0_availability_file.trace" +"teshsuite/simdag/platforms/bob0_state_file.trace" +"teshsuite/simdag/platforms/bob2_availability_file.trace" +"teshsuite/simdag/platforms/bob2_state_file.trace" "teshsuite/simdag/platforms/link1.bw" "teshsuite/simdag/platforms/link1.fail" "teshsuite/simdag/platforms/link1.lat" @@ -769,6 +797,7 @@ file(GLOB_RECURSE README_files string(REPLACE "${CMAKE_HOME_DIRECTORY}/" "" README_files "${README_files}") file(GLOB_RECURSE CMAKE_SOURCE_FILES +"buildtools/Cmake/Makefile.default" "buildtools/Cmake/test_java.sh" "buildtools/Cmake/*.cmake" "buildtools/Cmake/*.h.in" @@ -785,14 +814,17 @@ tools/simgrid_update_xml.pl buildtools/Cmake/tesh.pl ) -# This is the complete lise of what will be added to the source archive +# This is the complete list of what will be added to the source archive set(source_to_pack + ${headers_to_install} + ${source_of_generated_headers} ${XBT_RL_SRC} ${EXTRA_DIST} ${SMPI_SRC} ${GRAS_RL_SRC} ${XBT_SRC} ${GTNETS_SRC} + ${NS3_SRC} ${SURF_SRC} ${SIMIX_SRC} ${TRACING_SRC} @@ -806,14 +838,13 @@ set(source_to_pack ${JEDULE_SRC} ${RNGSTREAM_SRC} ${add_src_files} - ${include_files} ${xml_files} ${tesh_files} ${txt_files} - ${EXTRA_DIST} ${CMAKE_SOURCE_FILES} ${bin_files} ${DOC_SOURCES} ${DOC_FIGS} ${README_files} + buildtools/Cmake/simgrid.nsi.in ) diff --git a/buildtools/Cmake/Diff.pm b/buildtools/Cmake/Diff.pm new file mode 100644 index 0000000000..5069c220dc --- /dev/null +++ b/buildtools/Cmake/Diff.pm @@ -0,0 +1,1713 @@ +package Diff; +# Skip to first "=head" line for documentation. +use strict; + +use integer; # see below in _replaceNextLargerWith() for mod to make + # if you don't use this +use vars qw( $VERSION @EXPORT_OK ); +$VERSION = 1.19_02; +# ^ ^^ ^^-- Incremented at will +# | \+----- Incremented for non-trivial changes to features +# \-------- Incremented for fundamental changes +require Exporter; +*import = \&Exporter::import; +@EXPORT_OK = qw( + prepare LCS LCSidx LCS_length + diff sdiff compact_diff + traverse_sequences traverse_balanced +); + +# McIlroy-Hunt diff algorithm +# Adapted from the Smalltalk code of Mario I. Wolczko, +# by Ned Konz, perl@bike-nomad.com +# Updates by Tye McQueen, http://perlmonks.org/?node=tye + +# Create a hash that maps each element of $aCollection to the set of +# positions it occupies in $aCollection, restricted to the elements +# within the range of indexes specified by $start and $end. +# The fourth parameter is a subroutine reference that will be called to +# generate a string to use as a key. +# Additional parameters, if any, will be passed to this subroutine. +# +# my $hashRef = _withPositionsOfInInterval( \@array, $start, $end, $keyGen ); + +sub _withPositionsOfInInterval +{ + my $aCollection = shift; # array ref + my $start = shift; + my $end = shift; + my $keyGen = shift; + my %d; + my $index; + for ( $index = $start ; $index <= $end ; $index++ ) + { + my $element = $aCollection->[$index]; + my $key = &$keyGen( $element, @_ ); + if ( exists( $d{$key} ) ) + { + unshift ( @{ $d{$key} }, $index ); + } + else + { + $d{$key} = [$index]; + } + } + return wantarray ? %d : \%d; +} + +# Find the place at which aValue would normally be inserted into the +# array. If that place is already occupied by aValue, do nothing, and +# return undef. If the place does not exist (i.e., it is off the end of +# the array), add it to the end, otherwise replace the element at that +# point with aValue. It is assumed that the array's values are numeric. +# This is where the bulk (75%) of the time is spent in this module, so +# try to make it fast! + +sub _replaceNextLargerWith +{ + my ( $array, $aValue, $high ) = @_; + $high ||= $#$array; + + # off the end? + if ( $high == -1 || $aValue > $array->[-1] ) + { + push ( @$array, $aValue ); + return $high + 1; + } + + # binary search for insertion point... + my $low = 0; + my $index; + my $found; + while ( $low <= $high ) + { + $index = ( $high + $low ) / 2; + + # $index = int(( $high + $low ) / 2); # without 'use integer' + $found = $array->[$index]; + + if ( $aValue == $found ) + { + return undef; + } + elsif ( $aValue > $found ) + { + $low = $index + 1; + } + else + { + $high = $index - 1; + } + } + + # now insertion point is in $low. + $array->[$low] = $aValue; # overwrite next larger + return $low; +} + +# This method computes the longest common subsequence in $a and $b. + +# Result is array or ref, whose contents is such that +# $a->[ $i ] == $b->[ $result[ $i ] ] +# foreach $i in ( 0 .. $#result ) if $result[ $i ] is defined. + +# An additional argument may be passed; this is a hash or key generating +# function that should return a string that uniquely identifies the given +# element. It should be the case that if the key is the same, the elements +# will compare the same. If this parameter is undef or missing, the key +# will be the element as a string. + +# By default, comparisons will use "eq" and elements will be turned into keys +# using the default stringizing operator '""'. + +# Additional parameters, if any, will be passed to the key generation +# routine. + +sub _longestCommonSubsequence +{ + my $a = shift; # array ref or hash ref + my $b = shift; # array ref or hash ref + my $counting = shift; # scalar + my $keyGen = shift; # code ref + my $compare; # code ref + + if ( ref($a) eq 'HASH' ) + { # prepared hash must be in $b + my $tmp = $b; + $b = $a; + $a = $tmp; + } + + # Check for bogus (non-ref) argument values + if ( !ref($a) || !ref($b) ) + { + my @callerInfo = caller(1); + die 'error: must pass array or hash references to ' . $callerInfo[3]; + } + + # set up code refs + # Note that these are optimized. + if ( !defined($keyGen) ) # optimize for strings + { + $keyGen = sub { $_[0] }; + $compare = sub { my ( $a, $b ) = @_; $a eq $b }; + } + else + { + $compare = sub { + my $a = shift; + my $b = shift; + &$keyGen( $a, @_ ) eq &$keyGen( $b, @_ ); + }; + } + + my ( $aStart, $aFinish, $matchVector ) = ( 0, $#$a, [] ); + my ( $prunedCount, $bMatches ) = ( 0, {} ); + + if ( ref($b) eq 'HASH' ) # was $bMatches prepared for us? + { + $bMatches = $b; + } + else + { + my ( $bStart, $bFinish ) = ( 0, $#$b ); + + # First we prune off any common elements at the beginning + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[$aStart], $b->[$bStart], @_ ) ) + { + $matchVector->[ $aStart++ ] = $bStart++; + $prunedCount++; + } + + # now the end + while ( $aStart <= $aFinish + and $bStart <= $bFinish + and &$compare( $a->[$aFinish], $b->[$bFinish], @_ ) ) + { + $matchVector->[ $aFinish-- ] = $bFinish--; + $prunedCount++; + } + + # Now compute the equivalence classes of positions of elements + $bMatches = + _withPositionsOfInInterval( $b, $bStart, $bFinish, $keyGen, @_ ); + } + my $thresh = []; + my $links = []; + + my ( $i, $ai, $j, $k ); + for ( $i = $aStart ; $i <= $aFinish ; $i++ ) + { + $ai = &$keyGen( $a->[$i], @_ ); + if ( exists( $bMatches->{$ai} ) ) + { + $k = 0; + for $j ( @{ $bMatches->{$ai} } ) + { + + # optimization: most of the time this will be true + if ( $k and $thresh->[$k] > $j and $thresh->[ $k - 1 ] < $j ) + { + $thresh->[$k] = $j; + } + else + { + $k = _replaceNextLargerWith( $thresh, $j, $k ); + } + + # oddly, it's faster to always test this (CPU cache?). + if ( defined($k) ) + { + $links->[$k] = + [ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ]; + } + } + } + } + + if (@$thresh) + { + return $prunedCount + @$thresh if $counting; + for ( my $link = $links->[$#$thresh] ; $link ; $link = $link->[0] ) + { + $matchVector->[ $link->[1] ] = $link->[2]; + } + } + elsif ($counting) + { + return $prunedCount; + } + + return wantarray ? @$matchVector : $matchVector; +} + +sub traverse_sequences +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $callbacks = shift || {}; + my $keyGen = shift; + my $matchCallback = $callbacks->{'MATCH'} || sub { }; + my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; + my $finishedACallback = $callbacks->{'A_FINISHED'}; + my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; + my $finishedBCallback = $callbacks->{'B_FINISHED'}; + my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ ); + + # Process all the lines in @$matchVector + my $lastA = $#$a; + my $lastB = $#$b; + my $bi = 0; + my $ai; + + for ( $ai = 0 ; $ai <= $#$matchVector ; $ai++ ) + { + my $bLine = $matchVector->[$ai]; + if ( defined($bLine) ) # matched + { + &$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine; + &$matchCallback( $ai, $bi++, @_ ); + } + else + { + &$discardACallback( $ai, $bi, @_ ); + } + } + + # The last entry (if any) processed was a match. + # $ai and $bi point just past the last matching lines in their sequences. + + while ( $ai <= $lastA or $bi <= $lastB ) + { + + # last A? + if ( $ai == $lastA + 1 and $bi <= $lastB ) + { + if ( defined($finishedACallback) ) + { + &$finishedACallback( $lastA, @_ ); + $finishedACallback = undef; + } + else + { + &$discardBCallback( $ai, $bi++, @_ ) while $bi <= $lastB; + } + } + + # last B? + if ( $bi == $lastB + 1 and $ai <= $lastA ) + { + if ( defined($finishedBCallback) ) + { + &$finishedBCallback( $lastB, @_ ); + $finishedBCallback = undef; + } + else + { + &$discardACallback( $ai++, $bi, @_ ) while $ai <= $lastA; + } + } + + &$discardACallback( $ai++, $bi, @_ ) if $ai <= $lastA; + &$discardBCallback( $ai, $bi++, @_ ) if $bi <= $lastB; + } + + return 1; +} + +sub traverse_balanced +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $callbacks = shift || {}; + my $keyGen = shift; + my $matchCallback = $callbacks->{'MATCH'} || sub { }; + my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; + my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; + my $changeCallback = $callbacks->{'CHANGE'}; + my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ ); + + # Process all the lines in match vector + my $lastA = $#$a; + my $lastB = $#$b; + my $bi = 0; + my $ai = 0; + my $ma = -1; + my $mb; + + while (1) + { + + # Find next match indices $ma and $mb + do { + $ma++; + } while( + $ma <= $#$matchVector + && !defined $matchVector->[$ma] + ); + + last if $ma > $#$matchVector; # end of matchVector? + $mb = $matchVector->[$ma]; + + # Proceed with discard a/b or change events until + # next match + while ( $ai < $ma || $bi < $mb ) + { + + if ( $ai < $ma && $bi < $mb ) + { + + # Change + if ( defined $changeCallback ) + { + &$changeCallback( $ai++, $bi++, @_ ); + } + else + { + &$discardACallback( $ai++, $bi, @_ ); + &$discardBCallback( $ai, $bi++, @_ ); + } + } + elsif ( $ai < $ma ) + { + &$discardACallback( $ai++, $bi, @_ ); + } + else + { + + # $bi < $mb + &$discardBCallback( $ai, $bi++, @_ ); + } + } + + # Match + &$matchCallback( $ai++, $bi++, @_ ); + } + + while ( $ai <= $lastA || $bi <= $lastB ) + { + if ( $ai <= $lastA && $bi <= $lastB ) + { + + # Change + if ( defined $changeCallback ) + { + &$changeCallback( $ai++, $bi++, @_ ); + } + else + { + &$discardACallback( $ai++, $bi, @_ ); + &$discardBCallback( $ai, $bi++, @_ ); + } + } + elsif ( $ai <= $lastA ) + { + &$discardACallback( $ai++, $bi, @_ ); + } + else + { + + # $bi <= $lastB + &$discardBCallback( $ai, $bi++, @_ ); + } + } + + return 1; +} + +sub prepare +{ + my $a = shift; # array ref + my $keyGen = shift; # code ref + + # set up code ref + $keyGen = sub { $_[0] } unless defined($keyGen); + + return scalar _withPositionsOfInInterval( $a, 0, $#$a, $keyGen, @_ ); +} + +sub LCS +{ + my $a = shift; # array ref + my $b = shift; # array ref or hash ref + my $matchVector = _longestCommonSubsequence( $a, $b, 0, @_ ); + my @retval; + my $i; + for ( $i = 0 ; $i <= $#$matchVector ; $i++ ) + { + if ( defined( $matchVector->[$i] ) ) + { + push ( @retval, $a->[$i] ); + } + } + return wantarray ? @retval : \@retval; +} + +sub LCS_length +{ + my $a = shift; # array ref + my $b = shift; # array ref or hash ref + return _longestCommonSubsequence( $a, $b, 1, @_ ); +} + +sub LCSidx +{ + my $a= shift @_; + my $b= shift @_; + my $match= _longestCommonSubsequence( $a, $b, 0, @_ ); + my @am= grep defined $match->[$_], 0..$#$match; + my @bm= @{$match}[@am]; + return \@am, \@bm; +} + +sub compact_diff +{ + my $a= shift @_; + my $b= shift @_; + my( $am, $bm )= LCSidx( $a, $b, @_ ); + my @cdiff; + my( $ai, $bi )= ( 0, 0 ); + push @cdiff, $ai, $bi; + while( 1 ) { + while( @$am && $ai == $am->[0] && $bi == $bm->[0] ) { + shift @$am; + shift @$bm; + ++$ai, ++$bi; + } + push @cdiff, $ai, $bi; + last if ! @$am; + $ai = $am->[0]; + $bi = $bm->[0]; + push @cdiff, $ai, $bi; + } + push @cdiff, 0+@$a, 0+@$b + if $ai < @$a || $bi < @$b; + return wantarray ? @cdiff : \@cdiff; +} + +sub diff +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $retval = []; + my $hunk = []; + my $discard = sub { + push @$hunk, [ '-', $_[0], $a->[ $_[0] ] ]; + }; + my $add = sub { + push @$hunk, [ '+', $_[1], $b->[ $_[1] ] ]; + }; + my $match = sub { + push @$retval, $hunk + if 0 < @$hunk; + $hunk = [] + }; + traverse_sequences( $a, $b, + { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add }, @_ ); + &$match(); + return wantarray ? @$retval : $retval; +} + +sub sdiff +{ + my $a = shift; # array ref + my $b = shift; # array ref + my $retval = []; + my $discard = sub { push ( @$retval, [ '-', $a->[ $_[0] ], "" ] ) }; + my $add = sub { push ( @$retval, [ '+', "", $b->[ $_[1] ] ] ) }; + my $change = sub { + push ( @$retval, [ 'c', $a->[ $_[0] ], $b->[ $_[1] ] ] ); + }; + my $match = sub { + push ( @$retval, [ 'u', $a->[ $_[0] ], $b->[ $_[1] ] ] ); + }; + traverse_balanced( + $a, + $b, + { + MATCH => $match, + DISCARD_A => $discard, + DISCARD_B => $add, + CHANGE => $change, + }, + @_ + ); + return wantarray ? @$retval : $retval; +} + +######################################## +my $Root= __PACKAGE__; +package Algorithm::Diff::_impl; +use strict; + +sub _Idx() { 0 } # $me->[_Idx]: Ref to array of hunk indices + # 1 # $me->[1]: Ref to first sequence + # 2 # $me->[2]: Ref to second sequence +sub _End() { 3 } # $me->[_End]: Diff between forward and reverse pos +sub _Same() { 4 } # $me->[_Same]: 1 if pos 1 contains unchanged items +sub _Base() { 5 } # $me->[_Base]: Added to range's min and max +sub _Pos() { 6 } # $me->[_Pos]: Which hunk is currently selected +sub _Off() { 7 } # $me->[_Off]: Offset into _Idx for current position +sub _Min() { -2 } # Added to _Off to get min instead of max+1 + +sub Die +{ + require Carp; + Carp::confess( @_ ); +} + +sub _ChkPos +{ + my( $me )= @_; + return if $me->[_Pos]; + my $meth= ( caller(1) )[3]; + Die( "Called $meth on 'reset' object" ); +} + +sub _ChkSeq +{ + my( $me, $seq )= @_; + return $seq + $me->[_Off] + if 1 == $seq || 2 == $seq; + my $meth= ( caller(1) )[3]; + Die( "$meth: Invalid sequence number ($seq); must be 1 or 2" ); +} + +sub getObjPkg +{ + my( $us )= @_; + return ref $us if ref $us; + return $us . "::_obj"; +} + +sub new +{ + my( $us, $seq1, $seq2, $opts ) = @_; + my @args; + for( $opts->{keyGen} ) { + push @args, $_ if $_; + } + for( $opts->{keyGenArgs} ) { + push @args, @$_ if $_; + } + my $cdif= Diff::compact_diff( $seq1, $seq2, @args ); + my $same= 1; + if( 0 == $cdif->[2] && 0 == $cdif->[3] ) { + $same= 0; + splice @$cdif, 0, 2; + } + my @obj= ( $cdif, $seq1, $seq2 ); + $obj[_End] = (1+@$cdif)/2; + $obj[_Same] = $same; + $obj[_Base] = 0; + my $me = bless \@obj, $us->getObjPkg(); + $me->Reset( 0 ); + return $me; +} + +sub Reset +{ + my( $me, $pos )= @_; + $pos= int( $pos || 0 ); + $pos += $me->[_End] + if $pos < 0; + $pos= 0 + if $pos < 0 || $me->[_End] <= $pos; + $me->[_Pos]= $pos || !1; + $me->[_Off]= 2*$pos - 1; + return $me; +} + +sub Base +{ + my( $me, $base )= @_; + my $oldBase= $me->[_Base]; + $me->[_Base]= 0+$base if defined $base; + return $oldBase; +} + +sub Copy +{ + my( $me, $pos, $base )= @_; + my @obj= @$me; + my $you= bless \@obj, ref($me); + $you->Reset( $pos ) if defined $pos; + $you->Base( $base ); + return $you; +} + +sub Next { + my( $me, $steps )= @_; + $steps= 1 if ! defined $steps; + if( $steps ) { + my $pos= $me->[_Pos]; + my $new= $pos + $steps; + $new= 0 if $pos && $new < 0; + $me->Reset( $new ) + } + return $me->[_Pos]; +} + +sub Prev { + my( $me, $steps )= @_; + $steps= 1 if ! defined $steps; + my $pos= $me->Next(-$steps); + $pos -= $me->[_End] if $pos; + return $pos; +} + +sub Diff { + my( $me )= @_; + $me->_ChkPos(); + return 0 if $me->[_Same] == ( 1 & $me->[_Pos] ); + my $ret= 0; + my $off= $me->[_Off]; + for my $seq ( 1, 2 ) { + $ret |= $seq + if $me->[_Idx][ $off + $seq + _Min ] + < $me->[_Idx][ $off + $seq ]; + } + return $ret; +} + +sub Min { + my( $me, $seq, $base )= @_; + $me->_ChkPos(); + my $off= $me->_ChkSeq($seq); + $base= $me->[_Base] if !defined $base; + return $base + $me->[_Idx][ $off + _Min ]; +} + +sub Max { + my( $me, $seq, $base )= @_; + $me->_ChkPos(); + my $off= $me->_ChkSeq($seq); + $base= $me->[_Base] if !defined $base; + return $base + $me->[_Idx][ $off ] -1; +} + +sub Range { + my( $me, $seq, $base )= @_; + $me->_ChkPos(); + my $off = $me->_ChkSeq($seq); + if( !wantarray ) { + return $me->[_Idx][ $off ] + - $me->[_Idx][ $off + _Min ]; + } + $base= $me->[_Base] if !defined $base; + return ( $base + $me->[_Idx][ $off + _Min ] ) + .. ( $base + $me->[_Idx][ $off ] - 1 ); +} + +sub Items { + my( $me, $seq )= @_; + $me->_ChkPos(); + my $off = $me->_ChkSeq($seq); + if( !wantarray ) { + return $me->[_Idx][ $off ] + - $me->[_Idx][ $off + _Min ]; + } + return + @{$me->[$seq]}[ + $me->[_Idx][ $off + _Min ] + .. ( $me->[_Idx][ $off ] - 1 ) + ]; +} + +sub Same { + my( $me )= @_; + $me->_ChkPos(); + return wantarray ? () : 0 + if $me->[_Same] != ( 1 & $me->[_Pos] ); + return $me->Items(1); +} + +my %getName; +BEGIN { + %getName= ( + same => \&Same, + diff => \&Diff, + base => \&Base, + min => \&Min, + max => \&Max, + range=> \&Range, + items=> \&Items, # same thing + ); +} + +sub Get +{ + my $me= shift @_; + $me->_ChkPos(); + my @value; + for my $arg ( @_ ) { + for my $word ( split ' ', $arg ) { + my $meth; + if( $word !~ /^(-?\d+)?([a-zA-Z]+)([12])?$/ + || not $meth= $getName{ lc $2 } + ) { + Die( $Root, ", Get: Invalid request ($word)" ); + } + my( $base, $name, $seq )= ( $1, $2, $3 ); + push @value, scalar( + 4 == length($name) + ? $meth->( $me ) + : $meth->( $me, $seq, $base ) + ); + } + } + if( wantarray ) { + return @value; + } elsif( 1 == @value ) { + return $value[0]; + } + Die( 0+@value, " values requested from ", + $Root, "'s Get in scalar context" ); +} + + +my $Obj= getObjPkg($Root); +no strict 'refs'; + +for my $meth ( qw( new getObjPkg ) ) { + *{$Root."::".$meth} = \&{$meth}; + *{$Obj ."::".$meth} = \&{$meth}; +} +for my $meth ( qw( + Next Prev Reset Copy Base Diff + Same Items Range Min Max Get + _ChkPos _ChkSeq +) ) { + *{$Obj."::".$meth} = \&{$meth}; +} + +1; +__END__ + +=head1 NAME + +Algorithm::Diff - Compute `intelligent' differences between two files / lists + +=head1 SYNOPSIS + + require Algorithm::Diff; + + # This example produces traditional 'diff' output: + + my $diff = Algorithm::Diff->new( \@seq1, \@seq2 ); + + $diff->Base( 1 ); # Return line numbers, not indices + while( $diff->Next() ) { + next if $diff->Same(); + my $sep = ''; + if( ! $diff->Items(2) ) { + printf "%d,%dd%d\n", + $diff->Get(qw( Min1 Max1 Max2 )); + } elsif( ! $diff->Items(1) ) { + printf "%da%d,%d\n", + $diff->Get(qw( Max1 Min2 Max2 )); + } else { + $sep = "---\n"; + printf "%d,%dc%d,%d\n", + $diff->Get(qw( Min1 Max1 Min2 Max2 )); + } + print "< $_" for $diff->Items(1); + print $sep; + print "> $_" for $diff->Items(2); + } + + + # Alternate interfaces: + + use Algorithm::Diff qw( + LCS LCS_length LCSidx + diff sdiff compact_diff + traverse_sequences traverse_balanced ); + + @lcs = LCS( \@seq1, \@seq2 ); + $lcsref = LCS( \@seq1, \@seq2 ); + $count = LCS_length( \@seq1, \@seq2 ); + + ( $seq1idxref, $seq2idxref ) = LCSidx( \@seq1, \@seq2 ); + + + # Complicated interfaces: + + @diffs = diff( \@seq1, \@seq2 ); + + @sdiffs = sdiff( \@seq1, \@seq2 ); + + @cdiffs = compact_diff( \@seq1, \@seq2 ); + + traverse_sequences( + \@seq1, + \@seq2, + { MATCH => \&callback1, + DISCARD_A => \&callback2, + DISCARD_B => \&callback3, + }, + \&key_generator, + @extra_args, + ); + + traverse_balanced( + \@seq1, + \@seq2, + { MATCH => \&callback1, + DISCARD_A => \&callback2, + DISCARD_B => \&callback3, + CHANGE => \&callback4, + }, + \&key_generator, + @extra_args, + ); + + +=head1 INTRODUCTION + +(by Mark-Jason Dominus) + +I once read an article written by the authors of C; they said +that they worked very hard on the algorithm until they found the +right one. + +I think what they ended up using (and I hope someone will correct me, +because I am not very confident about this) was the `longest common +subsequence' method. In the LCS problem, you have two sequences of +items: + + a b c d f g h j q z + + a b c d e f g i j k r x y z + +and you want to find the longest sequence of items that is present in +both original sequences in the same order. That is, you want to find +a new sequence I which can be obtained from the first sequence by +deleting some items, and from the secend sequence by deleting other +items. You also want I to be as long as possible. In this case I +is + + a b c d f g j z + +From there it's only a small step to get diff-like output: + + e h i k q r x y + + - + + - + + + + +This module solves the LCS problem. It also includes a canned function +to generate C-like output. + +It might seem from the example above that the LCS of two sequences is +always pretty obvious, but that's not always the case, especially when +the two sequences have many repeated elements. For example, consider + + a x b y c z p d q + a b c a x b y c z + +A naive approach might start by matching up the C and C that +appear at the beginning of each sequence, like this: + + a x b y c z p d q + a b c a b y c z + +This finds the common subsequence C. But actually, the LCS +is C: + + a x b y c z p d q + a b c a x b y c z + +or + + a x b y c z p d q + a b c a x b y c z + +=head1 USAGE + +(See also the README file and several example +scripts include with this module.) + +This module now provides an object-oriented interface that uses less +memory and is easier to use than most of the previous procedural +interfaces. It also still provides several exportable functions. We'll +deal with these in ascending order of difficulty: C, +C, C, OO interface, C, C, C, +C, and C. + +=head2 C + +Given references to two lists of items, LCS returns an array containing +their longest common subsequence. In scalar context, it returns a +reference to such a list. + + @lcs = LCS( \@seq1, \@seq2 ); + $lcsref = LCS( \@seq1, \@seq2 ); + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + + @lcs = LCS( \@seq1, \@seq2, \&keyGen, @args ); + $lcsref = LCS( \@seq1, \@seq2, \&keyGen, @args ); + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + +This is just like C except it only returns the length of the +longest common subsequence. This provides a performance gain of about +9% compared to C. + +=head2 C + +Like C except it returns references to two arrays. The first array +contains the indices into @seq1 where the LCS items are located. The +second array contains the indices into @seq2 where the LCS items are located. + +Therefore, the following three lists will contain the same values: + + my( $idx1, $idx2 ) = LCSidx( \@seq1, \@seq2 ); + my @list1 = @seq1[ @$idx1 ]; + my @list2 = @seq2[ @$idx2 ]; + my @list3 = LCS( \@seq1, \@seq2 ); + +=head2 C + + $diff = Algorithm::Diffs->new( \@seq1, \@seq2 ); + $diff = Algorithm::Diffs->new( \@seq1, \@seq2, \%opts ); + +C computes the smallest set of additions and deletions necessary +to turn the first sequence into the second and compactly records them +in the object. + +You use the object to iterate over I, where each hunk represents +a contiguous section of items which should be added, deleted, replaced, +or left unchanged. + +=over 4 + +The following summary of all of the methods looks a lot like Perl code +but some of the symbols have different meanings: + + [ ] Encloses optional arguments + : Is followed by the default value for an optional argument + | Separates alternate return results + +Method summary: + + $obj = Algorithm::Diff->new( \@seq1, \@seq2, [ \%opts ] ); + $pos = $obj->Next( [ $count : 1 ] ); + $revPos = $obj->Prev( [ $count : 1 ] ); + $obj = $obj->Reset( [ $pos : 0 ] ); + $copy = $obj->Copy( [ $pos, [ $newBase ] ] ); + $oldBase = $obj->Base( [ $newBase ] ); + +Note that all of the following methods C if used on an object that +is "reset" (not currently pointing at any hunk). + + $bits = $obj->Diff( ); + @items|$cnt = $obj->Same( ); + @items|$cnt = $obj->Items( $seqNum ); + @idxs |$cnt = $obj->Range( $seqNum, [ $base ] ); + $minIdx = $obj->Min( $seqNum, [ $base ] ); + $maxIdx = $obj->Max( $seqNum, [ $base ] ); + @values = $obj->Get( @names ); + +Passing in C for an optional argument is always treated the same +as if no argument were passed in. + +=item C + + $pos = $diff->Next(); # Move forward 1 hunk + $pos = $diff->Next( 2 ); # Move forward 2 hunks + $pos = $diff->Next(-5); # Move backward 5 hunks + +C moves the object to point at the next hunk. The object starts +out "reset", which means it isn't pointing at any hunk. If the object +is reset, then C moves to the first hunk. + +C returns a true value iff the move didn't go past the last hunk. +So C will return true iff the object is not reset. + +Actually, C returns the object's new position, which is a number +between 1 and the number of hunks (inclusive), or returns a false value. + +=item C + +C is almost identical to C; it moves to the $Nth +previous hunk. On a 'reset' object, C [and C] move +to the last hunk. + +The position returned by C is relative to the I of the +hunks; -1 for the last hunk, -2 for the second-to-last, etc. + +=item C + + $diff->Reset(); # Reset the object's position + $diff->Reset($pos); # Move to the specified hunk + $diff->Reset(1); # Move to the first hunk + $diff->Reset(-1); # Move to the last hunk + +C returns the object, so, for example, you could use +C<< $diff->Reset()->Next(-1) >> to get the number of hunks. + +=item C + + $copy = $diff->Copy( $newPos, $newBase ); + +C returns a copy of the object. The copy and the orignal object +share most of their data, so making copies takes very little memory. +The copy maintains its own position (separate from the original), which +is the main purpose of copies. It also maintains its own base. + +By default, the copy's position starts out the same as the original +object's position. But C takes an optional first argument to set the +new position, so the following three snippets are equivalent: + + $copy = $diff->Copy($pos); + + $copy = $diff->Copy(); + $copy->Reset($pos); + + $copy = $diff->Copy()->Reset($pos); + +C takes an optional second argument to set the base for +the copy. If you wish to change the base of the copy but leave +the position the same as in the original, here are two +equivalent ways: + + $copy = $diff->Copy(); + $copy->Base( 0 ); + + $copy = $diff->Copy(undef,0); + +Here are two equivalent way to get a "reset" copy: + + $copy = $diff->Copy(0); + + $copy = $diff->Copy()->Reset(); + +=item C + + $bits = $obj->Diff(); + +C returns a true value iff the current hunk contains items that are +different between the two sequences. It actually returns one of the +follow 4 values: + +=over 4 + +=item 3 + +C<3==(1|2)>. This hunk contains items from @seq1 and the items +from @seq2 that should replace them. Both sequence 1 and 2 +contain changed items so both the 1 and 2 bits are set. + +=item 2 + +This hunk only contains items from @seq2 that should be inserted (not +items from @seq1). Only sequence 2 contains changed items so only the 2 +bit is set. + +=item 1 + +This hunk only contains items from @seq1 that should be deleted (not +items from @seq2). Only sequence 1 contains changed items so only the 1 +bit is set. + +=item 0 + +This means that the items in this hunk are the same in both sequences. +Neither sequence 1 nor 2 contain changed items so neither the 1 nor the +2 bits are set. + +=back + +=item C + +C returns a true value iff the current hunk contains items that +are the same in both sequences. It actually returns the list of items +if they are the same or an emty list if they aren't. In a scalar +context, it returns the size of the list. + +=item C + + $count = $diff->Items(2); + @items = $diff->Items($seqNum); + +C returns the (number of) items from the specified sequence that +are part of the current hunk. + +If the current hunk contains only insertions, then +C<< $diff->Items(1) >> will return an empty list (0 in a scalar conext). +If the current hunk contains only deletions, then C<< $diff->Items(2) >> +will return an empty list (0 in a scalar conext). + +If the hunk contains replacements, then both C<< $diff->Items(1) >> and +C<< $diff->Items(2) >> will return different, non-empty lists. + +Otherwise, the hunk contains identical items and all of the following +will return the same lists: + + @items = $diff->Items(1); + @items = $diff->Items(2); + @items = $diff->Same(); + +=item C + + $count = $diff->Range( $seqNum ); + @indices = $diff->Range( $seqNum ); + @indices = $diff->Range( $seqNum, $base ); + +C is like C except that it returns a list of I to +the items rather than the items themselves. By default, the index of +the first item (in each sequence) is 0 but this can be changed by +calling the C method. So, by default, the following two snippets +return the same lists: + + @list = $diff->Items(2); + @list = @seq2[ $diff->Range(2) ]; + +You can also specify the base to use as the second argument. So the +following two snippets I return the same lists: + + @list = $diff->Items(1); + @list = @seq1[ $diff->Range(1,0) ]; + +=item C + + $curBase = $diff->Base(); + $oldBase = $diff->Base($newBase); + +C sets and/or returns the current base (usually 0 or 1) that is +used when you request range information. The base defaults to 0 so +that range information is returned as array indices. You can set the +base to 1 if you want to report traditional line numbers instead. + +=item C + + $min1 = $diff->Min(1); + $min = $diff->Min( $seqNum, $base ); + +C returns the first value that C would return (given the +same arguments) or returns C if C would return an empty +list. + +=item C + +C returns the last value that C would return or C. + +=item C + + ( $n, $x, $r ) = $diff->Get(qw( min1 max1 range1 )); + @values = $diff->Get(qw( 0min2 1max2 range2 same base )); + +C returns one or more scalar values. You pass in a list of the +names of the values you want returned. Each name must match one of the +following regexes: + + /^(-?\d+)?(min|max)[12]$/i + /^(range[12]|same|diff|base)$/i + +The 1 or 2 after a name says which sequence you want the information +for (and where allowed, it is required). The optional number before +"min" or "max" is the base to use. So the following equalities hold: + + $diff->Get('min1') == $diff->Min(1) + $diff->Get('0min2') == $diff->Min(2,0) + +Using C in a scalar context when you've passed in more than one +name is a fatal error (C is called). + +=back + +=head2 C + +Given a reference to a list of items, C returns a reference +to a hash which can be used when comparing this sequence to other +sequences with C or C. + + $prep = prepare( \@seq1 ); + for $i ( 0 .. 10_000 ) + { + @lcs = LCS( $prep, $seq[$i] ); + # do something useful with @lcs + } + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + + $prep = prepare( \@seq1, \&keyGen ); + for $i ( 0 .. 10_000 ) + { + @lcs = LCS( $seq[$i], $prep, \&keyGen ); + # do something useful with @lcs + } + +Using C provides a performance gain of about 50% when calling LCS +many times compared with not preparing. + +=head2 C + + @diffs = diff( \@seq1, \@seq2 ); + $diffs_ref = diff( \@seq1, \@seq2 ); + +C computes the smallest set of additions and deletions necessary +to turn the first sequence into the second, and returns a description +of these changes. The description is a list of I; each hunk +represents a contiguous section of items which should be added, +deleted, or replaced. (Hunks containing unchanged items are not +included.) + +The return value of C is a list of hunks, or, in scalar context, a +reference to such a list. If there are no differences, the list will be +empty. + +Here is an example. Calling C for the following two sequences: + + a b c e h j l m n p + b c d e f j k l m r s t + +would produce the following list: + + ( + [ [ '-', 0, 'a' ] ], + + [ [ '+', 2, 'd' ] ], + + [ [ '-', 4, 'h' ], + [ '+', 4, 'f' ] ], + + [ [ '+', 6, 'k' ] ], + + [ [ '-', 8, 'n' ], + [ '-', 9, 'p' ], + [ '+', 9, 'r' ], + [ '+', 10, 's' ], + [ '+', 11, 't' ] ], + ) + +There are five hunks here. The first hunk says that the C at +position 0 of the first sequence should be deleted (C<->). The second +hunk says that the C at position 2 of the second sequence should +be inserted (C<+>). The third hunk says that the C at position 4 +of the first sequence should be removed and replaced with the C +from position 4 of the second sequence. And so on. + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + + @sdiffs = sdiff( \@seq1, \@seq2 ); + $sdiffs_ref = sdiff( \@seq1, \@seq2 ); + +C computes all necessary components to show two sequences +and their minimized differences side by side, just like the +Unix-utility I does: + + same same + before | after + old < - + - > new + +It returns a list of array refs, each pointing to an array of +display instructions. In scalar context it returns a reference +to such a list. If there are no differences, the list will have one +entry per item, each indicating that the item was unchanged. + +Display instructions consist of three elements: A modifier indicator +(C<+>: Element added, C<->: Element removed, C: Element unmodified, +C: Element changed) and the value of the old and new elements, to +be displayed side-by-side. + +An C of the following two sequences: + + a b c e h j l m n p + b c d e f j k l m r s t + +results in + + ( [ '-', 'a', '' ], + [ 'u', 'b', 'b' ], + [ 'u', 'c', 'c' ], + [ '+', '', 'd' ], + [ 'u', 'e', 'e' ], + [ 'c', 'h', 'f' ], + [ 'u', 'j', 'j' ], + [ '+', '', 'k' ], + [ 'u', 'l', 'l' ], + [ 'u', 'm', 'm' ], + [ 'c', 'n', 'r' ], + [ 'c', 'p', 's' ], + [ '+', '', 't' ], + ) + +C may be passed an optional third parameter; this is a CODE +reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation +routine. + +=head2 C + +C is much like C except it returns a much more +compact description consisting of just one flat list of indices. An +example helps explain the format: + + my @a = qw( a b c e h j l m n p ); + my @b = qw( b c d e f j k l m r s t ); + @cdiff = compact_diff( \@a, \@b ); + # Returns: + # @a @b @a @b + # start start values values + ( 0, 0, # = + 0, 0, # a ! + 1, 0, # b c = b c + 3, 2, # ! d + 3, 3, # e = e + 4, 4, # f ! h + 5, 5, # j = j + 6, 6, # ! k + 6, 7, # l m = l m + 8, 9, # n p ! r s t + 10, 12, # + ); + +The 0th, 2nd, 4th, etc. entries are all indices into @seq1 (@a in the +above example) indicating where a hunk begins. The 1st, 3rd, 5th, etc. +entries are all indices into @seq2 (@b in the above example) indicating +where the same hunk begins. + +So each pair of indices (except the last pair) describes where a hunk +begins (in each sequence). Since each hunk must end at the item just +before the item that starts the next hunk, the next pair of indices can +be used to determine where the hunk ends. + +So, the first 4 entries (0..3) describe the first hunk. Entries 0 and 1 +describe where the first hunk begins (and so are always both 0). +Entries 2 and 3 describe where the next hunk begins, so subtracting 1 +from each tells us where the first hunk ends. That is, the first hunk +contains items C<$diff[0]> through C<$diff[2] - 1> of the first sequence +and contains items C<$diff[1]> through C<$diff[3] - 1> of the second +sequence. + +In other words, the first hunk consists of the following two lists of items: + + # 1st pair 2nd pair + # of indices of indices + @list1 = @a[ $cdiff[0] .. $cdiff[2]-1 ]; + @list2 = @b[ $cdiff[1] .. $cdiff[3]-1 ]; + # Hunk start Hunk end + +Note that the hunks will always alternate between those that are part of +the LCS (those that contain unchanged items) and those that contain +changes. This means that all we need to be told is whether the first +hunk is a 'same' or 'diff' hunk and we can determine which of the other +hunks contain 'same' items or 'diff' items. + +By convention, we always make the first hunk contain unchanged items. +So the 1st, 3rd, 5th, etc. hunks (all odd-numbered hunks if you start +counting from 1) all contain unchanged items. And the 2nd, 4th, 6th, +etc. hunks (all even-numbered hunks if you start counting from 1) all +contain changed items. + +Since @a and @b don't begin with the same value, the first hunk in our +example is empty (otherwise we'd violate the above convention). Note +that the first 4 index values in our example are all zero. Plug these +values into our previous code block and we get: + + @hunk1a = @a[ 0 .. 0-1 ]; + @hunk1b = @b[ 0 .. 0-1 ]; + +And C<0..-1> returns the empty list. + +Move down one pair of indices (2..5) and we get the offset ranges for +the second hunk, which contains changed items. + +Since C<@diff[2..5]> contains (0,0,1,0) in our example, the second hunk +consists of these two lists of items: + + @hunk2a = @a[ $cdiff[2] .. $cdiff[4]-1 ]; + @hunk2b = @b[ $cdiff[3] .. $cdiff[5]-1 ]; + # or + @hunk2a = @a[ 0 .. 1-1 ]; + @hunk2b = @b[ 0 .. 0-1 ]; + # or + @hunk2a = @a[ 0 .. 0 ]; + @hunk2b = @b[ 0 .. -1 ]; + # or + @hunk2a = ( 'a' ); + @hunk2b = ( ); + +That is, we would delete item 0 ('a') from @a. + +Since C<@diff[4..7]> contains (1,0,3,2) in our example, the third hunk +consists of these two lists of items: + + @hunk3a = @a[ $cdiff[4] .. $cdiff[6]-1 ]; + @hunk3a = @b[ $cdiff[5] .. $cdiff[7]-1 ]; + # or + @hunk3a = @a[ 1 .. 3-1 ]; + @hunk3a = @b[ 0 .. 2-1 ]; + # or + @hunk3a = @a[ 1 .. 2 ]; + @hunk3a = @b[ 0 .. 1 ]; + # or + @hunk3a = qw( b c ); + @hunk3a = qw( b c ); + +Note that this third hunk contains unchanged items as our convention demands. + +You can continue this process until you reach the last two indices, +which will always be the number of items in each sequence. This is +required so that subtracting one from each will give you the indices to +the last items in each sequence. + +=head2 C + +C used to be the most general facility provided by +this module (the new OO interface is more powerful and much easier to +use). + +Imagine that there are two arrows. Arrow A points to an element of +sequence A, and arrow B points to an element of the sequence B. +Initially, the arrows point to the first elements of the respective +sequences. C will advance the arrows through the +sequences one element at a time, calling an appropriate user-specified +callback function before each advance. It willadvance the arrows in +such a way that if there are equal elements C<$A[$i]> and C<$B[$j]> +which are equal and which are part of the LCS, there will be some moment +during the execution of C when arrow A is pointing +to C<$A[$i]> and arrow B is pointing to C<$B[$j]>. When this happens, +C will call the C callback function and then +it will advance both arrows. + +Otherwise, one of the arrows is pointing to an element of its sequence +that is not part of the LCS. C will advance that +arrow and will call the C or the C callback, +depending on which arrow it advanced. If both arrows point to elements +that are not part of the LCS, then C will advance +one of them and call the appropriate callback, but it is not specified +which it will call. + +The arguments to C are the two sequences to +traverse, and a hash which specifies the callback functions, like this: + + traverse_sequences( + \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + } + ); + +Callbacks for MATCH, DISCARD_A, and DISCARD_B are invoked with at least +the indices of the two arrows as their arguments. They are not expected +to return any values. If a callback is omitted from the table, it is +not called. + +Callbacks for A_FINISHED and B_FINISHED are invoked with at least the +corresponding index in A or B. + +If arrow A reaches the end of its sequence, before arrow B does, +C will call the C callback when it +advances arrow B, if there is such a function; if not it will call +C instead. Similarly if arrow B finishes first. +C returns when both arrows are at the ends of their +respective sequences. It returns true on success and false on failure. +At present there is no way to fail. + +C may be passed an optional fourth parameter; this +is a CODE reference to a key generation function. See L. + +Additional parameters, if any, will be passed to the key generation function. + +If you want to pass additional parameters to your callbacks, but don't +need a custom key generation function, you can get the default by +passing undef: + + traverse_sequences( + \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + }, + undef, # default key-gen + $myArgument1, + $myArgument2, + $myArgument3, + ); + +C does not have a useful return value; you are +expected to plug in the appropriate behavior with the callback +functions. + +=head2 C + +C is an alternative to C. It +uses a different algorithm to iterate through the entries in the +computed LCS. Instead of sticking to one side and showing element changes +as insertions and deletions only, it will jump back and forth between +the two sequences and report I occurring as deletions on one +side followed immediatly by an insertion on the other side. + +In addition to the C, C, and C callbacks +supported by C, C supports +a C callback indicating that one element got C by another: + + traverse_balanced( + \@seq1, \@seq2, + { MATCH => $callback_1, + DISCARD_A => $callback_2, + DISCARD_B => $callback_3, + CHANGE => $callback_4, + } + ); + +If no C callback is specified, C +will map C events to C and C actions, +therefore resulting in a similar behaviour as C +with different order of events. + +C might be a bit slower than C, +noticable only while processing huge amounts of data. + +The C function of this module +is implemented as call to C. + +C does not have a useful return value; you are expected to +plug in the appropriate behavior with the callback functions. + +=head1 KEY GENERATION FUNCTIONS + +Most of the functions accept an optional extra parameter. This is a +CODE reference to a key generating (hashing) function that should return +a string that uniquely identifies a given element. It should be the +case that if two elements are to be considered equal, their keys should +be the same (and the other way around). If no key generation function +is provided, the key will be the element as a string. + +By default, comparisons will use "eq" and elements will be turned into keys +using the default stringizing operator '""'. + +Where this is important is when you're comparing something other than +strings. If it is the case that you have multiple different objects +that should be considered to be equal, you should supply a key +generation function. Otherwise, you have to make sure that your arrays +contain unique references. + +For instance, consider this example: + + package Person; + + sub new + { + my $package = shift; + return bless { name => '', ssn => '', @_ }, $package; + } + + sub clone + { + my $old = shift; + my $new = bless { %$old }, ref($old); + } + + sub hash + { + return shift()->{'ssn'}; + } + + my $person1 = Person->new( name => 'Joe', ssn => '123-45-6789' ); + my $person2 = Person->new( name => 'Mary', ssn => '123-47-0000' ); + my $person3 = Person->new( name => 'Pete', ssn => '999-45-2222' ); + my $person4 = Person->new( name => 'Peggy', ssn => '123-45-9999' ); + my $person5 = Person->new( name => 'Frank', ssn => '000-45-9999' ); + +If you did this: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4, $person5 ]; + Algorithm::Diff::diff( $array1, $array2 ); + +everything would work out OK (each of the objects would be converted +into a string like "Person=HASH(0x82425b0)" for comparison). + +But if you did this: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; + Algorithm::Diff::diff( $array1, $array2 ); + +$person4 and $person4->clone() (which have the same name and SSN) +would be seen as different objects. If you wanted them to be considered +equivalent, you would have to pass in a key generation function: + + my $array1 = [ $person1, $person2, $person4 ]; + my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; + Algorithm::Diff::diff( $array1, $array2, \&Person::hash ); + +This would use the 'ssn' field in each Person as a comparison key, and +so would consider $person4 and $person4->clone() as equal. + +You may also pass additional parameters to the key generation function +if you wish. + +=head1 ERROR CHECKING + +If you pass these routines a non-reference and they expect a reference, +they will die with a message. + +=head1 AUTHOR + +This version released by Tye McQueen (http://perlmonks.org/?node=tye). + +=head1 LICENSE + +Parts Copyright (c) 2000-2004 Ned Konz. All rights reserved. +Parts by Tye McQueen. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl. + +=head1 MAILING LIST + +Mark-Jason still maintains a mailing list. To join a low-volume mailing +list for announcements related to diff and Algorithm::Diff, send an +empty mail message to mjd-perl-diff-request@plover.com. + +=head1 CREDITS + +Versions through 0.59 (and much of this documentation) were written by: + +Mark-Jason Dominus, mjd-perl-diff@plover.com + +This version borrows some documentation and routine names from +Mark-Jason's, but Diff.pm's code was completely replaced. + +This code was adapted from the Smalltalk code of Mario Wolczko +, which is available at +ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st + +C and C were written by Mike Schilli +. + +The algorithm is that described in +I, +CACM, vol.20, no.5, pp.350-353, May 1977, with a few +minor improvements to improve the speed. + +Much work was done by Ned Konz (perl@bike-nomad.com). + +The OO interface and some other changes are by Tye McQueen. + +=cut diff --git a/buildtools/Cmake/Distrib.cmake b/buildtools/Cmake/Distrib.cmake index a17eb4dc33..f32234915a 100644 --- a/buildtools/Cmake/Distrib.cmake +++ b/buildtools/Cmake/Distrib.cmake @@ -14,6 +14,17 @@ install(DIRECTORY "${CMAKE_HOME_DIRECTORY}/doc/html/" PATTERN "*~" EXCLUDE ) +#### Generate the manpages +if( NOT MANPAGE_DIR ) + set( MANPAGE_DIR $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/share/man/share/man/man1 ) +endif( NOT MANPAGE_DIR) + +add_custom_target(TARGET install + COMMAND ${CMAKE_COMMAND} -E make_directory ${MANPAGE_DIR} + COMMAND pod2man tools/simgrid_update_xml.pl > ${MANPAGE_DIR}/simgrid_update_xml.1 + COMMENT "Generating manpages" +) + # binaries install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/smpicc ${CMAKE_BINARY_DIR}/bin/smpif2c @@ -67,12 +78,16 @@ if(enable_lib_static AND NOT WIN32) endif(enable_lib_static AND NOT WIN32) # include files -foreach(file ${install_HEADERS}) +set(HEADERS + ${headers_to_install} + ${generated_headers_to_install} + ) +foreach(file ${HEADERS}) get_filename_component(location ${file} PATH) string(REPLACE "${CMAKE_CURRENT_BINARY_DIR}/" "" location "${location}") install(FILES ${file} DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${location}) -endforeach(file ${install_HEADERS}) +endforeach(file ${HEADERS}) # example files foreach(file ${examples_to_install_in_doc}) @@ -162,6 +177,7 @@ add_custom_target(dist-dir COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/doc/html/ simgrid-${release_version}/doc/html/ ) add_dependencies(dist-dir simgrid_documentation) +add_dependencies(dist-dir maintainer_files) set(dirs_in_tarball "") foreach(file ${source_to_pack}) @@ -304,15 +320,25 @@ WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}" add_custom_target(sync-gforge-doc COMMAND chmod g+rw -R doc/ COMMAND chmod a+rX -R doc/ -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/doc/ || true -COMMAND scp doc/index.php doc/webcruft/robots.txt scm.gforge.inria.fr:/home/groups/simgrid/htdocs/ -COMMAND scp doc/html/simgrid_modules2.png doc/html/simgrid_modules.png doc/webcruft/simgrid_logo.png doc/webcruft/simgrid_logo_small.png scm.gforge.inria.fr:/home/groups/simgrid/htdocs/ +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/${release_version}/doc/ || true +COMMAND scp doc/html/simgrid_modules2.png doc/html/simgrid_modules.png doc/webcruft/simgrid_logo.png doc/webcruft/simgrid_logo_small.png scm.gforge.inria.fr:/home/groups/simgrid/htdocs/${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/ +COMMAND scp src/surf/simgrid.dtd scm.gforge.inria.fr:/home/groups/simgrid/htdocs/${release_version}/ WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}" ) +#PIPOL +add_custom_target(sync-pipol +COMMAND scp -r Experimental_bindings.sh Experimental.sh MemCheck.sh pre-simgrid.sh navarro@pipol.inria.fr:~/ +COMMAND scp -r rc.* navarro@pipol.inria.fr:~/.pipol/ +COMMAND scp -r Nightly* navarro@pipol.inria.fr:~/.pipol/nightly +COMMAND ssh navarro@pipol.inria.fr "chmod a=rwx ~/* ~/.pipol/rc.* ~/.pipol/nightly/*" +WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}/buildtools/pipol/" +) include(CPack) diff --git a/buildtools/Cmake/Flags.cmake b/buildtools/Cmake/Flags.cmake index 6d0cc5641b..41e84a0ddd 100644 --- a/buildtools/Cmake/Flags.cmake +++ b/buildtools/Cmake/Flags.cmake @@ -3,6 +3,7 @@ set(optCFLAGS "") if(NOT __VISUALC__ AND NOT __BORLANDC__) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-g3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-g3") else(NOT __VISUALC__ AND NOT __BORLANDC__) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}/Zi") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}/Zi") @@ -12,10 +13,21 @@ if(enable_compile_warnings) set(warnCFLAGS "-Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror ") endif(enable_compile_warnings) +if(enable_compile_warnings AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6") + set(warnCFLAGS "${warnCFLAGS} -Wno-error=unused-but-set-variable ") +endif(enable_compile_warnings AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6") + if(enable_compile_optimizations) set(optCFLAGS "-O3 -finline-functions -funroll-loops -fno-strict-aliasing ") +else(enable_compile_optimizations) + set(optCFLAGS "-O0 ") endif(enable_compile_optimizations) +if(APPLE AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") + set(optCFLAGS "-O0 ") +endif(APPLE AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6") + if(NOT enable_debug) set(CMAKE_C_FLAGS "-DNDEBUG ${CMAKE_C_FLAGS}") endif(NOT enable_debug) @@ -23,13 +35,21 @@ endif(NOT enable_debug) set(CMAKE_C_FLAGS "${optCFLAGS}${warnCFLAGS}${CMAKE_C_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${custom_flags}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${optCFLAGS}") + +# Try to make Mac a bit more complient to open source standards +if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE") +endif(CMAKE_SYSTEM_NAME MATCHES "Darwin") +set(TESH_OPTION "") if(enable_coverage) find_program(GCOV_PATH gcov) if(GCOV_PATH) SET(COVERAGE_COMMAND "${GCOV_PATH}" CACHE TYPE FILEPATH FORCE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") + set(TESH_OPTION --enable-coverage) add_definitions(-fprofile-arcs -ftest-coverage) endif(GCOV_PATH) endif(enable_coverage) diff --git a/buildtools/Cmake/GenerateDoc.cmake b/buildtools/Cmake/GenerateDoc.cmake index 8be3928638..1e152f7bc8 100644 --- a/buildtools/Cmake/GenerateDoc.cmake +++ b/buildtools/Cmake/GenerateDoc.cmake @@ -1,3 +1,5 @@ +#### Generate the html documentation + if(BIBTEX2HTML) set(BIBTEX2HTML_PATH ${BIBTEX2HTML}) else(BIBTEX2HTML) @@ -6,8 +8,6 @@ endif(BIBTEX2HTML) find_path(FIG2DEV_PATH NAMES fig2dev PATHS NO_DEFAULT_PATHS) find_path(DOXYGEN_PATH NAMES doxygen PATHS NO_DEFAULT_PATHS) -find_path(BIBTOOL_PATH NAMES bibtool PATHS NO_DEFAULT_PATHS) -find_path(ICONV_PATH NAMES iconv PATHS NO_DEFAULT_PATHS) ### Check whether the bibtex2html that we found is the one that Arnaud requires exec_program("${BIBTEX2HTML_PATH}/bibtex2html -version" OUTPUT_VARIABLE OUTPUT_BIBTEX2HTML_VERSION) @@ -25,7 +25,7 @@ else(${OUTPUT_BIBTEX2HTML_VERSION_2} STREQUAL ${OUTPUT_BIBTEX2HTML_VERSION}) # g SET(GOOD_BIBTEX2HTML_VERSION 1) endif(${OUTPUT_BIBTEX2HTML_VERSION_2} STREQUAL ${OUTPUT_BIBTEX2HTML_VERSION}) -if(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV_PATH AND GOOD_BIBTEX2HTML_VERSION) +if(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTEX2HTML_PATH AND GOOD_BIBTEX2HTML_VERSION) string(REGEX REPLACE ";.*logcategories.doc" "" LISTE_DEUX "${LISTE_DEUX}") @@ -38,6 +38,10 @@ if(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV ${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo.png ${CMAKE_HOME_DIRECTORY}/doc/webcruft/simgrid_logo_small.png ${CMAKE_HOME_DIRECTORY}/doc/webcruft/poster_thumbnail.png + ${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_01.png + ${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_02.png + ${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_03.png + ${CMAKE_HOME_DIRECTORY}/doc/webcruft/win_install_04.png ) configure_file(${CMAKE_HOME_DIRECTORY}/doc/Doxyfile.in ${CMAKE_HOME_DIRECTORY}/doc/Doxyfile @ONLY) @@ -46,10 +50,12 @@ if(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV ADD_CUSTOM_TARGET(simgrid_documentation COMMENT "Generating the SimGrid documentation..." DEPENDS ${DOC_SOURCES} ${DOC_FIGS} ${source_doxygen} + COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_HOME_DIRECTORY}/doc/html + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_HOME_DIRECTORY}/doc/html COMMAND ${FIG2DEV_PATH}/fig2dev -Lmap ${CMAKE_HOME_DIRECTORY}/doc/fig/simgrid_modules.fig | perl -pe 's/imagemap/simgrid_modules/g'| perl -pe 's/ ${CMAKE_HOME_DIRECTORY}/doc/simgrid_modules.map WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc ) - + ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_HOME_DIRECTORY}/doc/logcategories.doc DEPENDS ${source_doxygen} @@ -84,16 +90,15 @@ if(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV COMMAND ${CMAKE_COMMAND} -E echo "XX First Doxygen pass" COMMAND ${DOXYGEN_PATH}/doxygen Doxyfile COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/index_create.pl simgrid.tag index-API.doc - COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/toc_create.pl FAQ.doc index.doc contrib.doc gtut-introduction.doc history.doc + COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/toc_create.pl pls.doc index.doc gtut-introduction.doc installSimgrid.doc bindings.doc options.doc tracing.doc COMMAND ${CMAKE_COMMAND} -E echo "XX Second Doxygen pass" COMMAND ${DOXYGEN_PATH}/doxygen Doxyfile COMMAND ${CMAKE_COMMAND} -E echo "XX Post-processing Doxygen result" COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/doc/html/dir* - COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/index_php.pl index.php.in html/index.html index.php COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/doxygen_postprocesser.pl - + COMMAND ${CMAKE_COMMAND} -E echo "XX Create shortcuts pages" COMMAND ${CMAKE_COMMAND} -E echo \"\" > ${CMAKE_HOME_DIRECTORY}/doc/html/gras.html COMMAND ${CMAKE_COMMAND} -E echo \"


Grid Reality And Simulation.

\" >> ${CMAKE_HOME_DIRECTORY}/doc/html/gras.html @@ -108,30 +113,8 @@ if(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV COMMAND ${CMAKE_COMMAND} -E echo \"


DAG Simulator.

\" >> ${CMAKE_HOME_DIRECTORY}/doc/html/simdag.html WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/ ) - - ADD_CUSTOM_TARGET(bib_files - DEPENDS ${CMAKE_HOME_DIRECTORY}/doc/all.bib - COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_HOME_DIRECTORY}/doc/html - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_HOME_DIRECTORY}/doc/html - COMMAND ${CMAKE_COMMAND} -E echo "XX Generate publis_core.bib publis_extern.bib publis_intra.bib" - COMMAND ${BIBTOOL_PATH}/bibtool -- 'select.by.string={category \"core\"}' -- 'preserve.key.case={on}' -- 'preserve.keys={on}' all.bib -o publis_core.bib - COMMAND ${BIBTOOL_PATH}/bibtool -- 'select.by.string={category \"extern\"}' -- 'preserve.key.case={on}' -- 'preserve.keys={on}' all.bib -o publis_extern.bib - COMMAND ${BIBTOOL_PATH}/bibtool -- 'select.by.string={category \"intra\"}' -- 'preserve.key.case={on}' -- 'preserve.keys={on}' all.bib -o publis_intra.bib - - COMMAND ${CMAKE_COMMAND} -E echo "XX Generate publis_count.html" - COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/bibtex2html_table_count.pl < ${CMAKE_HOME_DIRECTORY}/doc/all.bib > ${CMAKE_HOME_DIRECTORY}/doc/publis_count.html - - COMMAND ${CMAKE_COMMAND} -E echo "XX Generate publis_core.html publis_extern.html publis_intra.html" - COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/bibtex2html_wrapper.pl publis_core - COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/bibtex2html_wrapper.pl publis_extern - COMMAND ${CMAKE_HOME_DIRECTORY}/tools/doxygen/bibtex2html_wrapper.pl publis_intra - - WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/ - ) - - add_dependencies(simgrid_documentation bib_files) -else(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV_PATH AND GOOD_BIBTEX2HTML_VERSION) +else(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTEX2HTML_PATH AND GOOD_BIBTEX2HTML_VERSION) ADD_CUSTOM_TARGET(simgrid_documentation COMMENT "Generating the SimGrid documentation..." @@ -150,23 +133,39 @@ else(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICO ADD_CUSTOM_COMMAND(TARGET simgrid_documentation COMMAND ${CMAKE_COMMAND} -E echo "DOXYGEN_PATH = ${DOXYGEN_PATH}" COMMAND ${CMAKE_COMMAND} -E echo "FIG2DEV_PATH = ${FIG2DEV_PATH}" - COMMAND ${CMAKE_COMMAND} -E echo "BIBTOOL_PATH = ${BIBTOOL_PATH}" COMMAND ${CMAKE_COMMAND} -E echo "BIBTEX2HTML_PATH = ${BIBTEX2HTML_PATH}" - COMMAND ${CMAKE_COMMAND} -E echo "ICONV_PATH = ${ICONV_PATH}" COMMAND ${CMAKE_COMMAND} -E echo "IN ORDER TO GENERATE THE DOCUMENTATION YOU NEED ALL TOOLS !!!" COMMAND ${CMAKE_COMMAND} -E echo "FAIL TO MAKE SIMGRID DOCUMENTATION see previous messages for details ..." COMMAND false ) -endif(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTOOL_PATH AND BIBTEX2HTML_PATH AND ICONV_PATH AND GOOD_BIBTEX2HTML_VERSION) +endif(DOXYGEN_PATH AND FIG2DEV_PATH AND BIBTEX2HTML_PATH AND GOOD_BIBTEX2HTML_VERSION) ##############################################################################" message(STATUS "Check individual TOCs") -file(GLOB_RECURSE LISTE_GTUT - "${CMAKE_HOME_DIRECTORY}/doc/gtut-tour-*.doc" +set(LISTE_GTUT + doc/gtut-tour-00-install.doc + doc/gtut-tour-01-bones.doc + doc/gtut-tour-02-simple.doc + doc/gtut-tour-03-args.doc + doc/gtut-tour-04-callback.doc + doc/gtut-tour-05-globals.doc + doc/gtut-tour-06-logs.doc + doc/gtut-tour-07-timers.doc + doc/gtut-tour-08-exceptions.doc + doc/gtut-tour-09-simpledata.doc + doc/gtut-tour-10-rpc.doc + doc/gtut-tour-11-explicitwait.doc + doc/gtut-tour-recap-messages.doc + doc/gtut-tour-12-staticstruct.doc + doc/gtut-tour-13-pointers.doc + doc/gtut-tour-14-dynar.doc + doc/gtut-tour-15-manualdatadef.doc + doc/gtut-tour-16-exchangecb.doc ) + foreach(file_name ${LISTE_GTUT}) file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/tmp.curtoc) file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/tmp.realtoc) @@ -175,7 +174,8 @@ foreach(file_name ${LISTE_GTUT}) string(REGEX MATCH "Table of Contents.*
" valeur_line "${file_content}") string(REPLACE "\n" ";" valeur_line "${valeur_line}") string(REPLACE "\n" ";" file_content "${file_content}") - + + file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/tmp.realtoc "\n") # make sure it exists foreach(line ${file_content}) string(REGEX MATCH "[\\]s?u?b?s?u?b?section.*" line2 "${line}") string(REGEX MATCH ".*_toc.*" line3 "${line}") @@ -191,6 +191,7 @@ foreach(file_name ${LISTE_GTUT}) endif(line2 AND NOT line3) endforeach(line ${file_content}) + file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/tmp.curtoc "\n") # make sure it exists foreach(line ${valeur_line}) string(REGEX MATCH ".*ref.*" line_ok ${line}) if(line_ok) @@ -257,3 +258,17 @@ else(compare_files) endif(compare_files) file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/tmp.curtoc) + +ADD_CUSTOM_TARGET(pdf + COMMAND ${CMAKE_COMMAND} -E echo "XX First pass simgrid_documentation.pdf" + COMMAND make clean + COMMAND make pdf || true + COMMAND ${CMAKE_COMMAND} -E echo "XX Second pass simgrid_documentation.pdf" + COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/doc/latex/refman.pdf + COMMAND make pdf || true + COMMAND ${CMAKE_COMMAND} -E echo "XX Write Simgrid_documentation.pdf" + COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_HOME_DIRECTORY}/doc/latex/refman.pdf ${CMAKE_HOME_DIRECTORY}/doc/latex/simgrid_documentation.pdf + + WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/latex/ +) +add_dependencies(pdf simgrid_documentation) diff --git a/buildtools/Cmake/MaintainerMode.cmake b/buildtools/Cmake/MaintainerMode.cmake index 3aaaaae2f5..d1fa7396a6 100644 --- a/buildtools/Cmake/MaintainerMode.cmake +++ b/buildtools/Cmake/MaintainerMode.cmake @@ -43,6 +43,7 @@ set(string10 "'s/#if defined(_WIN32)/#if defined(_XBT_WIN32)/g'") set(string11 "'s/#include /#if defined(_XBT_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__)\\n# ifndef __STRICT_ANSI__\\n# include \\n# include \\n# endif\\n#else\\n# include \\n#endif/g'") set(string12 "'s/#if defined(_WIN32)/#if defined(_XBT_WIN32)/g'") set(string13 "'s/#include /#if defined(_XBT_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__)\\n# ifndef __STRICT_ANSI__\\n# include \\n# include \\n# endif\\n#else\\n# include \\n#endif/g'") +set(string14 "'\\!^ \\* Generated [0-9/]\\{10\\} [0-9:]\\{8\\}\\.$$!d'") ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_HOME_DIRECTORY}/include/surf/simgrid_dtd.h @@ -58,13 +59,16 @@ ADD_CUSTOM_COMMAND( #${CMAKE_HOME_DIRECTORY}/src/surf/simgrid_dtd.l: ${CMAKE_HOME_DIRECTORY}/src/surf/simgrid.dtd COMMAND ${FLEXML_EXE} --root-tags platform -b 1000000 -P surfxml --sysid=http://simgrid.gforge.inria.fr/simgrid.dtd -S src/surf/simgrid_dtd.l -L src/surf/simgrid.dtd + COMMAND ${SED_EXE} -i ${string14} src/surf/simgrid_dtd.l COMMAND ${CMAKE_COMMAND} -E echo "src/surf/simgrid_dtd.l" #${CMAKE_HOME_DIRECTORY}/src/xbt/graphxml.l: ${CMAKE_HOME_DIRECTORY}/src/xbt/graphxml.dtd COMMAND ${FLEXML_EXE} -b 1000000 -P graphxml --sysid=graphxml.dtd -S src/xbt/graphxml.l -L src/xbt/graphxml.dtd + COMMAND ${SED_EXE} -i ${string14} src/xbt/graphxml.l COMMAND ${CMAKE_COMMAND} -E echo "src/xbt/graphxml.l" #${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.l: ${CMAKE_HOME_DIRECTORY}/src/simdag/dax.dtd - COMMAND ${FLEXML_EXE} -b 1000000 --root-tags adag -P dax_ --sysid=dax.dtd -S ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.l -L ${CMAKE_HOME_DIRECTORY}/src/simdag/dax.dtd + COMMAND ${FLEXML_EXE} -b 1000000 --root-tags adag -P dax_ --sysid=dax.dtd -S src/simdag/dax_dtd.l -L src/simdag/dax.dtd COMMAND ${SED_EXE} -i ${string5} src/simdag/dax_dtd.l + COMMAND ${SED_EXE} -i ${string14} src/simdag/dax_dtd.l COMMAND ${CMAKE_COMMAND} -E echo "src/simdag/dax_dtd.l" #${CMAKE_HOME_DIRECTORY}/include/surf/simgrid_dtd.h: ${CMAKE_HOME_DIRECTORY}/src/surf/simgrid.dtd @@ -72,18 +76,21 @@ ADD_CUSTOM_COMMAND( COMMAND ${FLEXML_EXE} --root-tags platform -P surfxml --sysid=http://simgrid.gforge.inria.fr/simgrid.dtd -H include/surf/simgrid_dtd.h -L src/surf/simgrid.dtd COMMAND ${SED_EXE} -i ${string1} include/surf/simgrid_dtd.h COMMAND ${SED_EXE} -i ${string2} include/surf/simgrid_dtd.h + COMMAND ${SED_EXE} -i ${string14} include/surf/simgrid_dtd.h COMMAND ${CMAKE_COMMAND} -E echo "include/surf/simgrid_dtd.h" #${CMAKE_HOME_DIRECTORY}/include/xbt/graphxml.h: ${CMAKE_HOME_DIRECTORY}/src/xbt/graphxml.dtd COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/include/xbt/graphxml.h COMMAND ${FLEXML_EXE} -P graphxml --sysid=graphxml.dtd -H include/xbt/graphxml.h -L src/xbt/graphxml.dtd COMMAND ${SED_EXE} -i ${string3} include/xbt/graphxml.h COMMAND ${SED_EXE} -i ${string4} include/xbt/graphxml.h + COMMAND ${SED_EXE} -i ${string14} include/xbt/graphxml.h COMMAND ${CMAKE_COMMAND} -E echo "include/xbt/graphxml.h" #${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.h: ${CMAKE_HOME_DIRECTORY}/src/simdag/dax.dtd COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.h COMMAND ${FLEXML_EXE} --root-tags adag -P dax_ --sysid=dax.dtd -H src/simdag/dax_dtd.h -L src/simdag/dax.dtd COMMAND ${SED_EXE} -i ${string6} src/simdag/dax_dtd.h COMMAND ${SED_EXE} -i ${string7} src/simdag/dax_dtd.h + COMMAND ${SED_EXE} -i ${string14} src/simdag/dax_dtd.h COMMAND ${FLEX_EXE} -o src/gras/DataDesc/ddt_parse.yy.c -Pgras_ddt_parse_ --noline src/gras/DataDesc/ddt_parse.yy.l COMMAND ${CMAKE_COMMAND} -E echo "src/simdag/dax_dtd.h" diff --git a/buildtools/Cmake/MakeExe.cmake b/buildtools/Cmake/MakeExe.cmake index 30485806d9..da26f94bba 100644 --- a/buildtools/Cmake/MakeExe.cmake +++ b/buildtools/Cmake/MakeExe.cmake @@ -69,11 +69,16 @@ if(HAVE_GTNETS) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets) endif(HAVE_GTNETS) +if(HAVE_NS3) + add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/msg/ns3) +endif(HAVE_NS3) + add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/amok/saturate) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dax) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/goal) if(HAVE_GRAPHVIZ) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/simdag/dot) endif(HAVE_GRAPHVIZ) diff --git a/buildtools/Cmake/MakeLib.cmake b/buildtools/Cmake/MakeLib.cmake index 2c1847c52d..45b347dd60 100644 --- a/buildtools/Cmake/MakeLib.cmake +++ b/buildtools/Cmake/MakeLib.cmake @@ -1,11 +1,5 @@ ### Make Libs - -# Try to make Mac a bit more complient to open source standards -if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - add_definitions("-D_XOPEN_SOURCE") -endif(CMAKE_SYSTEM_NAME MATCHES "Darwin") - ############################### # Declare the library content # ############################### @@ -72,10 +66,7 @@ target_link_libraries(gras ${GRAS_DEP}) # Compute the dependencies of SimGrid ##################################### -set(SIMGRID_DEP "-lm") -if(HAVE_PCRE_LIB) - SET(SIMGRID_DEP "${SIMGRID_DEP} -lpcre") -endif(HAVE_PCRE_LIB) +set(SIMGRID_DEP "-lm -lpcre") if(pthread) if(${CONTEXT_THREADS}) @@ -123,6 +114,16 @@ if(HAVE_GTNETS) SET(SIMGRID_DEP "${SIMGRID_DEP} -lgtnets") endif(HAVE_GTNETS) +if(HAVE_NS3) + if(${NS3_VERSION} EQUAL 310) + SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_NS3_3_10") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_NS3_3_10") + else(${NS3_VERSION} EQUAL 310) + SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3-core -lns3-csma -lns3-point-to-point") + endif(${NS3_VERSION} EQUAL 310) +endif(HAVE_NS3) + if(HAVE_POSIX_GETTIME) SET(SIMGRID_DEP "${SIMGRID_DEP} -lrt") endif(HAVE_POSIX_GETTIME) diff --git a/buildtools/Cmake/MakeLibWin.cmake b/buildtools/Cmake/MakeLibWin.cmake index 733f6ca075..0047b48781 100644 --- a/buildtools/Cmake/MakeLibWin.cmake +++ b/buildtools/Cmake/MakeLibWin.cmake @@ -19,12 +19,8 @@ else(MSVC) endif(CMAKE_COMPILER_IS_GNUCC) endif(MSVC) -set(GRAS_DEP "wsock32") -set(SIMGRID_DEP "wsock32") - -if(HAVE_PCRE_LIB) - SET(SIMGRID_DEP "${SIMGRID_DEP} -lpcre") -endif(HAVE_PCRE_LIB) +set(GRAS_DEP "ws2_32") +set(SIMGRID_DEP "ws2_32 -lpcre") target_link_libraries(simgrid ${SIMGRID_DEP}) target_link_libraries(gras ${GRAS_DEP}) diff --git a/buildtools/Cmake/Modules/FindGTnets.cmake b/buildtools/Cmake/Modules/FindGTnets.cmake index 44eb7a800b..a1e39de8de 100644 --- a/buildtools/Cmake/Modules/FindGTnets.cmake +++ b/buildtools/Cmake/Modules/FindGTnets.cmake @@ -25,6 +25,7 @@ find_path(HAVE_SIMULATOR_H /opt/csw /sw /usr + ${gtnets_path} ) string(REPLACE "/libgtnets.${LIB_EXE}" "" GTNETS_LIB_PATH "${HAVE_GTNETS_LIB}") diff --git a/buildtools/Cmake/Modules/FindNS3.cmake b/buildtools/Cmake/Modules/FindNS3.cmake new file mode 100644 index 0000000000..c8e34bbc8d --- /dev/null +++ b/buildtools/Cmake/Modules/FindNS3.cmake @@ -0,0 +1,110 @@ +find_library(HAVE_NS3_LIB + NAME ns3 + HINTS + $ENV{LD_LIBRARY_PATH} + $ENV{HOME} + PATH_SUFFIXES lib64 lib ns3/lib + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr + ${ns3_path} +) + +find_library(HAVE_NS3_CORE_LIB + NAME ns3-core + HINTS + $ENV{LD_LIBRARY_PATH} + $ENV{HOME} + PATH_SUFFIXES lib64 lib ns3/lib + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr + ${ns3_path} +) + +find_path(HAVE_CORE_MODULE_H + NAME ns3/core-module.h + HINTS + $ENV{HOME} + PATH_SUFFIXES include ns3/include + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr + ${ns3_path} +) + +message(STATUS "Looking for core-module.h") +if(HAVE_CORE_MODULE_H) +message(STATUS "Looking for core-module.h - found") +else(HAVE_CORE_MODULE_H) +message(STATUS "Looking for core-module.h - not found") +endif(HAVE_CORE_MODULE_H) +mark_as_advanced(HAVE_CORE_MODULE_H) + +message(STATUS "Looking for lib ns3") +if(HAVE_NS3_LIB) +message(STATUS "Looking for lib ns3 - found") +else(HAVE_NS3_LIB) +message(STATUS "Looking for lib ns3 - not found") +endif(HAVE_NS3_LIB) +mark_as_advanced(HAVE_NS3_LIB) + +message(STATUS "Looking for lib ns3-core") +if(HAVE_NS3_CORE_LIB) +message(STATUS "Looking for lib ns3-core - found") +else(HAVE_NS3_CORE_LIB) +message(STATUS "Looking for lib ns3-core - not found") +endif(HAVE_NS3_CORE_LIB) +mark_as_advanced(HAVE_NS3_LIB) +mark_as_advanced(HAVE_NS3_CORE_LIB) + +if(HAVE_CORE_MODULE_H) + if(HAVE_NS3_LIB) + message(STATUS "Warning: NS-3 version <= 3.10") + set(HAVE_NS3 1) + set(NS3_VERSION 310) + string(REPLACE "/libns3.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_LIB}") + endif(HAVE_NS3_LIB) + if(HAVE_NS3_CORE_LIB) + message(STATUS "NS-3 version > 3.10") + set(HAVE_NS3 1) + set(NS3_VERSION 312) + string(REPLACE "/libns3-core.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}") + endif(HAVE_NS3_CORE_LIB) +endif(HAVE_CORE_MODULE_H) + +if(HAVE_NS3) + string(REGEX MATCH "${HAVE_NS3_LIB}" operation "$ENV{LD_LIBRARY_PATH}") + if(NOT operation) + message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HAVE_NS3_LIB}") + set(HAVE_NS3 0) + else(NOT operation) + + string(REGEX MATCH "-L${HAVE_NS3_LIB} " operation1 "${CMAKE_C_FLAGS}") + if(NOT operation1) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_NS3_LIB} ") + endif(NOT operation1) + + string(REGEX MATCH "-I${HAVE_CORE_MODULE_H} " operation1 "${CMAKE_C_FLAGS}") + if(NOT operation1) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_CORE_MODULE_H} ") + endif(NOT operation1) + + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_CORE_MODULE_H} -L${HAVE_NS3_LIB} ") + endif(NOT operation) +else(HAVE_NS3) + message(STATUS "Warning: To use NS-3 Please install ns3 at least version 3.10 (http://www.nsnam.org/releases/)") +endif(HAVE_NS3) + +if(HAVE_NS3 AND enable_supernovae) + set(enable_supernovae OFF) +endif(HAVE_NS3 AND enable_supernovae) \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindPCRE.cmake b/buildtools/Cmake/Modules/FindPCRE.cmake index 45eddfe299..0b3db37a89 100644 --- a/buildtools/Cmake/Modules/FindPCRE.cmake +++ b/buildtools/Cmake/Modules/FindPCRE.cmake @@ -1,6 +1,7 @@ find_library(PATH_PCRE_LIB NAMES pcre HINTS + $ENV{SIMGRID_PCRE_LIBRARY_PATH} $ENV{LD_LIBRARY_PATH} $ENV{PCRE_LIBRARY_PATH} PATH_SUFFIXES lib/ GnuWin32/lib @@ -11,8 +12,18 @@ find_library(PATH_PCRE_LIB /sw /usr) +string(REGEX MATCH ".dll.a" operation "${PATH_PCRE_LIB}") + +if(NOT operation) + if(WIN32) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-DPCRE_STATIC ") + endif(WIN32) +endif(NOT operation) + + find_path(PATH_PCRE_H "pcre.h" HINTS + $ENV{SIMGRID_PCRE_LIBRARY_PATH} $ENV{LD_LIBRARY_PATH} $ENV{PCRE_LIBRARY_PATH} PATH_SUFFIXES include/ GnuWin32/include @@ -22,24 +33,7 @@ find_path(PATH_PCRE_H "pcre.h" /opt/csw /sw /usr) - -set(HAVE_PCRE_LIB 0) -if(PATH_PCRE_LIB AND PATH_PCRE_H) - string(REGEX REPLACE "/libpcre.*[.]${LIB_EXE}$" "" PATHLIBPCRE "${PATH_PCRE_LIB}") - string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") - string(REGEX MATCH "-L${PATHLIBPCRE} " operation "${CMAKE_C_FLAGS}") - if(NOT operation) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${PATHLIBPCRE} ") - endif(NOT operation) - string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") - if(NOT operation) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") - endif(NOT operation) - set(HAVE_PCRE_LIB 1) -else(PATH_PCRE_LIB) - message(STATUS "Warning : You should install libpcre (please install the libpcre3-dev package or equivalent)") -endif(PATH_PCRE_LIB AND PATH_PCRE_H) - + message(STATUS "Looking for pcre.h") if(PATH_PCRE_H) message(STATUS "Looking for pcre.h - found") @@ -54,5 +48,41 @@ else(PATH_PCRE_LIB) message(STATUS "Looking for lib pcre - not found") endif(PATH_PCRE_LIB) +if(WIN32) + find_path(PATH_PCRE_LICENCE "LICENCE" + HINTS + $ENV{SIMGRID_PCRE_LIBRARY_PATH} + $ENV{LD_LIBRARY_PATH} + $ENV{PCRE_LIBRARY_PATH} + PATH_SUFFIXES GnuWin32 + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr) + message(STATUS "Looking for pcre licence") + if(PATH_PCRE_LICENCE) + message(STATUS "Looking for pcre licence - found") + else(PATH_PCRE_LICENCE) + message(STATUS "Looking for pcre licence - not found") + endif(PATH_PCRE_LICENCE) +endif(WIN32) + +if(PATH_PCRE_LIB AND PATH_PCRE_H) + string(REGEX REPLACE "/libpcre.*[.]${LIB_EXE}$" "" PATHLIBPCRE "${PATH_PCRE_LIB}") + string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") + string(REGEX MATCH "-L${PATHLIBPCRE} " operation "${CMAKE_C_FLAGS}") + if(NOT operation) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${PATHLIBPCRE} ") + endif(NOT operation) + string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") + if(NOT operation) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") + endif(NOT operation) +else(PATH_PCRE_LIB) + message(FATAL_ERROR "Please install the libpcre3-dev package or equivalent before using SimGrid.") +endif(PATH_PCRE_LIB AND PATH_PCRE_H) + mark_as_advanced(PATH_PCRE_H) mark_as_advanced(PATH_PCRE_LIB) \ No newline at end of file diff --git a/buildtools/Cmake/Option.cmake b/buildtools/Cmake/Option.cmake index 60e1b0946d..9e2bf45440 100644 --- a/buildtools/Cmake/Option.cmake +++ b/buildtools/Cmake/Option.cmake @@ -1,10 +1,9 @@ ### ARGs use -D[var]=[ON/OFF] or [1/0] or [true/false](see after) ### ex: cmake -Denable_java=ON -Denable_gtnets=ON ./ - - set(BIBTEX2HTML ${BIBTEX2HTML} CACHE PATH "Path to bibtex2html") set(gtnets_path ${gtnets_path} CACHE PATH "Path to gtnets lib and include") +set(ns3_path ${ns3_path} CACHE PATH "Path to ns3 lib and include") set(custom_flags ${custom_flags} CACHE FORCE "Customers flags add to cmake_c_flag") if(NOT CMAKE_INSTALL_PREFIX) @@ -15,10 +14,12 @@ endif(NOT CMAKE_INSTALL_PREFIX) set(pipol_user ${pipol_user} CACHE TYPE INTERNAL FORCE) -option(enable_gtnets "Whether gtnets model is activated." on) -option(enable_smpi "This variable set smpi lib." on) +option(release "Whether Release Mode is activated (disable tests on experimental parts)" on) + +option(enable_gtnets "Whether gtnets model is activated." off) +option(enable_ns3 "Whether ns3 model is activated." off) +option(enable_smpi "This variable set smpi lib." off) option(enable_lua "Whether the lua bindings are activated." on) -option(enable_pcre "Whether the pcre lib is activated." on) if(WIN32 OR APPLE) set(enable_smpi off CACHE TYPE INTERNAL FORCE) diff --git a/buildtools/Cmake/PrintArgs.cmake b/buildtools/Cmake/PrintArgs.cmake index 4f626b4ec2..2ed1608ef6 100644 --- a/buildtools/Cmake/PrintArgs.cmake +++ b/buildtools/Cmake/PrintArgs.cmake @@ -74,10 +74,10 @@ if(enable_print_message) message("") endif(enable_print_message) -message("\nConfiguration of package `simgrid' (revision ${SVN_VERSION}) on arch (=${GRAS_THISARCH}):") +message("\nConfiguration of package `simgrid' on arch (=${GRAS_THISARCH}):") message(" BUILDNAME : ${BUILDNAME}") message(" SITE : ${SITE}") -message(" Release : simgrid-${release_version}~rev${SVN_VERSION}") +message(" Release : simgrid-${release_version}") message("") message(" Compiler: c++ : ${CMAKE_CXX_COMPILER}") message(" version: ${COMPILER_CXX_VERSION}") @@ -89,7 +89,9 @@ message(" CPPFlags: ${CMAKE_CXX_FLAGS}") message("") if(NOT APPLE AND NOT WIN32) message(" Compile Gtnets : ${HAVE_GTNETS}") +message(" Compile NS-3 : ${HAVE_NS3}") message(" Gtnets path : ${gtnets_path}") +message(" NS-3 path : ${ns3_path}") endif(NOT APPLE AND NOT WIN32) message(" Compile Lua : ${HAVE_LUA}") message(" Compile Smpi : ${enable_smpi}") diff --git a/buildtools/Cmake/generate_g5k_platform.pl b/buildtools/Cmake/generate_g5k_platform.pl new file mode 100755 index 0000000000..b8ba575d26 --- /dev/null +++ b/buildtools/Cmake/generate_g5k_platform.pl @@ -0,0 +1,204 @@ +#!/usr/bin/perl -w +use strict; +use Switch; +my $toversion=3; + +if($#ARGV!=1) { + die "Usage: ./generate_g5k_platform.pl g5k_username g5k_password\n"; +} + +print "\n"; +print "\n"; +print "\n"; +print "\t\n"; + +`rm -rf temp_g5k`; +`mkdir -p temp_g5k`; +chdir("./temp_g5k"); +`wget https://api.grid5000.fr/2.0/grid5000/sites --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`; + +open SITES_LIGNE, 'sites' or die "Unable to open sites $!\n"; +my $line = ""; +my $site = ""; +my $cluster = ""; +my $nodes = ""; +my @AS_route = (); + +print "\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +#printf "\t\t\t\n"; +print "\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +#printf "\t\t\n"; +print "\n"; + +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +#print "\t\t\n"; +print "\t\t\n"; + +while(defined($line=)) +{ + if($line =~ /"uid": "(.*)",/){ + $site = $1; + print "\t\t\n"; + `wget https://api.grid5000.fr/2.0/grid5000/sites/$site/clusters --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`; + open CLUSTERS_LIGNE, 'clusters' or die "Unable to open clusters $!\n"; + while(defined($line=)) + { + if($line =~ /"uid": "(.*)",/){ + $cluster = $1; + print "\t\t\t)) + { + if($line =~ /"total": (.*),/){ + print "\t\t\t\tradical=\"1-$1\" power=\""; + &get_gflops($cluster); + print "\" bw=\"1.25E8\" lat=\"1.0E-4\""."\n"; + print "\t\t\t\tbb_bw=\"1.25E9\" bb_lat=\"1.0E-4\">\n"; + } + } + print "\t\t\t\n\n"; + close NODES_LIGNE; + `rm nodes`; + } + } + close CLUSTERS_LIGNE; + `rm clusters`; + + print "\t\t\t\n"; + print "\t\t\t\t\n"; + print "\t\t\t\n"; + print "\t\t\t\n"; + print "\n"; + + print "\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\n\n"; + + print "\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\n\n"; + + print "\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\n\n"; + + print "\t\t\n"; + + push @AS_route, $site; + } +} + +while(@AS_route) +{ + $site = pop @AS_route; + print "\t\t\n"; + print "\t\t\t\n"; + print "\t\t\n"; + +# print "\t\t\n"; +# print "\t\t\t\n"; +# print "\t\t\n"; +} + +print "\t\n"; +print "\n"; +`rm sites`; +close SITES_LIGNE; + + +sub get_gflops { + switch ($_[0]) { + case "bordeplage" { print "5.2297E9" } + case "bordereau" { print "8.8925E9" } + case "borderline" { print "13.357E9" } + + case "chicon" { print "8.9618E9" } + case "chimint" { print "23.531E9" } + case "chinqchint" { print "22.270E9" } + case "chirloute" { print "24.473E9" } + + case "adonis" { print "23.681E9" } + case "edel" { print "23.492E9" } + case "genepi" { print "21.175E9" } + + case "capricorne" { print "4.7233E9" } + case "sagittaire" { print "5.6693E9" } + + case "graphene" { print "16.673E9" } + case "griffon" { print "20.678E9" } + + case "gdx" { print "4.7153E9" } + case "netgdx" { print "4.7144E9" } + + case "paradent" { print "21.496E9" } + case "paramount" { print "12.910E9" } + case "parapide" { print "30.130E9" } + case "parapluie" { print "27.391E9" } + + case "helios" { print "7.7318E9" } + case "sol" { print "8.9388E9" } + case "suno" { print "23.530E9" } + + case "pastel" { print "9.5674E9" } + case "violette" { print "5.1143E9" } + + case "default" { print "3.542E9" } + else { print "xxxxxxx" } + } +} \ No newline at end of file diff --git a/buildtools/Cmake/generate_g5k_platform_cabinets.pl b/buildtools/Cmake/generate_g5k_platform_cabinets.pl new file mode 100644 index 0000000000..f5009f3f33 --- /dev/null +++ b/buildtools/Cmake/generate_g5k_platform_cabinets.pl @@ -0,0 +1,339 @@ +#!/usr/bin/perl -w +use strict; +use Switch; + +my $site=""; +my $cluster=""; +my $toversion=3; +my $line; +my $uid=""; +my $i=0; +my @AS_route = (); + +if($#ARGV!=1) { + die "Usage: ./generate_g5k_platform.pl g5k_username g5k_password\n"; +} + +print "\n"; +print "\n"; +print "\n"; +print "\t\n"; + +print "\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +#printf "\t\t\t\n"; +print "\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +printf "\t\t\t\n"; +#printf "\t\t\n"; +print "\n"; + +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +print "\t\t\n"; +#print "\t\t\n"; +print "\t\t\n"; + +`wget https://api.grid5000.fr/2.0/grid5000/sites --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`; +open SITES_LIGNE, 'sites' or die "Unable to open sites $!\n"; +while(defined($line=)) +{ + if($line =~ /"uid": "(.*)",/){ + $site = $1; + print "\t\t\n"; + + `wget https://api.grid5000.fr/2.0/grid5000/sites/$site/clusters --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`; + open CLUSTERS_LIGNE, 'clusters' or die "Unable to open clusters $!\n"; + while(defined($line=)) + { + if($line =~ /"uid": "(.*)",/){ + $cluster = $1; + &get_switch($site, $cluster); + } + } + + close CLUSTERS_LIGNE; + `rm clusters`; + + print "\t\t\t\n"; + print "\t\t\t\t\n"; + print "\t\t\t\n"; + print "\t\t\t\n"; + print "\n"; + + print "\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\n\n"; + + print "\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\n\n"; + + print "\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\n\n"; + + print "\t\t\n"; + + push @AS_route, $site; + } +} +close SITES_LIGNE; +`rm sites`; + +printf "\n"; + +while(@AS_route) +{ + $site = pop @AS_route; + print "\t\t\n"; + print "\t\t\t\n"; + print "\t\t\n"; +} + +print "\t\n"; +print "\n"; + +sub get_switch { + my $total; + my $switch=""; + my @switch_list=(); + + my @host=(); + my @host_switch=(); + $site="$_[0]"; + $cluster="$_[1]"; + `wget https://api.grid5000.fr/2.0/grid5000/sites/$site/clusters/$cluster/nodes --http-user="$ARGV[0]" --http-password="$ARGV[1]" --no-check-certificate --quiet`; + open NODES_LIGNE, 'nodes' or die "Unable to open nodes $!\n"; + while(defined($line=)) + { + if($line =~ /"uid": "(.*)",/) + { + $uid = $1; + push(@host, $1); + } + if($line =~ /"total": (.*),/){ + $total = $1; + } + if($line =~ /"switch": "(.*)",/ && !$switch) + { + $switch = "$1"; + push(@host_switch, $1); + } + if( $uid && $switch ) + { + push(@switch_list, $switch); + $uid=""; + $switch=""; + } + } + close NODES_LIGNE; + `rm nodes`; + + my %count; + my @uniq_array = grep { ++$count{$_} < 2 } @switch_list; + @uniq_array = sort (@uniq_array); + if(@switch_list && @uniq_array != 1){ + + if(@switch_list != @host){ + printf "Take care \@host != of \@switch_list\n"; + } + + print "\t\t\t\n"; + + my @num=(); + my $radical; + foreach(@uniq_array){ + $switch = $_; + $i=0; + @num=(); + foreach(@host_switch){ + if($_ =~ $switch){ + if($host[$i] =~ /$cluster-(.*)/){ + push(@num, $1); + } + } + $i++; + } + + my $deb; + my $fin; + @num=sort {$a <=> $b} (@num); + $radical = ""; + + $i=0; + foreach(@num){ + if($i == 0){ + $deb = $num[$i]; + $fin = $num[$i]; + } + else{ + if($num[$i] == ($num[$i-1]+1) ) + { + $fin = $num[$i]; + if(@num == ($i+1)){ + if($deb != $fin) + { + if(!($radical =~ /^$/)) + { + $radical = $radical.";"; + } + $radical = $radical.$deb."-".$fin; + $deb = $num[$i]; + $fin = $num[$i]; + } + else + { + $radical=$radical.";".$num[$i]; + } + } + } + else + { + if($deb != $fin) + { + if(!($radical =~ /^$/)) + { + $radical = $radical.";"; + } + $radical = $radical.$deb."-".$fin; + $deb = $num[$i]; + $fin = $num[$i]; + } + else + { + $radical=$radical.";".$num[$i]; + } + + } + } + $i++; + } + print "\t\t\t\t\n"; + } + + print "\n\t\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\t\n"; + + print "\t\t\t\t\n\n"; + + print "\t\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\t\n"; + + print "\t\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\t\n"; + + print "\t\t\t\t\n"; + print "\t\t\t\t\t\n"; + print "\t\t\t\t\n"; + + + print "\t\t\t\n"; + + + } + else{ + print "\t\t\t\n"; + } + print "\t\t\t\n\n"; +} + + +sub get_gflops { + switch ($_[0]) { + case "bordeplage" { print "5.2297E9" } + case "bordereau" { print "8.8925E9" } + case "borderline" { print "13.357E9" } + + case "chicon" { print "8.9618E9" } + case "chimint" { print "23.531E9" } + case "chinqchint" { print "22.270E9" } + case "chirloute" { print "24.473E9" } + + case "adonis" { print "23.681E9" } + case "edel" { print "23.492E9" } + case "genepi" { print "21.175E9" } + + case "capricorne" { print "4.7233E9" } + case "sagittaire" { print "5.6693E9" } + + case "graphene" { print "16.673E9" } + case "griffon" { print "20.678E9" } + + case "gdx" { print "4.7153E9" } + case "netgdx" { print "4.7144E9" } + + case "paradent" { print "21.496E9" } + case "paramount" { print "12.910E9" } + case "parapide" { print "30.130E9" } + case "parapluie" { print "27.391E9" } + + case "helios" { print "7.7318E9" } + case "sol" { print "8.9388E9" } + case "suno" { print "23.530E9" } + + case "pastel" { print "9.5674E9" } + case "violette" { print "5.1143E9" } + + case "default" { print "3.542E9" } + else { print "xxxxxxx" } + } +} diff --git a/buildtools/Cmake/generate_peer_platform.pl b/buildtools/Cmake/generate_peer_platform.pl index 778aa8ef64..91f8ca5004 100755 --- a/buildtools/Cmake/generate_peer_platform.pl +++ b/buildtools/Cmake/generate_peer_platform.pl @@ -15,11 +15,18 @@ print "\n\n"; print "\t\n"; -for($i=0 ; $i<$nb_peer ; $i++){ - print "\t\t\n\n"; -} +my $line; +open SITES_LIGNE, $ARGV[0] or die "Unable to open $ARGV[1]\n"; +while(defined($line=)) +{ + #278 7.2 -9.4 h 2.3 + if($line =~ /^(.*) (.*) (.*) h (.*)$/) + { + print "\t\t\n\n"; + } +} print "\t\t\n\t\t\n"; print "\t\n"; diff --git a/buildtools/Cmake/gras_config.h.in b/buildtools/Cmake/gras_config.h.in index a39a90f474..9fa4ca4ea5 100644 --- a/buildtools/Cmake/gras_config.h.in +++ b/buildtools/Cmake/gras_config.h.in @@ -16,6 +16,9 @@ #cmakedefine SIZEOF_INT @SIZEOF_INT@ #cmakedefine SIZEOF_VOIDP @SIZEOF_VOIDP@ +/* If __thread is available */ +#cmakedefine HAVE_THREAD_LOCAL_STORAGE @HAVE_THREAD_LOCAL_STORAGE@ + #ifndef __STRICT_ANSI__ #cmakedefine __STRICT_ANSI__ @__STRICT_ANSI__@ #endif @@ -30,6 +33,7 @@ #cmakedefine _WIN64 @_WIN64@ //this variable is set if it is a 64 bits windows platform #cmakedefine __VISUALC__ @__VISUALC__@ #cmakedefine __BORLANDC__ @__BORLANDC__@ +#cmakedefine APPLE @APPLE@ #ifdef _XBT_WIN32 #ifndef __GNUC__ #cmakedefine __GNUC__ @__GNUC__@ @@ -39,8 +43,8 @@ #cmakedefine MMALLOC_WANT_OVERIDE_LEGACY @MMALLOC_WANT_OVERIDE_LEGACY@ #cmakedefine HAVE_MC @HAVE_MC@ -/* Set to true if lib pcre is present */ -#cmakedefine HAVE_PCRE_LIB @HAVE_PCRE_LIB@ +/* 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@ @@ -96,6 +100,7 @@ #cmakedefine PROCESSOR_i686 @PROCESSOR_i686@ #cmakedefine PROCESSOR_x86_64 @PROCESSOR_x86_64@ #cmakedefine CMAKE_SYSTEM_PROCESSOR @CMAKE_SYSTEM_PROCESSOR@ +#cmakedefine HAVE_RAWCTX @HAVE_RAWCTX@ /* Defined if arrays in struct can straddle struct alignment boundaries. This is like than the structure compaction above, but this time, the argument to @@ -141,6 +146,9 @@ /* Indicates that we have GTNETS support */ #cmakedefine HAVE_GTNETS @HAVE_GTNETS@ +/* Indicates that we have NS3 support */ +#cmakedefine HAVE_NS3 @HAVE_NS3@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_INTTYPES_H @HAVE_INTTYPES_H@ diff --git a/buildtools/Cmake/memcheck_tests.cmake b/buildtools/Cmake/memcheck_tests.cmake index f1452ca0e4..0c24cd0e55 100644 --- a/buildtools/Cmake/memcheck_tests.cmake +++ b/buildtools/Cmake/memcheck_tests.cmake @@ -533,9 +533,6 @@ ADD_TEST(memcheck-tracing-ms-3 rm -rf tracing/ms.trace tracing/ms.cat.plist trac ADD_TEST(memcheck-tracing-categories-0 ${CMAKE_BINARY_DIR}/examples/msg/tracing/categories --cfg=tracing:1 --cfg=tracing/filename:tracing/categories.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/categories.cat.plist --cfg=triva/uncategorized:tracing/categories.uncat.plist /tracing/platform.xml /tracing/deployment.xml --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) ADD_TEST(memcheck-tracing-categories-1 cat tracing/categories.trace --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) ADD_TEST(memcheck-tracing-categories-2 rm -rf tracing/categories.trace tracing/categories.cat.plist tracing/categories.uncat.plist --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) -ADD_TEST(memcheck-tracing-volume-0 ${CMAKE_BINARY_DIR}/examples/msg/tracing/volume --cfg=tracing:1 --cfg=tracing/filename:tracing/volume.trace --cfg=tracing/msg/volume:1 /tracing/platform.xml /tracing/deployment.xml --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) -ADD_TEST(memcheck-tracing-volume-1 cat tracing/volume.trace --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) -ADD_TEST(memcheck-tracing-volume-2 rm -rf tracing/volume.trace --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) ADD_TEST(memcheck-tracing-tasks-0 ${CMAKE_BINARY_DIR}/examples/msg/tracing/tasks --cfg=tracing:1 --cfg=tracing/msg/task:1 --cfg=tracing/filename:tracing/tasks.trace /tracing/platform.xml /tracing/deployment.xml --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) ADD_TEST(memcheck-tracing-tasks-1 cat tracing/tasks.trace --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) ADD_TEST(memcheck-tracing-tasks-2 rm -rf tracing/tasks.trace --cd /home/navarrop/simgrid/simgrid/trunk/examples/msg/) diff --git a/buildtools/Cmake/simgrid.nsi.in b/buildtools/Cmake/simgrid.nsi.in new file mode 100644 index 0000000000..d627181d35 --- /dev/null +++ b/buildtools/Cmake/simgrid.nsi.in @@ -0,0 +1,405 @@ +!include "MUI2.nsh" + +;-------------------------------- +;Interface Configuration + + !define MUI_HEADERIMAGE + !define MUI_HEADERIMAGE_BITMAP "@CMAKE_HOME_DIRECTORY@\doc\webcruft\simgrid_logo_win.bmp" ; optional + !define MUI_ABORTWARNING + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_LICENSE "@CMAKE_HOME_DIRECTORY@\LICENSE-LGPL-2.1" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +;Languages + !insertmacro MUI_LANGUAGE "English" + !insertmacro MUI_LANGUAGE "French" +;-------------------------------- + +Name "Simgrid" +outFile "SimGrid@SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@_@NSIS_WIN_VERSION@@BIN_EXE@" +Icon "@CMAKE_HOME_DIRECTORY@\doc\webcruft\SimGrid.ico" + +# set the default installation directory +InstallDir c:\SimGrid@SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@ + +Section "Libraries and Headers" LibSection + + setOutPath $INSTDIR + file @CMAKE_HOME_DIRECTORY@\AUTHORS + file @CMAKE_HOME_DIRECTORY@\Changelog + file @CMAKE_HOME_DIRECTORY@\COPYING + file @CMAKE_HOME_DIRECTORY@\LICENSE-LGPL-2.1 + file @CMAKE_HOME_DIRECTORY@\NEWS + + # install lib + CreateDirectory $INSTDIR\lib + setOutPath $INSTDIR\lib + file lib\libgras.@LIB_EXE@ + file lib\libsimgrid.@LIB_EXE@ + + #install headers + CreateDirectory $INSTDIR\include + setOutPath $INSTDIR\include + file @CMAKE_HOME_DIRECTORY@\include\gras.h + file @CMAKE_HOME_DIRECTORY@\include\xbt.h + file include\simgrid_config.h + + CreateDirectory $INSTDIR\include\xbt + setOutPath $INSTDIR\include\xbt + file @CMAKE_HOME_DIRECTORY@\include\xbt\misc.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\sysdep.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\virtu.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\str.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\strbuff.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\hash.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\function_types.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\asserts.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\ex.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\log.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\module.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\mallocator.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\dynar.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\dict.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\set.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\heap.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\graph.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\fifo.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\swag.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\lib.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\matrix.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\peer.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\config.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\cunit.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\graphxml_parse.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\graphxml.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\time.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\synchro.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\synchro_core.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\queue.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\setset.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\mmalloc.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\replay_trace_reader.h + file @CMAKE_HOME_DIRECTORY@\include\xbt\parmap.h + + CreateDirectory $INSTDIR\include\mc + setOutPath $INSTDIR\include\mc + file @CMAKE_HOME_DIRECTORY@\include\mc\modelchecker.h + + CreateDirectory $INSTDIR\include\msg + setOutPath $INSTDIR\include\msg + file @CMAKE_HOME_DIRECTORY@\include\msg\msg.h + file @CMAKE_HOME_DIRECTORY@\include\msg\datatypes.h + + CreateDirectory $INSTDIR\include\simdag + setOutPath $INSTDIR\include\simdag + file @CMAKE_HOME_DIRECTORY@\include\simdag\simdag.h + file @CMAKE_HOME_DIRECTORY@\include\simdag\datatypes.h + + CreateDirectory $INSTDIR\include\smpi + setOutPath $INSTDIR\include\smpi + file @CMAKE_HOME_DIRECTORY@\include\smpi\smpi.h + file @CMAKE_HOME_DIRECTORY@\include\smpi\mpi.h + file @CMAKE_HOME_DIRECTORY@\include\smpi\mpif.h + file @CMAKE_HOME_DIRECTORY@\include\smpi\smpi_cocci.h + file include\smpi\smpif.h + + CreateDirectory $INSTDIR\include\surf + setOutPath $INSTDIR\include\surf + file @CMAKE_HOME_DIRECTORY@\include\surf\surfxml_parse.h + file @CMAKE_HOME_DIRECTORY@\include\surf\simgrid_dtd.h + file @CMAKE_HOME_DIRECTORY@\include\surf\surf_routing.h + + CreateDirectory $INSTDIR\include\gras + setOutPath $INSTDIR\include\gras + file @CMAKE_HOME_DIRECTORY@\include\gras\datadesc.h + file @CMAKE_HOME_DIRECTORY@\include\gras\transport.h + file @CMAKE_HOME_DIRECTORY@\include\gras\virtu.h + file @CMAKE_HOME_DIRECTORY@\include\gras\emul.h + file @CMAKE_HOME_DIRECTORY@\include\gras\process.h + file @CMAKE_HOME_DIRECTORY@\include\gras\module.h + file @CMAKE_HOME_DIRECTORY@\include\gras\messages.h + file @CMAKE_HOME_DIRECTORY@\include\gras\timer.h + + CreateDirectory $INSTDIR\include\amok + setOutPath $INSTDIR\include\amok + file @CMAKE_HOME_DIRECTORY@\include\amok\peermanagement.h + file @CMAKE_HOME_DIRECTORY@\include\amok\bandwidth.h + + CreateDirectory $INSTDIR\include\instr + setOutPath $INSTDIR\include\instr + file @CMAKE_HOME_DIRECTORY@\include\instr\instr.h + + CreateDirectory $INSTDIR\include\simix + setOutPath $INSTDIR\include\simix + file @CMAKE_HOME_DIRECTORY@\include\simix\simix.h + file @CMAKE_HOME_DIRECTORY@\include\simix\datatypes.h + file @CMAKE_HOME_DIRECTORY@\include\simix\context.h + +SectionEnd +Section "Binaries" BinSection + + # insatll bin + CreateDirectory $INSTDIR\bin + setOutPath $INSTDIR\bin + file bin\colorize + file bin\graphicator@BIN_EXE@ + file bin\gras_stub_generator@BIN_EXE@ + file bin\simgrid_update_xml + file bin\smpicc + file bin\smpif2c + file bin\smpiff + file bin\smpirun + file bin\tesh + +SectionEnd +Section "Documentation" DocSection + + # install doc + CreateDirectory $INSTDIR\doc + setOutPath $INSTDIR\doc + file /nonfatal /r @CMAKE_HOME_DIRECTORY@\doc\html + # create a shortcut in the start menu programs directory + CreateDirectory "$SMPROGRAMS\SimGrid" + createShortCut "$SMPROGRAMS\SimGrid\Documentation.lnk" "$INSTDIR\doc\html\index.html" + createShortCut "$SMPROGRAMS\SimGrid\Website.lnk" "http://simgrid.gforge.inria.fr/" + +SectionEnd +Section "Examples" ExamplesSection + + CreateDirectory $INSTDIR\examples + setOutPath $INSTDIR\examples + + #install examples for platforms + file /r @CMAKE_HOME_DIRECTORY@\examples\platforms + + # install example HelloWorld + file /r @CMAKE_HOME_DIRECTORY@\doc\HelloWorld + + # install example MasterSlave + CreateDirectory $INSTDIR\examples\MasterSlave + setOutPath $INSTDIR\examples\MasterSlave + file @CMAKE_HOME_DIRECTORY@\examples\msg\masterslave\masterslave_forwarder.c + file @CMAKE_HOME_DIRECTORY@\examples\msg\masterslave\deployment_masterslave_forwarder.xml + file @CMAKE_HOME_DIRECTORY@\examples\msg\msg_platform.xml + file @CMAKE_HOME_DIRECTORY@\doc\HelloWorld\CMakeLists.txt + file @CMAKE_HOME_DIRECTORY@\doc\HelloWorld\FindPCRE.cmake + + # create shortcuts in the start menu programs directory + CreateDirectory "$SMPROGRAMS\SimGrid\Examples\" + createShortCut "$SMPROGRAMS\SimGrid\Examples\HelloWorld project.lnk" "$INSTDIR\examples\HelloWorld" + createShortCut "$SMPROGRAMS\SimGrid\Examples\MasterSlave project.lnk" "$INSTDIR\examples\MasterSlave" + +SectionEnd +Section "Pcre library" PCRESection + # install pcre library + CreateDirectory $INSTDIR\GnuWin32 + setOutPath $INSTDIR\GnuWin32 + file "@PATH_PCRE_LICENCE@\LICENCE" + + CreateDirectory $INSTDIR\GnuWin32\lib + setOutPath $INSTDIR\GnuWin32\lib + file @PATHLIBPCRE@\libpcre.a + file @PATHLIBPCRE@\libpcreposix.a + + CreateDirectory $INSTDIR\GnuWin32\include + setOutPath $INSTDIR\GnuWin32\include + file @PATH_PCRE_H@\pcre.h + file @PATH_PCRE_H@\pcreposix.h +SectionEnd + +# default section start +section + # define uninstaller name + writeUninstaller $INSTDIR\uninstaller@BIN_EXE@ + + # create a shortcut in the start menu programs directory + CreateDirectory "$SMPROGRAMS\SimGrid" + createShortCut "$SMPROGRAMS\SimGrid\Uninstall simgrid.lnk" "$INSTDIR\uninstaller@BIN_EXE@" + + # Include for some of the windows message defines + !include "winmessages.nsh" + # HKLM (all users) vs HKCU (current user) defines + !define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + !define env_hkcu 'HKCU "Environment"' + # Set Variables + WriteRegExpandStr ${env_hklm} SIMGRID_ROOT $INSTDIR + WriteRegExpandStr ${env_hklm} SIMGRID_VERSION @SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@ + + WriteRegExpandStr ${env_hklm} SIMGRID_PCRE_LIBRARY_PATH $INSTDIR\GnuWin32 + WriteRegExpandStr ${env_hklm} SIMGRID_PCRE_LIBRARY_VERSION "8.12" + + WriteRegStr HKCU "SOFTWARE\SimGrid" "Version" "@SIMGRID_VERSION_MAJOR@.@SIMGRID_VERSION_MINOR@.@SIMGRID_VERSION_PATCH@" + WriteRegStr HKCU "SOFTWARE\SimGrid" "InstallPath" "$INSTDIR" + + SetRebootFlag true + +# default section end +sectionEnd + +LangString DESC_LibSection ${LANG_ENGLISH} "Install Simgrid and gras libraries with associated headers." +LangString DESC_BinSection ${LANG_ENGLISH} "Install some useful tools for Simgrid." +LangString DESC_DocSection ${LANG_ENGLISH} "Generated (doxygen) documentation." +LangString DESC_ExamplesSection ${LANG_ENGLISH} "Simgrid's HelloWorld example and some classical platforms." +LangString DESC_PCRESection ${LANG_ENGLISH} "Install the PCRE and PCREPOSIX libraries for SimGrid." + +LangString DESC_LibSection ${LANG_FRENCH} "Installer les librairies Simgrid et Gras et leurs Entêtes." +LangString DESC_BinSection ${LANG_FRENCH} "Installer les outils optionnels." +LangString DESC_DocSection ${LANG_FRENCH} "Installer la documentation." +LangString DESC_ExamplesSection ${LANG_FRENCH} "Installer un exemple 'HelloWorld' et des fichiers de plate-formes types." +LangString DESC_PCRESection ${LANG_FRENCH} "Installer les librairies PCRE et PCREPOSIX for SimGrid." + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${LibSection} $(DESC_LibSection) + !insertmacro MUI_DESCRIPTION_TEXT ${BinSection} $(DESC_BinSection) + !insertmacro MUI_DESCRIPTION_TEXT ${DocSection} $(DESC_DocSection) + !insertmacro MUI_DESCRIPTION_TEXT ${ExamplesSection} $(DESC_ExamplesSection) + !insertmacro MUI_DESCRIPTION_TEXT ${PCRESection} $(DESC_PCRESection) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +# create a section to define what the uninstaller does. +# the section will always be named "Uninstall" +section "Uninstall" + + # always delete uninstaller first + delete $INSTDIR\uninstaller@BIN_EXE@ + + # delete installed libs + delete $INSTDIR\lib\libgras.@LIB_EXE@ + delete $INSTDIR\lib\libsimgrid.@LIB_EXE@ + + # delete installed bin + delete $INSTDIR\bin\colorize + delete $INSTDIR\bin\graphicator@BIN_EXE@ + delete $INSTDIR\bin\gras_stub_generator@BIN_EXE@ + delete $INSTDIR\bin\simgrid_update_xml + delete $INSTDIR\bin\smpicc + delete $INSTDIR\bin\smpif2c + delete $INSTDIR\bin\smpiff + delete $INSTDIR\bin\smpirun + delete $INSTDIR\bin\tesh + + # delete installed headers + delete $INSTDIR\include\gras.h + delete $INSTDIR\include\xbt.h + delete $INSTDIR\include\simgrid_config.h + delete $INSTDIR\include\xbt\misc.h + delete $INSTDIR\include\xbt\sysdep.h + delete $INSTDIR\include\xbt\virtu.h + delete $INSTDIR\include\xbt\str.h + delete $INSTDIR\include\xbt\strbuff.h + delete $INSTDIR\include\xbt\hash.h + delete $INSTDIR\include\xbt\function_types.h + delete $INSTDIR\include\xbt\asserts.h + delete $INSTDIR\include\xbt\ex.h + delete $INSTDIR\include\xbt\log.h + delete $INSTDIR\include\xbt\module.h + delete $INSTDIR\include\xbt\mallocator.h + delete $INSTDIR\include\xbt\dynar.h + delete $INSTDIR\include\xbt\dict.h + delete $INSTDIR\include\xbt\set.h + delete $INSTDIR\include\xbt\heap.h + delete $INSTDIR\include\xbt\graph.h + delete $INSTDIR\include\xbt\fifo.h + delete $INSTDIR\include\xbt\swag.h + delete $INSTDIR\include\xbt\lib.h + delete $INSTDIR\include\xbt\matrix.h + delete $INSTDIR\include\xbt\peer.h + delete $INSTDIR\include\xbt\config.h + delete $INSTDIR\include\xbt\cunit.h + delete $INSTDIR\include\xbt\graphxml_parse.h + delete $INSTDIR\include\xbt\graphxml.h + delete $INSTDIR\include\xbt\time.h + delete $INSTDIR\include\xbt\synchro.h + delete $INSTDIR\include\xbt\synchro_core.h + delete $INSTDIR\include\xbt\queue.h + delete $INSTDIR\include\xbt\setset.h + delete $INSTDIR\include\xbt\mmalloc.h + delete $INSTDIR\include\xbt\replay_trace_reader.h + delete $INSTDIR\include\xbt\parmap.h + delete $INSTDIR\include\mc\modelchecker.h + delete $INSTDIR\include\msg\msg.h + delete $INSTDIR\include\msg\datatypes.h + delete $INSTDIR\include\simdag\simdag.h + delete $INSTDIR\include\simdag\datatypes.h + delete $INSTDIR\include\smpi\smpi.h + delete $INSTDIR\include\smpi\mpi.h + delete $INSTDIR\include\smpi\mpif.h + delete $INSTDIR\include\smpi\smpi_cocci.h + delete $INSTDIR\include\smpi\smpif.h + delete $INSTDIR\include\surf\surfxml_parse.h + delete $INSTDIR\include\surf\simgrid_dtd.h + delete $INSTDIR\include\surf\surf_routing.h + delete $INSTDIR\include\gras\datadesc.h + delete $INSTDIR\include\gras\transport.h + delete $INSTDIR\include\gras\virtu.h + delete $INSTDIR\include\gras\emul.h + delete $INSTDIR\include\gras\process.h + delete $INSTDIR\include\gras\module.h + delete $INSTDIR\include\gras\messages.h + delete $INSTDIR\include\gras\timer.h + delete $INSTDIR\include\amok\peermanagement.h + delete $INSTDIR\include\amok\bandwidth.h + delete $INSTDIR\include\instr\instr.h + delete $INSTDIR\include\simix\simix.h + delete $INSTDIR\include\simix\datatypes.h + delete $INSTDIR\include\simix\context.h + + # delete link + delete "$SMPROGRAMS\SimGrid\Uninstall simgrid.lnk" + delete "$SMPROGRAMS\SimGrid\Documentation.lnk" + delete "$SMPROGRAMS\SimGrid\Website.lnk" + delete "$SMPROGRAMS\SimGrid\Examples\HelloWorld project.lnk" + delete "$SMPROGRAMS\SimGrid\Examples\MasterSlave project.lnk" + + # delete EXTRA FILES + delete $INSTDIR\AUTHORS + delete $INSTDIR\Changelog + delete $INSTDIR\COPYING + delete $INSTDIR\LICENSE-LGPL-2.1 + delete $INSTDIR\NEWS + + # now delete directories + RMDir "$INSTDIR\bin" + RMDir "$INSTDIR\lib" + RMDir "$INSTDIR\include\simix" + RMDir "$INSTDIR\include\instr" + RMDir "$INSTDIR\include\amok" + RMDir "$INSTDIR\include\gras" + RMDir "$INSTDIR\include\surf" + RMDir "$INSTDIR\include\smpi" + RMDir "$INSTDIR\include\simdag" + RMDir "$INSTDIR\include\msg" + RMDir "$INSTDIR\include\mc" + RMDir "$INSTDIR\include\xbt" + RMDir "$INSTDIR\include" + RMDir /r "$INSTDIR\doc" + RMDir /r "$INSTDIR\examples" + RMDir "$SMPROGRAMS\SimGrid\Examples" + RMDir "$SMPROGRAMS\SimGrid" + + # delete PCRE + RMDir /r "$INSTDIR\GnuWin32" + + # Delete variable + DeleteRegValue ${env_hklm} SIMGRID_ROOT + DeleteRegValue ${env_hklm} SIMGRID_VERSION + DeleteRegValue ${env_hklm} SIMGRID_PCRE_LIBRARY_PATH + DeleteRegValue ${env_hklm} SIMGRID_PCRE_LIBRARY_VERSION + DeleteRegKey HKCU "SOFTWARE\SimGrid" + + # delete INSTDIR + RMDir /r "$INSTDIR" + +# uninstall section end +sectionEnd \ No newline at end of file diff --git a/buildtools/Cmake/tesh.pl b/buildtools/Cmake/tesh.pl index 83199f5dae..a5b53c437a 100755 --- a/buildtools/Cmake/tesh.pl +++ b/buildtools/Cmake/tesh.pl @@ -1,30 +1,133 @@ -#! /usr/bin/perl -w +#! /usr/bin/perl +eval 'exec perl -S $0 ${1+"$@"}' + if $running_under_some_shell; +=encoding UTF-8 + +=head1 NAME + +tesh -- testing shell + +=head1 SYNOPSIS + +B [I] I + +=cut +my($bindir); +my($srcdir); +my $path = $0; +$path =~ s|[^/]*$||; +push @INC,$path; + +use Getopt::Long qw(GetOptions); use strict; use Term::ANSIColor; use IPC::Open3; -if($#ARGV < 0) -{ - die "Usage: tesh.pl \n"; +my($OS)=`echo %OS%`; +if($OS eq "%OS%"){ + $OS = "UNIX"; +} +else{ + $OS = "WIN"; +} + +print "OS: ".$OS."\n"; + +# make sure we received a tesh file +scalar @ARGV > 0 || die "Usage:\n tesh [*options*] *tesh_file*\n"; + +#Add current directory to path +$ENV{PATH} = "$ENV{PATH}:."; + + +## +## Command line option handling +## + +# option handling helper subs +sub cd_cmd { + my $directory=$_[1]; + if (-e $directory && -d $directory) { + chdir("$directory"); + print "[Tesh/INFO] change directory to $directory\n"; + } elsif (-e $directory) { + die "[Tesh/CRITICAL] Cannot change directory to '$directory': it is not a directory\n"; + } else { + die "[Tesh/CRITICAL] Cannot change directory to '$directory': no such directory\n"; + } +} + +sub setenv_cmd { + if ($_[1] =~ /^(.*)=(.*)$/) { + my($var,$ctn)=($1,$2); + + if($var =~ /bindir/){ + print "[Tesh/INFO] setenv $var=$ctn\n"; + $bindir = $ctn; + } + else + { + if($var =~ /srcdir/){ + $srcdir = $ctn; + } + else{ + $ENV{$var} = $ctn; + print "[Tesh/INFO] setenv $var=$ctn\n"; + } + } + } else { + die "[Tesh/CRITICAL] Malformed argument to setenv: expected 'name=value' but got '$_[1]'\n"; + } +} + +# Main option parsing sub +my $tesh_file; +sub get_options { + # remove the tesh file from the ARGV used + my @ARGV = @_; + $tesh_file = pop @ARGV; + + # temporary arrays for GetOption + my @verbose = (); + my @cfg; + my $log; # ignored + + my %opt = ( + "help" => 0, + "debug" => 0, + "verbose" => 0 + ); + + Getopt::Long::config('bundling', 'no_getopt_compat', 'no_auto_abbrev'); + + GetOptions( + 'help|h' => \$opt{'help'}, + + 'verbose|v' => \@verbose, + 'debug|d' => \$opt{"debug"}, + + 'cd=s' => \&cd_cmd, + 'setenv=s' => \&setenv_cmd, + 'cfg=s' => \@cfg, + 'log=s' => \$log, + ); + + $opt{'verbose'} = scalar @verbose; + foreach (@cfg) { + $opt{'cfg'} .= " --cfg=$_"; + } + return %opt; } -my($line1); -my($line2); -my($execline); -my($command); -my($command_tesh); -my($command_executed)=0; -my($expected_result_line)=0; +my %opts = get_options(@ARGV); + +## +## File parsing +## my($sort)=0; my($nb_arg)=0; -my(@list1)=(); -my(@list2)=(); -my(@list3)=(); -my(@list_of_commands)=(); -my(@buffer)=(); my($timeout)=0; -my($encore)=0; my($old_buffer); my($linebis); my($SIGABRT)=0; @@ -34,470 +137,304 @@ my($return)=-1; my($pid); my($result); my($result_err); -my($fich_name); my($forked); my($config)=""; my($tesh_command)=0; my(@buffer_tesh)=(); -#options -do{ - if($ARGV[$nb_arg] =~ /^--cd$/) - { - $nb_arg++; - if(!$ARGV[$nb_arg] or $ARGV[$nb_arg] =~ /^--/){die "Usage: tesh.pl --cd \n";} - my($directory)=$ARGV[$nb_arg]; - if( -e $directory) - { - chdir("$directory"); - print "[Tesh/INFO] --cd \"$directory\"\n"; - } - else - { - die "[Tesh/CRITICAL] Directory not found : \"$directory\"\n"; - } - $nb_arg++; - } - elsif($ARGV[$nb_arg] =~ /^--setenv$/) - { - $nb_arg++; - if(!$ARGV[$nb_arg] or $ARGV[$nb_arg] =~ /^--/){die "Usage: tesh.pl --setenv environment_variable\n";} - $ARGV[$nb_arg] =~ /^(.*)=(.*)$/; - my($var)=$1; - my($content)=$2; - $ENV{$var} = $content; - print "[Tesh/INFO] --setenv $var=$content\n"; - $nb_arg++; - } - elsif($ARGV[$nb_arg] =~ /^--cfg$/) - { - $nb_arg++; - if(!$ARGV[$nb_arg] or $ARGV[$nb_arg] =~ /^--/){die "Usage: tesh.pl --setenv environment_variable\n";} - $config = "$config--cfg=$ARGV[$nb_arg] "; - print "[Tesh/INFO] $config\n"; - $nb_arg++; +eval { + use POSIX; + sub exit_status { + my $status = shift; + if (POSIX::WIFEXITED($status)) { + return "returned code ".POSIX::WEXITSTATUS($status); + } elsif (POSIX::WIFSIGNALED($status)) { + return "got signal ".$SIG{POSIX::WTERMSIG($status)}; } - elsif($ARGV[$nb_arg] =~ /^--verbose$/) - { - $verbose=1;$nb_arg++; - } - else - { - print "[Tesh/CRITICAL] Unrecognized option : $ARGV[$nb_arg]\n"; - $nb_arg++; - } -}while(($nb_arg) < $#ARGV); + return "Unparsable status. Is the process stopped?"; + } +}; +if ($@) { # no POSIX available? + warn "POSIX not usable to parse the return value of forked child: $@\n"; + sub exit_status { + return "returned code 0"; + } +} -#Add current directory to path -$ENV{PATH} = "$ENV{PATH}:."; +sub exec_cmd { + my %cmd = %{$_[0]}; + if ($opts{'debug'}) { + print "IN BEGIN\n"; + map {print " $_"} @{$cmd{'in'}}; + print "IN END\n"; + print "OUT BEGIN\n"; + map {print " $_"} @{$cmd{'out'}}; + print "OUT END\n"; + print "CMD: $cmd{'cmd'}\n"; + } -#tesh file -if(!$ARGV[$nb_arg]){die "tesh.pl \n";} -print "[Tesh/INFO] load file : $ARGV[$nb_arg]\n"; -my($file)=$ARGV[$nb_arg]; -open SH_LIGNE, $file or die "[Tesh/CRITICAL] Unable to open $file. $!\n"; - -while(defined($line1=)) -{ - if($line1 =~ /^\< \$ /){ # arg command line - $line1 =~ s/\${EXEEXT:=}//g; - $line1 =~ s/^\< \$\ *//g; - $line1 =~ s/^.\/lua/lua/g; - $line1 =~ s/^.\/ruby/ruby/g; - $line1 =~ s/^.\///g; - $line1 =~ s/^tesh/.\/tesh/g; - $line1 =~ s/\(%i:%P@%h\)/\\\(%i:%P@%h\\\)/g; - chomp $line1; - $command_tesh = $line1; - print "[Tesh/INFO] arg_exec_line : $command_tesh\n"; - } - elsif($line1 =~ /^\< \< /){ # arg buffer line - $line1 =~ s/^\< \<\ *//g; - chomp $line1; - print "[Tesh/INFO] arg_buffer_line : $line1\n"; - push @buffer_tesh, "$line1\n"; - } - elsif($line1 =~ /^\< \> /){ # arg output line - $line1 =~ s/^\< \>\ *//g; - $line1 =~ s/\r//g; - chomp $line1; - push @list2, $line1; - print "[Tesh/INFO] arg_output_line : $line1\n"; - $expected_result_line = 1; - } - elsif($line1 =~ /^\$ mkfile/){ # "mkfile" command line - $line1 =~ s/\$ //g; - $line1 =~ s/mkfile//g; - chomp $line1; - $fich_name = $line1; - $line1 =(); - print "[Tesh/INFO] exec_line : mkfile $fich_name\n"; - `rm -f $fich_name`; - open(FILE,">$fich_name") or die "[Tesh/CRITICAL] Unable to make file : $fich_name. $!\n"; - print FILE @buffer; - close(FILE); - @buffer = (); - } - elsif($line1 =~ /^\$ cd/){ # "cd" command line - $line1 =~ s/\$ //g; - chomp $line1; - print "[Tesh/INFO] exec_line : $line1\n"; - $line1 =~ s/cd //g; - chdir("$line1") or die "[Tesh/CRITICAL] Unable to open $line1. $!\n"; - } - elsif($line1 =~ /^\$ /){ #command line - if($line1 =~ /^\$ .\/tesh/){ # tesh command line - $tesh_command = 1; - @buffer = @buffer_tesh; - @buffer_tesh=(); - } - $line1 =~ s/\${EXEEXT:=}//g; - $line1 =~ s/^\$\ *//g; - $line1 =~ s/^.\/lua/lua/g; - $line1 =~ s/^.\/ruby/ruby/g; - $line1 =~ s/^.\///g; - $line1 =~ s/^tesh/.\/tesh/g; - $line1 =~ s/\(%i:%P@%h\)/\\\(%i:%P@%h\\\)/g; - chomp $line1; - $line1 = "$line1 $config"; - - if(@list1){ - print color("red"); - print "[Tesh/CRITICAL] -\n"; - print "[Tesh/CRITICAL] + @list1"; - print color("reset"), "\n"; - die;} - if(@list_of_commands){ # need parallel execution - push @list_of_commands, $line1; - print "[Tesh/INFO] exec_line : $line1\n"; - } - else{ - print "[Tesh/INFO] exec_line : $line1\n"; - if($tesh_command) - { $execline = $command_tesh; - $tesh_command=0;} - else - { $execline = $line1;} - $pid = open3(\*IN, \*OUT, \*OUT, $execline ); - if( $timeout){ - $forked = fork();die "fork() failed: $!" unless defined $forked; - if ( $forked == 0 ) - { - sleep $timeout; - kill(9, $pid); - exit; - } - } - - while(@buffer) - { - $line1 = shift (@buffer); - print IN $line1; - } - close IN ; - - waitpid( $pid, 0 ); - if($timeout){kill(9, $forked);$timeout=0;} - $timeout = 0; - - while(defined($linebis=)) - { - $linebis =~ s/\r//g; - $linebis =~ s/^( )*//g; - chomp $linebis; - push @list1,"$linebis"; - } - close OUT; - $command_executed = 1; - } - } - elsif($line1 =~ /^\& /){ # parallel command line - $command_executed = 0; - $expected_result_line = 0; - $line1 =~ s/\${EXEEXT:=}//g; - $line1 =~ s/^\& //g; - $line1 =~ s/^.\/lua/lua/g; - $line1 =~ s/^.\/ruby/ruby/g; - $line1 =~ s/^.\///g; - $line1 =~ s/\(%i:%P@%h\)/\\\(%i:%P@%h\\\)/g; - chomp $line1; - $line1 = "$line1 $config"; - - $execline = "$line1"; - print "[Tesh/INFO] exec_line : $execline\n"; - push @list_of_commands, $execline; - } - elsif($line1 =~ /^\>/){ #expected result line - $line1 =~ s/^\>( )*//g; - $line1 =~ s/\r//g; - chomp $line1; - push @list2, $line1; - $expected_result_line = 1; - } - elsif($line1 =~ /^\)) - { - $linebis =~ s/\r//g; - $linebis =~ s/^( )*//g; - chomp $linebis; - push @list1,"$linebis"; - } - close OUT; - $command_executed = 1; - } - elsif($command_executed and $expected_result_line) - { - if($no_output_ignore){ - @buffer = (); - if($sort == 1) - { - @list3 = sort @list1; - @list1=(); - @list1=@list3; - @list3=(); - - @list3 = sort @list2; - @list2=(); - @list2=@list3; - @list3=(); - - $sort=0; - } - if($SIGABRT) - { - push @list2,"Aborted"; - $SIGABRT = 0; - } - - while(@list1 or @list2) - { - if(@list1){$line1 = shift (@list1);$expected_result_line = "x$line1";} - if(@list2){$line2 = shift (@list2);$command_executed = "x$line2";} - if($command_executed and $expected_result_line) - { - - if($line1 eq $line2){ - if($verbose == 1){print color("green"),"[Tesh/VERB] $line1\n",color("reset");} - else{push @buffer, "[Tesh/CRITICAL] $line1\n";} - - } - else - { if($verbose == 0){print color("green"),@buffer,color("reset");} - if($line2) {print color("red"), "[Tesh/CRITICAL] - $line2",color("reset"),"\n";} - if($line1) {print color("red"), "[Tesh/CRITICAL] + $line1",color("reset"),"\n";} - die; - } - } - else - { if($verbose == 0){print color("green"),@buffer,color("reset");} - if($line2) {print color("red"), "[Tesh/CRITICAL] - $line2",color("reset"),"\n";} - if($line1) {print color("red"), "[Tesh/CRITICAL] + $line1",color("reset"),"\n";} - die; - } - } - }else{$no_output_ignore = 1;} - $command_executed = 0; - $expected_result_line = 0; - @list1=(); - @list2=(); - @buffer = (); - $tesh_command=0; - @buffer_tesh=(); + $cmd{'cmd'} =~ s/\${bindir:=}/$bindir/g; + $cmd{'cmd'} =~ s/\${srcdir:=}/$srcdir/g; + $cmd{'cmd'} =~ s/\${bindir:=.}/$bindir/g; + $cmd{'cmd'} =~ s/\${srcdir:=.}/$srcdir/g; + $cmd{'cmd'} =~ s/\${bindir}/$bindir/g; + $cmd{'cmd'} =~ s/\${srcdir}/$srcdir/g; + $cmd{'cmd'} =~ s|^\./||g; +# $cmd{'cmd'} =~ s|tesh|tesh.pl|g; + $cmd{'cmd'} =~ s/\(%i:%P@%h\)/\\\(%i:%P@%h\\\)/g; + $cmd{'cmd'} .= " $opts{'cfg'}" if (defined($opts{'cfg'}) && length($opts{'cfg'})); + + print "[$cmd{'file'}:$cmd{'line'}] $cmd{'cmd'}\n"; + + ### + # exec the command line + ### + $pid = open3(\*IN, \*OUT, \*OUT, $cmd{'cmd'} ); + + # if timeout specified, fork and kill executing child at the end of timeout + if ($timeout){ + $forked = fork(); + die "fork() failed: $!" unless defined $forked; + if ( $forked == 0 ) { # child + sleep $timeout; + kill(9, $pid); + exit; } + } + + # push all provided input to executing child + map { print IN "$_\n" } $cmd{'in'}; + close IN; + # pop all output from executing child + my @got; + while(defined(my $got=)) { + $got =~ s/\r//g; + #$got =~ s/^( )*//g; + chomp $got; + push @got, "$got"; + } + close OUT; + + # Cleanup the executing child, and kill the timeouter brother on need + $cmd{'return'} = 0 unless defined($cmd{'return'}); + my $wantret = "returned code ".(defined($cmd{'return'})? $cmd{'return'} : 0); + waitpid ($pid, 0); + my $gotret = exit_status($?); + if($gotret ne $wantret) { + my $msg = "Test suite `$cmd{'file'}': NOK (<$cmd{'file'}:$cmd{'line'}> $gotret)\n". + "Output of <$cmd{'file'}:$cmd{'line'}> so far:\n"; + map {$msg .= "|| $_\n"} @got; + print STDERR "$msg"; + exit(1); + } + if($timeout){kill(9, $forked);$timeout=0;} + $timeout = 0; + + ### + # Check the result of execution + ### + my $diff = build_diff(\@{$cmd{'out'}}, \@got); + if (length $diff) { + print color("red")."[TESH/CRITICAL$$] Output mismatch\n"; + map { print "[TESH/CRITICAL] $_\n" } split(/\n/,$diff); + print color("reset"); + die "Tesh failed\n"; + } } -if(@list_of_commands){ # need parallel execution - $execline = (); - $sort = 1; # need sort output - while(@list_of_commands) - { - $command = shift (@list_of_commands); - if($execline){$execline = "$command & $execline";} - else{$execline = "$command";} +sub mkfile_cmd { + my %cmd = %{$_[0]}; + my $file = $cmd{'arg'}; + print "[Tesh/INFO] mkfile $file\n"; + + die "[TESH/CRITICAL] no input provided to mkfile\n" unless defined($cmd{'in'}) && scalar @{$cmd{'in'}}; + unlink($file); + open(FILE,">$file") or die "[Tesh/CRITICAL] Unable to create file $file: $!\n"; + print FILE join("\n", @{$cmd{'in'}}); + print FILE "\n" if (scalar @{$cmd{'in'}} > 0); + close(FILE); +} + +# parse tesh file +print "Test suite $tesh_file\n"; +open TESH_FILE, $tesh_file or die "[Tesh/CRITICAL] Unable to open $tesh_file $!\n"; + + +my %cmd; # everything about the next command to run +my $line_num=0; +LINE: while (defined(my $line=)) { + $line_num++; + chomp $line; + print "[TESH/debug] $line_num: $line\n" if $opts{'debug'}; + + # deal with line continuations + while ($line =~ /^(.*?)\\$/) { + my $next=; + die "[TESH/CRITICAL] Continued line at end of file\n" + unless defined($next); + chomp $next; + print "[TESH/debug] $line_num: $next\n" if $opts{'debug'}; + $line = $1.$next; + } + + # Push delayed commands on empty lines + unless ($line =~ m/^(..)(.*)$/) { + if (defined($cmd{'cmd'})) { + exec_cmd(\%cmd); + %cmd = (); } - print "[Tesh/INFO] exec_line : $execline\n"; - $pid = open3(\*IN, \*OUT, \*OUT,"$execline"); - - if( $timeout){ - $forked = fork();die "fork() failed: $!" unless defined $forked; - if ( $forked == 0 ) - { - sleep $timeout; - kill(9, $pid); - exit; - } + next LINE; + } + + my ($cmd,$arg) = ($1,$2); + $arg =~ s/\r//g; + + # handle the commands + if ($cmd =~ /^#/) { #comment + } elsif ($cmd eq '> '){ #expected result line + print "[TESH/debug] push expected result\n" if $opts{'debug'}; + push @{$cmd{'out'}}, $arg; + + } elsif ($cmd eq '< ') { # provided input + print "[TESH/debug] push provided input\n" if $opts{'debug'}; + push @{$cmd{'in'}}, $arg; + + } elsif ($cmd eq 'p ') { # comment + print "[Tesh/INFO] $arg\n"; + + } elsif ($cmd eq '$ ') { # Command + # if we have something buffered, run it now + if (defined($cmd{'cmd'})) { + exec_cmd(\%cmd); + %cmd = (); } - - while(@buffer) - { - $line1 = shift (@buffer); - print IN $line1; + if ($arg =~ /^ *mkfile /){ # "mkfile" command line + die "[TESH/CRITICAL] Output expected from mkfile command!\n" if scalar @{cmd{'out'}}; + + $cmd{'arg'} = $arg; + $cmd{'arg'} =~ s/ *mkfile //; + mkfile_cmd(\%cmd); + %cmd = (); + + } elsif ($arg =~ /^ *cd /) { + die "[TESH/CRITICAL] Input provided to cd command!\n" if scalar @{cmd{'in'}}; + die "[TESH/CRITICAL] Output expected from cd command!\n" if scalar @{cmd{'out'}}; + + $arg =~ s/^ *cd //; + cd_cmd("",$arg); + %cmd = (); + + } else { # regular command + $cmd{'cmd'} = $arg; + $cmd{'file'} = $tesh_file; + $cmd{'line'} = $line_num; } - close IN ; - waitpid( $pid, 0 ); - if($timeout){kill(9, $forked);$timeout=0;} - $timeout = 0; + } + elsif($cmd eq '& '){ # parallel command line + $cmd{'background'} = 1; + $cmd{'cmd'} = $arg; + } + elsif($line =~ /^! output sort/){ #output sort + $cmd{'sort'} = 1; + } + elsif($line =~ /^! output ignore/){ #output ignore + $cmd{'output ignore'} = 1; + } + elsif($line =~ /^! expect signal SIGABRT$/) {#expect signal SIGABRT + $cmd{'expect'} = "SIGABRT"; + } + elsif($line =~ /^! expect return/){ #expect return + $line =~ s/^! expect return //g; + $line =~ s/\r//g; + $cmd{'return'} = $line; + } + elsif($line =~ /^! setenv/){ #setenv + $line =~ s/^! setenv //g; + $line =~ s/\r//g; + setenv_cmd($line); + } + elsif($line =~ /^! include/){ #output sort + print color("red"), "[Tesh/CRITICAL] need include"; + print color("reset"), "\n"; + die; + } + elsif($line =~ /^! timeout/){ #timeout + $line =~ s/^! timeout //; + $line =~ s/\r//g; + $cmd{'timeout'} = $line; + } else { + die "[TESH/CRITICAL] parse error: $line\n"; + } +} - @list1=(); - while(defined($linebis=)) - { - $linebis =~ s/\r//g; - $linebis =~ s/^( )*//g; - chomp $linebis; - push @list1,"$linebis"; - } - close OUT; - $command_executed = 1; +# Deal with last command +if (defined($cmd{'cmd'})) { + exec_cmd(\%cmd); + %cmd = (); } -if($command_executed and $expected_result_line ){ - if($no_output_ignore){ - @buffer = (); - if($sort == 1) - { - @list3 = sort @list1; - @list1=(); - @list1=@list3; - @list3=(); - - @list3 = sort @list2; - @list2=(); - @list2=@list3; - @list3=(); - - $sort=0; - } - if($SIGABRT) - { - push @list2,"Aborted"; - $SIGABRT = 0; - } - - while(@list1 or @list2) - { - if(@list1){$line1 = shift (@list1);$expected_result_line = "x$line1";} - if(@list2){$line2 = shift (@list2);$command_executed = "x$line2";} - if($command_executed and $expected_result_line) - { - if($line1 eq $line2){ - if($verbose == 1){print color("green"),"[Tesh/VERB] $line1\n",color("reset");} - else{push @buffer, "[Tesh/CRITICAL] $line1\n";} - - } - else - { if($verbose == 0){print color("green"),@buffer,color("reset");} - if($line2) {print color("red"), "[Tesh/CRITICAL] - $line2",color("reset"),"\n";} - if($line1) {print color("red"), "[Tesh/CRITICAL] + $line1",color("reset"),"\n";} - die; - } - } - else - { if($verbose == 0){print color("green"),@buffer,color("reset");} - if($line2) {print color("red"), "[Tesh/CRITICAL] - $line2",color("reset"),"\n";} - if($line1) {print color("red"), "[Tesh/CRITICAL] + $line1",color("reset"),"\n";} - die; - } - } - }else{$no_output_ignore = 1;} - $command_executed = 0; - $expected_result_line= 0; - @list1=(); - @list2=(); - @buffer = (); -} \ No newline at end of file +#my (@a,@b); +#push @a,"bl1"; push @b,"bl1"; +#push @a,"bl2"; push @b,"bl2"; +#push @a,"bl3"; push @b,"bl3"; +#push @a,"bl4"; push @b,"bl4"; +#push @a,"bl5"; push @b,"bl5"; +#push @a,"bl6"; push @b,"bl6"; +#push @a,"bl7"; push @b,"bl7"; +##push @a,"Perl"; push @b,"ruby"; +#push @a,"END1"; push @b,"END1"; +#push @a,"END2"; push @b,"END2"; +#push @a,"END3"; push @b,"END3"; +#push @a,"END4"; push @b,"END4"; +#push @a,"END5"; push @b,"END5"; +#push @a,"END6"; push @b,"END6"; +#push @a,"END7"; push @b,"END7"; +#print "Identical:\n". build_diff(\@a,\@b); + +#@a = (); @b =(); +#push @a,"AZE"; push @b,"EZA"; +#print "Different:\n".build_diff(\@a,\@b); + +use Diff qw(diff); # postpone a bit to have time to change INC + +sub build_diff { + my $res; + my $diff = Diff->new(@_); + + $diff->Base( 1 ); # Return line numbers, not indices + my $chunk_count = $diff->Next(-1); # Compute the amount of chuncks + return "" if ($chunk_count == 1 && $diff->Same()); + $diff->Reset(); + while( $diff->Next() ) { + my @same = $diff->Same(); + if ($diff->Same() ) { + if ($diff->Next(0) > 1) { # not first chunk: print 2 first lines + $res .= ' '.$same[0]."\n" ; + $res .= ' '.$same[1]."\n" if (scalar @same>1); + } + $res .= "...\n" if (scalar @same>2); +# $res .= $diff->Next(0)."/$chunk_count\n"; + if ($diff->Next(0) < $chunk_count) { # not last chunk: print 2 last lines + $res .= ' '.$same[scalar @same -2]."\n" if (scalar @same>1); + $res .= ' '.$same[scalar @same -1]."\n"; + } + } + next if $diff->Same(); + map { $res .= "- $_\n" } $diff->Items(1); + map { $res .= "+ $_\n" } $diff->Items(2); + } + return $res; +} + + diff --git a/buildtools/Cmake/test_g5k.xml b/buildtools/Cmake/test_g5k.xml new file mode 100644 index 0000000000..46898bdc04 --- /dev/null +++ b/buildtools/Cmake/test_g5k.xml @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buildtools/Cmake/test_prog/prog_mutex_timedlock.c b/buildtools/Cmake/test_prog/prog_mutex_timedlock.c index 1b0664a4a3..8c394edeba 100644 --- a/buildtools/Cmake/test_prog/prog_mutex_timedlock.c +++ b/buildtools/Cmake/test_prog/prog_mutex_timedlock.c @@ -6,9 +6,10 @@ #include -void main(void) +int main(void) { pthread_mutex_t s; const struct timespec t; sem_timedlock(&s, &t); + return 0; } diff --git a/buildtools/Cmake/test_prog/prog_sem_init.c b/buildtools/Cmake/test_prog/prog_sem_init.c index a745bddd83..5302a80562 100644 --- a/buildtools/Cmake/test_prog/prog_sem_init.c +++ b/buildtools/Cmake/test_prog/prog_sem_init.c @@ -6,8 +6,10 @@ #include -void main(void) +int main(void) { sem_t s; - sem_init(&s, 0, 0); + if (sem_init(&s, 0, 0) != 0) + return 1; + return 0; } diff --git a/buildtools/Cmake/test_prog/prog_sem_open.c b/buildtools/Cmake/test_prog/prog_sem_open.c new file mode 100644 index 0000000000..4679c32f1b --- /dev/null +++ b/buildtools/Cmake/test_prog/prog_sem_open.c @@ -0,0 +1,23 @@ +/* Copyright (c) 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include +#include +#include + +int main(void) { + sem_t * s; + + s = sem_open("/0", O_CREAT, 0644, 10); + if (s == SEM_FAILED){ +// printf("sem_open failed\n"); + return 1; + } +// printf("sem_open succeeded\n"); + return 0; +} diff --git a/buildtools/Cmake/test_prog/prog_thread_storage.c b/buildtools/Cmake/test_prog/prog_thread_storage.c new file mode 100644 index 0000000000..060be0a484 --- /dev/null +++ b/buildtools/Cmake/test_prog/prog_thread_storage.c @@ -0,0 +1,16 @@ +/* Copyright (c) 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include + +__thread int thread_specific_variable = 0; + +int main(void) { + + thread_specific_variable++; + printf("%d\n", thread_specific_variable); + return 0; +} diff --git a/buildtools/Cmake/transform_optorsim_platform.pl b/buildtools/Cmake/transform_optorsim_platform.pl new file mode 100644 index 0000000000..2efc350f57 --- /dev/null +++ b/buildtools/Cmake/transform_optorsim_platform.pl @@ -0,0 +1,104 @@ +#!/usr/bin/perl -w +use strict; + +if($#ARGV!=0) { + die "Usage: perl transfrom_optorsim_platform.pl \n"; +} + +my($conf_file)=$ARGV[0]; + +open FILE, $conf_file or die "Unable to open $conf_file"; + +print "\n"; +print "\n"; +print "\n"; +print "\n"; + +my $line; +my @tokens; +my $token; +my $dst = 0; +my $src = 0; +my @list_of_name; +my $num_link = 0; + +my @links = (); +my @routers = (); +my @hosts = (); +my @routes = (); +my $power; +while(defined($line=)) +{ + + if($line =~ /^#(.*)\)(.*)$/) + { + print "\n"; + push @list_of_name, $2; + } + elsif($line =~ /^([0-9]*) ([0-9]*) ([0-9]*) (.*)$/) + { + if($1.$2.$3 == "000"){ + if(@list_of_name){ + push @routers, "\t\n"; + } + else{ + push @routers, "\t\n"; + } + } + else{ + $power = $1 * $3; + if($power == 0){ + $power=1; + } + if(@list_of_name){ + push @hosts, "\t\n"; + } + else{ + push @hosts, "\t\n"; + } + } + my $table = $4; + @tokens = split(/ /,$table); + foreach $token (@tokens) { + if($token != "0"){ + if($src <= $dst){ + + push @links, "\t\n"; + + if(@list_of_name){ + push @routes, "\t\n"; + } + else{ + push @routes, "\t\n"; + } + push @routes, "\t\t\n"; + push @routes, "\t\n"; + $num_link++; + } + } + $dst++; + } + $src++; + $dst = 0; + } + else + { + die; + } + + +} +close(FILE); + +print @hosts; +print "\n"; +print @routers; +print "\n"; +print @links; +print "\n"; +print @routes; + +print "\n"; +print ""; + +print " \n"; \ No newline at end of file diff --git a/buildtools/Cmake/update_tesh.pl b/buildtools/Cmake/update_tesh.pl old mode 100644 new mode 100755 diff --git a/buildtools/pipol/Experimental.sh b/buildtools/pipol/Experimental.sh old mode 100644 new mode 100755 index afdde6b057..afa30ee5ee --- a/buildtools/pipol/Experimental.sh +++ b/buildtools/pipol/Experimental.sh @@ -10,71 +10,62 @@ else fi cd ./pipol/$PIPOL_HOST -svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk simgrid-trunk --quiet -cd simgrid-trunk +git clone git://scm.gforge.inria.fr/simgrid/simgrid.git simgrid --quiet +cd simgrid -if [ x$PIPOL_IMAGE == "xamd64-windows-server-2008-64bits-navarro-2011-03-15-122256.dd.gz" ] ; then - cmake \ - -G"Unix Makefiles" \ - -Denable_lua=off \ - -Denable_tracing=off \ - -Denable_smpi=off \ - -Denable_supernovae=off \ - -Denable_compile_optimizations=off \ - -Denable_compile_warnings=off \ - -Denable_lib_static=off \ - -Denable_model-checking=off \ - -Denable_latency_bound_tracking=off \ - -Denable_gtnets=off . - ctest -D ExperimentalStart - ctest -D ExperimentalConfigure - ctest -D ExperimentalBuild - ctest -D ExperimentalSubmit +perl ./buildtools/pipol/cmake.pl +perl ./buildtools/pipol/ruby.pl + +if [ -e /usr/bin/gcc-4.6 ] ; then +export CC=gcc-4.6 +export CXX=g++-4.6 else +export CC=gcc +export CXX=g++ +fi + +#Those 3 lines is for GTNetS +#sh ./buildtools/pipol/install_gtnets.sh ./gtnets_install +#SIMGRID_ROOT=`pwd` +#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SIMGRID_ROOT/gtnets_install/lib + +#supernovae +cmake \ +-Denable_lua=on \ +-Denable_tracing=on \ +-Denable_smpi=on \ +-Denable_supernovae=on \ +-Denable_compile_optimizations=on \ +-Denable_compile_warnings=on \ +-Denable_lib_static=off \ +-Denable_model-checking=off \ +-Denable_latency_bound_tracking=off \ +-Drelease=on \ +-Denable_gtnets=off . + +ctest -D ExperimentalStart +ctest -D ExperimentalConfigure +ctest -D ExperimentalBuild +ctest -D ExperimentalTest +ctest -D ExperimentalSubmit +make clean - sh ./buildtools/pipol/install_gtnets.sh ./gtnets_install - SIMGRID_ROOT=`pwd` - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SIMGRID_ROOT/gtnets_install/lib - perl ./buildtools/pipol/cmake.pl - perl ./buildtools/pipol/ruby.pl - - #supernovae - cmake \ - -Denable_lua=on \ - -Denable_ruby=on \ - -Denable_java=on \ - -Denable_tracing=on \ - -Denable_smpi=on \ - -Denable_supernovae=on \ - -Denable_compile_optimizations=on \ - -Denable_compile_warnings=on \ - -Denable_lib_static=off \ - -Denable_model-checking=off \ - -Denable_latency_bound_tracking=off \ - -Denable_gtnets=off . - ctest -D ExperimentalStart - ctest -D ExperimentalConfigure - ctest -D ExperimentalBuild - ctest -D ExperimentalTest - ctest -D ExperimentalSubmit - make clean - - #MC - cmake \ - -Denable_latency_bound_tracking=on \ - -Denable_gtnets=on \ - -Dgtnets_path=./gtnets_install \ - -Denable_coverage=on \ - -Denable_model-checking=on \ - -Denable_compile_optimizations=off \ - -Denable_auto_install=on \ - -DCMAKE_INSTALL_PREFIX=./simgrid_install \ - -Denable_supernovae=off . - ctest -D ExperimentalStart - ctest -D ExperimentalConfigure - ctest -D ExperimentalBuild - ctest -D ExperimentalTest - ctest -D ExperimentalCoverage - ctest -D ExperimentalSubmit - make clean -fi \ No newline at end of file +#MC +cmake \ +-Denable_latency_bound_tracking=on \ +-Denable_gtnets=on \ +-Dgtnets_path=./gtnets_install \ +-Denable_coverage=on \ +-Denable_model-checking=on \ +-Denable_compile_optimizations=off \ +-Denable_auto_install=on \ +-DCMAKE_INSTALL_PREFIX=./simgrid_install \ +-Drelease=on \ +-Denable_supernovae=off . +ctest -D ExperimentalStart +ctest -D ExperimentalConfigure +ctest -D ExperimentalBuild +ctest -D ExperimentalTest +ctest -D ExperimentalCoverage +ctest -D ExperimentalSubmit +make clean diff --git a/buildtools/pipol/Experimental_bindings.sh b/buildtools/pipol/Experimental_bindings.sh old mode 100644 new mode 100755 index 348895db61..6f689e877e --- a/buildtools/pipol/Experimental_bindings.sh +++ b/buildtools/pipol/Experimental_bindings.sh @@ -10,14 +10,22 @@ else fi cd ./pipol/$PIPOL_HOST -svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk simgrid-trunk --quiet -cd simgrid-trunk +git clone git://scm.gforge.inria.fr/simgrid/simgrid.git simgrid --quiet +cd simgrid perl ./buildtools/pipol/cmake.pl perl ./buildtools/pipol/ruby.pl +if [ -e /usr/bin/gcc-4.6 ] ; then +export CC=gcc-4.6 +export CXX=g++-4.6 +else +export CC=gcc +export CXX=g++ +fi + #supernovae -cmake . +cmake -Drelease=on . ctest -D ExperimentalStart ctest -D ExperimentalConfigure ctest -D ExperimentalBuild @@ -26,10 +34,14 @@ ctest -D ExperimentalSubmit export SIMGRID_ROOT=`pwd` export LD_LIBRARY_PATH=`pwd`/lib +export DYLD_LIBRARY_PATH=`pwd`/lib #for mac cd ../ -svn checkout svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-java simgrid-java --quiet +git clone git://scm.gforge.inria.fr/simgrid/simgrid-java.git simgrid-java --quiet cd simgrid-java +export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:`pwd`/lib +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/lib #for mac + cmake . ctest -D ExperimentalStart ctest -D ExperimentalConfigure @@ -38,8 +50,9 @@ ctest -D ExperimentalTest ctest -D ExperimentalSubmit cd ../ -svn checkout svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-ruby simgrid-ruby --quiet +git clone git://scm.gforge.inria.fr/simgrid/simgrid-ruby.git simgrid-ruby --quiet cd simgrid-ruby + cmake . ctest -D ExperimentalStart ctest -D ExperimentalConfigure diff --git a/buildtools/pipol/MemCheck.sh b/buildtools/pipol/MemCheck.sh old mode 100644 new mode 100755 index d1983412c6..6bc51d898c --- a/buildtools/pipol/MemCheck.sh +++ b/buildtools/pipol/MemCheck.sh @@ -10,12 +10,20 @@ else fi cd ./pipol/$PIPOL_HOST -svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk simgrid-trunk --quiet -cd simgrid-trunk +git clone git://scm.gforge.inria.fr/simgrid/simgrid.git simgrid --quiet +cd simgrid perl ./buildtools/pipol/cmake.pl perl ./buildtools/pipol/ruby.pl +if [ -e /usr/bin/gcc-4.6 ] ; then +export CC=gcc-4.6 +export CXX=g++-4.6 +else +export CC=gcc +export CXX=g++ +fi + #mem-check cmake \ -Denable_lua=off \ @@ -29,6 +37,7 @@ cmake \ -Denable_latency_bound_tracking=off \ -Denable_gtnets=off \ -Denable_jedule=off \ +-Drelease=on \ -Denable_memcheck=on ./ ctest -D ExperimentalStart ctest -D ExperimentalConfigure diff --git a/buildtools/pipol/Nightly_memCheck.sh b/buildtools/pipol/Nightly_memCheck.sh new file mode 100755 index 0000000000..67e1784373 --- /dev/null +++ b/buildtools/pipol/Nightly_memCheck.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +#PIPOL esn amd64_2010-linux-ubuntu-maverick.dd.gz none 02:00 --user --silent + +if [ -e ./pipol ] ; then + rm -rf ./pipol/$PIPOL_HOST + mkdir ./pipol/$PIPOL_HOST +else + mkdir ./pipol + rm -rf ./pipol/$PIPOL_HOST + mkdir ./pipol/$PIPOL_HOST +fi +cd ./pipol/$PIPOL_HOST + +git clone git://scm.gforge.inria.fr/simgrid/simgrid.git simgrid --quiet +cd simgrid + +perl ./buildtools/pipol/cmake.pl +perl ./buildtools/pipol/ruby.pl + +if [ -e /usr/bin/gcc-4.6 ] ; then +export CC=gcc-4.6 +export CXX=g++-4.6 +else +export CC=gcc +export CXX=g++ +fi + +#mem-check +cmake \ +-Denable_lua=off \ +-Denable_tracing=off \ +-Denable_smpi=off \ +-Denable_supernovae=off \ +-Denable_compile_optimizations=off \ +-Denable_compile_warnings=on \ +-Denable_lib_static=off \ +-Denable_model-checking=off \ +-Denable_latency_bound_tracking=off \ +-Denable_gtnets=off \ +-Denable_jedule=off \ +-Denable_memcheck=on ./ +ctest -D NightlyStart +ctest -D NightlyConfigure +ctest -D NightlyBuild +ctest -D NightlyMemCheck +ctest -D NightlySubmit \ No newline at end of file diff --git a/buildtools/pipol/Nightly_simgrid.sh b/buildtools/pipol/Nightly_simgrid.sh old mode 100644 new mode 100755 index a16b9d7399..1e147a74fa --- a/buildtools/pipol/Nightly_simgrid.sh +++ b/buildtools/pipol/Nightly_simgrid.sh @@ -2,141 +2,122 @@ #PRE-PIPOL /home/mescal/navarro/pre-simgrid.sh +#___________________________________________________________________________________________________ +#Ubuntu 9.10________________________________________________________________________________________ #PIPOL esn i386-linux-ubuntu-karmic.dd.gz none 02:00 --user --silent #PIPOL esn amd64-linux-ubuntu-karmic.dd.gz none 02:00 --user --silent + +#Ubuntu 10.04 #PIPOL esn i386-linux-ubuntu-lucid.dd.gz none 02:00 --user --silent -#PIPOL esn amd64-linux-ubuntu-lucid.dd.gz none 02:00 --user --silent +#PIPOL esn amd64-linux-ubuntu-lucid.dd.gz pipol8 05:00 --user --silent + +#Ubuntu 10.10 #PIPOL esn amd64_2010-linux-ubuntu-maverick.dd.gz none 02:00 --user --silent +#___________________________________________________________________________________________________ +#Fedora 12__________________________________________________________________________________________ #PIPOL esn i386-linux-fedora-core12.dd.gz none 02:00 --user --silent #PIPOL esn amd64-linux-fedora-core12.dd.gz none 02:00 --user --silent + +#Fedora 13 #PIPOL esn i386-linux-fedora-core13.dd.gz none 02:00 --user --silent #PIPOL esn amd64-linux-fedora-core13.dd.gz none 02:00 --user --silent -#PIPOL esn i386_kvm-linux-debian-lenny none 02:00 --user --silent -#PIPOL esn amd64_kvm-linux-debian-lenny none 02:00 --user --silent -#PIPOL esn i386_kvm-linux-debian-testing none 02:00 --user --silent -#PIPOL esn amd64_kvm-linux-debian-testing none 02:00 --user --silent +#Fedora 14 +#PIPOL esn amd64_2010-linux-fedora-core14.dd.gz none 02:00 --user --silent +#PIPOL esn i386_2010-linux-fedora-core14.dd.gz none 02:00 --user --silent + +#__________________________________________________________________________________________________ +#Debian Lenny 5.0___________________________________________________________________________________ +#PIPOL esn i386-linux-debian-lenny.dd.gz none 02:00 --user --silent +#PIPOL esn amd64-linux-debian-lenny.dd.gz none 02:00 --user --silent -#PIPOL esn amd64-windows-server-2008-64bits-navarro-2011-03-15-122256.dd.gz none 02:00 --root +#Debian Lenny 6.0 +#PIPOL esn amd64_2010-linux-debian-squeeze.dd.gz none 02:00 --user --silent +#PIPOL esn i386_2010-linux-debian-squeeze-navarro-2011-10-03-171100.dd.gz none 02:00 --user --silent + +#Debian Testing +#PIPOL esn i386-linux-debian-testing none 02:00 --user --silent +#PIPOL esn amd64-linux-debian-testing none 02:00 --user --silent + +#___________________________________________________________________________________________________ +#MacOS Snow Leopard 10.6____________________________________________________________________________ +#PIPOL esn x86_mac-mac-osx-server-snow-leopard-navarro-2011-09-22-113726.dd.gz none 02:00 --user --silent + +#___________________________________________________________________________________________________ +#windows-server-2008-64bits_________________________________________________________________________ +#PIPOL esn amd64-windows-server-2008-64bits.dd.gz none 02:00 --root --user --silent if [ -e ./pipol ] ; then - rm -rf ./pipol/$PIPOL_HOST - mkdir ./pipol/$PIPOL_HOST + rm -rf ./pipol/$PIPOL_HOST + mkdir ./pipol/$PIPOL_HOST else - mkdir ./pipol - rm -rf ./pipol/$PIPOL_HOST - mkdir ./pipol/$PIPOL_HOST + mkdir ./pipol + rm -rf ./pipol/$PIPOL_HOST + mkdir ./pipol/$PIPOL_HOST fi cd ./pipol/$PIPOL_HOST -svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk simgrid-trunk --quiet -cd simgrid-trunk - - -if [ x$PIPOL_IMAGE == "xamd64-windows-server-2008-64bits-navarro-2011-03-15-122256.dd.gz" ] ; then - cmake \ - -G"Unix Makefiles" \ - -Denable_lua=off \ - -Denable_tracing=off \ - -Denable_smpi=off \ - -Denable_supernovae=off \ - -Denable_compile_optimizations=off \ - -Denable_compile_warnings=off \ - -Denable_lib_static=off \ - -Denable_model-checking=off \ - -Denable_latency_bound_tracking=off \ - -Denable_gtnets=off . - ctest -D NightlyStart - ctest -D NightlyConfigure - ctest -D NightlyBuild - ctest -D NightlySubmit +git clone git://scm.gforge.inria.fr/simgrid/simgrid.git simgrid --quiet +cd simgrid + +perl ./buildtools/pipol/cmake.pl +perl ./buildtools/pipol/ruby.pl + +if [ -e /usr/bin/gcc-4.6 ] ; then +export CC=gcc-4.6 +export CXX=g++-4.6 else - sh ./buildtools/pipol/install_gtnets.sh ./gtnets_install - SIMGRID_DIR=`pwd` - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SIMGRID_DIR/gtnets_install/lib - perl ./buildtools/pipol/cmake.pl - perl ./buildtools/pipol/ruby.pl - - if [ x$PIPOL_IMAGE == "xamd64_2010-linux-ubuntu-maverick.dd.gz" ] ; then - #mem-check - cmake \ - -Denable_lua=off \ - -Denable_tracing=off \ - -Denable_smpi=off \ - -Denable_supernovae=off \ - -Denable_compile_optimizations=off \ - -Denable_compile_warnings=on \ - -Denable_lib_static=off \ - -Denable_model-checking=off \ - -Denable_latency_bound_tracking=off \ - -Denable_gtnets=off \ - -Denable_jedule=off \ - -Denable_memcheck=on ./ - ctest -D NightlyStart - ctest -D NightlyConfigure - ctest -D NightlyBuild - ctest -D NightlyMemCheck - ctest -D NightlySubmit - else - #supernovae - cmake \ - -Denable_lua=on \ - -Denable_tracing=on \ - -Denable_smpi=on \ - -Denable_supernovae=on \ - -Denable_compile_optimizations=on \ - -Denable_compile_warnings=on \ - -Denable_lib_static=off \ - -Denable_model-checking=off \ - -Denable_latency_bound_tracking=off \ - -Denable_gtnets=off . - ctest -D NightlyStart - ctest -D NightlyConfigure - ctest -D NightlyBuild - ctest -D NightlyTest - ctest -D NightlySubmit - make clean - - #MC - cmake \ - -Denable_latency_bound_tracking=on \ - -Denable_gtnets=on \ - -Dgtnets_path=./gtnets_install \ - -Denable_coverage=on \ - -Denable_model-checking=on \ - -Denable_compile_optimizations=off \ - -Denable_auto_install=on \ - -DCMAKE_INSTALL_PREFIX=./simgrid_install \ - -Denable_supernovae=off . - ctest -D NightlyStart - ctest -D NightlyConfigure - ctest -D NightlyBuild - ctest -D NightlyTest - ctest -D NightlyCoverage - ctest -D NightlySubmit - fi - - export SIMGRID_ROOT=`pwd` - export LD_LIBRARY_PATH=`pwd`/lib - - cd ../ - svn checkout svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-java simgrid-java --quiet - cd simgrid-java - cmake . - ctest -D NightlyStart - ctest -D NightlyConfigure - ctest -D NightlyBuild - ctest -D NightlyTest - ctest -D NightlySubmit - - cd ../ - svn checkout svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-ruby simgrid-ruby --quiet - cd simgrid-ruby - cmake . - ctest -D NightlyStart - ctest -D NightlyConfigure - ctest -D NightlyBuild - ctest -D NightlyTest - ctest -D NightlySubmit -fi \ No newline at end of file +export CC=gcc +export CXX=g++ +fi + +#supernovae DEFAULT CONF +cmake -Drelease=on . +ctest -D NightlyStart +ctest -D NightlyConfigure +ctest -D NightlyBuild +ctest -D NightlyTest +ctest -D NightlySubmit +make clean + +#MC +cmake \ +-Denable_coverage=on \ +-Denable_model-checking=on \ +-Denable_compile_optimizations=off \ +-Drelease=on \ +-Denable_supernovae=off . +ctest -D NightlyStart +ctest -D NightlyConfigure +ctest -D NightlyBuild +ctest -D NightlyTest +ctest -D NightlyCoverage +ctest -D NightlySubmit + +export SIMGRID_ROOT=`pwd` +export LD_LIBRARY_PATH=`pwd`/lib +export DYLD_LIBRARY_PATH=`pwd`/lib +cd ../ +git clone git://scm.gforge.inria.fr/simgrid/simgrid-java.git simgrid-java --quiet +cd simgrid-java +export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:`pwd`/lib +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/lib + +cmake . +ctest -D NightlyStart +ctest -D NightlyConfigure +ctest -D NightlyBuild +ctest -D NightlyTest +ctest -D NightlySubmit + +cd ../ +git clone git://scm.gforge.inria.fr/simgrid/simgrid-ruby.git simgrid-ruby --quiet +cd simgrid-ruby + +cmake . +ctest -D NightlyStart +ctest -D NightlyConfigure +ctest -D NightlyBuild +ctest -D NightlyTest +ctest -D NightlySubmit diff --git a/buildtools/pipol/deploy.sh b/buildtools/pipol/deploy.sh old mode 100644 new mode 100755 index 21ef610c14..8895ee53e7 --- a/buildtools/pipol/deploy.sh +++ b/buildtools/pipol/deploy.sh @@ -2,43 +2,47 @@ #___________________________________________________________________________________________________ #Ubuntu 9.10________________________________________________________________________________________ -ssh pipol pipol-sub esn i386-linux-ubuntu-karmic.dd.gz none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64-linux-ubuntu-karmic.dd.gz none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn i386-linux-ubuntu-karmic.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn amd64-linux-ubuntu-karmic.dd.gz none 02:00 "~/Experimental_bindings.sh" #Ubuntu 10.04 -ssh pipol pipol-sub esn i386-linux-ubuntu-lucid.dd.gz none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64-linux-ubuntu-lucid.dd.gz none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn i386-linux-ubuntu-lucid.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn amd64-linux-ubuntu-lucid.dd.gz none 02:00 "~/Experimental_bindings.sh" #Ubuntu 10.10 -ssh pipol pipol-sub esn amd64_2010-linux-ubuntu-maverick.dd.gz none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn amd64_2010-linux-ubuntu-maverick.dd.gz none 02:00 "~/Experimental_bindings.sh" #___________________________________________________________________________________________________ -#Fedora 11__________________________________________________________________________________________ -ssh pipol pipol-sub esn i386-linux-fedora-core11.dd.gz none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64-linux-fedora-core11.dd.gz none 02:00 "~/Experimental.sh" - -#Fedora 12 -ssh pipol pipol-sub esn i386-linux-fedora-core12.dd.gz none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64-linux-fedora-core12.dd.gz none 02:00 "~/Experimental.sh" +#Fedora 12__________________________________________________________________________________________ +ssh pipol pipol-sub esn i386-linux-fedora-core12.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn amd64-linux-fedora-core12.dd.gz none 02:00 "~/Experimental_bindings.sh" #Fedora 13 -ssh pipol pipol-sub esn i386-linux-fedora-core13.dd.gz none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64-linux-fedora-core13.dd.gz none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn i386-linux-fedora-core13.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn amd64-linux-fedora-core13.dd.gz none 02:00 "~/Experimental_bindings.sh" + +#Fedora 14 +ssh pipol pipol-sub esn amd64_2010-linux-fedora-core14.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn i386_2010-linux-fedora-core14.dd.gz none 02:00 "~/Experimental_bindings.sh" #___________________________________________________________________________________________________ #Debian Lenny 5.0___________________________________________________________________________________ -ssh pipol pipol-sub esn i386_kvm-linux-debian-lenny none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64_kvm-linux-debian-lenny none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn i386-linux-debian-lenny.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn amd64-linux-debian-lenny.dd.gz none 02:00 "~/Experimental_bindings.sh" + +#Debian Lenny 6.0 +ssh pipol pipol-sub esn amd64_2010-linux-debian-squeeze.dd.gz none 02:00 "~/Experimental_bindings.sh" +#ssh pipol pipol-sub esn i386_2010-linux-debian-squeeze.dd.gz none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn i386_2010-linux-debian-squeeze-navarro-2011-10-03-171100.dd.gz none 02:00 "~/Experimental_bindings.sh" #Debian Testing -ssh pipol pipol-sub esn i386_kvm-linux-debian-testing none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn amd64_kvm-linux-debian-testing none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn i386-linux-debian-testing none 02:00 "~/Experimental_bindings.sh" +ssh pipol pipol-sub esn amd64-linux-debian-testing none 02:00 "~/Experimental_bindings.sh" #___________________________________________________________________________________________________ #MacOS Snow Leopard 10.6____________________________________________________________________________ -ssh pipol pipol-sub esn x86_64_mac-mac-osx-server-snow-leopard.dd.gz none 02:00 "~/Experimental.sh" -ssh pipol pipol-sub esn x86_mac-mac-osx-server-snow-leopard.dd.gz none 02:00 "~/Experimental.sh" +ssh pipol pipol-sub esn x86_mac-mac-osx-server-snow-leopard-navarro-2011-09-22-113726.dd.gz none 02:00 "~/Experimental_bindings.sh" #___________________________________________________________________________________________________ #windows-server-2008-64bits_________________________________________________________________________ -ssh pipol pipol-sub esn amd64-windows-server-2008-64bits-navarro-2011-03-15-122256.dd.gz none 02:00 "~/Experimental.sh" \ No newline at end of file +#ssh pipol pipol-sub esn amd64-windows-server-2008-64bits.dd.gz none 02:00 "~/Experimental_bindings.sh" \ No newline at end of file diff --git a/buildtools/pipol/install_ns3.sh b/buildtools/pipol/install_ns3.sh new file mode 100644 index 0000000000..0cfed93cf7 --- /dev/null +++ b/buildtools/pipol/install_ns3.sh @@ -0,0 +1,59 @@ +#Need python python-dev +sudo apt-get install python python-dev + +SYSTEM=`uname` +if [ $SYSTEM = Linux ] ; then + if [ x$1 != x ] ; then + prefix=$1; + fi + + if [ -e $prefix ] ; then + echo -n "" + else + echo "Creating directory $prefix" + mkdir -p $prefix; + fi + + if [ -e $prefix/lib ] ; then + echo -n "" + else + echo "Creating directory $prefix/lib" + mkdir -p $prefix/lib; + fi + + if [ -e $prefix/include/ns3 ] ; then + echo -n "" + else + echo "Creating directory $prefix/include/ns3" + mkdir -p $prefix/include/ns3; + fi + + if [ -e $prefix/doc/html ] ; then + echo -n "" + else + echo "Creating directory $prefix/doc/html" + mkdir -p $prefix/doc/html; + fi + + localdir=`pwd` + cd $prefix + prefix=`pwd` + cd $localdir + echo "Install to prefix = $prefix" + + echo "Downloading NS3" + wget http://ns-3.googlecode.com/files/ns-allinone-3.10.tar.bz2 + + echo "Uncompressing package"; + tar -xvjf ns-allinone-3.10.tar.bz2 + rm -rf ns-allinone-3.10.tar.bz2 + cd ns-allinone-3.10/ns-3.10 + + ./waf configure + ./waf + ./waf --doxygen + + cp -f build/debug/libns3.so $prefix/lib/libns3.so + cp -f build/debug/ns3/* $prefix/include/ns3/ + cp -f doc/html/* $prefix/doc/html/ +fi \ No newline at end of file diff --git a/buildtools/pipol/pre-simgrid.sh b/buildtools/pipol/pre-simgrid.sh index 8c22341980..cdf538638a 100644 --- a/buildtools/pipol/pre-simgrid.sh +++ b/buildtools/pipol/pre-simgrid.sh @@ -2,36 +2,40 @@ set -e -if [ -e /home/mescal/navarro/version/bckup_version ] ; then - svn cleanup version/ - cd /home/mescal/navarro/version - svn up README --quiet -else - if [ -e /home/mescal/navarro/version ] ; then - svn cleanup version/ - echo "0000P" > /home/mescal/navarro/version/bckup_version - else - mkdir /home/mescal/navarro/version - echo "0000P" > /home/mescal/navarro/version/bckup_version - fi - cd /home/mescal/navarro - svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk /home/mescal/navarro/version --depth empty --quiet +rm -rf /home/mescal/navarro/.pipol/log/* - cd /home/mescal/navarro/version - svn up README --quiet -fi +#if [ -e /home/mescal/navarro/version/bckup_version ] ; then +# svn cleanup version/ +# cd /home/mescal/navarro/version +# svn up README --quiet +#else +# if [ -e /home/mescal/navarro/version ] ; then +# svn cleanup version/ +# echo "0000P" > /home/mescal/navarro/version/bckup_version +# else +# mkdir /home/mescal/navarro/version +# echo "0000P" > /home/mescal/navarro/version/bckup_version +# fi +# cd /home/mescal/navarro +# svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk /home/mescal/navarro/version --depth empty --quiet +# +# cd /home/mescal/navarro/version +# svn up README --quiet +#fi -old_version=`cat bckup_version` -new_version=`svnversion` +#old_version=`cat bckup_version` +#new_version=`svnversion` +Date=`date` -echo version old : $old_version -echo version svn : $new_version -echo `svnversion` > bckup_version +echo date : $date +#echo version old : $old_version +#echo version svn : $new_version +#echo `svnversion` > bckup_version -if [ "$old_version" = "$new_version" ] ; then - echo "matches" - exit 1 -else - echo "not matches" +#if [ "$old_version" = "$new_version" ] ; then +# echo "matches" +# exit 1 +#else +# echo "not matches" exit 0 -fi +#fi diff --git a/buildtools/pipol/rc.debian b/buildtools/pipol/rc.debian index 25bd452d15..7d6668e927 100644 --- a/buildtools/pipol/rc.debian +++ b/buildtools/pipol/rc.debian @@ -1,21 +1,16 @@ #!/bin/bash -sudo apt-get update - -sudo apt-get -y -qq install subversion -sudo apt-get -y -qq install gcc -sudo apt-get -y -qq install g++ -sudo apt-get -y -qq install make -sudo apt-get -y -qq install openjdk-6-jdk -sudo apt-get -y -qq install liblua5.1-dev lua5.1 -sudo apt-get -y -qq install unzip -sudo apt-get -y -qq install cmake -sudo apt-get -y -qq install wget -sudo apt-get -y -qq install perl -sudo apt-get -y -qq install graphviz-dev graphviz -sudo apt-get -y -qq install libpcre3-dev -sudo apt-get -y -qq install f2c -sudo apt-get -y -qq install valgrind +sudo aptitude update +sudo aptitude -y install make +sudo aptitude -y install git +sudo aptitude -y install git-core +sudo aptitude -y install openjdk-6-jdk +sudo aptitude -y install valgrind +sudo aptitude -y install f2c +sudo aptitude -y install gcc-4.6 +sudo aptitude -y install g++-4.6 +sudo aptitude -y install libpcre3-dev +sudo aptitude -y install cmake which_svn=`which svn` #svn necessary which_gcc=`which gcc` #gcc gcc necessary @@ -30,6 +25,7 @@ which_dot=`which dot` #dot for cgraph which_perl=`which perl` #perl which_f2c=`which f2c` #f2c which_gcov=`which gcov` #gcov +which_git=`which git` echo "DEBUT----------------------------------" echo $which_cmake echo $which_unzip @@ -44,4 +40,5 @@ echo $which_wget echo $which_perl echo $which_f2c echo $which_gcov +echo $which_git echo "FIN------------------------------------" \ No newline at end of file diff --git a/buildtools/pipol/rc.fedora b/buildtools/pipol/rc.fedora index 942a72b04b..31d923f8d1 100644 --- a/buildtools/pipol/rc.fedora +++ b/buildtools/pipol/rc.fedora @@ -2,7 +2,6 @@ sudo yum -y -q update -sudo yum -y -q install subversion sudo yum -y -q install gcc sudo yum -y -q install make sudo yum -y -q install java-1.6.0-openjdk @@ -12,8 +11,10 @@ sudo yum -y -q install cmake sudo yum -y -q install wget sudo yum -y -q install perl sudo yum -y -q install graphviz-dev graphviz -sudo yum -y -q install pcre-devel pcre-static sudo yum -y -q install f2c +sudo yum -y -q install pcre-devel pcre-static +sudo yum -y -q install git-core +sudo yum -y -q install ruby ruby-devel which_svn=`which svn` #svn necessary which_gcc=`which gcc` #gcc gcc necessary @@ -28,6 +29,7 @@ which_dot=`which dot` #dot for cgraph which_perl=`which perl` #perl which_f2c=`which f2c` #f2c which_gcov=`which gcov` #gcov +which_git=`which git` echo "DEBUT----------------------------------" echo $which_cmake echo $which_unzip @@ -42,11 +44,5 @@ echo $which_wget echo $which_perl echo $which_f2c echo $which_gcov -echo "FIN------------------------------------" - -wget ftp://ftp.ruby-lang.org//pub/ruby/1.9/ruby-1.9.1-p378.tar.gz -tar zxvf ruby-1.9.1-p378.tar.gz -cd ./ruby-1.9.1-p378 -./configure -prefix=/usr -make -sudo make install \ No newline at end of file +echo $which_git +echo "FIN------------------------------------" \ No newline at end of file diff --git a/buildtools/pipol/rc.mac b/buildtools/pipol/rc.mac index c17b99cda8..c14e3ea522 100644 --- a/buildtools/pipol/rc.mac +++ b/buildtools/pipol/rc.mac @@ -1,20 +1,18 @@ #!/bin/bash -sudo fink -y -q -b selfupdate +#sudo port install wget +#sudo port install pcre +#sudo port install gcc46 +#sudo port install graphviz-devel +#sudo port install lua +#sudo port select bf2c -sudo fink -y -q -b install svn -sudo fink -y -q -b install gcc42 -sudo fink -y -q -b install make -sudo fink -y -q -b install lua51-dev lua51 -sudo fink -y -q -b install unzip -sudo fink -y -q -b install cmake -sudo fink -y -q -b install wget -sudo fink -y -q -b install perl -sudo fink -y -q -b install gd2 graphviz graphviz-dev -sudo fink -y -q -b install pcre -sudo fink -y -q -b install f2c +sudo port install ruby19 +sudo ln -sf /opt/local/lib/libruby.1.9.1.dylib /usr/lib/libruby.dylib +sudo ln -sf /opt/local/bin/ruby1.9 /usr/bin/ruby + +#sudo port select gcc mp-gcc46 -which_svn=`which svn` #svn necessary which_gcc=`which gcc` #gcc gcc necessary which_gpp=`which g++` #gcc g++ necessary which_make=`which make` #make necessary @@ -27,6 +25,7 @@ which_dot=`which dot` #dot for cgraph which_perl=`which perl` #perl which_f2c=`which f2c` #f2c which_gcov=`which gcov` #gcov +which_git=`which git` echo "DEBUT----------------------------------" echo $which_cmake echo $which_unzip @@ -35,10 +34,10 @@ echo $which_java echo $which_make echo $which_gcc echo $which_gpp -echo $which_svn echo $which_dot echo $which_wget echo $which_perl echo $which_f2c echo $which_gcov +echo $which_git echo "FIN------------------------------------" \ No newline at end of file diff --git a/buildtools/pipol/rc.ubuntu b/buildtools/pipol/rc.ubuntu index 25bd452d15..c5bf5cea45 100644 --- a/buildtools/pipol/rc.ubuntu +++ b/buildtools/pipol/rc.ubuntu @@ -2,7 +2,6 @@ sudo apt-get update -sudo apt-get -y -qq install subversion sudo apt-get -y -qq install gcc sudo apt-get -y -qq install g++ sudo apt-get -y -qq install make @@ -16,6 +15,7 @@ sudo apt-get -y -qq install graphviz-dev graphviz sudo apt-get -y -qq install libpcre3-dev sudo apt-get -y -qq install f2c sudo apt-get -y -qq install valgrind +sudo apt-get -y -qq install git-core which_svn=`which svn` #svn necessary which_gcc=`which gcc` #gcc gcc necessary @@ -30,6 +30,7 @@ which_dot=`which dot` #dot for cgraph which_perl=`which perl` #perl which_f2c=`which f2c` #f2c which_gcov=`which gcov` #gcov +which_git=`which git` echo "DEBUT----------------------------------" echo $which_cmake echo $which_unzip @@ -44,4 +45,5 @@ echo $which_wget echo $which_perl echo $which_f2c echo $which_gcov +echo $which_git echo "FIN------------------------------------" \ No newline at end of file diff --git a/buildtools/pipol/rc.windows b/buildtools/pipol/rc.windows index aaec096531..a25ecea7d2 100644 --- a/buildtools/pipol/rc.windows +++ b/buildtools/pipol/rc.windows @@ -1,14 +1,13 @@ #!/bin/bash -sudo echo " " >> /etc/profile -sudo echo "export PATH=/cygdrive/c/strawberry/c/bin:/cygdrive/c/strawberry/perl/site/bin:/cygdrive/c/strawberry/perl/bin:/cygdrive/c/CMake\ 2.8/bin:/cygdrive/c/Subversion/bin:/bin" >> /etc/profile -sudo echo "export PATH=$PATH:/cygdrive/c/:/cygdrive/c/GnuWin32/bin/" >> /etc/profile which_svn=`which svn` #svn necessary which_gcc=`which gcc` #gcc gcc necessary which_gpp=`which g++` #gcc g++ necessary which_make=`which gmake` #make necessary which_cmake=`which cmake` #cmake necessary which_perl=`which perl` #perl +which_git=`which git` + echo "DEBUT----------------------------------" echo $which_cmake echo $which_make @@ -16,4 +15,6 @@ echo $which_gcc echo $which_gpp echo $which_svn echo $which_perl +echo $which_git +echo $PATH echo "FIN------------------------------------" \ No newline at end of file diff --git a/configure b/configure index 351cfa3f10..4666fe6803 100755 --- a/configure +++ b/configure @@ -2,4 +2,4 @@ echo "THIS COMMAND IS NOT AVAILABLE!" echo "Since v3.4 we use cmake. Now use:" -echo -e "\tcmake -DCMAKE_INSTALL_PREFIX= .\n\tmake\n\tmake install." +echo -e "\tcmake -DCMAKE_INSTALL_PREFIX= .\n\tmake\n\tmake install" diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index 2eca0a3302..0000000000 --- a/doc/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -Doxyfile -.FAQ.doc.toc -.contrib.doc.toc -.gtut-introduction.doc.toc -.history.doc.toc -.index.doc.toc -html -index-API.doc -index.php -logcategories.doc -simgrid.tag -simgrid_modules.map -simgrid_modules.png -simgrid_modules2.png diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index 29d15a50c7..c1dd9e6f7f 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -1,206 +1,245 @@ # @WARNING@ -# Doxyfile 1.3.6-20040222 +# Doxyfile 1.7.4 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project +# doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored +# All text after a hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") +# Values that contain spaces should be placed between quotes (" "). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config file that -# follow. The default is UTF-8 which is also the encoding used for all text before -# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into -# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of -# possible encodings. +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = SimGrid -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = @release_version@ -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Scalable simulation of distributed systems" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./ -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, -# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, -# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, -# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" -ABBREVIATE_BRIEF = +ABBREVIATE_BRIEF = -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES -# 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 +# 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 # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = @srcdir@ -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) -MULTILINE_CPP_IS_BRIEF = NO +QT_AUTOBRIEF = NO -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. -DETAILS_AT_TOP = YES +MULTILINE_CPP_IS_BRIEF = NO -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO -# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. -ALIASES = +ALIASES = -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to -# include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO @@ -210,301 +249,408 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +#INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +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 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file +# If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the +# Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES -# The ENABLED_SECTIONS tag can be used to enable conditional +# The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. -ENABLED_SECTIONS = +ENABLED_SECTIONS = -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- -# The QUIET tag can be used to turn on/off the messages that are generated +# The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. -QUIET = NO +QUIET = YES -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written # to stderr. -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = index.doc \ - FAQ.doc \ - contrib.doc \ - publis.doc \ - people.doc \ - history.doc \ + installSimgrid.doc \ + bindings.doc \ + options.doc \ + tracing.doc \ + use.doc \ + pls.doc \ ./index-API.doc \ - \ modules.doc \ module-xbt.doc \ module-msg.doc \ - module-gras.doc module-amok.doc \ + module-gras.doc \ + module-amok.doc \ module-sd.doc \ module-surf.doc \ - \ - gtut-main.doc \ - gtut-introduction.doc \ - gtut-tour.doc \ - gtut-tour-01-bones.doc \ - gtut-tour-02-simple.doc \ - gtut-tour-03-args.doc \ - gtut-tour-04-callback.doc \ - gtut-tour-05-globals.doc \ - gtut-tour-06-logs.doc \ - gtut-tour-07-timers.doc \ - gtut-tour-08-exceptions.doc \ - gtut-tour-09-simpledata.doc \ - gtut-tour-10-rpc.doc \ - gtut-tour-11-explicitwait.doc \ - gtut-tour-recap-messages.doc \ - gtut-tour-12-staticstruct.doc \ - gtut-tour-13-pointers.doc \ - gtut-tour-14-dynar.doc \ - gtut-tour-15-manualdatadef.doc \ - gtut-tour-16-exchangecb.doc \ - gtut-howto.doc \ - gtut-howto-design.doc \ - \ - ./logcategories.doc \ - \ + gtut-main.doc \ + gtut-introduction.doc \ + gtut-tour.doc \ + gtut-tour-00-install.doc \ + gtut-tour-01-bones.doc \ + gtut-tour-02-simple.doc \ + gtut-tour-03-args.doc \ + gtut-tour-04-callback.doc \ + gtut-tour-05-globals.doc \ + gtut-tour-06-logs.doc \ + gtut-tour-07-timers.doc \ + gtut-tour-08-exceptions.doc \ + gtut-tour-09-simpledata.doc \ + gtut-tour-10-rpc.doc \ + gtut-tour-11-explicitwait.doc \ + gtut-tour-recap-messages.doc \ + gtut-tour-12-staticstruct.doc \ + gtut-tour-13-pointers.doc \ + gtut-tour-14-dynar.doc \ + gtut-tour-15-manualdatadef.doc \ + gtut-tour-16-exchangecb.doc \ + gtut-howto.doc \ + gtut-howto-design.doc \ @top_srcdir@/include/ \ @top_srcdir@/include/msg \ @top_srcdir@/include/gras \ @@ -523,60 +669,62 @@ INPUT = index.doc \ @top_srcdir@/src/amok \ @top_srcdir@/src/amok/Bandwidth \ @top_srcdir@/src/amok/PeerManagement \ - @top_srcdir@/src/simdag \ - @top_srcdir@/src/java/simgrid/msg + @top_srcdir@/src/simdag -# This tag can be used to specify the character encoding of the source files that -# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default -# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. -# See http://www.gnu.org/software/libiconv for the list of possible encodings. +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. INPUT_ENCODING = UTF-8 -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl -FILE_PATTERNS = +FILE_PATTERNS = -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = +EXCLUDE = -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the output. -# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, -# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = ./ \ @@ -586,81 +734,92 @@ EXAMPLE_PATH = ./ \ @top_srcdir@/examples \ @top_srcdir@/testsuite -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left # blank all files are included. -EXAMPLE_PATTERNS = +EXAMPLE_PATTERNS = -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = YES -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = @top_srcdir@/doc -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be # ignored. -INPUT_FILTER = +INPUT_FILTER = -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. -FILTER_PATTERNS = +FILTER_PATTERNS = -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO -# Setting the INLINE_SOURCES tag to YES will include the body +# Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO @@ -668,20 +827,21 @@ REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. +# link to the source code. +# Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = NO @@ -690,279 +850,532 @@ VERBATIM_HEADERS = NO # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is adviced to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! -HTML_HEADER = +HTML_HEADER = -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = footer.html -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! -HTML_STYLESHEET = +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +#HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be # written to the html output directory. -CHM_FILE = +CHM_FILE = -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. -HHC_LOCATION = +HHC_LOCATION = -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO -# The TOC_EXPAND flag can be set to YES to add extra items for group members +# The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = YES -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. -GENERATE_LATEX = NO +GENERATE_LATEX = YES -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. LATEX_CMD_NAME = latex -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. -EXTRA_PACKAGES = +EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! -LATEX_HEADER = +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +#LATEX_FOOTER = -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. -PDF_HYPERLINKS = NO +PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. -USE_PDFLATEX = NO +USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = -# Set optional variables used in the generation of an rtf document. +# Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man -# The MAN_EXTENSION tag determines the extension that is added to +# The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO @@ -971,33 +1384,33 @@ MAN_LINKS = NO # configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the # syntax of the XML files. -XML_SCHEMA = +XML_SCHEMA = -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the # syntax of the XML files. -XML_DTD = +XML_DTD = -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES @@ -1006,10 +1419,10 @@ XML_PROGRAMLISTING = YES # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO @@ -1018,309 +1431,353 @@ GENERATE_AUTOGEN_DEF = NO # configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by # the preprocessor. -INCLUDE_PATH = +INCLUDE_PATH = -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = DOXYGEN \ DOXYGEN_SKIP_IT \ - XBT_PUBLIC= + XBT_PUBLIC= \ + XBT_INLINE= -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen +# If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = simgrid.tag -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = NO -# The PERL_PATH should be the absolute path and name of the perl script +# The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to -# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to -# specify the directory where the mscgen tool resides. If left empty the tool is assumed to -# be found in the default search path. +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. -MSCGEN_PATH = +MSCGEN_PATH = -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO -# If set to YES, the inheritance and collaboration graphs will show the +# If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. CALL_GRAPH = NO -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a caller dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable caller graphs for selected -# functions only using the \callergraph command. +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. DOT_IMAGE_FORMAT = png -# The tag DOT_PATH can be used to specify the path where the dot tool can be +# The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. -DOT_PATH = +DOT_PATH = -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the # \dotfile command). -DOTFILE_DIRS = +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). -# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen will always -# show the root nodes and its direct children regardless of this setting. +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/doc/FAQ.doc b/doc/FAQ.doc deleted file mode 100644 index 2953a568ea..0000000000 --- a/doc/FAQ.doc +++ /dev/null @@ -1,2750 +0,0 @@ -/*! \page faq Frequently Asked Questions - -\htmlinclude .FAQ.doc.toc - -\section faq_simgrid I'm new to SimGrid. I have some questions. Where should I start? - -You are at the right place... Having a look to these -the tutorial slides -(or to these old slides, -or to these -"obsolete" slides) -may give you some insights on what SimGrid can help you to do and what -are its limitations. Then you definitely should read the \ref -MSG_examples. The \ref GRAS_tut can also help you. - -If you are stuck at any point and if this FAQ cannot help you, please drop us a -mail to the user mailing list: . - -\subsection faq_interfaces What is the difference between MSG, SimDag, and GRAS? Do they serve the same purpose? - -It depend on how you define "purpose", I guess ;) - -They all allow you to build a prototype of application which you can run -within the simulator afterward. They all share the same simulation kernel, -which is the core of the SimGrid project. They differ by the way you express -your application. - -With SimDag, you express your code as a collection of interdependent -parallel tasks. So, in this model, applications can be seen as a DAG of -tasks. This is the interface of choice for people wanting to port old -code designed for SimGrid v1 or v2 to the framework current version. - -With both GRAS and MSG, your application is seen as a set of communicating -processes, exchanging data by the way of messages and performing computation -on their own. - -The difference between both is that MSG is somehow easier to use, but GRAS -is not limited to the simulator. Once you're done writing your GRAS code, -you can run your code both in the simulator or on a real platform. For this, -there is two implementations of the GRAS interface, one for simulation, one -for real execution. So, you just have to relink your code to chose one of -both world. - -\subsection faq_generic First steps with SimGrid - -If you decide to go for the MSG interface, please read carefully the -\ref MSG_examples. You'll find in \ref MSG_ex_master_slave a very -simple consisting of a master (that owns a bunch of tasks and -distributes them) , some slaves (that process tasks whenever they -receive one) and some forwarder agents (that simply pass the tasks -they receive to some slaves). - -If you decide to go for the GRAS interface, you should definitively -read the \ref GRAS_tut. The first section constitutes an introduction -to the tool and presents the model we use. The second section -constitutes a complete step-by-step tutorial building a distributed -application from the beginning and exemplifying most of the GRAS -features in the process. The last section groups some HOWTOS -highlighting a given feature of the framework in a more concise way. - -If you decide to go for another interface, I'm afraid your only sources -of information will be the source code and the mailing lists... - -\subsection faq_visualization Visualizing and analyzing the results - -It is sometime convenient to "see" how the agents are behaving. If you -like colors, you can use tools/MSG_visualization/colorize.pl -as a filter to your MSG outputs. It works directly with INFO. Beware, -INFO() prints on stderr. Do not forget to redirect if you want to -filter (e.g. with bash): -\verbatim -./msg_test small_platform.xml small_deployment.xml 2>&1 | ../../tools/MSG_visualization/colorize.pl -\endverbatim - -We also have a more graphical output. Have a look at section \ref faq_tracing. - -\subsection faq_C Argh! Do I really have to code in C? - -Up until now, there is no binding for other languages. If you use C++, -you should be able to use the SimGrid library as a standard C library -and everything should work fine (simply link against this -library; recompiling SimGrid with a C++ compiler won't work and it -wouldn't help if you could). - -In fact, we are currently working on Java bindings of MSG to allow -all the undergrad students of the world to use this tool. This is a -little more tricky than I would have expected, but the work is moving -fast forward [2006/05/13]. More languages are evaluated, but for now, -we do not feel a real demand for any other language. Please speak up! - -\section faq_cmake Installing the SimGrid library with Cmake (since V3.4) - -\subsection faq_intro Some generalitty - -\subsubsection faq_intro1 What is Cmake? - -CMake is a family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files. CMake generates native makefiles and workspaces that can be used in the compiler environment of your choice. For more information see official web site here. - -\subsubsection faq_intro2 Why cmake? - -CMake permits to developers to compil projects on different plateforms. Then many tools are embedded like ctest for making test, a link to cdash for vizualise results but also test coverage and bug reports. - -\subsubsection faq_intro3 What cmake need? - -CMake needs some prerequists like : - -For Unix and MacOS: - \li make - \li perl and libpcre - \li c, c++ and java compiler regards to developers - \li ccmake for graphical used of CMake - \li cmake (download page) - -For Windows : - \li cmake 2.8.3 (download page) - \li perl strawberry (download page) - \li pcre-7.0 (download page) - -\subsubsection faq_cmakeoption1 Liste of options - -\verbatim -"cmake -D[name]=[value] ... ./" - -[name] enable_gtnets [value] ON/OFF or TRUE/FALSE or 1/0 - enable_java ON/OFF or TRUE/FALSE or 1/0 - enable_lua ON/OFF or TRUE/FALSE or 1/0 - enable_ruby ON/OFF or TRUE/FALSE or 1/0 - enable_compile_optimizations ON/OFF or TRUE/FALSE or 1/0 - enable_compile_warnings ON/OFF or TRUE/FALSE or 1/0 - enable_smpi ON/OFF or TRUE/FALSE or 1/0 - enable_maintainer_mode ON/OFF or TRUE/FALSE or 1/0 - enable_supernovae ON/OFF or TRUE/FALSE or 1/0 - enable_tracing ON/OFF or TRUE/FALSE or 1/0 - enable_coverage ON/OFF or TRUE/FALSE or 1/0 - enable_memcheck ON/OFF or TRUE/FALSE or 1/0 - enable_model-checking ON/OFF or TRUE/FALSE or 1/0 - gtnets_path - CMAKE_INSTALL_PREFIX - pipol_user -\endverbatim - -\subsubsection faq_cmakeoption2 Options explaination - - \li enable_gtnets : set to true implie that user wants to use gtnets. - - \li enable_java : set to true implie that user wants to add java langage into simgrid compilation. - - \li enable_lua : set to true implie that user wants to add lua langage into simgrid compilation. - - \li enable_ruby : set to true implie that user wants to add ruby langage into simgrid compilation. - - \li enable_compile_optimizations : add flags "-O3 -finline-functions -funroll-loops -fno-strict-aliasing" - - \li enable_compile_warnings : add flags "-Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror" - - \li enable_smpi : Set to true if you want to use smpi lib. Actually on simgrid v3.4.1 Mac doesn't support lib smpi. - - \li enable_maintainer_mode : set to true it remakes some files. - - \li enable_supernovae : set to true make one file for each lib and compile with those generated files. - - \li enable_tracing : To enable the generation of simulation traces for visualization - - \li enable_coverage : When set to true this option enable code coverage by setting -fprofile-arcs -ftest-coverage flags. - - \li enable_memcheck : When set to true this option enable tests for memcheck. - - \li enable_model-checking : Enable the model checking when set to true. - - \li gtnets_path : Path to gtnets install directory (ex /usr) - - \li CMAKE_INSTALL_PREFIX : Path where are installed lib/ doc/ and include/ directories (ex /usr/local) - - \li pipol_user : specify your pipol username if you want to use the pipol-remote command. - -\subsubsection faq_cmakeoption3 Initialisation - -Those options are initialized the first time you launch "cmake ." whithout specified option. - -\verbatim -enable_gtnets on -enable_lua on -enable_ruby on -enable_java on -enable_smpi on -enable_supernovae on -enable_tracing on -enable_compile_optimizations on -enable_compile_warnings off -enable_maintainer_mode off -enable_coverage off -enable_memcheck off -enable_model-checking off -CMAKE_INSTALL_PREFIX /usr/local -gtnets_path null -pipol_user null -\endverbatim - -\subsubsection faq_cmakeoption4 Option's cache and how to reset? - -When options have been set they are keep into a cache file named "CMakeCache.txt". So if you want -reset values you just delete this file located to the project directory. - -\subsection faq_cmakecompilation Cmake compilation - -\subsubsection faq_cmakecompilation1 With command line. - -\verbatim -cmake -D[name]=[value] ... ./ -make -\endverbatim - -On Windows - -\verbatim -cmake -G"Unix Makefiles" -D[name]=[value] ... ./ -gmake -\endverbatim - -\subsubsection faq_cmakecompilation2 With ccmake tool. - -\verbatim -"ccmake ./" -\endverbatim -Then follow instructions. - -\subsubsection faq_cmakecompilation2bis Build out of source. - -As cmake generate many files used for compilation, we recommand to make a build directory. -For examples you can make : - -\verbatim -"navarrop@caraja:~/Developments$ cd simgrid/" -"navarrop@caraja:~/Developments/simgrid$ mkdir build_directory" -"navarrop@caraja:~/Developments/simgrid$ cd build_directory/" -"navarrop@caraja:~/Developments/simgrid/build_directory$ cmake ../" -"navarrop@caraja:~/Developments/simgrid/build_directory$ make" -\endverbatim - -Or complety out of sources : - -\verbatim -"navarrop@caraja:~/Developments$ mkdir build_dir" -"navarrop@caraja:~/Developments$ cd build_dir/" -"navarrop@caraja:~/Developments/build_dir$ cmake ../simgrid/" -"navarrop@caraja:~/Developments/build_dir$ make" -\endverbatim - -Those two kind of compilation permit to delete files created by compilation easier. - -\subsubsection faq_cmakecompilation3 Resume of command line - - \li CMake -\verbatim -cmake configure the project -make build all targets -make VERBOSE=1 build all targets and print build command lines -make check test all targets and summarize -make dist make the distrib -make distcheck check the dist (make + make dist + make check) -make install install the project (doc/ bin/ lib/ include/) -make uninstall uninstall the project (doc/ bin/ lib/ include/) -make clean clean all targets -make simgrid_documentation Create simgrid documentation -\endverbatim - -When the project have been succesfully compiling and build you can make tests. - - \li CTest -\verbatim -ctest launch only tests -ctest -D Continuous -ctest -D Continuous(Start|Update|Configure|Build) -ctest -D Continuous(Test|Coverage|MemCheck|Submit) -ctest -D Experimental -ctest -D Experimental(Start|Update|Configure|Build) -ctest -D Experimental(Test|Coverage|MemCheck|Submit) -ctest -D Nightly -ctest -D Nightly(Start|Update|Configure|Build) -ctest -D Nightly(Test|Coverage|MemCheck|Submit) -ctest -D NightlyMemoryCheck -\endverbatim - -If you want to test before make a commit you can simply make "ctest -D Experimental" and then you can visualize results submitted into Cdash. (Go to Cdash site). - -\subsection faq_cmakeinstall How to install with cmake? - -\subsubsection faq_cmakeinstall1 From svn. - -For Unix and MacOS: -\verbatim -cmake -Denable_maintainer_mode=on -DCMAKE_INSTALL_PREFIX=/home/navarrop/Bureau/install_simgrid ./ -make -make install -\endverbatim - -For Windows: - -\verbatim -cmake -G"Unix Makefiles" -DCMAKE_INSTALL_PREFIX=C:\simgrid_install ./ -make -make install -\endverbatim - -\subsubsection faq_cmakeinstall2 From a distrib - -\verbatim -For version 3.4.1 and 3.4 - cmake -Dprefix=/home/navarrop/Bureau/install_simgrid ./ - make - make install-simgrid -Since version 3.5 - cmake -DCMAKE_INSTALL_PREFIX=/home/navarrop/Bureau/install_simgrid ./ - make - make install -\endverbatim - -\subsection faq_cmakeWHATisInstall What is installed by cmake? - -\subsubsection faq_cmakeWHATisInstallBIN CMAKE_INSTALL_PREFIX/bin -\verbatim -tesh -graphicator -gras_stub_generator -simgrid_update_xml -simgrid-colorizer -smpicc -smpiff -smpif2c -smpirun -\endverbatim -\subsubsection faq_cmakeWHATisInstallDOC CMAKE_INSTALL_PREFIX/doc -\verbatim -simgrid/examples/ -simgrid/html/ -\endverbatim -\subsubsection faq_cmakeWHATisInstallINCLUDE CMAKE_INSTALL_PREFIX/include -\verbatim -amok/ -gras/ -instr/ -mc/ -msg/ -simdag/ -simix/ -smpi/ -surf/ -xbt/ -gras.h -simgrid_config.h -xbt.h -\endverbatim -\subsubsection faq_cmakeWHATisInstallLIB CMAKE_INSTALL_PREFIX/lib -\verbatim -libgras.so.3.5 -libsimgrid.so.3.5 -libsmpi.so.3.5 -libsimgrid.so -> libsimgrid.so.3.5 -libgras.so -> libgras.so.3.5 -libsmpi.so -> libsmpi.so.3.5 -lua/5.1/simgrid.so -> ../../libsimgrid.so -ruby/1.9.0/x86_64-linux/libsimgrid.so -> ../../../libsimgrid.so -ruby/1.9.0/x86_64-linux/simgrid.rb -\endverbatim -\subsection faq_cmakehowto How to modified sources files for developers - -\subsubsection faq_cmakehowto1 Add an executable or examples. - -If you want make an executable you have to create a CMakeList.txt to the src directory. -You must specified where to create the executable, source list, dependencies and the name of the binary. - -\verbatim -cmake_minimum_required(VERSION 2.6) - -set(EXECUTABLE_OUTPUT_PATH "./") -set(LIBRARY_OUTPUT_PATH "${CMAKE_HOME_DIRECTORY}/lib") - -add_executable(get_sender get_sender.c) #add_executable( ) - -### Add definitions for compile -target_link_libraries(get_sender simgrid m pthread) #target_link_libraries( ) -\endverbatim - -Then you have to modified /buildtools/Cmake/MakeExeLib.cmake and add -this line : -\verbatim -add_subdirectory(${CMAKE_HOME_DIRECTORY}/) -\endverbatim - -\subsubsection faq_cmakehowto2 Delete/add sources to lib. - -If you want modified, add or delete source files from a library you have to edit /buildtools/Cmake/DefinePackages.cmake - -\verbatim -set(JMSG_JAVA_SRC - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/MsgException.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/JniException.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/NativeException.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/HostNotFoundException.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/ProcessNotFoundException.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Msg.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Process.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Host.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Task.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/MsgNative.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/ApplicationHandler.java - ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Sem.java -) -\endverbatim - -\subsubsection faq_cmakehowto3 Add test - -If you want modified, add or delete tests you have to edit /buildtools/Cmake/AddTests.cmake -with this function : ADD_TEST( ) - -\verbatim -add_test(test-simdag-1 ${CMAKE_HOME_DIRECTORY}/testsuite/simdag/sd_test --cfg=path:${CMAKE_HOME_DIRECTORY}/testsuite/simdag small_platform_variable.xml) -\endverbatim - -\subsection faq_PIPOL Pipol-remote - -Now we offer the possibility to test your local sources on pipol platforms before a commit. Of course you have to be user of pipol (Account request) cause you need to give your pipol_username to cmake. Here is a list of available systems : -\verbatim - amd64_kvm-linux-debian-lenny - amd64_kvm-linux-debian-testing - amd64_kvm-windows-7 - amd64-linux-centos-5.dd.gz - amd64-linux-debian-etch.dd.gz - amd64-linux-debian-lenny.dd.gz - amd64-linux-debian-testing.dd.gz - amd64-linux-fedora-core10.dd.gz - amd64-linux-fedora-core11.dd.gz - amd64-linux-fedora-core12.dd.gz - amd64-linux-fedora-core13.dd.gz - amd64-linux-fedora-core7.dd.gz - amd64-linux-fedora-core8.dd.gz - amd64-linux-fedora-core9.dd.gz - amd64-linux-mandriva-2007_springs_powerpack.dd.gz - amd64-linux-mandriva-2009_powerpack.dd.gz - amd64-linux-opensuse-11.dd.gz - amd64-linux-redhatEL-5.0.dd.gz - amd64-linux-suse-LES10.dd.gz - amd64-linux-ubuntu-feisty.dd.gz - amd64-linux-ubuntu-hardy.dd.gz - amd64-linux-ubuntu-intrepid.dd.gz - amd64-linux-ubuntu-jaunty.dd.gz - amd64-linux-ubuntu-karmic.dd.gz - amd64-linux-ubuntu-lucid.dd.gz - amd64-unix-freebsd-7.dd.gz - amd64-windows-server-2003-64bits.dd.gz - amd64-windows-server-2008-64bits.dd.gz - i386_kvm-linux-debian-lenny - i386_kvm-linux-debian-testing - i386_kvm-linux-fedora-core13 - i386_kvm-windows-xp-pro-sp3 - i386-linux-centos-5.dd.gz - i386-linux-debian-etch.dd.gz - i386-linux-debian-lenny.dd.gz - i386-linux-debian-testing.dd.gz - i386-linux-fedora-core10.dd.gz - i386-linux-fedora-core11.dd.gz - i386-linux-fedora-core12.dd.gz - i386-linux-fedora-core13.dd.gz - i386-linux-fedora-core7.dd.gz - i386-linux-fedora-core8.dd.gz - i386-linux-fedora-core9.dd.gz - i386-linux-mandriva-2007_springs_powerpack.dd.gz - i386-linux-mandriva-2009_powerpack.dd.gz - i386-linux-opensuse-11.dd.gz - i386-linux-redhatEL-5.0.dd.gz - i386-linux-suse-LES10.dd.gz - i386-linux-ubuntu-feisty.dd.gz - i386-linux-ubuntu-hardy.dd.gz - i386-linux-ubuntu-intrepid.dd.gz - i386-linux-ubuntu-jaunty.dd.gz - i386-linux-ubuntu-karmic.dd.gz - i386-linux-ubuntu-lucid.dd.gz - i386_mac-mac-osx-server-leopard.dd.gz - i386-unix-freebsd-7.dd.gz - i386-unix-opensolaris-10.dd.gz - i386-unix-opensolaris-11.dd.gz - i386-unix-solaris-10.dd.gz - ia64-linux-debian-lenny.dd - ia64-linux-fedora-core9.dd - ia64-linux-redhatEL-5.0.dd - x86_64_mac-mac-osx-server-snow-leopard.dd.gz - x86_mac-mac-osx-server-snow-leopard.dd.gz -\endverbatim - -Two kind of uses are possible : -\verbatim -This command copy your source and execute a configure then a build and finish with tests. - bob@caraja:~/Developments/simgrid/tmp_build$ make - -This command copy your source and execute a \"ctest -D Experimental\" and submit the result to cdash. - bob@caraja:~/Developments/simgrid/tmp_build$ make _experimental -\endverbatim -All commands are resumed with : -\verbatim -bob@caraja:~/Developments/simgrid/tmp_build$ make pipol_experimental_list_images -bob@caraja:~/Developments/simgrid/tmp_build$ make pipol_test_list_images -\endverbatim - -\section faq_installation Installing the SimGrid library with Autotools (valid until V3.3.4) - -Many people have been asking me questions on how to use SimGrid. Quite -often, the questions were not really about SimGrid but on the -installation process. This section is intended to help people that are -not familiar with compiling C files under UNIX. If you follow these -instructions and still have some troubles, drop an e-mail to -. - -\subsection faq_compiling Compiling SimGrid from a stable archive - -First of all, you need to download the latest version of SimGrid from -here. -Suppose you have uncompressed SimGrid in some temporary location of -your home directory (say /home/joe/tmp/simgrid-3.0.1 ). The -simplest way to use SimGrid is to install it in your home -directory. Change your directory to -/home/joe/tmp/simgrid-3.0.1 and type - -\verbatim -./configure --prefix=$HOME -make -make install -\endverbatim - -If at some point, something fails, check the section \ref faq_trouble_compil . -If it does not help, you can report this problem to the -list but, please, avoid sending a laconic mail like "There is a problem. Is it -okay?". Send the config.log file which is automatically generated by -configure. Try to capture both the standard output and the error output of the -make command with script. There is no way for us to help you -without the relevant bits of information. - -Now, the following directory should have been created : - - \li /home/joe/doc/simgrid/html/ - \li /home/joe/lib/ - \li /home/joe/include/ - -SimGrid is not a binary, it is a library. Both a static and a dynamic -version are available. Here is what you can find if you try a ls -/home/joe/lib: - -\verbatim libsimgrid.a libsimgrid.la libsimgrid.so libsimgrid.so.0 libsimgrid.so.0.0.1 -\endverbatim - -Thus, there is two ways to link your program with SimGrid: - \li Either you use the static version, e.g -\verbatim gcc libsimgrid.a -o MainProgram MainProgram.c -\endverbatim - In this case, all the SimGrid functions are directly - included in MainProgram (hence a bigger binary). - \li Either you use the dynamic version (the preferred method) -\verbatim gcc -lsimgrid -o MainProgram MainProgram.c -\endverbatim - In this case, the SimGrid functions are not included in - MainProgram and you need to set your environment - variable in such a way that libsimgrid.so will be - found at runtime. This can be done by adding the following - line in your .bashrc (if you use bash and if you have - installed the SimGrid libraries in your home directory): -\verbatim export LD_LIBRARY_PATH=$HOME/lib/:$LD_LIBRARY_PATH -\endverbatim - -\subsection faq_compiling_java Java bindings don't get compiled - -The configure script detects automatically whether you have the -softwares needed to use the Java bindings or not. At the end of the -configure, you can see the configuration picked by the script, which -should look similar to -\verbatim Configuration of package simgrid' (version 3.3.4-svn) on -little64 (=4): - - Compiler: gcc (version: ) - - CFlags: -O3 -finline-functions -funroll-loops -fno-strict-aliasing -Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror -g3 - CPPFlags: - LDFlags: - - Context backend: ucontext - Compile Java: no - - Maintainer mode: no - Supernovae mode: yes -\endverbatim - -In this example, Java backends won't be compiled. - -On Debian-like systems (which includes ubuntu), you need the following -packages: sun-java6-jdk libgcj10-dev. If you cannot find the -libgcj10-dev, try another version, like libgcj9-dev (on Ubuntu before -9.10) or libgcj11-dev (not released yet, but certainly one day). -Please note that you need to activate the contrib and non-free -repositories in Debian, and the universe ones in Ubuntu. Java comes at -this price... - -\subsection faq_compiling_snapshoot SimGrid development snapshots - -We have very high standards on software quality, and we are reluctant releasing -a stable release as long as there is still some known bug in the code base. In -addition, we added quite an extensive test base, making sure that we correctly -test the most important parts of the tool. - -As an unfortunate conclusion, there may be some time between the stable -releases. If you want to benefit from the most recent features we introduced, -but don't want to take the risk of an untested version from the SVN, then -development snapshots are done for you. - -These are pre-releases of SimGrid that still fail some tests about features -that almost nobody use, or on platforms not being in our core target (which is -Linux, Mac, other Unixes and Windows, from the most important to the less -one). That means that using this development releases should be safe for most -users. - -These archives can be found on -this web page. Once you -got the lastest archive, you can compile it just like any archive (see above). - -\subsection faq_compiling_svn Compiling SimGrid from the SVN - -The project development takes place in the SVN, where all changes are -committed when they happen. Then every once in a while, we make sure that the -code quality meets our standard and release an archive from the code in the -SVN. We afterward go back to the development in the SVN. So, if you need a -recently added feature and can afford some little problem with the stability -of the lastest features, you may want to use the SVN version instead of a -released one. - -For that, you first need to get the "simgrid" module from -here. - -You won't find any configure and a few other things -(Makefile.in's, documentation, ...) will be missing as well. The -reason for that is that all these files have to be regenerated using the -latest versions of autoconf, libtool, automake -(>1.9) and doxygen (>1.4). To generate the configure and -the Makefile.in's, you just have to launch the bootstrap -command that resides in the top of the source tree. Then just follow the -instructions of Section \ref faq_compiling. - -We insist on the fact that you really need the latest versions of -autoconf, automake and libtool. Doing this step on exotic architectures/systems -(i.e. anything different from a recent linux distribution) may be -... uncertain. If you need to compile the SVN version on a machine where all these -dependencies are not met, the easiest is to do make dist in the SVN -directory of another machine where all dependencies are met. It will create an -archive you may deploy on other sites just as a regular stable release. - -In summary, the following commands will checkout the SVN, regenerate the -configure script and friends, configure SimGrid and build it. - -\verbatim svn checkout svn://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk simgrid -cd simgrid -./bootstrap -./configure --enable-maintainer-mode --prefix= -make \endverbatim - -Then, if you want to install SimGrid on the current box, just do: -\verbatim make install \endverbatim - -If you want to build an snapshot of the SVN to deploy it on another box (for -example because the other machine don't have the autotools), do: -\verbatim make dist \endverbatim - -Moreover, you should never call the autotools manually since you must run -them in a specific order with specific arguments. Most of the times, the -makefiles will automatically call the tools for you. When it's not possible -(such as the first time you checkout the SVN), use the ./bootstrap command -to call them explicitly. - - -\subsection faq_setting_MSG Setting up your own MSG code - -Do not build your simulator by modifying the SimGrid examples. Go -outside the SimGrid source tree and create your own working directory -(say /home/joe/SimGrid/MyFirstScheduler/). - -Suppose your simulation has the following structure (remember it is -just an example to illustrate a possible way to compile everything; -feel free to organize it as you want). - - \li sched.h: a description of the core of the - scheduler (i.e. which functions are can be used by the - agents). For example we could find the following functions - (master, forwarder, slave). - - \li sched.c: a C file including sched.h and - implementing the core of the scheduler. Most of these - functions use the MSG functions defined in section \ref - msg_gos_functions. - - \li masterslave.c: a C file with the main function, i.e. - the MSG initialization (MSG_global_init()), the platform - creation (e.g. with MSG_create_environment()), the - deployment phase (e.g. with MSG_function_register() and - MSG_launch_application()) and the call to - MSG_main()). - -To compile such a program, we suggest to use the following -Makefile. It is a generic Makefile that we have used many times with -our students when we teach the C language. - -\verbatim -all: masterslave -masterslave: masterslave.o sched.o - -INSTALL_PATH = $$HOME -CC = gcc -PEDANTIC_PARANOID_FREAK = -O0 -Wshadow -Wcast-align \ - -Waggregate-return -Wmissing-prototypes -Wmissing-declarations \ - -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations \ - -Wmissing-noreturn -Wredundant-decls -Wnested-externs \ - -Wpointer-arith -Wwrite-strings -finline-functions -REASONABLY_CAREFUL_DUDE = -Wall -NO_PRAYER_FOR_THE_WICKED = -w -O2 -WARNINGS = $(REASONABLY_CAREFUL_DUDE) -CFLAGS = -g $(WARNINGS) - -INCLUDES = -I$(INSTALL_PATH)/include -DEFS = -L$(INSTALL_PATH)/lib/ -LDADD = -lm -lsimgrid -LIBS = - -%: %.o - $(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS) $(LDADD) -o $@ - -%.o: %.c - $(CC) $(INCLUDES) $(DEFS) $(CFLAGS) -c -o $@ $< - -clean: - rm -f $(BIN_FILES) *.o *~ -.SUFFIXES: -.PHONY : clean - -\endverbatim - -The first two lines indicates what should be build when typing make -(masterslave) and of which files it is to be made of -(masterslave.o and sched.o). This makefile assumes -that you have set up correctly your LD_LIBRARY_PATH variable -(look, there is a LDADD = -lm -lsimgrid). If you prefer using -the static version, remove the -lsimgrid and add a -$(INSTALL_PATH)/lib/libsimgrid.a on the next line, right -after the LIBS = . - -More generally, if you have never written a Makefile by yourself, type -in a terminal : info make and read the introduction. The -previous example should be enough for a first try but you may want to -perform some more complex compilations... - -\subsection faq_setting_GRAS Setting up your own GRAS code - -If you use the GRAS interface instead of the MSG one, then previous section -is not the better source of information. Instead, you should check the GRAS -tutorial in general, and the \ref GRAS_tut_tour_setup in particular. - -\section faq_howto Feature related questions - -\subsection faq_MIA "Could you please add (your favorite feature here) to SimGrid?" - -Here is the deal. The whole SimGrid project (MSG, SURF, GRAS, ...) is -meant to be kept as simple and generic as possible. We cannot add -functions for everybody's needs when these functions can easily be -built from the ones already in the API. Most of the time, it is -possible and when it was not possible we always have upgraded the API -accordingly. When somebody asks us a question like "How to do that? -Is there a function in the API to simply do this?", we're always glad -to answer and help. However if we don't need this code for our own -need, there is no chance we're going to write it... it's your job! :) -The counterpart to our answers is that once you come up with a neat -implementation of this feature (task duplication, RPC, thread -synchronization, ...), you should send it to us and we will be glad to -add it to the distribution. Thus, other people will take advantage of -it (and we don't have to answer this question again and again ;). - -You'll find in this section a few "Missing In Action" features. Many -people have asked about it and we have given hints on how to simply do -it with MSG. Feel free to contribute... - -\subsection faq_MIA_MSG MSG features - -\subsubsection faq_MIA_examples I want some more complex MSG examples! - -Many people have come to ask me a more complex example and each time, -they have realized afterward that the basics were in the previous three -examples. - -Of course they have often been needing more complex functions like -MSG_process_suspend(), MSG_process_resume() and -MSG_process_isSuspended() (to perform synchronization), or -MSG_task_Iprobe() and MSG_process_sleep() (to avoid blocking -receptions), or even MSG_process_create() (to design asynchronous -communications or computations). But the examples are sufficient to -start. - -We know. We should add some more examples, but not really some more -complex ones... We should add some examples that illustrate some other -functionalists (like how to simply encode asynchronous -communications, RPC, process migrations, thread synchronization, ...) -and we will do it when we will have a little bit more time. We have -tried to document the examples so that they are understandable. Tell -us if something is not clear and once again feel free to participate! -:) - -\subsubsection faq_MIA_taskdup Missing in action: MSG Task duplication/replication - -There is no task duplication in MSG. When you create a task, you can -process it or send it somewhere else. As soon as a process has sent -this task, he doesn't have this task anymore. It's gone. The receiver -process has got the task. However, you could decide upon receiving to -create a "copy" of a task but you have to handle by yourself the -semantic associated to this "duplication". - -As we already told, we prefer keeping the API as simple as -possible. This kind of feature is rather easy to implement by users -and the semantic you associate really depends on people. Having a -*generic* task duplication mechanism is not that trivial (in -particular because of the data field). That is why I would recommand -that you write it by yourself even if I can give you advice on how to -do it. - -You have the following functions to get informations about a task: -MSG_task_get_name(), MSG_task_get_compute_duration(), -MSG_task_get_remaining_computation(), MSG_task_get_data_size(), -and MSG_task_get_data(). - -You could use a dictionary (#xbt_dict_t) of dynars (#xbt_dynar_t). If -you still don't see how to do it, please come back to us... - -\subsubsection faq_MIA_asynchronous I want to do asynchronous communications in MSG - -In the past (version <= 3.4), there was no function to perform asynchronous communications. -It could easily be implemented by creating new process when needed though. Since version 3.5, -we have introduced the following functions: - - MSG_task_isend() - - MSG_task_irecv() - - MSG_comm_test() - - MSG_comm_wait() - - MSG_comm_waitall() - - MSG_comm_waitany() - - MSG_comm_destroy() - -We refer you to the description of these functions for more details on their usage as well -as to the exemple section on \ref MSG_ex_asynchronous_communications. - -\subsubsection faq_MIA_thread_synchronization I need to synchronize my MSG processes - -You obviously cannot use pthread_mutexes of pthread_conds since we handle every -scheduling related decision within SimGrid. - -In the past (version <=3.3.4) you could do it by playing with -MSG_process_suspend() and MSG_process_resume() or with fake communications (using MSG_task_get(), -MSG_task_put() and MSG_task_Iprobe()). - -Since version 3.4, you can use classical synchronization structures. See page \ref XBT_synchro or simply check in -include/xbt/synchro_core.h. - -\subsubsection faq_MIA_host_load Where is the get_host_load function hidden in MSG? - -There is no such thing because its semantic wouldn't be really -clear. Of course, it is something about the amount of host throughput, -but there is as many definition of "host load" as people asking for -this function. First, you have to remember that resource availability -may vary over time, which make any load notion harder to define. - -It may be instantaneous value or an average one. Moreover it may be only the -power of the computer, or may take the background load into account, or may -even take the currently running tasks into account. In some SURF models, -communications have an influence on computational power. Should it be taken -into account too? - -First of all, it's near to impossible to predict the load beforehands in the -simulator since it depends on too much parameters (background load -variation, bandwidth sharing algorithmic complexity) some of them even being -not known beforehands (other task starting at the same time). So, getting -this information is really hard (just like in real life). It's not just that -we want MSG to be as painful as real life. But as it is in some way -realistic, we face some of the same problems as we would face in real life. - -How would you do it for real? The most common option is to use something -like NWS that performs active probes. The best solution is probably to do -the same within MSG, as in next code snippet. It is very close from what you -would have to do out of the simulator, and thus gives you information that -you could also get in real settings to not hinder the realism of your -simulation. - -\verbatim -double get_host_load() { - m_task_t task = MSG_task_create("test", 0.001, 0, NULL); - double date = MSG_get_clock(); - - MSG_task_execute(task); - date = MSG_get_clock() - date; - MSG_task_destroy(task); - return (0.001/date); -} -\endverbatim - -Of course, it may not match your personal definition of "host load". In this -case, please detail what you mean on the mailing list, and we will extend -this FAQ section to fit your taste if possible. - -\subsubsection faq_MIA_communication_time How can I get the *real* communication time? - -Communications are synchronous and thus if you simply get the time -before and after a communication, you'll only get the transmission -time and the time spent to really communicate (it will also take into -account the time spent waiting for the other party to be -ready). However, getting the *real* communication time is not really -hard either. The following solution is a good starting point. - -\verbatim -int sender() -{ - m_task_t task = MSG_task_create("Task", task_comp_size, task_comm_size, - calloc(1,sizeof(double))); - *((double*) task->data) = MSG_get_clock(); - MSG_task_put(task, slaves[i % slaves_count], PORT_22); - XBT_INFO("Send completed"); - return 0; -} -int receiver() -{ - m_task_t task = NULL; - double time1,time2; - - time1 = MSG_get_clock(); - a = MSG_task_get(&(task), PORT_22); - time2 = MSG_get_clock(); - if(time1<*((double *)task->data)) - time1 = *((double *) task->data); - XBT_INFO("Communication time : \"%f\" ", time2-time1); - free(task->data); - MSG_task_destroy(task); - return 0; -} -\endverbatim - -\subsection faq_MIA_SimDag SimDag related questions - -\subsubsection faq_SG_comm Implementing communication delays between tasks. - -A classic question of SimDag newcomers is about how to express a -communication delay between tasks. The thing is that in SimDag, both -computation and communication are seen as tasks. So, if you want to -model a data dependency between two DAG tasks t1 and t2, you have to -create 3 SD_tasks: t1, t2 and c and add dependencies in the following -way: - -\verbatim -SD_task_dependency_add(NULL, NULL, t1, c); -SD_task_dependency_add(NULL, NULL, c, t2); -\endverbatim - -This way task t2 cannot start before the termination of communication c -which in turn cannot start before t1 ends. - -When creating task c, you have to associate an amount of data (in bytes) -corresponding to what has to be sent by t1 to t2. - -Finally to schedule the communication task c, you have to build a list -comprising the workstations on which t1 and t2 are scheduled (w1 and w2 -for example) and build a communication matrix that should look like -[0;amount ; 0; 0]. - -\subsubsection faq_SG_DAG How to implement a distributed dynamic scheduler of DAGs. - -Distributed is somehow "contagious". If you start making distributed -decisions, there is no way to handle DAGs directly anymore (unless I -am missing something). You have to encode your DAGs in term of -communicating process to make the whole scheduling process -distributed. Here is an example of how you could do that. Assume T1 -has to be done before T2. - -\verbatim - int your_agent(int argc, char *argv[] { - ... - T1 = MSG_task_create(...); - T2 = MSG_task_create(...); - ... - while(1) { - ... - if(cond) MSG_task_execute(T1); - ... - if((MSG_task_get_remaining_computation(T1)=0.0) && (you_re_in_a_good_mood)) - MSG_task_execute(T2) - else { - /* do something else */ - } - } - } -\endverbatim - -If you decide that the distributed part is not that much important and that -DAG is really the level of abstraction you want to work with, then you should -give a try to \ref SD_API. - -\subsection faq_MIA_generic Generic features - -\subsubsection faq_more_processes Increasing the amount of simulated processes - -Here are a few tricks you can apply if you want to increase the amount -of processes in your simulations. - - - A few thousands of simulated processes (soft tricks)\n - SimGrid can use either pthreads library or the UNIX98 contextes. On - most systems, the number of pthreads is limited and then your - simulation may be limited for a stupid reason. This is especially - true with the current linux pthreads, and I cannot get more than - 2000 simulated processes with pthreads on my box. The UNIX98 - contexts allow me to raise the limit to 25,000 simulated processes - on my laptop.\n\n - The --with-context option of the ./configure - script allows you to choose between UNIX98 contextes - (--with-context=ucontext) and the pthread version - (--with-context=pthread). The default value is ucontext - when the script detect a working UNIX98 context implementation. On - Windows boxes, the provided value is discarded and an adapted - version is picked up.\n\n - We experienced some issues with contextes on some rare systems - (solaris 8 and lower or old alpha linuxes comes to mind). The main - problem is that the configure script detect the contextes as being - functional when it's not true. If you happen to use such a system, - switch manually to the pthread version, and provide us with a good - patch for the configure script so that it is done automatically ;) - - - Hundred thousands of simulated processes (hard-core tricks)\n - As explained above, SimGrid can use UNIX98 contextes to represent - and handle the simulated processes. Thanks to this, the main - limitation to the number of simulated processes becomes the - available memory.\n\n - Here are some tricks I had to use in order to run a token ring - between 25,000 processes on my laptop (1Gb memory, 1.5Gb swap).\n - - First of all, make sure your code runs for a few hundreds - processes before trying to push the limit. Make sure it's - valgrind-clean, ie that valgrind does not report neither memory - error nor memory leaks. Indeed, numerous simulated processes - result in *fat* simulation hindering debugging. - - It was really boring to write 25,000 entries in the deployment - file, so I wrote a little script - examples/gras/mutual_exclusion/simple_token/make_deployment.pl, which you may - want to adapt to your case. You could also think about hijacking - the SURFXML parser (have look at \ref faq_flexml_bypassing). - - The deployment file became quite big, so I had to do what is in - the FAQ entry \ref faq_flexml_limit - - Each UNIX98 context has its own stack entry. As debugging this is - quite hairly, the default value is a bit overestimated so that - user don't get into trouble about this. You want to tune this - size to increse the number of processes. This is the - STACK_SIZE define in - src/xbt/xbt_context_sysv.c, which is 128kb by default. - Reduce this as much as you can, but be warned that if this value - is too low, you'll get a segfault. The token ring example, which - is quite simple, runs with 40kb stacks. - - You may tweak the logs to reduce the stack size further. When - logging something, we try to build the string to display in a - char array on the stack. The size of this array is constant (and - equal to XBT_LOG_BUFF_SIZE, defined in include/xbt/log/h). If the - string is too large to fit this buffer, we move to a dynamically - sized buffer. In which case, we have to traverse one time the log - event arguments to compute the size we need for the buffer, - malloc it, and traverse the argument list again to do the actual - job.\n - The idea here is to move XBT_LOG_BUFF_SIZE to 1, forcing the logs - to use a dynamic array each time. This allows us to lower further - the stack size at the price of some performance loss...\n - This allowed me to run the reduce the stack size to ... 4k. Ie, - on my 1Gb laptop, I can run more than 250,000 processes! - -\subsubsection faq_MIA_batch_scheduler Is there a native support for batch schedulers in SimGrid? - -No, there is no native support for batch schedulers and none is -planned because this is a very specific need (and doing it in a -generic way is thus very hard). However some people have implemented -their own batch schedulers. Vincent Garonne wrote one during his PhD -and put his code in the contrib directory of our SVN so that other can -keep working on it. You may find inspiring ideas in it. - -\subsubsection faq_MIA_checkpointing I need a checkpointing thing - -Actually, it depends on whether you want to checkpoint the simulation, or to -simulate checkpoints. - -The first one could help if your simulation is a long standing process you -want to keep running even on hardware issues. It could also help to -rewind the simulation by jumping sometimes on an old checkpoint to -cancel recent calculations.\n -Unfortunately, such thing will probably never exist in SG. One would have to -duplicate all data structures because doing a rewind at the simulator level -is very very hard (not talking about the malloc free operations that might -have been done in between). Instead, you may be interested in the Libckpt -library (http://www.cs.utk.edu/~plank/plank/www/libckpt.html). This is the -checkpointing solution used in the condor project, for example. It makes it -easy to create checkpoints (at the OS level, creating something like core -files), and rerunning them on need. - -If you want to simulate checkpoints instead, it means that you want the -state of an executing task (in particular, the progress made towards -completion) to be saved somewhere. So if a host (and the task executing on -it) fails (cf. #MSG_HOST_FAILURE), then the task can be restarted -from the last checkpoint.\n - -Actually, such a thing does not exists in SimGrid either, but it's just -because we don't think it is fundamental and it may be done in the user code -at relatively low cost. You could for example use a watcher that -periodically get the remaining amount of things to do (using -MSG_task_get_remaining_computation()), or fragment the task in smaller -subtasks. - -\subsection faq_platform Platform building and Dynamic resources - -\subsubsection faq_platform_example Where can I find SimGrid platform files? - -There is several little examples in the archive, in the examples/msg -directory. From time to time, we are asked for other files, but we -don't have much at hand right now. - -You should refer to the Platform Description Archive -(http://pda.gforge.inria.fr) project to see the other platform file we -have available, as well as the Simulacrum simulator, meant to generate -SimGrid platforms using all classical generation algorithms. - -\subsubsection faq_platform_alnem How can I automatically map an existing platform? - -We are working on a project called ALNeM (Application-Level Network -Mapper) which goal is to automatically discover the topology of an -existing network. Its output will be a platform description file -following the SimGrid syntax, so everybody will get the ability to map -their own lab network (and contribute them to the catalog project). -This tool is not ready yet, but it move quite fast forward. Just stay -tuned. - -\subsubsection faq_platform_synthetic Generating synthetic but realistic platforms - -The third possibility to get a platform file (after manual or -automatic mapping of real platforms) is to generate synthetic -platforms. Getting a realistic result is not a trivial task, and -moreover, nobody is really able to define what "realistic" means when -speaking of topology files. You can find some more thoughts on this -topic in these -slides. - -If you are looking for an actual tool, there we have a little tool to -annotate Tiers-generated topologies. This perl-script is in -tools/platform_generation/ directory of the SVN. Dinda et Al. -released a very comparable tool, and called it GridG. - -\subsubsection faq_SURF_multicore Modeling multi-core resources - -There is currently no native support for multi-core or SMP machines in -SimGrid. We are currently working on it, but coming up with the right -model is very hard: Cores share caches and bus to access memory and -thus interfere with each others. Memory contention is a crucial -component of multi-core modeling. - -In the meanwhile, some user-level tricks can reveal sufficient for -you. For example, you may model each core by a CPU and add some very -high speed links between them. This complicates a bit the user code -since you have to remember that when you assign something to a (real) -host, it can be any of the (fake) hosts representing the cores of a -given machine. For that, you can use the prop tag of the XML files as -follows. Your code should then look at the ‘machine’ property -associated with each workstation, and run parallel tasks over all -cores of the machine. - -\verbatim - - - - - - - - - - -\endverbatim - -\subsubsection faq_SURF_dynamic Modeling dynamic resource availability - -A nice feature of SimGrid is that it enables you to seamlessly have -resources whose availability change over time. When you build a -platform, you generally declare hosts like that: - -\verbatim - -\endverbatim - -If you want the availability of "host A" to change over time, the only -thing you have to do is change this definition like that: - -\verbatim - -\endverbatim - -For hosts, availability files are expressed in fraction of available -power. Let's have a look at what "trace_A.txt" may look like: - -\verbatim -PERIODICITY 1.0 -0.0 1.0 -11.0 0.5 -20.0 0.9 -\endverbatim - -At time 0, our host will deliver 100 flop/s. At time 11.0, it will -deliver only 50 flop/s until time 20.0 where it will will start -delivering 90 flop/s. Last at time 21.0 (20.0 plus the periodicity -1.0), we'll be back to the beginning and it will deliver 100 flop/s. - -Now let's look at the state file: -\verbatim -PERIODICITY 10.0 -1.0 -1.0 -2.0 1.0 -\endverbatim - -A negative value means "off" while a positive one means "on". At time -1.0, the host is on. At time 1.0, it is turned off and at time 2.0, it -is turned on again until time 12 (2.0 plus the periodicity 10.0). It -will be turned on again at time 13.0 until time 23.0, and so on. - -Now, let's look how the same kind of thing can be done for network -links. A usual declaration looks like: - -\verbatim - -\endverbatim - -You have at your disposal the following options: bandwidth_file, -latency_file and state_file. The only difference with hosts is that -bandwidth_file and latency_file do not express fraction of available -power but are expressed directly in bytes per seconds and seconds. - -\subsubsection faq_platform_multipath How to express multipath routing in platform files? - -It is unfortunately impossible to express the fact that there is more -than one routing path between two given hosts. Let's consider the -following platform file: - -\verbatim - - - - - - - - - -\endverbatim - -Although it is perfectly valid, it does not mean that data traveling -from A to C can either go directly (using link 3) or through B (using -links 1 and 2). It simply means that the routing on the graph is not -trivial, and that data do not following the shortest path in number of -hops on this graph. Another way to say it is that there is no implicit -in these routing descriptions. The system will only use the routes you -declare (such as <route src="A" dst="C"><link:ctn -id="3"/></route>), without trying to build new routes by aggregating -the provided ones. - -You are also free to declare platform where the routing is not -symmetric. For example, add the following to the previous file: - -\verbatim - - - - -\endverbatim - -This makes sure that data from C to A go through B where data from A -to C go directly. Don't worry about realism of such settings since -we've seen ways more weird situation in real settings (in fact, that's -the realism of very regular platforms which is questionable, but -that's another story). - -\subsubsection faq_flexml_bypassing Bypassing the XML parser with your own C functions - -So you want to bypass the XML files parser, uh? Maybe doing some parameter -sweep experiments on your simulations or so? This is possible, and -it's not even really difficult (well. Such a brutal idea could be -harder to implement). Here is how it goes. - -For this, you have to first remember that the XML parsing in SimGrid is done -using a tool called FleXML. Given a DTD, this gives a flex-based parser. If -you want to bypass the parser, you need to provide some code mimicking what -it does and replacing it in its interactions with the SURF code. So, let's -have a look at these interactions. - -FleXML parser are close to classical SAX parsers. It means that a -well-formed SimGrid platform XML file might result in the following -"events": - - - start "platform_description" with attribute version="2" - - start "host" with attributes id="host1" power="1.0" - - end "host" - - start "host" with attributes id="host2" power="2.0" - - end "host" - - start "link" with ... - - end "link" - - start "route" with ... - - start "link:ctn" with ... - - end "link:ctn" - - end "route" - - end "platform_description" - -The communication from the parser to the SURF code uses two means: -Attributes get copied into some global variables, and a surf-provided -function gets called by the parser for each event. For example, the event - - start "host" with attributes id="host1" power="1.0" - -let the parser do something roughly equivalent to: -\verbatim - strcpy(A_host_id,"host1"); - A_host_power = 1.0; - STag_host(); -\endverbatim - -In SURF, we attach callbacks to the different events by initializing the -pointer functions to some the right surf functions. Since there can be -more than one callback attached to the same event (if more than one -model is in use, for example), they are stored in a dynar. Example in -workstation_ptask_L07.c: -\verbatim - /* Adding callback functions */ - surf_parse_reset_parser(); - surfxml_add_callback(STag_surfxml_host_cb_list, &parse_cpu_init); - surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); - surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_init); - surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints); - surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_route_elem); - surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route); - - /* Parse the file */ - surf_parse_open(file); - xbt_assert(!surf_parse(), "Parse error in %s", file); - surf_parse_close(); -\endverbatim - -So, to bypass the FleXML parser, you need to write your own version of the -surf_parse function, which should do the following: - - Fill the A__ variables with the wanted values - - Call the corresponding STag__fun function to simulate tag start - - Call the corresponding ETag__fun function to simulate tag end - - (do the same for the next set of values, and loop) - -Then, tell SimGrid that you want to use your own "parser" instead of the stock one: -\verbatim - surf_parse = surf_parse_bypass_environment; - MSG_create_environment(NULL); - surf_parse = surf_parse_bypass_application; - MSG_launch_application(NULL); -\endverbatim - -A set of macros are provided at the end of -include/surf/surfxml_parse.h to ease the writing of the bypass -functions. An example of this trick is distributed in the file -examples/msg/masterslave/masterslave_bypass.c - -\subsection faq_simgrid_configuration Changing SimGrid's behavior - -A number of options can be given at runtime to change the default -SimGrid behavior. In particular, you can change the default cpu and -network models... - -\subsubsection faq_simgrid_configuration_fullduplex Using Fullduplex - -Experimental fullduplex support is now available on the svn branch. In order to fullduple to work your platform must have two links for each pair -of interconnected hosts, see an example here: -\verbatim - simgrid_svn_sources/exemples/msg/gtnets/fullduplex-p.xml -\endverbatim - -Using fullduplex support ongoing and incoming communication flows are -treated independently for most models. The exception is the LV08 model which -adds 0.05 of usage on the opposite direction for each new created flow. This -can be useful to simulate some important TCP phenomena such as ack compression. - -Running a fullduplex example: -\verbatim - cd simgrid_svn_sources/exemples/msg/gtnets - ./gtnets fullduplex-p.xml fullduplex-d.xml --cfg=fullduplex:1 -\endverbatim - - - - - -\subsubsection faq_simgrid_configuration_gtnets Using GTNetS - -It is possible to use a packet-level network simulator -instead of the default flow-based simulation. You may want to use such -an approach if you have doubts about the validity of the default model -or if you want to perform some validation experiments. At the moment, -we support the GTNetS simulator (it is still rather experimental -though, so leave us a message if you play with it). - - - -To enable GTNetS model inside SimGrid it is needed to patch the GTNetS simulator source code -and build/install it from scratch - - - - Download and enter the recent downloaded GTNetS directory - - \verbatim - svn checkout svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/GTNetS/ - cd GTNetS - \endverbatim - - - - Use the following commands to unzip and patch GTNetS package to work within SimGrid. - - \verbatim - unzip gtnets-current.zip - tar zxvf gtnets-current-patch.tgz - cd gtnets-current - cat ../00*.patch | patch -p1 - \endverbatim - - - OPTIONALLY you can use a patch for itanium 64bit processor family. - - \verbatim - cat ../AMD64-FATAL-Removed-DUL_SIZE_DIFF-Added-fPIC-compillin.patch | patch -p1 - \endverbatim - - - Compile GTNetS - - Due to portability issues it is possible that GTNetS does not compile in your architecture. The patches furnished in SimGrid SVN repository are intended for use in Linux architecture only. Unfortunately, we do not have the time, the money, neither the manpower to guarantee GTNetS portability. We advice you to use one of GTNetS communication channel to get more help in compiling GTNetS. - - - \verbatim - ln -sf Makefile.linux Makefile - make depend - make debug - \endverbatim - - - - NOTE A lot of warnings are expected but the application should compile - just fine. If the makefile insists in compiling some QT libraries - please try a make clean before asking for help. - - - - To compile optimized version - - \verbatim - make opt - \endverbatim - - - - Installing GTNetS - - It is important to put the full path of your libgtsim-xxxx.so file when creating the symbolic link. Replace < userhome > by some path you have write access to. - - \verbatim - ln -sf //gtnets_current/libgtsim-debug.so //usr/lib/libgtnets.so - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH://usr/lib/libgtnets.so - mkdir //usr/include/gtnets - cp -fr SRC/*.h //usr/include/gtnets - \endverbatim - - - - Enable GTNetS support in SimGrid - -In order to enable gtnets with simgrid you have to give where is gtnets. (path to \/lib and \/include) - - \verbatim - Since v3.4 (with cmake) - cmake . -Dgtnets_path=//usr - - Until v3.4 (with autotools) - ./configure --with-gtnets=//usr - \endverbatim - - - Once you have followed all the instructions for compiling and - installing successfully you can activate this feature at - runntime with the following options: - - \verbatim - Since v3.4 (with cmake) - cd simgrid - make - ctest -R gtnets - - Until v3.4 (with autotools) - cd simgrid/example/msg/ - make - make check - \endverbatim - - - - Or try the GTNetS model dogbone example with - - \verbatim - gtnets/gtnets gtnets/onelink-p.xml gtnets/onelink-d.xml --cfg=network_model:GTNets - \endverbatim - - - A long version of this HowTo it is available - - - More about GTNetS simulator at GTNetS Website - - - - DISCLAIMER - The patches provided by us worked successfully with GTNetS found - here, - dated from 12th June 2008. Due to the discontinuing development of - GTNetS it is impossible to precise a version number. We STRONGLY recommend you - to download and install the GTNetS version found in SimGrid repository as explained above. - - - - -\subsubsection faq_simgrid_configuration_alternate_network Using alternative flow models - -The default simgrid network model uses a max-min based approach as -explained in the research report -A Network Model for Simulation of Grid Application. -Other models have been proposed and implemented since then (see for example -Accuracy Study and Improvement of Network Simulation in the SimGrid Framework) -and can be activated at runtime. For example: -\verbatim -./mycode platform.xml deployment.xml --cfg=workstation/model:compound --cfg=network/model:LV08 -cfg=cpu/model:Cas01 -\endverbatim - -Possible models for the network are currently "Constant", "CM02", -"LegrandVelho", "GTNets", Reno", "Reno2", "Vegas". Others will -probably be added in the future and many of the previous ones are -experimental and are likely to disappear without notice... To know the -list of the currently implemented models, you should use the ---help-models command line option. - -\verbatim -./masterslave_forwarder ../small_platform.xml deployment_masterslave.xml --help-models -Long description of the workstation models accepted by this simulator: - CLM03: Default workstation model, using LV08 and CM02 as network and CPU - compound: Workstation model allowing you to use other network and CPU models - ptask_L07: Workstation model with better parallel task modeling -Long description of the CPU models accepted by this simulator: - Cas01_fullupdate: CPU classical model time=size/power - Cas01: Variation of Cas01_fullupdate with partial invalidation optimization of lmm system. Should produce the same values, only faster - CpuTI: Variation of Cas01 with also trace integration. Should produce the same values, only faster if you use availability traces -Long description of the network models accepted by this simulator: - Constant: Simplistic network model where all communication take a constant time (one second) - CM02: Realistic network model with lmm_solve and no correction factors - LV08: Realistic network model with lmm_solve and these correction factors: latency*=10.4, bandwidth*=.92, S=8775 - Reno: Model using lagrange_solve instead of lmm_solve (experts only) - Reno2: Model using lagrange_solve instead of lmm_solve (experts only) - Vegas: Model using lagrange_solve instead of lmm_solve (experts only) -\endverbatim - -\subsection faq_tracing Tracing Simulations for Visualization - -The trace visualization is widely used to observe and understand the behavior -of parallel applications and distributed algorithms. Usually, this is done in a -two-step fashion: the user instruments the application and the traces are -analyzed after the end of the execution. The visualization itself can highlights -unexpected behaviors, bottlenecks and sometimes can be used to correct -distributed algorithms. The SimGrid team has instrumented the library -in order to let users trace their simulations and analyze them. This part of the -user manual explains how the tracing-related features can be enabled and used -during the development of simulators using the SimGrid library. - -\subsubsection faq_tracing_howitworks How it works - -For now, the SimGrid library is instrumented so users can trace the platform -utilization using the MSG, SimDAG and SMPI interface. This means that the tracing will -register how much power is used for each host and how much bandwidth is used for -each link of the platform. The idea with this type of tracing is to observe the -overall view of resources utilization in the first place, especially the -identification of bottlenecks, load-balancing among hosts, and so on. - -The idea of the tracing facilities is to give SimGrid users to possibility to -classify MSG and SimDAG tasks by category, tracing the platform utilization -(hosts and links) for each of the categories. For that, -the tracing interface enables the declaration of categories and a function to -mark a task with a previously declared category. The tasks that are not -classified according to a category are not traced. Even if the user -does not specify any category, the simulations can still be traced in terms -of resource utilization by using a special parameter that is detailed below. - -\subsubsection faq_tracing_enabling Enabling using CMake - -With the sources of SimGrid, it is possible to enable the tracing -using the parameter -Denable_tracing=ON when the cmake is executed. -The section \ref faq_tracing_functions describes all the functions available -when this Cmake options is activated. These functions will have no effect -if SimGrid is configured without this option (they are wiped-out by the -C-preprocessor). - -\verbatim -$ cmake -Denable_tracing=ON . -$ make -\endverbatim - -\subsubsection faq_tracing_functions Tracing Functions - -\li \c TRACE_category (const char *category): This function should be used -to define a user category. The category can be used to differentiate the tasks -that are created during the simulation (for example, tasks from server1, -server2, or request tasks, computation tasks, communication tasks). -All resource utilization (host power and link bandwidth) will be -classified according to the task category. Tasks that do not belong to a -category are not traced. - -\li \c TRACE_msg_set_task_category (m_task_t task, const char *category): -This function should be called after the creation of a MSG task, to define the -category of that task. The first parameter \c task must contain a task that was -created with the function \c MSG_task_create. The second parameter -\c category must contain a category that was previously defined by the function -\c TRACE_category. - -\li \c TRACE_sd_set_task_category (SD_task_t task, const char *category): -This function should be called after the creation of a SimDAG task, to define the -category of that task. The first parameter \c task must contain a task that was -created with the function \c MSG_task_create. The second parameter -\c category must contain a category that was previously defined by the function -\c TRACE_category. - -\li \c TRACE_host_variable_declare (const char *variable): -Declare a user variable that will be associated to hosts. A variable can -be used to trace user variables such as the number of tasks in a server, -the number of clients in an application, and so on. - -\li \c TRACE_host_variable_[set|add|sub] (const char *variable, double -value): -Set the value of a given user variable. It is important to remind that -the value of this variable is always associated to the host. The host -that will be used when these functions are called is the one returned by -the function \c MSG_host_self(). - -\subsubsection faq_tracing_options Tracing configuration Options - -These are the options accepted by the tracing system of SimGrid: - -\li \c -tracing -: - It activates the tracing system and register the simulation platform - in the trace file. You have to enable this option to others take effect. - -\li \c -tracing/categorized -: - It activates the categorized resource utilization tracing. It should - be enabled if tracing categories are used by this simulator. - -\li \c -tracing/uncategorized -: - It activates the uncategorized resource utilization tracing. Use it if - this simulator do not use tracing categories and resource use have to be - traced. - -\li \c -tracing/platform/method -: - It changes the way resource utilization (categorized or not) is traced - inside the simulation core. Method 'a' (default) traces all updates defined - by the CPU/network model of a given resource. Depending on the interface used - by this simulator (MSG, SMPI, SimDAG), the default method can generate large - trace files. Method 'b' tries to make smaller tracefiles using clever updates, - without losing details of resource utilization. Method 'c' generates even - smaller files by doing time integration during the simulation, but it loses - precision. If this last method is used, the smallest timeslice used in the - tracefile analysis must be bigger than the smaller resource utilization. If - unsure, do not change this option. - -\li \c -tracing/filename -: - A file with this name will be created to register the simulation. The file - is in the Paje format and can be analyzed using Triva or Paje visualization - tools. More information can be found in these webpages: - http://triva.gforge.inria.fr/ - http://paje.sourceforge.net/ - -\li \c -tracing/smpi -: - This option only has effect if this simulator is SMPI-based. Traces the MPI - interface and generates a trace that can be analyzed using Gantt-like - visualizations. Every MPI function (implemented by SMPI) is transformed in a - state, and point-to-point communications can be analyzed with arrows. - -\li \c -tracing/smpi/group -: - This option only has effect if this simulator is SMPI-based. The processes - are grouped by the hosts where they were executed. - -\li \c -tracing/msg/task -: - This option only has effect if this simulator is MSG-based. It traces the - behavior of all categorized MSG tasks, grouping them by hosts. - -\li \c -tracing/msg/process -: - This option only has effect if this simulator is MSG-based. It traces the - behavior of all categorized MSG processes, grouping them by hosts. This option - can be used to track process location if this simulator has process migration. - -\li \c -tracing/msg/volume -: - This experimental option only has effect if this simulator is MSG-based. - It traces the communication volume of MSG send/receive. - -\subsubsection faq_tracing_example Example of Instrumentation - -A simplified example using the tracing mandatory functions. - -\verbatim -int main (int argc, char **argv) -{ - MSG_global_init (&argc, &argv); - - //note that TRACE_start must be called after MSG_global_init - TRACE_category_with_color ("request", "1 0 0"); - TRACE_category_with_color ("computation", "0.3 1 0.4"); - TRACE_category ("finalize"); - - //(... after deployment ...) - - m_task_t req1 = MSG_task_create("1st_request_task", 10, 10, NULL); - m_task_t req2 = MSG_task_create("2nd_request_task", 10, 10, NULL); - m_task_t req3 = MSG_task_create("3rd_request_task", 10, 10, NULL); - m_task_t req4 = MSG_task_create("4th_request_task", 10, 10, NULL); - TRACE_msg_set_task_category (req1, "request"); - TRACE_msg_set_task_category (req2, "request"); - TRACE_msg_set_task_category (req3, "request"); - TRACE_msg_set_task_category (req4, "request"); - - m_task_t comp = MSG_task_create ("comp_task", 100, 100, NULL); - TRACE_msg_set_task_category (comp, "computation"); - - m_task_t finalize = MSG_task_create ("finalize", 0, 0, NULL); - TRACE_msg_set_task_category (finalize, "finalize"); - - //(...) - - MSG_clean(); - return 0; -} -\endverbatim - -\subsubsection faq_tracing_analyzing Analyzing the SimGrid Traces - -The SimGrid library, during an instrumented simulation, creates a trace file in -the Paje file format that contains the platform utilization for the simulation -that was executed. The visualization analysis of this file is performed with the -visualization tool Triva, with -special configurations tunned to SimGrid needs. This part of the documentation -explains how to configure and use Triva to analyse a SimGrid trace file. - -- Installing Triva: the tool is available in the INRIAGforge, -at http://triva.gforge.inria.fr. -Use the following command to get the sources, and then check the file -INSTALL. This file contains instructions to install -the tool's dependencies in a Ubuntu/Debian Linux. The tool can also -be compiled in MacOSes natively, check INSTALL.mac file. -\verbatim -$ svn checkout svn://scm.gforge.inria.fr/svn/triva -$ cd triva -$ cat INSTALL -\endverbatim - -- Executing Triva: a binary called Triva is available after the - installation (you can execute it passing --help to check its -options). If the triva binary is not available after following the -installation instructions, you may want to execute the following command to -initialize the GNUstep environment variables. We strongly recommend that you -use the latest GNUstep packages, and not the packages available through apt-get -in Ubuntu/Debian packaging systems. If you install GNUstep using the latest -available packages, you can execute this command: -\verbatim -$ source /usr/GNUstep/System/Library/Makefiles/GNUstep.sh -\endverbatim -You should be able to see this output after the installation of triva: -\verbatim -$ ./Triva.app/Triva --help -Usage: Triva [OPTIONS...] TRACE0 [TRACE1] -Trace Analysis through Visualization - -TimeInterval - --ti_frequency {double} Animation: frequency of updates - --ti_hide Hide the TimeInterval window - --ti_forward {double} Animation: value to move time-slice - --ti_apply Apply the configuration - --ti_update Update on slider change - --ti_animate Start animation - --ti_start {double} Start of time slice - --ti_size {double} Size of time slice -Triva - --comparison Compare Trace Files (Experimental) - --graph Configurable Graph - --list Print Trace Type Hierarchy - --hierarchy Export Trace Type Hierarchy (dot) - --stat Trace Statistics and Memory Utilization - --instances List All Trace Entities - --linkview Link View (Experimental) - --treemap Squarified Treemap - --merge Merge Trace Files (Experimental) - --check Check Trace File Integrity -GraphConfiguration - --gc_conf {file} Graph Configuration in Property List Format - --gc_apply Apply the configuration - --gc_hide Hide the GraphConfiguration window -\endverbatim -Triva expects that the user choose one of the available options -(currently --graph or --treemap for a visualization analysis) -and the trace file from the simulation. - -- Understanding Triva - time-slice: the analysis of a trace file using - the tool always takes into account the concept of the time-slice. -This concept means that what is being visualized in the screen is always -calculated considering a specific time frame, with its beggining and end -timestamp. The time-slice is configured by the user and can be changed -dynamically through the window called Time Interval that is opened -whenever a trace file is being analyzed. The next figure depicts the time-slice -configuration window. -In the top of the window, in the space named Trace Time, -the two fields show the beggining of the trace (which usually starts in 0) and -the end (that depends on the time simulated by SimGrid). The middle of the -window, in the square named Time Slice Configuration, contains the -aspects related to the time-slice, including its start and its -size. The gray rectangle in the bottom of this part indicates the -current time-slice that is considered for the drawings. If the checkbox -Update Drawings on Sliders Change is not selected, the button -Apply must be clicked in order to inform triva that the -new time-slice must be considered. The bottom part of the window, in the space -indicated by the square Time Slice Animation can be used to advance -the time-frame automatically. The user configures the amount of time that the -time-frame will forward and how frequent this update will happen. Once this is -configured, the user clicks the Play button in order to see the dynamic -changes on the drawings. -
-\htmlonly - -\endhtmlonly -
-Remarks: when the trace has too many hosts or links, the computation to -take into account a new time-slice can be expensive. When this happens, the -Frequency parameter, but also updates caused by change on configurations -when the checkbox Update Drawings on Sliders -Change is selected will not be followed. - -- Understanding Triva - graph: this part of the documention explains how - to analyze the traces using the graph view of Triva, when the user executes -the tool passing --graph as parameter. Triva opens three windows when -this parameter is used: the Time Interval window (previously described), -the Graph Representation window, and the Graph Configuration -window. The Graph Representation is the window where drawings take place. -Initially, it is completely white waiting for a proper graph configuration input -by the user. We start the description of this type of analysis by describing the -Graph Configuration window (depicted below). By using a particular -configuration, triva -can be used to customize the graph drawing according to -the SimGrid trace that was created with user-specific categories. Before delving -into the details of this customization, let us first explain the major parts of -the graph configuration window. The buttons located in the top-right corner can -be used to delete, copy and create a new configuration. The checkbox in the -top-middle part of the window indicates if the configuration typed in the -textfield is syntactically correct (we are using the non-XML -Property List Format to -describe the configuration). The pop-up button located on the top-left corner -indicates the selected configuration (the user can have multiple graph -configurations). The bottom-left text field contains the name of the current -configuration (updates on this field must be followed by typing enter on the -keyboard to take into account the name change). The bottom-right Apply -button activates the current configuration, resulting on an update on the graph -drawings. -
-\htmlonly - -\endhtmlonly -
-Basic SimGrid Configuration: The figure shows in the big textfield the -basic configuration that should be used during the analysis of a SimGrid trace -file. The basic logic of the configuration is as follows: -\verbatim -{ - node = (HOST); - edge = (LINK); -\endverbatim -The nodes of the graph will be created based on the node parameter, which -in this case is the different "HOST"s of the platform -used to simulate. The edge parameter indicates that the edges of the -graph will be created based on the "LINK"s of the platform. After the -definition of these two parameters, the configuration must detail how -HOSTs and LINKs should be drawn. For that, the configuration -must have an entry for each of the types used. For HOST, as basic -configuration, we have: -\verbatim - HOST = { - size = power; - scale = global; - }; -\endverbatim -The parameter size indicates which variable from the trace file will be -used to define the size of the node HOST in the visualization. If the simulation -was executed with availability traces, the size of the nodes will be changed -according to these traces. The parameter scale indicates if the value -of the variable is global or local. If it is global, the value -will be relative to the power of all other hosts, if it is local, the value will -be relative locally. -For LINK we have: -\verbatim - LINK = { - src = source; - dst = destination; - - size = bandwidth; - scale = global; - }; -\endverbatim -For the types specified in the edge parameter (such as LINK), -the configuration must contain two additional parameters: src and -dst that are used to properly identify which nodes this edge is -connecting. The values source and destination are always present -in the SimGrid trace file and should not be changed in the configuration. The -parameter size for the LINK, in this case, is configured as the -variable bandwidth, with a global scale. The scale meaning -here is exactly the same used for nodes. The last parameter is the GraphViz -algorithm used to calculate the position of the nodes in the graph -representation. -\verbatim - graphviz-algorithm = neato; -} -\endverbatim -Customizing the Graph Representation: triva is capable to handle -a customized graph representation based on the variables present in the trace -file. In the case of SimGrid, every time a category is created for tasks, two -variables in the trace file are defined: one to indicate node utilization (how -much power was used by that task category), and another to indicate link -utilization (how much bandwidth was used by that category). For instance, if the -user declares a category named request, there will be variables named -prequest and a brequest (p for power and -b for bandwidth). It is important to notice that the variable -prequest in this case is only available for HOST, and -brequest is only available for LINK. Example: suppose there are -two categories for tasks: request and compute. To create a customized graph -representation with a proportional separation of host and link utilization, use -as configuration for HOST and LINK this: -\verbatim - HOST = { - size = power; - scale = global; - - sep_host = { - type = separation; - size = power; - values = (prequest, pcomputation); - }; - }; - - LINK = { - src = source; - dst = destination; - size = bandwidth; - scale = global; - - sep_link = { - type = separation; - size = bandwidth; - values = (brequest, bcomputation); - }; - }; -\endverbatim -Where sep_host contains a composition of type separation where -its max size is the power of the host and the variables prequest -and pcomputation are drawn proportionally to the size of the HOST. And -sep_link is also a separation where max is defined as the -bandwidth of the link, and the variables brequest and -bcomputation are drawn proportionally within a LINK. -This configuration enables the analysis of resource utilization by MSG tasks, -and the identification of load-balancing issues, network bottlenecks, for -instance. \n -Other compositions: besides separation, it is possible to use -other types of compositions, such as gradients, and colors, like this: -\verbatim - gra_host = { - type = gradient; - scale = global; - values = (numberOfTasks); - }; - color_host = { - type = color; - values = (is_server); - }; -\endverbatim -Where gra_host creates a gradient within a node of the graph, using a -global scale and using as value a variable called numberOfTasks, that -could be declared by the user using the optional tracing functions of SimGrid. -If scale is global, the max and min value for the gradient will be equal to the -max and min numberOfTasks among all hosts, and if scale is local, the max and -min value based on the value of numberOfTasks locally in each host. -And color_host composition draws a square based on a positive value of -the variable is_server, that could also be defined by the user using the -SimGrid tracing functions. \n -The Graph Visualization: The next figure shows a graph visualization of a -given time-slice of the masterslave_forwarder example (present in the SimGrid -sources). The red color indicates tasks from the compute category. This -visualization was generated with the following configuration: -\verbatim -{ - node = (HOST); - edge = (LINK); - - HOST = { - size = power; - scale = global; - - sep_host = { - type = separation; - size = power; - values = (pcompute, pfinalize); - }; - }; - LINK = { - src = source; - dst = destination; - size = bandwidth; - scale = global; - - sep_link = { - type = separation; - size = bandwidth; - values = (bcompute, bfinalize); - }; - }; - graphviz-algorithm = neato; -} -\endverbatim -
-\htmlonly - -\endhtmlonly -
- -- Understading Triva - colors: An important issue when using Triva is how - to define colors. To do that, we have to know which variables are defined in -the trace file generated by the SimGrid library. The parameter --list -lists the variables for a given trace file: -\verbatim -$ Triva -l masterslave_forwarder.trace -iFile -c platform -c HOST -v power -v is_slave -v is_master -v task_creation -v task_computation -v pcompute -v pfinalize -c LINK -v bandwidth -v latency -v bcompute -v bfinalize -c user_type -\endverbatim -We can see that HOST has seven variables (from power to pfinalize) and LINK has -four (from bandwidth to bfinalize). To define a red color for the -pcompute and bcompute (which are defined based on user category -compute), execute: -\verbatim -$ defaults write Triva 'pcompute Color' '1 0 0' -$ defaults write Triva 'bcompute Color' '1 0 0' -\endverbatim -Where the three numbers in each line are the RGB color with values from 0 to 1. - -\subsection faq_modelchecking Model-Checking -\subsubsection faq_modelchecking_howto How to use it -To enable the experimental SimGrid model-checking support the program should -be executed with the command line argument -\verbatim ---cfg=model-check:1 -\endverbatim -Properties are expressed as assertions using the function -\verbatim -void MC_assert(int prop); -\endverbatim - -\subsection faq_binding_lua Lua Binding -Most of Simgrid modules require a good level in C programming, since simgrid is used to be as standard C library. - Sometime users prefer using some kind of « easy scripts » or a language easier to code with, for their works, - which avoid dealing with C errors, and sometime an important gain of time. -Besides Java Binding, Lua and Ruby bindings are available since version 3.4 of Simgrid -for MSG Module, and we are currenlty working on bindings for other modules. - - -\subsubsection faq_binding_lua_about What is lua ? -Lua is a lightweight, reflective, imperative and functional programming language, - designed as a scripting language with extensible semantics as a primary goal (see official web site here). -\subsubsection faq_binding_lua_why Why lua ? -Lua is a fast, portable and powerful script language, quite simple to use for developpers. -it combines procedural features with powerful data description facilities, - by using a simple, yet powerful, mechanism of tables. -Lua has a relatively simple C API compared to other scripting languages, -and accordingly it provides a robust, easy to use it. -\subsubsection faq_binding_lua_simgrid How to use lua in Simgrid ? -Actually, the use of lua in Simgrid is quite simple, you have just to follow the same steps as coding with C in Simgird : - - Coding functions coresponding to each process - - loading the platforme/deployment XML file that describe the environment of simulation - - and … Running the Simulation. - -\dontinclude lua/master_slave.lua -\subsubsection faq_binding_lua_example_master_slave Master/Slave Example - - \li Master Code - \until end_of_master -we mainly use simgrid.Task.new(task_name,computation_size,communication_size) to create our MSG Task, - then simgrid.Task.send(task,alias) to send it. -we use also simgrid.Task.name(task), to get the task's name. - -\li Slave Code -\until end_of_slave -Here, we see the use of simgrid.Task.recv(alias) to receive a task with a specific alias, -this function return directly the task recevied. - -\li Set Environmenet and run application -\until simgrid.clean() - -\subsubsection faq_binding_lua_example_data Exchanging Data -You can also exchange data between Process using lua. for that, you have to deal with lua task as a table, -since lua is based itself on a mechanism of tables, -so you can exchange any kind of data (tables, matrix, strings,…) between process via tasks. - -\li Sender process -\verbatim - task = simgrid.Task.new("data_task",task_comp,task_comm); - task['matrix'] = my_matrix; - task['table'] = my_table; - task['message'] = "Hello from (Lua || Simgrid ) !! " - … - simgrid.Task.send(task,alias) -\endverbatim - After creating task, we associate to it various kind of data with a specific key (string in this case) - to distinguish between data variables. The receiver will use this key to access easily to datas. - - -\li Receiver processe -\verbatim - task = simgrid.Task.recv(alias); - sender_matrix = task['matrix']; - sender_table = task['table']; - sender_message = task['message'] - ... -\endverbatim - Note that in lua, both sender and receiver share the same lua task. - So that the receiver could joint data directly on the received task without sending it back. - You can find a complet example (matrix multiplication case) in the file example/lua/mult_matrix.lua. - - -\subsubsection faq_binding_lua_example_bypass Bypass XML - maybe you wonder if there is a way to bypass the XML files, - and describe your platform directly from the code, with lua bindings it's Possible !! how ? - We provide some additional (tricky?) functions in lua that allows you to set up your own platform without using the XML files - ( this can be useful for large platforms, so a simple for loop will avoid you to deal with an annoying XML File ;) ) - - -\li set Routing mode -\verbatim - simgrid.AS.new{id="AS0",mode="Full"}; -\endverbatim - -\li set Hosts -\verbatim - simgrid.Host.new{id="Tremblay",power=98095000}; - simgrid.Host.new{id="Jupiter",power=76296000}; - simgrid.Host.new{id="Fafard",power=76296000}; - simgrid.Host.new{id="Ginette",power=48492000}; - simgrid.Host.new{id="Bourassa",power=48492000}; -\endverbatim - we use simgrid.Host.new{id=id_host,power=power_host} to instanciate our hosts. - -\li set Links -\verbatim - for i=0,11 do - simgrid.Link.new{id=i,bandwidth=252750+ i*768,latency=0.000270544+i*0.087}; -- some crazy values ;) - end -\endverbatim - we used simgrid.Link.new{id=link_id,bandwidth=bw,latency=lat} with a simple for loop to create all links we need (much easier than XML hein ?) - -\li set Routes -\verbatim --- simgrid.Route.new(src_id,des_id,links_nb,links_list) - simgrid.Route.new("Tremblay","Jupiter",1,{"1"}); - simgrid.Route.new("Tremblay","Fafard",6,{"0","1","2","3","4","8"}); - simgrid.Route.new("Tremblay","Ginette",3,{"3","4","5"}); - simgrid.Route.new("Tremblay","Bourassa",7,{"0","1","3","2","4","6","7"}); - - simgrid.Route.new("Jupiter","Tremblay",1,{"1"}); - simgrid.Route.new("Jupiter","Fafard",7,{"0","1","2","3","4","8","9"}); - simgrid.Route.new("Jupiter","Ginette",4,{"3","4","5","9"}); - simgrid.Route.new("Jupiter","Bourassa",8,{"0","1","2","3","4","6","7","9"}); - ... -\endverbatim - for each host you have to specify which route to choose to access to the rest of hosts connected in the grid. - -\li Save platform -\verbatim - simgrid.register_platform(); -\endverbatim -Don't forget to register your platform, that SURF callbacks starts their work ;) - -\li set application -\verbatim - simgrid.Host.setFunction("Tremblay","Master",4,{"20","550000000","1000000","4"}); - simgrid.Host.setFunction("Bourassa","Slave",1,{"0"}); - simgrid.Host.setFunction("Jupiter","Slave",1,{"1"}); - simgrid.Host.setFunction("Fafard","Slave",1,{"2"}); - simgrid.Host.setFunction("Ginette","Slave",1,{"3"}); -\endverbatim - you don't need to use a deployment XML file, thanks to simgrid.Host.setFunction(host_id,function,args_number,args_list) - you can associate functions for each host with arguments if needed . - -\li -\verbatim - simgrid.register_application(); -\endverbatim -Yes, Here too you have to resgiter your application before running the simulation. - -the full example is distributed in the file examples/lua/master_slave_bypass.lua - -\subsection faq_binding_ruby Ruby Binding - - -\subsubsection faq_binding_ruby_simgrid Use Ruby in Simgrid -Since v3.4, the use of ruby in simgrid is available for the MSG Module. -you can find almost all MSG functionalities in Ruby code, that allows you to set up your environment, manage tasks between hosts and run the simulation. - -\dontinclude ruby/MasterSlave.rb -\subsubsection faq_binding_ruby_example Master/Slave Ruby Application -for each process method(master and slave in this example), you have to associate a ruby class, that should inherit from MSG::Process ruby class, - with a 'main' function that describe the behaviour of the process during the simulation. -\li required stuff -\verbatim -require 'simgrid' -include MSG -\endverbatim - -\li Master code -\until end_of_master - -the class MSG::Task contains methods that allows the management of the native MSG tasks. -in master ruby code we used : - - MSG::Task.new(task_name,compute_size,communication_size) : to instanciate a new task. - - MSG::Task.send(mailbox) : to send the task via a mailbox alias. - - MSG::Task.name : to get the task's name. - -\li Slave code -\until end_of_slave -to receive a task, we use the method MSG::Task.receive(mailbox) that return a MSG:Task object (received task). - -\li Main chunk -\until MSG.exit - -- MSG.createEnvironment(platform_file) : set up the environment -- MSG.deployApplication(deployment_file) : load the deployment file description. -- MSG.run : run the simulation - -\subsubsection faq_binding_ruby_data Exchanging data -ruby bindings provides two ways to exchange data between ruby processes. -\li MSG::Task.join & MSG::Task.data \br - - the MSG::Task class contains 2 methods that allows a data exchange between 2 process. - - -MSG::Task.join : makes possible to join any kind of ruby data within a task. - \verbatim - ... - myTable = Array.new - myTable <<1<<-2<<45<<67<<87<<76<<89<<56<<78<<3<<-4<<99 - # Creates and send Task With the Table inside - task = MSG::Task.new("quicksort_task",taskComputeSize, taskCommunicationSize); - task.join(myTable); - ... - task.send(mailbox); - \endverbatim - -MSG::Task.data : to access to the data contained into the task. - \verbatim - ... - task = MSG::Task.receive(recv_mailbox.to_s) - table = task.data - quicksort(table,0,table.size-1) - ... - \endverbatim -you can find a complet example illustrating the use of those methods in file /example/ruby/Quicksort.rb - -\li inheritence - - another 'object-oriented' way to do it, is to make your own 'task' class that inherit from MSG::Task , - and contains data you want to deal with, the only 'tricky' thing is that "the initializer" method has no effect ! - - the use of some getter/setter methods would be the simple way to manage your data :) - \verbatim -class PingPongTask < MSG::Task - # The initialize method has no effect - @time - def setTime(t) - @time = t - end - def getTime() - return @time - end -end - \endverbatim - you can find an example of use in file example/ruby/PingPong.rb - -\section faq_troubleshooting Troubleshooting - -\subsection faq_trouble_lib_compil SimGrid compilation and installation problems - -\subsubsection faq_trouble_lib_config ./configure fails! - -We know only one reason for the configure to fail: - - - You are using a broken build environment\n - If symptom is that configure complains about gcc not being able to build - executables, you are probably missing the libc6-dev package. Damn Ubuntu. - -If you experience other kind of issue, please get in touch with us. We are -always interested in improving our portability to new systems. - -\subsubsection faq_trouble_distcheck Dude! "make check" fails on my machine! - -Don't assume we never run this target, because we do. Check -http://bob.loria.fr:8010 if you don't believe us. - -There is several reasons which may cause the make check to fail on your -machine: - - - You are using a broken libc (probably concerning the contextes).\n - The symptom is that the "make check" fails within the examples/msg directory.\n - By default, SimGrid uses something called ucontexts. This is part of the - libc, but it's quite undertested. For example, some (old) versions of the - glibc on alpha do not implement these functions, but provide the stubs - (which return ENOSYS: not implemented). It may fool our detection mechanism - and leads to segfaults. There is not much we can do to fix the bug. - A workaround is to compile with --with-context=pthread to avoid - ucontext completely. You'll be a bit more limited in the number - of simulated processes you can start concurrently, but 5000 - processes is still enough for most purposes, isn't it?\n - This limitation is the reason why we insist on using this piece of ... - software even if it's so troublesome.\n - => use --with-pthread on AMD64 architecture that do not have an - ultra-recent libc. - - - There is a bug in SimGrid we aren't aware of.\n - If none of the above apply, please drop us a mail on the mailing list so - that we can check it out. Make sure to read \ref faq_bugrepport - before you do so. - -\subsection faq_trouble_compil User code compilation problems - -\subsubsection faq_trouble_err_logcat "gcc: _simgrid_this_log_category_does_not_exist__??? undeclared (first use in this function)" - -This is because you are using the log mecanism, but you didn't created -any default category in this file. You should refer to \ref XBT_log -for all the details, but you simply forgot to call one of -XBT_LOG_NEW_DEFAULT_CATEGORY() or XBT_LOG_NEW_DEFAULT_SUBCATEGORY(). - -\subsubsection faq_trouble_pthreadstatic "gcc: undefined reference to pthread_key_create" - -This indicates that one of the library SimGrid depends on (libpthread -here) was missing on the linking command line. Dependencies of -libsimgrid are expressed directly in the dynamic library, so it's -quite impossible that you see this message when doing dynamic linking. - -If you compile your code statically (and if you use a pthread version -of SimGrid -- see \ref faq_more_processes), you must absolutely -specify -lpthread on the linker command line. As usual, this should -come after -lsimgrid on this command line. - -\subsection faq_trouble_errors Runtime error messages - -\subsubsection faq_flexml_limit "surf_parse_lex: Assertion `next limit' failed." - -This is because your platform file is too big for the parser. - -Actually, the message comes directly from FleXML, the technology on top of -which the parser is built. FleXML has the bad idea of fetching the whole -document in memory before parsing it. And moreover, the memory buffer size -must be determined at compilation time. - -We use a value which seems big enough for our need without bloating the -simulators footprints. But of course your mileage may vary. In this case, -just edit src/surf/surfxml.l modify the definition of -FLEXML_BUFFERSTACKSIZE. E.g. - -\verbatim -#define FLEXML_BUFFERSTACKSIZE 1000000000 -\endverbatim - -Then recompile and everything should be fine, provided that your version of -Flex is recent enough (>= 2.5.31). If not the compilation process should -warn you. - -A while ago, we worked on FleXML to reduce a bit its memory consumption, but -these issues remain. There is two things we should do: - - - use a dynamic buffer instead of a static one so that the only limit - becomes your memory, not a stupid constant fixed at compilation time - (maybe not so difficult). - - change the parser so that it does not need to get the whole file in - memory before parsing - (seems quite difficult, but I'm a complete newbe wrt flex stuff). - -These are changes to FleXML itself, not SimGrid. But since we kinda hijacked -the development of FleXML, I can grant you that any patches would be really -welcome and quickly integrated. - -Update: A new version of FleXML (1.7) was released. Most of the work -was done by William Dowling, who use it in his own work. The good point is -that it now use a dynamic buffer, and that the memory usage was greatly -improved. The downside is that William also changed some things internally, -and it breaks the hack we devised to bypass the parser, as explained in -\ref faq_flexml_bypassing. Indeed, this is not a classical usage of the -parser, and Will didn't imagine that we may have used (and even documented) -such a crude usage of FleXML. So, we now have to repair the bypassing -functionality to use the lastest FleXML version and fix the memory usage in -SimGrid. - -\subsubsection faq_trouble_gras_transport GRAS spits networking error messages - -Gras, on real platforms, naturally use regular sockets to communicate. They -are deeply hidden in the gras abstraction, but when things go wrong, you may -get some weird error messages. Here are some example, with the probable -reason: - - - Transport endpoint is not connected: several processes try to open - a server socket on the same port number of the same machine. This is - naturally bad and each process should pick its own port number for this.\n - Maybe, you just have some processes remaining from a previous experiment - on your machine.\n - Killing them may help, but again if you kill -KILL them, you'll have to - wait for a while: they didn't close there sockets properly and the system - needs a while to notice that this port is free again. - - - Socket closed by remote side: if the remote process is not - supposed to close the socket at this point, it may be dead. - - - Connection reset by peer: I found this on Internet about this - error. I think it's what's happening here, too:\n - This basically means that a network error occurred while the client was - receiving data from the server. But what is really happening is that the - server actually accepts the connection, processes the request, and sends - a reply to the client. However, when the server closes the socket, the - client believes that the connection has been terminated abnormally - because the socket implementation sends a TCP reset segment telling the - client to throw away the data and report an error.\n - Sometimes, this problem is caused by not properly closing the - input/output streams and the socket connection. Make sure you close the - input/output streams and socket connection properly. If everything is - closed properly, however, and the problem persists, you can work around - it by adding a one-second sleep before closing the streams and the - socket. This technique, however, is not reliable and may not work on all - systems.\n - Since GRAS sockets are closed properly (repeat after me: there is no bug - in GRAS), it is either that you are closing your sockets on server side - before the client get a chance to read them (use gras_os_sleep() to delay - the server), or the server died awfully before the client got the data. - -\subsubsection faq_trouble_errors_big_fat_warning I'm told that my XML files are too old. - -The format of the XML platform description files is sometimes -improved. For example, we decided to change the units used in SimGrid -from MBytes, MFlops and seconds to Bytes, Flops and seconds to ease -people exchanging small messages. We also reworked the route -descriptions to allow more compact descriptions. - -That is why the XML files are versionned using the 'version' attribute -of the root tag. Currently, it should read: -\verbatim - -\endverbatim - -If your files are too old, you can use the simgrid_update_xml.pl -script which can be found in the tools directory of the archive. - -\subsection faq_trouble_valgrind Valgrind-related and other debugger issues - -If you don't, you really should use valgrind to debug your code, it's -almost magic. - -\subsubsection faq_trouble_vg_longjmp longjmp madness in valgrind - -This is when valgrind starts complaining about longjmp things, just like: - -\verbatim ==21434== Conditional jump or move depends on uninitialised value(s) -==21434== at 0x420DBE5: longjmp (longjmp.c:33) -==21434== -==21434== Use of uninitialised value of size 4 -==21434== at 0x420DC3A: __longjmp (__longjmp.S:48) -\endverbatim - -This is the sign that you didn't used the exception mecanism well. Most -probably, you have a return; somewhere within a TRY{} -block. This is evil, and you must not do this. Did you read the section -about \ref XBT_ex?? - -\subsubsection faq_trouble_vg_libc Valgrind spits tons of errors about backtraces! - -It may happen that valgrind, the memory debugger beloved by any decent C -programmer, spits tons of warnings like the following : -\verbatim ==8414== Conditional jump or move depends on uninitialised value(s) -==8414== at 0x400882D: (within /lib/ld-2.3.6.so) -==8414== by 0x414EDE9: (within /lib/tls/i686/cmov/libc-2.3.6.so) -==8414== by 0x400B105: (within /lib/ld-2.3.6.so) -==8414== by 0x414F937: _dl_open (in /lib/tls/i686/cmov/libc-2.3.6.so) -==8414== by 0x4150F4C: (within /lib/tls/i686/cmov/libc-2.3.6.so) -==8414== by 0x400B105: (within /lib/ld-2.3.6.so) -==8414== by 0x415102D: __libc_dlopen_mode (in /lib/tls/i686/cmov/libc-2.3.6.so) -==8414== by 0x412D6B9: backtrace (in /lib/tls/i686/cmov/libc-2.3.6.so) -==8414== by 0x8076446: xbt_dictelm_get_ext (dict_elm.c:714) -==8414== by 0x80764C1: xbt_dictelm_get (dict_elm.c:732) -==8414== by 0x8079010: xbt_cfg_register (config.c:208) -==8414== by 0x806821B: MSG_config (msg_config.c:42) -\endverbatim - -This problem is somewhere in the libc when using the backtraces and there is -very few things we can do ourselves to fix it. Instead, here is how to tell -valgrind to ignore the error. Add the following to your ~/.valgrind.supp (or -create this file on need). Make sure to change the obj line according to -your personnal mileage (change 2.3.6 to the actual version you are using, -which you can retrieve with a simple "ls /lib/ld*.so"). - -\verbatim { - name: Backtrace madness - Memcheck:Cond - obj:/lib/ld-2.3.6.so - fun:dl_open_worker - fun:_dl_open - fun:do_dlopen - fun:dlerror_run - fun:__libc_dlopen_mode -}\endverbatim - -Then, you have to specify valgrind to use this suppression file by passing -the --suppressions=$HOME/.valgrind.supp option on the command line. -You can also add the following to your ~/.bashrc so that it gets passed -automatically. Actually, it passes a bit more options to valgrind, and this -happen to be my personnal settings. Check the valgrind documentation for -more information. - -\verbatim export VALGRIND_OPTS="--leak-check=yes --leak-resolution=high --num-callers=40 --tool=memcheck --suppressions=$HOME/.valgrind.supp" \endverbatim - -\subsubsection faq_trouble_backtraces Truncated backtraces - -When debugging SimGrid, it's easier to pass the ---disable-compiler-optimization flag to the configure if valgrind or -gdb get fooled by the optimization done by the compiler. But you -should remove these flag when everything works before going in -production (before launching your 1252135 experiments), or everything -will run only one half of the true SimGrid potential. - -\subsection faq_deadlock There is a deadlock in my code!!! - -Unfortunately, we cannot debug every code written in SimGrid. We -furthermore believe that the framework provides ways enough -information to debug such informations yourself. If the textual output -is not enough, Make sure to check the \ref faq_visualization FAQ entry to see -how to get a graphical one. - -Now, if you come up with a really simple example that deadlocks and -you're absolutely convinced that it should not, you can ask on the -list. Just be aware that you'll be severely punished if the mistake is -on your side... We have plenty of FAQ entries to redact and new -features to implement for the impenitents! ;) - -\subsection faq_surf_network_latency I get weird timings when I play with the latencies. - -OK, first of all, remember that units should be Bytes, Flops and -Seconds. If you don't use such units, some SimGrid constants (e.g. the -SG_TCP_CTE_GAMMA constant used in most network models) won't have the -right unit and you'll end up with weird results. - -Here is what happens with a single transfer of size L on a link -(bw,lat) when nothing else happens. - -\verbatim -0-----lat--------------------------------------------------t -|-----|**** real_bw =min(bw,SG_TCP_CTE_GAMMA/(2*lat)) *****| -\endverbatim - -In more complex situations, this min is the solution of a complex -max-min linear system. Have a look -here -and read the two threads "Bug in SURF?" and "Surf bug not -fixed?". You'll have a few other examples of such computations. You -can also read "A Network Model for Simulation of Grid Application" by -Henri Casanova and Loris Marchal to have all the details. The fact -that the real_bw is smaller than bw is easy to understand. The fact -that real_bw is smaller than SG_TCP_CTE_GAMMA/(2*lat) is due to the -window-based congestion mechanism of TCP. With TCP, you can't exploit -your huge network capacity if you don't have a good round-trip-time -because of the acks... - -Anyway, what you get is t=lat + L/min(bw,SG_TCP_CTE_GAMMA/(2*lat)). - - * if I you set (bw,lat)=(100 000 000, 0.00001), you get t = 1.00001 (you fully -use your link) - * if I you set (bw,lat)=(100 000 000, 0.0001), you get t = 1.0001 (you're on the -limit) - * if I you set (bw,lat)=(100 000 000, 0.001), you get t = 10.001 (ouch!) - -This bound on the effective bandwidth of a flow is not the only thing -that may make your result be unexpected. For example, two flows -competing on a saturated link receive an amount of bandwidth inversely -proportional to their round trip time. - -\subsection faq_bugrepport So I've found a bug in SimGrid. How to report it? - -We do our best to make sure to hammer away any bugs of SimGrid, but this is -still an academic project so please be patient if/when you find bugs in it. -If you do, the best solution is to drop an email either on the simgrid-user -or the simgrid-devel mailing list and explain us about the issue. You can -also decide to open a formal bug report using the -relevant -interface. You need to login on the server to get the ability to submit -bugs. - -We will do our best to solve any problem repported, but you need to help us -finding the issue. Just telling "it segfault" isn't enough. Telling "It -segfaults when running the attached simulator" doesn't really help either. -You may find the following article interesting to see how to repport -informative bug repports: -http://www.chiark.greenend.org.uk/~sgtatham/bugs.html (it is not SimGrid -specific at all, but it's full of good advices). - -\author Arnaud Legrand (arnaud.legrand::imag.fr) -\author Martin Quinson (martin.quinson::loria.fr) - - -*/ - -****************************************************************** -* OLD CRUFT NOT USED ANYMORE * -****************************************************************** - - -\subsection faq_crosscompile Cross-compiling a Windows DLL of SimGrid from linux - -At the moment, we do not distribute Windows pre-compiled version of SimGrid -because the support for this platform is still experimental. We know that -some parts of the GRAS environment do not work, and we think that the others -environments (MSG and SD) have good chances to work, but we didn't test -ourselves. This section explains how we generate the SimGrid DLL so that you -can build it for yourself. First of all, you need to have a version more -recent than 3.1 (ie, a SVN version as time of writting). - -In order to cross-compile the package to windows from linux, you need to -install mingw32 (minimalist gnu win32). On Debian, you can do so by -installing the packages mingw32 (compiler), mingw32-binutils (linker and -so), mingw32-runtime. - -You can use the VPATH support of configure to compile at the same time for -linux and windows without dupplicating the source nor cleaning the tree -between each. Just run bootstrap (if you use the SVN) to run the autotools. -Then, create a linux and a win directories. Then, type: -\verbatim cd linux; ../configure --srcdir=.. ; make; cd .. -cd win; ../configure --srcdir=.. --host=i586-mingw32msvc ; make; cd .. -\endverbatim -The trick to VPATH builds is to call configure from another directory, -passing it an extra --srcdir argument to tell it where all the sources are. -It will understand you want to use VPATH. Then, the trick to cross-compile -is simply to add a --host argument specifying the target you want to build -for. The i586-mingw32msvc string is what you have to pass to use the mingw32 -environment as distributed in Debian. - -After that, you can run all make targets from both directories, and test -easily that what you change for one arch does not break the other one. - -It is possible that this VPATH build thing breaks from time to time in the -SVN since it's quite fragile, but it's granted to work in any released -version. If you experience problems, drop us a mail. - -Another possible source of issue is that at the moment, building the -examples request to use the gras_stub_generator tool, which is a compiled -program, not a script. In cross-compilation, you need to cross-execute with -wine for example, which is not really pleasant. We are working on this, but -in the meanwhile, simply don't build the examples in cross-compilation -(cd src before running make). - -Program (cross-)compiled with mingw32 do request an extra DLL at run-time to be -usable. For example, if you want to test your build with wine, you should do -the following to put this library where wine looks for DLLs. -\verbatim -cp /usr/share/doc/mingw32-runtime/mingwm10.dll.gz ~/.wine/c/windows/system/ -gunzip ~/.wine/c/windows/system/mingwm10.dll.gz -\endverbatim - -The DLL is built in src/.libs, and installed in the prefix/bin directory -when you run make install. - -If you want to use it in a native project on windows, you need to use -simgrid.dll and mingwm10.dll. For each DLL, you need to build .def file -under linux (listing the defined symbols), and convert it into a .lib file -under windows (specifying this in a way that windows compilers like). To -generate the def files, run (under linux): -\verbatim echo "LIBRARY libsimgrid-0.dll" > simgrid.def -echo EXPORTS >> simgrid.def -nm libsimgrid-0.dll | grep ' T _' | sed 's/.* T _//' >> simgrid.def -nm libsimgrid-0.dll | grep ' D _' | sed 's/.* D _//' | sed 's/$/ DATA/' >> simgrid.def - -echo "LIBRARY mingwm10.dll" > mingwm10.def -echo EXPORTS >> mingwm10.def -nm mingwm10.dll | grep ' T _' | sed 's/.* T _//' >> mingwm10.def -nm mingwm10.dll | grep ' D _' | sed 's/.* D _//' | sed 's/$/ DATA/' >> mingwm10.def -\endverbatim - -To create the import .lib files, use the lib windows tool (from -MSVC) the following way to produce simgrid.lib and mingwm10.lib -\verbatim lib /def:simgrid.def -lib /def:mingwm10.def -\endverbatim - -If you happen to use Borland C Builder, the right command line is the -following (note that you don't need any file.def to get this working). -\verbatim implib simgrid.lib libsimgrid-0.dll -implib mingwm10.lib mingwm10.dll -\endverbatim - -Then, set the following parameters in Visual C++ 2005: -Linker -> Input -> Additional dependencies = simgrid.lib mingwm10.lib - -Just in case you wonder how to generate a DLL from libtool in another -project, we added -no-undefined to any lib*_la_LDFLAGS variables so that -libtool accepts to generate a dynamic library under windows. Then, to make -it true, we pass any dependencies (such as -lws2 under windows or -lpthread -on need) on the linking line. Passing such deps is a good idea anyway so -that they get noted in the library itself, avoiding the users to know about -our dependencies and put them manually on their compilation line. Then we -added the AC_LIBTOOL_WIN32_DLL macro just before AC_PROG_LIBTOOL in the -configure.ac. It means that we exported any symbols which need to be. -Nowadays, functions get automatically exported, so we don't need to load our -header files with tons of __declspec(dllexport) cruft. We only need to do so -for data, but there is no public data in SimGrid so we are good. - - diff --git a/doc/HelloWorld/CMakeLists.txt b/doc/HelloWorld/CMakeLists.txt new file mode 100644 index 0000000000..52afb5bbd9 --- /dev/null +++ b/doc/HelloWorld/CMakeLists.txt @@ -0,0 +1,46 @@ +### This is a template for building targets with simgrid +cmake_minimum_required(VERSION 2.8) + +### Need to set rc ccompiler before enable language +if(WIN32) + SET(CMAKE_RC_COMPILER "windres") +endif(WIN32) + +project(MY_SIMGRID_PROJECT C) + +set(CMAKE_C_FLAGS "" CACHE TYPE INTERNAL FORCE) +set(CMAKE_EXE_LINKER_FLAGS "" CACHE TYPE INTERNAL FORCE) + +############################### +# Test the build dependencies # +############################### +include(FindPCRE.cmake) +message(STATUS "Looking for lib Simgrid") +if("$ENV{SIMGRID_ROOT}" STREQUAL "") + message(STATUS "Looking for lib Simgrid - Not found") + message(FATAL_ERROR "Simgrid not found, reinstall it or set SIMGRID_ROOT") +else("$ENV{SIMGRID_ROOT}" STREQUAL "") + link_directories($ENV{SIMGRID_ROOT}/lib) + include_directories($ENV{SIMGRID_ROOT}/include) + include_directories($ENV{SIMGRID_ROOT}/src) + include_directories($ENV{SIMGRID_ROOT}/src/include) + add_library(libsimgrid STATIC IMPORTED) + message(STATUS "Looking for lib Simgrid - found") +endif("$ENV{SIMGRID_ROOT}" STREQUAL "") + +################ +# FIND TARGETS # +################ +file(GLOB SOURCE_FILE +RELATIVE ${CMAKE_HOME_DIRECTORY}/ +"*.c" +) +string(REPLACE ".c" "" TARGET_NAME ${SOURCE_FILE}) + +foreach(target "${TARGET_NAME}") + add_executable(${target} "${target}.c") + message(STATUS "source_file: ${target}.c") + message(STATUS "target name: ${target}.exe") + # Any targets need to be linked with simgrid and pcre + target_link_libraries(${target} simgrid pcre) +endforeach(target ${SOURCE_FILE}) diff --git a/doc/HelloWorld/FindPCRE.cmake b/doc/HelloWorld/FindPCRE.cmake new file mode 100644 index 0000000000..858e0e2dbe --- /dev/null +++ b/doc/HelloWorld/FindPCRE.cmake @@ -0,0 +1,99 @@ +### SET THE LIBRARY EXTENSION AND GCC VERSION +if(APPLE) #MAC + set(LIB_EXE "dylib") +else(APPLE) + if(WIN32) #WINDOWS + set(LIB_EXE "a") + set(BIN_EXE ".exe") + else(WIN32) #UNIX + set(LIB_EXE "so") + endif(WIN32) +endif(APPLE) + +find_library(PATH_PCRE_LIB + NAMES pcre + HINTS + $ENV{SIMGRID_PCRE_LIBRARY_PATH} + $ENV{LD_LIBRARY_PATH} + $ENV{PCRE_LIBRARY_PATH} + PATH_SUFFIXES lib/ GnuWin32/lib + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr) + +string(REGEX MATCH ".dll.a" operation "${PATH_PCRE_LIB}") + +if(NOT operation) + if(WIN32) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-DPCRE_STATIC ") + endif(WIN32) +endif(NOT operation) + +find_path(PATH_PCRE_H "pcre.h" + HINTS + $ENV{SIMGRID_PCRE_LIBRARY_PATH} + $ENV{LD_LIBRARY_PATH} + $ENV{PCRE_LIBRARY_PATH} + PATH_SUFFIXES include/ GnuWin32/include + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr) + +message(STATUS "Looking for pcre.h") +if(PATH_PCRE_H) +message(STATUS "Looking for pcre.h - found") +else(PATH_PCRE_H) +message(STATUS "Looking for pcre.h - not found") +endif(PATH_PCRE_H) + +message(STATUS "Looking for lib pcre") +if(PATH_PCRE_LIB) +message(STATUS "Looking for lib pcre - found") +else(PATH_PCRE_LIB) +message(STATUS "Looking for lib pcre - not found") +endif(PATH_PCRE_LIB) + +if(WIN32) + find_path(PATH_PCRE_LICENCE "LICENCE" + HINTS + $ENV{SIMGRID_PCRE_LIBRARY_PATH} + $ENV{LD_LIBRARY_PATH} + $ENV{PCRE_LIBRARY_PATH} + PATH_SUFFIXES GnuWin32 + PATHS + /opt + /opt/local + /opt/csw + /sw + /usr) + message(STATUS "Looking for pcre licence") + if(PATH_PCRE_LICENCE) + message(STATUS "Looking for pcre licence - found") + else(PATH_PCRE_LICENCE) + message(STATUS "Looking for pcre licence - not found") + endif(PATH_PCRE_LICENCE) +endif(WIN32) + +if(PATH_PCRE_LIB AND PATH_PCRE_H) + string(REGEX REPLACE "/libpcre.*[.]${LIB_EXE}$" "" PATHLIBPCRE "${PATH_PCRE_LIB}") + string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") + string(REGEX MATCH "-L${PATHLIBPCRE} " operation "${CMAKE_C_FLAGS}") + if(NOT operation) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${PATHLIBPCRE} ") + endif(NOT operation) + string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") + if(NOT operation) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") + endif(NOT operation) +else(PATH_PCRE_LIB) + message(FATAL_ERROR "Please install the libpcre3-dev package or equivalent before using SimGrid.") +endif(PATH_PCRE_LIB AND PATH_PCRE_H) + +mark_as_advanced(PATH_PCRE_H) +mark_as_advanced(PATH_PCRE_LIB) \ No newline at end of file diff --git a/doc/HelloWorld/HelloWorld.c b/doc/HelloWorld/HelloWorld.c new file mode 100644 index 0000000000..796b67a95e --- /dev/null +++ b/doc/HelloWorld/HelloWorld.c @@ -0,0 +1,7 @@ +#include "xbt/log.h" +XBT_LOG_NEW_DEFAULT_CATEGORY(HelloWorld, + "Messages specific for this Hello World example"); +void main() +{ + XBT_INFO("Hello World !!!"); +} diff --git a/doc/HelloWorld/README b/doc/HelloWorld/README new file mode 100644 index 0000000000..4a6a71c317 --- /dev/null +++ b/doc/HelloWorld/README @@ -0,0 +1,35 @@ +This is a very simple example to explain how to compile with simgrid. + +1) How to compile an example: (HelloWorld) + +- Run "Git bash" (installed with git) or windows shell "cmd". +- Open HelloWorld Directory ('cd' command line). +- Create a build directory and change directory. (optional) +- Type 'cmake -G"Unix Makefiles" ' +- Run gmake +- You should obtain a runnable example ("HelloWorld.exe"). + +2) Content of this directory + +- HelloWorld.c + The example source file. +- CMakeLists.txt + It allows to configure the project. +- FindPCRE.cmake + Simgrid needs pcre regular expression. + This finds and links to the pcre library (Normally included into Simgrid directory "GnuWin32"). +- README + This explaination. + +3) How to add and compile a new example + +- Put your source file into the helloWord directory. +- Edit CMakeLists.txt : + * In the Targets section add those two lines: + add_executable(TARGET_NAME SOURCES) + target_link_libraries(TARGET_NAME simgrid pcre) + * It creates a target called 'TARGET_NAME.exe' with the sources 'SOURCES'. +- To initialize your project, you'll need to run 'cmake -G"Unix Makefiles" .' +- To build you project, run "cmake ." +- Run "gmake" +- You should obtain "TARGET_NAME.exe". \ No newline at end of file diff --git a/doc/all.bib b/doc/all.bib deleted file mode 100644 index e8a2e488a1..0000000000 --- a/doc/all.bib +++ /dev/null @@ -1,1151 +0,0 @@ -@InProceedings{ cb11:pdp2011, - author = "Bogdan Florin Cornea and Julien Bourgeois", - title = "Performance Prediction of Distributed Applications Using Block Benchmarking Methods", - booktitle = "PDP '11: 19th International Euromicro Conference on Parallel, Distributed and Network-Based Processing", - abstract = "An ongoing work is presented for accurately predicting the performance of distributed applications in heterogeneous systems. We are developing dPerf, a tool built using the Rose framework for performing static analysis and an automatic instrumentation on the input source code of programs written in C, C++ or Fortran. The accuracy in predicting program computation time resides in using hardware counters, as well as in applying two block benchmarking techniques that we propose in this paper. The current work makes use of a network simulator in order to calculate the communication time used in our approach. Afterwards, the computation and communication times are being summed up obtaining an estimation of the distributed application execution time. The approach is proven experimentally using NAS Integer Sort benchmark, the communications being simulated with SimGrid.", - year = 2011, - keywords = "dPerf, performance prediction, block benchmarking, static analysis, trace-based simulation, heterogeneous systems, MPI, P2PSAP", - publisher = "IEEE Computer Society", - category = {extern} -} - -@article{cds10_jpdc, - title = {{On Cluster Resource Allocation for Multiple Parallel Task - Graphs}}, - author = {Casanova, Henri and Desprez, Fr\'ed\'eric and - Suter, Fr{\'e}d{\'e}ric}, - JOURNAL={Journal of Parallel and Distributed Computing}, - VOLUME=70, - NUMBER=12, - PAGES={1193--1203}, - MONTH = Dec, - YEAR=2010, - category = {intra} -} - -@InProceedings{c7, - Address = {Perth, Australia}, - Author = {Caniou, Yves and Charrier, Ghislain and Desprez, Fr\'ed\'eric}, - Booktitle = {Proceedings of the 9th Australasian Symposium on Parallel and Distributed - Computing (AusPDC 2011)}, - Editor = {ACM}, - Month = {January 17-20}, - Note = {To appear}, - Pages = {10}, - Title = {{Evaluation of Reallocation Heuristics for Moldable Tasks - in Computational Grids}}, - Year = {2011}, - category = {extern} -} - -@inproceedings{c6, - Address = {Heraklion, Crete, Greece}, - Author = {Caniou, Yves and Charrier, Ghislain and Desprez Fr\'ed\'eric}, - Booktitle = {Proceedings of the IEEE International Conference on - Cluster Computing (Cluster 2010)}, - Month = Sep, - Pages = {284--291}, - Title = {{Analysis of Tasks Reallocation in a Dedicated Grid Environment}}, - Year = 2010, - category = {extern} - } - - - -@InProceedings{jedule, - author = {Hunold, Sascha and Hoffmann, Ralf and Suter, Fr\'ed\'eric}, - title = {{Jedule: A Tool for Visualizing Schedules of - Parallel Applications}}, - booktitle = {Proceedings of the 1st International Workshop on - Parallel Software Tools and Tool Infrastructures - (PSTI'10)}, - year = 2010, - address = {San Diego, CA}, - pages = {169-178}, - month = Sep, - category = {core} -} - -@InProceedings{MAGS, - author = {Casanova, Henri and Desprez, Fr\'ed\'eric and Suter, Fr\'ed\'eric}, - title = {{Minimizing Stretch and Makespan of Multiple - Parallel Task Graphs via Malleable Allocations}}, - booktitle = {Proceedings of the 39th International Conference on - Parallel Processing (ICPP'10)}, - year = 2010, - address = {San Diego, CA}, - pages = {71-80}, - month = Sep, - category = {core} -} - - - -@INPROCEEDINGS{Boutamine06, -AUTHOR = "Boutammine, Salah-Salim and Millot, Daniel and Parrot, Christian", -TITLE = {"A Runtime Scheduling Method for Dynamic and Heterogeneous - Platforms"}, -BOOKTITLE = "Proceedings of 5th Workshop on Compile and Runtime - Techniques for Parallel Computing", -ADDRESS = "Colombus, OH", -YEAR = 2006, -month = Aug, -pages = {273-282}, -category = {extern} -} - -@INPROCEEDINGS{Boutamine06*2, -AUTHOR = "Boutammine, Salah-Salim and Millot, Daniel and Parrot, - Christian", -TITLE = {"An adaptative Scheduling Method for Grid Computing"}, -BOOKTITLE = "Proceedings of the 12th International Euro-Par -Conference (Euro-Par 2006)", -ADDRESS = "Dresden, Germany", -YEAR = 2006, -publisher = {Springer}, -series = {Lecture Notes in Computer Science}, -volume = {4128}, -pages = {188-197}, -month = Aug, -category = {extern} -} - -@INPROCEEDINGS{Boutamine06*3, -AUTHOR = "Boutammine, Salah-Salim and Millot, Daniel and Parrot, - Christian", -TITLE = {"Dynamically Scheduling Divisible Load for Grid -Computing"}, -BOOKTITLE = "Proceedings of the 2nd International Conference High -Performance Computing and Communications (HPCC 2006)", -ADDRESS = "Munich, Germany", -YEAR = 2006, -pages = {763-772}, -month = Sep, -publisher = {Springer}, -series = {Lecture Notes in Computer Science}, -volume = 4208, -category = {extern} -} - -@INPROCEEDINGS{Millot08, -AUTHOR = "Millot, Daniel and Parrot, Christian", -TITLE = {"Contention-Free Scheduling in a Dynamic Context"}, -BOOKTITLE = "Proceedings of the 14th International Conference on -Parallel and Distributed Systems (ICPADS'08)", -ADDRESS = "IEEE Computing Society Press ", -YEAR = "2008", -month = Dec, -pages = {19-28}, -category = {extern} -} - -@InProceedings{ns-cram, - author = {N'takp{\'e}, Tchimou and Suter, Fr{\'e}d{\'}eric}, - title = {{Concurrent Scheduling of Parallel Task Graphs on - Multi-Clusters Using Constrained Resource - Allocations}}, - booktitle = {Proceedings of the 10th IEEE International Workshop on - Parallel and Distributed Scientific and Engineering - Computing (PDSEC)}, - year = 2009, - address = {Rome, Italy}, - month = May, - category = {intra} -} - -@InProceedings{RATS, - author = {Hunold, Sascha and Rauber, Thomas and Suter, - Fr{\'e}d{\'}eric}, - title = {{Redistribution Aware Two Step Scheduling for Mixed - Parallel Applications}}, - booktitle = {Proceedings of the IEEE International Conference on - Cluster Computing (Cluster'08)}, - year = 2008, - pages = {50-58}, - address = {Tsukuba, Japan}, - month = Sep, - category = {extern} -} - -@InProceedings {DCLV_LSAP_10, - title = {{Fast and Scalable Simulation of Volunteer Computing Systems - Using SimGrid}}, - booktitle = {Proceedings of the Workshop on Large-Scale System and Application - Performance (LSAP)}, - year = {2010}, - month = Jun, - address = {Chicago, IL}, - author = {Donassolo, Bruno and Casanova, Henri and Legrand, Arnaud - and Velho, Pedro}, - category = {core} -} - - -@InProceedings{biCPA, - author = {Desprez, Fr{\'e}d{\'e}ric and Suter, Fr{\'e}d{\'e}ric}, - title = {{A Bi-Criteria Algorithm for Scheduling - Parallel Task Graphs on Clusters}}, - booktitle = {Proceedings of the 10th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGrid 2010)}, - year = 2010, - address = {Melbourne, Australia}, - month = {May}, - pages = {243-252}, - category = {intra} -} - -@InProceedings{Hunold_ccgrid10, - author = {Hunold}, - title = {{Low-Cost Tuning of Two-Step Algorithms for - Scheduling Mixed-Parallel Applications onto - Homogeneous Clusters}}, - booktitle = {Proceedings of the 10th IEEE/ACM International - Symposium on Cluster, Cloud and Grid Computing - (CCGrid 2010)}, - year = 2010, - address = {Melbourne, Australia}, - month = {May}, - pages = {253-262}, - category = {extern} -} - - - -@inproceedings{c5, - Address = {Sliema, Malta}, - Author = {Caniou, Yves and Caron, Eddy and Charrier, Ghislain and - Desprez, Fr{\'e}d{\'e}ric}, - Booktitle = {Proceedings of the 3rd International Conference on - Advanced Engineering Computing and Applications in Sciences - (ADVCOMP'09)}, - Month = Oct, - Pages = {181-186}, - Title = {{Meta-Scheduling and Task Reallocation in a Grid Environment}}, - Year = {2009}, -category = {extern} -} - -@InProceedings{beaumont2010ipdps2010_1, - title={{On the Importance of Bandwidth Control Mechanisms for - Scheduling on Large Scale Heterogeneous Platforms}}, - author={Beaumont, Olivier and Rejeb, Hejer}, - booktitle={Proceedings of the 24th IEEE International Parallel and - Distributed Processing Symposium (IPDPS'10)}, - year={2010}, - month = Apr, - address = {Atlanta, GO}, - category = {extern} -} - - -@InProceedings{beaumont2010ipdps2010_2, - title={{Broadcasting on Large Scale Heterogeneous Platforms under - the Bounded Multi-Port Model}}, - author={Beaumont, Olivier and Eyraud-Dubois, Lionel and Kumar - Agrawal, Shailesh}, - booktitle={Proceedings of the 24th IEEE International Parallel and - Distributed Processing Symposium (IPDPS'10)}, - year={2010}, - month = Apr, - address = {Atlanta, GO}, - category = {extern} -} - - -@InProceedings{beaumont2010line, - title={{On-line Allocation of Clients to Multiple Servers on Large - Scale Heterogeneous Systems}}, - author={Beaumont, Olivier and Eyraud-Dubois, Lionel and Rejeb, Hejer - and Thraves, Christopher}, - booktitle={Proceedings of the 18th Euromicro International - Conference on Parallel, Distributed and - Network-Based Computing (PDP 2010)}, - year={2010}, - address = {Pisa, Italy}, - month = Feb, - pages = {3-10}, - category = {extern} -} - -@InProceedings{beaumont2009allocation, - title={{Allocation of Clients to Multiple Servers on Large Scale - Heterogeneous Platforms}}, - author={Beaumont, Olivier and Eyraud-Dubois, Lionel and Rejeb, Hejer - and Thraves, Christopher}, - booktitle={Proceedings of the 15th International Conference on Parallel and - Distributed Systems (ICPADS 2009)}, - pages={142--149}, - address = {Shenzhen, China}, - month = Dec, - year=2009, - category = {extern} -} - - - -@inproceedings{Banino-RokkonesBR08, - author = {Banino-Rokkones, Cyril and Beaumont, Olivier and Rejeb, - Hejer}, - title = {{Scheduling Techniques for Effective System - Reconfiguration in Distributed Storage Systems}}, - booktitle = {Proceedings of the 14th International Conference on - Parallel and Distributed Systems (ICPADS 2008)}, - year = 2008, - address = {Melbourne, Australia}, - month = Dec, - pages = {80-87}, - category = {extern} -} - - - -@ARTICLE{TPDS09, - TITLE={{Scheduling Parallel Task Graphs on (Almost) Homogeneous - Multi-cluster Platforms}}, - AUTHOR={Dutot, Pierre-Fran{\c c}ois and N'takp\'e, Tchimou and - Suter, Fr\'ed\'eric and Casanova, Henri}, - JOURNAL={IEEE Transactions on Parallel and Distributed Systems}, - VOLUME=20, - NUMBER=7, - PAGES={940--952}, - YEAR=2009, - category = {intra} -} - -@article{10.1109/TC.2009.117, -author = {Benoit, Anne and Marchal, Loris and Pineau, - Jean-Fran{\c c}ois and Robert, Yves and Vivien - Fr\'ed\'eric}, -title = {{Scheduling Concurrent Bag-of-Tasks Applications on -Heterogeneous Platforms}}, -journal ={IEEE Transactions on Computers}, -volume = {59}, -issn = {0018-9340}, -year = {2010}, -pages = {202-217}, -doi = {http://doi.ieeecomputersociety.org/10.1109/TC.2009.117}, -publisher = {IEEE Computer Society}, -address = {Los Alamitos, CA, USA}, -category = {extern} -} - -@inproceedings{1476013, - author = {Righi, Rodrigo da Rosa and Pilla, La\'{e}rcio Lima and - Carissimi, Alexandre and Navaux, Philippe O. A.}, - title = {{Controlling Processes Reassignment in BSP Applications}}, - booktitle = {Proceedings of the 20th International Symposium on Computer Architecture and High Performance Computing (SBAC-PAD'08)}, - year = {2008}, - pages = {37-44}, - address = {Campo Grande,Brazil}, - month = Oct, - category = {extern} -} - -@inproceedings{1582179, - author = {Righi, Rodrigo da Rosa and Pilla, La\'{e}rcio Lima and - Carissimi, Alexandre and Navaux, Philippe and Heiss, - Hans-Ulrich}, - title = {{MigBSP: A Novel Migration Model for Bulk-Synchronous - Parallel Processes Rescheduling}}, - booktitle = {Proceedings of the 11th IEEE International Conference on High Performance Computing and Communications (HPCC'09)}, - year = {2009}, - pages = {585-590}, - address = {Seoul, Korea}, - month = Jun, - category = {extern} -} - -@inproceedings{1560782, - author = {Rosa Righi, Rodrigo and Pilla, La\'{e}rcio Lima and - Carissimi, Alexandre Silva and Navaux, Philippe - O. and Heiss, Hans-Ulrich}, - title = {{Applying Processes Rescheduling over Irregular BSP - Application}}, - booktitle = {Proceedings of the 9th International Conference on - Computational Science (ICCS'09)}, - year = {2009}, - pages = {213--223}, - address = {Baton Rouge, LA}, - publisher = {Springer}, - series = {Lecture Notes in Computer Science}, - volume = {5544}, - category = {extern} -} - -@InProceedings{Guermouche_Renard_10, - author = {Guermouche, Abdou and Renard, H\'el\`ene}, - booktitle = {Proceedings of the 19th International Heterogeneity in - Computing Workshop (HCW'09)}, - title = {{A First Step to the Evaluation of SimGrid in the Context of - a Complex Application}}, - year = {2010}, - address = {Atlanta, GO}, - month = Apr, - category = {extern} -} - -@InProceedings{VL_Simutools_09, - title = {{Accuracy Study and Improvement of Network Simulation in - the SimGrid Framework}}, - booktitle = {Proceedings of the 2nd International Conference on - Simulation Tools and Techniques (SIMUTools'09)}, - year = {2009}, - author = {Velho, Pedro and Legrand, Arnaud}, - address = {Rome, Italy}, - month = Mar, - pdf = {http://mescal.imag.fr/membres/arnaud.legrand/articles/simutools09.pdf}, - category = {core} -} - -@InProceedings{simgrid, - author = {Casanova, Henri and Legrand, Arnaud and Quinson, Martin}, - title = {{SimGrid: a Generic Framework for Large-Scale Distributed Experiments}}, - booktitle = {proceedings of the 10th IEEE International Conference on Computer Modeling and Simulation (UKSim)}, - year = 2008, - month = Apr, - address = {Cambridge, UK}, - category = {core} -} - -@InProceedings{nstools07, - title = {{Speed and Accuracy of Network Simulation in the SimGrid Framework}}, - author = {Fujiwara, Kayo and Casanova, Henri }, - booktitle = {Proceedings of the First International Workshop on Network Simulation Tools (NSTools)}, - year = {2007}, - address = {Nantes, France}, - month = Oct, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/fujiwara_nstool2007.pdf}, - category = {core} -} - -@MastersThesis{msc_kayo, - author = {Fujiwara, Kayo}, - title = {{Cost and Accuracy of Packet-Level vs. Analytical - Network Simulations: An Empirical Study}}, - school = {Department of Information and Computer Sciences, - University of Hawai`i at Manoa}, - year = {2007}, - month = apr, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/theses/kayo_fujiwara_MS.pdf}, - category = {core} -} - -@InProceedings{gras-iasted06, - title = {{Gras: A Research & Development Framework for Grid and P2P Infrastructures}}, - author = {Quinson, Martin }, - booktitle = {Proceedings of the 18th IASTED International Conference - on Parallel and Distributed Computing and Systems - (PDCS'06)}, - year = {2006}, - address = {Dallas, TX}, - month = Nov, - pdf = {http://www.loria.fr/~quinson/articles/gras-iasted06.pdf}, - note = {Best paper}, - category = {core} -} - -@InProceedings{hpdc06, - title = {{The SimGrid Project - Simulation and Deployment of - Distributed Applications}}, - author = {Legrand, Arnaud and Quinson, Martin and Fujiwara, Kayo - and Casanova, Henri}, - booktitle = {Proceedings of the IEEE International Symposium on High - Performance Distributed Computing (HPDC-15)}, - year = {2006}, - month = may, - address = {Paris, France}, - pages = {385-386}, - note = {Poster}, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/simgrid_hpdc06.pdf}, - category = {core} -} - -@InProceedings{ccgrid03, - title = {{Scheduling Distributed Applications: the SimGrid - Simulation Framework}}, - author = {Legrand, Arnaud and Marchal, Loris and Casanova, Henri}, - booktitle = {Proceedings of the third IEEE International Symposium - on Cluster Computing and the Grid (CCGrid'03)}, - year = 2003, - address = {Tokyo, Japan}, - month = {May}, - pages = {138-145}, - pdf = {http://www-id.imag.fr/Laboratoire/Membres/Legrand_Arnaud/articles/simgrid2_CCgrid03.pdf}, - category = {core} -} - -@TechReport{RR2002-40, - author = {Casanova, Henri and Marchal, Loris }, - title = {{A Network Model for Simulation of Grid Application}}, - institution = {LIP, ENS Lyon, France}, - year = {2002}, - abstract = {In this work we investigate network models that can be - potentially employed in the simulation of scheduling algorithms for - distributed computing applications. We seek to develop a model of TCP - communication which is both high-level and realistic. Previous research - works show that accurate and global modeling of wide-area networks, such - as the Internet, faces a number of challenging issues. However, some - global models of fairness and bandwidth-sharing exist, and can be link - withthe behavior of TCP. Using both previous results and simulation (with - NS), we attempt to understand the macroscopic behavior of - TCP communications. We then propose a global model of the network for the - Grid platform. We perform partial validation of this model in - simulation. The model leads to an algorithm for computing - bandwidth-sharing. This algorithm can then be implemented as part of Grid - application simulations. We provide such an implementation for the - SimGrid simulation toolkit.}, - type = {Research Report}, - ps = {ftp://ftp.ens-lyon.fr/pub/LIP/Rapports/RR/RR2002/RR2002-40.ps.z}, - number = {2002-40}, - category = {core} -} - - -@TechReport{RR2002-28, - author = {Legrand, Arnaud and Lerouge, Julien }, - title = {MetaSimGrid : Towards Realistic Scheduling Simulation of Distributed Applications}, - institution = {LIP, ENS Lyon, France}, - year = {2002}, - abstract = {Most scheduling problems are already hard on homogeneous - platforms, they become quite intractable in an heterogeneous - framework such as a metacomputing grid. In the best cases, a - guaranteed heuristic can be found, but most of the time, it is - not possible. Real experiments or simulations are often - involved to test or to compare heuristics. However, on a - distributed heterogeneous platform, such experiments are - technically difficult to drive, because of the genuine - instability of the platform. It is almost impossible to - guarantee that a platform which is not dedicated to the - experiment, will remain exactly the same between two tests, - thereby forbidding any meaningful comparison. Simulations are - then used to replace real experiments, so as to ensure the - reproducibility of measured data. A key issue is the - possibility to run the simulations against a realistic - environment. The main idea of trace-based simulation is to - record the platform parameters today, and to simulate the - algorithms tomorrow, against the recorded data: even though it - is not the current load of the platform, it is realistic, - because it represents a fair summary of what happened - previously. A good example of a trace-based simulation tool is - SimGrid, a toolkit providing a set of core abstractions and - functionalities that can be used to easily build simulators for - specific application domains and/or computing environment - topologies. Nevertheless, SimGrid lacks a number of convenient - features to craft simulations of a distributed application - where scheduling decisions are not taken by a single - process. Furthermore, modeling a complex platform by hand is - fastidious for a few hosts and is almost impossible for a real - grid. This report is a survey on simulation for scheduling - evaluation purposes and present MetaSimGrid, a simulator built - on top of SimGrid.}, - type = {Research Report}, - ps = {ftp://ftp.ens-lyon.fr/pub/LIP/Rapports/RR/RR2002/RR2002-28.ps.gz}, - number = {2002-28}, - category = {core} -} - - - -@InProceedings{CCGRID.2001, -author = {Casanova, Henri}, -title = {{Simgrid: A Toolkit for the Simulation of Application Scheduling}}, -booktitle ={Proceedings of the First IEEE International Symposium on Cluster Computing and the Grid (CCGrid'01)}, -year = 2001, -pages = {430-441}, - abstract = {Advances in hardware and software technologies have made it - possible to deploy parallel applications over increasingly large - sets of distributed resources. Consequently, the study of - scheduling algorithms for such applications has been an active area - of research. Given the nature of most scheduling problems one must - resort to simulation to effectively evaluate and compare their - efficacy over a wide range of scenarios. It has thus become - necessary to simulate those algorithms for increasingly complex - distributed, dynamic, heterogeneous environments. In this paper we - present SimGrid, a simulation toolkit for the study of scheduling - algorithms for distributed application. This paper gives the main - concepts and models behind SimGrid, describes its API and - highlights current implementation issues. We also give some - experimental results and describe work that builds on SimGrid's - functionalities.}, -doi = {http://doi.ieeecomputersociety.org/10.1109/CCGRID.2001.923223}, -address = {Brisbane, Australia}, -month = May, - category = {core} -} - - -@inproceedings{CC09, - Address = {Toulouse, France}, - Author = {Charrier, Ghislain and Caniou, Yves}, - Booktitle = {Actes des 19\`emes Rencontres francophonnes du Parall{\'e}lisme (RenPar'19)}, - Month = Sep, - Title = {Ordonnancement et r{\'e}allocation de t{\^a}ches sur une grille de calcul}, - Year = {2009}, - category = {extern} -} - -@inproceedings{RenparLN09, - Address = {Toulouse, France}, - Author = {Renard, H\'el\`ene }, - Booktitle = {Actes des 19emes Rencontres francophonnes du - Parall{\'e}lisme (RenPar'19)}, - Month = Sep, - Title = {Comparaisons entre le simulateur SimGrid et une application - r{\'e}elle pour {\'e}valuer les algorithmes - d'{\'e}quilibre de charge et de redistribution de - donn{\'e}es}, - pdf = {http://www.irit.fr/Toulouse2009/Toulouse2009/papiers/paper10.pdf}, - Year = {2009}, - category = {extern} -} - -@inproceedings{1372508, - author = {Bouabache, Fatiha and Herault, Thomas and Fedak, Gilles and - Cappello, Franck}, - title = {{Hierarchical Replication Techniques to Ensure Checkpoint Storage Reliability in Grid Environment}}, - booktitle = {Proceedings of the Eighth IEEE International Symposium - on Cluster Computing and the Grid (CCGRID'08)}, - year = {2008}, - isbn = {978-0-7695-3156-4}, - pages = {475--483}, - doi = {http://dx.doi.org/10.1109/CCGRID.2008.95}, - address = {Lyon, France}, - month = May, - category = {extern} -} - -@InProceedings{gallet09, - title = {{Efficient Scheduling of Task Graph Collections on - Heterogeneous Resources}}, - author = {Gallet, Matthieu and Marchal, Loris and Vivien, - Fr{\'e}d{\'e}ric }, - booktitle = {Proceedings of the 23rd IEEE International Parallel and Distributed Processing Symposium (IPDPS'2009)}, - year = {2009}, - address = {Rome, Italy}, - month = may, - category = {extern} -} - -@InProceedings{Kurt09, - title = {{Improving The Scalability of SimGrid Using Dynamic Routing}}, - author = {De Munck, Silas and Vanmechelen, Kurt and Broeckhove, Jan}, - booktitle = {Proceedings of the 9th International Conference on - Computational Science (ICCS'09)}, - year = {2009}, - pages = {406-415}, - address = {Baton Rouge, LA}, - publisher = {Springer}, - series = {Lecture Notes in Computer Science}, - volume = {5544}, - category = {extern} -} - -@InProceedings{benoit08, - title = {{Offline and online scheduling of concurrent - bags-of-tasks on heterogeneous platforms}}, - author = {Benoit, Anne and Marchal, Loris and Pineau, - Jean-Fran{\,c}ois and Robert, Yves and Vivien, - Fr{\'e}d{\'e}ric}, - booktitle = {Proceedings of the 10th Workshop on Advances in - Parallel and Distributed Computational Models (APDCM - 2008)}, - year = {2008}, - month = May, - address = {Miami, FL}, - category = {extern} -} - -@InProceedings{Hernandez08, - title = {{Scheduling DAGs on Grids with Copying and Migration}}, - author = {Hernandez, Israel and Cole, Murray}, - booktitle = {Proceedings of the 7th International Conference on - Parallel Processing and Applied Mathematics 2007 - (PPAM07)}, - pages = {1019-1028}, - year = {2008}, - address = {Gdansk, Poland}, - month = Sep, - publisher = {Springer}, - series = {Lecture Notes in Computer Science}, - volume = {4967}, - category = {extern} -} - -@InProceedings{Kurt08, - title = {{Scalability of Grid Simulators : An Evaluation}}, - author = {Depoorter, wim and De Moor, Nils and Vanmechelen, Kurt - and Broeckhove, Jan}, - booktitle = {Proceedings of the 14th International Euro-Par - Conference (Euro-Par 2008)}, - pages = {544-553}, - year ={2008}, - publisher = {Springer}, - address = {Las Palmas de Gran Canaria, Spain}, - month = {Aug}, - series = {Lecture Notes in Computer Science}, - volume = {5168}, - category = {extern} -} - -@InProceedings{Hunold08, - title = {{Scheduling Dynamic Workflows onto Clusters of Clusters - using Postponing}}, - author = {Hunold, Sascha and Rauber, Thomas and Suter, - Fr{\'e}d{\'e}ric }, - booktitle = {Proceedings of the 3rd International Workshop on Workflow Systems in e-Science (WSES 08)}, - address= {Lyon, France}, - month = may, - year = {2008}, - pages = {669-674}, - category = {extern} -} - -@InProceedings{Heien08, - title = {{Computing Low Latency Batches with Unreliable Workers in Volunteer Computing Environments}}, - author = {Heien, Eric and Fujimoto, Noriyuki and Hagihara, Kenichi }, - booktitle = {Proceedings of the Workshop on Volunteer Computing and - Desktop Grids (PCGrid 2008)}, - year = {2008}, - month = May, - address = {Miami, FL}, - category = {extern} -} - -@InProceedings{Hernandez07, - title = {{Reliable DAG Scheduling with Rewinding and Migration}}, - author = {Hernandez, Israel and Cole, Murray}, - booktitle = {Proceedings of the First International Conference on - Networks for Grid Applications (GridNets07)}, - year = {2007}, - address = {Lyon, France}, - month = Oct, - url = {http://portal.acm.org/citation.cfm?id=1386610.1386614}, - category = {extern} -} - -@InProceedings{Hernandez07*2, - title = {Reactive Grid Scheduling of DAG Applications}, - author = {Hernandez, Israel and Cole, Murray}, - booktitle = {Proceedings of the IASTED International Conference on Parallel and Distributed Computing and Networks (PDCN'07)}, - year = 2007, - pages = {90-95}, - address = {Innsbruck, Austria}, - month = Feb, - url = {http://www.actapress.com/PaperInfo.aspx?PaperID=29625}, - category = {extern} -} - -@InProceedings{Hunold07, - title = {{Dynamic Scheduling of Multi-Processor Tasks on Clusters of Clusters}}, - author = {Hunold, Sascha and Rauber, Thomas and R\"unger, Gudula}, - booktitle = {Proceedings of the Sixth International Workshop on Algorithms, - Models and Tools for Parallel Computing on Heterogeneous Networks - (Heteropar'07)}, - address = {Austin, TX}, - month = sep, - pages = {507-514}, - year = {2007}, - category = {extern} -} - -@InProceedings{Suter07, - title = {{Scheduling Delta-Critical Tasks in Mixed-Parallel Applications on a National Grid}}, - author = {Suter, Fr{\'e}d{\'e}ric }, - booktitle = {Proceedings of the 8th IEEE/ACM International - Conference on Grid Computing (Grid 2007)}, - address = {Austin, TX}, - month = sep, - year = {2007}, - pages = {2-9}, - category = {extern} -} - -@Article{Berten07, - title = {Brokering strategies in computational grids using stochastic prediction models}, - author = {Vandy Berten and Bruno Gaujal}, - journal = {Parallel Computing}, - volume = 33, - number = {4-5}, - pages = {238-249}, - year = {2007}, - url = {http://dev.ulb.ac.be/sched/articles/PARCO.pdf}, - category = {extern} -} - -@InProceedings{Ferrandiz07, - title = {Managing Scheduling and Replication in the LHC Grid}, - author = {Thomas Ferrandiz and Vania Marangozova}, - booktitle = {CoreGrid Workshop on middleware}, - year = {2007}, - category = {extern} -} - -@TechReport{Gay06, - title = {Simbatch: an API for simulating and predicting the performance of parallel resources and batch systems.}, - author = {Jean-S{\'e}bastien Gay and Yves Caniou}, - type = {Research Report}, - number = {6040}, - institution = {INRIA}, - month = nov, - year = 2006, - url = {https://hal.inria.fr/inria-00115880}, - category = {extern} -} - -@InProceedings{GayRenpar06, - title = {Simbatch : une API pour la simulation et la pr{\'e}diction de performances de syst{\`e}mes batch}, - author = {Jean-S{\'e}bastien Gay and Yves Caniou}, - booktitle = {17{\`e}me Rencontres Francophones du Parall{\'e}lisme, des Architectures et des Syst{\`e}mes, RenPar'17}, - month = oct, - year = 2006, - category = {extern} -} - -@InProceedings{Vanderster06, - title = {Metascheduling Multiple Resource Types using the MMKP}, - author = {D. Vanderster and N. Dimopoulos and R. Sobie}, - booktitle = {7th IEEE/ACM International Conference on Grid Computing}, - address = {Barcelona}, - month = sep, - year = 2006, - category = {extern} -} - -@InProceedings{Banino06, - title = {Master-Slave Tasking on Asymmetric Networks}, - author = {Cyril Banino-Rokkones and Olivier Beaumont and Lasse Natvig}, - booktitle = {Proceedings of 12th International Euro-Par Conference, Euro-Par'06}, - month = aug, - year = 2006, - pages = {167-176}, - address = {Dresden, Germany}, - category = {extern} -} - -@InProceedings{Tchimou06, - title = {Critical Path and Area Based Scheduling of Parallel Task Graphs on Heterogeneous Platforms}, - author = {Tchimou N'Takp{\'e} and Fr{\'e}d{\'e}ric Suter}, - booktitle = {Proceedings of the Twelfth International Conference on Parallel and Distributed Systems (ICPADS)}, - address = {Minneapolis, MN}, - month = july, - year = 2006, - category = {extern} -} - -@InProceedings{Vanderster06*2, - title = {Sensitivity Analysis of Knapsack-based Task Scheduling on the Grid}, - author = {D.C. Vanderster and N.J. Dimopoulos}, - booktitle = {Proceedings of The 20th ACM International Conference on Supercomputing}, - address = {Cairns, Australia}, - month = jun, - year = 2006, - url = {http://portal.acm.org/citation.cfm?id=1183401.1183446&coll=GUIDE&dl=%23url.coll}, - category = {extern} -} - -@InProceedings{Senger06, - title = {Hierarchical Scheduling of Independent Tasks with Shared Files}, - author = {H. Senger and F. Silva and W. Nascimento}, - booktitle = {Proceedings of the Sixth IEEE International Symposium on Cluster Computing and the Grid Workshop (CCGRIDW'06)}, - address = {Singapore}, - month = may, - year = 2006, - url = {http://www.unisantos.br/mestrado/informatica/hermes/File/senger-HierarchicalScheduling-Workshop-TB120.pdf}, - category = {extern} -} - -@InProceedings{Vanderster06*3, - title = {Evaluation of Knapsack-based Scheduling using the NPACI JOBLOG}, - author = {D. Vanderster and N. Dimopoulos and R. Parra-Hernandez and R. Sobie}, - booktitle = {20th International Symposium on High-Performance Computing in an Advanced Collaborative Environment (HPCS'06)}, - address = {St. John's, Newfoundland, Canada}, - month = may, - year = 2006, - url = {http://doi.ieeecomputersociety.org/10.1109/HPCS.2006.23}, - category = {extern} -} - -@InProceedings{Ohsaki05, - title = {On Dynamic Resource Management Mechanism using Control Theoretic Approach for Wide-Area Grid Computing}, - author = {Hiroyuki Ohsaki and Soushi Watanabe and Makoto Imase}, - booktitle = {Proceedings of IEEE Conference on Control Applications (CCA 2005)}, - month = aug, - year = 2005, - url = {http://www.ispl.jp/~oosaki/papers/Ohsaki05_CCA.pdf}, - category = {extern} -} - -@InProceedings{Caron05, - title = {Evaluation of Meta-scheduler Architectures and Task Assignment Policies for high Throughput Computing}, - author = {Eddy Caron and Vincent Garonne and Andrei Tsaregorodtsev}, - booktitle = {Proceedings of 4th Internationnal Symposium on Parallel and Distributed Computing Job Scheduling Strategies for Parallel Processing (ISPDC'05)}, - month = jul, - year = 2005, - pdf = {http://www.ens-lyon.fr/LIP/Pub/Rapports/RR/RR2005/RR2005-27.pdf}, - category = {extern} -} - -@InProceedings{Renard05, - title = {Algorithmes de redistribution de donn{\'e}es pour anneaux de processeurs h{\'e}t{\'e}rog{\`e}nes}, - author = {H{\'e}l{\'e}ne Renard and Yves Robert and Fr{\'e}d{\'e}ric Vivien}, - booktitle = {16i{\`e}me Rencontres Francophones du Parall{\'e}lisme des Architectures et des Syst{\`e}mes}, - address = {Le Croisic, France}, - month = apr, - year = 2005, - ps = {http://www.polytech.unice.fr/~hrenard/recherche/Renpar16.ps}, - category = {extern} -} - -@InProceedings{Caron04, - title = {Deadline Scheduling with Priority for Client-Server Systems on the Grid}, - author = {Eddy Caron and P. K. Chouhan and Fr{\'e}d{\'e}ric Desprez}, - booktitle = {IEEE International Conference On Grid Computing. Super Computing 2004}, - month = oct, - year = 2004, - category = {extern} -} - -@InProceedings{Caniou04, - title = {Efficient Scheduling Heuristics for GridRPC Systems}, - author = {Yves Caniou and Emmanuel Jeannot}, - booktitle = {IEEE QoS and Dynamic System workshop (QDS) of International Conference on Parallel and Distributed Systems (ICPADS)}, - address = {New-Port Beach California, USA}, - pages = {621-630}, - month = jul, - year = 2004, - ps = {http://graal.ens-lyon.fr/~ycaniou/QDS04.ps}, - category = {extern} -} - -@InProceedings{Santos04, - title = {Exploiting Replication and Data Reuse to Efficiently Schedule Data-intensive Applications on Grids}, - author = {E. Santos-Neto and W. Cirne and F. Brasileiro and A. Lima}, - booktitle = {Proceedings of 10th Job Scheduling Strategies for Parallel Processing}, - month = jun, - year = 2004, - pdf = {http://www.lsd.ufcg.edu.br/~elizeu/articles/jsspp.v6.pdf}, - category = {extern} -} - -@InProceedings{Hernandez04, - title = {Resource Management and Knapsack Formulations on the Grid}, - author = {R. Parra-Hernandez and D. Vanderster and N. J. Dimopoulos}, - booktitle = {Fifth IEEE/ACM International Workshop on Grid Computing (GRID'04)}, - year = 2004, - url = {http://doi.ieeecomputersociety.org/10.1109/GRID.2004.54}, - category = {extern} -} - -@InProceedings{Ferreto04, - title = {Scheduling BoT Applications in Grids using a Slave Oriented Adaptive Algorithm.}, - author = {T. Ferreto and C. A. F. De Rose and C. Northfleet.}, - booktitle = {Second International Symposium on Parallel and Distributed Processing and Applications (ISPA)}, - year = {2004}, - address = {Hong Kong}, - category = {extern} -} - -@InProceedings{Renard04, - title = {Data redistribution algorithms for heterogeneous processor rings}, - author = {H{\'e}l{\'e}ne Renard and Yves Robert and Fr{\'e}d{\'e}ric Vivien}, - booktitle = {International Conference on High Performance Computing HiPC'2004}, - year = 2004, - pdf = {http://www.polytech.unice.fr/~hrenard/recherche/Hipc.pdf}, - category = {extern} -} - -@InProceedings{Yao03, - title = {Link-Contention-Aware Genetic Scheduling Using Task Duplication in Grid Environments}, - author = {Wensheng Yao and Xiao Xie and Jinyuan You}, - booktitle = {Grid and Cooperative Computing: Second International Workshop, GCC 2003}, - address = {Shanghai, China}, - month = dec, - year = 2003, - pdf = {http://www.chinagrid.edu.cn/chinagrid/download/GCC2003/pdf/266.pdf}, - category = {extern} -} - -@InProceedings{caniou03, - title = {New Dynamic Heuristics in the Client-Agent-Server Model}, - author = {Yves Caniou and Emmanuel Jeannot}, - booktitle = {IEEE 13th Heteregeneous Computing Workshop - HCW'03}, - address = {Nice, France}, - month = apr, - year = 2003, - ps = {http://graal.ens-lyon.fr/~ycaniou/HCW03.ps}, - category = {extern} -} - -@InProceedings{caron03, - title = {A Hierarchical Resource Reservation Algorithm for Network Enabled Servers}, - author = {Eddy Caron and Fr{\'e}d{\'e}ric Desprez and Franck Petit and V. Villain}, - booktitle = {17th International Parallel and Distributed Processing Symposium -- IPDPS'03}, - address = {Nice - France}, - month = apr, - year =2003, - category = {extern} -} - - - - - - - - - -@InProceedings{Bertin08, - title = {Toward a Fully Decentralized Algorithm for Multiple Bag-of-tasks Application Scheduling on Grids}, - author = {R{\'e}mi Bertin and Arnaud Legrand and Corinne Touati}, - booktitle = {IEEE/ACM International Conference on Grid Computing (Grid)}, - address = {Tsukuba, Japan}, - year = 2008, - category = {intra} -} - -@InProceedings{Dubois07, - title = {Assessing the Quality of Automatically Built Network Representations}, - author = {Lionel Eyraud-Dubois and Martin Quinson}, - booktitle = {Seventh IEEE International Symposium on Cluster Computing and the Grid (CCGrid 2007)}, - month = may, - year = 2007, - address = {Rio de Janeiro, Brazil}, - category = {intra} -} - -@InProceedings{Tchimou07, - title = {A Comparison of Scheduling Approaches for Mixed-Parallel Applications on Heterogeneous Platforms}, - author = {Tchimou N'takp{\'e} and Fr{\'e}d{\'e}ric Suter and Henri Casanova}, - booktitle = {6th International Symposium on Parallel and Distributed Computing}, - address = {Hagenberg, Austria}, - month = jul, - year = 2007, - category = {intra} -} - -@InProceedings{Dubois07*2, - title = {A First Step Towards Automatically Building Network Representations}, - author = {Lionel Eyraud-Dubois and Arnaud Legrand and Martin Quinson and Fr{\'e}d{\'e}ric Vivien}, - booktitle = {12th International Euro-Par Conference}, - month = aug, - year = 2007, - address = {Rennes, France}, - category = {intra} -} - -@Article{Beaumont07, - title = {Centralized Versus Distributed Schedulers Multiple Bag-of-Tasks Applications}, - author = {Olivier Beaumont and Larry Carter and Jeanne Ferrante and Arnaud Legrand and Loris Marchal and Yves Robert}, - journal = {IEEE Trans. Parallel Distributed Systems}, - year = 2007, - category = {intra} -} - -@InProceedings{Casanova06, - title = {On the Harmfulness of Redundant Batch Requests}, - author = {H. Casanova}, - booktitle = {Proceedings of the IEEE International Symposium on High Performance Distributed Computing (HPDC-15)}, - address = {Paris, France}, - month = may, - year = 2006, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/hpdc_2006.pdf}, - category = {intra} -} - -@InProceedings{Cardinale06, - title = {An evaluation of Job Scheduling Strategies for Divisible Loads on Grid Platforms}, - author = {Y. Cardinale and H. Casanova}, - booktitle = {Proceedings of the High Performance Computing & Simulation Conference (HPC&S'06)}, - address = {Bonn, Germany}, - month = may, - year = 2006, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/cardinale_2006.pdf}, - category = {intra} -} - -@InProceedings{Beaumont06, - title = {Centralized Versus Distributed Schedulers Multiple Bag-of-Tasks Applications}, - author = {Olivier Beaumont and Larry Carter and Jeanne Ferrante and Arnaud Legrand and Loris Marchal and Yves Robert}, - booktitle = {International Parallel and Distributed Processing Symposium IPDPS'2006}, - year = 2006, - category = {intra} -} - -@Article{Kreaseck05, - title = {Interference-Aware Scheduling}, - author = {B. Kreaseck and L. Carter and H. Casanova and J. Ferrante and S. Nandy}, - journal = {International Journal of High Performance Computing Applications (IJHPCA)}, - year = 2005, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/kreaseck_ijhpca_2005.pdf}, - category = {intra} -} - -@InProceedings{Suter04, - title = {From Heterogeneous Task Scheduling to Heterogeneous Mixed Data and Task Parallel Scheduling}, - author = {F. Suter and V. Boudet and F. Desprez and H. Casanova}, - booktitle = {Proceedings of Europar, 230--237, (LCNS volume 3149)}, - year = 2004, - month = aug, - address = {Pisa, Italy}, - category = {intra} -} - -@InProceedings{Kreaseck04, - title = {On the Interference of Communication on Computation}, - author = {B. Kreaseck and L. Carter and H. Casanova and J. Ferrante}, - booktitle = {Proceedings of the workshop on Performance Modeling, Evaluation, and Optimization of Parallel and Distributed Systems}, - address = {Santa Fe}, - month = apr, - year = 2004, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/k_pmeo2004.pdf -}, - category = {intra} -} - -@InProceedings{Yang03, - title = {RUMR: Robust Scheduling for Divisible Workloads}, - author = {Y. Yang and H. Casanova}, - booktitle = {Proceedings of the 12th IEEE Symposium on High Performance and Distributed Computing (HPDC-12)}, - address = {Seattle}, - month = jun, - year = 2003, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/yang_hpdc2003.pdf}, - category = {intra} -} - -@Article{Faerman03, - title = {Resource Allocation Strategies for Guided Parameter Space Searches}, - author = {M. Faerman and A. Birnbaum and F. Berman and H. Casanova}, - booktitle = {International Journal of High Performance Computing Applications (IJHPCA)}, - volume = 17, - number = 4, - pages = {383-402}, - year = {2003}, - category = {intra} -} - -@InProceedings{Faerman02, - title = {Resource Allocation for Steerable Parallel Parameter Searches}, - author = {M. Faerman and A. Birnbaum and H. Casanova and F. Berman}, - booktitle = {Proceedings of the Grid Computing Workshop}, - address = {Baltimore}, - month = nov, - year = 2002, - pdf = {http://grail.sdsc.edu/projects/vi_itr/grid02.pdf}, - category = {intra} -} - -@InProceedings{Smallen01, - title = {Applying Scheduling and Tuning to On-line Parallel Tomography }, - author = {Shava Smallen and Henri Casanova and Francine Berman}, - booktitle = {Proceedings of Supercomputing}, - year = 2001, - category = {intra} -} - -@InProceedings{Casanova00, - title = {Heuristics for Scheduling Parameter Sweep applications in Grid environments}, - author = {Henri Casanova and Arnaud Legrand and Dmitrii Zagorodnov and Francine Berman}, - booktitle = {Proceedings of the 9th Heterogeneous Computing workshop (HCW'2000)}, - year = 2000, - pdf = {http://navet.ics.hawaii.edu/~casanova/homepage/papers/hcw00_pst.pdf} -} diff --git a/doc/bindings.doc b/doc/bindings.doc new file mode 100644 index 0000000000..c1b14d256d --- /dev/null +++ b/doc/bindings.doc @@ -0,0 +1,392 @@ +/*! \page bindings Bindings + +\htmlinclude .bindings.doc.toc + +\section bindings_binding_lua Lua Binding + +Most of Simgrid modules require a good level in C programming, since simgrid is used to be as standard C library. + Sometime users prefer using some kind of « easy scripts » or a language easier to code with, for their works, + which avoid dealing with C errors, and sometime an important gain of time. +Besides Java Binding, Lua and Ruby bindings are available since version 3.4 of Simgrid +for MSG Module, and we are currenlty working on bindings for other modules. + + +\subsection bindings_binding_lua_about What is lua ? +Lua is a lightweight, reflective, imperative and functional programming language, + designed as a scripting language with extensible semantics as a primary goal (see official web site here). +\subsubsection bindings_binding_lua_why Why lua ? +Lua is a fast, portable and powerful script language, quite simple to use for developpers. +it combines procedural features with powerful data description facilities, + by using a simple, yet powerful, mechanism of tables. +Lua has a relatively simple C API compared to other scripting languages, +and accordingly it provides a robust, easy to use it. +\subsubsection bindings_binding_lua_simgrid How to use lua in Simgrid ? +Actually, the use of lua in Simgrid is quite simple, you have just to follow the same steps as coding with C in Simgird : + - Coding functions coresponding to each process + - loading the platforme/deployment XML file that describe the environment of simulation + - and … Running the Simulation. + +\dontinclude lua/masterslave/master.lua +\subsection bindings_binding_lua_example_master_slave Master/Slave Example + + \li Master Code + \until end_of_master +we mainly use simgrid.Task.new(task_name,computation_size,communication_size) to create our MSG Task, + then simgrid.Task.send(task,alias) to send it. +we use also simgrid.Task.name(task), to get the task's name. + +\dontinclude lua/masterslave/slave.lua +\li Slave Code +\until end_of_slave +Here, we see the use of simgrid.Task.recv(alias) to receive a task with a specific alias, +this function return directly the task recevied. + +\dontinclude lua/masterslave/master_slave.lua +\li Set Environmenet and run application +\until simgrid.clean() + +\subsection bindings_binding_lua_example_data Exchanging Data +You can also exchange data between Process using lua. for that, you have to deal with lua task as a table, +since lua is based itself on a mechanism of tables, +so you can exchange any kind of data (tables, matrix, strings,…) between process via tasks. + +\li Sender process +\verbatim + task = simgrid.Task.new("data_task",task_comp,task_comm); + task['matrix'] = my_matrix; + task['table'] = my_table; + task['message'] = "Hello from (Lua || Simgrid ) !! " + … + simgrid.Task.send(task,alias) +\endverbatim + After creating task, we associate to it various kind of data with a specific key (string in this case) + to distinguish between data variables. The receiver will use this key to access easily to datas. + + +\li Receiver processe +\verbatim + task = simgrid.Task.recv(alias); + sender_matrix = task['matrix']; + sender_table = task['table']; + sender_message = task['message'] + ... +\endverbatim + Note that in lua, both sender and receiver share the same lua task. + So that the receiver could joint data directly on the received task without sending it back. + You can find a complet example (matrix multiplication case) in the file example/lua/mult_matrix.lua. + + +\subsection bindings_binding_lua_example_bypass Bypass XML + maybe you wonder if there is a way to bypass the XML files, + and describe your platform directly from the code, with lua bindings it's Possible !! how ? + We provide some additional (tricky?) functions in lua that allows you to set up your own platform without using the XML files + ( this can be useful for large platforms, so a simple for loop will avoid you to deal with an annoying XML File ;) ) + + +\li set Routing mode +\verbatim + simgrid.AS.new{id="AS0",mode="Full"}; +\endverbatim + +\li set Hosts +\verbatim + simgrid.Host.new{id="Tremblay",power=98095000}; + simgrid.Host.new{id="Jupiter",power=76296000}; + simgrid.Host.new{id="Fafard",power=76296000}; + simgrid.Host.new{id="Ginette",power=48492000}; + simgrid.Host.new{id="Bourassa",power=48492000}; +\endverbatim + we use simgrid.Host.new{id=id_host,power=power_host} to instanciate our hosts. + +\li set Links +\verbatim + for i=0,11 do + simgrid.Link.new{id=i,bandwidth=252750+ i*768,latency=0.000270544+i*0.087}; -- some crazy values ;) + end +\endverbatim + we used simgrid.Link.new{id=link_id,bandwidth=bw,latency=lat} with a simple for loop to create all links we need (much easier than XML hein ?) + +\li set Routes +\verbatim +-- simgrid.Route.new(src_id,des_id,links_nb,links_list) + simgrid.Route.new("Tremblay","Jupiter",1,{"1"}); + simgrid.Route.new("Tremblay","Fafard",6,{"0","1","2","3","4","8"}); + simgrid.Route.new("Tremblay","Ginette",3,{"3","4","5"}); + simgrid.Route.new("Tremblay","Bourassa",7,{"0","1","3","2","4","6","7"}); + + simgrid.Route.new("Jupiter","Tremblay",1,{"1"}); + simgrid.Route.new("Jupiter","Fafard",7,{"0","1","2","3","4","8","9"}); + simgrid.Route.new("Jupiter","Ginette",4,{"3","4","5","9"}); + simgrid.Route.new("Jupiter","Bourassa",8,{"0","1","2","3","4","6","7","9"}); + ... +\endverbatim + for each host you have to specify which route to choose to access to the rest of hosts connected in the grid. + +\li Save platform +\verbatim + simgrid.register_platform(); +\endverbatim +Don't forget to register your platform, that SURF callbacks starts their work ;) + +\li set application +\verbatim + simgrid.Host.setFunction("Tremblay","Master",4,{"20","550000000","1000000","4"}); + simgrid.Host.setFunction("Bourassa","Slave",1,{"0"}); + simgrid.Host.setFunction("Jupiter","Slave",1,{"1"}); + simgrid.Host.setFunction("Fafard","Slave",1,{"2"}); + simgrid.Host.setFunction("Ginette","Slave",1,{"3"}); +\endverbatim + you don't need to use a deployment XML file, thanks to simgrid.Host.setFunction(host_id,function,args_number,args_list) + you can associate functions for each host with arguments if needed . + +\li +\verbatim + simgrid.register_application(); +\endverbatim +Yes, Here too you have to resgiter your application before running the simulation. + +the full example is distributed in the file examples/lua/master_slave_bypass.lua + +\section bindings_binding_ruby Ruby Binding + +\subsection bindings_binding_ruby_install How to install Simgrid-ruby + +To use Ruby with Simgrid you have to install some dependancies: + \li Simgrid (see \ref installSimgrid_cmake). Be sure having set the environment variable "SIMGRID_ROOT". + \li Ruby package. + +Then Download and install package Simgrid-ruby: +\verbatim +git clone git://scm.gforge.inria.fr/simgrid/simgrid-ruby.git +cd simgrid-ruby +cmake . +\endverbatim + + Cmake output + +\verbatim +-- SITE : Linux_2.6.38-8-generic_x86_64 +-- BUILDNAME : Simgrid-Ruby +-- Looking for lib SimGrid +-- Looking for lib SimGrid - found +-- Simgrid version : 3.6 +-- Looking for gras.h +-- Looking for gras.h - found +-- Found Tesh: /home/user/Bureau/simgrid/git/bin/tesh +-- Found gras_stub_generator: /home/user/Bureau/simgrid/git/bin/gras_stub_generator +-- Found ruby: /usr/bin/ruby +-- Looking for ruby.h +-- Looking for ruby.h - found +-- Looking for confi.h +-- Looking for config.h - found +-- Looking for lib ruby +-- Looking for lib ruby - found +-- Lib ruby version: 1.9.1 +-- Configuring done +-- Generating done +-- Build files have been written to: /home/user/workspace/simgrid-ruby/build +\endverbatim + +\subsection bindings_binding_ruby_simgrid Use Ruby in Simgrid +Since v3.4, the use of ruby in simgrid is available for the MSG Module. +you can find almost all MSG functionalities in Ruby code, that allows you to set up your environment, manage tasks between hosts and run the simulation. + +\subsection bindings_binding_ruby_example Master/Slave Ruby Application +for each process method(master and slave in this example), you have to associate a ruby class, that should inherit from MSG::Process ruby class, + with a 'main' function that describe the behaviour of the process during the simulation. +\li required stuff +\verbatim +require 'simgrid' +include MSG +\endverbatim + +\li Master code +\verbatim +class Master < MSG::Process + # main : that function that will be executed when running simulation + + def main(args) # args is an array containing arguments for function master + size = args.size + for i in 0..size-1 + MSG::info("args["+String(i)+"]="+args[i]) + end + + raise "Master needs 3 arguments" if size < 3 + numberOfTask = Integer(args[0]) + taskComputeSize = Float(args[1]) + taskCommunicationSize = Float(args[2]) + slaveCount = Integer(args[3]) + + # Creates and sends the tasks + for i in 0..numberOfTask-1 + task = Task.new("Task_"+ i.to_s, taskComputeSize , taskCommunicationSize); + mailbox = "slave " + (i%slaveCount).to_s + MSG::info("Master Sending "+ task.name + " to " + mailbox + " with Comput Size " + + task.compSize.to_s) + task.send(mailbox) + MSG::info("Master Done Sending " + task.name + " to " + mailbox) + end + + # Sending Finalize MSG::Tasks + MSG::info("Master: All tasks have been dispatched. Let's tell everybody the computation is over.") + for i in 0..slaveCount-1 + mailbox = "slave " + i.to_s + finalize_task = Task.new("finalize",0,0) + finalize_task.send(mailbox) + end + MSG::info("Master : Everything's Done") + end +end +\endverbatim + + +the class MSG::Task contains methods that allows the management of the native MSG tasks. +in master ruby code we used : + - MSG::Task.new(task_name,compute_size,communication_size) : to instanciate a new task. + - MSG::Task.send(mailbox) : to send the task via a mailbox alias. + - MSG::Task.name : to get the task's name. + +\li Slave code +\verbatim +class Slave < MSG::Process + + def main(args) + mailbox = "slave " + args[0] + for i in 0..args.size-1 + MSG::debug("args["+String(i)+"]="+args[i]) + end + + while true + MSG::info("Slave '"+ mailbox +"' waiting for new task"); + task = Task.receive(mailbox) + if (task.name == "finalize") + break + end + task.execute + MSG::info("Slave '" + mailbox + "' done executing task "+ task.name + ".") + end + MSG::info("I'm done, see you") + end +end +\enverbatim +to receive a task, we use the method MSG::Task.receive(mailbox) that return a MSG:Task object (received task). + +\li Main chunk + +\verbatim +require 'simgrid' +include MSG +(...) + +if (ARGV.length == 2) + MSG.createEnvironment(ARGV[0]) + MSG.deployApplication(ARGV[1]) + +else + + MSG.createEnvironment("platform.xml") + MSG.deployApplication("deploy.xml") +end +MSG.run +puts "Simulation time : " + MSG.getClock.to_s +MSG.exit +\endverbatim + +- MSG.createEnvironment(platform_file) : set up the environment +- MSG.deployApplication(deployment_file) : load the deployment file description. +- MSG.run : run the simulation + +\subsection bindings_binding_ruby_data Exchanging data +ruby bindings provides two ways to exchange data between ruby processes. +\li MSG::Task.join & MSG::Task.data
+ + the MSG::Task class contains 2 methods that allows a data exchange between 2 process. + + -MSG::Task.join : makes possible to join any kind of ruby data within a task. + \verbatim + ... + myTable = Array.new + myTable <<1<<-2<<45<<67<<87<<76<<89<<56<<78<<3<<-4<<99 + # Creates and send Task With the Table inside + task = MSG::Task.new("quicksort_task",taskComputeSize, taskCommunicationSize); + task.join(myTable); + ... + task.send(mailbox); + \endverbatim + -MSG::Task.data : to access to the data contained into the task. + \verbatim + ... + task = MSG::Task.receive(recv_mailbox.to_s) + table = task.data + quicksort(table,0,table.size-1) + ... + \endverbatim +you can find a complet example illustrating the use of those methods in file /example/ruby/Quicksort.rb + +\li inheritence + + another 'object-oriented' way to do it, is to make your own 'task' class that inherit from MSG::Task , + and contains data you want to deal with, the only 'tricky' thing is that "the initializer" method has no effect ! + + the use of some getter/setter methods would be the simple way to manage your data :) + \verbatim +class PingPongTask < MSG::Task + # The initialize method has no effect + @time + def setTime(t) + @time = t + end + def getTime() + return @time + end +end + \endverbatim + you can find an example of use in file example/ruby/PingPong.rb + + +\section bindings_binding_java Java Binding + +\subsection bindings_binding_java_install How to install Simgrid-java + +To use java with Simgrid you have to install some dependancies: + \li Simgrid (see \ref installSimgrid_cmake). Be sure having set the environment variable "SIMGRID_ROOT". + \li Java packages: sun-java6-jdk and libgcj10-dev. If you cannot find the +libgcj10-dev, try another version. + +Then Download and install package Simgrid-java: +\verbatim +git clone git://scm.gforge.inria.fr/simgrid/simgrid-java.git +cd simgrid-java +cmake . +\endverbatim + +Cmake output +\verbatim +-- SITE : Linux_2.6.38-8-generic_x86_64 +-- BUILDNAME : Simgrid-Java +-- Looking for lib SimGrid +-- Looking for lib SimGrid - found +-- Simgrid version : 3.6 +-- Looking for gras.h +-- Looking for gras.h - found +-- Found Tesh: /home/user/Bureau/simgrid/git/bin/tesh +-- Found gras_stub_generator: /home/user/Bureau/simgrid/git/bin/gras_stub_generator +-- Java version 1.6.0.22 configured successfully! +-- Looking for jni.h +-- Looking for jni.h - found +-- Add flags -I/usr/lib/jvm/java-6-openjdk/include +-- Looking for jni_md.h +-- Looking for jni_md.h - found +-- Found javac: /usr/bin/javac +-- Found jar: /usr/bin/jar +-- Configuring done +-- Generating done +-- Build files have been written to: /home/user/workspace/simgrid-java/build +\endverbatim + +\subsection bindings_binding_java_use Use Java in Simgrid + +The use of java in simgrid is available for the MSG Module. You can find almost all MSG functionalities +in Java code (\ref MSG_JAVA). + + */ \ No newline at end of file diff --git a/doc/contrib.doc b/doc/contrib.doc deleted file mode 100644 index 60ec6ee29c..0000000000 --- a/doc/contrib.doc +++ /dev/null @@ -1,102 +0,0 @@ -/*! \page contrib Contrib section - -\htmlinclude .contrib.doc.toc - -\section contrib_intro A contrib section ? Why ? - -Many people have come to ask us more complex examples than the simple ones -that are distributed with the main branch of the SimGrid project. We do not -want to include complex examples in the main branch but we think it is a -good idea that users share their experience. That is why we have created a -contrib branch that can be used by people who have a nice piece of work -using SimGrid and accept to share it. The licence of this code should be -LGPL if possible. If you can't licence your code with LGPL, just tell us -about it and we will try to sort out whether it makes sense to publish it -here. - -\section contrib_msg Projects relying on MSG - -\subsection contrib_msg_gridmatrix Grid Matrix - -Grid Matrix is an -application that lets you create your grid network and simulate the -execution of distributed applications from a Graphic User Interface -(GUI). - - - Features: - - Complete design of the network. - - Bindings for MSG. - - Simulation run within the GUI. - - Pause / Stop simulation. - - Multiple trace options. - - Python output and errors redirected to the GUI. - - Grid Nodes change their red intensity to show activity. - - Custom activity can be set by Python scripts. - - Create graphics from scripts. - - Requirements: - - Microsoft Visual Studio VS2005 SP1 runtime - - Future works: - - Support other APIs in SimGrid. - - Add a form to set process parameters. - - Linux support. - -This is contributed by Pablo Yabo, and can be found here: -http://research.nektra.com/Grid_Matrix - -\subsection contrib_msg_simboinc SimBoinc - -SimBOINC is a simulator for heterogeneous and volatile desktop grids -and volunteer computing systems. The goal of this project is to -provide a simulator by which to test new scheduling strategies in -BOINC, and other desktop and volunteer systems, in general. - -It is contributed by Derrick Kondo and can be found here: -http://simboinc.gforge.inria.fr/ - -\subsection contrib_msg_garsim GarSim - -GarSim is a simulator of a scheduling meta-system or just of a batch -system. This code is written in C++ and has many dependencies (with -python, sqlite, some parts of condor, ...). - -It is maintained by Vincent Garonne (garonne::lal.in2p3.fr), and is -part of the SimGrid SVN (directory contrib/garSim). - -\subsection contrib_msg_simbatch Simbatch - -This program simulates the behavior of a batch scheduler managing a -cluster. - -This program is maintained by Jean-Sebastien Gay -(Jean-Sebastien.Gay::ens-lyon.fr), and is part of the SimGrid SVN -(directory contrib/Simbatch). - - -\section contrib_gras Projects relying on GRAS - -\subsection contrib_gras_alnem ALNeM: Application Level Network Mapping - -This program is an application-level network mapper. It performs -application level measurements and proposes a few reconstruction -algorithms. - -This program is maintained by Arnaud Legrand, Martin Quinson and -Lionel Eyraud, and is part of the SimGrid SVN (directory -contrib/ALNeM). - - -\section contrib_smpi Projects relying on SMPI - -(nothing for now) - -\section contrib_surf Projects relying on SURF - -(nothing for now) - -*/ - -\author Arnaud Legrand (arnaud.legrand::imag.fr) -\author Martin Quinson (martin.quinson::loria.fr) - - - diff --git a/doc/gtut-files/.gitignore b/doc/gtut-files/.gitignore deleted file mode 100644 index 312ab45a3f..0000000000 --- a/doc/gtut-files/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -01-bones_client -01-bones_server -02-simple_client -02-simple_server -03-args_client -03-args_server -04-callback_client -04-callback_server -05-globals_client -05-globals_server -06-logs_client -06-logs_server -07-timers_client -07-timers_server -08-exceptions_client -08-exceptions_server -09-simpledata_client -09-simpledata_server -10-rpc_client -10-rpc_server -11-explicitwait_client -11-explicitwait_server diff --git a/doc/gtut-files/10-rpc.c b/doc/gtut-files/10-rpc.c index a428e8d7de..bc01cbfe47 100644 --- a/doc/gtut-files/10-rpc.c +++ b/doc/gtut-files/10-rpc.c @@ -128,7 +128,8 @@ int client(int argc, char *argv[]) TRY { gras_msg_rpccall(toserver, 60, "convert a2i", &string_to_convert, &long_result); - } CATCH(e) { + } + CATCH(e) { XBT_INFO ("The server refuses to convert %s. Here is the received exception:", string_to_convert); diff --git a/doc/gtut-introduction.doc b/doc/gtut-introduction.doc index 9e89785913..f53224e523 100644 --- a/doc/gtut-introduction.doc +++ b/doc/gtut-introduction.doc @@ -310,8 +310,8 @@ reach the machine on which B is running from the machine running on A. The time (2) is mainly given by the network bandwidth. This is the time for all bytes of the messages to travel from one machine to the other. Please note that the models used by SimGrid are a bit more complicated to keep realistic, as -explained in the -tutorial slides, but this not that important here. The time (3) is mainly +explained in the +slides of the HPCS'10, but this not that important here. The time (3) is mainly found in the SG version and not in RL (and that's a bug). This is the time to make sure that message were received on machine B. In real life, some buffering at system and network level may give the illusion to machine A that the message diff --git a/doc/gtut-tour-00-install.doc b/doc/gtut-tour-00-install.doc new file mode 100644 index 0000000000..258c62803d --- /dev/null +++ b/doc/gtut-tour-00-install.doc @@ -0,0 +1,16 @@ + +/** +@page GRAS_tut_tour_install Lesson 0: Installing GRAS + +Since GRAS is technically part of the SimGrid project, you have to install +SimGrid to install GRAS. Doing so is explained in the relevant FAQ section +(\ref installSimgrid). + +Newcommers should install the stable release from the tarball, since the +snapshots may suffer from (additionnal;) stability issues. Only go for the +git if you really need features not present in the stable releases yet (or +if you plan to help us improving the tool, what is always welcomed). + +Proceed to \ref GRAS_tut_tour_setup. + +*/ diff --git a/doc/gtut-tour-08-exceptions.doc b/doc/gtut-tour-08-exceptions.doc index 90dce052d9..057e9bf7fd 100644 --- a/doc/gtut-tour-08-exceptions.doc +++ b/doc/gtut-tour-08-exceptions.doc @@ -54,13 +54,14 @@ its own arguments. So, you may have something like the following: Then, you simply add a #TRY/#CATCH block around your code: \verbatim TRY{ /* your code */ -} CATCH(e) { +} +CATCH(e) { /* error handling code */ } \endverbatim Another strange thing is that you should actually free the memory allocated to the exception with xbt_ex_fres() if you manage to deal with them. There -is a bit more than this on the picture (#CLEANUP blocks, for example), and +is a bit more than this on the picture (#TRY_CLEANUP blocks, for example), and you should check the section \ref XBT_ex for more details. You should be very carfull when using the exceptions. They work great diff --git a/doc/gtut-tour-13-pointers.doc b/doc/gtut-tour-13-pointers.doc index 4e03372596..3c0f6a9500 100644 --- a/doc/gtut-tour-13-pointers.doc +++ b/doc/gtut-tour-13-pointers.doc @@ -7,9 +7,15 @@ long otherwise, the lesson is organized as a FAQ, with little examples of how to do things. \section GRAS_tut_tour_pointers_toc Table of Contents + - \ref GRAS_tut_tour_pointers_intro + - \ref GRAS_tut_tour_pointers_use + - \ref GRAS_tut_tour_pointers_recap - \ref GRAS_tut_tour_pointers_cste
+\section GRAS_tut_tour_pointers_intro Introduction to pointers in datadesc +\section GRAS_tut_tour_pointers_use Using pointers in datadesc +\section GRAS_tut_tour_pointers_recap Recapping everything \section GRAS_tut_tour_pointers_cste How to have constants in parsed structures? diff --git a/doc/gtut-tour-recap-messages.doc b/doc/gtut-tour-recap-messages.doc index 71269d94df..2f34294933 100644 --- a/doc/gtut-tour-recap-messages.doc +++ b/doc/gtut-tour-recap-messages.doc @@ -9,7 +9,6 @@ - \ref GRAS_tut_tour_message_recaping_rpc3 - \ref GRAS_tut_tour_message_recaping_rpc4 - \ref GRAS_tut_tour_message_recaping_rpc5 - - - \ref GRAS_tut_tour_message_recaping_rpc_aside1 - \ref GRAS_tut_tour_message_recaping_rpc_aside2 - \ref GRAS_tut_tour_message_recaping_rpc_aside3 diff --git a/doc/gtut-tour.doc b/doc/gtut-tour.doc index 5cb74e5ad0..150509ce4a 100644 --- a/doc/gtut-tour.doc +++ b/doc/gtut-tour.doc @@ -29,120 +29,128 @@ all features available in GRAS. Part 1: Bases - - \ref GRAS_tut_tour_install - - - \ref GRAS_tut_tour_setup - - \ref GRAS_tut_tour_setup_C - - \ref GRAS_tut_tour_setup_plat - - \ref GRAS_tut_tour_setup_deploy - - \ref GRAS_tut_tour_setup_glue - - \ref GRAS_tut_tour_setup_make - - \ref GRAS_tut_tour_setup_start + - \ref GRAS_tut_tour_install + + - \ref GRAS_tut_tour_setup + - \ref GRAS_tut_tour_setup_C + - \ref GRAS_tut_tour_setup_plat + - \ref GRAS_tut_tour_setup_deploy + - \ref GRAS_tut_tour_setup_glue + - \ref GRAS_tut_tour_setup_make + - \ref GRAS_tut_tour_setup_start Part 2: Message passing - - \ref GRAS_tut_tour_simpleexchange - - \ref GRAS_tut_tour_simpleexchange_msgtype - - \ref GRAS_tut_tour_simpleexchange_socks - - \ref GRAS_tut_tour_simpleexchange_exchange - - \ref GRAS_tut_tour_simpleexchange_recaping - - - \ref GRAS_tut_tour_args - - \ref GRAS_tut_tour_args_use - - \ref GRAS_tut_tour_args_sg - - \ref GRAS_tut_tour_args_recap + - \ref GRAS_tut_tour_simpleexchange + - \ref GRAS_tut_tour_simpleexchange_msgtype + - \ref GRAS_tut_tour_simpleexchange_socks + - \ref GRAS_tut_tour_simpleexchange_exchange + - \ref GRAS_tut_tour_simpleexchange_recaping + + - \ref GRAS_tut_tour_args + - \ref GRAS_tut_tour_args_use + - \ref GRAS_tut_tour_args_sg + - \ref GRAS_tut_tour_args_recap + + - \ref GRAS_tut_tour_callbacks + - \ref GRAS_tut_tour_callbacks_declare + - \ref GRAS_tut_tour_callbacks_attach + - \ref GRAS_tut_tour_callbacks_handle + - \ref GRAS_tut_tour_callback_recap - - \ref GRAS_tut_tour_callbacks - - \ref GRAS_tut_tour_callbacks_declare - - \ref GRAS_tut_tour_callbacks_attach - - \ref GRAS_tut_tour_callbacks_handle - - \ref GRAS_tut_tour_callback_recap + - \ref GRAS_tut_tour_globals + - \ref GRAS_tut_tour_globals_intro + - \ref GRAS_tut_tour_globals_use + - \ref GRAS_tut_tour_callback_pitfall + - \ref GRAS_tut_tour_callback_recap - - \ref GRAS_tut_tour_globals - - \ref GRAS_tut_tour_globals_intro - - \ref GRAS_tut_tour_globals_use - - \ref GRAS_tut_tour_callback_pitfall - - \ref GRAS_tut_tour_callback_recap - - - \ref GRAS_tut_tour_logs - - \ref GRAS_tut_tour_logs_intro - - \ref GRAS_tut_tour_logs_practice - - \ref GRAS_tut_tour_logs_recap - - \ref GRAS_tut_tour_logs_config - - - \ref GRAS_tut_tour_timers - - \ref GRAS_tut_tour_timers_intro - - \ref GRAS_tut_tour_timers_use - - \ref GRAS_tut_tour_timers_recap + - \ref GRAS_tut_tour_logs + - \ref GRAS_tut_tour_logs_intro + - \ref GRAS_tut_tour_logs_practice + - \ref GRAS_tut_tour_logs_recap + - \ref GRAS_tut_tour_logs_config + - \ref GRAS_tut_tour_logs_config_prio + - \ref GRAS_tut_tour_logs_config_layout + + - \ref GRAS_tut_tour_timers + - \ref GRAS_tut_tour_timers_intro + - \ref GRAS_tut_tour_timers_use + - \ref GRAS_tut_tour_timers_recap + + - \ref GRAS_tut_tour_exceptions + - \ref GRAS_tut_tour_exceptions_intro + - \ref GRAS_tut_tour_exceptions_use + - \ref GRAS_tut_tour_exceptions_recap - - \ref GRAS_tut_tour_exceptions - - \ref GRAS_tut_tour_exceptions_intro - - \ref GRAS_tut_tour_exceptions_use - - \ref GRAS_tut_tour_exceptions_recap - - - \ref GRAS_tut_tour_simpledata - - \ref GRAS_tut_tour_simpledata_intro - - \ref GRAS_tut_tour_simpledata_intro_conv - - \ref GRAS_tut_tour_simpledata_intro_gras - - \ref GRAS_tut_tour_simpledata_use - - \ref GRAS_tut_tour_simpledata_example - - \ref GRAS_tut_tour_simpledata_recap + - \ref GRAS_tut_tour_simpledata + - \ref GRAS_tut_tour_simpledata_intro + - \ref GRAS_tut_tour_simpledata_intro_conv + - \ref GRAS_tut_tour_simpledata_intro_gras + - \ref GRAS_tut_tour_simpledata_use + - \ref GRAS_tut_tour_simpledata_example + - \ref GRAS_tut_tour_simpledata_recap - - \ref GRAS_tut_tour_rpc - - \ref GRAS_tut_tour_rpc_intro - - \ref GRAS_tut_tour_rpc_use - - \ref GRAS_tut_tour_rpc_use_declare - - \ref GRAS_tut_tour_rpc_use_i2a_cb - - \ref GRAS_tut_tour_rpc_use_a2i_cb - - \ref GRAS_tut_tour_rpc_use_rest - - \ref GRAS_tut_tour_rpc_recap + - \ref GRAS_tut_tour_rpc + - \ref GRAS_tut_tour_rpc_intro + - \ref GRAS_tut_tour_rpc_use + - \ref GRAS_tut_tour_rpc_use_declare + - \ref GRAS_tut_tour_rpc_use_i2a_cb + - \ref GRAS_tut_tour_rpc_use_a2i_cb + - \ref GRAS_tut_tour_rpc_use_rest + - \ref GRAS_tut_tour_rpc_recap - - \ref GRAS_tut_tour_explicitwait - - \ref GRAS_tut_tour_explicitwait_intro - - \ref GRAS_tut_tour_explicitwait_use - - \ref GRAS_tut_tour_explicitwait_algo - - \ref GRAS_tut_tour_explicitwait_code - - \ref GRAS_tut_tour_explicitwait_recap + - \ref GRAS_tut_tour_explicitwait + - \ref GRAS_tut_tour_explicitwait_intro + - \ref GRAS_tut_tour_explicitwait_use + - \ref GRAS_tut_tour_explicitwait_algo + - \ref GRAS_tut_tour_explicitwait_code + - \ref GRAS_tut_tour_explicitwait_code_msg + - \ref GRAS_tut_tour_explicitwait_code_cb + - \ref GRAS_tut_tour_explicitwait_code_api + - \ref GRAS_tut_tour_explicitwait_code_smain + - \ref GRAS_tut_tour_explicitwait_code_cmain + - \ref GRAS_tut_tour_explicitwait_recap - - \ref GRAS_tut_tour_message_recaping - - \ref GRAS_tut_tour_message_recaping_intro - - \ref GRAS_tut_tour_message_recaping_rpc - - \ref GRAS_tut_tour_message_recaping_rpc1 - - \ref GRAS_tut_tour_message_recaping_rpc2 - - \ref GRAS_tut_tour_message_recaping_rpc3 - - \ref GRAS_tut_tour_message_recaping_rpc4 - - \ref GRAS_tut_tour_message_recaping_rpc5 - - \ref GRAS_tut_tour_message_recaping_rpc_aside1 - - \ref GRAS_tut_tour_message_recaping_rpc_aside2 - - \ref GRAS_tut_tour_message_recaping_rpc_aside3 - - \ref GRAS_tut_tour_message_recaping_sync + - \ref GRAS_tut_tour_message_recaping + - \ref GRAS_tut_tour_message_recaping_intro + - \ref GRAS_tut_tour_message_recaping_rpc + - \ref GRAS_tut_tour_message_recaping_rpc1 + - \ref GRAS_tut_tour_message_recaping_rpc2 + - \ref GRAS_tut_tour_message_recaping_rpc3 + - \ref GRAS_tut_tour_message_recaping_rpc4 + - \ref GRAS_tut_tour_message_recaping_rpc5 + - \ref GRAS_tut_tour_message_recaping_rpc_aside1 + - \ref GRAS_tut_tour_message_recaping_rpc_aside2 + - \ref GRAS_tut_tour_message_recaping_rpc_aside3 + - \ref GRAS_tut_tour_message_recaping_sync Part 3: Data description - - \ref GRAS_tut_tour_staticstruct Automatic parsing of static data types - - \ref GRAS_tut_tour_staticstruct_intro - - \ref GRAS_tut_tour_staticstruct_use - - \ref GRAS_tut_tour_staticstruct_recap + - \ref GRAS_tut_tour_staticstruct + - \ref GRAS_tut_tour_staticstruct_intro + - \ref GRAS_tut_tour_staticstruct_use + - \ref GRAS_tut_tour_staticstruct_recap - - \ref GRAS_tut_tour_pointers Automatic parsing of datatypes containing pointers - - \ref GRAS_tut_tour_pointers_intro - - \ref GRAS_tut_tour_pointers_use - - \ref GRAS_tut_tour_pointers_recap + - \ref GRAS_tut_tour_pointers + - \ref GRAS_tut_tour_pointers_intro + - \ref GRAS_tut_tour_pointers_use + - \ref GRAS_tut_tour_pointers_recap + - \ref GRAS_tut_tour_pointers_cste - - \ref GRAS_tut_tour_dynar Exchanging dynars (and matrices) - - \ref GRAS_tut_tour_dynar_intro - - \ref GRAS_tut_tour_dynar_use - - \ref GRAS_tut_tour_dynar_recap + - \ref GRAS_tut_tour_dynar + - \ref GRAS_tut_tour_dynar_intro + - \ref GRAS_tut_tour_dynar_use + - \ref GRAS_tut_tour_dynar_recap - - \ref GRAS_tut_tour_manualdatadef Manual data description: the full power - - \ref GRAS_tut_tour_manualdatadef_intro - - \ref GRAS_tut_tour_manualdatadef_use - - \ref GRAS_tut_tour_manualdatadef_recap + - \ref GRAS_tut_tour_manualdatadef + - \ref GRAS_tut_tour_manualdatadef_intro + - \ref GRAS_tut_tour_manualdatadef_use + - \ref GRAS_tut_tour_manualdatadef_recap - - \ref GRAS_tut_tour_exchangecb Exchange callbacks: yes you can - - \ref GRAS_tut_tour_exchangecb_intro - - \ref GRAS_tut_tour_exchangecb_use - - \ref GRAS_tut_tour_exchangecb_recap + - \ref GRAS_tut_tour_exchangecb + - \ref GRAS_tut_tour_exchangecb_intro + - \ref GRAS_tut_tour_exchangecb_use + - \ref GRAS_tut_tour_exchangecb_recap Part 4: Advanced topics @@ -158,20 +166,4 @@ of missi^W lessons I want to add: -*/ - -/** -@page GRAS_tut_tour_install Lesson 0: Installing GRAS - -Since GRAS is technically part of the SimGrid project, you have to install -SimGrid to install GRAS. Doing so is explained in the relevant FAQ section -(\ref faq_installation). - -Newcommers should install the stable release from the tarball, since the cvs -snapshots may suffer from (additionnal;) stability issues. Only go for the -CVS if you really need features not present in the stable releases yet (or -if you plan to help us improving the tool, what is always welcomed). - -Proceed to \ref GRAS_tut_tour_setup. - */ diff --git a/doc/history.doc b/doc/history.doc deleted file mode 100644 index 9278c59f34..0000000000 --- a/doc/history.doc +++ /dev/null @@ -1,246 +0,0 @@ -/*! \page history History of SimGrid - -\htmlinclude .history.doc.toc - -Many people have asked about the origins of the SimGrid project, about -the history of its development up to now, and about plans for the future. -Here it is, in (perhaps excruciating) details. - -\section history_sg SimGrid v1 - -In 1999 Henri Casanova joined the AppLeS research group in the Computer -Science and Engineering Department at the University of California at San -Diego, as a post-doc. The AppLeS group, led by Francine Berman, focused -mostly on the study of practical scheduling algorithms for parallel -scientific application on heterogeneous, distributed computing platforms. -Shortly after Henri joined the group he faced the need to run simulation -instead of or in addition to merely running real-world experiments. At -that time Arnaud Legrand, a 1st year graduate student at Ecole Normale -Superieure de Lyon, France, spent 2 months in the summer in the AppLeS -group as a visiting student. He worked with Henri that summer on a research -project as part of which he implemented an ad-hoc simulator. - -After Arnaud left UCSD, Henri realized that most likely every researcher -in the AppLeS group would eventually need to run simulations, and that they -would most likely all end up rewriting the same code at one point or -another. He took apart the simulator that Arnaud had developed, an packaged -it as a more generic simulation framework with a simple API, and called it -SimGrid v1.0 (a.k.a. SG). This version was simple, and in retrospect a bit -naive. However, it was surprisingly useful to study "centralized" -scheduling (e.g., off-line scheduling of a DAG on a heterogeneous set of -distributed compute nodes). SimGrid v1.0 was described in "SimGrid: A -Toolkit for the Simulation of Application Scheduling, by Henri Casanova, in -Proceedings of CCGrid 2001". Henri became the first user of SimGrid and -used it for several research projects from then on. - -\section history_msg SimGrid v2 - -By 2001 time Arnaud was engaged in his Ph.D. thesis work and started -studying "decentralized" scheduling heuristics, that is ones in which -scheduling decisions are made by more or less autonomous agents that typicaly have only -partial knowledge of the applications and/or computing platform. Although -simulating decentralized scheduling with SimGrid v1.0 was actually possible -(and done by one Ph.D. student at UCSD in fact!), it was extremely cumbersome -and limited in scope. So Arnaud built a layer on top of SG, which he -called MSG (for Meta-SimGrid). MSG added threads and introduced the -concept of independently running simulated processes that performed -computations and communication tasks in possibly asynchronous fashion. MSG -was described in "MetaSimGrid : Towards realistic scheduling simulation of -distributed applications, by Arnaud Legrand and Julien Lerouge, LIP -Research Report". This resulted in the following layered architecture: - -\verbatim - (user code) - ----------- - | MSG | | - ------- | - | SG | - -----------\endverbatim - -With Henri and some of his students using SG and Arnaud using MSG, the -project started having a (tiny) user base. It was time to be more ambitious -and to address one of the key limitation of SG: its inability to simulate -multi-hop network communications realistically. In the Summer 2003 Loris -Marchal, a 1st year graduate student at Ecole Normale Superieure, came to -UCSD to work with Henri. During that summer, based on results in the TCP modeling -literature, he implemented a macroscopic network model as part of SG. This -model dramatically increased the level of realism of SimGrid simulations and -was initially described in: "A Network Model for Simulation of Grid -Applications, by Loris Marchal and Henri Casanova, LIP research report". By -the end of 2003 the work at UCSD and at Ecole Normale was merged in what -became SimGrid v2, as described in: "Scheduling Distributed Applications: -the SimGrid Simulation Framework, by Henri Casanova, Arnaud Legrand, and -Loris Marchal, in Proceedings of CCGrid 2003". - -\section history_gras SimGrid v3 - -SimGrid v2, with its much improved features and capabilities, garnered a -larger user base and many friends and collaborators of Arnaud and Henri -started using it for their research. On these friends was Martin Quinson, -then a Ph.D. student at Ecole Normale Superieure, who was working in the -area of distributed resource monitoring systems. As part of his Ph.D. -Martin attempted to develop a network topology discovery tool and quickly -found out that it was difficult and required prototyping in simulation. -Faced with the perspective of first implementing a throw-away prototype in -simulation and then reimplementing the whole thing for production, Martin -started working on a framework that would easily compile the same code in -"simulation mode" or in "real-world mode". He found this ability -to be invaluable when developing distributed systems and built his framework, -called GRAS, on top of MSG (for the simulation mode) and on top of the -socket layer (for the real-world mode). GRAS is described in "GRAS: A -Research & Development Framework for Grid and P2P Infrastructures, by -Martin Quinson, in Proceedings of PDCS 2006". This led to the following -layered software architecture: - -\verbatim - (user code for either SG, MSG or GRAS) - ----------------------------- - | | | GRAS API | - | | ------------------- - | | |GRAS S | |GRAS R | - | | --------- --------- - | | MSG | |sockets| - | --------------| --------- - | SG | - -------------------\endverbatim - -At this point, with more users running more complex -simulations, it became clear that the initial SG -foundation inherited from SimGrid v1 was too limiting in terms -of scalability and performance. In 2005 Arnaud took the bull by the horns -and replaced SG with a new simulation engine called SURF, thus removing the -SG API. Users reported acceleration factors of up to 3 orders of magnitude -when going from SG to SURF. Furthermore, SURF is much more extensible than -SG ever was and has enabled the evolution of simulation models used by SimGrid. -Although it made sense at the time to re-implement GRAS on top of -SURF, it was never accomplished due to the "too many things to do not -enough time" syndrome. Martin added a layer on top of GRAS called AMOK, to -implement high-level services needed by many distributed applications, thus -leading to the new overall layered architecture: - -\verbatim - (user code for either MSG or GRAS -- using AMOK or not) - ------- - | AMOK| - ------------------------- - | | GRAS API | - | ------------------- - | |GRAS S | |GRAS R | - | --------- --------- - | MSG | |sockets| - --------------| --------- - | SURF | - ---------------\endverbatim - -This architecture culminated in SimGrid v3! One development worth mentioning -is that of SimDAG, written by Christophe Thiery during an Internship with -Martin Quinson. Many users indeed had asked functionality similar to what -the SG API provided in SimGrid v1 and v2, to study centralized scheduling -without all the power of the MSG API. SimDAG provides an API -especially for this purpose and was integrated in SimGrid v3.1, leading -to the following layered architecture: - -\verbatim - (user code for either SimDag, MSG or GRAS) - ------- - | AMOK| - -------------------------------- - | | | GRAS API | - | | ------------------- - | | |GRAS SG| |GRAS RL| - | | --------- --------- - |SimDag| MSG | |sockets| - |--------------------| --------- - | SURF | - ----------------------\endverbatim - -SimGrid 3.2, the current publicly available version as this document is -being written, implements the above architecture and also provides a -(partial) port to the Windows operating system. - -\section history_ongoing Ongoing Work - -As the project advances, it becomes increasingly clearer that there is a need -for an intermediate layer between the base simulation engine, SURF, and higher -level APIs. In the previously shown software architecture MSG plays the role -of an intermediate layer between SURF and GRAS, but is itself a high-level API, -which is not very good design. Bruno Donassolo, during an internship with -Arnaud, has developed an intermediate layer called SIMiX, and both GRAS -and MSG are being rewritten on top of it. - -Another development is that of SMPI, a framework to run unmodified MPI -applications in either simulation mode or in real-world mode (sort of GRAS -for MPI). The development of SMPI, by Mark Stillwell who works with Henri, -is being greatly simplified thanks to the aforementioned SIMiX layer. -Finally, somewhat unrelated, is the development of Java bindings for the -MSG API by Malek Cherier who works with Martin. The current software -architecture thus looks as follows: - -\verbatim - (user code for either SimDAG, MSG, GRAS, or MPI) - ---------------------------------- - | | |jMSG| |AMOK| | - | | -----| ------ | - |SimDag| MSG | GRAS | SMPI | (Note that GRAS and SMPI also run on top of - | --------------------------- sockets and MPI, not shown on the figure) - | | SIMiX | - ---------------------------------- - | SURF | - ----------------------------------\endverbatim - -While the above developments are about adding simulation functionality, a -large part of the research effort in the SimGrid project relates to -simulation models. These models are implemented in SURF, and Arnaud has -refactored SURF to make it more easily extensible so that one can -experiment with different models, in particular different network models. -Pedro Velho, who works with Arnaud, is currently experimenting with several -new network models. Also, Kayo Fujiwara, who works with Henri, has -interfaced SURF with (a patched version of) the GTNetS packet-level -simulator. - -The current architecture in the CVS tree at the time this document is -being written is as follows: - -\verbatim - ---------------------------------- - | | |jMSG| |AMOK| | - | | ------ ------ | - |SimDag| MSG | GRAS | SMPI | (Note that GRAS and SMPI also run on top of - | | | ------- | sockets and MPI, not shown on the figure) - | | | |SMURF| | - | --------------------------- - | | SIMiX | - ---------------------------------- - | SURF interface | - ---------------------------------- - | SURF kernel | | GTNetS | - | (several models) | | | - -------------------- ----------\endverbatim - -\section history_future Future Directions - -The primary short-term future direction is to develop a distributed version of -SIMiX to increase the scalability of simulations in terms of memory. This can be done -using the GRAS "real world" functionality to run SIMiX in a distributed fashion -across multiple hosts, thus allowing to run simulations that are not -limited by the amount of memory on a single host. The simulation itself -would still be centralized and sequential, meaning that a single simulated -process would run at a time. Bruno Donassolo is currently working on this -idea, which is currently called SMURF. - -Longer-term plans include: - - \li More development in AMOK - \li Component for simulation visualization - \li Model-checking in GRAS - \li True parallel simulation - - -One of the constant challenge in this project is its duality: it is a -useful tool for scientists (hence our efforts on APIs, portability, -documentation, etc.), but is it also a scientific project in its own right -(so that we can publish papers). - - - -*/ \ No newline at end of file diff --git a/doc/index.doc b/doc/index.doc index b870aa07c3..c12eb383a0 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -128,8 +128,6 @@ mailing list. \htmlonly
CC-GNU LGPL - -Back to the gforge site
\endhtmlonly diff --git a/doc/index.php.in b/doc/index.php.in deleted file mode 100644 index 4c200145e7..0000000000 --- a/doc/index.php.in +++ /dev/null @@ -1,210 +0,0 @@ -'; -?> - - - - - - - - - <?php echo $project_name; ?> - - - - - - - - - - - - - -
SimGrid
-
gforge INRIA
-______ONGLETS______ - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - -
- -______BODY______ - - - - - -
- - - - - - - -
Project Summary
- - -
-
-
- - - -
-

 

-
- CC-GNU LGPL -
-  

-

- Help: siteadmin-help@lists.gforge.inria.fr Webmaster: webmaster@gforge.inria.fr -
- - - -
- - - -
- - -
-
-Powered By GForge Collaborative Development Environment -
- - - - diff --git a/doc/installSimgrid.doc b/doc/installSimgrid.doc new file mode 100644 index 0000000000..456835344c --- /dev/null +++ b/doc/installSimgrid.doc @@ -0,0 +1,455 @@ +/*! \page installSimgrid Install Simgrid + +\htmlinclude .installSimgrid.doc.toc + +\section installSimgrid_cmake Installing the SimGrid library + +\subsection installSimgrid_intro Some generalitty + +\subsubsection installSimgrid_intro1 What is Cmake? + +CMake is a family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files. CMake generates native makefiles and workspaces that can be used in the compiler environment of your choice. For more information see official web site here. + +\subsubsection installSimgrid_intro2 Why cmake? + +CMake permits to developers to compil projects on different plateforms. Then many tools are embedded like ctest for making test, a link to cdash for vizualise results but also test coverage and bug reports. + +\subsubsection installSimgrid_intro3 What cmake need? + +CMake needs some prerequists like : + +For Unix and MacOS: + \li make + \li perl and libpcre + \li c and c++ compiler + \li ccmake for graphical used of CMake + \li cmake (download page) + +For Windows : + \li cmake 2.8 (download page) + \li perl strawberry (download page) + \li git (download page) + +\subsubsection installSimgrid_cmakeoption1 Liste of options + +\verbatim +"cmake -D[name]=[value] ... ./" + +[name] enable_gtnets [value] ON/OFF or TRUE/FALSE or 1/0 + enable_lua ON/OFF or TRUE/FALSE or 1/0 + enable_compile_optimizations ON/OFF or TRUE/FALSE or 1/0 + enable_compile_warnings ON/OFF or TRUE/FALSE or 1/0 + enable_smpi ON/OFF or TRUE/FALSE or 1/0 + enable_maintainer_mode ON/OFF or TRUE/FALSE or 1/0 + enable_supernovae ON/OFF or TRUE/FALSE or 1/0 + enable_tracing ON/OFF or TRUE/FALSE or 1/0 + enable_coverage ON/OFF or TRUE/FALSE or 1/0 + enable_memcheck ON/OFF or TRUE/FALSE or 1/0 + enable_model-checking ON/OFF or TRUE/FALSE or 1/0 + enable_debug ON/OFF or TRUE/FALSE or 1/0 + enable_jedule ON/OFF or TRUE/FALSE or 1/0 + enable_latency_bound_tracking ON/OFF or TRUE/FALSE or 1/0 + enable_lib_static ON/OFF or TRUE/FALSE or 1/0 + custom_flags + gtnets_path + CMAKE_INSTALL_PREFIX + CMAKE_C_COMPILER + CMAKE_CXX_COMPILER + pipol_user +\endverbatim + +\subsubsection installSimgrid_cmakeoption2 Options explaination + + \li enable_gtnets : set to true implie that user wants to use gtnets. + + \li enable_lua : set to true implie that user wants to add lua langage into simgrid compilation. + + \li enable_compile_optimizations : add flags "-O3 -finline-functions -funroll-loops -fno-strict-aliasing" + + \li enable_compile_warnings : add flags "-Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror" + + \li enable_smpi : Set to true if you want to use smpi lib. Actually on simgrid v3.4.1 Mac doesn't support lib smpi. + + \li enable_maintainer_mode : set to true it remakes some files. + + \li enable_supernovae : set to true make one file for each lib and compile with those generated files. + + \li enable_tracing : To enable the generation of simulation traces for visualization. + + \li enable_coverage : When set to true this option enable code coverage by setting -fprofile-arcs -ftest-coverage flags. + + \li enable_memcheck : When set to true this option enable tests for memcheck. + + \li enable_model-checking : Enable the model checking when set to true. + + \li enable_debug : If enable_debug is set to 'off' Simgrid compil flag has '-DNDEBUG' option. + + \li enable_jedule : To enable jedule mode, which creates visualizations of task schedules with Simdag. + + \li enable_latency_bound_tracking : Set to on if you want to be warned when communications are limited by round trip time. + + \li enable_lib_static : Enable generated Simgrid and smpi static libraries. + + \li custom_flags : If user wants to use a specific flag during compilation, give here. + + \li gtnets_path : Path to gtnets install directory (ex /usr) + + \li CMAKE_INSTALL_PREFIX : Path where are installed lib/ doc/ and include/ directories (ex /usr/local) + + \li CMAKE_C_COMPILER : Change the c compiler. + + \li CMAKE_CXX_COMPILER : Change the c++ compiler. + + \li pipol_user : specify your pipol username if you want to use the pipol-remote command. + +\subsubsection installSimgrid_cmakeoption3 Initialisation + +Those options are initialized the first time you launch "cmake ." whithout specified option. + +\verbatim +enable_gtnets on +enable_lua on +enable_smpi on +enable_supernovae on +enable_tracing on +enable_compile_optimizations on +enable_debug on +enable_compile_warnings off +enable_maintainer_mode off +enable_coverage off +enable_memcheck off +enable_model-checking off +enable_jedule off +enable_latency_bound_tracking off +enable_lib_static off +CMAKE_INSTALL_PREFIX /usr/local +custom_flags null +gtnets_path null +pipol_user null +\endverbatim + +\subsubsection installSimgrid_cmakeoption4 Option's cache and how to reset? + +When options have been set they are keep into a cache file named "CMakeCache.txt". So if you want +reset values you just delete this file located to the project directory. + +\subsection installSimgrid_cmakecompilation Cmake compilation + +\subsubsection installSimgrid_cmakecompilation1 With command line. + +On Unix or Mac platform: + +\verbatim +cmake -D[name]=[value] ... ./ +make +\endverbatim + +On Windows platform: + +\verbatim +cmake -G"Unix Makefiles" -D[name]=[value] ... ./ +gmake +\endverbatim + +\subsubsection installSimgrid_cmakecompilation2 With ccmake tool. + +\verbatim +"ccmake ./" +\endverbatim +Then follow instructions. + +\subsubsection installSimgrid_cmakecompilation2bis Build out of source. + +As cmake generate many files used for compilation, we recommand to make a build directory. +For examples you can make : + +\verbatim +"navarrop@caraja:~/Developments$ cd simgrid/" +"navarrop@caraja:~/Developments/simgrid$ mkdir build_directory" +"navarrop@caraja:~/Developments/simgrid$ cd build_directory/" +"navarrop@caraja:~/Developments/simgrid/build_directory$ cmake ../" +"navarrop@caraja:~/Developments/simgrid/build_directory$ make" +\endverbatim + +Or complety out of sources : + +\verbatim +"navarrop@caraja:~/Developments$ mkdir build_dir" +"navarrop@caraja:~/Developments$ cd build_dir/" +"navarrop@caraja:~/Developments/build_dir$ cmake ../simgrid/" +"navarrop@caraja:~/Developments/build_dir$ make" +\endverbatim + +Those two kind of compilation permit to delete files created by compilation easier. + +\subsubsection installSimgrid_cmakecompilation3 Resume of command line + + \li CMake +\verbatim +cmake configure the project for Unix and Mac +cmake -G"Unix Makefiles" configure the project for Windows +make build all targets for Unix and Mac +gmake buill all targets for windows +(g)make VERBOSE=1 build all targets and print build command lines +make check test all targets and summarize +make dist make the distrib +make distcheck check the dist (make + make dist + make check) +(g)make install install the project (doc/ bin/ lib/ include/) +(g)make uninstall uninstall the project (doc/ bin/ lib/ include/) +(g)make clean clean all targets +make simgrid_documentation Create simgrid documentation +\endverbatim + +When the project have been succesfully compiling and build you can make tests. + + \li CTest +\verbatim +ctest launch only tests +ctest -D Continuous +ctest -D Continuous(Start|Update|Configure|Build) +ctest -D Continuous(Test|Coverage|MemCheck|Submit) +ctest -D Experimental +ctest -D Experimental(Start|Update|Configure|Build) +ctest -D Experimental(Test|Coverage|MemCheck|Submit) +ctest -D Nightly +ctest -D Nightly(Start|Update|Configure|Build) +ctest -D Nightly(Test|Coverage|MemCheck|Submit) +ctest -D NightlyMemoryCheck +\endverbatim + +If you want to test before make a commit you can simply make "ctest -D Experimental" and then you can visualize results submitted into Cdash. (Go to Cdash site). + +\subsection installSimgrid_cmakeinstall How to install with cmake? + +\subsubsection installSimgrid_cmakeinstall1 From Git. + +\verbatim +git clone git://scm.gforge.inria.fr/simgrid/simgrid.git simgrid +cd simgrid +cmake -Denable_maintainer_mode=on -DCMAKE_INSTALL_PREFIX=/home/navarrop/Bureau/install_simgrid ./ +make +make install +\endverbatim + +\subsubsection installSimgrid_cmakeinstall2 From a distrib + +\verbatim +wget https://gforge.inria.fr/frs/download.php/28674/simgrid-3.6.1.tar.gz +tar xf simgrid-3.6.1.tar.gz +cd simgrid-3.6.1 +cmake -DCMAKE_INSTALL_PREFIX=/home/navarrop/Bureau/install_simgrid ./ +make +make install +\endverbatim + + +\subsection installSimgrid_cmakehowto How to modified sources files for developers + +\subsubsection installSimgrid_cmakehowto1 Add an executable or examples. + +If you want make an executable you have to create a CMakeList.txt to the src directory. +You must specified where to create the executable, source list, dependencies and the name of the binary. + +\verbatim +cmake_minimum_required(VERSION 2.6) + +set(EXECUTABLE_OUTPUT_PATH "./") +set(LIBRARY_OUTPUT_PATH "${CMAKE_HOME_DIRECTORY}/lib") + +add_executable(get_sender get_sender.c) #add_executable( ) + +### Add definitions for compile +target_link_libraries(get_sender simgrid m pthread) #target_link_libraries( ) +\endverbatim + +Then you have to modified /buildtools/Cmake/MakeExeLib.cmake and add +this line : +\verbatim +add_subdirectory(${CMAKE_HOME_DIRECTORY}/) +\endverbatim + +\subsubsection installSimgrid_cmakehowto2 Delete/add sources to lib. + +If you want modified, add or delete source files from a library you have to edit /buildtools/Cmake/DefinePackages.cmake + +\verbatim +set(JMSG_JAVA_SRC + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/MsgException.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/JniException.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/NativeException.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/HostNotFoundException.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/ProcessNotFoundException.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Msg.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Process.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Host.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Task.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/MsgNative.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/ApplicationHandler.java + ${CMAKE_HOME_DIRECTORY}/src/java/simgrid/msg/Sem.java +) +\endverbatim + +\section installSimgrid_Win Installing the SimGrid library with Windows pakage + +\subsection installSimgrid_Win_install Installing SimGrid + +Before start the installation, you need to be sure to have the following dependencies: + \li cmake 2.8 (download page) + \li perl strawberry (download page) + \li git (download page) + +Then download the package SimGrid Installer, +execute it and follow instructions. + +\htmlonly + +\endhtmlonly + +Step 1: Accept the license. + +\htmlonly + +\endhtmlonly + +Step 2: Select packets to install. + +\htmlonly + +\endhtmlonly + +Step 3: Choice where to install packets previously selected. Please don't use spaces in path. + +\htmlonly + +\endhtmlonly + +Step 4: Restart your computer to take in consideration environment variables. + +\subsection installSimgrid_Win_compile1 Compile a project "HelloWorld" + +In the SimGrid install directroy you should have an HelloWorld project to explain you how to start +compiling a source file. There are: +\verbatim +- HelloWorld.c The example source file. +- CMakeLists.txt It allows to configure the project. +- FindPCRE.cmake This finds and links to the pcre library (Normally included into Simgrid directory "GnuWin32"). +- README This explaination. +\endverbatim + +Now let's compil this example: +\li Run "Git bash" (installed with git) or windows shell "cmd". +\li Open HelloWorld Directory ('cd' command line). +\li Create a build directory and change directory. (optional) +\li Type 'cmake -G"Unix Makefiles" \' +\li Run gmake +\li You should obtain a runnable example ("HelloWorld.exe"). + +For compiling your own code you can simply copy the HelloWorld project and rename source name. It will +create a target with the same name of the source. + +\subsection installSimgrid_Win_compile2 How to add and compile a new example + +\li Put your source file into the helloWord directory. +\li Edit CMakeLists.txt by removing the Find Targets section and add those two lines into this section +\verbatim +################ +# FIND TARGETS # +################ +add_executable(TARGET_NAME SOURCES) #It creates a target called 'TARGET_NAME.exe' with the sources 'SOURCES' +target_link_libraries(TARGET_NAME simgrid pcre) #Links TARGET_NAME with simgrid and pcre +\endverbatim +\li To initialize and build your project, you'll need to run +\verbatim +cmake -G"Unix Makefiles" \ +\endverbatim +\li Run "gmake" +\li You should obtain "TARGET_NAME.exe". + +\section installSimgrid_setting_MSG Setting up your own MSG code + +Do not build your simulator by modifying the SimGrid examples. Go +outside the SimGrid source tree and create your own working directory +(say /home/joe/SimGrid/MyFirstScheduler/). + +Suppose your simulation has the following structure (remember it is +just an example to illustrate a possible way to compile everything; +feel free to organize it as you want). + + \li sched.h: a description of the core of the + scheduler (i.e. which functions are can be used by the + agents). For example we could find the following functions + (master, forwarder, slave). + + \li sched.c: a C file including sched.h and + implementing the core of the scheduler. Most of these + functions use the MSG functions defined in section \ref + msg_gos_functions. + + \li masterslave.c: a C file with the main function, i.e. + the MSG initialization (MSG_global_init()), the platform + creation (e.g. with MSG_create_environment()), the + deployment phase (e.g. with MSG_function_register() and + MSG_launch_application()) and the call to + MSG_main()). + +To compile such a program, we suggest to use the following +Makefile. It is a generic Makefile that we have used many times with +our students when we teach the C language. + +\verbatim +all: masterslave +masterslave: masterslave.o sched.o + +INSTALL_PATH = $$HOME +CC = gcc +PEDANTIC_PARANOID_FREAK = -O0 -Wshadow -Wcast-align \ + -Waggregate-return -Wmissing-prototypes -Wmissing-declarations \ + -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations \ + -Wmissing-noreturn -Wredundant-decls -Wnested-externs \ + -Wpointer-arith -Wwrite-strings -finline-functions +REASONABLY_CAREFUL_DUDE = -Wall +NO_PRAYER_FOR_THE_WICKED = -w -O2 +WARNINGS = $(REASONABLY_CAREFUL_DUDE) +CFLAGS = -g $(WARNINGS) + +INCLUDES = -I$(INSTALL_PATH)/include +DEFS = -L$(INSTALL_PATH)/lib/ +LDADD = -lm -lsimgrid +LIBS = + +%: %.o + $(CC) $(INCLUDES) $(DEFS) $(CFLAGS) $^ $(LIBS) $(LDADD) -o $@ + +%.o: %.c + $(CC) $(INCLUDES) $(DEFS) $(CFLAGS) -c -o $@ $< + +clean: + rm -f $(BIN_FILES) *.o *~ +.SUFFIXES: +.PHONY : clean + +\endverbatim + +The first two lines indicates what should be build when typing make +(masterslave) and of which files it is to be made of +(masterslave.o and sched.o). This makefile assumes +that you have set up correctly your LD_LIBRARY_PATH variable +(look, there is a LDADD = -lm -lsimgrid). If you prefer using +the static version, remove the -lsimgrid and add a +$(INSTALL_PATH)/lib/libsimgrid.a on the next line, right +after the LIBS = . + +More generally, if you have never written a Makefile by yourself, type +in a terminal : info make and read the introduction. The +previous example should be enough for a first try but you may want to +perform some more complex compilations... + +\section installSimgrid_setting_GRAS Setting up your own GRAS code + +If you use the GRAS interface instead of the MSG one, then previous section +is not the better source of information. Instead, you should check the GRAS +tutorial in general, and the \ref GRAS_tut_tour_setup in particular. + + + +*/ diff --git a/doc/module-msg.doc b/doc/module-msg.doc index d05ddb574e..7c7eec6508 100644 --- a/doc/module-msg.doc +++ b/doc/module-msg.doc @@ -425,7 +425,7 @@ - \ref MSG_ext_ms_platform - \dontinclude lua/master_slave.lua + \dontinclude lua/masterslave/master_slave.lua \section MSG_ext_ms_code_lua Code of the application @@ -478,7 +478,7 @@ - \ref MSG_ext_ms_core_lua - \dontinclude lua/master_slave_bypass.lua + \dontinclude lua/console/master_slave_bypass.lua \section MSG_ext_ms_code_lua Code of the application diff --git a/doc/options.doc b/doc/options.doc new file mode 100644 index 0000000000..8badcdc5d2 --- /dev/null +++ b/doc/options.doc @@ -0,0 +1,80 @@ +/*! \page options Simgrid options and configurations + +\htmlinclude .options.doc.toc + +\section options_simgrid_configuration Changing SimGrid's behavior + +A number of options can be given at runtime to change the default +SimGrid behavior. In particular, you can change the default cpu and +network models... + +\subsection options_simgrid_configuration_fullduplex Using Fullduplex + +Experimental fullduplex support is now available on the svn branch. In order to fullduple to work your platform must have two links for each pair +of interconnected hosts, see an example here: +\verbatim + simgrid_svn_sources/exemples/msg/gtnets/fullduplex-p.xml +\endverbatim + +Using fullduplex support ongoing and incoming communication flows are +treated independently for most models. The exception is the LV08 model which +adds 0.05 of usage on the opposite direction for each new created flow. This +can be useful to simulate some important TCP phenomena such as ack compression. + +Running a fullduplex example: +\verbatim + cd simgrid_svn_sources/exemples/msg/gtnets + ./gtnets fullduplex-p.xml fullduplex-d.xml --cfg=fullduplex:1 +\endverbatim + +\subsection options_simgrid_configuration_alternate_network Using alternative flow models + +The default simgrid network model uses a max-min based approach as +explained in the research report +A Network Model for Simulation of Grid Application. +Other models have been proposed and implemented since then (see for example +Accuracy Study and Improvement of Network Simulation in the SimGrid Framework) +and can be activated at runtime. For example: +\verbatim +./mycode platform.xml deployment.xml --cfg=workstation/model:compound --cfg=network/model:LV08 -cfg=cpu/model:Cas01 +\endverbatim + +Possible models for the network are currently "Constant", "CM02", +"LegrandVelho", "GTNets", Reno", "Reno2", "Vegas". Others will +probably be added in the future and many of the previous ones are +experimental and are likely to disappear without notice... To know the +list of the currently implemented models, you should use the +--help-models command line option. + +\verbatim +./masterslave_forwarder ../small_platform.xml deployment_masterslave.xml --help-models +Long description of the workstation models accepted by this simulator: + CLM03: Default workstation model, using LV08 and CM02 as network and CPU + compound: Workstation model allowing you to use other network and CPU models + ptask_L07: Workstation model with better parallel task modeling +Long description of the CPU models accepted by this simulator: + Cas01_fullupdate: CPU classical model time=size/power + Cas01: Variation of Cas01_fullupdate with partial invalidation optimization of lmm system. Should produce the same values, only faster + CpuTI: Variation of Cas01 with also trace integration. Should produce the same values, only faster if you use availability traces +Long description of the network models accepted by this simulator: + Constant: Simplistic network model where all communication take a constant time (one second) + CM02: Realistic network model with lmm_solve and no correction factors + LV08: Realistic network model with lmm_solve and these correction factors: latency*=10.4, bandwidth*=.92, S=8775 + Reno: Model using lagrange_solve instead of lmm_solve (experts only) + Reno2: Model using lagrange_solve instead of lmm_solve (experts only) + Vegas: Model using lagrange_solve instead of lmm_solve (experts only) +\endverbatim + +\section options_modelchecking Model-Checking +\subsection options_modelchecking_howto How to use it +To enable the experimental SimGrid model-checking support the program should +be executed with the command line argument +\verbatim +--cfg=model-check:1 +\endverbatim +Properties are expressed as assertions using the function +\verbatim +void MC_assert(int prop); +\endverbatim + +*/ \ No newline at end of file diff --git a/doc/people.doc b/doc/people.doc deleted file mode 100644 index 39754211af..0000000000 --- a/doc/people.doc +++ /dev/null @@ -1,126 +0,0 @@ -/*! \page people People around SimGrid - -\section core_team Core team - -SimGrid is a joint project between University of Hawai at Manoa, LIG Laboratory -(INRIA MEScal project, Grenoble, France) and University of Nancy (INRIA -Algorille project, Nancy, France). The authors of SimGrid are: - - - - Henri Casanova (Information and Computer Sciences Department, University of Hawai`i at Manoa) - - Arnaud Legrand (CNRS, LIG Laboratory (Grenoble, France), INRIA MEScal project) - - Martin Quinson (University of Nancy I (Nancy, France), LORIA Laboratory, INRIA Algorille project) - -\section contributers Contributers and alumni project members - - - Mark Stilwell: wrote SMPI during his PhD. Thesis in Hawai`i (2006-???) - - Pedro Velho: wrote the Lagrange solver to improve the network - sharing in SURF during his PhD. Thesis in Grenoble (2006-???). - - Bruno Donassolo: wrote SIMIX during his master internship in - Grenoble. Ported GRAS and MSG to SIMIX. (2007) - - Kayo Fujiwara: wrote the gtnets interface with SURF during her - master at Hawai`i and studied the cost and accuracy of network - simulation in the simgrid framework (2006-2007). - - Malek Cherrier: ported the environment to Windows, designed the - Java bindings and worked on the software quality during a two year - engineer position in the INRIA Grand Est (2006-2008). - - Christophe Thiery: brought back the old SG to life with SimDag during a - two months internship (june-july 2006) in the INRIA Grand Est. - - Loris Marchal: designed the algorithm for simulation TCP bandwidth-sharing - during a two-months internship (june-july 2002) in UCSD. - - Julien Lerouge : wrote a XML parser for ENV descriptions and helped for - the general design during a 4 months internship (march-june 2002) - in the ENS-Lyon. - - Clément Menier and Marc Perache : wrote a prototype of the MSG - interface during a project at ENS-Lyon (jan 2002). - - Dmitrii Zagorodnov : wrote some parts of the first version of SimGrid - (1999) at University of California at San Diego. - -\section users Users - -Here is a list of people who co-signed at least one paper using -results produced with SimGrid (not counting the papers describing the -framework itself): - - - Cyril Banino-Rokkones: Norwegian University of Science and Technology. - - Olivier Beaumont: Univ. Bordeaux 1, France. - - Francine Berman: San Diego Supercomputer Center, USA. - - Vandy Berten: Univ. of Brussels, Belgium. - - Adam Birnbaum: San Diego Supercomputer Center, USA. - - Vincent Boudet: Univ. Montpellier 2, France. - - Fransisco Brasileiro: Univ. Federal de Campina Grande, Brazil. - - - Yves Caniou: ENS-Lyon, France. - - Yudith Cardinale: Univ. Simon Boliar, Venezuela. - - Eddy Caron: ENS-Lyon, France. - - Larry Carter: Univ. of California at San Diego, USA. - - Henri Casanova: Univ. of Hawai'i, Manoa, USA. - - Walfredo Cirne: Univ. Federal de Campina Grande, Brazil. - - - Frédéric Desprez: INRIA, Lyon, France. - - César De Rose: Faculty of Informatics - PUCRS, Brazil. - - N. Dimopoulos: Univ. of Victoria, Canada. - - - Lionel Eyraud-Dubois: INRIA, Bordeaux, France. - - - Marcio Faerman: San Diego Supercomputer Center, USA. - - Thomas Ferrandiz: Univ. Joseph Fourrier, Grenoble, France. - - Jeanne Ferrante: Univ. of California at San Diego, USA. - - Tiago Ferreto: Faculty of Informatics - PUCRS, Brazil. - - - Vincent Garonne: CNRS-IN2P3, Lyon, France. - - Bruno Gaujal: INRIA, Grenoble, France. - - Jean-Sébastien Gay: ENS-Lyon, France. - - - Makoto Imase: Osaka University, Japan. - - - Emmanuel Jeannot: INRIA, Nancy, France. - - - Barbara Kreaseck: La Sierra Univ., San Diego, USA. - - - Arnaud Legrand: CNRS, Grenoble, France. - - Aliandro Lima: Univ. Federal de Campina Grande, Brazil. - - - Vania Marangozova: Univ. Joseph Fourrier, Grenoble, France. - - Loris Marchal: CNRS, Lyon, France. - - - Sagnik Nandy: Univ. of California at San Diego, USA. - - W. Nascimento: Univ. Catolica de Santos, Sao Paolo, Brazil. - - Lasse Natvig: Norwegian University of Science and Technology. - - Caio Northfleet: HP, Brazil. - - Tchimou N'Takpé: Univ. Henri Poincaré, Nancy, France. - - - Hiroyuki Ohsaki: Osaka University, Japan. - - - R. Parra-Hernandez: Univ. of Victoria, Canada. - - Franck Petit: Univ. Jules Verne, Amiens, France. - - - Martin Quinson: Univ. Henri Poincaré, Nancy, France. - - - Héléne Renard: Univ. Nice, France. - - Yves Robert: INRIA, Lyon, France. - - - Elizeu Santos-Neto: Univ. Federal de Campina Grande, Brazil. - - H. Senger: Univ. Catolica de Santos, Sao Paolo, Brazil. - - F. Silva: Univ. Catolica de Santos, Sao Paolo, Brazil. - - Shava Smallen: Univ. of California at San Diego, USA. - - R. Sobie: The Institute of Particle Physics of Canada. - - Frédéric Suter: Univ. Henri Poincaré, Nancy, France. - - - Andrei Tsaregorodtsev: CNRS-IN2P3, Lyon, France. - - - D. Vanderster: Univ. of Victoria, Canada. - - Vincent Villain: Univ. Jules Verne, Amiens, France. - - Frédéric Vivien: INRIA, Lyon, France. - - - Soushi Watanabe: Osaka University, Japan. - - - Xiao Xie: Jiao Tong University, Shanghai, China. - - - Yang Yang: Univ. of California at San Diego, USA. - - Wensheng Yao: Jiao Tong University, Shanghai, China. - - Jinyuan You: Jiao Tong University, Shanghai, China. - - - Dmitrii Zagorodnov: Univ. of California at Santa Barbara, USA. - -*/ \ No newline at end of file diff --git a/doc/pls.doc b/doc/pls.doc new file mode 100644 index 0000000000..b411e751a2 --- /dev/null +++ b/doc/pls.doc @@ -0,0 +1,241 @@ +/*! \page pls Packet level simulation + +\htmlinclude .pls.doc.toc + +It is possible to use a packet-level network simulator +instead of the default flow-based simulation. You may want to use such +an approach if you have doubts about the validity of the default model +or if you want to perform some validation experiments. At the moment, +we support the GTNetS simulator and since version 3.6.2, ns-3. + + +\section pls_simgrid_configuration_gtnets Using GTNetS + + + +To enable GTNetS model inside SimGrid it is needed to patch the GTNetS simulator source code +and build/install it from scratch + + + - Download and enter the recent downloaded GTNetS directory + +\verbatim +svn checkout svn://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/GTNetS/ +cd GTNetS +\endverbatim + + + - Use the following commands to unzip and patch GTNetS package to work within SimGrid. + +\verbatim +unzip gtnets-current.zip +tar zxvf gtnets-current-patch.tgz +cd gtnets-current +cat ../00*.patch | patch -p1 +\endverbatim + + - OPTIONALLY you can use a patch for itanium 64bit processor family. + +\verbatim +cat ../AMD64-FATAL-Removed-DUL_SIZE_DIFF-Added-fPIC-compillin.patch | patch -p1 +\endverbatim + + - Compile GTNetS + + Due to portability issues it is possible that GTNetS does not compile in your architecture. The patches furnished in SimGrid SVN repository are intended for use in Linux architecture only. Unfortunately, we do not have the time, the money, neither the manpower to guarantee GTNetS portability. We advice you to use one of GTNetS communication channel to get more help in compiling GTNetS. + + +\verbatim +ln -sf Makefile.linux Makefile +make depend +make debug +\endverbatim + + + - NOTE A lot of warnings are expected but the application should compile + just fine. If the makefile insists in compiling some QT libraries + please try a make clean before asking for help. + + + - To compile optimized version + +\verbatim +make opt +\endverbatim + + + - Installing GTNetS + + It is important to put the full path of your libgtsim-xxxx.so file when creating the symbolic link. Replace < userhome > by some path you have write access to. + +\verbatim +ln -sf //gtnets_current/libgtsim-debug.so //usr/lib/libgtnets.so +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH://usr/lib/libgtnets.so +mkdir //usr/include/gtnets +cp -fr SRC/*.h //usr/include/gtnets +\endverbatim + + + - Enable GTNetS support in SimGrid + +In order to enable gtnets with simgrid you have to give where is gtnets. (path to \/lib and \/include) + +\verbatim +cmake . -Denable_gtnets=ON -Dgtnets_path=//usr +\endverbatim + + - Once you have followed all the instructions for compiling and + installing successfully you can activate this feature at + runntime with the following options: + +\verbatim +cd simgrid +make +ctest -R gtnets +\endverbatim + + + - Or try the GTNetS model dogbone example with + +\verbatim +gtnets/gtnets gtnets/onelink-p.xml gtnets/onelink-d.xml --cfg=network_model:GTNets +\endverbatim + + + A long version of this HowTo it is available + + + More about GTNetS simulator at GTNetS Website + + + - DISCLAIMER + The patches provided by us worked successfully with GTNetS found + here, + dated from 12th June 2008. Due to the discontinuing development of + GTNetS it is impossible to precise a version number. We STRONGLY recommend you + to download and install the GTNetS version found in SimGrid repository as explained above. + +\section pls_simgrid_configuration_ns3 Using NS3 + +It is possible to use discrete-event network simulator (ns-3) for Internet systems +instead of the default one. + +A ns-3 platform is created according to the platform file you provide in SimGrid format. However from this configuration, we had to set up some extra parameters : + +
    +
  • +First, whenever possible, we let default ns3 values and we don't changed it ; in case you have doubts on values for those parameters (TCP parameters for example), blame ns-3... +
  • + +
  • +Second, routing used inside ns-3 is a global and static one, relying on a shortest path algorithm. We did so by using ns3::Ipv4GlobalRoutingHelper::PopulateRoutingTables. +
  • + +
  • +Third, we also choose to restrict the way your platform is built : end hosts cannot have more than one interface card (so, only one <link> in your SimGrid platform should link +an end host to the platform ; if not, your end host will be considered as a router. +
  • + +
+ +To use ns3 model inside SimGrid you have to install at least the version 3.10 of ns3 simulator. + + +- Download and enter the lateast release (here the 3.12.1) + +\verbatim +http://www.nsnam.org/release/ns-allinone-3.12.1.tar.bz2 +tar -xf ns-allinone-3.12.1.tar.bz2 +cd ns-allinone-3.12.1/ns-3.12.1/ +\endverbatim + +- Configure, make and install ns3 + +\verbatim +./waf configure --prefix="ns-3_install_directory" +./waf +./waf install +\endverbatim + +After install ns-3 you should have directories into your "ns-3_install_directory": + \li include/ns3/ + \li lib/ + \li bin/ (with 3.12) + +You also need to add to the LD_LIBRARY_PATH : "ns-3_install_directory/lib". + +- Enable ns-3 support on SimGrid + +In order to enable ns-3 with simgrid you have to give where is ns-3 to the simgrid configuration command. (path to \/lib and \/include) + +\verbatim +cmake . -Denable_ns3=ON -Dns3_path= +\endverbatim + +With the output of the configuration you can see if ns-3 is detected by included the directory to flags. + +\verbatim +Configuration of package `simgrid' on arch (=4): + BUILDNAME : UNIX + SITE : Linux_2.6.38-11-generic_x86_64 + Release : simgrid-3.6.1 + + Compiler: c++ : /usr/bin/c++ + version: 4.6.1 + Compiler: c : /usr/bin/gcc + version: 4.6.1 + + CFlags : -O3 -finline-functions -funroll-loops -fno-strict-aliasing -L/usr/lib/x86_64-linux-gnu -I/usr/include + -L/home/navarrop/Install/ns3-3.10/lib -I/home/navarrop/Install/ns3-3.10/include -g3 -D_NS3_3_10 + CPPFlags: -I/home/navarrop/Install/ns3-3.10/include -L/home/navarrop/Install/ns3-3.10/lib + + Compile Gtnets : 0 + Compile NS-3 : 1 ---------------------> Be sure this option is "1" otherwise ns-3 is not activated + Gtnets path : + NS-3 path : /home/navarrop/Install/ns3-3.10 + Compile Lua : + Compile Smpi : OFF + Compile Static : OFF + Compile pcre : AUTO + + Maintainer mode: OFF + Supernovae mode: OFF + Model checking : OFF + Tracing mode : OFF + Jedule mode : OFF + Latency bound : OFF + Graphviz mode : + + Simgrid dependencies: -lm -lpcre -lpthread -lns3 -lrt + Gras dependencies : -lm -lpthread -lrt + Smpi dependencies : + + INSTALL_PREFIX: /usr/local +-- Configuring done +-- Generating done +-- Build files have been written to: /home/navarrop/workspace/simgrid/build +\endverbatim + +Now you can compile SimGrid +\verbatim +make +\endverbatim + +Then you can see if ns-3 is well activated by testing +\verbatim +ctest -R ns3 +\endverbatim + +You should see +\verbatim + Start 182: msg-ns3-thread +1/3 Test #182: msg-ns3-thread ................... Passed 0.35 sec + Start 183: msg-ns3-ucontext +2/3 Test #183: msg-ns3-ucontext ................. Passed 0.22 sec + Start 184: msg-ns3-raw +3/3 Test #184: msg-ns3-raw ...................... Passed 0.23 sec +\endverbatim + +More about ns-3 simulator (Official website) + +*/ diff --git a/doc/publis.doc b/doc/publis.doc deleted file mode 100644 index 130e6d119b..0000000000 --- a/doc/publis.doc +++ /dev/null @@ -1,86 +0,0 @@ -/*! \page publis Reference publications about SimGrid - - -When citing SimGrid, the prefered reference paper is SimGrid: a -Generic Framework for Large-Scale Distributed Experimentations. - -\li SimGrid: a Generic Framework for Large-Scale Distributed - Experimentations\n - by Henri Casanova, Arnaud Legrand and Martin Quinson\n - Proceedings of the 10th IEEE International Conference on Computer - Modelling and Simulation (UKSIM/EUROSIM'08)\n - Distributed computing is a very broad and active research area - comprising fields such as cluster computing, computational - grids, desktop grids and peer-to-peer (P2P) systems. - Unfortunately, it is often impossible to obtain theoretical or - analytical results to compare the performance of algorithms - targeting such systems. One possibility is to conduct large - numbers of back-to-back experiments on real platforms. While - this is possible on tightly-coupled platforms, it is infeasible - on modern distributed platforms as experiments are labor-intensive - and results typically not reproducible. Consequently, one must - resort to simulations, which enable reproducible results and also - make it possible to explore wide ranges of platform and - application scenarios.\n - In this paper we describe the SimGrid framework, a - simulation-based framework for evaluating cluster, grid and P2P - algorithms and heuristics. This paper focuses on SimGrid v3, which - greatly improves on previous versions thanks to a novel and - validated modular simulation engine that achieves higher - simulation speed without hindering simulation accuracy. Also, two - new user interfaces were added to broaden the targeted research - community. After surveying existing tools and methodologies we - describe the key features and benefits of SimGrid.\n - http://www.loria.fr/~quinson/articles/SimGrid-uksim08.pdf - -\verbatim -@InProceedings{simgrid, - author = {Casanova, Henri and Legrand, Arnaud and Quinson, Martin}, - title = {{SimGrid: a Generic Framework for Large-Scale Distributed Experiments}}, - booktitle = {10th IEEE International Conference on Computer Modeling and Simulation}, - year = 2008, - month = mar -} -\endverbatim - -\section publis_others Other publications - -A lot of other papers where published about SimGrid. The list is -splited in 3 pages (also accessible from the navbar on top of this page): - - \ref publis_core\n - This section contains papers describing some sub-parts of SimGrid, - or references superseeded by the one given above. - - \ref publis_extern\n - SimGrid is used by an ever growing scientific community. This - section lists all the papers resulting of works in which the core - SimGrid team were not involved. - - \ref publis_intra\n - This section lists the paper co-signed by at least one of the core - team member, and using SimGrid as a tool (and not studying SimGrid - itself). - -\section publis_count Amount of published papers using SimGrid results - -\htmlinclude publis_count.html - -\page publis_core Publications about the SimGrid framework - -\htmlinclude publis_core_bib.html - -\page publis_extern Papers that use SimGrid-generated results (not counting our owns) - -This list is a selection of articles. We list only papers written by people -external to the development group, but we also use our tool ourselves (see -next section). - -\htmlinclude publis_extern_bib.html - -\page publis_intra Our own papers that use SimGrid-generated results - -This list is a selection of the articles we have written that used results -generated by SimGrid. - -\htmlinclude publis_intra_bib.html - - -*/ diff --git a/doc/tracing.doc b/doc/tracing.doc new file mode 100644 index 0000000000..4a7fe288c0 --- /dev/null +++ b/doc/tracing.doc @@ -0,0 +1,1171 @@ +/*! \page tracing Tracing Simulations for Visualization + +\htmlinclude .tracing.doc.toc + +\section tracing_tracing Tracing Simulations for Visualization + +The trace visualization is widely used to observe and understand the behavior +of parallel applications and distributed algorithms. Usually, this is done in a +two-step fashion: the user instruments the application and the traces are +analyzed after the end of the execution. The visualization itself can highlights +unexpected behaviors, bottlenecks and sometimes can be used to correct +distributed algorithms. The SimGrid team has instrumented the library +in order to let users trace their simulations and analyze them. This part of the +user manual explains how the tracing-related features can be enabled and used +during the development of simulators using the SimGrid library. + +\subsection tracing_tracing_howitworks How it works + +For now, the SimGrid library is instrumented so users can trace the platform +utilization using the MSG, SimDAG and SMPI interface. This means that the tracing will +register how much power is used for each host and how much bandwidth is used for +each link of the platform. The idea with this type of tracing is to observe the +overall view of resources utilization in the first place, especially the +identification of bottlenecks, load-balancing among hosts, and so on. + +The idea of the tracing facilities is to give SimGrid users to possibility to +classify MSG and SimDAG tasks by category, tracing the platform utilization +(hosts and links) for each of the categories. For that, +the tracing interface enables the declaration of categories and a function to +mark a task with a previously declared category. The tasks that are not +classified according to a category are not traced. Even if the user +does not specify any category, the simulations can still be traced in terms +of resource utilization by using a special parameter that is detailed below. + +\subsection tracing_tracing_enabling Enabling using CMake + +With the sources of SimGrid, it is possible to enable the tracing +using the parameter -Denable_tracing=ON when the cmake is executed. +The section \ref tracing_tracing_functions describes all the functions available +when this Cmake options is activated. These functions will have no effect +if SimGrid is configured without this option (they are wiped-out by the +C-preprocessor). + +\verbatim +$ cmake -Denable_tracing=ON . +$ make +\endverbatim + +\subsection tracing_tracing_functions Tracing Functions + +\li \c TRACE_category (const char *category): This function should be used +to define a user category. The category can be used to differentiate the tasks +that are created during the simulation (for example, tasks from server1, +server2, or request tasks, computation tasks, communication tasks). +All resource utilization (host power and link bandwidth) will be +classified according to the task category. Tasks that do not belong to a +category are not traced. The color for the category that is being declared +is random (use next function to specify a color). + +\li \c TRACE_category_with_color (const char *category, const char *color): Same +as TRACE_category, but let user specify a color encoded as a RGB-like string with +three floats from 0 to 1. So, to specify a red color, the user can pass "1 0 0" as +color parameter. A light-gray color can be specified using "0.7 0.7 0.7" as color. + +\li \c TRACE_msg_set_task_category (m_task_t task, const char *category): +This function should be called after the creation of a MSG task, to define the +category of that task. The first parameter \c task must contain a task that was +created with the function \c MSG_task_create. The second parameter +\c category must contain a category that was previously defined by the function +\c TRACE_category. + +\li \c TRACE_sd_set_task_category (SD_task_t task, const char *category): +This function should be called after the creation of a SimDAG task, to define the +category of that task. The first parameter \c task must contain a task that was +created with the function \c MSG_task_create. The second parameter +\c category must contain a category that was previously defined by the function +\c TRACE_category. + +\li \c TRACE_[host|link]_variable_declare (const char *variable): +Declare a user variable that will be associated to host/link. A variable can +be used to trace user variables such as the number of tasks in a server, +the number of clients in an application (for hosts), and so on. + +\li \c TRACE_[host|link]_variable_[set|add|sub] (const char *[host|link], const char *variable, double value): +Set the value of a given user variable for a given host/link. The value +of this variable is always associated to the host/link. The host/link +parameters should be its name as the one listed in the platform file. + +\li \c TRACE_[host|link]_variable_[set|add|sub]_with_time (double time, const char *[host|link], const char *variable, double value): +Same as TRACE_[host|link]_variable_[set|add|sub], but let user specify +the time used to trace it. Users can specify a time that is not the +simulated clock time as defined by the core simulator. This allows +a fine-grain control of time definition, but should be used with +caution since the trace can be inconsistent if resource utilization +traces are also traced. + +\li \c TRACE_link_srcdst_variable_[set|add|sub] (const char *src, const char *dst, const char *variable, double value): +Same as TRACE_link_variable_[set|add|sub], but now users specify a source and +destination hosts (as the names from the platform file). The tracing library +will get the corresponding route that connects those two hosts (src and dst) and +[set|add|sub] the value's variable for all the links of the route. + +\li \c TRACE_link_srcdst_variable_[set|add|sub]_with_time (double time, const char *src, const char *dst, const char *variable, double value): +Same as TRACE_link_srcdst_variable_[set|add|sub], but user specify a time different from the simulated time. + +\subsection tracing_tracing_options Tracing configuration Options + +To check which tracing options are available for your simulator, you +can just run it with the option --help-tracing. These are the +options accepted by the tracing system of SimGrid as of today, you +can use them by running your simulator with the --cfg= switch: + +\li \c +tracing +: + Safe switch. It activates (or deactivates) the tracing system. + No other tracing options take effect if this one is not activated. +\verbatim +--cfg=tracing:1 +\endverbatim + +\li \c +tracing/categorized +: + It activates the categorized resource utilization tracing. It should + be enabled if tracing categories are used by this simulator. +\verbatim +--cfg=tracing/categorized:1 +\endverbatim + +\li \c +tracing/uncategorized +: + It activates the uncategorized resource utilization tracing. Use it if + this simulator do not use tracing categories and resource use have to be + traced. +\verbatim +--cfg=tracing/uncategorized:1 +\endverbatim + +\li \c +tracing/filename +: + A file with this name will be created to register the simulation. The file + is in the Paje format and can be analyzed using Triva or Paje visualization + tools. More information can be found in these webpages: + http://triva.gforge.inria.fr/ + http://paje.sourceforge.net/ +\verbatim +--cfg=tracing/filename:mytracefile.trace +\endverbatim + If you do not provide this parameter, the trace file will be named simgrid.trace. + +\li \c +tracing/onelink_only +: + By default, the tracing system uses all routes in the platform file + to re-create a "graph" of the platform and register it in the trace file. + This option let the user tell the tracing system to use only the routes + that are composed with just one link. +\verbatim +--cfg=tracing/onelink_only:1 +\endverbatim + +\li \c +tracing/smpi +: + This option only has effect if this simulator is SMPI-based. Traces the MPI + interface and generates a trace that can be analyzed using Gantt-like + visualizations. Every MPI function (implemented by SMPI) is transformed in a + state, and point-to-point communications can be analyzed with arrows. +\verbatim +--cfg=tracing/smpi:1 +\endverbatim + +\li \c +tracing/smpi/group +: + This option only has effect if this simulator is SMPI-based. The processes + are grouped by the hosts where they were executed. +\verbatim +--cfg=tracing/smpi/group:1 +\endverbatim + +\li \c +tracing/msg/task +: + This option only has effect if this simulator is MSG-based. It traces the + behavior of all categorized MSG tasks, grouping them by hosts. +\verbatim +--cfg=tracing/msg/task:1 +\endverbatim + +\li \c +tracing/msg/process +: + This option only has effect if this simulator is MSG-based. It traces the + behavior of all categorized MSG processes, grouping them by hosts. This option + can be used to track process location if this simulator has process migration. +\verbatim +--cfg=tracing/msg/process:1 +\endverbatim + +\li \c +triva/categorized +: + This option generates a graph configuration file for Triva considering + categorized resource utilization. +\verbatim +--cfg=triva/categorized:graph_categorized.plist +\endverbatim + +\li \c +triva/uncategorized +: + This option generates a graph configuration file for Triva considering + uncategorized resource utilization. +\verbatim +--cfg=triva/categorized:graph_uncategorized.plist +\endverbatim + +\subsection tracing_tracing_example_parameters Case studies + +Some scenarios that might help you decide which tracing options +you should use to analyze your simulator. + +\li I want to trace the resource utilization of all hosts +and links of the platform, and my simulator does not use +the tracing API. For that, you can run a uncategorized trace +with the following parameters (it will work with any Simgrid +simulator): +\verbatim +./your_simulator \ + --cfg=tracing:1 \ + --cfg=tracing/uncategorized:1 \ + --cfg=tracing/filename:mytracefile.trace \ + --cfg=triva/uncategorized:uncat.plist +\endverbatim + +\li I want to trace only a subset of my MSG (or SimDAG) tasks. +For that, you will need to create tracing categories using the +TRACE_category (...) function (as explained above), +and then classify your tasks to a previously declared category +using the TRACE_msg_set_task_category (...) +(or TRACE_sd_set_task_category (...) for SimDAG tasks). After +recompiling, run your simulator with the following parameters: +\verbatim +./your_simulator \ + --cfg=tracing:1 \ + --cfg=tracing/categorized:1 \ + --cfg=tracing/filename:mytracefile.trace \ + --cfg=triva/categorized:cat.plist +\endverbatim + + +\subsection tracing_tracing_example Example of Instrumentation + +A simplified example using the tracing mandatory functions. + +\verbatim +int main (int argc, char **argv) +{ + MSG_global_init (&argc, &argv); + + //(... after deployment ...) + + //note that category declaration must be called after MSG_create_environment + TRACE_category_with_color ("request", "1 0 0"); + TRACE_category_with_color ("computation", "0.3 1 0.4"); + TRACE_category ("finalize"); + + m_task_t req1 = MSG_task_create("1st_request_task", 10, 10, NULL); + m_task_t req2 = MSG_task_create("2nd_request_task", 10, 10, NULL); + m_task_t req3 = MSG_task_create("3rd_request_task", 10, 10, NULL); + m_task_t req4 = MSG_task_create("4th_request_task", 10, 10, NULL); + TRACE_msg_set_task_category (req1, "request"); + TRACE_msg_set_task_category (req2, "request"); + TRACE_msg_set_task_category (req3, "request"); + TRACE_msg_set_task_category (req4, "request"); + + m_task_t comp = MSG_task_create ("comp_task", 100, 100, NULL); + TRACE_msg_set_task_category (comp, "computation"); + + m_task_t finalize = MSG_task_create ("finalize", 0, 0, NULL); + TRACE_msg_set_task_category (finalize, "finalize"); + + //(...) + + MSG_clean(); + return 0; +} +\endverbatim + +\subsection tracing_tracing_analyzing Analyzing the SimGrid Traces + +The SimGrid library, during an instrumented simulation, creates a trace file in +the Paje file format that contains the platform utilization for the simulation +that was executed. The visualization analysis of this file is performed with the +visualization tool Triva, with +special configurations tunned to SimGrid needs. This part of the documentation +explains how to configure and use Triva to analyse a SimGrid trace file. + +- Installing Triva: the tool is available in the INRIAGforge, +at http://triva.gforge.inria.fr. +Use the following command to get the sources, and then check the file +INSTALL. This file contains instructions to install +the tool's dependencies in a Ubuntu/Debian Linux. The tool can also +be compiled in MacOSes natively, check INSTALL.mac file. +\verbatim +$ svn checkout svn://scm.gforge.inria.fr/svn/triva +$ cd triva +$ cat INSTALL +\endverbatim + +- Executing Triva: a binary called Triva is available after the + installation (you can execute it passing --help to check its +options). If the triva binary is not available after following the +installation instructions, you may want to execute the following command to +initialize the GNUstep environment variables. We strongly recommend that you +use the latest GNUstep packages, and not the packages available through apt-get +in Ubuntu/Debian packaging systems. If you install GNUstep using the latest +available packages, you can execute this command: +\verbatim +$ source /usr/GNUstep/System/Library/Makefiles/GNUstep.sh +\endverbatim +You should be able to see this output after the installation of triva: +\verbatim +$ ./Triva.app/Triva --help +Usage: Triva [OPTIONS...] TRACE0 [TRACE1] +Trace Analysis through Visualization + +TimeInterval + --ti_frequency {double} Animation: frequency of updates + --ti_hide Hide the TimeInterval window + --ti_forward {double} Animation: value to move time-slice + --ti_apply Apply the configuration + --ti_update Update on slider change + --ti_animate Start animation + --ti_start {double} Start of time slice + --ti_size {double} Size of time slice +Triva + --comparison Compare Trace Files (Experimental) + --graph Configurable Graph + --list Print Trace Type Hierarchy + --hierarchy Export Trace Type Hierarchy (dot) + --stat Trace Statistics and Memory Utilization + --instances List All Trace Entities + --linkview Link View (Experimental) + --treemap Squarified Treemap + --merge Merge Trace Files (Experimental) + --check Check Trace File Integrity +GraphConfiguration + --gc_conf {file} Graph Configuration in Property List Format + --gc_apply Apply the configuration + --gc_hide Hide the GraphConfiguration window +\endverbatim +Triva expects that the user choose one of the available options +(currently --graph or --treemap for a visualization analysis) +and the trace file from the simulation. + +- Understanding Triva - time-slice: the analysis of a trace file using + the tool always takes into account the concept of the time-slice. +This concept means that what is being visualized in the screen is always +calculated considering a specific time frame, with its beggining and end +timestamp. The time-slice is configured by the user and can be changed +dynamically through the window called Time Interval that is opened +whenever a trace file is being analyzed. The next figure depicts the time-slice +configuration window. +In the top of the window, in the space named Trace Time, +the two fields show the beggining of the trace (which usually starts in 0) and +the end (that depends on the time simulated by SimGrid). The middle of the +window, in the square named Time Slice Configuration, contains the +aspects related to the time-slice, including its start and its +size. The gray rectangle in the bottom of this part indicates the +current time-slice that is considered for the drawings. If the checkbox +Update Drawings on Sliders Change is not selected, the button +Apply must be clicked in order to inform triva that the +new time-slice must be considered. The bottom part of the window, in the space +indicated by the square Time Slice Animation can be used to advance +the time-frame automatically. The user configures the amount of time that the +time-frame will forward and how frequent this update will happen. Once this is +configured, the user clicks the Play button in order to see the dynamic +changes on the drawings. +
+\htmlonly + +\endhtmlonly +
+Remarks: when the trace has too many hosts or links, the computation to +take into account a new time-slice can be expensive. When this happens, the +Frequency parameter, but also updates caused by change on configurations +when the checkbox Update Drawings on Sliders +Change is selected will not be followed. + +- Understanding Triva - graph: this part of the documention explains how + to analyze the traces using the graph view of Triva, when the user executes +the tool passing --graph as parameter. Triva opens three windows when +this parameter is used: the Time Interval window (previously described), +the Graph Representation window, and the Graph Configuration +window. The Graph Representation is the window where drawings take place. +Initially, it is completely white waiting for a proper graph configuration input +by the user. We start the description of this type of analysis by describing the +Graph Configuration window (depicted below). By using a particular +configuration, triva +can be used to customize the graph drawing according to +the SimGrid trace that was created with user-specific categories. Before delving +into the details of this customization, let us first explain the major parts of +the graph configuration window. The buttons located in the top-right corner can +be used to delete, copy and create a new configuration. The checkbox in the +top-middle part of the window indicates if the configuration typed in the +textfield is syntactically correct (we are using the non-XML +Property List Format to +describe the configuration). The pop-up button located on the top-left corner +indicates the selected configuration (the user can have multiple graph +configurations). The bottom-left text field contains the name of the current +configuration (updates on this field must be followed by typing enter on the +keyboard to take into account the name change). The bottom-right Apply +button activates the current configuration, resulting on an update on the graph +drawings. +
+\htmlonly + +\endhtmlonly +
+Basic SimGrid Configuration: The figure shows in the big textfield the +basic configuration that should be used during the analysis of a SimGrid trace +file. The basic logic of the configuration is as follows: +\verbatim +{ + node = (HOST); + edge = (LINK); +\endverbatim +The nodes of the graph will be created based on the node parameter, which +in this case is the different "HOST"s of the platform +used to simulate. The edge parameter indicates that the edges of the +graph will be created based on the "LINK"s of the platform. After the +definition of these two parameters, the configuration must detail how +HOSTs and LINKs should be drawn. For that, the configuration +must have an entry for each of the types used. For HOST, as basic +configuration, we have: +\verbatim + HOST = { + size = power; + scale = global; + }; +\endverbatim +The parameter size indicates which variable from the trace file will be +used to define the size of the node HOST in the visualization. If the simulation +was executed with availability traces, the size of the nodes will be changed +according to these traces. The parameter scale indicates if the value +of the variable is global or local. If it is global, the value +will be relative to the power of all other hosts, if it is local, the value will +be relative locally. +For LINK we have: +\verbatim + LINK = { + src = source; + dst = destination; + + size = bandwidth; + scale = global; + }; +\endverbatim +For the types specified in the edge parameter (such as LINK), +the configuration must contain two additional parameters: src and +dst that are used to properly identify which nodes this edge is +connecting. The values source and destination are always present +in the SimGrid trace file and should not be changed in the configuration. The +parameter size for the LINK, in this case, is configured as the +variable bandwidth, with a global scale. The scale meaning +here is exactly the same used for nodes. The last parameter is the GraphViz +algorithm used to calculate the position of the nodes in the graph +representation. +\verbatim + graphviz-algorithm = neato; +} +\endverbatim +Customizing the Graph Representation: triva is capable to handle +a customized graph representation based on the variables present in the trace +file. In the case of SimGrid, every time a category is created for tasks, two +variables in the trace file are defined: one to indicate node utilization (how +much power was used by that task category), and another to indicate link +utilization (how much bandwidth was used by that category). For instance, if the +user declares a category named request, there will be variables named +prequest and a brequest (p for power and +b for bandwidth). It is important to notice that the variable +prequest in this case is only available for HOST, and +brequest is only available for LINK. Example: suppose there are +two categories for tasks: request and compute. To create a customized graph +representation with a proportional separation of host and link utilization, use +as configuration for HOST and LINK this: +\verbatim + HOST = { + size = power; + scale = global; + + sep_host = { + type = separation; + size = power; + values = (prequest, pcomputation); + }; + }; + + LINK = { + src = source; + dst = destination; + size = bandwidth; + scale = global; + + sep_link = { + type = separation; + size = bandwidth; + values = (brequest, bcomputation); + }; + }; +\endverbatim +Where sep_host contains a composition of type separation where +its max size is the power of the host and the variables prequest +and pcomputation are drawn proportionally to the size of the HOST. And +sep_link is also a separation where max is defined as the +bandwidth of the link, and the variables brequest and +bcomputation are drawn proportionally within a LINK. +This configuration enables the analysis of resource utilization by MSG tasks, +and the identification of load-balancing issues, network bottlenecks, for +instance. \n +Other compositions: besides separation, it is possible to use +other types of compositions, such as gradients, and colors, like this: +\verbatim + gra_host = { + type = gradient; + scale = global; + values = (numberOfTasks); + }; + color_host = { + type = color; + values = (is_server); + }; +\endverbatim +Where gra_host creates a gradient within a node of the graph, using a +global scale and using as value a variable called numberOfTasks, that +could be declared by the user using the optional tracing functions of SimGrid. +If scale is global, the max and min value for the gradient will be equal to the +max and min numberOfTasks among all hosts, and if scale is local, the max and +min value based on the value of numberOfTasks locally in each host. +And color_host composition draws a square based on a positive value of +the variable is_server, that could also be defined by the user using the +SimGrid tracing functions. \n +The Graph Visualization: The next figure shows a graph visualization of a +given time-slice of the masterslave_forwarder example (present in the SimGrid +sources). The red color indicates tasks from the compute category. This +visualization was generated with the following configuration: +\verbatim +{ + node = (HOST); + edge = (LINK); + + HOST = { + size = power; + scale = global; + + sep_host = { + type = separation; + size = power; + values = (pcompute, pfinalize); + }; + }; + LINK = { + src = source; + dst = destination; + size = bandwidth;\section tracing_tracing Tracing Simulations for Visualization + +The trace visualization is widely used to observe and understand the behavior +of parallel applications and distributed algorithms. Usually, this is done in a +two-step fashion: the user instruments the application and the traces are +analyzed after the end of the execution. The visualization itself can highlights +unexpected behaviors, bottlenecks and sometimes can be used to correct +distributed algorithms. The SimGrid team has instrumented the library +in order to let users trace their simulations and analyze them. This part of the +user manual explains how the tracing-related features can be enabled and used +during the development of simulators using the SimGrid library. + +\subsection tracing_tracing_howitworks How it works + +For now, the SimGrid library is instrumented so users can trace the platform +utilization using the MSG, SimDAG and SMPI interface. This means that the tracing will +register how much power is used for each host and how much bandwidth is used for +each link of the platform. The idea with this type of tracing is to observe the +overall view of resources utilization in the first place, especially the +identification of bottlenecks, load-balancing among hosts, and so on. + +The idea of the tracing facilities is to give SimGrid users to possibility to +classify MSG and SimDAG tasks by category, tracing the platform utilization +(hosts and links) for each of the categories. For that, +the tracing interface enables the declaration of categories and a function to +mark a task with a previously declared category. The tasks that are not +classified according to a category are not traced. Even if the user +does not specify any category, the simulations can still be traced in terms +of resource utilization by using a special parameter that is detailed below. + +\subsection tracing_tracing_enabling Enabling using CMake + +With the sources of SimGrid, it is possible to enable the tracing +using the parameter -Denable_tracing=ON when the cmake is executed. +The section \ref tracing_tracing_functions describes all the functions available +when this Cmake options is activated. These functions will have no effect +if SimGrid is configured without this option (they are wiped-out by the +C-preprocessor). + +\verbatim +$ cmake -Denable_tracing=ON . +$ make +\endverbatim + +\subsection tracing_tracing_functions Tracing Functions + +\li \c TRACE_category (const char *category): This function should be used +to define a user category. The category can be used to differentiate the tasks +that are created during the simulation (for example, tasks from server1, +server2, or request tasks, computation tasks, communication tasks). +All resource utilization (host power and link bandwidth) will be +classified according to the task category. Tasks that do not belong to a +category are not traced. The color for the category that is being declared +is random (use next function to specify a color). + +\li \c TRACE_category_with_color (const char *category, const char *color): Same +as TRACE_category, but let user specify a color encoded as a RGB-like string with +three floats from 0 to 1. So, to specify a red color, the user can pass "1 0 0" as +color parameter. A light-gray color can be specified using "0.7 0.7 0.7" as color. + +\li \c TRACE_msg_set_task_category (m_task_t task, const char *category): +This function should be called after the creation of a MSG task, to define the +category of that task. The first parameter \c task must contain a task that was +created with the function \c MSG_task_create. The second parameter +\c category must contain a category that was previously defined by the function +\c TRACE_category. + +\li \c TRACE_sd_set_task_category (SD_task_t task, const char *category): +This function should be called after the creation of a SimDAG task, to define the +category of that task. The first parameter \c task must contain a task that was +created with the function \c MSG_task_create. The second parameter +\c category must contain a category that was previously defined by the function +\c TRACE_category. + +\li \c TRACE_[host|link]_variable_declare (const char *variable): +Declare a user variable that will be associated to host/link. A variable can +be used to trace user variables such as the number of tasks in a server, +the number of clients in an application (for hosts), and so on. + +\li \c TRACE_[host|link]_variable_[set|add|sub] (const char *[host|link], const char *variable, double value): +Set the value of a given user variable for a given host/link. The value +of this variable is always associated to the host/link. The host/link +parameters should be its name as the one listed in the platform file. + +\li \c TRACE_[host|link]_variable_[set|add|sub]_with_time (double time, const char *[host|link], const char *variable, double value): +Same as TRACE_[host|link]_variable_[set|add|sub], but let user specify +the time used to trace it. Users can specify a time that is not the +simulated clock time as defined by the core simulator. This allows +a fine-grain control of time definition, but should be used with +caution since the trace can be inconsistent if resource utilization +traces are also traced. + +\li \c TRACE_link_srcdst_variable_[set|add|sub] (const char *src, const char *dst, const char *variable, double value): +Same as TRACE_link_variable_[set|add|sub], but now users specify a source and +destination hosts (as the names from the platform file). The tracing library +will get the corresponding route that connects those two hosts (src and dst) and +[set|add|sub] the value's variable for all the links of the route. + +\li \c TRACE_link_srcdst_variable_[set|add|sub]_with_time (double time, const char *src, const char *dst, const char *variable, double value): +Same as TRACE_link_srcdst_variable_[set|add|sub], but user specify a time different from the simulated time. + +\subsection tracing_tracing_options Tracing configuration Options + +These are the options accepted by the tracing system of SimGrid: + +\li \c +tracing +: + Safe switch. It activates (or deactivates) the tracing system. + No other tracing options take effect if this one is not activated. + +\li \c +tracing/platform +: + Register the simulation platform in the trace file. + +\li \c +tracing/onelink_only +: + By default, the tracing system uses all routes in the platform file + to re-create a "graph" of the platform and register it in the trace file. + This option let the user tell the tracing system to use only the routes + that are composed with just one link. + +\li \c +tracing/categorized +: + It activates the categorized resource utilization tracing. It should + be enabled if tracing categories are used by this simulator. + +\li \c +tracing/uncategorized +: + It activates the uncategorized resource utilization tracing. Use it if + this simulator do not use tracing categories and resource use have to be + traced. + +\li \c +tracing/filename +: + A file with this name will be created to register the simulation. The file + is in the Paje format and can be analyzed using Triva or Paje visualization + tools. More information can be found in these webpages: + http://triva.gforge.inria.fr/ + http://paje.sourceforge.net/ + +\li \c +tracing/smpi +: + This option only has effect if this simulator is SMPI-based. Traces the MPI + interface and generates a trace that can be analyzed using Gantt-like + visualizations. Every MPI function (implemented by SMPI) is transformed in a + state, and point-to-point communications can be analyzed with arrows. + +\li \c +tracing/smpi/group +: + This option only has effect if this simulator is SMPI-based. The processes + are grouped by the hosts where they were executed. + +\li \c +tracing/msg/task +: + This option only has effect if this simulator is MSG-based. It traces the + behavior of all categorized MSG tasks, grouping them by hosts. + +\li \c +tracing/msg/process +: + This option only has effect if this simulator is MSG-based. It traces the + behavior of all categorized MSG processes, grouping them by hosts. This option + can be used to track process location if this simulator has process migration. + + +\li \c +triva/categorized:graph_categorized.plist +: + This option generates a graph configuration file for Triva considering + categorized resource utilization. + +\li \c +triva/uncategorized:graph_uncategorized.plist +: + This option generates a graph configuration file for Triva considering + uncategorized resource utilization. + +\subsection tracing_tracing_example Example of Instrumentation + +A simplified example using the tracing mandatory functions. + +\verbatim +int main (int argc, char **argv) +{ + MSG_global_init (&argc, &argv); + + //(... after deployment ...) + + //note that category declaration must be called after MSG_create_environment + TRACE_category_with_color ("request", "1 0 0"); + TRACE_category_with_color ("computation", "0.3 1 0.4"); + TRACE_category ("finalize"); + + m_task_t req1 = MSG_task_create("1st_request_task", 10, 10, NULL); + m_task_t req2 = MSG_task_create("2nd_request_task", 10, 10, NULL); + m_task_t req3 = MSG_task_create("3rd_request_task", 10, 10, NULL); + m_task_t req4 = MSG_task_create("4th_request_task", 10, 10, NULL); + TRACE_msg_set_task_category (req1, "request"); + TRACE_msg_set_task_category (req2, "request"); + TRACE_msg_set_task_category (req3, "request"); + TRACE_msg_set_task_category (req4, "request"); + + m_task_t comp = MSG_task_create ("comp_task", 100, 100, NULL); + TRACE_msg_set_task_category (comp, "computation"); + + m_task_t finalize = MSG_task_create ("finalize", 0, 0, NULL); + TRACE_msg_set_task_category (finalize, "finalize"); + + //(...) + + MSG_clean(); + return 0; +} +\endverbatim + +\subsection tracing_tracing_analyzing Analyzing the SimGrid Traces + +The SimGrid library, during an instrumented simulation, creates a trace file in +the Paje file format that contains the platform utilization for the simulation +that was executed. The visualization analysis of this file is performed with the +visualization tool Triva, with +special configurations tunned to SimGrid needs. This part of the documentation +explains how to configure and use Triva to analyse a SimGrid trace file. + +- Installing Triva: the tool is available in the INRIAGforge, +at http://triva.gforge.inria.fr. +Use the following command to get the sources, and then check the file +INSTALL. This file contains instructions to install +the tool's dependencies in a Ubuntu/Debian Linux. The tool can also +be compiled in MacOSes natively, check INSTALL.mac file. +\verbatim +$ svn checkout svn://scm.gforge.inria.fr/svn/triva +$ cd triva +$ cat INSTALL +\endverbatim + +- Executing Triva: a binary called Triva is available after the + installation (you can execute it passing --help to check its +options). If the triva binary is not available after following the +installation instructions, you may want to execute the following command to +initialize the GNUstep environment variables. We strongly recommend that you +use the latest GNUstep packages, and not the packages available through apt-get +in Ubuntu/Debian packaging systems. If you install GNUstep using the latest +available packages, you can execute this command: +\verbatim +$ source /usr/GNUstep/System/Library/Makefiles/GNUstep.sh +\endverbatim +You should be able to see this output after the installation of triva: +\verbatim +$ ./Triva.app/Triva --help +Usage: Triva [OPTIONS...] TRACE0 [TRACE1] +Trace Analysis through Visualization + +TimeInterval + --ti_frequency {double} Animation: frequency of updates + --ti_hide Hide the TimeInterval window + --ti_forward {double} Animation: value to move time-slice + --ti_apply Apply the configuration + --ti_update Update on slider change + --ti_animate Start animation + --ti_start {double} Start of time slice + --ti_size {double} Size of time slice +Triva + --comparison Compare Trace Files (Experimental) + --graph Configurable Graph + --list Print Trace Type Hierarchy + --hierarchy Export Trace Type Hierarchy (dot) + --stat Trace Statistics and Memory Utilization + --instances List All Trace Entities + --linkview Link View (Experimental) + --treemap Squarified Treemap + --merge Merge Trace Files (Experimental) + --check Check Trace File Integrity +GraphConfiguration + --gc_conf {file} Graph Configuration in Property List Format + --gc_apply Apply the configuration + --gc_hide Hide the GraphConfiguration window +\endverbatim +Triva expects that the user choose one of the available options +(currently --graph or --treemap for a visualization analysis) +and the trace file from the simulation. + +- Understanding Triva - time-slice: the analysis of a trace file using + the tool always takes into account the concept of the time-slice. +This concept means that what is being visualized in the screen is always +calculated considering a specific time frame, with its beggining and end +timestamp. The time-slice is configured by the user and can be changed +dynamically through the window called Time Interval that is opened +whenever a trace file is being analyzed. The next figure depicts the time-slice +configuration window. +In the top of the window, in the space named Trace Time, +the two fields show the beggining of the trace (which usually starts in 0) and +the end (that depends on the time simulated by SimGrid). The middle of the +window, in the square named Time Slice Configuration, contains the +aspects related to the time-slice, including its start and its +size. The gray rectangle in the bottom of this part indicates the +current time-slice that is considered for the drawings. If the checkbox +Update Drawings on Sliders Change is not selected, the button +Apply must be clicked in order to inform triva that the +new time-slice must be considered. The bottom part of the window, in the space +indicated by the square Time Slice Animation can be used to advance +the time-frame automatically. The user configures the amount of time that the +time-frame will forward and how frequent this update will happen. Once this is +configured, the user clicks the Play button in order to see the dynamic +changes on the drawings. +
+\htmlonly + +\endhtmlonly +
+Remarks: when the trace has too many hosts or links, the computation to +take into account a new time-slice can be expensive. When this happens, the +Frequency parameter, but also updates caused by change on configurations +when the checkbox Update Drawings on Sliders +Change is selected will not be followed. + +- Understanding Triva - graph: this part of the documention explains how + to analyze the traces using the graph view of Triva, when the user executes +the tool passing --graph as parameter. Triva opens three windows when +this parameter is used: the Time Interval window (previously described), +the Graph Representation window, and the Graph Configuration +window. The Graph Representation is the window where drawings take place. +Initially, it is completely white waiting for a proper graph configuration input +by the user. We start the description of this type of analysis by describing the +Graph Configuration window (depicted below). By using a particular +configuration, triva +can be used to customize the graph drawing according to +the SimGrid trace that was created with user-specific categories. Before delving +into the details of this customization, let us first explain the major parts of +the graph configuration window. The buttons located in the top-right corner can +be used to delete, copy and create a new configuration. The checkbox in the +top-middle part of the window indicates if the configuration typed in the +textfield is syntactically correct (we are using the non-XML +Property List Format to +describe the configuration). The pop-up button located on the top-left corner +indicates the selected configuration (the user can have multiple graph +configurations). The bottom-left text field contains the name of the current +configuration (updates on this field must be followed by typing enter on the +keyboard to take into account the name change). The bottom-right Apply +button activates the current configuration, resulting on an update on the graph +drawings. +
+\htmlonly + +\endhtmlonly +
+Basic SimGrid Configuration: The figure shows in the big textfield the +basic configuration that should be used during the analysis of a SimGrid trace +file. The basic logic of the configuration is as follows: +\verbatim +{ + node = (HOST); + edge = (LINK); +\endverbatim +The nodes of the graph will be created based on the node parameter, which +in this case is the different "HOST"s of the platform +used to simulate. The edge parameter indicates that the edges of the +graph will be created based on the "LINK"s of the platform. After the +definition of these two parameters, the configuration must detail how +HOSTs and LINKs should be drawn. For that, the configuration +must have an entry for each of the types used. For HOST, as basic +configuration, we have: +\verbatim + HOST = { + size = power; + scale = global; + }; +\endverbatim +The parameter size indicates which variable from the trace file will be +used to define the size of the node HOST in the visualization. If the simulation +was executed with availability traces, the size of the nodes will be changed +according to these traces. The parameter scale indicates if the value +of the variable is global or local. If it is global, the value +will be relative to the power of all other hosts, if it is local, the value will +be relative locally. +For LINK we have: +\verbatim + LINK = { + src = source; + dst = destination; + + size = bandwidth; + scale = global; + }; +\endverbatim +For the types specified in the edge parameter (such as LINK), +the configuration must contain two additional parameters: src and +dst that are used to properly identify which nodes this edge is +connecting. The values source and destination are always present +in the SimGrid trace file and should not be changed in the configuration. The +parameter size for the LINK, in this case, is configured as the +variable bandwidth, with a global scale. The scale meaning +here is exactly the same used for nodes. The last parameter is the GraphViz +algorithm used to calculate the position of the nodes in the graph +representation. +\verbatim + graphviz-algorithm = neato; +} +\endverbatim +Customizing the Graph Representation: triva is capable to handle +a customized graph representation based on the variables present in the trace +file. In the case of SimGrid, every time a category is created for tasks, two +variables in the trace file are defined: one to indicate node utilization (how +much power was used by that task category), and another to indicate link +utilization (how much bandwidth was used by that category). For instance, if the +user declares a category named request, there will be variables named +prequest and a brequest (p for power and +b for bandwidth). It is important to notice that the variable +prequest in this case is only available for HOST, and +brequest is only available for LINK. Example: suppose there are +two categories for tasks: request and compute. To create a customized graph +representation with a proportional separation of host and link utilization, use +as configuration for HOST and LINK this: +\verbatim + HOST = { + size = power; + scale = global; + + sep_host = { + type = separation; + size = power; + values = (prequest, pcomputation); + }; + }; + + LINK = { + src = source; + dst = destination; + size = bandwidth; + scale = global; + + sep_link = { + type = separation; + size = bandwidth; + values = (brequest, bcomputation); + }; + }; +\endverbatim +Where sep_host contains a composition of type separation where +its max size is the power of the host and the variables prequest +and pcomputation are drawn proportionally to the size of the HOST. And +sep_link is also a separation where max is defined as the +bandwidth of the link, and the variables brequest and +bcomputation are drawn proportionally within a LINK. +This configuration enables the analysis of resource utilization by MSG tasks, +and the identification of load-balancing issues, network bottlenecks, for +instance. \n +Other compositions: besides separation, it is possible to use +other types of compositions, such as gradients, and colors, like this: +\verbatim + gra_host = { + type = gradient; + scale = global; + values = (numberOfTasks); + }; + color_host = { + type = color; + values = (is_server); + }; +\endverbatim +Where gra_host creates a gradient within a node of the graph, using a +global scale and using as value a variable called numberOfTasks, that +could be declared by the user using the optional tracing functions of SimGrid. +If scale is global, the max and min value for the gradient will be equal to the +max and min numberOfTasks among all hosts, and if scale is local, the max and +min value based on the value of numberOfTasks locally in each host. +And color_host composition draws a square based on a positive value of +the variable is_server, that could also be defined by the user using the +SimGrid tracing functions. \n +The Graph Visualization: The next figure shows a graph visualization of a +given time-slice of the masterslave_forwarder example (present in the SimGrid +sources). The red color indicates tasks from the compute category. This +visualization was generated with the following configuration: +\verbatim +{ + node = (HOST); + edge = (LINK); + + HOST = { + size = power; + scale = global; + + sep_host = { + type = separation; + size = power; + values = (pcompute, pfinalize); + }; + }; + LINK = { + src = source; + dst = destination; + size = bandwidth; + scale = global; + + sep_link = { + type = separation; + size = bandwidth; + values = (bcompute, bfinalize); + }; + }; + graphviz-algorithm = neato; +} +\endverbatim +
+\htmlonly + +\endhtmlonly +
+ +- Understading Triva - colors: An important issue when using Triva is how + to define colors. To do that, we have to know which variables are defined in +the trace file generated by the SimGrid library. The parameter --list +lists the variables for a given trace file: +\verbatim +$ Triva -l masterslave_forwarder.trace +iFile +c platform +c HOST +v power +v is_slave +v is_master +v task_creation +v task_computation +v pcompute +v pfinalize +c LINK +v bandwidth +v latency +v bcompute +v bfinalize +c user_type +\endverbatim +We can see that HOST has seven variables (from power to pfinalize) and LINK has +four (from bandwidth to bfinalize). To define a red color for the +pcompute and bcompute (which are defined based on user category +compute), execute: +\verbatim +$ defaults write Triva 'pcompute Color' '1 0 0' +$ defaults write Triva 'bcompute Color' '1 0 0' +\endverbatim +Where the three numbers in each line are the RGB color with values from 0 to 1. +\verbatim + scale = global; + + sep_link = { + type = separation; + size = bandwidth; + values = (bcompute, bfinalize); + }; + }; + graphviz-algorithm = neato; +} +\endverbatim +
+\htmlonly + +\endhtmlonly +
+ +- Understading Triva - colors: An important issue when using Triva is how + to define colors. To do that, we have to know which variables are defined in +the trace file generated by the SimGrid library. The parameter --list +lists the variables for a given trace file: +\verbatim +$ Triva -l masterslave_forwarder.trace +iFile +c platform +c HOST +v power +v is_slave +v is_master +v task_creation +v task_computation +v pcompute +v pfinalize +c LINK +v bandwidth +v latency +v bcompute +v bfinalize +c user_type +\endverbatim +We can see that HOST has seven variables (from power to pfinalize) and LINK has +four (from bandwidth to bfinalize). To define a red color for the +pcompute and bcompute (which are defined based on user category +compute), execute: +\verbatim +$ defaults write Triva 'pcompute Color' '1 0 0' +$ defaults write Triva 'bcompute Color' '1 0 0' +\endverbatim +Where the three numbers in each line are the RGB color with values from 0 to 1. + +*/ \ No newline at end of file diff --git a/doc/use.doc b/doc/use.doc new file mode 100644 index 0000000000..2f1ff4ee6c --- /dev/null +++ b/doc/use.doc @@ -0,0 +1,23 @@ +/*! \page use Using SimGrid + +\section use_generic First steps with SimGrid + +If you decide to go for the MSG interface, please read carefully the +\ref MSG_examples. You'll find in \ref MSG_ex_master_slave a very +simple consisting of a master (that owns a bunch of tasks and +distributes them) , some slaves (that process tasks whenever they +receive one) and some forwarder agents (that simply pass the tasks +they receive to some slaves). + +If you decide to go for the GRAS interface, you should definitively +read the \ref GRAS_tut. The first section constitutes an introduction +to the tool and presents the model we use. The second section +constitutes a complete step-by-step tutorial building a distributed +application from the beginning and exemplifying most of the GRAS +features in the process. The last section groups some HOWTOS +highlighting a given feature of the framework in a more concise way. + +If you decide to go for another interface, I'm afraid your only sources +of information will be the source code and the mailing lists... + +*/ \ No newline at end of file diff --git a/doc/webcruft/SimGrid.ico b/doc/webcruft/SimGrid.ico new file mode 100644 index 0000000000..619a707afb Binary files /dev/null and b/doc/webcruft/SimGrid.ico differ diff --git a/doc/webcruft/robots.txt b/doc/webcruft/robots.txt deleted file mode 100644 index 7ce4fc9e84..0000000000 --- a/doc/webcruft/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Allow: * diff --git a/doc/webcruft/simgrid_logo_smaller.png b/doc/webcruft/simgrid_logo_smaller.png new file mode 100644 index 0000000000..bcaf7b869e Binary files /dev/null and b/doc/webcruft/simgrid_logo_smaller.png differ diff --git a/doc/webcruft/simgrid_logo_win.bmp b/doc/webcruft/simgrid_logo_win.bmp new file mode 100644 index 0000000000..bb32badb32 Binary files /dev/null and b/doc/webcruft/simgrid_logo_win.bmp differ diff --git a/doc/webcruft/win_install_01.png b/doc/webcruft/win_install_01.png new file mode 100644 index 0000000000..f7ab9805a0 Binary files /dev/null and b/doc/webcruft/win_install_01.png differ diff --git a/doc/webcruft/win_install_02.png b/doc/webcruft/win_install_02.png new file mode 100644 index 0000000000..42d082d6d2 Binary files /dev/null and b/doc/webcruft/win_install_02.png differ diff --git a/doc/webcruft/win_install_03.png b/doc/webcruft/win_install_03.png new file mode 100644 index 0000000000..a6c51d4811 Binary files /dev/null and b/doc/webcruft/win_install_03.png differ diff --git a/doc/webcruft/win_install_04.png b/doc/webcruft/win_install_04.png new file mode 100644 index 0000000000..b3fc6bbc5f Binary files /dev/null and b/doc/webcruft/win_install_04.png differ diff --git a/examples/amok/bandwidth/bandwidth.c b/examples/amok/bandwidth/bandwidth.c index 533b03a7ae..d2e232544f 100644 --- a/examples/amok/bandwidth/bandwidth.c +++ b/examples/amok/bandwidth/bandwidth.c @@ -39,7 +39,8 @@ int sensor(int argc, char *argv[]) TRY { master = gras_socket_client_from_string(argv[1]); connected = 1; - } CATCH(e) { + } + CATCH(e) { xbt_ex_free(e); } if (!connected) { diff --git a/examples/amok/saturate/env.c b/examples/amok/saturate/env.c index 5ad45e392c..e2d00f5c9b 100644 --- a/examples/amok/saturate/env.c +++ b/examples/amok/saturate/env.c @@ -67,8 +67,6 @@ static void env_hosttohost_bw(int argc, char *argv[]) /********************************************************************************************/ static void env_Pairwisehost_bw(int argc, char *argv[]) { - xbt_ex_t e; - /* where are the sensors */ xbt_dynar_t hosts = xbt_dynar_new(sizeof(xbt_host_t), &free_host); int nb_hosts; @@ -107,7 +105,7 @@ static void env_Pairwisehost_bw(int argc, char *argv[]) amok_bw_saturate_start(h1->name, h1->port, host_test, h1->port, //"Ginette" msg_size, 120); // sturation of the link with msg_size to compute a concurent bandwidth MA //MB } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Cannot ask hosts to saturate the link: %s"); } // gras_os_sleep(1.0); diff --git a/examples/amok/saturate/saturate.c b/examples/amok/saturate/saturate.c index 8c033b1469..b89dccc24d 100644 --- a/examples/amok/saturate/saturate.c +++ b/examples/amok/saturate/saturate.c @@ -171,7 +171,6 @@ static void simple_saturation(int argc, char *argv[]) /********************************************************************************************/ static void full_fledged_saturation(int argc, char *argv[]) { - xbt_ex_t e; double time1 = 5.0, bw1 = 5.0; // 0.5 for test /* timers */ double begin_simulated; @@ -220,7 +219,7 @@ static void full_fledged_saturation(int argc, char *argv[]) amok_bw_saturate_start(h1->name, h1->port, h2->name, h2->port, 0, /* Be nice, compute msg_size yourself */ 0 /* no timeout */ ); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Cannot ask peers to saturate the link: %s"); } gras_os_sleep(5); diff --git a/examples/gras/all2all/test_sg_32.tesh b/examples/gras/all2all/test_sg_32.tesh index 01aa0c71cb..5b476edd98 100644 --- a/examples/gras/all2all/test_sg_32.tesh +++ b/examples/gras/all2all/test_sg_32.tesh @@ -1,3 +1,5 @@ +#! ./tesh + ! output sort $ $SG_TEST_EXENV ./all2all_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/all2all.xml "--log=root.fmt:[%10.6r]%e(%.2i:%P@%h)%e%m%n" > [ 0.000000] (01:sender@Tremblay) Launch current node @@ -32,31 +34,31 @@ $ $SG_TEST_EXENV ./all2all_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platfor > [ 0.072245] (04:receiver@Jupiter) Got Data from Fafard:5000 (still 2 to go) > [ 0.072245] (05:sender@Fafard) Sent Data from Fafard to Jupiter > [ 0.072245] (06:receiver@Fafard) Got Data from Jupiter:5000 (still 2 to go) +> [ 0.085572] (05:sender@Fafard) Sent Data from Fafard to Ginette +> [ 0.085572] (08:receiver@Ginette) Got Data from Fafard:5000 (still 2 to go) +> [ 0.091209] (05:sender@Fafard) Sent Data from Fafard to Bourassa +> [ 0.091209] (05:sender@Fafard) Exiting GRAS +> [ 0.091209] (10:receiver@Bourassa) Got Data from Fafard:5000 (still 2 to go) > [ 0.100817] (04:receiver@Jupiter) Got Data from Ginette:5000 (still 1 to go) > [ 0.100817] (07:sender@Ginette) Sent Data from Ginette to Jupiter -> [ 0.100973] (03:sender@Jupiter) Sent Data from Jupiter to Ginette -> [ 0.100973] (08:receiver@Ginette) Got Data from Jupiter:5000 (still 2 to go) -> [ 0.114212] (05:sender@Fafard) Sent Data from Fafard to Ginette -> [ 0.114212] (06:receiver@Fafard) Got Data from Ginette:5000 (still 1 to go) -> [ 0.114212] (07:sender@Ginette) Sent Data from Ginette to Fafard -> [ 0.114212] (08:receiver@Ginette) Got Data from Fafard:5000 (still 1 to go) +> [ 0.114144] (03:sender@Jupiter) Sent Data from Jupiter to Ginette +> [ 0.114144] (06:receiver@Fafard) Got Data from Ginette:5000 (still 1 to go) +> [ 0.114144] (07:sender@Ginette) Sent Data from Ginette to Fafard +> [ 0.114144] (08:receiver@Ginette) Got Data from Jupiter:5000 (still 1 to go) > [ 0.136528] (04:receiver@Jupiter) Got Data from Bourassa:5000 (still 0 to go) > [ 0.136528] (04:receiver@Jupiter) Exiting GRAS > [ 0.136528] (09:sender@Bourassa) Sent Data from Bourassa to Jupiter -> [ 0.136840] (03:sender@Jupiter) Sent Data from Jupiter to Bourassa -> [ 0.136840] (03:sender@Jupiter) Exiting GRAS -> [ 0.136840] (10:receiver@Bourassa) Got Data from Jupiter:5000 (still 2 to go) > [ 0.142165] (06:receiver@Fafard) Got Data from Bourassa:5000 (still 0 to go) > [ 0.142165] (06:receiver@Fafard) Exiting GRAS > [ 0.142165] (09:sender@Bourassa) Sent Data from Bourassa to Fafard -> [ 0.142321] (05:sender@Fafard) Sent Data from Fafard to Bourassa -> [ 0.142321] (05:sender@Fafard) Exiting GRAS -> [ 0.142321] (10:receiver@Bourassa) Got Data from Fafard:5000 (still 1 to go) -> [ 0.155305] (07:sender@Ginette) Sent Data from Ginette to Bourassa -> [ 0.155305] (07:sender@Ginette) Exiting GRAS -> [ 0.155305] (08:receiver@Ginette) Got Data from Bourassa:5000 (still 0 to go) -> [ 0.155305] (08:receiver@Ginette) Exiting GRAS -> [ 0.155305] (09:sender@Bourassa) Sent Data from Bourassa to Ginette -> [ 0.155305] (09:sender@Bourassa) Exiting GRAS -> [ 0.155305] (10:receiver@Bourassa) Got Data from Ginette:5000 (still 0 to go) -> [ 0.155305] (10:receiver@Bourassa) Exiting GRAS +> [ 0.150011] (03:sender@Jupiter) Sent Data from Jupiter to Bourassa +> [ 0.150011] (03:sender@Jupiter) Exiting GRAS +> [ 0.150011] (10:receiver@Bourassa) Got Data from Jupiter:5000 (still 1 to go) +> [ 0.155272] (08:receiver@Ginette) Got Data from Bourassa:5000 (still 0 to go) +> [ 0.155272] (08:receiver@Ginette) Exiting GRAS +> [ 0.155272] (09:sender@Bourassa) Sent Data from Bourassa to Ginette +> [ 0.155272] (09:sender@Bourassa) Exiting GRAS +> [ 0.162962] (07:sender@Ginette) Sent Data from Ginette to Bourassa +> [ 0.162962] (07:sender@Ginette) Exiting GRAS +> [ 0.162962] (10:receiver@Bourassa) Got Data from Ginette:5000 (still 0 to go) +> [ 0.162962] (10:receiver@Bourassa) Exiting GRAS diff --git a/examples/gras/all2all/test_sg_64.tesh b/examples/gras/all2all/test_sg_64.tesh index f2dcee7a07..5b476edd98 100644 --- a/examples/gras/all2all/test_sg_64.tesh +++ b/examples/gras/all2all/test_sg_64.tesh @@ -1,64 +1,64 @@ #! ./tesh ! output sort -$ $SG_TEST_EXENV ./all2all_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/all2all.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" -> [ 0.000000] (1:sender@Tremblay) Launch current node -> [ 0.000000] (3:sender@Jupiter) Launch current node -> [ 0.000000] (5:sender@Fafard) Launch current node -> [ 0.000000] (7:sender@Ginette) Launch current node -> [ 0.000000] (9:sender@Bourassa) Launch current node +$ $SG_TEST_EXENV ./all2all_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/all2all.xml "--log=root.fmt:[%10.6r]%e(%.2i:%P@%h)%e%m%n" +> [ 0.000000] (01:sender@Tremblay) Launch current node +> [ 0.000000] (03:sender@Jupiter) Launch current node +> [ 0.000000] (05:sender@Fafard) Launch current node +> [ 0.000000] (07:sender@Ginette) Launch current node +> [ 0.000000] (09:sender@Bourassa) Launch current node +> [ 0.000156] (02:receiver@Tremblay) Listening on port 4000 (expecting 4 messages) +> [ 0.000156] (04:receiver@Jupiter) Listening on port 4000 (expecting 4 messages) +> [ 0.000156] (06:receiver@Fafard) Listening on port 4000 (expecting 4 messages) +> [ 0.000156] (08:receiver@Ginette) Listening on port 4000 (expecting 4 messages) > [ 0.000156] (10:receiver@Bourassa) Listening on port 4000 (expecting 4 messages) -> [ 0.000156] (2:receiver@Tremblay) Listening on port 4000 (expecting 4 messages) -> [ 0.000156] (4:receiver@Jupiter) Listening on port 4000 (expecting 4 messages) -> [ 0.000156] (6:receiver@Fafard) Listening on port 4000 (expecting 4 messages) -> [ 0.000156] (8:receiver@Ginette) Listening on port 4000 (expecting 4 messages) -> [ 0.015510] (1:sender@Tremblay) Sent Data from Tremblay to Jupiter -> [ 0.015510] (2:receiver@Tremblay) Got Data from Jupiter:5000 (still 3 to go) -> [ 0.015510] (3:sender@Jupiter) Sent Data from Jupiter to Tremblay -> [ 0.015510] (4:receiver@Jupiter) Got Data from Tremblay:5000 (still 3 to go) -> [ 0.036162] (2:receiver@Tremblay) Got Data from Fafard:5000 (still 2 to go) -> [ 0.036162] (5:sender@Fafard) Sent Data from Fafard to Tremblay -> [ 0.036318] (1:sender@Tremblay) Sent Data from Tremblay to Fafard -> [ 0.036318] (6:receiver@Fafard) Got Data from Tremblay:5000 (still 3 to go) -> [ 0.049459] (2:receiver@Tremblay) Got Data from Ginette:5000 (still 1 to go) -> [ 0.049459] (7:sender@Ginette) Sent Data from Ginette to Tremblay -> [ 0.049771] (1:sender@Tremblay) Sent Data from Tremblay to Ginette -> [ 0.049771] (8:receiver@Ginette) Got Data from Tremblay:5000 (still 3 to go) -> [ 0.069896] (2:receiver@Tremblay) Got Data from Bourassa:5000 (still 0 to go) -> [ 0.069896] (2:receiver@Tremblay) Exiting GRAS -> [ 0.069896] (9:sender@Bourassa) Sent Data from Bourassa to Tremblay +> [ 0.015510] (01:sender@Tremblay) Sent Data from Tremblay to Jupiter +> [ 0.015510] (02:receiver@Tremblay) Got Data from Jupiter:5000 (still 3 to go) +> [ 0.015510] (03:sender@Jupiter) Sent Data from Jupiter to Tremblay +> [ 0.015510] (04:receiver@Jupiter) Got Data from Tremblay:5000 (still 3 to go) +> [ 0.036162] (02:receiver@Tremblay) Got Data from Fafard:5000 (still 2 to go) +> [ 0.036162] (05:sender@Fafard) Sent Data from Fafard to Tremblay +> [ 0.036318] (01:sender@Tremblay) Sent Data from Tremblay to Fafard +> [ 0.036318] (06:receiver@Fafard) Got Data from Tremblay:5000 (still 3 to go) +> [ 0.049459] (02:receiver@Tremblay) Got Data from Ginette:5000 (still 1 to go) +> [ 0.049459] (07:sender@Ginette) Sent Data from Ginette to Tremblay +> [ 0.049771] (01:sender@Tremblay) Sent Data from Tremblay to Ginette +> [ 0.049771] (08:receiver@Ginette) Got Data from Tremblay:5000 (still 3 to go) +> [ 0.069896] (02:receiver@Tremblay) Got Data from Bourassa:5000 (still 0 to go) +> [ 0.069896] (02:receiver@Tremblay) Exiting GRAS +> [ 0.069896] (09:sender@Bourassa) Sent Data from Bourassa to Tremblay +> [ 0.070364] (01:sender@Tremblay) Sent Data from Tremblay to Bourassa +> [ 0.070364] (01:sender@Tremblay) Exiting GRAS > [ 0.070364] (10:receiver@Bourassa) Got Data from Tremblay:5000 (still 3 to go) -> [ 0.070364] (1:sender@Tremblay) Sent Data from Tremblay to Bourassa -> [ 0.070364] (1:sender@Tremblay) Exiting GRAS -> [ 0.072245] (3:sender@Jupiter) Sent Data from Jupiter to Fafard -> [ 0.072245] (4:receiver@Jupiter) Got Data from Fafard:5000 (still 2 to go) -> [ 0.072245] (5:sender@Fafard) Sent Data from Fafard to Jupiter -> [ 0.072245] (6:receiver@Fafard) Got Data from Jupiter:5000 (still 2 to go) -> [ 0.100817] (4:receiver@Jupiter) Got Data from Ginette:5000 (still 1 to go) -> [ 0.100817] (7:sender@Ginette) Sent Data from Ginette to Jupiter -> [ 0.100973] (3:sender@Jupiter) Sent Data from Jupiter to Ginette -> [ 0.100973] (8:receiver@Ginette) Got Data from Jupiter:5000 (still 2 to go) -> [ 0.114212] (5:sender@Fafard) Sent Data from Fafard to Ginette -> [ 0.114212] (6:receiver@Fafard) Got Data from Ginette:5000 (still 1 to go) -> [ 0.114212] (7:sender@Ginette) Sent Data from Ginette to Fafard -> [ 0.114212] (8:receiver@Ginette) Got Data from Fafard:5000 (still 1 to go) -> [ 0.136528] (4:receiver@Jupiter) Got Data from Bourassa:5000 (still 0 to go) -> [ 0.136528] (4:receiver@Jupiter) Exiting GRAS -> [ 0.136528] (9:sender@Bourassa) Sent Data from Bourassa to Jupiter -> [ 0.136840] (10:receiver@Bourassa) Got Data from Jupiter:5000 (still 2 to go) -> [ 0.136840] (3:sender@Jupiter) Sent Data from Jupiter to Bourassa -> [ 0.136840] (3:sender@Jupiter) Exiting GRAS -> [ 0.142165] (6:receiver@Fafard) Got Data from Bourassa:5000 (still 0 to go) -> [ 0.142165] (6:receiver@Fafard) Exiting GRAS -> [ 0.142165] (9:sender@Bourassa) Sent Data from Bourassa to Fafard -> [ 0.142321] (10:receiver@Bourassa) Got Data from Fafard:5000 (still 1 to go) -> [ 0.142321] (5:sender@Fafard) Sent Data from Fafard to Bourassa -> [ 0.142321] (5:sender@Fafard) Exiting GRAS -> [ 0.155305] (10:receiver@Bourassa) Got Data from Ginette:5000 (still 0 to go) -> [ 0.155305] (10:receiver@Bourassa) Exiting GRAS -> [ 0.155305] (7:sender@Ginette) Sent Data from Ginette to Bourassa -> [ 0.155305] (7:sender@Ginette) Exiting GRAS -> [ 0.155305] (8:receiver@Ginette) Got Data from Bourassa:5000 (still 0 to go) -> [ 0.155305] (8:receiver@Ginette) Exiting GRAS -> [ 0.155305] (9:sender@Bourassa) Sent Data from Bourassa to Ginette -> [ 0.155305] (9:sender@Bourassa) Exiting GRAS +> [ 0.072245] (03:sender@Jupiter) Sent Data from Jupiter to Fafard +> [ 0.072245] (04:receiver@Jupiter) Got Data from Fafard:5000 (still 2 to go) +> [ 0.072245] (05:sender@Fafard) Sent Data from Fafard to Jupiter +> [ 0.072245] (06:receiver@Fafard) Got Data from Jupiter:5000 (still 2 to go) +> [ 0.085572] (05:sender@Fafard) Sent Data from Fafard to Ginette +> [ 0.085572] (08:receiver@Ginette) Got Data from Fafard:5000 (still 2 to go) +> [ 0.091209] (05:sender@Fafard) Sent Data from Fafard to Bourassa +> [ 0.091209] (05:sender@Fafard) Exiting GRAS +> [ 0.091209] (10:receiver@Bourassa) Got Data from Fafard:5000 (still 2 to go) +> [ 0.100817] (04:receiver@Jupiter) Got Data from Ginette:5000 (still 1 to go) +> [ 0.100817] (07:sender@Ginette) Sent Data from Ginette to Jupiter +> [ 0.114144] (03:sender@Jupiter) Sent Data from Jupiter to Ginette +> [ 0.114144] (06:receiver@Fafard) Got Data from Ginette:5000 (still 1 to go) +> [ 0.114144] (07:sender@Ginette) Sent Data from Ginette to Fafard +> [ 0.114144] (08:receiver@Ginette) Got Data from Jupiter:5000 (still 1 to go) +> [ 0.136528] (04:receiver@Jupiter) Got Data from Bourassa:5000 (still 0 to go) +> [ 0.136528] (04:receiver@Jupiter) Exiting GRAS +> [ 0.136528] (09:sender@Bourassa) Sent Data from Bourassa to Jupiter +> [ 0.142165] (06:receiver@Fafard) Got Data from Bourassa:5000 (still 0 to go) +> [ 0.142165] (06:receiver@Fafard) Exiting GRAS +> [ 0.142165] (09:sender@Bourassa) Sent Data from Bourassa to Fafard +> [ 0.150011] (03:sender@Jupiter) Sent Data from Jupiter to Bourassa +> [ 0.150011] (03:sender@Jupiter) Exiting GRAS +> [ 0.150011] (10:receiver@Bourassa) Got Data from Jupiter:5000 (still 1 to go) +> [ 0.155272] (08:receiver@Ginette) Got Data from Bourassa:5000 (still 0 to go) +> [ 0.155272] (08:receiver@Ginette) Exiting GRAS +> [ 0.155272] (09:sender@Bourassa) Sent Data from Bourassa to Ginette +> [ 0.155272] (09:sender@Bourassa) Exiting GRAS +> [ 0.162962] (07:sender@Ginette) Sent Data from Ginette to Bourassa +> [ 0.162962] (07:sender@Ginette) Exiting GRAS +> [ 0.162962] (10:receiver@Bourassa) Got Data from Ginette:5000 (still 0 to go) +> [ 0.162962] (10:receiver@Bourassa) Exiting GRAS diff --git a/examples/gras/console/ping_client.c b/examples/gras/console/ping_client.c index 8489cc39b0..043fc260bf 100644 --- a/examples/gras/console/ping_client.c +++ b/examples/gras/console/ping_client.c @@ -62,7 +62,7 @@ int client(int argc, char *argv[]) TRY { gras_msg_send(toserver, "ping", &ping); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(toserver); RETHROWF("Failed to send PING to server: %s"); } @@ -74,7 +74,7 @@ int client(int argc, char *argv[]) TRY { gras_msg_wait(6000, "pong", &from, &pong); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(toserver); RETHROWF("Why can't I get my PONG message like everyone else: %s"); } diff --git a/examples/gras/console/ping_server.c b/examples/gras/console/ping_server.c index 8b52d85a4a..4e2af0a827 100644 --- a/examples/gras/console/ping_server.c +++ b/examples/gras/console/ping_server.c @@ -19,8 +19,6 @@ typedef struct { static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void *payload) { - - xbt_ex_t e; /* 1. Get the payload into the msg variable, and retrieve my caller */ int msg = *(int *) payload; gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx); @@ -43,7 +41,8 @@ static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void *payload) gras_msg_send(expeditor, "pong", &msg); /* 6. Deal with errors: add some details to the exception */ - } CATCH(e) { + } + CATCH_ANONYMOUS { gras_socket_close(globals->sock); RETHROWF("Unable answer with PONG: %s"); } diff --git a/examples/gras/mmrpc/mmrpc.c b/examples/gras/mmrpc/mmrpc.c index 8f8e88270e..5ab834d308 100644 --- a/examples/gras/mmrpc/mmrpc.c +++ b/examples/gras/mmrpc/mmrpc.c @@ -55,7 +55,6 @@ static int server_cb_request_handler(gras_msg_cb_ctx_t ctx, int server(int argc, char *argv[]) { - xbt_ex_t e; gras_socket_t sock = NULL; int port = 4000; @@ -72,7 +71,7 @@ int server(int argc, char *argv[]) TRY { sock = gras_socket_server(port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to establish a server socket: %s"); } @@ -96,7 +95,6 @@ int server(int argc, char *argv[]) int client(int argc, char *argv[]) { - xbt_ex_t e; gras_socket_t toserver = NULL; /* peer */ gras_socket_t from; @@ -125,7 +123,7 @@ int client(int argc, char *argv[]) TRY { toserver = gras_socket_client(host, port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to connect to the server: %s"); } XBT_INFO("Connected to %s:%d.", host, port); diff --git a/examples/gras/mmrpc/mmrpc_server.c b/examples/gras/mmrpc/mmrpc_server.c index a675d3e1cd..7784d041f7 100644 --- a/examples/gras/mmrpc/mmrpc_server.c +++ b/examples/gras/mmrpc/mmrpc_server.c @@ -40,7 +40,6 @@ static int server_cb_request_handler(gras_msg_cb_ctx_t ctx, int server(int argc, char *argv[]) { - xbt_ex_t e; gras_socket_t sock = NULL; int port = 4002; @@ -57,7 +56,7 @@ int server(int argc, char *argv[]) TRY { sock = gras_socket_server(port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to establish a server socket: %s"); } diff --git a/examples/gras/mutual_exclusion/simple_token/simple_token.c b/examples/gras/mutual_exclusion/simple_token/simple_token.c index 65a7d2d05e..f05e7319b8 100644 --- a/examples/gras/mutual_exclusion/simple_token/simple_token.c +++ b/examples/gras/mutual_exclusion/simple_token/simple_token.c @@ -36,9 +36,6 @@ typedef struct { /* Callback function */ static int node_cb_stoken_handler(gras_msg_cb_ctx_t ctx, void *payload) { - - xbt_ex_t e; - /* 1. Get the payload into the msg variable, and retrieve my caller */ int msg = *(int *) payload; gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx); @@ -77,7 +74,7 @@ static int node_cb_stoken_handler(gras_msg_cb_ctx_t ctx, void *payload) /* 6. Deal with errors */ } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(globals->sock); RETHROWF("Unable to forward token: %s"); } @@ -110,8 +107,6 @@ int node(int argc, char *argv[]) int myport; int peerport; - xbt_ex_t e; - /* 1. Init the GRAS infrastructure and declare my globals */ gras_init(&argc, argv); globals = gras_userdata_new(node_data_t); @@ -170,7 +165,8 @@ int node(int argc, char *argv[]) TRY { gras_msg_send(globals->tosuccessor, "stoken", &token); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to send the freshly created token: %s"); } } diff --git a/examples/gras/p2p/can/can.c b/examples/gras/p2p/can/can.c index cde05ab27f..5c4cb0d554 100644 --- a/examples/gras/p2p/can/can.c +++ b/examples/gras/p2p/can/can.c @@ -53,16 +53,17 @@ static void register_messages() static void forward_get_suc(get_suc_t msg, char host[1024], int port) { gras_socket_t temp_sock = NULL; - xbt_ex_t e; // the error variable used in TRY.. CATCH tokens. //XBT_INFO("Transmiting message to %s:%d",host,port); TRY { temp_sock = gras_socket_client(host, port); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to connect!: %s"); } TRY { gras_msg_send(temp_sock, "can_get_suc", &msg); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to send!: %s"); } XBT_INFO("Forwarding a get_successor message to %s for (%d;%d)", host, @@ -179,7 +180,7 @@ static int node_get_suc_handler(gras_msg_cb_ctx_t ctx, void *payload_data) TRY { temp_sock = gras_socket_client(incoming->host, incoming->port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF ("Unable to connect to the node wich has requested for an area!: %s"); } @@ -187,7 +188,7 @@ static int node_get_suc_handler(gras_msg_cb_ctx_t ctx, void *payload_data) gras_msg_send(temp_sock, "can_rep_suc", &outgoing); XBT_INFO("Environment informations sent!"); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("%s:Timeout sending environment informations to %s: %s", globals->host, gras_socket_peer_name(expeditor)); } @@ -204,6 +205,7 @@ static int node_get_suc_handler(gras_msg_cb_ctx_t ctx, void *payload_data) XBT_INFO("My area is [%d;%d;%d;%d]", globals->x1, globals->x2, globals->y1, globals->y2); //XBT_INFO("Closing node, all has been done!"); + xbt_ex_free(e); } return 0; } @@ -251,7 +253,7 @@ int node(int argc, char **argv) TRY { temp_sock = gras_socket_client(argv[4], atoi(argv[5])); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to connect known host to request for an area!: %s"); } @@ -263,7 +265,7 @@ int node(int argc, char **argv) TRY { // asking. gras_msg_send(temp_sock, "can_get_suc", &get_suc_msg); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(temp_sock); RETHROWF("Unable to contact known host to get an area!: %s"); } @@ -275,7 +277,7 @@ int node(int argc, char **argv) XBT_INFO("Waiting for reply!"); gras_msg_wait(6000, "can_rep_suc", &temp_sock2, &rep_suc_msg); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("%s: Error waiting for an area:%s", globals->host); } @@ -309,6 +311,7 @@ int node(int argc, char **argv) XBT_INFO("My area is [%d;%d;%d;%d]", globals->x1, globals->x2, globals->y1, globals->y2); //XBT_INFO("Closing node, all has been done!"); + xbt_ex_free(e); } gras_socket_close(globals->sock); // spare. diff --git a/examples/gras/p2p/can/can_tests.c b/examples/gras/p2p/can/can_tests.c index 947be6edc3..44a7227907 100644 --- a/examples/gras/p2p/can/can_tests.c +++ b/examples/gras/p2p/can/can_tests.c @@ -27,7 +27,6 @@ int start_war(int argc, char **argv) { gras_socket_t temp_sock = NULL; nuke_t nuke_msg; - xbt_ex_t e; // the error variable used in TRY.. CATCH tokens. //return 0; // in order to inhibit the War of the Nodes gras_init(&argc, argv); gras_os_sleep((15 - gras_os_getpid()) * 20 + 200); // wait a bit. @@ -35,7 +34,8 @@ int start_war(int argc, char **argv) TRY { // contacting the bad guy that will launch the War. temp_sock = gras_socket_client(gras_os_myname(), atoi(argv[1])); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to connect known host so as to declare WAR!: %s"); } @@ -48,7 +48,8 @@ int start_war(int argc, char **argv) TRY { gras_msg_send(temp_sock, "can_nuke", &nuke_msg); - } CATCH(e) { + } + CATCH_ANONYMOUS { gras_socket_close(temp_sock); RETHROWF ("Unable to contact known host so as to declare WAR!!!!!!!!!!!!!!!!!!!!!: %s"); @@ -63,7 +64,6 @@ static int send_nuke(nuke_t * msg, int xId, int yId) { node_data_t *globals = (node_data_t *) gras_userdata_get(); gras_socket_t temp_sock = NULL; - xbt_ex_t e; // the error variable used in TRY.. CATCH tokens. if (xId >= globals->x1 && xId <= globals->x2 && yId >= globals->y1 && yId <= globals->y2) { @@ -95,14 +95,14 @@ static int send_nuke(nuke_t * msg, int xId, int yId) TRY { // sending the nuke. temp_sock = gras_socket_client(host, port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to connect the nuke!: %s"); } //XBT_INFO("%s ON %s %d %d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",globals->host,host,xId,yId); TRY { gras_msg_send(temp_sock, "can_nuke", msg); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to send the nuke!: %s"); } gras_socket_close(temp_sock); @@ -190,13 +190,13 @@ static int node_nuke_handler(gras_msg_cb_ctx_t ctx, void *payload_data) TRY { temp_sock = gras_socket_client(host, port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to connect the nuke!: %s"); } TRY { gras_msg_send(temp_sock, "can_nuke", incoming); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to send the nuke!: %s"); } XBT_INFO("Nuke re-aimed by %s to %s for (%d;%d)", globals->host, host, @@ -212,6 +212,7 @@ static int node_nuke_handler(gras_msg_cb_ctx_t ctx, void *payload_data) XBT_INFO("My area is [%d;%d;%d;%d]", globals->x1, globals->x2, globals->y1, globals->y2); //XBT_INFO("Closing node, all has been done!"); + xbt_ex_free(e); } return 0; } diff --git a/examples/gras/p2p/chord/chord.c b/examples/gras/p2p/chord/chord.c index cf3d2c02cc..7060096d6a 100644 --- a/examples/gras/p2p/chord/chord.c +++ b/examples/gras/p2p/chord/chord.c @@ -113,7 +113,6 @@ static int node_cb_get_suc_handler(gras_msg_cb_ctx_t ctx, void *payload_data) { gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx); - xbt_ex_t e; get_suc_t incoming = *(get_suc_t *) payload_data; rep_suc_t outgoing; node_data_t *globals = (node_data_t *) gras_userdata_get(); @@ -141,13 +140,13 @@ static int node_cb_get_suc_handler(gras_msg_cb_ctx_t ctx, temp_sock = gras_socket_client(globals->finger[contact].host, globals->finger[contact].port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to connect!: %s"); } TRY { gras_msg_send(temp_sock, "chord_get_suc", &asking); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to ask!: %s"); } gras_msg_wait(10., "chord_rep_suc", &temp_sock, &outgoing); @@ -158,7 +157,7 @@ static int node_cb_get_suc_handler(gras_msg_cb_ctx_t ctx, gras_msg_send(expeditor, "chord_rep_suc", &outgoing); XBT_INFO("Successor information sent!"); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("%s:Timeout sending successor information to %s: %s", globals->host, gras_socket_peer_name(expeditor)); } @@ -201,7 +200,6 @@ static int node_cb_notify_handler(gras_msg_cb_ctx_t ctx, static void fix_fingers() { get_suc_t get_suc_msg; - xbt_ex_t e; gras_socket_t temp_sock = NULL; gras_socket_t temp_sock2 = NULL; rep_suc_t rep_suc_msg; @@ -209,14 +207,16 @@ static void fix_fingers() TRY { temp_sock = gras_socket_client(globals->host, globals->port); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to contact known host: %s"); } get_suc_msg.id = globals->id; TRY { gras_msg_send(temp_sock, "chord_get_suc", &get_suc_msg); - } CATCH(e) { + } + CATCH_ANONYMOUS { gras_socket_close(temp_sock); RETHROWF("Unable to contact known host to get successor!: %s"); } @@ -224,7 +224,8 @@ static void fix_fingers() TRY { XBT_INFO("Waiting for reply!"); gras_msg_wait(6000, "chord_rep_suc", &temp_sock2, &rep_suc_msg); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("%s: Error waiting for successor:%s", globals->host); } globals->finger[0].id = rep_suc_msg.id; @@ -254,6 +255,7 @@ static void check_predecessor() globals->pre_id = -1; globals->pre_host[0] = 0; globals->pre_port = 0; + xbt_ex_free(e); } ping.id = 0; @@ -264,6 +266,7 @@ static void check_predecessor() globals->pre_id = -1; globals->pre_host[0] = 0; globals->pre_port = 0; + xbt_ex_free(e); } TRY { gras_msg_wait(60, "chord_pong", &temp_sock, &pong); @@ -272,6 +275,7 @@ static void check_predecessor() globals->pre_id = -1; globals->pre_host[0] = 0; globals->pre_port = 0; + xbt_ex_free(e); } gras_socket_close(temp_sock); } @@ -334,7 +338,7 @@ int node(int argc, char **argv) TRY { temp_sock = gras_socket_client(other_host, other_port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to contact known host: %s"); } @@ -342,7 +346,7 @@ int node(int argc, char **argv) TRY { gras_msg_send(temp_sock, "chord_get_suc", &get_suc_msg); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(temp_sock); RETHROWF("Unable to contact known host to get successor!: %s"); } @@ -351,7 +355,7 @@ int node(int argc, char **argv) XBT_INFO("Waiting for reply!"); gras_msg_wait(10., "chord_rep_suc", &temp_sock2, &rep_suc_msg); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("%s: Error waiting for successor:%s", globals->host); } globals->finger[0].id = rep_suc_msg.id; @@ -364,7 +368,7 @@ int node(int argc, char **argv) temp_sock = gras_socket_client(globals->finger[0].host, globals->finger[0].port); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to contact successor: %s"); } @@ -374,7 +378,7 @@ int node(int argc, char **argv) TRY { gras_msg_send(temp_sock, "chord_notify", ¬ify_msg); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to notify successor! %s"); } } @@ -390,6 +394,7 @@ int node(int argc, char **argv) gras_msg_handle(6000000.0); } CATCH(e) { + xbt_ex_free(e); } } /*} */ diff --git a/examples/gras/ping/ping_client.c b/examples/gras/ping/ping_client.c index 1b74e7035c..e362b44bd0 100644 --- a/examples/gras/ping/ping_client.c +++ b/examples/gras/ping/ping_client.c @@ -62,7 +62,7 @@ int client(int argc, char *argv[]) TRY { gras_msg_send(toserver, "ping", &ping); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(toserver); RETHROWF("Failed to send PING to server: %s"); } @@ -73,7 +73,7 @@ int client(int argc, char *argv[]) TRY { gras_msg_wait(6000, "pong", &from, &pong); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(toserver); RETHROWF("Why can't I get my PONG message like everyone else: %s"); } diff --git a/examples/gras/ping/ping_server.c b/examples/gras/ping/ping_server.c index 885b4e5f21..4167d413da 100644 --- a/examples/gras/ping/ping_server.c +++ b/examples/gras/ping/ping_server.c @@ -19,8 +19,6 @@ typedef struct { static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void *payload) { - - xbt_ex_t e; /* 1. Get the payload into the msg variable, and retrieve my caller */ int msg = *(int *) payload; gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx); @@ -43,7 +41,8 @@ static int server_cb_ping_handler(gras_msg_cb_ctx_t ctx, void *payload) gras_msg_send(expeditor, "pong", &msg); /* 6. Deal with errors: add some details to the exception */ - } CATCH(e) { + } + CATCH_ANONYMOUS { gras_socket_close(globals->sock); RETHROWF("Unable answer with PONG: %s"); } diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c index dbc87c65f9..27b03d1daf 100644 --- a/examples/gras/pmm/pmm.c +++ b/examples/gras/pmm/pmm.c @@ -240,8 +240,6 @@ static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload) s_pmm_assignment_t assignment = *(s_pmm_assignment_t *) payload; gras_socket_t master = gras_msg_cb_ctx_from(ctx); - xbt_ex_t e; - int step, l; xbt_matrix_t bA = xbt_matrix_new(submatrix_size, submatrix_size, sizeof(double), NULL); @@ -311,7 +309,7 @@ static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload) xbt_matrix_free(bB); gras_msg_wait(600, "dataB", &from, &bB); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Can't get a data message from line : %s"); } XBT_VERB("LINE: step(%d) <> Myline(%d). Receive data from %s", step, @@ -334,7 +332,7 @@ static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload) xbt_matrix_free(bA); gras_msg_wait(1200, "dataA", &from, &bA); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Can't get a data message from row : %s"); } XBT_VERB("ROW: step(%d)<>myrow(%d). Receive data from %s", step, myrow, @@ -352,7 +350,7 @@ static int pmm_worker_cb(gras_msg_cb_ctx_t ctx, void *payload) TRY { gras_msg_send(master, "result", &result); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Failed to send answer to server: %s"); } XBT_VERB(">>>>>>>> Result sent to %s:%d <<<<<<<<", diff --git a/examples/gras/replay/replay.c b/examples/gras/replay/replay.c index 6a79238a92..dbe3c90c8e 100644 --- a/examples/gras/replay/replay.c +++ b/examples/gras/replay/replay.c @@ -54,8 +54,6 @@ int master(int argc, char *argv[]) xbt_workload_sort_who_date(cmds); unsigned int cursor; xbt_workload_elm_t cmd; - - xbt_ex_t e; xbt_dict_cursor_t dict_cursor; xbt_dict_t pals_int = xbt_dict_new(); @@ -74,7 +72,7 @@ int master(int argc, char *argv[]) TRY { gras_msg_handle(20); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_dynar_foreach(peers, cursor, peer) { xbt_dict_remove(pals_int, peer->name); } @@ -159,7 +157,6 @@ static int worker_commands_cb(gras_msg_cb_ctx_t ctx, void *payload) static void do_command(int rank, void *c) { - xbt_ex_t e; xbt_workload_elm_t cmd = *(xbt_workload_elm_t *) c; xbt_workload_data_chunk_t chunk; @@ -176,7 +173,7 @@ static void do_command(int rank, void *c) TRY { gras_msg_wait(1000000, "chunk", NULL, &chunk); } - CATCH(e) { + CATCH_ANONYMOUS { SIMIX_display_process_status(); RETHROWF("Exception while waiting for %f bytes from %s: %s", cmd->d_arg, cmd->str_arg); @@ -249,6 +246,7 @@ int worker(int argc, char *argv[]) } CATCH(e) { SIMIX_display_process_status(); + xbt_ex_free(e); } XBT_INFO("Communications all done"); xbt_dynar_reset(cmd_to_go); diff --git a/examples/gras/rpc/rpc.c b/examples/gras/rpc/rpc.c index 90864543ad..fe0c62bd92 100644 --- a/examples/gras/rpc/rpc.c +++ b/examples/gras/rpc/rpc.c @@ -42,17 +42,17 @@ static void exception_catching(void) } CATCH(e) { gotit = 1; + xbt_assert(e.category == unknown_error, + "Got wrong category: %d (instead of %d)", e.category, + unknown_error); + xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value); + xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)), + "Got wrong message: %s", e.msg); + xbt_ex_free(e); } if (!gotit) { THROWF(unknown_error, 0, "Didn't got the remote exception!"); } - xbt_assert(e.category == unknown_error, - "Got wrong category: %d (instead of %d)", e.category, - unknown_error); - xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value); - xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)), - "Got wrong message: %s", e.msg); - xbt_ex_free(e); } } @@ -97,7 +97,7 @@ int client(int argc, char *argv[]) toserver = gras_socket_client(host, port); toforwarder = gras_socket_client(argv[3], atoi(argv[4])); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Unable to connect to the server: %s"); } XBT_INFO("Connected to %s:%d.", host, port); @@ -119,7 +119,7 @@ int client(int argc, char *argv[]) exception_catching(); gras_msg_rpccall(toserver, 6000.0, "plain ping", &ping, &pong); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(toserver); RETHROWF("Failed to execute a PING rpc on the server: %s"); } @@ -181,19 +181,19 @@ int client(int argc, char *argv[]) } CATCH(e) { gotit = 1; + xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value); + xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)), + "Got wrong message: %s", e.msg); + xbt_assert(e.category == unknown_error, + "Got wrong category: %d (instead of %d)", + e.category, unknown_error); + XBT_INFO + ("Got the expected exception when calling the exception raising RPC"); + xbt_ex_free(e); } if (!gotit) { THROWF(unknown_error, 0, "Didn't got the remote exception!"); } - xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value); - xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)), - "Got wrong message: %s", e.msg); - xbt_assert(e.category == unknown_error, - "Got wrong category: %d (instead of %d)", - e.category, unknown_error); - XBT_INFO - ("Got the expected exception when calling the exception raising RPC"); - xbt_ex_free(e); exception_catching(); } diff --git a/examples/gras/rpc/test_rl.tesh b/examples/gras/rpc/test_rl.tesh index 0e005941c2..badbded8d1 100755 --- a/examples/gras/rpc/test_rl.tesh +++ b/examples/gras/rpc/test_rl.tesh @@ -1,3 +1,5 @@ +! timeout 10 + & $SG_TEST_EXENV ./rpc_server$EXEEXT 4202 --log=root.fmt:%m%n $@ > Launch server (port=4202) > Listening on port 4202 diff --git a/examples/gras/rpc/test_sg_32.tesh b/examples/gras/rpc/test_sg_32.tesh index 77b70a9e1f..77e0c65ec5 100644 --- a/examples/gras/rpc/test_sg_32.tesh +++ b/examples/gras/rpc/test_sg_32.tesh @@ -1,62 +1,68 @@ #! ./tesh +# There is no timestamp in this test, because we exchange exceptions, +# which contain not only the filename (which could change in case of +# VPATH builds), but also the function name (which changes with the +# optimization level: if inlining, gcc changes it). + +! timeout 10 ! output sort -$ $SG_TEST_EXENV ./rpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/rpc.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" -> [ 0.000000] (1:server@Tremblay) Launch server (port=4000) -> [ 0.000000] (2:forwarder@Ginette) Launch forwarder (port=4000) -> [ 0.000000] (3:client@Fafard) Launch client (server on Tremblay:4000) -> [ 0.000156] (1:server@Tremblay) Listening on port 4000 -> [ 2.000312] (3:client@Fafard) Connected to Tremblay:4000. -> [ 2.000312] (3:client@Fafard) Connected to server which is on Tremblay:4000 -> [ 2.020863] (1:server@Tremblay) Got message PING(1234) from Fafard:5000 -> [ 2.041415] (1:server@Tremblay) Answered with PONG(4321) -> [ 2.041415] (3:client@Fafard) The answer to PING(1234) on Tremblay:4000 is PONG(4321) -> [ 2.041415] (3:client@Fafard) Call the exception raising RPC -> [ 2.061966] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.082607] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.082607] (3:client@Fafard) Called the exception raising RPC -> [ 2.082607] (3:client@Fafard) Call the exception raising RPC (i=0) -> [ 2.103157] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.123799] (3:client@Fafard) Call the exception raising RPC (i=1) -> [ 2.144349] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.164990] (3:client@Fafard) Call the exception raising RPC (i=2) -> [ 2.185541] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.206182] (3:client@Fafard) Call the exception raising RPC (i=3) -> [ 2.226733] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.247374] (3:client@Fafard) Call the exception raising RPC (i=4) -> [ 2.267925] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.288566] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=0) -> [ 2.301669] (2:forwarder@Ginette) Forward a request -> [ 2.314900] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.328190] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.341354] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.341354] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=1) -> [ 2.354457] (2:forwarder@Ginette) Forward a request -> [ 2.367688] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.380978] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.394142] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.394142] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=2) -> [ 2.407245] (2:forwarder@Ginette) Forward a request -> [ 2.420477] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.433767] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.446930] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.446930] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=3) -> [ 2.460033] (2:forwarder@Ginette) Forward a request -> [ 2.473265] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.486555] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.499718] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.499718] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=4) -> [ 2.512821] (2:forwarder@Ginette) Forward a request -> [ 2.526053] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.539343] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.552507] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.552507] (3:client@Fafard) Ask Ginette:4000 to die -> [ 2.565609] (2:forwarder@Ginette) Asked to die by Fafard:5000 -> [ 2.565609] (2:forwarder@Ginette) Done. -> [ 2.565609] (2:forwarder@Ginette) Exiting GRAS -> [ 2.565609] (3:client@Fafard) Ask Tremblay:4000 to die -> [ 2.586160] (1:server@Tremblay) Asked to die by Fafard:5000 -> [ 2.586160] (1:server@Tremblay) Done. -> [ 2.586160] (1:server@Tremblay) Exiting GRAS -> [ 2.586160] (3:client@Fafard) Done. -> [ 2.586160] (3:client@Fafard) Exiting GRAS +$ $SG_TEST_EXENV ./rpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/rpc.xml "--log=root.fmt:[0]%e(%i:%P@%h)%e%m%n" +> [0] (1:server@Tremblay) Launch server (port=4000) +> [0] (1:server@Tremblay) Listening on port 4000 +> [0] (1:server@Tremblay) Got message PING(1234) from Fafard:5000 +> [0] (1:server@Tremblay) Answered with PONG(4321) +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Asked to die by Fafard:5000 +> [0] (1:server@Tremblay) Done. +> [0] (1:server@Tremblay) Exiting GRAS +> [0] (2:forwarder@Ginette) Launch forwarder (port=4000) +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Asked to die by Fafard:5000 +> [0] (2:forwarder@Ginette) Done. +> [0] (2:forwarder@Ginette) Exiting GRAS +> [0] (3:client@Fafard) Launch client (server on Tremblay:4000) +> [0] (3:client@Fafard) Connected to Tremblay:4000. +> [0] (3:client@Fafard) Connected to server which is on Tremblay:4000 +> [0] (3:client@Fafard) The answer to PING(1234) on Tremblay:4000 is PONG(4321) +> [0] (3:client@Fafard) Call the exception raising RPC +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Called the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC (i=0) +> [0] (3:client@Fafard) Call the exception raising RPC (i=1) +> [0] (3:client@Fafard) Call the exception raising RPC (i=2) +> [0] (3:client@Fafard) Call the exception raising RPC (i=3) +> [0] (3:client@Fafard) Call the exception raising RPC (i=4) +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=0) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=1) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=2) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=3) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=4) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Ask Ginette:4000 to die +> [0] (3:client@Fafard) Ask Tremblay:4000 to die +> [0] (3:client@Fafard) Done. +> [0] (3:client@Fafard) Exiting GRAS diff --git a/examples/gras/rpc/test_sg_64.tesh b/examples/gras/rpc/test_sg_64.tesh index ad62de8f9f..77e0c65ec5 100755 --- a/examples/gras/rpc/test_sg_64.tesh +++ b/examples/gras/rpc/test_sg_64.tesh @@ -1,62 +1,68 @@ #! ./tesh +# There is no timestamp in this test, because we exchange exceptions, +# which contain not only the filename (which could change in case of +# VPATH builds), but also the function name (which changes with the +# optimization level: if inlining, gcc changes it). + +! timeout 10 ! output sort -$ $SG_TEST_EXENV ./rpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/rpc.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" -> [ 0.000000] (1:server@Tremblay) Launch server (port=4000) -> [ 0.000000] (2:forwarder@Ginette) Launch forwarder (port=4000) -> [ 0.000000] (3:client@Fafard) Launch client (server on Tremblay:4000) -> [ 0.000156] (1:server@Tremblay) Listening on port 4000 -> [ 2.000312] (3:client@Fafard) Connected to Tremblay:4000. -> [ 2.000312] (3:client@Fafard) Connected to server which is on Tremblay:4000 -> [ 2.020863] (1:server@Tremblay) Got message PING(1234) from Fafard:5000 -> [ 2.041415] (1:server@Tremblay) Answered with PONG(4321) -> [ 2.041415] (3:client@Fafard) The answer to PING(1234) on Tremblay:4000 is PONG(4321) -> [ 2.041415] (3:client@Fafard) Call the exception raising RPC -> [ 2.061966] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.082632] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.082632] (3:client@Fafard) Called the exception raising RPC -> [ 2.082632] (3:client@Fafard) Call the exception raising RPC (i=0) -> [ 2.103182] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.123849] (3:client@Fafard) Call the exception raising RPC (i=1) -> [ 2.144399] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.165066] (3:client@Fafard) Call the exception raising RPC (i=2) -> [ 2.185616] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.206283] (3:client@Fafard) Call the exception raising RPC (i=3) -> [ 2.226833] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.247499] (3:client@Fafard) Call the exception raising RPC (i=4) -> [ 2.268050] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 -> [ 2.288716] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=0) -> [ 2.301819] (2:forwarder@Ginette) Forward a request -> [ 2.315051] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.328357] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.341538] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.341538] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=1) -> [ 2.354640] (2:forwarder@Ginette) Forward a request -> [ 2.367872] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.381178] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.394359] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.394359] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=2) -> [ 2.407462] (2:forwarder@Ginette) Forward a request -> [ 2.420693] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.433999] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.447180] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.447180] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=3) -> [ 2.460283] (2:forwarder@Ginette) Forward a request -> [ 2.473515] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.486821] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.500001] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.500001] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=4) -> [ 2.513104] (2:forwarder@Ginette) Forward a request -> [ 2.526336] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 -> [ 2.539642] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 -> [ 2.552823] (3:client@Fafard) Got the expected exception when calling the exception raising RPC -> [ 2.552823] (3:client@Fafard) Ask Ginette:4000 to die -> [ 2.565925] (2:forwarder@Ginette) Asked to die by Fafard:5000 -> [ 2.565925] (2:forwarder@Ginette) Done. -> [ 2.565925] (2:forwarder@Ginette) Exiting GRAS -> [ 2.565925] (3:client@Fafard) Ask Tremblay:4000 to die -> [ 2.586476] (1:server@Tremblay) Asked to die by Fafard:5000 -> [ 2.586476] (1:server@Tremblay) Done. -> [ 2.586476] (1:server@Tremblay) Exiting GRAS -> [ 2.586476] (3:client@Fafard) Done. -> [ 2.586476] (3:client@Fafard) Exiting GRAS +$ $SG_TEST_EXENV ./rpc_simulator$EXEEXT ${srcdir:=.}/../../msg/small_platform.xml ${srcdir:=.}/rpc.xml "--log=root.fmt:[0]%e(%i:%P@%h)%e%m%n" +> [0] (1:server@Tremblay) Launch server (port=4000) +> [0] (1:server@Tremblay) Listening on port 4000 +> [0] (1:server@Tremblay) Got message PING(1234) from Fafard:5000 +> [0] (1:server@Tremblay) Answered with PONG(4321) +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Fafard:5000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Propagate local exception ('Error for the client') from 'raise exception' RPC cb back to Ginette:4000 +> [0] (1:server@Tremblay) Asked to die by Fafard:5000 +> [0] (1:server@Tremblay) Done. +> [0] (1:server@Tremblay) Exiting GRAS +> [0] (2:forwarder@Ginette) Launch forwarder (port=4000) +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Forward a request +> [0] (2:forwarder@Ginette) Propagate remote exception ('Error for the client') from 'forward exception' RPC cb back to Fafard:5000 +> [0] (2:forwarder@Ginette) Asked to die by Fafard:5000 +> [0] (2:forwarder@Ginette) Done. +> [0] (2:forwarder@Ginette) Exiting GRAS +> [0] (3:client@Fafard) Launch client (server on Tremblay:4000) +> [0] (3:client@Fafard) Connected to Tremblay:4000. +> [0] (3:client@Fafard) Connected to server which is on Tremblay:4000 +> [0] (3:client@Fafard) The answer to PING(1234) on Tremblay:4000 is PONG(4321) +> [0] (3:client@Fafard) Call the exception raising RPC +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Called the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC (i=0) +> [0] (3:client@Fafard) Call the exception raising RPC (i=1) +> [0] (3:client@Fafard) Call the exception raising RPC (i=2) +> [0] (3:client@Fafard) Call the exception raising RPC (i=3) +> [0] (3:client@Fafard) Call the exception raising RPC (i=4) +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=0) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=1) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=2) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=3) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Call the exception raising RPC on the forwarder (i=4) +> [0] (3:client@Fafard) Got the expected exception when calling the exception raising RPC +> [0] (3:client@Fafard) Ask Ginette:4000 to die +> [0] (3:client@Fafard) Ask Tremblay:4000 to die +> [0] (3:client@Fafard) Done. +> [0] (3:client@Fafard) Exiting GRAS diff --git a/examples/gras/spawn/spawn.c b/examples/gras/spawn/spawn.c index 001abd7e6b..f2d74b1831 100644 --- a/examples/gras/spawn/spawn.c +++ b/examples/gras/spawn/spawn.c @@ -33,7 +33,8 @@ int worker(int argc, char *argv[]) { xbt_ex_t e; TRY { xbt_queue_shift_timed(todo,&chunk,0); - } CATCH(e) { + } + CATCH(e) { if (e.category != timeout_error) { RETHROW; } diff --git a/examples/gras/synchro/test_sg_32.tesh b/examples/gras/synchro/test_sg_32.tesh index 1fe184931b..b5cdddcd77 100644 --- a/examples/gras/synchro/test_sg_32.tesh +++ b/examples/gras/synchro/test_sg_32.tesh @@ -85,129 +85,129 @@ $ $SG_TEST_EXENV ./synchro_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_pla > [ 0.110000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #2) > [ 0.120000] (1:thread 1@Tremblay) Thread 1 is full > [ 0.120000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.120000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.120000] (1:thread 3@Tremblay) Thread 3 eats > [ 0.120000] (1:thread 4@Tremblay) Thread 4 is full > [ 0.120000] (1:thread 4@Tremblay) Thread 4 thinks > [ 0.130000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #5) -> [ 0.140000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.140000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.140000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.140000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.150000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.150000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.160000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #6) -> [ 0.160000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.160000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #3) +> [ 0.130000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.140000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.140000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.150000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #6) +> [ 0.150000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.150000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.150000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.160000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.160000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.160000] (1:thread 2@Tremblay) Thread 2 eats > [ 0.160000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #2) -> [ 0.170000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.170000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.170000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.170000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.170000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.170000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.180000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #7) -> [ 0.190000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.190000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.190000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.200000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.200000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.200000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #2) -> [ 0.210000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #8) -> [ 0.210000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.210000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #4) -> [ 0.210000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.210000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.210000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.220000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.220000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.230000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #9) -> [ 0.230000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.240000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.240000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.240000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.240000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.240000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.250000] (1:thread 1@Tremblay) Thread 1 tries to enter the dead-end; hopefully, the master will cancel it -> [ 0.250000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #3) +> [ 0.160000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.170000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #7) +> [ 0.180000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.180000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.180000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.180000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #2) +> [ 0.190000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.190000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.200000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #8) +> [ 0.200000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #3) +> [ 0.200000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.200000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.200000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.220000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.220000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.220000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.220000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.230000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.230000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.240000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #9) +> [ 0.240000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.240000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #4) +> [ 0.240000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #3) +> [ 0.250000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.250000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.250000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.250000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.250000] (1:thread 3@Tremblay) Thread 3 thinks > [ 0.250000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.260000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.260000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.270000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #3) -> [ 0.280000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #5) -> [ 0.280000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.260000] (1:thread 1@Tremblay) Thread 1 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.270000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.270000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.280000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #3) +> [ 0.290000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #5) +> [ 0.290000] (1:thread 2@Tremblay) Thread 2 eats > [ 0.290000] (1:thread 4@Tremblay) Thread 4 is full > [ 0.290000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.300000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.300000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.300000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.320000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #6) -> [ 0.330000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.330000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.330000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.310000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.310000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.310000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.330000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #6) > [ 0.330000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #4) -> [ 0.330000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.350000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.350000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.360000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #4) -> [ 0.370000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #7) -> [ 0.370000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.370000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.370000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.390000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.390000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.390000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.410000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #8) -> [ 0.410000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #5) -> [ 0.420000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.420000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.420000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.420000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.440000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.440000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.450000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #5) -> [ 0.460000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #9) -> [ 0.460000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.460000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.460000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.480000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.480000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.480000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.500000] (1:thread 2@Tremblay) Thread 2 tries to enter the dead-end; hopefully, the master will cancel it -> [ 0.500000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #6) -> [ 0.510000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.510000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.510000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.540000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #6) -> [ 0.550000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.550000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.550000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.580000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.580000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.590000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #7) -> [ 0.590000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.610000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #7) -> [ 0.630000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.630000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.630000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.660000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.660000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.670000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #8) -> [ 0.670000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.690000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #8) -> [ 0.710000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.710000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.710000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.740000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.740000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.750000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #9) -> [ 0.750000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.770000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #9) -> [ 0.790000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.790000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.790000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.820000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.820000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.830000] (1:thread 4@Tremblay) Thread 4 tries to enter the dead-end; hopefully, the master will cancel it -> [ 0.850000] (1:philosopher@Tremblay) Cancel all childs -> [ 0.850000] (1:philosopher@Tremblay) Exiting GRAS -> [ 0.850000] (1:thread 3@Tremblay) Thread 3 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.340000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.340000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.340000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.340000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.360000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.360000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.370000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #4) +> [ 0.380000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #7) +> [ 0.380000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.380000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.380000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.400000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.400000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.400000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.420000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #8) +> [ 0.420000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #5) +> [ 0.430000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.430000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.430000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.430000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.450000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.450000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.460000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #5) +> [ 0.470000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #9) +> [ 0.470000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.470000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.470000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.490000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.490000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.490000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.510000] (1:thread 2@Tremblay) Thread 2 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.510000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #6) +> [ 0.520000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.520000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.520000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.550000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #6) +> [ 0.560000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.560000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.560000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.590000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.590000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.600000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #7) +> [ 0.600000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.620000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #7) +> [ 0.640000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.640000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.640000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.670000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.670000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.680000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #8) +> [ 0.680000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.700000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #8) +> [ 0.720000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.720000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.720000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.750000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.750000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.760000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #9) +> [ 0.760000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.780000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #9) +> [ 0.800000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.800000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.800000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.830000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.830000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.840000] (1:thread 4@Tremblay) Thread 4 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.860000] (1:philosopher@Tremblay) Cancel all childs +> [ 0.860000] (1:philosopher@Tremblay) Exiting GRAS +> [ 0.860000] (1:thread 3@Tremblay) Thread 3 tries to enter the dead-end; hopefully, the master will cancel it diff --git a/examples/gras/synchro/test_sg_64.tesh b/examples/gras/synchro/test_sg_64.tesh index 1fe184931b..b5cdddcd77 100755 --- a/examples/gras/synchro/test_sg_64.tesh +++ b/examples/gras/synchro/test_sg_64.tesh @@ -85,129 +85,129 @@ $ $SG_TEST_EXENV ./synchro_simulator${EXEEXT:=} ${srcdir:=.}/../../msg/small_pla > [ 0.110000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #2) > [ 0.120000] (1:thread 1@Tremblay) Thread 1 is full > [ 0.120000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.120000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.120000] (1:thread 3@Tremblay) Thread 3 eats > [ 0.120000] (1:thread 4@Tremblay) Thread 4 is full > [ 0.120000] (1:thread 4@Tremblay) Thread 4 thinks > [ 0.130000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #5) -> [ 0.140000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.140000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.140000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.140000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.150000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.150000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.160000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #6) -> [ 0.160000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.160000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #3) +> [ 0.130000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.140000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.140000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.150000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #6) +> [ 0.150000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.150000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.150000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.160000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.160000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.160000] (1:thread 2@Tremblay) Thread 2 eats > [ 0.160000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #2) -> [ 0.170000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.170000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.170000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.170000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.170000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.170000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.180000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #7) -> [ 0.190000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.190000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.190000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.200000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.200000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.200000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #2) -> [ 0.210000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #8) -> [ 0.210000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.210000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #4) -> [ 0.210000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.210000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.210000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.220000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.220000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.230000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #9) -> [ 0.230000] (1:thread 1@Tremblay) Thread 1 eats -> [ 0.240000] (1:thread 1@Tremblay) Thread 1 is full -> [ 0.240000] (1:thread 1@Tremblay) Thread 1 thinks -> [ 0.240000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.240000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.240000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.250000] (1:thread 1@Tremblay) Thread 1 tries to enter the dead-end; hopefully, the master will cancel it -> [ 0.250000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #3) +> [ 0.160000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.170000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #7) +> [ 0.180000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.180000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.180000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.180000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #2) +> [ 0.190000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.190000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.200000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #8) +> [ 0.200000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #3) +> [ 0.200000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.200000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.200000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.220000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.220000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.220000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.220000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.230000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.230000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.240000] (1:thread 1@Tremblay) Thread 1 gets hungry (lunch #9) +> [ 0.240000] (1:thread 1@Tremblay) Thread 1 eats +> [ 0.240000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #4) +> [ 0.240000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #3) +> [ 0.250000] (1:thread 1@Tremblay) Thread 1 is full +> [ 0.250000] (1:thread 1@Tremblay) Thread 1 thinks +> [ 0.250000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.250000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.250000] (1:thread 3@Tremblay) Thread 3 thinks > [ 0.250000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.260000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.260000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.270000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #3) -> [ 0.280000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #5) -> [ 0.280000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.260000] (1:thread 1@Tremblay) Thread 1 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.270000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.270000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.280000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #3) +> [ 0.290000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #5) +> [ 0.290000] (1:thread 2@Tremblay) Thread 2 eats > [ 0.290000] (1:thread 4@Tremblay) Thread 4 is full > [ 0.290000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.300000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.300000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.300000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.320000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #6) -> [ 0.330000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.330000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.330000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.310000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.310000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.310000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.330000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #6) > [ 0.330000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #4) -> [ 0.330000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.350000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.350000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.360000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #4) -> [ 0.370000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #7) -> [ 0.370000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.370000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.370000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.390000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.390000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.390000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.410000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #8) -> [ 0.410000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #5) -> [ 0.420000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.420000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.420000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.420000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.440000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.440000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.450000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #5) -> [ 0.460000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #9) -> [ 0.460000] (1:thread 2@Tremblay) Thread 2 eats -> [ 0.460000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.460000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.480000] (1:thread 2@Tremblay) Thread 2 is full -> [ 0.480000] (1:thread 2@Tremblay) Thread 2 thinks -> [ 0.480000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.500000] (1:thread 2@Tremblay) Thread 2 tries to enter the dead-end; hopefully, the master will cancel it -> [ 0.500000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #6) -> [ 0.510000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.510000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.510000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.540000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #6) -> [ 0.550000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.550000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.550000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.580000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.580000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.590000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #7) -> [ 0.590000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.610000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #7) -> [ 0.630000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.630000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.630000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.660000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.660000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.670000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #8) -> [ 0.670000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.690000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #8) -> [ 0.710000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.710000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.710000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.740000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.740000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.750000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #9) -> [ 0.750000] (1:thread 4@Tremblay) Thread 4 eats -> [ 0.770000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #9) -> [ 0.790000] (1:thread 3@Tremblay) Thread 3 eats -> [ 0.790000] (1:thread 4@Tremblay) Thread 4 is full -> [ 0.790000] (1:thread 4@Tremblay) Thread 4 thinks -> [ 0.820000] (1:thread 3@Tremblay) Thread 3 is full -> [ 0.820000] (1:thread 3@Tremblay) Thread 3 thinks -> [ 0.830000] (1:thread 4@Tremblay) Thread 4 tries to enter the dead-end; hopefully, the master will cancel it -> [ 0.850000] (1:philosopher@Tremblay) Cancel all childs -> [ 0.850000] (1:philosopher@Tremblay) Exiting GRAS -> [ 0.850000] (1:thread 3@Tremblay) Thread 3 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.340000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.340000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.340000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.340000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.360000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.360000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.370000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #4) +> [ 0.380000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #7) +> [ 0.380000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.380000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.380000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.400000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.400000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.400000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.420000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #8) +> [ 0.420000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #5) +> [ 0.430000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.430000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.430000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.430000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.450000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.450000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.460000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #5) +> [ 0.470000] (1:thread 2@Tremblay) Thread 2 gets hungry (lunch #9) +> [ 0.470000] (1:thread 2@Tremblay) Thread 2 eats +> [ 0.470000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.470000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.490000] (1:thread 2@Tremblay) Thread 2 is full +> [ 0.490000] (1:thread 2@Tremblay) Thread 2 thinks +> [ 0.490000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.510000] (1:thread 2@Tremblay) Thread 2 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.510000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #6) +> [ 0.520000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.520000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.520000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.550000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #6) +> [ 0.560000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.560000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.560000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.590000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.590000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.600000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #7) +> [ 0.600000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.620000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #7) +> [ 0.640000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.640000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.640000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.670000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.670000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.680000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #8) +> [ 0.680000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.700000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #8) +> [ 0.720000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.720000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.720000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.750000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.750000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.760000] (1:thread 4@Tremblay) Thread 4 gets hungry (lunch #9) +> [ 0.760000] (1:thread 4@Tremblay) Thread 4 eats +> [ 0.780000] (1:thread 3@Tremblay) Thread 3 gets hungry (lunch #9) +> [ 0.800000] (1:thread 3@Tremblay) Thread 3 eats +> [ 0.800000] (1:thread 4@Tremblay) Thread 4 is full +> [ 0.800000] (1:thread 4@Tremblay) Thread 4 thinks +> [ 0.830000] (1:thread 3@Tremblay) Thread 3 is full +> [ 0.830000] (1:thread 3@Tremblay) Thread 3 thinks +> [ 0.840000] (1:thread 4@Tremblay) Thread 4 tries to enter the dead-end; hopefully, the master will cancel it +> [ 0.860000] (1:philosopher@Tremblay) Cancel all childs +> [ 0.860000] (1:philosopher@Tremblay) Exiting GRAS +> [ 0.860000] (1:thread 3@Tremblay) Thread 3 tries to enter the dead-end; hopefully, the master will cancel it diff --git a/examples/gras/timer/timer.c b/examples/gras/timer/timer.c index 22be3d25ee..c2c16d27e7 100644 --- a/examples/gras/timer/timer.c +++ b/examples/gras/timer/timer.c @@ -85,5 +85,6 @@ int client(int argc, char *argv[]) gras_msg_handle(5.0); } gras_exit(); + xbt_free(globals); return 0; } /* end_of_client */ diff --git a/examples/lua/SimSplay/TODO b/examples/lua/SimSplay/TODO new file mode 100644 index 0000000000..42dcb7f73b --- /dev/null +++ b/examples/lua/SimSplay/TODO @@ -0,0 +1,26 @@ +-------------------------------------------- +A few notes abouts what I would like to do +to make Splay applications work with SimGrid +-------------------------------------------- + +Create an executable "simsplay" that runs a Splay Lua script +with SimGrid. + +Ideally, its usage would be: + +simsplay platform_file.{xml|lua} deployment_file.{xml|lua} splay_script.lua [simgrid_options...] + +I'm not sure about the format of the platform and deployment files yet. +We could accept both XML and Lua files, since their is a great Lua API to +describe platforms, or only the XML ones. + +The simsplay executable (which is compiled C) would initialize SimGrid, create +the environment, and for each simulated process, create a new lua_State* +object that runs the Lua script provided by the user (splay_script.lua in the +example above). + +The current Lua API of SimGrid (3.6) uses Lua coroutines (i.e. sequential, +lightweight threads) to simulate processes in a single, shared Lua state. +However, in Splay, the Lua global values must not be shared between simulated +processes: this is why we need distinct Lua states. + diff --git a/examples/lua/SimSplay/chord.lua b/examples/lua/SimSplay/chord.lua new file mode 100644 index 0000000000..7e2295428c --- /dev/null +++ b/examples/lua/SimSplay/chord.lua @@ -0,0 +1,73 @@ +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 +function join(n0) -- n0: some node in the ring + simgrid.info("Euh...") + predecessor = nil + finger[1] = call(n0, {'find_successor', n.id}) + simgrid.info("8Here..") + call(finger[1], {'notify', n}) +end + +function closest_preceding_node(id) + for i = m, 1, -1 do + if finger[i] and between(finger[i].id, n.id, id) then + return finger[i] + end + end + return n +end + +function find_successor(id) + if finger[1].id == n.id or between(id, n.id, (finger[1].id + 1) % 2^m) then + return finger[1] + else + local n0 = closest_preceding_node(id) + return call(n0, {'find_successor', id}) + end +end +function stabilize() + local x = call(finger[1], 'predecessor') + if x and between(x.id, n.id, finger[1].id) then + finger[1] = x -- new successor + call(finger[1], {'notify', n}) + end +end +function notify(n0) + if n0.id ~= n.id and + (not predecessor or between(n0.id, predecessor.id, n.id)) then + predecessor = n0 + end +end +function fix_fingers() + refresh = (refresh and (refresh % m) + 1) or 1 -- 1 <= next <= m + finger[refresh] = find_successor((n.id + 2^(refresh - 1)) % 2^m) +end +function check_predecessor() + if predecessor and not rpc.ping(predecessor) then + predecessor = nil + end +end + +n.id = math.random(1, 2^m) +finger[1] = n +if job then + n.ip, n.port = job.me.ip, job.me.port + join({ip = "192.42.43.42", port = 20000}) +else + simgrid.info("bizzaaaaaar...") + n.ip, n.port = "127.0.0.1", 20000 + if arg[1] then n.ip = arg[1] end + if arg[2] then n.port = tonumber(arg[2]) end + if not arg[3] then + print("RDV") + else + print("JOIN") + thread(function() join({ip = arg[3], port = tonumber(arg[4])}) end) + end +end +rpc.server(n.port) +events.periodic(stabilize, timeout) +events.periodic(check_predecessor, timeout) +events.periodic(fix_fingers, timeout) +events.loop() diff --git a/examples/lua/SimSplay/platform_script.lua b/examples/lua/SimSplay/platform_script.lua new file mode 100644 index 0000000000..59e37aac25 --- /dev/null +++ b/examples/lua/SimSplay/platform_script.lua @@ -0,0 +1,41 @@ +require "simgrid" + + simgrid.AS.new{id="AS0",mode="Full"}; + + simgrid.AS.addHost{AS="AS0",id="Tremblay",power=98095000}; + simgrid.AS.addHost{AS="AS0",id="Jupiter",power=76296000}; + simgrid.AS.addHost{AS="AS0",id="Fafard",power=76296000}; + + simgrid.Host.setProperty{host="Tremblay",prop_id="ip",prop_value="199.23.98.3"}; + simgrid.Host.setProperty{host="Tremblay",prop_id="port",prop_value="65"}; + simgrid.Host.setProperty{host="Jupiter",prop_id="ip",prop_value="199.23.98.4"}; + simgrid.Host.setProperty{host="Jupiter",prop_id="port",prop_value="83"}; + simgrid.Host.setProperty{host="Fafard",prop_id="ip",prop_value="199.23.98.5"}; + simgrid.Host.setProperty{host="Fafard",prop_id="port",prop_value="76"}; + -- create Links + for i=10,0,-1 do + simgrid.AS.addLink{AS="AS0",id=i,bandwidth=252750+ i*768,latency=0.000270544+i*0.087}; + end + -- simgrid.Route.new(src_id,des_id,links_nb,links_list) + simgrid.AS.addRoute("AS0","Tremblay","Jupiter",{"1"}); + simgrid.AS.addRoute("AS0","Tremblay","Fafard",{"0","1","2","3","4","8"}); + + simgrid.AS.addRoute("AS0","Jupiter","Tremblay",{"1"}); + simgrid.AS.addRoute("AS0","Jupiter","Fafard",{"0","1","2","3","4","8","9"}); + + simgrid.AS.addRoute("AS0","Fafard","Tremblay",{"0","1","2","3","4","8"}); + simgrid.AS.addRoute("AS0","Fafard","Jupiter",{"0","1","2","3","4","8","9"}); + + + --Save Platform + simgrid.msg_register_platform(); + + --Set Application + simgrid.Host.setFunction{host="Tremblay",fct="SPLAYschool",args=""}; + simgrid.Host.setFunction{host="Fafard",fct="SPLAYschool",args=""}; + simgrid.Host.setFunction{host="Jupiter",fct="SPLAYschool",args=""}; + + --Save Application + simgrid.msg_register_application(); + + diff --git a/examples/lua/SimSplay/sim_splay.lua b/examples/lua/SimSplay/sim_splay.lua new file mode 100644 index 0000000000..0f59caaced --- /dev/null +++ b/examples/lua/SimSplay/sim_splay.lua @@ -0,0 +1,116 @@ +require "simgrid" + +-- Splay global modules +rpc = {} +log = {} +job = {} +events = {} +os = {} +start = {} +misc = {} + +-- Splay global variables +job.me = {} +job.nodes = {} +job.list_type = "random" + +-- Init nodes tables +function init_nodes() + for i = 1, simgrid.Host.number() do + job.nodes[i] = { ip = simgrid.Host.getPropValue(simgrid.Host.at(i), "ip"), + port = simgrid.Host.getPropValue(simgrid.Host.at(i), "port") } + end +end + +function init_jobs() + init_nodes() +end + +-- Job methods +function job.me.ip() + return simgrid.Host.getPropValue(simgrid.Host.self(), "ip") +end + +function job.me.port() + return simgrid.Host.getPropValue(simgrid.Host.self(), "port") +end + + +function job.position() + return simgrid.Host.getPropValue(simgrid.Host.self(), "position") +end + +-- log Methods +function log:print(msg) + simgrid.info(msg); +end + +-- rpc Methods +function rpc.call(node, call) + --init_nodes(); + func = "empty" + arg = "empty" + mailbox = node + + if type(node) == "table" then + mailbox = node.ip..":"..node.port + end + + if type(call) == "table" then + func = call[1] + arg = call[2] + end + task_call = simgrid.Task.new("splay_task", 10000, 10000) + task_call['func_call_name'] = func + task_call['func_call_arg'] = arg + log:print("Sending Task to mailbox "..mailbox.." to call '"..func.."' with arg '"..arg.."'") + simgrid.Task.send(task_call, mailbox) + +end + +function rpc.server(port) + -- nothing really to do : no need to open Socket since it's a Simulation +end + +-- event Methods +function events.sleep(time) + my_mailbox = job.me.ip()..":"..job.me.port() + task = simgrid.Task.recv_timeout(my_mailbox, time) + + if task ~= nil then + -- an RPC call just woke me up + call_function(task['func_call_name'], task['func_call_arg']) + end +end + +-- main function for each process, this is equivalent to the deployment file +function events.thread(main_func) + dofile("platform_script.lua") + init_jobs() +end + +-- OS methods +function os.exit() + simgrid.Host.destroy(simgrid.Host.self()) +end + +-- Start Methods +function start.loop() + simgrid.run() + --simgrid.clean() +end + +-- Misc Methods +function misc.between(a, b) + return a +end + +-- useful functions +function call_function(fct, arg) + _G[fct](arg) +end + +function SPLAYschool(arg) + simgrid.info("Calling me..."..arg) +end + diff --git a/examples/lua/SimSplay/splay_school.lua b/examples/lua/SimSplay/splay_school.lua new file mode 100644 index 0000000000..51cd58c40a --- /dev/null +++ b/examples/lua/SimSplay/splay_school.lua @@ -0,0 +1,24 @@ +require("sim_splay") + +function SPLAYschool() + log:print("My ip is: "..job.me.ip()) + for i = 1000,10000 do + log:print(i) + end + + events.sleep(5) + + if job.me.ip() == job.nodes[1].ip then + rpc.call(job.nodes[2], {"call_me", job.me.ip()}) + end + events.sleep(5) + os.exit() +end + +function call_me(from) + log:print("I received an RPC from "..from) +end + +events.thread("SPLAYschool") +start.loop() + diff --git a/examples/lua/console/master_slave_bypass.tesh b/examples/lua/console/master_slave_bypass.tesh index 97011fffb0..684ce4b859 100644 --- a/examples/lua/console/master_slave_bypass.tesh +++ b/examples/lua/console/master_slave_bypass.tesh @@ -3,106 +3,106 @@ $ lua master_slave_bypass.lua --log=surf_parse.thres:critical > [Tremblay:Master:(1) 0.000000] [lua/INFO] Hello from lua, I'm the master > [Tremblay:Master:(1) 0.000000] [lua/INFO] Got 20 -> [Tremblay:Master:(1) 0.000000] [lua/INFO] Got 50000000 +> [Tremblay:Master:(1) 0.000000] [lua/INFO] Got 550000000 > [Tremblay:Master:(1) 0.000000] [lua/INFO] Got 1000000 > [Tremblay:Master:(1) 0.000000] [lua/INFO] Got 4 > [Tremblay:Master:(1) 0.000000] [lua/INFO] Argc=4 (should be 4) > [Tremblay:Master:(1) 0.000000] [lua/INFO] Master sending 'Task 1' To 'slave 1' -> [Bourassa:Slave:(2) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 0 -> [Jupiter:Slave:(3) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 1 -> [Fafard:Slave:(4) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 2 -> [Ginette:Slave:(5) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 3 -> [Jupiter:Slave:(3) 0.165962] [lua/INFO] Slave 'slave 1' processing Task 1 -> [Tremblay:Master:(1) 0.165962] [lua/INFO] Master done sending 'Task 1' To 'slave 1' -> [Tremblay:Master:(1) 0.165962] [lua/INFO] Master sending 'Task 2' To 'slave 2' -> [Fafard:Slave:(4) 0.384115] [lua/INFO] Slave 'slave 2' processing Task 2 -> [Tremblay:Master:(1) 0.384115] [lua/INFO] Master done sending 'Task 2' To 'slave 2' -> [Tremblay:Master:(1) 0.384115] [lua/INFO] Master sending 'Task 3' To 'slave 3' -> [Ginette:Slave:(5) 0.524575] [lua/INFO] Slave 'slave 3' processing Task 3 -> [Tremblay:Master:(1) 0.524575] [lua/INFO] Master done sending 'Task 3' To 'slave 3' -> [Tremblay:Master:(1) 0.524575] [lua/INFO] Master sending 'Task 4' To 'slave 0' -> [Bourassa:Slave:(2) 0.740447] [lua/INFO] Slave 'slave 0' processing Task 4 -> [Tremblay:Master:(1) 0.740447] [lua/INFO] Master done sending 'Task 4' To 'slave 0' -> [Tremblay:Master:(1) 0.740447] [lua/INFO] Master sending 'Task 5' To 'slave 1' -> [Jupiter:Slave:(3) 0.821304] [lua/INFO] Slave 'slave 1': task Task 1 done -> [Jupiter:Slave:(3) 0.987266] [lua/INFO] Slave 'slave 1' processing Task 5 -> [Tremblay:Master:(1) 0.987266] [lua/INFO] Master done sending 'Task 5' To 'slave 1' -> [Tremblay:Master:(1) 0.987266] [lua/INFO] Master sending 'Task 6' To 'slave 2' -> [Fafard:Slave:(4) 1.039457] [lua/INFO] Slave 'slave 2': task Task 2 done -> [Fafard:Slave:(4) 1.257610] [lua/INFO] Slave 'slave 2' processing Task 6 -> [Tremblay:Master:(1) 1.257610] [lua/INFO] Master done sending 'Task 6' To 'slave 2' -> [Tremblay:Master:(1) 1.257610] [lua/INFO] Master sending 'Task 7' To 'slave 3' -> [Ginette:Slave:(5) 1.555672] [lua/INFO] Slave 'slave 3': task Task 3 done -> [Jupiter:Slave:(3) 1.642608] [lua/INFO] Slave 'slave 1': task Task 5 done -> [Ginette:Slave:(5) 1.696132] [lua/INFO] Slave 'slave 3' processing Task 7 -> [Tremblay:Master:(1) 1.696132] [lua/INFO] Master done sending 'Task 7' To 'slave 3' -> [Tremblay:Master:(1) 1.696132] [lua/INFO] Master sending 'Task 8' To 'slave 0' -> [Bourassa:Slave:(2) 1.771545] [lua/INFO] Slave 'slave 0': task Task 4 done -> [Fafard:Slave:(4) 1.912953] [lua/INFO] Slave 'slave 2': task Task 6 done -> [Bourassa:Slave:(2) 1.987417] [lua/INFO] Slave 'slave 0' processing Task 8 -> [Tremblay:Master:(1) 1.987417] [lua/INFO] Master done sending 'Task 8' To 'slave 0' -> [Tremblay:Master:(1) 1.987417] [lua/INFO] Master sending 'Task 9' To 'slave 1' -> [Jupiter:Slave:(3) 2.153379] [lua/INFO] Slave 'slave 1' processing Task 9 -> [Tremblay:Master:(1) 2.153379] [lua/INFO] Master done sending 'Task 9' To 'slave 1' -> [Tremblay:Master:(1) 2.153379] [lua/INFO] Master sending 'Task 10' To 'slave 2' -> [Fafard:Slave:(4) 2.371532] [lua/INFO] Slave 'slave 2' processing Task 10 -> [Tremblay:Master:(1) 2.371532] [lua/INFO] Master done sending 'Task 10' To 'slave 2' -> [Tremblay:Master:(1) 2.371532] [lua/INFO] Master sending 'Task 11' To 'slave 3' -> [Ginette:Slave:(5) 2.727230] [lua/INFO] Slave 'slave 3': task Task 7 done -> [Jupiter:Slave:(3) 2.808721] [lua/INFO] Slave 'slave 1': task Task 9 done -> [Ginette:Slave:(5) 2.867690] [lua/INFO] Slave 'slave 3' processing Task 11 -> [Tremblay:Master:(1) 2.867690] [lua/INFO] Master done sending 'Task 11' To 'slave 3' -> [Tremblay:Master:(1) 2.867690] [lua/INFO] Master sending 'Task 12' To 'slave 0' -> [Bourassa:Slave:(2) 3.018515] [lua/INFO] Slave 'slave 0': task Task 8 done -> [Fafard:Slave:(4) 3.026874] [lua/INFO] Slave 'slave 2': task Task 10 done -> [Bourassa:Slave:(2) 3.234387] [lua/INFO] Slave 'slave 0' processing Task 12 -> [Tremblay:Master:(1) 3.234387] [lua/INFO] Master done sending 'Task 12' To 'slave 0' -> [Tremblay:Master:(1) 3.234387] [lua/INFO] Master sending 'Task 13' To 'slave 1' -> [Jupiter:Slave:(3) 3.400349] [lua/INFO] Slave 'slave 1' processing Task 13 -> [Tremblay:Master:(1) 3.400349] [lua/INFO] Master done sending 'Task 13' To 'slave 1' -> [Tremblay:Master:(1) 3.400349] [lua/INFO] Master sending 'Task 14' To 'slave 2' -> [Fafard:Slave:(4) 3.618502] [lua/INFO] Slave 'slave 2' processing Task 14 -> [Tremblay:Master:(1) 3.618502] [lua/INFO] Master done sending 'Task 14' To 'slave 2' -> [Tremblay:Master:(1) 3.618502] [lua/INFO] Master sending 'Task 15' To 'slave 3' -> [Ginette:Slave:(5) 3.898788] [lua/INFO] Slave 'slave 3': task Task 11 done -> [Ginette:Slave:(5) 4.039247] [lua/INFO] Slave 'slave 3' processing Task 15 -> [Tremblay:Master:(1) 4.039247] [lua/INFO] Master done sending 'Task 15' To 'slave 3' -> [Tremblay:Master:(1) 4.039247] [lua/INFO] Master sending 'Task 16' To 'slave 0' -> [Jupiter:Slave:(3) 4.055691] [lua/INFO] Slave 'slave 1': task Task 13 done -> [Bourassa:Slave:(2) 4.265485] [lua/INFO] Slave 'slave 0': task Task 12 done -> [Fafard:Slave:(4) 4.273845] [lua/INFO] Slave 'slave 2': task Task 14 done -> [Bourassa:Slave:(2) 4.481357] [lua/INFO] Slave 'slave 0' processing Task 16 -> [Tremblay:Master:(1) 4.481357] [lua/INFO] Master done sending 'Task 16' To 'slave 0' -> [Tremblay:Master:(1) 4.481357] [lua/INFO] Master sending 'Task 17' To 'slave 1' -> [Jupiter:Slave:(3) 4.647319] [lua/INFO] Slave 'slave 1' processing Task 17 -> [Tremblay:Master:(1) 4.647319] [lua/INFO] Master done sending 'Task 17' To 'slave 1' -> [Tremblay:Master:(1) 4.647319] [lua/INFO] Master sending 'Task 18' To 'slave 2' -> [Fafard:Slave:(4) 4.865472] [lua/INFO] Slave 'slave 2' processing Task 18 -> [Tremblay:Master:(1) 4.865472] [lua/INFO] Master done sending 'Task 18' To 'slave 2' -> [Tremblay:Master:(1) 4.865472] [lua/INFO] Master sending 'Task 19' To 'slave 3' -> [Ginette:Slave:(5) 5.070345] [lua/INFO] Slave 'slave 3': task Task 15 done -> [Ginette:Slave:(5) 5.210805] [lua/INFO] Slave 'slave 3' processing Task 19 -> [Tremblay:Master:(1) 5.210805] [lua/INFO] Master done sending 'Task 19' To 'slave 3' -> [Tremblay:Master:(1) 5.210805] [lua/INFO] Master sending 'Task 20' To 'slave 0' -> [Jupiter:Slave:(3) 5.302662] [lua/INFO] Slave 'slave 1': task Task 17 done -> [Bourassa:Slave:(2) 5.512455] [lua/INFO] Slave 'slave 0': task Task 16 done -> [Fafard:Slave:(4) 5.520815] [lua/INFO] Slave 'slave 2': task Task 18 done -> [Bourassa:Slave:(2) 5.728328] [lua/INFO] Slave 'slave 0' processing Task 20 -> [Tremblay:Master:(1) 5.728328] [lua/INFO] Master done sending 'Task 20' To 'slave 0' -> [Tremblay:Master:(1) 5.728328] [lua/INFO] Master: All tasks have been dispatched. Let's tell everybody the computation is over. -> [Tremblay:Master:(1) 5.728328] [lua/INFO] Master: sending finalize to slave 0 -> [Ginette:Slave:(5) 6.241903] [lua/INFO] Slave 'slave 3': task Task 19 done -> [Bourassa:Slave:(2) 6.759426] [lua/INFO] Slave 'slave 0': task Task 20 done -> [Bourassa:Slave:(2) 6.975298] [lua/INFO] Slave 'slave 0' got finalize msg -> [Bourassa:Slave:(2) 6.975298] [lua/INFO] Slave 'slave 0': I'm Done . See You !! -> [Tremblay:Master:(1) 6.975298] [lua/INFO] Master: sending finalize to slave 1 -> [Jupiter:Slave:(3) 7.141260] [lua/INFO] Slave 'slave 1' got finalize msg -> [Jupiter:Slave:(3) 7.141260] [lua/INFO] Slave 'slave 1': I'm Done . See You !! -> [Tremblay:Master:(1) 7.141260] [lua/INFO] Master: sending finalize to slave 2 -> [Fafard:Slave:(4) 7.359413] [lua/INFO] Slave 'slave 2' got finalize msg -> [Fafard:Slave:(4) 7.359413] [lua/INFO] Slave 'slave 2': I'm Done . See You !! -> [Tremblay:Master:(1) 7.359413] [lua/INFO] Master: sending finalize to slave 3 -> [Ginette:Slave:(5) 7.499872] [lua/INFO] Slave 'slave 3' got finalize msg -> [Ginette:Slave:(5) 7.499872] [lua/INFO] Slave 'slave 3': I'm Done . See You !! -> [Tremblay:Master:(1) 7.499872] [lua/INFO] Master: Everything's done. -> [7.499872] [lua/INFO] Simulation's over.See you. +> [Jupiter:Slave:(2) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 1 +> [Fafard:Slave:(3) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 2 +> [Ginette:Slave:(4) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 3 +> [Bourassa:Slave:(5) 0.000000] [lua/INFO] Hello from lua, I'm a poor slave with mbox: slave 0 +> [Jupiter:Slave:(2) 9.634668] [lua/INFO] Slave 'slave 1' processing Task 1 +> [Tremblay:Master:(1) 9.634668] [lua/INFO] Master done sending 'Task 1' To 'slave 1' +> [Tremblay:Master:(1) 9.634668] [lua/INFO] Master sending 'Task 2' To 'slave 2' +> [Jupiter:Slave:(2) 16.843434] [lua/INFO] Slave 'slave 1': task Task 1 done +> [Fafard:Slave:(3) 182.700276] [lua/INFO] Slave 'slave 2' processing Task 2 +> [Tremblay:Master:(1) 182.700276] [lua/INFO] Master done sending 'Task 2' To 'slave 2' +> [Tremblay:Master:(1) 182.700276] [lua/INFO] Master sending 'Task 3' To 'slave 3' +> [Fafard:Slave:(3) 189.909042] [lua/INFO] Slave 'slave 2': task Task 2 done +> [Ginette:Slave:(4) 298.047481] [lua/INFO] Slave 'slave 3' processing Task 3 +> [Tremblay:Master:(1) 298.047481] [lua/INFO] Master done sending 'Task 3' To 'slave 3' +> [Tremblay:Master:(1) 298.047481] [lua/INFO] Master sending 'Task 4' To 'slave 0' +> [Ginette:Slave:(4) 309.389558] [lua/INFO] Slave 'slave 3': task Task 3 done +> [Bourassa:Slave:(5) 519.166957] [lua/INFO] Slave 'slave 0' processing Task 4 +> [Tremblay:Master:(1) 519.166957] [lua/INFO] Master done sending 'Task 4' To 'slave 0' +> [Tremblay:Master:(1) 519.166957] [lua/INFO] Master sending 'Task 5' To 'slave 1' +> [Jupiter:Slave:(2) 528.801625] [lua/INFO] Slave 'slave 1' processing Task 5 +> [Tremblay:Master:(1) 528.801625] [lua/INFO] Master done sending 'Task 5' To 'slave 1' +> [Tremblay:Master:(1) 528.801625] [lua/INFO] Master sending 'Task 6' To 'slave 2' +> [Bourassa:Slave:(5) 530.509034] [lua/INFO] Slave 'slave 0': task Task 4 done +> [Jupiter:Slave:(2) 536.010391] [lua/INFO] Slave 'slave 1': task Task 5 done +> [Fafard:Slave:(3) 701.867233] [lua/INFO] Slave 'slave 2' processing Task 6 +> [Tremblay:Master:(1) 701.867233] [lua/INFO] Master done sending 'Task 6' To 'slave 2' +> [Tremblay:Master:(1) 701.867233] [lua/INFO] Master sending 'Task 7' To 'slave 3' +> [Fafard:Slave:(3) 709.075999] [lua/INFO] Slave 'slave 2': task Task 6 done +> [Ginette:Slave:(4) 817.214438] [lua/INFO] Slave 'slave 3' processing Task 7 +> [Tremblay:Master:(1) 817.214438] [lua/INFO] Master done sending 'Task 7' To 'slave 3' +> [Tremblay:Master:(1) 817.214438] [lua/INFO] Master sending 'Task 8' To 'slave 0' +> [Ginette:Slave:(4) 828.556515] [lua/INFO] Slave 'slave 3': task Task 7 done +> [Bourassa:Slave:(5) 1038.333914] [lua/INFO] Slave 'slave 0' processing Task 8 +> [Tremblay:Master:(1) 1038.333914] [lua/INFO] Master done sending 'Task 8' To 'slave 0' +> [Tremblay:Master:(1) 1038.333914] [lua/INFO] Master sending 'Task 9' To 'slave 1' +> [Jupiter:Slave:(2) 1047.968582] [lua/INFO] Slave 'slave 1' processing Task 9 +> [Tremblay:Master:(1) 1047.968582] [lua/INFO] Master done sending 'Task 9' To 'slave 1' +> [Tremblay:Master:(1) 1047.968582] [lua/INFO] Master sending 'Task 10' To 'slave 2' +> [Bourassa:Slave:(5) 1049.675991] [lua/INFO] Slave 'slave 0': task Task 8 done +> [Jupiter:Slave:(2) 1055.177348] [lua/INFO] Slave 'slave 1': task Task 9 done +> [Fafard:Slave:(3) 1221.034190] [lua/INFO] Slave 'slave 2' processing Task 10 +> [Tremblay:Master:(1) 1221.034190] [lua/INFO] Master done sending 'Task 10' To 'slave 2' +> [Tremblay:Master:(1) 1221.034190] [lua/INFO] Master sending 'Task 11' To 'slave 3' +> [Fafard:Slave:(3) 1228.242956] [lua/INFO] Slave 'slave 2': task Task 10 done +> [Ginette:Slave:(4) 1336.381395] [lua/INFO] Slave 'slave 3' processing Task 11 +> [Tremblay:Master:(1) 1336.381395] [lua/INFO] Master done sending 'Task 11' To 'slave 3' +> [Tremblay:Master:(1) 1336.381395] [lua/INFO] Master sending 'Task 12' To 'slave 0' +> [Ginette:Slave:(4) 1347.723472] [lua/INFO] Slave 'slave 3': task Task 11 done +> [Bourassa:Slave:(5) 1557.500871] [lua/INFO] Slave 'slave 0' processing Task 12 +> [Tremblay:Master:(1) 1557.500871] [lua/INFO] Master done sending 'Task 12' To 'slave 0' +> [Tremblay:Master:(1) 1557.500871] [lua/INFO] Master sending 'Task 13' To 'slave 1' +> [Jupiter:Slave:(2) 1567.135539] [lua/INFO] Slave 'slave 1' processing Task 13 +> [Tremblay:Master:(1) 1567.135539] [lua/INFO] Master done sending 'Task 13' To 'slave 1' +> [Tremblay:Master:(1) 1567.135539] [lua/INFO] Master sending 'Task 14' To 'slave 2' +> [Bourassa:Slave:(5) 1568.842948] [lua/INFO] Slave 'slave 0': task Task 12 done +> [Jupiter:Slave:(2) 1574.344305] [lua/INFO] Slave 'slave 1': task Task 13 done +> [Fafard:Slave:(3) 1740.201147] [lua/INFO] Slave 'slave 2' processing Task 14 +> [Tremblay:Master:(1) 1740.201147] [lua/INFO] Master done sending 'Task 14' To 'slave 2' +> [Tremblay:Master:(1) 1740.201147] [lua/INFO] Master sending 'Task 15' To 'slave 3' +> [Fafard:Slave:(3) 1747.409913] [lua/INFO] Slave 'slave 2': task Task 14 done +> [Ginette:Slave:(4) 1855.548352] [lua/INFO] Slave 'slave 3' processing Task 15 +> [Tremblay:Master:(1) 1855.548352] [lua/INFO] Master done sending 'Task 15' To 'slave 3' +> [Tremblay:Master:(1) 1855.548352] [lua/INFO] Master sending 'Task 16' To 'slave 0' +> [Ginette:Slave:(4) 1866.890429] [lua/INFO] Slave 'slave 3': task Task 15 done +> [Bourassa:Slave:(5) 2076.667828] [lua/INFO] Slave 'slave 0' processing Task 16 +> [Tremblay:Master:(1) 2076.667828] [lua/INFO] Master done sending 'Task 16' To 'slave 0' +> [Tremblay:Master:(1) 2076.667828] [lua/INFO] Master sending 'Task 17' To 'slave 1' +> [Jupiter:Slave:(2) 2086.302496] [lua/INFO] Slave 'slave 1' processing Task 17 +> [Tremblay:Master:(1) 2086.302496] [lua/INFO] Master done sending 'Task 17' To 'slave 1' +> [Tremblay:Master:(1) 2086.302496] [lua/INFO] Master sending 'Task 18' To 'slave 2' +> [Bourassa:Slave:(5) 2088.009905] [lua/INFO] Slave 'slave 0': task Task 16 done +> [Jupiter:Slave:(2) 2093.511262] [lua/INFO] Slave 'slave 1': task Task 17 done +> [Fafard:Slave:(3) 2259.368104] [lua/INFO] Slave 'slave 2' processing Task 18 +> [Tremblay:Master:(1) 2259.368104] [lua/INFO] Master done sending 'Task 18' To 'slave 2' +> [Tremblay:Master:(1) 2259.368104] [lua/INFO] Master sending 'Task 19' To 'slave 3' +> [Fafard:Slave:(3) 2266.576870] [lua/INFO] Slave 'slave 2': task Task 18 done +> [Ginette:Slave:(4) 2374.715308] [lua/INFO] Slave 'slave 3' processing Task 19 +> [Tremblay:Master:(1) 2374.715308] [lua/INFO] Master done sending 'Task 19' To 'slave 3' +> [Tremblay:Master:(1) 2374.715308] [lua/INFO] Master sending 'Task 20' To 'slave 0' +> [Ginette:Slave:(4) 2386.057386] [lua/INFO] Slave 'slave 3': task Task 19 done +> [Bourassa:Slave:(5) 2595.834785] [lua/INFO] Slave 'slave 0' processing Task 20 +> [Tremblay:Master:(1) 2595.834785] [lua/INFO] Master done sending 'Task 20' To 'slave 0' +> [Tremblay:Master:(1) 2595.834785] [lua/INFO] Master: All tasks have been dispatched. Let's tell everybody the computation is over. +> [Tremblay:Master:(1) 2595.834785] [lua/INFO] Master: sending finalize to slave 0 +> [Bourassa:Slave:(5) 2607.176862] [lua/INFO] Slave 'slave 0': task Task 20 done +> [Bourassa:Slave:(5) 2828.296338] [lua/INFO] Slave 'slave 0' got finalize msg +> [Bourassa:Slave:(5) 2828.296338] [lua/INFO] Slave 'slave 0': I'm Done . See You !! +> [Tremblay:Master:(1) 2828.296338] [lua/INFO] Master: sending finalize to slave 1 +> [Jupiter:Slave:(2) 2837.931006] [lua/INFO] Slave 'slave 1' got finalize msg +> [Jupiter:Slave:(2) 2837.931006] [lua/INFO] Slave 'slave 1': I'm Done . See You !! +> [Tremblay:Master:(1) 2837.931006] [lua/INFO] Master: sending finalize to slave 2 +> [Fafard:Slave:(3) 3010.996615] [lua/INFO] Slave 'slave 2' got finalize msg +> [Fafard:Slave:(3) 3010.996615] [lua/INFO] Slave 'slave 2': I'm Done . See You !! +> [Tremblay:Master:(1) 3010.996615] [lua/INFO] Master: sending finalize to slave 3 +> [Ginette:Slave:(4) 3126.343819] [lua/INFO] Slave 'slave 3' got finalize msg +> [Ginette:Slave:(4) 3126.343819] [lua/INFO] Slave 'slave 3': I'm Done . See You !! +> [Tremblay:Master:(1) 3126.343819] [lua/INFO] Master: Everything's done. +> [3126.343819] [lua/INFO] Simulation's over.See you. diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index 86768803c5..f3b9299968 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -12,11 +12,6 @@ #include "xbt.h" /* calloc, printf */ #include "instr/instr_private.h" -#include "msg/private.h" /* You don't want to know why, trust us */ -#include "simix/private.h" - -void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory); - XBT_LOG_NEW_DEFAULT_CATEGORY(actions, "Messages specific for this msg example"); int communicator_size = 0; @@ -103,11 +98,6 @@ static void action_send(const char *const *action) asynchronous_cleanup(); } -static int task_recv_matching(void*ignored,void*recv_task) { - XBT_DEBUG("Trying to recv_match with %p", recv_task); - return recv_task != NULL; -} - static void action_Isend(const char *const *action) { char to[250]; @@ -118,36 +108,16 @@ static void action_Isend(const char *const *action) sprintf(to, "%s_%s", MSG_process_get_name(MSG_process_self()),action[2]); m_task_t task = MSG_task_create(to,0,parse_double(size),NULL); + msg_comm_t comm = MSG_task_isend_with_matching(task, to, /*matching madness*/NULL,task); + xbt_dynar_push(globals->isends,&comm); - smx_rdv_t rdv = MSG_mailbox_get_by_alias(to); - - if(SIMIX_comm_has_recv_match(rdv, task_recv_matching, NULL)) { - XBT_DEBUG("Switching back to MSG_task_send: %s", to); - MSG_task_send(task, to); - } else { - - msg_comm_t comm = MSG_task_isend_with_matching(task, to, /*matching madness*/NULL,task); - xbt_dynar_push(globals->isends,&comm); - - if (task->simdata->message_size < 65536) { - /* Close your eyes, it burns ! */ - comm->s_comm->comm.dst_proc = SIMIX_process_get_by_name(action[2]); - comm->s_comm->comm.dst_buff = NULL; - comm->s_comm->comm.dst_buff_size = NULL; - comm->s_comm->comm.dst_data = NULL; - comm->s_comm->state = SIMIX_READY; - comm->s_comm->comm.refcount++; - SIMIX_comm_start(comm->s_comm); - } - - XBT_DEBUG("Isend on %s", MSG_process_get_name(MSG_process_self())); - XBT_VERB("%s %f", xbt_str_join_array(action, " "), MSG_get_clock() - clock); - } + XBT_DEBUG("Isend on %s", MSG_process_get_name(MSG_process_self())); + XBT_VERB("%s %f", xbt_str_join_array(action, " "), MSG_get_clock() - clock); asynchronous_cleanup(); } -static int task_sent_matching(void*ignored,void*sent_task) { +static int task_matching(void*ignored,void*sent_task) { m_task_t t = (m_task_t)sent_task; if (t!=NULL && MSG_task_get_data_size(t)<65536) return 1; /* that's supposed to be already arrived */ @@ -176,19 +146,11 @@ static void action_recv(const char *const *action) /* make sure the rdv is created on need by asking to MSG instead of simix directly */ smx_rdv_t rdv = MSG_mailbox_get_by_alias(mailbox_name); - smx_action_t act = SIMIX_comm_get_send_match(rdv, task_sent_matching, NULL); + smx_action_t act = SIMIX_comm_get_send_match(rdv,task_matching,NULL); if (act!=NULL){ /* FIXME account for the memcopy time if needed */ - task = act->comm.src_data; - - if (task->simdata->message_size < 65536) { - act->comm.refcount--; /* See action_send for more pain */ - if(act->state == SIMIX_DONE) - SIMIX_comm_finish(act); - else - SIMIX_req_comm_wait(act, -1.0); - return; - } + SIMIX_comm_finish(act); + return; } #ifdef HAVE_TRACING @@ -198,9 +160,7 @@ static void action_recv(const char *const *action) #endif XBT_DEBUG("Receiving: %s", name); - /* Mimic a call to MSG_task_receive(&task, mailbox_name); */ - SIMIX_req_comm_recv(rdv, &task, NULL, NULL, &task, -1.0); - + MSG_task_receive(&task, mailbox_name); // MSG_task_receive(&task, MSG_process_get_name(MSG_process_self())); XBT_VERB("%s %f", name, MSG_get_clock() - clock); MSG_task_destroy(task); @@ -586,8 +546,6 @@ int main(int argc, char *argv[]) { MSG_error_t res = MSG_OK; - smx_factory_initializer_to_use = SIMIX_ctx_raw_factory_init; - /* Check the given arguments */ MSG_global_init(&argc, argv); if (argc < 3) { diff --git a/examples/msg/chord/chord.c b/examples/msg/chord/chord.c index 3c287b7d41..15d3423466 100644 --- a/examples/msg/chord/chord.c +++ b/examples/msg/chord/chord.c @@ -890,8 +890,6 @@ static void random_lookup(node_t node) */ int main(int argc, char *argv[]) { - xbt_os_timer_t timer = xbt_os_timer_new(); - if (argc < 3) { printf("Usage: %s [-nb_bits=n] [-timeout=t] platform_file deployment_file\n", argv[0]); printf("example: %s ../msg_platform.xml chord.xml\n", argv[0]); @@ -933,10 +931,8 @@ int main(int argc, char *argv[]) MSG_function_register("node", node); MSG_launch_application(application_file); - xbt_os_timer_start(timer); MSG_error_t res = MSG_main(); - xbt_os_timer_stop(timer); - XBT_CRITICAL("Simulation time %lf, messages created: %ld", xbt_os_timer_elapsed(timer), smx_total_comms); + XBT_CRITICAL("Messages created: %ld", smx_total_comms); XBT_INFO("Simulated time: %g", MSG_get_clock()); MSG_clean(); diff --git a/examples/msg/chord/chord.tesh b/examples/msg/chord/chord.tesh new file mode 100644 index 0000000000..d5b0dfb660 --- /dev/null +++ b/examples/msg/chord/chord.tesh @@ -0,0 +1,429 @@ +#! ./tesh + +p Testing the Chord implementation with MSG + +! output sort +$ $SG_TEST_EXENV ${bindir:=.}/chord$EXEEXT -nb_bits=6 ${srcdir:=.}/../msg_platform.xml ${srcdir:=.}/chord.xml --log=msg_chord.thres:verbose "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (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] (8:node@Jacquelin) My finger table: +> [ 0.000000] (8:node@Jacquelin) Start | Succ +> [ 0.000000] (8:node@Jacquelin) 2 | 1 +> [ 0.000000] (8:node@Jacquelin) 3 | 1 +> [ 0.000000] (8:node@Jacquelin) 5 | 1 +> [ 0.000000] (8:node@Jacquelin) 9 | 1 +> [ 0.000000] (8:node@Jacquelin) 17 | 1 +> [ 0.000000] (8:node@Jacquelin) 33 | 1 +> [ 0.000000] (8:node@Jacquelin) Predecessor: -1 +> [ 6.018864] (1:node@Gatien) My finger table: +> [ 6.018864] (1:node@Gatien) Start | Succ +> [ 6.018864] (1:node@Gatien) 49 | 1 +> [ 6.018864] (1:node@Gatien) 50 | 48 +> [ 6.018864] (1:node@Gatien) 52 | 48 +> [ 6.018864] (1:node@Gatien) 56 | 48 +> [ 6.018864] (1:node@Gatien) 0 | 48 +> [ 6.018864] (1:node@Gatien) 16 | 48 +> [ 6.018864] (1:node@Gatien) Predecessor: -1 +> [ 10.710204] (2:node@McGee) My finger table: +> [ 10.710204] (2:node@McGee) Start | Succ +> [ 10.710204] (2:node@McGee) 43 | 1 +> [ 10.710204] (2:node@McGee) 44 | 42 +> [ 10.710204] (2:node@McGee) 46 | 42 +> [ 10.710204] (2:node@McGee) 50 | 42 +> [ 10.710204] (2:node@McGee) 58 | 42 +> [ 10.710204] (2:node@McGee) 10 | 42 +> [ 10.710204] (2:node@McGee) Predecessor: -1 +> [ 17.433288] (3:node@iRMX) My finger table: +> [ 17.433288] (3:node@iRMX) Start | Succ +> [ 17.433288] (3:node@iRMX) 39 | 1 +> [ 17.433288] (3:node@iRMX) 40 | 38 +> [ 17.433288] (3:node@iRMX) 42 | 38 +> [ 17.433288] (3:node@iRMX) 46 | 38 +> [ 17.433288] (3:node@iRMX) 54 | 38 +> [ 17.433288] (3:node@iRMX) 6 | 38 +> [ 17.433288] (3:node@iRMX) Predecessor: -1 +> [ 20.004273] (4:node@Geoff) My finger table: +> [ 20.004273] (4:node@Geoff) Start | Succ +> [ 20.004273] (4:node@Geoff) 33 | 1 +> [ 20.004273] (4:node@Geoff) 34 | 32 +> [ 20.004273] (4:node@Geoff) 36 | 32 +> [ 20.004273] (4:node@Geoff) 40 | 32 +> [ 20.004273] (4:node@Geoff) 48 | 32 +> [ 20.004273] (4:node@Geoff) 0 | 32 +> [ 20.004273] (4:node@Geoff) Predecessor: -1 +> [ 26.449094] (5:node@TeX) My finger table: +> [ 26.449094] (5:node@TeX) Start | Succ +> [ 26.449094] (5:node@TeX) 22 | 1 +> [ 26.449094] (5:node@TeX) 23 | 21 +> [ 26.449094] (5:node@TeX) 25 | 21 +> [ 26.449094] (5:node@TeX) 29 | 21 +> [ 26.449094] (5:node@TeX) 37 | 21 +> [ 26.449094] (5:node@TeX) 53 | 21 +> [ 26.449094] (5:node@TeX) Predecessor: -1 +> [ 30.739573] (6:node@Jean_Yves) My finger table: +> [ 30.739573] (6:node@Jean_Yves) Start | Succ +> [ 30.739573] (6:node@Jean_Yves) 15 | 1 +> [ 30.739573] (6:node@Jean_Yves) 16 | 14 +> [ 30.739573] (6:node@Jean_Yves) 18 | 14 +> [ 30.739573] (6:node@Jean_Yves) 22 | 14 +> [ 30.739573] (6:node@Jean_Yves) 30 | 14 +> [ 30.739573] (6:node@Jean_Yves) 46 | 14 +> [ 30.739573] (6:node@Jean_Yves) Predecessor: -1 +> [ 35.838541] (7:node@Boivin) My finger table: +> [ 35.838541] (7:node@Boivin) Start | Succ +> [ 35.838541] (7:node@Boivin) 9 | 1 +> [ 35.838541] (7:node@Boivin) 10 | 8 +> [ 35.838541] (7:node@Boivin) 12 | 8 +> [ 35.838541] (7:node@Boivin) 16 | 8 +> [ 35.838541] (7:node@Boivin) 24 | 8 +> [ 35.838541] (7:node@Boivin) 40 | 8 +> [ 35.838541] (7:node@Boivin) Predecessor: -1 +> [ 75.000000] (8:node@Jacquelin) My finger table: +> [ 75.000000] (8:node@Jacquelin) Start | Succ +> [ 75.000000] (8:node@Jacquelin) 2 | 1 +> [ 75.000000] (8:node@Jacquelin) 3 | 1 +> [ 75.000000] (8:node@Jacquelin) 5 | 1 +> [ 75.000000] (8:node@Jacquelin) 9 | 1 +> [ 75.000000] (8:node@Jacquelin) 17 | 1 +> [ 75.000000] (8:node@Jacquelin) 33 | 1 +> [ 75.000000] (8:node@Jacquelin) Predecessor: 32 +> [ 80.000000] (8:node@Jacquelin) My finger table: +> [ 80.000000] (8:node@Jacquelin) Start | Succ +> [ 80.000000] (8:node@Jacquelin) 2 | 1 +> [ 80.000000] (8:node@Jacquelin) 3 | 1 +> [ 80.000000] (8:node@Jacquelin) 5 | 1 +> [ 80.000000] (8:node@Jacquelin) 9 | 1 +> [ 80.000000] (8:node@Jacquelin) 17 | 1 +> [ 80.000000] (8:node@Jacquelin) 33 | 1 +> [ 80.000000] (8:node@Jacquelin) Predecessor: 42 +> [ 81.018864] (8:node@Jacquelin) My finger table: +> [ 81.018864] (8:node@Jacquelin) Start | Succ +> [ 81.018864] (8:node@Jacquelin) 2 | 42 +> [ 81.018864] (8:node@Jacquelin) 3 | 1 +> [ 81.018864] (8:node@Jacquelin) 5 | 1 +> [ 81.018864] (8:node@Jacquelin) 9 | 1 +> [ 81.018864] (8:node@Jacquelin) 17 | 1 +> [ 81.018864] (8:node@Jacquelin) 33 | 1 +> [ 81.018864] (8:node@Jacquelin) Predecessor: 48 +> [113.891588] (2:node@McGee) My finger table: +> [113.891588] (2:node@McGee) Start | Succ +> [113.891588] (2:node@McGee) 43 | 48 +> [113.891588] (2:node@McGee) 44 | 42 +> [113.891588] (2:node@McGee) 46 | 42 +> [113.891588] (2:node@McGee) 50 | 42 +> [113.891588] (2:node@McGee) 58 | 42 +> [113.891588] (2:node@McGee) 10 | 42 +> [113.891588] (2:node@McGee) Predecessor: 1 +> [135.929315] (1:node@Gatien) My finger table: +> [135.929315] (1:node@Gatien) Start | Succ +> [135.929315] (1:node@Gatien) 49 | 1 +> [135.929315] (1:node@Gatien) 50 | 48 +> [135.929315] (1:node@Gatien) 52 | 48 +> [135.929315] (1:node@Gatien) 56 | 48 +> [135.929315] (1:node@Gatien) 0 | 48 +> [135.929315] (1:node@Gatien) 16 | 48 +> [135.929315] (1:node@Gatien) Predecessor: 42 +> [187.822191] (2:node@McGee) My finger table: +> [187.822191] (2:node@McGee) Start | Succ +> [187.822191] (2:node@McGee) 43 | 48 +> [187.822191] (2:node@McGee) 44 | 42 +> [187.822191] (2:node@McGee) 46 | 42 +> [187.822191] (2:node@McGee) 50 | 42 +> [187.822191] (2:node@McGee) 58 | 42 +> [187.822191] (2:node@McGee) 10 | 42 +> [187.822191] (2:node@McGee) Predecessor: 14 +> [196.476362] (2:node@McGee) My finger table: +> [196.476362] (2:node@McGee) Start | Succ +> [196.476362] (2:node@McGee) 43 | 48 +> [196.476362] (2:node@McGee) 44 | 42 +> [196.476362] (2:node@McGee) 46 | 42 +> [196.476362] (2:node@McGee) 50 | 42 +> [196.476362] (2:node@McGee) 58 | 42 +> [196.476362] (2:node@McGee) 10 | 42 +> [196.476362] (2:node@McGee) Predecessor: 38 +> [239.187724] (3:node@iRMX) My finger table: +> [239.187724] (3:node@iRMX) Start | Succ +> [239.187724] (3:node@iRMX) 39 | 42 +> [239.187724] (3:node@iRMX) 40 | 38 +> [239.187724] (3:node@iRMX) 42 | 38 +> [239.187724] (3:node@iRMX) 46 | 38 +> [239.187724] (3:node@iRMX) 54 | 38 +> [239.187724] (3:node@iRMX) 6 | 38 +> [239.187724] (3:node@iRMX) Predecessor: 32 +> [246.101146] (1:node@Gatien) My finger table: +> [246.101146] (1:node@Gatien) Start | Succ +> [246.101146] (1:node@Gatien) 49 | 1 +> [246.101146] (1:node@Gatien) 50 | 1 +> [246.101146] (1:node@Gatien) 52 | 48 +> [246.101146] (1:node@Gatien) 56 | 48 +> [246.101146] (1:node@Gatien) 0 | 48 +> [246.101146] (1:node@Gatien) 16 | 48 +> [246.101146] (1:node@Gatien) Predecessor: 42 +> [253.395755] (7:node@Boivin) My finger table: +> [253.395755] (7:node@Boivin) Start | Succ +> [253.395755] (7:node@Boivin) 9 | 32 +> [253.395755] (7:node@Boivin) 10 | 32 +> [253.395755] (7:node@Boivin) 12 | 8 +> [253.395755] (7:node@Boivin) 16 | 8 +> [253.395755] (7:node@Boivin) 24 | 8 +> [253.395755] (7:node@Boivin) 40 | 8 +> [253.395755] (7:node@Boivin) Predecessor: -1 +> [259.532923] (8:node@Jacquelin) My finger table: +> [259.532923] (8:node@Jacquelin) Start | Succ +> [259.532923] (8:node@Jacquelin) 2 | 32 +> [259.532923] (8:node@Jacquelin) 3 | 32 +> [259.532923] (8:node@Jacquelin) 5 | 1 +> [259.532923] (8:node@Jacquelin) 9 | 1 +> [259.532923] (8:node@Jacquelin) 17 | 1 +> [259.532923] (8:node@Jacquelin) 33 | 1 +> [259.532923] (8:node@Jacquelin) Predecessor: 48 +> [261.420507] (2:node@McGee) My finger table: +> [261.420507] (2:node@McGee) Start | Succ +> [261.420507] (2:node@McGee) 43 | 48 +> [261.420507] (2:node@McGee) 44 | 48 +> [261.420507] (2:node@McGee) 46 | 42 +> [261.420507] (2:node@McGee) 50 | 42 +> [261.420507] (2:node@McGee) 58 | 42 +> [261.420507] (2:node@McGee) 10 | 42 +> [261.420507] (2:node@McGee) Predecessor: 38 +> [262.822955] (6:node@Jean_Yves) My finger table: +> [262.822955] (6:node@Jean_Yves) Start | Succ +> [262.822955] (6:node@Jean_Yves) 15 | 32 +> [262.822955] (6:node@Jean_Yves) 16 | 32 +> [262.822955] (6:node@Jean_Yves) 18 | 14 +> [262.822955] (6:node@Jean_Yves) 22 | 14 +> [262.822955] (6:node@Jean_Yves) 30 | 14 +> [262.822955] (6:node@Jean_Yves) 46 | 14 +> [262.822955] (6:node@Jean_Yves) Predecessor: -1 +> [268.142943] (3:node@iRMX) My finger table: +> [268.142943] (3:node@iRMX) Start | Succ +> [268.142943] (3:node@iRMX) 39 | 42 +> [268.142943] (3:node@iRMX) 40 | 42 +> [268.142943] (3:node@iRMX) 42 | 38 +> [268.142943] (3:node@iRMX) 46 | 38 +> [268.142943] (3:node@iRMX) 54 | 38 +> [268.142943] (3:node@iRMX) 6 | 38 +> [268.142943] (3:node@iRMX) Predecessor: 32 +> [271.623232] (5:node@TeX) My finger table: +> [271.623232] (5:node@TeX) Start | Succ +> [271.623232] (5:node@TeX) 22 | 32 +> [271.623232] (5:node@TeX) 23 | 32 +> [271.623232] (5:node@TeX) 25 | 21 +> [271.623232] (5:node@TeX) 29 | 21 +> [271.623232] (5:node@TeX) 37 | 21 +> [271.623232] (5:node@TeX) 53 | 21 +> [271.623232] (5:node@TeX) Predecessor: -1 +> [279.057600] (4:node@Geoff) My finger table: +> [279.057600] (4:node@Geoff) Start | Succ +> [279.057600] (4:node@Geoff) 33 | 38 +> [279.057600] (4:node@Geoff) 34 | 32 +> [279.057600] (4:node@Geoff) 36 | 32 +> [279.057600] (4:node@Geoff) 40 | 32 +> [279.057600] (4:node@Geoff) 48 | 32 +> [279.057600] (4:node@Geoff) 0 | 32 +> [279.057600] (4:node@Geoff) Predecessor: 8 +> [281.486619] (4:node@Geoff) My finger table: +> [281.486619] (4:node@Geoff) Start | Succ +> [281.486619] (4:node@Geoff) 33 | 38 +> [281.486619] (4:node@Geoff) 34 | 38 +> [281.486619] (4:node@Geoff) 36 | 32 +> [281.486619] (4:node@Geoff) 40 | 32 +> [281.486619] (4:node@Geoff) 48 | 32 +> [281.486619] (4:node@Geoff) 0 | 32 +> [281.486619] (4:node@Geoff) Predecessor: 8 +> [292.924102] (4:node@Geoff) My finger table: +> [292.924102] (4:node@Geoff) Start | Succ +> [292.924102] (4:node@Geoff) 33 | 38 +> [292.924102] (4:node@Geoff) 34 | 38 +> [292.924102] (4:node@Geoff) 36 | 32 +> [292.924102] (4:node@Geoff) 40 | 32 +> [292.924102] (4:node@Geoff) 48 | 32 +> [292.924102] (4:node@Geoff) 0 | 32 +> [292.924102] (4:node@Geoff) Predecessor: 21 +> [338.206033] (5:node@TeX) My finger table: +> [338.206033] (5:node@TeX) Start | Succ +> [338.206033] (5:node@TeX) 22 | 32 +> [338.206033] (5:node@TeX) 23 | 32 +> [338.206033] (5:node@TeX) 25 | 21 +> [338.206033] (5:node@TeX) 29 | 21 +> [338.206033] (5:node@TeX) 37 | 21 +> [338.206033] (5:node@TeX) 53 | 21 +> [338.206033] (5:node@TeX) Predecessor: 14 +> [369.341418] (1:node@Gatien) My finger table: +> [369.341418] (1:node@Gatien) Start | Succ +> [369.341418] (1:node@Gatien) 49 | 1 +> [369.341418] (1:node@Gatien) 50 | 1 +> [369.341418] (1:node@Gatien) 52 | 1 +> [369.341418] (1:node@Gatien) 56 | 48 +> [369.341418] (1:node@Gatien) 0 | 48 +> [369.341418] (1:node@Gatien) 16 | 48 +> [369.341418] (1:node@Gatien) Predecessor: 42 +> [379.982438] (8:node@Jacquelin) My finger table: +> [379.982438] (8:node@Jacquelin) Start | Succ +> [379.982438] (8:node@Jacquelin) 2 | 14 +> [379.982438] (8:node@Jacquelin) 3 | 32 +> [379.982438] (8:node@Jacquelin) 5 | 14 +> [379.982438] (8:node@Jacquelin) 9 | 1 +> [379.982438] (8:node@Jacquelin) 17 | 1 +> [379.982438] (8:node@Jacquelin) 33 | 1 +> [379.982438] (8:node@Jacquelin) Predecessor: 48 +> [384.034401] (2:node@McGee) My finger table: +> [384.034401] (2:node@McGee) Start | Succ +> [384.034401] (2:node@McGee) 43 | 48 +> [384.034401] (2:node@McGee) 44 | 48 +> [384.034401] (2:node@McGee) 46 | 48 +> [384.034401] (2:node@McGee) 50 | 42 +> [384.034401] (2:node@McGee) 58 | 42 +> [384.034401] (2:node@McGee) 10 | 42 +> [384.034401] (2:node@McGee) Predecessor: 38 +> [386.415281] (6:node@Jean_Yves) My finger table: +> [386.415281] (6:node@Jean_Yves) Start | Succ +> [386.415281] (6:node@Jean_Yves) 15 | 21 +> [386.415281] (6:node@Jean_Yves) 16 | 32 +> [386.415281] (6:node@Jean_Yves) 18 | 14 +> [386.415281] (6:node@Jean_Yves) 22 | 14 +> [386.415281] (6:node@Jean_Yves) 30 | 14 +> [386.415281] (6:node@Jean_Yves) 46 | 14 +> [386.415281] (6:node@Jean_Yves) Predecessor: 1 +> [386.415281] (6:node@Jean_Yves) My finger table: +> [386.415281] (6:node@Jean_Yves) Start | Succ +> [386.415281] (6:node@Jean_Yves) 15 | 21 +> [386.415281] (6:node@Jean_Yves) 16 | 32 +> [386.415281] (6:node@Jean_Yves) 18 | 21 +> [386.415281] (6:node@Jean_Yves) 22 | 14 +> [386.415281] (6:node@Jean_Yves) 30 | 14 +> [386.415281] (6:node@Jean_Yves) 46 | 14 +> [386.415281] (6:node@Jean_Yves) Predecessor: 1 +> [390.149558] (7:node@Boivin) My finger table: +> [390.149558] (7:node@Boivin) Start | Succ +> [390.149558] (7:node@Boivin) 9 | 14 +> [390.149558] (7:node@Boivin) 10 | 32 +> [390.149558] (7:node@Boivin) 12 | 14 +> [390.149558] (7:node@Boivin) 16 | 8 +> [390.149558] (7:node@Boivin) 24 | 8 +> [390.149558] (7:node@Boivin) 40 | 8 +> [390.149558] (7:node@Boivin) Predecessor: -1 +> [392.283872] (6:node@Jean_Yves) My finger table: +> [392.283872] (6:node@Jean_Yves) Start | Succ +> [392.283872] (6:node@Jean_Yves) 15 | 21 +> [392.283872] (6:node@Jean_Yves) 16 | 32 +> [392.283872] (6:node@Jean_Yves) 18 | 21 +> [392.283872] (6:node@Jean_Yves) 22 | 14 +> [392.283872] (6:node@Jean_Yves) 30 | 14 +> [392.283872] (6:node@Jean_Yves) 46 | 14 +> [392.283872] (6:node@Jean_Yves) Predecessor: 8 +> [404.370688] (4:node@Geoff) My finger table: +> [404.370688] (4:node@Geoff) Start | Succ +> [404.370688] (4:node@Geoff) 33 | 38 +> [404.370688] (4:node@Geoff) 34 | 38 +> [404.370688] (4:node@Geoff) 36 | 38 +> [404.370688] (4:node@Geoff) 40 | 32 +> [404.370688] (4:node@Geoff) 48 | 32 +> [404.370688] (4:node@Geoff) 0 | 32 +> [404.370688] (4:node@Geoff) Predecessor: 21 +> [405.070972] (3:node@iRMX) My finger table: +> [405.070972] (3:node@iRMX) Start | Succ +> [405.070972] (3:node@iRMX) 39 | 42 +> [405.070972] (3:node@iRMX) 40 | 42 +> [405.070972] (3:node@iRMX) 42 | 42 +> [405.070972] (3:node@iRMX) 46 | 38 +> [405.070972] (3:node@iRMX) 54 | 38 +> [405.070972] (3:node@iRMX) 6 | 38 +> [405.070972] (3:node@iRMX) Predecessor: 32 +> [418.336053] (5:node@TeX) My finger table: +> [418.336053] (5:node@TeX) Start | Succ +> [418.336053] (5:node@TeX) 22 | 32 +> [418.336053] (5:node@TeX) 23 | 32 +> [418.336053] (5:node@TeX) 25 | 32 +> [418.336053] (5:node@TeX) 29 | 21 +> [418.336053] (5:node@TeX) 37 | 21 +> [418.336053] (5:node@TeX) 53 | 21 +> [418.336053] (5:node@TeX) Predecessor: 14 +> [448.762027] (7:node@Boivin) My finger table: +> [448.762027] (7:node@Boivin) Start | Succ +> [448.762027] (7:node@Boivin) 9 | 14 +> [448.762027] (7:node@Boivin) 10 | 32 +> [448.762027] (7:node@Boivin) 12 | 14 +> [448.762027] (7:node@Boivin) 16 | 8 +> [448.762027] (7:node@Boivin) 24 | 8 +> [448.762027] (7:node@Boivin) 40 | 8 +> [448.762027] (7:node@Boivin) Predecessor: 1 +> [490.780259] (1:node@Gatien) My finger table: +> [490.780259] (1:node@Gatien) Start | Succ +> [490.780259] (1:node@Gatien) 49 | 1 +> [490.780259] (1:node@Gatien) 50 | 1 +> [490.780259] (1:node@Gatien) 52 | 1 +> [490.780259] (1:node@Gatien) 56 | 1 +> [490.780259] (1:node@Gatien) 0 | 48 +> [490.780259] (1:node@Gatien) 16 | 48 +> [490.780259] (1:node@Gatien) Predecessor: 42 +> [505.134969] (8:node@Jacquelin) My finger table: +> [505.134969] (8:node@Jacquelin) Start | Succ +> [505.134969] (8:node@Jacquelin) 2 | 8 +> [505.134969] (8:node@Jacquelin) 3 | 32 +> [505.134969] (8:node@Jacquelin) 5 | 14 +> [505.134969] (8:node@Jacquelin) 9 | 14 +> [505.134969] (8:node@Jacquelin) 17 | 1 +> [505.134969] (8:node@Jacquelin) 33 | 1 +> [505.134969] (8:node@Jacquelin) Predecessor: 48 +> [519.547951] (6:node@Jean_Yves) My finger table: +> [519.547951] (6:node@Jean_Yves) Start | Succ +> [519.547951] (6:node@Jean_Yves) 15 | 21 +> [519.547951] (6:node@Jean_Yves) 16 | 32 +> [519.547951] (6:node@Jean_Yves) 18 | 21 +> [519.547951] (6:node@Jean_Yves) 22 | 32 +> [519.547951] (6:node@Jean_Yves) 30 | 14 +> [519.547951] (6:node@Jean_Yves) 46 | 14 +> [519.547951] (6:node@Jean_Yves) Predecessor: 8 +> [523.456709] (2:node@McGee) My finger table: +> [523.456709] (2:node@McGee) Start | Succ +> [523.456709] (2:node@McGee) 43 | 48 +> [523.456709] (2:node@McGee) 44 | 48 +> [523.456709] (2:node@McGee) 46 | 48 +> [523.456709] (2:node@McGee) 50 | 1 +> [523.456709] (2:node@McGee) 58 | 42 +> [523.456709] (2:node@McGee) 10 | 42 +> [523.456709] (2:node@McGee) Predecessor: 38 +> [541.506552] (5:node@TeX) My finger table: +> [541.506552] (5:node@TeX) Start | Succ +> [541.506552] (5:node@TeX) 22 | 32 +> [541.506552] (5:node@TeX) 23 | 32 +> [541.506552] (5:node@TeX) 25 | 32 +> [541.506552] (5:node@TeX) 29 | 32 +> [541.506552] (5:node@TeX) 37 | 21 +> [541.506552] (5:node@TeX) 53 | 21 +> [541.506552] (5:node@TeX) Predecessor: 14 +> [542.490747] (4:node@Geoff) My finger table: +> [542.490747] (4:node@Geoff) Start | Succ +> [542.490747] (4:node@Geoff) 33 | 38 +> [542.490747] (4:node@Geoff) 34 | 38 +> [542.490747] (4:node@Geoff) 36 | 38 +> [542.490747] (4:node@Geoff) 40 | 42 +> [542.490747] (4:node@Geoff) 48 | 32 +> [542.490747] (4:node@Geoff) 0 | 32 +> [542.490747] (4:node@Geoff) Predecessor: 21 +> [543.696191] (7:node@Boivin) My finger table: +> [543.696191] (7:node@Boivin) Start | Succ +> [543.696191] (7:node@Boivin) 9 | 14 +> [543.696191] (7:node@Boivin) 10 | 32 +> [543.696191] (7:node@Boivin) 12 | 14 +> [543.696191] (7:node@Boivin) 16 | 21 +> [543.696191] (7:node@Boivin) 24 | 8 +> [543.696191] (7:node@Boivin) 40 | 8 +> [543.696191] (7:node@Boivin) Predecessor: 1 +> [547.073600] (3:node@iRMX) My finger table: +> [547.073600] (3:node@iRMX) Start | Succ +> [547.073600] (3:node@iRMX) 39 | 42 +> [547.073600] (3:node@iRMX) 40 | 42 +> [547.073600] (3:node@iRMX) 42 | 42 +> [547.073600] (3:node@iRMX) 46 | 48 +> [547.073600] (3:node@iRMX) 54 | 38 +> [547.073600] (3:node@iRMX) 6 | 38 +> [547.073600] (3:node@iRMX) Predecessor: 32 +> [655.138775] (0:@) Messages created: 838 +> [655.138775] (0:@) Simulated time: 655.139 diff --git a/examples/msg/gtnets/gtnets.c b/examples/msg/gtnets/gtnets.c index 8153d9bb28..93ce019481 100644 --- a/examples/msg/gtnets/gtnets.c +++ b/examples/msg/gtnets/gtnets.c @@ -15,9 +15,12 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, int master(int argc, char *argv[]); int slave(int argc, char *argv[]); +int timer(int argc, char *argv[]); MSG_error_t test_all(const char *platform_file, const char *application_file); +int timer_start = 1; + typedef enum { PORT_22 = 0, MAX_CHANNEL @@ -32,6 +35,7 @@ m_task_t gl_task_array[NTASKS]; const char *slavenames[NTASKS]; const char *masternames[NTASKS]; int gl_task_array_id = 0; +int count_finished = 0; #define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */ @@ -77,6 +81,8 @@ int master(int argc, char *argv[]) slave = MSG_get_host_by_name(slavename); } + count_finished++; + /* time measurement */ sprintf(id_alias, "%d", id); start_time = MSG_get_clock(); @@ -87,6 +93,31 @@ int master(int argc, char *argv[]) return 0; } /* end_of_master */ + +/** Timer function */ +int timer(int argc, char *argv[]) +{ + int sleep_time; + int first_sleep; + + if (argc != 3) { + XBT_INFO("Strange number of arguments expected 2 got %d", argc - 1); + } + + sscanf(argv[1], "%d", &first_sleep); + sscanf(argv[2], "%d", &sleep_time); + + if(first_sleep){ + MSG_process_sleep(first_sleep); + } + + while(timer_start){ + MSG_process_sleep(sleep_time); + } + + return 0; +} + /** Receiver function */ int slave(int argc, char *argv[]) { @@ -110,6 +141,13 @@ int slave(int argc, char *argv[]) a = MSG_task_receive(&(task), id_alias); + count_finished--; + if(count_finished == 0){ + timer_start = 0; + } + + + if (a != MSG_OK) { XBT_INFO("Hey?! What's up?"); xbt_die("Unexpected behavior."); @@ -157,6 +195,7 @@ int slave(int argc, char *argv[]) TRACE_mark("endmark", mark); MSG_task_destroy(task); + return 0; } /* end_of_slave */ @@ -172,9 +211,14 @@ MSG_error_t test_all(const char *platform_file, MSG_set_channel_number(MAX_CHANNEL); MSG_create_environment(platform_file); } + + TRACE_declare_mark("endmark"); + { /* Application deployment */ MSG_function_register("master", master); MSG_function_register("slave", slave); + MSG_function_register("timer", timer); + MSG_launch_application(application_file); } res = MSG_main(); @@ -193,8 +237,6 @@ int main(int argc, char *argv[]) exit(1); } - TRACE_declare_mark("endmark"); - res = test_all(argv[1], argv[2]); MSG_clean(); diff --git a/examples/msg/masterslave/masterslave_bypass.c b/examples/msg/masterslave/masterslave_bypass.c index d5e47f3f1c..159a1bf82b 100644 --- a/examples/msg/masterslave/masterslave_bypass.c +++ b/examples/msg/masterslave/masterslave_bypass.c @@ -28,7 +28,6 @@ static int surf_parse_bypass_platform(void) XBT_DEBUG(""); SURFXML_BUFFER_SET(AS_id, "AS0"); - SURFXML_BUFFER_SET(AS_coordinates, ""); SURFXML_BUFFER_SET(AS_routing, "Full"); SURFXML_START_TAG(AS); diff --git a/examples/msg/masterslave/masterslave_vivaldi.tesh b/examples/msg/masterslave/masterslave_vivaldi.tesh index a3c53640f8..314c967f85 100644 --- a/examples/msg/masterslave/masterslave_vivaldi.tesh +++ b/examples/msg/masterslave/masterslave_vivaldi.tesh @@ -8,63 +8,64 @@ $ $SG_TEST_EXENV ./masterslave/masterslave_mailbox ${srcdir:=.}/../platforms/vi > [0.000000] [surf_parse/INFO] Configuration change: Set 'coordinates' to 'yes' > [100030591:master:(1) 0.000000] [msg_test/INFO] Got 39 slaves and 20 tasks to process > [100030591:master:(1) 0.000000] [msg_test/INFO] Sending "Task_0" (of 20) to mailbox "slave-0" -> [100030591:master:(1) 46.298715] [msg_test/INFO] Sending "Task_1" (of 20) to mailbox "slave-1" -> [100030591:master:(1) 103.601749] [msg_test/INFO] Sending "Task_2" (of 20) to mailbox "slave-2" -> [100030591:master:(1) 126.922043] [msg_test/INFO] Sending "Task_3" (of 20) to mailbox "slave-3" -> [100030591:master:(1) 167.281845] [msg_test/INFO] Sending "Task_4" (of 20) to mailbox "slave-4" -> [100030591:master:(1) 174.709847] [msg_test/INFO] Sending "Task_5" (of 20) to mailbox "slave-5" -> [100030591:master:(1) 307.173455] [msg_test/INFO] Sending "Task_6" (of 20) to mailbox "slave-6" -> [100030591:master:(1) 370.794449] [msg_test/INFO] Sending "Task_7" (of 20) to mailbox "slave-7" -> [100030591:master:(1) 413.207033] [msg_test/INFO] Sending "Task_8" (of 20) to mailbox "slave-8" -> [100030591:master:(1) 452.276743] [msg_test/INFO] Sending "Task_9" (of 20) to mailbox "slave-9" -> [100030591:master:(1) 487.205195] [msg_test/INFO] Sending "Task_10" (of 20) to mailbox "slave-10" -> [100030591:master:(1) 503.334725] [msg_test/INFO] Sending "Task_11" (of 20) to mailbox "slave-11" -> [100030591:master:(1) 524.048071] [msg_test/INFO] Sending "Task_12" (of 20) to mailbox "slave-12" -> [100030591:master:(1) 564.235298] [msg_test/INFO] Sending "Task_13" (of 20) to mailbox "slave-13" -> [100030591:master:(1) 781.637823] [msg_test/INFO] Sending "Task_14" (of 20) to mailbox "slave-14" -> [100030591:master:(1) 849.066410] [msg_test/INFO] Sending "Task_15" (of 20) to mailbox "slave-15" -> [100030591:master:(1) 875.286809] [msg_test/INFO] Sending "Task_16" (of 20) to mailbox "slave-16" -> [100030591:master:(1) 925.618026] [msg_test/INFO] Sending "Task_17" (of 20) to mailbox "slave-17" -> [100030591:master:(1) 955.459779] [msg_test/INFO] Sending "Task_18" (of 20) to mailbox "slave-18" -> [100030591:master:(1) 1125.325477] [msg_test/INFO] Sending "Task_19" (of 20) to mailbox "slave-19" -> [100030591:master:(1) 1162.951807] [msg_test/INFO] All tasks have been dispatched. Let's tell everybody the computation is over. -> [100036570:slave:(2) 1209.250522] [msg_test/INFO] I'm done. See you! -> [100041334:slave:(3) 1266.553556] [msg_test/INFO] I'm done. See you! -> [100055671:slave:(4) 1289.873850] [msg_test/INFO] I'm done. See you! -> [100066658:slave:(5) 1330.233653] [msg_test/INFO] I'm done. See you! -> [100090691:slave:(6) 1337.661654] [msg_test/INFO] I'm done. See you! -> [100094952:slave:(7) 1470.125262] [msg_test/INFO] I'm done. See you! -> [100117943:slave:(8) 1533.746256] [msg_test/INFO] I'm done. See you! -> [100126290:slave:(9) 1576.158840] [msg_test/INFO] I'm done. See you! -> [100144483:slave:(10) 1615.228550] [msg_test/INFO] I'm done. See you! -> [100152889:slave:(11) 1650.157002] [msg_test/INFO] I'm done. See you! -> [100178474:slave:(12) 1666.286532] [msg_test/INFO] I'm done. See you! -> [100180261:slave:(13) 1686.999878] [msg_test/INFO] I'm done. See you! -> [100185883:slave:(14) 1727.187106] [msg_test/INFO] I'm done. See you! -> [100186365:slave:(15) 1944.589630] [msg_test/INFO] I'm done. See you! -> [100200866:slave:(16) 2012.018217] [msg_test/INFO] I'm done. See you! -> [100207885:slave:(17) 2038.238617] [msg_test/INFO] I'm done. See you! -> [100224447:slave:(18) 2088.569833] [msg_test/INFO] I'm done. See you! -> [100238799:slave:(19) 2118.411586] [msg_test/INFO] I'm done. See you! -> [100273297:slave:(20) 2288.277284] [msg_test/INFO] I'm done. See you! -> [100280711:slave:(21) 2325.903615] [msg_test/INFO] I'm done. See you! -> [100284574:slave:(22) 2544.465027] [msg_test/INFO] I'm done. See you! -> [100292843:slave:(23) 2630.108510] [msg_test/INFO] I'm done. See you! -> [100309685:slave:(24) 2668.822631] [msg_test/INFO] I'm done. See you! -> [100315281:slave:(25) 2720.117353] [msg_test/INFO] I'm done. See you! -> [100317715:slave:(26) 2757.915482] [msg_test/INFO] I'm done. See you! -> [100324694:slave:(27) 2843.455198] [msg_test/INFO] I'm done. See you! -> [100326641:slave:(28) 2895.472176] [msg_test/INFO] I'm done. See you! -> [100331484:slave:(29) 2933.787292] [msg_test/INFO] I'm done. See you! -> [100347816:slave:(30) 3065.083370] [msg_test/INFO] I'm done. See you! -> [100354536:slave:(31) 3102.951662] [msg_test/INFO] I'm done. See you! -> [100355017:slave:(32) 3165.883487] [msg_test/INFO] I'm done. See you! -> [100359203:slave:(33) 3184.091818] [msg_test/INFO] I'm done. See you! -> [100379397:slave:(34) 3445.670206] [msg_test/INFO] I'm done. See you! -> [100404046:slave:(35) 3460.270206] [msg_test/INFO] I'm done. See you! -> [100413314:slave:(36) 3543.131128] [msg_test/INFO] I'm done. See you! -> [100416828:slave:(37) 3558.720375] [msg_test/INFO] I'm done. See you! -> [100422926:slave:(38) 3651.507849] [msg_test/INFO] I'm done. See you! -> [100427449:slave:(39) 3850.431291] [msg_test/INFO] I'm done. See you! -> [100429957:slave:(40) 3879.074632] [msg_test/INFO] I'm done. See you! -> [3879.074632] [msg_test/INFO] Simulation time 3879.07 +> [100030591:master:(1) 0.046299] [msg_test/INFO] Sending "Task_1" (of 20) to mailbox "slave-1" +> [100030591:master:(1) 0.103602] [msg_test/INFO] Sending "Task_2" (of 20) to mailbox "slave-2" +> [100030591:master:(1) 0.126922] [msg_test/INFO] Sending "Task_3" (of 20) to mailbox "slave-3" +> [100030591:master:(1) 0.167282] [msg_test/INFO] Sending "Task_4" (of 20) to mailbox "slave-4" +> [100030591:master:(1) 0.174710] [msg_test/INFO] Sending "Task_5" (of 20) to mailbox "slave-5" +> [100030591:master:(1) 0.307173] [msg_test/INFO] Sending "Task_6" (of 20) to mailbox "slave-6" +> [100030591:master:(1) 0.370794] [msg_test/INFO] Sending "Task_7" (of 20) to mailbox "slave-7" +> [100030591:master:(1) 0.413207] [msg_test/INFO] Sending "Task_8" (of 20) to mailbox "slave-8" +> [100030591:master:(1) 0.452277] [msg_test/INFO] Sending "Task_9" (of 20) to mailbox "slave-9" +> [100030591:master:(1) 0.487205] [msg_test/INFO] Sending "Task_10" (of 20) to mailbox "slave-10" +> [100030591:master:(1) 0.503335] [msg_test/INFO] Sending "Task_11" (of 20) to mailbox "slave-11" +> [100030591:master:(1) 0.524048] [msg_test/INFO] Sending "Task_12" (of 20) to mailbox "slave-12" +> [100030591:master:(1) 0.564235] [msg_test/INFO] Sending "Task_13" (of 20) to mailbox "slave-13" +> [100030591:master:(1) 0.781638] [msg_test/INFO] Sending "Task_14" (of 20) to mailbox "slave-14" +> [100030591:master:(1) 0.849066] [msg_test/INFO] Sending "Task_15" (of 20) to mailbox "slave-15" +> [100030591:master:(1) 0.875287] [msg_test/INFO] Sending "Task_16" (of 20) to mailbox "slave-16" +> [100030591:master:(1) 0.925618] [msg_test/INFO] Sending "Task_17" (of 20) to mailbox "slave-17" +> [100030591:master:(1) 0.955460] [msg_test/INFO] Sending "Task_18" (of 20) to mailbox "slave-18" +> [100030591:master:(1) 1.125325] [msg_test/INFO] Sending "Task_19" (of 20) to mailbox "slave-19" +> [100030591:master:(1) 1.162952] [msg_test/INFO] All tasks have been dispatched. Let's tell everybody the computation is over. +> [100036570:slave:(2) 1.209251] [msg_test/INFO] I'm done. See you! +> [100041334:slave:(3) 1.266554] [msg_test/INFO] I'm done. See you! +> [100055671:slave:(4) 1.289874] [msg_test/INFO] I'm done. See you! +> [100066658:slave:(5) 1.330234] [msg_test/INFO] I'm done. See you! +> [100090691:slave:(6) 1.337662] [msg_test/INFO] I'm done. See you! +> [100094952:slave:(7) 1.470125] [msg_test/INFO] I'm done. See you! +> [100117943:slave:(8) 1.533746] [msg_test/INFO] I'm done. See you! +> [100126290:slave:(9) 1.576159] [msg_test/INFO] I'm done. See you! +> [100144483:slave:(10) 1.615229] [msg_test/INFO] I'm done. See you! +> [100152889:slave:(11) 1.650157] [msg_test/INFO] I'm done. See you! +> [100178474:slave:(12) 1.666287] [msg_test/INFO] I'm done. See you! +> [100180261:slave:(13) 1.687000] [msg_test/INFO] I'm done. See you! +> [100185883:slave:(14) 1.727187] [msg_test/INFO] I'm done. See you! +> [100186365:slave:(15) 1.944590] [msg_test/INFO] I'm done. See you! +> [100200866:slave:(16) 2.012018] [msg_test/INFO] I'm done. See you! +> [100207885:slave:(17) 2.038239] [msg_test/INFO] I'm done. See you! +> [100224447:slave:(18) 2.088570] [msg_test/INFO] I'm done. See you! +> [100238799:slave:(19) 2.118412] [msg_test/INFO] I'm done. See you! +> [100273297:slave:(20) 2.288277] [msg_test/INFO] I'm done. See you! +> [100280711:slave:(21) 2.325904] [msg_test/INFO] I'm done. See you! +> [100284574:slave:(22) 2.544465] [msg_test/INFO] I'm done. See you! +> [100292843:slave:(23) 2.630109] [msg_test/INFO] I'm done. See you! +> [100309685:slave:(24) 2.668823] [msg_test/INFO] I'm done. See you! +> [100315281:slave:(25) 2.720117] [msg_test/INFO] I'm done. See you! +> [100317715:slave:(26) 2.757915] [msg_test/INFO] I'm done. See you! +> [100324694:slave:(27) 2.843455] [msg_test/INFO] I'm done. See you! +> [100326641:slave:(28) 2.895472] [msg_test/INFO] I'm done. See you! +> [100331484:slave:(29) 2.933787] [msg_test/INFO] I'm done. See you! +> [100347816:slave:(30) 3.065083] [msg_test/INFO] I'm done. See you! +> [100354536:slave:(31) 3.102952] [msg_test/INFO] I'm done. See you! +> [100355017:slave:(32) 3.165883] [msg_test/INFO] I'm done. See you! +> [100359203:slave:(33) 3.184092] [msg_test/INFO] I'm done. See you! +> [100379397:slave:(34) 3.445670] [msg_test/INFO] I'm done. See you! +> [100404046:slave:(35) 3.460270] [msg_test/INFO] I'm done. See you! +> [100413314:slave:(36) 3.543131] [msg_test/INFO] I'm done. See you! +> [100416828:slave:(37) 3.558720] [msg_test/INFO] I'm done. See you! +> [100422926:slave:(38) 3.651508] [msg_test/INFO] I'm done. See you! +> [100427449:slave:(39) 3.850431] [msg_test/INFO] I'm done. See you! +> [100429957:slave:(40) 3.879075] [msg_test/INFO] I'm done. See you! +> [3.879075] [msg_test/INFO] Simulation time 3.87907 + diff --git a/examples/msg/mc/bugged1.tesh b/examples/msg/mc/bugged1.tesh index 61c8dc8d8d..66147f0ae6 100644 --- a/examples/msg/mc/bugged1.tesh +++ b/examples/msg/mc/bugged1.tesh @@ -1,8 +1,71 @@ #! ./tesh -! output sort -$ ${bindir:=.}/bugged1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" -> [ 0.008753] (2:client@HostB) Sent! -> [ 0.017506] (3:client@HostC) Sent! -> [ 0.026259] (1:server@HostA) OK -> [ 0.026259] (4:client@HostD) Sent! +! expect signal SIGABRT +$ ${bindir:=.}/bugged1 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (4:client@HostD) Sent! +> [ 0.000000] (3:client@HostC) Sent! +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (2:client@HostB) Sent! +> [ 0.000000] (1:server@HostA) ************************** +> [ 0.000000] (1:server@HostA) *** PROPERTY NOT VALID *** +> [ 0.000000] (1:server@HostA) ************************** +> [ 0.000000] (1:server@HostA) Counter-example execution trace: +> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(2)client] iSend (src=client, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(2)client -> (1)server]) +> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(2)client] Wait (comm=(verbose only) [(2)client -> (1)server]) +> [ 0.000000] (1:server@HostA) [(4)client] iSend (src=client, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(4)client -> (1)server]) +> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(3)client -> (1)server]) +> [ 0.000000] (1:server@HostA) State space size ~= 1 +> [ 0.000000] (1:server@HostA) Expanded states = 47 +> [ 0.000000] (1:server@HostA) Visited states = 170 +> [ 0.000000] (1:server@HostA) Executed transitions = 157 +> [ 0.000000] (1:server@HostA) Expanded / Visited = 3.617021 diff --git a/examples/msg/mc/bugged2.c b/examples/msg/mc/bugged2.c index 85af8dcb67..95c08544e3 100644 --- a/examples/msg/mc/bugged2.c +++ b/examples/msg/mc/bugged2.c @@ -14,7 +14,8 @@ int client(int argc, char *argv[]); int server(int argc, char *argv[]) { - m_task_t task1, task2; + m_task_t task1 = NULL; + m_task_t task2 = NULL; long val1, val2; MSG_task_receive(&task1, "mymailbox"); diff --git a/examples/msg/mc/bugged2.tesh b/examples/msg/mc/bugged2.tesh index 57429e09d0..d4eca5c813 100644 --- a/examples/msg/mc/bugged2.tesh +++ b/examples/msg/mc/bugged2.tesh @@ -1,13 +1,1620 @@ #! ./tesh -! output sort -$ ${bindir:=.}/bugged2 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +! expect signal SIGABRT +$ ${bindir:=.}/bugged2 --cfg=model-check:1 "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (0:@) Configuration change: Set 'model-check' to '1' > [ 0.000000] (2:client@HostB) Send 1! > [ 0.000000] (3:client@HostC) Send 2! -> [ 0.008753] (1:server@HostA) Received 1 -> [ 0.008753] (2:client@HostB) Send 1! -> [ 0.017506] (1:server@HostA) Received 2 -> [ 0.017506] (3:client@HostC) Send 2! -> [ 0.026259] (1:server@HostA) Received 1 -> [ 0.035012] (1:server@HostA) Received 2 -> [ 0.035012] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) Received 1 +> [ 0.000000] (1:server@HostA) OK +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (2:client@HostB) Send 1! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (3:client@HostC) Send 2! +> [ 0.000000] (1:server@HostA) Received 2 +> [ 0.000000] (1:server@HostA) ************************** +> [ 0.000000] (1:server@HostA) *** PROPERTY NOT VALID *** +> [ 0.000000] (1:server@HostA) ************************** +> [ 0.000000] (1:server@HostA) Counter-example execution trace: +> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(3)client -> (1)server]) +> [ 0.000000] (1:server@HostA) [(1)server] iRecv (dst=server, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(3)client] Wait (comm=(verbose only) [(3)client -> (1)server]) +> [ 0.000000] (1:server@HostA) [(3)client] iSend (src=client, buff=(verbose only), size=(verbose only)) +> [ 0.000000] (1:server@HostA) [(1)server] Wait (comm=(verbose only) [(3)client -> (1)server]) +> [ 0.000000] (1:server@HostA) State space size ~= 1 +> [ 0.000000] (1:server@HostA) Expanded states = 1387 +> [ 0.000000] (1:server@HostA) Visited states = 4071 +> [ 0.000000] (1:server@HostA) Executed transitions = 3799 +> [ 0.000000] (1:server@HostA) Expanded / Visited = 2.935112 diff --git a/examples/msg/mc/centralized.tesh b/examples/msg/mc/centralized.tesh index 1e14eb3dbf..f5b08c3382 100644 --- a/examples/msg/mc/centralized.tesh +++ b/examples/msg/mc/centralized.tesh @@ -1,6 +1,6 @@ #! ./tesh -$ ${bindir:=.}/centralized +$ ${bindir:=.}/centralized --cfg=model-check:1 > [Fafard:client:(2) 0.000000] [centralized/INFO] Ask the request > [Boivin:client:(3) 0.000000] [centralized/INFO] Ask the request > [TeX:client:(4) 0.000000] [centralized/INFO] Ask the request diff --git a/examples/msg/ns3/3hosts_2links_d.xml b/examples/msg/ns3/3hosts_2links_d.xml new file mode 100644 index 0000000000..3314218805 --- /dev/null +++ b/examples/msg/ns3/3hosts_2links_d.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/3hosts_2links_p.xml b/examples/msg/ns3/3hosts_2links_p.xml new file mode 100644 index 0000000000..0e6aa55b86 --- /dev/null +++ b/examples/msg/ns3/3hosts_2links_p.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/msg/ns3/3links-d-timer.xml b/examples/msg/ns3/3links-d-timer.xml new file mode 100644 index 0000000000..9caa5cca2d --- /dev/null +++ b/examples/msg/ns3/3links-d-timer.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/3links-d.xml b/examples/msg/ns3/3links-d.xml new file mode 100644 index 0000000000..40ddeba812 --- /dev/null +++ b/examples/msg/ns3/3links-d.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/3links-p.xml b/examples/msg/ns3/3links-p.xml new file mode 100644 index 0000000000..a7e6848251 --- /dev/null +++ b/examples/msg/ns3/3links-p.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/CMakeLists.txt b/examples/msg/ns3/CMakeLists.txt new file mode 100644 index 0000000000..1111655a04 --- /dev/null +++ b/examples/msg/ns3/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 2.6) + +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(ns3 "ns3.c") + +### Add definitions for compile +target_link_libraries(ns3 simgrid m ) + diff --git a/examples/msg/ns3/One_cluster-d.xml b/examples/msg/ns3/One_cluster-d.xml new file mode 100644 index 0000000000..ff7e71f9fd --- /dev/null +++ b/examples/msg/ns3/One_cluster-d.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/One_cluster.xml b/examples/msg/ns3/One_cluster.xml new file mode 100644 index 0000000000..51716429d1 --- /dev/null +++ b/examples/msg/ns3/One_cluster.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/examples/msg/ns3/Two_clusters-d.xml b/examples/msg/ns3/Two_clusters-d.xml new file mode 100644 index 0000000000..3b55cc98be --- /dev/null +++ b/examples/msg/ns3/Two_clusters-d.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/Two_clusters.xml b/examples/msg/ns3/Two_clusters.xml new file mode 100644 index 0000000000..0aa41eabef --- /dev/null +++ b/examples/msg/ns3/Two_clusters.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/dogbone-d.xml b/examples/msg/ns3/dogbone-d.xml new file mode 100644 index 0000000000..6ccc284aff --- /dev/null +++ b/examples/msg/ns3/dogbone-d.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/dogbone-p.xml b/examples/msg/ns3/dogbone-p.xml new file mode 100644 index 0000000000..08eb81c1d7 --- /dev/null +++ b/examples/msg/ns3/dogbone-p.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/msg/ns3/ns3.c b/examples/msg/ns3/ns3.c new file mode 100644 index 0000000000..d0c7456e4b --- /dev/null +++ b/examples/msg/ns3/ns3.c @@ -0,0 +1,214 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include "msg/msg.h" +#include "xbt/log.h" +#include "xbt/asserts.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, + "Messages specific for this msg example"); + +int master(int argc, char *argv[]); +int slave(int argc, char *argv[]); +int timer(int argc, char *argv[]); +MSG_error_t test_all(const char *platform_file, + const char *application_file); + +int timer_start; //set as 1 in the master process + +typedef enum { + PORT_22 = 0, + MAX_CHANNEL +} channel_t; + +//keep a pointer to all surf running tasks. +#define NTASKS 1500 +int bool_printed = 0; +double start_time, end_time, elapsed_time; +double gl_data_size[NTASKS]; +m_task_t gl_task_array[NTASKS]; +const char *slavenames[NTASKS]; +const char *masternames[NTASKS]; +int gl_task_array_id = 0; +int count_finished = 0; + +#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */ + +/** master */ +int master(int argc, char *argv[]) +{ + char *slavename = NULL; + double task_comm_size = 0; + m_task_t todo; + char id_alias[10]; + //unique id to control statistics + int id = -1; + + xbt_assert(argc==4,"Strange number of arguments expected 3 got %d", argc - 1); + + XBT_DEBUG ("Master started"); + + /* data size */ + int read; + read = sscanf(argv[1], "%lg", &task_comm_size); + xbt_assert(read, "Invalid argument %s\n", argv[1]); + + /* slave name */ + slavename = argv[2]; + id = atoi(argv[3]); + sprintf(id_alias, "flow_%d", id); + slavenames[id] = slavename; + TRACE_category(id_alias); + + masternames[id] = MSG_host_get_name(MSG_host_self()); + + { /* Task creation. */ + char sprintf_buffer[64] = "Task_0"; + todo = MSG_task_create(sprintf_buffer, 100*task_comm_size, task_comm_size, NULL); + TRACE_msg_set_task_category(todo, id_alias); + //keep track of running tasks + gl_task_array[id] = todo; + gl_data_size[id] = task_comm_size; + } + + { /* Process organisation */ + MSG_get_host_by_name(slavename); + } + + count_finished++; + timer_start = 1 ; + + /* time measurement */ + sprintf(id_alias, "%d", id); + start_time = MSG_get_clock(); + //MSG_task_execute(todo); + MSG_task_send(todo, id_alias); + end_time = MSG_get_clock(); + + XBT_DEBUG ("Finished"); + return 0; +} /* end_of_master */ + + +/** Timer function */ +int timer(int argc, char *argv[]) +{ + double sleep_time; + double first_sleep; + + xbt_assert(argc==3,"Strange number of arguments expected 2 got %d", argc - 1); + + sscanf(argv[1], "%lf", &first_sleep); + sscanf(argv[2], "%lf", &sleep_time); + + XBT_DEBUG ("Timer started"); + + if(first_sleep){ + MSG_process_sleep(first_sleep); + } + + do { + XBT_DEBUG ("Get sleep"); + MSG_process_sleep(sleep_time); + } while(timer_start); + + XBT_DEBUG ("Finished"); + return 0; +} + +/** Receiver function */ +int slave(int argc, char *argv[]) +{ + + m_task_t task = NULL; + int a = MSG_OK; + int id = 0; + char id_alias[10]; + + xbt_assert(argc==2,"Strange number of arguments expected 1 got %d", argc - 1); + + XBT_DEBUG ("Slave started"); + + id = atoi(argv[1]); + sprintf(id_alias, "%d", id); + + a = MSG_task_receive(&(task), id_alias); + + count_finished--; + if(count_finished == 0){ + timer_start = 0; + } + + + + if (a != MSG_OK) { + XBT_INFO("Hey?! What's up?"); + xbt_die("Unexpected behavior."); + } + + elapsed_time = MSG_get_clock() - start_time; + + XBT_INFO("FLOW[%d] : Receive %.0f bytes from %s to %s", + id, + MSG_task_get_data_size(task), + masternames[id], + slavenames[id]); +// MSG_task_execute(task); + MSG_task_destroy(task); + + XBT_DEBUG ("Finished"); + return 0; +} /* end_of_slave */ + +/** Test function */ +MSG_error_t test_all(const char *platform_file, + const char *application_file) +{ + MSG_error_t res = MSG_OK; + + /* MSG_config("workstation/model", "GTNETS"); */ + /* MSG_config("workstation/model","KCCFLN05"); */ + { /* Simulation setting */ + MSG_set_channel_number(MAX_CHANNEL); + MSG_create_environment(platform_file); + } + + TRACE_declare_mark("endmark"); + + { /* Application deployment */ + MSG_function_register("master", master); + MSG_function_register("slave", slave); + MSG_function_register("timer", timer); + + MSG_launch_application(application_file); + } + res = MSG_main(); + return res; +} /* end_of_test_all */ + +/** Main function */ +int main(int argc, char *argv[]) +{ + MSG_error_t res = MSG_OK; + bool_printed = 0; + + MSG_global_init(&argc, argv); + if (argc < 3) { + printf("Usage: %s platform_file deployment_file\n", argv[0]); + exit(1); + } + + res = test_all(argv[1], argv[2]); + + MSG_clean(); + + if (res == MSG_OK) + return 0; + else + return 1; +} /* end_of_main */ diff --git a/examples/msg/ns3/ns3.tesh b/examples/msg/ns3/ns3.tesh new file mode 100644 index 0000000000..f9770e3ec5 --- /dev/null +++ b/examples/msg/ns3/ns3.tesh @@ -0,0 +1,41 @@ +#! ./tesh + +p 3hosts 2links + +$ ns3/ns3 ${srcdir:=.}/ns3/3hosts_2links_p.xml ${srcdir:=.}/ns3/3hosts_2links_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:slave:(2) 0.700000] [msg_test/INFO] FLOW[1] : Receive 100 bytes from a to c + +p 6hosts 3links + +$ ns3/ns3 ${srcdir:=.}/ns3/3links-p.xml ${srcdir:=.}/ns3/3links-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) +> [C1:slave:(2) 0.104428] [msg_test/INFO] FLOW[1] : Receive 100000 bytes from S1 to C1 +> [C2:slave:(4) 1.041346] [msg_test/INFO] FLOW[2] : Receive 1000000 bytes from S2 to C2 +> [C3:slave:(6) 2.082380] [msg_test/INFO] FLOW[3] : Receive 2000000 bytes from S3 to C3 + + +$ ns3/ns3 ${srcdir:=.}/ns3/3links-p.xml ${srcdir:=.}/ns3/3links-d-timer.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) +> [C1:slave:(2) 0.104428] [msg_test/INFO] FLOW[1] : Receive 100000 bytes from S1 to C1 +> [C2:slave:(4) 1.041346] [msg_test/INFO] FLOW[2] : Receive 1000000 bytes from S2 to C2 +> [C3:slave:(6) 2.082422] [msg_test/INFO] FLOW[3] : Receive 2000000 bytes from S3 to C3 +> [C3:slave:(7) 4.164594] [msg_test/INFO] FLOW[4] : Receive 2000000 bytes from S3 to C3 + + +p One cluster + +$ ns3/ns3 ${srcdir:=.}/ns3/One_cluster.xml ${srcdir:=.}/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 + +p Two clusters + +$ ns3/ns3 ${srcdir:=.}/ns3/Two_clusters.xml ${srcdir:=.}/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 diff --git a/examples/msg/pmm/msg_pmm.c b/examples/msg/pmm/msg_pmm.c index 9a3174ef87..1ae9c6664e 100644 --- a/examples/msg/pmm/msg_pmm.c +++ b/examples/msg/pmm/msg_pmm.c @@ -13,14 +13,14 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_pmm, "Messages specific for this msg example"); -/* This example should always be executed using a MATRIX_SIZE multiple of - * GRID_SIZE and with GRID_SIZE^2 nodes. */ -#define MATRIX_SIZE 900 -#define GRID_SIZE 3 +/* This example should always be executed using a deployment of + * GRID_SIZE * GRID_SIZE nodes. */ +#define GRID_SIZE 3 /* Modify to adjust the grid's size */ +#define NODE_MATRIX_SIZE 300 /* Ammount of work done by each node*/ -#define MAILBOX_NAME_SIZE 10 #define GRID_NUM_NODES GRID_SIZE * GRID_SIZE -#define NODE_MATRIX_SIZE MATRIX_SIZE / GRID_SIZE +#define MATRIX_SIZE NODE_MATRIX_SIZE * GRID_SIZE +#define MAILBOX_NAME_SIZE 10 #define NEIGHBOURS_COUNT GRID_SIZE - 1 /* diff --git a/examples/msg/sendrecv/sendrecv_CLM03.tesh b/examples/msg/sendrecv/sendrecv_CLM03.tesh index 04789d4d74..22cdfcf684 100644 --- a/examples/msg/sendrecv/sendrecv_CLM03.tesh +++ b/examples/msg/sendrecv/sendrecv_CLM03.tesh @@ -8,17 +8,15 @@ $ $SG_TEST_EXENV sendrecv/sendrecv$EXEEXT ${srcdir:=.}/sendrecv/platform_sendrec > [ 0.000000] (0:@) Configuration change: Set 'cpu/model' to 'Cas01' > [ 0.000000] (0:@) Configuration change: Set 'network/model' to 'CM02' > [ 0.000000] (0:@) test_all -> [ 0.000000] (0:@) Switching workstation model to compound since you changed the network and/or cpu model(s) > [ 0.000000] (1:sender@Inmos) sender > [ 0.000000] (1:sender@Inmos) host = Bellevue > [ 0.000000] (1:sender@Inmos) task_la->data = 0.000000e+00 > [ 0.000000] (2:receiver@Bellevue) receiver -> [ 0.100100] (1:sender@Inmos) task_bw->data = 1.001000e-01 -> [ 0.100100] (2:receiver@Bellevue) Task received : latency task -> [ 0.100100] (2:receiver@Bellevue) Communic. time 1.001000e-01 -> [ 0.100100] (2:receiver@Bellevue) --- la 0.100100 ---- -> [10000.200100] (0:@) Total simulation time: 1.000020e+04 -> [10000.200100] (2:receiver@Bellevue) Task received : bandwidth task -> [10000.200100] (2:receiver@Bellevue) Communic. time 1.000010e+04 -> [10000.200100] (2:receiver@Bellevue) --- bw 99999.000010 ---- - +> [ 1.040100] (1:sender@Inmos) task_bw->data = 1.040100e+00 +> [ 1.040100] (2:receiver@Bellevue) Task received : latency task +> [ 1.040100] (2:receiver@Bellevue) Communic. time 1.040100e+00 +> [ 1.040100] (2:receiver@Bellevue) --- la 1.040100 ---- +> [10002.080100] (0:@) Total simulation time: 1.000208e+04 +> [10002.080100] (2:receiver@Bellevue) Task received : bandwidth task +> [10002.080100] (2:receiver@Bellevue) Communic. time 1.000104e+04 +> [10002.080100] (2:receiver@Bellevue) --- bw 99989.601081 ---- \ No newline at end of file diff --git a/examples/msg/token_ring/token_ring.tesh b/examples/msg/token_ring/token_ring.tesh index 2ce8c7c3a1..8263239305 100644 --- a/examples/msg/token_ring/token_ring.tesh +++ b/examples/msg/token_ring/token_ring.tesh @@ -5,33 +5,32 @@ $ $SG_TEST_EXENV token_ring ${srcdir:=.}/two_clusters.xml "--log=root.fmt:[%10.6 > [ 0.000000] (0:@) Bypassing the XML parser since surf_parse_open received a NULL pointer. If it is not what you want, go fix your code. > [ 0.066240] (1:master@bob1.hamburger.edu) Send Data to "host1" > [ 0.066240] (2:slave@bob3.hamburger.edu) Received "Token" -> [ 0.253920] (2:slave@bob3.hamburger.edu) Send Data to "host2" -> [ 0.253920] (3:slave@alice2.crepe.fr) Received "Token" -> [ 0.320160] (3:slave@alice2.crepe.fr) Send Data to "host3" -> [ 0.320160] (4:slave@alice3.crepe.fr) Received "Token" -> [ 0.507840] (4:slave@alice3.crepe.fr) Send Data to "host4" -> [ 0.507840] (5:slave@bob0.hamburger.edu) Received "Token" -> [ 0.574080] (5:slave@bob0.hamburger.edu) Send Data to "host5" -> [ 0.574080] (6:slave@bob2.hamburger.edu) Received "Token" -> [ 0.640320] (6:slave@bob2.hamburger.edu) Send Data to "host6" -> [ 0.640320] (7:slave@bob4.hamburger.edu) Received "Token" -> [ 0.828000] (7:slave@bob4.hamburger.edu) Send Data to "host7" -> [ 0.828000] (8:slave@alice0.crepe.fr) Received "Token" -> [ 0.894240] (8:slave@alice0.crepe.fr) Send Data to "host8" -> [ 0.894240] (9:slave@alice4.crepe.fr) Received "Token" -> [ 0.960480] (10:slave@alice1.crepe.fr) Received "Token" -> [ 0.960480] (9:slave@alice4.crepe.fr) Send Data to "host9" -> [ 1.148160] (0:@) Simulation time 1.14816 -> [ 1.148160] (10:slave@alice1.crepe.fr) Send Data to "host0" -> [ 1.148160] (1:master@bob1.hamburger.edu) Received "Token" - +> [ 0.242880] (2:slave@bob3.hamburger.edu) Send Data to "host2" +> [ 0.242880] (3:slave@alice2.crepe.fr) Received "Token" +> [ 0.309120] (3:slave@alice2.crepe.fr) Send Data to "host3" +> [ 0.309120] (4:slave@alice3.crepe.fr) Received "Token" +> [ 0.485760] (4:slave@alice3.crepe.fr) Send Data to "host4" +> [ 0.485760] (5:slave@bob0.hamburger.edu) Received "Token" +> [ 0.552000] (5:slave@bob0.hamburger.edu) Send Data to "host5" +> [ 0.552000] (6:slave@bob2.hamburger.edu) Received "Token" +> [ 0.618240] (6:slave@bob2.hamburger.edu) Send Data to "host6" +> [ 0.618240] (7:slave@bob4.hamburger.edu) Received "Token" +> [ 0.794880] (7:slave@bob4.hamburger.edu) Send Data to "host7" +> [ 0.794880] (8:slave@alice0.crepe.fr) Received "Token" +> [ 0.861120] (8:slave@alice0.crepe.fr) Send Data to "host8" +> [ 0.861120] (9:slave@alice4.crepe.fr) Received "Token" +> [ 0.927360] (10:slave@alice1.crepe.fr) Received "Token" +> [ 0.927360] (9:slave@alice4.crepe.fr) Send Data to "host9" +> [ 1.104000] (0:@) Simulation time 1.104 +> [ 1.104000] (10:slave@alice1.crepe.fr) Send Data to "host0" +> [ 1.104000] (1:master@bob1.hamburger.edu) Received "Token" ! output sort $ $SG_TEST_EXENV token_ring ${srcdir:=.}/two_peers.xml --cfg=coordinates:yes "--log=root.fmt:[%12.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) Configuration change: Set 'coordinates' to 'yes' > [ 0.000000] (0:@) Bypassing the XML parser since surf_parse_open received a NULL pointer. If it is not what you want, go fix your code. -> [ 5111.488529] (1:master@peer_100030591) Send Data to "host1" -> [ 5111.488529] (2:slave@peer_100036570) Received "Token" -> [10222.977057] (0:@) Simulation time 10223 -> [10222.977057] (1:master@peer_100030591) Received "Token" -> [10222.977057] (2:slave@peer_100036570) Send Data to "host0" +> [ 5.221778] (1:master@peer_100030591) Send Data to "host1" +> [ 5.221778] (2:slave@peer_100036570) Received "Token" +> [ 10.443556] (0:@) Simulation time 10.4436 +> [ 10.443556] (1:master@peer_100030591) Received "Token" +> [ 10.443556] (2:slave@peer_100036570) Send Data to "host0" \ No newline at end of file diff --git a/examples/msg/tracing/CMakeLists.txt b/examples/msg/tracing/CMakeLists.txt index 5d765e6bf8..6ad066577c 100644 --- a/examples/msg/tracing/CMakeLists.txt +++ b/examples/msg/tracing/CMakeLists.txt @@ -5,13 +5,17 @@ set(LIBRARY_OUTPUT_PATH "${CMAKE_HOME_DIRECTORY}/lib") add_executable(ms ${CMAKE_CURRENT_SOURCE_DIR}/ms.c) add_executable(categories ${CMAKE_CURRENT_SOURCE_DIR}/categories.c) -add_executable(volume ${CMAKE_CURRENT_SOURCE_DIR}/volume.c) add_executable(tasks ${CMAKE_CURRENT_SOURCE_DIR}/tasks.c) add_executable(procmig ${CMAKE_CURRENT_SOURCE_DIR}/procmig.c) ### Add definitions for compile target_link_libraries(ms simgrid m ) target_link_libraries(categories simgrid m ) -target_link_libraries(volume simgrid m ) target_link_libraries(tasks simgrid m ) target_link_libraries(procmig simgrid m ) + +## Clean generated files +get_directory_property(extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES) +set_directory_properties( + PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/ms.cat.plist;${CMAKE_CURRENT_BINARY_DIR}/ms.trace;${CMAKE_CURRENT_BINARY_DIR}/ms.uncat.plist;") diff --git a/examples/msg/tracing/categories.c b/examples/msg/tracing/categories.c index 400de0af7c..08d4b3b42e 100644 --- a/examples/msg/tracing/categories.c +++ b/examples/msg/tracing/categories.c @@ -56,10 +56,9 @@ int master(int argc, char *argv[]) int slave(int argc, char *argv[]) { m_task_t task = NULL; - int res; while (1) { - res = MSG_task_receive(&(task), "master_mailbox"); + MSG_task_receive(&(task), "master_mailbox"); if (!strcmp(MSG_task_get_name(task), "finalize")) { MSG_task_destroy(task); diff --git a/examples/msg/tracing/categories.tesh b/examples/msg/tracing/categories.tesh index e1834bd7c5..736ed84700 100644 --- a/examples/msg/tracing/categories.tesh +++ b/examples/msg/tracing/categories.tesh @@ -2,14 +2,15 @@ p Tracing multiple categories master/slave application -$ $SG_TEST_EXENV ${bindir:=.}/tracing/categories$EXEEXT --cfg=tracing:1 --cfg=tracing/filename:tracing/categories.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/categories.cat.plist --cfg=triva/uncategorized:tracing/categories.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml +$ $SG_TEST_EXENV ${bindir:=.}/tracing/categories$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/categories.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/categories.cat.plist --cfg=triva/uncategorized:tracing/categories.uncat.plist ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/categories.trace' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/categorized' to 'tracing/categories.cat.plist' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'triva/uncategorized' to 'tracing/categories.uncat.plist' -> [4.018878] [msg_test/INFO] Simulation time 4.01888 +> [4.015386] [msg_test/INFO] Simulation time 4.01539 $ cat tracing/categories.trace > %EventDef PajeDefineContainerType 0 @@ -30,7 +31,7 @@ $ cat tracing/categories.trace > %EndEventDef > %EventDef PajeDefineEventType 3 > % Alias string -> % EntityType string +> % ContainerType string > % Name string > % Color color > %EndEventDef @@ -57,46 +58,46 @@ $ cat tracing/categories.trace > %EventDef PajeDestroyContainer 7 > % Time date > % Type string -> % Container string +> % Name string > %EndEventDef > %EventDef PajeSetVariable 8 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeAddVariable 9 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSubVariable 10 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSetState 11 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePushState 12 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePopState 13 > % Time date -> % EntityType string +> % Type string > % Container string > %EndEventDef > %EventDef PajeStartLink 14 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % SourceContainer string @@ -104,7 +105,7 @@ $ cat tracing/categories.trace > %EndEventDef > %EventDef PajeEndLink 15 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % DestContainer string @@ -112,584 +113,492 @@ $ cat tracing/categories.trace > %EndEventDef > %EventDef PajeNewEvent 16 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef -> 0 1 0 L1 -> 6 0 1 1 0 AS0 -> 0 2 1 HOST -> 6 0 2 2 1 Tremblay -> 1 3 2 power "1 1 1" -> 1 4 2 power_used "0.5 0.5 0.5" -> 6 0 3 2 1 Jupiter -> 6 0 4 2 1 Fafard -> 6 0 5 2 1 Ginette -> 6 0 6 2 1 Bourassa -> 0 5 1 ROUTER -> 6 0 7 5 1 R.4-3 -> 6 0 8 5 1 R.3-2-5 -> 6 0 9 5 1 R.2-0 -> 6 0 10 5 1 R.1-0 -> 6 0 11 5 1 R.1-8-6 -> 6 0 12 5 1 R.6-7 -> 0 6 1 LINK -> 6 0 13 6 1 6 -> 1 7 6 bandwidth "1 1 1" -> 1 8 6 latency "1 1 1" -> 1 9 6 bandwidth_used "0.5 0.5 0.5" -> 6 0 14 6 1 11 -> 6 0 15 6 1 3 -> 6 0 16 6 1 7 -> 6 0 17 6 1 9 -> 6 0 18 6 1 12 -> 6 0 19 6 1 2 -> 6 0 20 6 1 8 -> 6 0 21 6 1 1 -> 6 0 22 6 1 4 -> 6 0 23 6 1 0 -> 6 0 24 6 1 10 -> 6 0 25 6 1 5 -> 6 0 26 6 1 loopback -> 4 10 1 2 6 HOST-LINK -> 4 11 1 6 5 LINK-ROUTER -> 4 12 1 6 6 LINK-LINK -> 4 13 1 6 2 LINK-HOST -> 4 14 1 5 6 ROUTER-LINK -> 8 0 3 2 98095000.000000 -> 8 0 3 3 76296000.000000 -> 8 0 3 4 76296000.000000 -> 8 0 3 5 48492000.000000 -> 8 0 3 6 48492000.000000 -> 8 0 7 13 41279125.000000 -> 8 0 8 13 0.000060 -> 8 0 7 14 252750.000000 -> 8 0 8 14 0.005705 -> 8 0 7 15 34285622.000000 -> 8 0 8 15 0.000514 -> 8 0 7 16 11618875.000000 -> 8 0 8 16 0.000190 -> 8 0 7 17 7209750.000000 -> 8 0 8 17 0.001462 -> 8 0 7 18 1792625.000000 -> 8 0 8 18 0.007878 -> 8 0 7 19 22222222.000000 -> 8 0 8 19 0.000137 -> 8 0 7 20 8158000.000000 -> 8 0 8 20 0.000271 -> 8 0 7 21 34285625.000000 -> 8 0 8 21 0.000514 -> 8 0 7 22 10099625.000000 -> 8 0 8 22 0.000480 -> 8 0 7 23 41279125.000000 -> 8 0 8 23 0.000060 -> 8 0 7 24 4679750.000000 -> 8 0 8 24 0.000849 -> 8 0 7 25 27946250.000000 -> 8 0 8 25 0.000278 -> 8 0 7 26 498000000.000000 -> 8 0 8 26 0.000015 -> 14 0 10 1 G 4 0 -> 15 0 10 1 G 26 0 -> 14 0 10 1 G 4 1 -> 15 0 10 1 G 20 1 -> 14 0 11 1 G 20 2 -> 15 0 11 1 G 11 2 -> 14 0 12 1 G 20 3 -> 15 0 12 1 G 21 3 -> 14 0 12 1 G 21 4 -> 15 0 12 1 G 23 4 -> 14 0 12 1 G 23 5 -> 15 0 12 1 G 19 5 -> 14 0 12 1 G 19 6 -> 15 0 12 1 G 15 6 -> 14 0 12 1 G 15 7 -> 15 0 12 1 G 22 7 -> 14 0 13 1 G 22 8 -> 15 0 13 1 G 2 8 -> 14 0 12 1 G 20 9 -> 15 0 12 1 G 13 9 -> 14 0 12 1 G 13 10 -> 15 0 12 1 G 16 10 -> 14 0 13 1 G 16 11 -> 15 0 13 1 G 6 11 -> 14 0 12 1 G 22 12 -> 15 0 12 1 G 17 12 -> 14 0 13 1 G 17 13 -> 15 0 13 1 G 3 13 -> 14 0 12 1 G 19 14 -> 15 0 12 1 G 25 14 -> 14 0 13 1 G 25 15 -> 15 0 13 1 G 5 15 -> 14 0 14 1 G 9 16 -> 15 0 14 1 G 19 16 -> 14 0 11 1 G 19 17 -> 15 0 11 1 G 8 17 -> 14 0 14 1 G 9 18 -> 15 0 14 1 G 23 18 -> 14 0 11 1 G 23 19 -> 15 0 11 1 G 10 19 -> 14 0 14 1 G 7 20 -> 15 0 14 1 G 15 20 -> 14 0 11 1 G 15 21 -> 15 0 11 1 G 8 21 -> 14 0 14 1 G 7 22 -> 15 0 14 1 G 22 22 -> 14 0 14 1 G 8 23 -> 15 0 14 1 G 25 23 -> 14 0 14 1 G 11 24 -> 15 0 14 1 G 13 24 -> 14 0 11 1 G 13 25 -> 15 0 11 1 G 12 25 -> 14 0 14 1 G 11 26 -> 15 0 14 1 G 21 26 -> 14 0 11 1 G 21 27 -> 15 0 11 1 G 10 27 -> 14 0 14 1 G 12 28 -> 15 0 14 1 G 16 28 -> 14 0 10 1 G 2 29 -> 15 0 10 1 G 26 29 -> 14 0 12 1 G 21 30 -> 15 0 12 1 G 13 30 -> 14 0 10 1 G 2 31 -> 15 0 10 1 G 17 31 -> 14 0 12 1 G 15 32 -> 15 0 12 1 G 25 32 -> 14 0 10 1 G 6 33 -> 15 0 10 1 G 26 33 -> 14 0 10 1 G 3 34 -> 15 0 10 1 G 26 34 -> 14 0 10 1 G 5 35 -> 15 0 10 1 G 26 35 -> 1 15 6 compute "1 0 0" -> 1 16 2 compute "1 0 0" -> 1 17 6 request "0 1 0" -> 1 18 2 request "0 1 0" -> 1 19 6 data "0 0 1" -> 1 20 2 data "0 0 1" -> 1 21 6 finalize "0 0 0" -> 1 22 2 finalize "0 0 0" -> 8 0.000156 9 26 0.000000 -> 9 0.000156 9 26 458160000.000000 -> 8 0.000156 19 26 0.000000 -> 9 0.000156 19 26 458160000.000000 -> 10 0.021982 9 26 458160000.000000 -> 10 0.021982 19 26 458160000.000000 -> 8 0.021982 4 2 0.000000 -> 9 0.021982 4 2 98095000.000000 -> 8 0.021982 20 2 0.000000 -> 9 0.021982 20 2 98095000.000000 -> 10 0.021983 4 2 98095000.000000 -> 10 0.021983 20 2 98095000.000000 -> 8 0.037182 4 3 0.000000 -> 9 0.037182 4 3 76296000.000000 -> 8 0.037182 16 3 0.000000 -> 9 0.037182 16 3 76296000.000000 -> 8 0.057733 9 22 0.000000 -> 9 0.057733 9 22 5060664.718311 -> 8 0.057733 17 22 0.000000 -> 9 0.057733 17 22 5060664.718311 -> 8 0.057733 9 15 0.000000 -> 9 0.057733 9 15 5060664.718311 -> 8 0.057733 17 15 0.000000 -> 9 0.057733 17 15 5060664.718311 -> 8 0.057733 9 19 0.000000 -> 9 0.057733 9 19 5060664.718311 -> 8 0.057733 17 19 0.000000 -> 9 0.057733 17 19 5060664.718311 -> 8 0.057733 9 23 0.000000 -> 9 0.057733 9 23 5060664.718311 -> 8 0.057733 17 23 0.000000 -> 9 0.057733 17 23 5060664.718311 -> 8 0.057733 9 21 0.000000 -> 9 0.057733 9 21 5060664.718311 -> 8 0.057733 17 21 0.000000 -> 9 0.057733 17 21 5060664.718311 -> 8 0.057733 9 20 0.000000 -> 9 0.057733 9 20 5060664.718311 -> 8 0.057733 17 20 0.000000 -> 9 0.057733 17 20 5060664.718311 -> 10 0.057735 9 22 5060664.718311 -> 10 0.057735 17 22 5060664.718311 -> 10 0.057735 9 15 5060664.718311 -> 10 0.057735 17 15 5060664.718311 -> 10 0.057735 9 19 5060664.718311 -> 10 0.057735 17 19 5060664.718311 -> 10 0.057735 9 23 5060664.718311 -> 10 0.057735 17 23 5060664.718311 -> 10 0.057735 9 21 5060664.718311 -> 10 0.057735 17 21 5060664.718311 -> 10 0.057735 9 20 5060664.718311 -> 10 0.057735 17 20 5060664.718311 -> 8 0.057735 4 4 0.000000 -> 9 0.057735 4 4 76296000.000000 -> 8 0.057735 18 4 0.000000 -> 9 0.057735 18 4 76296000.000000 -> 10 0.057735 4 4 76296000.000000 -> 10 0.057735 18 4 76296000.000000 -> 8 0.070967 4 5 0.000000 -> 9 0.070967 4 5 48492000.000000 -> 8 0.070967 16 5 0.000000 -> 9 0.070967 16 5 48492000.000000 -> 9 0.091302 9 22 5114134.701194 -> 9 0.091302 17 22 5114134.701194 -> 9 0.091302 9 15 5114134.701194 -> 9 0.091302 17 15 5114134.701194 -> 9 0.091302 9 19 5114134.701194 -> 9 0.091302 17 19 5114134.701194 -> 9 0.091302 9 23 5114134.701194 -> 9 0.091302 17 23 5114134.701194 -> 9 0.091302 9 21 5114134.701194 -> 9 0.091302 17 21 5114134.701194 -> 8 0.091302 9 13 0.000000 -> 9 0.091302 9 13 5114134.701194 -> 8 0.091302 17 13 0.000000 -> 9 0.091302 17 13 5114134.701194 -> 8 0.091302 9 16 0.000000 -> 9 0.091302 9 16 5114134.701194 -> 8 0.091302 17 16 0.000000 -> 9 0.091302 17 16 5114134.701194 -> 10 0.091304 9 22 5114134.701194 -> 10 0.091304 17 22 5114134.701194 -> 10 0.091304 9 15 5114134.701194 -> 10 0.091304 17 15 5114134.701194 -> 10 0.091304 9 19 5114134.701194 -> 10 0.091304 17 19 5114134.701194 -> 10 0.091304 9 23 5114134.701194 -> 10 0.091304 17 23 5114134.701194 -> 10 0.091304 9 21 5114134.701194 -> 10 0.091304 17 21 5114134.701194 -> 10 0.091304 9 13 5114134.701194 -> 10 0.091304 17 13 5114134.701194 -> 10 0.091304 9 16 5114134.701194 -> 10 0.091304 17 16 5114134.701194 -> 8 0.091304 4 6 0.000000 -> 9 0.091304 4 6 48492000.000000 -> 8 0.091304 18 6 0.000000 -> 9 0.091304 18 6 48492000.000000 -> 10 0.091305 4 6 48492000.000000 -> 10 0.091305 18 6 48492000.000000 -> 9 0.091460 4 2 98095000.000000 -> 8 0.091460 16 2 0.000000 -> 9 0.091460 16 2 98095000.000000 -> 9 0.112011 9 22 5060664.718311 -> 8 0.112011 19 22 0.000000 -> 9 0.112011 19 22 5060664.718311 -> 9 0.112011 9 15 5060664.718311 -> 8 0.112011 19 15 0.000000 -> 9 0.112011 19 15 5060664.718311 -> 9 0.112011 9 19 5060664.718311 -> 8 0.112011 19 19 0.000000 -> 9 0.112011 19 19 5060664.718311 -> 9 0.112011 9 23 5060664.718311 -> 8 0.112011 19 23 0.000000 -> 9 0.112011 19 23 5060664.718311 -> 9 0.112011 9 21 5060664.718311 -> 8 0.112011 19 21 0.000000 -> 9 0.112011 19 21 5060664.718311 -> 9 0.112011 9 20 5060664.718311 -> 8 0.112011 19 20 0.000000 -> 9 0.112011 19 20 5060664.718311 -> 10 0.168251 4 3 76296000.000000 -> 10 0.168251 16 3 76296000.000000 -> 10 0.168251 9 22 5060664.718311 -> 10 0.168251 19 22 5060664.718311 -> 10 0.168251 9 15 5060664.718311 -> 10 0.168251 19 15 5060664.718311 -> 10 0.168251 9 19 5060664.718311 -> 10 0.168251 19 19 5060664.718311 -> 10 0.168251 9 23 5060664.718311 -> 10 0.168251 19 23 5060664.718311 -> 10 0.168251 9 21 5060664.718311 -> 10 0.168251 19 21 5060664.718311 -> 10 0.168251 9 20 5060664.718311 -> 10 0.168251 19 20 5060664.718311 -> 9 0.168251 9 22 5060664.718311 -> 9 0.168251 19 22 5060664.718311 -> 9 0.168251 9 15 5060664.718311 -> 9 0.168251 19 15 5060664.718311 -> 9 0.168251 9 19 5060664.718311 -> 9 0.168251 19 19 5060664.718311 -> 9 0.168251 9 23 5060664.718311 -> 9 0.168251 19 23 5060664.718311 -> 9 0.168251 9 21 5060664.718311 -> 9 0.168251 19 21 5060664.718311 -> 9 0.168251 9 20 5060664.718311 -> 9 0.168251 19 20 5060664.718311 -> 10 0.193402 4 2 98095000.000000 -> 10 0.193402 16 2 98095000.000000 -> 10 0.193402 9 22 5060664.718311 -> 10 0.193402 19 22 5060664.718311 -> 10 0.193402 9 15 5060664.718311 -> 10 0.193402 19 15 5060664.718311 -> 10 0.193402 9 19 5060664.718311 -> 10 0.193402 19 19 5060664.718311 -> 10 0.193402 9 23 5060664.718311 -> 10 0.193402 19 23 5060664.718311 -> 10 0.193402 9 21 5060664.718311 -> 10 0.193402 19 21 5060664.718311 -> 10 0.193402 9 20 5060664.718311 -> 10 0.193402 19 20 5060664.718311 -> 9 0.193402 9 22 5060664.718311 -> 9 0.193402 19 22 5060664.718311 -> 9 0.193402 9 15 5060664.718311 -> 9 0.193402 19 15 5060664.718311 -> 9 0.193402 9 19 5060664.718311 -> 9 0.193402 19 19 5060664.718311 -> 9 0.193402 9 23 5060664.718311 -> 9 0.193402 19 23 5060664.718311 -> 9 0.193402 9 21 5060664.718311 -> 9 0.193402 19 21 5060664.718311 -> 9 0.193402 9 20 5060664.718311 -> 9 0.193402 19 20 5060664.718311 -> 9 0.277186 9 22 5060664.718311 -> 9 0.277186 19 22 5060664.718311 -> 9 0.277186 9 15 5060664.718311 -> 9 0.277186 19 15 5060664.718311 -> 9 0.277186 9 19 5060664.718311 -> 9 0.277186 19 19 5060664.718311 -> 9 0.277186 9 23 5060664.718311 -> 9 0.277186 19 23 5060664.718311 -> 9 0.277186 9 21 5060664.718311 -> 9 0.277186 19 21 5060664.718311 -> 9 0.277186 9 20 5060664.718311 -> 9 0.277186 19 20 5060664.718311 -> 10 0.277186 4 5 48492000.000000 -> 10 0.277186 16 5 48492000.000000 -> 10 0.277186 9 22 5060664.718311 -> 10 0.277186 19 22 5060664.718311 -> 10 0.277186 9 15 5060664.718311 -> 10 0.277186 19 15 5060664.718311 -> 10 0.277186 9 19 5060664.718311 -> 10 0.277186 19 19 5060664.718311 -> 10 0.277186 9 23 5060664.718311 -> 10 0.277186 19 23 5060664.718311 -> 10 0.277186 9 21 5060664.718311 -> 10 0.277186 19 21 5060664.718311 -> 10 0.277186 9 20 5060664.718311 -> 10 0.277186 19 20 5060664.718311 -> 10 2.088036 9 22 5060664.718311 -> 10 2.088036 19 22 5060664.718311 -> 10 2.088036 9 15 5060664.718311 -> 10 2.088036 19 15 5060664.718311 -> 10 2.088036 9 19 5060664.718311 -> 10 2.088036 19 19 5060664.718311 -> 10 2.088036 9 23 5060664.718311 -> 10 2.088036 19 23 5060664.718311 -> 10 2.088036 9 21 5060664.718311 -> 10 2.088036 19 21 5060664.718311 -> 10 2.088036 9 20 5060664.718311 -> 10 2.088036 19 20 5060664.718311 -> 9 2.088036 4 4 76296000.000000 -> 8 2.088036 20 4 0.000000 -> 9 2.088036 20 4 76296000.000000 -> 10 2.088036 4 4 76296000.000000 -> 10 2.088036 20 4 76296000.000000 -> 9 2.108372 4 6 48492000.000000 -> 8 2.108372 16 6 0.000000 -> 9 2.108372 16 6 48492000.000000 -> 8 2.123572 9 17 0.000000 -> 9 2.123572 9 17 6632970.000000 -> 8 2.123572 17 17 0.000000 -> 9 2.123572 17 17 6632970.000000 -> 10 2.123573 9 17 6632970.000000 -> 10 2.123573 17 17 6632970.000000 -> 9 2.123573 4 3 76296000.000000 -> 8 2.123573 18 3 0.000000 -> 9 2.123573 18 3 76296000.000000 -> 10 2.123573 4 3 76296000.000000 -> 10 2.123573 18 3 76296000.000000 -> 9 2.123729 4 2 98095000.000000 -> 9 2.123729 16 2 98095000.000000 -> 9 2.136961 9 22 7859911.230163 -> 9 2.136961 17 22 7859911.230163 -> 9 2.136961 9 15 7859911.230163 -> 9 2.136961 17 15 7859911.230163 -> 8 2.136961 9 25 0.000000 -> 9 2.136961 9 25 7859911.230163 -> 8 2.136961 17 25 0.000000 -> 9 2.136961 17 25 7859911.230163 -> 10 2.136962 9 22 7859911.230163 -> 10 2.136962 17 22 7859911.230163 -> 10 2.136962 9 15 7859911.230163 -> 10 2.136962 17 15 7859911.230163 -> 10 2.136962 9 25 7859911.230163 -> 10 2.136962 17 25 7859911.230163 -> 10 2.136962 4 2 98095000.000000 -> 10 2.136962 16 2 98095000.000000 -> 9 2.136962 4 5 48492000.000000 -> 8 2.136962 18 5 0.000000 -> 9 2.136962 18 5 48492000.000000 -> 9 2.136962 4 2 98095000.000000 -> 9 2.136962 16 2 98095000.000000 -> 10 2.136962 4 5 48492000.000000 -> 10 2.136962 18 5 48492000.000000 -> 10 2.157513 4 2 98095000.000000 -> 10 2.157513 16 2 98095000.000000 -> 9 2.157513 4 2 98095000.000000 -> 9 2.157513 16 2 98095000.000000 -> 9 2.157513 4 4 76296000.000000 -> 8 2.157513 16 4 0.000000 -> 9 2.157513 16 4 76296000.000000 -> 9 2.172712 9 17 6632970.000000 -> 8 2.172712 19 17 0.000000 -> 9 2.172712 19 17 6632970.000000 -> 10 2.225671 4 2 98095000.000000 -> 10 2.225671 16 2 98095000.000000 -> 10 2.225671 9 17 6632970.000000 -> 10 2.225671 19 17 6632970.000000 -> 9 2.225671 9 17 6632970.000000 -> 9 2.225671 19 17 6632970.000000 -> 10 2.288581 4 4 76296000.000000 -> 10 2.288581 16 4 76296000.000000 -> 10 2.288581 9 17 6632970.000000 -> 10 2.288581 19 17 6632970.000000 -> 9 2.288581 9 17 6632970.000000 -> 9 2.288581 19 17 6632970.000000 -> 9 2.314591 9 17 6632970.000000 -> 9 2.314591 19 17 6632970.000000 -> 10 2.314591 4 6 48492000.000000 -> 10 2.314591 16 6 48492000.000000 -> 10 2.314591 9 17 6632970.000000 -> 10 2.314591 19 17 6632970.000000 -> 10 3.680333 9 17 6632970.000000 -> 10 3.680333 19 17 6632970.000000 -> 9 3.680333 4 3 76296000.000000 -> 8 3.680333 20 3 0.000000 -> 9 3.680333 20 3 76296000.000000 -> 10 3.680333 4 3 76296000.000000 -> 10 3.680333 20 3 76296000.000000 -> 9 3.693564 4 5 48492000.000000 -> 9 3.693564 16 5 48492000.000000 -> 9 3.693720 9 26 458160000.000000 -> 8 3.693720 17 26 0.000000 -> 9 3.693720 17 26 458160000.000000 -> 10 3.693720 9 26 458160000.000000 -> 10 3.693720 17 26 458160000.000000 -> 9 3.693720 4 2 98095000.000000 -> 8 3.693720 18 2 0.000000 -> 9 3.693720 18 2 98095000.000000 -> 10 3.693721 4 2 98095000.000000 -> 10 3.693721 18 2 98095000.000000 -> 9 3.714271 4 4 76296000.000000 -> 9 3.714271 16 4 76296000.000000 -> 9 3.734607 9 22 5114134.701194 -> 9 3.734607 17 22 5114134.701194 -> 9 3.734607 9 15 5114134.701194 -> 9 3.734607 17 15 5114134.701194 -> 9 3.734607 9 19 5114134.701194 -> 9 3.734607 17 19 5114134.701194 -> 9 3.734607 9 23 5114134.701194 -> 9 3.734607 17 23 5114134.701194 -> 9 3.734607 9 21 5114134.701194 -> 9 3.734607 17 21 5114134.701194 -> 9 3.734607 9 13 5114134.701194 -> 9 3.734607 17 13 5114134.701194 -> 9 3.734607 9 16 5114134.701194 -> 9 3.734607 17 16 5114134.701194 -> 10 3.734609 9 22 5114134.701194 -> 10 3.734609 17 22 5114134.701194 -> 10 3.734609 9 15 5114134.701194 -> 10 3.734609 17 15 5114134.701194 -> 10 3.734609 9 19 5114134.701194 -> 10 3.734609 17 19 5114134.701194 -> 10 3.734609 9 23 5114134.701194 -> 10 3.734609 17 23 5114134.701194 -> 10 3.734609 9 21 5114134.701194 -> 10 3.734609 17 21 5114134.701194 -> 10 3.734609 9 13 5114134.701194 -> 10 3.734609 17 13 5114134.701194 -> 10 3.734609 9 16 5114134.701194 -> 10 3.734609 17 16 5114134.701194 -> 9 3.734609 4 6 48492000.000000 -> 9 3.734609 18 6 48492000.000000 -> 10 3.734609 4 6 48492000.000000 -> 10 3.734609 18 6 48492000.000000 -> 9 3.749809 4 3 76296000.000000 -> 9 3.749809 16 3 76296000.000000 -> 9 3.749965 9 26 458160000.000000 -> 9 3.749965 19 26 458160000.000000 -> 10 3.771791 9 26 458160000.000000 -> 10 3.771791 19 26 458160000.000000 -> 9 3.771791 4 2 98095000.000000 -> 9 3.771791 20 2 98095000.000000 -> 10 3.771791 4 2 98095000.000000 -> 10 3.771791 20 2 98095000.000000 -> 9 3.792127 4 6 48492000.000000 -> 9 3.792127 16 6 48492000.000000 -> 9 3.792283 9 26 458160000.000000 -> 8 3.792283 21 26 0.000000 -> 9 3.792283 21 26 458160000.000000 -> 10 3.792285 9 26 458160000.000000 -> 10 3.792285 21 26 458160000.000000 -> 10 3.845340 4 4 76296000.000000 -> 10 3.845340 16 4 76296000.000000 -> 9 3.865890 9 22 5060664.718311 -> 9 3.865890 9 15 5060664.718311 -> 9 3.865890 9 19 5060664.718311 -> 9 3.865890 9 23 5060664.718311 -> 9 3.865890 9 21 5060664.718311 -> 9 3.865890 9 20 5060664.718311 -> 10 3.866088 9 22 5060664.718311 -> 10 3.866088 9 15 5060664.718311 -> 10 3.866088 9 19 5060664.718311 -> 10 3.866088 9 23 5060664.718311 -> 10 3.866088 9 21 5060664.718311 -> 10 3.866088 9 20 5060664.718311 -> 10 3.880877 4 3 76296000.000000 -> 10 3.880877 16 3 76296000.000000 -> 9 3.896077 9 17 6632970.000000 -> 10 3.896228 9 17 6632970.000000 -> 10 3.899784 4 5 48492000.000000 -> 10 3.899784 16 5 48492000.000000 -> 9 3.913016 9 22 7859911.230163 -> 9 3.913016 9 15 7859911.230163 -> 9 3.913016 9 25 7859911.230163 -> 10 3.913143 9 22 7859911.230163 -> 10 3.913143 9 15 7859911.230163 -> 10 3.913143 9 25 7859911.230163 -> 10 3.998346 4 6 48492000.000000 -> 10 3.998346 16 6 48492000.000000 -> 9 4.018682 9 22 5114134.701194 -> 9 4.018682 9 15 5114134.701194 -> 9 4.018682 9 19 5114134.701194 -> 9 4.018682 9 23 5114134.701194 -> 9 4.018682 9 21 5114134.701194 -> 9 4.018682 9 13 5114134.701194 -> 9 4.018682 9 16 5114134.701194 -> 10 4.018878 9 22 5114134.701194 -> 10 4.018878 9 15 5114134.701194 -> 10 4.018878 9 19 5114134.701194 -> 10 4.018878 9 23 5114134.701194 -> 10 4.018878 9 21 5114134.701194 -> 10 4.018878 9 13 5114134.701194 -> 10 4.018878 9 16 5114134.701194 -> 7 4.018878 2 4 -> 7 4.018878 5 9 -> 7 4.018878 5 7 -> 7 4.018878 5 8 -> 7 4.018878 5 11 -> 7 4.018878 5 12 -> 7 4.018878 2 2 -> 7 4.018878 6 24 -> 7 4.018878 6 14 -> 7 4.018878 6 18 -> 7 4.018878 6 26 -> 7 4.018878 5 10 -> 7 4.018878 6 23 -> 7 4.018878 6 21 -> 7 4.018878 6 19 -> 7 4.018878 6 15 -> 7 4.018878 6 22 -> 7 4.018878 6 25 -> 7 4.018878 6 13 -> 7 4.018878 6 16 -> 7 4.018878 6 20 -> 7 4.018878 6 17 -> 7 4.018878 2 6 -> 7 4.018878 2 3 -> 7 4.018878 2 5 -> 7 4.018878 1 1 -> 7 4.018878 0 0 +> 0 1 0 HOST +> 6 0 1 1 0 "Tremblay" +> 1 2 1 power "1 1 1" +> 1 3 1 power_used "0.5 0.5 0.5" +> 6 0 2 1 0 "Jupiter" +> 6 0 3 1 0 "Fafard" +> 6 0 4 1 0 "Ginette" +> 6 0 5 1 0 "Bourassa" +> 0 4 0 LINK +> 6 0 6 4 0 "6" +> 1 5 4 bandwidth "1 1 1" +> 1 6 4 latency "1 1 1" +> 1 7 4 bandwidth_used "0.5 0.5 0.5" +> 6 0 7 4 0 "3" +> 6 0 8 4 0 "7" +> 6 0 9 4 0 "9" +> 6 0 10 4 0 "2" +> 6 0 11 4 0 "8" +> 6 0 12 4 0 "1" +> 6 0 13 4 0 "4" +> 6 0 14 4 0 "0" +> 6 0 15 4 0 "5" +> 4 8 0 1 4 HOST-LINK +> 4 9 0 4 4 LINK-LINK +> 4 10 0 4 1 LINK-HOST +> 8 0 2 1 98095000.000000 +> 8 0 2 2 76296000.000000 +> 8 0 2 3 76296000.000000 +> 8 0 2 4 48492000.000000 +> 8 0 2 5 48492000.000000 +> 8 0 5 6 41279125.000000 +> 8 0 6 6 0.000060 +> 8 0 5 7 34285625.000000 +> 8 0 6 7 0.000514 +> 8 0 5 8 11618875.000000 +> 8 0 6 8 0.000190 +> 8 0 5 9 7209750.000000 +> 8 0 6 9 0.001462 +> 8 0 5 10 118682500.000000 +> 8 0 6 10 0.000137 +> 8 0 5 11 8158000.000000 +> 8 0 6 11 0.000271 +> 8 0 5 12 34285625.000000 +> 8 0 6 12 0.000514 +> 8 0 5 13 10099625.000000 +> 8 0 6 13 0.000480 +> 8 0 5 14 41279125.000000 +> 8 0 6 14 0.000060 +> 8 0 5 15 27946250.000000 +> 8 0 6 15 0.000278 +> 14 0 8 0 G 3 0 +> 15 0 8 0 G 11 0 +> 14 0 9 0 G 11 1 +> 15 0 9 0 G 12 1 +> 14 0 9 0 G 12 2 +> 15 0 9 0 G 14 2 +> 14 0 9 0 G 14 3 +> 15 0 9 0 G 10 3 +> 14 0 9 0 G 10 4 +> 15 0 9 0 G 7 4 +> 14 0 9 0 G 7 5 +> 15 0 9 0 G 13 5 +> 14 0 10 0 G 13 6 +> 15 0 10 0 G 1 6 +> 14 0 9 0 G 11 7 +> 15 0 9 0 G 6 7 +> 14 0 9 0 G 6 8 +> 15 0 9 0 G 8 8 +> 14 0 10 0 G 8 9 +> 15 0 10 0 G 5 9 +> 14 0 9 0 G 13 10 +> 15 0 9 0 G 9 10 +> 14 0 10 0 G 9 11 +> 15 0 10 0 G 2 11 +> 14 0 9 0 G 10 12 +> 15 0 9 0 G 15 12 +> 14 0 10 0 G 15 13 +> 15 0 10 0 G 4 13 +> 14 0 9 0 G 12 14 +> 15 0 9 0 G 6 14 +> 14 0 8 0 G 1 15 +> 15 0 8 0 G 9 15 +> 14 0 9 0 G 7 16 +> 15 0 9 0 G 15 16 +> 1 11 4 bcompute "1 0 0" +> 1 12 1 pcompute "1 0 0" +> 1 13 4 brequest "0 1 0" +> 1 14 1 prequest "0 1 0" +> 1 15 4 bdata "0 0 1" +> 1 16 1 pdata "0 0 1" +> 1 17 4 bfinalize "0 0 0" +> 1 18 1 pfinalize "0 0 0" +> 8 0.020236 3 1 0.000000 +> 9 0.020236 3 1 98095000.000000 +> 8 0.020236 16 1 0.000000 +> 9 0.020236 16 1 98095000.000000 +> 10 0.020236 3 1 98095000.000000 +> 10 0.020236 16 1 98095000.000000 +> 8 0.035436 3 2 0.000000 +> 9 0.035436 3 2 76296000.000000 +> 8 0.035436 12 2 0.000000 +> 9 0.035436 12 2 76296000.000000 +> 8 0.055987 7 13 0.000000 +> 9 0.055987 7 13 5060664.718311 +> 8 0.055987 13 13 0.000000 +> 9 0.055987 13 13 5060664.718311 +> 8 0.055987 7 7 0.000000 +> 9 0.055987 7 7 5060664.718311 +> 8 0.055987 13 7 0.000000 +> 9 0.055987 13 7 5060664.718311 +> 8 0.055987 7 10 0.000000 +> 9 0.055987 7 10 5060664.718311 +> 8 0.055987 13 10 0.000000 +> 9 0.055987 13 10 5060664.718311 +> 8 0.055987 7 14 0.000000 +> 9 0.055987 7 14 5060664.718311 +> 8 0.055987 13 14 0.000000 +> 9 0.055987 13 14 5060664.718311 +> 8 0.055987 7 12 0.000000 +> 9 0.055987 7 12 5060664.718311 +> 8 0.055987 13 12 0.000000 +> 9 0.055987 13 12 5060664.718311 +> 8 0.055987 7 11 0.000000 +> 9 0.055987 7 11 5060664.718311 +> 8 0.055987 13 11 0.000000 +> 9 0.055987 13 11 5060664.718311 +> 10 0.055989 7 13 5060664.718311 +> 10 0.055989 13 13 5060664.718311 +> 10 0.055989 7 7 5060664.718311 +> 10 0.055989 13 7 5060664.718311 +> 10 0.055989 7 10 5060664.718311 +> 10 0.055989 13 10 5060664.718311 +> 10 0.055989 7 14 5060664.718311 +> 10 0.055989 13 14 5060664.718311 +> 10 0.055989 7 12 5060664.718311 +> 10 0.055989 13 12 5060664.718311 +> 10 0.055989 7 11 5060664.718311 +> 10 0.055989 13 11 5060664.718311 +> 8 0.055989 3 3 0.000000 +> 9 0.055989 3 3 76296000.000000 +> 8 0.055989 14 3 0.000000 +> 9 0.055989 14 3 76296000.000000 +> 10 0.055989 3 3 76296000.000000 +> 10 0.055989 14 3 76296000.000000 +> 8 0.069220 3 4 0.000000 +> 9 0.069220 3 4 48492000.000000 +> 8 0.069220 12 4 0.000000 +> 9 0.069220 12 4 48492000.000000 +> 9 0.089556 7 13 5114134.701194 +> 9 0.089556 13 13 5114134.701194 +> 9 0.089556 7 7 5114134.701194 +> 9 0.089556 13 7 5114134.701194 +> 9 0.089556 7 10 5114134.701194 +> 9 0.089556 13 10 5114134.701194 +> 9 0.089556 7 14 5114134.701194 +> 9 0.089556 13 14 5114134.701194 +> 9 0.089556 7 12 5114134.701194 +> 9 0.089556 13 12 5114134.701194 +> 8 0.089556 7 6 0.000000 +> 9 0.089556 7 6 5114134.701194 +> 8 0.089556 13 6 0.000000 +> 9 0.089556 13 6 5114134.701194 +> 8 0.089556 7 8 0.000000 +> 9 0.089556 7 8 5114134.701194 +> 8 0.089556 13 8 0.000000 +> 9 0.089556 13 8 5114134.701194 +> 10 0.089558 7 13 5114134.701194 +> 10 0.089558 13 13 5114134.701194 +> 10 0.089558 7 7 5114134.701194 +> 10 0.089558 13 7 5114134.701194 +> 10 0.089558 7 10 5114134.701194 +> 10 0.089558 13 10 5114134.701194 +> 10 0.089558 7 14 5114134.701194 +> 10 0.089558 13 14 5114134.701194 +> 10 0.089558 7 12 5114134.701194 +> 10 0.089558 13 12 5114134.701194 +> 10 0.089558 7 6 5114134.701194 +> 10 0.089558 13 6 5114134.701194 +> 10 0.089558 7 8 5114134.701194 +> 10 0.089558 13 8 5114134.701194 +> 8 0.089558 3 5 0.000000 +> 9 0.089558 3 5 48492000.000000 +> 8 0.089558 14 5 0.000000 +> 9 0.089558 14 5 48492000.000000 +> 10 0.089558 3 5 48492000.000000 +> 10 0.089558 14 5 48492000.000000 +> 9 0.089714 3 1 98095000.000000 +> 8 0.089714 12 1 0.000000 +> 9 0.089714 12 1 98095000.000000 +> 9 0.110265 7 13 5060664.718311 +> 8 0.110265 15 13 0.000000 +> 9 0.110265 15 13 5060664.718311 +> 9 0.110265 7 7 5060664.718311 +> 8 0.110265 15 7 0.000000 +> 9 0.110265 15 7 5060664.718311 +> 9 0.110265 7 10 5060664.718311 +> 8 0.110265 15 10 0.000000 +> 9 0.110265 15 10 5060664.718311 +> 9 0.110265 7 14 5060664.718311 +> 8 0.110265 15 14 0.000000 +> 9 0.110265 15 14 5060664.718311 +> 9 0.110265 7 12 5060664.718311 +> 8 0.110265 15 12 0.000000 +> 9 0.110265 15 12 5060664.718311 +> 9 0.110265 7 11 5060664.718311 +> 8 0.110265 15 11 0.000000 +> 9 0.110265 15 11 5060664.718311 +> 10 0.166505 3 2 76296000.000000 +> 10 0.166505 12 2 76296000.000000 +> 10 0.166505 7 13 5060664.718311 +> 10 0.166505 15 13 5060664.718311 +> 10 0.166505 7 7 5060664.718311 +> 10 0.166505 15 7 5060664.718311 +> 10 0.166505 7 10 5060664.718311 +> 10 0.166505 15 10 5060664.718311 +> 10 0.166505 7 14 5060664.718311 +> 10 0.166505 15 14 5060664.718311 +> 10 0.166505 7 12 5060664.718311 +> 10 0.166505 15 12 5060664.718311 +> 10 0.166505 7 11 5060664.718311 +> 10 0.166505 15 11 5060664.718311 +> 9 0.166505 7 13 5060664.718311 +> 9 0.166505 15 13 5060664.718311 +> 9 0.166505 7 7 5060664.718311 +> 9 0.166505 15 7 5060664.718311 +> 9 0.166505 7 10 5060664.718311 +> 9 0.166505 15 10 5060664.718311 +> 9 0.166505 7 14 5060664.718311 +> 9 0.166505 15 14 5060664.718311 +> 9 0.166505 7 12 5060664.718311 +> 9 0.166505 15 12 5060664.718311 +> 9 0.166505 7 11 5060664.718311 +> 9 0.166505 15 11 5060664.718311 +> 10 0.191656 3 1 98095000.000000 +> 10 0.191656 12 1 98095000.000000 +> 10 0.191656 7 13 5060664.718311 +> 10 0.191656 15 13 5060664.718311 +> 10 0.191656 7 7 5060664.718311 +> 10 0.191656 15 7 5060664.718311 +> 10 0.191656 7 10 5060664.718311 +> 10 0.191656 15 10 5060664.718311 +> 10 0.191656 7 14 5060664.718311 +> 10 0.191656 15 14 5060664.718311 +> 10 0.191656 7 12 5060664.718311 +> 10 0.191656 15 12 5060664.718311 +> 10 0.191656 7 11 5060664.718311 +> 10 0.191656 15 11 5060664.718311 +> 9 0.191656 7 13 5060664.718311 +> 9 0.191656 15 13 5060664.718311 +> 9 0.191656 7 7 5060664.718311 +> 9 0.191656 15 7 5060664.718311 +> 9 0.191656 7 10 5060664.718311 +> 9 0.191656 15 10 5060664.718311 +> 9 0.191656 7 14 5060664.718311 +> 9 0.191656 15 14 5060664.718311 +> 9 0.191656 7 12 5060664.718311 +> 9 0.191656 15 12 5060664.718311 +> 9 0.191656 7 11 5060664.718311 +> 9 0.191656 15 11 5060664.718311 +> 9 0.275440 7 13 5060664.718311 +> 9 0.275440 15 13 5060664.718311 +> 9 0.275440 7 7 5060664.718311 +> 9 0.275440 15 7 5060664.718311 +> 9 0.275440 7 10 5060664.718311 +> 9 0.275440 15 10 5060664.718311 +> 9 0.275440 7 14 5060664.718311 +> 9 0.275440 15 14 5060664.718311 +> 9 0.275440 7 12 5060664.718311 +> 9 0.275440 15 12 5060664.718311 +> 9 0.275440 7 11 5060664.718311 +> 9 0.275440 15 11 5060664.718311 +> 10 0.275440 3 4 48492000.000000 +> 10 0.275440 12 4 48492000.000000 +> 10 0.275440 7 13 5060664.718311 +> 10 0.275440 15 13 5060664.718311 +> 10 0.275440 7 7 5060664.718311 +> 10 0.275440 15 7 5060664.718311 +> 10 0.275440 7 10 5060664.718311 +> 10 0.275440 15 10 5060664.718311 +> 10 0.275440 7 14 5060664.718311 +> 10 0.275440 15 14 5060664.718311 +> 10 0.275440 7 12 5060664.718311 +> 10 0.275440 15 12 5060664.718311 +> 10 0.275440 7 11 5060664.718311 +> 10 0.275440 15 11 5060664.718311 +> 10 2.086290 7 13 5060664.718311 +> 10 2.086290 15 13 5060664.718311 +> 10 2.086290 7 7 5060664.718311 +> 10 2.086290 15 7 5060664.718311 +> 10 2.086290 7 10 5060664.718311 +> 10 2.086290 15 10 5060664.718311 +> 10 2.086290 7 14 5060664.718311 +> 10 2.086290 15 14 5060664.718311 +> 10 2.086290 7 12 5060664.718311 +> 10 2.086290 15 12 5060664.718311 +> 10 2.086290 7 11 5060664.718311 +> 10 2.086290 15 11 5060664.718311 +> 9 2.086290 3 3 76296000.000000 +> 8 2.086290 16 3 0.000000 +> 9 2.086290 16 3 76296000.000000 +> 10 2.086290 3 3 76296000.000000 +> 10 2.086290 16 3 76296000.000000 +> 9 2.106626 3 5 48492000.000000 +> 8 2.106626 12 5 0.000000 +> 9 2.106626 12 5 48492000.000000 +> 8 2.121825 7 9 0.000000 +> 9 2.121825 7 9 6632970.000000 +> 8 2.121825 13 9 0.000000 +> 9 2.121825 13 9 6632970.000000 +> 10 2.121827 7 9 6632970.000000 +> 10 2.121827 13 9 6632970.000000 +> 9 2.121827 3 2 76296000.000000 +> 8 2.121827 14 2 0.000000 +> 9 2.121827 14 2 76296000.000000 +> 10 2.121827 3 2 76296000.000000 +> 10 2.121827 14 2 76296000.000000 +> 9 2.121983 3 1 98095000.000000 +> 9 2.121983 12 1 98095000.000000 +> 9 2.135215 7 13 7859911.230163 +> 9 2.135215 13 13 7859911.230163 +> 9 2.135215 7 7 7859911.230163 +> 9 2.135215 13 7 7859911.230163 +> 8 2.135215 7 15 0.000000 +> 9 2.135215 7 15 7859911.230163 +> 8 2.135215 13 15 0.000000 +> 9 2.135215 13 15 7859911.230163 +> 10 2.135216 7 13 7859911.230163 +> 10 2.135216 13 13 7859911.230163 +> 10 2.135216 7 7 7859911.230163 +> 10 2.135216 13 7 7859911.230163 +> 10 2.135216 7 15 7859911.230163 +> 10 2.135216 13 15 7859911.230163 +> 10 2.135216 3 1 98095000.000000 +> 10 2.135216 12 1 98095000.000000 +> 9 2.135216 3 4 48492000.000000 +> 8 2.135216 14 4 0.000000 +> 9 2.135216 14 4 48492000.000000 +> 9 2.135216 3 1 98095000.000000 +> 9 2.135216 12 1 98095000.000000 +> 10 2.135216 3 4 48492000.000000 +> 10 2.135216 14 4 48492000.000000 +> 10 2.155767 3 1 98095000.000000 +> 10 2.155767 12 1 98095000.000000 +> 9 2.155767 3 1 98095000.000000 +> 9 2.155767 12 1 98095000.000000 +> 9 2.155767 3 3 76296000.000000 +> 8 2.155767 12 3 0.000000 +> 9 2.155767 12 3 76296000.000000 +> 9 2.170966 7 9 6632970.000000 +> 8 2.170966 15 9 0.000000 +> 9 2.170966 15 9 6632970.000000 +> 10 2.223925 3 1 98095000.000000 +> 10 2.223925 12 1 98095000.000000 +> 10 2.223925 7 9 6632970.000000 +> 10 2.223925 15 9 6632970.000000 +> 9 2.223925 7 9 6632970.000000 +> 9 2.223925 15 9 6632970.000000 +> 10 2.286835 3 3 76296000.000000 +> 10 2.286835 12 3 76296000.000000 +> 10 2.286835 7 9 6632970.000000 +> 10 2.286835 15 9 6632970.000000 +> 9 2.286835 7 9 6632970.000000 +> 9 2.286835 15 9 6632970.000000 +> 10 2.312845 3 5 48492000.000000 +> 10 2.312845 12 5 48492000.000000 +> 10 2.312845 7 9 6632970.000000 +> 10 2.312845 15 9 6632970.000000 +> 9 2.312845 7 9 6632970.000000 +> 9 2.312845 15 9 6632970.000000 +> 10 3.678587 7 9 6632970.000000 +> 10 3.678587 15 9 6632970.000000 +> 9 3.678587 3 2 76296000.000000 +> 8 3.678587 16 2 0.000000 +> 9 3.678587 16 2 76296000.000000 +> 10 3.678587 3 2 76296000.000000 +> 10 3.678587 16 2 76296000.000000 +> 9 3.691818 3 4 48492000.000000 +> 9 3.691818 12 4 48492000.000000 +> 9 3.691974 3 1 98095000.000000 +> 8 3.691974 14 1 0.000000 +> 9 3.691974 14 1 98095000.000000 +> 10 3.691974 3 1 98095000.000000 +> 10 3.691974 14 1 98095000.000000 +> 9 3.712525 3 3 76296000.000000 +> 9 3.712525 12 3 76296000.000000 +> 9 3.732861 7 13 5114134.701194 +> 9 3.732861 13 13 5114134.701194 +> 9 3.732861 7 7 5114134.701194 +> 9 3.732861 13 7 5114134.701194 +> 9 3.732861 7 10 5114134.701194 +> 9 3.732861 13 10 5114134.701194 +> 9 3.732861 7 14 5114134.701194 +> 9 3.732861 13 14 5114134.701194 +> 9 3.732861 7 12 5114134.701194 +> 9 3.732861 13 12 5114134.701194 +> 9 3.732861 7 6 5114134.701194 +> 9 3.732861 13 6 5114134.701194 +> 9 3.732861 7 8 5114134.701194 +> 9 3.732861 13 8 5114134.701194 +> 10 3.732863 7 13 5114134.701194 +> 10 3.732863 13 13 5114134.701194 +> 10 3.732863 7 7 5114134.701194 +> 10 3.732863 13 7 5114134.701194 +> 10 3.732863 7 10 5114134.701194 +> 10 3.732863 13 10 5114134.701194 +> 10 3.732863 7 14 5114134.701194 +> 10 3.732863 13 14 5114134.701194 +> 10 3.732863 7 12 5114134.701194 +> 10 3.732863 13 12 5114134.701194 +> 10 3.732863 7 6 5114134.701194 +> 10 3.732863 13 6 5114134.701194 +> 10 3.732863 7 8 5114134.701194 +> 10 3.732863 13 8 5114134.701194 +> 9 3.732863 3 5 48492000.000000 +> 9 3.732863 14 5 48492000.000000 +> 10 3.732863 3 5 48492000.000000 +> 10 3.732863 14 5 48492000.000000 +> 9 3.748063 3 2 76296000.000000 +> 9 3.748063 12 2 76296000.000000 +> 9 3.768299 3 1 98095000.000000 +> 9 3.768299 16 1 98095000.000000 +> 10 3.768299 3 1 98095000.000000 +> 10 3.768299 16 1 98095000.000000 +> 9 3.788635 3 5 48492000.000000 +> 9 3.788635 12 5 48492000.000000 +> 10 3.843593 3 3 76296000.000000 +> 10 3.843593 12 3 76296000.000000 +> 9 3.864144 7 13 5060664.718311 +> 9 3.864144 7 7 5060664.718311 +> 9 3.864144 7 10 5060664.718311 +> 9 3.864144 7 14 5060664.718311 +> 9 3.864144 7 12 5060664.718311 +> 9 3.864144 7 11 5060664.718311 +> 10 3.864342 7 13 5060664.718311 +> 10 3.864342 7 7 5060664.718311 +> 10 3.864342 7 10 5060664.718311 +> 10 3.864342 7 14 5060664.718311 +> 10 3.864342 7 12 5060664.718311 +> 10 3.864342 7 11 5060664.718311 +> 10 3.879131 3 2 76296000.000000 +> 10 3.879131 12 2 76296000.000000 +> 9 3.894331 7 9 6632970.000000 +> 10 3.894482 7 9 6632970.000000 +> 10 3.898038 3 4 48492000.000000 +> 10 3.898038 12 4 48492000.000000 +> 9 3.911270 7 13 7859911.230163 +> 9 3.911270 7 7 7859911.230163 +> 9 3.911270 7 15 7859911.230163 +> 10 3.911397 7 13 7859911.230163 +> 10 3.911397 7 7 7859911.230163 +> 10 3.911397 7 15 7859911.230163 +> 10 3.994854 3 5 48492000.000000 +> 10 3.994854 12 5 48492000.000000 +> 9 4.015190 7 13 5114134.701194 +> 9 4.015190 7 7 5114134.701194 +> 9 4.015190 7 10 5114134.701194 +> 9 4.015190 7 14 5114134.701194 +> 9 4.015190 7 12 5114134.701194 +> 9 4.015190 7 6 5114134.701194 +> 9 4.015190 7 8 5114134.701194 +> 10 4.015386 7 13 5114134.701194 +> 10 4.015386 7 7 5114134.701194 +> 10 4.015386 7 10 5114134.701194 +> 10 4.015386 7 14 5114134.701194 +> 10 4.015386 7 12 5114134.701194 +> 10 4.015386 7 6 5114134.701194 +> 10 4.015386 7 8 5114134.701194 +> 7 4.015386 1 3 +> 7 4.015386 1 1 +> 7 4.015386 4 14 +> 7 4.015386 4 12 +> 7 4.015386 4 10 +> 7 4.015386 4 7 +> 7 4.015386 4 13 +> 7 4.015386 4 15 +> 7 4.015386 4 6 +> 7 4.015386 4 8 +> 7 4.015386 4 11 +> 7 4.015386 4 9 +> 7 4.015386 1 5 +> 7 4.015386 1 2 +> 7 4.015386 1 4 +> 7 4.015386 0 0 $ rm -rf tracing/categories.trace tracing/categories.cat.plist tracing/categories.uncat.plist diff --git a/examples/msg/tracing/ms.c b/examples/msg/tracing/ms.c index d0355c9854..77e586b755 100644 --- a/examples/msg/tracing/ms.c +++ b/examples/msg/tracing/ms.c @@ -28,7 +28,7 @@ int master(int argc, char *argv[]) long slaves_count = atol(argv[4]); //setting the variable "is_master" (previously declared) to value 1 - TRACE_host_variable_set("is_master", 1); + TRACE_host_variable_set(MSG_host_self()->name, "is_master", 1); TRACE_mark("msmark", "start_send_tasks"); int i; @@ -37,7 +37,7 @@ int master(int argc, char *argv[]) task = MSG_task_create("task", task_comp_size, task_comm_size, NULL); //setting the variable "task_creation" to value i - TRACE_host_variable_set("task_creation", i); + TRACE_host_variable_set(MSG_host_self()->name, "task_creation", i); //setting the category of task to "compute" //the category of a task must be defined before it is sent or executed @@ -59,11 +59,10 @@ int master(int argc, char *argv[]) int slave(int argc, char *argv[]) { m_task_t task = NULL; - int res; - TRACE_host_variable_set("is_slave", 1); + TRACE_host_variable_set(MSG_host_self()->name, "is_slave", 1); while (1) { - res = MSG_task_receive(&(task), "master_mailbox"); + MSG_task_receive(&(task), "master_mailbox"); if (!strcmp(MSG_task_get_name(task), "finalize")) { MSG_task_destroy(task); @@ -71,7 +70,8 @@ int slave(int argc, char *argv[]) } //adding the value returned by MSG_task_get_compute_duration(task) //to the variable "task_computation" - TRACE_host_variable_add("task_computation", + TRACE_host_variable_add(MSG_host_self()->name, + "task_computation", MSG_task_get_compute_duration(task)); MSG_task_execute(task); MSG_task_destroy(task); diff --git a/examples/msg/tracing/ms.tesh b/examples/msg/tracing/ms.tesh index 401181a85f..bea097779a 100644 --- a/examples/msg/tracing/ms.tesh +++ b/examples/msg/tracing/ms.tesh @@ -2,8 +2,10 @@ p Tracing master/slave application -$ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/filename:tracing/ms.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/ms.cat.plist --cfg=triva/uncategorized:tracing/ms.uncat.plist --log=instr_paje.thres:debug --log=instr_paje_trace.thres:debug "--log=root.fmt:[%10.6r]%e\(%i:%P@%h\)%e%m%n" ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml +$ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/ms.trace --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1 --cfg=triva/categorized:tracing/ms.cat.plist --cfg=triva/uncategorized:tracing/ms.uncat.plist --log=instr_paje.thres:debug --log=instr_paje_trace.thres:debug "--log=root.fmt:[%10.6r]%e\(%i:%P@%h\)%e%m%n" ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml > [ 0.000000] (0:@) Configuration change: Set 'tracing' to '1' +> [ 0.000000] (0:@) Configuration change: Set 'tracing/buffer' to '1' +> [ 0.000000] (0:@) Configuration change: Set 'tracing/buffer' to '1' > [ 0.000000] (0:@) Configuration change: Set 'tracing/filename' to 'tracing/ms.trace' > [ 0.000000] (0:@) Configuration change: Set 'tracing/categorized' to '1' > [ 0.000000] (0:@) Configuration change: Set 'tracing/uncategorized' to '1' @@ -11,16 +13,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) Configuration change: Set 'triva/uncategorized' to 'tracing/ms.uncat.plist' > [ 0.000000] (0:@) Filename tracing/ms.trace is open for writing > [ 0.000000] (0:@) Define paje header -> [ 0.000000] (0:@) new container AS0, child of 0 -> [ 0.000000] (0:@) new type L1, child of 0 -> [ 0.000000] (0:@) new_pajeDefineContainerType: event_type=0 -> [ 0.000000] (0:@) print_pajeDefineContainerType: event_type=0 -> [ 0.000000] (0:@) free_paje_event: event_type=0, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) new container Tremblay, child of AS0 -> [ 0.000000] (0:@) new type HOST, child of L1 +> [ 0.000000] (0:@) new type HOST, child of 0 > [ 0.000000] (0:@) new_pajeDefineContainerType: event_type=0 > [ 0.000000] (0:@) print_pajeDefineContainerType: event_type=0 > [ 0.000000] (0:@) free_paje_event: event_type=0, timestamp=0.000000 @@ -28,7 +22,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) new type power, child of HOST -> [ 0.000000] (0:@) VariableType power(3), child of HOST(2) +> [ 0.000000] (0:@) VariableType power(2), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 @@ -36,7 +30,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=0) > [ 0.000000] (0:@) insert_into_buffer: inserted at beginning > [ 0.000000] (0:@) new type power_used, child of HOST -> [ 0.000000] (0:@) VariableType power_used(4), child of HOST(2) +> [ 0.000000] (0:@) VariableType power_used(3), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 @@ -68,36 +62,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=4) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 4 -> [ 0.000000] (0:@) new container R.4-3, child of AS0 -> [ 0.000000] (0:@) new type ROUTER, child of L1 -> [ 0.000000] (0:@) new_pajeDefineContainerType: event_type=0 -> [ 0.000000] (0:@) print_pajeDefineContainerType: event_type=0 -> [ 0.000000] (0:@) free_paje_event: event_type=0, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new container R.3-2-5, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new container R.2-0, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new container R.1-0, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new container R.1-8-6, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new container R.6-7, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) new container 6, child of AS0 -> [ 0.000000] (0:@) new type LINK, child of L1 +> [ 0.000000] (0:@) new type LINK, child of 0 > [ 0.000000] (0:@) new_pajeDefineContainerType: event_type=0 > [ 0.000000] (0:@) print_pajeDefineContainerType: event_type=0 > [ 0.000000] (0:@) free_paje_event: event_type=0, timestamp=0.000000 @@ -105,12 +71,12 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) new type bandwidth, child of LINK -> [ 0.000000] (0:@) VariableType bandwidth(7), child of LINK(6) +> [ 0.000000] (0:@) VariableType bandwidth(5), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 > [ 0.000000] (0:@) new type latency, child of LINK -> [ 0.000000] (0:@) VariableType latency(8), child of LINK(6) +> [ 0.000000] (0:@) VariableType latency(6), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 @@ -121,11 +87,11 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=6) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 6 > [ 0.000000] (0:@) new type bandwidth_used, child of LINK -> [ 0.000000] (0:@) VariableType bandwidth_used(9), child of LINK(6) +> [ 0.000000] (0:@) VariableType bandwidth_used(7), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new container 11, child of AS0 +> [ 0.000000] (0:@) new container 3, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -135,7 +101,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=8) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 8 -> [ 0.000000] (0:@) new container 3, child of AS0 +> [ 0.000000] (0:@) new container 7, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -145,7 +111,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=10) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 10 -> [ 0.000000] (0:@) new container 7, child of AS0 +> [ 0.000000] (0:@) new container 9, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -155,7 +121,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=12) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 12 -> [ 0.000000] (0:@) new container 9, child of AS0 +> [ 0.000000] (0:@) new container 2, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -165,7 +131,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=14) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 14 -> [ 0.000000] (0:@) new container 12, child of AS0 +> [ 0.000000] (0:@) new container 8, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -175,7 +141,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=16) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 16 -> [ 0.000000] (0:@) new container 2, child of AS0 +> [ 0.000000] (0:@) new container 1, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -185,7 +151,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=18) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 18 -> [ 0.000000] (0:@) new container 8, child of AS0 +> [ 0.000000] (0:@) new container 4, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -195,7 +161,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=20) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 20 -> [ 0.000000] (0:@) new container 1, child of AS0 +> [ 0.000000] (0:@) new container 0, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -205,7 +171,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=22) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 22 -> [ 0.000000] (0:@) new container 4, child of AS0 +> [ 0.000000] (0:@) new container 5, child of AS0 > [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 @@ -215,51 +181,40 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=24) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 24 -> [ 0.000000] (0:@) new container 0, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=25) +> [ 0.000000] (0:@) new type HOST-LINK, child of 0 +> [ 0.000000] (0:@) LinkType HOST-LINK(8), child of 0(0) HOST(1)->LINK(4) +> [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 +> [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 +> [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 +> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=25) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 25 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=26) +> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=26) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 26 -> [ 0.000000] (0:@) new container 10, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=27) +> [ 0.000000] (0:@) new type LINK-LINK, child of 0 +> [ 0.000000] (0:@) LinkType LINK-LINK(9), child of 0(0) LINK(4)->LINK(4) +> [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 +> [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 +> [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 +> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=27) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 27 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=28) +> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=28) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 28 -> [ 0.000000] (0:@) new container 5, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=29) +> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=29) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 29 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=30) +> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=30) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 30 -> [ 0.000000] (0:@) new container loopback, child of AS0 -> [ 0.000000] (0:@) new_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeCreateContainer: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=6, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=31) +> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=31) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 31 -> [ 0.000000] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=32) +> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 +> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=32) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 32 -> [ 0.000000] (0:@) new type HOST-LINK, child of L1 -> [ 0.000000] (0:@) LinkType HOST-LINK(10), child of L1(1) HOST(2)->LINK(6) -> [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 > [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=33) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 33 @@ -272,8 +227,8 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=36) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 36 -> [ 0.000000] (0:@) new type LINK-ROUTER, child of L1 -> [ 0.000000] (0:@) LinkType LINK-ROUTER(11), child of L1(1) LINK(6)->ROUTER(5) +> [ 0.000000] (0:@) new type LINK-HOST, child of 0 +> [ 0.000000] (0:@) LinkType LINK-HOST(10), child of 0(0) LINK(4)->HOST(1) > [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 > [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 > [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 @@ -283,11 +238,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=38) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 38 -> [ 0.000000] (0:@) new type LINK-LINK, child of L1 -> [ 0.000000] (0:@) LinkType LINK-LINK(12), child of L1(1) LINK(6)->LINK(6) -> [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 > [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=39) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 39 @@ -318,11 +268,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=48) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 48 -> [ 0.000000] (0:@) new type LINK-HOST, child of L1 -> [ 0.000000] (0:@) LinkType LINK-HOST(13), child of L1(1) LINK(6)->HOST(2) -> [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 > [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=49) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 49 @@ -353,149 +298,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 > [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=58) > [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 58 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=59) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=60) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 60 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=61) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=62) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 62 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=63) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=64) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 64 -> [ 0.000000] (0:@) new type ROUTER-LINK, child of L1 -> [ 0.000000] (0:@) LinkType ROUTER-LINK(14), child of L1(1) ROUTER(5)->LINK(6) -> [ 0.000000] (0:@) new_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) print_pajeDefineLinkType: event_type=4 -> [ 0.000000] (0:@) free_paje_event: event_type=4, timestamp=0.000000 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=65) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 65 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=66) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 66 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=67) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 67 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=68) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 68 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=69) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 69 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=70) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 70 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=71) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=72) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 72 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=73) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=74) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 74 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=75) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=76) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 76 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=77) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=78) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 78 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=79) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=80) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 80 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=81) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=82) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 82 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=83) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 83 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=84) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 84 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=85) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=86) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 86 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=87) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 87 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=88) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 88 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=89) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 89 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=90) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 90 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=91) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 91 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=92) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 92 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=93) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 93 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=94) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 94 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=95) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 95 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=96) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 96 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=97) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 97 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=98) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 98 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=99) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 99 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=100) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 100 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=101) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 101 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=102) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 102 -> [ 0.000000] (0:@) new_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=14, timestamp=0.000000, buffersize=103) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 103 -> [ 0.000000] (0:@) new_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) insert_into_buffer: insert event_type=15, timestamp=0.000000, buffersize=104) -> [ 0.000000] (0:@) insert_into_buffer: inserted at end, pos = 104 > [ 0.000000] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts > [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 @@ -547,98 +349,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=8, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 -> [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 -> [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeStartLink: event_type=14, timestamp=0.000000 > [ 0.000000] (0:@) free_paje_event: event_type=14, timestamp=0.000000 > [ 0.000000] (0:@) print_pajeEndLink: event_type=15, timestamp=0.000000 @@ -709,67 +419,67 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (0:@) free_paje_event: event_type=15, timestamp=0.000000 > [ 0.000000] (0:@) TRACE_paje_dump_buffer: ends > [ 0.000000] (0:@) new type is_slave, child of HOST -> [ 0.000000] (0:@) VariableType is_slave(15), child of HOST(2) +> [ 0.000000] (0:@) VariableType is_slave(11), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 > [ 0.000000] (0:@) new type is_master, child of HOST -> [ 0.000000] (0:@) VariableType is_master(16), child of HOST(2) +> [ 0.000000] (0:@) VariableType is_master(12), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 > [ 0.000000] (0:@) new type task_creation, child of HOST -> [ 0.000000] (0:@) VariableType task_creation(17), child of HOST(2) +> [ 0.000000] (0:@) VariableType task_creation(13), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 > [ 0.000000] (0:@) new type task_computation, child of HOST -> [ 0.000000] (0:@) VariableType task_computation(18), child of HOST(2) +> [ 0.000000] (0:@) VariableType task_computation(14), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 > [ 0.000000] (0:@) new type msmark, child of 0 -> [ 0.000000] (0:@) EventType msmark(19), child of 0(0) +> [ 0.000000] (0:@) EventType msmark(15), child of 0(0) > [ 0.000000] (0:@) new_pajeDefineEventType: event_type=3 > [ 0.000000] (0:@) print_pajeDefineEventType: event_type=3 > [ 0.000000] (0:@) free_paje_event: event_type=3, timestamp=0.000000 -> [ 0.000000] (0:@) new type compute, child of LINK -> [ 0.000000] (0:@) VariableType compute(20), child of LINK(6) +> [ 0.000000] (0:@) new type bcompute, child of LINK +> [ 0.000000] (0:@) VariableType bcompute(16), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type compute, child of HOST -> [ 0.000000] (0:@) VariableType compute(21), child of HOST(2) +> [ 0.000000] (0:@) new type pcompute, child of HOST +> [ 0.000000] (0:@) VariableType pcompute(17), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type finalize, child of LINK -> [ 0.000000] (0:@) VariableType finalize(22), child of LINK(6) +> [ 0.000000] (0:@) new type bfinalize, child of LINK +> [ 0.000000] (0:@) VariableType bfinalize(18), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type finalize, child of HOST -> [ 0.000000] (0:@) VariableType finalize(23), child of HOST(2) +> [ 0.000000] (0:@) new type pfinalize, child of HOST +> [ 0.000000] (0:@) VariableType pfinalize(19), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type request, child of LINK -> [ 0.000000] (0:@) VariableType request(24), child of LINK(6) +> [ 0.000000] (0:@) new type brequest, child of LINK +> [ 0.000000] (0:@) VariableType brequest(20), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type request, child of HOST -> [ 0.000000] (0:@) VariableType request(25), child of HOST(2) +> [ 0.000000] (0:@) new type prequest, child of HOST +> [ 0.000000] (0:@) VariableType prequest(21), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type report, child of LINK -> [ 0.000000] (0:@) VariableType report(26), child of LINK(6) +> [ 0.000000] (0:@) new type breport, child of LINK +> [ 0.000000] (0:@) VariableType breport(22), child of LINK(4) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 -> [ 0.000000] (0:@) new type report, child of HOST -> [ 0.000000] (0:@) VariableType report(27), child of HOST(2) +> [ 0.000000] (0:@) new type preport, child of HOST +> [ 0.000000] (0:@) VariableType preport(23), child of HOST(1) > [ 0.000000] (0:@) new_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) print_pajeDefineVariableType: event_type=1 > [ 0.000000] (0:@) free_paje_event: event_type=1, timestamp=0.000000 @@ -777,7 +487,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000000] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.000000, buffersize=0) > [ 0.000000] (1:master@Tremblay) insert_into_buffer: inserted at beginning > [ 0.000000] (1:master@Tremblay) new value start_send_tasks, child of msmark -> [ 0.000000] (1:master@Tremblay) EntityValue start_send_tasks(28), child of msmark(19) +> [ 0.000000] (1:master@Tremblay) EntityValue start_send_tasks(24), child of msmark(15) > [ 0.000000] (1:master@Tremblay) new_pajeDefineEntityValue: event_type=5 > [ 0.000000] (1:master@Tremblay) print_pajeDefineEntityValue: event_type=5 > [ 0.000000] (1:master@Tremblay) free_paje_event: event_type=5, timestamp=0.000000 @@ -820,2855 +530,2679 @@ $ $SG_TEST_EXENV ${bindir:=.}/tracing/ms$EXEEXT --cfg=tracing:1 --cfg=tracing/fi > [ 0.000156] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000000 > [ 0.000156] (0:@) free_paje_event: event_type=8, timestamp=0.000000 > [ 0.000156] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.002339] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000156 -> [ 0.002339] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000156, buffersize=0) -> [ 0.002339] (0:@) insert_into_buffer: inserted at beginning -> [ 0.002339] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.000156 -> [ 0.002339] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.000156, buffersize=1) -> [ 0.002339] (0:@) insert_into_buffer: inserted at end, pos = 1 -> [ 0.002339] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.002339 -> [ 0.002339] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.002339, buffersize=2) -> [ 0.002339] (0:@) insert_into_buffer: inserted at end -> [ 0.002339] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.000156 -> [ 0.002339] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.000156, buffersize=3) -> [ 0.002339] (0:@) insert_into_buffer: inserted at 2 -> [ 0.002339] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.000156 -> [ 0.002339] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.000156, buffersize=4) -> [ 0.002339] (0:@) insert_into_buffer: inserted at 3 -> [ 0.002339] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.002339 -> [ 0.002339] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.002339, buffersize=5) -> [ 0.002339] (0:@) insert_into_buffer: inserted at end, pos = 5 -> [ 0.002339] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.002339] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.002339] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=0.002339 -> [ 0.002339] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=0.002339, buffersize=6) -> [ 0.002339] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 6 -> [ 0.002339] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.002339 -> [ 0.002339] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.002339, buffersize=7) -> [ 0.002339] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 7 -> [ 0.017538] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.017538] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.168300] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.017538 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.017538, buffersize=8) -> [ 0.168300] (0:@) insert_into_buffer: inserted at end -> [ 0.168300] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.017538 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.017538, buffersize=9) -> [ 0.168300] (0:@) insert_into_buffer: inserted at end, pos = 9 -> [ 0.168300] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168300, buffersize=10) -> [ 0.168300] (0:@) insert_into_buffer: inserted at end -> [ 0.168300] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.017538 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.017538, buffersize=11) -> [ 0.168300] (0:@) insert_into_buffer: inserted at 10 -> [ 0.168300] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.017538 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.017538, buffersize=12) -> [ 0.168300] (0:@) insert_into_buffer: inserted at 11 -> [ 0.168300] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168300, buffersize=13) -> [ 0.168300] (0:@) insert_into_buffer: inserted at end, pos = 13 -> [ 0.168300] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.168300] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.168300] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.168300] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=0.168300, buffersize=14) -> [ 0.168300] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 14 -> [ 0.168300] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.168300 -> [ 0.168300] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.168300, buffersize=15) -> [ 0.168300] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 15 -> [ 0.168300] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.002339 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.002339, buffersize=16) -> [ 0.168300] (0:@) insert_into_buffer: inserted at 8 -> [ 0.168300] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.002339 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.002339, buffersize=17) -> [ 0.168300] (0:@) insert_into_buffer: inserted at 9 -> [ 0.168300] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168300, buffersize=18) -> [ 0.168300] (0:@) insert_into_buffer: inserted at end, pos = 18 -> [ 0.168300] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.002339 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.002339, buffersize=19) -> [ 0.168300] (0:@) insert_into_buffer: inserted at 10 -> [ 0.168300] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.002339 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.002339, buffersize=20) -> [ 0.168300] (0:@) insert_into_buffer: inserted at 11 -> [ 0.168300] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.168300] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168300, buffersize=21) -> [ 0.168300] (0:@) insert_into_buffer: inserted at end, pos = 21 -> [ 0.188851] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.188851] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=22) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=23) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 23 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=24) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=25) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 24 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=26) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 25 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=27) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 27 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=28) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 26 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=29) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 27 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=30) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 30 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=31) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 28 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=32) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 29 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=33) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 33 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=34) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 30 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=35) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 31 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=36) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 36 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=37) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 32 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=38) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 33 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=39) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 39 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=40) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 34 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=41) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 35 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=42) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 42 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=43) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 36 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=44) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 37 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=45) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 45 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=46) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 38 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=47) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 39 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=48) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 48 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=49) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 40 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=50) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 41 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=51) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 51 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=52) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 42 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=53) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 43 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=54) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 54 -> [ 0.386454] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188851, buffersize=55) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 44 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188851, buffersize=56) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 45 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=57) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 57 -> [ 0.386454] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.386454] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.386454] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 0.386454] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=0.386454, buffersize=58) -> [ 0.386454] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 58 -> [ 0.386454] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.386454 -> [ 0.386454] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.386454, buffersize=59) -> [ 0.386454] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 59 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168300, buffersize=60) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 22 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=61) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 0.386454] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168300, buffersize=62) -> [ 0.386454] (0:@) insert_into_buffer: inserted at 23 -> [ 0.386454] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.386454] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386454, buffersize=63) -> [ 0.386454] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 0.399685] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.399685] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386454, buffersize=64) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 64 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=65) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386454, buffersize=66) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 65 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=67) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 67 -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399685, buffersize=68) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 66 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=69) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 69 -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399685, buffersize=70) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 67 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=71) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399685, buffersize=72) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 68 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=73) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399685, buffersize=74) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 69 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=75) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 0.512049] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.399685, buffersize=76) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 70 -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399685, buffersize=77) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 71 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=78) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 78 -> [ 0.512049] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.399685, buffersize=79) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 72 -> [ 0.512049] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399685, buffersize=80) -> [ 0.512049] (0:@) insert_into_buffer: inserted at 73 -> [ 0.512049] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 0.512049] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.512049, buffersize=81) -> [ 0.512049] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 0.512049] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.512049] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.526913] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.512049, buffersize=82) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end, pos = 82 -> [ 0.526913] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526913, buffersize=83) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end -> [ 0.526913] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.512049, buffersize=84) -> [ 0.526913] (0:@) insert_into_buffer: inserted at 83 -> [ 0.526913] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526913, buffersize=85) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 0.526913] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.512049, buffersize=86) -> [ 0.526913] (0:@) insert_into_buffer: inserted at 84 -> [ 0.526913] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526913, buffersize=87) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end, pos = 87 -> [ 0.526913] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.512049, buffersize=88) -> [ 0.526913] (0:@) insert_into_buffer: inserted at 85 -> [ 0.526913] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526913, buffersize=89) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end, pos = 89 -> [ 0.526913] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.512049, buffersize=90) -> [ 0.526913] (0:@) insert_into_buffer: inserted at 86 -> [ 0.526913] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526913, buffersize=91) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end, pos = 91 -> [ 0.526913] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.512049, buffersize=92) -> [ 0.526913] (0:@) insert_into_buffer: inserted at 87 -> [ 0.526913] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 0.526913] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526913, buffersize=93) -> [ 0.526913] (0:@) insert_into_buffer: inserted at end, pos = 93 -> [ 0.526913] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.526913] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.526913] (5:slave@Ginette) new_pajeAddVariable: event_type=9, timestamp=0.526913 -> [ 0.526913] (5:slave@Ginette) insert_into_buffer: insert event_type=9, timestamp=0.526913, buffersize=94) -> [ 0.526913] (5:slave@Ginette) insert_into_buffer: inserted at end, pos = 94 -> [ 0.526913] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.526913 -> [ 0.526913] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.526913, buffersize=95) -> [ 0.526913] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 95 -> [ 0.547249] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.547249] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=96) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=97) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=98) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 97 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=99) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 99 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=100) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 98 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=101) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 101 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=102) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 99 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=103) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 103 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=104) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 100 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=105) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 105 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=106) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 101 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=107) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 107 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=108) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 102 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=109) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 109 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=110) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 103 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=111) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 111 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=112) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 104 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=113) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 113 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=114) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 105 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=115) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 115 -> [ 0.742786] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547249, buffersize=116) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 106 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=117) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 107 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=118) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 118 -> [ 0.742786] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547249, buffersize=119) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 108 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=120) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 109 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=121) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 121 -> [ 0.742786] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547249, buffersize=122) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 110 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=123) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 111 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=124) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 124 -> [ 0.742786] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547249, buffersize=125) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 112 -> [ 0.742786] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547249, buffersize=126) -> [ 0.742786] (0:@) insert_into_buffer: inserted at 113 -> [ 0.742786] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 0.742786] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742786, buffersize=127) -> [ 0.742786] (0:@) insert_into_buffer: inserted at end, pos = 127 -> [ 0.742786] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts -> [ 0.742786] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.742786] (6:slave@Bourassa) new_pajeAddVariable: event_type=9, timestamp=0.742786 -> [ 0.742786] (6:slave@Bourassa) insert_into_buffer: insert event_type=9, timestamp=0.742786, buffersize=128) -> [ 0.742786] (6:slave@Bourassa) insert_into_buffer: inserted at end, pos = 128 -> [ 0.742786] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.742786 -> [ 0.742786] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.742786, buffersize=129) -> [ 0.742786] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 129 -> [ 0.742942] (0:@) TRACE_paje_dump_buffer: dump until 0.168300. starts -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000156 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.000156 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.000156 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.000156 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.000156 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.000156 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.000156 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.000156 -> [ 0.742942] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=10, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=10, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.002339 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.002339 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.017538 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.017538 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.017538 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.017538 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.017538 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.017538 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.017538 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.017538 -> [ 0.742942] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=8, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=10, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.168300 -> [ 0.742942] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.742942] (0:@) free_paje_event: event_type=9, timestamp=0.168300 -> [ 0.742942] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.745124] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.742942 -> [ 0.745124] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.742942, buffersize=106) -> [ 0.745124] (0:@) insert_into_buffer: inserted at end -> [ 0.745124] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.745124 -> [ 0.745124] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.745124, buffersize=107) -> [ 0.745124] (0:@) insert_into_buffer: inserted at end -> [ 0.745124] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.742942 -> [ 0.745124] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.742942, buffersize=108) -> [ 0.745124] (0:@) insert_into_buffer: inserted at 107 -> [ 0.745124] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.745124 -> [ 0.745124] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.745124, buffersize=109) -> [ 0.745124] (0:@) insert_into_buffer: inserted at end, pos = 109 -> [ 0.745124] (0:@) TRACE_paje_dump_buffer: dump until 0.168300. starts -> [ 0.745124] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.745124] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=0.745124 -> [ 0.745124] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=0.745124, buffersize=110) -> [ 0.745124] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 110 -> [ 0.745124] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.745124 -> [ 0.745124] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.745124, buffersize=111) -> [ 0.745124] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 111 -> [ 0.823643] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.168300 -> [ 0.823643] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.168300, buffersize=112) -> [ 0.823643] (0:@) insert_into_buffer: inserted at 0 -> [ 0.823643] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.823643] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168300, buffersize=113) -> [ 0.823643] (0:@) insert_into_buffer: inserted at 1 -> [ 0.823643] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.823643 -> [ 0.823643] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.823643, buffersize=114) -> [ 0.823643] (0:@) insert_into_buffer: inserted at end -> [ 0.823643] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.168300 -> [ 0.823643] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.168300, buffersize=115) -> [ 0.823643] (0:@) insert_into_buffer: inserted at 2 -> [ 0.823643] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.823643] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168300, buffersize=116) -> [ 0.823643] (0:@) insert_into_buffer: inserted at 3 -> [ 0.823643] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.823643 -> [ 0.823643] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.823643, buffersize=117) -> [ 0.823643] (0:@) insert_into_buffer: inserted at end, pos = 117 -> [ 0.823643] (0:@) TRACE_paje_dump_buffer: dump until 0.386454. starts -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.168300 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.168300 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.168300 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.168300 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.168300 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168300 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.168300 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.188851 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=8, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=10, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.386454 -> [ 0.823643] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 0.823643] (0:@) free_paje_event: event_type=9, timestamp=0.386454 -> [ 0.823643] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.838843] (0:@) TRACE_paje_dump_buffer: dump until 0.386454. starts -> [ 0.838843] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.989605] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.838843 -> [ 0.989605] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.838843, buffersize=72) -> [ 0.989605] (0:@) insert_into_buffer: inserted at end -> [ 0.989605] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.989605 -> [ 0.989605] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.989605, buffersize=73) -> [ 0.989605] (0:@) insert_into_buffer: inserted at end -> [ 0.989605] (0:@) TRACE_paje_dump_buffer: dump until 0.386454. starts -> [ 0.989605] (0:@) TRACE_paje_dump_buffer: ends -> [ 0.989605] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.989605 -> [ 0.989605] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.989605, buffersize=74) -> [ 0.989605] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 74 -> [ 0.989605] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 0.989605] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=0.989605, buffersize=75) -> [ 0.989605] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 75 -> [ 0.989605] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.745124 -> [ 0.989605] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.745124, buffersize=76) -> [ 0.989605] (0:@) insert_into_buffer: inserted at 70 -> [ 0.989605] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.989605 -> [ 0.989605] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.989605, buffersize=77) -> [ 0.989605] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 0.989605] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.745124 -> [ 0.989605] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.745124, buffersize=78) -> [ 0.989605] (0:@) insert_into_buffer: inserted at 71 -> [ 0.989605] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.989605 -> [ 0.989605] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.989605, buffersize=79) -> [ 0.989605] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 1.041796] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.386454 -> [ 1.041796] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.386454, buffersize=80) -> [ 1.041796] (0:@) insert_into_buffer: inserted at 0 -> [ 1.041796] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 1.041796] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386454, buffersize=81) -> [ 1.041796] (0:@) insert_into_buffer: inserted at 1 -> [ 1.041796] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.041796 -> [ 1.041796] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.041796, buffersize=82) -> [ 1.041796] (0:@) insert_into_buffer: inserted at end -> [ 1.041796] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.386454 -> [ 1.041796] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.386454, buffersize=83) -> [ 1.041796] (0:@) insert_into_buffer: inserted at 2 -> [ 1.041796] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 1.041796] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386454, buffersize=84) -> [ 1.041796] (0:@) insert_into_buffer: inserted at 3 -> [ 1.041796] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.041796 -> [ 1.041796] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.041796, buffersize=85) -> [ 1.041796] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 1.041796] (0:@) TRACE_paje_dump_buffer: dump until 0.526913. starts -> [ 1.041796] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.386454 -> [ 1.041796] (0:@) free_paje_event: event_type=8, timestamp=0.386454 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.386454 -> [ 1.041796] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.386454 -> [ 1.041796] (0:@) free_paje_event: event_type=8, timestamp=0.386454 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386454 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.386454 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=8, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=8, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.399685 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.512049 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=10, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=9, timestamp=0.526913 -> [ 1.041796] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.526913 -> [ 1.041796] (0:@) free_paje_event: event_type=8, timestamp=0.526913 -> [ 1.041796] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.062347] (0:@) TRACE_paje_dump_buffer: dump until 0.526913. starts -> [ 1.062347] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989605, buffersize=52) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 50 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=53) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989605, buffersize=54) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 51 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=55) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 55 -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062347, buffersize=56) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 54 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=57) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 57 -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062347, buffersize=58) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 55 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=59) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062347, buffersize=60) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 56 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=61) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062347, buffersize=62) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 57 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=63) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062347, buffersize=64) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 58 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=65) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 65 -> [ 1.254834] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062347, buffersize=66) -> [ 1.254834] (0:@) insert_into_buffer: inserted at 59 -> [ 1.254834] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.254834] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254834, buffersize=67) -> [ 1.254834] (0:@) insert_into_buffer: inserted at end, pos = 67 -> [ 1.254834] (0:@) TRACE_paje_dump_buffer: dump until 0.526913. starts -> [ 1.254834] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.259949] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254834, buffersize=68) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end, pos = 68 -> [ 1.259949] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259949, buffersize=69) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end -> [ 1.259949] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254834, buffersize=70) -> [ 1.259949] (0:@) insert_into_buffer: inserted at 69 -> [ 1.259949] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259949, buffersize=71) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 1.259949] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254834, buffersize=72) -> [ 1.259949] (0:@) insert_into_buffer: inserted at 70 -> [ 1.259949] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259949, buffersize=73) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 1.259949] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254834, buffersize=74) -> [ 1.259949] (0:@) insert_into_buffer: inserted at 71 -> [ 1.259949] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259949, buffersize=75) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 1.259949] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254834, buffersize=76) -> [ 1.259949] (0:@) insert_into_buffer: inserted at 72 -> [ 1.259949] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259949, buffersize=77) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 1.259949] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254834, buffersize=78) -> [ 1.259949] (0:@) insert_into_buffer: inserted at 73 -> [ 1.259949] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.259949] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259949, buffersize=79) -> [ 1.259949] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 1.259949] (0:@) TRACE_paje_dump_buffer: dump until 0.526913. starts -> [ 1.259949] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.259949] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.259949 -> [ 1.259949] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.259949, buffersize=80) -> [ 1.259949] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 80 -> [ 1.259949] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=1.259949 -> [ 1.259949] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=1.259949, buffersize=81) -> [ 1.259949] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 81 -> [ 1.260105] (0:@) TRACE_paje_dump_buffer: dump until 0.526913. starts -> [ 1.260105] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.262288] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.260105 -> [ 1.262288] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.260105, buffersize=82) -> [ 1.262288] (0:@) insert_into_buffer: inserted at end -> [ 1.262288] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.262288 -> [ 1.262288] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.262288, buffersize=83) -> [ 1.262288] (0:@) insert_into_buffer: inserted at end -> [ 1.262288] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.260105 -> [ 1.262288] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.260105, buffersize=84) -> [ 1.262288] (0:@) insert_into_buffer: inserted at 83 -> [ 1.262288] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.262288 -> [ 1.262288] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.262288, buffersize=85) -> [ 1.262288] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 1.262288] (0:@) TRACE_paje_dump_buffer: dump until 0.526913. starts -> [ 1.262288] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.262288] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=1.262288 -> [ 1.262288] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=1.262288, buffersize=86) -> [ 1.262288] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 86 -> [ 1.262288] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.262288 -> [ 1.262288] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.262288, buffersize=87) -> [ 1.262288] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 87 -> [ 1.558011] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.526913 -> [ 1.558011] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.526913, buffersize=88) -> [ 1.558011] (0:@) insert_into_buffer: inserted at 0 -> [ 1.558011] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.526913 -> [ 1.558011] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.526913, buffersize=89) -> [ 1.558011] (0:@) insert_into_buffer: inserted at 1 -> [ 1.558011] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.558011 -> [ 1.558011] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.558011, buffersize=90) -> [ 1.558011] (0:@) insert_into_buffer: inserted at end -> [ 1.558011] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.526913 -> [ 1.558011] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.526913, buffersize=91) -> [ 1.558011] (0:@) insert_into_buffer: inserted at 2 -> [ 1.558011] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.526913 -> [ 1.558011] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.526913, buffersize=92) -> [ 1.558011] (0:@) insert_into_buffer: inserted at 3 -> [ 1.558011] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.558011 -> [ 1.558011] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.558011, buffersize=93) -> [ 1.558011] (0:@) insert_into_buffer: inserted at end, pos = 93 -> [ 1.558011] (0:@) TRACE_paje_dump_buffer: dump until 0.742786. starts -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.526913 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.526913 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.526913 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.526913 -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.526913 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.526913 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.526913 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.526913 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.547249 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=10, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=9, timestamp=0.742786 -> [ 1.558011] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.742786 -> [ 1.558011] (0:@) free_paje_event: event_type=8, timestamp=0.742786 -> [ 1.558011] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.571243] (0:@) TRACE_paje_dump_buffer: dump until 0.742786. starts -> [ 1.571243] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.644947] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989605, buffersize=56) -> [ 1.644947] (0:@) insert_into_buffer: inserted at 18 -> [ 1.644947] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644947, buffersize=57) -> [ 1.644947] (0:@) insert_into_buffer: inserted at end -> [ 1.644947] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989605, buffersize=58) -> [ 1.644947] (0:@) insert_into_buffer: inserted at 19 -> [ 1.644947] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644947, buffersize=59) -> [ 1.644947] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 1.644947] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.571243 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.571243, buffersize=60) -> [ 1.644947] (0:@) insert_into_buffer: inserted at 58 -> [ 1.644947] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644947, buffersize=61) -> [ 1.644947] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 1.644947] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.571243 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.571243, buffersize=62) -> [ 1.644947] (0:@) insert_into_buffer: inserted at 59 -> [ 1.644947] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644947, buffersize=63) -> [ 1.644947] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 1.644947] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.571243 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.571243, buffersize=64) -> [ 1.644947] (0:@) insert_into_buffer: inserted at 60 -> [ 1.644947] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.644947] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644947, buffersize=65) -> [ 1.644947] (0:@) insert_into_buffer: inserted at end, pos = 65 -> [ 1.644947] (0:@) TRACE_paje_dump_buffer: dump until 0.742786. starts -> [ 1.644947] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.698471] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.644947 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.644947, buffersize=66) -> [ 1.698471] (0:@) insert_into_buffer: inserted at end, pos = 66 -> [ 1.698471] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698471, buffersize=67) -> [ 1.698471] (0:@) insert_into_buffer: inserted at end -> [ 1.698471] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.644947 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.644947, buffersize=68) -> [ 1.698471] (0:@) insert_into_buffer: inserted at 67 -> [ 1.698471] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698471, buffersize=69) -> [ 1.698471] (0:@) insert_into_buffer: inserted at end, pos = 69 -> [ 1.698471] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.644947 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.644947, buffersize=70) -> [ 1.698471] (0:@) insert_into_buffer: inserted at 68 -> [ 1.698471] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698471, buffersize=71) -> [ 1.698471] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 1.698471] (0:@) TRACE_paje_dump_buffer: dump until 0.742786. starts -> [ 1.698471] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.698471] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.698471 -> [ 1.698471] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.698471, buffersize=72) -> [ 1.698471] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 72 -> [ 1.698471] (5:slave@Ginette) new_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 1.698471] (5:slave@Ginette) insert_into_buffer: insert event_type=9, timestamp=1.698471, buffersize=73) -> [ 1.698471] (5:slave@Ginette) insert_into_buffer: inserted at end, pos = 73 -> [ 1.698471] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.262288 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.262288, buffersize=74) -> [ 1.698471] (0:@) insert_into_buffer: inserted at 56 -> [ 1.698471] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698471, buffersize=75) -> [ 1.698471] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 1.698471] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.262288 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.262288, buffersize=76) -> [ 1.698471] (0:@) insert_into_buffer: inserted at 57 -> [ 1.698471] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.698471] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698471, buffersize=77) -> [ 1.698471] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 1.713671] (0:@) TRACE_paje_dump_buffer: dump until 0.742786. starts -> [ 1.713671] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.771998] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698471, buffersize=78) -> [ 1.771998] (0:@) insert_into_buffer: inserted at end, pos = 78 -> [ 1.771998] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771998, buffersize=79) -> [ 1.771998] (0:@) insert_into_buffer: inserted at end -> [ 1.771998] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698471, buffersize=80) -> [ 1.771998] (0:@) insert_into_buffer: inserted at 79 -> [ 1.771998] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771998, buffersize=81) -> [ 1.771998] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 1.771998] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.713671 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.713671, buffersize=82) -> [ 1.771998] (0:@) insert_into_buffer: inserted at 80 -> [ 1.771998] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771998, buffersize=83) -> [ 1.771998] (0:@) insert_into_buffer: inserted at end, pos = 83 -> [ 1.771998] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.713671 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.713671, buffersize=84) -> [ 1.771998] (0:@) insert_into_buffer: inserted at 81 -> [ 1.771998] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 1.771998] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771998, buffersize=85) -> [ 1.771998] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 1.771998] (0:@) TRACE_paje_dump_buffer: dump until 0.742786. starts -> [ 1.771998] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.773883] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.742786 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.742786, buffersize=86) -> [ 1.773883] (0:@) insert_into_buffer: inserted at 0 -> [ 1.773883] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.742786 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.742786, buffersize=87) -> [ 1.773883] (0:@) insert_into_buffer: inserted at 1 -> [ 1.773883] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773883, buffersize=88) -> [ 1.773883] (0:@) insert_into_buffer: inserted at end -> [ 1.773883] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.742786 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.742786, buffersize=89) -> [ 1.773883] (0:@) insert_into_buffer: inserted at 2 -> [ 1.773883] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.742786 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.742786, buffersize=90) -> [ 1.773883] (0:@) insert_into_buffer: inserted at 3 -> [ 1.773883] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773883, buffersize=91) -> [ 1.773883] (0:@) insert_into_buffer: inserted at end, pos = 91 -> [ 1.773883] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.771998 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.771998, buffersize=92) -> [ 1.773883] (0:@) insert_into_buffer: inserted at 90 -> [ 1.773883] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773883, buffersize=93) -> [ 1.773883] (0:@) insert_into_buffer: inserted at end, pos = 93 -> [ 1.773883] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.771998 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.771998, buffersize=94) -> [ 1.773883] (0:@) insert_into_buffer: inserted at 91 -> [ 1.773883] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 1.773883] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773883, buffersize=95) -> [ 1.773883] (0:@) insert_into_buffer: inserted at end, pos = 95 -> [ 1.773883] (0:@) TRACE_paje_dump_buffer: dump until 1.259949. starts -> [ 1.773883] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.742786 -> [ 1.773883] (0:@) free_paje_event: event_type=8, timestamp=0.742786 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742786 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.742786 -> [ 1.773883] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.742786 -> [ 1.773883] (0:@) free_paje_event: event_type=8, timestamp=0.742786 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742786 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.742786 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742942 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.742942 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742942 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.742942 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.745124 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.745124 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.745124 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.745124 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.745124 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.745124 -> [ 1.773883] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.745124 -> [ 1.773883] (0:@) free_paje_event: event_type=8, timestamp=0.745124 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.745124 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.745124 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.745124 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.745124 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.823643 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.823643 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.823643 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.823643 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.838843 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.838843 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=8, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=0.989605 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.041796 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.041796 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.041796 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.041796 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.062347 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.254834 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=10, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=8, timestamp=1.259949 -> [ 1.773883] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.259949 -> [ 1.773883] (0:@) free_paje_event: event_type=9, timestamp=1.259949 -> [ 1.773883] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.864433] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.773883 -> [ 1.864433] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.773883, buffersize=42) -> [ 1.864433] (0:@) insert_into_buffer: inserted at end, pos = 42 -> [ 1.864433] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.864433 -> [ 1.864433] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.864433, buffersize=43) -> [ 1.864433] (0:@) insert_into_buffer: inserted at end -> [ 1.864433] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.773883 -> [ 1.864433] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.773883, buffersize=44) -> [ 1.864433] (0:@) insert_into_buffer: inserted at 43 -> [ 1.864433] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.864433 -> [ 1.864433] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.864433, buffersize=45) -> [ 1.864433] (0:@) insert_into_buffer: inserted at end, pos = 45 -> [ 1.864433] (0:@) TRACE_paje_dump_buffer: dump until 1.259949. starts -> [ 1.864433] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.864433] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=1.864433 -> [ 1.864433] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=1.864433, buffersize=46) -> [ 1.864433] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 46 -> [ 1.864433] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.864433 -> [ 1.864433] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.864433, buffersize=47) -> [ 1.864433] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 47 -> [ 1.864589] (0:@) TRACE_paje_dump_buffer: dump until 1.259949. starts -> [ 1.864589] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.866771] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.864589 -> [ 1.866771] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.864589, buffersize=48) -> [ 1.866771] (0:@) insert_into_buffer: inserted at end -> [ 1.866771] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.866771 -> [ 1.866771] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.866771, buffersize=49) -> [ 1.866771] (0:@) insert_into_buffer: inserted at end -> [ 1.866771] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.864589 -> [ 1.866771] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.864589, buffersize=50) -> [ 1.866771] (0:@) insert_into_buffer: inserted at 49 -> [ 1.866771] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.866771 -> [ 1.866771] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.866771, buffersize=51) -> [ 1.866771] (0:@) insert_into_buffer: inserted at end, pos = 51 -> [ 1.866771] (0:@) TRACE_paje_dump_buffer: dump until 1.259949. starts -> [ 1.866771] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.866771] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=1.866771 -> [ 1.866771] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=1.866771, buffersize=52) -> [ 1.866771] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 52 -> [ 1.866771] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.866771 -> [ 1.866771] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.866771, buffersize=53) -> [ 1.866771] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 53 -> [ 1.887107] (0:@) TRACE_paje_dump_buffer: dump until 1.259949. starts -> [ 1.887107] (0:@) TRACE_paje_dump_buffer: ends -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.259949 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.259949, buffersize=54) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 0 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=55) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.259949 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.259949, buffersize=56) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 1 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=57) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 57 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=58) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 56 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=59) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=60) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 57 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=61) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=62) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 58 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=63) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=64) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 59 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=65) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 65 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=66) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 60 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=67) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 67 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=68) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 61 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=69) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 69 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=70) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 62 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=71) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=72) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 63 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=73) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=74) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 64 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=75) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=76) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 65 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=77) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=78) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 66 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=79) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=80) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 67 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=81) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=82) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 68 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=83) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 83 -> [ 1.915291] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.887107, buffersize=84) -> [ 1.915291] (0:@) insert_into_buffer: inserted at 69 -> [ 1.915291] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 1.915291] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915291, buffersize=85) -> [ 1.915291] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 1.915291] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.259949 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.259949 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.259949 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.259949 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.260105 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.260105 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.260105 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.260105 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.262288 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.262288 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.262288 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.262288 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.262288 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.262288 -> [ 1.915291] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.262288 -> [ 1.915291] (0:@) free_paje_event: event_type=8, timestamp=1.262288 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.262288 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.262288 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.262288 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.262288 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.558011 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.558011 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.558011 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.558011 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.571243 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.571243 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.571243 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.571243 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.571243 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.571243 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.644947 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.644947 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=8, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=10, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.698471 -> [ 1.915291] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 1.915291] (0:@) free_paje_event: event_type=9, timestamp=1.698471 -> [ 1.915291] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=54) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 54 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=55) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=56) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 55 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=57) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 57 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=58) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 56 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=59) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=60) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 57 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=61) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=62) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 58 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=63) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=64) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 59 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=65) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 65 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=66) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 60 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=67) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 67 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=68) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 61 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=69) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 69 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=70) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 62 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=71) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=72) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 63 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=73) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=74) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 64 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=75) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=76) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 65 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=77) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=78) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 66 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=79) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915291, buffersize=80) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 67 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=81) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 2.082643] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.082643] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.082643] (6:slave@Bourassa) new_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 2.082643] (6:slave@Bourassa) insert_into_buffer: insert event_type=9, timestamp=2.082643, buffersize=82) -> [ 2.082643] (6:slave@Bourassa) insert_into_buffer: inserted at end, pos = 82 -> [ 2.082643] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.082643 -> [ 2.082643] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.082643, buffersize=83) -> [ 2.082643] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 83 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.866771 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.866771, buffersize=84) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 24 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=85) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 2.082643] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.866771 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.866771, buffersize=86) -> [ 2.082643] (0:@) insert_into_buffer: inserted at 25 -> [ 2.082643] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.082643] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082643, buffersize=87) -> [ 2.082643] (0:@) insert_into_buffer: inserted at end, pos = 87 -> [ 2.103194] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.103194] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=88) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=89) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=90) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 89 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=91) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 91 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=92) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 90 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=93) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 93 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=94) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 91 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=95) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 95 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=96) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 92 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=97) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 97 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=98) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 93 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=99) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 99 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=100) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 94 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=101) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 101 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=102) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 95 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=103) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 103 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=104) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 96 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=105) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 105 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=106) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 97 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=107) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 107 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=108) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 98 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=109) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 109 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.103194, buffersize=110) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 99 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=111) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 111 -> [ 2.300797] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.300797] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.300797] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 2.300797] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=2.300797, buffersize=112) -> [ 2.300797] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 112 -> [ 2.300797] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.300797 -> [ 2.300797] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.300797, buffersize=113) -> [ 2.300797] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 113 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082643, buffersize=114) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 88 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=115) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 115 -> [ 2.300797] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082643, buffersize=116) -> [ 2.300797] (0:@) insert_into_buffer: inserted at 89 -> [ 2.300797] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 2.300797] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300797, buffersize=117) -> [ 2.300797] (0:@) insert_into_buffer: inserted at end, pos = 117 -> [ 2.376481] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 2.376481] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300797, buffersize=118) -> [ 2.376481] (0:@) insert_into_buffer: inserted at end, pos = 118 -> [ 2.376481] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.376481 -> [ 2.376481] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.376481, buffersize=119) -> [ 2.376481] (0:@) insert_into_buffer: inserted at end -> [ 2.376481] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 2.376481] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300797, buffersize=120) -> [ 2.376481] (0:@) insert_into_buffer: inserted at 119 -> [ 2.376481] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.376481 -> [ 2.376481] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.376481, buffersize=121) -> [ 2.376481] (0:@) insert_into_buffer: inserted at end, pos = 121 -> [ 2.376481] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.376481] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.376637] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.376637] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.378820] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.376637 -> [ 2.378820] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.376637, buffersize=122) -> [ 2.378820] (0:@) insert_into_buffer: inserted at end -> [ 2.378820] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.378820 -> [ 2.378820] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.378820, buffersize=123) -> [ 2.378820] (0:@) insert_into_buffer: inserted at end -> [ 2.378820] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.378820] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.378820] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.378820 -> [ 2.378820] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.378820, buffersize=124) -> [ 2.378820] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 124 -> [ 2.378820] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=2.378820 -> [ 2.378820] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=2.378820, buffersize=125) -> [ 2.378820] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 125 -> [ 2.519775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.864433 -> [ 2.519775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.864433, buffersize=126) -> [ 2.519775] (0:@) insert_into_buffer: inserted at 18 -> [ 2.519775] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.519775 -> [ 2.519775] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.519775, buffersize=127) -> [ 2.519775] (0:@) insert_into_buffer: inserted at end -> [ 2.519775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.864433 -> [ 2.519775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.864433, buffersize=128) -> [ 2.519775] (0:@) insert_into_buffer: inserted at 19 -> [ 2.519775] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.519775 -> [ 2.519775] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.519775, buffersize=129) -> [ 2.519775] (0:@) insert_into_buffer: inserted at end, pos = 129 -> [ 2.519775] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.519775] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.534975] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.534975] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.685737] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.534975 -> [ 2.685737] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.534975, buffersize=130) -> [ 2.685737] (0:@) insert_into_buffer: inserted at end -> [ 2.685737] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.685737 -> [ 2.685737] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.685737, buffersize=131) -> [ 2.685737] (0:@) insert_into_buffer: inserted at end -> [ 2.685737] (0:@) TRACE_paje_dump_buffer: dump until 1.698471. starts -> [ 2.685737] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.685737] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.685737 -> [ 2.685737] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.685737, buffersize=132) -> [ 2.685737] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 132 -> [ 2.685737] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 2.685737] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=2.685737, buffersize=133) -> [ 2.685737] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 133 -> [ 2.685737] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.378820 -> [ 2.685737] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.378820, buffersize=134) -> [ 2.685737] (0:@) insert_into_buffer: inserted at 128 -> [ 2.685737] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.685737 -> [ 2.685737] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.685737, buffersize=135) -> [ 2.685737] (0:@) insert_into_buffer: inserted at end, pos = 135 -> [ 2.685737] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.378820 -> [ 2.685737] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.378820, buffersize=136) -> [ 2.685737] (0:@) insert_into_buffer: inserted at 129 -> [ 2.685737] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.685737 -> [ 2.685737] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.685737, buffersize=137) -> [ 2.685737] (0:@) insert_into_buffer: inserted at end, pos = 137 -> [ 2.729569] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 2.729569] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698471, buffersize=138) -> [ 2.729569] (0:@) insert_into_buffer: inserted at 0 -> [ 2.729569] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.729569 -> [ 2.729569] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.729569, buffersize=139) -> [ 2.729569] (0:@) insert_into_buffer: inserted at end -> [ 2.729569] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 2.729569] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698471, buffersize=140) -> [ 2.729569] (0:@) insert_into_buffer: inserted at 1 -> [ 2.729569] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.729569 -> [ 2.729569] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.729569, buffersize=141) -> [ 2.729569] (0:@) insert_into_buffer: inserted at end, pos = 141 -> [ 2.729569] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.698471 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698471 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.698471 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.713671 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.713671 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.713671 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.713671 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.771998 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.771998 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.771998 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.771998 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.771998 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.773883 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.773883 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.773883 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.773883 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.773883 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.864433 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.864433 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.864433 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.864433 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864433 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.864433 -> [ 2.729569] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.864433 -> [ 2.729569] (0:@) free_paje_event: event_type=8, timestamp=1.864433 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864433 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.864433 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864433 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.864433 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864589 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.864589 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864589 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.864589 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.866771 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.866771 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.866771 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.866771 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.866771 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.866771 -> [ 2.729569] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.866771 -> [ 2.729569] (0:@) free_paje_event: event_type=8, timestamp=1.866771 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.866771 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.866771 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.866771 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.866771 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.887107 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=1.915291 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=8, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=10, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=2.082643 -> [ 2.729569] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 2.729569] (0:@) free_paje_event: event_type=9, timestamp=2.082643 -> [ 2.729569] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.742800] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.742800] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.870028] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.742800 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.742800, buffersize=48) -> [ 2.870028] (0:@) insert_into_buffer: inserted at end -> [ 2.870028] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.870028, buffersize=49) -> [ 2.870028] (0:@) insert_into_buffer: inserted at end -> [ 2.870028] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.742800 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.742800, buffersize=50) -> [ 2.870028] (0:@) insert_into_buffer: inserted at 49 -> [ 2.870028] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.870028, buffersize=51) -> [ 2.870028] (0:@) insert_into_buffer: inserted at end, pos = 51 -> [ 2.870028] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.742800 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.742800, buffersize=52) -> [ 2.870028] (0:@) insert_into_buffer: inserted at 50 -> [ 2.870028] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.870028, buffersize=53) -> [ 2.870028] (0:@) insert_into_buffer: inserted at end, pos = 53 -> [ 2.870028] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.870028] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.870028] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.870028 -> [ 2.870028] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.870028, buffersize=54) -> [ 2.870028] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 54 -> [ 2.870028] (5:slave@Ginette) new_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 2.870028] (5:slave@Ginette) insert_into_buffer: insert event_type=9, timestamp=2.870028, buffersize=55) -> [ 2.870028] (5:slave@Ginette) insert_into_buffer: inserted at end, pos = 55 -> [ 2.870028] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685737, buffersize=56) -> [ 2.870028] (0:@) insert_into_buffer: inserted at 46 -> [ 2.870028] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.870028, buffersize=57) -> [ 2.870028] (0:@) insert_into_buffer: inserted at end, pos = 57 -> [ 2.870028] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685737, buffersize=58) -> [ 2.870028] (0:@) insert_into_buffer: inserted at 47 -> [ 2.870028] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 2.870028] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.870028, buffersize=59) -> [ 2.870028] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 2.888530] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 2.888530] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.870028, buffersize=60) -> [ 2.888530] (0:@) insert_into_buffer: inserted at end, pos = 60 -> [ 2.888530] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.888530 -> [ 2.888530] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.888530, buffersize=61) -> [ 2.888530] (0:@) insert_into_buffer: inserted at end -> [ 2.888530] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 2.888530] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.870028, buffersize=62) -> [ 2.888530] (0:@) insert_into_buffer: inserted at 61 -> [ 2.888530] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.888530 -> [ 2.888530] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.888530, buffersize=63) -> [ 2.888530] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 2.888530] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.888530] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.888686] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.888686] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.890868] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.888686 -> [ 2.890868] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.888686, buffersize=64) -> [ 2.890868] (0:@) insert_into_buffer: inserted at end -> [ 2.890868] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.890868 -> [ 2.890868] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.890868, buffersize=65) -> [ 2.890868] (0:@) insert_into_buffer: inserted at end -> [ 2.890868] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.890868] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.890868] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.890868 -> [ 2.890868] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.890868, buffersize=66) -> [ 2.890868] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 66 -> [ 2.890868] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=2.890868 -> [ 2.890868] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=2.890868, buffersize=67) -> [ 2.890868] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 67 -> [ 2.956139] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 2.956139] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300797, buffersize=68) -> [ 2.956139] (0:@) insert_into_buffer: inserted at 30 -> [ 2.956139] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.956139 -> [ 2.956139] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.956139, buffersize=69) -> [ 2.956139] (0:@) insert_into_buffer: inserted at end -> [ 2.956139] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 2.956139] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300797, buffersize=70) -> [ 2.956139] (0:@) insert_into_buffer: inserted at 31 -> [ 2.956139] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.956139 -> [ 2.956139] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.956139, buffersize=71) -> [ 2.956139] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 2.956139] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.956139] (0:@) TRACE_paje_dump_buffer: ends -> [ 2.976690] (0:@) TRACE_paje_dump_buffer: dump until 2.082643. starts -> [ 2.976690] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082643, buffersize=72) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 0 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=73) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082643, buffersize=74) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 1 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=75) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976690, buffersize=76) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 74 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=77) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976690, buffersize=78) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 75 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=79) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976690, buffersize=80) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 76 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=81) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976690, buffersize=82) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 77 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=83) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 83 -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976690, buffersize=84) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 78 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=85) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 3.113741] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976690, buffersize=86) -> [ 3.113741] (0:@) insert_into_buffer: inserted at 79 -> [ 3.113741] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.113741] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113741, buffersize=87) -> [ 3.113741] (0:@) insert_into_buffer: inserted at end, pos = 87 -> [ 3.113741] (0:@) TRACE_paje_dump_buffer: dump until 2.685737. starts -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.082643 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082643 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.082643 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.103194 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=8, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.300797 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.376481 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.376481 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.376481 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.376481 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.376637 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.376637 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.378820 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.378820 -> [ 3.113741] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.378820 -> [ 3.113741] (0:@) free_paje_event: event_type=8, timestamp=2.378820 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.378820 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.378820 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.378820 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.378820 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.378820 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.378820 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.519775 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.519775 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.519775 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.519775 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.534975 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.534975 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.685737 -> [ 3.113741] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=8, timestamp=2.685737 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.685737 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.685737 -> [ 3.113741] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=10, timestamp=2.685737 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.685737 -> [ 3.113741] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.113741] (0:@) free_paje_event: event_type=9, timestamp=2.685737 -> [ 3.113741] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113741, buffersize=36) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 36 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=37) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113741, buffersize=38) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 37 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=39) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 39 -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113741, buffersize=40) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 38 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=41) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 41 -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113741, buffersize=42) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 39 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=43) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 43 -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113741, buffersize=44) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 40 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=45) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 45 -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113741, buffersize=46) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 41 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=47) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 47 -> [ 3.174292] (0:@) TRACE_paje_dump_buffer: dump until 2.685737. starts -> [ 3.174292] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.174292] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=3.174292 -> [ 3.174292] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=3.174292, buffersize=48) -> [ 3.174292] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 48 -> [ 3.174292] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.174292] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=3.174292, buffersize=49) -> [ 3.174292] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 49 -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.890868 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.890868, buffersize=50) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 20 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=51) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 51 -> [ 3.174292] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.890868 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.890868, buffersize=52) -> [ 3.174292] (0:@) insert_into_buffer: inserted at 21 -> [ 3.174292] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.174292] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.174292, buffersize=53) -> [ 3.174292] (0:@) insert_into_buffer: inserted at end, pos = 53 -> [ 3.194628] (0:@) TRACE_paje_dump_buffer: dump until 2.685737. starts -> [ 3.194628] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685737, buffersize=54) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 0 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=55) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685737, buffersize=56) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 1 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=57) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 57 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=58) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 56 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=59) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 59 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=60) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 57 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=61) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 61 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=62) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 58 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=63) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 63 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=64) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 59 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=65) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 65 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=66) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 60 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=67) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 67 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=68) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 61 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=69) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 69 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=70) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 62 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=71) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 71 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=72) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 63 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=73) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=74) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 64 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=75) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=76) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 65 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=77) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=78) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 66 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=79) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=80) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 67 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=81) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=82) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 68 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=83) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 83 -> [ 3.341079] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194628, buffersize=84) -> [ 3.341079] (0:@) insert_into_buffer: inserted at 69 -> [ 3.341079] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.341079] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.341079, buffersize=85) -> [ 3.341079] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 3.341079] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.685737 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685737 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.685737 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.729569 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.729569 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.729569 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.729569 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.742800 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.742800 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.742800 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.742800 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.742800 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.742800 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=8, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=10, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.870028 -> [ 3.341079] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.341079] (0:@) free_paje_event: event_type=9, timestamp=2.870028 -> [ 3.341079] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=70) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 70 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=71) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=72) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 71 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=73) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 73 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=74) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 72 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=75) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 75 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=76) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 73 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=77) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 77 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=78) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 74 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=79) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 79 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=80) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 75 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=81) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 81 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=82) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 76 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=83) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 83 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=84) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 77 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=85) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 85 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=86) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 78 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=87) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 87 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=88) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 79 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=89) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 89 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=90) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 80 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=91) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 91 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=92) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 81 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=93) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 93 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=94) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 82 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=95) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 95 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.341079, buffersize=96) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 83 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=97) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 97 -> [ 3.390164] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.390164] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.390164] (6:slave@Bourassa) new_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 3.390164] (6:slave@Bourassa) insert_into_buffer: insert event_type=9, timestamp=3.390164, buffersize=98) -> [ 3.390164] (6:slave@Bourassa) insert_into_buffer: inserted at end, pos = 98 -> [ 3.390164] (1:master@Tremblay) new value finish_send_tasks, child of msmark -> [ 3.390164] (1:master@Tremblay) EntityValue finish_send_tasks(29), child of msmark(19) -> [ 3.390164] (1:master@Tremblay) new_pajeDefineEntityValue: event_type=5 -> [ 3.390164] (1:master@Tremblay) print_pajeDefineEntityValue: event_type=5 -> [ 3.390164] (1:master@Tremblay) free_paje_event: event_type=5, timestamp=0.000000 -> [ 3.390164] (1:master@Tremblay) new_pajeNewEvent: event_type=16, timestamp=3.390164 -> [ 3.390164] (1:master@Tremblay) insert_into_buffer: insert event_type=16, timestamp=3.390164, buffersize=99) -> [ 3.390164] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 99 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.174292, buffersize=100) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 40 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=101) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 101 -> [ 3.390164] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.174292, buffersize=102) -> [ 3.390164] (0:@) insert_into_buffer: inserted at 41 -> [ 3.390164] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.390164] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.390164, buffersize=103) -> [ 3.390164] (0:@) insert_into_buffer: inserted at end, pos = 103 -> [ 3.400578] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 3.400578] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.390164, buffersize=104) -> [ 3.400578] (0:@) insert_into_buffer: inserted at end, pos = 104 -> [ 3.400578] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.400578 -> [ 3.400578] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.400578, buffersize=105) -> [ 3.400578] (0:@) insert_into_buffer: inserted at end -> [ 3.400578] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 3.400578] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.390164, buffersize=106) -> [ 3.400578] (0:@) insert_into_buffer: inserted at 105 -> [ 3.400578] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.400578 -> [ 3.400578] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.400578, buffersize=107) -> [ 3.400578] (0:@) insert_into_buffer: inserted at end, pos = 107 -> [ 3.400578] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.400578] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.405364] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.405364] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.405520] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.405520] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.829634] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.829634] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.174292, buffersize=108) -> [ 3.829634] (0:@) insert_into_buffer: inserted at 42 -> [ 3.829634] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.829634 -> [ 3.829634] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.829634, buffersize=109) -> [ 3.829634] (0:@) insert_into_buffer: inserted at end -> [ 3.829634] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.829634] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.174292, buffersize=110) -> [ 3.829634] (0:@) insert_into_buffer: inserted at 43 -> [ 3.829634] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.829634 -> [ 3.829634] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.829634, buffersize=111) -> [ 3.829634] (0:@) insert_into_buffer: inserted at end, pos = 111 -> [ 3.829634] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.829634] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.850185] (0:@) TRACE_paje_dump_buffer: dump until 2.870028. starts -> [ 3.850185] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.901126] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.901126] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.870028, buffersize=112) -> [ 3.901126] (0:@) insert_into_buffer: inserted at 0 -> [ 3.901126] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.901126 -> [ 3.901126] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.901126, buffersize=113) -> [ 3.901126] (0:@) insert_into_buffer: inserted at end -> [ 3.901126] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.901126] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.870028, buffersize=114) -> [ 3.901126] (0:@) insert_into_buffer: inserted at 1 -> [ 3.901126] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.901126 -> [ 3.901126] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.901126, buffersize=115) -> [ 3.901126] (0:@) insert_into_buffer: inserted at end, pos = 115 -> [ 3.901126] (0:@) TRACE_paje_dump_buffer: dump until 3.390164. starts -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.870028 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.870028 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.870028 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.888530 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=2.888530 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.888530 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=2.888530 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.888686 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.888686 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.890868 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=2.890868 -> [ 3.901126] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.890868 -> [ 3.901126] (0:@) free_paje_event: event_type=8, timestamp=2.890868 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.890868 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.890868 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.890868 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.890868 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.890868 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.890868 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.956139 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=2.956139 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.956139 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=2.956139 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=2.976690 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.113741 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSetVariable: event_type=8, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=8, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.174292 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.194628 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.341079 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeNewEvent: event_type=16, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=16, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=10, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.390164 -> [ 3.901126] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 3.901126] (0:@) free_paje_event: event_type=9, timestamp=3.390164 -> [ 3.901126] (0:@) TRACE_paje_dump_buffer: ends -> [ 3.914358] (0:@) TRACE_paje_dump_buffer: dump until 3.390164. starts -> [ 3.914358] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.421262] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 4.421262] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.390164, buffersize=6) -> [ 4.421262] (0:@) insert_into_buffer: inserted at 0 -> [ 4.421262] (0:@) new_pajeSubVariable: event_type=10, timestamp=4.421262 -> [ 4.421262] (0:@) insert_into_buffer: insert event_type=10, timestamp=4.421262, buffersize=7) -> [ 4.421262] (0:@) insert_into_buffer: inserted at end -> [ 4.421262] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 4.421262] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.390164, buffersize=8) -> [ 4.421262] (0:@) insert_into_buffer: inserted at 1 -> [ 4.421262] (0:@) new_pajeSubVariable: event_type=10, timestamp=4.421262 -> [ 4.421262] (0:@) insert_into_buffer: insert event_type=10, timestamp=4.421262, buffersize=9) -> [ 4.421262] (0:@) insert_into_buffer: inserted at end, pos = 9 -> [ 4.421262] (0:@) TRACE_paje_dump_buffer: dump until 3.405364. starts -> [ 4.421262] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 4.421262] (0:@) free_paje_event: event_type=9, timestamp=3.390164 -> [ 4.421262] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.390164 -> [ 4.421262] (0:@) free_paje_event: event_type=9, timestamp=3.390164 -> [ 4.421262] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.400578 -> [ 4.421262] (0:@) free_paje_event: event_type=10, timestamp=3.400578 -> [ 4.421262] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.400578 -> [ 4.421262] (0:@) free_paje_event: event_type=10, timestamp=3.400578 -> [ 4.421262] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 3.405364. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) Simulation time 4.4416 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.829634 -> [ 4.441598] (0:@) free_paje_event: event_type=10, timestamp=3.829634 -> [ 4.441598] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.829634 -> [ 4.441598] (0:@) free_paje_event: event_type=10, timestamp=3.829634 -> [ 4.441598] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.901126 -> [ 4.441598] (0:@) free_paje_event: event_type=10, timestamp=3.901126 -> [ 4.441598] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.901126 -> [ 4.441598] (0:@) free_paje_event: event_type=10, timestamp=3.901126 -> [ 4.441598] (0:@) print_pajeSubVariable: event_type=10, timestamp=4.421262 -> [ 4.441598] (0:@) free_paje_event: event_type=10, timestamp=4.421262 -> [ 4.441598] (0:@) print_pajeSubVariable: event_type=10, timestamp=4.421262 -> [ 4.441598] (0:@) free_paje_event: event_type=10, timestamp=4.421262 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) destroy container Fafard -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container R.2-0 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container R.4-3 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container R.3-2-5 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container R.1-8-6 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container R.6-7 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container Tremblay -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 10 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 11 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 12 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container loopback -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container R.1-0 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 0 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 1 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 2 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 3 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 4 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 5 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 6 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 7 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 8 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 9 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container Bourassa -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container Jupiter -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container Ginette -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container AS0 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) destroy container 0 -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: dump until 4.441598. starts -> [ 4.441598] (0:@) TRACE_paje_dump_buffer: ends -> [ 4.441598] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) free_paje_event: event_type=7, timestamp=4.441598 -> [ 4.441598] (0:@) Filename tracing/ms.trace is closed +> [ 0.002164] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.002164] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.002164] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=0.002164 +> [ 0.002164] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=0.002164, buffersize=0) +> [ 0.002164] (2:slave@Tremblay) insert_into_buffer: inserted at beginning +> [ 0.002164] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.002164 +> [ 0.002164] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.002164, buffersize=1) +> [ 0.002164] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 1 +> [ 0.017364] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.017364] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.168126] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.017364 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.017364, buffersize=2) +> [ 0.168126] (0:@) insert_into_buffer: inserted at end, pos = 2 +> [ 0.168126] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.017364 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.017364, buffersize=3) +> [ 0.168126] (0:@) insert_into_buffer: inserted at end, pos = 3 +> [ 0.168126] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168126, buffersize=4) +> [ 0.168126] (0:@) insert_into_buffer: inserted at end, pos = 4 +> [ 0.168126] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.017364 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.017364, buffersize=5) +> [ 0.168126] (0:@) insert_into_buffer: inserted at 4 +> [ 0.168126] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.017364 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.017364, buffersize=6) +> [ 0.168126] (0:@) insert_into_buffer: inserted at 5 +> [ 0.168126] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168126, buffersize=7) +> [ 0.168126] (0:@) insert_into_buffer: inserted at end, pos = 7 +> [ 0.168126] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.168126] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.168126] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.168126] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=0.168126, buffersize=8) +> [ 0.168126] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 8 +> [ 0.168126] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.168126 +> [ 0.168126] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.168126, buffersize=9) +> [ 0.168126] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 9 +> [ 0.168126] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.002164 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.002164, buffersize=10) +> [ 0.168126] (0:@) insert_into_buffer: inserted at 2 +> [ 0.168126] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.002164 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.002164, buffersize=11) +> [ 0.168126] (0:@) insert_into_buffer: inserted at 3 +> [ 0.168126] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168126, buffersize=12) +> [ 0.168126] (0:@) insert_into_buffer: inserted at end, pos = 12 +> [ 0.168126] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.002164 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.002164, buffersize=13) +> [ 0.168126] (0:@) insert_into_buffer: inserted at 4 +> [ 0.168126] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.002164 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.002164, buffersize=14) +> [ 0.168126] (0:@) insert_into_buffer: inserted at 5 +> [ 0.168126] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.168126] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.168126, buffersize=15) +> [ 0.168126] (0:@) insert_into_buffer: inserted at end, pos = 15 +> [ 0.188676] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.188676] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=16) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 16 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=17) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 17 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=18) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 18 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=19) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 18 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=20) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 19 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=21) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 21 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=22) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 20 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=23) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 21 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=24) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 24 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=25) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 22 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=26) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 23 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=27) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 27 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=28) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 24 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=29) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 25 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=30) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 30 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=31) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 26 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=32) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 27 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=33) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 33 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=34) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 28 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=35) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 29 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=36) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 36 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=37) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 30 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=38) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 31 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=39) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 39 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=40) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 32 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=41) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 33 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=42) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 42 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=43) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 34 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=44) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 35 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=45) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 45 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=46) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 36 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=47) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 37 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=48) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 48 +> [ 0.386279] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.188676, buffersize=49) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 38 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.188676, buffersize=50) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 39 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=51) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 0.386279] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.386279] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.386279] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 0.386279] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=0.386279, buffersize=52) +> [ 0.386279] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 52 +> [ 0.386279] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.386279 +> [ 0.386279] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.386279, buffersize=53) +> [ 0.386279] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 53 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168126, buffersize=54) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 16 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=55) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 0.386279] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168126, buffersize=56) +> [ 0.386279] (0:@) insert_into_buffer: inserted at 17 +> [ 0.386279] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.386279] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.386279, buffersize=57) +> [ 0.386279] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 0.399511] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.399511] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386279, buffersize=58) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 58 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=59) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386279, buffersize=60) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 59 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=61) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399511, buffersize=62) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 60 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=63) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 63 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399511, buffersize=64) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 61 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=65) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 65 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399511, buffersize=66) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 62 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=67) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399511, buffersize=68) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 63 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=69) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 0.511874] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.399511, buffersize=70) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 64 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399511, buffersize=71) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 65 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=72) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 72 +> [ 0.511874] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.399511, buffersize=73) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 66 +> [ 0.511874] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.399511, buffersize=74) +> [ 0.511874] (0:@) insert_into_buffer: inserted at 67 +> [ 0.511874] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 0.511874] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.511874, buffersize=75) +> [ 0.511874] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 0.511874] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.511874] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.526739] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.511874, buffersize=76) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 76 +> [ 0.526739] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526739, buffersize=77) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 0.526739] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.511874, buffersize=78) +> [ 0.526739] (0:@) insert_into_buffer: inserted at 77 +> [ 0.526739] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526739, buffersize=79) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 79 +> [ 0.526739] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.511874, buffersize=80) +> [ 0.526739] (0:@) insert_into_buffer: inserted at 78 +> [ 0.526739] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526739, buffersize=81) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 81 +> [ 0.526739] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.511874, buffersize=82) +> [ 0.526739] (0:@) insert_into_buffer: inserted at 79 +> [ 0.526739] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526739, buffersize=83) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 83 +> [ 0.526739] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.511874, buffersize=84) +> [ 0.526739] (0:@) insert_into_buffer: inserted at 80 +> [ 0.526739] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526739, buffersize=85) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 85 +> [ 0.526739] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.511874, buffersize=86) +> [ 0.526739] (0:@) insert_into_buffer: inserted at 81 +> [ 0.526739] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 0.526739] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.526739, buffersize=87) +> [ 0.526739] (0:@) insert_into_buffer: inserted at end, pos = 87 +> [ 0.526739] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.526739] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.526739] (5:slave@Ginette) new_pajeAddVariable: event_type=9, timestamp=0.526739 +> [ 0.526739] (5:slave@Ginette) insert_into_buffer: insert event_type=9, timestamp=0.526739, buffersize=88) +> [ 0.526739] (5:slave@Ginette) insert_into_buffer: inserted at end, pos = 88 +> [ 0.526739] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.526739 +> [ 0.526739] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.526739, buffersize=89) +> [ 0.526739] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 89 +> [ 0.547074] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.547074] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=90) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 90 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=91) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 91 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=92) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 91 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=93) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 93 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=94) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 92 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=95) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 95 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=96) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 93 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=97) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 97 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=98) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 94 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=99) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 99 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=100) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 95 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=101) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 101 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=102) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 96 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=103) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 103 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=104) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 97 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=105) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 105 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=106) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 98 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=107) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 107 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=108) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 99 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=109) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 109 +> [ 0.742611] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547074, buffersize=110) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 100 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=111) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 101 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=112) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 112 +> [ 0.742611] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547074, buffersize=113) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 102 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=114) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 103 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=115) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 115 +> [ 0.742611] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547074, buffersize=116) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 104 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=117) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 105 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=118) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 118 +> [ 0.742611] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.547074, buffersize=119) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 106 +> [ 0.742611] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.547074, buffersize=120) +> [ 0.742611] (0:@) insert_into_buffer: inserted at 107 +> [ 0.742611] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 0.742611] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.742611, buffersize=121) +> [ 0.742611] (0:@) insert_into_buffer: inserted at end, pos = 121 +> [ 0.742611] (0:@) TRACE_paje_dump_buffer: dump until 0.000000. starts +> [ 0.742611] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.742611] (6:slave@Bourassa) new_pajeAddVariable: event_type=9, timestamp=0.742611 +> [ 0.742611] (6:slave@Bourassa) insert_into_buffer: insert event_type=9, timestamp=0.742611, buffersize=122) +> [ 0.742611] (6:slave@Bourassa) insert_into_buffer: inserted at end, pos = 122 +> [ 0.742611] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.742611 +> [ 0.742611] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.742611, buffersize=123) +> [ 0.742611] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 123 +> [ 0.742767] (0:@) TRACE_paje_dump_buffer: dump until 0.168126. starts +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.002164 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.002164 +> [ 0.742767] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.002164 +> [ 0.742767] (0:@) free_paje_event: event_type=8, timestamp=0.002164 +> [ 0.742767] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.002164 +> [ 0.742767] (0:@) free_paje_event: event_type=8, timestamp=0.002164 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.002164 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.002164 +> [ 0.742767] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.002164 +> [ 0.742767] (0:@) free_paje_event: event_type=8, timestamp=0.002164 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.002164 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.002164 +> [ 0.742767] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.017364 +> [ 0.742767] (0:@) free_paje_event: event_type=8, timestamp=0.017364 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.017364 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.017364 +> [ 0.742767] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.017364 +> [ 0.742767] (0:@) free_paje_event: event_type=8, timestamp=0.017364 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.017364 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.017364 +> [ 0.742767] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=8, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=10, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.168126 +> [ 0.742767] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.742767] (0:@) free_paje_event: event_type=9, timestamp=0.168126 +> [ 0.742767] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.744775] (0:@) TRACE_paje_dump_buffer: dump until 0.168126. starts +> [ 0.744775] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.744775] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=0.744775 +> [ 0.744775] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=0.744775, buffersize=106) +> [ 0.744775] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 106 +> [ 0.744775] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.744775 +> [ 0.744775] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.744775, buffersize=107) +> [ 0.744775] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 107 +> [ 0.823468] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.168126 +> [ 0.823468] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.168126, buffersize=108) +> [ 0.823468] (0:@) insert_into_buffer: inserted at beginning +> [ 0.823468] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.823468] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168126, buffersize=109) +> [ 0.823468] (0:@) insert_into_buffer: inserted at 1 +> [ 0.823468] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.823468 +> [ 0.823468] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.823468, buffersize=110) +> [ 0.823468] (0:@) insert_into_buffer: inserted at end, pos = 110 +> [ 0.823468] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.168126 +> [ 0.823468] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.168126, buffersize=111) +> [ 0.823468] (0:@) insert_into_buffer: inserted at 2 +> [ 0.823468] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.823468] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.168126, buffersize=112) +> [ 0.823468] (0:@) insert_into_buffer: inserted at 3 +> [ 0.823468] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.823468 +> [ 0.823468] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.823468, buffersize=113) +> [ 0.823468] (0:@) insert_into_buffer: inserted at end, pos = 113 +> [ 0.823468] (0:@) TRACE_paje_dump_buffer: dump until 0.386279. starts +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.168126 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.168126 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.168126 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.168126 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.168126 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.168126 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.168126 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.188676 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=8, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=10, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.386279 +> [ 0.823468] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 0.823468] (0:@) free_paje_event: event_type=9, timestamp=0.386279 +> [ 0.823468] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.838668] (0:@) TRACE_paje_dump_buffer: dump until 0.386279. starts +> [ 0.838668] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.989430] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.838668 +> [ 0.989430] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.838668, buffersize=68) +> [ 0.989430] (0:@) insert_into_buffer: inserted at end, pos = 68 +> [ 0.989430] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.989430 +> [ 0.989430] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.989430, buffersize=69) +> [ 0.989430] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 0.989430] (0:@) TRACE_paje_dump_buffer: dump until 0.386279. starts +> [ 0.989430] (0:@) TRACE_paje_dump_buffer: ends +> [ 0.989430] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=0.989430 +> [ 0.989430] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=0.989430, buffersize=70) +> [ 0.989430] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 70 +> [ 0.989430] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 0.989430] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=0.989430, buffersize=71) +> [ 0.989430] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 71 +> [ 0.989430] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.744775 +> [ 0.989430] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.744775, buffersize=72) +> [ 0.989430] (0:@) insert_into_buffer: inserted at 66 +> [ 0.989430] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.989430 +> [ 0.989430] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.989430, buffersize=73) +> [ 0.989430] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 0.989430] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.744775 +> [ 0.989430] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.744775, buffersize=74) +> [ 0.989430] (0:@) insert_into_buffer: inserted at 67 +> [ 0.989430] (0:@) new_pajeSubVariable: event_type=10, timestamp=0.989430 +> [ 0.989430] (0:@) insert_into_buffer: insert event_type=10, timestamp=0.989430, buffersize=75) +> [ 0.989430] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 1.041621] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.386279 +> [ 1.041621] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.386279, buffersize=76) +> [ 1.041621] (0:@) insert_into_buffer: inserted at beginning +> [ 1.041621] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 1.041621] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386279, buffersize=77) +> [ 1.041621] (0:@) insert_into_buffer: inserted at 1 +> [ 1.041621] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.041621 +> [ 1.041621] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.041621, buffersize=78) +> [ 1.041621] (0:@) insert_into_buffer: inserted at end, pos = 78 +> [ 1.041621] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.386279 +> [ 1.041621] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.386279, buffersize=79) +> [ 1.041621] (0:@) insert_into_buffer: inserted at 2 +> [ 1.041621] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 1.041621] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.386279, buffersize=80) +> [ 1.041621] (0:@) insert_into_buffer: inserted at 3 +> [ 1.041621] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.041621 +> [ 1.041621] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.041621, buffersize=81) +> [ 1.041621] (0:@) insert_into_buffer: inserted at end, pos = 81 +> [ 1.041621] (0:@) TRACE_paje_dump_buffer: dump until 0.526739. starts +> [ 1.041621] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.386279 +> [ 1.041621] (0:@) free_paje_event: event_type=8, timestamp=0.386279 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.386279 +> [ 1.041621] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.386279 +> [ 1.041621] (0:@) free_paje_event: event_type=8, timestamp=0.386279 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.386279 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.386279 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=8, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=8, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.399511 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.511874 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=10, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=9, timestamp=0.526739 +> [ 1.041621] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.526739 +> [ 1.041621] (0:@) free_paje_event: event_type=8, timestamp=0.526739 +> [ 1.041621] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.062172] (0:@) TRACE_paje_dump_buffer: dump until 0.526739. starts +> [ 1.062172] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989430, buffersize=48) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 46 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=49) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 49 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989430, buffersize=50) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 47 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=51) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062172, buffersize=52) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 50 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=53) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 53 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062172, buffersize=54) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 51 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=55) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062172, buffersize=56) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 52 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=57) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062172, buffersize=58) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 53 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=59) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062172, buffersize=60) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 54 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=61) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 1.254485] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.062172, buffersize=62) +> [ 1.254485] (0:@) insert_into_buffer: inserted at 55 +> [ 1.254485] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.254485] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.254485, buffersize=63) +> [ 1.254485] (0:@) insert_into_buffer: inserted at end, pos = 63 +> [ 1.254485] (0:@) TRACE_paje_dump_buffer: dump until 0.526739. starts +> [ 1.254485] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.259775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254485, buffersize=64) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 64 +> [ 1.259775] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259775, buffersize=65) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 65 +> [ 1.259775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254485, buffersize=66) +> [ 1.259775] (0:@) insert_into_buffer: inserted at 65 +> [ 1.259775] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259775, buffersize=67) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 1.259775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254485, buffersize=68) +> [ 1.259775] (0:@) insert_into_buffer: inserted at 66 +> [ 1.259775] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259775, buffersize=69) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 1.259775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254485, buffersize=70) +> [ 1.259775] (0:@) insert_into_buffer: inserted at 67 +> [ 1.259775] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259775, buffersize=71) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 1.259775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254485, buffersize=72) +> [ 1.259775] (0:@) insert_into_buffer: inserted at 68 +> [ 1.259775] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259775, buffersize=73) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 1.259775] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.254485, buffersize=74) +> [ 1.259775] (0:@) insert_into_buffer: inserted at 69 +> [ 1.259775] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.259775] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.259775, buffersize=75) +> [ 1.259775] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 1.259775] (0:@) TRACE_paje_dump_buffer: dump until 0.526739. starts +> [ 1.259775] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.259775] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.259775 +> [ 1.259775] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.259775, buffersize=76) +> [ 1.259775] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 76 +> [ 1.259775] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=1.259775 +> [ 1.259775] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=1.259775, buffersize=77) +> [ 1.259775] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 77 +> [ 1.259931] (0:@) TRACE_paje_dump_buffer: dump until 0.526739. starts +> [ 1.259931] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.261939] (0:@) TRACE_paje_dump_buffer: dump until 0.526739. starts +> [ 1.261939] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.261939] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=1.261939 +> [ 1.261939] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=1.261939, buffersize=78) +> [ 1.261939] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 78 +> [ 1.261939] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.261939 +> [ 1.261939] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.261939, buffersize=79) +> [ 1.261939] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 79 +> [ 1.557837] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.526739 +> [ 1.557837] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.526739, buffersize=80) +> [ 1.557837] (0:@) insert_into_buffer: inserted at beginning +> [ 1.557837] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.526739 +> [ 1.557837] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.526739, buffersize=81) +> [ 1.557837] (0:@) insert_into_buffer: inserted at 1 +> [ 1.557837] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.557837 +> [ 1.557837] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.557837, buffersize=82) +> [ 1.557837] (0:@) insert_into_buffer: inserted at end, pos = 82 +> [ 1.557837] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.526739 +> [ 1.557837] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.526739, buffersize=83) +> [ 1.557837] (0:@) insert_into_buffer: inserted at 2 +> [ 1.557837] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.526739 +> [ 1.557837] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.526739, buffersize=84) +> [ 1.557837] (0:@) insert_into_buffer: inserted at 3 +> [ 1.557837] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.557837 +> [ 1.557837] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.557837, buffersize=85) +> [ 1.557837] (0:@) insert_into_buffer: inserted at end, pos = 85 +> [ 1.557837] (0:@) TRACE_paje_dump_buffer: dump until 0.742611. starts +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.526739 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.526739 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.526739 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.526739 +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.526739 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.526739 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.526739 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.526739 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.547074 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=10, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=9, timestamp=0.742611 +> [ 1.557837] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.742611 +> [ 1.557837] (0:@) free_paje_event: event_type=8, timestamp=0.742611 +> [ 1.557837] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.571068] (0:@) TRACE_paje_dump_buffer: dump until 0.742611. starts +> [ 1.571068] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.644772] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989430, buffersize=48) +> [ 1.644772] (0:@) insert_into_buffer: inserted at 14 +> [ 1.644772] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644772, buffersize=49) +> [ 1.644772] (0:@) insert_into_buffer: inserted at end, pos = 49 +> [ 1.644772] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.989430, buffersize=50) +> [ 1.644772] (0:@) insert_into_buffer: inserted at 15 +> [ 1.644772] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644772, buffersize=51) +> [ 1.644772] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 1.644772] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.571068 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.571068, buffersize=52) +> [ 1.644772] (0:@) insert_into_buffer: inserted at 50 +> [ 1.644772] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644772, buffersize=53) +> [ 1.644772] (0:@) insert_into_buffer: inserted at end, pos = 53 +> [ 1.644772] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.571068 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.571068, buffersize=54) +> [ 1.644772] (0:@) insert_into_buffer: inserted at 51 +> [ 1.644772] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644772, buffersize=55) +> [ 1.644772] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 1.644772] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.571068 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.571068, buffersize=56) +> [ 1.644772] (0:@) insert_into_buffer: inserted at 52 +> [ 1.644772] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.644772] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.644772, buffersize=57) +> [ 1.644772] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 1.644772] (0:@) TRACE_paje_dump_buffer: dump until 0.742611. starts +> [ 1.644772] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.698296] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.644772 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.644772, buffersize=58) +> [ 1.698296] (0:@) insert_into_buffer: inserted at end, pos = 58 +> [ 1.698296] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698296, buffersize=59) +> [ 1.698296] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 1.698296] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.644772 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.644772, buffersize=60) +> [ 1.698296] (0:@) insert_into_buffer: inserted at 59 +> [ 1.698296] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698296, buffersize=61) +> [ 1.698296] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 1.698296] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.644772 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.644772, buffersize=62) +> [ 1.698296] (0:@) insert_into_buffer: inserted at 60 +> [ 1.698296] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698296, buffersize=63) +> [ 1.698296] (0:@) insert_into_buffer: inserted at end, pos = 63 +> [ 1.698296] (0:@) TRACE_paje_dump_buffer: dump until 0.742611. starts +> [ 1.698296] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.698296] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.698296 +> [ 1.698296] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.698296, buffersize=64) +> [ 1.698296] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 64 +> [ 1.698296] (5:slave@Ginette) new_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 1.698296] (5:slave@Ginette) insert_into_buffer: insert event_type=9, timestamp=1.698296, buffersize=65) +> [ 1.698296] (5:slave@Ginette) insert_into_buffer: inserted at end, pos = 65 +> [ 1.698296] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.261939 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.261939, buffersize=66) +> [ 1.698296] (0:@) insert_into_buffer: inserted at 48 +> [ 1.698296] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698296, buffersize=67) +> [ 1.698296] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 1.698296] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.261939 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.261939, buffersize=68) +> [ 1.698296] (0:@) insert_into_buffer: inserted at 49 +> [ 1.698296] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.698296] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.698296, buffersize=69) +> [ 1.698296] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 1.713496] (0:@) TRACE_paje_dump_buffer: dump until 0.742611. starts +> [ 1.713496] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.771649] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698296, buffersize=70) +> [ 1.771649] (0:@) insert_into_buffer: inserted at end, pos = 70 +> [ 1.771649] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771649, buffersize=71) +> [ 1.771649] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 1.771649] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698296, buffersize=72) +> [ 1.771649] (0:@) insert_into_buffer: inserted at 71 +> [ 1.771649] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771649, buffersize=73) +> [ 1.771649] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 1.771649] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.713496 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.713496, buffersize=74) +> [ 1.771649] (0:@) insert_into_buffer: inserted at 72 +> [ 1.771649] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771649, buffersize=75) +> [ 1.771649] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 1.771649] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.713496 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.713496, buffersize=76) +> [ 1.771649] (0:@) insert_into_buffer: inserted at 73 +> [ 1.771649] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 1.771649] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.771649, buffersize=77) +> [ 1.771649] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 1.771649] (0:@) TRACE_paje_dump_buffer: dump until 0.742611. starts +> [ 1.771649] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.773709] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.742611 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.742611, buffersize=78) +> [ 1.773709] (0:@) insert_into_buffer: inserted at beginning +> [ 1.773709] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.742611 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.742611, buffersize=79) +> [ 1.773709] (0:@) insert_into_buffer: inserted at 1 +> [ 1.773709] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773709, buffersize=80) +> [ 1.773709] (0:@) insert_into_buffer: inserted at end, pos = 80 +> [ 1.773709] (0:@) new_pajeSetVariable: event_type=8, timestamp=0.742611 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=8, timestamp=0.742611, buffersize=81) +> [ 1.773709] (0:@) insert_into_buffer: inserted at 2 +> [ 1.773709] (0:@) new_pajeAddVariable: event_type=9, timestamp=0.742611 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=9, timestamp=0.742611, buffersize=82) +> [ 1.773709] (0:@) insert_into_buffer: inserted at 3 +> [ 1.773709] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773709, buffersize=83) +> [ 1.773709] (0:@) insert_into_buffer: inserted at end, pos = 83 +> [ 1.773709] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.771649 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.771649, buffersize=84) +> [ 1.773709] (0:@) insert_into_buffer: inserted at 82 +> [ 1.773709] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773709, buffersize=85) +> [ 1.773709] (0:@) insert_into_buffer: inserted at end, pos = 85 +> [ 1.773709] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.771649 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.771649, buffersize=86) +> [ 1.773709] (0:@) insert_into_buffer: inserted at 83 +> [ 1.773709] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 1.773709] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.773709, buffersize=87) +> [ 1.773709] (0:@) insert_into_buffer: inserted at end, pos = 87 +> [ 1.773709] (0:@) TRACE_paje_dump_buffer: dump until 1.259775. starts +> [ 1.773709] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.742611 +> [ 1.773709] (0:@) free_paje_event: event_type=8, timestamp=0.742611 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742611 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.742611 +> [ 1.773709] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.742611 +> [ 1.773709] (0:@) free_paje_event: event_type=8, timestamp=0.742611 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.742611 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.742611 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.744775 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.744775 +> [ 1.773709] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.744775 +> [ 1.773709] (0:@) free_paje_event: event_type=8, timestamp=0.744775 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.744775 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.744775 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.744775 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.744775 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.823468 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=0.823468 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.823468 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=0.823468 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.838668 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.838668 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeSetVariable: event_type=8, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=8, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=0.989430 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.041621 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.041621 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.041621 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.041621 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.062172 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.254485 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=10, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=8, timestamp=1.259775 +> [ 1.773709] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.259775 +> [ 1.773709] (0:@) free_paje_event: event_type=9, timestamp=1.259775 +> [ 1.773709] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.864258] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.773709 +> [ 1.864258] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.773709, buffersize=38) +> [ 1.864258] (0:@) insert_into_buffer: inserted at end, pos = 38 +> [ 1.864258] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.864258 +> [ 1.864258] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.864258, buffersize=39) +> [ 1.864258] (0:@) insert_into_buffer: inserted at end, pos = 39 +> [ 1.864258] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.773709 +> [ 1.864258] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.773709, buffersize=40) +> [ 1.864258] (0:@) insert_into_buffer: inserted at 39 +> [ 1.864258] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.864258 +> [ 1.864258] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.864258, buffersize=41) +> [ 1.864258] (0:@) insert_into_buffer: inserted at end, pos = 41 +> [ 1.864258] (0:@) TRACE_paje_dump_buffer: dump until 1.259775. starts +> [ 1.864258] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.864258] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=1.864258 +> [ 1.864258] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=1.864258, buffersize=42) +> [ 1.864258] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 42 +> [ 1.864258] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.864258 +> [ 1.864258] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.864258, buffersize=43) +> [ 1.864258] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 43 +> [ 1.864414] (0:@) TRACE_paje_dump_buffer: dump until 1.259775. starts +> [ 1.864414] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.866422] (0:@) TRACE_paje_dump_buffer: dump until 1.259775. starts +> [ 1.866422] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.866422] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=1.866422 +> [ 1.866422] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=1.866422, buffersize=44) +> [ 1.866422] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 44 +> [ 1.866422] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=1.866422 +> [ 1.866422] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=1.866422, buffersize=45) +> [ 1.866422] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 45 +> [ 1.886758] (0:@) TRACE_paje_dump_buffer: dump until 1.259775. starts +> [ 1.886758] (0:@) TRACE_paje_dump_buffer: ends +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.259775 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.259775, buffersize=46) +> [ 1.915117] (0:@) insert_into_buffer: inserted at beginning +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=47) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 47 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.259775 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.259775, buffersize=48) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 1 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=49) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 49 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=50) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 48 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=51) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=52) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 49 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=53) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 53 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=54) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 50 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=55) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=56) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 51 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=57) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=58) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 52 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=59) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=60) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 53 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=61) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=62) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 54 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=63) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 63 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=64) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 55 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=65) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 65 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=66) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 56 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=67) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=68) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 57 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=69) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=70) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 58 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=71) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=72) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 59 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=73) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=74) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 60 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=75) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 1.915117] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.886758, buffersize=76) +> [ 1.915117] (0:@) insert_into_buffer: inserted at 61 +> [ 1.915117] (0:@) new_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 1.915117] (0:@) insert_into_buffer: insert event_type=10, timestamp=1.915117, buffersize=77) +> [ 1.915117] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 1.915117] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.259775 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.259775 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.259775 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.259775 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.261939 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.261939 +> [ 1.915117] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.261939 +> [ 1.915117] (0:@) free_paje_event: event_type=8, timestamp=1.261939 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.261939 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.261939 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.261939 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.261939 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.557837 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.557837 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.557837 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.557837 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.571068 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.571068 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.571068 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.571068 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.571068 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.571068 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.644772 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.644772 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=8, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=10, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.698296 +> [ 1.915117] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 1.915117] (0:@) free_paje_event: event_type=9, timestamp=1.698296 +> [ 1.915117] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=50) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 50 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=51) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=52) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 51 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=53) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 53 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=54) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 52 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=55) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=56) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 53 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=57) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=58) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 54 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=59) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=60) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 55 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=61) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=62) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 56 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=63) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 63 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=64) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 57 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=65) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 65 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=66) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 58 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=67) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=68) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 59 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=69) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=70) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 60 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=71) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=72) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 61 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=73) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=74) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 62 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=75) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.915117, buffersize=76) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 63 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=77) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 2.082294] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.082294] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.082294] (6:slave@Bourassa) new_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 2.082294] (6:slave@Bourassa) insert_into_buffer: insert event_type=9, timestamp=2.082294, buffersize=78) +> [ 2.082294] (6:slave@Bourassa) insert_into_buffer: inserted at end, pos = 78 +> [ 2.082294] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.082294 +> [ 2.082294] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.082294, buffersize=79) +> [ 2.082294] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 79 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.866422 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.866422, buffersize=80) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 20 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=81) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 81 +> [ 2.082294] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.866422 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.866422, buffersize=82) +> [ 2.082294] (0:@) insert_into_buffer: inserted at 21 +> [ 2.082294] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.082294] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.082294, buffersize=83) +> [ 2.082294] (0:@) insert_into_buffer: inserted at end, pos = 83 +> [ 2.102845] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.102845] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=84) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 84 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=85) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 85 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=86) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 85 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=87) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 87 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=88) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 86 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=89) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 89 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=90) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 87 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=91) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 91 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=92) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 88 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=93) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 93 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=94) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 89 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=95) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 95 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=96) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 90 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=97) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 97 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=98) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 91 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=99) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 99 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=100) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 92 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=101) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 101 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=102) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 93 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=103) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 103 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=104) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 94 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=105) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 105 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.102845, buffersize=106) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 95 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=107) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 107 +> [ 2.300447] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.300447] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.300447] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 2.300447] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=2.300447, buffersize=108) +> [ 2.300447] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 108 +> [ 2.300447] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.300447 +> [ 2.300447] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.300447, buffersize=109) +> [ 2.300447] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 109 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082294, buffersize=110) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 84 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=111) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 111 +> [ 2.300447] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082294, buffersize=112) +> [ 2.300447] (0:@) insert_into_buffer: inserted at 85 +> [ 2.300447] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 2.300447] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.300447, buffersize=113) +> [ 2.300447] (0:@) insert_into_buffer: inserted at end, pos = 113 +> [ 2.376132] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 2.376132] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300447, buffersize=114) +> [ 2.376132] (0:@) insert_into_buffer: inserted at end, pos = 114 +> [ 2.376132] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.376132 +> [ 2.376132] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.376132, buffersize=115) +> [ 2.376132] (0:@) insert_into_buffer: inserted at end, pos = 115 +> [ 2.376132] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 2.376132] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300447, buffersize=116) +> [ 2.376132] (0:@) insert_into_buffer: inserted at 115 +> [ 2.376132] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.376132 +> [ 2.376132] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.376132, buffersize=117) +> [ 2.376132] (0:@) insert_into_buffer: inserted at end, pos = 117 +> [ 2.376132] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.376132] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.376288] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.376288] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.378296] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.378296] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.378296] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.378296 +> [ 2.378296] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.378296, buffersize=118) +> [ 2.378296] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 118 +> [ 2.378296] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=2.378296 +> [ 2.378296] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=2.378296, buffersize=119) +> [ 2.378296] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 119 +> [ 2.519600] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.864258 +> [ 2.519600] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.864258, buffersize=120) +> [ 2.519600] (0:@) insert_into_buffer: inserted at 18 +> [ 2.519600] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.519600 +> [ 2.519600] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.519600, buffersize=121) +> [ 2.519600] (0:@) insert_into_buffer: inserted at end, pos = 121 +> [ 2.519600] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.864258 +> [ 2.519600] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.864258, buffersize=122) +> [ 2.519600] (0:@) insert_into_buffer: inserted at 19 +> [ 2.519600] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.519600 +> [ 2.519600] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.519600, buffersize=123) +> [ 2.519600] (0:@) insert_into_buffer: inserted at end, pos = 123 +> [ 2.519600] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.519600] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.534800] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.534800] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.685562] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.534800 +> [ 2.685562] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.534800, buffersize=124) +> [ 2.685562] (0:@) insert_into_buffer: inserted at end, pos = 124 +> [ 2.685562] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.685562 +> [ 2.685562] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.685562, buffersize=125) +> [ 2.685562] (0:@) insert_into_buffer: inserted at end, pos = 125 +> [ 2.685562] (0:@) TRACE_paje_dump_buffer: dump until 1.698296. starts +> [ 2.685562] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.685562] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.685562 +> [ 2.685562] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.685562, buffersize=126) +> [ 2.685562] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 126 +> [ 2.685562] (3:slave@Jupiter) new_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 2.685562] (3:slave@Jupiter) insert_into_buffer: insert event_type=9, timestamp=2.685562, buffersize=127) +> [ 2.685562] (3:slave@Jupiter) insert_into_buffer: inserted at end, pos = 127 +> [ 2.685562] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.378296 +> [ 2.685562] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.378296, buffersize=128) +> [ 2.685562] (0:@) insert_into_buffer: inserted at 122 +> [ 2.685562] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.685562 +> [ 2.685562] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.685562, buffersize=129) +> [ 2.685562] (0:@) insert_into_buffer: inserted at end, pos = 129 +> [ 2.685562] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.378296 +> [ 2.685562] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.378296, buffersize=130) +> [ 2.685562] (0:@) insert_into_buffer: inserted at 123 +> [ 2.685562] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.685562 +> [ 2.685562] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.685562, buffersize=131) +> [ 2.685562] (0:@) insert_into_buffer: inserted at end, pos = 131 +> [ 2.729394] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 2.729394] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698296, buffersize=132) +> [ 2.729394] (0:@) insert_into_buffer: inserted at beginning +> [ 2.729394] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.729394 +> [ 2.729394] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.729394, buffersize=133) +> [ 2.729394] (0:@) insert_into_buffer: inserted at end, pos = 133 +> [ 2.729394] (0:@) new_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 2.729394] (0:@) insert_into_buffer: insert event_type=9, timestamp=1.698296, buffersize=134) +> [ 2.729394] (0:@) insert_into_buffer: inserted at 1 +> [ 2.729394] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.729394 +> [ 2.729394] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.729394, buffersize=135) +> [ 2.729394] (0:@) insert_into_buffer: inserted at end, pos = 135 +> [ 2.729394] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.698296 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.698296 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.698296 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.713496 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.713496 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.713496 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.713496 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.771649 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.771649 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.771649 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.771649 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.771649 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.773709 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.773709 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.773709 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.773709 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.773709 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.864258 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.864258 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.864258 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.864258 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864258 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.864258 +> [ 2.729394] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.864258 +> [ 2.729394] (0:@) free_paje_event: event_type=8, timestamp=1.864258 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864258 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.864258 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.864258 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.864258 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.866422 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.866422 +> [ 2.729394] (0:@) print_pajeSetVariable: event_type=8, timestamp=1.866422 +> [ 2.729394] (0:@) free_paje_event: event_type=8, timestamp=1.866422 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.866422 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.866422 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.866422 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.866422 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.886758 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=1.915117 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=8, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=10, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=2.082294 +> [ 2.729394] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 2.729394] (0:@) free_paje_event: event_type=9, timestamp=2.082294 +> [ 2.729394] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.742626] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.742626] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.869854] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.742626 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.742626, buffersize=46) +> [ 2.869854] (0:@) insert_into_buffer: inserted at end, pos = 46 +> [ 2.869854] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.869854, buffersize=47) +> [ 2.869854] (0:@) insert_into_buffer: inserted at end, pos = 47 +> [ 2.869854] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.742626 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.742626, buffersize=48) +> [ 2.869854] (0:@) insert_into_buffer: inserted at 47 +> [ 2.869854] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.869854, buffersize=49) +> [ 2.869854] (0:@) insert_into_buffer: inserted at end, pos = 49 +> [ 2.869854] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.742626 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.742626, buffersize=50) +> [ 2.869854] (0:@) insert_into_buffer: inserted at 48 +> [ 2.869854] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.869854, buffersize=51) +> [ 2.869854] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 2.869854] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.869854] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.869854] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.869854 +> [ 2.869854] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.869854, buffersize=52) +> [ 2.869854] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 52 +> [ 2.869854] (5:slave@Ginette) new_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 2.869854] (5:slave@Ginette) insert_into_buffer: insert event_type=9, timestamp=2.869854, buffersize=53) +> [ 2.869854] (5:slave@Ginette) insert_into_buffer: inserted at end, pos = 53 +> [ 2.869854] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685562, buffersize=54) +> [ 2.869854] (0:@) insert_into_buffer: inserted at 44 +> [ 2.869854] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.869854, buffersize=55) +> [ 2.869854] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 2.869854] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685562, buffersize=56) +> [ 2.869854] (0:@) insert_into_buffer: inserted at 45 +> [ 2.869854] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 2.869854] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.869854, buffersize=57) +> [ 2.869854] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 2.888006] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 2.888006] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.869854, buffersize=58) +> [ 2.888006] (0:@) insert_into_buffer: inserted at end, pos = 58 +> [ 2.888006] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.888006 +> [ 2.888006] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.888006, buffersize=59) +> [ 2.888006] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 2.888006] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 2.888006] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.869854, buffersize=60) +> [ 2.888006] (0:@) insert_into_buffer: inserted at 59 +> [ 2.888006] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.888006 +> [ 2.888006] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.888006, buffersize=61) +> [ 2.888006] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 2.888006] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.888006] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.888162] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.888162] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.890170] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.890170] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.890170] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=2.890170 +> [ 2.890170] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=2.890170, buffersize=62) +> [ 2.890170] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 62 +> [ 2.890170] (2:slave@Tremblay) new_pajeAddVariable: event_type=9, timestamp=2.890170 +> [ 2.890170] (2:slave@Tremblay) insert_into_buffer: insert event_type=9, timestamp=2.890170, buffersize=63) +> [ 2.890170] (2:slave@Tremblay) insert_into_buffer: inserted at end, pos = 63 +> [ 2.955790] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 2.955790] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300447, buffersize=64) +> [ 2.955790] (0:@) insert_into_buffer: inserted at 30 +> [ 2.955790] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.955790 +> [ 2.955790] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.955790, buffersize=65) +> [ 2.955790] (0:@) insert_into_buffer: inserted at end, pos = 65 +> [ 2.955790] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 2.955790] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.300447, buffersize=66) +> [ 2.955790] (0:@) insert_into_buffer: inserted at 31 +> [ 2.955790] (0:@) new_pajeSubVariable: event_type=10, timestamp=2.955790 +> [ 2.955790] (0:@) insert_into_buffer: insert event_type=10, timestamp=2.955790, buffersize=67) +> [ 2.955790] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 2.955790] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.955790] (0:@) TRACE_paje_dump_buffer: ends +> [ 2.976340] (0:@) TRACE_paje_dump_buffer: dump until 2.082294. starts +> [ 2.976340] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082294, buffersize=68) +> [ 3.113392] (0:@) insert_into_buffer: inserted at beginning +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=69) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.082294, buffersize=70) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 1 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=71) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976340, buffersize=72) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 70 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=73) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976340, buffersize=74) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 71 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=75) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976340, buffersize=76) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 72 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=77) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976340, buffersize=78) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 73 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=79) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 79 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976340, buffersize=80) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 74 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=81) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 81 +> [ 3.113392] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.976340, buffersize=82) +> [ 3.113392] (0:@) insert_into_buffer: inserted at 75 +> [ 3.113392] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.113392] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.113392, buffersize=83) +> [ 3.113392] (0:@) insert_into_buffer: inserted at end, pos = 83 +> [ 3.113392] (0:@) TRACE_paje_dump_buffer: dump until 2.685562. starts +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.082294 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.082294 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.082294 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.102845 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=8, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.300447 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.376132 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.376132 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.376132 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.376132 +> [ 3.113392] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.378296 +> [ 3.113392] (0:@) free_paje_event: event_type=8, timestamp=2.378296 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.378296 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.378296 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.378296 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.378296 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.378296 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.378296 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.519600 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.519600 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.519600 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.519600 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.534800 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.534800 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.685562 +> [ 3.113392] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=8, timestamp=2.685562 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.685562 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.685562 +> [ 3.113392] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=10, timestamp=2.685562 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.685562 +> [ 3.113392] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.113392] (0:@) free_paje_event: event_type=9, timestamp=2.685562 +> [ 3.113392] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113392, buffersize=34) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 34 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=35) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 35 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113392, buffersize=36) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 35 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=37) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 37 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113392, buffersize=38) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 36 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=39) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 39 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113392, buffersize=40) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 37 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=41) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 41 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113392, buffersize=42) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 38 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=43) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 43 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.113392, buffersize=44) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 39 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=45) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 45 +> [ 3.173943] (0:@) TRACE_paje_dump_buffer: dump until 2.685562. starts +> [ 3.173943] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.173943] (1:master@Tremblay) new_pajeSetVariable: event_type=8, timestamp=3.173943 +> [ 3.173943] (1:master@Tremblay) insert_into_buffer: insert event_type=8, timestamp=3.173943, buffersize=46) +> [ 3.173943] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 46 +> [ 3.173943] (4:slave@Fafard) new_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.173943] (4:slave@Fafard) insert_into_buffer: insert event_type=9, timestamp=3.173943, buffersize=47) +> [ 3.173943] (4:slave@Fafard) insert_into_buffer: inserted at end, pos = 47 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.890170 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.890170, buffersize=48) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 18 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=49) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 49 +> [ 3.173943] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.890170 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.890170, buffersize=50) +> [ 3.173943] (0:@) insert_into_buffer: inserted at 19 +> [ 3.173943] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.173943] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.173943, buffersize=51) +> [ 3.173943] (0:@) insert_into_buffer: inserted at end, pos = 51 +> [ 3.194279] (0:@) TRACE_paje_dump_buffer: dump until 2.685562. starts +> [ 3.194279] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685562, buffersize=52) +> [ 3.340904] (0:@) insert_into_buffer: inserted at beginning +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=53) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 53 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.685562, buffersize=54) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 1 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=55) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 55 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=56) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 54 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=57) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 57 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=58) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 55 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=59) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 59 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=60) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 56 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=61) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 61 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=62) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 57 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=63) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 63 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=64) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 58 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=65) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 65 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=66) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 59 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=67) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 67 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=68) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 60 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=69) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=70) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 61 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=71) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=72) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 62 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=73) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=74) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 63 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=75) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=76) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 64 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=77) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=78) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 65 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=79) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 79 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=80) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 66 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=81) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 81 +> [ 3.340904] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.194279, buffersize=82) +> [ 3.340904] (0:@) insert_into_buffer: inserted at 67 +> [ 3.340904] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.340904] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.340904, buffersize=83) +> [ 3.340904] (0:@) insert_into_buffer: inserted at end, pos = 83 +> [ 3.340904] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.685562 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.685562 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.685562 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.729394 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.729394 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.729394 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.729394 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.742626 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.742626 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.742626 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.742626 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.742626 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.742626 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=8, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=10, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.869854 +> [ 3.340904] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.340904] (0:@) free_paje_event: event_type=9, timestamp=2.869854 +> [ 3.340904] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=68) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 68 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=69) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 69 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=70) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 69 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=71) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 71 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=72) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 70 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=73) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 73 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=74) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 71 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=75) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 75 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=76) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 72 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=77) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 77 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=78) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 73 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=79) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 79 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=80) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 74 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=81) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 81 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=82) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 75 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=83) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 83 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=84) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 76 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=85) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 85 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=86) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 77 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=87) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 87 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=88) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 78 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=89) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 89 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=90) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 79 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=91) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 91 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=92) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 80 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=93) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 93 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.340904, buffersize=94) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 81 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=95) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 95 +> [ 3.389815] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.389815] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.389815] (6:slave@Bourassa) new_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 3.389815] (6:slave@Bourassa) insert_into_buffer: insert event_type=9, timestamp=3.389815, buffersize=96) +> [ 3.389815] (6:slave@Bourassa) insert_into_buffer: inserted at end, pos = 96 +> [ 3.389815] (1:master@Tremblay) new value finish_send_tasks, child of msmark +> [ 3.389815] (1:master@Tremblay) EntityValue finish_send_tasks(25), child of msmark(15) +> [ 3.389815] (1:master@Tremblay) new_pajeDefineEntityValue: event_type=5 +> [ 3.389815] (1:master@Tremblay) print_pajeDefineEntityValue: event_type=5 +> [ 3.389815] (1:master@Tremblay) free_paje_event: event_type=5, timestamp=0.000000 +> [ 3.389815] (1:master@Tremblay) new_pajeNewEvent: event_type=16, timestamp=3.389815 +> [ 3.389815] (1:master@Tremblay) insert_into_buffer: insert event_type=16, timestamp=3.389815, buffersize=97) +> [ 3.389815] (1:master@Tremblay) insert_into_buffer: inserted at end, pos = 97 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.173943, buffersize=98) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 38 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=99) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 99 +> [ 3.389815] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.173943, buffersize=100) +> [ 3.389815] (0:@) insert_into_buffer: inserted at 39 +> [ 3.389815] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.389815] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.389815, buffersize=101) +> [ 3.389815] (0:@) insert_into_buffer: inserted at end, pos = 101 +> [ 3.399880] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 3.399880] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.389815, buffersize=102) +> [ 3.399880] (0:@) insert_into_buffer: inserted at end, pos = 102 +> [ 3.399880] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.399880 +> [ 3.399880] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.399880, buffersize=103) +> [ 3.399880] (0:@) insert_into_buffer: inserted at end, pos = 103 +> [ 3.399880] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 3.399880] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.389815, buffersize=104) +> [ 3.399880] (0:@) insert_into_buffer: inserted at 103 +> [ 3.399880] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.399880 +> [ 3.399880] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.399880, buffersize=105) +> [ 3.399880] (0:@) insert_into_buffer: inserted at end, pos = 105 +> [ 3.399880] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.399880] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.405015] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.405015] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.405171] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.405171] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.829285] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.829285] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.173943, buffersize=106) +> [ 3.829285] (0:@) insert_into_buffer: inserted at 40 +> [ 3.829285] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.829285 +> [ 3.829285] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.829285, buffersize=107) +> [ 3.829285] (0:@) insert_into_buffer: inserted at end, pos = 107 +> [ 3.829285] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.829285] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.173943, buffersize=108) +> [ 3.829285] (0:@) insert_into_buffer: inserted at 41 +> [ 3.829285] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.829285 +> [ 3.829285] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.829285, buffersize=109) +> [ 3.829285] (0:@) insert_into_buffer: inserted at end, pos = 109 +> [ 3.829285] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.829285] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.849836] (0:@) TRACE_paje_dump_buffer: dump until 2.869854. starts +> [ 3.849836] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.900952] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.900952] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.869854, buffersize=110) +> [ 3.900952] (0:@) insert_into_buffer: inserted at beginning +> [ 3.900952] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.900952 +> [ 3.900952] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.900952, buffersize=111) +> [ 3.900952] (0:@) insert_into_buffer: inserted at end, pos = 111 +> [ 3.900952] (0:@) new_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.900952] (0:@) insert_into_buffer: insert event_type=9, timestamp=2.869854, buffersize=112) +> [ 3.900952] (0:@) insert_into_buffer: inserted at 1 +> [ 3.900952] (0:@) new_pajeSubVariable: event_type=10, timestamp=3.900952 +> [ 3.900952] (0:@) insert_into_buffer: insert event_type=10, timestamp=3.900952, buffersize=113) +> [ 3.900952] (0:@) insert_into_buffer: inserted at end, pos = 113 +> [ 3.900952] (0:@) TRACE_paje_dump_buffer: dump until 3.389815. starts +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.869854 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.869854 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.869854 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.888006 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=2.888006 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.888006 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=2.888006 +> [ 3.900952] (0:@) print_pajeSetVariable: event_type=8, timestamp=2.890170 +> [ 3.900952] (0:@) free_paje_event: event_type=8, timestamp=2.890170 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.890170 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.890170 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.890170 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.890170 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.890170 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.890170 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.955790 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=2.955790 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=2.955790 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=2.955790 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=2.976340 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.113392 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSetVariable: event_type=8, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=8, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.173943 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.194279 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.340904 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeNewEvent: event_type=16, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=16, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=10, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.389815 +> [ 3.900952] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 3.900952] (0:@) free_paje_event: event_type=9, timestamp=3.389815 +> [ 3.900952] (0:@) TRACE_paje_dump_buffer: ends +> [ 3.914183] (0:@) TRACE_paje_dump_buffer: dump until 3.389815. starts +> [ 3.914183] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.420913] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 4.420913] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.389815, buffersize=6) +> [ 4.420913] (0:@) insert_into_buffer: inserted at beginning +> [ 4.420913] (0:@) new_pajeSubVariable: event_type=10, timestamp=4.420913 +> [ 4.420913] (0:@) insert_into_buffer: insert event_type=10, timestamp=4.420913, buffersize=7) +> [ 4.420913] (0:@) insert_into_buffer: inserted at end, pos = 7 +> [ 4.420913] (0:@) new_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 4.420913] (0:@) insert_into_buffer: insert event_type=9, timestamp=3.389815, buffersize=8) +> [ 4.420913] (0:@) insert_into_buffer: inserted at 1 +> [ 4.420913] (0:@) new_pajeSubVariable: event_type=10, timestamp=4.420913 +> [ 4.420913] (0:@) insert_into_buffer: insert event_type=10, timestamp=4.420913, buffersize=9) +> [ 4.420913] (0:@) insert_into_buffer: inserted at end, pos = 9 +> [ 4.420913] (0:@) TRACE_paje_dump_buffer: dump until 3.405015. starts +> [ 4.420913] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 4.420913] (0:@) free_paje_event: event_type=9, timestamp=3.389815 +> [ 4.420913] (0:@) print_pajeAddVariable: event_type=9, timestamp=3.389815 +> [ 4.420913] (0:@) free_paje_event: event_type=9, timestamp=3.389815 +> [ 4.420913] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.399880 +> [ 4.420913] (0:@) free_paje_event: event_type=10, timestamp=3.399880 +> [ 4.420913] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.399880 +> [ 4.420913] (0:@) free_paje_event: event_type=10, timestamp=3.399880 +> [ 4.420913] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 3.405015. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) Simulation time 4.44125 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.829285 +> [ 4.441249] (0:@) free_paje_event: event_type=10, timestamp=3.829285 +> [ 4.441249] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.829285 +> [ 4.441249] (0:@) free_paje_event: event_type=10, timestamp=3.829285 +> [ 4.441249] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.900952 +> [ 4.441249] (0:@) free_paje_event: event_type=10, timestamp=3.900952 +> [ 4.441249] (0:@) print_pajeSubVariable: event_type=10, timestamp=3.900952 +> [ 4.441249] (0:@) free_paje_event: event_type=10, timestamp=3.900952 +> [ 4.441249] (0:@) print_pajeSubVariable: event_type=10, timestamp=4.420913 +> [ 4.441249] (0:@) free_paje_event: event_type=10, timestamp=4.420913 +> [ 4.441249] (0:@) print_pajeSubVariable: event_type=10, timestamp=4.420913 +> [ 4.441249] (0:@) free_paje_event: event_type=10, timestamp=4.420913 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) destroy container Fafard +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container Tremblay +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 0 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 1 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 2 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 3 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 4 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 5 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 6 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 7 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 8 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container 9 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container Bourassa +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container Jupiter +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container Ginette +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) destroy container AS0 +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: dump until 4.441249. starts +> [ 4.441249] (0:@) TRACE_paje_dump_buffer: ends +> [ 4.441249] (0:@) new_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) print_pajeDestroyContainer: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) free_paje_event: event_type=7, timestamp=4.441249 +> [ 4.441249] (0:@) Filename tracing/ms.trace is closed $ $SG_TEST_EXENV cat tracing/ms.trace > %EventDef PajeDefineContainerType 0 @@ -3689,7 +3223,7 @@ $ $SG_TEST_EXENV cat tracing/ms.trace > %EndEventDef > %EventDef PajeDefineEventType 3 > % Alias string -> % EntityType string +> % ContainerType string > % Name string > % Color color > %EndEventDef @@ -3716,46 +3250,46 @@ $ $SG_TEST_EXENV cat tracing/ms.trace > %EventDef PajeDestroyContainer 7 > % Time date > % Type string -> % Container string +> % Name string > %EndEventDef > %EventDef PajeSetVariable 8 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeAddVariable 9 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSubVariable 10 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSetState 11 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePushState 12 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePopState 13 > % Time date -> % EntityType string +> % Type string > % Container string > %EndEventDef > %EventDef PajeStartLink 14 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % SourceContainer string @@ -3763,7 +3297,7 @@ $ $SG_TEST_EXENV cat tracing/ms.trace > %EndEventDef > %EventDef PajeEndLink 15 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % DestContainer string @@ -3771,754 +3305,654 @@ $ $SG_TEST_EXENV cat tracing/ms.trace > %EndEventDef > %EventDef PajeNewEvent 16 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef -> 0 1 0 L1 -> 6 0 1 1 0 AS0 -> 0 2 1 HOST -> 6 0 2 2 1 Tremblay -> 1 3 2 power "1 1 1" -> 1 4 2 power_used "0.5 0.5 0.5" -> 6 0 3 2 1 Jupiter -> 6 0 4 2 1 Fafard -> 6 0 5 2 1 Ginette -> 6 0 6 2 1 Bourassa -> 0 5 1 ROUTER -> 6 0 7 5 1 R.4-3 -> 6 0 8 5 1 R.3-2-5 -> 6 0 9 5 1 R.2-0 -> 6 0 10 5 1 R.1-0 -> 6 0 11 5 1 R.1-8-6 -> 6 0 12 5 1 R.6-7 -> 0 6 1 LINK -> 6 0 13 6 1 6 -> 1 7 6 bandwidth "1 1 1" -> 1 8 6 latency "1 1 1" -> 1 9 6 bandwidth_used "0.5 0.5 0.5" -> 6 0 14 6 1 11 -> 6 0 15 6 1 3 -> 6 0 16 6 1 7 -> 6 0 17 6 1 9 -> 6 0 18 6 1 12 -> 6 0 19 6 1 2 -> 6 0 20 6 1 8 -> 6 0 21 6 1 1 -> 6 0 22 6 1 4 -> 6 0 23 6 1 0 -> 6 0 24 6 1 10 -> 6 0 25 6 1 5 -> 6 0 26 6 1 loopback -> 4 10 1 2 6 HOST-LINK -> 4 11 1 6 5 LINK-ROUTER -> 4 12 1 6 6 LINK-LINK -> 4 13 1 6 2 LINK-HOST -> 4 14 1 5 6 ROUTER-LINK -> 8 0 3 2 98095000.000000 -> 8 0 3 3 76296000.000000 -> 8 0 3 4 76296000.000000 -> 8 0 3 5 48492000.000000 -> 8 0 3 6 48492000.000000 -> 8 0 7 13 41279125.000000 -> 8 0 8 13 0.000060 -> 8 0 7 14 252750.000000 -> 8 0 8 14 0.005705 -> 8 0 7 15 34285622.000000 -> 8 0 8 15 0.000514 -> 8 0 7 16 11618875.000000 -> 8 0 8 16 0.000190 -> 8 0 7 17 7209750.000000 -> 8 0 8 17 0.001462 -> 8 0 7 18 1792625.000000 -> 8 0 8 18 0.007878 -> 8 0 7 19 22222222.000000 -> 8 0 8 19 0.000137 -> 8 0 7 20 8158000.000000 -> 8 0 8 20 0.000271 -> 8 0 7 21 34285625.000000 -> 8 0 8 21 0.000514 -> 8 0 7 22 10099625.000000 -> 8 0 8 22 0.000480 -> 8 0 7 23 41279125.000000 -> 8 0 8 23 0.000060 -> 8 0 7 24 4679750.000000 -> 8 0 8 24 0.000849 -> 8 0 7 25 27946250.000000 -> 8 0 8 25 0.000278 -> 8 0 7 26 498000000.000000 -> 8 0 8 26 0.000015 -> 14 0 10 1 G 4 0 -> 15 0 10 1 G 26 0 -> 14 0 10 1 G 4 1 -> 15 0 10 1 G 20 1 -> 14 0 11 1 G 20 2 -> 15 0 11 1 G 11 2 -> 14 0 12 1 G 20 3 -> 15 0 12 1 G 21 3 -> 14 0 12 1 G 21 4 -> 15 0 12 1 G 23 4 -> 14 0 12 1 G 23 5 -> 15 0 12 1 G 19 5 -> 14 0 12 1 G 19 6 -> 15 0 12 1 G 15 6 -> 14 0 12 1 G 15 7 -> 15 0 12 1 G 22 7 -> 14 0 13 1 G 22 8 -> 15 0 13 1 G 2 8 -> 14 0 12 1 G 20 9 -> 15 0 12 1 G 13 9 -> 14 0 12 1 G 13 10 -> 15 0 12 1 G 16 10 -> 14 0 13 1 G 16 11 -> 15 0 13 1 G 6 11 -> 14 0 12 1 G 22 12 -> 15 0 12 1 G 17 12 -> 14 0 13 1 G 17 13 -> 15 0 13 1 G 3 13 -> 14 0 12 1 G 19 14 -> 15 0 12 1 G 25 14 -> 14 0 13 1 G 25 15 -> 15 0 13 1 G 5 15 -> 14 0 14 1 G 9 16 -> 15 0 14 1 G 19 16 -> 14 0 11 1 G 19 17 -> 15 0 11 1 G 8 17 -> 14 0 14 1 G 9 18 -> 15 0 14 1 G 23 18 -> 14 0 11 1 G 23 19 -> 15 0 11 1 G 10 19 -> 14 0 14 1 G 7 20 -> 15 0 14 1 G 15 20 -> 14 0 11 1 G 15 21 -> 15 0 11 1 G 8 21 -> 14 0 14 1 G 7 22 -> 15 0 14 1 G 22 22 -> 14 0 14 1 G 8 23 -> 15 0 14 1 G 25 23 -> 14 0 14 1 G 11 24 -> 15 0 14 1 G 13 24 -> 14 0 11 1 G 13 25 -> 15 0 11 1 G 12 25 -> 14 0 14 1 G 11 26 -> 15 0 14 1 G 21 26 -> 14 0 11 1 G 21 27 -> 15 0 11 1 G 10 27 -> 14 0 14 1 G 12 28 -> 15 0 14 1 G 16 28 -> 14 0 10 1 G 2 29 -> 15 0 10 1 G 26 29 -> 14 0 12 1 G 21 30 -> 15 0 12 1 G 13 30 -> 14 0 10 1 G 2 31 -> 15 0 10 1 G 17 31 -> 14 0 12 1 G 15 32 -> 15 0 12 1 G 25 32 -> 14 0 10 1 G 6 33 -> 15 0 10 1 G 26 33 -> 14 0 10 1 G 3 34 -> 15 0 10 1 G 26 34 -> 14 0 10 1 G 5 35 -> 15 0 10 1 G 26 35 -> 1 15 2 is_slave "1 1 1" -> 1 16 2 is_master "1 1 1" -> 1 17 2 task_creation "1 1 1" -> 1 18 2 task_computation "1 1 1" -> 3 19 0 msmark "1 1 1" -> 1 20 6 compute "1 0 0" -> 1 21 2 compute "1 0 0" -> 1 22 6 finalize "0 1 0" -> 1 23 2 finalize "0 1 0" -> 1 24 6 request "0.000000 0.000985 0.041631" -> 1 25 2 request "0.000000 0.000985 0.041631" -> 1 26 6 report "0.176643 0.364602 0.091331" -> 1 27 2 report "0.176643 0.364602 0.091331" -> 5 28 19 start_send_tasks "(null)" -> 8 0 16 2 1.000000 -> 16 0 19 0 28 -> 8 0 17 2 0.000000 -> 8 0 15 2 1.000000 -> 8 0 15 3 1.000000 -> 8 0 15 4 1.000000 -> 8 0 15 5 1.000000 -> 8 0 15 6 1.000000 -> 8 0.000156 9 26 0.000000 -> 9 0.000156 9 26 458160000.000000 -> 8 0.000156 20 26 0.000000 -> 9 0.000156 20 26 458160000.000000 -> 10 0.002339 9 26 458160000.000000 -> 10 0.002339 20 26 458160000.000000 -> 9 0.002339 18 2 50000000.000000 -> 8 0.002339 17 2 1.000000 -> 8 0.002339 4 2 0.000000 -> 9 0.002339 4 2 98095000.000000 -> 8 0.002339 21 2 0.000000 -> 9 0.002339 21 2 98095000.000000 -> 8 0.017538 9 17 0.000000 -> 9 0.017538 9 17 6632970.000000 -> 8 0.017538 20 17 0.000000 -> 9 0.017538 20 17 6632970.000000 -> 10 0.168300 9 17 6632970.000000 -> 10 0.168300 20 17 6632970.000000 -> 9 0.168300 18 3 50000000.000000 -> 8 0.168300 17 2 2.000000 -> 10 0.168300 4 2 98095000.000000 -> 10 0.168300 21 2 98095000.000000 -> 9 0.168300 4 2 98095000.000000 -> 9 0.168300 21 2 98095000.000000 -> 8 0.168300 4 3 0.000000 -> 9 0.168300 4 3 76296000.000000 -> 8 0.168300 21 3 0.000000 -> 9 0.168300 21 3 76296000.000000 -> 8 0.188851 9 22 0.000000 -> 9 0.188851 9 22 5060664.718311 -> 8 0.188851 20 22 0.000000 -> 9 0.188851 20 22 5060664.718311 -> 8 0.188851 9 15 0.000000 -> 9 0.188851 9 15 5060664.718311 -> 8 0.188851 20 15 0.000000 -> 9 0.188851 20 15 5060664.718311 -> 8 0.188851 9 19 0.000000 -> 9 0.188851 9 19 5060664.718311 -> 8 0.188851 20 19 0.000000 -> 9 0.188851 20 19 5060664.718311 -> 8 0.188851 9 23 0.000000 -> 9 0.188851 9 23 5060664.718311 -> 8 0.188851 20 23 0.000000 -> 9 0.188851 20 23 5060664.718311 -> 8 0.188851 9 21 0.000000 -> 9 0.188851 9 21 5060664.718311 -> 8 0.188851 20 21 0.000000 -> 9 0.188851 20 21 5060664.718311 -> 8 0.188851 9 20 0.000000 -> 9 0.188851 9 20 5060664.718311 -> 8 0.188851 20 20 0.000000 -> 9 0.188851 20 20 5060664.718311 -> 10 0.386454 9 22 5060664.718311 -> 10 0.386454 20 22 5060664.718311 -> 10 0.386454 9 15 5060664.718311 -> 10 0.386454 20 15 5060664.718311 -> 10 0.386454 9 19 5060664.718311 -> 10 0.386454 20 19 5060664.718311 -> 10 0.386454 9 23 5060664.718311 -> 10 0.386454 20 23 5060664.718311 -> 10 0.386454 9 21 5060664.718311 -> 10 0.386454 20 21 5060664.718311 -> 10 0.386454 9 20 5060664.718311 -> 10 0.386454 20 20 5060664.718311 -> 9 0.386454 18 4 50000000.000000 -> 8 0.386454 17 2 3.000000 -> 10 0.386454 4 2 98095000.000000 -> 10 0.386454 21 2 98095000.000000 -> 9 0.386454 4 2 98095000.000000 -> 9 0.386454 21 2 98095000.000000 -> 8 0.386454 4 4 0.000000 -> 9 0.386454 4 4 76296000.000000 -> 8 0.386454 21 4 0.000000 -> 9 0.386454 21 4 76296000.000000 -> 9 0.399685 9 22 7859911.230163 -> 9 0.399685 20 22 7859911.230163 -> 9 0.399685 9 15 7859911.230163 -> 9 0.399685 20 15 7859911.230163 -> 8 0.399685 9 25 0.000000 -> 9 0.399685 9 25 7859911.230163 -> 8 0.399685 20 25 0.000000 -> 9 0.399685 20 25 7859911.230163 -> 10 0.512049 4 2 98095000.000000 -> 10 0.512049 21 2 98095000.000000 -> 10 0.512049 9 22 7859911.230163 -> 10 0.512049 20 22 7859911.230163 -> 10 0.512049 9 15 7859911.230163 -> 10 0.512049 20 15 7859911.230163 -> 10 0.512049 9 25 7859911.230163 -> 10 0.512049 20 25 7859911.230163 -> 9 0.512049 9 22 7859911.230163 -> 9 0.512049 20 22 7859911.230163 -> 9 0.512049 9 15 7859911.230163 -> 9 0.512049 20 15 7859911.230163 -> 9 0.512049 9 25 7859911.230163 -> 9 0.512049 20 25 7859911.230163 -> 10 0.526913 9 22 7859911.230163 -> 10 0.526913 20 22 7859911.230163 -> 10 0.526913 9 15 7859911.230163 -> 10 0.526913 20 15 7859911.230163 -> 10 0.526913 9 25 7859911.230163 -> 10 0.526913 20 25 7859911.230163 -> 9 0.526913 18 5 50000000.000000 -> 8 0.526913 17 2 4.000000 -> 8 0.526913 4 5 0.000000 -> 9 0.526913 4 5 48492000.000000 -> 8 0.526913 21 5 0.000000 -> 9 0.526913 21 5 48492000.000000 -> 9 0.547249 9 22 5114134.701194 -> 9 0.547249 20 22 5114134.701194 -> 9 0.547249 9 15 5114134.701194 -> 9 0.547249 20 15 5114134.701194 -> 9 0.547249 9 19 5114134.701194 -> 9 0.547249 20 19 5114134.701194 -> 9 0.547249 9 23 5114134.701194 -> 9 0.547249 20 23 5114134.701194 -> 9 0.547249 9 21 5114134.701194 -> 9 0.547249 20 21 5114134.701194 -> 8 0.547249 9 13 0.000000 -> 9 0.547249 9 13 5114134.701194 -> 8 0.547249 20 13 0.000000 -> 9 0.547249 20 13 5114134.701194 -> 8 0.547249 9 16 0.000000 -> 9 0.547249 9 16 5114134.701194 -> 8 0.547249 20 16 0.000000 -> 9 0.547249 20 16 5114134.701194 -> 10 0.742786 9 22 5114134.701194 -> 10 0.742786 20 22 5114134.701194 -> 10 0.742786 9 15 5114134.701194 -> 10 0.742786 20 15 5114134.701194 -> 10 0.742786 9 19 5114134.701194 -> 10 0.742786 20 19 5114134.701194 -> 10 0.742786 9 23 5114134.701194 -> 10 0.742786 20 23 5114134.701194 -> 10 0.742786 9 21 5114134.701194 -> 10 0.742786 20 21 5114134.701194 -> 10 0.742786 9 13 5114134.701194 -> 10 0.742786 20 13 5114134.701194 -> 10 0.742786 9 16 5114134.701194 -> 10 0.742786 20 16 5114134.701194 -> 9 0.742786 18 6 50000000.000000 -> 8 0.742786 17 2 5.000000 -> 8 0.742786 4 6 0.000000 -> 9 0.742786 4 6 48492000.000000 -> 8 0.742786 21 6 0.000000 -> 9 0.742786 21 6 48492000.000000 -> 9 0.742942 9 26 458160000.000000 -> 9 0.742942 20 26 458160000.000000 -> 10 0.745124 9 26 458160000.000000 -> 10 0.745124 20 26 458160000.000000 -> 9 0.745124 18 2 50000000.000000 -> 8 0.745124 17 2 6.000000 -> 9 0.745124 4 2 98095000.000000 -> 9 0.745124 21 2 98095000.000000 -> 10 0.823643 4 3 76296000.000000 -> 10 0.823643 21 3 76296000.000000 -> 9 0.838843 9 17 6632970.000000 -> 10 0.989605 9 17 6632970.000000 -> 8 0.989605 17 2 7.000000 -> 9 0.989605 18 3 50000000.000000 -> 10 0.989605 4 2 98095000.000000 -> 10 0.989605 21 2 98095000.000000 -> 9 0.989605 4 2 98095000.000000 -> 9 0.989605 21 2 98095000.000000 -> 9 0.989605 4 3 76296000.000000 -> 9 0.989605 21 3 76296000.000000 -> 10 1.041796 4 4 76296000.000000 -> 10 1.041796 21 4 76296000.000000 -> 9 1.062347 9 22 5060664.718311 -> 9 1.062347 9 15 5060664.718311 -> 9 1.062347 9 19 5060664.718311 -> 9 1.062347 9 23 5060664.718311 -> 9 1.062347 9 21 5060664.718311 -> 9 1.062347 9 20 5060664.718311 -> 10 1.254834 4 2 98095000.000000 -> 10 1.254834 21 2 98095000.000000 -> 10 1.254834 9 22 5060664.718311 -> 10 1.254834 9 15 5060664.718311 -> 10 1.254834 9 19 5060664.718311 -> 10 1.254834 9 23 5060664.718311 -> 10 1.254834 9 21 5060664.718311 -> 10 1.254834 9 20 5060664.718311 -> 9 1.254834 9 22 5060664.718311 -> 9 1.254834 9 15 5060664.718311 -> 9 1.254834 9 19 5060664.718311 -> 9 1.254834 9 23 5060664.718311 -> 9 1.254834 9 21 5060664.718311 -> 9 1.254834 9 20 5060664.718311 -> 10 1.259949 9 22 5060664.718311 -> 10 1.259949 9 15 5060664.718311 -> 10 1.259949 9 19 5060664.718311 -> 10 1.259949 9 23 5060664.718311 -> 10 1.259949 9 21 5060664.718311 -> 10 1.259949 9 20 5060664.718311 -> 8 1.259949 17 2 8.000000 -> 9 1.259949 18 4 50000000.000000 -> 9 1.259949 4 4 76296000.000000 -> 9 1.259949 21 4 76296000.000000 -> 9 1.260105 9 26 458160000.000000 -> 9 1.260105 20 26 458160000.000000 -> 10 1.262288 9 26 458160000.000000 -> 10 1.262288 20 26 458160000.000000 -> 9 1.262288 18 2 50000000.000000 -> 8 1.262288 17 2 9.000000 -> 9 1.262288 4 2 98095000.000000 -> 9 1.262288 21 2 98095000.000000 -> 10 1.558011 4 5 48492000.000000 -> 10 1.558011 21 5 48492000.000000 -> 9 1.571243 9 22 7859911.230163 -> 9 1.571243 9 15 7859911.230163 -> 9 1.571243 9 25 7859911.230163 -> 10 1.644947 4 3 76296000.000000 -> 10 1.644947 21 3 76296000.000000 -> 10 1.644947 9 22 7859911.230163 -> 10 1.644947 9 15 7859911.230163 -> 10 1.644947 9 25 7859911.230163 -> 9 1.644947 9 22 7859911.230163 -> 9 1.644947 9 15 7859911.230163 -> 9 1.644947 9 25 7859911.230163 -> 10 1.698471 9 22 7859911.230163 -> 10 1.698471 9 15 7859911.230163 -> 10 1.698471 9 25 7859911.230163 -> 8 1.698471 17 2 10.000000 -> 9 1.698471 18 5 50000000.000000 -> 10 1.698471 4 2 98095000.000000 -> 10 1.698471 21 2 98095000.000000 -> 9 1.698471 4 2 98095000.000000 -> 9 1.698471 21 2 98095000.000000 -> 9 1.698471 4 5 48492000.000000 -> 9 1.698471 21 5 48492000.000000 -> 9 1.713671 9 17 6632970.000000 -> 9 1.713671 20 17 6632970.000000 -> 10 1.771998 4 2 98095000.000000 -> 10 1.771998 21 2 98095000.000000 -> 10 1.771998 9 17 6632970.000000 -> 10 1.771998 20 17 6632970.000000 -> 9 1.771998 9 17 6632970.000000 -> 9 1.771998 20 17 6632970.000000 -> 10 1.773883 4 6 48492000.000000 -> 10 1.773883 21 6 48492000.000000 -> 10 1.773883 9 17 6632970.000000 -> 10 1.773883 20 17 6632970.000000 -> 9 1.773883 9 17 6632970.000000 -> 9 1.773883 20 17 6632970.000000 -> 10 1.864433 9 17 6632970.000000 -> 10 1.864433 20 17 6632970.000000 -> 9 1.864433 18 3 50000000.000000 -> 8 1.864433 17 2 11.000000 -> 9 1.864433 4 3 76296000.000000 -> 9 1.864433 21 3 76296000.000000 -> 9 1.864589 9 26 458160000.000000 -> 9 1.864589 20 26 458160000.000000 -> 10 1.866771 9 26 458160000.000000 -> 10 1.866771 20 26 458160000.000000 -> 9 1.866771 18 2 50000000.000000 -> 8 1.866771 17 2 12.000000 -> 9 1.866771 4 2 98095000.000000 -> 9 1.866771 21 2 98095000.000000 -> 9 1.887107 9 22 5114134.701194 -> 9 1.887107 20 22 5114134.701194 -> 9 1.887107 9 15 5114134.701194 -> 9 1.887107 20 15 5114134.701194 -> 9 1.887107 9 19 5114134.701194 -> 9 1.887107 20 19 5114134.701194 -> 9 1.887107 9 23 5114134.701194 -> 9 1.887107 20 23 5114134.701194 -> 9 1.887107 9 21 5114134.701194 -> 9 1.887107 20 21 5114134.701194 -> 9 1.887107 9 13 5114134.701194 -> 9 1.887107 20 13 5114134.701194 -> 9 1.887107 9 16 5114134.701194 -> 9 1.887107 20 16 5114134.701194 -> 10 1.915291 4 4 76296000.000000 -> 10 1.915291 21 4 76296000.000000 -> 10 1.915291 9 22 5114134.701194 -> 10 1.915291 20 22 5114134.701194 -> 10 1.915291 9 15 5114134.701194 -> 10 1.915291 20 15 5114134.701194 -> 10 1.915291 9 19 5114134.701194 -> 10 1.915291 20 19 5114134.701194 -> 10 1.915291 9 23 5114134.701194 -> 10 1.915291 20 23 5114134.701194 -> 10 1.915291 9 21 5114134.701194 -> 10 1.915291 20 21 5114134.701194 -> 10 1.915291 9 13 5114134.701194 -> 10 1.915291 20 13 5114134.701194 -> 10 1.915291 9 16 5114134.701194 -> 10 1.915291 20 16 5114134.701194 -> 9 1.915291 9 22 5114134.701194 -> 9 1.915291 20 22 5114134.701194 -> 9 1.915291 9 15 5114134.701194 -> 9 1.915291 20 15 5114134.701194 -> 9 1.915291 9 19 5114134.701194 -> 9 1.915291 20 19 5114134.701194 -> 9 1.915291 9 23 5114134.701194 -> 9 1.915291 20 23 5114134.701194 -> 9 1.915291 9 21 5114134.701194 -> 9 1.915291 20 21 5114134.701194 -> 9 1.915291 9 13 5114134.701194 -> 9 1.915291 20 13 5114134.701194 -> 9 1.915291 9 16 5114134.701194 -> 9 1.915291 20 16 5114134.701194 -> 10 2.082643 9 22 5114134.701194 -> 10 2.082643 20 22 5114134.701194 -> 10 2.082643 9 15 5114134.701194 -> 10 2.082643 20 15 5114134.701194 -> 10 2.082643 9 19 5114134.701194 -> 10 2.082643 20 19 5114134.701194 -> 10 2.082643 9 23 5114134.701194 -> 10 2.082643 20 23 5114134.701194 -> 10 2.082643 9 21 5114134.701194 -> 10 2.082643 20 21 5114134.701194 -> 10 2.082643 9 13 5114134.701194 -> 10 2.082643 20 13 5114134.701194 -> 10 2.082643 9 16 5114134.701194 -> 10 2.082643 20 16 5114134.701194 -> 9 2.082643 18 6 50000000.000000 -> 8 2.082643 17 2 13.000000 -> 10 2.082643 4 2 98095000.000000 -> 10 2.082643 21 2 98095000.000000 -> 9 2.082643 4 2 98095000.000000 -> 9 2.082643 21 2 98095000.000000 -> 9 2.082643 4 6 48492000.000000 -> 9 2.082643 21 6 48492000.000000 -> 9 2.103194 9 22 5060664.718311 -> 9 2.103194 20 22 5060664.718311 -> 9 2.103194 9 15 5060664.718311 -> 9 2.103194 20 15 5060664.718311 -> 9 2.103194 9 19 5060664.718311 -> 9 2.103194 20 19 5060664.718311 -> 9 2.103194 9 23 5060664.718311 -> 9 2.103194 20 23 5060664.718311 -> 9 2.103194 9 21 5060664.718311 -> 9 2.103194 20 21 5060664.718311 -> 9 2.103194 9 20 5060664.718311 -> 9 2.103194 20 20 5060664.718311 -> 10 2.300797 9 22 5060664.718311 -> 10 2.300797 20 22 5060664.718311 -> 10 2.300797 9 15 5060664.718311 -> 10 2.300797 20 15 5060664.718311 -> 10 2.300797 9 19 5060664.718311 -> 10 2.300797 20 19 5060664.718311 -> 10 2.300797 9 23 5060664.718311 -> 10 2.300797 20 23 5060664.718311 -> 10 2.300797 9 21 5060664.718311 -> 10 2.300797 20 21 5060664.718311 -> 10 2.300797 9 20 5060664.718311 -> 10 2.300797 20 20 5060664.718311 -> 9 2.300797 18 4 50000000.000000 -> 8 2.300797 17 2 14.000000 -> 10 2.300797 4 2 98095000.000000 -> 10 2.300797 21 2 98095000.000000 -> 9 2.300797 4 2 98095000.000000 -> 9 2.300797 21 2 98095000.000000 -> 9 2.300797 4 4 76296000.000000 -> 9 2.300797 21 4 76296000.000000 -> 10 2.376481 4 2 98095000.000000 -> 10 2.376481 21 2 98095000.000000 -> 9 2.376637 9 26 458160000.000000 -> 10 2.378820 9 26 458160000.000000 -> 8 2.378820 17 2 15.000000 -> 9 2.378820 18 2 50000000.000000 -> 9 2.378820 4 2 98095000.000000 -> 9 2.378820 21 2 98095000.000000 -> 10 2.519775 4 3 76296000.000000 -> 10 2.519775 21 3 76296000.000000 -> 9 2.534975 9 17 6632970.000000 -> 10 2.685737 9 17 6632970.000000 -> 8 2.685737 17 2 16.000000 -> 9 2.685737 18 3 50000000.000000 -> 10 2.685737 4 2 98095000.000000 -> 10 2.685737 21 2 98095000.000000 -> 9 2.685737 4 2 98095000.000000 -> 9 2.685737 21 2 98095000.000000 -> 9 2.685737 4 3 76296000.000000 -> 9 2.685737 21 3 76296000.000000 -> 10 2.729569 4 5 48492000.000000 -> 10 2.729569 21 5 48492000.000000 -> 9 2.742800 9 22 7859911.230163 -> 9 2.742800 9 15 7859911.230163 -> 9 2.742800 9 25 7859911.230163 -> 10 2.870028 9 22 7859911.230163 -> 10 2.870028 9 15 7859911.230163 -> 10 2.870028 9 25 7859911.230163 -> 8 2.870028 17 2 17.000000 -> 9 2.870028 18 5 50000000.000000 -> 10 2.870028 4 2 98095000.000000 -> 10 2.870028 21 2 98095000.000000 -> 9 2.870028 4 2 98095000.000000 -> 9 2.870028 21 2 98095000.000000 -> 5 29 19 finish_send_tasks "(null)" -> 9 2.870028 4 5 48492000.000000 -> 9 2.870028 21 5 48492000.000000 -> 10 2.888530 4 2 98095000.000000 -> 10 2.888530 21 2 98095000.000000 -> 9 2.888686 9 26 458160000.000000 -> 10 2.890868 9 26 458160000.000000 -> 8 2.890868 17 2 18.000000 -> 9 2.890868 18 2 50000000.000000 -> 9 2.890868 4 2 98095000.000000 -> 9 2.890868 21 2 98095000.000000 -> 10 2.956139 4 4 76296000.000000 -> 10 2.956139 21 4 76296000.000000 -> 9 2.976690 9 22 5060664.718311 -> 9 2.976690 9 15 5060664.718311 -> 9 2.976690 9 19 5060664.718311 -> 9 2.976690 9 23 5060664.718311 -> 9 2.976690 9 21 5060664.718311 -> 9 2.976690 9 20 5060664.718311 -> 10 3.113741 4 6 48492000.000000 -> 10 3.113741 21 6 48492000.000000 -> 10 3.113741 9 22 5060664.718311 -> 10 3.113741 9 15 5060664.718311 -> 10 3.113741 9 19 5060664.718311 -> 10 3.113741 9 23 5060664.718311 -> 10 3.113741 9 21 5060664.718311 -> 10 3.113741 9 20 5060664.718311 -> 9 3.113741 9 22 5060664.718311 -> 9 3.113741 9 15 5060664.718311 -> 9 3.113741 9 19 5060664.718311 -> 9 3.113741 9 23 5060664.718311 -> 9 3.113741 9 21 5060664.718311 -> 9 3.113741 9 20 5060664.718311 -> 10 3.174292 9 22 5060664.718311 -> 10 3.174292 9 15 5060664.718311 -> 10 3.174292 9 19 5060664.718311 -> 10 3.174292 9 23 5060664.718311 -> 10 3.174292 9 21 5060664.718311 -> 10 3.174292 9 20 5060664.718311 -> 8 3.174292 17 2 19.000000 -> 9 3.174292 18 4 50000000.000000 -> 10 3.174292 4 2 98095000.000000 -> 10 3.174292 21 2 98095000.000000 -> 9 3.174292 4 2 98095000.000000 -> 9 3.174292 21 2 98095000.000000 -> 9 3.174292 4 4 76296000.000000 -> 9 3.174292 21 4 76296000.000000 -> 9 3.194628 9 22 5114134.701194 -> 9 3.194628 20 22 5114134.701194 -> 9 3.194628 9 15 5114134.701194 -> 9 3.194628 20 15 5114134.701194 -> 9 3.194628 9 19 5114134.701194 -> 9 3.194628 20 19 5114134.701194 -> 9 3.194628 9 23 5114134.701194 -> 9 3.194628 20 23 5114134.701194 -> 9 3.194628 9 21 5114134.701194 -> 9 3.194628 20 21 5114134.701194 -> 9 3.194628 9 13 5114134.701194 -> 9 3.194628 20 13 5114134.701194 -> 9 3.194628 9 16 5114134.701194 -> 9 3.194628 20 16 5114134.701194 -> 10 3.341079 4 3 76296000.000000 -> 10 3.341079 21 3 76296000.000000 -> 10 3.341079 9 22 5114134.701194 -> 10 3.341079 20 22 5114134.701194 -> 10 3.341079 9 15 5114134.701194 -> 10 3.341079 20 15 5114134.701194 -> 10 3.341079 9 19 5114134.701194 -> 10 3.341079 20 19 5114134.701194 -> 10 3.341079 9 23 5114134.701194 -> 10 3.341079 20 23 5114134.701194 -> 10 3.341079 9 21 5114134.701194 -> 10 3.341079 20 21 5114134.701194 -> 10 3.341079 9 13 5114134.701194 -> 10 3.341079 20 13 5114134.701194 -> 10 3.341079 9 16 5114134.701194 -> 10 3.341079 20 16 5114134.701194 -> 9 3.341079 9 22 5114134.701194 -> 9 3.341079 20 22 5114134.701194 -> 9 3.341079 9 15 5114134.701194 -> 9 3.341079 20 15 5114134.701194 -> 9 3.341079 9 19 5114134.701194 -> 9 3.341079 20 19 5114134.701194 -> 9 3.341079 9 23 5114134.701194 -> 9 3.341079 20 23 5114134.701194 -> 9 3.341079 9 21 5114134.701194 -> 9 3.341079 20 21 5114134.701194 -> 9 3.341079 9 13 5114134.701194 -> 9 3.341079 20 13 5114134.701194 -> 9 3.341079 9 16 5114134.701194 -> 9 3.341079 20 16 5114134.701194 -> 10 3.390164 9 22 5114134.701194 -> 10 3.390164 20 22 5114134.701194 -> 10 3.390164 9 15 5114134.701194 -> 10 3.390164 20 15 5114134.701194 -> 10 3.390164 9 19 5114134.701194 -> 10 3.390164 20 19 5114134.701194 -> 10 3.390164 9 23 5114134.701194 -> 10 3.390164 20 23 5114134.701194 -> 10 3.390164 9 21 5114134.701194 -> 10 3.390164 20 21 5114134.701194 -> 10 3.390164 9 13 5114134.701194 -> 10 3.390164 20 13 5114134.701194 -> 10 3.390164 9 16 5114134.701194 -> 10 3.390164 20 16 5114134.701194 -> 9 3.390164 18 6 50000000.000000 -> 16 3.390164 19 0 29 -> 10 3.390164 4 2 98095000.000000 -> 10 3.390164 21 2 98095000.000000 -> 9 3.390164 4 2 98095000.000000 -> 9 3.390164 21 2 98095000.000000 -> 9 3.390164 4 6 48492000.000000 -> 9 3.390164 21 6 48492000.000000 -> 10 3.400578 4 2 98095000.000000 -> 10 3.400578 21 2 98095000.000000 -> 10 3.829634 4 4 76296000.000000 -> 10 3.829634 21 4 76296000.000000 -> 10 3.901126 4 5 48492000.000000 -> 10 3.901126 21 5 48492000.000000 -> 10 4.421262 4 6 48492000.000000 -> 10 4.421262 21 6 48492000.000000 -> 7 4.441598 2 4 -> 7 4.441598 5 9 -> 7 4.441598 5 7 -> 7 4.441598 5 8 -> 7 4.441598 5 11 -> 7 4.441598 5 12 -> 7 4.441598 2 2 -> 7 4.441598 6 24 -> 7 4.441598 6 14 -> 7 4.441598 6 18 -> 7 4.441598 6 26 -> 7 4.441598 5 10 -> 7 4.441598 6 23 -> 7 4.441598 6 21 -> 7 4.441598 6 19 -> 7 4.441598 6 15 -> 7 4.441598 6 22 -> 7 4.441598 6 25 -> 7 4.441598 6 13 -> 7 4.441598 6 16 -> 7 4.441598 6 20 -> 7 4.441598 6 17 -> 7 4.441598 2 6 -> 7 4.441598 2 3 -> 7 4.441598 2 5 -> 7 4.441598 1 1 -> 7 4.441598 0 0 +> 0 1 0 HOST +> 6 0 1 1 0 "Tremblay" +> 1 2 1 power "1 1 1" +> 1 3 1 power_used "0.5 0.5 0.5" +> 6 0 2 1 0 "Jupiter" +> 6 0 3 1 0 "Fafard" +> 6 0 4 1 0 "Ginette" +> 6 0 5 1 0 "Bourassa" +> 0 4 0 LINK +> 6 0 6 4 0 "6" +> 1 5 4 bandwidth "1 1 1" +> 1 6 4 latency "1 1 1" +> 1 7 4 bandwidth_used "0.5 0.5 0.5" +> 6 0 7 4 0 "3" +> 6 0 8 4 0 "7" +> 6 0 9 4 0 "9" +> 6 0 10 4 0 "2" +> 6 0 11 4 0 "8" +> 6 0 12 4 0 "1" +> 6 0 13 4 0 "4" +> 6 0 14 4 0 "0" +> 6 0 15 4 0 "5" +> 4 8 0 1 4 HOST-LINK +> 4 9 0 4 4 LINK-LINK +> 4 10 0 4 1 LINK-HOST +> 8 0 2 1 98095000.000000 +> 8 0 2 2 76296000.000000 +> 8 0 2 3 76296000.000000 +> 8 0 2 4 48492000.000000 +> 8 0 2 5 48492000.000000 +> 8 0 5 6 41279125.000000 +> 8 0 6 6 0.000060 +> 8 0 5 7 34285625.000000 +> 8 0 6 7 0.000514 +> 8 0 5 8 11618875.000000 +> 8 0 6 8 0.000190 +> 8 0 5 9 7209750.000000 +> 8 0 6 9 0.001462 +> 8 0 5 10 118682500.000000 +> 8 0 6 10 0.000137 +> 8 0 5 11 8158000.000000 +> 8 0 6 11 0.000271 +> 8 0 5 12 34285625.000000 +> 8 0 6 12 0.000514 +> 8 0 5 13 10099625.000000 +> 8 0 6 13 0.000480 +> 8 0 5 14 41279125.000000 +> 8 0 6 14 0.000060 +> 8 0 5 15 27946250.000000 +> 8 0 6 15 0.000278 +> 14 0 8 0 G 3 0 +> 15 0 8 0 G 11 0 +> 14 0 9 0 G 11 1 +> 15 0 9 0 G 12 1 +> 14 0 9 0 G 12 2 +> 15 0 9 0 G 14 2 +> 14 0 9 0 G 14 3 +> 15 0 9 0 G 10 3 +> 14 0 9 0 G 10 4 +> 15 0 9 0 G 7 4 +> 14 0 9 0 G 7 5 +> 15 0 9 0 G 13 5 +> 14 0 10 0 G 13 6 +> 15 0 10 0 G 1 6 +> 14 0 9 0 G 11 7 +> 15 0 9 0 G 6 7 +> 14 0 9 0 G 6 8 +> 15 0 9 0 G 8 8 +> 14 0 10 0 G 8 9 +> 15 0 10 0 G 5 9 +> 14 0 9 0 G 13 10 +> 15 0 9 0 G 9 10 +> 14 0 10 0 G 9 11 +> 15 0 10 0 G 2 11 +> 14 0 9 0 G 10 12 +> 15 0 9 0 G 15 12 +> 14 0 10 0 G 15 13 +> 15 0 10 0 G 4 13 +> 14 0 9 0 G 12 14 +> 15 0 9 0 G 6 14 +> 14 0 8 0 G 1 15 +> 15 0 8 0 G 9 15 +> 14 0 9 0 G 7 16 +> 15 0 9 0 G 15 16 +> 1 11 1 is_slave "1 1 1" +> 1 12 1 is_master "1 1 1" +> 1 13 1 task_creation "1 1 1" +> 1 14 1 task_computation "1 1 1" +> 3 15 0 msmark "1 1 1" +> 1 16 4 bcompute "1 0 0" +> 1 17 1 pcompute "1 0 0" +> 1 18 4 bfinalize "0 1 0" +> 1 19 1 pfinalize "0 1 0" +> 1 20 4 brequest "0.000000 0.000985 0.041631" +> 1 21 1 prequest "0.000000 0.000985 0.041631" +> 1 22 4 breport "0.176643 0.364602 0.091331" +> 1 23 1 preport "0.176643 0.364602 0.091331" +> 5 24 15 start_send_tasks "(null)" +> 8 0 12 1 1.000000 +> 16 0 15 0 24 +> 8 0 13 1 0.000000 +> 8 0 11 1 1.000000 +> 8 0 11 2 1.000000 +> 8 0 11 3 1.000000 +> 8 0 11 4 1.000000 +> 8 0 11 5 1.000000 +> 9 0.002164 14 1 50000000.000000 +> 8 0.002164 13 1 1.000000 +> 8 0.002164 3 1 0.000000 +> 9 0.002164 3 1 98095000.000000 +> 8 0.002164 17 1 0.000000 +> 9 0.002164 17 1 98095000.000000 +> 8 0.017364 7 9 0.000000 +> 9 0.017364 7 9 6632970.000000 +> 8 0.017364 16 9 0.000000 +> 9 0.017364 16 9 6632970.000000 +> 10 0.168126 7 9 6632970.000000 +> 10 0.168126 16 9 6632970.000000 +> 9 0.168126 14 2 50000000.000000 +> 8 0.168126 13 1 2.000000 +> 10 0.168126 3 1 98095000.000000 +> 10 0.168126 17 1 98095000.000000 +> 9 0.168126 3 1 98095000.000000 +> 9 0.168126 17 1 98095000.000000 +> 8 0.168126 3 2 0.000000 +> 9 0.168126 3 2 76296000.000000 +> 8 0.168126 17 2 0.000000 +> 9 0.168126 17 2 76296000.000000 +> 8 0.188676 7 13 0.000000 +> 9 0.188676 7 13 5060664.718311 +> 8 0.188676 16 13 0.000000 +> 9 0.188676 16 13 5060664.718311 +> 8 0.188676 7 7 0.000000 +> 9 0.188676 7 7 5060664.718311 +> 8 0.188676 16 7 0.000000 +> 9 0.188676 16 7 5060664.718311 +> 8 0.188676 7 10 0.000000 +> 9 0.188676 7 10 5060664.718311 +> 8 0.188676 16 10 0.000000 +> 9 0.188676 16 10 5060664.718311 +> 8 0.188676 7 14 0.000000 +> 9 0.188676 7 14 5060664.718311 +> 8 0.188676 16 14 0.000000 +> 9 0.188676 16 14 5060664.718311 +> 8 0.188676 7 12 0.000000 +> 9 0.188676 7 12 5060664.718311 +> 8 0.188676 16 12 0.000000 +> 9 0.188676 16 12 5060664.718311 +> 8 0.188676 7 11 0.000000 +> 9 0.188676 7 11 5060664.718311 +> 8 0.188676 16 11 0.000000 +> 9 0.188676 16 11 5060664.718311 +> 10 0.386279 7 13 5060664.718311 +> 10 0.386279 16 13 5060664.718311 +> 10 0.386279 7 7 5060664.718311 +> 10 0.386279 16 7 5060664.718311 +> 10 0.386279 7 10 5060664.718311 +> 10 0.386279 16 10 5060664.718311 +> 10 0.386279 7 14 5060664.718311 +> 10 0.386279 16 14 5060664.718311 +> 10 0.386279 7 12 5060664.718311 +> 10 0.386279 16 12 5060664.718311 +> 10 0.386279 7 11 5060664.718311 +> 10 0.386279 16 11 5060664.718311 +> 9 0.386279 14 3 50000000.000000 +> 8 0.386279 13 1 3.000000 +> 10 0.386279 3 1 98095000.000000 +> 10 0.386279 17 1 98095000.000000 +> 9 0.386279 3 1 98095000.000000 +> 9 0.386279 17 1 98095000.000000 +> 8 0.386279 3 3 0.000000 +> 9 0.386279 3 3 76296000.000000 +> 8 0.386279 17 3 0.000000 +> 9 0.386279 17 3 76296000.000000 +> 9 0.399511 7 13 7859911.230163 +> 9 0.399511 16 13 7859911.230163 +> 9 0.399511 7 7 7859911.230163 +> 9 0.399511 16 7 7859911.230163 +> 8 0.399511 7 15 0.000000 +> 9 0.399511 7 15 7859911.230163 +> 8 0.399511 16 15 0.000000 +> 9 0.399511 16 15 7859911.230163 +> 10 0.511874 3 1 98095000.000000 +> 10 0.511874 17 1 98095000.000000 +> 10 0.511874 7 13 7859911.230163 +> 10 0.511874 16 13 7859911.230163 +> 10 0.511874 7 7 7859911.230163 +> 10 0.511874 16 7 7859911.230163 +> 10 0.511874 7 15 7859911.230163 +> 10 0.511874 16 15 7859911.230163 +> 9 0.511874 7 13 7859911.230163 +> 9 0.511874 16 13 7859911.230163 +> 9 0.511874 7 7 7859911.230163 +> 9 0.511874 16 7 7859911.230163 +> 9 0.511874 7 15 7859911.230163 +> 9 0.511874 16 15 7859911.230163 +> 10 0.526739 7 13 7859911.230163 +> 10 0.526739 16 13 7859911.230163 +> 10 0.526739 7 7 7859911.230163 +> 10 0.526739 16 7 7859911.230163 +> 10 0.526739 7 15 7859911.230163 +> 10 0.526739 16 15 7859911.230163 +> 9 0.526739 14 4 50000000.000000 +> 8 0.526739 13 1 4.000000 +> 8 0.526739 3 4 0.000000 +> 9 0.526739 3 4 48492000.000000 +> 8 0.526739 17 4 0.000000 +> 9 0.526739 17 4 48492000.000000 +> 9 0.547074 7 13 5114134.701194 +> 9 0.547074 16 13 5114134.701194 +> 9 0.547074 7 7 5114134.701194 +> 9 0.547074 16 7 5114134.701194 +> 9 0.547074 7 10 5114134.701194 +> 9 0.547074 16 10 5114134.701194 +> 9 0.547074 7 14 5114134.701194 +> 9 0.547074 16 14 5114134.701194 +> 9 0.547074 7 12 5114134.701194 +> 9 0.547074 16 12 5114134.701194 +> 8 0.547074 7 6 0.000000 +> 9 0.547074 7 6 5114134.701194 +> 8 0.547074 16 6 0.000000 +> 9 0.547074 16 6 5114134.701194 +> 8 0.547074 7 8 0.000000 +> 9 0.547074 7 8 5114134.701194 +> 8 0.547074 16 8 0.000000 +> 9 0.547074 16 8 5114134.701194 +> 10 0.742611 7 13 5114134.701194 +> 10 0.742611 16 13 5114134.701194 +> 10 0.742611 7 7 5114134.701194 +> 10 0.742611 16 7 5114134.701194 +> 10 0.742611 7 10 5114134.701194 +> 10 0.742611 16 10 5114134.701194 +> 10 0.742611 7 14 5114134.701194 +> 10 0.742611 16 14 5114134.701194 +> 10 0.742611 7 12 5114134.701194 +> 10 0.742611 16 12 5114134.701194 +> 10 0.742611 7 6 5114134.701194 +> 10 0.742611 16 6 5114134.701194 +> 10 0.742611 7 8 5114134.701194 +> 10 0.742611 16 8 5114134.701194 +> 9 0.742611 14 5 50000000.000000 +> 8 0.742611 13 1 5.000000 +> 8 0.742611 3 5 0.000000 +> 9 0.742611 3 5 48492000.000000 +> 8 0.742611 17 5 0.000000 +> 9 0.742611 17 5 48492000.000000 +> 9 0.744775 14 1 50000000.000000 +> 8 0.744775 13 1 6.000000 +> 9 0.744775 3 1 98095000.000000 +> 9 0.744775 17 1 98095000.000000 +> 10 0.823468 3 2 76296000.000000 +> 10 0.823468 17 2 76296000.000000 +> 9 0.838668 7 9 6632970.000000 +> 10 0.989430 7 9 6632970.000000 +> 8 0.989430 13 1 7.000000 +> 9 0.989430 14 2 50000000.000000 +> 10 0.989430 3 1 98095000.000000 +> 10 0.989430 17 1 98095000.000000 +> 9 0.989430 3 1 98095000.000000 +> 9 0.989430 17 1 98095000.000000 +> 9 0.989430 3 2 76296000.000000 +> 9 0.989430 17 2 76296000.000000 +> 10 1.041621 3 3 76296000.000000 +> 10 1.041621 17 3 76296000.000000 +> 9 1.062172 7 13 5060664.718311 +> 9 1.062172 7 7 5060664.718311 +> 9 1.062172 7 10 5060664.718311 +> 9 1.062172 7 14 5060664.718311 +> 9 1.062172 7 12 5060664.718311 +> 9 1.062172 7 11 5060664.718311 +> 10 1.254485 3 1 98095000.000000 +> 10 1.254485 17 1 98095000.000000 +> 10 1.254485 7 13 5060664.718311 +> 10 1.254485 7 7 5060664.718311 +> 10 1.254485 7 10 5060664.718311 +> 10 1.254485 7 14 5060664.718311 +> 10 1.254485 7 12 5060664.718311 +> 10 1.254485 7 11 5060664.718311 +> 9 1.254485 7 13 5060664.718311 +> 9 1.254485 7 7 5060664.718311 +> 9 1.254485 7 10 5060664.718311 +> 9 1.254485 7 14 5060664.718311 +> 9 1.254485 7 12 5060664.718311 +> 9 1.254485 7 11 5060664.718311 +> 10 1.259775 7 13 5060664.718311 +> 10 1.259775 7 7 5060664.718311 +> 10 1.259775 7 10 5060664.718311 +> 10 1.259775 7 14 5060664.718311 +> 10 1.259775 7 12 5060664.718311 +> 10 1.259775 7 11 5060664.718311 +> 8 1.259775 13 1 8.000000 +> 9 1.259775 14 3 50000000.000000 +> 9 1.259775 3 3 76296000.000000 +> 9 1.259775 17 3 76296000.000000 +> 9 1.261939 14 1 50000000.000000 +> 8 1.261939 13 1 9.000000 +> 9 1.261939 3 1 98095000.000000 +> 9 1.261939 17 1 98095000.000000 +> 10 1.557837 3 4 48492000.000000 +> 10 1.557837 17 4 48492000.000000 +> 9 1.571068 7 13 7859911.230163 +> 9 1.571068 7 7 7859911.230163 +> 9 1.571068 7 15 7859911.230163 +> 10 1.644772 3 2 76296000.000000 +> 10 1.644772 17 2 76296000.000000 +> 10 1.644772 7 13 7859911.230163 +> 10 1.644772 7 7 7859911.230163 +> 10 1.644772 7 15 7859911.230163 +> 9 1.644772 7 13 7859911.230163 +> 9 1.644772 7 7 7859911.230163 +> 9 1.644772 7 15 7859911.230163 +> 10 1.698296 7 13 7859911.230163 +> 10 1.698296 7 7 7859911.230163 +> 10 1.698296 7 15 7859911.230163 +> 8 1.698296 13 1 10.000000 +> 9 1.698296 14 4 50000000.000000 +> 10 1.698296 3 1 98095000.000000 +> 10 1.698296 17 1 98095000.000000 +> 9 1.698296 3 1 98095000.000000 +> 9 1.698296 17 1 98095000.000000 +> 9 1.698296 3 4 48492000.000000 +> 9 1.698296 17 4 48492000.000000 +> 9 1.713496 7 9 6632970.000000 +> 9 1.713496 16 9 6632970.000000 +> 10 1.771649 3 1 98095000.000000 +> 10 1.771649 17 1 98095000.000000 +> 10 1.771649 7 9 6632970.000000 +> 10 1.771649 16 9 6632970.000000 +> 9 1.771649 7 9 6632970.000000 +> 9 1.771649 16 9 6632970.000000 +> 10 1.773709 3 5 48492000.000000 +> 10 1.773709 17 5 48492000.000000 +> 10 1.773709 7 9 6632970.000000 +> 10 1.773709 16 9 6632970.000000 +> 9 1.773709 7 9 6632970.000000 +> 9 1.773709 16 9 6632970.000000 +> 10 1.864258 7 9 6632970.000000 +> 10 1.864258 16 9 6632970.000000 +> 9 1.864258 14 2 50000000.000000 +> 8 1.864258 13 1 11.000000 +> 9 1.864258 3 2 76296000.000000 +> 9 1.864258 17 2 76296000.000000 +> 9 1.866422 14 1 50000000.000000 +> 8 1.866422 13 1 12.000000 +> 9 1.866422 3 1 98095000.000000 +> 9 1.866422 17 1 98095000.000000 +> 9 1.886758 7 13 5114134.701194 +> 9 1.886758 16 13 5114134.701194 +> 9 1.886758 7 7 5114134.701194 +> 9 1.886758 16 7 5114134.701194 +> 9 1.886758 7 10 5114134.701194 +> 9 1.886758 16 10 5114134.701194 +> 9 1.886758 7 14 5114134.701194 +> 9 1.886758 16 14 5114134.701194 +> 9 1.886758 7 12 5114134.701194 +> 9 1.886758 16 12 5114134.701194 +> 9 1.886758 7 6 5114134.701194 +> 9 1.886758 16 6 5114134.701194 +> 9 1.886758 7 8 5114134.701194 +> 9 1.886758 16 8 5114134.701194 +> 10 1.915117 3 3 76296000.000000 +> 10 1.915117 17 3 76296000.000000 +> 10 1.915117 7 13 5114134.701194 +> 10 1.915117 16 13 5114134.701194 +> 10 1.915117 7 7 5114134.701194 +> 10 1.915117 16 7 5114134.701194 +> 10 1.915117 7 10 5114134.701194 +> 10 1.915117 16 10 5114134.701194 +> 10 1.915117 7 14 5114134.701194 +> 10 1.915117 16 14 5114134.701194 +> 10 1.915117 7 12 5114134.701194 +> 10 1.915117 16 12 5114134.701194 +> 10 1.915117 7 6 5114134.701194 +> 10 1.915117 16 6 5114134.701194 +> 10 1.915117 7 8 5114134.701194 +> 10 1.915117 16 8 5114134.701194 +> 9 1.915117 7 13 5114134.701194 +> 9 1.915117 16 13 5114134.701194 +> 9 1.915117 7 7 5114134.701194 +> 9 1.915117 16 7 5114134.701194 +> 9 1.915117 7 10 5114134.701194 +> 9 1.915117 16 10 5114134.701194 +> 9 1.915117 7 14 5114134.701194 +> 9 1.915117 16 14 5114134.701194 +> 9 1.915117 7 12 5114134.701194 +> 9 1.915117 16 12 5114134.701194 +> 9 1.915117 7 6 5114134.701194 +> 9 1.915117 16 6 5114134.701194 +> 9 1.915117 7 8 5114134.701194 +> 9 1.915117 16 8 5114134.701194 +> 10 2.082294 7 13 5114134.701194 +> 10 2.082294 16 13 5114134.701194 +> 10 2.082294 7 7 5114134.701194 +> 10 2.082294 16 7 5114134.701194 +> 10 2.082294 7 10 5114134.701194 +> 10 2.082294 16 10 5114134.701194 +> 10 2.082294 7 14 5114134.701194 +> 10 2.082294 16 14 5114134.701194 +> 10 2.082294 7 12 5114134.701194 +> 10 2.082294 16 12 5114134.701194 +> 10 2.082294 7 6 5114134.701194 +> 10 2.082294 16 6 5114134.701194 +> 10 2.082294 7 8 5114134.701194 +> 10 2.082294 16 8 5114134.701194 +> 9 2.082294 14 5 50000000.000000 +> 8 2.082294 13 1 13.000000 +> 10 2.082294 3 1 98095000.000000 +> 10 2.082294 17 1 98095000.000000 +> 9 2.082294 3 1 98095000.000000 +> 9 2.082294 17 1 98095000.000000 +> 9 2.082294 3 5 48492000.000000 +> 9 2.082294 17 5 48492000.000000 +> 9 2.102845 7 13 5060664.718311 +> 9 2.102845 16 13 5060664.718311 +> 9 2.102845 7 7 5060664.718311 +> 9 2.102845 16 7 5060664.718311 +> 9 2.102845 7 10 5060664.718311 +> 9 2.102845 16 10 5060664.718311 +> 9 2.102845 7 14 5060664.718311 +> 9 2.102845 16 14 5060664.718311 +> 9 2.102845 7 12 5060664.718311 +> 9 2.102845 16 12 5060664.718311 +> 9 2.102845 7 11 5060664.718311 +> 9 2.102845 16 11 5060664.718311 +> 10 2.300447 7 13 5060664.718311 +> 10 2.300447 16 13 5060664.718311 +> 10 2.300447 7 7 5060664.718311 +> 10 2.300447 16 7 5060664.718311 +> 10 2.300447 7 10 5060664.718311 +> 10 2.300447 16 10 5060664.718311 +> 10 2.300447 7 14 5060664.718311 +> 10 2.300447 16 14 5060664.718311 +> 10 2.300447 7 12 5060664.718311 +> 10 2.300447 16 12 5060664.718311 +> 10 2.300447 7 11 5060664.718311 +> 10 2.300447 16 11 5060664.718311 +> 9 2.300447 14 3 50000000.000000 +> 8 2.300447 13 1 14.000000 +> 10 2.300447 3 1 98095000.000000 +> 10 2.300447 17 1 98095000.000000 +> 9 2.300447 3 1 98095000.000000 +> 9 2.300447 17 1 98095000.000000 +> 9 2.300447 3 3 76296000.000000 +> 9 2.300447 17 3 76296000.000000 +> 10 2.376132 3 1 98095000.000000 +> 10 2.376132 17 1 98095000.000000 +> 8 2.378296 13 1 15.000000 +> 9 2.378296 14 1 50000000.000000 +> 9 2.378296 3 1 98095000.000000 +> 9 2.378296 17 1 98095000.000000 +> 10 2.519600 3 2 76296000.000000 +> 10 2.519600 17 2 76296000.000000 +> 9 2.534800 7 9 6632970.000000 +> 10 2.685562 7 9 6632970.000000 +> 8 2.685562 13 1 16.000000 +> 9 2.685562 14 2 50000000.000000 +> 10 2.685562 3 1 98095000.000000 +> 10 2.685562 17 1 98095000.000000 +> 9 2.685562 3 1 98095000.000000 +> 9 2.685562 17 1 98095000.000000 +> 9 2.685562 3 2 76296000.000000 +> 9 2.685562 17 2 76296000.000000 +> 10 2.729394 3 4 48492000.000000 +> 10 2.729394 17 4 48492000.000000 +> 9 2.742626 7 13 7859911.230163 +> 9 2.742626 7 7 7859911.230163 +> 9 2.742626 7 15 7859911.230163 +> 10 2.869854 7 13 7859911.230163 +> 10 2.869854 7 7 7859911.230163 +> 10 2.869854 7 15 7859911.230163 +> 8 2.869854 13 1 17.000000 +> 9 2.869854 14 4 50000000.000000 +> 10 2.869854 3 1 98095000.000000 +> 10 2.869854 17 1 98095000.000000 +> 9 2.869854 3 1 98095000.000000 +> 9 2.869854 17 1 98095000.000000 +> 5 25 15 finish_send_tasks "(null)" +> 9 2.869854 3 4 48492000.000000 +> 9 2.869854 17 4 48492000.000000 +> 10 2.888006 3 1 98095000.000000 +> 10 2.888006 17 1 98095000.000000 +> 8 2.890170 13 1 18.000000 +> 9 2.890170 14 1 50000000.000000 +> 9 2.890170 3 1 98095000.000000 +> 9 2.890170 17 1 98095000.000000 +> 10 2.955790 3 3 76296000.000000 +> 10 2.955790 17 3 76296000.000000 +> 9 2.976340 7 13 5060664.718311 +> 9 2.976340 7 7 5060664.718311 +> 9 2.976340 7 10 5060664.718311 +> 9 2.976340 7 14 5060664.718311 +> 9 2.976340 7 12 5060664.718311 +> 9 2.976340 7 11 5060664.718311 +> 10 3.113392 3 5 48492000.000000 +> 10 3.113392 17 5 48492000.000000 +> 10 3.113392 7 13 5060664.718311 +> 10 3.113392 7 7 5060664.718311 +> 10 3.113392 7 10 5060664.718311 +> 10 3.113392 7 14 5060664.718311 +> 10 3.113392 7 12 5060664.718311 +> 10 3.113392 7 11 5060664.718311 +> 9 3.113392 7 13 5060664.718311 +> 9 3.113392 7 7 5060664.718311 +> 9 3.113392 7 10 5060664.718311 +> 9 3.113392 7 14 5060664.718311 +> 9 3.113392 7 12 5060664.718311 +> 9 3.113392 7 11 5060664.718311 +> 10 3.173943 7 13 5060664.718311 +> 10 3.173943 7 7 5060664.718311 +> 10 3.173943 7 10 5060664.718311 +> 10 3.173943 7 14 5060664.718311 +> 10 3.173943 7 12 5060664.718311 +> 10 3.173943 7 11 5060664.718311 +> 8 3.173943 13 1 19.000000 +> 9 3.173943 14 3 50000000.000000 +> 10 3.173943 3 1 98095000.000000 +> 10 3.173943 17 1 98095000.000000 +> 9 3.173943 3 1 98095000.000000 +> 9 3.173943 17 1 98095000.000000 +> 9 3.173943 3 3 76296000.000000 +> 9 3.173943 17 3 76296000.000000 +> 9 3.194279 7 13 5114134.701194 +> 9 3.194279 16 13 5114134.701194 +> 9 3.194279 7 7 5114134.701194 +> 9 3.194279 16 7 5114134.701194 +> 9 3.194279 7 10 5114134.701194 +> 9 3.194279 16 10 5114134.701194 +> 9 3.194279 7 14 5114134.701194 +> 9 3.194279 16 14 5114134.701194 +> 9 3.194279 7 12 5114134.701194 +> 9 3.194279 16 12 5114134.701194 +> 9 3.194279 7 6 5114134.701194 +> 9 3.194279 16 6 5114134.701194 +> 9 3.194279 7 8 5114134.701194 +> 9 3.194279 16 8 5114134.701194 +> 10 3.340904 3 2 76296000.000000 +> 10 3.340904 17 2 76296000.000000 +> 10 3.340904 7 13 5114134.701194 +> 10 3.340904 16 13 5114134.701194 +> 10 3.340904 7 7 5114134.701194 +> 10 3.340904 16 7 5114134.701194 +> 10 3.340904 7 10 5114134.701194 +> 10 3.340904 16 10 5114134.701194 +> 10 3.340904 7 14 5114134.701194 +> 10 3.340904 16 14 5114134.701194 +> 10 3.340904 7 12 5114134.701194 +> 10 3.340904 16 12 5114134.701194 +> 10 3.340904 7 6 5114134.701194 +> 10 3.340904 16 6 5114134.701194 +> 10 3.340904 7 8 5114134.701194 +> 10 3.340904 16 8 5114134.701194 +> 9 3.340904 7 13 5114134.701194 +> 9 3.340904 16 13 5114134.701194 +> 9 3.340904 7 7 5114134.701194 +> 9 3.340904 16 7 5114134.701194 +> 9 3.340904 7 10 5114134.701194 +> 9 3.340904 16 10 5114134.701194 +> 9 3.340904 7 14 5114134.701194 +> 9 3.340904 16 14 5114134.701194 +> 9 3.340904 7 12 5114134.701194 +> 9 3.340904 16 12 5114134.701194 +> 9 3.340904 7 6 5114134.701194 +> 9 3.340904 16 6 5114134.701194 +> 9 3.340904 7 8 5114134.701194 +> 9 3.340904 16 8 5114134.701194 +> 10 3.389815 7 13 5114134.701194 +> 10 3.389815 16 13 5114134.701194 +> 10 3.389815 7 7 5114134.701194 +> 10 3.389815 16 7 5114134.701194 +> 10 3.389815 7 10 5114134.701194 +> 10 3.389815 16 10 5114134.701194 +> 10 3.389815 7 14 5114134.701194 +> 10 3.389815 16 14 5114134.701194 +> 10 3.389815 7 12 5114134.701194 +> 10 3.389815 16 12 5114134.701194 +> 10 3.389815 7 6 5114134.701194 +> 10 3.389815 16 6 5114134.701194 +> 10 3.389815 7 8 5114134.701194 +> 10 3.389815 16 8 5114134.701194 +> 9 3.389815 14 5 50000000.000000 +> 16 3.389815 15 0 25 +> 10 3.389815 3 1 98095000.000000 +> 10 3.389815 17 1 98095000.000000 +> 9 3.389815 3 1 98095000.000000 +> 9 3.389815 17 1 98095000.000000 +> 9 3.389815 3 5 48492000.000000 +> 9 3.389815 17 5 48492000.000000 +> 10 3.399880 3 1 98095000.000000 +> 10 3.399880 17 1 98095000.000000 +> 10 3.829285 3 3 76296000.000000 +> 10 3.829285 17 3 76296000.000000 +> 10 3.900952 3 4 48492000.000000 +> 10 3.900952 17 4 48492000.000000 +> 10 4.420913 3 5 48492000.000000 +> 10 4.420913 17 5 48492000.000000 +> 7 4.441249 1 3 +> 7 4.441249 1 1 +> 7 4.441249 4 14 +> 7 4.441249 4 12 +> 7 4.441249 4 10 +> 7 4.441249 4 7 +> 7 4.441249 4 13 +> 7 4.441249 4 15 +> 7 4.441249 4 6 +> 7 4.441249 4 8 +> 7 4.441249 4 11 +> 7 4.441249 4 9 +> 7 4.441249 1 5 +> 7 4.441249 1 2 +> 7 4.441249 1 4 +> 7 4.441249 0 0 $ $SG_TEST_EXENV cat tracing/ms.uncat.plist > { -> node = (LINK, HOST, ROUTER, ); -> edge = (ROUTER-LINK, HOST-LINK, LINK-HOST, LINK-ROUTER, LINK-LINK, ); +> node = (LINK, HOST, ); +> edge = (HOST-LINK, LINK-HOST, LINK-LINK, ); > -> LINK = { -> type = edge; +> host = { +> type = square; +> size = power; +> values = (power_used); +> }; +> link = { +> type = rhombus; > size = bandwidth; -> scale = global; -> link_sep = { -> type = separation; -> size = bandwidth; -> values = (bandwidth_used); -> }; +> values = (bandwidth_used); > }; +> } + +$ $SG_TEST_EXENV cat tracing/ms.cat.plist +> { +> node = (LINK, HOST, ); +> edge = (HOST-LINK, LINK-HOST, LINK-LINK, ); > -> HOST = { -> type = node; +> host = { +> type = square; > size = power; -> host_sep = { -> type = separation; -> size = power; -> values = (power_used); -> }; +> values = (prequest, pfinalize, preport, pcompute, ); > }; -> -> ROUTER = { -> type = node; -> size = 10; +> link = { +> type = rhombus; +> size = bandwidth; +> values = (brequest, bfinalize, breport, bcompute, ); > }; -> -> ROUTER-LINK = { size = 1; }; -> HOST-LINK = { size = 1; }; -> LINK-HOST = { size = 1; }; -> LINK-ROUTER = { size = 1; }; -> LINK-LINK = { size = 1; }; -> -> graphviz-algorithm = neato; > } $ rm -rf tracing/ms.trace tracing/ms.cat.plist tracing/ms.uncat.plist diff --git a/examples/msg/tracing/platform.xml b/examples/msg/tracing/platform.xml index b1b4532813..4b72f54a2b 100644 --- a/examples/msg/tracing/platform.xml +++ b/examples/msg/tracing/platform.xml @@ -7,42 +7,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/examples/msg/tracing/procmig.c b/examples/msg/tracing/procmig.c index 5ee80cab50..72b16fb00f 100644 --- a/examples/msg/tracing/procmig.c +++ b/examples/msg/tracing/procmig.c @@ -28,7 +28,6 @@ static int emigrant(int argc, char *argv[]) XBT_INFO("Migrating to %s", destination); MSG_process_migrate(MSG_process_self(), MSG_get_host_by_name(destination)); MSG_process_sleep(2); // I am tired, have to sleep for 2 seconds - xbt_free (destination); MSG_task_destroy (task); task = NULL; } @@ -41,7 +40,7 @@ static int master(int argc, char *argv[]) // I am the master of emigrant process, // I tell it where it must emigrate to. - xbt_dynar_t destinations = xbt_dynar_new (sizeof(char*), xbt_free); + xbt_dynar_t destinations = xbt_dynar_new (sizeof(char*), &xbt_free_ref); xbt_dynar_push_as (destinations, char*, xbt_strdup ("Tremblay")); xbt_dynar_push_as (destinations, char*, xbt_strdup ("Jupiter")); xbt_dynar_push_as (destinations, char*, xbt_strdup ("Fafard")); @@ -63,6 +62,7 @@ static int master(int argc, char *argv[]) MSG_task_send (task, "master_mailbox"); task = NULL; } + xbt_dynar_free (&destinations); return 0; } diff --git a/examples/msg/tracing/procmig.tesh b/examples/msg/tracing/procmig.tesh index 5f487b515b..071e7e5d92 100644 --- a/examples/msg/tracing/procmig.tesh +++ b/examples/msg/tracing/procmig.tesh @@ -2,8 +2,9 @@ p Tracing processes -$ $SG_TEST_EXENV ${bindir:=.}/tracing/procmig$EXEEXT --cfg=tracing:1 --cfg=tracing/filename:tracing/procmig.trace --cfg=tracing/msg/process:1 ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/procmig-deploy.xml +$ $SG_TEST_EXENV ${bindir:=.}/tracing/procmig$EXEEXT --cfg=tracing:1 --cfg=tracing/buffer:1 --cfg=tracing/filename:tracing/procmig.trace --cfg=tracing/msg/process:1 ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/procmig-deploy.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/procmig.trace' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/msg/process' to '1' > [Fafard:emigrant:(1) 2.020551] [msg_test/INFO] Migrating to Tremblay @@ -35,7 +36,7 @@ $ cat tracing/procmig.trace > %EndEventDef > %EventDef PajeDefineEventType 3 > % Alias string -> % EntityType string +> % ContainerType string > % Name string > % Color color > %EndEventDef @@ -62,46 +63,46 @@ $ cat tracing/procmig.trace > %EventDef PajeDestroyContainer 7 > % Time date > % Type string -> % Container string +> % Name string > %EndEventDef > %EventDef PajeSetVariable 8 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeAddVariable 9 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSubVariable 10 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSetState 11 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePushState 12 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePopState 13 > % Time date -> % EntityType string +> % Type string > % Container string > %EndEventDef > %EventDef PajeStartLink 14 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % SourceContainer string @@ -109,7 +110,7 @@ $ cat tracing/procmig.trace > %EndEventDef > %EventDef PajeEndLink 15 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % DestContainer string @@ -117,307 +118,207 @@ $ cat tracing/procmig.trace > %EndEventDef > %EventDef PajeNewEvent 16 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef -> 0 1 0 L1 -> 6 0 1 1 0 AS0 -> 0 2 1 HOST -> 6 0 2 2 1 Tremblay -> 1 3 2 power "1 1 1" -> 0 4 2 MSG_PROCESS -> 2 5 4 MSG_PROCESS_STATE -> 5 6 5 executing "0 1 0" -> 5 7 5 suspend "1 0 1" -> 5 8 5 sleep "1 1 0" -> 5 9 5 receive "1 0 0" -> 5 10 5 send "0 0 1" -> 5 11 5 task_execute "0 1 1" -> 4 12 0 4 4 MSG_PROCESS_LINK -> 4 13 0 4 4 MSG_PROCESS_TASK_LINK -> 6 0 3 2 1 Jupiter -> 6 0 4 2 1 Fafard -> 6 0 5 2 1 Ginette -> 6 0 6 2 1 Bourassa -> 0 14 1 ROUTER -> 6 0 7 14 1 R.4-3 -> 6 0 8 14 1 R.3-2-5 -> 6 0 9 14 1 R.2-0 -> 6 0 10 14 1 R.1-0 -> 6 0 11 14 1 R.1-8-6 -> 6 0 12 14 1 R.6-7 -> 0 15 1 LINK -> 6 0 13 15 1 6 -> 1 16 15 bandwidth "1 1 1" -> 1 17 15 latency "1 1 1" -> 6 0 14 15 1 11 -> 6 0 15 15 1 3 -> 6 0 16 15 1 7 -> 6 0 17 15 1 9 -> 6 0 18 15 1 12 -> 6 0 19 15 1 2 -> 6 0 20 15 1 8 -> 6 0 21 15 1 1 -> 6 0 22 15 1 4 -> 6 0 23 15 1 0 -> 6 0 24 15 1 10 -> 6 0 25 15 1 5 -> 6 0 26 15 1 loopback -> 4 18 1 2 15 HOST-LINK -> 4 19 1 15 14 LINK-ROUTER -> 4 20 1 15 15 LINK-LINK -> 4 21 1 15 2 LINK-HOST -> 4 22 1 14 15 ROUTER-LINK -> 8 0 3 2 98095000.000000 -> 8 0 3 3 76296000.000000 -> 8 0 3 4 76296000.000000 -> 8 0 3 5 48492000.000000 -> 8 0 3 6 48492000.000000 -> 8 0 16 13 41279125.000000 -> 8 0 17 13 0.000060 -> 8 0 16 14 252750.000000 -> 8 0 17 14 0.005705 -> 8 0 16 15 34285622.000000 -> 8 0 17 15 0.000514 -> 8 0 16 16 11618875.000000 -> 8 0 17 16 0.000190 -> 8 0 16 17 7209750.000000 -> 8 0 17 17 0.001462 -> 8 0 16 18 1792625.000000 -> 8 0 17 18 0.007878 -> 8 0 16 19 22222222.000000 -> 8 0 17 19 0.000137 -> 8 0 16 20 8158000.000000 -> 8 0 17 20 0.000271 -> 8 0 16 21 34285625.000000 -> 8 0 17 21 0.000514 -> 8 0 16 22 10099625.000000 -> 8 0 17 22 0.000480 -> 8 0 16 23 41279125.000000 -> 8 0 17 23 0.000060 -> 8 0 16 24 4679750.000000 -> 8 0 17 24 0.000849 -> 8 0 16 25 27946250.000000 -> 8 0 17 25 0.000278 -> 8 0 16 26 498000000.000000 -> 8 0 17 26 0.000015 -> 14 0 18 1 G 4 0 -> 15 0 18 1 G 26 0 -> 14 0 18 1 G 4 1 -> 15 0 18 1 G 20 1 -> 14 0 19 1 G 20 2 -> 15 0 19 1 G 11 2 -> 14 0 20 1 G 20 3 -> 15 0 20 1 G 21 3 -> 14 0 20 1 G 21 4 -> 15 0 20 1 G 23 4 -> 14 0 20 1 G 23 5 -> 15 0 20 1 G 19 5 -> 14 0 20 1 G 19 6 -> 15 0 20 1 G 15 6 -> 14 0 20 1 G 15 7 -> 15 0 20 1 G 22 7 -> 14 0 21 1 G 22 8 -> 15 0 21 1 G 2 8 -> 14 0 20 1 G 20 9 -> 15 0 20 1 G 13 9 -> 14 0 20 1 G 13 10 -> 15 0 20 1 G 16 10 -> 14 0 21 1 G 16 11 -> 15 0 21 1 G 6 11 -> 14 0 20 1 G 22 12 -> 15 0 20 1 G 17 12 -> 14 0 21 1 G 17 13 -> 15 0 21 1 G 3 13 -> 14 0 20 1 G 19 14 -> 15 0 20 1 G 25 14 -> 14 0 21 1 G 25 15 -> 15 0 21 1 G 5 15 -> 14 0 22 1 G 9 16 -> 15 0 22 1 G 19 16 -> 14 0 19 1 G 19 17 -> 15 0 19 1 G 8 17 -> 14 0 22 1 G 9 18 -> 15 0 22 1 G 23 18 -> 14 0 19 1 G 23 19 -> 15 0 19 1 G 10 19 -> 14 0 22 1 G 7 20 -> 15 0 22 1 G 15 20 -> 14 0 19 1 G 15 21 -> 15 0 19 1 G 8 21 -> 14 0 22 1 G 7 22 -> 15 0 22 1 G 22 22 -> 14 0 22 1 G 8 23 -> 15 0 22 1 G 25 23 -> 14 0 22 1 G 11 24 -> 15 0 22 1 G 13 24 -> 14 0 19 1 G 13 25 -> 15 0 19 1 G 12 25 -> 14 0 22 1 G 11 26 -> 15 0 22 1 G 21 26 -> 14 0 19 1 G 21 27 -> 15 0 19 1 G 10 27 -> 14 0 22 1 G 12 28 -> 15 0 22 1 G 16 28 -> 14 0 18 1 G 2 29 -> 15 0 18 1 G 26 29 -> 14 0 20 1 G 21 30 -> 15 0 20 1 G 13 30 -> 14 0 18 1 G 2 31 -> 15 0 18 1 G 17 31 -> 14 0 20 1 G 15 32 -> 15 0 20 1 G 25 32 -> 14 0 18 1 G 6 33 -> 15 0 18 1 G 26 33 -> 14 0 18 1 G 3 34 -> 15 0 18 1 G 26 34 -> 14 0 18 1 G 5 35 -> 15 0 18 1 G 26 35 -> 6 0 27 4 4 emigrant-1 -> 6 0 28 4 2 master-2 -> 11 0 5 27 6 -> 11 0 5 28 6 -> 12 0 5 27 8 -> 12 0 5 28 10 -> 14 0 13 0 SR 28 p0 -> 13 2.000000 5 27 -> 12 2.000000 5 27 9 -> 13 2.020551 5 28 -> 12 2.020551 5 28 10 -> 14 2.020551 13 0 SR 28 p1 -> 13 2.020551 5 27 -> 15 2.020551 13 0 SR 27 p0 -> 14 2.020551 12 0 M 27 0 -> 7 2.020551 4 27 -> 6 2.020551 29 4 2 emigrant-1 -> 11 2.020551 5 29 6 -> 15 2.020551 12 0 M 29 0 -> 12 2.020551 5 29 8 -> 13 4.020551 5 29 -> 12 4.020551 5 29 9 -> 13 4.020707 5 28 -> 12 4.020707 5 28 10 -> 14 4.020707 13 0 SR 28 p2 -> 13 4.020707 5 29 -> 15 4.020707 13 0 SR 29 p1 -> 14 4.020707 12 0 M 29 1 -> 7 4.020707 4 29 -> 6 4.020707 30 4 3 emigrant-1 -> 11 4.020707 5 30 6 -> 15 4.020707 12 0 M 30 1 -> 12 4.020707 5 30 8 -> 13 6.020707 5 30 -> 12 6.020707 5 30 9 -> 13 6.035906 5 28 -> 12 6.035906 5 28 10 -> 14 6.035906 13 0 SR 28 p3 -> 13 6.035906 5 30 -> 15 6.035906 13 0 SR 30 p2 -> 14 6.035906 12 0 M 30 2 -> 7 6.035906 4 30 -> 6 6.035906 31 4 4 emigrant-1 -> 11 6.035906 5 31 6 -> 15 6.035906 12 0 M 31 2 -> 12 6.035906 5 31 8 -> 13 8.035906 5 31 -> 12 8.035906 5 31 9 -> 13 8.056457 5 28 -> 12 8.056457 5 28 10 -> 14 8.056457 13 0 SR 28 p4 -> 13 8.056457 5 31 -> 15 8.056457 13 0 SR 31 p3 -> 14 8.056457 12 0 M 31 3 -> 7 8.056457 4 31 -> 6 8.056457 32 4 5 emigrant-1 -> 11 8.056457 5 32 6 -> 15 8.056457 12 0 M 32 3 -> 12 8.056457 5 32 8 -> 13 10.056457 5 32 -> 12 10.056457 5 32 9 -> 13 10.069689 5 28 -> 12 10.069689 5 28 10 -> 14 10.069689 13 0 SR 28 p5 -> 13 10.069689 5 32 -> 15 10.069689 13 0 SR 32 p4 -> 14 10.069689 12 0 M 32 4 -> 7 10.069689 4 32 -> 6 10.069689 33 4 6 emigrant-1 -> 11 10.069689 5 33 6 -> 15 10.069689 12 0 M 33 4 -> 12 10.069689 5 33 8 -> 13 12.069689 5 33 -> 12 12.069689 5 33 9 -> 13 12.090025 5 28 -> 12 12.090025 5 28 10 -> 14 12.090025 13 0 SR 28 p6 -> 13 12.090025 5 33 -> 15 12.090025 13 0 SR 33 p5 -> 14 12.090025 12 0 M 33 5 -> 7 12.090025 4 33 -> 6 12.090025 34 4 4 emigrant-1 -> 11 12.090025 5 34 6 -> 15 12.090025 12 0 M 34 5 -> 12 12.090025 5 34 8 -> 13 14.090025 5 34 -> 12 14.090025 5 34 9 -> 13 14.110575 5 28 -> 12 14.110575 5 28 10 -> 14 14.110575 13 0 SR 28 p7 -> 13 14.110575 5 34 -> 15 14.110575 13 0 SR 34 p6 -> 14 14.110575 12 0 M 34 6 -> 7 14.110575 4 34 -> 6 14.110575 35 4 2 emigrant-1 -> 11 14.110575 5 35 6 -> 15 14.110575 12 0 M 35 6 -> 12 14.110575 5 35 8 -> 13 16.110575 5 35 -> 12 16.110575 5 35 9 -> 13 16.110731 5 28 -> 12 16.110731 5 28 10 -> 14 16.110731 13 0 SR 28 p8 -> 13 16.110731 5 35 -> 15 16.110731 13 0 SR 35 p7 -> 14 16.110731 12 0 M 35 7 -> 7 16.110731 4 35 -> 6 16.110731 36 4 5 emigrant-1 -> 11 16.110731 5 36 6 -> 15 16.110731 12 0 M 36 7 -> 12 16.110731 5 36 8 -> 13 18.110731 5 36 -> 12 18.110731 5 36 9 -> 13 18.123963 5 28 -> 7 18.123963 4 28 -> 13 18.123963 5 36 -> 15 18.123963 13 0 SR 36 p8 -> 7 18.123963 4 36 -> 7 18.123963 2 4 -> 7 18.123963 14 9 -> 7 18.123963 14 7 -> 7 18.123963 14 8 -> 7 18.123963 14 11 -> 7 18.123963 14 12 -> 7 18.123963 2 2 -> 7 18.123963 15 24 -> 7 18.123963 15 14 -> 7 18.123963 15 18 -> 7 18.123963 15 26 -> 7 18.123963 14 10 -> 7 18.123963 15 23 -> 7 18.123963 15 21 -> 7 18.123963 15 19 -> 7 18.123963 15 15 -> 7 18.123963 15 22 -> 7 18.123963 15 25 -> 7 18.123963 15 13 -> 7 18.123963 15 16 -> 7 18.123963 15 20 -> 7 18.123963 15 17 -> 7 18.123963 2 6 -> 7 18.123963 2 3 -> 7 18.123963 2 5 +> 0 1 0 HOST +> 6 0 1 1 0 "Tremblay" +> 0 2 1 MSG_PROCESS +> 2 3 2 MSG_PROCESS_STATE +> 5 4 3 executing "0 1 0" +> 5 5 3 suspend "1 0 1" +> 5 6 3 sleep "1 1 0" +> 5 7 3 receive "1 0 0" +> 5 8 3 send "0 0 1" +> 5 9 3 task_execute "0 1 1" +> 4 10 0 2 2 MSG_PROCESS_LINK +> 4 11 0 2 2 MSG_PROCESS_TASK_LINK +> 6 0 2 1 0 "Jupiter" +> 6 0 3 1 0 "Fafard" +> 6 0 4 1 0 "Ginette" +> 6 0 5 1 0 "Bourassa" +> 0 12 0 LINK +> 6 0 6 12 0 "6" +> 6 0 7 12 0 "3" +> 6 0 8 12 0 "7" +> 6 0 9 12 0 "9" +> 6 0 10 12 0 "2" +> 6 0 11 12 0 "8" +> 6 0 12 12 0 "1" +> 6 0 13 12 0 "4" +> 6 0 14 12 0 "0" +> 6 0 15 12 0 "5" +> 4 13 0 1 12 HOST-LINK +> 4 14 0 12 12 LINK-LINK +> 4 15 0 12 1 LINK-HOST +> 14 0 13 0 G 3 0 +> 15 0 13 0 G 11 0 +> 14 0 14 0 G 11 1 +> 15 0 14 0 G 12 1 +> 14 0 14 0 G 12 2 +> 15 0 14 0 G 14 2 +> 14 0 14 0 G 14 3 +> 15 0 14 0 G 10 3 +> 14 0 14 0 G 10 4 +> 15 0 14 0 G 7 4 +> 14 0 14 0 G 7 5 +> 15 0 14 0 G 13 5 +> 14 0 15 0 G 13 6 +> 15 0 15 0 G 1 6 +> 14 0 14 0 G 11 7 +> 15 0 14 0 G 6 7 +> 14 0 14 0 G 6 8 +> 15 0 14 0 G 8 8 +> 14 0 15 0 G 8 9 +> 15 0 15 0 G 5 9 +> 14 0 14 0 G 13 10 +> 15 0 14 0 G 9 10 +> 14 0 15 0 G 9 11 +> 15 0 15 0 G 2 11 +> 14 0 14 0 G 10 12 +> 15 0 14 0 G 15 12 +> 14 0 15 0 G 15 13 +> 15 0 15 0 G 4 13 +> 14 0 14 0 G 12 14 +> 15 0 14 0 G 6 14 +> 14 0 13 0 G 1 15 +> 15 0 13 0 G 9 15 +> 14 0 14 0 G 7 16 +> 15 0 14 0 G 15 16 +> 6 0 16 2 3 "emigrant-1" +> 6 0 17 2 1 "master-2" +> 11 0 3 16 4 +> 11 0 3 17 4 +> 12 0 3 16 6 +> 12 0 3 17 8 +> 14 0 11 0 SR 17 p0 +> 13 2.000000 3 16 +> 12 2.000000 3 16 7 +> 13 2.020551 3 17 +> 12 2.020551 3 17 8 +> 14 2.020551 11 0 SR 17 p1 +> 13 2.020551 3 16 +> 15 2.020551 11 0 SR 16 p0 +> 14 2.020551 10 0 M 16 0 +> 7 2.020551 2 16 +> 6 2.020551 18 2 1 "emigrant-1" +> 11 2.020551 3 18 4 +> 15 2.020551 10 0 M 18 0 +> 12 2.020551 3 18 6 +> 13 4.020551 3 18 +> 12 4.020551 3 18 7 +> 13 4.020707 3 17 +> 12 4.020707 3 17 8 +> 14 4.020707 11 0 SR 17 p2 +> 13 4.020707 3 18 +> 15 4.020707 11 0 SR 18 p1 +> 14 4.020707 10 0 M 18 1 +> 7 4.020707 2 18 +> 6 4.020707 19 2 2 "emigrant-1" +> 11 4.020707 3 19 4 +> 15 4.020707 10 0 M 19 1 +> 12 4.020707 3 19 6 +> 13 6.020707 3 19 +> 12 6.020707 3 19 7 +> 13 6.035906 3 17 +> 12 6.035906 3 17 8 +> 14 6.035906 11 0 SR 17 p3 +> 13 6.035906 3 19 +> 15 6.035906 11 0 SR 19 p2 +> 14 6.035906 10 0 M 19 2 +> 7 6.035906 2 19 +> 6 6.035906 20 2 3 "emigrant-1" +> 11 6.035906 3 20 4 +> 15 6.035906 10 0 M 20 2 +> 12 6.035906 3 20 6 +> 13 8.035906 3 20 +> 12 8.035906 3 20 7 +> 13 8.056457 3 17 +> 12 8.056457 3 17 8 +> 14 8.056457 11 0 SR 17 p4 +> 13 8.056457 3 20 +> 15 8.056457 11 0 SR 20 p3 +> 14 8.056457 10 0 M 20 3 +> 7 8.056457 2 20 +> 6 8.056457 21 2 4 "emigrant-1" +> 11 8.056457 3 21 4 +> 15 8.056457 10 0 M 21 3 +> 12 8.056457 3 21 6 +> 13 10.056457 3 21 +> 12 10.056457 3 21 7 +> 13 10.069689 3 17 +> 12 10.069689 3 17 8 +> 14 10.069689 11 0 SR 17 p5 +> 13 10.069689 3 21 +> 15 10.069689 11 0 SR 21 p4 +> 14 10.069689 10 0 M 21 4 +> 7 10.069689 2 21 +> 6 10.069689 22 2 5 "emigrant-1" +> 11 10.069689 3 22 4 +> 15 10.069689 10 0 M 22 4 +> 12 10.069689 3 22 6 +> 13 12.069689 3 22 +> 12 12.069689 3 22 7 +> 13 12.090025 3 17 +> 12 12.090025 3 17 8 +> 14 12.090025 11 0 SR 17 p6 +> 13 12.090025 3 22 +> 15 12.090025 11 0 SR 22 p5 +> 14 12.090025 10 0 M 22 5 +> 7 12.090025 2 22 +> 6 12.090025 23 2 3 "emigrant-1" +> 11 12.090025 3 23 4 +> 15 12.090025 10 0 M 23 5 +> 12 12.090025 3 23 6 +> 13 14.090025 3 23 +> 12 14.090025 3 23 7 +> 13 14.110575 3 17 +> 12 14.110575 3 17 8 +> 14 14.110575 11 0 SR 17 p7 +> 13 14.110575 3 23 +> 15 14.110575 11 0 SR 23 p6 +> 14 14.110575 10 0 M 23 6 +> 7 14.110575 2 23 +> 6 14.110575 24 2 1 "emigrant-1" +> 11 14.110575 3 24 4 +> 15 14.110575 10 0 M 24 6 +> 12 14.110575 3 24 6 +> 13 16.110575 3 24 +> 12 16.110575 3 24 7 +> 13 16.110731 3 17 +> 12 16.110731 3 17 8 +> 14 16.110731 11 0 SR 17 p8 +> 13 16.110731 3 24 +> 15 16.110731 11 0 SR 24 p7 +> 14 16.110731 10 0 M 24 7 +> 7 16.110731 2 24 +> 6 16.110731 25 2 4 "emigrant-1" +> 11 16.110731 3 25 4 +> 15 16.110731 10 0 M 25 7 +> 12 16.110731 3 25 6 +> 13 18.110731 3 25 +> 12 18.110731 3 25 7 +> 13 18.123963 3 17 +> 7 18.123963 2 17 +> 13 18.123963 3 25 +> 15 18.123963 11 0 SR 25 p8 +> 7 18.123963 2 25 +> 7 18.123963 1 3 > 7 18.123963 1 1 +> 7 18.123963 12 14 +> 7 18.123963 12 12 +> 7 18.123963 12 10 +> 7 18.123963 12 7 +> 7 18.123963 12 13 +> 7 18.123963 12 15 +> 7 18.123963 12 6 +> 7 18.123963 12 8 +> 7 18.123963 12 11 +> 7 18.123963 12 9 +> 7 18.123963 1 5 +> 7 18.123963 1 2 +> 7 18.123963 1 4 > 7 18.123963 0 0 $ rm -rf tracing/procmig.trace diff --git a/examples/msg/tracing/tasks.tesh b/examples/msg/tracing/tasks.tesh index bc26ee3dfd..0370fc56df 100644 --- a/examples/msg/tracing/tasks.tesh +++ b/examples/msg/tracing/tasks.tesh @@ -2,53 +2,54 @@ p Tracing tasks -$ $SG_TEST_EXENV ${bindir:=.}/tracing/tasks$EXEEXT --cfg=tracing:1 --cfg=tracing/msg/task:1 --cfg=tracing/filename:tracing/tasks.trace ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml +$ $SG_TEST_EXENV ${bindir:=.}/tracing/tasks$EXEEXT --cfg=tracing:1 --cfg=tracing/categorized:1 --cfg=tracing/buffer:1 --cfg=tracing/msg/task:1 --cfg=tracing/filename:tracing/tasks.trace ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/buffer' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/msg/task' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/tasks.trace' > [Tremblay:master:(1) 0.000000] [msg_test/INFO] master 20 50000000.000000 1000000.000000 5 -> [Tremblay:slave:(2) 0.002339] [msg_test/INFO] Executing task 50000000.000000 -> [Jupiter:slave:(3) 0.168300] [msg_test/INFO] Executing task 50000000.000000 -> [Fafard:slave:(4) 0.386454] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 0.512049] [msg_test/INFO] End of execution -> [Ginette:slave:(5) 0.526913] [msg_test/INFO] Executing task 50000000.000000 -> [Bourassa:slave:(6) 0.742786] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 0.745124] [msg_test/INFO] Executing task 50000000.000000 -> [Jupiter:slave:(3) 0.823643] [msg_test/INFO] End of execution -> [Jupiter:slave:(3) 0.989605] [msg_test/INFO] Executing task 50000000.000000 -> [Fafard:slave:(4) 1.041796] [msg_test/INFO] End of execution -> [Tremblay:slave:(2) 1.254834] [msg_test/INFO] End of execution -> [Fafard:slave:(4) 1.259949] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 1.262288] [msg_test/INFO] Executing task 50000000.000000 -> [Ginette:slave:(5) 1.558011] [msg_test/INFO] End of execution -> [Jupiter:slave:(3) 1.644947] [msg_test/INFO] End of execution -> [Ginette:slave:(5) 1.698471] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 1.771998] [msg_test/INFO] End of execution -> [Bourassa:slave:(6) 1.773883] [msg_test/INFO] End of execution -> [Jupiter:slave:(3) 1.864433] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 1.866771] [msg_test/INFO] Executing task 50000000.000000 -> [Fafard:slave:(4) 1.915291] [msg_test/INFO] End of execution -> [Bourassa:slave:(6) 2.082643] [msg_test/INFO] Executing task 50000000.000000 -> [Fafard:slave:(4) 2.300797] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 2.376481] [msg_test/INFO] End of execution -> [Tremblay:slave:(2) 2.378820] [msg_test/INFO] Executing task 50000000.000000 -> [Jupiter:slave:(3) 2.519775] [msg_test/INFO] End of execution -> [Jupiter:slave:(3) 2.685737] [msg_test/INFO] Executing task 50000000.000000 -> [Ginette:slave:(5) 2.729569] [msg_test/INFO] End of execution -> [Ginette:slave:(5) 2.870028] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 2.888530] [msg_test/INFO] End of execution -> [Tremblay:slave:(2) 2.890868] [msg_test/INFO] Executing task 50000000.000000 -> [Fafard:slave:(4) 2.956139] [msg_test/INFO] End of execution -> [Bourassa:slave:(6) 3.113741] [msg_test/INFO] End of execution -> [Fafard:slave:(4) 3.174292] [msg_test/INFO] Executing task 50000000.000000 -> [Jupiter:slave:(3) 3.341079] [msg_test/INFO] End of execution -> [Bourassa:slave:(6) 3.390164] [msg_test/INFO] Executing task 50000000.000000 -> [Tremblay:slave:(2) 3.400578] [msg_test/INFO] End of execution -> [Fafard:slave:(4) 3.829634] [msg_test/INFO] End of execution -> [Ginette:slave:(5) 3.901126] [msg_test/INFO] End of execution -> [Bourassa:slave:(6) 4.421262] [msg_test/INFO] End of execution -> [4.441598] [msg_test/INFO] Simulation time 4.4416 - +> [Tremblay:slave:(2) 0.002164] [msg_test/INFO] Executing task 50000000.000000 +> [Jupiter:slave:(3) 0.168126] [msg_test/INFO] Executing task 50000000.000000 +> [Fafard:slave:(4) 0.386279] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 0.511874] [msg_test/INFO] End of execution +> [Ginette:slave:(5) 0.526739] [msg_test/INFO] Executing task 50000000.000000 +> [Bourassa:slave:(6) 0.742611] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 0.744775] [msg_test/INFO] Executing task 50000000.000000 +> [Jupiter:slave:(3) 0.823468] [msg_test/INFO] End of execution +> [Jupiter:slave:(3) 0.989430] [msg_test/INFO] Executing task 50000000.000000 +> [Fafard:slave:(4) 1.041621] [msg_test/INFO] End of execution +> [Tremblay:slave:(2) 1.254485] [msg_test/INFO] End of execution +> [Fafard:slave:(4) 1.259775] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 1.261939] [msg_test/INFO] Executing task 50000000.000000 +> [Ginette:slave:(5) 1.557837] [msg_test/INFO] End of execution +> [Jupiter:slave:(3) 1.644772] [msg_test/INFO] End of execution +> [Ginette:slave:(5) 1.698296] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 1.771649] [msg_test/INFO] End of execution +> [Bourassa:slave:(6) 1.773709] [msg_test/INFO] End of execution +> [Jupiter:slave:(3) 1.864258] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 1.866422] [msg_test/INFO] Executing task 50000000.000000 +> [Fafard:slave:(4) 1.915117] [msg_test/INFO] End of execution +> [Bourassa:slave:(6) 2.082294] [msg_test/INFO] Executing task 50000000.000000 +> [Fafard:slave:(4) 2.300447] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 2.376132] [msg_test/INFO] End of execution +> [Tremblay:slave:(2) 2.378296] [msg_test/INFO] Executing task 50000000.000000 +> [Jupiter:slave:(3) 2.519600] [msg_test/INFO] End of execution +> [Jupiter:slave:(3) 2.685562] [msg_test/INFO] Executing task 50000000.000000 +> [Ginette:slave:(5) 2.729394] [msg_test/INFO] End of execution +> [Ginette:slave:(5) 2.869854] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 2.888006] [msg_test/INFO] End of execution +> [Tremblay:slave:(2) 2.890170] [msg_test/INFO] Executing task 50000000.000000 +> [Fafard:slave:(4) 2.955790] [msg_test/INFO] End of execution +> [Bourassa:slave:(6) 3.113392] [msg_test/INFO] End of execution +> [Fafard:slave:(4) 3.173943] [msg_test/INFO] Executing task 50000000.000000 +> [Jupiter:slave:(3) 3.340904] [msg_test/INFO] End of execution +> [Bourassa:slave:(6) 3.389815] [msg_test/INFO] Executing task 50000000.000000 +> [Tremblay:slave:(2) 3.399880] [msg_test/INFO] End of execution +> [Fafard:slave:(4) 3.829285] [msg_test/INFO] End of execution +> [Ginette:slave:(5) 3.900952] [msg_test/INFO] End of execution +> [Bourassa:slave:(6) 4.420913] [msg_test/INFO] End of execution +> [4.441249] [msg_test/INFO] Simulation time 4.44125 $ cat tracing/tasks.trace > %EventDef PajeDefineContainerType 0 @@ -69,7 +70,7 @@ $ cat tracing/tasks.trace > %EndEventDef > %EventDef PajeDefineEventType 3 > % Alias string -> % EntityType string +> % ContainerType string > % Name string > % Color color > %EndEventDef @@ -96,46 +97,46 @@ $ cat tracing/tasks.trace > %EventDef PajeDestroyContainer 7 > % Time date > % Type string -> % Container string +> % Name string > %EndEventDef > %EventDef PajeSetVariable 8 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeAddVariable 9 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSubVariable 10 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajeSetState 11 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePushState 12 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef > %EventDef PajePopState 13 > % Time date -> % EntityType string +> % Type string > % Container string > %EndEventDef > %EventDef PajeStartLink 14 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % SourceContainer string @@ -143,7 +144,7 @@ $ cat tracing/tasks.trace > %EndEventDef > %EventDef PajeEndLink 15 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > % DestContainer string @@ -151,501 +152,622 @@ $ cat tracing/tasks.trace > %EndEventDef > %EventDef PajeNewEvent 16 > % Time date -> % EntityType string +> % Type string > % Container string > % Value string > %EndEventDef -> 0 1 0 L1 -> 6 0 1 1 0 AS0 -> 0 2 1 HOST -> 6 0 2 2 1 Tremblay -> 1 3 2 power "1 1 1" -> 0 4 2 MSG_TASK -> 2 5 4 MSG_TASK_STATE -> 5 6 5 MSG_task_execute "0 1 0" -> 5 7 5 created "1 1 0" -> 4 8 0 4 4 MSG_TASK_LINK -> 6 0 3 2 1 Jupiter -> 6 0 4 2 1 Fafard -> 6 0 5 2 1 Ginette -> 6 0 6 2 1 Bourassa -> 0 9 1 ROUTER -> 6 0 7 9 1 R.4-3 -> 6 0 8 9 1 R.3-2-5 -> 6 0 9 9 1 R.2-0 -> 6 0 10 9 1 R.1-0 -> 6 0 11 9 1 R.1-8-6 -> 6 0 12 9 1 R.6-7 -> 0 10 1 LINK -> 6 0 13 10 1 6 -> 1 11 10 bandwidth "1 1 1" -> 1 12 10 latency "1 1 1" -> 6 0 14 10 1 11 -> 6 0 15 10 1 3 -> 6 0 16 10 1 7 -> 6 0 17 10 1 9 -> 6 0 18 10 1 12 -> 6 0 19 10 1 2 -> 6 0 20 10 1 8 -> 6 0 21 10 1 1 -> 6 0 22 10 1 4 -> 6 0 23 10 1 0 -> 6 0 24 10 1 10 -> 6 0 25 10 1 5 -> 6 0 26 10 1 loopback -> 4 13 1 2 10 HOST-LINK -> 4 14 1 10 9 LINK-ROUTER -> 4 15 1 10 10 LINK-LINK -> 4 16 1 10 2 LINK-HOST -> 4 17 1 9 10 ROUTER-LINK -> 8 0 3 2 98095000.000000 -> 8 0 3 3 76296000.000000 -> 8 0 3 4 76296000.000000 -> 8 0 3 5 48492000.000000 -> 8 0 3 6 48492000.000000 -> 8 0 11 13 41279125.000000 -> 8 0 12 13 0.000060 -> 8 0 11 14 252750.000000 -> 8 0 12 14 0.005705 -> 8 0 11 15 34285622.000000 -> 8 0 12 15 0.000514 -> 8 0 11 16 11618875.000000 -> 8 0 12 16 0.000190 -> 8 0 11 17 7209750.000000 -> 8 0 12 17 0.001462 -> 8 0 11 18 1792625.000000 -> 8 0 12 18 0.007878 -> 8 0 11 19 22222222.000000 -> 8 0 12 19 0.000137 -> 8 0 11 20 8158000.000000 -> 8 0 12 20 0.000271 -> 8 0 11 21 34285625.000000 -> 8 0 12 21 0.000514 -> 8 0 11 22 10099625.000000 -> 8 0 12 22 0.000480 -> 8 0 11 23 41279125.000000 -> 8 0 12 23 0.000060 -> 8 0 11 24 4679750.000000 -> 8 0 12 24 0.000849 -> 8 0 11 25 27946250.000000 -> 8 0 12 25 0.000278 -> 8 0 11 26 498000000.000000 -> 8 0 12 26 0.000015 -> 14 0 13 1 G 4 0 -> 15 0 13 1 G 26 0 -> 14 0 13 1 G 4 1 -> 15 0 13 1 G 20 1 -> 14 0 14 1 G 20 2 -> 15 0 14 1 G 11 2 -> 14 0 15 1 G 20 3 -> 15 0 15 1 G 21 3 -> 14 0 15 1 G 21 4 -> 15 0 15 1 G 23 4 -> 14 0 15 1 G 23 5 -> 15 0 15 1 G 19 5 -> 14 0 15 1 G 19 6 -> 15 0 15 1 G 15 6 -> 14 0 15 1 G 15 7 -> 15 0 15 1 G 22 7 -> 14 0 16 1 G 22 8 -> 15 0 16 1 G 2 8 -> 14 0 15 1 G 20 9 -> 15 0 15 1 G 13 9 -> 14 0 15 1 G 13 10 -> 15 0 15 1 G 16 10 -> 14 0 16 1 G 16 11 -> 15 0 16 1 G 6 11 -> 14 0 15 1 G 22 12 -> 15 0 15 1 G 17 12 -> 14 0 16 1 G 17 13 -> 15 0 16 1 G 3 13 -> 14 0 15 1 G 19 14 -> 15 0 15 1 G 25 14 -> 14 0 16 1 G 25 15 -> 15 0 16 1 G 5 15 -> 14 0 17 1 G 9 16 -> 15 0 17 1 G 19 16 -> 14 0 14 1 G 19 17 -> 15 0 14 1 G 8 17 -> 14 0 17 1 G 9 18 -> 15 0 17 1 G 23 18 -> 14 0 14 1 G 23 19 -> 15 0 14 1 G 10 19 -> 14 0 17 1 G 7 20 -> 15 0 17 1 G 15 20 -> 14 0 14 1 G 15 21 -> 15 0 14 1 G 8 21 -> 14 0 17 1 G 7 22 -> 15 0 17 1 G 22 22 -> 14 0 17 1 G 8 23 -> 15 0 17 1 G 25 23 -> 14 0 17 1 G 11 24 -> 15 0 17 1 G 13 24 -> 14 0 14 1 G 13 25 -> 15 0 14 1 G 12 25 -> 14 0 17 1 G 11 26 -> 15 0 17 1 G 21 26 -> 14 0 14 1 G 21 27 -> 15 0 14 1 G 10 27 -> 14 0 17 1 G 12 28 -> 15 0 17 1 G 16 28 -> 14 0 13 1 G 2 29 -> 15 0 13 1 G 26 29 -> 14 0 15 1 G 21 30 -> 15 0 15 1 G 13 30 -> 14 0 13 1 G 2 31 -> 15 0 13 1 G 17 31 -> 14 0 15 1 G 15 32 -> 15 0 15 1 G 25 32 -> 14 0 13 1 G 6 33 -> 15 0 13 1 G 26 33 -> 14 0 13 1 G 3 34 -> 15 0 13 1 G 26 34 -> 14 0 13 1 G 5 35 -> 15 0 13 1 G 26 35 -> 6 0 27 4 2 task-0 -> 1 18 4 compute "1 1 1" -> 8 0 18 27 1.000000 -> 12 0 5 27 7 -> 13 0 5 27 -> 14 0 8 0 SR 27 0 -> 7 0 4 27 -> 6 0.002339 28 4 2 task-0 -> 6 0.002339 29 4 2 task-1 -> 8 0.002339 18 28 1.000000 -> 12 0.002339 5 28 7 -> 15 0.002339 8 0 SR 28 0 -> 12 0.002339 5 28 6 -> 8 0.002339 18 29 1.000000 -> 12 0.002339 5 29 7 -> 13 0.002339 5 29 -> 14 0.002339 8 0 SR 29 1 -> 7 0.002339 4 29 -> 6 0.168300 30 4 3 task-1 -> 6 0.168300 31 4 2 task-2 -> 8 0.168300 18 30 1.000000 -> 12 0.168300 5 30 7 -> 15 0.168300 8 0 SR 30 1 -> 12 0.168300 5 30 6 -> 8 0.168300 18 31 1.000000 -> 12 0.168300 5 31 7 -> 13 0.168300 5 31 -> 14 0.168300 8 0 SR 31 2 -> 7 0.168300 4 31 -> 6 0.386454 32 4 4 task-2 -> 6 0.386454 33 4 2 task-3 -> 8 0.386454 18 32 1.000000 -> 12 0.386454 5 32 7 -> 15 0.386454 8 0 SR 32 2 -> 12 0.386454 5 32 6 -> 8 0.386454 18 33 1.000000 -> 12 0.386454 5 33 7 -> 13 0.386454 5 33 -> 14 0.386454 8 0 SR 33 3 -> 7 0.386454 4 33 -> 13 0.512049 5 28 -> 7 0.512049 4 28 -> 6 0.526913 34 4 5 task-3 -> 6 0.526913 35 4 2 task-4 -> 8 0.526913 18 34 1.000000 -> 12 0.526913 5 34 7 -> 15 0.526913 8 0 SR 34 3 -> 12 0.526913 5 34 6 -> 8 0.526913 18 35 1.000000 -> 12 0.526913 5 35 7 -> 13 0.526913 5 35 -> 14 0.526913 8 0 SR 35 4 -> 7 0.526913 4 35 -> 6 0.742786 36 4 6 task-4 -> 6 0.742786 37 4 2 task-5 -> 8 0.742786 18 36 1.000000 -> 12 0.742786 5 36 7 -> 15 0.742786 8 0 SR 36 4 -> 12 0.742786 5 36 6 -> 8 0.742786 18 37 1.000000 -> 12 0.742786 5 37 7 -> 13 0.742786 5 37 -> 14 0.742786 8 0 SR 37 5 -> 7 0.742786 4 37 -> 6 0.745124 38 4 2 task-5 -> 6 0.745124 39 4 2 task-6 -> 8 0.745124 18 38 1.000000 -> 12 0.745124 5 38 7 -> 15 0.745124 8 0 SR 38 5 -> 12 0.745124 5 38 6 -> 8 0.745124 18 39 1.000000 -> 12 0.745124 5 39 7 -> 13 0.745124 5 39 -> 14 0.745124 8 0 SR 39 6 -> 7 0.745124 4 39 -> 13 0.823643 5 30 -> 7 0.823643 4 30 -> 6 0.989605 40 4 2 task-7 -> 8 0.989605 18 40 1.000000 -> 12 0.989605 5 40 7 -> 13 0.989605 5 40 -> 14 0.989605 8 0 SR 40 7 -> 7 0.989605 4 40 -> 6 0.989605 41 4 3 task-6 -> 8 0.989605 18 41 1.000000 -> 12 0.989605 5 41 7 -> 15 0.989605 8 0 SR 41 6 -> 12 0.989605 5 41 6 -> 13 1.041796 5 32 -> 7 1.041796 4 32 -> 13 1.254834 5 38 -> 7 1.254834 4 38 -> 6 1.259949 42 4 2 task-8 -> 8 1.259949 18 42 1.000000 -> 12 1.259949 5 42 7 -> 13 1.259949 5 42 -> 14 1.259949 8 0 SR 42 8 -> 7 1.259949 4 42 -> 6 1.259949 43 4 4 task-7 -> 6 1.262288 44 4 2 task-8 -> 6 1.262288 45 4 2 task-9 -> 8 1.259949 18 43 1.000000 -> 12 1.259949 5 43 7 -> 15 1.259949 8 0 SR 43 7 -> 12 1.259949 5 43 6 -> 8 1.262288 18 44 1.000000 -> 12 1.262288 5 44 7 -> 15 1.262288 8 0 SR 44 8 -> 12 1.262288 5 44 6 -> 8 1.262288 18 45 1.000000 -> 12 1.262288 5 45 7 -> 13 1.262288 5 45 -> 14 1.262288 8 0 SR 45 9 -> 7 1.262288 4 45 -> 13 1.558011 5 34 -> 7 1.558011 4 34 -> 13 1.644947 5 41 -> 7 1.644947 4 41 -> 6 1.698471 46 4 2 task-10 -> 8 1.698471 18 46 1.000000 -> 12 1.698471 5 46 7 -> 13 1.698471 5 46 -> 14 1.698471 8 0 SR 46 10 -> 7 1.698471 4 46 -> 6 1.698471 47 4 5 task-9 -> 8 1.698471 18 47 1.000000 -> 12 1.698471 5 47 7 -> 15 1.698471 8 0 SR 47 9 -> 12 1.698471 5 47 6 -> 13 1.771998 5 44 -> 7 1.771998 4 44 -> 13 1.773883 5 36 -> 7 1.773883 4 36 -> 6 1.864433 48 4 3 task-10 -> 6 1.864433 49 4 2 task-11 -> 8 1.864433 18 48 1.000000 -> 12 1.864433 5 48 7 -> 15 1.864433 8 0 SR 48 10 -> 12 1.864433 5 48 6 -> 8 1.864433 18 49 1.000000 -> 12 1.864433 5 49 7 -> 13 1.864433 5 49 -> 14 1.864433 8 0 SR 49 11 -> 7 1.864433 4 49 -> 6 1.866771 50 4 2 task-11 -> 6 1.866771 51 4 2 task-12 -> 8 1.866771 18 50 1.000000 -> 12 1.866771 5 50 7 -> 15 1.866771 8 0 SR 50 11 -> 12 1.866771 5 50 6 -> 8 1.866771 18 51 1.000000 -> 12 1.866771 5 51 7 -> 13 1.866771 5 51 -> 14 1.866771 8 0 SR 51 12 -> 7 1.866771 4 51 -> 13 1.915291 5 43 -> 7 1.915291 4 43 -> 6 2.082643 52 4 6 task-12 -> 6 2.082643 53 4 2 task-13 -> 8 2.082643 18 52 1.000000 -> 12 2.082643 5 52 7 -> 15 2.082643 8 0 SR 52 12 -> 12 2.082643 5 52 6 -> 8 2.082643 18 53 1.000000 -> 12 2.082643 5 53 7 -> 13 2.082643 5 53 -> 14 2.082643 8 0 SR 53 13 -> 7 2.082643 4 53 -> 6 2.300797 54 4 4 task-13 -> 6 2.300797 55 4 2 task-14 -> 8 2.300797 18 54 1.000000 -> 12 2.300797 5 54 7 -> 15 2.300797 8 0 SR 54 13 -> 12 2.300797 5 54 6 -> 8 2.300797 18 55 1.000000 -> 12 2.300797 5 55 7 -> 13 2.300797 5 55 -> 14 2.300797 8 0 SR 55 14 -> 7 2.300797 4 55 -> 13 2.376481 5 50 -> 7 2.376481 4 50 -> 6 2.378820 56 4 2 task-15 -> 8 2.378820 18 56 1.000000 -> 12 2.378820 5 56 7 -> 13 2.378820 5 56 -> 14 2.378820 8 0 SR 56 15 -> 7 2.378820 4 56 -> 6 2.378820 57 4 2 task-14 -> 8 2.378820 18 57 1.000000 -> 12 2.378820 5 57 7 -> 15 2.378820 8 0 SR 57 14 -> 12 2.378820 5 57 6 -> 13 2.519775 5 48 -> 7 2.519775 4 48 -> 6 2.685737 58 4 2 task-16 -> 8 2.685737 18 58 1.000000 -> 12 2.685737 5 58 7 -> 13 2.685737 5 58 -> 14 2.685737 8 0 SR 58 16 -> 7 2.685737 4 58 -> 6 2.685737 59 4 3 task-15 -> 8 2.685737 18 59 1.000000 -> 12 2.685737 5 59 7 -> 15 2.685737 8 0 SR 59 15 -> 12 2.685737 5 59 6 -> 13 2.729569 5 47 -> 7 2.729569 4 47 -> 6 2.870028 60 4 2 task-17 -> 8 2.870028 18 60 1.000000 -> 12 2.870028 5 60 7 -> 13 2.870028 5 60 -> 14 2.870028 8 0 SR 60 17 -> 7 2.870028 4 60 -> 6 2.870028 61 4 5 task-16 -> 8 2.870028 18 61 1.000000 -> 12 2.870028 5 61 7 -> 15 2.870028 8 0 SR 61 16 -> 12 2.870028 5 61 6 -> 13 2.888530 5 57 -> 7 2.888530 4 57 -> 6 2.890868 62 4 2 task-18 -> 8 2.890868 18 62 1.000000 -> 12 2.890868 5 62 7 -> 13 2.890868 5 62 -> 14 2.890868 8 0 SR 62 18 -> 7 2.890868 4 62 -> 6 2.890868 63 4 2 task-17 -> 8 2.890868 18 63 1.000000 -> 12 2.890868 5 63 7 -> 15 2.890868 8 0 SR 63 17 -> 12 2.890868 5 63 6 -> 13 2.956139 5 54 -> 7 2.956139 4 54 -> 13 3.113741 5 52 -> 7 3.113741 4 52 -> 6 3.174292 64 4 2 task-19 -> 8 3.174292 18 64 1.000000 -> 12 3.174292 5 64 7 -> 13 3.174292 5 64 -> 14 3.174292 8 0 SR 64 19 -> 7 3.174292 4 64 -> 6 3.174292 65 4 4 task-18 -> 8 3.174292 18 65 1.000000 -> 12 3.174292 5 65 7 -> 15 3.174292 8 0 SR 65 18 -> 12 3.174292 5 65 6 -> 13 3.341079 5 59 -> 7 3.341079 4 59 -> 6 3.390164 66 4 6 task-19 -> 6 3.390164 67 4 2 task-0 -> 1 19 4 finalize "1 1 1" -> 8 3.390164 18 66 1.000000 -> 12 3.390164 5 66 7 -> 15 3.390164 8 0 SR 66 19 -> 12 3.390164 5 66 6 -> 8 3.390164 19 67 1.000000 -> 12 3.390164 5 67 7 -> 13 3.390164 5 67 -> 14 3.390164 8 0 SR 67 20 -> 7 3.390164 4 67 -> 13 3.400578 5 63 -> 7 3.400578 4 63 -> 6 3.405364 68 4 3 task-0 -> 8 3.405364 19 68 1.000000 -> 12 3.405364 5 68 7 -> 15 3.405364 8 0 SR 68 20 -> 7 3.405364 4 68 -> 6 3.405364 69 4 2 task-1 -> 8 3.405364 19 69 1.000000 -> 12 3.405364 5 69 7 -> 13 3.405364 5 69 -> 14 3.405364 8 0 SR 69 21 -> 7 3.405364 4 69 -> 6 3.405520 70 4 2 task-1 -> 8 3.405520 19 70 1.000000 -> 12 3.405520 5 70 7 -> 15 3.405520 8 0 SR 70 21 -> 7 3.405520 4 70 -> 6 3.405520 71 4 2 task-2 -> 8 3.405520 19 71 1.000000 -> 12 3.405520 5 71 7 -> 13 3.405520 5 71 -> 14 3.405520 8 0 SR 71 22 -> 7 3.405520 4 71 -> 13 3.829634 5 65 -> 7 3.829634 4 65 -> 6 3.850185 72 4 2 task-3 -> 8 3.850185 19 72 1.000000 -> 12 3.850185 5 72 7 -> 13 3.850185 5 72 -> 14 3.850185 8 0 SR 72 23 -> 7 3.850185 4 72 -> 6 3.850185 73 4 4 task-2 -> 8 3.850185 19 73 1.000000 -> 12 3.850185 5 73 7 -> 15 3.850185 8 0 SR 73 22 -> 7 3.850185 4 73 -> 13 3.901126 5 61 -> 7 3.901126 4 61 -> 6 3.914358 74 4 2 task-4 -> 8 3.914358 19 74 1.000000 -> 12 3.914358 5 74 7 -> 13 3.914358 5 74 -> 14 3.914358 8 0 SR 74 24 -> 7 3.914358 4 74 -> 6 3.914358 75 4 5 task-3 -> 8 3.914358 19 75 1.000000 -> 12 3.914358 5 75 7 -> 15 3.914358 8 0 SR 75 23 -> 7 3.914358 4 75 -> 13 4.421262 5 66 -> 7 4.421262 4 66 -> 6 4.441598 76 4 6 task-4 -> 8 4.441598 19 76 1.000000 -> 12 4.441598 5 76 7 -> 15 4.441598 8 0 SR 76 24 -> 7 4.441598 4 76 -> 7 4.441598 2 4 -> 7 4.441598 9 9 -> 7 4.441598 9 7 -> 7 4.441598 9 8 -> 7 4.441598 9 11 -> 7 4.441598 9 12 -> 7 4.441598 2 2 -> 7 4.441598 10 24 -> 7 4.441598 10 14 -> 7 4.441598 10 18 -> 7 4.441598 10 26 -> 7 4.441598 9 10 -> 7 4.441598 10 23 -> 7 4.441598 10 21 -> 7 4.441598 10 19 -> 7 4.441598 10 15 -> 7 4.441598 10 22 -> 7 4.441598 10 25 -> 7 4.441598 10 13 -> 7 4.441598 10 16 -> 7 4.441598 10 20 -> 7 4.441598 10 17 -> 7 4.441598 2 6 -> 7 4.441598 2 3 -> 7 4.441598 2 5 -> 7 4.441598 1 1 -> 7 4.441598 0 0 +> 0 1 0 HOST +> 6 0 1 1 0 "Tremblay" +> 1 2 1 power "1 1 1" +> 0 3 1 MSG_TASK +> 2 4 3 MSG_TASK_STATE +> 5 5 4 MSG_task_execute "0 1 0" +> 5 6 4 created "1 1 0" +> 4 7 0 3 3 MSG_TASK_LINK +> 6 0 2 1 0 "Jupiter" +> 6 0 3 1 0 "Fafard" +> 6 0 4 1 0 "Ginette" +> 6 0 5 1 0 "Bourassa" +> 0 8 0 LINK +> 6 0 6 8 0 "6" +> 1 9 8 bandwidth "1 1 1" +> 1 10 8 latency "1 1 1" +> 6 0 7 8 0 "3" +> 6 0 8 8 0 "7" +> 6 0 9 8 0 "9" +> 6 0 10 8 0 "2" +> 6 0 11 8 0 "8" +> 6 0 12 8 0 "1" +> 6 0 13 8 0 "4" +> 6 0 14 8 0 "0" +> 6 0 15 8 0 "5" +> 4 11 0 1 8 HOST-LINK +> 4 12 0 8 8 LINK-LINK +> 4 13 0 8 1 LINK-HOST +> 8 0 2 1 98095000.000000 +> 8 0 2 2 76296000.000000 +> 8 0 2 3 76296000.000000 +> 8 0 2 4 48492000.000000 +> 8 0 2 5 48492000.000000 +> 8 0 9 6 41279125.000000 +> 8 0 10 6 0.000060 +> 8 0 9 7 34285625.000000 +> 8 0 10 7 0.000514 +> 8 0 9 8 11618875.000000 +> 8 0 10 8 0.000190 +> 8 0 9 9 7209750.000000 +> 8 0 10 9 0.001462 +> 8 0 9 10 118682500.000000 +> 8 0 10 10 0.000137 +> 8 0 9 11 8158000.000000 +> 8 0 10 11 0.000271 +> 8 0 9 12 34285625.000000 +> 8 0 10 12 0.000514 +> 8 0 9 13 10099625.000000 +> 8 0 10 13 0.000480 +> 8 0 9 14 41279125.000000 +> 8 0 10 14 0.000060 +> 8 0 9 15 27946250.000000 +> 8 0 10 15 0.000278 +> 14 0 11 0 G 3 0 +> 15 0 11 0 G 11 0 +> 14 0 12 0 G 11 1 +> 15 0 12 0 G 12 1 +> 14 0 12 0 G 12 2 +> 15 0 12 0 G 14 2 +> 14 0 12 0 G 14 3 +> 15 0 12 0 G 10 3 +> 14 0 12 0 G 10 4 +> 15 0 12 0 G 7 4 +> 14 0 12 0 G 7 5 +> 15 0 12 0 G 13 5 +> 14 0 13 0 G 13 6 +> 15 0 13 0 G 1 6 +> 14 0 12 0 G 11 7 +> 15 0 12 0 G 6 7 +> 14 0 12 0 G 6 8 +> 15 0 12 0 G 8 8 +> 14 0 13 0 G 8 9 +> 15 0 13 0 G 5 9 +> 14 0 12 0 G 13 10 +> 15 0 12 0 G 9 10 +> 14 0 13 0 G 9 11 +> 15 0 13 0 G 2 11 +> 14 0 12 0 G 10 12 +> 15 0 12 0 G 15 12 +> 14 0 13 0 G 15 13 +> 15 0 13 0 G 4 13 +> 14 0 12 0 G 12 14 +> 15 0 12 0 G 6 14 +> 14 0 11 0 G 1 15 +> 15 0 11 0 G 9 15 +> 14 0 12 0 G 7 16 +> 15 0 12 0 G 15 16 +> 1 14 8 bcompute "1 0 0" +> 1 15 1 pcompute "1 0 0" +> 1 16 8 bfinalize "0 1 0" +> 1 17 1 pfinalize "0 1 0" +> 6 0 16 3 1 "task-0" +> 1 18 3 compute "1 1 1" +> 8 0 18 16 1.000000 +> 12 0 4 16 6 +> 13 0 4 16 +> 14 0 7 0 SR 16 0 +> 7 0 3 16 +> 6 0.002164 17 3 1 "task-0" +> 6 0.002164 18 3 1 "task-1" +> 8 0.002164 18 17 1.000000 +> 12 0.002164 4 17 6 +> 15 0.002164 7 0 SR 17 0 +> 12 0.002164 4 17 5 +> 8 0.002164 18 18 1.000000 +> 12 0.002164 4 18 6 +> 13 0.002164 4 18 +> 14 0.002164 7 0 SR 18 1 +> 7 0.002164 3 18 +> 6 0.168126 19 3 2 "task-1" +> 6 0.168126 20 3 1 "task-2" +> 8 0.017364 14 9 0.000000 +> 9 0.017364 14 9 6632970.000000 +> 10 0.168126 14 9 6632970.000000 +> 8 0.168126 18 19 1.000000 +> 12 0.168126 4 19 6 +> 15 0.168126 7 0 SR 19 1 +> 12 0.168126 4 19 5 +> 8 0.168126 18 20 1.000000 +> 12 0.168126 4 20 6 +> 13 0.168126 4 20 +> 14 0.168126 7 0 SR 20 2 +> 7 0.168126 3 20 +> 8 0.002164 15 1 0.000000 +> 9 0.002164 15 1 98095000.000000 +> 10 0.168126 15 1 98095000.000000 +> 6 0.386279 21 3 3 "task-2" +> 6 0.386279 22 3 1 "task-3" +> 8 0.188676 14 13 0.000000 +> 9 0.188676 14 13 5060664.718311 +> 8 0.188676 14 7 0.000000 +> 9 0.188676 14 7 5060664.718311 +> 8 0.188676 14 10 0.000000 +> 9 0.188676 14 10 5060664.718311 +> 8 0.188676 14 14 0.000000 +> 9 0.188676 14 14 5060664.718311 +> 8 0.188676 14 12 0.000000 +> 9 0.188676 14 12 5060664.718311 +> 8 0.188676 14 11 0.000000 +> 9 0.188676 14 11 5060664.718311 +> 10 0.386279 14 13 5060664.718311 +> 10 0.386279 14 7 5060664.718311 +> 10 0.386279 14 10 5060664.718311 +> 10 0.386279 14 14 5060664.718311 +> 10 0.386279 14 12 5060664.718311 +> 10 0.386279 14 11 5060664.718311 +> 8 0.386279 18 21 1.000000 +> 12 0.386279 4 21 6 +> 15 0.386279 7 0 SR 21 2 +> 12 0.386279 4 21 5 +> 8 0.386279 18 22 1.000000 +> 12 0.386279 4 22 6 +> 13 0.386279 4 22 +> 14 0.386279 7 0 SR 22 3 +> 7 0.386279 3 22 +> 9 0.168126 15 1 98095000.000000 +> 10 0.386279 15 1 98095000.000000 +> 9 0.386279 15 1 98095000.000000 +> 9 0.399511 14 13 7859911.230163 +> 9 0.399511 14 7 7859911.230163 +> 8 0.399511 14 15 0.000000 +> 9 0.399511 14 15 7859911.230163 +> 10 0.511874 15 1 98095000.000000 +> 10 0.511874 14 13 7859911.230163 +> 10 0.511874 14 7 7859911.230163 +> 10 0.511874 14 15 7859911.230163 +> 13 0.511874 4 17 +> 7 0.511874 3 17 +> 9 0.511874 14 13 7859911.230163 +> 9 0.511874 14 7 7859911.230163 +> 9 0.511874 14 15 7859911.230163 +> 6 0.526739 23 3 4 "task-3" +> 6 0.526739 24 3 1 "task-4" +> 10 0.526739 14 13 7859911.230163 +> 10 0.526739 14 7 7859911.230163 +> 10 0.526739 14 15 7859911.230163 +> 8 0.526739 18 23 1.000000 +> 12 0.526739 4 23 6 +> 15 0.526739 7 0 SR 23 3 +> 12 0.526739 4 23 5 +> 8 0.526739 18 24 1.000000 +> 12 0.526739 4 24 6 +> 13 0.526739 4 24 +> 14 0.526739 7 0 SR 24 4 +> 7 0.526739 3 24 +> 6 0.742611 25 3 5 "task-4" +> 6 0.742611 26 3 1 "task-5" +> 9 0.547074 14 13 5114134.701194 +> 9 0.547074 14 7 5114134.701194 +> 9 0.547074 14 10 5114134.701194 +> 9 0.547074 14 14 5114134.701194 +> 9 0.547074 14 12 5114134.701194 +> 8 0.547074 14 6 0.000000 +> 9 0.547074 14 6 5114134.701194 +> 8 0.547074 14 8 0.000000 +> 9 0.547074 14 8 5114134.701194 +> 10 0.742611 14 13 5114134.701194 +> 10 0.742611 14 7 5114134.701194 +> 10 0.742611 14 10 5114134.701194 +> 10 0.742611 14 14 5114134.701194 +> 10 0.742611 14 12 5114134.701194 +> 10 0.742611 14 6 5114134.701194 +> 10 0.742611 14 8 5114134.701194 +> 8 0.742611 18 25 1.000000 +> 12 0.742611 4 25 6 +> 15 0.742611 7 0 SR 25 4 +> 12 0.742611 4 25 5 +> 8 0.742611 18 26 1.000000 +> 12 0.742611 4 26 6 +> 13 0.742611 4 26 +> 14 0.742611 7 0 SR 26 5 +> 7 0.742611 3 26 +> 6 0.744775 27 3 1 "task-5" +> 6 0.744775 28 3 1 "task-6" +> 8 0.744775 18 27 1.000000 +> 12 0.744775 4 27 6 +> 15 0.744775 7 0 SR 27 5 +> 12 0.744775 4 27 5 +> 8 0.744775 18 28 1.000000 +> 12 0.744775 4 28 6 +> 13 0.744775 4 28 +> 14 0.744775 7 0 SR 28 6 +> 7 0.744775 3 28 +> 8 0.168126 15 2 0.000000 +> 9 0.168126 15 2 76296000.000000 +> 10 0.823468 15 2 76296000.000000 +> 13 0.823468 4 19 +> 7 0.823468 3 19 +> 6 0.989430 29 3 1 "task-7" +> 8 0.989430 18 29 1.000000 +> 12 0.989430 4 29 6 +> 13 0.989430 4 29 +> 14 0.989430 7 0 SR 29 7 +> 7 0.989430 3 29 +> 6 0.989430 30 3 2 "task-6" +> 8 0.386279 15 3 0.000000 +> 9 0.386279 15 3 76296000.000000 +> 9 0.744775 15 1 98095000.000000 +> 8 0.989430 18 30 1.000000 +> 12 0.989430 4 30 6 +> 15 0.989430 7 0 SR 30 6 +> 12 0.989430 4 30 5 +> 10 0.989430 15 1 98095000.000000 +> 10 1.041621 15 3 76296000.000000 +> 13 1.041621 4 21 +> 7 1.041621 3 21 +> 9 0.989430 15 1 98095000.000000 +> 10 1.254485 15 1 98095000.000000 +> 13 1.254485 4 27 +> 7 1.254485 3 27 +> 6 1.259775 31 3 1 "task-8" +> 8 1.259775 18 31 1.000000 +> 12 1.259775 4 31 6 +> 13 1.259775 4 31 +> 14 1.259775 7 0 SR 31 8 +> 7 1.259775 3 31 +> 6 1.259775 32 3 3 "task-7" +> 6 1.261939 33 3 1 "task-8" +> 6 1.261939 34 3 1 "task-9" +> 8 1.259775 18 32 1.000000 +> 12 1.259775 4 32 6 +> 15 1.259775 7 0 SR 32 7 +> 12 1.259775 4 32 5 +> 8 1.261939 18 33 1.000000 +> 12 1.261939 4 33 6 +> 15 1.261939 7 0 SR 33 8 +> 12 1.261939 4 33 5 +> 8 1.261939 18 34 1.000000 +> 12 1.261939 4 34 6 +> 13 1.261939 4 34 +> 14 1.261939 7 0 SR 34 9 +> 7 1.261939 3 34 +> 8 0.526739 15 4 0.000000 +> 9 0.526739 15 4 48492000.000000 +> 10 1.557837 15 4 48492000.000000 +> 13 1.557837 4 23 +> 7 1.557837 3 23 +> 9 0.989430 15 2 76296000.000000 +> 10 1.644772 15 2 76296000.000000 +> 13 1.644772 4 30 +> 7 1.644772 3 30 +> 6 1.698296 35 3 1 "task-10" +> 8 1.698296 18 35 1.000000 +> 12 1.698296 4 35 6 +> 13 1.698296 4 35 +> 14 1.698296 7 0 SR 35 10 +> 7 1.698296 3 35 +> 6 1.698296 36 3 4 "task-9" +> 9 1.261939 15 1 98095000.000000 +> 8 1.698296 18 36 1.000000 +> 12 1.698296 4 36 6 +> 15 1.698296 7 0 SR 36 9 +> 12 1.698296 4 36 5 +> 10 1.698296 15 1 98095000.000000 +> 9 1.698296 15 1 98095000.000000 +> 9 1.713496 14 9 6632970.000000 +> 10 1.771649 15 1 98095000.000000 +> 10 1.771649 14 9 6632970.000000 +> 13 1.771649 4 33 +> 7 1.771649 3 33 +> 8 0.742611 15 5 0.000000 +> 9 0.742611 15 5 48492000.000000 +> 9 1.771649 14 9 6632970.000000 +> 10 1.773709 15 5 48492000.000000 +> 10 1.773709 14 9 6632970.000000 +> 13 1.773709 4 25 +> 7 1.773709 3 25 +> 6 1.864258 37 3 2 "task-10" +> 6 1.864258 38 3 1 "task-11" +> 9 1.773709 14 9 6632970.000000 +> 10 1.864258 14 9 6632970.000000 +> 8 1.864258 18 37 1.000000 +> 12 1.864258 4 37 6 +> 15 1.864258 7 0 SR 37 10 +> 12 1.864258 4 37 5 +> 8 1.864258 18 38 1.000000 +> 12 1.864258 4 38 6 +> 13 1.864258 4 38 +> 14 1.864258 7 0 SR 38 11 +> 7 1.864258 3 38 +> 6 1.866422 39 3 1 "task-11" +> 6 1.866422 40 3 1 "task-12" +> 8 1.866422 18 39 1.000000 +> 12 1.866422 4 39 6 +> 15 1.866422 7 0 SR 39 11 +> 12 1.866422 4 39 5 +> 8 1.866422 18 40 1.000000 +> 12 1.866422 4 40 6 +> 13 1.866422 4 40 +> 14 1.866422 7 0 SR 40 12 +> 7 1.866422 3 40 +> 9 1.259775 15 3 76296000.000000 +> 9 1.886758 14 13 5114134.701194 +> 9 1.886758 14 7 5114134.701194 +> 9 1.886758 14 10 5114134.701194 +> 9 1.886758 14 14 5114134.701194 +> 9 1.886758 14 12 5114134.701194 +> 9 1.886758 14 6 5114134.701194 +> 9 1.886758 14 8 5114134.701194 +> 10 1.915117 15 3 76296000.000000 +> 10 1.915117 14 13 5114134.701194 +> 10 1.915117 14 7 5114134.701194 +> 10 1.915117 14 10 5114134.701194 +> 10 1.915117 14 14 5114134.701194 +> 10 1.915117 14 12 5114134.701194 +> 10 1.915117 14 6 5114134.701194 +> 10 1.915117 14 8 5114134.701194 +> 13 1.915117 4 32 +> 7 1.915117 3 32 +> 6 2.082294 41 3 5 "task-12" +> 6 2.082294 42 3 1 "task-13" +> 9 1.915117 14 13 5114134.701194 +> 9 1.915117 14 7 5114134.701194 +> 9 1.915117 14 10 5114134.701194 +> 9 1.915117 14 14 5114134.701194 +> 9 1.915117 14 12 5114134.701194 +> 9 1.915117 14 6 5114134.701194 +> 9 1.915117 14 8 5114134.701194 +> 10 2.082294 14 13 5114134.701194 +> 10 2.082294 14 7 5114134.701194 +> 10 2.082294 14 10 5114134.701194 +> 10 2.082294 14 14 5114134.701194 +> 10 2.082294 14 12 5114134.701194 +> 10 2.082294 14 6 5114134.701194 +> 10 2.082294 14 8 5114134.701194 +> 8 2.082294 18 41 1.000000 +> 12 2.082294 4 41 6 +> 15 2.082294 7 0 SR 41 12 +> 12 2.082294 4 41 5 +> 8 2.082294 18 42 1.000000 +> 12 2.082294 4 42 6 +> 13 2.082294 4 42 +> 14 2.082294 7 0 SR 42 13 +> 7 2.082294 3 42 +> 6 2.300447 43 3 3 "task-13" +> 6 2.300447 44 3 1 "task-14" +> 9 1.866422 15 1 98095000.000000 +> 10 2.082294 15 1 98095000.000000 +> 9 2.102845 14 13 5060664.718311 +> 9 2.102845 14 7 5060664.718311 +> 9 2.102845 14 10 5060664.718311 +> 9 2.102845 14 14 5060664.718311 +> 9 2.102845 14 12 5060664.718311 +> 9 2.102845 14 11 5060664.718311 +> 10 2.300447 14 13 5060664.718311 +> 10 2.300447 14 7 5060664.718311 +> 10 2.300447 14 10 5060664.718311 +> 10 2.300447 14 14 5060664.718311 +> 10 2.300447 14 12 5060664.718311 +> 10 2.300447 14 11 5060664.718311 +> 8 2.300447 18 43 1.000000 +> 12 2.300447 4 43 6 +> 15 2.300447 7 0 SR 43 13 +> 12 2.300447 4 43 5 +> 8 2.300447 18 44 1.000000 +> 12 2.300447 4 44 6 +> 13 2.300447 4 44 +> 14 2.300447 7 0 SR 44 14 +> 7 2.300447 3 44 +> 9 2.082294 15 1 98095000.000000 +> 10 2.300447 15 1 98095000.000000 +> 9 2.300447 15 1 98095000.000000 +> 10 2.376132 15 1 98095000.000000 +> 13 2.376132 4 39 +> 7 2.376132 3 39 +> 6 2.378296 45 3 1 "task-15" +> 8 2.378296 18 45 1.000000 +> 12 2.378296 4 45 6 +> 13 2.378296 4 45 +> 14 2.378296 7 0 SR 45 15 +> 7 2.378296 3 45 +> 6 2.378296 46 3 1 "task-14" +> 9 1.864258 15 2 76296000.000000 +> 8 2.378296 18 46 1.000000 +> 12 2.378296 4 46 6 +> 15 2.378296 7 0 SR 46 14 +> 12 2.378296 4 46 5 +> 10 2.519600 15 2 76296000.000000 +> 13 2.519600 4 37 +> 7 2.519600 3 37 +> 6 2.685562 47 3 1 "task-16" +> 8 2.685562 18 47 1.000000 +> 12 2.685562 4 47 6 +> 13 2.685562 4 47 +> 14 2.685562 7 0 SR 47 16 +> 7 2.685562 3 47 +> 6 2.685562 48 3 2 "task-15" +> 9 1.698296 15 4 48492000.000000 +> 9 2.378296 15 1 98095000.000000 +> 8 2.685562 18 48 1.000000 +> 12 2.685562 4 48 6 +> 15 2.685562 7 0 SR 48 15 +> 12 2.685562 4 48 5 +> 10 2.685562 15 1 98095000.000000 +> 10 2.729394 15 4 48492000.000000 +> 13 2.729394 4 36 +> 7 2.729394 3 36 +> 6 2.869854 49 3 1 "task-17" +> 8 2.869854 18 49 1.000000 +> 12 2.869854 4 49 6 +> 13 2.869854 4 49 +> 14 2.869854 7 0 SR 49 17 +> 7 2.869854 3 49 +> 6 2.869854 50 3 4 "task-16" +> 9 2.685562 15 1 98095000.000000 +> 8 2.869854 18 50 1.000000 +> 12 2.869854 4 50 6 +> 15 2.869854 7 0 SR 50 16 +> 12 2.869854 4 50 5 +> 10 2.869854 15 1 98095000.000000 +> 9 2.869854 15 1 98095000.000000 +> 10 2.888006 15 1 98095000.000000 +> 13 2.888006 4 46 +> 7 2.888006 3 46 +> 6 2.890170 51 3 1 "task-18" +> 8 2.890170 18 51 1.000000 +> 12 2.890170 4 51 6 +> 13 2.890170 4 51 +> 14 2.890170 7 0 SR 51 18 +> 7 2.890170 3 51 +> 6 2.890170 52 3 1 "task-17" +> 9 2.300447 15 3 76296000.000000 +> 8 2.890170 18 52 1.000000 +> 12 2.890170 4 52 6 +> 15 2.890170 7 0 SR 52 17 +> 12 2.890170 4 52 5 +> 10 2.955790 15 3 76296000.000000 +> 13 2.955790 4 43 +> 7 2.955790 3 43 +> 9 2.082294 15 5 48492000.000000 +> 10 3.113392 15 5 48492000.000000 +> 13 3.113392 4 41 +> 7 3.113392 3 41 +> 6 3.173943 53 3 1 "task-19" +> 8 3.173943 18 53 1.000000 +> 12 3.173943 4 53 6 +> 13 3.173943 4 53 +> 14 3.173943 7 0 SR 53 19 +> 7 3.173943 3 53 +> 6 3.173943 54 3 3 "task-18" +> 9 2.685562 15 2 76296000.000000 +> 9 2.890170 15 1 98095000.000000 +> 8 3.173943 18 54 1.000000 +> 12 3.173943 4 54 6 +> 15 3.173943 7 0 SR 54 18 +> 12 3.173943 4 54 5 +> 10 3.173943 15 1 98095000.000000 +> 9 3.194279 14 13 5114134.701194 +> 9 3.194279 14 7 5114134.701194 +> 9 3.194279 14 10 5114134.701194 +> 9 3.194279 14 14 5114134.701194 +> 9 3.194279 14 12 5114134.701194 +> 9 3.194279 14 6 5114134.701194 +> 9 3.194279 14 8 5114134.701194 +> 10 3.340904 15 2 76296000.000000 +> 10 3.340904 14 13 5114134.701194 +> 10 3.340904 14 7 5114134.701194 +> 10 3.340904 14 10 5114134.701194 +> 10 3.340904 14 14 5114134.701194 +> 10 3.340904 14 12 5114134.701194 +> 10 3.340904 14 6 5114134.701194 +> 10 3.340904 14 8 5114134.701194 +> 13 3.340904 4 48 +> 7 3.340904 3 48 +> 6 3.389815 55 3 5 "task-19" +> 6 3.389815 56 3 1 "task-0" +> 1 19 3 finalize "1 1 1" +> 9 3.340904 14 13 5114134.701194 +> 9 3.340904 14 7 5114134.701194 +> 9 3.340904 14 10 5114134.701194 +> 9 3.340904 14 14 5114134.701194 +> 9 3.340904 14 12 5114134.701194 +> 9 3.340904 14 6 5114134.701194 +> 9 3.340904 14 8 5114134.701194 +> 10 3.389815 14 13 5114134.701194 +> 10 3.389815 14 7 5114134.701194 +> 10 3.389815 14 10 5114134.701194 +> 10 3.389815 14 14 5114134.701194 +> 10 3.389815 14 12 5114134.701194 +> 10 3.389815 14 6 5114134.701194 +> 10 3.389815 14 8 5114134.701194 +> 8 3.389815 18 55 1.000000 +> 12 3.389815 4 55 6 +> 15 3.389815 7 0 SR 55 19 +> 12 3.389815 4 55 5 +> 8 3.389815 19 56 1.000000 +> 12 3.389815 4 56 6 +> 13 3.389815 4 56 +> 14 3.389815 7 0 SR 56 20 +> 7 3.389815 3 56 +> 9 3.173943 15 1 98095000.000000 +> 10 3.389815 15 1 98095000.000000 +> 9 3.389815 15 1 98095000.000000 +> 10 3.399880 15 1 98095000.000000 +> 13 3.399880 4 52 +> 7 3.399880 3 52 +> 6 3.405015 57 3 2 "task-0" +> 8 3.405015 19 57 1.000000 +> 12 3.405015 4 57 6 +> 15 3.405015 7 0 SR 57 20 +> 7 3.405015 3 57 +> 6 3.405015 58 3 1 "task-1" +> 8 3.405015 19 58 1.000000 +> 12 3.405015 4 58 6 +> 13 3.405015 4 58 +> 14 3.405015 7 0 SR 58 21 +> 7 3.405015 3 58 +> 6 3.405171 59 3 1 "task-1" +> 8 3.405171 19 59 1.000000 +> 12 3.405171 4 59 6 +> 15 3.405171 7 0 SR 59 21 +> 7 3.405171 3 59 +> 6 3.405171 60 3 1 "task-2" +> 8 3.405171 19 60 1.000000 +> 12 3.405171 4 60 6 +> 13 3.405171 4 60 +> 14 3.405171 7 0 SR 60 22 +> 7 3.405171 3 60 +> 9 3.173943 15 3 76296000.000000 +> 10 3.829285 15 3 76296000.000000 +> 13 3.829285 4 54 +> 7 3.829285 3 54 +> 6 3.849836 61 3 1 "task-3" +> 8 3.849836 19 61 1.000000 +> 12 3.849836 4 61 6 +> 13 3.849836 4 61 +> 14 3.849836 7 0 SR 61 23 +> 7 3.849836 3 61 +> 6 3.849836 62 3 3 "task-2" +> 8 3.849836 19 62 1.000000 +> 12 3.849836 4 62 6 +> 15 3.849836 7 0 SR 62 22 +> 7 3.849836 3 62 +> 9 2.869854 15 4 48492000.000000 +> 10 3.900952 15 4 48492000.000000 +> 13 3.900952 4 50 +> 7 3.900952 3 50 +> 6 3.914183 63 3 1 "task-4" +> 8 3.914183 19 63 1.000000 +> 12 3.914183 4 63 6 +> 13 3.914183 4 63 +> 14 3.914183 7 0 SR 63 24 +> 7 3.914183 3 63 +> 6 3.914183 64 3 4 "task-3" +> 8 3.914183 19 64 1.000000 +> 12 3.914183 4 64 6 +> 15 3.914183 7 0 SR 64 23 +> 7 3.914183 3 64 +> 9 3.389815 15 5 48492000.000000 +> 10 4.420913 15 5 48492000.000000 +> 13 4.420913 4 55 +> 7 4.420913 3 55 +> 6 4.441249 65 3 5 "task-4" +> 8 4.441249 19 65 1.000000 +> 12 4.441249 4 65 6 +> 15 4.441249 7 0 SR 65 24 +> 7 4.441249 3 65 +> 7 4.441249 1 3 +> 7 4.441249 1 1 +> 7 4.441249 8 14 +> 7 4.441249 8 12 +> 7 4.441249 8 10 +> 7 4.441249 8 7 +> 7 4.441249 8 13 +> 7 4.441249 8 15 +> 7 4.441249 8 6 +> 7 4.441249 8 8 +> 7 4.441249 8 11 +> 7 4.441249 8 9 +> 7 4.441249 1 5 +> 7 4.441249 1 2 +> 7 4.441249 1 4 +> 7 4.441249 0 0 $ rm -rf tracing/tasks.trace diff --git a/examples/msg/tracing/volume.c b/examples/msg/tracing/volume.c deleted file mode 100644 index c19720a74e..0000000000 --- a/examples/msg/tracing/volume.c +++ /dev/null @@ -1,130 +0,0 @@ -/* $Id$ */ - -/* Copyright (c) 2002,2003,2004 Arnaud Legrand. All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include -#include "msg/msg.h" -#include "xbt/sysdep.h" /* calloc, printf */ - -/* Create a log channel to have nice outputs. */ -#include "xbt/log.h" -#include "xbt/asserts.h" -XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, - "Messages specific for this msg example"); - -int master(int argc, char *argv[]); -int slave(int argc, char *argv[]); -MSG_error_t test_all(const char *platform_file, - const char *application_file); - -/** Emitter function */ -int master(int argc, char *argv[]) -{ - long number_of_tasks = atol(argv[1]); - long slaves_count = atol(argv[4]); - int p = 1000000000; - int c = 10000000; - - int i; - for (i = 0; i < number_of_tasks; i++) { - m_task_t task = NULL; - task = MSG_task_create("task_compute", p, c, NULL); - TRACE_msg_set_task_category(task, "compute"); - MSG_task_send(task, "master_mailbox"); - task = NULL; - task = MSG_task_create("task_request", p, c, NULL); - TRACE_msg_set_task_category(task, "request"); - MSG_task_send(task, "master_mailbox"); - task = NULL; - task = MSG_task_create("task_data", p, c, NULL); - TRACE_msg_set_task_category(task, "data"); - MSG_task_send(task, "master_mailbox"); - } - - for (i = 0; i < slaves_count; i++) { - m_task_t finalize = MSG_task_create("finalize", 0, 1000, 0); - TRACE_msg_set_task_category(finalize, "finalize"); - MSG_task_send(finalize, "master_mailbox"); - } - - return 0; -} - -/** Receiver function */ -int slave(int argc, char *argv[]) -{ - m_task_t task = NULL; - int res; - - while (1) { - res = MSG_task_receive(&(task), "master_mailbox"); - - if (!strcmp(MSG_task_get_name(task), "finalize")) { - MSG_task_destroy(task); - break; - } - - MSG_task_execute(task); - MSG_task_destroy(task); - task = NULL; - } - return 0; -} - -/** Test function */ -MSG_error_t test_all(const char *platform_file, - const char *application_file) -{ - MSG_error_t res = MSG_OK; - - { /* Simulation setting */ - MSG_set_channel_number(0); - MSG_create_environment(platform_file); - } - { - //--cfg=tracing/msg/volume - // - the communication volume among processes expects that: - // - the processes involved have a category - // - the sent tasks have a category - - //declaring user categories (for tasks) - TRACE_category_with_color ("compute", "1 0 0"); //red - TRACE_category_with_color ("request", "0 1 0"); //green - TRACE_category_with_color ("data", "0 0 1"); //blue - TRACE_category_with_color ("finalize", "0 0 0");//black - } - { /* Application deployment */ - MSG_function_register("master", master); - MSG_function_register("slave", slave); - MSG_launch_application(application_file); - } - res = MSG_main(); - - XBT_INFO("Simulation time %g", MSG_get_clock()); - return res; -} - - -/** Main function */ -int main(int argc, char *argv[]) -{ - MSG_error_t res = MSG_OK; - - MSG_global_init(&argc, argv); - if (argc < 3) { - printf("Usage: %s platform_file deployment_file\n", argv[0]); - printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]); - exit(1); - } - - res = test_all(argv[1], argv[2]); - MSG_clean(); - - if (res == MSG_OK) - return 0; - else - return 1; -} /* end_of_main */ diff --git a/examples/msg/tracing/volume.tesh b/examples/msg/tracing/volume.tesh deleted file mode 100644 index 5dcf227704..0000000000 --- a/examples/msg/tracing/volume.tesh +++ /dev/null @@ -1,287 +0,0 @@ -#! ./tesh - -p Tracing communications among processes of a master/slave application - -$ $SG_TEST_EXENV ${bindir:=.}/tracing/volume$EXEEXT --cfg=tracing:1 --cfg=tracing/filename:tracing/volume.trace --cfg=tracing/msg/volume:1 ${srcdir:=.}/tracing/platform.xml ${srcdir:=.}/tracing/deployment.xml -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/filename' to 'tracing/volume.trace' -> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/msg/volume' to '1' -> [206.703278] [msg_test/INFO] Simulation time 206.703 - -$ cat tracing/volume.trace -> %EventDef PajeDefineContainerType 0 -> % Alias string -> % ContainerType string -> % Name string -> %EndEventDef -> %EventDef PajeDefineVariableType 1 -> % Alias string -> % ContainerType string -> % Name string -> % Color color -> %EndEventDef -> %EventDef PajeDefineStateType 2 -> % Alias string -> % ContainerType string -> % Name string -> %EndEventDef -> %EventDef PajeDefineEventType 3 -> % Alias string -> % EntityType string -> % Name string -> % Color color -> %EndEventDef -> %EventDef PajeDefineLinkType 4 -> % Alias string -> % ContainerType string -> % SourceContainerType string -> % DestContainerType string -> % Name string -> %EndEventDef -> %EventDef PajeDefineEntityValue 5 -> % Alias string -> % EntityType string -> % Name string -> % Color color -> %EndEventDef -> %EventDef PajeCreateContainer 6 -> % Time date -> % Alias string -> % Type string -> % Container string -> % Name string -> %EndEventDef -> %EventDef PajeDestroyContainer 7 -> % Time date -> % Type string -> % Container string -> %EndEventDef -> %EventDef PajeSetVariable 8 -> % Time date -> % EntityType string -> % Container string -> % Value string -> %EndEventDef -> %EventDef PajeAddVariable 9 -> % Time date -> % EntityType string -> % Container string -> % Value string -> %EndEventDef -> %EventDef PajeSubVariable 10 -> % Time date -> % EntityType string -> % Container string -> % Value string -> %EndEventDef -> %EventDef PajeSetState 11 -> % Time date -> % EntityType string -> % Container string -> % Value string -> %EndEventDef -> %EventDef PajePushState 12 -> % Time date -> % EntityType string -> % Container string -> % Value string -> %EndEventDef -> %EventDef PajePopState 13 -> % Time date -> % EntityType string -> % Container string -> %EndEventDef -> %EventDef PajeStartLink 14 -> % Time date -> % EntityType string -> % Container string -> % Value string -> % SourceContainer string -> % Key string -> %EndEventDef -> %EventDef PajeEndLink 15 -> % Time date -> % EntityType string -> % Container string -> % Value string -> % DestContainer string -> % Key string -> %EndEventDef -> %EventDef PajeNewEvent 16 -> % Time date -> % EntityType string -> % Container string -> % Value string -> %EndEventDef -> 0 1 0 L1 -> 6 0 1 1 0 AS0 -> 0 2 1 HOST -> 6 0 2 2 1 Tremblay -> 1 3 2 power "1 1 1" -> 6 0 3 2 1 Jupiter -> 6 0 4 2 1 Fafard -> 6 0 5 2 1 Ginette -> 6 0 6 2 1 Bourassa -> 0 4 1 ROUTER -> 6 0 7 4 1 R.4-3 -> 6 0 8 4 1 R.3-2-5 -> 6 0 9 4 1 R.2-0 -> 6 0 10 4 1 R.1-0 -> 6 0 11 4 1 R.1-8-6 -> 6 0 12 4 1 R.6-7 -> 0 5 1 LINK -> 6 0 13 5 1 6 -> 1 6 5 bandwidth "1 1 1" -> 1 7 5 latency "1 1 1" -> 6 0 14 5 1 11 -> 6 0 15 5 1 3 -> 6 0 16 5 1 7 -> 6 0 17 5 1 9 -> 6 0 18 5 1 12 -> 6 0 19 5 1 2 -> 6 0 20 5 1 8 -> 6 0 21 5 1 1 -> 6 0 22 5 1 4 -> 6 0 23 5 1 0 -> 6 0 24 5 1 10 -> 6 0 25 5 1 5 -> 6 0 26 5 1 loopback -> 4 8 1 2 5 HOST-LINK -> 4 9 1 5 4 LINK-ROUTER -> 4 10 1 5 5 LINK-LINK -> 4 11 1 5 2 LINK-HOST -> 4 12 1 4 5 ROUTER-LINK -> 8 0 3 2 98095000.000000 -> 8 0 3 3 76296000.000000 -> 8 0 3 4 76296000.000000 -> 8 0 3 5 48492000.000000 -> 8 0 3 6 48492000.000000 -> 8 0 6 13 41279125.000000 -> 8 0 7 13 0.000060 -> 8 0 6 14 252750.000000 -> 8 0 7 14 0.005705 -> 8 0 6 15 34285622.000000 -> 8 0 7 15 0.000514 -> 8 0 6 16 11618875.000000 -> 8 0 7 16 0.000190 -> 8 0 6 17 7209750.000000 -> 8 0 7 17 0.001462 -> 8 0 6 18 1792625.000000 -> 8 0 7 18 0.007878 -> 8 0 6 19 22222222.000000 -> 8 0 7 19 0.000137 -> 8 0 6 20 8158000.000000 -> 8 0 7 20 0.000271 -> 8 0 6 21 34285625.000000 -> 8 0 7 21 0.000514 -> 8 0 6 22 10099625.000000 -> 8 0 7 22 0.000480 -> 8 0 6 23 41279125.000000 -> 8 0 7 23 0.000060 -> 8 0 6 24 4679750.000000 -> 8 0 7 24 0.000849 -> 8 0 6 25 27946250.000000 -> 8 0 7 25 0.000278 -> 8 0 6 26 498000000.000000 -> 8 0 7 26 0.000015 -> 14 0 8 1 G 4 0 -> 15 0 8 1 G 26 0 -> 14 0 8 1 G 4 1 -> 15 0 8 1 G 20 1 -> 14 0 9 1 G 20 2 -> 15 0 9 1 G 11 2 -> 14 0 10 1 G 20 3 -> 15 0 10 1 G 21 3 -> 14 0 10 1 G 21 4 -> 15 0 10 1 G 23 4 -> 14 0 10 1 G 23 5 -> 15 0 10 1 G 19 5 -> 14 0 10 1 G 19 6 -> 15 0 10 1 G 15 6 -> 14 0 10 1 G 15 7 -> 15 0 10 1 G 22 7 -> 14 0 11 1 G 22 8 -> 15 0 11 1 G 2 8 -> 14 0 10 1 G 20 9 -> 15 0 10 1 G 13 9 -> 14 0 10 1 G 13 10 -> 15 0 10 1 G 16 10 -> 14 0 11 1 G 16 11 -> 15 0 11 1 G 6 11 -> 14 0 10 1 G 22 12 -> 15 0 10 1 G 17 12 -> 14 0 11 1 G 17 13 -> 15 0 11 1 G 3 13 -> 14 0 10 1 G 19 14 -> 15 0 10 1 G 25 14 -> 14 0 11 1 G 25 15 -> 15 0 11 1 G 5 15 -> 14 0 12 1 G 9 16 -> 15 0 12 1 G 19 16 -> 14 0 9 1 G 19 17 -> 15 0 9 1 G 8 17 -> 14 0 12 1 G 9 18 -> 15 0 12 1 G 23 18 -> 14 0 9 1 G 23 19 -> 15 0 9 1 G 10 19 -> 14 0 12 1 G 7 20 -> 15 0 12 1 G 15 20 -> 14 0 9 1 G 15 21 -> 15 0 9 1 G 8 21 -> 14 0 12 1 G 7 22 -> 15 0 12 1 G 22 22 -> 14 0 12 1 G 8 23 -> 15 0 12 1 G 25 23 -> 14 0 12 1 G 11 24 -> 15 0 12 1 G 13 24 -> 14 0 9 1 G 13 25 -> 15 0 9 1 G 12 25 -> 14 0 12 1 G 11 26 -> 15 0 12 1 G 21 26 -> 14 0 9 1 G 21 27 -> 15 0 9 1 G 10 27 -> 14 0 12 1 G 12 28 -> 15 0 12 1 G 16 28 -> 14 0 8 1 G 2 29 -> 15 0 8 1 G 26 29 -> 14 0 10 1 G 21 30 -> 15 0 10 1 G 13 30 -> 14 0 8 1 G 2 31 -> 15 0 8 1 G 17 31 -> 14 0 10 1 G 15 32 -> 15 0 10 1 G 25 32 -> 14 0 8 1 G 6 33 -> 15 0 8 1 G 26 33 -> 14 0 8 1 G 3 34 -> 15 0 8 1 G 26 34 -> 14 0 8 1 G 5 35 -> 15 0 8 1 G 26 35 -> 7 206.703278 2 4 -> 7 206.703278 4 9 -> 7 206.703278 4 7 -> 7 206.703278 4 8 -> 7 206.703278 4 11 -> 7 206.703278 4 12 -> 7 206.703278 2 2 -> 7 206.703278 5 24 -> 7 206.703278 5 14 -> 7 206.703278 5 18 -> 7 206.703278 5 26 -> 7 206.703278 4 10 -> 7 206.703278 5 23 -> 7 206.703278 5 21 -> 7 206.703278 5 19 -> 7 206.703278 5 15 -> 7 206.703278 5 22 -> 7 206.703278 5 25 -> 7 206.703278 5 13 -> 7 206.703278 5 16 -> 7 206.703278 5 20 -> 7 206.703278 5 17 -> 7 206.703278 2 6 -> 7 206.703278 2 3 -> 7 206.703278 2 5 -> 7 206.703278 1 1 -> 7 206.703278 0 0 - -$ rm -rf tracing/volume.trace diff --git a/examples/platforms/cluster_with_100_hosts.xml b/examples/platforms/One_cluster.xml similarity index 50% rename from examples/platforms/cluster_with_100_hosts.xml rename to examples/platforms/One_cluster.xml index 6b4354dcea..a638eae8f3 100644 --- a/examples/platforms/cluster_with_100_hosts.xml +++ b/examples/platforms/One_cluster.xml @@ -1,5 +1,15 @@ + + + + + + + + + + diff --git a/examples/platforms/2_clusters_with_30000_hosts.xml b/examples/platforms/Two_clusters.xml similarity index 84% rename from examples/platforms/2_clusters_with_30000_hosts.xml rename to examples/platforms/Two_clusters.xml index 551dcba287..fc63a075a1 100644 --- a/examples/platforms/2_clusters_with_30000_hosts.xml +++ b/examples/platforms/Two_clusters.xml @@ -3,11 +3,11 @@ diff --git a/examples/platforms/cluster_with_100000_hosts.xml b/examples/platforms/cluster_with_100000_hosts.xml deleted file mode 100644 index 83e9d27dc0..0000000000 --- a/examples/platforms/cluster_with_100000_hosts.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/examples/platforms/cluster_with_10000_hosts.xml b/examples/platforms/cluster_with_10000_hosts.xml deleted file mode 100644 index d958dfa73a..0000000000 --- a/examples/platforms/cluster_with_10000_hosts.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/examples/platforms/cluster_with_1000_hosts.xml b/examples/platforms/cluster_with_1000_hosts.xml deleted file mode 100644 index b4a0eb129b..0000000000 --- a/examples/platforms/cluster_with_1000_hosts.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/examples/platforms/cluster_with_300000_hosts.xml b/examples/platforms/cluster_with_300000_hosts.xml deleted file mode 100644 index efed72fd25..0000000000 --- a/examples/platforms/cluster_with_300000_hosts.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/examples/platforms/cluster_with_30000_hosts.xml b/examples/platforms/cluster_with_30000_hosts.xml deleted file mode 100644 index ac0f24e6e1..0000000000 --- a/examples/platforms/cluster_with_30000_hosts.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/examples/platforms/g5k.xml b/examples/platforms/g5k.xml index c0a68324f4..664ae30233 100644 --- a/examples/platforms/g5k.xml +++ b/examples/platforms/g5k.xml @@ -1,351 +1,451 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/g5k_cabinets.xml b/examples/platforms/g5k_cabinets.xml new file mode 100644 index 0000000000..dfb95028a9 --- /dev/null +++ b/examples/platforms/g5k_cabinets.xml @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/gdx.xml b/examples/platforms/gdx.xml new file mode 100644 index 0000000000..1ab2accebe --- /dev/null +++ b/examples/platforms/gdx.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/gridpp_grid_2004.conf b/examples/platforms/gridpp_grid_2004.conf new file mode 100644 index 0000000000..08c47e5664 --- /dev/null +++ b/examples/platforms/gridpp_grid_2004.conf @@ -0,0 +1,72 @@ +#0)WC_Gla +#1)WC_Edi +#2)WC_Manc +#3)WC_Leeds +#4)WC_Reading +#5)WC_London +#6)WC_Bristol +#7)WC_Portsmouth +#8)Gla_router +#9)Edi_router +#10)NorMAN +#11)YHMAN +#12)EastNet +#13)LMN +#14)SWAN_BWEMAN +#15)TVN +#16)MidMAN +#17)NNW_router +#18)Glasgow +#19)Edi +#20)Durham +#21)Sheffield +#22)Cam +#23)UCL +#24)IC +#25)QMW +#26)Brunel +#27)RHNBC +#28)Bristol +#29)RAL +#30)Oxford +#31)B_ham +#32)L_pool +#33)Manc +#34)Lanc +#35)CERN +0 0 0 10000 10000 0 0 0 0 0 1000 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 10000 0 0 10000 0 0 0 0 0 1000 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 10000 0 0 10000 10000 0 0 0 0 0 0 0 0 0 0 0 1000 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 10000 10000 0 0 10000 0 0 0 0 622 1000 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 10000 0 0 10000 10000 0 0 0 0 0 0 0 0 622 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 10000 10000 0 0 10000 0 0 0 0 1000 1000 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 10000 0 0 10000 0 0 0 0 0 0 622 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 10000 10000 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 2500 +0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 155 155 155 155 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 0 0 0 +0 0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 622 0 0 0 0 0 +0 0 0 0 1000 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 622 0 0 0 0 +0 0 0 0 1000 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 155 1000 155 0 +200 1 100000 0 0 0 0 0 0 0 0 1000 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 +40 1 640000 0 0 0 0 0 0 0 0 0 1000 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 +78 1 53000 0 0 0 0 0 0 0 0 0 0 155 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 +365 1 136000 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +40 1 33000 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +150 1 150000 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1100 1 400000 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +220 1 200000 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +306 1 280000 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +120 1 60000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +300 1 200000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +972 1 573000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +412 1 380000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +150 1 90000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1890 1 163000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +225 1 100000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +320 1 640000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 1 10000000 0 0 0 0 0 0 0 2500 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 diff --git a/examples/platforms/gridpp_grid_2004.xml b/examples/platforms/gridpp_grid_2004.xml new file mode 100644 index 0000000000..d8beea25f0 --- /dev/null +++ b/examples/platforms/gridpp_grid_2004.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/griffon.xml b/examples/platforms/griffon.xml new file mode 100644 index 0000000000..1ecc49831a --- /dev/null +++ b/examples/platforms/griffon.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/lcg_sept2004_grid.conf b/examples/platforms/lcg_sept2004_grid.conf new file mode 100644 index 0000000000..e5faf5485a --- /dev/null +++ b/examples/platforms/lcg_sept2004_grid.conf @@ -0,0 +1,101 @@ +1400 1 1050000000 0 0 1000 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 10000 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 10000 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 +70 1 26000000 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 1000 155 0 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 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 10000 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 10000 0 155 155 155 155 155 155 155 155 0 0 0 0 0 0 0 0 0 10000 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 10000 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 +1890 1 314000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112 1 5000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112 1 5000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112 1 5000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +48 1 2000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +240 1 32000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +130 1 7000000 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 155 0 0 0 0 0 0 0 0 155 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +50 1 5000000 0 0 0 0 0 0 0 0 0 0 0 155 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 0 0 0 0 0 0 0 0 +64 1 7000000 0 0 0 0 0 0 0 0 0 0 0 155 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 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 155 155 0 0 0 0 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 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 +25 1 500000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 0 0 0 0 0 +25 1 500000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 0 0 0 0 0 +0 0 0 0 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 10000 0 2500 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 +26 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 155 0 0 0 0 0 0 0 0 0 0 0 0 0 2500 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 +140 1 4000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +0 0 0 0 0 10000 0 0 0 0 0 0 0 0 0 0 622 0 0 2500 0 0 0 0 1000 0 0 0 0 0 0 0 0 10000 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 10000 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 1000 0 155 1000 155 155 155 155 155 155 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +978 1 158000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 +20 1 3000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 10000 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 0 0 0 1000 1000 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 0 0 0 0 2500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 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 +210 1 10000000 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 1000 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 +210 1 100000000 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 1000 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 0 0 0 0 0 0 0 0 0 2500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 155 2500 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 +34 1 13000000 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 155 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 +260 1 25000000 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 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2500 0 0 0 155 155 10000 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 +60 1 5000000 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 155 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 +120 1 10000000 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 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 155 0 0 0 0 10000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 155 155 155 155 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 +90 1 6000000 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 155 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 +130 1 3000000 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 155 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 +16 1 13000000 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 155 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 +50 1 12000000 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 155 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 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 2500 0 0 0 0 0 0 0 0 0 1000 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2500 0 0 0 2500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 2500 0 10000 0 0 0 0 0 0 10000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 1000 155 10000 0 0 0 10000 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 +1232 1 36000000 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 1000 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 +652 1 7000000 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 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 1000 10000 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 +1138 1 69000000 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 1000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 1000 10000 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 +230 1 40000000 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 1000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 10000 0 0 0 0 10000 0 0 622 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 +766 1 186000000 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 622 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 +64 1 7000000 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 1000 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 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 0 0 2500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 0 0 0 0 0 1000 1000 1000 10000 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 +140 1 27000000 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 1000 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 +50 1 5000000 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 1000 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 +260 1 2500000 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 1000 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 10000 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 10000 0 0 0 0 155 0 0 155 155 155 155 155 155 155 155 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 0 0 0 0 0 0 0 0 0 0 155 0 155 155 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 +200 1 46000000 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 155 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 +50 1 5000000 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 155 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 +50 1 5000000 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 155 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 +74 1 8000000 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 155 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 +50 1 5000000 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 155 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 +50 1 5000000 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 155 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 +50 1 5000000 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 155 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 +4 1 1000000 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 155 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 +50 1 5000000 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 155 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 +50 1 5000000 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 155 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 10000 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 10000 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 2500 10000 0 0 0 0 3000 0 0 3000 0 0 0 0 0 10000 10000 0 0 0 0 622 0 0 0 622 +400 1 134000000 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 2500 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 2500 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 10000 0 0 1000 3000 0 0 3000 0 0 0 0 0 0 0 0 0 10000 0 0 2500 0 0 0 0 0 0 +274 1 52000000 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 1000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3000 0 0 155 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +24 1 1000000 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 155 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 2500 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 10000 0 0 10000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3000 0 3000 0 0 0 10000 0 155 155 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +60 1 4000000 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 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +320 1 8000000 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 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3000 0 0 0 0 0 0 10000 0 0 0 10000 0 10000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 155 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 +120 1 19000000 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 0 0 0 0 155 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 10000 0 0 10000 0 3000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 155 3000 0 0 0 0 0 0 0 0 0 0 +20 1 1000000 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 0 0 0 0 0 0 0 155 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 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 0 0 0 0 0 3000 3000 0 0 10000 622 0 0 0 155 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 10000 0 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 10000 0 0 0 33 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 1000 622 0 0 0 0 0 0 +50 1 5000000 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 0 0 0 0 0 0 0 0 0 0 0 1000 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 0 0 0 0 0 2500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 622 0 0 155 155 0 0 0 0 +254 1 34000000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 155 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 155 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 622 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 155 0 0 155 155 622 0 +50 1 5000000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 +50 1 5000000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 0 0 0 0 +446 1 63000000 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 622 0 0 0 0 +50 1 5000000 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 622 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 diff --git a/examples/platforms/lcg_sept2004_grid.xml b/examples/platforms/lcg_sept2004_grid.xml new file mode 100644 index 0000000000..c97214e352 --- /dev/null +++ b/examples/platforms/lcg_sept2004_grid.xml @@ -0,0 +1,618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/median_harvard.syscoord b/examples/platforms/median_harvard.syscoord new file mode 100644 index 0000000000..13cf361662 --- /dev/null +++ b/examples/platforms/median_harvard.syscoord @@ -0,0 +1,226 @@ +0 173.0 96.8 h 0.1 +1 247.0 57.3 h 0.6 +2 243.4 58.8 h 1.4 +3 -42.0 -35.2 h 1.5 +4 170.4 78.2 h 11.0 +5 116.3 -51.1 h 79.0 +6 240.7 73.1 h 42.4 +7 248.1 66.0 h 12.0 +8 -136.1 31.0 h 59.1 +9 -138.9 38.1 h 57.3 +10 275.8 43.3 h 1.4 +11 41.7 -10.3 h 0.8 +12 262.3 31.0 h 1.0 +13 251.8 79.9 h 2.3 +14 251.7 64.5 h 8.5 +15 -16.0 -13.4 h 9.3 +16 250.1 67.1 h 18.5 +17 264.4 77.6 h 0.5 +18 247.1 62.5 h 7.9 +19 19.4 -26.5 h 5.5 +20 0.8 -42.7 h 11.0 +21 241.2 62.5 h 2.5 +22 -25.9 -16.1 h 9.6 +23 -29.3 5.3 h 6.3 +24 -41.9 -6.2 h 0.1 +25 -28.5 0.3 h 0.3 +26 31.4 -7.5 h 2.1 +27 21.9 21.5 h 1.1 +28 -21.5 -7.5 h 4.5 +29 -34.2 -8.2 h 3.8 +30 33.6 -22.7 h 2.8 +31 -40.0 -26.3 h 11.5 +32 -146.7 15.9 h 45.2 +33 -42.5 3.8 h 11.4 +34 -44.2 -13.8 h 4.3 +35 43.9 3.6 h 0.8 +36 -37.1 24.3 h 3.2 +37 -7.7 11.2 h 1.2 +38 -50.1 -21.1 h 3.5 +39 13.4 22.5 h 2.0 +40 -166.0 48.5 h 29.7 +41 -33.8 -8.5 h 9.6 +42 29.9 -18.7 h 0.9 +43 -52.0 -5.7 h 34.2 +44 -197.4 8.2 h 0.1 +45 -40.6 10.3 h 9.0 +46 -31.9 21.1 h 5.4 +47 -44.7 -6.9 h 1.1 +48 45.2 5.1 h 0.9 +49 -40.2 14.6 h 17.8 +50 -7.1 4.0 h 5.9 +51 19.5 3.6 h 1.9 +52 -216.1 3.4 h 6.0 +53 -40.4 3.4 h 1.6 +54 -194.1 16.3 h 6.6 +55 -24.1 -6.7 h 5.0 +56 -50.1 -12.8 h 4.9 +57 -138.6 53.1 h 0.9 +58 -48.1 -3.0 h 1.6 +59 28.9 -6.5 h 1.5 +60 24.1 3.5 h 1.8 +61 -137.6 41.0 h 6.1 +62 35.5 -30.7 h 1.6 +63 34.5 -25.3 h 0.2 +64 31.7 -31.2 h 4.0 +65 33.9 -17.3 h 1.1 +66 35.9 -10.6 h 3.5 +67 33.1 -13.0 h 6.5 +68 0.4 -10.7 h 17.3 +69 -27.3 -8.0 h 0.3 +70 -194.3 72.7 h 5.0 +71 -19.0 -2.9 h 0.7 +72 -45.2 -12.3 h 1.5 +73 -45.2 -6.9 h 0.4 +74 -45.2 -11.2 h 4.6 +75 -24.4 -12.8 h 2.5 +76 -21.7 -14.9 h 5.1 +77 -9.8 -28.5 h 9.3 +78 19.1 10.4 h 19.1 +79 -192.7 21.5 h 0.6 +80 -28.0 -12.7 h 6.9 +81 -45.4 -2.9 h 6.0 +82 -42.1 -2.8 h 2.7 +83 -41.1 -1.2 h 9.4 +84 -153.6 19.1 h 0.8 +85 -125.7 16.6 h 3.8 +86 -151.0 41.0 h 19.2 +87 39.4 -27.4 h 0.7 +88 -21.6 -8.5 h 11.7 +89 -16.9 -10.5 h 8.2 +90 10.3 -9.3 h 24.3 +91 -13.6 16.9 h 10.5 +92 -48.2 4.3 h 12.3 +93 -11.5 -34.5 h 0.7 +94 26.7 -26.3 h 7.8 +95 -145.3 17.7 h 29.4 +96 218.2 129.0 h 69.0 +97 -47.4 -20.3 h 97.9 +98 -19.5 -5.0 h 0.4 +99 -13.0 -3.9 h 1.3 +100 39.2 -5.2 h 1.2 +101 35.4 11.4 h 1.4 +102 -45.6 -10.7 h 1.1 +103 -148.9 29.0 h 5.0 +104 -109.9 52.6 h 0.8 +105 -151.2 28.8 h 44.0 +106 -151.9 44.4 h 0.1 +107 108.3 88.7 h 58.0 +108 25.1 -12.2 h 0.1 +109 22.4 -29.2 h 17.4 +110 24.3 -32.3 h 1.2 +111 -40.6 -10.4 h 1.3 +112 -11.4 -17.8 h 4.2 +113 -118.7 50.3 h 1.2 +114 -3.1 -39.2 h 1.2 +115 -27.6 -15.3 h 0.9 +116 -21.6 -8.1 h 3.1 +117 -48.7 1.8 h 0.6 +118 -45.9 -9.0 h 0.1 +119 -43.0 -0.4 h 16.9 +120 -45.5 -16.9 h 6.5 +121 -22.0 -5.3 h 5.8 +122 -116.4 53.5 h 4.5 +123 -175.6 -9.6 h 2.0 +124 -17.8 -17.9 h 2.6 +125 -7.8 -29.9 h 9.4 +126 16.1 16.9 h 4.1 +127 -140.6 34.1 h 45.6 +128 -45.6 -12.4 h 3.8 +129 -43.6 -9.8 h 3.9 +130 -41.2 -18.4 h 4.7 +131 37.0 -5.4 h 0.3 +132 -130.3 24.0 h 0.8 +133 -109.0 65.9 h 1.8 +134 -3.7 -16.7 h 5.1 +135 25.2 -16.1 h 21.6 +136 -17.8 -0.6 h 10.7 +137 -16.3 -9.2 h 7.5 +138 16.9 25.3 h 10.6 +139 -11.3 -3.6 h 17.9 +140 -9.7 -19.6 h 11.2 +141 202.6 100.2 h 1.7 +142 -169.7 15.3 h 0.3 +143 117.2 64.5 h 29.6 +144 -137.8 62.2 h 8.3 +145 -19.5 -7.5 h 2.3 +146 33.5 -15.5 h 0.4 +147 -150.9 18.4 h 0.2 +148 -326.8 -126.8 h 0.7 +149 -87.5 83.1 h 0.7 +150 -164.6 8.4 h 41.0 +151 -153.2 46.9 h 3.8 +152 -168.9 12.3 h 0.7 +153 87.5 155.6 h 4.0 +154 29.7 -12.2 h 0.2 +155 35.6 -28.8 h 0.6 +156 -22.5 -5.3 h 15.0 +157 29.8 -20.4 h 4.5 +158 -44.5 -7.9 h 0.9 +159 -15.2 -8.5 h 14.1 +160 -103.1 44.0 h 0.2 +161 -42.6 -4.1 h 12.3 +162 -47.1 8.9 h 2.6 +163 -49.0 -14.9 h 1.7 +164 -42.9 -1.9 h 6.0 +165 -50.0 -5.9 h 1.2 +166 -8.3 -38.2 h 0.9 +167 33.7 -8.4 h 7.0 +168 -13.2 -34.3 h 1.0 +169 39.7 -27.8 h 0.6 +170 35.5 0.4 h 0.7 +171 139.5 107.5 h 9.9 +172 16.2 32.5 h 20.7 +173 -42.1 -4.2 h 6.6 +174 -50.5 -7.3 h 1.6 +175 33.5 -27.2 h 2.3 +176 -146.7 37.2 h 27.7 +177 -46.5 -17.1 h 0.5 +178 41.5 -22.8 h 0.3 +179 40.1 -5.5 h 12.0 +180 -142.5 16.7 h 37.6 +181 -53.6 -10.3 h 0.7 +182 30.7 -21.0 h 1.4 +183 24.0 -29.0 h 4.0 +184 -144.7 14.3 h 35.0 +185 -45.5 -7.8 h 2.6 +186 -42.7 -5.2 h 4.2 +187 33.0 -33.2 h 0.9 +188 -46.9 -4.3 h 1.6 +189 -46.9 -2.3 h 0.6 +190 36.0 -29.9 h 1.0 +191 29.8 -36.8 h 0.6 +192 42.7 -23.2 h 0.3 +193 -117.6 48.0 h 3.7 +194 -124.3 45.2 h 0.1 +195 37.1 -6.1 h 0.3 +196 40.9 -4.1 h 0.8 +197 28.6 -2.8 h 0.9 +198 -111.0 24.8 h 5.0 +199 -112.0 33.4 h 1.0 +200 25.4 -23.7 h 2.7 +201 33.7 -25.7 h 2.6 +202 32.2 -26.7 h 0.6 +203 193.3 -4.6 h 0.7 +204 -8.0 -35.4 h 0.2 +205 -11.7 -33.4 h 4.2 +206 -43.8 -1.7 h 4.5 +207 251.0 54.7 h 26.3 +208 252.9 85.9 h 10.5 +209 261.1 66.2 h 3.5 +210 247.6 63.0 h 8.0 +211 256.6 109.7 h 0.9 +212 246.4 78.1 h 10.8 +213 258.8 61.8 h 9.3 +214 245.5 62.7 h 0.4 +215 235.0 69.5 h 0.1 +216 284.3 47.1 h 0.8 +217 245.2 55.4 h 37.0 +218 252.9 69.6 h 6.2 +219 -21.8 -10.4 h 6.0 +220 -18.5 -10.7 h 14.0 +221 235.1 88.4 h 0.2 +222 259.9 65.1 h 38.0 +223 265.7 80.7 h 15.1 +224 267.3 107.0 h 0.2 +225 268.1 60.1 h 0.2 diff --git a/examples/platforms/median_harvard.xml b/examples/platforms/median_harvard.xml new file mode 100644 index 0000000000..2620fd886d --- /dev/null +++ b/examples/platforms/median_harvard.xml @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/platforms/median_meridian.syscoord b/examples/platforms/median_meridian.syscoord new file mode 100644 index 0000000000..427656df46 --- /dev/null +++ b/examples/platforms/median_meridian.syscoord @@ -0,0 +1,2500 @@ +0 25.5 9.4 h 1.4 +1 -12.7 -9.9 h 2.1 +2 -15.7 9.9 h 14.7 +3 27.1 7.2 h 19.2 +4 11.4 10.7 h 24.8 +5 27.1 14.9 h 0.3 +6 110.1 31.2 h 43.7 +7 -21.2 -25.2 h 4.1 +8 -2.3 1.1 h 12.0 +9 16.8 -11.1 h 15.4 +10 -6.8 1.6 h 0.3 +11 23.0 -4.1 h 1.0 +12 29.9 -9.2 h 0.2 +13 -2.2 7.2 h 11.0 +14 26.1 -61.9 h 144.7 +15 -39.4 1.1 h 0.6 +16 26.5 -15.1 h 0.3 +17 15.0 -0.5 h 34.5 +18 16.5 11.5 h 19.2 +19 -37.9 85.0 h 69.8 +20 -2.6 19.4 h 6.4 +21 -104.4 -162.5 h 1.7 +22 -41.8 -30.9 h 5.8 +23 -9.9 10.4 h 1.9 +24 8.5 15.3 h 31.9 +25 6.0 -12.6 h 7.0 +26 89.6 26.1 h 17.9 +27 13.9 -31.4 h 8.2 +28 13.6 10.0 h 25.0 +29 32.2 34.0 h 104.4 +30 23.5 21.2 h 24.5 +31 -27.0 -12.1 h 4.8 +32 18.4 -4.5 h 1.2 +33 109.3 253.6 h 2.0 +34 16.5 9.4 h 4.2 +35 -35.9 -42.6 h 1.0 +36 30.4 18.9 h 3.5 +37 -23.1 -7.6 h 39.9 +38 135.5 -21.0 h 83.4 +39 17.5 6.7 h 18.8 +40 22.3 13.6 h 21.7 +41 -2.5 8.3 h 7.0 +42 -10.3 -8.8 h 2.0 +43 142.5 63.5 h 0.3 +44 5.1 -2.9 h 10.6 +45 -18.4 23.5 h 8.4 +46 -26.3 -3.2 h 7.1 +47 -21.6 11.6 h 89.2 +48 -44.3 17.0 h 0.5 +49 -59.8 -16.8 h 1.0 +50 23.9 35.4 h 8.1 +51 22.9 10.1 h 8.9 +52 27.6 25.7 h 0.4 +53 9.5 13.3 h 10.3 +54 -34.2 20.0 h 1.8 +55 -58.7 -11.7 h 2.1 +56 -40.3 -27.4 h 0.3 +57 19.7 -15.1 h 3.5 +58 8.4 17.5 h 32.4 +59 25.1 8.8 h 16.6 +60 25.3 13.9 h 21.8 +61 29.5 -58.9 h 17.0 +62 -48.1 -6.8 h 0.3 +63 -17.2 -1.2 h 0.4 +64 10.6 18.7 h 33.4 +65 1.9 -3.5 h 2.5 +66 -3.6 1.6 h 6.7 +67 -20.1 8.7 h 8.7 +68 -22.0 5.6 h 31.9 +69 -32.4 -9.4 h 2.5 +70 13.3 7.2 h 20.3 +71 23.2 10.9 h 12.3 +72 7.0 17.8 h 4.0 +73 34.1 37.7 h 0.9 +74 -55.4 -5.1 h 8.7 +75 -3.4 -4.4 h 0.4 +76 22.6 0.8 h 5.1 +77 23.2 15.6 h 0.3 +78 21.6 16.4 h 6.1 +79 12.0 14.2 h 20.4 +80 90.3 79.5 h 66.6 +81 -3.0 2.5 h 7.2 +82 -7.2 19.4 h 3.6 +83 5.9 15.2 h 3.9 +84 -208.1 -127.0 h 325.6 +85 0.6 8.0 h 8.0 +86 16.3 17.6 h 29.2 +87 -0.6 8.6 h 32.5 +88 -1.8 6.5 h 18.4 +89 -6.8 22.6 h 1.1 +90 17.0 20.6 h 9.8 +91 -39.1 -30.5 h 1.2 +92 110.1 57.3 h 30.3 +93 21.1 -4.7 h 8.6 +94 -36.4 -12.8 h 3.5 +95 33.2 -20.1 h 1.2 +96 25.9 15.4 h 6.5 +97 -1.0 3.8 h 0.3 +98 -19.4 1.4 h 23.4 +99 17.1 9.8 h 8.3 +100 5.5 -16.5 h 1.1 +101 3.3 1.8 h 12.3 +102 1.4 23.0 h 3.3 +103 -48.5 -29.4 h 1.3 +104 7.6 -4.5 h 19.2 +105 0.2 15.1 h 30.5 +106 6.3 10.6 h 0.3 +107 24.4 9.9 h 1.4 +108 19.1 11.4 h 5.8 +109 29.7 12.3 h 5.9 +110 -0.9 13.4 h 6.8 +111 19.3 -9.3 h 3.0 +112 15.8 14.7 h 18.7 +113 2.8 13.2 h 8.6 +114 18.8 11.5 h 4.1 +115 -10.4 -2.2 h 3.6 +116 -45.7 -10.4 h 1.5 +117 25.7 16.9 h 0.7 +118 -0.7 17.5 h 5.2 +119 30.2 1.9 h 22.3 +120 0.1 2.7 h 38.6 +121 3.0 19.1 h 3.1 +122 -6.6 15.4 h 2.4 +123 10.9 14.3 h 21.9 +124 3.3 21.0 h 14.4 +125 29.9 8.1 h 0.5 +126 -43.0 -18.3 h 1.4 +127 29.8 8.1 h 6.8 +128 36.7 17.1 h 0.8 +129 106.8 34.2 h 23.7 +130 -29.1 -20.5 h 10.1 +131 13.1 22.0 h 0.5 +132 78.7 137.3 h 0.3 +133 100.2 -6.3 h 185.7 +134 0.4 20.3 h 10.3 +135 24.0 -2.4 h 38.2 +136 -4.1 1.1 h 1.2 +137 7.7 19.2 h 10.7 +138 -19.6 -5.6 h 0.7 +139 9.7 3.1 h 24.4 +140 112.9 69.0 h 0.8 +141 -8.8 -9.0 h 3.2 +142 26.2 12.9 h 2.0 +143 32.9 0.6 h 3.7 +144 -33.5 -9.2 h 16.9 +145 21.8 13.6 h 0.5 +146 29.9 14.0 h 99.7 +147 -33.3 -41.3 h 10.9 +148 12.1 14.0 h 21.0 +149 12.6 4.8 h 28.6 +150 -21.0 -24.0 h 5.3 +151 13.1 13.2 h 0.5 +152 20.1 23.0 h 4.7 +153 6.4 15.0 h 30.2 +154 25.1 4.0 h 0.4 +155 28.8 29.7 h 3.2 +156 10.5 -8.2 h 13.6 +157 13.7 3.1 h 0.7 +158 24.0 23.1 h 10.9 +159 53.0 55.5 h 18.2 +160 10.8 5.4 h 38.2 +161 -74.9 -31.9 h 6.6 +162 2.5 8.3 h 15.7 +163 85.6 28.1 h 90.0 +164 8.1 9.4 h 8.5 +165 18.0 8.9 h 6.1 +166 -6.4 0.1 h 7.9 +167 23.9 29.7 h 0.4 +168 19.2 19.4 h 40.2 +169 4.1 9.2 h 7.3 +170 2.5 32.5 h 1.6 +171 2.5 0.2 h 30.2 +172 -5.1 7.5 h 1.5 +173 35.8 27.0 h 0.6 +174 -35.4 2.7 h 2.0 +175 27.0 9.4 h 0.9 +176 9.5 5.3 h 17.3 +177 -36.1 -15.7 h 14.9 +178 -22.5 74.1 h 0.7 +179 6.3 14.3 h 16.7 +180 -23.3 -18.3 h 0.2 +181 19.4 10.3 h 6.2 +182 -16.7 37.0 h 5.9 +183 12.5 13.7 h 1.2 +184 14.5 14.1 h 14.6 +185 28.9 15.3 h 0.6 +186 -5.9 -4.6 h 15.4 +187 -11.1 7.8 h 18.9 +188 1.1 -2.9 h 13.8 +189 -13.8 -5.3 h 47.8 +190 28.1 38.3 h 3.4 +191 35.0 16.3 h 4.8 +192 -7.5 -5.1 h 12.3 +193 52.3 60.9 h 3.9 +194 0.6 2.3 h 22.1 +195 22.9 3.2 h 2.1 +196 17.8 6.7 h 0.6 +197 9.0 13.0 h 71.9 +198 -51.7 44.4 h 0.9 +199 -40.8 -10.6 h 3.7 +200 15.8 10.6 h 13.3 +201 -25.4 8.9 h 5.2 +202 -60.4 100.1 h 0.3 +203 25.5 23.0 h 1.3 +204 38.4 26.8 h 2.1 +205 9.0 20.5 h 2.6 +206 39.1 16.7 h 1.7 +207 19.1 18.2 h 4.6 +208 7.7 8.5 h 12.6 +209 20.0 11.4 h 0.9 +210 19.5 12.6 h 2.3 +211 -22.5 14.0 h 17.3 +212 -2.4 2.2 h 7.8 +213 12.8 6.7 h 29.1 +214 0.1 -2.0 h 9.4 +215 7.7 -8.6 h 0.8 +216 -11.1 -8.0 h 0.5 +217 6.2 -7.1 h 9.2 +218 -49.1 -25.9 h 23.2 +219 15.0 19.0 h 34.8 +220 -38.7 -6.1 h 0.9 +221 6.0 -2.0 h 26.8 +222 -47.5 -29.5 h 0.3 +223 -27.4 2.5 h 1.7 +224 29.8 3.1 h 0.3 +225 -40.9 -3.1 h 0.5 +226 35.1 35.6 h 2.7 +227 -37.0 -6.4 h 3.2 +228 15.9 5.1 h 4.8 +229 -38.5 -8.6 h 0.7 +230 32.0 4.9 h 1.4 +231 -29.6 -2.4 h 5.4 +232 3.7 8.6 h 31.5 +233 9.9 2.0 h 6.6 +234 -8.2 -2.6 h 3.4 +235 18.9 -2.8 h 7.2 +236 -18.0 -5.7 h 0.1 +237 19.3 -1.6 h 0.2 +238 14.8 23.7 h 29.1 +239 -0.0 8.2 h 52.9 +240 -22.4 -40.7 h 1.9 +241 -13.3 -0.5 h 21.8 +242 9.8 7.8 h 18.3 +243 -25.7 -20.9 h 19.9 +244 25.0 10.0 h 1.2 +245 19.1 22.1 h 145.8 +246 7.4 16.1 h 16.3 +247 7.4 -2.7 h 22.4 +248 4.9 19.9 h 11.5 +249 12.3 -12.4 h 9.2 +250 -19.9 11.6 h 6.0 +251 2.1 2.3 h 8.8 +252 0.1 3.6 h 4.0 +253 24.5 26.8 h 1.1 +254 -10.5 4.5 h 17.4 +255 -17.4 33.1 h 8.4 +256 17.6 1.7 h 27.9 +257 -48.0 1.9 h 3.5 +258 25.9 2.3 h 0.5 +259 0.9 3.8 h 26.2 +260 -70.8 21.0 h 1.9 +261 17.1 1.8 h 18.5 +262 3.3 -13.1 h 0.2 +263 -49.1 -4.1 h 0.6 +264 -28.0 8.0 h 48.8 +265 2.9 2.7 h 0.7 +266 113.8 15.0 h 2.0 +267 32.1 13.9 h 12.2 +268 -13.1 -33.9 h 30.1 +269 -17.5 18.3 h 4.6 +270 29.7 22.7 h 3.1 +271 6.6 15.5 h 7.9 +272 1.9 3.1 h 32.6 +273 21.6 2.6 h 15.8 +274 12.7 14.0 h 1.5 +275 17.3 14.3 h 8.2 +276 32.0 12.8 h 68.0 +277 -30.2 -0.1 h 1.8 +278 -12.5 1.7 h 10.3 +279 31.1 22.2 h 0.5 +280 24.0 11.6 h 7.8 +281 52.9 2.7 h 0.4 +282 23.1 18.8 h 17.9 +283 -17.6 -36.1 h 8.4 +284 14.1 -21.4 h 1.5 +285 9.0 1.3 h 11.9 +286 28.4 -14.6 h 3.0 +287 27.1 8.6 h 0.8 +288 3.7 7.1 h 11.6 +289 -31.8 -34.4 h 0.1 +290 19.9 20.1 h 4.8 +291 25.5 18.9 h 7.2 +292 -5.2 8.7 h 0.6 +293 11.0 3.2 h 22.4 +294 -6.4 12.2 h 12.0 +295 29.9 13.3 h 1.3 +296 9.7 6.8 h 31.0 +297 -30.7 -29.5 h 0.7 +298 3.7 31.4 h 2.6 +299 6.5 19.8 h 0.6 +300 25.0 3.6 h 0.2 +301 -32.8 -7.0 h 20.3 +302 7.2 13.4 h 9.2 +303 15.1 16.1 h 39.9 +304 -28.8 14.5 h 0.3 +305 8.3 22.8 h 13.2 +306 -1.1 8.6 h 27.8 +307 -23.1 -9.6 h 33.2 +308 13.7 -15.2 h 8.3 +309 13.8 -5.1 h 0.7 +310 10.9 -23.2 h 0.8 +311 -14.2 24.1 h 1.8 +312 17.9 14.3 h 37.0 +313 -29.2 -21.6 h 9.5 +314 -41.8 -11.4 h 0.4 +315 -18.9 -1.0 h 2.3 +316 -21.8 52.0 h 2.4 +317 23.3 10.4 h 3.1 +318 4.0 0.8 h 0.8 +319 8.0 26.9 h 3.1 +320 -24.9 -4.2 h 2.9 +321 95.4 56.7 h 51.0 +322 -17.5 44.3 h 7.1 +323 22.4 19.4 h 22.6 +324 18.3 9.6 h 21.9 +325 12.9 5.8 h 13.5 +326 45.6 -7.2 h 4.9 +327 35.6 18.7 h 1.0 +328 -13.4 8.4 h 12.7 +329 -12.1 -1.4 h 1.0 +330 14.6 4.6 h 16.1 +331 17.3 14.7 h 7.7 +332 27.3 36.8 h 1.3 +333 -4.6 9.6 h 15.0 +334 -38.9 15.2 h 0.6 +335 13.9 9.9 h 5.6 +336 85.9 60.8 h 1.1 +337 -31.1 12.5 h 27.1 +338 17.3 -5.5 h 2.4 +339 -30.4 0.5 h 4.3 +340 14.5 5.6 h 9.2 +341 47.7 -30.5 h 1.0 +342 31.0 11.5 h 8.7 +343 -1.2 5.1 h 1.5 +344 -30.2 40.2 h 0.5 +345 -35.9 -17.4 h 4.7 +346 -0.1 25.1 h 3.4 +347 31.9 18.7 h 7.2 +348 27.6 17.0 h 12.3 +349 32.1 23.8 h 0.2 +350 21.6 -21.4 h 0.8 +351 52.6 9.8 h 2.3 +352 -30.9 -16.7 h 0.5 +353 23.8 20.9 h 46.3 +354 19.7 16.9 h 14.7 +355 -21.1 -19.7 h 31.7 +356 -19.6 -26.2 h 1.0 +357 -40.4 -18.4 h 3.6 +358 33.4 17.2 h 2.1 +359 -11.4 -20.0 h 20.2 +360 -5.1 19.5 h 9.4 +361 11.2 -2.4 h 0.7 +362 -3.9 4.2 h 7.4 +363 3.9 -3.8 h 0.4 +364 -34.3 -18.6 h 17.9 +365 29.3 18.3 h 1.9 +366 25.7 26.8 h 9.1 +367 19.3 16.2 h 6.7 +368 30.9 -3.3 h 0.3 +369 5.7 2.1 h 14.2 +370 15.9 9.3 h 14.6 +371 7.2 27.5 h 31.5 +372 -28.1 -20.7 h 0.7 +373 13.5 -3.0 h 0.4 +374 20.6 31.6 h 9.9 +375 -37.4 4.1 h 3.7 +376 -47.4 -34.1 h 1.5 +377 -22.7 -1.4 h 15.2 +378 22.5 4.2 h 14.2 +379 3.0 22.3 h 21.7 +380 21.9 22.7 h 8.4 +381 -38.8 -11.8 h 23.1 +382 11.8 5.7 h 3.8 +383 -4.2 14.4 h 0.6 +384 34.4 9.0 h 1.1 +385 24.2 9.9 h 0.8 +386 38.1 -29.4 h 0.6 +387 28.6 5.5 h 20.4 +388 36.8 44.0 h 4.7 +389 -5.1 1.1 h 42.3 +390 -24.2 -33.5 h 200.3 +391 9.5 8.6 h 22.4 +392 0.4 8.6 h 4.0 +393 17.5 5.9 h 2.9 +394 11.8 5.2 h 15.6 +395 -13.9 -38.6 h 7.4 +396 14.5 -72.0 h 0.6 +397 -15.0 -3.4 h 2.1 +398 62.4 -2.0 h 1.4 +399 -38.3 14.4 h 51.9 +400 64.4 38.3 h 33.6 +401 -1.3 22.5 h 21.6 +402 18.3 28.9 h 8.7 +403 -32.6 18.5 h 25.1 +404 16.9 11.5 h 18.6 +405 18.8 4.0 h 2.3 +406 9.4 17.0 h 2.1 +407 10.6 25.1 h 1.2 +408 25.0 6.1 h 0.5 +409 18.0 15.7 h 14.9 +410 28.3 10.8 h 17.7 +411 6.4 0.3 h 21.7 +412 31.5 20.3 h 47.8 +413 21.0 -3.9 h 0.6 +414 -25.7 -15.3 h 120.8 +415 -30.4 23.8 h 0.3 +416 37.9 -4.0 h 0.7 +417 24.1 5.5 h 5.9 +418 -3.2 11.3 h 5.7 +419 32.2 21.0 h 2.8 +420 21.1 17.3 h 15.5 +421 2.2 17.2 h 16.3 +422 -23.1 -2.6 h 0.8 +423 31.3 18.9 h 29.3 +424 29.9 11.3 h 3.4 +425 20.0 21.4 h 6.7 +426 -41.9 -4.7 h 0.9 +427 -5.8 0.7 h 14.1 +428 2.6 4.9 h 5.7 +429 23.0 11.3 h 0.9 +430 139.7 149.8 h 80.0 +431 -20.4 -15.7 h 33.0 +432 -8.9 26.1 h 38.3 +433 26.8 -15.0 h 9.3 +434 -16.9 -6.5 h 0.7 +435 28.1 14.7 h 3.9 +436 23.0 22.9 h 1.6 +437 23.6 16.6 h 6.9 +438 16.7 8.4 h 3.6 +439 3.4 -10.3 h 32.9 +440 7.1 39.0 h 4.1 +441 -61.7 7.4 h 0.3 +442 -24.4 -4.0 h 1.9 +443 45.2 48.7 h 115.2 +444 13.1 -10.4 h 7.0 +445 -26.9 -22.4 h 49.2 +446 5.6 6.1 h 19.7 +447 -10.6 4.3 h 16.8 +448 -32.8 -21.5 h 15.9 +449 16.0 10.6 h 0.8 +450 -45.4 -21.1 h 0.7 +451 11.9 11.7 h 23.3 +452 13.0 -6.5 h 1.7 +453 13.5 6.4 h 5.7 +454 -5.1 8.4 h 14.9 +455 11.4 12.6 h 20.2 +456 9.5 9.6 h 8.6 +457 -59.7 -32.3 h 1.9 +458 37.7 17.6 h 1.6 +459 7.6 11.8 h 0.7 +460 -1.5 5.3 h 19.2 +461 33.8 11.8 h 1.3 +462 -14.5 36.2 h 0.9 +463 94.6 120.0 h 105.8 +464 -3.4 -5.6 h 5.0 +465 -165.4 -67.3 h 80.0 +466 23.1 -2.1 h 5.8 +467 10.0 3.4 h 1.4 +468 7.2 14.0 h 11.5 +469 -68.2 10.8 h 1.0 +470 132.0 25.5 h 32.5 +471 31.7 1.6 h 1.0 +472 26.9 33.4 h 10.2 +473 29.9 21.2 h 5.0 +474 27.4 26.3 h 0.1 +475 99.9 77.7 h 3.3 +476 39.3 20.8 h 1.8 +477 35.2 4.3 h 0.7 +478 29.0 10.9 h 0.3 +479 -6.0 23.4 h 4.3 +480 -1.6 7.7 h 28.1 +481 29.3 19.5 h 1.1 +482 -1.4 4.4 h 29.7 +483 4.6 1.9 h 12.8 +484 11.6 -1.5 h 0.8 +485 18.9 15.7 h 8.8 +486 -30.4 -31.6 h 6.9 +487 15.0 1.8 h 25.9 +488 9.6 3.9 h 10.9 +489 30.9 20.4 h 0.4 +490 245.2 137.8 h 24.3 +491 -19.7 -2.9 h 256.9 +492 -23.8 -2.8 h 0.2 +493 29.5 26.7 h 0.2 +494 34.3 10.2 h 2.6 +495 33.5 12.0 h 0.7 +496 -16.4 -77.3 h 2.0 +497 5.4 8.7 h 25.9 +498 2.9 46.7 h 1.2 +499 13.0 58.7 h 53.4 +500 26.9 -0.9 h 19.1 +501 22.8 9.3 h 0.8 +502 -11.4 4.9 h 0.7 +503 -45.9 8.4 h 0.6 +504 26.1 10.0 h 0.4 +505 9.1 12.3 h 1.1 +506 124.5 16.5 h 6.0 +507 14.5 -1.3 h 4.7 +508 10.3 -1.0 h 8.2 +509 10.7 9.1 h 8.7 +510 17.3 8.4 h 2.1 +511 16.6 -1.2 h 12.2 +512 22.2 21.5 h 0.1 +513 -0.0 6.7 h 7.6 +514 22.5 9.5 h 0.5 +515 9.9 -53.5 h 364.0 +516 3.6 7.5 h 6.2 +517 15.0 2.0 h 6.6 +518 -51.3 -2.5 h 0.9 +519 105.9 15.3 h 1.3 +520 2.0 19.8 h 0.0 +521 10.9 10.0 h 12.0 +522 7.5 14.9 h 17.2 +523 -14.3 18.9 h 11.8 +524 -25.1 -21.0 h 14.3 +525 -4.9 21.2 h 3.0 +526 19.4 15.8 h 23.6 +527 26.3 14.2 h 14.4 +528 12.5 16.2 h 10.3 +529 -29.4 -4.1 h 3.5 +530 -31.8 5.5 h 8.2 +531 0.5 -1.6 h 17.0 +532 -21.1 50.6 h 0.1 +533 -5.1 9.9 h 18.7 +534 26.2 16.4 h 1.0 +535 79.7 103.3 h 126.4 +536 -25.8 -3.9 h 6.7 +537 -20.6 -20.5 h 48.4 +538 37.8 5.7 h 0.0 +539 -17.0 -7.4 h 0.2 +540 -6.3 29.6 h 39.7 +541 -43.3 -1.4 h 7.4 +542 25.3 -13.7 h 0.7 +543 -24.1 -27.4 h 22.2 +544 11.3 17.1 h 9.6 +545 -6.4 -38.5 h 4.9 +546 11.9 17.7 h 23.7 +547 18.3 -12.3 h 15.9 +548 -33.2 -13.5 h 1.5 +549 -6.5 -2.3 h 1.0 +550 -0.3 -5.0 h 9.1 +551 16.7 -1.0 h 30.5 +552 21.8 5.9 h 11.2 +553 -21.2 -21.6 h 3.2 +554 34.7 15.8 h 0.4 +555 18.4 23.7 h 0.8 +556 29.1 8.7 h 1.0 +557 28.5 19.9 h 0.7 +558 24.5 8.6 h 0.8 +559 48.5 16.1 h 1.4 +560 31.8 2.8 h 15.0 +561 -0.5 6.3 h 7.4 +562 -9.4 -39.4 h 0.2 +563 22.6 18.1 h 0.4 +564 33.0 14.7 h 34.9 +565 9.5 -47.8 h 7.3 +566 -18.1 -6.4 h 3.7 +567 4.6 0.0 h 30.6 +568 44.7 14.2 h 81.5 +569 12.4 34.4 h 0.9 +570 4.3 4.1 h 6.6 +571 222.6 -77.4 h 4.3 +572 -19.2 -5.2 h 14.4 +573 18.5 -1.9 h 15.8 +574 11.1 -1.7 h 6.2 +575 28.9 11.2 h 73.2 +576 7.9 -3.5 h 2.3 +577 2.4 32.5 h 33.7 +578 -14.1 -2.8 h 34.0 +579 15.5 12.5 h 22.1 +580 -8.6 2.8 h 7.5 +581 -27.7 -16.6 h 0.5 +582 -36.1 -0.1 h 0.6 +583 20.6 10.1 h 5.6 +584 13.5 -19.9 h 7.2 +585 -40.2 2.0 h 27.1 +586 -33.5 14.5 h 1.6 +587 0.6 27.4 h 6.9 +588 24.4 41.5 h 6.7 +589 20.3 9.8 h 12.1 +590 -8.4 -0.8 h 12.5 +591 36.4 4.4 h 12.4 +592 6.6 12.4 h 14.1 +593 20.0 7.9 h 3.6 +594 -15.7 -9.5 h 206.5 +595 70.4 84.5 h 31.5 +596 -6.3 9.5 h 3.5 +597 25.4 1.8 h 19.5 +598 -5.6 9.0 h 6.6 +599 -27.3 -13.6 h 38.5 +600 11.1 15.3 h 19.8 +601 24.3 4.7 h 0.9 +602 11.9 -6.7 h 32.0 +603 10.1 15.0 h 6.4 +604 42.4 33.2 h 11.2 +605 32.3 18.7 h 74.1 +606 -8.7 0.3 h 9.1 +607 -32.5 6.7 h 228.4 +608 -101.6 -63.6 h 101.3 +609 -11.8 3.1 h 11.2 +610 15.4 -1.7 h 16.4 +611 5.5 -5.2 h 20.0 +612 -6.3 -16.2 h 22.1 +613 -17.5 -0.9 h 7.5 +614 39.1 10.7 h 55.6 +615 24.6 8.9 h 92.1 +616 23.2 -34.3 h 0.6 +617 28.1 16.7 h 6.7 +618 90.3 59.6 h 1.8 +619 7.3 17.2 h 27.0 +620 -163.6 -102.5 h 34.4 +621 16.9 14.6 h 0.1 +622 2.9 9.5 h 24.7 +623 -6.6 0.8 h 8.5 +624 7.0 -0.8 h 3.9 +625 -41.9 -6.5 h 0.6 +626 -1.9 36.6 h 25.5 +627 18.4 14.2 h 0.4 +628 -43.3 -68.2 h 2.0 +629 121.1 78.7 h 0.5 +630 -10.1 8.3 h 3.1 +631 25.5 24.5 h 77.5 +632 -35.8 -10.0 h 215.2 +633 -33.7 5.5 h 1.5 +634 32.8 14.7 h 0.4 +635 -51.5 3.0 h 10.3 +636 21.4 39.6 h 0.9 +637 16.4 6.7 h 0.5 +638 25.9 20.7 h 0.4 +639 19.4 37.6 h 0.1 +640 -34.6 -30.5 h 1.0 +641 62.5 4.1 h 4.0 +642 31.5 -9.7 h 0.5 +643 21.3 10.3 h 12.7 +644 36.1 3.9 h 1.6 +645 -6.2 2.5 h 16.5 +646 20.4 9.4 h 6.2 +647 -28.5 -16.8 h 0.1 +648 -8.0 8.9 h 0.4 +649 -19.5 -4.3 h 47.7 +650 -15.5 -33.1 h 0.3 +651 12.1 4.6 h 6.2 +652 11.8 7.5 h 13.5 +653 6.2 2.6 h 13.7 +654 6.1 22.5 h 14.5 +655 -7.0 5.9 h 0.5 +656 115.5 41.3 h 0.5 +657 29.7 7.2 h 12.2 +658 21.2 16.0 h 67.3 +659 -43.2 -5.7 h 0.3 +660 23.3 10.7 h 0.9 +661 -29.5 -13.3 h 8.0 +662 -13.4 5.6 h 0.5 +663 -11.3 -6.6 h 31.6 +664 -26.5 -5.1 h 13.9 +665 -8.2 -3.7 h 0.3 +666 2.3 13.4 h 1.3 +667 17.6 15.3 h 8.5 +668 87.4 59.6 h 0.3 +669 20.1 -4.0 h 26.4 +670 -38.5 -21.6 h 1.0 +671 11.8 7.3 h 3.7 +672 2.1 -2.0 h 0.1 +673 -10.6 10.4 h 2.3 +674 -8.4 -32.4 h 159.9 +675 -27.9 -20.3 h 21.2 +676 253.9 -129.4 h 295.5 +677 -8.9 17.8 h 6.6 +678 -187.7 -99.1 h 21.3 +679 27.9 11.3 h 5.1 +680 13.8 -10.1 h 0.1 +681 -25.5 -7.1 h 20.8 +682 21.9 28.2 h 0.3 +683 -47.2 -7.5 h 1.6 +684 22.4 26.7 h 5.8 +685 95.4 -9.9 h 71.4 +686 -0.2 6.4 h 4.2 +687 -5.3 14.6 h 38.2 +688 -25.7 6.6 h 177.8 +689 -40.3 -2.1 h 3.0 +690 0.4 -1.4 h 17.8 +691 24.8 1.3 h 0.9 +692 10.7 -7.0 h 0.9 +693 24.3 7.5 h 5.9 +694 33.3 18.7 h 0.8 +695 -30.8 8.4 h 41.3 +696 -39.4 -12.5 h 0.5 +697 -26.3 -13.2 h 10.9 +698 -1.1 1.2 h 6.8 +699 -49.4 -9.4 h 4.6 +700 -5.3 -0.1 h 7.6 +701 17.8 6.8 h 0.2 +702 20.2 22.8 h 2.8 +703 107.7 7.4 h 65.0 +704 -1.5 6.2 h 13.1 +705 -28.9 -1.8 h 9.9 +706 -15.8 8.4 h 61.3 +707 -32.7 -49.6 h 4.1 +708 59.1 20.5 h 70.6 +709 23.9 22.5 h 0.8 +710 -34.0 2.2 h 7.2 +711 9.1 4.6 h 0.6 +712 37.2 -3.0 h 0.1 +713 -21.7 -11.4 h 20.4 +714 18.1 7.9 h 0.3 +715 28.4 18.9 h 2.2 +716 -16.9 -2.2 h 0.4 +717 -4.6 -5.3 h 0.4 +718 24.8 15.5 h 3.7 +719 -42.9 -16.5 h 6.9 +720 29.0 12.2 h 0.9 +721 -99.5 -134.2 h 42.1 +722 26.6 35.8 h 11.5 +723 19.1 9.9 h 0.3 +724 -3.0 -1.4 h 36.2 +725 -24.9 13.3 h 13.5 +726 -49.3 -25.6 h 4.1 +727 35.8 20.7 h 1.8 +728 -46.9 -35.8 h 146.4 +729 13.5 42.2 h 20.9 +730 -12.7 -18.2 h 16.1 +731 -4.4 -1.1 h 6.4 +732 -20.1 29.7 h 11.6 +733 -3.9 10.2 h 18.1 +734 13.5 -9.3 h 2.1 +735 2.4 1.7 h 46.0 +736 30.9 19.6 h 0.4 +737 -6.7 17.3 h 0.2 +738 -3.7 4.6 h 27.1 +739 8.7 -19.0 h 13.0 +740 13.9 25.7 h 9.2 +741 -24.6 -20.7 h 5.8 +742 27.0 14.8 h 51.6 +743 0.1 4.0 h 2.6 +744 1.4 2.2 h 24.7 +745 3.0 -22.1 h 25.7 +746 -27.2 21.5 h 36.5 +747 26.6 19.6 h 6.5 +748 -30.9 -30.2 h 0.3 +749 -82.8 -30.3 h 136.5 +750 -6.5 3.5 h 7.8 +751 4.5 7.3 h 1.3 +752 12.7 -17.7 h 0.6 +753 -1.2 9.6 h 2.1 +754 90.2 51.5 h 4.3 +755 14.4 -1.1 h 10.7 +756 32.2 22.1 h 0.9 +757 15.4 11.1 h 18.7 +758 122.1 82.0 h 0.9 +759 -27.9 -3.4 h 1.5 +760 -40.2 -3.5 h 1.7 +761 33.6 12.7 h 5.6 +762 19.0 -0.4 h 4.0 +763 -0.0 30.5 h 0.9 +764 8.2 4.6 h 13.8 +765 15.6 4.3 h 23.7 +766 -4.6 8.1 h 10.9 +767 23.2 14.8 h 10.4 +768 34.1 10.5 h 1.1 +769 11.4 9.2 h 26.2 +770 13.4 30.3 h 7.1 +771 -13.9 2.3 h 30.4 +772 -39.5 -3.3 h 8.3 +773 -129.4 103.9 h 0.5 +774 9.3 12.0 h 20.3 +775 29.4 21.5 h 0.3 +776 23.9 12.9 h 4.3 +777 -1.3 3.1 h 30.8 +778 15.2 11.2 h 19.9 +779 -15.8 -4.1 h 60.9 +780 14.2 25.9 h 16.9 +781 25.8 9.7 h 1.9 +782 117.3 31.7 h 39.4 +783 4.5 4.6 h 43.1 +784 9.1 -5.4 h 21.6 +785 -34.0 -26.9 h 2.0 +786 -24.4 -2.7 h 5.5 +787 23.6 14.0 h 0.2 +788 15.7 3.1 h 23.8 +789 -4.5 11.1 h 34.2 +790 9.0 12.8 h 1.1 +791 -1.2 -3.6 h 0.5 +792 -175.6 52.3 h 12.5 +793 -37.5 -15.6 h 0.2 +794 2.9 10.6 h 5.8 +795 29.3 7.4 h 11.9 +796 12.0 1.7 h 70.6 +797 23.8 18.7 h 10.5 +798 -116.2 111.3 h 41.1 +799 9.8 2.4 h 28.8 +800 6.7 18.4 h 0.5 +801 30.9 37.4 h 2.3 +802 25.0 9.7 h 5.1 +803 -26.0 -11.2 h 24.7 +804 19.3 7.6 h 1.6 +805 -18.4 -15.6 h 3.1 +806 16.3 10.8 h 4.7 +807 15.7 20.2 h 16.3 +808 -1.9 0.6 h 20.1 +809 -67.8 -7.5 h 1.3 +810 10.9 7.9 h 4.0 +811 -29.0 -40.2 h 0.2 +812 24.7 22.3 h 2.2 +813 -12.9 -13.1 h 11.6 +814 41.8 4.6 h 0.3 +815 2.5 12.5 h 4.3 +816 -14.2 -10.5 h 4.4 +817 -56.0 2.7 h 0.6 +818 -3.5 11.9 h 8.6 +819 8.8 30.6 h 0.2 +820 26.5 18.5 h 0.8 +821 -30.4 -11.8 h 9.2 +822 -34.2 -7.7 h 1.1 +823 22.8 19.5 h 0.4 +824 -38.3 74.0 h 31.6 +825 23.3 9.9 h 0.5 +826 -8.4 11.1 h 1.9 +827 -40.7 -11.4 h 0.3 +828 -50.1 -18.4 h 0.2 +829 35.2 46.3 h 0.6 +830 23.5 -0.2 h 0.7 +831 -8.4 4.2 h 15.9 +832 20.4 18.6 h 13.7 +833 15.4 3.1 h 13.1 +834 -46.3 -5.9 h 0.4 +835 -36.8 -26.1 h 1.3 +836 13.3 12.1 h 34.3 +837 -18.8 -23.9 h 19.3 +838 14.2 4.6 h 6.0 +839 27.9 11.8 h 2.8 +840 23.7 7.1 h 5.2 +841 1.9 -6.7 h 59.8 +842 32.0 14.1 h 10.5 +843 -52.1 -7.7 h 11.9 +844 -9.3 -14.9 h 23.0 +845 13.8 16.8 h 2.1 +846 -22.4 0.2 h 3.2 +847 -4.5 -18.9 h 1.9 +848 32.6 26.0 h 0.9 +849 -35.2 -16.4 h 0.9 +850 18.7 11.9 h 1.8 +851 -2.7 21.1 h 6.3 +852 0.2 0.2 h 2.0 +853 27.6 11.0 h 0.4 +854 -32.1 -11.1 h 0.7 +855 -5.8 1.1 h 8.8 +856 -39.7 5.4 h 15.5 +857 -15.9 -21.4 h 0.4 +858 26.6 20.8 h 0.2 +859 -7.6 6.2 h 5.7 +860 -14.5 8.5 h 2.6 +861 12.0 13.7 h 19.7 +862 101.0 83.3 h 1.1 +863 12.5 3.6 h 0.4 +864 -41.0 -2.5 h 0.7 +865 28.0 14.0 h 7.6 +866 -11.3 -19.8 h 8.0 +867 0.8 12.8 h 5.6 +868 -18.8 -26.6 h 2.3 +869 17.4 4.4 h 11.3 +870 0.5 3.6 h 3.2 +871 -26.2 -17.0 h 1.3 +872 7.8 7.8 h 25.7 +873 -40.8 -4.5 h 13.0 +874 8.1 1.5 h 47.1 +875 10.9 3.3 h 21.4 +876 13.9 20.5 h 2.0 +877 1.7 3.7 h 19.4 +878 -40.7 4.3 h 1.1 +879 -36.0 -13.0 h 0.6 +880 -0.0 4.5 h 3.8 +881 -5.5 14.2 h 9.8 +882 -34.4 -24.3 h 0.9 +883 5.9 -11.2 h 13.9 +884 28.2 11.0 h 0.2 +885 26.1 25.7 h 26.9 +886 -16.8 2.9 h 0.1 +887 -35.5 -23.1 h 5.5 +888 25.9 18.8 h 0.6 +889 2.2 27.2 h 6.6 +890 24.7 5.6 h 11.1 +891 38.9 18.2 h 3.8 +892 -124.4 -126.9 h 0.4 +893 26.4 2.8 h 4.6 +894 33.5 6.6 h 105.5 +895 25.0 21.5 h 24.2 +896 -19.1 -6.8 h 36.6 +897 43.5 18.8 h 67.3 +898 -47.6 -2.4 h 2.0 +899 61.1 -38.0 h 12.3 +900 31.6 9.8 h 9.4 +901 116.2 7.9 h 0.8 +902 111.3 -29.7 h 0.5 +903 -0.3 19.8 h 1.4 +904 116.8 19.3 h 1.0 +905 -6.4 5.1 h 4.2 +906 10.4 8.3 h 29.0 +907 26.0 9.4 h 1.2 +908 29.2 22.3 h 0.5 +909 -8.4 -40.4 h 26.0 +910 -78.7 -27.2 h 1.4 +911 19.8 10.7 h 3.3 +912 10.3 7.4 h 8.9 +913 -69.3 -31.8 h 15.6 +914 10.9 48.7 h 2.8 +915 6.0 7.3 h 12.6 +916 -27.8 -5.5 h 1.0 +917 -5.1 -4.5 h 12.1 +918 16.8 -67.6 h 0.2 +919 -29.2 -22.0 h 0.4 +920 24.6 19.5 h 0.6 +921 -36.8 -1.4 h 6.4 +922 -48.9 -34.4 h 1.9 +923 22.1 21.4 h 5.1 +924 22.6 3.2 h 13.4 +925 9.3 20.0 h 87.2 +926 3.4 4.6 h 16.1 +927 9.2 17.4 h 37.0 +928 34.6 8.0 h 2.8 +929 -26.0 -32.0 h 0.3 +930 -3.3 5.3 h 11.4 +931 20.0 15.4 h 7.8 +932 26.2 6.8 h 13.9 +933 -30.3 -27.6 h 10.1 +934 107.3 101.2 h 2.6 +935 13.2 21.1 h 7.6 +936 32.8 5.7 h 8.4 +937 13.3 41.7 h 63.0 +938 24.0 11.2 h 3.0 +939 2.1 -3.3 h 4.7 +940 -143.7 -120.0 h 0.4 +941 66.9 -180.8 h 100.4 +942 28.0 9.5 h 0.4 +943 -40.6 -16.4 h 48.2 +944 102.0 37.0 h 0.1 +945 20.2 23.2 h 3.3 +946 -72.4 9.6 h 1.4 +947 1.5 12.0 h 6.9 +948 29.1 16.0 h 1.7 +949 20.1 21.0 h 10.6 +950 6.8 6.1 h 1.4 +951 10.7 5.0 h 31.5 +952 17.3 13.1 h 0.1 +953 99.1 75.7 h 1.0 +954 5.2 31.0 h 1.3 +955 27.9 17.9 h 15.7 +956 23.9 13.4 h 3.9 +957 13.8 13.8 h 22.8 +958 25.4 20.8 h 3.7 +959 -38.1 -17.7 h 1.0 +960 23.2 5.0 h 0.9 +961 1.7 24.6 h 6.8 +962 37.4 15.0 h 13.6 +963 9.8 -3.4 h 22.3 +964 13.0 5.2 h 6.6 +965 -5.2 6.2 h 6.7 +966 19.7 16.1 h 0.2 +967 15.3 12.0 h 29.8 +968 20.3 13.6 h 27.8 +969 -31.0 -8.5 h 19.3 +970 6.0 4.6 h 1.4 +971 -1.0 2.1 h 9.9 +972 -15.0 -1.9 h 18.9 +973 -5.4 0.7 h 1.6 +974 1.1 -5.6 h 9.6 +975 9.7 -14.3 h 0.4 +976 -27.5 6.2 h 68.7 +977 29.6 25.4 h 8.5 +978 -45.4 36.5 h 1.2 +979 6.3 24.3 h 17.7 +980 32.2 9.0 h 0.3 +981 -42.5 -15.2 h 2.4 +982 14.5 12.9 h 5.0 +983 19.4 -24.8 h 0.3 +984 -43.4 -17.5 h 3.7 +985 31.3 5.0 h 9.6 +986 17.9 20.3 h 2.8 +987 6.9 6.3 h 8.9 +988 129.1 -23.7 h 0.2 +989 11.1 -9.0 h 3.7 +990 -53.0 1.3 h 6.3 +991 42.1 36.1 h 1.9 +992 305.6 294.6 h 229.2 +993 18.2 6.4 h 36.0 +994 15.3 -3.6 h 11.2 +995 -14.4 3.2 h 19.4 +996 12.3 -3.9 h 5.8 +997 40.3 -41.5 h 0.4 +998 8.6 21.5 h 21.0 +999 20.3 11.1 h 16.4 +1000 17.7 25.0 h 0.3 +1001 -35.3 -8.4 h 1.4 +1002 -25.3 -20.8 h 6.8 +1003 11.7 -3.5 h 10.4 +1004 -29.6 -13.1 h 12.3 +1005 22.3 7.7 h 8.0 +1006 -14.3 33.6 h 2.7 +1007 23.1 20.4 h 4.5 +1008 31.1 -11.0 h 17.6 +1009 15.2 8.5 h 7.5 +1010 -13.4 4.3 h 10.3 +1011 38.3 31.4 h 23.2 +1012 128.8 -216.3 h 0.6 +1013 9.6 5.4 h 23.7 +1014 -9.6 -12.8 h 15.3 +1015 18.1 16.7 h 24.3 +1016 -8.5 16.2 h 6.0 +1017 15.5 -12.3 h 8.1 +1018 5.4 20.2 h 0.5 +1019 7.8 18.6 h 13.0 +1020 20.0 5.5 h 2.8 +1021 16.6 21.6 h 14.0 +1022 52.8 75.3 h 9.9 +1023 -3.0 4.2 h 33.7 +1024 16.0 16.6 h 6.1 +1025 -0.6 16.4 h 9.2 +1026 -3.7 -1.5 h 6.0 +1027 66.1 112.9 h 0.2 +1028 20.8 8.0 h 5.8 +1029 -1.7 4.0 h 1.1 +1030 -21.4 61.3 h 8.3 +1031 24.5 18.2 h 1.3 +1032 9.8 17.4 h 24.7 +1033 -32.2 -18.4 h 0.2 +1034 -4.9 4.5 h 23.5 +1035 10.7 -4.8 h 15.5 +1036 -61.4 -57.4 h 99.6 +1037 17.5 12.8 h 8.2 +1038 -36.0 2.7 h 10.6 +1039 11.6 23.9 h 0.6 +1040 2.6 11.8 h 8.3 +1041 11.1 1.6 h 12.0 +1042 4.5 12.1 h 32.1 +1043 19.4 11.2 h 1.1 +1044 1.2 17.4 h 0.9 +1045 -5.0 14.6 h 8.1 +1046 35.0 -2.0 h 0.3 +1047 86.5 60.4 h 1.1 +1048 20.5 37.4 h 0.8 +1049 34.0 38.2 h 1.2 +1050 -49.7 -8.2 h 0.2 +1051 9.0 4.8 h 22.2 +1052 34.4 10.8 h 0.2 +1053 -32.8 -12.6 h 1.9 +1054 -8.9 3.4 h 0.2 +1055 21.4 12.3 h 3.2 +1056 -17.0 -3.2 h 0.6 +1057 -35.0 -15.8 h 3.1 +1058 35.6 22.6 h 7.9 +1059 -7.8 6.5 h 15.7 +1060 6.5 10.4 h 7.1 +1061 1.9 -10.8 h 18.7 +1062 25.7 54.7 h 0.2 +1063 14.2 6.6 h 15.2 +1064 1.4 5.5 h 13.2 +1065 -3.6 -57.0 h 1.7 +1066 153.2 68.2 h 69.8 +1067 0.7 -8.8 h 0.1 +1068 -12.7 -6.1 h 24.3 +1069 1.6 7.6 h 17.2 +1070 -36.5 -22.2 h 31.7 +1071 15.9 15.3 h 17.5 +1072 -44.5 -12.7 h 2.4 +1073 30.2 -8.7 h 0.8 +1074 32.1 -13.0 h 2.7 +1075 85.8 1.6 h 7.8 +1076 -20.7 -19.2 h 14.7 +1077 27.8 -8.3 h 0.9 +1078 -26.1 -23.1 h 25.2 +1079 -7.4 14.6 h 3.4 +1080 22.6 5.9 h 27.6 +1081 -20.2 -23.5 h 174.6 +1082 5.5 3.0 h 2.3 +1083 -25.7 -19.2 h 30.9 +1084 -19.9 -24.8 h 16.9 +1085 36.6 25.2 h 0.9 +1086 28.5 13.3 h 12.1 +1087 -27.2 -16.1 h 2.4 +1088 35.8 3.4 h 4.9 +1089 12.6 10.2 h 150.5 +1090 16.1 15.4 h 2.1 +1091 -10.5 4.1 h 1.0 +1092 -28.1 -11.9 h 0.0 +1093 -105.6 -89.8 h 98.9 +1094 -0.2 10.1 h 14.4 +1095 -2.1 6.4 h 7.1 +1096 11.0 14.9 h 7.2 +1097 46.6 125.1 h 69.0 +1098 124.8 74.7 h 4.1 +1099 11.3 -1.8 h 3.7 +1100 17.6 6.6 h 1.9 +1101 19.5 19.6 h 12.7 +1102 12.2 37.4 h 3.6 +1103 28.5 12.3 h 0.8 +1104 35.7 9.2 h 3.9 +1105 18.7 1.9 h 4.7 +1106 23.0 5.5 h 13.5 +1107 33.4 13.5 h 8.4 +1108 -61.3 -55.6 h 103.7 +1109 -57.4 16.3 h 5.8 +1110 18.0 -2.5 h 1.2 +1111 23.5 16.0 h 50.3 +1112 6.0 4.0 h 19.7 +1113 -21.0 -3.4 h 3.4 +1114 -88.8 -60.6 h 29.0 +1115 72.7 47.2 h 0.1 +1116 1.9 19.7 h 9.2 +1117 4.6 4.7 h 53.8 +1118 36.3 17.9 h 0.0 +1119 -19.3 -27.6 h 0.5 +1120 20.7 14.4 h 1.0 +1121 5.1 -1.2 h 7.1 +1122 95.3 43.9 h 0.1 +1123 22.6 13.5 h 0.9 +1124 6.7 17.3 h 13.4 +1125 37.2 12.5 h 3.2 +1126 -31.0 -39.1 h 11.0 +1127 120.5 12.6 h 5.5 +1128 -35.5 8.1 h 1.0 +1129 21.7 2.6 h 3.1 +1130 9.9 5.1 h 34.6 +1131 5.7 24.7 h 5.7 +1132 24.6 26.8 h 2.0 +1133 3.3 4.9 h 24.8 +1134 43.2 15.0 h 0.2 +1135 -17.1 -2.6 h 0.2 +1136 33.2 14.8 h 10.4 +1137 -0.2 9.9 h 16.2 +1138 2.8 -19.1 h 0.5 +1139 -37.2 -7.4 h 12.0 +1140 8.7 63.2 h 27.9 +1141 22.1 15.4 h 15.6 +1142 4.9 3.1 h 0.0 +1143 19.7 -13.4 h 38.5 +1144 -19.7 -10.8 h 52.1 +1145 -49.1 -13.3 h 63.7 +1146 -6.5 -51.7 h 3.7 +1147 128.6 60.5 h 1.3 +1148 13.6 23.2 h 0.6 +1149 -4.7 -2.9 h 19.0 +1150 17.1 13.6 h 28.9 +1151 33.6 3.3 h 0.7 +1152 3.9 19.3 h 15.8 +1153 -3.1 4.7 h 13.0 +1154 -30.1 -25.3 h 0.5 +1155 -22.6 14.8 h 0.6 +1156 17.3 38.2 h 0.9 +1157 4.8 -15.1 h 0.8 +1158 -39.3 -26.2 h 12.5 +1159 35.6 18.7 h 2.3 +1160 -1.1 9.7 h 22.2 +1161 -46.2 -15.8 h 0.8 +1162 -1.5 6.3 h 11.7 +1163 24.8 0.4 h 7.4 +1164 7.8 12.7 h 14.7 +1165 -4.0 9.6 h 2.4 +1166 25.8 -4.4 h 22.5 +1167 23.1 21.1 h 10.1 +1168 -53.4 -16.2 h 7.5 +1169 -40.5 -9.5 h 0.5 +1170 24.3 10.1 h 1.0 +1171 -40.8 -10.7 h 0.7 +1172 14.3 21.8 h 1.1 +1173 15.6 11.8 h 3.7 +1174 20.1 35.0 h 6.7 +1175 7.4 -12.5 h 3.1 +1176 21.5 2.6 h 130.7 +1177 -50.8 -104.8 h 94.4 +1178 10.6 2.3 h 20.0 +1179 -84.3 -31.2 h 97.4 +1180 23.4 7.7 h 5.8 +1181 -126.8 -134.0 h 26.7 +1182 22.2 12.2 h 15.4 +1183 27.0 21.5 h 17.3 +1184 13.4 11.2 h 3.8 +1185 2.7 -0.5 h 4.4 +1186 12.2 2.3 h 19.3 +1187 29.0 -1.4 h 2.9 +1188 32.2 3.7 h 5.5 +1189 25.8 11.6 h 2.8 +1190 -43.2 -9.9 h 1.2 +1191 14.8 6.5 h 24.2 +1192 -18.5 -12.7 h 14.4 +1193 23.2 18.2 h 2.5 +1194 31.4 8.1 h 2.9 +1195 3.4 9.5 h 20.2 +1196 16.0 2.0 h 3.1 +1197 5.1 4.9 h 27.2 +1198 15.2 10.8 h 21.1 +1199 26.6 16.3 h 2.9 +1200 -5.3 2.0 h 3.9 +1201 30.8 -11.0 h 130.7 +1202 -13.4 17.7 h 1.9 +1203 -9.4 0.9 h 0.4 +1204 114.5 -2.2 h 40.4 +1205 25.7 31.3 h 0.7 +1206 12.7 8.3 h 5.1 +1207 26.6 11.0 h 4.1 +1208 -39.7 83.7 h 85.4 +1209 23.9 12.9 h 25.9 +1210 -9.1 17.3 h 15.7 +1211 25.9 22.0 h 4.0 +1212 17.7 12.2 h 10.5 +1213 52.4 -53.2 h 8.3 +1214 5.0 8.2 h 19.0 +1215 8.7 -4.8 h 0.4 +1216 -6.1 7.7 h 6.7 +1217 -7.8 53.5 h 0.4 +1218 109.1 -10.9 h 4.7 +1219 -11.8 0.6 h 0.3 +1220 22.1 14.8 h 10.3 +1221 -25.5 -37.4 h 5.6 +1222 20.0 19.0 h 93.4 +1223 7.1 4.4 h 6.5 +1224 -7.6 -3.4 h 0.1 +1225 -10.0 14.3 h 5.5 +1226 31.2 10.8 h 1.3 +1227 -151.3 -75.0 h 6.0 +1228 -26.6 -2.0 h 19.9 +1229 -131.4 -72.1 h 70.9 +1230 -24.1 -13.2 h 61.5 +1231 27.6 5.0 h 0.9 +1232 -16.2 11.5 h 1.6 +1233 -28.5 -8.1 h 1.1 +1234 -39.2 -1.4 h 2.4 +1235 -20.9 -15.4 h 0.1 +1236 -27.5 13.9 h 1.3 +1237 8.7 21.3 h 19.1 +1238 3.6 3.6 h 10.6 +1239 -158.9 -37.6 h 0.2 +1240 -47.4 -20.7 h 0.4 +1241 4.0 19.2 h 8.1 +1242 7.1 5.1 h 20.3 +1243 3.1 -19.3 h 0.8 +1244 -3.2 1.7 h 6.2 +1245 17.9 33.7 h 4.5 +1246 18.8 11.4 h 1.7 +1247 22.2 12.3 h 11.8 +1248 -74.4 -8.6 h 138.3 +1249 10.0 38.8 h 2.5 +1250 21.7 12.5 h 10.7 +1251 -4.2 22.3 h 1.0 +1252 -16.8 7.7 h 21.1 +1253 -43.8 -9.3 h 0.6 +1254 -68.9 -49.2 h 83.9 +1255 -1.8 7.9 h 7.8 +1256 31.0 -7.0 h 21.1 +1257 29.9 12.8 h 19.0 +1258 -8.0 14.3 h 6.8 +1259 14.4 -2.9 h 6.3 +1260 -39.1 2.4 h 3.5 +1261 13.0 20.5 h 9.6 +1262 94.4 24.5 h 9.5 +1263 10.3 13.3 h 0.5 +1264 7.9 6.1 h 4.6 +1265 17.2 13.3 h 10.4 +1266 18.6 -9.6 h 0.9 +1267 22.8 -3.3 h 2.4 +1268 11.4 0.2 h 11.2 +1269 -15.1 10.2 h 1.0 +1270 -107.5 164.1 h 0.5 +1271 14.6 -9.3 h 0.6 +1272 -4.0 -1.9 h 8.1 +1273 12.9 7.1 h 2.9 +1274 -0.8 -16.7 h 0.6 +1275 -14.0 -0.6 h 23.2 +1276 91.5 45.7 h 35.8 +1277 24.9 -4.9 h 3.5 +1278 -7.5 7.9 h 19.5 +1279 23.3 22.3 h 6.1 +1280 20.3 27.2 h 32.2 +1281 22.8 7.1 h 5.3 +1282 30.7 13.7 h 0.6 +1283 -7.4 -11.7 h 0.6 +1284 16.2 6.4 h 14.8 +1285 -36.6 13.0 h 1.2 +1286 24.2 15.5 h 3.6 +1287 -6.1 -15.6 h 5.6 +1288 -42.5 -51.2 h 216.8 +1289 10.9 34.7 h 0.4 +1290 21.5 17.9 h 6.2 +1291 18.7 -0.4 h 2.5 +1292 21.7 12.9 h 3.5 +1293 -10.3 15.1 h 0.4 +1294 13.9 8.5 h 18.2 +1295 28.3 5.6 h 7.2 +1296 -18.4 -18.2 h 0.7 +1297 -28.5 8.2 h 99.1 +1298 16.0 8.4 h 21.4 +1299 14.6 13.0 h 25.4 +1300 22.6 4.9 h 1.4 +1301 13.8 2.5 h 22.3 +1302 7.1 11.0 h 5.5 +1303 72.3 -14.2 h 26.6 +1304 14.7 7.5 h 19.1 +1305 35.2 16.3 h 0.1 +1306 -21.8 -6.1 h 0.7 +1307 35.2 25.1 h 3.9 +1308 -55.3 -27.3 h 0.6 +1309 -16.1 11.8 h 0.7 +1310 -33.5 -31.2 h 0.2 +1311 -30.2 -11.8 h 0.8 +1312 39.4 2.7 h 1.5 +1313 21.3 -2.0 h 12.8 +1314 9.7 -41.3 h 3.1 +1315 24.0 6.8 h 15.9 +1316 -34.8 -5.7 h 3.1 +1317 -47.4 1.3 h 11.4 +1318 36.5 12.0 h 2.4 +1319 25.4 17.2 h 7.3 +1320 27.8 20.3 h 36.1 +1321 27.4 1.4 h 0.6 +1322 45.3 17.2 h 198.3 +1323 51.8 19.7 h 99.3 +1324 -6.5 10.5 h 2.5 +1325 18.0 -34.0 h 0.6 +1326 -10.1 20.6 h 2.7 +1327 -6.2 28.8 h 13.3 +1328 11.5 5.2 h 48.4 +1329 28.1 -6.0 h 26.2 +1330 4.4 -9.2 h 2.8 +1331 -35.1 -2.9 h 2.6 +1332 -183.5 -17.6 h 0.1 +1333 27.9 23.3 h 0.9 +1334 -42.6 -2.0 h 3.1 +1335 25.2 5.4 h 7.5 +1336 27.1 10.2 h 5.8 +1337 -19.7 -9.0 h 4.8 +1338 20.3 14.7 h 48.9 +1339 -20.6 -7.4 h 0.0 +1340 23.2 21.9 h 3.1 +1341 -4.8 7.0 h 9.4 +1342 24.4 9.1 h 3.1 +1343 30.5 19.2 h 0.2 +1344 -14.1 12.3 h 5.6 +1345 -36.3 -14.7 h 1.6 +1346 71.0 42.7 h 1.5 +1347 48.1 33.1 h 85.5 +1348 -50.9 -0.9 h 1.9 +1349 4.5 33.2 h 0.1 +1350 -13.6 10.3 h 6.1 +1351 18.0 8.0 h 1.7 +1352 -5.5 5.0 h 9.9 +1353 -6.2 -4.5 h 27.6 +1354 15.1 9.7 h 9.0 +1355 -29.9 -8.8 h 0.2 +1356 -6.6 18.0 h 2.3 +1357 7.0 58.7 h 0.3 +1358 3.0 -6.0 h 9.1 +1359 21.0 22.5 h 111.8 +1360 5.4 17.6 h 6.5 +1361 -41.9 -11.7 h 4.6 +1362 5.4 15.0 h 12.4 +1363 16.6 15.2 h 1.8 +1364 -4.3 -10.9 h 25.1 +1365 -15.8 10.2 h 27.9 +1366 -29.5 -25.8 h 2.5 +1367 -9.7 1.2 h 13.2 +1368 11.6 10.9 h 26.7 +1369 -1.5 24.2 h 16.9 +1370 16.9 9.5 h 12.2 +1371 1.8 3.7 h 1.4 +1372 -33.4 -17.0 h 12.4 +1373 11.4 5.1 h 0.7 +1374 22.4 -25.2 h 1.9 +1375 29.7 22.5 h 2.6 +1376 21.2 54.8 h 2.3 +1377 -39.6 -18.0 h 1.5 +1378 92.2 -20.1 h 63.1 +1379 29.0 -3.4 h 5.3 +1380 -32.3 6.4 h 14.5 +1381 18.3 47.0 h 0.5 +1382 -42.5 -21.5 h 0.5 +1383 -178.1 -77.0 h 0.5 +1384 21.8 13.8 h 6.1 +1385 20.7 17.5 h 2.7 +1386 -39.5 -5.6 h 2.4 +1387 22.7 19.3 h 1.3 +1388 -35.5 4.5 h 9.5 +1389 24.6 -4.0 h 19.4 +1390 28.1 16.7 h 0.4 +1391 3.2 -2.7 h 10.8 +1392 9.1 6.1 h 3.2 +1393 27.5 17.8 h 11.2 +1394 23.1 15.7 h 5.1 +1395 13.8 22.2 h 7.3 +1396 9.4 22.3 h 4.5 +1397 69.6 29.1 h 0.7 +1398 37.6 -42.7 h 1.0 +1399 24.2 15.8 h 6.5 +1400 31.4 -6.5 h 7.3 +1401 -58.6 -18.8 h 0.5 +1402 15.8 44.9 h 22.6 +1403 28.6 -80.0 h 85.1 +1404 12.8 -1.8 h 2.2 +1405 -51.6 10.1 h 5.0 +1406 4.0 12.3 h 17.6 +1407 -7.2 20.4 h 0.9 +1408 12.4 13.5 h 3.1 +1409 28.7 11.2 h 0.2 +1410 25.3 21.5 h 4.5 +1411 22.7 16.7 h 0.0 +1412 -14.1 -7.9 h 9.8 +1413 7.6 21.5 h 12.3 +1414 -40.7 3.9 h 7.1 +1415 22.7 5.3 h 6.3 +1416 17.7 -0.9 h 25.2 +1417 34.6 21.8 h 37.0 +1418 4.8 -15.4 h 1.9 +1419 24.7 9.0 h 1.7 +1420 37.1 28.9 h 3.9 +1421 -14.8 -36.0 h 0.3 +1422 1.7 -16.3 h 2.2 +1423 17.0 9.2 h 17.1 +1424 -38.7 14.2 h 11.7 +1425 -36.4 12.2 h 17.7 +1426 -14.9 1.8 h 27.2 +1427 -25.8 5.1 h 188.2 +1428 13.4 8.9 h 20.0 +1429 25.2 15.0 h 8.0 +1430 -1.5 0.5 h 4.2 +1431 -13.3 7.2 h 0.3 +1432 15.8 16.1 h 17.7 +1433 25.7 6.0 h 0.9 +1434 -38.9 -2.8 h 5.6 +1435 26.9 -1.2 h 0.2 +1436 -19.7 -28.5 h 23.8 +1437 2.1 5.6 h 23.7 +1438 29.3 6.2 h 13.0 +1439 23.9 19.4 h 2.5 +1440 -12.3 8.1 h 9.4 +1441 8.6 -2.8 h 16.7 +1442 -46.4 -2.3 h 3.0 +1443 13.6 -8.1 h 14.0 +1444 3.6 8.6 h 26.1 +1445 15.4 15.6 h 12.4 +1446 13.8 45.9 h 2.0 +1447 -34.1 -26.8 h 0.9 +1448 -33.1 -16.1 h 9.4 +1449 26.8 10.2 h 5.7 +1450 56.9 40.4 h 25.6 +1451 1.0 6.1 h 9.9 +1452 -3.9 42.7 h 1.0 +1453 9.1 3.1 h 25.6 +1454 38.0 17.0 h 64.0 +1455 13.9 -19.8 h 4.4 +1456 -31.8 33.5 h 0.2 +1457 68.0 31.2 h 40.5 +1458 19.3 6.8 h 0.5 +1459 25.3 5.7 h 11.3 +1460 27.5 7.8 h 1.1 +1461 21.5 20.5 h 1.3 +1462 46.9 28.2 h 2.5 +1463 35.2 11.3 h 5.3 +1464 20.2 8.3 h 5.6 +1465 -34.6 -23.3 h 156.9 +1466 -28.7 -22.5 h 2.4 +1467 -27.0 -5.6 h 1.2 +1468 43.0 -11.2 h 3.2 +1469 -39.0 -18.0 h 0.9 +1470 19.0 -23.4 h 3.0 +1471 -34.5 -25.7 h 1.6 +1472 -23.8 2.9 h 8.8 +1473 -50.5 -16.8 h 0.5 +1474 -51.4 -25.0 h 1.6 +1475 28.4 -14.9 h 1.3 +1476 -21.9 -1.6 h 0.1 +1477 28.3 35.6 h 2.6 +1478 20.3 18.4 h 1.1 +1479 18.4 20.6 h 0.5 +1480 -3.8 -38.8 h 13.9 +1481 -41.9 -13.5 h 1.2 +1482 1.0 -9.2 h 13.0 +1483 3.9 9.2 h 5.0 +1484 -40.3 3.6 h 198.6 +1485 -7.9 24.8 h 0.7 +1486 99.5 65.8 h 0.6 +1487 -171.9 -49.3 h 43.5 +1488 -33.9 -37.9 h 21.0 +1489 -40.2 -34.2 h 0.6 +1490 25.0 7.3 h 36.5 +1491 26.7 -5.3 h 1.9 +1492 16.9 14.1 h 9.6 +1493 14.5 21.6 h 19.5 +1494 -40.6 -9.1 h 3.6 +1495 31.0 4.9 h 17.2 +1496 13.1 121.2 h 137.7 +1497 -42.6 -23.6 h 0.2 +1498 13.0 15.8 h 24.0 +1499 -8.1 29.1 h 2.7 +1500 -14.0 -29.4 h 1.3 +1501 -22.8 -6.9 h 9.5 +1502 19.2 11.5 h 4.4 +1503 32.8 12.7 h 1.4 +1504 -46.9 10.2 h 1.3 +1505 -6.3 -4.8 h 1.4 +1506 21.0 18.3 h 0.4 +1507 20.2 26.4 h 1.2 +1508 -149.5 -48.1 h 0.8 +1509 -25.4 -3.7 h 15.2 +1510 25.0 16.1 h 4.8 +1511 -10.3 5.6 h 15.7 +1512 -36.5 -16.2 h 6.0 +1513 9.3 12.0 h 16.3 +1514 8.4 -2.7 h 26.4 +1515 26.7 47.7 h 80.4 +1516 8.6 22.6 h 34.2 +1517 9.6 -13.4 h 1.1 +1518 29.7 26.5 h 27.5 +1519 -10.3 -31.2 h 0.6 +1520 -17.9 10.4 h 8.4 +1521 11.5 13.2 h 67.8 +1522 1.2 5.4 h 18.6 +1523 4.8 2.4 h 9.2 +1524 10.8 -10.9 h 8.5 +1525 -53.1 6.2 h 3.5 +1526 -8.2 15.0 h 22.1 +1527 13.6 29.8 h 0.1 +1528 2.9 -5.0 h 39.6 +1529 43.9 16.2 h 2.2 +1530 -36.3 -20.1 h 17.4 +1531 19.1 5.1 h 4.6 +1532 120.9 -143.0 h 106.0 +1533 -22.4 12.7 h 1.1 +1534 -57.4 -142.0 h 1.6 +1535 -19.9 -24.6 h 20.0 +1536 11.0 19.1 h 216.3 +1537 -38.5 -20.4 h 0.4 +1538 -28.6 -2.8 h 29.2 +1539 153.8 14.4 h 1.4 +1540 8.2 32.9 h 16.9 +1541 55.9 -38.2 h 4.1 +1542 27.9 11.7 h 4.9 +1543 7.2 14.5 h 32.0 +1544 9.4 23.6 h 0.9 +1545 25.9 8.0 h 5.8 +1546 27.5 21.9 h 1.9 +1547 9.3 7.4 h 37.2 +1548 512.9 90.2 h 0.9 +1549 9.5 8.4 h 11.2 +1550 4.0 0.1 h 8.0 +1551 -45.2 -11.6 h 0.8 +1552 40.0 -8.5 h 0.6 +1553 93.0 67.6 h 72.9 +1554 4.9 17.0 h 7.0 +1555 -1.2 9.6 h 5.7 +1556 -17.6 -18.2 h 3.0 +1557 -24.3 -25.8 h 42.3 +1558 -38.2 -7.0 h 18.6 +1559 -2.1 5.7 h 12.0 +1560 101.4 103.4 h 1.0 +1561 27.8 12.4 h 1.0 +1562 4.8 8.0 h 9.0 +1563 -6.0 81.6 h 63.2 +1564 33.1 -6.2 h 4.4 +1565 -38.9 -7.2 h 0.7 +1566 -29.0 -7.9 h 10.2 +1567 13.1 20.3 h 1.1 +1568 -17.9 -27.7 h 0.5 +1569 19.1 26.5 h 5.2 +1570 45.5 46.9 h 45.9 +1571 -5.2 17.8 h 16.4 +1572 0.8 13.4 h 67.2 +1573 20.4 10.0 h 0.0 +1574 26.8 15.6 h 0.9 +1575 29.2 25.9 h 0.9 +1576 -11.5 -10.7 h 0.4 +1577 -23.2 -35.5 h 3.5 +1578 -40.5 -15.3 h 0.7 +1579 22.8 -12.7 h 21.4 +1580 38.3 -5.3 h 1.5 +1581 23.8 16.7 h 10.7 +1582 -31.3 0.5 h 5.7 +1583 32.3 10.6 h 0.6 +1584 -22.2 3.8 h 67.9 +1585 50.5 8.6 h 4.8 +1586 -112.7 -32.1 h 103.8 +1587 34.6 -4.0 h 3.9 +1588 -79.2 -11.4 h 0.8 +1589 6.6 -8.6 h 15.4 +1590 21.6 1.8 h 6.0 +1591 -36.1 -9.9 h 3.2 +1592 11.2 2.6 h 24.0 +1593 -51.7 -5.1 h 1.0 +1594 15.5 21.4 h 4.5 +1595 4.5 1.1 h 0.8 +1596 18.9 34.6 h 3.0 +1597 -14.2 -5.9 h 8.1 +1598 16.0 10.8 h 5.6 +1599 24.8 22.6 h 26.3 +1600 6.7 -11.4 h 0.7 +1601 5.5 3.5 h 7.4 +1602 -16.0 9.8 h 16.9 +1603 -4.3 12.8 h 54.3 +1604 21.7 -7.6 h 0.7 +1605 0.3 3.5 h 1.5 +1606 30.4 9.9 h 4.7 +1607 -1.7 15.9 h 6.8 +1608 -51.7 17.7 h 14.5 +1609 65.4 26.6 h 0.3 +1610 20.1 10.8 h 13.3 +1611 102.9 -7.5 h 0.5 +1612 43.1 3.9 h 0.7 +1613 -44.3 13.6 h 1.0 +1614 -35.5 -22.0 h 0.1 +1615 25.4 53.6 h 0.3 +1616 32.5 -23.0 h 0.2 +1617 22.7 24.8 h 2.8 +1618 -41.9 -2.1 h 0.4 +1619 -0.1 19.7 h 8.5 +1620 -25.1 34.7 h 3.9 +1621 16.8 10.8 h 0.3 +1622 14.8 6.7 h 31.8 +1623 -26.7 -1.1 h 0.4 +1624 13.0 6.8 h 26.8 +1625 18.9 3.8 h 17.2 +1626 2.8 -19.5 h 5.4 +1627 32.6 12.8 h 4.7 +1628 -40.4 -4.5 h 0.6 +1629 -15.0 0.5 h 25.6 +1630 116.3 14.7 h 37.1 +1631 50.1 -7.6 h 9.0 +1632 -28.0 -29.7 h 0.6 +1633 102.9 7.2 h 6.9 +1634 -20.8 -15.3 h 5.9 +1635 21.2 14.6 h 18.0 +1636 33.1 4.5 h 5.6 +1637 -110.2 -72.1 h 85.2 +1638 94.0 33.6 h 41.9 +1639 11.2 1.1 h 25.3 +1640 -35.0 31.5 h 0.5 +1641 4.2 -17.1 h 0.1 +1642 -4.1 22.8 h 0.4 +1643 17.5 36.6 h 0.3 +1644 -45.6 -7.4 h 0.9 +1645 25.7 8.7 h 1.0 +1646 -8.0 -11.1 h 0.7 +1647 14.3 14.8 h 15.4 +1648 6.9 8.6 h 16.6 +1649 -64.0 -53.1 h 0.7 +1650 9.5 6.1 h 25.1 +1651 -44.9 11.2 h 1.3 +1652 -12.2 -15.5 h 1.1 +1653 22.6 1.6 h 16.2 +1654 -37.3 -21.2 h 1.3 +1655 30.7 7.6 h 0.2 +1656 -21.2 -8.2 h 22.3 +1657 24.6 21.2 h 2.8 +1658 -2.9 -37.3 h 4.8 +1659 19.8 12.8 h 2.9 +1660 18.7 -9.6 h 1.9 +1661 15.9 8.5 h 11.2 +1662 5.3 -4.3 h 13.3 +1663 -45.6 19.7 h 5.1 +1664 0.4 9.7 h 8.2 +1665 50.2 38.4 h 0.6 +1666 -3.0 0.7 h 6.8 +1667 57.1 57.1 h 47.5 +1668 -27.9 -64.0 h 1.0 +1669 9.3 6.3 h 52.0 +1670 22.2 -25.3 h 0.9 +1671 4.2 10.1 h 47.6 +1672 21.4 7.2 h 2.1 +1673 14.8 15.8 h 37.9 +1674 10.0 -0.2 h 13.0 +1675 15.1 2.0 h 27.1 +1676 -13.7 -34.2 h 159.9 +1677 -13.2 -8.4 h 14.7 +1678 -149.3 56.1 h 85.9 +1679 12.9 30.6 h 1.3 +1680 24.3 12.9 h 0.6 +1681 -14.5 3.8 h 0.8 +1682 -2.4 -30.4 h 15.3 +1683 18.0 25.5 h 9.5 +1684 -25.4 -21.1 h 14.0 +1685 26.6 10.1 h 0.8 +1686 -6.6 -15.7 h 26.0 +1687 2.3 -18.5 h 51.3 +1688 6.7 22.7 h 0.2 +1689 -32.8 -12.5 h 0.9 +1690 14.1 11.1 h 29.3 +1691 21.9 16.1 h 7.8 +1692 22.6 12.1 h 5.0 +1693 28.2 -11.1 h 25.1 +1694 -0.4 3.0 h 15.8 +1695 -44.6 -7.1 h 1.4 +1696 24.4 29.0 h 12.8 +1697 28.4 -14.9 h 17.7 +1698 22.5 22.2 h 7.9 +1699 23.3 15.5 h 1.5 +1700 4.8 10.6 h 7.0 +1701 -10.8 -1.7 h 5.7 +1702 35.7 5.6 h 4.2 +1703 -25.0 -5.2 h 46.9 +1704 -28.3 -28.5 h 11.6 +1705 18.2 4.2 h 17.9 +1706 -29.1 -14.4 h 1.5 +1707 -24.2 1.5 h 12.6 +1708 12.6 11.1 h 27.6 +1709 24.2 -105.6 h 3.0 +1710 31.1 29.1 h 1.0 +1711 22.5 3.0 h 0.1 +1712 15.2 10.2 h 25.6 +1713 -187.8 -159.6 h 5.7 +1714 31.1 10.2 h 1.2 +1715 26.6 10.0 h 0.5 +1716 89.5 27.4 h 2.3 +1717 -3.6 25.6 h 12.4 +1718 28.9 -5.8 h 0.9 +1719 34.3 10.2 h 7.4 +1720 13.2 -4.7 h 0.2 +1721 -12.8 7.1 h 1.4 +1722 52.6 68.6 h 103.4 +1723 -39.8 -32.8 h 12.5 +1724 26.3 11.2 h 0.7 +1725 -62.2 -39.3 h 206.1 +1726 5.0 12.4 h 25.5 +1727 24.7 -73.6 h 0.8 +1728 -5.6 -29.1 h 5.1 +1729 -21.1 -20.3 h 6.5 +1730 -6.5 -10.3 h 5.0 +1731 -4.5 7.0 h 9.6 +1732 -14.0 -21.3 h 9.4 +1733 -12.4 23.6 h 1.0 +1734 9.8 0.2 h 22.8 +1735 16.0 13.0 h 7.4 +1736 33.4 -5.5 h 1.5 +1737 13.9 13.7 h 24.0 +1738 -40.2 -9.2 h 2.3 +1739 -39.8 8.0 h 33.8 +1740 14.3 7.5 h 8.1 +1741 19.0 5.3 h 10.3 +1742 -4.6 0.2 h 14.9 +1743 16.1 18.7 h 10.0 +1744 25.5 11.0 h 6.6 +1745 2.1 -3.9 h 14.3 +1746 26.8 17.4 h 4.5 +1747 18.6 28.7 h 25.0 +1748 26.0 23.6 h 0.5 +1749 2.1 37.1 h 0.2 +1750 0.4 -3.1 h 0.4 +1751 18.9 -1.8 h 5.1 +1752 33.3 13.9 h 3.4 +1753 12.9 7.1 h 49.2 +1754 114.2 28.6 h 0.8 +1755 65.0 52.7 h 89.4 +1756 -28.7 -10.4 h 13.9 +1757 31.7 18.2 h 0.2 +1758 30.2 9.2 h 2.4 +1759 17.7 21.0 h 10.8 +1760 4.0 -7.3 h 1.6 +1761 5.0 20.6 h 0.5 +1762 -4.7 -71.8 h 92.0 +1763 -34.9 -18.3 h 2.3 +1764 9.9 14.5 h 20.3 +1765 4.2 -1.7 h 5.2 +1766 22.2 -1.3 h 0.8 +1767 17.1 9.6 h 6.8 +1768 35.8 -13.2 h 0.4 +1769 24.0 2.8 h 1.3 +1770 15.8 13.8 h 26.1 +1771 20.0 8.0 h 19.5 +1772 45.0 -0.3 h 113.1 +1773 7.7 1.0 h 12.8 +1774 21.9 13.4 h 5.9 +1775 -36.0 -19.5 h 4.6 +1776 26.6 12.6 h 0.5 +1777 15.0 33.3 h 13.1 +1778 15.5 -7.7 h 7.6 +1779 2.9 7.6 h 0.7 +1780 -10.9 3.0 h 8.3 +1781 41.2 27.4 h 27.0 +1782 -58.5 -2.0 h 0.6 +1783 101.2 -12.8 h 113.9 +1784 14.9 7.8 h 21.5 +1785 11.6 12.2 h 16.7 +1786 -12.7 -5.1 h 1.0 +1787 15.0 9.7 h 8.3 +1788 -2.2 19.5 h 11.2 +1789 15.2 -3.8 h 4.1 +1790 1.6 -3.1 h 1.3 +1791 30.6 7.5 h 5.8 +1792 16.1 18.4 h 9.8 +1793 -22.7 4.1 h 3.2 +1794 21.3 14.8 h 1.7 +1795 13.4 8.4 h 12.1 +1796 21.6 63.6 h 0.5 +1797 -13.2 12.4 h 26.5 +1798 -32.4 2.2 h 34.2 +1799 2.5 1.6 h 12.4 +1800 -9.5 19.7 h 0.7 +1801 -3.0 30.9 h 6.2 +1802 -20.7 -10.7 h 25.6 +1803 9.6 4.9 h 20.7 +1804 0.8 4.7 h 20.0 +1805 -0.8 10.9 h 6.9 +1806 24.9 32.6 h 2.0 +1807 7.0 20.0 h 22.1 +1808 1.5 18.4 h 4.3 +1809 -40.6 -11.6 h 0.5 +1810 -16.2 -20.2 h 4.4 +1811 -48.5 12.9 h 16.0 +1812 25.3 12.1 h 7.8 +1813 -38.1 -16.7 h 9.9 +1814 -12.7 -5.7 h 0.3 +1815 16.2 12.6 h 21.2 +1816 1.5 -2.1 h 17.9 +1817 9.5 19.3 h 15.3 +1818 -150.5 -287.8 h 2.9 +1819 -21.3 -1.6 h 21.9 +1820 4.9 -8.6 h 0.9 +1821 -48.9 -19.6 h 4.6 +1822 21.5 14.1 h 6.5 +1823 16.6 9.8 h 0.8 +1824 -9.5 16.5 h 2.2 +1825 -16.6 -39.2 h 6.3 +1826 -9.7 6.9 h 11.4 +1827 19.4 12.5 h 7.8 +1828 -45.0 4.0 h 14.6 +1829 33.2 -22.3 h 0.8 +1830 -0.4 1.3 h 8.6 +1831 15.9 41.2 h 0.5 +1832 12.1 7.8 h 26.9 +1833 -3.3 11.2 h 0.6 +1834 10.7 20.8 h 5.9 +1835 45.6 17.1 h 0.2 +1836 54.1 -4.6 h 2.3 +1837 24.4 8.2 h 3.8 +1838 -32.6 -12.7 h 5.2 +1839 31.7 8.9 h 5.5 +1840 -43.0 0.8 h 10.0 +1841 38.0 -1.8 h 6.6 +1842 -3.6 12.8 h 0.7 +1843 140.1 154.0 h 1.0 +1844 33.0 9.5 h 15.1 +1845 14.5 11.8 h 18.8 +1846 -0.7 2.1 h 1.5 +1847 17.6 9.2 h 17.6 +1848 -6.4 15.8 h 1.9 +1849 8.3 13.0 h 9.1 +1850 31.9 26.1 h 2.5 +1851 8.8 15.4 h 10.3 +1852 24.0 20.6 h 0.5 +1853 -0.1 -0.8 h 0.3 +1854 -8.5 -3.1 h 0.9 +1855 14.9 9.2 h 15.6 +1856 27.4 11.8 h 1.1 +1857 27.0 3.7 h 0.3 +1858 5.9 9.4 h 7.0 +1859 4.5 5.4 h 19.5 +1860 -1.9 4.4 h 8.2 +1861 21.6 5.2 h 4.0 +1862 6.6 21.3 h 8.6 +1863 5.1 -7.8 h 1.2 +1864 -5.5 9.9 h 13.0 +1865 23.9 15.5 h 9.7 +1866 -6.7 21.6 h 0.6 +1867 18.2 7.5 h 19.7 +1868 -35.6 -26.6 h 2.4 +1869 16.6 -0.5 h 23.4 +1870 27.9 1.4 h 9.1 +1871 32.0 16.9 h 5.8 +1872 -20.4 15.2 h 5.9 +1873 -6.7 -16.6 h 3.2 +1874 -34.5 -9.9 h 0.6 +1875 -33.5 -17.5 h 0.8 +1876 22.9 12.1 h 0.0 +1877 9.7 12.2 h 1.3 +1878 35.4 7.5 h 1.3 +1879 22.6 9.5 h 10.7 +1880 32.8 12.2 h 4.0 +1881 43.5 11.4 h 0.7 +1882 26.0 17.3 h 2.1 +1883 34.5 8.3 h 0.2 +1884 22.7 24.2 h 2.9 +1885 24.5 17.6 h 0.9 +1886 70.1 57.7 h 11.9 +1887 6.9 10.9 h 22.4 +1888 -13.3 -12.9 h 11.9 +1889 0.1 12.2 h 2.6 +1890 26.2 11.0 h 0.9 +1891 16.2 -12.9 h 1.0 +1892 26.1 13.3 h 21.2 +1893 26.0 13.7 h 0.7 +1894 30.3 11.1 h 9.3 +1895 -16.9 1.6 h 0.8 +1896 20.8 14.4 h 22.4 +1897 24.4 17.5 h 8.0 +1898 23.0 25.9 h 3.6 +1899 -44.2 -16.2 h 13.3 +1900 -47.2 -0.9 h 1.5 +1901 -37.9 12.0 h 4.3 +1902 -3.6 19.3 h 3.2 +1903 23.3 4.9 h 16.4 +1904 5.1 17.2 h 0.3 +1905 4.3 5.3 h 0.8 +1906 2.6 -13.3 h 8.4 +1907 -5.3 13.0 h 11.2 +1908 -41.4 -8.2 h 0.1 +1909 2.8 42.0 h 14.9 +1910 55.0 22.0 h 52.4 +1911 -17.9 -5.9 h 1.0 +1912 3.4 -16.3 h 16.5 +1913 16.7 11.8 h 4.5 +1914 10.6 25.9 h 37.0 +1915 24.9 23.4 h 0.0 +1916 10.5 14.0 h 6.5 +1917 -36.7 -0.9 h 15.8 +1918 11.4 -3.6 h 15.1 +1919 -0.5 -3.7 h 13.3 +1920 11.6 7.5 h 29.0 +1921 -28.0 32.8 h 28.3 +1922 -187.1 -61.8 h 0.1 +1923 30.3 4.5 h 0.0 +1924 -13.7 10.3 h 14.4 +1925 -4.5 -7.6 h 0.6 +1926 5.7 4.4 h 33.9 +1927 27.3 11.3 h 9.8 +1928 -1.8 6.3 h 7.2 +1929 -43.8 19.1 h 7.7 +1930 23.8 17.2 h 0.8 +1931 10.6 1.5 h 28.4 +1932 -8.2 1.8 h 0.5 +1933 -42.2 8.0 h 0.2 +1934 -14.5 -2.2 h 0.6 +1935 -35.7 -22.5 h 4.9 +1936 -8.9 50.1 h 0.8 +1937 0.5 10.3 h 11.7 +1938 7.2 12.2 h 4.8 +1939 -38.2 -3.8 h 2.1 +1940 -34.1 -21.9 h 2.6 +1941 31.0 -9.5 h 16.5 +1942 -46.3 120.8 h 4.0 +1943 17.1 11.4 h 2.1 +1944 22.1 26.6 h 0.2 +1945 -22.4 -21.5 h 4.7 +1946 129.3 -38.0 h 53.0 +1947 -19.5 -12.7 h 1.6 +1948 115.9 88.9 h 7.6 +1949 22.9 12.4 h 7.2 +1950 5.9 -41.7 h 0.1 +1951 12.1 -5.0 h 5.6 +1952 19.7 11.3 h 6.0 +1953 -15.4 16.0 h 17.4 +1954 14.3 2.9 h 15.4 +1955 13.7 20.3 h 13.6 +1956 -13.2 -7.8 h 27.9 +1957 -24.3 -24.0 h 1.4 +1958 26.9 -2.8 h 1.7 +1959 6.7 21.3 h 5.5 +1960 26.8 4.1 h 0.2 +1961 -11.8 -6.7 h 3.4 +1962 -37.0 6.3 h 19.0 +1963 25.7 14.2 h 105.2 +1964 33.6 10.2 h 2.0 +1965 9.8 21.7 h 11.3 +1966 27.9 6.0 h 10.4 +1967 11.9 19.8 h 23.5 +1968 17.1 -4.2 h 3.1 +1969 26.2 22.9 h 2.5 +1970 25.0 6.6 h 1.2 +1971 9.4 -6.7 h 3.0 +1972 -0.2 -3.5 h 7.6 +1973 26.0 19.7 h 10.5 +1974 5.9 -17.0 h 1.0 +1975 39.9 8.2 h 6.9 +1976 -35.4 24.9 h 0.8 +1977 -32.6 -16.4 h 0.6 +1978 9.3 63.8 h 44.6 +1979 -41.1 -6.0 h 2.4 +1980 -26.8 -10.7 h 17.3 +1981 11.3 -13.2 h 0.0 +1982 9.9 -1.2 h 0.3 +1983 -35.3 -1.8 h 0.4 +1984 -27.2 -22.5 h 15.8 +1985 42.9 46.0 h 76.8 +1986 27.8 12.4 h 3.4 +1987 6.5 24.9 h 22.2 +1988 -28.3 -26.1 h 12.1 +1989 12.1 20.5 h 17.8 +1990 -19.9 2.5 h 12.3 +1991 -40.7 -8.8 h 9.5 +1992 -28.6 -12.2 h 29.1 +1993 3.2 -1.2 h 5.1 +1994 -27.5 -13.6 h 3.7 +1995 3.3 4.8 h 3.3 +1996 20.7 13.4 h 7.7 +1997 -68.1 65.5 h 109.7 +1998 38.1 13.9 h 4.3 +1999 -36.0 -15.3 h 9.7 +2000 -33.5 -10.8 h 6.6 +2001 9.9 3.5 h 8.2 +2002 -2.0 10.3 h 4.7 +2003 25.3 10.5 h 5.2 +2004 2.2 24.5 h 1.6 +2005 48.9 40.2 h 55.0 +2006 -39.4 -14.7 h 3.9 +2007 14.1 4.1 h 15.2 +2008 36.4 15.9 h 13.1 +2009 -20.6 24.2 h 22.5 +2010 86.6 61.2 h 0.2 +2011 21.4 14.1 h 5.1 +2012 -42.0 -11.2 h 6.0 +2013 24.5 14.8 h 15.0 +2014 -39.2 -22.5 h 0.7 +2015 63.2 30.9 h 4.3 +2016 4.3 -4.5 h 13.6 +2017 -9.5 -14.0 h 4.9 +2018 -49.6 -26.2 h 0.4 +2019 26.2 3.8 h 6.6 +2020 -9.6 -14.8 h 1.0 +2021 14.1 64.2 h 0.9 +2022 -10.4 15.0 h 19.2 +2023 5.4 6.2 h 17.8 +2024 12.0 15.1 h 0.1 +2025 10.8 -1.3 h 2.6 +2026 -32.1 -5.7 h 9.3 +2027 30.2 12.0 h 0.8 +2028 -24.9 80.1 h 0.3 +2029 84.6 12.1 h 0.1 +2030 11.4 32.3 h 0.6 +2031 -0.1 -1.2 h 0.9 +2032 -11.5 6.0 h 6.8 +2033 12.4 10.6 h 1.6 +2034 -39.9 7.0 h 13.3 +2035 -12.7 -4.1 h 0.3 +2036 -52.9 -25.1 h 0.8 +2037 -41.4 -4.2 h 15.3 +2038 34.2 7.4 h 0.3 +2039 9.4 13.4 h 12.2 +2040 26.4 9.7 h 11.4 +2041 23.8 31.1 h 2.1 +2042 26.2 6.9 h 1.9 +2043 36.2 -18.9 h 0.5 +2044 15.5 14.5 h 1.9 +2045 13.4 -57.6 h 0.4 +2046 23.1 -6.1 h 5.2 +2047 -30.5 -0.0 h 0.3 +2048 26.6 13.1 h 1.6 +2049 30.2 9.6 h 4.8 +2050 8.8 23.0 h 11.9 +2051 13.4 23.5 h 31.7 +2052 8.5 -16.8 h 19.9 +2053 26.9 14.7 h 2.6 +2054 9.3 -15.8 h 2.9 +2055 9.8 4.4 h 22.4 +2056 1.0 12.4 h 9.8 +2057 4.6 13.6 h 6.4 +2058 22.3 17.9 h 5.1 +2059 15.1 16.7 h 10.6 +2060 73.7 130.2 h 0.9 +2061 -18.8 -0.6 h 37.6 +2062 -211.8 -33.1 h 13.2 +2063 15.0 22.1 h 14.9 +2064 8.3 4.5 h 22.1 +2065 -16.2 -19.1 h 0.3 +2066 21.9 5.6 h 3.9 +2067 -25.1 -53.8 h 23.3 +2068 33.3 37.9 h 1.0 +2069 22.2 8.9 h 18.4 +2070 -4.7 11.3 h 1.1 +2071 -3.3 2.9 h 15.1 +2072 11.7 9.7 h 10.9 +2073 34.0 13.1 h 1.6 +2074 -28.8 -13.6 h 3.7 +2075 24.0 18.3 h 7.1 +2076 -16.1 -335.1 h 78.9 +2077 -38.3 -18.6 h 8.0 +2078 2.8 -14.8 h 17.7 +2079 78.0 50.1 h 40.3 +2080 -54.8 -45.1 h 5.8 +2081 20.7 18.4 h 0.3 +2082 11.9 41.3 h 0.2 +2083 -46.6 -4.0 h 0.1 +2084 -15.6 7.2 h 37.7 +2085 21.2 -7.1 h 3.3 +2086 18.7 -9.2 h 5.5 +2087 25.5 11.4 h 9.6 +2088 -2.5 12.8 h 38.2 +2089 -42.0 -1.4 h 0.6 +2090 25.3 45.6 h 0.3 +2091 -42.7 1.8 h 5.3 +2092 -70.9 -1.4 h 0.2 +2093 36.0 7.4 h 0.5 +2094 -4.7 2.0 h 28.2 +2095 4.0 4.4 h 4.4 +2096 24.7 30.8 h 0.8 +2097 5.0 -3.8 h 2.6 +2098 -34.8 -6.2 h 1.9 +2099 -12.1 -2.9 h 19.2 +2100 36.6 19.9 h 2.1 +2101 -44.0 -17.2 h 0.2 +2102 -18.0 1.0 h 14.1 +2103 26.2 12.4 h 1.1 +2104 -35.7 1.6 h 7.3 +2105 -20.0 -3.2 h 10.8 +2106 5.2 17.7 h 0.7 +2107 -2.4 7.3 h 3.0 +2108 -11.1 7.3 h 7.2 +2109 -4.4 7.4 h 2.7 +2110 28.8 -13.5 h 4.1 +2111 25.4 -0.0 h 0.3 +2112 29.1 37.1 h 10.0 +2113 23.0 3.5 h 19.2 +2114 -36.4 -29.2 h 0.3 +2115 28.7 11.4 h 6.7 +2116 17.0 18.0 h 9.8 +2117 99.4 24.2 h 2.7 +2118 12.5 25.1 h 0.2 +2119 -28.3 -16.7 h 1.4 +2120 5.5 6.7 h 17.4 +2121 -1.4 2.0 h 7.5 +2122 23.3 38.3 h 0.2 +2123 21.9 -1.6 h 15.7 +2124 83.3 63.4 h 43.1 +2125 24.3 -31.0 h 0.5 +2126 -2.6 -7.5 h 14.3 +2127 23.5 11.0 h 6.9 +2128 22.8 7.8 h 14.0 +2129 -43.0 -6.0 h 2.5 +2130 4.1 13.1 h 9.0 +2131 18.1 12.8 h 24.6 +2132 -13.4 -4.1 h 27.2 +2133 12.8 7.4 h 1.6 +2134 16.3 11.3 h 14.3 +2135 24.2 15.3 h 7.3 +2136 23.6 1.4 h 10.5 +2137 17.6 49.7 h 1.8 +2138 12.4 18.7 h 7.4 +2139 13.4 7.9 h 8.2 +2140 31.5 14.4 h 1.4 +2141 17.5 -5.1 h 5.0 +2142 3.6 -45.7 h 2.8 +2143 22.0 23.4 h 8.6 +2144 -91.6 -31.9 h 134.9 +2145 2.6 2.9 h 7.8 +2146 27.0 15.5 h 0.8 +2147 14.5 20.3 h 7.2 +2148 -30.0 17.8 h 9.1 +2149 -4.7 -2.3 h 12.7 +2150 -41.4 -10.4 h 6.3 +2151 -43.2 -35.3 h 173.6 +2152 22.9 9.8 h 16.5 +2153 29.7 14.7 h 10.0 +2154 -114.2 114.5 h 66.9 +2155 50.6 -8.7 h 0.7 +2156 -59.9 -26.2 h 1.6 +2157 32.8 25.0 h 8.1 +2158 16.0 23.4 h 3.1 +2159 -39.1 -2.3 h 8.3 +2160 -4.3 -13.1 h 36.9 +2161 -48.7 -2.4 h 0.4 +2162 31.1 5.8 h 0.9 +2163 36.0 13.8 h 1.3 +2164 -18.5 11.5 h 0.4 +2165 -25.2 -19.4 h 0.7 +2166 0.9 82.7 h 173.3 +2167 14.4 18.2 h 2.6 +2168 -5.5 13.0 h 2.1 +2169 7.2 12.7 h 4.2 +2170 -21.2 -18.0 h 8.4 +2171 26.7 9.1 h 0.8 +2172 14.4 -4.7 h 0.1 +2173 -6.6 3.3 h 0.4 +2174 15.0 11.3 h 17.6 +2175 11.8 5.0 h 0.8 +2176 -33.0 -5.2 h 40.5 +2177 80.3 81.0 h 11.1 +2178 2.9 -37.1 h 0.3 +2179 -3.2 20.8 h 7.1 +2180 -8.2 -4.5 h 0.8 +2181 -29.7 -7.5 h 3.3 +2182 -40.9 6.4 h 1.1 +2183 136.0 -22.9 h 1.4 +2184 83.1 48.6 h 0.6 +2185 17.0 13.9 h 10.6 +2186 -38.9 -32.7 h 0.5 +2187 -4.7 4.9 h 5.7 +2188 -21.9 22.4 h 0.7 +2189 -12.9 -9.2 h 16.9 +2190 16.6 1.9 h 23.5 +2191 6.3 0.9 h 6.1 +2192 -20.6 -7.9 h 0.5 +2193 23.4 17.8 h 6.2 +2194 -49.8 23.9 h 2.5 +2195 15.6 10.4 h 19.4 +2196 -42.3 6.2 h 0.6 +2197 40.4 7.0 h 1.1 +2198 -28.0 -22.8 h 2.2 +2199 33.6 25.7 h 0.7 +2200 32.1 14.6 h 3.1 +2201 27.8 13.4 h 1.0 +2202 18.0 15.2 h 2.2 +2203 53.8 114.7 h 0.4 +2204 21.1 11.7 h 13.0 +2205 -13.2 13.5 h 8.5 +2206 -11.2 12.9 h 10.0 +2207 9.3 23.2 h 3.7 +2208 10.7 -39.0 h 0.4 +2209 -43.5 -1.6 h 0.5 +2210 22.0 10.1 h 9.2 +2211 19.4 18.0 h 3.8 +2212 13.6 4.3 h 1.2 +2213 13.1 16.1 h 8.5 +2214 23.7 17.5 h 5.8 +2215 2.8 -2.2 h 1.1 +2216 9.9 7.8 h 0.8 +2217 102.1 4.1 h 2.9 +2218 -16.2 19.4 h 4.7 +2219 2.5 15.6 h 9.6 +2220 28.3 1.3 h 1.5 +2221 -54.2 -5.7 h 3.5 +2222 -2.3 2.5 h 4.9 +2223 20.9 8.3 h 2.6 +2224 4.9 2.0 h 9.6 +2225 13.8 7.9 h 7.9 +2226 -47.3 -13.2 h 0.4 +2227 70.8 81.3 h 0.2 +2228 17.2 12.5 h 1.0 +2229 22.8 18.1 h 18.4 +2230 -30.6 -13.4 h 12.0 +2231 17.6 21.4 h 57.7 +2232 -0.4 3.3 h 9.4 +2233 35.1 -27.4 h 158.7 +2234 8.5 10.1 h 24.5 +2235 -7.1 9.2 h 2.4 +2236 20.8 9.2 h 7.0 +2237 11.6 3.8 h 31.5 +2238 38.5 3.6 h 261.5 +2239 20.0 15.3 h 10.1 +2240 27.4 18.9 h 4.3 +2241 11.1 13.3 h 16.0 +2242 -33.8 -15.4 h 1.3 +2243 -41.3 -14.4 h 1.9 +2244 -38.4 -13.4 h 0.5 +2245 14.6 -4.7 h 7.5 +2246 17.5 33.6 h 5.9 +2247 5.7 1.5 h 19.6 +2248 -52.9 -2.8 h 0.5 +2249 -8.9 38.2 h 4.1 +2250 -36.2 2.4 h 5.9 +2251 33.3 18.8 h 1.4 +2252 25.2 20.1 h 0.1 +2253 -31.7 -26.4 h 2.8 +2254 11.5 10.0 h 15.0 +2255 25.6 0.4 h 2.6 +2256 -24.4 -13.9 h 0.5 +2257 25.3 15.7 h 0.2 +2258 23.6 6.7 h 2.6 +2259 -6.2 19.2 h 0.3 +2260 -11.0 6.6 h 0.6 +2261 10.9 19.1 h 22.6 +2262 -5.1 6.0 h 21.5 +2263 13.9 22.3 h 23.4 +2264 9.2 -7.8 h 18.0 +2265 -37.5 -49.5 h 0.8 +2266 15.6 3.5 h 24.3 +2267 40.0 22.2 h 0.1 +2268 -25.4 0.2 h 30.5 +2269 29.8 22.9 h 8.0 +2270 -44.8 -16.7 h 0.1 +2271 31.9 16.1 h 2.2 +2272 6.8 3.5 h 14.3 +2273 29.6 17.1 h 0.4 +2274 -2.8 20.0 h 3.8 +2275 4.2 7.2 h 23.5 +2276 -17.2 -6.4 h 17.2 +2277 50.9 37.4 h 0.6 +2278 32.4 -10.7 h 2.0 +2279 47.8 16.3 h 73.8 +2280 -50.3 -18.4 h 1.0 +2281 -51.1 -8.7 h 4.2 +2282 -2.0 -1.5 h 6.1 +2283 4.6 -6.9 h 2.0 +2284 5.0 22.9 h 10.8 +2285 -17.3 -14.6 h 66.2 +2286 23.7 9.8 h 10.5 +2287 19.6 25.6 h 0.9 +2288 26.6 -6.8 h 0.3 +2289 5.8 -3.5 h 2.5 +2290 36.9 5.5 h 1.0 +2291 32.4 9.2 h 16.8 +2292 27.3 4.6 h 1.0 +2293 -36.1 -14.1 h 0.9 +2294 6.9 -1.7 h 16.7 +2295 16.3 6.2 h 13.5 +2296 29.6 7.4 h 2.8 +2297 19.7 17.4 h 0.4 +2298 -49.7 -30.7 h 1.4 +2299 34.8 20.4 h 20.8 +2300 -50.4 20.9 h 0.5 +2301 -51.2 -9.9 h 0.8 +2302 7.0 4.7 h 17.1 +2303 10.8 2.5 h 8.2 +2304 25.1 13.7 h 0.0 +2305 9.5 21.3 h 4.1 +2306 7.9 11.0 h 24.9 +2307 35.6 75.8 h 36.5 +2308 25.9 0.5 h 28.1 +2309 -29.5 -9.2 h 4.4 +2310 205.7 90.4 h 2.0 +2311 -39.3 -4.6 h 0.7 +2312 23.4 13.6 h 4.5 +2313 -48.6 -1.7 h 0.6 +2314 -31.6 -8.2 h 86.3 +2315 -49.0 5.3 h 0.2 +2316 -14.2 -13.4 h 15.3 +2317 26.3 8.7 h 10.7 +2318 -25.1 -28.1 h 15.8 +2319 -5.2 14.8 h 7.6 +2320 41.8 73.2 h 107.5 +2321 -9.9 -2.3 h 0.0 +2322 24.3 13.2 h 0.4 +2323 31.7 19.2 h 1.1 +2324 -12.6 -1.6 h 4.4 +2325 -31.7 -18.5 h 0.3 +2326 -67.8 -35.9 h 149.9 +2327 33.7 -19.2 h 0.3 +2328 17.3 22.4 h 0.3 +2329 6.3 10.2 h 18.9 +2330 -37.7 -41.6 h 156.3 +2331 -41.4 26.3 h 33.3 +2332 -40.9 1.0 h 2.7 +2333 32.0 -21.1 h 1.0 +2334 44.8 30.7 h 103.5 +2335 11.5 0.6 h 20.1 +2336 23.5 -2.9 h 7.9 +2337 18.3 17.5 h 0.3 +2338 25.1 12.2 h 10.4 +2339 -24.5 -13.4 h 39.4 +2340 -34.7 -4.4 h 1.7 +2341 -34.8 -36.1 h 0.7 +2342 45.2 12.6 h 1.1 +2343 -40.9 -13.2 h 11.0 +2344 37.2 29.4 h 1.1 +2345 -39.8 -5.8 h 1.4 +2346 -79.7 196.5 h 105.9 +2347 -2.2 10.7 h 0.3 +2348 32.9 4.9 h 12.8 +2349 34.1 14.3 h 4.5 +2350 4.3 7.2 h 24.8 +2351 -6.8 9.7 h 9.8 +2352 -52.6 -15.7 h 0.7 +2353 38.5 44.1 h 54.2 +2354 -35.7 -11.6 h 55.3 +2355 6.0 4.4 h 7.6 +2356 24.4 19.0 h 0.7 +2357 22.2 13.7 h 3.7 +2358 -1.7 8.1 h 0.3 +2359 -31.9 -10.9 h 5.0 +2360 -22.7 10.3 h 23.9 +2361 -28.2 -9.7 h 0.4 +2362 21.5 21.9 h 8.9 +2363 6.8 -8.6 h 18.3 +2364 22.5 25.3 h 0.8 +2365 16.3 2.2 h 17.0 +2366 10.8 6.2 h 17.6 +2367 0.0 -52.8 h 0.1 +2368 -46.1 -19.3 h 1.9 +2369 42.2 11.2 h 3.5 +2370 17.3 -2.7 h 3.4 +2371 -49.7 -9.9 h 2.0 +2372 26.9 18.9 h 0.9 +2373 11.6 13.7 h 65.0 +2374 33.5 9.5 h 1.9 +2375 0.3 12.9 h 1.9 +2376 20.3 -3.1 h 36.9 +2377 14.2 16.7 h 24.2 +2378 -7.5 -18.4 h 38.5 +2379 7.8 17.4 h 5.2 +2380 76.6 -63.8 h 0.1 +2381 -42.9 0.0 h 1.1 +2382 17.0 -10.8 h 11.0 +2383 -2.1 0.3 h 16.4 +2384 -2.9 -7.8 h 0.7 +2385 -26.8 -23.7 h 3.4 +2386 19.1 0.6 h 6.5 +2387 -13.3 3.3 h 17.4 +2388 21.4 1.7 h 20.1 +2389 -38.1 -21.5 h 0.5 +2390 35.4 -30.1 h 0.9 +2391 28.8 6.0 h 10.4 +2392 -31.1 11.9 h 0.9 +2393 -8.5 3.9 h 1.0 +2394 10.7 -10.6 h 3.4 +2395 -2.3 -106.9 h 2.7 +2396 -33.8 -6.1 h 22.8 +2397 9.2 -14.8 h 3.8 +2398 17.7 18.2 h 4.4 +2399 -12.7 -18.5 h 25.3 +2400 39.1 11.5 h 0.1 +2401 17.3 36.2 h 5.7 +2402 15.4 18.1 h 20.5 +2403 64.3 47.4 h 118.6 +2404 -8.4 -8.5 h 20.5 +2405 6.0 10.4 h 1.9 +2406 14.5 2.6 h 18.4 +2407 -16.1 3.6 h 0.7 +2408 31.5 14.6 h 0.6 +2409 -0.4 51.0 h 1.0 +2410 13.8 -6.0 h 3.3 +2411 -6.4 -1.2 h 48.8 +2412 34.4 14.3 h 0.1 +2413 17.9 2.2 h 34.7 +2414 8.0 8.4 h 21.9 +2415 -34.1 -31.1 h 23.9 +2416 20.9 20.2 h 0.7 +2417 -21.5 6.2 h 7.3 +2418 -4.6 -9.3 h 0.3 +2419 -24.9 2.3 h 0.9 +2420 36.6 21.8 h 71.4 +2421 -43.6 -10.6 h 3.2 +2422 9.1 2.7 h 12.2 +2423 -39.4 -1.8 h 1.7 +2424 1.6 18.7 h 0.4 +2425 -33.8 -37.9 h 7.6 +2426 -42.1 21.4 h 1.1 +2427 15.8 -0.1 h 6.1 +2428 10.5 4.5 h 4.5 +2429 28.1 12.2 h 2.9 +2430 25.7 15.0 h 1.8 +2431 -45.4 -34.0 h 11.1 +2432 8.7 11.3 h 28.9 +2433 2.6 5.0 h 31.1 +2434 -41.0 -21.0 h 0.5 +2435 11.7 8.8 h 1.1 +2436 -9.3 16.7 h 2.0 +2437 4.9 3.0 h 5.5 +2438 -0.7 -13.3 h 0.9 +2439 21.7 9.1 h 3.4 +2440 14.0 20.8 h 13.8 +2441 28.6 16.1 h 4.9 +2442 27.5 21.9 h 2.2 +2443 28.7 9.5 h 2.3 +2444 -5.8 9.9 h 6.3 +2445 -5.0 -1.7 h 47.1 +2446 24.4 -1.0 h 6.7 +2447 4.7 -22.8 h 2.9 +2448 -13.9 -10.2 h 0.4 +2449 10.6 17.0 h 20.4 +2450 -3.3 -1.7 h 16.2 +2451 5.1 18.7 h 9.5 +2452 11.3 12.2 h 17.3 +2453 -12.7 -13.3 h 0.6 +2454 -21.9 3.0 h 13.6 +2455 -43.4 -3.0 h 1.7 +2456 18.0 22.4 h 14.9 +2457 -2.3 23.9 h 11.3 +2458 -52.3 12.5 h 1.4 +2459 6.5 27.3 h 8.3 +2460 2.0 19.6 h 26.4 +2461 12.5 85.7 h 62.8 +2462 -22.0 39.1 h 0.8 +2463 -11.3 -6.2 h 3.1 +2464 -11.5 2.5 h 6.8 +2465 21.6 -3.1 h 0.0 +2466 3.5 14.2 h 15.1 +2467 188.4 210.2 h 442.7 +2468 -41.9 0.9 h 0.4 +2469 26.7 23.4 h 1.2 +2470 21.4 18.4 h 0.2 +2471 30.0 -3.9 h 23.2 +2472 -5.5 -22.0 h 0.3 +2473 22.7 -2.9 h 9.3 +2474 28.2 19.2 h 0.6 +2475 17.8 12.9 h 1.4 +2476 -33.1 -22.9 h 47.6 +2477 10.5 13.6 h 77.4 +2478 27.8 -28.0 h 3.6 +2479 11.7 -6.4 h 10.8 +2480 9.5 18.6 h 21.5 +2481 -26.5 1.2 h 12.7 +2482 3.4 12.4 h 19.3 +2483 -40.8 0.9 h 132.9 +2484 -38.5 20.7 h 10.6 +2485 71.7 86.2 h 1.8 +2486 5.2 16.9 h 2.0 +2487 35.7 9.6 h 18.1 +2488 15.9 15.7 h 23.9 +2489 28.8 29.2 h 1.0 +2490 25.4 23.5 h 0.6 +2491 7.7 3.1 h 1.1 +2492 15.3 -7.2 h 16.2 +2493 -3.1 6.7 h 9.4 +2494 23.5 13.1 h 0.2 +2495 24.0 13.3 h 3.8 +2496 23.1 15.1 h 5.6 +2497 22.6 13.7 h 8.8 +2498 12.1 4.1 h 18.4 +2499 -32.7 -13.3 h 1.4 diff --git a/examples/platforms/median_p2psim.syscoord b/examples/platforms/median_p2psim.syscoord new file mode 100644 index 0000000000..2d72aed53a --- /dev/null +++ b/examples/platforms/median_p2psim.syscoord @@ -0,0 +1,1740 @@ +0 -30.8 -183.3 h 0.4 +1 -1.3 3.4 h 5.4 +2 6.6 6.7 h 7.7 +3 -16.7 19.8 h 0.7 +4 7.8 5.6 h 6.9 +5 -5.9 -4.4 h 6.0 +6 0.0 -5.0 h 11.6 +7 0.3 -4.1 h 2.3 +8 -1.3 -10.9 h 0.8 +9 2.3 -5.9 h 4.6 +10 2.9 -3.0 h 8.9 +11 4.3 4.7 h 10.5 +12 3.0 -1.0 h 8.4 +13 8.2 -4.9 h 8.6 +14 6.5 -0.9 h 16.5 +15 9.1 -3.9 h 9.1 +16 -6.0 18.8 h 10.0 +17 4.6 1.3 h 6.0 +18 6.0 -12.0 h 1.0 +19 3.3 10.1 h 6.8 +20 10.6 0.8 h 2.7 +21 -6.3 15.6 h 3.0 +22 -1.6 2.5 h 6.2 +23 -3.4 1.9 h 5.3 +24 -10.0 -1.7 h 9.2 +25 -8.7 -2.3 h 5.9 +26 -10.6 -9.4 h 2.7 +27 -0.6 -0.2 h 15.7 +28 8.4 -11.4 h 18.1 +29 0.3 8.6 h 12.6 +30 5.5 -10.3 h 0.4 +31 -0.2 -4.9 h 4.4 +32 5.2 5.2 h 6.1 +33 9.4 -9.5 h 6.9 +34 5.8 -4.9 h 11.9 +35 1.9 -7.6 h 22.3 +36 -1.1 0.7 h 15.3 +37 7.6 -0.2 h 44.6 +38 8.9 19.6 h 23.3 +39 0.3 0.3 h 12.7 +40 7.0 12.5 h 9.4 +41 4.2 6.9 h 7.6 +42 1.4 -9.6 h 0.2 +43 0.6 1.4 h 1.6 +44 0.4 -5.5 h 2.2 +45 6.9 2.6 h 9.1 +46 6.9 3.0 h 10.2 +47 1.4 -6.6 h 30.3 +48 3.4 17.4 h 8.1 +49 10.5 -6.6 h 1.2 +50 -17.2 19.6 h 4.1 +51 8.5 24.4 h 9.6 +52 -4.0 -1.1 h 9.3 +53 -4.3 -17.1 h 12.0 +54 -5.7 -1.2 h 15.0 +55 -6.4 35.2 h 0.8 +56 -0.3 1.1 h 31.4 +57 1.8 -8.2 h 6.2 +58 2.3 2.6 h 7.4 +59 3.6 0.3 h 9.7 +60 13.8 -10.9 h 3.8 +61 -1.0 -9.6 h 18.6 +62 14.1 20.7 h 12.7 +63 18.3 -11.0 h 2.4 +64 7.0 -1.6 h 12.8 +65 -6.8 -13.5 h 0.3 +66 10.6 -9.6 h 2.3 +67 -0.5 -3.8 h 13.0 +68 8.5 -8.8 h 1.8 +69 1.4 -6.1 h 4.0 +70 0.6 -2.5 h 10.1 +71 -11.5 -6.8 h 24.7 +72 1.0 20.4 h 14.5 +73 -2.2 19.5 h 3.7 +74 -9.6 -5.1 h 13.8 +75 -0.6 0.6 h 13.1 +76 8.6 24.5 h 13.7 +77 -0.4 8.6 h 1.2 +78 -11.7 34.5 h 5.2 +79 -10.6 22.8 h 4.0 +80 9.1 -15.4 h 45.6 +81 20.3 -5.0 h 35.4 +82 -3.0 -6.1 h 0.2 +83 0.4 30.1 h 1.0 +84 24.2 -9.9 h 2.1 +85 2.6 -8.5 h 3.9 +86 4.7 -8.7 h 0.3 +87 -2.9 23.9 h 29.1 +88 1.7 -5.0 h 9.2 +89 77.3 8.0 h 4.7 +90 11.6 -8.9 h 0.3 +91 10.1 -9.9 h 2.6 +92 2.0 -62.0 h 3.8 +93 12.5 6.8 h 1.2 +94 -8.1 -10.2 h 0.3 +95 16.4 -6.3 h 0.5 +96 -11.8 25.7 h 1.6 +97 -12.3 24.3 h 0.7 +98 -0.2 25.3 h 0.1 +99 7.2 -16.5 h 3.5 +100 11.7 -7.9 h 1.1 +101 0.1 -14.6 h 29.5 +102 7.1 -2.5 h 12.4 +103 0.4 -54.7 h 9.0 +104 -0.8 0.8 h 6.0 +105 -5.6 -4.8 h 1.4 +106 13.8 2.3 h 9.3 +107 -0.4 -12.9 h 1.6 +108 -3.0 17.7 h 7.5 +109 -13.3 8.2 h 14.1 +110 28.3 51.7 h 50.7 +111 -3.6 3.8 h 16.9 +112 8.6 20.3 h 5.8 +113 6.2 -8.3 h 9.0 +114 -3.6 12.6 h 4.3 +115 -1.6 21.5 h 7.3 +116 -4.7 -1.4 h 9.2 +117 21.7 -12.0 h 0.1 +118 9.4 -1.3 h 0.9 +119 24.1 -66.1 h 0.6 +120 0.9 -41.4 h 28.3 +121 3.6 -70.6 h 0.5 +122 26.4 -63.9 h 0.9 +123 -13.6 -63.4 h 9.4 +124 19.6 -55.9 h 2.1 +125 12.3 -62.6 h 6.7 +126 -7.7 -64.3 h 1.4 +127 10.6 -76.6 h 0.6 +128 -55.2 82.5 h 5.2 +129 -46.5 83.3 h 9.6 +130 -54.6 125.3 h 7.8 +131 3.0 -5.7 h 1.4 +132 7.6 0.9 h 17.5 +133 26.6 -4.8 h 4.3 +134 -5.6 -47.0 h 2.5 +135 13.4 -56.7 h 1.6 +136 7.3 -3.1 h 7.0 +137 5.7 -54.4 h 0.3 +138 18.6 1.7 h 1.6 +139 17.2 -6.8 h 1.1 +140 6.8 -6.8 h 10.9 +141 4.1 -2.7 h 10.4 +142 7.1 -8.1 h 10.6 +143 -0.4 2.7 h 9.2 +144 24.2 -4.7 h 0.3 +145 -0.4 -2.7 h 11.0 +146 32.9 -24.9 h 1.3 +147 22.5 -42.6 h 2.6 +148 10.6 -54.9 h 0.7 +149 -12.7 75.5 h 10.3 +150 -10.6 73.4 h 12.7 +151 70.5 94.3 h 11.1 +152 122.9 -24.7 h 0.0 +153 -47.3 61.8 h 15.9 +154 -31.3 81.5 h 0.8 +155 -15.0 23.7 h 57.1 +156 48.3 105.0 h 4.7 +157 10.0 -14.1 h 117.8 +158 2.8 -57.8 h 5.0 +159 -10.2 0.1 h 14.8 +160 4.8 -51.0 h 10.0 +161 1.9 -47.5 h 0.5 +162 3.6 -12.0 h 1.4 +163 31.3 -11.8 h 2.7 +164 2.2 18.2 h 12.2 +165 -9.7 25.4 h 4.3 +166 -11.1 -48.9 h 7.2 +167 8.7 -1.3 h 22.5 +168 59.8 101.1 h 1.0 +169 -0.3 -9.0 h 2.2 +170 18.2 -60.5 h 0.6 +171 6.4 -54.9 h 10.0 +172 12.8 -52.7 h 2.8 +173 -4.5 -47.8 h 0.5 +174 6.7 -7.9 h 8.9 +175 11.8 -52.7 h 0.0 +176 9.9 94.6 h 4.9 +177 9.7 126.7 h 0.2 +178 -17.5 52.9 h 53.0 +179 -30.1 63.8 h 51.1 +180 -24.4 52.4 h 48.3 +181 -8.8 27.4 h 73.5 +182 14.4 59.2 h 42.1 +183 -20.0 101.7 h 3.2 +184 6.4 -16.6 h 1.0 +185 1.7 -7.5 h 20.2 +186 -27.4 27.5 h 0.9 +187 -0.3 4.5 h 4.5 +188 1.6 29.0 h 3.0 +189 -4.4 -6.9 h 1.3 +190 8.2 -60.4 h 0.8 +191 -1.6 3.1 h 3.2 +192 0.5 1.5 h 8.3 +193 1.0 -58.1 h 0.5 +194 -17.8 -59.9 h 1.2 +195 8.7 -58.9 h 2.6 +196 22.8 -10.7 h 1.1 +197 2.7 -5.8 h 14.3 +198 7.2 -9.6 h 7.7 +199 5.8 26.9 h 6.7 +200 30.6 12.8 h 64.8 +201 -0.1 -3.3 h 85.0 +202 4.0 5.3 h 1.5 +203 -4.0 -49.9 h 0.4 +204 7.9 -51.6 h 8.7 +205 2.4 -53.0 h 0.8 +206 4.8 -1.5 h 8.2 +207 1.4 16.1 h 81.1 +208 52.3 79.2 h 0.4 +209 11.5 -18.0 h 65.5 +210 -6.0 -64.0 h 1.5 +211 -0.7 7.9 h 25.2 +212 25.3 -61.2 h 0.9 +213 5.6 -58.1 h 0.6 +214 -39.5 100.5 h 3.2 +215 5.8 21.1 h 13.3 +216 -12.0 -4.3 h 79.9 +217 5.2 -6.8 h 15.4 +218 2.6 6.5 h 13.8 +219 -0.0 4.6 h 12.6 +220 -6.8 -47.6 h 10.3 +221 23.7 -34.1 h 30.9 +222 -55.1 64.6 h 0.5 +223 -0.6 76.7 h 3.0 +224 -36.0 97.2 h 0.6 +225 -16.1 -58.9 h 0.1 +226 -0.2 -9.1 h 2.0 +227 7.3 -6.5 h 0.6 +228 37.7 46.5 h 54.9 +229 32.3 -63.6 h 0.3 +230 2.6 27.1 h 8.9 +231 -7.5 20.0 h 11.0 +232 3.0 -12.4 h 0.3 +233 16.4 -6.5 h 0.4 +234 -3.6 28.6 h 0.9 +235 1.5 -5.4 h 6.8 +236 5.7 -5.4 h 12.7 +237 6.1 0.0 h 13.6 +238 -4.2 23.4 h 4.3 +239 -0.1 -9.3 h 3.6 +240 -0.3 -1.5 h 18.0 +241 -5.6 21.8 h 0.7 +242 8.2 -18.2 h 2.3 +243 -4.6 20.7 h 5.0 +244 9.5 -57.3 h 8.4 +245 -30.4 -38.8 h 1.8 +246 -16.7 23.9 h 0.5 +247 -13.2 -82.6 h 1.0 +248 -7.4 -62.9 h 0.4 +249 11.0 -51.3 h 13.8 +250 14.5 -50.5 h 35.6 +251 35.2 7.8 h 89.7 +252 1.6 6.3 h 7.0 +253 -7.0 38.9 h 93.4 +254 12.8 -0.1 h 8.2 +255 3.3 -10.6 h 0.8 +256 2.0 -14.7 h 0.3 +257 9.6 18.7 h 6.2 +258 -9.5 3.3 h 19.0 +259 -2.9 -4.9 h 15.9 +260 -24.1 79.3 h 6.0 +261 3.9 -57.9 h 15.4 +262 3.1 -9.1 h 5.0 +263 -3.8 9.3 h 6.0 +264 -1.4 25.6 h 1.2 +265 -6.9 24.2 h 6.7 +266 10.1 2.0 h 5.3 +267 -9.6 3.1 h 8.1 +268 23.8 -0.5 h 1.3 +269 9.6 8.7 h 13.1 +270 -6.1 -10.8 h 0.4 +271 5.0 -9.6 h 2.0 +272 3.8 21.8 h 8.5 +273 10.7 -5.1 h 1.2 +274 -1.8 -8.2 h 4.2 +275 -2.2 4.6 h 7.6 +276 -0.3 -12.8 h 0.1 +277 11.7 -10.1 h 0.2 +278 7.2 -9.4 h 2.3 +279 3.9 -8.5 h 0.7 +280 7.4 26.3 h 0.5 +281 0.7 29.3 h 0.9 +282 -5.1 1.2 h 48.3 +283 2.8 -9.5 h 4.8 +284 -20.6 62.4 h 40.2 +285 -7.3 -5.4 h 1.6 +286 12.2 -2.3 h 19.1 +287 8.1 -2.9 h 5.0 +288 -10.9 -7.6 h 2.4 +289 8.2 2.2 h 1.9 +290 9.8 2.9 h 1.7 +291 13.3 -6.0 h 17.2 +292 10.1 -15.3 h 19.0 +293 7.2 -14.2 h 1.8 +294 8.3 28.2 h 0.6 +295 -2.9 24.7 h 1.6 +296 13.7 12.8 h 9.9 +297 -6.2 25.2 h 0.9 +298 5.9 -22.1 h 20.7 +299 10.7 15.5 h 16.9 +300 5.8 19.5 h 8.7 +301 4.9 13.8 h 19.9 +302 -15.9 -68.6 h 0.7 +303 6.8 -10.3 h 12.4 +304 1.6 -49.5 h 49.5 +305 18.7 -48.7 h 40.2 +306 28.2 -85.8 h 0.4 +307 -49.7 67.4 h 35.8 +308 -2.1 -52.3 h 8.1 +309 2.7 32.6 h 6.0 +310 3.8 5.7 h 8.7 +311 1.9 -10.0 h 9.8 +312 17.5 27.3 h 1.4 +313 5.7 -12.0 h 0.3 +314 1.3 21.8 h 5.1 +315 -34.6 6.1 h 1.8 +316 15.9 22.4 h 1.8 +317 9.5 -8.6 h 0.8 +318 12.6 -16.9 h 0.3 +319 12.6 10.5 h 9.6 +320 3.5 2.5 h 3.9 +321 -4.5 -37.7 h 54.4 +322 16.9 -6.7 h 11.5 +323 1.9 2.6 h 11.9 +324 1.2 12.4 h 15.0 +325 -85.9 72.5 h 0.4 +326 -0.9 -2.8 h 5.5 +327 2.1 -2.9 h 16.6 +328 1.1 -5.1 h 9.7 +329 6.1 -0.4 h 21.5 +330 3.2 28.5 h 8.2 +331 5.6 21.6 h 1.5 +332 6.8 -9.5 h 3.4 +333 -3.8 -4.7 h 11.4 +334 -3.2 9.3 h 27.7 +335 -3.0 -12.5 h 2.4 +336 6.5 -2.6 h 4.0 +337 5.2 -0.9 h 11.3 +338 6.0 -1.2 h 20.2 +339 -7.7 19.9 h 4.8 +340 41.5 8.0 h 2.4 +341 -8.7 2.6 h 13.0 +342 0.8 -60.0 h 2.6 +343 50.5 -23.4 h 10.6 +344 -1.1 -5.8 h 3.0 +345 -0.5 3.0 h 9.5 +346 3.0 9.9 h 6.1 +347 11.6 -57.6 h 3.5 +348 18.6 -49.2 h 10.7 +349 38.7 -59.5 h 1.4 +350 -3.7 -58.8 h 0.5 +351 5.6 -58.2 h 1.2 +352 233.1 75.6 h 1.5 +353 -0.9 -49.5 h 4.7 +354 5.2 -49.9 h 15.0 +355 7.7 -45.9 h 2.9 +356 22.1 -61.8 h 0.1 +357 10.4 -73.3 h 1.3 +358 -0.2 -56.2 h 4.8 +359 -5.0 -54.7 h 0.2 +360 -12.8 -81.0 h 0.6 +361 11.0 -57.1 h 4.2 +362 23.8 -65.7 h 2.4 +363 24.0 -81.9 h 73.2 +364 10.8 -46.7 h 18.4 +365 11.6 -47.7 h 14.8 +366 -6.1 -55.9 h 10.5 +367 -105.0 -55.6 h 0.2 +368 -18.0 -86.0 h 7.2 +369 0.8 -54.4 h 7.8 +370 -10.7 -48.7 h 14.3 +371 8.1 -31.8 h 73.9 +372 -15.7 -65.2 h 7.4 +373 7.6 -58.8 h 13.5 +374 5.2 -44.5 h 33.1 +375 7.9 -71.5 h 1.2 +376 -2.1 -54.5 h 2.0 +377 -2.5 -26.0 h 46.1 +378 39.2 -53.6 h 0.4 +379 -26.6 -66.9 h 0.5 +380 -22.1 -65.8 h 1.5 +381 21.1 -46.4 h 22.0 +382 -1.1 -60.0 h 25.4 +383 -49.1 -51.7 h 0.1 +384 21.2 -51.7 h 0.0 +385 -0.9 -50.1 h 2.9 +386 0.3 -65.8 h 0.6 +387 -3.4 -65.7 h 0.9 +388 0.4 -53.2 h 1.0 +389 20.8 -60.3 h 7.4 +390 5.7 -25.3 h 44.8 +391 18.9 -47.0 h 16.7 +392 -0.6 -56.7 h 1.3 +393 6.5 -42.5 h 11.3 +394 0.1 -51.0 h 4.5 +395 0.1 -47.6 h 7.9 +396 13.5 -65.6 h 1.1 +397 -7.7 -48.3 h 19.5 +398 -16.7 -70.5 h 0.9 +399 36.8 -65.7 h 1.4 +400 -15.3 -74.9 h 0.9 +401 -4.9 -61.8 h 10.3 +402 0.0 -59.5 h 16.8 +403 8.9 -60.4 h 12.8 +404 10.9 -29.9 h 46.5 +405 4.1 -70.4 h 0.2 +406 -9.1 -54.6 h 16.3 +407 27.4 -55.8 h 1.5 +408 2.4 -78.2 h 1.0 +409 8.8 -48.6 h 0.2 +410 11.1 -49.8 h 21.7 +411 0.2 -51.2 h 16.4 +412 -278.9 -96.9 h 0.8 +413 25.3 -51.5 h 16.5 +414 13.2 -62.2 h 0.3 +415 2.4 -59.8 h 0.8 +416 -14.3 -57.5 h 0.7 +417 -0.4 -66.1 h 1.0 +418 3.1 -9.3 h 57.6 +419 -2.9 -49.7 h 2.1 +420 10.8 -48.2 h 1.0 +421 34.2 -55.4 h 2.4 +422 6.1 -45.9 h 20.1 +423 22.5 -59.2 h 0.2 +424 -0.2 -50.5 h 0.8 +425 -15.7 -47.6 h 0.9 +426 3.6 -75.1 h 0.6 +427 9.2 -50.6 h 1.7 +428 6.6 -58.4 h 1.3 +429 -0.8 -50.1 h 0.0 +430 16.3 -64.4 h 0.7 +431 -102.2 -106.7 h 151.8 +432 -3.7 -53.5 h 18.0 +433 14.5 -55.1 h 0.6 +434 3.9 -46.0 h 1.2 +435 9.4 -51.6 h 0.8 +436 6.7 -49.2 h 16.2 +437 28.5 -49.2 h 0.2 +438 -5.7 -55.3 h 26.0 +439 -13.0 -52.3 h 4.0 +440 8.2 -50.5 h 7.1 +441 -3.0 -47.9 h 23.3 +442 9.0 -57.1 h 1.8 +443 3.6 -41.7 h 0.3 +444 -77.6 19.1 h 103.5 +445 7.8 -44.3 h 24.7 +446 -18.2 -42.2 h 18.1 +447 1.5 -46.9 h 0.8 +448 22.6 -48.4 h 0.6 +449 6.6 -49.8 h 1.0 +450 7.4 -41.3 h 8.5 +451 10.4 -54.5 h 0.9 +452 6.8 -53.2 h 14.1 +453 -10.2 -57.6 h 16.7 +454 6.1 -70.3 h 4.2 +455 -5.1 -53.7 h 5.9 +456 -9.7 -70.4 h 0.1 +457 30.6 -65.0 h 2.0 +458 -4.9 -63.4 h 0.7 +459 8.5 -71.1 h 16.6 +460 54.3 -0.6 h 87.9 +461 -19.4 -65.9 h 0.3 +462 15.2 -71.3 h 2.3 +463 8.9 -65.7 h 1.1 +464 -5.6 -61.5 h 10.3 +465 1.2 -55.4 h 2.5 +466 -7.4 -57.0 h 16.8 +467 2.0 -63.5 h 0.9 +468 21.0 -55.7 h 1.2 +469 12.5 -60.5 h 132.7 +470 -20.7 -59.1 h 0.4 +471 10.7 -43.7 h 20.2 +472 -1.3 -47.3 h 0.4 +473 -9.1 -59.9 h 2.9 +474 7.1 -48.3 h 1.9 +475 30.0 -67.8 h 3.1 +476 5.7 -54.6 h 0.7 +477 1.7 -50.2 h 3.3 +478 6.4 -62.3 h 6.4 +479 2.7 -52.5 h 2.7 +480 -0.4 -50.6 h 0.0 +481 -4.9 -61.6 h 12.3 +482 94.1 -11.7 h 0.3 +483 119.0 -138.5 h 6.6 +484 -32.9 -62.0 h 0.1 +485 -3.6 -60.2 h 20.9 +486 73.6 -65.8 h 103.9 +487 -2.2 -59.6 h 0.7 +488 7.5 -53.5 h 0.4 +489 0.1 -51.0 h 26.5 +490 1.4 -11.9 h 68.0 +491 -1.0 -71.2 h 1.5 +492 25.0 -66.0 h 0.6 +493 31.6 -43.4 h 30.6 +494 -104.4 13.8 h 30.6 +495 -1.4 -54.3 h 12.5 +496 -40.1 -68.3 h 2.7 +497 18.9 -57.4 h 10.2 +498 15.6 -49.6 h 17.0 +499 8.0 -38.8 h 54.8 +500 6.0 -54.4 h 5.9 +501 21.7 -59.7 h 25.4 +502 27.0 -40.4 h 32.7 +503 7.6 -63.6 h 0.9 +504 -29.1 -97.7 h 7.9 +505 10.9 -47.6 h 17.2 +506 19.8 -45.2 h 0.1 +507 21.6 -67.5 h 2.2 +508 -8.3 -63.8 h 0.1 +509 -2.9 -64.8 h 4.0 +510 -2.1 -47.6 h 0.7 +511 15.3 -53.2 h 1.3 +512 -9.1 -48.2 h 2.8 +513 7.8 -56.1 h 3.4 +514 -12.2 -52.9 h 1.4 +515 14.9 -41.7 h 34.2 +516 -1.0 -48.1 h 32.9 +517 22.1 -57.1 h 0.8 +518 -5.9 -53.7 h 1.2 +519 -0.8 -56.1 h 0.5 +520 35.6 0.1 h 266.5 +521 -13.2 28.5 h 127.8 +522 -2.0 -31.7 h 116.8 +523 10.6 -2.4 h 84.5 +524 42.9 -10.6 h 171.2 +525 39.2 1.6 h 0.8 +526 33.0 14.0 h 257.0 +527 -56.3 -64.4 h 2.1 +528 48.0 -43.3 h 93.6 +529 34.3 -25.0 h 2.8 +530 -17.3 -10.6 h 23.2 +531 -2.8 -2.4 h 5.7 +532 -3.1 -1.1 h 4.5 +533 3.4 -1.6 h 11.3 +534 1.9 4.2 h 32.5 +535 -15.0 -3.7 h 2.6 +536 6.2 21.4 h 2.6 +537 2.2 -3.6 h 8.0 +538 -4.2 34.6 h 0.2 +539 7.3 -7.1 h 11.8 +540 -6.1 15.5 h 10.4 +541 3.3 17.7 h 16.7 +542 -7.4 -4.0 h 21.4 +543 8.1 3.3 h 3.9 +544 2.2 25.0 h 5.9 +545 -3.2 29.6 h 1.7 +546 -13.9 26.1 h 0.8 +547 2.9 5.9 h 3.3 +548 -9.1 2.4 h 4.0 +549 4.6 -7.4 h 4.6 +550 2.9 5.0 h 7.4 +551 -12.0 2.2 h 0.3 +552 -0.3 3.7 h 8.4 +553 -2.1 3.5 h 9.6 +554 -6.5 25.4 h 10.1 +555 5.9 -9.4 h 5.3 +556 8.0 -20.6 h 3.8 +557 6.9 -10.4 h 2.8 +558 9.5 -3.5 h 11.6 +559 31.0 39.8 h 0.8 +560 15.9 21.0 h 2.2 +561 3.3 -0.1 h 18.6 +562 -1.1 -2.5 h 3.0 +563 -0.3 -11.6 h 0.5 +564 7.8 11.0 h 7.8 +565 2.2 2.3 h 0.6 +566 17.4 -6.7 h 3.5 +567 4.1 -2.0 h 0.3 +568 1.4 -9.0 h 2.7 +569 11.1 -13.1 h 0.7 +570 -2.4 -4.0 h 7.3 +571 16.3 32.7 h 6.2 +572 1.5 5.6 h 6.7 +573 -4.7 5.8 h 4.4 +574 1.4 -1.0 h 8.0 +575 4.2 -1.5 h 7.7 +576 4.9 9.8 h 3.1 +577 -1.0 -0.5 h 6.9 +578 8.1 2.2 h 6.9 +579 2.8 2.6 h 9.8 +580 -1.7 9.6 h 6.5 +581 6.8 22.5 h 7.3 +582 4.8 -10.1 h 13.7 +583 3.0 -17.5 h 0.8 +584 -6.0 5.2 h 24.3 +585 1.7 -0.3 h 8.8 +586 6.6 30.1 h 8.4 +587 -0.9 -7.7 h 4.1 +588 7.9 -2.5 h 5.6 +589 4.6 -0.7 h 5.4 +590 4.3 1.6 h 14.6 +591 -0.4 -10.4 h 6.7 +592 12.8 -13.7 h 0.3 +593 7.6 2.6 h 12.6 +594 10.7 -14.2 h 19.1 +595 8.1 0.9 h 25.5 +596 7.9 27.9 h 7.8 +597 -7.6 20.0 h 26.0 +598 9.2 -9.0 h 3.6 +599 -12.0 0.8 h 16.8 +600 14.3 30.6 h 0.5 +601 -10.1 22.1 h 14.6 +602 2.5 29.4 h 12.2 +603 -6.7 26.2 h 19.1 +604 -2.2 -4.7 h 8.4 +605 -8.3 19.7 h 6.1 +606 9.1 26.7 h 16.3 +607 5.0 -10.9 h 2.6 +608 5.4 -8.8 h 9.4 +609 6.8 -11.2 h 13.4 +610 4.9 1.6 h 7.0 +611 18.9 2.7 h 4.4 +612 -2.7 22.4 h 19.2 +613 17.3 -6.5 h 4.4 +614 3.0 -8.1 h 75.6 +615 0.5 -8.7 h 74.3 +616 0.9 -1.9 h 58.9 +617 -8.6 -2.3 h 22.7 +618 1.1 -15.4 h 33.2 +619 -2.2 -0.3 h 40.1 +620 16.7 -3.9 h 76.0 +621 3.1 -6.0 h 78.4 +622 74.8 14.8 h 28.5 +623 -26.4 -6.0 h 44.7 +624 -54.0 -6.8 h 24.1 +625 -0.3 0.1 h 82.8 +626 -58.7 12.6 h 9.0 +627 75.8 -3.9 h 20.9 +628 70.1 -30.1 h 2.5 +629 62.9 -28.5 h 21.0 +630 -0.3 -4.4 h 69.0 +631 -67.8 -16.0 h 1.1 +632 33.3 -19.0 h 45.2 +633 82.9 2.4 h 1.2 +634 81.9 -39.7 h 7.4 +635 60.9 -71.4 h 0.4 +636 4.8 -1.4 h 79.6 +637 0.3 -0.8 h 78.5 +638 0.7 -0.3 h 76.2 +639 12.5 -6.4 h 98.2 +640 13.8 3.1 h 75.7 +641 74.4 -37.1 h 24.0 +642 1.7 -2.3 h 64.9 +643 -69.6 -22.0 h 25.2 +644 -64.9 23.2 h 27.1 +645 4.8 -7.6 h 61.1 +646 31.6 2.4 h 45.7 +647 24.5 -1.5 h 57.4 +648 62.8 -12.8 h 0.2 +649 1.9 -3.0 h 68.1 +650 51.9 -37.5 h 18.8 +651 -8.1 -4.2 h 72.6 +652 2.4 -12.0 h 54.2 +653 -33.8 -10.8 h 29.7 +654 83.7 -26.3 h 0.5 +655 -46.7 -50.4 h 4.8 +656 7.0 3.5 h 69.8 +657 4.9 -7.8 h 58.7 +658 -18.2 -2.0 h 61.9 +659 -0.7 1.2 h 45.0 +660 2.9 -1.2 h 43.9 +661 -2.9 10.0 h 34.7 +662 14.2 20.5 h 25.8 +663 -21.9 -10.2 h 35.1 +664 5.6 -3.8 h 75.8 +665 9.7 -4.0 h 12.4 +666 15.6 -4.1 h 89.1 +667 11.9 -6.5 h 71.6 +668 -13.9 -4.7 h 79.2 +669 -0.6 -12.7 h 25.5 +670 21.2 3.9 h 65.6 +671 1.2 -7.4 h 42.8 +672 73.2 -68.7 h 17.0 +673 -66.2 -11.2 h 0.7 +674 -29.0 -7.9 h 30.4 +675 3.7 -1.6 h 76.0 +676 6.9 -2.1 h 74.6 +677 3.7 -1.7 h 104.2 +678 26.5 -12.0 h 1.3 +679 2.7 0.5 h 59.3 +680 9.5 -9.0 h 56.3 +681 15.9 2.4 h 10.6 +682 -1.7 2.0 h 85.1 +683 5.4 5.2 h 68.0 +684 -4.9 -8.6 h 72.2 +685 78.5 13.4 h 15.0 +686 -0.4 -6.0 h 75.7 +687 23.7 -9.2 h 43.9 +688 20.6 -2.0 h 74.2 +689 11.1 -2.6 h 69.5 +690 8.0 -5.4 h 70.8 +691 19.6 6.2 h 74.1 +692 5.9 -5.3 h 70.2 +693 -11.7 -7.8 h 34.6 +694 10.3 -9.6 h 57.9 +695 15.0 10.3 h 60.9 +696 -3.4 -1.0 h 67.6 +697 -39.6 -13.5 h 232.6 +698 -10.8 -7.1 h 23.6 +699 64.5 129.6 h 0.6 +700 57.6 59.7 h 48.6 +701 -53.7 86.6 h 2.3 +702 -26.9 128.6 h 6.0 +703 147.4 37.9 h 1.7 +704 -24.4 -91.9 h 63.8 +705 -268.9 -66.0 h 57.3 +706 -21.4 10.5 h 73.7 +707 204.7 266.5 h 3.3 +708 -22.7 101.1 h 1.1 +709 40.2 92.1 h 18.4 +710 42.8 0.7 h 130.9 +711 -51.3 82.2 h 0.2 +712 -123.4 5.2 h 198.2 +713 -8.5 114.5 h 1.3 +714 -11.6 95.5 h 0.7 +715 18.9 87.2 h 14.2 +716 49.8 102.7 h 0.0 +717 -21.6 34.0 h 116.9 +718 -132.9 80.5 h 191.8 +719 -20.4 84.8 h 30.7 +720 88.2 54.3 h 0.4 +721 -34.0 41.9 h 46.6 +722 5.6 88.5 h 34.5 +723 -20.7 67.8 h 53.9 +724 -33.9 100.5 h 29.0 +725 22.1 28.6 h 73.4 +726 4.7 27.4 h 88.6 +727 -5.2 57.5 h 39.7 +728 -109.2 59.1 h 12.2 +729 28.4 32.1 h 86.7 +730 -10.2 85.1 h 0.2 +731 9.1 91.0 h 0.7 +732 11.8 80.8 h 1.5 +733 -38.5 80.0 h 0.4 +734 77.3 94.7 h 1.1 +735 37.4 80.5 h 0.8 +736 -22.7 81.2 h 0.5 +737 -72.9 60.0 h 0.1 +738 32.4 79.7 h 0.2 +739 25.0 97.2 h 1.7 +740 -15.8 90.9 h 4.6 +741 -25.9 86.1 h 2.4 +742 -39.7 70.5 h 1.3 +743 14.4 80.2 h 0.3 +744 9.1 30.2 h 74.0 +745 11.1 -11.5 h 92.6 +746 -45.0 78.6 h 26.4 +747 -8.2 79.3 h 3.5 +748 42.8 -37.8 h 82.9 +749 -5.4 21.2 h 271.9 +750 -9.5 66.1 h 27.2 +751 49.0 82.2 h 0.6 +752 32.0 56.3 h 20.5 +753 9.3 103.8 h 0.7 +754 -133.9 -21.1 h 190.1 +755 11.1 28.0 h 116.3 +756 155.5 161.6 h 6.3 +757 20.9 70.9 h 53.2 +758 57.3 77.3 h 18.8 +759 53.5 90.4 h 0.2 +760 77.4 73.6 h 9.8 +761 89.7 125.6 h 1.7 +762 -20.4 104.4 h 18.8 +763 -24.7 90.7 h 1.1 +764 -27.9 92.8 h 3.4 +765 -24.7 100.6 h 0.9 +766 -92.9 47.3 h 6.7 +767 61.1 69.6 h 60.1 +768 -19.9 55.8 h 59.5 +769 90.0 87.4 h 5.1 +770 -31.3 93.7 h 2.0 +771 32.3 24.1 h 58.1 +772 7.3 42.3 h 86.5 +773 -15.3 3.2 h 113.2 +774 40.5 51.8 h 48.5 +775 14.7 105.3 h 0.7 +776 93.7 42.6 h 229.8 +777 89.1 76.4 h 1.1 +778 -184.0 66.0 h 140.3 +779 -11.1 91.2 h 12.9 +780 -6.1 120.6 h 7.9 +781 58.3 71.3 h 73.0 +782 55.9 79.2 h 37.4 +783 16.2 104.4 h 2.1 +784 -17.1 20.1 h 291.6 +785 -3.4 70.5 h 0.3 +786 2.4 117.9 h 0.4 +787 72.2 137.7 h 1.1 +788 -2.5 102.5 h 1.0 +789 -6.8 58.8 h 64.0 +790 43.1 97.7 h 0.6 +791 53.6 93.9 h 0.5 +792 -38.2 70.8 h 0.9 +793 -91.0 97.2 h 3.1 +794 -80.6 91.1 h 3.5 +795 8.0 117.4 h 1.1 +796 25.0 56.0 h 52.0 +797 71.3 78.9 h 0.6 +798 -10.7 65.1 h 86.1 +799 138.7 96.0 h 1.2 +800 -95.0 130.5 h 1.3 +801 -14.4 -10.9 h 107.9 +802 17.8 -23.0 h 110.8 +803 -31.8 40.3 h 86.8 +804 1.4 27.5 h 75.7 +805 -3.0 53.3 h 104.2 +806 62.5 47.6 h 74.4 +807 36.8 79.1 h 3.8 +808 -3.9 74.8 h 8.2 +809 -120.0 82.0 h 4.8 +810 33.0 24.6 h 93.1 +811 -4.8 61.6 h 50.9 +812 16.8 69.0 h 38.5 +813 16.4 76.8 h 2.6 +814 -88.7 38.2 h 15.6 +815 42.1 103.5 h 7.9 +816 85.3 81.3 h 17.1 +817 -10.2 29.6 h 71.3 +818 0.9 55.6 h 81.7 +819 -15.6 54.6 h 44.1 +820 0.1 30.0 h 98.1 +821 119.6 79.5 h 0.1 +822 23.3 116.2 h 0.1 +823 37.7 69.1 h 53.8 +824 72.8 117.5 h 0.9 +825 -10.5 87.7 h 44.1 +826 3.8 26.6 h 74.0 +827 -8.2 40.7 h 63.5 +828 108.4 99.7 h 3.5 +829 64.8 113.6 h 3.2 +830 -14.3 88.2 h 41.9 +831 9.6 111.0 h 1.6 +832 -11.3 102.8 h 14.3 +833 -25.1 88.9 h 0.7 +834 72.9 96.7 h 1.2 +835 -34.2 42.4 h 68.4 +836 13.4 78.1 h 24.2 +837 12.7 75.1 h 71.4 +838 34.0 39.2 h 81.5 +839 57.1 119.7 h 1.9 +840 34.6 54.7 h 61.6 +841 39.0 134.3 h 9.7 +842 67.4 116.9 h 0.7 +843 -3.1 54.5 h 54.6 +844 -26.3 60.3 h 66.9 +845 27.8 119.5 h 0.2 +846 52.4 134.8 h 0.4 +847 44.6 47.4 h 76.8 +848 46.2 76.0 h 79.8 +849 66.9 72.5 h 40.5 +850 46.8 118.3 h 0.3 +851 53.8 161.0 h 7.1 +852 95.8 116.1 h 1.1 +853 7.4 129.2 h 6.0 +854 31.9 133.6 h 0.4 +855 76.0 87.4 h 0.1 +856 -37.8 98.8 h 0.3 +857 -18.4 20.7 h 85.4 +858 58.0 101.4 h 1.6 +859 17.3 68.5 h 37.7 +860 55.6 79.0 h 3.6 +861 -20.0 44.5 h 54.0 +862 -51.0 105.5 h 1.6 +863 38.6 22.2 h 69.9 +864 -13.9 106.9 h 3.0 +865 -8.3 21.4 h 1.6 +866 1.7 -8.4 h 8.5 +867 2.3 -3.4 h 7.0 +868 -4.8 3.9 h 1.6 +869 8.9 -13.9 h 3.9 +870 -2.5 24.0 h 3.9 +871 1.8 0.0 h 8.8 +872 17.0 22.3 h 0.9 +873 11.7 7.6 h 2.5 +874 -0.2 1.9 h 24.9 +875 6.4 2.6 h 7.0 +876 6.9 17.6 h 11.9 +877 -0.5 26.0 h 8.6 +878 2.8 -2.8 h 14.4 +879 3.1 -3.1 h 2.1 +880 -1.0 -16.8 h 2.0 +881 -0.8 -4.7 h 6.8 +882 12.0 -10.2 h 11.0 +883 -47.7 24.5 h 2.8 +884 6.9 -9.4 h 2.6 +885 -4.3 -6.9 h 15.9 +886 -19.7 29.9 h 1.0 +887 21.3 4.7 h 0.4 +888 11.5 1.5 h 9.9 +889 4.9 22.3 h 7.7 +890 -0.7 3.2 h 2.8 +891 0.5 22.0 h 3.7 +892 24.0 18.5 h 12.9 +893 7.2 -8.9 h 4.1 +894 1.5 -12.0 h 1.0 +895 2.8 6.0 h 12.0 +896 17.2 4.2 h 32.9 +897 6.8 -6.1 h 9.7 +898 1.6 -3.8 h 21.6 +899 8.3 8.6 h 0.2 +900 3.2 -15.2 h 18.4 +901 -5.1 24.5 h 2.3 +902 5.3 6.7 h 1.2 +903 3.9 -0.6 h 8.7 +904 2.6 -13.4 h 4.8 +905 8.6 6.3 h 17.0 +906 2.6 -21.6 h 1.9 +907 10.2 -11.7 h 24.1 +908 2.6 -3.1 h 7.5 +909 5.7 3.8 h 4.4 +910 8.1 -4.0 h 17.1 +911 -0.8 -2.4 h 3.5 +912 7.1 -10.3 h 1.3 +913 1.8 -14.1 h 5.0 +914 -0.9 2.9 h 4.6 +915 6.9 -12.6 h 2.8 +916 -11.2 20.9 h 8.0 +917 12.7 -5.9 h 13.1 +918 -1.1 -13.7 h 5.2 +919 -25.6 4.5 h 6.3 +920 17.1 1.6 h 1.2 +921 6.6 8.1 h 5.7 +922 -6.1 26.0 h 9.2 +923 -4.7 20.9 h 12.1 +924 -0.5 -11.4 h 6.7 +925 -15.6 -5.9 h 39.6 +926 8.9 13.4 h 7.0 +927 11.1 12.9 h 11.2 +928 13.6 -7.1 h 15.6 +929 4.7 -10.6 h 18.1 +930 1.2 7.0 h 7.3 +931 6.0 5.9 h 5.5 +932 0.1 3.6 h 10.3 +933 -2.7 2.9 h 10.5 +934 0.6 -5.5 h 9.0 +935 -10.6 -9.9 h 3.0 +936 7.8 -7.8 h 30.2 +937 -7.4 -9.7 h 31.7 +938 11.2 -7.3 h 22.6 +939 -0.7 -8.0 h 10.8 +940 2.7 -2.1 h 7.7 +941 -15.1 4.3 h 5.2 +942 -0.4 1.0 h 11.3 +943 -6.9 0.9 h 0.4 +944 3.9 -12.0 h 7.9 +945 -17.2 3.0 h 0.6 +946 4.2 -1.4 h 0.5 +947 18.1 -4.9 h 0.5 +948 4.5 3.6 h 2.5 +949 2.8 -12.7 h 6.3 +950 14.6 6.4 h 0.2 +951 16.1 0.2 h 1.1 +952 -9.3 30.6 h 7.1 +953 4.3 32.5 h 0.6 +954 0.3 -9.3 h 15.0 +955 2.4 14.8 h 16.9 +956 -9.6 21.0 h 9.7 +957 10.3 -2.1 h 10.7 +958 -1.3 19.5 h 5.5 +959 -9.1 19.7 h 4.3 +960 20.2 -8.1 h 13.1 +961 1.9 29.6 h 24.6 +962 0.1 -1.1 h 8.0 +963 12.8 -0.1 h 0.5 +964 -7.0 65.4 h 1.0 +965 1.4 16.8 h 26.0 +966 -7.4 10.5 h 2.1 +967 7.4 -11.1 h 2.6 +968 8.4 22.6 h 8.8 +969 2.5 1.8 h 4.8 +970 -0.7 -1.0 h 12.3 +971 7.7 -9.6 h 7.2 +972 -18.2 10.8 h 0.5 +973 4.0 -4.8 h 1.3 +974 9.8 -4.2 h 0.1 +975 4.8 -13.1 h 12.6 +976 -3.0 13.8 h 5.2 +977 9.4 24.2 h 6.0 +978 1.6 25.6 h 13.2 +979 2.2 25.3 h 7.0 +980 -3.5 0.1 h 4.0 +981 -0.3 -5.1 h 4.9 +982 4.7 -10.1 h 6.0 +983 10.6 -1.4 h 4.8 +984 -4.3 27.4 h 0.6 +985 -1.4 -3.5 h 8.2 +986 -10.0 -11.8 h 9.9 +987 -1.7 -0.3 h 12.1 +988 10.9 26.4 h 0.2 +989 5.8 1.6 h 9.1 +990 -0.6 2.9 h 28.1 +991 8.3 22.7 h 15.8 +992 -8.1 -9.6 h 6.5 +993 5.4 -9.8 h 3.8 +994 -3.0 13.4 h 3.8 +995 -8.6 5.2 h 4.9 +996 3.1 -12.4 h 34.3 +997 0.1 -7.8 h 3.3 +998 -0.8 2.6 h 3.1 +999 -241.9 -50.8 h 74.2 +1000 5.2 10.1 h 1.2 +1001 36.0 -11.1 h 1.5 +1002 7.6 32.0 h 0.5 +1003 3.9 4.2 h 11.4 +1004 1.5 5.5 h 12.7 +1005 -18.2 27.8 h 7.3 +1006 3.6 -10.8 h 4.2 +1007 -6.4 -11.6 h 5.9 +1008 5.8 8.4 h 10.3 +1009 18.0 13.5 h 14.6 +1010 10.3 -7.4 h 9.8 +1011 -8.7 -9.2 h 4.0 +1012 5.3 0.4 h 12.0 +1013 -3.1 26.4 h 1.4 +1014 7.8 6.2 h 3.4 +1015 14.0 14.6 h 1.3 +1016 12.5 -8.5 h 32.3 +1017 -4.3 12.4 h 15.5 +1018 -3.5 16.8 h 1.4 +1019 17.8 23.8 h 12.1 +1020 10.9 -5.3 h 18.9 +1021 5.0 1.7 h 6.4 +1022 -13.4 4.4 h 29.7 +1023 27.2 27.9 h 2.7 +1024 -0.1 -4.4 h 6.4 +1025 2.3 27.4 h 1.0 +1026 5.1 7.3 h 5.7 +1027 7.3 3.2 h 8.3 +1028 6.1 9.5 h 1.9 +1029 -26.7 1.6 h 16.9 +1030 2.4 -3.9 h 16.1 +1031 -2.1 -1.0 h 13.2 +1032 5.8 -9.6 h 7.4 +1033 -1.5 -3.3 h 1.7 +1034 9.3 26.9 h 0.3 +1035 -1.1 0.4 h 15.1 +1036 11.4 18.1 h 5.7 +1037 18.4 5.0 h 1.4 +1038 2.7 1.3 h 6.1 +1039 -1.6 3.1 h 10.3 +1040 -1.6 -3.0 h 14.4 +1041 19.0 -6.9 h 0.5 +1042 3.1 25.6 h 1.8 +1043 -2.0 3.2 h 1.4 +1044 6.0 -4.7 h 0.6 +1045 1.8 24.6 h 0.9 +1046 -2.3 26.2 h 11.0 +1047 7.8 -0.2 h 17.5 +1048 4.0 -0.2 h 8.7 +1049 4.8 4.7 h 8.1 +1050 9.2 -0.4 h 1.7 +1051 -8.1 23.3 h 9.0 +1052 -1.4 -1.7 h 16.4 +1053 -10.3 -10.2 h 11.8 +1054 6.7 -1.3 h 12.5 +1055 -2.1 5.6 h 17.2 +1056 -1.3 25.0 h 5.2 +1057 4.0 -6.7 h 22.4 +1058 4.8 -10.9 h 6.9 +1059 5.7 12.9 h 12.8 +1060 -9.2 -6.4 h 1.7 +1061 5.5 3.5 h 7.9 +1062 -7.9 -0.6 h 3.0 +1063 8.2 -12.5 h 1.0 +1064 9.9 -12.3 h 1.5 +1065 -0.9 28.6 h 8.3 +1066 -12.8 -3.2 h 5.7 +1067 -0.6 -12.5 h 3.8 +1068 37.0 -15.6 h 2.4 +1069 -3.8 -10.3 h 0.6 +1070 11.9 -10.1 h 29.8 +1071 -12.1 -1.6 h 1.0 +1072 4.7 -3.0 h 8.3 +1073 6.8 -1.8 h 1.6 +1074 -1.2 25.0 h 9.4 +1075 -14.2 -2.6 h 7.8 +1076 14.3 -5.6 h 6.8 +1077 12.7 -12.5 h 1.6 +1078 -6.0 4.8 h 10.5 +1079 10.4 -2.4 h 4.6 +1080 -5.5 21.8 h 5.1 +1081 7.0 3.5 h 6.6 +1082 5.5 -0.9 h 8.8 +1083 6.6 -4.2 h 9.3 +1084 13.7 7.6 h 8.4 +1085 0.5 -5.9 h 1.4 +1086 -34.9 -19.1 h 64.2 +1087 6.6 10.8 h 2.2 +1088 4.3 -14.2 h 3.3 +1089 12.3 -1.1 h 16.0 +1090 6.6 -18.7 h 0.9 +1091 -1.8 33.5 h 222.8 +1092 -2.0 -8.8 h 3.8 +1093 -12.2 0.7 h 5.8 +1094 -6.4 -4.8 h 0.0 +1095 18.0 40.1 h 48.2 +1096 19.8 0.3 h 1.7 +1097 8.8 -6.8 h 7.9 +1098 10.5 5.9 h 17.1 +1099 4.8 20.2 h 11.6 +1100 24.6 7.2 h 82.6 +1101 -7.6 5.7 h 3.4 +1102 2.1 -6.0 h 2.5 +1103 -22.9 -9.1 h 6.1 +1104 -6.8 -0.9 h 4.0 +1105 -3.9 -6.9 h 6.4 +1106 14.6 19.4 h 18.5 +1107 11.6 22.8 h 7.2 +1108 8.2 25.2 h 5.2 +1109 3.1 16.9 h 15.7 +1110 -27.0 -8.9 h 0.7 +1111 -18.9 23.4 h 0.1 +1112 4.5 2.3 h 14.3 +1113 30.9 -19.9 h 1.3 +1114 8.6 3.2 h 2.8 +1115 11.2 -20.4 h 25.7 +1116 -0.1 20.7 h 11.1 +1117 16.6 4.6 h 1.8 +1118 1.2 -0.4 h 0.7 +1119 3.4 -8.0 h 5.6 +1120 5.2 -10.9 h 3.4 +1121 7.7 -15.0 h 5.0 +1122 3.6 5.8 h 13.3 +1123 2.3 -7.1 h 5.2 +1124 0.2 -0.3 h 2.4 +1125 3.3 3.1 h 6.6 +1126 -11.2 10.3 h 3.3 +1127 -9.4 0.5 h 3.2 +1128 0.5 -11.9 h 9.0 +1129 2.9 -9.1 h 5.1 +1130 13.8 2.1 h 0.9 +1131 0.4 4.2 h 2.3 +1132 -4.0 -5.7 h 12.5 +1133 -0.5 -14.4 h 32.4 +1134 8.9 -2.6 h 4.7 +1135 -7.8 -13.2 h 0.7 +1136 -0.4 2.1 h 2.7 +1137 -6.5 21.6 h 3.5 +1138 3.0 27.6 h 1.8 +1139 8.2 -9.1 h 3.2 +1140 6.1 -14.4 h 0.1 +1141 -1.1 -13.1 h 2.2 +1142 8.4 -9.2 h 10.7 +1143 15.8 5.9 h 0.7 +1144 7.2 9.1 h 1.6 +1145 13.1 2.1 h 0.6 +1146 -3.7 7.7 h 3.2 +1147 8.2 1.5 h 3.4 +1148 4.7 -11.4 h 3.6 +1149 1.1 0.1 h 9.7 +1150 4.0 -11.8 h 5.5 +1151 5.3 1.5 h 5.2 +1152 18.4 -4.2 h 0.2 +1153 1.2 32.2 h 20.7 +1154 -2.1 6.8 h 7.3 +1155 7.6 -1.3 h 10.3 +1156 6.7 2.6 h 5.3 +1157 1.7 21.2 h 35.7 +1158 2.2 9.6 h 35.0 +1159 7.2 -8.7 h 1.2 +1160 5.0 3.9 h 0.1 +1161 1.6 1.4 h 2.3 +1162 9.2 -5.7 h 16.8 +1163 16.0 14.8 h 11.2 +1164 -16.4 40.4 h 0.7 +1165 -2.3 1.6 h 36.2 +1166 5.4 26.7 h 0.3 +1167 -17.2 -10.6 h 2.1 +1168 2.4 -1.7 h 0.5 +1169 0.4 4.9 h 9.5 +1170 -14.5 5.8 h 26.4 +1171 13.6 12.8 h 2.5 +1172 11.2 -9.0 h 3.1 +1173 8.5 -10.4 h 10.9 +1174 5.9 -11.5 h 4.1 +1175 7.1 -4.2 h 0.8 +1176 -3.4 1.0 h 8.6 +1177 20.7 -13.6 h 4.5 +1178 -4.0 17.8 h 5.2 +1179 16.0 8.3 h 15.8 +1180 7.3 36.0 h 3.0 +1181 7.8 -10.4 h 0.3 +1182 10.0 -8.4 h 10.3 +1183 76.4 59.5 h 0.1 +1184 17.1 26.9 h 3.2 +1185 -4.8 0.2 h 5.9 +1186 -2.3 -0.7 h 2.3 +1187 -6.0 1.1 h 1.3 +1188 -2.0 7.8 h 12.7 +1189 4.3 1.3 h 11.6 +1190 -1.9 5.3 h 8.8 +1191 4.1 -13.7 h 5.9 +1192 2.6 5.0 h 17.4 +1193 2.6 17.6 h 17.9 +1194 7.3 14.6 h 4.2 +1195 5.9 4.1 h 5.8 +1196 7.3 -1.7 h 10.5 +1197 3.6 0.8 h 8.0 +1198 -5.5 21.7 h 11.9 +1199 -4.3 14.7 h 9.3 +1200 0.1 -0.6 h 10.1 +1201 -5.2 -6.4 h 7.3 +1202 7.7 4.4 h 15.4 +1203 -19.7 6.3 h 6.3 +1204 3.3 -3.0 h 5.1 +1205 6.7 18.7 h 8.5 +1206 6.3 31.7 h 0.7 +1207 -17.0 17.1 h 1.3 +1208 -5.5 16.7 h 18.1 +1209 -13.5 -5.3 h 2.0 +1210 -3.0 -13.5 h 2.8 +1211 0.3 -9.5 h 7.2 +1212 5.7 -1.1 h 1.6 +1213 -0.1 -12.5 h 1.8 +1214 60.7 -9.5 h 0.5 +1215 2.1 7.5 h 14.2 +1216 4.9 22.3 h 0.5 +1217 -0.4 26.4 h 0.6 +1218 -10.0 0.6 h 4.0 +1219 -7.0 28.1 h 1.4 +1220 1.7 2.0 h 0.7 +1221 19.5 -3.4 h 1.4 +1222 6.5 -8.3 h 15.7 +1223 -5.0 4.5 h 6.7 +1224 1.1 1.0 h 0.3 +1225 0.5 3.5 h 7.8 +1226 4.5 -1.4 h 21.5 +1227 16.0 -3.9 h 18.5 +1228 11.7 8.2 h 2.1 +1229 13.8 28.5 h 44.2 +1230 10.0 -5.0 h 0.6 +1231 1.2 27.3 h 5.4 +1232 -4.0 -14.0 h 2.3 +1233 13.6 -4.7 h 0.6 +1234 4.8 -10.1 h 6.6 +1235 19.4 -8.7 h 2.9 +1236 13.3 10.9 h 1.2 +1237 -8.0 23.8 h 10.6 +1238 11.4 -5.4 h 9.9 +1239 -273.2 -20.4 h 42.1 +1240 5.1 20.9 h 0.8 +1241 15.8 -2.5 h 5.8 +1242 11.8 6.8 h 6.1 +1243 5.7 32.0 h 0.6 +1244 1.6 -0.2 h 14.9 +1245 5.5 -12.7 h 20.4 +1246 -6.1 21.1 h 1.3 +1247 7.0 7.8 h 5.4 +1248 13.2 -5.6 h 21.4 +1249 -0.5 -11.4 h 0.3 +1250 7.0 1.6 h 6.1 +1251 6.1 -6.6 h 78.9 +1252 0.8 3.1 h 5.8 +1253 -15.2 99.7 h 6.2 +1254 10.8 94.9 h 9.7 +1255 -32.4 72.8 h 0.7 +1256 39.2 59.4 h 18.2 +1257 2.4 47.6 h 65.4 +1258 -25.5 75.9 h 0.2 +1259 -1.0 77.5 h 2.8 +1260 19.1 91.4 h 0.6 +1261 3.1 91.8 h 0.6 +1262 -9.3 78.1 h 3.8 +1263 -3.3 22.2 h 64.7 +1264 -42.8 74.2 h 28.2 +1265 -13.3 61.0 h 30.9 +1266 -1.6 83.8 h 12.4 +1267 -19.5 67.6 h 4.7 +1268 -57.2 70.2 h 4.5 +1269 -5.7 81.6 h 1.7 +1270 12.3 74.8 h 0.1 +1271 -10.1 87.4 h 0.2 +1272 14.0 80.4 h 0.7 +1273 -15.6 53.2 h 40.8 +1274 44.2 109.5 h 1.1 +1275 -8.2 89.6 h 1.8 +1276 -78.7 68.7 h 4.9 +1277 1.6 79.4 h 2.0 +1278 11.1 85.7 h 3.4 +1279 -8.1 99.7 h 0.6 +1280 78.4 53.8 h 35.1 +1281 -39.7 66.5 h 0.4 +1282 -44.5 79.6 h 1.6 +1283 -18.4 70.1 h 0.4 +1284 9.9 21.8 h 76.5 +1285 -51.0 70.5 h 1.6 +1286 -44.0 84.1 h 0.4 +1287 10.5 69.3 h 13.0 +1288 -6.1 77.6 h 1.5 +1289 22.8 94.4 h 0.2 +1290 96.1 121.1 h 0.3 +1291 -76.8 80.9 h 5.7 +1292 18.2 82.0 h 0.2 +1293 12.7 80.6 h 0.3 +1294 -19.9 92.0 h 0.2 +1295 -48.0 57.2 h 0.3 +1296 68.7 85.0 h 2.6 +1297 100.5 29.2 h 0.8 +1298 1.6 84.9 h 0.3 +1299 0.9 60.3 h 25.1 +1300 -42.3 88.1 h 5.5 +1301 6.0 19.4 h 67.9 +1302 16.3 90.8 h 2.1 +1303 -36.3 77.0 h 1.0 +1304 -25.6 69.6 h 12.2 +1305 -5.5 83.9 h 4.3 +1306 -28.8 66.7 h 13.9 +1307 -50.8 64.8 h 1.1 +1308 -22.9 77.3 h 2.4 +1309 -5.7 79.6 h 0.5 +1310 -53.7 58.3 h 1.2 +1311 -12.1 93.9 h 0.1 +1312 18.0 98.6 h 0.4 +1313 -20.4 92.9 h 10.6 +1314 3.8 20.8 h 81.5 +1315 -8.9 54.9 h 26.0 +1316 -33.6 81.9 h 11.4 +1317 -19.4 86.8 h 3.2 +1318 14.8 76.1 h 0.7 +1319 11.8 -50.8 h 4.2 +1320 -0.8 -56.2 h 4.5 +1321 39.6 -40.5 h 14.7 +1322 -20.2 -69.5 h 2.4 +1323 9.1 -48.8 h 4.6 +1324 -0.9 -63.7 h 13.5 +1325 195.2 -155.7 h 56.6 +1326 18.6 -59.2 h 0.5 +1327 34.9 -78.3 h 0.3 +1328 11.2 -53.2 h 43.0 +1329 8.8 -59.0 h 9.2 +1330 0.9 -53.6 h 0.6 +1331 1.7 -69.9 h 0.5 +1332 29.1 -29.5 h 74.4 +1333 4.3 -52.3 h 16.1 +1334 -12.0 -62.7 h 157.7 +1335 5.8 -50.9 h 0.6 +1336 -1.8 -62.4 h 6.1 +1337 7.7 -61.8 h 10.9 +1338 -11.0 -66.6 h 4.0 +1339 15.6 -62.9 h 30.1 +1340 6.1 -45.5 h 0.3 +1341 -11.1 -73.8 h 83.8 +1342 48.0 -39.0 h 0.6 +1343 -5.3 -74.9 h 1.4 +1344 23.7 -47.9 h 0.7 +1345 4.7 -57.4 h 1.0 +1346 6.1 -62.1 h 48.5 +1347 -6.1 -71.4 h 0.5 +1348 -2.8 -56.4 h 25.1 +1349 4.6 -57.1 h 0.7 +1350 -19.7 -62.3 h 0.2 +1351 12.4 -48.0 h 0.1 +1352 -3.3 -46.9 h 1.8 +1353 12.1 -61.0 h 7.6 +1354 16.9 -66.3 h 0.9 +1355 40.4 -56.5 h 3.8 +1356 1.9 -57.7 h 0.4 +1357 -59.0 -109.1 h 76.7 +1358 0.4 -61.5 h 1.6 +1359 30.1 -48.3 h 0.1 +1360 -4.3 -59.5 h 0.9 +1361 1.5 -48.0 h 25.5 +1362 207.1 -30.8 h 109.7 +1363 9.7 -61.2 h 0.9 +1364 2.5 -51.2 h 7.5 +1365 -25.2 -77.4 h 0.6 +1366 17.3 -72.7 h 0.7 +1367 -2.4 -52.6 h 0.8 +1368 31.4 -57.7 h 0.2 +1369 13.8 -62.8 h 4.1 +1370 31.2 -59.4 h 26.0 +1371 -20.5 -60.9 h 151.9 +1372 -13.7 -54.9 h 0.7 +1373 0.7 -47.7 h 78.5 +1374 5.3 -52.1 h 0.6 +1375 14.7 -87.3 h 11.0 +1376 31.5 -85.4 h 3.0 +1377 -4.3 -61.9 h 0.3 +1378 10.0 -71.9 h 0.8 +1379 54.7 -66.8 h 3.9 +1380 -9.1 -48.8 h 0.1 +1381 6.1 -48.7 h 4.2 +1382 -4.8 -50.3 h 39.6 +1383 -8.5 -67.4 h 1.1 +1384 5.7 -55.1 h 5.5 +1385 39.1 -89.2 h 0.6 +1386 34.2 -60.2 h 29.2 +1387 16.6 -64.3 h 0.8 +1388 -2.1 -62.0 h 5.1 +1389 -1.3 -52.6 h 0.7 +1390 9.2 -61.1 h 8.3 +1391 20.6 -60.5 h 1.1 +1392 10.1 -66.8 h 6.9 +1393 -9.9 -58.5 h 9.4 +1394 9.2 -52.1 h 0.4 +1395 38.0 -27.4 h 3.6 +1396 -1.8 -63.1 h 1.0 +1397 11.6 -55.9 h 19.0 +1398 2.6 -36.5 h 64.8 +1399 -12.9 -46.7 h 1.9 +1400 7.2 -75.4 h 4.0 +1401 0.5 -50.1 h 17.7 +1402 15.4 -47.8 h 16.3 +1403 8.5 -51.7 h 12.4 +1404 -5.2 -51.6 h 10.7 +1405 -77.0 -17.5 h 141.6 +1406 33.7 -87.4 h 1.9 +1407 54.3 -41.4 h 82.3 +1408 2.0 -27.2 h 78.6 +1409 0.8 -18.4 h 56.8 +1410 -92.0 -40.5 h 2.5 +1411 17.5 -60.8 h 0.3 +1412 2.2 -41.8 h 27.1 +1413 -5.0 -61.2 h 1.6 +1414 33.8 -58.3 h 0.5 +1415 33.7 -54.6 h 12.4 +1416 -7.0 -52.7 h 9.5 +1417 -2.6 -53.1 h 27.3 +1418 19.6 -62.1 h 1.7 +1419 7.9 -67.8 h 0.6 +1420 5.3 -49.3 h 0.1 +1421 10.8 -70.5 h 2.7 +1422 -0.4 -60.3 h 4.4 +1423 3.0 -62.5 h 8.3 +1424 -11.5 -54.1 h 6.7 +1425 22.4 -52.5 h 19.1 +1426 10.4 -45.3 h 63.3 +1427 8.1 -82.7 h 10.0 +1428 -3.3 -55.2 h 0.5 +1429 15.6 -69.8 h 0.7 +1430 -4.8 -49.9 h 6.1 +1431 -12.5 -29.8 h 61.4 +1432 29.7 -36.9 h 40.4 +1433 18.6 -43.6 h 26.9 +1434 31.7 -58.3 h 0.6 +1435 16.6 -61.8 h 0.9 +1436 19.3 -61.9 h 0.2 +1437 1.7 -60.8 h 0.2 +1438 15.5 -51.8 h 14.2 +1439 13.3 -70.5 h 15.0 +1440 7.9 -64.6 h 10.2 +1441 4.1 -51.9 h 2.7 +1442 -11.4 -65.5 h 3.5 +1443 2.9 -45.8 h 24.8 +1444 -2.3 -57.8 h 5.3 +1445 -9.2 -25.2 h 17.0 +1446 5.8 -49.7 h 13.0 +1447 4.2 -57.1 h 21.7 +1448 -1.2 -37.4 h 5.8 +1449 12.1 -52.9 h 0.1 +1450 2.9 -49.4 h 0.9 +1451 49.3 -56.5 h 1.5 +1452 6.3 -58.3 h 20.9 +1453 -1.9 -47.3 h 8.4 +1454 12.8 -55.3 h 20.1 +1455 -1.5 3.7 h 229.4 +1456 -13.3 -13.6 h 4.0 +1457 -2.7 -1.9 h 2.2 +1458 -14.2 20.6 h 10.7 +1459 10.3 -24.7 h 4.6 +1460 4.3 -10.1 h 1.1 +1461 22.8 18.2 h 20.6 +1462 1.7 28.0 h 2.2 +1463 15.9 -0.9 h 6.9 +1464 -2.8 22.5 h 0.6 +1465 2.6 -0.9 h 1.1 +1466 -4.9 -8.2 h 18.3 +1467 -3.6 22.9 h 6.3 +1468 -5.1 15.9 h 4.7 +1469 0.0 -0.2 h 13.1 +1470 1.7 -5.7 h 4.4 +1471 -1.5 2.1 h 9.3 +1472 -0.3 -1.9 h 18.8 +1473 2.9 1.4 h 9.5 +1474 2.7 -6.6 h 0.5 +1475 -5.5 19.1 h 6.4 +1476 -0.0 -3.7 h 13.5 +1477 2.9 -4.3 h 9.4 +1478 10.0 -9.0 h 1.6 +1479 10.9 -5.1 h 3.8 +1480 -0.1 2.7 h 6.6 +1481 -4.1 1.9 h 6.6 +1482 9.1 1.9 h 8.3 +1483 9.0 10.6 h 3.3 +1484 -11.6 5.6 h 1.4 +1485 -11.9 26.8 h 0.6 +1486 1.5 2.1 h 12.9 +1487 1.8 -5.6 h 13.4 +1488 19.5 1.0 h 3.1 +1489 5.5 -1.8 h 5.8 +1490 0.5 -7.8 h 5.9 +1491 9.7 -4.1 h 2.8 +1492 2.5 8.9 h 14.2 +1493 12.5 -2.2 h 61.6 +1494 -3.2 -12.6 h 0.4 +1495 2.6 -0.8 h 30.4 +1496 7.2 1.3 h 12.4 +1497 2.9 1.1 h 4.5 +1498 24.0 -11.8 h 3.6 +1499 -26.3 -10.6 h 0.8 +1500 25.9 18.0 h 1.5 +1501 -13.6 30.3 h 0.1 +1502 3.4 -16.6 h 1.1 +1503 0.3 -6.6 h 7.6 +1504 2.4 -4.4 h 3.9 +1505 3.6 -1.0 h 11.6 +1506 0.8 8.2 h 9.3 +1507 -1.8 5.1 h 10.9 +1508 7.9 2.0 h 3.7 +1509 -11.6 -40.5 h 0.2 +1510 3.9 13.3 h 1.6 +1511 2.0 3.2 h 0.8 +1512 24.1 -4.3 h 21.1 +1513 -14.9 14.3 h 5.5 +1514 3.4 2.7 h 8.9 +1515 7.4 8.0 h 7.8 +1516 2.9 0.3 h 2.4 +1517 8.6 -8.3 h 2.9 +1518 0.8 7.9 h 2.0 +1519 5.3 -9.7 h 2.3 +1520 -13.2 27.1 h 1.5 +1521 4.0 -0.6 h 9.6 +1522 4.5 7.7 h 4.6 +1523 11.5 7.2 h 8.4 +1524 6.4 -6.4 h 12.2 +1525 -3.3 21.9 h 11.3 +1526 6.1 23.9 h 5.0 +1527 -3.1 26.9 h 19.8 +1528 -6.5 29.4 h 4.2 +1529 -0.6 4.9 h 8.3 +1530 -3.2 -2.6 h 13.5 +1531 -35.4 19.3 h 4.0 +1532 4.9 5.7 h 5.5 +1533 -1.8 -5.1 h 9.8 +1534 8.4 -2.2 h 10.4 +1535 2.6 -11.7 h 0.5 +1536 -1.8 -9.4 h 1.5 +1537 2.0 0.2 h 16.5 +1538 0.1 16.7 h 7.7 +1539 -7.6 8.1 h 9.9 +1540 -8.8 0.9 h 1.0 +1541 13.4 -6.0 h 9.3 +1542 0.4 3.5 h 2.3 +1543 5.6 23.0 h 11.4 +1544 3.7 -7.2 h 13.6 +1545 -23.6 17.7 h 0.5 +1546 -3.9 13.4 h 0.7 +1547 -3.1 -10.1 h 10.5 +1548 5.0 -0.2 h 29.1 +1549 6.5 17.6 h 5.1 +1550 10.3 3.2 h 4.5 +1551 14.1 -11.2 h 0.8 +1552 3.7 -1.5 h 6.2 +1553 4.5 27.0 h 0.8 +1554 -3.3 -4.3 h 64.4 +1555 0.6 -4.9 h 7.0 +1556 8.0 -6.0 h 74.8 +1557 4.1 -1.0 h 4.1 +1558 58.6 -3.1 h 4.3 +1559 -12.0 -13.9 h 5.3 +1560 -295.5 15.4 h 10.7 +1561 -36.4 -12.1 h 246.1 +1562 -18.7 11.6 h 2.1 +1563 17.8 28.5 h 1.2 +1564 8.0 5.4 h 8.1 +1565 -13.7 28.9 h 0.9 +1566 0.3 -3.9 h 6.0 +1567 5.2 21.5 h 1.4 +1568 7.3 -0.4 h 5.2 +1569 22.5 24.4 h 0.3 +1570 0.6 -8.0 h 13.5 +1571 2.7 5.4 h 21.3 +1572 -5.0 23.3 h 0.3 +1573 5.7 -10.0 h 2.8 +1574 -0.6 -4.0 h 3.8 +1575 6.7 21.1 h 13.8 +1576 12.8 4.9 h 2.6 +1577 -2.5 -12.9 h 0.9 +1578 -7.5 -0.9 h 12.8 +1579 4.8 29.0 h 13.7 +1580 19.2 -6.0 h 1.5 +1581 -0.6 5.5 h 5.2 +1582 -3.8 4.8 h 0.6 +1583 -0.9 21.5 h 2.7 +1584 -0.1 29.1 h 0.6 +1585 -3.6 -5.7 h 5.2 +1586 -2.2 -11.4 h 3.8 +1587 8.1 17.4 h 4.8 +1588 9.3 -4.6 h 3.6 +1589 5.8 25.6 h 1.0 +1590 18.9 0.2 h 8.8 +1591 11.7 3.0 h 11.9 +1592 3.6 -9.6 h 13.7 +1593 -5.9 -9.4 h 2.2 +1594 -3.3 -0.4 h 12.8 +1595 10.8 -7.8 h 6.6 +1596 9.4 -8.9 h 3.2 +1597 11.6 -0.6 h 3.0 +1598 -19.2 4.1 h 10.1 +1599 18.3 13.5 h 2.7 +1600 -9.2 -0.6 h 8.2 +1601 6.0 -9.5 h 5.1 +1602 5.9 -9.5 h 20.9 +1603 9.0 -8.5 h 10.3 +1604 4.1 27.3 h 0.1 +1605 13.6 -5.0 h 6.3 +1606 5.9 -7.1 h 9.3 +1607 0.3 -5.8 h 0.3 +1608 1.5 4.6 h 7.3 +1609 20.0 12.9 h 0.5 +1610 4.8 3.5 h 9.2 +1611 10.8 20.6 h 6.1 +1612 8.4 8.4 h 2.9 +1613 4.5 -65.8 h 0.9 +1614 12.9 -53.6 h 9.7 +1615 4.2 -64.1 h 0.3 +1616 2.4 -54.9 h 0.1 +1617 -7.1 -68.5 h 0.6 +1618 -6.3 -56.8 h 20.2 +1619 3.3 -45.7 h 20.8 +1620 8.3 -47.0 h 24.6 +1621 -12.5 -37.6 h 10.3 +1622 2.5 -59.5 h 0.8 +1623 -44.4 -87.8 h 0.0 +1624 -4.0 -54.8 h 18.9 +1625 36.5 -76.2 h 3.8 +1626 5.6 -40.8 h 11.2 +1627 2.0 -43.2 h 2.4 +1628 -3.0 -57.3 h 0.6 +1629 6.7 -69.7 h 4.0 +1630 7.2 -76.4 h 3.6 +1631 -18.4 -90.2 h 0.4 +1632 -16.0 -82.9 h 16.2 +1633 -3.6 -61.0 h 0.6 +1634 19.1 -82.9 h 2.0 +1635 13.8 -48.5 h 1.6 +1636 8.2 -101.8 h 0.8 +1637 14.2 -56.8 h 10.9 +1638 14.4 -48.4 h 24.3 +1639 -1.0 -48.8 h 29.1 +1640 -17.4 -59.4 h 8.6 +1641 0.7 -48.6 h 41.9 +1642 14.5 -47.9 h 0.5 +1643 -21.6 -56.3 h 6.7 +1644 -5.8 -63.2 h 3.7 +1645 -8.2 -47.1 h 18.3 +1646 10.5 -55.2 h 22.5 +1647 -3.8 -55.9 h 35.4 +1648 7.6 -82.2 h 1.1 +1649 -8.7 85.0 h 1.2 +1650 -1.5 91.4 h 0.5 +1651 -25.1 81.8 h 0.2 +1652 -24.3 84.1 h 1.2 +1653 -11.9 70.3 h 21.5 +1654 -65.6 49.8 h 5.8 +1655 -27.0 88.4 h 0.0 +1656 -9.6 75.5 h 8.9 +1657 -12.8 94.8 h 1.2 +1658 6.1 90.3 h 0.9 +1659 -8.9 78.9 h 1.7 +1660 -10.9 83.9 h 0.4 +1661 -13.3 87.4 h 1.3 +1662 -31.4 68.0 h 13.4 +1663 16.4 -5.4 h 2.4 +1664 0.4 -11.0 h 12.0 +1665 12.4 -3.8 h 9.1 +1666 5.5 -1.7 h 1.9 +1667 -5.6 7.5 h 5.2 +1668 7.4 -13.4 h 1.2 +1669 -7.2 4.1 h 1.8 +1670 5.1 0.1 h 9.9 +1671 -15.9 -1.7 h 0.8 +1672 4.6 -7.6 h 9.4 +1673 10.9 -2.9 h 2.4 +1674 10.0 -6.8 h 22.4 +1675 -0.3 -6.5 h 15.8 +1676 -1.4 5.3 h 0.4 +1677 18.4 -4.3 h 3.4 +1678 4.8 26.2 h 9.0 +1679 2.5 -9.8 h 3.7 +1680 4.8 16.8 h 9.2 +1681 -1.7 -9.9 h 10.7 +1682 1.9 -11.4 h 4.6 +1683 2.4 -7.2 h 1.0 +1684 3.8 0.9 h 5.8 +1685 -10.0 -73.5 h 2.7 +1686 -5.0 -51.0 h 19.7 +1687 5.4 26.4 h 55.4 +1688 2.3 78.2 h 4.9 +1689 -15.2 92.2 h 1.3 +1690 -19.2 81.0 h 5.0 +1691 1.6 53.9 h 28.3 +1692 -46.7 62.9 h 2.2 +1693 12.1 88.7 h 0.2 +1694 29.5 42.4 h 46.5 +1695 -2.8 31.1 h 50.1 +1696 -15.0 90.0 h 4.9 +1697 -5.1 46.7 h 36.1 +1698 -4.9 71.0 h 61.4 +1699 -14.6 96.7 h 1.0 +1700 -32.7 96.9 h 10.8 +1701 10.0 -40.2 h 10.5 +1702 6.0 -51.8 h 0.3 +1703 9.1 -59.3 h 4.9 +1704 4.5 -11.7 h 3.3 +1705 -7.0 22.9 h 17.4 +1706 4.7 -3.8 h 7.8 +1707 9.5 -9.1 h 3.0 +1708 35.8 25.5 h 1.5 +1709 29.1 11.1 h 1.0 +1710 -0.2 -2.0 h 40.6 +1711 -1.2 -9.3 h 2.8 +1712 -5.4 -7.7 h 13.4 +1713 9.9 -10.7 h 7.7 +1714 8.3 -9.9 h 13.2 +1715 -1.2 -3.4 h 6.8 +1716 3.1 0.9 h 5.2 +1717 5.0 -10.2 h 4.3 +1718 5.0 4.2 h 4.2 +1719 -10.5 4.8 h 24.7 +1720 1.6 -1.6 h 1.0 +1721 13.4 -1.6 h 21.6 +1722 3.7 -2.2 h 1.7 +1723 1.5 -6.5 h 2.9 +1724 -5.6 24.5 h 5.1 +1725 -2.8 -12.8 h 4.9 +1726 8.8 -0.8 h 14.3 +1727 0.1 4.1 h 11.3 +1728 6.8 -1.5 h 10.4 +1729 11.5 17.8 h 1.9 +1730 -26.3 -10.6 h 0.2 +1731 -0.1 6.9 h 4.6 +1732 5.7 23.3 h 0.1 +1733 29.0 12.7 h 0.2 +1734 37.4 -11.5 h 57.7 +1735 -9.0 63.3 h 53.8 +1736 1.6 11.6 h 1.6 +1737 -14.8 -64.6 h 2.1 +1738 21.3 -77.5 h 0.5 +1739 36.2 -52.2 h 0.7 diff --git a/examples/platforms/nancy.xml b/examples/platforms/nancy.xml new file mode 100644 index 0000000000..f21a9b160a --- /dev/null +++ b/examples/platforms/nancy.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/simdag/dot/dot_test.c b/examples/simdag/dot/dot_test.c index ac12b0085f..c441405feb 100644 --- a/examples/simdag/dot/dot_test.c +++ b/examples/simdag/dot/dot_test.c @@ -22,7 +22,7 @@ int main(int argc, char **argv) unsigned int cursor; SD_task_t task; - /* initialisation of SD */ + /* initialization of SD */ SD_init(&argc, argv); /* Check our arguments */ diff --git a/examples/simdag/goal/CMakeLists.txt b/examples/simdag/goal/CMakeLists.txt new file mode 100644 index 0000000000..941fc7d548 --- /dev/null +++ b/examples/simdag/goal/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.6) + +set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + +add_executable(goal_test goal_test.c) + +### Add definitions for compile +if(NOT WIN32) +target_link_libraries(goal_test simgrid pthread m ) +else(NOT WIN32) +target_link_libraries(goal_test simgrid) +endif(NOT WIN32) diff --git a/examples/simdag/goal/goal_test.c b/examples/simdag/goal/goal_test.c new file mode 100644 index 0000000000..e35e30ef22 --- /dev/null +++ b/examples/simdag/goal/goal_test.c @@ -0,0 +1,95 @@ +/* GOAL loader prototype. Not ready for public usage yet */ + +/* Copyright (c) 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include +#include "simdag/simdag.h" +#include "xbt/log.h" +#include "xbt/ex.h" +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(goal, "The GOAL loader into SimDag"); + +typedef struct { + int i, j, k; +} s_bcast_task_t,*bcast_task_t; + + +const SD_workstation_t* ws_list; +int count = 0; + +xbt_dynar_t reclaimed; + +static void send_one(int from, int to) { + //XBT_DEBUG("send_one(%d, %d)",from,to); + + if (count %100000 == 0) + XBT_INFO("Sending task #%d",count); + count++; + + bcast_task_t bt; + if (xbt_dynar_length(reclaimed)>0) { + bt = xbt_dynar_pop_as(reclaimed,bcast_task_t); + } else { + bt = xbt_new(s_bcast_task_t,1); + } + bt->i=from; + bt->j=(from+to)/2; + bt->k=to; + + SD_task_t task = SD_task_create_comm_e2e("Blab",bt,424242); + + XBT_DEBUG("Schedule task between %d and %d",bt->i,bt->j); + SD_task_schedulel(task,2,ws_list[bt->i],ws_list[bt->j]); + SD_task_watch(task,SD_DONE); +} + + +int main(int argc, char **argv) { + + /* initialization of SD */ + SD_init(&argc, argv); + + if (argc > 1) { + SD_create_environment(argv[1]); + } else { + SD_create_environment("../../platforms/One_cluster_no_backbone.xml"); + } + + ws_list = SD_workstation_get_list(); + reclaimed = xbt_dynar_new(sizeof(bcast_task_t),NULL); + xbt_dynar_t done = NULL; + send_one(0,262144); + do { + if (done != NULL && xbt_dynar_length(done) > 0) { + unsigned int cursor; + SD_task_t task; + + xbt_dynar_foreach(done, cursor, task) { + bcast_task_t bt = SD_task_get_data(task); + + if (bt->i != bt->j -1) + send_one(bt->i,bt->j); + if (bt->j != bt->k -1) + send_one(bt->j,bt->k); + + if (xbt_dynar_length(reclaimed)<100) { + xbt_dynar_push_as(reclaimed,bcast_task_t,bt); + } else { + free(bt); + } + SD_task_destroy(task); + } + xbt_dynar_free(&done); + } + done=SD_simulate(-1); + } while(xbt_dynar_length(done) > 0); + + SD_exit(); + return 0; +} diff --git a/examples/simdag/scheduling/CMakeLists.txt b/examples/simdag/scheduling/CMakeLists.txt index e112e4a4dd..ab001df921 100644 --- a/examples/simdag/scheduling/CMakeLists.txt +++ b/examples/simdag/scheduling/CMakeLists.txt @@ -10,3 +10,9 @@ target_link_libraries(minmin_test simgrid pthread m) else(NOT WIN32) target_link_libraries(minmin_test simgrid) endif(NOT WIN32) + +## Clean generated files +get_directory_property(extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES) +set_directory_properties( + PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/Montage_25.jed;") diff --git a/examples/simdag/scheduling/minmin_test.c b/examples/simdag/scheduling/minmin_test.c index 08d324ed88..089066555b 100644 --- a/examples/simdag/scheduling/minmin_test.c +++ b/examples/simdag/scheduling/minmin_test.c @@ -80,7 +80,6 @@ static double finish_on_at(SD_task_t task, SD_workstation_t workstation) SD_task_t parent, grand_parent; xbt_dynar_t parents, grand_parents; - int grand_parent_nworkstations; SD_workstation_t *grand_parent_workstation_list; parents = SD_task_get_parents(task); @@ -100,8 +99,6 @@ static double finish_on_at(SD_task_t task, SD_workstation_t workstation) } xbt_dynar_get_cpy(grand_parents, 0, &grand_parent); - grand_parent_nworkstations = - SD_task_get_workstation_count(grand_parent); grand_parent_workstation_list = SD_task_get_workstation_list(grand_parent); /* Estimate the redistribution time from this parent */ @@ -236,7 +233,7 @@ static void output_xml(FILE * out, xbt_dynar_t dax) int main(int argc, char **argv) { - unsigned int cursor, selected_idx = 0; + unsigned int cursor; double finish_time, min_finish_time = -1.0; SD_task_t task, selected_task = NULL; xbt_dynar_t ready_tasks; @@ -314,7 +311,6 @@ int main(int argc, char **argv) min_finish_time = finish_time; selected_task = task; selected_workstation = workstation; - selected_idx = cursor; } } diff --git a/examples/smpi/NAS/EP-sampling/Makefile b/examples/smpi/NAS/EP-sampling/Makefile new file mode 100644 index 0000000000..6205cb4ae2 --- /dev/null +++ b/examples/smpi/NAS/EP-sampling/Makefile @@ -0,0 +1,28 @@ +SHELL=/bin/sh +BENCHMARK=ep +BENCHMARKU=EP + +include ../config/make.def + +#OBJS = ep.o ${COMMON}/print_results.o ${COMMON}/${RAND}.o ${COMMON}/timers.o +OBJS = ep.o randlc.o + +include ../sys/make.common + +${PROGRAM}: config ${OBJS} +# ${FLINK} ${FLINKFLAGS} -o ${PROGRAM} ${OBJS} ${FMPI_LIB} + ${CLINK} ${CLINKFLAGS} -o ${PROGRAM} ${OBJS} ${CMPI_LIB} + + +#ep.o: ep.f mpinpb.h npbparams.h +# ${FCOMPILE} ep.f + +ep.o: ep.c randlc.c ../EP/mpinpb.h npbparams.h + ${CCOMPILE} ep.c + +clean: + - rm -f *.o *~ + - rm -f npbparams.h core + + + diff --git a/examples/smpi/NAS/EP-sampling/ep.c b/examples/smpi/NAS/EP-sampling/ep.c index 41de955d7b..71e0f89146 100644 --- a/examples/smpi/NAS/EP-sampling/ep.c +++ b/examples/smpi/NAS/EP-sampling/ep.c @@ -246,7 +246,7 @@ k_offset = no_large_nodes*(np+1) + (node-no_large_nodes)*np -1; int stop = false; - for(k = 1; k <= np; k++) SMPI_SAMPLE_LOCAL(0.25 * np) { + for(k = 1; k <= np; k++) SMPI_SAMPLE_LOCAL(0.25 * np, 0.03) { stop = false; kk = k_offset + k ; t1 = s; diff --git a/examples/smpi/smpi_traced.tesh b/examples/smpi/smpi_traced.tesh index df78df9f7f..75c4f20aa7 100644 --- a/examples/smpi/smpi_traced.tesh +++ b/examples/smpi/smpi_traced.tesh @@ -2,7 +2,7 @@ # (since we want to pass it to the child, it has to be redefined before each command) # Go for the first test p Test instrumentation of SMPI -$ ../../bin/smpirun -trace smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/small_platform_with_routers.xml -np 3 ./smpi_traced +$ ../../bin/smpirun -trace -trace-resource -trace-file smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../msg/tracing/platform.xml -np 3 ./smpi_traced > [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 'TCP_gamma' to '4194304' @@ -12,3 +12,5 @@ $ ../../bin/smpirun -trace smpi_traced.trace -hostfile ${srcdir:=.}/hostfile -pl > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/categorized' to '1' > [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/uncategorized' to '1' > [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) + +$ rm -f smpi_traced.trace diff --git a/include/gras/process.h b/include/gras/process.h index 90777142a4..5cf7a16e18 100644 --- a/include/gras/process.h +++ b/include/gras/process.h @@ -21,7 +21,7 @@ SG_BEGIN_DECL() void gras_agent_spawn(const char *name, xbt_main_func_t code, int argc, char *argv[], xbt_dict_t properties); -/** }@ */ +/** @} */ /****************************************************************************/ /* Manipulating User Data */ diff --git a/include/instr/instr.h b/include/instr/instr.h index 156a684932..7a7669260c 100644 --- a/include/instr/instr.h +++ b/include/instr/instr.h @@ -12,94 +12,95 @@ #ifdef HAVE_TRACING #include "xbt.h" +#include "xbt/graph.h" #include "msg/msg.h" #include "simdag/simdag.h" XBT_PUBLIC(void) TRACE_category(const char *category); XBT_PUBLIC(void) TRACE_category_with_color (const char *category, const char *color); -XBT_PUBLIC(void) TRACE_msg_set_task_category(m_task_t task, - const char *category); -void TRACE_msg_set_process_category(m_process_t process, const char *category, const char *color); -XBT_PUBLIC(void) TRACE_user_host_variable(double time, - const char *variable, - double value, const char *what); -XBT_PUBLIC(void) TRACE_user_link_variable(double time, const char *resource, - const char *variable, - double value, const char *what); -XBT_PUBLIC(void) TRACE_declare_mark(const char *mark_type); -XBT_PUBLIC(void) TRACE_mark(const char *mark_type, const char *mark_value); +XBT_PUBLIC(void) TRACE_msg_set_task_category(m_task_t task, const char *category); +XBT_PUBLIC(void) TRACE_msg_set_process_category(m_process_t process, const char *category, const char *color); XBT_PUBLIC(void) TRACE_smpi_set_category(const char *category); -XBT_PUBLIC(void) TRACE_sd_set_task_category(SD_task_t task, - const char *category); - -#define TRACE_host_variable_declare(var) \ - TRACE_user_host_variable(0,var,0,"declare"); - -#define TRACE_host_variable_set_with_time(time,var,value) \ - TRACE_user_host_variable(time,var,value,"set"); - -#define TRACE_host_variable_add_with_time(time,var,value) \ - TRACE_user_host_variable(time,var,value,"add"); - -#define TRACE_host_variable_sub_with_time(time,var,value) \ - TRACE_user_host_variable(time,var,value,"sub"); - -#define TRACE_host_variable_set(var,value) \ - TRACE_user_host_variable(MSG_get_clock(),var,value,"set"); - -#define TRACE_host_variable_add(var,value) \ - TRACE_user_host_variable(MSG_get_clock(),var,value,"add"); - -#define TRACE_host_variable_sub(var,value) \ - TRACE_user_host_variable(MSG_get_clock(),var,value,"sub"); - -#define TRACE_link_variable_declare(var) \ - TRACE_user_link_variable(0,NULL,NULL,var,0,"declare"); - -#define TRACE_link_variable_set_with_time(time,link,var,value) \ - TRACE_user_link_variable(time,link,var,value,"set"); - -#define TRACE_link_variable_add_with_time(time,link,var,value) \ - TRACE_user_link_variable(time,link,var,value,"add"); +XBT_PUBLIC(void) TRACE_sd_set_task_category(SD_task_t task, const char *category); -#define TRACE_link_variable_sub_with_time(time,link,var,value) \ - TRACE_user_link_variable(time,link,var,value,"sub"); +XBT_PUBLIC(void) TRACE_declare_mark(const char *mark_type); +XBT_PUBLIC(void) TRACE_mark(const char *mark_type, const char *mark_value); -#define TRACE_link_variable_set(link,var,value) \ - TRACE_user_link_variable(MSG_get_clock(),link,var,value,"set"); +XBT_PUBLIC(const char *) TRACE_node_name (xbt_node_t node); +XBT_PUBLIC(xbt_graph_t) TRACE_platform_graph (void); +XBT_PUBLIC(void) TRACE_platform_graph_export_graphviz (xbt_graph_t g, const char *filename); + +/* + * User-variables related functions + */ +/* for host variables */ +XBT_PUBLIC(void) TRACE_host_variable_declare (const char *var); +XBT_PUBLIC(void) TRACE_host_variable_declare_with_color (const char *var, const char *color); +XBT_PUBLIC(void) TRACE_host_variable_set (const char *host, const char *variable, double value); +XBT_PUBLIC(void) TRACE_host_variable_add (const char *host, const char *variable, double value); +XBT_PUBLIC(void) TRACE_host_variable_sub (const char *host, const char *variable, double value); +XBT_PUBLIC(void) TRACE_host_variable_set_with_time (double time, const char *host, const char *variable, double value); +XBT_PUBLIC(void) TRACE_host_variable_add_with_time (double time, const char *host, const char *variable, double value); +XBT_PUBLIC(void) TRACE_host_variable_sub_with_time (double time, const char *host, const char *variable, double value); + +/* for link variables */ +XBT_PUBLIC(void) TRACE_link_variable_declare (const char *var); +XBT_PUBLIC(void) TRACE_link_variable_declare_with_color (const char *var, const char *color); +XBT_PUBLIC(void) TRACE_link_variable_set (const char *link, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_variable_add (const char *link, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_variable_sub (const char *link, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_variable_set_with_time (double time, const char *link, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_variable_add_with_time (double time, const char *link, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_variable_sub_with_time (double time, const char *link, const char *variable, double value); + +/* for link variables, but with src and dst used for get_route */ +XBT_PUBLIC(void) TRACE_link_srcdst_variable_set (const char *src, const char *dst, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_srcdst_variable_add (const char *src, const char *dst, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_srcdst_variable_sub (const char *src, const char *dst, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_srcdst_variable_set_with_time (double time, const char *src, const char *dst, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_srcdst_variable_add_with_time (double time, const char *src, const char *dst, const char *variable, double value); +XBT_PUBLIC(void) TRACE_link_srcdst_variable_sub_with_time (double time, const char *src, const char *dst, const char *variable, double value); -#define TRACE_link_variable_add(link,var,value) \ - TRACE_user_link_variable(MSG_get_clock(),link,var,value,"add"); +#else /* HAVE_TRACING */ -#define TRACE_link_variable_sub(link,var,value) \ - TRACE_user_link_variable(MSG_get_clock(),link,var,value,"sub"); +#define TRACE_category(category) +#define TRACE_category_with_color(category,color) +#define TRACE_msg_set_task_category(task,category) +#define TRACE_msg_set_process_category(process,category,color) +#define TRACE_smpi_set_category(category) +#define TRACE_sd_set_task_category(task,category) -#else /* HAVE_TRACING */ +#define TRACE_declare_mark(mark_type) +#define TRACE_mark(mark_type,mark_value) -#define TRACE_category(cat) -#define TRACE_category_with_color(cat,color) -#define TRACE_msg_set_task_category(task,cat) -#define TRACE_msg_set_process_category(proc,cat,color) -#define TRACE_set_mask(mask) +#define TRACE_node_name(node) +#define TRACE_platform_graph(void) +#define TRACE_platform_graph_export_graphviz(g,filename) #define TRACE_host_variable_declare(var) -#define TRACE_host_variable_set_with_time(time,var,value) -#define TRACE_host_variable_add_with_time(time,var,value) -#define TRACE_host_variable_sub_with_time(time,var,value) -#define TRACE_host_variable_set(var,value) -#define TRACE_host_variable_add(var,value) -#define TRACE_host_variable_sub(var,value) +#define TRACE_host_variable_declare_with_color(var,color) +#define TRACE_host_variable_set(host,var,value) +#define TRACE_host_variable_add(host,var,value) +#define TRACE_host_variable_sub(host,var,value) +#define TRACE_host_variable_set_with_time(time,host,var,value) +#define TRACE_host_variable_add_with_time(time,host,var,value) +#define TRACE_host_variable_sub_with_time(time,host,var,value) + #define TRACE_link_variable_declare(var) -#define TRACE_link_variable_set_with_time(time,link,var,value) -#define TRACE_link_variable_add_with_time(time,link,var,value) -#define TRACE_link_variable_sub_with_time(time,link,var,value) +#define TRACE_link_variable_declare_with_color(var,color) #define TRACE_link_variable_set(link,var,value) #define TRACE_link_variable_add(link,var,value) #define TRACE_link_variable_sub(link,var,value) -#define TRACE_declare_mark(type) -#define TRACE_mark(type,value) -#define TRACE_smpi_set_category(cat) -#define TRACE_sd_set_task_category(task,cat) +#define TRACE_link_variable_set_with_time(time,link,var,value) +#define TRACE_link_variable_add_with_time(time,link,var,value) +#define TRACE_link_variable_sub_with_time(time,link,var,value) + +#define TRACE_link_srcdst_variable_set(src,dst,var,value) +#define TRACE_link_srcdst_variable_add(src,dst,var,value) +#define TRACE_link_srcdst_variable_sub(src,dst,var,value) +#define TRACE_link_srcdst_variable_set_with_time(time,src,dst,var,value) +#define TRACE_link_srcdst_variable_add_with_time(time,src,dst,var,value) +#define TRACE_link_srcdst_variable_sub_with_time(time,src,dst,var,value) #endif /* HAVE_TRACING */ diff --git a/include/msg/msg.h b/include/msg/msg.h index b982de17df..c35cbed858 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -31,7 +31,7 @@ XBT_PUBLIC(void) MSG_set_function(const char *host_id, const char *function_name, xbt_dynar_t arguments); -XBT_INLINE XBT_PUBLIC(double) MSG_get_clock(void); +XBT_PUBLIC(double) MSG_get_clock(void); XBT_PUBLIC(unsigned long int) MSG_get_sent_msg(void); @@ -44,6 +44,7 @@ XBT_PUBLIC(int) MSG_get_host_msgload(m_host_t host); /* int MSG_get_msgload(void); This function lacks specification; discard it */ XBT_PUBLIC(double) MSG_get_host_speed(m_host_t h); XBT_PUBLIC(int) MSG_host_is_avail(m_host_t h); +XBT_PUBLIC(void) __MSG_host_destroy(m_host_t host); /*property handlers*/ XBT_PUBLIC(xbt_dict_t) MSG_host_get_properties(m_host_t host); diff --git a/include/simdag/datatypes.h b/include/simdag/datatypes.h index c2ecb0fdb1..961e1fed6d 100644 --- a/include/simdag/datatypes.h +++ b/include/simdag/datatypes.h @@ -80,7 +80,7 @@ typedef enum { @see SD_task_management */ typedef enum { - SD_TASK_NOT_TYPED = 0, /**< @no specified type */ + SD_TASK_NOT_TYPED = 0, /**< @brief no specified type */ SD_TASK_COMM_E2E = 1, /**< @brief end to end communication */ SD_TASK_COMP_SEQ = 2, /**< @brief sequential computation */ } e_SD_task_kind_t; diff --git a/include/simgrid_config.h.in b/include/simgrid_config.h.in index 8006704efa..4c1feb7d61 100644 --- a/include/simgrid_config.h.in +++ b/include/simgrid_config.h.in @@ -125,5 +125,9 @@ XBT_PUBLIC(char *) bprintf(const char *fmt, ...) _XBT_GNUC_PRINTF(1, 2); /* Tracking of latency bound */ #cmakedefine HAVE_LATENCY_BOUND_TRACKING @HAVE_LATENCY_BOUND_TRACKING@ +/* If __thread is available */ +#cmakedefine HAVE_THREAD_LOCAL_STORAGE @HAVE_THREAD_LOCAL_STORAGE@ + + SG_END_DECL() #endif /* SIMGRID_PUBLIC_CONFIG_H */ diff --git a/include/simix/context.h b/include/simix/context.h index 055fa3b81e..98512e234a 100644 --- a/include/simix/context.h +++ b/include/simix/context.h @@ -36,7 +36,6 @@ typedef void (*smx_pfn_context_suspend_t) (smx_context_t context); typedef void (*smx_pfn_context_runall_t) (xbt_dynar_t processes); typedef smx_context_t (*smx_pfn_context_self_t) (void); typedef void* (*smx_pfn_context_get_data_t) (smx_context_t context); -typedef int (*smx_pfn_context_get_thread_id) (void); /* interface of the context factories */ typedef struct s_smx_context_factory { @@ -49,7 +48,6 @@ typedef struct s_smx_context_factory { smx_pfn_context_runall_t runall; smx_pfn_context_self_t self; smx_pfn_context_get_data_t get_data; - smx_pfn_context_get_thread_id get_thread_id; } s_smx_context_factory_t; @@ -60,7 +58,7 @@ extern smx_ctx_factory_initializer_t smx_factory_initializer_to_use; extern char* smx_context_factory_name; extern int smx_context_stack_size; -#ifdef CONTEXT_THREADS +#ifdef HAVE_THREAD_LOCAL_STORAGE extern __thread smx_context_t smx_current_context; #else extern smx_context_t smx_current_context; @@ -72,7 +70,7 @@ extern smx_context_t smx_current_context; /* the following function pointers types describe the interface that all context concepts must implement */ /* each context type derive from this structure, so they must contain this structure - * at their begining -- OOP in C :/ */ + * at their beginning -- OOP in C :/ */ typedef struct s_smx_context { s_xbt_swag_hookup_t hookup; xbt_main_func_t code; @@ -97,7 +95,6 @@ void smx_ctx_base_free(smx_context_t context); void smx_ctx_base_stop(smx_context_t context); smx_context_t smx_ctx_base_self(void); void *smx_ctx_base_get_data(smx_context_t context); -int smx_ctx_base_get_thread_id(void); /* parallelism */ XBT_INLINE void SIMIX_context_set_nthreads(int nb_threads); diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index aac82f0384..ce54b091d5 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -23,6 +23,7 @@ SG_BEGIN_DECL() #define MPI_THREAD_MULTIPLE 3 //FIXME: check values #define MPI_MAX_PROCESSOR_NAME 100 +#define MPI_MAX_NAME_STRING 100 #define MPI_MAX_ERROR_STRING 100 #define MPI_MAX_DATAREP_STRIN 100 #define MPI_MAX_INFO_KEY 100 @@ -208,6 +209,7 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Group_range_excl, MPI_CALL(XBT_PUBLIC(int), MPI_Comm_rank, (MPI_Comm comm, int *rank)); MPI_CALL(XBT_PUBLIC(int), MPI_Comm_size, (MPI_Comm comm, int *size)); +MPI_CALL(XBT_PUBLIC(int), MPI_Comm_get_name, (MPI_Comm comm, char* name, int* len)); MPI_CALL(XBT_PUBLIC(int), MPI_Get_processor_name, (char *name, int *resultlen)); MPI_CALL(XBT_PUBLIC(int), MPI_Get_count, (MPI_Status * status, MPI_Datatype datatype, @@ -220,6 +222,7 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Comm_dup, (MPI_Comm comm, MPI_Comm * newcomm)); MPI_CALL(XBT_PUBLIC(int), MPI_Comm_create, (MPI_Comm comm, MPI_Group group, MPI_Comm * newcomm)); MPI_CALL(XBT_PUBLIC(int), MPI_Comm_free, (MPI_Comm * comm)); +MPI_CALL(XBT_PUBLIC(int), MPI_Comm_disconnect, (MPI_Comm * comm)); MPI_CALL(XBT_PUBLIC(int), MPI_Comm_split, (MPI_Comm comm, int color, int key, MPI_Comm* comm_out)); MPI_CALL(XBT_PUBLIC(int), MPI_Send_init, @@ -441,6 +444,13 @@ XBT_PUBLIC(void *) smpi_shared_malloc(size_t size, const char *file, XBT_PUBLIC(void) smpi_shared_free(void *data); #define SMPI_SHARED_FREE(data) smpi_shared_free(data) +XBT_PUBLIC(int) smpi_shared_known_call(const char* func, const char* input); +XBT_PUBLIC(void*) smpi_shared_get_call(const char* func, const char* input); +XBT_PUBLIC(void*) smpi_shared_set_call(const char* func, const char* input, void* data); +#define SMPI_SHARED_CALL(func, input, ...) \ + (smpi_shared_known_call(#func, input) ? smpi_shared_get_call(#func, input) \ + : smpi_shared_set_call(#func, input, func(__VA_ARGS__))) + /* Fortran specific stuff */ XBT_PUBLIC(int) MAIN__(void); diff --git a/include/surf/simgrid_dtd.h b/include/surf/simgrid_dtd.h index 3a29ca28a8..32f728a9e5 100644 --- a/include/surf/simgrid_dtd.h +++ b/include/surf/simgrid_dtd.h @@ -1,5 +1,4 @@ /* XML processor/application API for src/surf/simgrid.dtd. - * Generated 2011/02/14 15:04:45. * * This program was generated with the FleXML XML processor generator. * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. @@ -51,6 +50,8 @@ /* XML application entry points. */ XBT_PUBLIC(void ) STag_surfxml_platform(void); XBT_PUBLIC(void ) ETag_surfxml_platform(void); +XBT_PUBLIC(void ) STag_surfxml_include(void); +XBT_PUBLIC(void ) ETag_surfxml_include(void); XBT_PUBLIC(void ) STag_surfxml_trace(void); XBT_PUBLIC(void ) ETag_surfxml_trace(void); XBT_PUBLIC(void ) STag_surfxml_random(void); @@ -198,6 +199,8 @@ typedef int AT_surfxml_process_function; #define AU_surfxml_process_function NULL typedef int AT_surfxml_peer_id; #define AU_surfxml_peer_id NULL +typedef int AT_surfxml_cluster_router_id; +#define AU_surfxml_cluster_router_id NULL typedef enum { AU_surfxml_cluster_sharing_policy, A_surfxml_cluster_sharing_policy_SHARED,A_surfxml_cluster_sharing_policy_FULLDUPLEX,A_surfxml_cluster_sharing_policy_FATPIPE } AT_surfxml_cluster_sharing_policy; typedef int AT_surfxml_bypassRoute_dst; #define AU_surfxml_bypassRoute_dst NULL @@ -215,7 +218,6 @@ typedef int AT_surfxml_host_coordinates; #define AU_surfxml_host_coordinates NULL typedef int AT_surfxml_trace_id; #define AU_surfxml_trace_id NULL -typedef enum { AU_surfxml_peer_sharing_policy, A_surfxml_peer_sharing_policy_SHARED,A_surfxml_peer_sharing_policy_FULLDUPLEX } AT_surfxml_peer_sharing_policy; typedef int AT_surfxml_peer_power; #define AU_surfxml_peer_power NULL typedef int AT_surfxml_cluster_radical; @@ -226,12 +228,12 @@ typedef int AT_surfxml_bypassRoute_gw_src; #define AU_surfxml_bypassRoute_gw_src NULL typedef int AT_surfxml_cluster_core; #define AU_surfxml_cluster_core NULL +typedef int AT_surfxml_include_file; +#define AU_surfxml_include_file NULL typedef int AT_surfxml_random_std_deviation; #define AU_surfxml_random_std_deviation NULL typedef int AT_surfxml_host_state_file; #define AU_surfxml_host_state_file NULL -typedef int AT_surfxml_AS_coordinates; -#define AU_surfxml_AS_coordinates NULL typedef int AT_surfxml_route_dst; #define AU_surfxml_route_dst NULL typedef int AT_surfxml_cluster_bw; @@ -363,6 +365,8 @@ 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(AT_surfxml_peer_id ) AX_surfxml_peer_id; #define A_surfxml_peer_id (surfxml_bufferstack + AX_surfxml_peer_id) +XBT_PUBLIC_DATA(AT_surfxml_cluster_router_id ) AX_surfxml_cluster_router_id; +#define A_surfxml_cluster_router_id (surfxml_bufferstack + AX_surfxml_cluster_router_id) XBT_PUBLIC_DATA(AT_surfxml_cluster_sharing_policy ) AX_surfxml_cluster_sharing_policy; #define A_surfxml_cluster_sharing_policy AX_surfxml_cluster_sharing_policy XBT_PUBLIC_DATA(AT_surfxml_bypassRoute_dst ) AX_surfxml_bypassRoute_dst; @@ -381,8 +385,6 @@ XBT_PUBLIC_DATA(AT_surfxml_host_coordinates ) AX_surfxml_host_coordinates; #define A_surfxml_host_coordinates (surfxml_bufferstack + AX_surfxml_host_coordinates) XBT_PUBLIC_DATA(AT_surfxml_trace_id ) AX_surfxml_trace_id; #define A_surfxml_trace_id (surfxml_bufferstack + AX_surfxml_trace_id) -XBT_PUBLIC_DATA(AT_surfxml_peer_sharing_policy ) AX_surfxml_peer_sharing_policy; -#define A_surfxml_peer_sharing_policy AX_surfxml_peer_sharing_policy XBT_PUBLIC_DATA(AT_surfxml_peer_power ) AX_surfxml_peer_power; #define A_surfxml_peer_power (surfxml_bufferstack + AX_surfxml_peer_power) XBT_PUBLIC_DATA(AT_surfxml_cluster_radical ) AX_surfxml_cluster_radical; @@ -393,12 +395,12 @@ XBT_PUBLIC_DATA(AT_surfxml_bypassRoute_gw_src ) AX_surfxml_bypassRoute_gw_src; #define A_surfxml_bypassRoute_gw_src (surfxml_bufferstack + AX_surfxml_bypassRoute_gw_src) XBT_PUBLIC_DATA(AT_surfxml_cluster_core ) AX_surfxml_cluster_core; #define A_surfxml_cluster_core (surfxml_bufferstack + AX_surfxml_cluster_core) +XBT_PUBLIC_DATA(AT_surfxml_include_file ) AX_surfxml_include_file; +#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file) XBT_PUBLIC_DATA(AT_surfxml_random_std_deviation ) AX_surfxml_random_std_deviation; #define A_surfxml_random_std_deviation (surfxml_bufferstack + AX_surfxml_random_std_deviation) XBT_PUBLIC_DATA(AT_surfxml_host_state_file ) AX_surfxml_host_state_file; #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file) -XBT_PUBLIC_DATA(AT_surfxml_AS_coordinates ) AX_surfxml_AS_coordinates; -#define A_surfxml_AS_coordinates (surfxml_bufferstack + AX_surfxml_AS_coordinates) XBT_PUBLIC_DATA(AT_surfxml_route_dst ) AX_surfxml_route_dst; #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst) XBT_PUBLIC_DATA(AT_surfxml_cluster_bw ) AX_surfxml_cluster_bw; diff --git a/include/surf/surf_routing.h b/include/surf/surf_routing.h new file mode 100644 index 0000000000..a0a891d562 --- /dev/null +++ b/include/surf/surf_routing.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef _SURF_SURF_ROUTING_H +#define _SURF_SURF_ROUTING_H + +#include "xbt/lib.h" + +extern xbt_lib_t host_lib; +extern int ROUTING_HOST_LEVEL; //Routing level +extern int SURF_CPU_LEVEL; //Surf cpu level +extern int SURF_WKS_LEVEL; //Surf workstation level +extern int SIMIX_HOST_LEVEL; //Simix level +extern int MSG_HOST_LEVEL; //Msg level +extern int SD_HOST_LEVEL; //Simdag level +extern int COORD_HOST_LEVEL; //Coordinates level +extern int NS3_HOST_LEVEL; //host node for ns3 + +extern xbt_lib_t link_lib; +extern int SD_LINK_LEVEL; //Simdag level +extern int SURF_LINK_LEVEL; //Surf level +extern int NS3_LINK_LEVEL; //link for ns3 + +extern xbt_lib_t as_router_lib; +extern int ROUTING_ASR_LEVEL; //Routing level +extern int COORD_ASR_LEVEL; //Coordinates level +extern int NS3_ASR_LEVEL; //host node for ns3 + +#endif /* _SURF_SURF_H */ diff --git a/include/surf/surfxml_parse.h b/include/surf/surfxml_parse.h index 5f3ae1294e..079db3bd9d 100644 --- a/include/surf/surfxml_parse.h +++ b/include/surf/surfxml_parse.h @@ -12,10 +12,10 @@ #include "xbt/function_types.h" #include "xbt/dict.h" -char * platform_filename; - SG_BEGIN_DECL() +XBT_PUBLIC_DATA(char *) platform_filename; + /* Hook for the different tags. All the functions which pointer to are push into here are run when the tag is encountered */ XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_platform_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_platform_cb_list; @@ -53,6 +53,8 @@ XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_peer_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_peer_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_config_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_config_cb_list; +XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_include_cb_list; +XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_include_cb_list; XBT_PUBLIC(void) surf_parse_open(const char *file); XBT_PUBLIC(void) surf_parse_close(void); diff --git a/include/xbt/dict.h b/include/xbt/dict.h index 8a26fc58f0..f5256cf214 100644 --- a/include/xbt/dict.h +++ b/include/xbt/dict.h @@ -124,8 +124,7 @@ typedef struct xbt_dict_cursor_ *xbt_dict_cursor_t; XBT_PUBLIC(xbt_dict_cursor_t) xbt_dict_cursor_new(const xbt_dict_t dict); XBT_PUBLIC(void) xbt_dict_cursor_free(xbt_dict_cursor_t * cursor); -XBT_INLINE XBT_PUBLIC(void) xbt_dict_cursor_rewind(xbt_dict_cursor_t - cursor); +XBT_PUBLIC(void) xbt_dict_cursor_rewind(xbt_dict_cursor_t cursor); XBT_PUBLIC(char *) xbt_dict_cursor_get_key(xbt_dict_cursor_t cursor); @@ -136,7 +135,7 @@ XBT_PUBLIC(void) xbt_dict_cursor_set_data(xbt_dict_cursor_t cursor, XBT_PUBLIC(void) xbt_dict_cursor_first(const xbt_dict_t dict, xbt_dict_cursor_t * cursor); -XBT_INLINE XBT_PUBLIC(void) xbt_dict_cursor_step(xbt_dict_cursor_t cursor); +XBT_PUBLIC(void) xbt_dict_cursor_step(xbt_dict_cursor_t cursor); XBT_PUBLIC(int) xbt_dict_cursor_get_or_free(xbt_dict_cursor_t * cursor, char **key, void **data); /** @def xbt_dict_foreach diff --git a/include/xbt/dynar.h b/include/xbt/dynar.h index 210efb751f..9e2a65d2d3 100644 --- a/include/xbt/dynar.h +++ b/include/xbt/dynar.h @@ -66,16 +66,10 @@ XBT_PUBLIC(xbt_dynar_t) xbt_dynar_new(const unsigned long elm_size, void_f_pvoid_t const free_f); XBT_PUBLIC(xbt_dynar_t) xbt_dynar_new_sync(const unsigned long elm_size, void_f_pvoid_t const free_f); -XBT_INLINE XBT_PUBLIC(void) xbt_dynar_free(xbt_dynar_t * dynar); +XBT_PUBLIC(void) xbt_dynar_free(xbt_dynar_t * dynar); XBT_PUBLIC(void) xbt_dynar_free_voidp(void *dynar); XBT_PUBLIC(void) xbt_dynar_free_container(xbt_dynar_t * dynar); - -XBT_INLINE XBT_PUBLIC(unsigned long) xbt_dynar_length(const xbt_dynar_t - dynar); -XBT_INLINE XBT_PUBLIC(int) xbt_dynar_is_empty(const xbt_dynar_t dynar); -XBT_PUBLIC(void) xbt_dynar_reset(xbt_dynar_t const dynar); XBT_PUBLIC(void) xbt_dynar_shrink(xbt_dynar_t dynar, int empty_slots); - XBT_PUBLIC(void) xbt_dynar_dump(xbt_dynar_t dynar); /** @} */ @@ -99,14 +93,25 @@ XBT_PUBLIC(void) xbt_dynar_insert_at(xbt_dynar_t const dynar, XBT_PUBLIC(void) xbt_dynar_remove_at(xbt_dynar_t const dynar, const int idx, void *const dst); -XBT_PUBLIC(unsigned int) xbt_dynar_search(xbt_dynar_t const dynar, - void *elem); +XBT_PUBLIC(unsigned int) xbt_dynar_search(xbt_dynar_t const dynar, void *elem); XBT_PUBLIC(int) xbt_dynar_member(xbt_dynar_t const dynar, void *elem); XBT_PUBLIC(void) xbt_dynar_sort(xbt_dynar_t const dynar, int_f_cpvoid_cpvoid_t compar_fn); -XBT_INLINE XBT_PUBLIC(int) xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, - int(*compar)(const void *, const void *)); -XBT_INLINE XBT_PUBLIC(void *) xbt_dynar_to_array (xbt_dynar_t dynar); +XBT_PUBLIC(int) xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, + int(*compar)(const void *, const void *)); +XBT_PUBLIC(void *) xbt_dynar_to_array (xbt_dynar_t dynar); + +/** @} */ +/** @defgroup XBT_dynar_misc Dynar miscellaneous functions + * @ingroup XBT_dynar + * + * @{ + */ + +XBT_PUBLIC(unsigned long) xbt_dynar_length(const xbt_dynar_t dynar); +XBT_PUBLIC(int) xbt_dynar_is_empty(const xbt_dynar_t dynar); +XBT_PUBLIC(void) xbt_dynar_reset(xbt_dynar_t const dynar); + /** @} */ /** @defgroup XBT_dynar_perl Perl-like use of dynars @@ -115,10 +120,8 @@ XBT_INLINE XBT_PUBLIC(void *) xbt_dynar_to_array (xbt_dynar_t dynar); * @{ */ -XBT_INLINE XBT_PUBLIC(void) xbt_dynar_push(xbt_dynar_t const dynar, - const void *src); -XBT_INLINE XBT_PUBLIC(void) xbt_dynar_pop(xbt_dynar_t const dynar, - void *const dst); +XBT_PUBLIC(void) xbt_dynar_push(xbt_dynar_t const dynar, const void *src); +XBT_PUBLIC(void) xbt_dynar_pop(xbt_dynar_t const dynar, void *const dst); XBT_PUBLIC(void) xbt_dynar_unshift(xbt_dynar_t const dynar, const void *src); XBT_PUBLIC(void) xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst); @@ -134,10 +137,10 @@ XBT_PUBLIC(void) xbt_dynar_map(const xbt_dynar_t dynar, * @{ */ -XBT_INLINE XBT_PUBLIC(void *) xbt_dynar_set_at_ptr(const xbt_dynar_t dynar, - const unsigned long idx); -XBT_INLINE XBT_PUBLIC(void *) xbt_dynar_get_ptr(const xbt_dynar_t dynar, - const unsigned long idx); +XBT_PUBLIC(void *) xbt_dynar_set_at_ptr(const xbt_dynar_t dynar, + const unsigned long idx); +XBT_PUBLIC(void *) xbt_dynar_get_ptr(const xbt_dynar_t dynar, + const unsigned long idx); XBT_PUBLIC(void *) xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar, const int idx); XBT_PUBLIC(void *) xbt_dynar_push_ptr(xbt_dynar_t const dynar); @@ -201,9 +204,8 @@ XBT_PUBLIC(void *) xbt_dynar_pop_ptr(xbt_dynar_t const dynar); * @{ */ -XBT_INLINE XBT_PUBLIC(void) xbt_dynar_cursor_rm(xbt_dynar_t dynar, - unsigned int *const - cursor); +XBT_PUBLIC(void) xbt_dynar_cursor_rm(xbt_dynar_t dynar, + unsigned int *const cursor); XBT_PUBLIC(void) xbt_dynar_cursor_unlock(xbt_dynar_t dynar); /* do not use this structure internals directly, but use the public interface diff --git a/include/xbt/ex.h b/include/xbt/ex.h index ae391fa41b..50ef63e9fe 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -64,7 +64,7 @@ SG_BEGIN_DECL() ), # define MAYDAY_CATCH(e) printf("%d %s:%d Catched '%s'\n", \ (*xbt_getpid)(),__FILE__,__LINE__, \ - e.msg \ + (e).msg \ ), #else # define MAYDAY_SAVE(m) @@ -385,6 +385,17 @@ extern void __xbt_ex_terminate_default(xbt_ex_t * e); * @hideinitializer */ #define CATCH(e) \ + DO_CATCH((e) = XBT_EX_T_CPLUSPLUSCAST __xbt_running_ctx_fetch()->exception) + +/** @brief like CATCH(e) but without argument + * @hideinitializer + * + * Useful if you only want to rethrow the exception caught, and do not want to + * bother with an unused variable. + */ +#define CATCH_ANONYMOUS DO_CATCH(0) + +#define DO_CATCH(_xbt_do_catch_set_e) \ else { \ } \ if (!(__ex_cleanup)) \ @@ -398,7 +409,8 @@ extern void __xbt_ex_terminate_default(xbt_ex_t * e); __xbt_ex_ctx_ptr->ctx_mctx = __ex_mctx_en; \ } \ if ( !(__xbt_running_ctx_fetch()->ctx_caught) \ - || ((e) = XBT_EX_T_CPLUSPLUSCAST __xbt_running_ctx_fetch()->exception, MAYDAY_CATCH(e) 0)) { \ + || ((void)(_xbt_do_catch_set_e), \ + MAYDAY_CATCH(__xbt_running_ctx_fetch()->exception) 0)) { \ } \ else diff --git a/include/xbt/fifo.h b/include/xbt/fifo.h index 5455d697d9..ee3832c5ab 100644 --- a/include/xbt/fifo.h +++ b/include/xbt/fifo.h @@ -53,10 +53,10 @@ XBT_PUBLIC(int) xbt_fifo_is_in(xbt_fifo_t, void *); * @{ */ -XBT_INLINE XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_new_item(void); +XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_new_item(void); XBT_PUBLIC(void) xbt_fifo_set_item_content(xbt_fifo_item_t, void *); XBT_PUBLIC(void *) xbt_fifo_get_item_content(xbt_fifo_item_t); -XBT_INLINE XBT_PUBLIC(void) xbt_fifo_free_item(xbt_fifo_item_t); +XBT_PUBLIC(void) xbt_fifo_free_item(xbt_fifo_item_t); XBT_PUBLIC(void) xbt_fifo_push_item(xbt_fifo_t, xbt_fifo_item_t); XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_pop_item(xbt_fifo_t); @@ -67,10 +67,8 @@ XBT_PUBLIC(int) xbt_fifo_remove(xbt_fifo_t, void *); XBT_PUBLIC(int) xbt_fifo_remove_all(xbt_fifo_t, void *); XBT_PUBLIC(void) xbt_fifo_remove_item(xbt_fifo_t, xbt_fifo_item_t); -XBT_INLINE XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_get_first_item(xbt_fifo_t - l); -XBT_INLINE XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_get_last_item(xbt_fifo_t - l); +XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_get_first_item(xbt_fifo_t l); +XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_get_last_item(xbt_fifo_t l); XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_get_next_item(xbt_fifo_item_t i); XBT_PUBLIC(xbt_fifo_item_t) xbt_fifo_get_prev_item(xbt_fifo_item_t i); diff --git a/include/xbt/graph.h b/include/xbt/graph.h index a35336e3d8..64e0648d8d 100644 --- a/include/xbt/graph.h +++ b/include/xbt/graph.h @@ -77,6 +77,11 @@ XBT_PUBLIC(void) xbt_graph_export_graphxml(xbt_graph_t g, *(edge_name) (xbt_edge_t), const char *(node_data_print) (void *), const char *(edge_data_print) (void *)); +XBT_PUBLIC(xbt_graph_t) xbt_graph_load (const char *filename); +XBT_PUBLIC(void) xbt_graph_save (xbt_graph_t span, + const char *filename, + const char *(nname) (xbt_node_t), + const char *(ename) (xbt_edge_t)); /* Not implemented yet ! */ /* void *xbt_graph_to_array(xbt_graph_t g); */ diff --git a/include/xbt/graphxml.h b/include/xbt/graphxml.h index 48ef5febac..556b0c0ec1 100644 --- a/include/xbt/graphxml.h +++ b/include/xbt/graphxml.h @@ -1,5 +1,4 @@ /* XML processor/application API for src/xbt/graphxml.dtd. - * Generated 2010/12/01 17:15:43. * * This program was generated with the FleXML XML processor generator. * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. diff --git a/include/xbt/log.h b/include/xbt/log.h index 6181f59250..19f0ca7dfb 100644 --- a/include/xbt/log.h +++ b/include/xbt/log.h @@ -241,11 +241,9 @@ typedef struct xbt_log_category_s s_xbt_log_category_t, /* * Do NOT access any members of this structure directly. FIXME: move to private? */ -#ifdef _XBT_WIN32 -#define XBT_LOG_BUFF_SIZE 16384 /* Size of the static string in which we build the log string */ -#else + #define XBT_LOG_BUFF_SIZE 2048 /* Size of the static string in which we build the log string */ -#endif + struct xbt_log_category_s { xbt_log_category_t parent; xbt_log_category_t firstChild; @@ -266,11 +264,7 @@ struct xbt_log_event_s { int lineNum; va_list ap; va_list ap_copy; /* need a copy to launch dynamic layouts when the static ones overflowed */ -#ifdef _XBT_WIN32 - char *buffer; -#else char buffer[XBT_LOG_BUFF_SIZE]; -#endif }; /** @@ -389,15 +383,6 @@ extern xbt_log_layout_t xbt_log_default_layout; * code. * Setting the LogEvent's valist member is done inside _log_logEvent. */ -#ifdef _XBT_WIN32 -#include /* calloc */ -#define _XBT_LOG_EV_BUFFER_ZERO() \ - _log_ev.buffer = (char*) calloc(XBT_LOG_BUFF_SIZE + 1, sizeof(char)) -#else -#include /* memset */ -#define _XBT_LOG_EV_BUFFER_ZERO() \ - memset(_log_ev.buffer, 0, XBT_LOG_BUFF_SIZE) -#endif /* Logging Macros */ @@ -405,11 +390,12 @@ extern xbt_log_layout_t xbt_log_default_layout; # define XBT_CLOG(cat, prio, ...) \ _XBT_IF_ONE_ARG(_XBT_CLOG_ARG1, _XBT_CLOG_ARGN, __VA_ARGS__)(__VA_ARGS__) # define _XBT_CLOG_ARG1(f) \ - fprintf(stderr,"%s:%d:" f, __FILE__, __LINE__) + fprintf(stderr,"%s:%d:\n" f, __FILE__, __LINE__) # define _XBT_CLOG_ARGN(f, ...) \ - fprintf(stderr,"%s:%d:" f, __FILE__, __LINE__, __VA_ARGS__) + fprintf(stderr,"%s:%d:\n" f, __FILE__, __LINE__, __VA_ARGS__) # define XBT_LOG(...) XBT_CLOG(0, __VA_ARGS__) #else +# include /* memset */ # define XBT_CLOG_(catv, prio, ...) \ do { \ if (_XBT_LOG_ISENABLEDV(catv, prio)) { \ @@ -419,7 +405,7 @@ extern xbt_log_layout_t xbt_log_default_layout; _log_ev.fileName = __FILE__; \ _log_ev.functionName = _XBT_FUNCTION; \ _log_ev.lineNum = __LINE__; \ - _XBT_LOG_EV_BUFFER_ZERO(); \ + memset(_log_ev.buffer, 0, XBT_LOG_BUFF_SIZE); \ _xbt_log_event_log(&_log_ev, __VA_ARGS__); \ } \ } while (0) @@ -430,8 +416,7 @@ extern xbt_log_layout_t xbt_log_default_layout; /** @ingroup XBT_log * @hideinitializer * \param c the category on which to log - * \param f the format string - * \param ... arguments of the format + * \param ... the format string and its arguments * @brief Log an event at the DEBUG priority on the specified category with these args. */ #define XBT_CDEBUG(c, ...) XBT_CLOG(c, xbt_log_priority_debug, __VA_ARGS__) @@ -468,8 +453,7 @@ extern xbt_log_layout_t xbt_log_default_layout; /** @ingroup XBT_log * @hideinitializer - * \param f the format string - * \param ... + * \param ... the format string and its arguments * @brief Log an event at the DEBUG priority on the default category with these args. */ #define XBT_DEBUG(...) XBT_LOG(xbt_log_priority_debug, __VA_ARGS__) diff --git a/include/xbt/str.h b/include/xbt/str.h index c7b4ed1597..225ef425bd 100644 --- a/include/xbt/str.h +++ b/include/xbt/str.h @@ -45,7 +45,7 @@ XBT_PUBLIC(char *) xbt_str_varsubst(char *str, xbt_dict_t patterns); /* */ XBT_PUBLIC(void) xbt_str_strip_spaces(char *); -XBT_PUBLIC(char *) xbt_str_diff(char *a, char *b); +XBT_PUBLIC(char *) xbt_str_diff(const char *a, const char *b); XBT_PUBLIC(char *) xbt_str_from_file(FILE * file); diff --git a/include/xbt/strbuff.h b/include/xbt/strbuff.h index 021de28377..1666655730 100644 --- a/include/xbt/strbuff.h +++ b/include/xbt/strbuff.h @@ -28,9 +28,9 @@ typedef struct { XBT_PUBLIC(void) xbt_strbuff_empty(xbt_strbuff_t b); XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new(void); -XBT_INLINE XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new_from(char *s); +XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new_from(char *s); XBT_PUBLIC(void) xbt_strbuff_free(xbt_strbuff_t b); -XBT_INLINE XBT_PUBLIC(void) xbt_strbuff_free_container(xbt_strbuff_t b); +XBT_PUBLIC(void) xbt_strbuff_free_container(xbt_strbuff_t b); XBT_PUBLIC(void) xbt_strbuff_append(xbt_strbuff_t b, const char *toadd); XBT_PUBLIC(void) xbt_strbuff_chomp(xbt_strbuff_t b); XBT_PUBLIC(void) xbt_strbuff_trim(xbt_strbuff_t b); diff --git a/include/xbt/swag.h b/include/xbt/swag.h index a16c2544f7..9ebd506420 100644 --- a/include/xbt/swag.h +++ b/include/xbt/swag.h @@ -88,16 +88,25 @@ typedef struct xbt_swag { XBT_PUBLIC(xbt_swag_t) xbt_swag_new(size_t offset); XBT_PUBLIC(void) xbt_swag_free(xbt_swag_t swag); -XBT_INLINE XBT_PUBLIC(void) xbt_swag_init(xbt_swag_t swag, size_t offset); -XBT_PUBLIC(void) xbt_swag_insert(void *obj, xbt_swag_t swag); +XBT_PUBLIC(void) xbt_swag_init(xbt_swag_t swag, size_t offset); + +/** + * \param obj the objet to insert in the swag + * \param swag a swag + * @hideinitializer + * + * insert \a obj in \a swag + */ +#define xbt_swag_insert(obj, swag) xbt_swag_insert_at_tail(obj, swag) + XBT_PUBLIC(void) xbt_swag_insert_at_head(void *obj, xbt_swag_t swag); XBT_PUBLIC(void) xbt_swag_insert_at_tail(void *obj, xbt_swag_t swag); XBT_PUBLIC(void *) xbt_swag_remove(void *obj, xbt_swag_t swag); XBT_PUBLIC(void *) xbt_swag_extract(xbt_swag_t swag); XBT_PUBLIC(int) xbt_swag_size(xbt_swag_t swag); -#define xbt_swag_getNext(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev) -#define xbt_swag_getPrev(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next) +#define xbt_swag_getPrev(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->prev) +#define xbt_swag_getNext(obj,offset) (((xbt_swag_hookup_t)(((char *) (obj)) + (offset)))->next) static XBT_INLINE int xbt_swag_belongs(void *obj, xbt_swag_t swag) { diff --git a/include/xbt/synchro_core.h b/include/xbt/synchro_core.h index 5a270d3f71..51fee8ee07 100644 --- a/include/xbt/synchro_core.h +++ b/include/xbt/synchro_core.h @@ -29,44 +29,84 @@ SG_BEGIN_DECL() * * @{ */ - /** \brief Thread data type (opaque structure) */ + /** @brief Thread data type (opaque object) + * @hideinitializer + */ typedef struct s_xbt_thread_ *xbt_thread_t; +/** @brief Creates a new thread. + * + * @param name the name used in the logs for the newly created thread + * @param start_routine function to run + * @param param parameter to pass to the function to run + * @param joinable whether the new thread should be started joinable or detached + */ XBT_PUBLIC(xbt_thread_t) xbt_thread_create(const char *name, void_f_pvoid_t start_routine, void *param, int joinable); + +/** @brief Get a reference to the currently running thread */ XBT_PUBLIC(xbt_thread_t) xbt_thread_self(void); + +/** @brief Get the name of a given thread */ XBT_PUBLIC(const char *) xbt_thread_name(xbt_thread_t t); + +/** @brief Get a reference to the name of the currently running thread */ XBT_PUBLIC(const char *) xbt_thread_self_name(void); - /* xbt_thread_join frees the joined thread (ie the XBT wrapper around it, the OS frees the rest) */ + +/** @brief Wait for the termination of the given thread, and free it (ie the XBT wrapper around it, the OS frees the rest) */ XBT_PUBLIC(void) xbt_thread_join(xbt_thread_t thread); - /* Ends the life of the poor victim (not always working if it's computing, but working if it's blocked in the OS) */ + +/** @brief Ends the life of the poor victim (not always working if it's computing, but working if it's blocked in the OS) */ XBT_PUBLIC(void) xbt_thread_cancel(xbt_thread_t thread); - /* suicide */ + +/** @brief commit suicide */ XBT_PUBLIC(void) xbt_thread_exit(void); - /* current thread pass control to any possible thread wanting it */ + +/** @brief the current thread passes control to any possible thread wanting it */ XBT_PUBLIC(void) xbt_thread_yield(void); - /** \brief Thread mutex data type (opaque structure) */ + +/** @brief Thread mutex data type (opaque object) + * @hideinitializer + */ typedef struct s_xbt_mutex_ *xbt_mutex_t; +/** @brief Creates a new mutex variable */ XBT_PUBLIC(xbt_mutex_t) xbt_mutex_init(void); + +/** @brief Blocks onto the given mutex variable */ XBT_PUBLIC(void) xbt_mutex_acquire(xbt_mutex_t mutex); + +/** @brief Releases the given mutex variable */ XBT_PUBLIC(void) xbt_mutex_release(xbt_mutex_t mutex); + +/** @brief Blocks onto the given mutex variable, but only for the given amount of time. a timeout exception is raised if it was impossible to acquire it in the given time frame */ XBT_PUBLIC(void) xbt_mutex_timedacquire(xbt_mutex_t mutex, double delay); + +/** @brief Destroyes the given mutex variable */ XBT_PUBLIC(void) xbt_mutex_destroy(xbt_mutex_t mutex); - /** \brief Thread condition data type (opaque structure) */ +/** @brief Thread condition data type (opaque object) + * @hideinitializer + */ typedef struct s_xbt_cond_ *xbt_cond_t; +/** @brief Creates a condition variable */ XBT_PUBLIC(xbt_cond_t) xbt_cond_init(void); + +/** @brief Blocks onto the given condition variable */ XBT_PUBLIC(void) xbt_cond_wait(xbt_cond_t cond, xbt_mutex_t mutex); +/** @brief Blocks onto the given condition variable, but only for the given amount of time. a timeout exception is raised if it was impossible to acquire it in the given time frame */ XBT_PUBLIC(void) xbt_cond_timedwait(xbt_cond_t cond, xbt_mutex_t mutex, double delay); +/** @brief Signals the given mutex variable */ XBT_PUBLIC(void) xbt_cond_signal(xbt_cond_t cond); +/** @brief Broadcasts the given mutex variable */ XBT_PUBLIC(void) xbt_cond_broadcast(xbt_cond_t cond); +/** @brief Destroys the given mutex variable */ XBT_PUBLIC(void) xbt_cond_destroy(xbt_cond_t cond); /** @} */ diff --git a/include/xbt/sysdep.h b/include/xbt/sysdep.h index d05639b575..adc9022a9f 100644 --- a/include/xbt/sysdep.h +++ b/include/xbt/sysdep.h @@ -35,7 +35,7 @@ SG_BEGIN_DECL() /** * @brief Kill the program with an error message - * \param msg + * \param ... a format string and its arguments * * Things are so messed up that the only thing to do now, is to stop the * program. diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 68063f76ac..0000000000 --- a/src/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.classes -context_sysv_config.h -gras_config.h -libgras.la -libsimgrid.la -libsmpi.la -smpi/smpicc -smpi/smpirun -stamp-h1 -testall diff --git a/src/amok/Bandwidth/bandwidth.c b/src/amok/Bandwidth/bandwidth.c index eeabf72329..9364c2e111 100644 --- a/src/amok/Bandwidth/bandwidth.c +++ b/src/amok/Bandwidth/bandwidth.c @@ -176,7 +176,7 @@ void amok_bw_test(gras_socket_t peer, TRY { gras_msg_rpccall(peer, 15, "BW handshake", &request, &request_ack); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Error encountered while sending the BW request: %s"); } measIn = gras_socket_meas_accept(measMasterIn); @@ -186,7 +186,7 @@ void amok_bw_test(gras_socket_t peer, request_ack->peer.port, request->buf_size, 1); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF ("Error encountered while opening the measurement socket to %s:%d for BW test: %s", gras_socket_peer_name(peer), request_ack->peer.port); @@ -244,7 +244,8 @@ void amok_bw_test(gras_socket_t peer, request->msg_amount); XBT_DEBUG("Data sent. Wait ACK"); gras_socket_meas_recv(measIn, 120, 1, 1); - } CATCH(e) { + } + CATCH_ANONYMOUS { gras_socket_close(measOut); gras_socket_close(measMasterIn); gras_socket_close(measIn); @@ -328,7 +329,7 @@ int amok_bw_cb_bw_handshake(gras_msg_cb_ctx_t ctx, void *payload) TRY { gras_msg_rpcreturn(60, ctx, &answer); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(measMasterIn); /* FIXME: tell error to remote */ RETHROWF("Error encountered while sending the answer: %s"); @@ -341,7 +342,7 @@ int amok_bw_cb_bw_handshake(gras_msg_cb_ctx_t ctx, void *payload) request->peer.port, request->buf_size, 1); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF ("Error encountered while opening a measurement socket back to %s:%d : %s", gras_socket_peer_name(expeditor), request->peer.port); @@ -355,7 +356,7 @@ int amok_bw_cb_bw_handshake(gras_msg_cb_ctx_t ctx, void *payload) answer->buf_size, answer->msg_size, answer->msg_amount, answer->peer.port); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(measMasterIn); gras_socket_close(measIn); gras_socket_close(measOut); @@ -376,7 +377,8 @@ int amok_bw_cb_bw_handshake(gras_msg_cb_ctx_t ctx, void *payload) gras_socket_meas_recv(measIn, 120, request->msg_size, request->msg_amount); gras_socket_meas_send(measOut, 120, 1, 1); - } CATCH(e) { + } + CATCH_ANONYMOUS { gras_socket_close(measMasterIn); gras_socket_close(measIn); gras_socket_close(measOut); diff --git a/src/amok/Bandwidth/saturate.c b/src/amok/Bandwidth/saturate.c index 9b941995c4..78e022e366 100644 --- a/src/amok/Bandwidth/saturate.c +++ b/src/amok/Bandwidth/saturate.c @@ -294,7 +294,7 @@ static int amok_bw_cb_sat_begin(gras_msg_cb_ctx_t ctx, void *payload) meas = gras_socket_meas_accept(measMaster); XBT_DEBUG("saturation handshake answered"); } - CATCH(e) { + CATCH_ANONYMOUS { gras_socket_close(measMaster); RETHROWF("Error during saturation handshake: %s"); } @@ -330,16 +330,14 @@ static int amok_bw_cb_sat_begin(gras_msg_cb_ctx_t ctx, void *payload) void amok_bw_saturate_stop(const char *from_name, unsigned int from_port, /*out */ double *time, double *bw) { - xbt_ex_t e; - gras_socket_t sock = gras_socket_client(from_name, from_port); bw_res_t answer; XBT_VERB("Ask %s:%d to stop the saturation", from_name, from_port); TRY { gras_msg_rpccall(sock, 60, "amok_bw_sat stop", NULL, &answer); - } CATCH(e) { - RETHROWF("Cannot ask %s:%d to stop saturation: %s", from_name, - from_port); + } + CATCH_ANONYMOUS { + RETHROWF("Cannot ask %s:%d to stop saturation: %s", from_name, from_port); } gras_socket_close(sock); if (time) diff --git a/src/bindings/lua/lua_console.c b/src/bindings/lua/lua_console.c index 30c9d6b0e0..eeda51d9f1 100644 --- a/src/bindings/lua/lua_console.c +++ b/src/bindings/lua/lua_console.c @@ -31,7 +31,7 @@ static void create_AS(const char *id, const char *mode) static void create_host(const char *id, double power_peak, double power_sc, const char *power_tr,int core,int state_init, - const char *state_tr) + const char *state_tr,xbt_dict_t properties) { double power_scale = 1.0; int core_nb = 1; //default value @@ -57,8 +57,7 @@ static void create_host(const char *id, double power_peak, double power_sc, surf_host_create_resource(xbt_strdup(id), power_peak, power_scale, power_trace, core_nb, state_initial, state_trace, - current_property_set); - current_property_set = NULL; + properties); } /** @@ -349,6 +348,7 @@ static int Host_new(lua_State * L) host->state_initial = state_initial; host->state_trace = state_trace; host->function = NULL; + host->properties = xbt_dict_new(); xbt_dynar_push(current_as->host_list_d, &host); return 0; @@ -604,22 +604,22 @@ static int Host_set_function(lua_State * L) //(host,function,nb_args,list_ar { p_AS_attr p_as; p_host_attr p_host; - const char *host; - const char *function; + unsigned int i,j; + const char *host_id ; + const char *function_id; const char *args; char * tmp_arg; - unsigned int i,j; if (lua_istable(L, -1)) { // get Host id lua_pushstring(L, "host"); lua_gettable(L, -2); - host = lua_tostring(L, -1); + host_id = lua_tostring(L, -1); lua_pop(L, 1); // get Function Name lua_pushstring(L, "fct"); lua_gettable(L, -2); - function = lua_tostring(L, -1); + function_id = lua_tostring(L, -1); lua_pop(L, 1); //get args lua_pushstring(L,"args"); @@ -636,8 +636,8 @@ static int Host_set_function(lua_State * L) //(host,function,nb_args,list_ar xbt_dynar_foreach(as_list_d, i, p_as) { xbt_dynar_foreach(p_as->host_list_d, j, p_host) { - if (p_host->id == host) { - p_host->function = function; + if (p_host->id == host_id) { + p_host->function = function_id; p_host->args_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref); // split & fill the args list tmp_arg = strtok((char*)args,","); @@ -649,9 +649,46 @@ static int Host_set_function(lua_State * L) //(host,function,nb_args,list_ar } } } - XBT_ERROR("Host : %s Not Found !!", host); + XBT_ERROR("Host : %s Not Found !!", host_id); return 1; +} + +static int Host_set_property(lua_State* L) +{ + p_AS_attr p_as; + p_host_attr p_host; + unsigned int i,j; + const char* host_id =""; + const char* prop_id = ""; + const char* prop_value = ""; + if (lua_istable(L, -1)) { + // get Host id + lua_pushstring(L, "host"); + lua_gettable(L, -2); + host_id = lua_tostring(L, -1); + lua_pop(L, 1); + // get Function Name + lua_pushstring(L, "prop_id"); + lua_gettable(L, -2); + prop_id = lua_tostring(L, -1); + lua_pop(L, 1); + //get args + lua_pushstring(L,"prop_value"); + lua_gettable(L, -2); + prop_value = lua_tostring(L,-1); + lua_pop(L, 1); + } + xbt_dynar_foreach(as_list_d, i, p_as) + { + xbt_dynar_foreach(p_as->host_list_d, j, p_host) { + if (p_host->id == host_id) { + xbt_dict_set(p_host->properties, prop_id, xbt_strdup(prop_value), free); + } + } + } + return 1; + } /* * surf parse bypass platform @@ -675,9 +712,11 @@ static int surf_parse_bypass_platform() xbt_dynar_foreach(p_as->host_list_d, j, p_host){ create_host(p_host->id, p_host->power_peak, p_host->power_scale, p_host->power_trace, p_host->core, p_host->state_initial, - p_host->state_trace); - //add to routing model host list - surf_route_add_host((char *) p_host->id); + p_host->state_trace, p_host->properties); + + + //add to routing model host list + surf_route_add_host((char *) p_host->id); } // add associated Links xbt_dynar_foreach(p_as->link_list_d, j, p_link){ @@ -803,6 +842,11 @@ int console_set_function(lua_State *L) return Host_set_function(L); } +int console_host_set_property(lua_State *L) +{ + return Host_set_property(L); +} + int console_parse_platform() { return surf_parse_bypass_platform(); diff --git a/src/bindings/lua/lua_stub_generator.c b/src/bindings/lua/lua_stub_generator.c index acffa3eacd..87e2c8ce2a 100644 --- a/src/bindings/lua/lua_stub_generator.c +++ b/src/bindings/lua/lua_stub_generator.c @@ -24,8 +24,6 @@ #define MAKEFILE_FILENAME_REMOTE "%s.Makefile.remote" #define DEPLOYMENT "%s.deploy.sh" -char *warning = NULL; - /**********************************************/ /**** Generate the file for the simulator *****/ /**********************************************/ diff --git a/src/bindings/lua/lua_stub_generator.h b/src/bindings/lua/lua_stub_generator.h deleted file mode 100644 index 7d393f2013..0000000000 --- a/src/bindings/lua/lua_stub_generator.h +++ /dev/null @@ -1,29 +0,0 @@ -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#ifndef GRAS_STUB_GENERATOR_H -#define GRAS_STUB_GENERATOR_H - -#include "xbt/dynar.h" -#include "xbt/dict.h" -xbt_dict_t process_function_set; -xbt_dynar_t process_list; -xbt_dict_t machine_set; - -typedef struct s_process_t { - int argc; - char **argv; - char *host; -} s_process_t; - -char *warning; - -void s_process_free(void *process); - -/* UNIX files */ -void generate_sim(const char *project); -void generate_rl(const char *project); -void generate_makefile_am(const char *project); -void generate_makefile_local(const char *project); - -#endif diff --git a/src/bindings/lua/simgrid_lua.c b/src/bindings/lua/simgrid_lua.c index 593f56fae5..2002beac00 100644 --- a/src/bindings/lua/simgrid_lua.c +++ b/src/bindings/lua/simgrid_lua.c @@ -9,20 +9,30 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua, bindings, "Lua Bindings"); -lua_State *simgrid_lua_state; +static lua_State *lua_maestro_state; #define TASK_MODULE_NAME "simgrid.Task" #define HOST_MODULE_NAME "simgrid.Host" -// Surf ( bypass XML ) +// Surf (bypass XML) #define LINK_MODULE_NAME "simgrid.Link" #define ROUTE_MODULE_NAME "simgrid.Route" #define AS_MODULE_NAME "simgrid.AS" #define TRACE_MODULE_NAME "simgrid.Trace" +static void stack_dump(const char *msg, lua_State *L); +static m_task_t check_task(lua_State *L, int index); +static void register_c_functions(lua_State *L); + /* ********************************************************************************* */ /* helper functions */ /* ********************************************************************************* */ -static void stackDump(const char *msg, lua_State * L) + +/** + * @brief Dumps the Lua stack + * @param msg a message to print + * @param L a Lua state + */ +static void stack_dump(const char *msg, lua_State *L) { char buff[2048]; char *p = buff; @@ -67,7 +77,13 @@ static void stackDump(const char *msg, lua_State * L) XBT_INFO("%s%s", msg, buff); } -/** @brief ensures that a userdata on the stack is a task and returns the pointer inside the userdata */ +/** + * @brief Ensures that a userdata on the stack is a task + * and returns the pointer inside the userdata. + * @param L a Lua state + * @param index an index in the Lua stack + * @return the task at this index + */ static m_task_t checkTask(lua_State * L, int index) { m_task_t *pi, tk; @@ -96,8 +112,9 @@ static m_task_t checkTask(lua_State * L, int index) /* * * * * * Constructors * * * * * */ + /** - * Construct an new task with the specified processing amount and amount + * @brief Constructs a new task with the specified processing amount and amount * of data needed. * * @param name Task's name @@ -163,8 +180,8 @@ static int Task_destroy(lua_State * L) static int Task_send(lua_State * L) { //stackDump("send ",L); - m_task_t tk = checkTask(L, -2); - const char *mailbox = luaL_checkstring(L, -1); + m_task_t tk = checkTask(L, 1); + const char *mailbox = luaL_checkstring(L, 2); lua_pop(L, 1); // remove the string so that the task is on top of it MSG_task_set_data(tk, L); // Copy my stack into the task, so that the receiver can copy the lua task directly MSG_error_t res = MSG_task_send(tk, mailbox); @@ -174,13 +191,13 @@ static int Task_send(lua_State * L) if (res != MSG_OK) switch (res) { case MSG_TIMEOUT: - XBT_ERROR("MSG_task_send failed : Timeout"); + XBT_DEBUG("MSG_task_send failed : Timeout"); break; case MSG_TRANSFER_FAILURE: - XBT_ERROR("MSG_task_send failed : Transfer Failure"); + XBT_DEBUG("MSG_task_send failed : Transfer Failure"); break; case MSG_HOST_FAILURE: - XBT_ERROR("MSG_task_send failed : Host Failure "); + XBT_DEBUG("MSG_task_send failed : Host Failure "); break; default: XBT_ERROR @@ -190,36 +207,44 @@ static int Task_send(lua_State * L) return 0; } -static int Task_recv(lua_State * L) +static int Task_recv_with_timeout(lua_State *L) { m_task_t tk = NULL; - const char *mailbox = luaL_checkstring(L, -1); - MSG_error_t res = MSG_task_receive(&tk, mailbox); - - lua_State *sender_stack = MSG_task_get_data(tk); - lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack - MSG_task_set_data(tk, NULL); - - if (res != MSG_OK) + const char *mailbox = luaL_checkstring(L, -2); + int timeout = luaL_checknumber(L, -1); + MSG_error_t res = MSG_task_receive_with_timeout(&tk, mailbox, timeout); + + if (res == MSG_OK) { + lua_State *sender_stack = MSG_task_get_data(tk); + lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack + MSG_task_set_data(tk, NULL); + } + else { switch (res) { case MSG_TIMEOUT: - XBT_ERROR("MSG_task_receive failed : Timeout"); + XBT_DEBUG("MSG_task_receive failed : Timeout"); break; case MSG_TRANSFER_FAILURE: - XBT_ERROR("MSG_task_receive failed : Transfer Failure"); + XBT_DEBUG("MSG_task_receive failed : Transfer Failure"); break; case MSG_HOST_FAILURE: - XBT_ERROR("MSG_task_receive failed : Host Failure "); + XBT_DEBUG("MSG_task_receive failed : Host Failure "); break; default: - XBT_ERROR - ("MSG_task_receive failed : Unexpected error , please report this bug"); + XBT_ERROR("MSG_task_receive failed : Unexpected error , please report this bug"); break; } - + lua_pushnil(L); + } return 1; } +static int Task_recv(lua_State * L) +{ + lua_pushnumber(L, -1.0); + return Task_recv_with_timeout(L); +} + static const luaL_reg Task_methods[] = { {"new", Task_new}, {"name", Task_get_name}, @@ -228,7 +253,8 @@ static const luaL_reg Task_methods[] = { {"destroy", Task_destroy}, {"send", Task_send}, {"recv", Task_recv}, - {0, 0} + {"recv_timeout", Task_recv_with_timeout}, + {NULL, NULL} }; static int Task_gc(lua_State * L) @@ -248,7 +274,7 @@ static int Task_tostring(lua_State * L) static const luaL_reg Task_meta[] = { {"__gc", Task_gc}, {"__tostring", Task_tostring}, - {0, 0} + {NULL, NULL} }; /** @@ -275,7 +301,7 @@ static int Host_get_by_name(lua_State * L) XBT_DEBUG("Getting Host from name..."); m_host_t msg_host = MSG_get_host_by_name(name); if (!msg_host) { - luaL_error(L, "null Host : MSG_get_host_by_name failled"); + luaL_error(L, "null Host : MSG_get_host_by_name failed"); } lua_newtable(L); /* create a table, put the userdata on top of it */ m_host_t *lua_host = (m_host_t *) lua_newuserdata(L, sizeof(m_host_t)); @@ -288,7 +314,6 @@ static int Host_get_by_name(lua_State * L) return 1; } - static int Host_get_name(lua_State * L) { m_host_t ht = checkHost(L, -1); @@ -318,23 +343,36 @@ static int Host_at(lua_State * L) static int Host_self(lua_State * L) { - m_host_t host = MSG_host_self(); - lua_newtable(L); - m_host_t *lua_host =(m_host_t *)lua_newuserdata(L,sizeof(m_host_t)); - *lua_host = host; - luaL_getmetatable(L, HOST_MODULE_NAME); - lua_setmetatable(L, -2); - lua_setfield(L, -2, "__simgrid_host"); - return 1; - + m_host_t host = MSG_host_self(); + lua_newtable(L); + m_host_t *lua_host =(m_host_t *)lua_newuserdata(L,sizeof(m_host_t)); + *lua_host = host; + luaL_getmetatable(L, HOST_MODULE_NAME); + lua_setmetatable(L, -2); + lua_setfield(L, -2, "__simgrid_host"); + return 1; } static int Host_get_property_value(lua_State * L) { - m_host_t ht = checkHost(L, -2); - const char *prop = luaL_checkstring(L, -1); - lua_pushstring(L,MSG_host_get_property_value(ht,prop)); - return 1; + m_host_t ht = checkHost(L, -2); + const char *prop = luaL_checkstring(L, -1); + lua_pushstring(L,MSG_host_get_property_value(ht,prop)); + return 1; +} + +static int Host_sleep(lua_State *L) +{ + int time = luaL_checknumber(L, -1); + MSG_process_sleep(time); + return 1; +} + +static int Host_destroy(lua_State *L) +{ + m_host_t ht = checkHost(L, -1); + __MSG_host_destroy(ht); + return 1; } /* ********************************************************************************* */ @@ -393,9 +431,7 @@ static int gras_add_process_function(lua_State * L) lua_pop(L, 1); //add to the process list xbt_dynar_push(process_list, &process); - return 0; - } @@ -442,7 +478,9 @@ static int trace_end(lua_State *L) #endif return 1; } -//***********Register Methods *******************************************// + +// *********** Register Methods ******************************************* // + /* * Host Methods */ @@ -451,11 +489,14 @@ static const luaL_reg Host_methods[] = { {"name", Host_get_name}, {"number", Host_number}, {"at", Host_at}, - {"self",Host_self}, - {"getPropValue",Host_get_property_value}, + {"self", Host_self}, + {"getPropValue", Host_get_property_value}, + {"sleep", Host_sleep}, + {"destroy", Host_destroy}, // Bypass XML Methods {"setFunction", console_set_function}, - {0, 0} + {"setProperty", console_host_set_property}, + {NULL, NULL} }; static int Host_gc(lua_State * L) @@ -483,46 +524,52 @@ static const luaL_reg Host_meta[] = { */ static const luaL_reg AS_methods[] = { {"new", console_add_AS}, - {"addHost",console_add_host}, - {"addLink",console_add_link}, - {"addRoute",console_add_route}, - {0, 0} + {"addHost", console_add_host}, + {"addLink", console_add_link}, + {"addRoute", console_add_route}, + {NULL, NULL} }; /** * Tracing Functions */ static const luaL_reg Trace_methods[] = { - {"start",trace_start}, - {"category",trace_category}, - {"setTaskCategory",trace_set_task_category}, - {"finish",trace_end}, - {0,0} + {"start", trace_start}, + {"category", trace_category}, + {"setTaskCategory", trace_set_task_category}, + {"finish", trace_end}, + {NULL, NULL} }; + /* * Environment related */ -//extern lua_State *simgrid_lua_state; - +/** + * @brief Runs a Lua function as a new simulated process. + * @param argc number of arguments of the function + * @param argv name of the Lua function and array of its arguments + * @return result of the function + */ static int run_lua_code(int argc, char **argv) { XBT_DEBUG("Run lua code %s", argv[0]); - lua_State *L = lua_newthread(simgrid_lua_state); - int ref = luaL_ref(simgrid_lua_state, LUA_REGISTRYINDEX); // protect the thread from being garbage collected + + lua_State *L = lua_newthread(lua_maestro_state); + int ref = luaL_ref(lua_maestro_state, LUA_REGISTRYINDEX); /* protect the thread from being garbage collected */ int res = 1; - /* Start the co-routine */ + /* start the co-routine */ lua_getglobal(L, argv[0]); xbt_assert(lua_isfunction(L, -1), "The lua function %s does not seem to exist", argv[0]); - // push arguments onto the stack + /* push arguments onto the stack */ int i; for (i = 1; i < argc; i++) lua_pushstring(L, argv[i]); - // Call the function (in resume) + /* call the function */ int err; err = lua_pcall(L, argc - 1, 1, 0); xbt_assert(err == 0, "error running function `%s': %s", argv[0], @@ -533,9 +580,11 @@ static int run_lua_code(int argc, char **argv) res = lua_tonumber(L, -1); lua_pop(L, 1); /* pop returned value */ } - // cleanups - luaL_unref(simgrid_lua_state, LUA_REGISTRYINDEX, ref); - XBT_DEBUG("Execution of lua code %s is over", (argv ? argv[0] : "(null)")); + + /* cleanups */ + luaL_unref(lua_maestro_state, LUA_REGISTRYINDEX, ref); + XBT_DEBUG("Execution of Lua code %s is over", (argv ? argv[0] : "(null)")); + return res; } @@ -547,24 +596,11 @@ static int launch_application(lua_State * L) return 0; } -#include "simix/simix.h" //FIXME: KILLME when debugging on simix internals become useless static int create_environment(lua_State * L) { const char *file = luaL_checkstring(L, 1); XBT_DEBUG("Loading environment file %s", file); MSG_create_environment(file); - -/* - xbt_dict_t hosts = SIMIX_host_get_dict(); - smx_host_t host; - xbt_dict_cursor_t c; - const char *name; - - xbt_dict_foreach(hosts, c, name, host) { - XBT_DEBUG("We have an host %s", SIMIX_host_get_name(host)); - } -*/ - return 0; } @@ -686,15 +722,23 @@ static const luaL_Reg simgrid_funcs[] = { /* ********************************************************************************* */ #define LUA_MAX_ARGS_COUNT 10 /* maximum amount of arguments we can get from lua on command line */ -#define TEST -int luaopen_simgrid(lua_State * L); // Fuck gcc: we don't need that prototype -int luaopen_simgrid(lua_State * L) + +int luaopen_simgrid(lua_State *L); // Fuck gcc: we don't need that prototype + +/** + * This function is called automatically by the Lua interpreter when some Lua code requires + * the "simgrid" module. + * @param L the Lua state + */ +int luaopen_simgrid(lua_State *L) { - XBT_DEBUG("Luaopen_Simgrid *****"); + XBT_DEBUG("luaopen_simgrid *****"); + + /* Get the command line arguments from the lua interpreter */ char **argv = malloc(sizeof(char *) * LUA_MAX_ARGS_COUNT); int argc = 1; argv[0] = (char *) "/usr/bin/lua"; /* Lie on the argv[0] so that the stack dumping facilities find the right binary. FIXME: what if lua is not in that location? */ - /* Get the command line arguments from the lua interpreter */ + lua_getglobal(L, "arg"); /* if arg is a null value, it means we use lua only as a script to init platform * else it should be a table and then take arg in consideration @@ -724,19 +768,35 @@ int luaopen_simgrid(lua_State * L) MSG_global_init(&argc, argv); XBT_DEBUG("Still %d arguments on command line", argc); // FIXME: update the lua's arg table to reflect the changes from SimGrid } + + /* Keep the context mechanism informed of our lua world today */ + lua_maestro_state = L; + + register_c_functions(L); + + return 1; +} + +/** + * Makes the appropriate Simgrid functions available to the Lua world. + * @param L a Lua world + */ +void register_c_functions(lua_State *L) { + /* register the core C functions to lua */ luaL_register(L, "simgrid", simgrid_funcs); + /* register the task methods to lua */ - luaL_openlib(L, TASK_MODULE_NAME, Task_methods, 0); //create methods table,add it to the globals - luaL_newmetatable(L, TASK_MODULE_NAME); //create metatable for Task,add it to the Lua registry + luaL_openlib(L, TASK_MODULE_NAME, Task_methods, 0); // create methods table, add it to the globals + luaL_newmetatable(L, TASK_MODULE_NAME); // create metatable for Task, add it to the Lua registry luaL_openlib(L, 0, Task_meta, 0); // fill metatable lua_pushliteral(L, "__index"); - lua_pushvalue(L, -3); //dup methods table - lua_rawset(L, -3); //matatable.__index = methods + lua_pushvalue(L, -3); // dup methods table + lua_rawset(L, -3); // matatable.__index = methods lua_pushliteral(L, "__metatable"); - lua_pushvalue(L, -3); //dup methods table - lua_rawset(L, -3); //hide metatable:metatable.__metatable = methods - lua_pop(L, 1); //drop metatable + lua_pushvalue(L, -3); // dup methods table + lua_rawset(L, -3); // hide metatable:metatable.__metatable = methods + lua_pop(L, 1); // drop metatable /* register the hosts methods to lua */ luaL_openlib(L, HOST_MODULE_NAME, Host_methods, 0); @@ -755,14 +815,8 @@ int luaopen_simgrid(lua_State * L) luaL_newmetatable(L, AS_MODULE_NAME); lua_pop(L, 1); - - - /*register the Tracing functions to lua */ + /* register the Tracing functions to lua */ luaL_openlib(L, TRACE_MODULE_NAME, Trace_methods, 0); luaL_newmetatable(L, TRACE_MODULE_NAME); lua_pop(L, 1); - - /* Keep the context mechanism informed of our lua world today */ - simgrid_lua_state = L; - return 1; } diff --git a/src/bindings/lua/simgrid_lua.h b/src/bindings/lua/simgrid_lua.h index 3bbca15fbc..91774956c8 100644 --- a/src/bindings/lua/simgrid_lua.h +++ b/src/bindings/lua/simgrid_lua.h @@ -23,9 +23,9 @@ #include -xbt_dict_t process_function_set; -xbt_dynar_t process_list; -xbt_dict_t machine_set; +extern xbt_dict_t process_function_set; +extern xbt_dynar_t process_list; +extern xbt_dict_t machine_set; typedef struct s_process_t { int argc; @@ -33,8 +33,6 @@ typedef struct s_process_t { char *host; } s_process_t; -char *warning; - void s_process_free(void *process); /* UNIX files */ @@ -71,6 +69,7 @@ typedef struct t_host_attr { //deployment attribute const char *function; xbt_dynar_t args_list; + xbt_dict_t properties; } host_attr, *p_host_attr; @@ -106,6 +105,7 @@ int console_add_link(lua_State*); int console_add_route(lua_State*); int console_add_AS(lua_State*); int console_set_function(lua_State*); +int console_host_set_property(lua_State*); int console_parse_platform(void); int console_parse_application(void); diff --git a/src/gras/DataDesc/cbps.c b/src/gras/DataDesc/cbps.c index f5d1d13d5a..4584b19ea5 100644 --- a/src/gras/DataDesc/cbps.c +++ b/src/gras/DataDesc/cbps.c @@ -87,7 +87,8 @@ gras_cbps_v_push(gras_cbps_t ps, TRY { varstack = xbt_dict_get(ps->space, name); - } CATCH(e) { + } + CATCH(e) { if (e.category != mismatch_error) RETHROW; @@ -128,7 +129,8 @@ gras_cbps_v_pop(gras_cbps_t ps, XBT_DEBUG("pop(%s)", name); TRY { varstack = xbt_dict_get(ps->space, name); - } CATCH(e) { + } + CATCH(e) { if (e.category != mismatch_error) RETHROW; diff --git a/src/gras/DataDesc/datadesc_private.h b/src/gras/DataDesc/datadesc_private.h index 1a10ad28d4..1a7052da51 100644 --- a/src/gras/DataDesc/datadesc_private.h +++ b/src/gras/DataDesc/datadesc_private.h @@ -39,7 +39,7 @@ void gras_ddt_freev(void *ddt); * Descriptions of all known architectures * *******************************************/ -#define gras_arch_count 11 +#define gras_arch_count 12 typedef enum { gras_ddt_scalar_char = 0, gras_ddt_scalar_short = 1, diff --git a/src/gras/DataDesc/ddt_convert.c b/src/gras/DataDesc/ddt_convert.c index cb02afe49e..e329d76215 100644 --- a/src/gras/DataDesc/ddt_convert.c +++ b/src/gras/DataDesc/ddt_convert.c @@ -18,18 +18,25 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_ddt_convert, gras_ddt, /*** *** Table of all known architectures: *** - l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:) gras_arch=0; gras_arch_name=little32;; - l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=1; gras_arch_name=little32_4;; - - l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:) gras_arch=2; gras_arch_name=little64;; - - B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:) gras_arch=3; gras_arch_name=big32;; - B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=4; gras_arch_name=big32_8_4;; - B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:) gras_arch=5; gras_arch_name=big32_4;; - B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:) gras_arch=6; gras_arch_name=big32_2;; - - B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:) gras_arch=7; gras_arch_name=big64;; - +l_C:1/1:_I:2/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1: #gras_arch=0; gras_size=32; gras_arch_name=little32_1; +l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2: #gras_arch=1; gras_size=32; gras_arch_name=little32_2; +l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4: #gras_arch=2; gras_size=32; gras_arch_name=little32_4; +l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8: #gras_arch=3; gras_size=32; gras_arch_name=little32_8; +l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8: #gras_arch=4; gras_size=64; gras_arch_name=little64; +l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8: #gras_arch=5; gras_size=64; gras_arch_name=little64_2; + +B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8: #gras_arch=6; gras_size=32; gras_arch_name=big32_8; +B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4: #gras_arch=7; gras_size=32; gras_arch_name=big32_8_4; +B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4: #gras_arch=8; gras_size=32; gras_arch_name=big32_4; +B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2: #gras_arch=9; gras_size=32; gras_arch_name=big32_2; +B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8: #gras_arch=10; gras_size=64; gras_arch_name=big64; +B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4: #gras_arch=11; gras_size=64; gras_arch_name=big64_8_4; + + PLEASE DO NOT MESS WITH THESE HARDCODED VALUES + + + Grep GRAS_THISARCH in buildtools/Cmake/CompleteInFiles.cmake for details + ***/ const gras_arch_desc_t gras_arches[gras_arch_count] = { @@ -49,6 +56,9 @@ const gras_arch_desc_t gras_arches[gras_arch_count] = { {"little64", 0, {1, 2, 4, 8, 8, 8, 8, 4, 8}, /* alpha, ia64 */ {1, 2, 4, 8, 8, 8, 8, 4, 8}}, + {"little64_2", 0, {1, 2, 4, 4, 8, 8, 8, 4, 8}, /* win64 */ + {1, 2, 4, 4, 8, 8, 8, 4, 8}}, + {"big32_8", 1, {1, 2, 4, 4, 8, 4, 4, 4, 8}, {1, 2, 4, 4, 8, 4, 4, 4, 8}}, diff --git a/src/gras/DataDesc/ddt_create.c b/src/gras/DataDesc/ddt_create.c index 51f37af1f7..05eb79e766 100644 --- a/src/gras/DataDesc/ddt_create.c +++ b/src/gras/DataDesc/ddt_create.c @@ -55,7 +55,8 @@ gras_datadesc_type_t gras_datadesc_by_name_or_null(const char *name) TRY { res = gras_datadesc_by_name(name); - } CATCH(e) { + } + CATCH(e) { res = NULL; xbt_ex_free(e); } @@ -75,7 +76,8 @@ gras_datadesc_type_t gras_datadesc_by_name(const char *name) (gras_datadesc_type_t) xbt_set_get_by_name(gras_datadesc_set_local, name); found = 1; - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) RETHROW; xbt_ex_free(e); @@ -98,7 +100,8 @@ gras_datadesc_type_t gras_datadesc_by_id(long int code) res = (gras_datadesc_type_t) xbt_set_get_by_id(gras_datadesc_set_local, code); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) RETHROW; xbt_ex_free(e); diff --git a/src/gras/DataDesc/ddt_exchange.c b/src/gras/DataDesc/ddt_exchange.c index 8069511b51..60b19436e9 100644 --- a/src/gras/DataDesc/ddt_exchange.c +++ b/src/gras/DataDesc/ddt_exchange.c @@ -385,7 +385,6 @@ gras_datadesc_memcpy_rec(gras_cbps_t state, */ int gras_datadesc_memcpy(gras_datadesc_type_t type, void *src, void *dst) { - xbt_ex_t e; static gras_cbps_t state = NULL; static xbt_dict_t refs = NULL; /* all references already sent */ int size = 0; @@ -403,10 +402,12 @@ int gras_datadesc_memcpy(gras_datadesc_type_t type, void *src, void *dst) size = gras_datadesc_memcpy_rec(state, refs, type, (char *) src, (char *) dst, 0, type->cycle); - } TRY_CLEANUP { + } + TRY_CLEANUP { xbt_dict_reset(refs); gras_cbps_reset(state); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROW; } return size; @@ -630,8 +631,6 @@ gras_datadesc_send_rec(gras_socket_t sock, void gras_datadesc_send(gras_socket_t sock, gras_datadesc_type_t type, void *src) { - - xbt_ex_t e; static gras_cbps_t state = NULL; static xbt_dict_t refs = NULL; /* all references already sent */ @@ -645,10 +644,12 @@ void gras_datadesc_send(gras_socket_t sock, TRY { gras_datadesc_send_rec(sock, state, refs, type, (char *) src, type->cycle); - } TRY_CLEANUP { + } + TRY_CLEANUP { xbt_dict_reset(refs); gras_cbps_reset(state); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROW; } } @@ -970,8 +971,6 @@ void gras_datadesc_recv(gras_socket_t sock, gras_datadesc_type_t type, int r_arch, void *dst) { - - xbt_ex_t e; static gras_cbps_t state = NULL; /* callback persistent state */ static xbt_dict_t refs = NULL; /* all references already sent */ @@ -984,10 +983,12 @@ gras_datadesc_recv(gras_socket_t sock, TRY { gras_datadesc_recv_rec(sock, state, refs, type, r_arch, NULL, 0, (char *) dst, -1, type->cycle); - } TRY_CLEANUP { + } + TRY_CLEANUP { xbt_dict_reset(refs); gras_cbps_reset(state); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROW; } } diff --git a/src/gras/DataDesc/ddt_parse.c b/src/gras/DataDesc/ddt_parse.c index fc02a6f23d..d2657a750e 100644 --- a/src/gras/DataDesc/ddt_parse.c +++ b/src/gras/DataDesc/ddt_parse.c @@ -704,7 +704,6 @@ static gras_datadesc_type_t parse_typedef(char *definition) s_type_modifier_t tm; - gras_datadesc_type_t struct_desc = NULL; gras_datadesc_type_t typedef_desc = NULL; XBT_IN(""); @@ -714,7 +713,7 @@ static gras_datadesc_type_t parse_typedef(char *definition) parse_type_modifier(&tm); if (tm.is_struct) { - struct_desc = parse_struct(definition); + parse_struct(definition); } parse_type_modifier(&tm); diff --git a/src/gras/Msg/gras_msg_types.c b/src/gras/Msg/gras_msg_types.c index 2c2aef2701..fbf04a74a5 100644 --- a/src/gras/Msg/gras_msg_types.c +++ b/src/gras/Msg/gras_msg_types.c @@ -85,7 +85,8 @@ gras_msgtype_declare_ext(const char *name, msgtype = (gras_msgtype_t) xbt_set_get_by_name(_gras_msgtype_set, namev); found = 1; - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) { xbt_free(namev); RETHROW; @@ -182,7 +183,8 @@ gras_msgtype_t gras_msgtype_by_name_or_null(const char *name) TRY { res = gras_msgtype_by_namev(name, 0); - } CATCH(e) { + } + CATCH(e) { res = NULL; xbt_ex_free(e); } @@ -200,7 +202,8 @@ gras_msgtype_t gras_msgtype_by_namev(const char *name, short int version) TRY { res = (gras_msgtype_t) xbt_set_get_by_name(_gras_msgtype_set, namev); found = 1; - } CATCH(e) { + } + CATCH(e) { xbt_ex_free(e); } if (!found) diff --git a/src/gras/Msg/msg_interface.h b/src/gras/Msg/msg_interface.h index 2905b0cfda..b0c9543a48 100644 --- a/src/gras/Msg/msg_interface.h +++ b/src/gras/Msg/msg_interface.h @@ -50,7 +50,10 @@ void gras_msg_send_namev(gras_socket_t sock, void gras_msg_listener_awake(void); void gras_msg_listener_close_socket(int sd); -#define GRAS_PROTOCOL_VERSION '\1'; +#define GRAS_PROTOCOL_VERSION '\2'; +/* The difference between GRAS_PROTOCOL_VERSION=\1 (in SimGrid 3.6.1) and \2 (afterward) is that + the architectures were renumbered (GRAS_THISARCH were shifted by 1) to insert WIN64 near to WIN32. + See commit 27cbb00affed384593925fc5af6d5533d0a7ef09 */ #endif /* GRAS_MSG_INTERFACE_H */ diff --git a/src/gras/Msg/rl_msg.c b/src/gras/Msg/rl_msg.c index 5d5b48daf1..d3953714e1 100644 --- a/src/gras/Msg/rl_msg.c +++ b/src/gras/Msg/rl_msg.c @@ -117,7 +117,7 @@ void gras_msg_recv(gras_socket_t sock, gras_msg_t msg) gras_trp_recv(sock, &c_kind, 1); msg->kind = (e_gras_msg_kind_t) c_kind; } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF ("Exception caught while trying to get the message header: %s"); } @@ -155,7 +155,8 @@ void gras_msg_recv(gras_socket_t sock, gras_msg_t msg) TRY { msg->type = (gras_msgtype_t) xbt_set_get_by_name(_gras_msgtype_set, msg_name); - } CATCH(e) { + } + CATCH(e) { /* FIXME: Survive unknown messages */ if (e.category == not_found_error) { xbt_ex_free(e); diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index 2036788160..ef7e7ccaf2 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -38,7 +38,8 @@ static void gras_trp_plugin_new(const char *name, gras_trp_setup_t setup) TRY { setup(plug); - } CATCH(e) { + } + CATCH(e) { if (e.category == mismatch_error) { /* SG plugin raise mismatch when in RL mode (and vice versa) */ free(plug->name); @@ -187,8 +188,6 @@ gras_socket_t gras_socket_server_ext(unsigned short port, unsigned long int buf_size, int measurement) { - - xbt_ex_t e; gras_trp_plugin_t trp; gras_socket_t sock; @@ -209,8 +208,8 @@ gras_socket_server_ext(unsigned short port, XBT_DEBUG("in=%c out=%c accept=%c", sock->incoming ? 'y' : 'n', sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n'); - } CATCH(e) { - + } + CATCH_ANONYMOUS { free(sock); RETHROW; } @@ -274,8 +273,6 @@ gras_socket_client_ext(const char *host, unsigned short port, unsigned long int buf_size, int measurement) { - - xbt_ex_t e; gras_trp_plugin_t trp; gras_socket_t sock; @@ -295,7 +292,8 @@ gras_socket_client_ext(const char *host, XBT_DEBUG("in=%c out=%c accept=%c", sock->incoming ? 'y' : 'n', sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n'); - } CATCH(e) { + } + CATCH_ANONYMOUS { free(sock); RETHROW; } diff --git a/src/gras/Transport/transport_plugin_tcp.c b/src/gras/Transport/transport_plugin_tcp.c index 57a947121c..ad90f80ca9 100644 --- a/src/gras/Transport/transport_plugin_tcp.c +++ b/src/gras/Transport/transport_plugin_tcp.c @@ -223,6 +223,8 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) uint32_t hisport; + int failed=0; + XBT_IN(""); gras_trp_socket_new(1, &res); @@ -236,9 +238,14 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) sock_errstr(tmp_errno)); } - if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &i, s) - || setsockopt(sd, _gras_tcp_proto_number(), TCP_NODELAY, (char *) &i, - s)) + if (_gras_tcp_proto_number()!=-1) + if (setsockopt(sd, _gras_tcp_proto_number(), TCP_NODELAY, (char *) &i,s)) + failed=1; + + if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &i, s)) + failed=1; + + if (failed) THROWF(system_error, 0, "setsockopt failed, cannot condition the socket: %s", sock_errstr(tmp_errno)); @@ -785,7 +792,7 @@ void gras_trp_buf_socket_close(gras_socket_t sock) /****************************/ /* - * Returns the tcp protocol number from the network protocol data base. + * Returns the tcp protocol number from the network protocol data base, or -1 if not found * * getprotobyname() is not thread safe. We need to lock it. */ @@ -796,8 +803,12 @@ static int _gras_tcp_proto_number(void) if (returnValue == 0) { fetchedEntry = getprotobyname("tcp"); - xbt_assert(fetchedEntry, "getprotobyname(tcp) gave NULL"); - returnValue = fetchedEntry->p_proto; + if (fetchedEntry == NULL) { + XBT_VERB("getprotobyname(tcp) gave NULL"); + returnValue = -1; + } else { + returnValue = fetchedEntry->p_proto; + } } return returnValue; diff --git a/src/gras/Virtu/process.c b/src/gras/Virtu/process.c index f560472b92..de2085b4b8 100644 --- a/src/gras/Virtu/process.c +++ b/src/gras/Virtu/process.c @@ -89,7 +89,6 @@ void *gras_libdata_by_name_from_procdata(const char *name, gras_procdata_t * pd) { void *res = NULL; - xbt_ex_t e; if (xbt_set_length(pd->libdata) < xbt_dynar_length(_gras_procdata_fabrics)) { /* Damn, some new modules were added since procdata_init(). Amok? */ @@ -99,7 +98,7 @@ void *gras_libdata_by_name_from_procdata(const char *name, TRY { res = xbt_set_get_by_name(pd->libdata, name); } - CATCH(e) { + CATCH_ANONYMOUS { RETHROWF("Cannot retrieve the libdata associated to %s: %s", name); } return res; diff --git a/src/gras/Virtu/sg_process.c b/src/gras/Virtu/sg_process.c index 9cbfc465fc..1ea5b265f3 100644 --- a/src/gras/Virtu/sg_process.c +++ b/src/gras/Virtu/sg_process.c @@ -195,7 +195,7 @@ const char *gras_os_host_property_value(const char *name) name); } -/** @brief retrieve the host properties dictionnary +/** @brief retrieve the host properties dictionary * @warning it's the original one, not a copy. Don't mess with it */ xbt_dict_t gras_os_host_properties(void) diff --git a/src/gras/gras.c b/src/gras/gras.c index 33adad5d44..73615c52e5 100644 --- a/src/gras/gras.c +++ b/src/gras/gras.c @@ -68,6 +68,10 @@ XBT_LOG_EXTERNAL_CATEGORY(gras_virtu); XBT_LOG_EXTERNAL_CATEGORY(gras_virtu_emul); XBT_LOG_EXTERNAL_CATEGORY(gras_virtu_process); +/** + * @ingroup GRAS_API + * \brief Initialize the gras mechanisms. + */ void gras_init(int *argc, char **argv) { int first = 0; @@ -143,13 +147,15 @@ void gras_init(int *argc, char **argv) pd->listener = gras_msg_listener_launch(msg_pd->msg_received); } +/** + * @ingroup GRAS_API + * @brief Finalize the gras mechanisms. + * */ void gras_exit(void) { - gras_procdata_t *pd; XBT_INFO("Exiting GRAS"); amok_exit(); gras_moddata_leave(); - pd = gras_procdata_get(); gras_msg_listener_shutdown(); gras_process_exit(); if (--gras_running_process == 0) { diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index cef3ab7efd..10e9b3a7d6 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -15,23 +15,7 @@ #include "xbt/config.h" #include "surf/datatypes.h" #include "xbt/lib.h" - -xbt_lib_t host_lib; -int ROUTING_HOST_LEVEL; //Routing level -int SURF_CPU_LEVEL; //Surf cpu level -int SURF_WKS_LEVEL; //Surf workstation level -int SIMIX_HOST_LEVEL; //Simix level -int MSG_HOST_LEVEL; //Msg level -int SD_HOST_LEVEL; //Simdag level -int COORD_HOST_LEVEL; //Coordinates level - -xbt_lib_t link_lib; -int SD_LINK_LEVEL; //Simdag level -int SURF_LINK_LEVEL; //Surf level - -xbt_lib_t as_router_lib; -int ROUTING_ASR_LEVEL; //Routing level -int COORD_ASR_LEVEL; //Coordinates level +#include "surf/surf_routing.h" SG_BEGIN_DECL() /* Actions and models are highly connected structures... */ @@ -497,6 +481,32 @@ XBT_PUBLIC(void) surf_network_model_init_bypass(const char *id, XBT_PUBLIC(void) surf_network_model_init_GTNETS(const char *filename); #endif +#ifdef HAVE_NS3 +/** \brief Initializes the platform with the network model NS3 + * \ingroup SURF_models + * \param filename XML platform file name + * + * This function is called by surf_workstation_model_init_NS3 + * or by yourself only if you plan using surf_workstation_model_init_compound + * + * \see surf_workstation_model_init_NS3() + */ +XBT_PUBLIC(void) surf_network_model_init_NS3(const char *filename); + +XBT_PUBLIC(void) parse_ns3_add_host(void); +XBT_PUBLIC(void) parse_ns3_add_router(void); +XBT_PUBLIC(void) parse_ns3_add_link(void); +XBT_PUBLIC(void) parse_ns3_add_AS(void); +XBT_PUBLIC(void) parse_ns3_add_route(void); +XBT_PUBLIC(void) parse_ns3_add_ASroute(void); +XBT_PUBLIC(void) parse_ns3_add_cluster(void); +XBT_PUBLIC(void) parse_ns3_end_platform(void); +XBT_PUBLIC(void) create_ns3_topology(void); +XBT_PUBLIC(double) ns3_get_link_latency(const void *link); +XBT_PUBLIC(double) ns3_get_link_bandwidth(const void *link); + +#endif + /** \brief Initializes the platform with the network model Reno * \ingroup SURF_models * \param filename XML platform file name @@ -696,7 +706,9 @@ XBT_PUBLIC(void) surf_exit(void); /* Prototypes of the functions that handle the properties */ XBT_PUBLIC_DATA(xbt_dict_t) current_property_set; /* the prop set for the currently parsed element (also used in SIMIX) */ -XBT_PUBLIC_DATA(void) parse_properties(void); +XBT_PUBLIC_DATA(void) parse_properties(const char* prop_id, const char* prop_value); +XBT_PUBLIC_DATA(void) parse_properties_XML(void); +XBT_PUBLIC_DATA(void) parse_properties_lua(const char* prop_id, const char* prop_value); /* surf parse file related (public because called from a test suite) */ XBT_PUBLIC(void) parse_platform_file(const char *file); diff --git a/src/include/xbt/xbt_os_thread.h b/src/include/xbt/xbt_os_thread.h index e4e07fc063..61d4912064 100644 --- a/src/include/xbt/xbt_os_thread.h +++ b/src/include/xbt/xbt_os_thread.h @@ -10,6 +10,7 @@ #ifndef _XBT_OS_THREAD_H #define _XBT_OS_THREAD_H +#include "gras_config.h" #include "xbt/misc.h" /* SG_BEGIN_DECL */ #include "xbt/function_types.h" @@ -26,6 +27,14 @@ SG_BEGIN_DECL() /** \brief Thread data type (opaque structure) */ typedef struct xbt_os_thread_ *xbt_os_thread_t; +#ifdef HAVE_PTHREAD_H +#include +typedef pthread_key_t xbt_os_thread_key_t; +#elif defined(_XBT_WIN32) +#include +typedef DWORD xbt_os_thread_key_t; +#endif + /* Calls pthread_atfork() if present, and else does nothing. * The only known user of this wrapper is mmalloc_preinit(). */ @@ -46,6 +55,9 @@ XBT_PUBLIC(const char *) xbt_os_thread_self_name(void); XBT_PUBLIC(const char *) xbt_os_thread_name(xbt_os_thread_t); XBT_PUBLIC(void) xbt_os_thread_set_extra_data(void *data); XBT_PUBLIC(void *) xbt_os_thread_get_extra_data(void); +XBT_PUBLIC(void) xbt_os_thread_key_create(xbt_os_thread_key_t* key); +XBT_PUBLIC(void) xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value); +XBT_PUBLIC(void*) xbt_os_thread_get_specific(xbt_os_thread_key_t key); /* xbt_os_thread_join frees the joined thread (ie the XBT wrapper around it, the OS frees the rest) */ XBT_PUBLIC(void) xbt_os_thread_join(xbt_os_thread_t thread, void **thread_return); @@ -64,6 +76,14 @@ XBT_PUBLIC(void) xbt_os_mutex_timedacquire(xbt_os_mutex_t mutex, XBT_PUBLIC(void) xbt_os_mutex_release(xbt_os_mutex_t mutex); XBT_PUBLIC(void) xbt_os_mutex_destroy(xbt_os_mutex_t mutex); +/** \brief Thread reentrant mutex data type (opaque structure) */ +typedef struct xbt_os_rmutex_ *xbt_os_rmutex_t; + +XBT_PUBLIC(xbt_os_rmutex_t) xbt_os_rmutex_init(void); +XBT_PUBLIC(void) xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex); +XBT_PUBLIC(void) xbt_os_rmutex_release(xbt_os_rmutex_t rmutex); +XBT_PUBLIC(void) xbt_os_rmutex_destroy(xbt_os_rmutex_t rmutex); + /** \brief Thread condition data type (opaque structure) */ typedef struct xbt_os_cond_ *xbt_os_cond_t; diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index 998e2aa1b3..1511425c8b 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -13,25 +13,56 @@ XBT_LOG_NEW_CATEGORY(instr, "Logging the behavior of the tracing system (used fo XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration"); #define OPT_TRACING "tracing" +#define OPT_TRACING_PLATFORM "tracing/platform" #define OPT_TRACING_SMPI "tracing/smpi" #define OPT_TRACING_SMPI_GROUP "tracing/smpi/group" #define OPT_TRACING_CATEGORIZED "tracing/categorized" #define OPT_TRACING_UNCATEGORIZED "tracing/uncategorized" #define OPT_TRACING_MSG_TASK "tracing/msg/task" #define OPT_TRACING_MSG_PROCESS "tracing/msg/process" -#define OPT_TRACING_MSG_VOLUME "tracing/msg/volume" #define OPT_TRACING_FILENAME "tracing/filename" -#define OPT_TRACING_PLATFORM_METHOD "tracing/platform/method" +#define OPT_TRACING_BUFFER "tracing/buffer" +#define OPT_TRACING_ONELINK_ONLY "tracing/onelink_only" +#define OPT_TRACING_DISABLE_DESTROY "tracing/disable_destroy" #define OPT_TRIVA_UNCAT_CONF "triva/uncategorized" #define OPT_TRIVA_CAT_CONF "triva/categorized" +static int trace_enabled; +static int trace_platform; +static int trace_smpi_enabled; +static int trace_smpi_grouped; +static int trace_categorized; +static int trace_uncategorized; +static int trace_msg_task_enabled; +static int trace_msg_process_enabled; +static int trace_buffer; +static int trace_onelink_only; +static int trace_disable_destroy; + static int trace_configured = 0; static int trace_active = 0; xbt_dict_t created_categories; //declared in instr_interface.c +static void TRACE_getopts(void) +{ + trace_enabled = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING); + trace_platform = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_PLATFORM); + trace_smpi_enabled = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI); + trace_smpi_grouped = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI_GROUP); + trace_categorized = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_CATEGORIZED); + trace_uncategorized = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_UNCATEGORIZED); + trace_msg_task_enabled = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_TASK); + trace_msg_process_enabled = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_PROCESS); + trace_buffer = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_BUFFER); + trace_onelink_only = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_ONELINK_ONLY); + trace_disable_destroy = xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_DISABLE_DESTROY); +} + int TRACE_start() { + TRACE_getopts(); + // tracing system must be: // - enabled (with --cfg=tracing:1) // - already configured (TRACE_global_init already called) @@ -45,7 +76,9 @@ int TRACE_start() TRACE_paje_start(); /* activate trace */ - TRACE_activate (); + xbt_assert (trace_active==0, "Tracing is already active."); + trace_active = 1; + XBT_DEBUG ("Tracing is on"); /* other trace initialization */ created_categories = xbt_dict_new(); @@ -56,7 +89,7 @@ int TRACE_start() int TRACE_end() { - if (!TRACE_is_active()) + if (!trace_active) return 1; /* generate uncategorized graph configuration for triva */ @@ -79,33 +112,31 @@ int TRACE_end() /* close the trace file */ TRACE_paje_end(); - /* activate trace */ - TRACE_desactivate (); + /* de-activate trace */ + trace_active = 0; + XBT_DEBUG ("Tracing is off"); XBT_DEBUG("Tracing system is shutdown"); return 0; } -void TRACE_activate (void) -{ - xbt_assert (trace_active==0, "Tracing is already active."); - trace_active = 1; - XBT_DEBUG ("Tracing is on"); -} - -void TRACE_desactivate (void) +int TRACE_needs_platform (void) { - trace_active = 0; - XBT_DEBUG ("Tracing is off"); + return TRACE_msg_process_is_enabled() || + TRACE_msg_task_is_enabled() || + TRACE_categorized() || + TRACE_uncategorized() || + TRACE_platform () || + (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped()); } -int TRACE_is_active (void) +int TRACE_is_enabled(void) { - return trace_active; + return trace_enabled; } -int TRACE_is_enabled(void) +int TRACE_platform(void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING); + return trace_platform; } int TRACE_is_configured(void) @@ -115,51 +146,54 @@ int TRACE_is_configured(void) int TRACE_smpi_is_enabled(void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI) && + return (xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI) || + TRACE_smpi_is_grouped())&& TRACE_is_enabled(); } int TRACE_smpi_is_grouped(void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_SMPI_GROUP); + return trace_smpi_grouped; } int TRACE_categorized (void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_CATEGORIZED); + return trace_categorized; } int TRACE_uncategorized (void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_UNCATEGORIZED); + return trace_uncategorized; } int TRACE_msg_task_is_enabled(void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_TASK) && - TRACE_is_enabled(); + return trace_msg_task_enabled && TRACE_is_enabled(); } int TRACE_msg_process_is_enabled(void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_PROCESS) && - TRACE_is_enabled(); + return trace_msg_process_enabled && TRACE_is_enabled(); } -int TRACE_msg_volume_is_enabled(void) +int TRACE_buffer (void) { - return xbt_cfg_get_int(_surf_cfg_set, OPT_TRACING_MSG_VOLUME) && - TRACE_is_enabled(); + return trace_buffer && TRACE_is_enabled(); } -char *TRACE_get_filename(void) +int TRACE_onelink_only (void) { - return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_FILENAME); + return trace_onelink_only && TRACE_is_enabled(); +} + +int TRACE_disable_destroy (void) +{ + return trace_disable_destroy && TRACE_is_enabled(); } -char *TRACE_get_platform_method(void) +char *TRACE_get_filename(void) { - return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_PLATFORM_METHOD); + return xbt_cfg_get_string(_surf_cfg_set, OPT_TRACING_FILENAME); } char *TRACE_get_triva_uncat_conf (void) @@ -188,6 +222,13 @@ void TRACE_global_init(int *argc, char **argv) xbt_cfgelm_int, &default_tracing, 0, 1, NULL, NULL); + /* tracing platform*/ + int default_tracing_platform = 0; + xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_PLATFORM, + "Enable Tracing Platform.", + xbt_cfgelm_int, &default_tracing_platform, 0, 1, + NULL, NULL); + /* smpi */ int default_tracing_smpi = 0; xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_SMPI, @@ -204,10 +245,10 @@ void TRACE_global_init(int *argc, char **argv) /* platform */ - int default_tracing_platform = 0; + int default_tracing_categorized = 0; xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_CATEGORIZED, "Tracing of categorized platform (host and link) utilization.", - xbt_cfgelm_int, &default_tracing_platform, 0, 1, + xbt_cfgelm_int, &default_tracing_categorized, 0, 1, NULL, NULL); /* tracing uncategorized resource utilization */ @@ -217,13 +258,6 @@ void TRACE_global_init(int *argc, char **argv) xbt_cfgelm_int, &default_tracing_uncategorized, 0, 1, NULL, NULL); - /* platform method */ - char *default_tracing_platform_method = xbt_strdup("a"); - xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_PLATFORM_METHOD, - "Tracing method used to register categorized resource behavior.", - xbt_cfgelm_string, &default_tracing_platform_method, 1, - 1, NULL, NULL); - /* msg task */ int default_tracing_msg_task = 0; xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_MSG_TASK, @@ -238,11 +272,25 @@ void TRACE_global_init(int *argc, char **argv) xbt_cfgelm_int, &default_tracing_msg_process, 0, 1, NULL, NULL); - /* msg volume (experimental) */ - int default_tracing_msg_volume = 0; - xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_MSG_VOLUME, - "Tracing of MSG communication volume (experimental).", - xbt_cfgelm_int, &default_tracing_msg_volume, 0, 1, + /* tracing buffer */ + int default_buffer = 0; + xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_BUFFER, + "Buffer trace events to put them in temporal order.", + xbt_cfgelm_int, &default_buffer, 0, 1, + NULL, NULL); + + /* tracing one link only */ + int default_onelink_only = 0; + xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_ONELINK_ONLY, + "Use only routes with one link to trace platform.", + xbt_cfgelm_int, &default_onelink_only, 0, 1, + NULL, NULL); + + /* disable destroy */ + int default_disable_destroy = 0; + xbt_cfg_register(&_surf_cfg_set, OPT_TRACING_DISABLE_DESTROY, + "Disable platform containers destruction.", + xbt_cfgelm_int, &default_disable_destroy, 0, 1, NULL, NULL); /* Triva graph configuration for uncategorized tracing */ @@ -292,18 +340,6 @@ void TRACE_help (int detailed) " this simulator do not use tracing categories and resource use have to be\n" " traced.", detailed); - print_line (OPT_TRACING_PLATFORM_METHOD, "Change the resource utilization tracing method", - " It changes the way resource utilization (categorized or not) is traced\n" - " inside the simulation core. Method 'a' (default) traces all updates defined\n" - " by the CPU/network model of a given resource. Depending on the interface used\n" - " by this simulator (MSG, SMPI, SimDAG), the default method can generate large\n" - " trace files. Method 'b' tries to make smaller tracefiles using clever updates,\n" - " without losing details of resource utilization. Method 'c' generates even\n" - " smaller files by doing time integration during the simulation, but it loses\n" - " precision. If this last method is used, the smallest timeslice used in the\n" - " tracefile analysis must be bigger than the smaller resource utilization. If\n" - " unsure, do not change this option.", - detailed); print_line (OPT_TRACING_FILENAME, "Filename to register traces", " A file with this name will be created to register the simulation. The file\n" " is in the Paje format and can be analyzed using Triva or Paje visualization\n" @@ -330,9 +366,24 @@ void TRACE_help (int detailed) " behavior of all categorized MSG processes, grouping them by hosts. This option\n" " can be used to track process location if this simulator has process migration.", detailed); - print_line (OPT_TRACING_MSG_VOLUME, "Tracing of communication volume (MSG)", - " This experimental option only has effect if this simulator is MSG-based.\n" - " It traces the communication volume of MSG send/receive.", + print_line (OPT_TRACING_BUFFER, "Buffer events to put them in temporal order", + " This option put some events in a time-ordered buffer using the insertion\n" + " sort algorithm. The process of acquiring and releasing locks to access this\n" + " buffer and the cost of the sorting algorithm make this process slow. The\n" + " simulator performance can be severely impacted if this option is activated,\n" + " but you are sure to get a trace file with events sorted.", + detailed); + print_line (OPT_TRACING_ONELINK_ONLY, "Consider only one link routes to trace platform", + " This option changes the way SimGrid register its platform on the trace file.\n" + " Normally, the tracing considers all routes (no matter their size) on the\n" + " platform file to re-create the resource topology. If this option is activated,\n" + " only the routes with one link are used to register the topology within an AS.\n" + " Routes among AS continue to be traced as usual.", + detailed); + print_line (OPT_TRACING_DISABLE_DESTROY, "Disable platform containers destruction", + " Disable the destruction of containers at the end of simulation. This can be\n" + " used with simulators that have a different notion of time (different from\n" + " the simulated time).", detailed); print_line (OPT_TRIVA_UNCAT_CONF, "Generate graph configuration for Triva", " This option can be used in all types of simulators build with SimGrid\n" @@ -382,45 +433,18 @@ void TRACE_generate_triva_uncat_conf (void) ");\n" "\n"); - //register each NODE type layout - xbt_dict_foreach(trivaNodeTypes, cursor, name, value) { - fprintf (file, " %s = {\n", name); - if (strcmp (name, "HOST") == 0){ - fprintf (file, - " type = node;\n" - " size = power;\n" - " host_sep = {\n" - " type = separation;\n" - " size = power;\n" - " values = (power_used);\n" - " };\n"); - }else if (strcmp (name, "ROUTER") == 0){ - fprintf (file, - " type = node;\n" - " size = 10;\n"); - }else if (strcmp (name, "LINK") == 0){ - fprintf (file, - " type = edge;\n" - " size = bandwidth;\n" - " scale = global;\n" - " link_sep = {\n" - " type = separation;\n" - " size = bandwidth;\n" - " values = (bandwidth_used);\n" - " };\n"); - } - fprintf (file, " };\n\n"); - } - - //EDGE configuration - xbt_dict_foreach(trivaEdgeTypes, cursor, name, value) { - fprintf (file, " %s = { size = 1; };\n", name); - } - - //graphviz configuration - fprintf (file, "\n"); - fprintf (file, " graphviz-algorithm = neato;\n"); - + //configuration for all nodes + fprintf (file, + " host = {\n" + " type = square;\n" + " size = power;\n" + " values = (power_used);\n" + " };\n" + " link = {\n" + " type = rhombus;\n" + " size = bandwidth;\n" + " values = (bandwidth_used);\n" + " };\n"); //close fprintf (file, "}\n"); fclose (file); @@ -465,55 +489,28 @@ void TRACE_generate_triva_cat_conf (void) ");\n" "\n"); - //register each NODE type layout - xbt_dict_foreach(trivaNodeTypes, cursor, name, value) { - fprintf (file, " %s = {\n", name); - if (strcmp (name, "HOST") == 0){ - fprintf (file, - " type = node;\n" - " size = power;\n" - " host_sep = {\n" - " type = separation;\n" - " size = power;\n" - " values = ("); - xbt_dict_foreach(created_categories,cursor2,name2,value2) { - fprintf (file, "%s, ", name2); - } - fprintf (file, - ");\n" - " };\n"); - }else if (strcmp (name, "ROUTER") == 0){ - fprintf (file, - " type = node;\n" - " size = 10;\n"); - }else if (strcmp (name, "LINK") == 0){ - fprintf (file, - " type = edge;\n" - " size = bandwidth;\n" - " scale = global;\n" - " link_sep = {\n" - " type = separation;\n" - " size = bandwidth;\n" - " values = ("); - xbt_dict_foreach(created_categories,cursor2,name2,value2) { - fprintf (file, "%s, ", name2); - } - fprintf (file, - ");\n" - " };\n"); - } - fprintf (file, " };\n\n"); + //configuration for all nodes + fprintf (file, + " host = {\n" + " type = square;\n" + " size = power;\n" + " values = ("); + xbt_dict_foreach(created_categories,cursor2,name2,value2) { + fprintf (file, "p%s, ", name2); } - - //EDGE configuration - xbt_dict_foreach(trivaEdgeTypes, cursor, name, value) { - fprintf (file, " %s = { size = 1; };\n", name); + fprintf (file, + ");\n" + " };\n" + " link = {\n" + " type = rhombus;\n" + " size = bandwidth;\n" + " values = ("); + xbt_dict_foreach(created_categories,cursor2,name2,value2) { + fprintf (file, "b%s, ", name2); } - - //graphviz configuration - fprintf (file, "\n"); - fprintf (file, " graphviz-algorithm = neato;\n"); - + fprintf (file, + ");\n" + " };\n"); //close fprintf (file, "}\n"); fclose (file); @@ -521,15 +518,17 @@ void TRACE_generate_triva_cat_conf (void) } #undef OPT_TRACING +#undef OPT_TRACING_PLATFORM #undef OPT_TRACING_SMPI #undef OPT_TRACING_SMPI_GROUP #undef OPT_TRACING_CATEGORIZED #undef OPT_TRACING_UNCATEGORIZED #undef OPT_TRACING_MSG_TASK #undef OPT_TRACING_MSG_PROCESS -#undef OPT_TRACING_MSG_VOLUME #undef OPT_TRACING_FILENAME -#undef OPT_TRACING_PLATFORM_METHOD +#undef OPT_TRACING_BUFFER +#undef OPT_TRACING_ONELINK_ONLY +#undef OPT_TRACING_DISABLE_DESTROY #undef OPT_TRIVA_UNCAT_CONF #undef OPT_TRIVA_CAT_CONF diff --git a/src/instr/instr_interface.c b/src/instr/instr_interface.c index 49e0517e17..fabcf00831 100644 --- a/src/instr/instr_interface.c +++ b/src/instr/instr_interface.c @@ -9,6 +9,14 @@ #ifdef HAVE_TRACING #include "instr/instr_private.h" +#include "surf/network_private.h" + +typedef enum { + INSTR_US_DECLARE, + INSTR_US_SET, + INSTR_US_ADD, + INSTR_US_SUB, +} InstrUserVariable; XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_api, instr, "API"); @@ -19,11 +27,13 @@ void TRACE_category(const char *category) void TRACE_category_with_color (const char *category, const char *color) { - if (!(TRACE_is_active() && category != NULL)) - return; + /* safe switch */ + if (!TRACE_is_enabled()) return; + + if (!(TRACE_categorized() && category != NULL)) return; - xbt_assert (instr_platform_traced(), - "%s must be called after environment creation", __FUNCTION__); + /* if platform is not traced, we can't deal with categories */ + if (!TRACE_needs_platform()) return; //check if category is already created char *created = xbt_dict_get_or_null(created_categories, category); @@ -44,32 +54,16 @@ void TRACE_category_with_color (const char *category, const char *color) XBT_DEBUG("CAT,declare %s, %s", category, final_color); -//FIXME -// - if (final) { -// - //for m_process_t -// - if (TRACE_msg_process_is_enabled()) -// - pajeDefineContainerType("process", type, "process"); -// - if (TRACE_msg_process_is_enabled()) -// - pajeDefineStateType("process-state", "process", "process-state"); -// - -// - if (TRACE_msg_task_is_enabled()) -// - pajeDefineContainerType("task", type, "task"); -// - if (TRACE_msg_task_is_enabled()) -// - pajeDefineStateType("task-state", "task", "task-state"); -// - } - //define the type of this category on top of hosts and links - if (TRACE_categorized ()){ - instr_new_user_variable_type (category, final_color); - } + instr_new_variable_type (category, final_color); } void TRACE_declare_mark(const char *mark_type) { - if (!TRACE_is_active()) - return; - if (!mark_type) - return; + /* safe switch */ + if (!TRACE_is_enabled()) return; + + if (!mark_type) return; XBT_DEBUG("MARK,declare %s", mark_type); getEventType(mark_type, NULL, getRootType()); @@ -77,10 +71,10 @@ void TRACE_declare_mark(const char *mark_type) void TRACE_mark(const char *mark_type, const char *mark_value) { - if (!TRACE_is_active()) - return; - if (!mark_type || !mark_value) - return; + /* safe switch */ + if (!TRACE_is_enabled()) return; + + if (!mark_type || !mark_value) return; XBT_DEBUG("MARK %s %s", mark_type, mark_value); type_t type = getEventType (mark_type, NULL, getRootContainer()->type); @@ -88,61 +82,207 @@ void TRACE_mark(const char *mark_type, const char *mark_value) new_pajeNewEvent (MSG_get_clock(), getRootContainer(), type, value); } - -void TRACE_user_link_variable(double time, const char *resource, - const char *variable, - double value, const char *what) +static void instr_user_variable(double time, + const char *resource, + const char *variable, + const char *father_type, + double value, + InstrUserVariable what, + const char *color) { - if (!TRACE_is_active()) - return; + /* safe switch */ + if (!TRACE_is_enabled()) return; - xbt_assert (instr_platform_traced(), - "%s must be called after environment creation", __FUNCTION__); + /* if platform is not traced, we can't deal user variables */ + if (!TRACE_needs_platform()) return; char valuestr[100]; snprintf(valuestr, 100, "%g", value); - if (strcmp(what, "declare") == 0) { - instr_new_user_link_variable_type (variable, NULL); - } else{ - container_t container = getContainerByName (resource); + switch (what){ + case INSTR_US_DECLARE: + instr_new_user_variable_type (father_type, variable, color); + break; + case INSTR_US_SET: + { + container_t container = getContainerByName(resource); + type_t type = getVariableType (variable, NULL, container->type); + new_pajeSetVariable(time, container, type, value); + break; + } + case INSTR_US_ADD: + { + container_t container = getContainerByName(resource); + type_t type = getVariableType (variable, NULL, container->type); + new_pajeAddVariable(time, container, type, value); + break; + } + case INSTR_US_SUB: + { + container_t container = getContainerByName(resource); type_t type = getVariableType (variable, NULL, container->type); - if (strcmp(what, "set") == 0) { - new_pajeSetVariable(time, container, type, value); - } else if (strcmp(what, "add") == 0) { - new_pajeAddVariable(time, container, type, value); - } else if (strcmp(what, "sub") == 0) { - new_pajeSubVariable(time, container, type, value); - } + new_pajeSubVariable(time, container, type, value); + break; + } + default: + //TODO: launch exception + break; } } -void TRACE_user_host_variable(double time, const char *variable, - double value, const char *what) +static void instr_user_srcdst_variable(double time, + const char *src, + const char *dst, + const char *variable, + const char *father_type, + double value, + InstrUserVariable what) { - if (!TRACE_is_active()) - return; + xbt_dynar_t route = global_routing->get_route (src, dst); + unsigned int i; + void *link; + xbt_dynar_foreach (route, i, link) { + char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name; + instr_user_variable (time, link_name, variable, father_type, value, what, NULL); + } +} - xbt_assert (instr_platform_traced(), - "%s must be called after environment creation", __FUNCTION__); +const char *TRACE_node_name (xbt_node_t node) +{ + void *data = xbt_graph_node_get_data(node); + char *str = (char*)data; + return str; +} - char valuestr[100]; - snprintf(valuestr, 100, "%g", value); +xbt_graph_t TRACE_platform_graph (void) +{ + if (!TRACE_is_enabled()) return NULL; + return instr_routing_platform_graph (); +} - if (strcmp(what, "declare") == 0) { - instr_new_user_host_variable_type (variable, NULL); - } else{ - char *host_name = MSG_host_self()->name; - container_t container = getContainerByName(host_name); - type_t type = getVariableType (variable, NULL, container->type); - if (strcmp(what, "set") == 0) { - new_pajeSetVariable(time, container, type, value); - } else if (strcmp(what, "add") == 0) { - new_pajeAddVariable(time, container, type, value); - } else if (strcmp(what, "sub") == 0) { - new_pajeSubVariable(time, container, type, value); - } - } +void TRACE_platform_graph_export_graphviz (xbt_graph_t g, const char *filename) +{ + instr_routing_platform_graph_export_graphviz (g, filename); +} + + +/* + * Derived functions that use instr_user_variable and TRACE_user_srcdst_variable. + * They were previously defined as pre-processors directives, but were transformed + * into functions so the user can track them using gdb. + */ + +/* for host variables */ +void TRACE_host_variable_declare (const char *var) +{ + instr_user_variable(0, NULL, var, "HOST", 0, INSTR_US_DECLARE, NULL); +} + +void TRACE_host_variable_declare_with_color (const char *var, const char *color) +{ + instr_user_variable(0, NULL, var, "HOST", 0, INSTR_US_DECLARE, color); +} + +void TRACE_host_variable_set (const char *host, const char *variable, double value) +{ + TRACE_host_variable_set_with_time (MSG_get_clock(), host, variable, value); +} + +void TRACE_host_variable_add (const char *host, const char *variable, double value) +{ + TRACE_host_variable_add_with_time (MSG_get_clock(), host, variable, value); +} + +void TRACE_host_variable_sub (const char *host, const char *variable, double value) +{ + TRACE_host_variable_sub_with_time (MSG_get_clock(), host, variable, value); +} + +void TRACE_host_variable_set_with_time (double time, const char *host, const char *variable, double value) +{ + instr_user_variable(time, host, variable, "HOST", value, INSTR_US_SET, NULL); +} + +void TRACE_host_variable_add_with_time (double time, const char *host, const char *variable, double value) +{ + instr_user_variable(time, host, variable, "HOST", value, INSTR_US_ADD, NULL); +} + +void TRACE_host_variable_sub_with_time (double time, const char *host, const char *variable, double value) +{ + instr_user_variable(time, host, variable, "HOST", value, INSTR_US_SUB, NULL); +} + +/* for link variables */ +void TRACE_link_variable_declare (const char *var) +{ + instr_user_variable (0, NULL, var, "LINK", 0, INSTR_US_DECLARE, NULL); +} + +void TRACE_link_variable_declare_with_color (const char *var, const char *color) +{ + instr_user_variable (0, NULL, var, "LINK", 0, INSTR_US_DECLARE, color); +} + +void TRACE_link_variable_set (const char *link, const char *variable, double value) +{ + TRACE_link_variable_set_with_time (MSG_get_clock(), link, variable, value); +} + +void TRACE_link_variable_add (const char *link, const char *variable, double value) +{ + TRACE_link_variable_add_with_time (MSG_get_clock(), link, variable, value); +} + +void TRACE_link_variable_sub (const char *link, const char *variable, double value) +{ + TRACE_link_variable_sub_with_time (MSG_get_clock(), link, variable, value); +} + +void TRACE_link_variable_set_with_time (double time, const char *link, const char *variable, double value) +{ + instr_user_variable (time, link, variable, "LINK", value, INSTR_US_SET, NULL); +} + +void TRACE_link_variable_add_with_time (double time, const char *link, const char *variable, double value) +{ + instr_user_variable (time, link, variable, "LINK", value, INSTR_US_ADD, NULL); +} + +void TRACE_link_variable_sub_with_time (double time, const char *link, const char *variable, double value) +{ + instr_user_variable (time, link, variable, "LINK", value, INSTR_US_SUB, NULL); +} + +/* for link variables, but with src and dst used for get_route */ +void TRACE_link_srcdst_variable_set (const char *src, const char *dst, const char *variable, double value) +{ + TRACE_link_srcdst_variable_set_with_time (MSG_get_clock(), src, dst, variable, value); +} + +void TRACE_link_srcdst_variable_add (const char *src, const char *dst, const char *variable, double value) +{ + TRACE_link_srcdst_variable_add_with_time (MSG_get_clock(), src, dst, variable, value); +} + +void TRACE_link_srcdst_variable_sub (const char *src, const char *dst, const char *variable, double value) +{ + TRACE_link_srcdst_variable_sub_with_time (MSG_get_clock(), src, dst, variable, value); +} + +void TRACE_link_srcdst_variable_set_with_time (double time, const char *src, const char *dst, const char *variable, double value) +{ + instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_SET); +} + +void TRACE_link_srcdst_variable_add_with_time (double time, const char *src, const char *dst, const char *variable, double value) +{ + instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_ADD); +} + +void TRACE_link_srcdst_variable_sub_with_time (double time, const char *src, const char *dst, const char *variable, double value) +{ + instr_user_srcdst_variable (time, src, dst, variable, "LINK", value, INSTR_US_SUB); } #endif /* HAVE_TRACING */ diff --git a/src/instr/instr_msg_process.c b/src/instr/instr_msg_process.c index 99a8e630a4..365651cb2e 100644 --- a/src/instr/instr_msg_process.c +++ b/src/instr/instr_msg_process.c @@ -20,7 +20,12 @@ void TRACE_msg_set_process_category(m_process_t process, const char *category, c char *instr_process_id (m_process_t proc, char *str, int len) { - snprintf (str, len, "%s-%d", MSG_process_get_name(proc), MSG_process_get_PID(proc)); + return instr_process_id_2 (MSG_process_get_name(proc), MSG_process_get_PID(proc), str, len); +} + +char *instr_process_id_2 (const char *process_name, int process_pid, char *str, int len) +{ + snprintf (str, len, "%s-%d", process_name, process_pid); return str; } @@ -60,15 +65,14 @@ void TRACE_msg_process_change_host(m_process_t process, m_host_t old_host, m_hos } } -void TRACE_msg_process_create (m_process_t process) +void TRACE_msg_process_create (const char *process_name, int process_pid, m_host_t host) { if (TRACE_msg_process_is_enabled()){ int len = INSTR_DEFAULT_STR_SIZE; char str[INSTR_DEFAULT_STR_SIZE]; - m_host_t host = MSG_process_get_host(process); container_t host_container = getContainer(host->name); - container_t msg = newContainer(instr_process_id(process, str, len), INSTR_MSG_PROCESS, host_container); + container_t msg = newContainer(instr_process_id_2(process_name, process_pid, str, len), INSTR_MSG_PROCESS, host_container); type_t type = getType ("MSG_PROCESS_STATE", msg->type); val_t value = getValueByName ("executing", type); diff --git a/src/instr/instr_msg_task.c b/src/instr/instr_msg_task.c index 924ae904fe..b75039ea12 100644 --- a/src/instr/instr_msg_task.c +++ b/src/instr/instr_msg_task.c @@ -15,7 +15,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_msg, instr, "MSG"); */ void TRACE_msg_set_task_category(m_task_t task, const char *category) { - if (!TRACE_is_active()) + if (!TRACE_categorized()) return; xbt_assert(task->category == NULL, "Task %p(%s) already has a category (%s).", @@ -154,11 +154,6 @@ void TRACE_msg_task_get_end(double start_time, m_task_t task) if (TRACE_msg_task_is_enabled()){ - //FIXME - //if (TRACE_msg_volume_is_enabled()){ - // TRACE_msg_volume_end(task); - //} - m_host_t host = MSG_host_self(); container_t host_container = getContainer(host->name); container_t msg = newContainer(task->name, INSTR_MSG_TASK, host_container); @@ -207,11 +202,6 @@ int TRACE_msg_task_put_start(m_task_t task) new_pajeStartLink(MSG_get_clock(), getRootContainer(), type, msg, "SR", key); destroyContainer (msg); - - //FIXME - //if (TRACE_msg_volume_is_enabled()){ - // TRACE_msg_volume_start(task); - //} } if (TRACE_msg_process_is_enabled()){ diff --git a/src/instr/instr_msg_volume.c b/src/instr/instr_msg_volume.c deleted file mode 100644 index c8e1842dde..0000000000 --- a/src/instr/instr_msg_volume.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2010. The SimGrid Team. - * All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "instr/instr_private.h" - -#ifdef HAVE_TRACING - -void TRACE_msg_volume_start(m_task_t task) -{ - xbt_die ("tracing/msg/volume:1 is deprecated."); -// m_process_t process = NULL; -// m_host_t host = NULL; -// char process_name[200], process_alias[200]; -// char task_name[200]; -// double volume = 0; -// if (!TRACE_msg_volume_is_enabled()) -// return; -// -// /* check if task is traced */ -// if (!task->category) -// return; -// -// /* check if process is traced */ -// process = MSG_process_self(); -// if (!process->category) -// return; -// -// host = MSG_process_get_host(process); -// TRACE_process_container(process, process_name, 200); -// TRACE_process_alias_container(process, host, process_alias, 200); -// TRACE_task_container(task, task_name, 200); -// -// volume = MSG_task_get_data_size(task); -// -// pajeStartLinkWithVolume(MSG_get_clock(), "volume", "0", task->category, -// process_alias, task_name, volume); -} - -void TRACE_msg_volume_finish(m_task_t task) -{ - xbt_die ("tracing/msg/volume:1 is deprecated."); -// char process_name[200], process_alias[200]; -// char task_name[200]; -// m_process_t process = NULL; -// m_host_t host = NULL; -// if (!TRACE_msg_volume_is_enabled()) -// return; -// -// /* check if task is traced */ -// if (!task->category) -// return; -// -// /* check if process is traced */ -// process = MSG_process_self(); -// if (!process->category) -// return; -// -// host = MSG_process_get_host(process); -// TRACE_process_container(process, process_name, 200); -// TRACE_process_alias_container(process, host, process_alias, 200); -// TRACE_task_container(task, task_name, 200); -// -// pajeEndLink(MSG_get_clock(), "volume", "0", task->category, -// process_alias, task_name); -} - -#endif /* HAVE_TRACING */ diff --git a/src/instr/instr_paje.c b/src/instr/instr_paje.c index 74cb8813be..3c1591c188 100644 --- a/src/instr/instr_paje.c +++ b/src/instr/instr_paje.c @@ -233,6 +233,7 @@ container_t newContainer (const char *name, e_container_types kind, container_t static container_t recursiveGetContainer (const char *name, container_t root) { + if (name == NULL || root == NULL) return NULL; if (strcmp (root->name, name) == 0) return root; xbt_dict_cursor_t cursor = NULL; @@ -247,12 +248,22 @@ static container_t recursiveGetContainer (const char *name, container_t root) container_t getContainer (const char *name) { + if (name == NULL) return NULL; return recursiveGetContainer(name, rootContainer); } +int knownContainerWithName (const char *name) +{ + if (xbt_dict_get_or_null (allContainers, name)){ + return 1; + }else{ + return 0; + } +} + container_t getContainerByName (const char *name) { - return (container_t)xbt_dict_get_or_null (allContainers, name); + return (container_t)xbt_dict_get (allContainers, name); } char *getContainerIdByName (const char *name) @@ -299,7 +310,10 @@ void destroyContainer (container_t container) TRACE_paje_dump_buffer(1); //trace my destruction - new_pajeDestroyContainer(container); + if (!TRACE_disable_destroy()){ + //do not trace the container destruction if user requests + new_pajeDestroyContainer(container); + } //free xbt_free (container->name); diff --git a/src/instr/instr_paje_trace.c b/src/instr/instr_paje_trace.c index d2c4026885..fdc75c428f 100644 --- a/src/instr/instr_paje_trace.c +++ b/src/instr/instr_paje_trace.c @@ -176,6 +176,7 @@ double TRACE_last_timestamp_to_dump = 0; //dumps the trace file until the timestamp TRACE_last_timestamp_to_dump void TRACE_paje_dump_buffer (int force) { + if (!TRACE_is_enabled()) return; XBT_DEBUG("%s: dump until %f. starts", __FUNCTION__, TRACE_last_timestamp_to_dump); if (force){ paje_event_t event; @@ -223,7 +224,7 @@ void TRACE_paje_create_header(void) %%EndEventDef \n\ %%EventDef PajeDefineEventType %d \n\ %% Alias string \n\ -%% EntityType string \n\ +%% ContainerType string \n\ %% Name string \n\ %% Color color \n\ %%EndEventDef \n\ @@ -250,46 +251,46 @@ void TRACE_paje_create_header(void) %%EventDef PajeDestroyContainer %d \n\ %% Time date \n\ %% Type string \n\ -%% Container string \n\ +%% Name string \n\ %%EndEventDef \n\ %%EventDef PajeSetVariable %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %%EndEventDef\n\ %%EventDef PajeAddVariable %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %%EndEventDef\n\ %%EventDef PajeSubVariable %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %%EndEventDef\n\ %%EventDef PajeSetState %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %%EndEventDef\n\ %%EventDef PajePushState %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %%EndEventDef\n\ %%EventDef PajePopState %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %%EndEventDef\n\ %%EventDef PajeStartLink %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %% SourceContainer string \n\ @@ -297,7 +298,7 @@ void TRACE_paje_create_header(void) %%EndEventDef\n\ %%EventDef PajeEndLink %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %% DestContainer string \n\ @@ -305,7 +306,7 @@ void TRACE_paje_create_header(void) %%EndEventDef\n\ %%EventDef PajeNewEvent %d \n\ %% Time date \n\ -%% EntityType string \n\ +%% Type string \n\ %% Container string \n\ %% Value string \n\ %%EndEventDef\n", @@ -331,37 +332,25 @@ void TRACE_paje_create_header(void) /* internal do the instrumentation module */ static void insert_into_buffer (paje_event_t tbi) { + if (TRACE_buffer() == 0){ + tbi->print (tbi); + tbi->free (tbi); + return; + } XBT_DEBUG("%s: insert event_type=%d, timestamp=%f, buffersize=%ld)", __FUNCTION__, tbi->event_type, tbi->timestamp, xbt_dynar_length(buffer)); unsigned int i; - unsigned long len = xbt_dynar_length(buffer); - if (len == 0){ - xbt_dynar_push (buffer, &tbi); - XBT_DEBUG("%s: inserted at beginning", __FUNCTION__); - }else{ - //check if last event has the same timestamp that tbi event - paje_event_t e2 = *(paje_event_t*)xbt_dynar_get_ptr (buffer, len-1); - if (e2->timestamp == tbi->timestamp){ - //insert at the end - XBT_DEBUG("%s: inserted at end, pos = %ld", __FUNCTION__, len); - xbt_dynar_insert_at (buffer, len, &tbi); - return; - } - int inserted = 0; - for (i = 0; i < len; i++){ - paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i); - if (e1->timestamp > tbi->timestamp){ - xbt_dynar_insert_at (buffer, i, &tbi); - XBT_DEBUG("%s: inserted at %d", __FUNCTION__, i); - inserted = 1; - break; - } - } - if (!inserted){ - xbt_dynar_push (buffer, &tbi); - XBT_DEBUG("%s: inserted at end", __FUNCTION__); - } + for (i = xbt_dynar_length(buffer); i > 0; i--) { + paje_event_t e1 = *(paje_event_t*)xbt_dynar_get_ptr(buffer, i - 1); + if (e1->timestamp <= tbi->timestamp) + break; } + xbt_dynar_insert_at(buffer, i, &tbi); + if (i == 0) + XBT_DEBUG("%s: inserted at beginning", __FUNCTION__); + else + XBT_DEBUG("%s: inserted at%s %d", __FUNCTION__, + (i == xbt_dynar_length(buffer) - 1 ? " end, pos =" : ""), i); } static void print_pajeDefineContainerType(paje_event_t event) @@ -433,14 +422,14 @@ static void print_pajeCreateContainer(paje_event_t event) { XBT_DEBUG("%s: event_type=%d, timestamp=%f", __FUNCTION__, event->event_type, event->timestamp); if (event->timestamp == 0){ - fprintf(tracing_file, "%d 0 %s %s %s %s\n", + fprintf(tracing_file, "%d 0 %s %s %s \"%s\"\n", event->event_type, ((createContainer_t)event->data)->container->id, ((createContainer_t)event->data)->container->type->id, ((createContainer_t)event->data)->container->father->id, ((createContainer_t)event->data)->container->name); }else{ - fprintf(tracing_file, "%d %lf %s %s %s %s\n", + fprintf(tracing_file, "%d %lf %s %s %s \"%s\"\n", event->event_type, event->timestamp, ((createContainer_t)event->data)->container->id, diff --git a/src/instr/instr_private.h b/src/instr/instr_private.h index e3a67786d0..842dc7fd2a 100644 --- a/src/instr/instr_private.h +++ b/src/instr/instr_private.h @@ -11,12 +11,18 @@ #ifdef HAVE_TRACING +/* Need to define function drand48 for Windows */ +#ifdef _WIN32 +# define drand48() (rand()/(RAND_MAX + 1.0)) +#endif + #define INSTR_DEFAULT_STR_SIZE 500 #include "instr/instr.h" #include "msg/msg.h" #include "simdag/private.h" #include "simix/private.h" +#include "xbt/graph_private.h" typedef enum { TYPE_VARIABLE, @@ -105,9 +111,10 @@ void TRACE_msg_task_put_end(void); /* declaration of instrumentation functions from msg_process_instr.c */ char *instr_process_id (m_process_t proc, char *str, int len); +char *instr_process_id_2 (const char *process_name, int process_pid, char *str, int len); void TRACE_msg_process_change_host(m_process_t process, m_host_t old_host, m_host_t new_host); -void TRACE_msg_process_create (m_process_t process); +void TRACE_msg_process_create (const char *process_name, int process_pid, m_host_t host); void TRACE_msg_process_kill(m_process_t process); void TRACE_msg_process_suspend(m_process_t process); void TRACE_msg_process_resume(m_process_t process); @@ -115,15 +122,6 @@ void TRACE_msg_process_sleep_in(m_process_t process); //called from msg/gos.c void TRACE_msg_process_sleep_out(m_process_t process); void TRACE_msg_process_end(m_process_t process); -/* declaration of instrumentation functions from msg_volume.c */ -void TRACE_msg_volume_start(m_task_t task); -void TRACE_msg_volume_finish(m_task_t task); - -/* from smx.c */ -void TRACE_smx_host_execute(smx_action_t act); -void TRACE_smx_action_communicate(smx_action_t act, smx_process_t proc); -void TRACE_smx_action_destroy(smx_action_t act); - /* from surf_instr.c */ void TRACE_surf_alloc(void); void TRACE_surf_release(void); @@ -133,9 +131,7 @@ void TRACE_surf_link_set_latency(double date, const char *resource, double laten void TRACE_surf_action(surf_action_t surf_action, const char *category); //for tracing gtnets -void TRACE_surf_gtnets_communicate(void *action, int src, int dst); -int TRACE_surf_gtnets_get_src(void *action); -int TRACE_surf_gtnets_get_dst(void *action); +void TRACE_surf_gtnets_communicate(void *action, const char *src, const char *dst); void TRACE_surf_gtnets_destroy(void *action); /* from smpi_instr.c */ @@ -156,10 +152,9 @@ void TRACE_smpi_recv(int rank, int src, int dst); /* from instr_config.c */ int TRACE_start (void); int TRACE_end (void); -void TRACE_activate (void); -void TRACE_desactivate (void); -int TRACE_is_active (void); +int TRACE_needs_platform (void); int TRACE_is_enabled(void); +int TRACE_platform(void); int TRACE_is_configured(void); int TRACE_smpi_is_enabled(void); int TRACE_smpi_is_grouped(void); @@ -167,9 +162,10 @@ int TRACE_categorized (void); int TRACE_uncategorized (void); int TRACE_msg_task_is_enabled(void); int TRACE_msg_process_is_enabled(void); -int TRACE_msg_volume_is_enabled(void); +int TRACE_buffer (void); +int TRACE_onelink_only (void); +int TRACE_disable_destroy (void); char *TRACE_get_filename(void); -char *TRACE_get_platform_method(void); char *TRACE_get_triva_uncat_conf (void); char *TRACE_get_triva_cat_conf (void); void TRACE_global_init(int *argc, char **argv); @@ -206,6 +202,7 @@ extern xbt_dict_t trivaNodeTypes; extern xbt_dict_t trivaEdgeTypes; container_t newContainer (const char *name, e_container_types kind, container_t father); container_t getContainer (const char *name); +int knownContainerWithName (const char *name); container_t getContainerByName (const char *name); char *getContainerIdByName (const char *name); char *getVariableTypeIdByName (const char *name, type_t father); @@ -225,10 +222,11 @@ void destroyAllContainers (void); /* instr_routing.c */ void instr_routing_define_callbacks (void); -void instr_new_user_variable_type (const char *new_typename, const char *color); -void instr_new_user_link_variable_type (const char *new_typename, const char *color); -void instr_new_user_host_variable_type (const char *new_typename, const char *color); +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); 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); #endif /* HAVE_TRACING */ diff --git a/src/instr/instr_resource_utilization.c b/src/instr/instr_resource_utilization.c index 1e4cdf7ffa..ba5c51b503 100644 --- a/src/instr/instr_resource_utilization.c +++ b/src/instr/instr_resource_utilization.c @@ -13,22 +13,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_resource, instr, "tracing (un)-categorize //to check if variables were previously set to 0, otherwise paje won't simulate them static xbt_dict_t platform_variables; /* host or link name -> array of categories */ -//B -static xbt_dict_t method_b_dict; - -//C -static xbt_dict_t method_c_dict; - -//resource utilization tracing method -static void (*TRACE_method_alloc) (void) = NULL; -static void (*TRACE_method_release) (void) = NULL; -static void (*TRACE_method_start) (smx_action_t action) = NULL; -static void (*TRACE_method_event) (smx_action_t action, double now, - double delta, const char *variable, - const char *resource, double value) = - NULL; -static void (*TRACE_method_end) (smx_action_t action) = NULL; - //used by all methods static void __TRACE_surf_check_variable_set_to_zero(double now, const char *variable, @@ -67,20 +51,9 @@ static void __TRACE_surf_check_variable_set_to_zero(double now, /* end of check */ } -#define A_METHOD -//A -static void __TRACE_A_alloc(void) -{ -} - -static void __TRACE_A_release(void) -{ -} -static void __TRACE_A_start(smx_action_t action) -{ -} +/* static void __TRACE_A_event(smx_action_t action, double now, double delta, const char *variable, const char *resource, double value) @@ -94,190 +67,15 @@ static void __TRACE_A_event(smx_action_t action, double now, double delta, new_pajeAddVariable(now, container, type, value); new_pajeSubVariable(now + delta, container, type, value); } +*/ -static void __TRACE_A_end(smx_action_t action) -{ -} - -#define B_METHOD -//B - -static void __TRACE_B_alloc(void) -{ - method_b_dict = xbt_dict_new(); -} - -static void __TRACE_B_release(void) -{ - char *key, *time; - xbt_dict_cursor_t cursor = NULL; - xbt_dict_foreach(method_b_dict, cursor, key, time) { - char resource[INSTR_DEFAULT_STR_SIZE]; - char variable[INSTR_DEFAULT_STR_SIZE]; - char what[INSTR_DEFAULT_STR_SIZE]; - sscanf (key, "%s %s %s", resource, variable, what); - if (strcmp(what, "time")==0){ - char key_value[INSTR_DEFAULT_STR_SIZE]; - snprintf (key_value, INSTR_DEFAULT_STR_SIZE, "%s %s value", resource, variable); - char *value = xbt_dict_get_or_null (method_b_dict, key_value); - container_t container = getContainerByName (resource); - type_t type = getVariableType (variable, NULL, container->type); - new_pajeSubVariable(atof(time), container, type, atof(value)); - } - } - xbt_dict_free(&method_b_dict); -} - -static void __TRACE_B_start(smx_action_t action) -{ -} - -static void __TRACE_B_event(smx_action_t action, double now, double delta, - const char *variable, const char *resource, - double value) -{ - char key_time[INSTR_DEFAULT_STR_SIZE]; - char key_value[INSTR_DEFAULT_STR_SIZE]; - char nowstr[INSTR_DEFAULT_STR_SIZE]; - char valuestr[INSTR_DEFAULT_STR_SIZE]; - char nowdeltastr[INSTR_DEFAULT_STR_SIZE]; - - snprintf (key_time, INSTR_DEFAULT_STR_SIZE, "%s %s time", resource, variable); - snprintf (key_value, INSTR_DEFAULT_STR_SIZE, "%s %s value", resource, variable); - snprintf (nowstr, INSTR_DEFAULT_STR_SIZE, "%f", now); - snprintf (valuestr, INSTR_DEFAULT_STR_SIZE, "%f", value); - snprintf (nowdeltastr, INSTR_DEFAULT_STR_SIZE, "%f", now+delta); - - char *lasttimestr = xbt_dict_get_or_null(method_b_dict, key_time); - char *lastvaluestr = xbt_dict_get_or_null(method_b_dict, key_value); - if (lasttimestr == NULL){ - __TRACE_surf_check_variable_set_to_zero(now, variable, resource); - container_t container = getContainerByName (resource); - type_t type = getVariableType (variable, NULL, container->type); - new_pajeAddVariable(now, container, type, value); - xbt_dict_set(method_b_dict, key_time, xbt_strdup(nowdeltastr), xbt_free); - xbt_dict_set(method_b_dict, key_value, xbt_strdup(valuestr), xbt_free); - }else{ - double lasttime = atof (lasttimestr); - double lastvalue = atof (lastvaluestr); - - if (lastvalue == value){ - double dif = fabs(now - lasttime); - if (dif < 0.000001){ - //perfect, just go on - }else{ - //time changed, have to update - container_t container = getContainerByName (resource); - type_t type = getVariableType (variable, NULL, container->type); - new_pajeSubVariable(lasttime, container, type, lastvalue); - new_pajeAddVariable(now, container, type, value); - } - }else{ - //value changed, have to update - container_t container = getContainerByName (resource); - type_t type = getVariableType (variable, NULL, container->type); - new_pajeSubVariable(lasttime, container, type, lastvalue); - new_pajeAddVariable(now, container, type, value); - } - xbt_dict_set(method_b_dict, key_time, xbt_strdup(nowdeltastr), xbt_free); - xbt_dict_set(method_b_dict, key_value, xbt_strdup(valuestr), xbt_free); - } - return; -} - -static void __TRACE_B_end(smx_action_t action) -{ -} - -#define C_METHOD -//C -static void __TRACE_C_alloc(void) -{ - method_c_dict = xbt_dict_new(); -} - -static void __TRACE_C_release(void) +static void instr_event (double now, double delta, type_t variable, container_t resource, double value) { - xbt_dict_free(&method_c_dict); + __TRACE_surf_check_variable_set_to_zero(now, variable->name, resource->name); + new_pajeAddVariable(now, resource, variable, value); + new_pajeSubVariable(now + delta, resource, variable, value); } -static void __TRACE_C_start(smx_action_t action) -{ - char key[100]; - snprintf(key, 100, "%p", action); - - //check if exists - if (xbt_dict_get_or_null(method_c_dict, key)) { - xbt_dict_remove(method_c_dict, key); //should never execute here, but it does - } - xbt_dict_set(method_c_dict, key, xbt_dict_new(), xbt_free); -} - -static void __TRACE_C_event(smx_action_t action, double now, double delta, - const char *variable, const char *resource, - double value) -{ - char key[100]; - snprintf(key, 100, "%p", action); - - xbt_dict_t action_dict = xbt_dict_get(method_c_dict, key); - //setting start time - if (!xbt_dict_get_or_null(action_dict, "start")) { - char start_time[100]; - snprintf(start_time, 100, "%f", now); - xbt_dict_set(action_dict, "start", xbt_strdup(start_time), xbt_free); - } - //updating end time - char end_time[100]; - snprintf(end_time, 100, "%f", now + delta); - xbt_dict_set(action_dict, "end", xbt_strdup(end_time), xbt_free); - - //accumulate the value resource-variable - char res_var[300]; - snprintf(res_var, 300, "%s %s", resource, variable); - double current_value_f; - char *current_value = xbt_dict_get_or_null(action_dict, res_var); - if (current_value) { - current_value_f = atof(current_value); - current_value_f += value * delta; - } else { - current_value_f = value * delta; - } - char new_current_value[100]; - snprintf(new_current_value, 100, "%f", current_value_f); - xbt_dict_set(action_dict, res_var, xbt_strdup(new_current_value), - xbt_free); -} - -static void __TRACE_C_end(smx_action_t action) -{ - char key[100]; - snprintf(key, 100, "%p", action); - - xbt_dict_t action_dict = xbt_dict_get(method_c_dict, key); - double start_time = atof(xbt_dict_get(action_dict, "start")); - double end_time = atof(xbt_dict_get(action_dict, "end")); - - xbt_dict_cursor_t cursor = NULL; - char *action_dict_key, *action_dict_value; - xbt_dict_foreach(action_dict, cursor, action_dict_key, action_dict_value) { - char resource[100], variable[100]; - if (sscanf(action_dict_key, "%s %s", resource, variable) != 2) - continue; - __TRACE_surf_check_variable_set_to_zero(start_time, variable, - resource); - if (end_time - start_time != 0) { - container_t container = getContainerByName (resource); - type_t type = getVariableType (variable, NULL, container->type); - double val = atof(action_dict_value) / (end_time - start_time); - new_pajeSubVariable(start_time, container, type, val); - new_pajeAddVariable(end_time, container, type, val); - } - } - xbt_dict_remove(method_c_dict, key); -} - -#define RESOURCE_UTILIZATION_INTERFACE /* * TRACE_surf_link_set_utilization: entry point from SimGrid */ @@ -286,12 +84,8 @@ void TRACE_surf_link_set_utilization(const char *resource, smx_action_t smx_acti double value, double now, double delta) { - if (!TRACE_is_active()) - return; - if (!value) - return; //only trace link utilization if link is known by tracing mechanism - if (!getContainerByName(resource)) + if (!knownContainerWithName(resource)) return; if (!value) return; @@ -301,17 +95,20 @@ void TRACE_surf_link_set_utilization(const char *resource, smx_action_t smx_acti XBT_DEBUG("UNCAT LINK [%f - %f] %s bandwidth_used %f", now, now+delta, resource, value); container_t container = getContainerByName (resource); type_t type = getVariableType("bandwidth_used", NULL, container->type); - TRACE_surf_resource_utilization_event(smx_action, now, delta, type->name, container->name, value); + instr_event (now, delta, type, container, value); } //trace categorized utilization if (TRACE_categorized()){ if (!surf_action->category) return; - XBT_DEBUG("CAT LINK [%f - %f] %s %s %f", now, now+delta, resource, surf_action->category, value); + //variable of this category starts by 'b', because we have a link here + char category_type[INSTR_DEFAULT_STR_SIZE]; + snprintf (category_type, INSTR_DEFAULT_STR_SIZE, "b%s", surf_action->category); + XBT_DEBUG("CAT LINK [%f - %f] %s %s %f", now, now+delta, resource, category_type, value); container_t container = getContainerByName (resource); - type_t type = getVariableType(surf_action->category, NULL, container->type); - TRACE_surf_resource_utilization_event(smx_action, now, delta, type->name, container->name, value); + type_t type = getVariableType(category_type, NULL, container->type); + instr_event (now, delta, type, container, value); } return; } @@ -325,7 +122,8 @@ void TRACE_surf_host_set_utilization(const char *resource, double value, double now, double delta) { - if (!TRACE_is_active()) + //only trace host utilization if host is known by tracing mechanism + if (!knownContainerWithName(resource)) return; if (!value) return; @@ -335,86 +133,30 @@ void TRACE_surf_host_set_utilization(const char *resource, XBT_DEBUG("UNCAT HOST [%f - %f] %s power_used %f", now, now+delta, resource, value); container_t container = getContainerByName (resource); type_t type = getVariableType("power_used", NULL, container->type); - TRACE_surf_resource_utilization_event(smx_action, now, delta, type->name, container->name, value); + instr_event (now, delta, type, container, value); } //trace categorized utilization if (TRACE_categorized()){ if (!surf_action->category) return; - XBT_DEBUG("CAT HOST [%f - %f] %s %s %f", now, now+delta, resource, surf_action->category, value); + //variable of this category starts by 'p', because we have a host here + char category_type[INSTR_DEFAULT_STR_SIZE]; + snprintf (category_type, INSTR_DEFAULT_STR_SIZE, "p%s", surf_action->category); + XBT_DEBUG("CAT HOST [%f - %f] %s %s %f", now, now+delta, resource, category_type, value); container_t container = getContainerByName (resource); - type_t type = getVariableType(surf_action->category, NULL, container->type); - TRACE_surf_resource_utilization_event(smx_action, now, delta, type->name, container->name, value); + type_t type = getVariableType(category_type, NULL, container->type); + instr_event (now, delta, type, container, value); } return; } -/* - * __TRACE_surf_resource_utilization_*: entry points from tracing functions - */ -void TRACE_surf_resource_utilization_start(smx_action_t action) -{ - if (!TRACE_is_active()) - return; - XBT_DEBUG("START %p", action); - TRACE_method_start(action); -} - -void TRACE_surf_resource_utilization_event(smx_action_t action, double now, - double delta, - const char *variable, - const char *resource, - double value) -{ - if (!TRACE_is_active()) - return; - XBT_DEBUG("EVENT %p [%f - %f] %s %s %f", action, now, now+delta, resource, variable, value); - TRACE_method_event(action, now, delta, variable, resource, value); -} - -void TRACE_surf_resource_utilization_end(smx_action_t action) +void TRACE_surf_resource_utilization_alloc() { - if (!TRACE_is_active()) - return; - TRACE_method_end(action); - XBT_DEBUG("END %p", action); + platform_variables = xbt_dict_new(); } void TRACE_surf_resource_utilization_release() { - if (!TRACE_is_active()) - return; - TRACE_method_release(); -} - -static void __TRACE_define_method(char *method) -{ - if (!strcmp(method, "a")) { - TRACE_method_alloc = __TRACE_A_alloc; - TRACE_method_release = __TRACE_A_release; - TRACE_method_start = __TRACE_A_start; - TRACE_method_event = __TRACE_A_event; - TRACE_method_end = __TRACE_A_end; - } else if (!strcmp(method, "c")) { - TRACE_method_alloc = __TRACE_C_alloc; - TRACE_method_release = __TRACE_C_release; - TRACE_method_start = __TRACE_C_start; - TRACE_method_event = __TRACE_C_event; - TRACE_method_end = __TRACE_C_end; - } else { //default is B - TRACE_method_alloc = __TRACE_B_alloc; - TRACE_method_release = __TRACE_B_release; - TRACE_method_start = __TRACE_B_start; - TRACE_method_event = __TRACE_B_event; - TRACE_method_end = __TRACE_B_end; - } -} - -void TRACE_surf_resource_utilization_alloc() -{ - platform_variables = xbt_dict_new(); - __TRACE_define_method(TRACE_get_platform_method()); - TRACE_method_alloc(); } #endif /* HAVE_TRACING */ diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index 3dc81263c2..9ac0932864 100644 --- a/src/instr/instr_routing.c +++ b/src/instr/instr_routing.c @@ -9,6 +9,7 @@ #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"); @@ -47,36 +48,29 @@ static container_t findCommonFather (container_t root, container_t a1, container return NULL; } -static void linkContainers (const char *a1, const char *a2, xbt_dict_t filter) +static void linkContainers (container_t father, container_t src, container_t dst, xbt_dict_t filter) { //ignore loopback - if (strcmp (a1, "__loopback__") == 0 || strcmp (a2, "__loopback__") == 0) + if (strcmp (src->name, "__loopback__") == 0 || strcmp (dst->name, "__loopback__") == 0) return; - //check if we already register this pair (we only need one direction) - char aux1[INSTR_DEFAULT_STR_SIZE], aux2[INSTR_DEFAULT_STR_SIZE]; - snprintf (aux1, INSTR_DEFAULT_STR_SIZE, "%s%s", a1, a2); - snprintf (aux2, INSTR_DEFAULT_STR_SIZE, "%s%s", a2, a1); - if (xbt_dict_get_or_null (filter, aux1)) return; - if (xbt_dict_get_or_null (filter, aux2)) return; - - //ok, not found, register it - xbt_dict_set (filter, aux1, xbt_strdup ("1"), xbt_free); - xbt_dict_set (filter, aux2, xbt_strdup ("1"), xbt_free); - - container_t a1_container = getContainerByName (a1); - type_t a1_type = a1_container->type; - - container_t a2_container = getContainerByName (a2); - type_t a2_type = a2_container->type; - - container_t container = findCommonFather (getRootContainer(), a1_container, a2_container); - xbt_assert (container != NULL, "common father not found"); + if (filter != NULL){ + //check if we already register this pair (we only need one direction) + char aux1[INSTR_DEFAULT_STR_SIZE], aux2[INSTR_DEFAULT_STR_SIZE]; + snprintf (aux1, INSTR_DEFAULT_STR_SIZE, "%s%s", src->name, dst->name); + snprintf (aux2, INSTR_DEFAULT_STR_SIZE, "%s%s", dst->name, src->name); + if (xbt_dict_get_or_null (filter, aux1)) return; + if (xbt_dict_get_or_null (filter, aux2)) return; + + //ok, not found, register it + xbt_dict_set (filter, aux1, xbt_strdup ("1"), xbt_free); + xbt_dict_set (filter, aux2, xbt_strdup ("1"), xbt_free); + } //declare type char link_typename[INSTR_DEFAULT_STR_SIZE]; - snprintf (link_typename, INSTR_DEFAULT_STR_SIZE, "%s-%s", a1_type->name, a2_type->name); - type_t link_type = getLinkType (link_typename, container->type, a1_type, a2_type); + snprintf (link_typename, INSTR_DEFAULT_STR_SIZE, "%s-%s", src->type->name, dst->type->name); + type_t link_type = getLinkType (link_typename, father->type, src->type, dst->type); //register EDGE types for triva configuration xbt_dict_set (trivaEdgeTypes, link_type->name, xbt_strdup("1"), xbt_free); @@ -85,77 +79,70 @@ static void linkContainers (const char *a1, const char *a2, xbt_dict_t filter) static long long counter = 0; char key[INSTR_DEFAULT_STR_SIZE]; snprintf (key, INSTR_DEFAULT_STR_SIZE, "%lld", counter++); - new_pajeStartLink(SIMIX_get_clock(), container, link_type, a1_container, "G", key); - new_pajeEndLink(SIMIX_get_clock(), container, link_type, a2_container, "G", key); + new_pajeStartLink(SIMIX_get_clock(), father, link_type, src, "G", key); + new_pajeEndLink(SIMIX_get_clock(), father, link_type, dst, "G", key); } -static void recursiveGraphExtraction (container_t container, xbt_dict_t filter) +static void recursiveGraphExtraction (routing_component_t rc, container_t container, xbt_dict_t filter) { - if (xbt_dict_length(container->children)){ + if (xbt_dict_length (rc->routing_sons)){ xbt_dict_cursor_t cursor = NULL; - container_t child; + routing_component_t rc_son; char *child_name; //bottom-up recursion - xbt_dict_foreach(container->children, cursor, child_name, child) { - recursiveGraphExtraction (child, filter); + xbt_dict_foreach(rc->routing_sons, cursor, child_name, rc_son) { + container_t child_container = xbt_dict_get (container->children, rc_son->name); + recursiveGraphExtraction (rc_son, child_container, filter); } + } - //let's get routes - xbt_dict_cursor_t cursor1 = NULL, cursor2 = NULL; - container_t child1, child2; - const char *child_name1, *child_name2; - - xbt_dict_foreach(container->children, cursor1, child_name1, child1) { - xbt_dict_foreach(container->children, cursor2, child_name2, child2) { - if ((child1->kind == INSTR_HOST || child1->kind == INSTR_ROUTER) && - (child2->kind == INSTR_HOST || child2->kind == INSTR_ROUTER)){ - - //getting route - xbt_dynar_t route = NULL; - xbt_ex_t exception; - TRY { - route = global_routing->get_route (child_name1, child_name2); - }CATCH(exception) { - //no route between them, that's possible - continue; - } - - //link the route members - unsigned int cpt; - void *link; - char *previous_entity_name = (char*)child_name1; - xbt_dynar_foreach (route, cpt, link) { - char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name; - linkContainers (previous_entity_name, link_name, filter); - previous_entity_name = link_name; - } - linkContainers (previous_entity_name, child_name2, filter); - }else if (child1->kind == INSTR_AS && - child2->kind == INSTR_AS && - strcmp(child_name1, child_name2) != 0){ - - //getting route - routing_component_t root = global_routing->root; - route_extended_t route = NULL; - xbt_ex_t exception; - TRY { - route = root->get_route (root, child_name1, child_name2); - }CATCH(exception) { - //no route between them, that's possible - continue; - } - xbt_assert(route!=NULL, - "there is no ASroute between %s and %s", child_name1, child_name2); - unsigned int cpt; - void *link; - char *previous_entity_name = route->src_gateway; - xbt_dynar_foreach (route->generic_route.link_list, cpt, link) { - char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name; - linkContainers (previous_entity_name, link_name, filter); - previous_entity_name = link_name; - } - linkContainers (previous_entity_name, route->dst_gateway, filter); + //let's get routes + xbt_dict_cursor_t cursor1 = NULL, cursor2 = NULL; + container_t child1, child2; + const char *child1_name, *child2_name; + xbt_dict_foreach(container->children, cursor1, child1_name, child1) { + if (child1->kind == INSTR_LINK) continue; + xbt_dict_foreach(container->children, cursor2, child2_name, child2) { + if (child2->kind == INSTR_LINK) continue; + + if ((child1->kind == INSTR_HOST || child1->kind == INSTR_ROUTER) && + (child2->kind == INSTR_HOST || child2->kind == INSTR_ROUTER) && + strcmp (child1_name, child2_name) != 0){ + + xbt_dynar_t route = NULL; + route = global_routing->get_route_or_null (child1_name, child2_name); + if (route == NULL) continue; + + if (TRACE_onelink_only()){ + if (xbt_dynar_length (route) > 1) continue; + } + container_t previous = child1; + int i; + for (i = 0; i < xbt_dynar_length(route); i++){ + link_CM02_t *link = ((link_CM02_t*)xbt_dynar_get_ptr (route, i)); + char *link_name = (*link)->lmm_resource.generic_resource.name; + container_t current = getContainerByName(link_name); + linkContainers(container, previous, current, filter); + previous = current; + } + linkContainers(container, previous, child2, filter); + + }else if (child1->kind == INSTR_AS && + child2->kind == INSTR_AS && + strcmp(child1_name, child2_name) != 0){ + + route_extended_t route = rc->get_route (rc, child1_name, child2_name); + unsigned int cpt; + void *link; + container_t previous = getContainerByName(route->src_gateway); + xbt_dynar_foreach (route->generic_route.link_list, cpt, link) { + char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name; + container_t current = getContainerByName(link_name); + linkContainers (container, previous, current, filter); + previous = current; } + container_t last = getContainerByName(route->dst_gateway); + linkContainers (container, previous, last, filter); } } } @@ -167,45 +154,76 @@ static void recursiveGraphExtraction (container_t container, xbt_dict_t filter) static void instr_routing_parse_start_AS () { if (getRootContainer() == NULL){ - container_t root = newContainer ("0", INSTR_AS, NULL); + container_t root = newContainer (A_surfxml_AS_id, INSTR_AS, NULL); instr_paje_init (root); - currentContainer = xbt_dynar_new (sizeof(container_t), NULL); - xbt_dynar_push (currentContainer, &root); - if (TRACE_smpi_is_enabled()) { if (!TRACE_smpi_is_grouped()){ - container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1); - type_t mpi = getContainerType("MPI", father->type); + type_t mpi = getContainerType("MPI", root->type); getStateType ("MPI_STATE", mpi); getLinkType ("MPI_LINK", getRootType(), mpi, mpi); } } + + if (TRACE_needs_platform()){ + currentContainer = xbt_dynar_new (sizeof(container_t), NULL); + xbt_dynar_push (currentContainer, &root); + } + return; } - container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1); - container_t new = newContainer (A_surfxml_AS_id, INSTR_AS, father); - //push - xbt_dynar_push (currentContainer, &new); + if (TRACE_needs_platform()){ + container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1); + container_t new = newContainer (A_surfxml_AS_id, INSTR_AS, father); + xbt_dynar_push (currentContainer, &new); + } } static void instr_routing_parse_end_AS () { - xbt_dynar_pop_ptr (currentContainer); + if (TRACE_needs_platform()){ + xbt_dynar_pop_ptr (currentContainer); + } } static void instr_routing_parse_start_link () { container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1); - container_t new = newContainer (A_surfxml_link_id, INSTR_LINK, father); + const char *link_id = A_surfxml_link_id; + + double bandwidth_value = atof(A_surfxml_link_bandwidth); + double latency_value = atof(A_surfxml_link_latency); + xbt_dynar_t links_to_create = xbt_dynar_new (sizeof(char*), &xbt_free_ref); + + if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX){ + char *up = bprintf("%s_UP", link_id); + char *down = bprintf("%s_DOWN", link_id); + xbt_dynar_push_as (links_to_create, char*, xbt_strdup(up)); + xbt_dynar_push_as (links_to_create, char*, xbt_strdup(down)); + free (up); + free (down); + }else{ + xbt_dynar_push_as (links_to_create, char*, strdup(link_id)); + } - type_t bandwidth = getVariableType ("bandwidth", NULL, new->type); - type_t latency = getVariableType ("latency", NULL, new->type); - new_pajeSetVariable (0, new, bandwidth, atof(A_surfxml_link_bandwidth)); - new_pajeSetVariable (0, new, latency, atof(A_surfxml_link_latency)); - if (TRACE_uncategorized()){ - getVariableType ("bandwidth_used", "0.5 0.5 0.5", new->type); + char *link_name = NULL; + unsigned int i; + xbt_dynar_foreach (links_to_create, i, link_name){ + + container_t new = newContainer (link_name, INSTR_LINK, father); + + if (TRACE_categorized() || TRACE_uncategorized()){ + type_t bandwidth = getVariableType ("bandwidth", NULL, new->type); + type_t latency = getVariableType ("latency", NULL, new->type); + new_pajeSetVariable (0, new, bandwidth, bandwidth_value); + new_pajeSetVariable (0, new, latency, latency_value); + } + if (TRACE_uncategorized()){ + getVariableType ("bandwidth_used", "0.5 0.5 0.5", new->type); + } } + + xbt_dynar_free (&links_to_create); } static void instr_routing_parse_end_link () @@ -217,18 +235,18 @@ static void instr_routing_parse_start_host () container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1); container_t new = newContainer (A_surfxml_host_id, INSTR_HOST, father); - type_t power = getVariableType ("power", NULL, new->type); - new_pajeSetVariable (0, new, power, atof(A_surfxml_host_power)); + if (TRACE_categorized() || TRACE_uncategorized()) { + type_t power = getVariableType ("power", NULL, new->type); + new_pajeSetVariable (0, new, power, atof(A_surfxml_host_power)); + } if (TRACE_uncategorized()){ getVariableType ("power_used", "0.5 0.5 0.5", new->type); } - if (TRACE_smpi_is_enabled()) { - if (TRACE_smpi_is_grouped()){ - type_t mpi = getContainerType("MPI", new->type); - getStateType ("MPI_STATE", mpi); - getLinkType ("MPI_LINK", getRootType(), mpi, mpi); - } + if (TRACE_smpi_is_enabled() && TRACE_smpi_is_grouped()){ + type_t mpi = getContainerType("MPI", new->type); + getStateType ("MPI_STATE", mpi); + getLinkType ("MPI_LINK", getRootType(), mpi, mpi); } if (TRACE_msg_process_is_enabled()) { @@ -272,7 +290,7 @@ static void instr_routing_parse_end_platform () xbt_dynar_free(¤tContainer); currentContainer = NULL; xbt_dict_t filter = xbt_dict_new (); - recursiveGraphExtraction (getRootContainer(), filter); + recursiveGraphExtraction (global_routing->root, getRootContainer(), filter); xbt_dict_free(&filter); platform_created = 1; TRACE_paje_dump_buffer(1); @@ -280,10 +298,12 @@ static void instr_routing_parse_end_platform () void instr_routing_define_callbacks () { - if (!TRACE_is_active()) - return; + if (!TRACE_is_enabled()) return; + //always need the call backs to ASes (we need only the root AS), + //to create the rootContainer and the rootType properly surfxml_add_callback(STag_surfxml_AS_cb_list, &instr_routing_parse_start_AS); surfxml_add_callback(ETag_surfxml_AS_cb_list, &instr_routing_parse_end_AS); + if (!TRACE_needs_platform()) return; surfxml_add_callback(STag_surfxml_link_cb_list, &instr_routing_parse_start_link); surfxml_add_callback(ETag_surfxml_link_cb_list, &instr_routing_parse_end_link); surfxml_add_callback(STag_surfxml_host_cb_list, &instr_routing_parse_start_host); @@ -296,64 +316,200 @@ void instr_routing_define_callbacks () /* * user categories support */ -static void recursiveNewUserVariableType (const char *new_typename, const char *color, type_t root) +static void recursiveNewVariableType (const char *new_typename, const char *color, type_t root) { - if (!strcmp (root->name, "HOST") || !strcmp (root->name, "LINK")){ - getVariableType(new_typename, color, root); + if (!strcmp (root->name, "HOST")){ + char tnstr[INSTR_DEFAULT_STR_SIZE]; + snprintf (tnstr, INSTR_DEFAULT_STR_SIZE, "p%s", new_typename); + getVariableType(tnstr, color, root); + } + if (!strcmp (root->name, "LINK")){ + char tnstr[INSTR_DEFAULT_STR_SIZE]; + snprintf (tnstr, INSTR_DEFAULT_STR_SIZE, "b%s", new_typename); + getVariableType(tnstr, color, root); } xbt_dict_cursor_t cursor = NULL; type_t child_type; char *name; xbt_dict_foreach(root->children, cursor, name, child_type) { - recursiveNewUserVariableType (new_typename, color, child_type); + recursiveNewVariableType (new_typename, color, child_type); } } -void instr_new_user_variable_type (const char *new_typename, const char *color) +void instr_new_variable_type (const char *new_typename, const char *color) { - recursiveNewUserVariableType (new_typename, color, getRootType()); + recursiveNewVariableType (new_typename, color, getRootType()); } -static void recursiveNewUserLinkVariableType (const char *new_typename, const char *color, type_t root) +static void recursiveNewUserVariableType (const char *father_type, const char *new_typename, const char *color, type_t root) { - if (!strcmp (root->name, "LINK")){ + if (!strcmp (root->name, father_type)){ getVariableType(new_typename, color, root); } xbt_dict_cursor_t cursor = NULL; type_t child_type; char *name; xbt_dict_foreach(root->children, cursor, name, child_type) { - recursiveNewUserLinkVariableType (new_typename, color, child_type); + recursiveNewUserVariableType (father_type, new_typename, color, child_type); } } -void instr_new_user_link_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) { - recursiveNewUserLinkVariableType (new_typename, color, getRootType()); + recursiveNewUserVariableType (father_type, new_typename, color, getRootType()); } -static void recursiveNewUserHostVariableType (const char *new_typename, const char *color, type_t root) + +int instr_platform_traced () { - if (!strcmp (root->name, "HOST")){ - getVariableType(new_typename, color, root); - } - xbt_dict_cursor_t cursor = NULL; - type_t child_type; + return platform_created; +} + +#define GRAPHICATOR_SUPPORT_FUNCTIONS + + +static 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); + if (ret) return ret; + + ret = xbt_graph_new_node (graph, xbt_strdup(name)); + xbt_dict_set (nodes, name, ret, NULL); + return ret; +} + +static xbt_edge_t new_xbt_graph_edge (xbt_graph_t graph, xbt_node_t s, xbt_node_t d, xbt_dict_t edges) +{ + xbt_edge_t ret; char *name; - xbt_dict_foreach(root->children, cursor, name, child_type) { - recursiveNewUserHostVariableType (new_typename, color, child_type); + + const char *sn = TRACE_node_name (s); + const char *dn = TRACE_node_name (d); + + name = bprintf ("%s%s", sn, dn); + ret = xbt_dict_get_or_null (edges, name); + if (ret) return ret; + free (name); + name = bprintf ("%s%s", dn, sn); + ret = xbt_dict_get_or_null (edges, name); + if (ret) return ret; + + ret = xbt_graph_new_edge(graph, s, d, NULL); + xbt_dict_set (edges, name, ret, NULL); + return ret; +} + +static void recursiveXBTGraphExtraction (xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges, + routing_component_t rc, container_t container) +{ + if (xbt_dict_length (rc->routing_sons)){ + xbt_dict_cursor_t cursor = NULL; + routing_component_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); + recursiveXBTGraphExtraction (graph, nodes, edges, rc_son, child_container); + } + } + + //let's get routes + xbt_dict_cursor_t cursor1 = NULL, cursor2 = NULL; + container_t child1, child2; + const char *child1_name, *child2_name; + xbt_dict_foreach(container->children, cursor1, child1_name, child1) { + if (child1->kind == INSTR_LINK) continue; + xbt_dict_foreach(container->children, cursor2, child2_name, child2) { + if (child2->kind == INSTR_LINK) continue; + + if ((child1->kind == INSTR_HOST || child1->kind == INSTR_ROUTER) && + (child2->kind == INSTR_HOST || child2->kind == INSTR_ROUTER) && + strcmp (child1_name, child2_name) != 0){ + + xbt_dynar_t route = global_routing->get_route (child1_name, child2_name); + if (TRACE_onelink_only()){ + if (xbt_dynar_length (route) > 1) continue; + } + unsigned int cpt; + void *link; + xbt_node_t current, previous = new_xbt_graph_node(graph, child1_name, nodes); + xbt_dynar_foreach (route, cpt, link) { + char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name; + current = new_xbt_graph_node(graph, link_name, nodes); + new_xbt_graph_edge (graph, previous, current, edges); + //previous -> current + previous = current; + } + current = new_xbt_graph_node(graph, child2_name, nodes); + new_xbt_graph_edge (graph, previous, current, edges); + + }else if (child1->kind == INSTR_AS && + child2->kind == INSTR_AS && + strcmp(child1_name, child2_name) != 0){ + + route_extended_t route = rc->get_route (rc, child1_name, child2_name); + unsigned int cpt; + void *link; + xbt_node_t current, previous = new_xbt_graph_node(graph, route->src_gateway, nodes); + xbt_dynar_foreach (route->generic_route.link_list, cpt, link) { + char *link_name = ((link_CM02_t)link)->lmm_resource.generic_resource.name; + current = new_xbt_graph_node(graph, link_name, nodes); + //previous -> current + previous = current; + } + current = new_xbt_graph_node(graph, route->dst_gateway, nodes); + new_xbt_graph_edge (graph, previous, current, edges); + } + } } + } -void instr_new_user_host_variable_type (const char *new_typename, const char *color) +xbt_graph_t instr_routing_platform_graph (void) { - recursiveNewUserHostVariableType (new_typename, color, getRootType()); + xbt_graph_t ret = xbt_graph_new_graph (0, NULL); + xbt_dict_t nodes = xbt_dict_new (); + xbt_dict_t edges = xbt_dict_new (); + recursiveXBTGraphExtraction (ret, nodes, edges, global_routing->root, getRootContainer()); + return ret; } -int instr_platform_traced () +void instr_routing_platform_graph_export_graphviz (xbt_graph_t g, const char *filename) { - return platform_created; + unsigned int cursor = 0; + xbt_node_t node = NULL; + xbt_edge_t edge = NULL; + FILE *file = NULL; + + file = fopen(filename, "w"); + xbt_assert(file, "Failed to open %s \n", filename); + + if (g->directed) + fprintf(file, "digraph test {\n"); + else + fprintf(file, "graph test {\n"); + + fprintf(file, " graph [overlap=scale]\n"); + + fprintf(file, " node [shape=box, style=filled]\n"); + fprintf(file, + " node [width=.3, height=.3, style=filled, color=skyblue]\n\n"); + + xbt_dynar_foreach(g->nodes, cursor, node) { + fprintf(file, " \"%s\";\n", TRACE_node_name(node)); + } + xbt_dynar_foreach(g->edges, cursor, edge) { + const char *src_s = TRACE_node_name (edge->src); + const char *dst_s = TRACE_node_name (edge->dst); + if (g->directed) + fprintf(file, " \"%s\" -> \"%s\";\n", src_s, dst_s); + else + fprintf(file, " \"%s\" -- \"%s\";\n", src_s, dst_s); + } + fprintf(file, "}\n"); + fclose(file); + } #endif /* HAVE_TRACING */ diff --git a/src/instr/instr_simdag.c b/src/instr/instr_simdag.c index dc7c556029..067b954410 100644 --- a/src/instr/instr_simdag.c +++ b/src/instr/instr_simdag.c @@ -22,7 +22,7 @@ void TRACE_sd_task_destroy(SD_task_t task) void TRACE_sd_set_task_category(SD_task_t task, const char *category) { - if (!TRACE_is_active()) + if (!TRACE_is_enabled()) return; task->category = xbt_strdup (category); } diff --git a/src/instr/instr_smpi.c b/src/instr/instr_smpi.c index 130bc2635a..7cdf66f0f1 100644 --- a/src/instr/instr_smpi.c +++ b/src/instr/instr_smpi.c @@ -5,6 +5,9 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "instr/instr_private.h" +#include +#include + #ifdef HAVE_TRACING @@ -12,6 +15,59 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_smpi, instr, "Tracing SMPI"); static xbt_dict_t keys; +static const char *smpi_colors[] ={ + "recv", "255 000 000", + "irecv", "255 135 135", + "send", "000 000 255", + "isend", "135 135 255", + "sendrecv", "000 255 255", + "wait", "255 255 000", + "waitall", "200 200 000", + "waitany", "200 200 150", + + "allgather", "255 000 000", + "allgatherv", "255 135 135", + "allreduce", "255 000 255", + "alltoall", "135 000 255", + "alltoallv", "200 135 255", + "barrier", "000 200 200", + "bcast", "000 200 100", + "gather", "255 255 000", + "gatherv", "255 255 135", + "reduce", "000 255 000", + "reducescatter", "135 255 135", + "scan", "255 150 060", + "scatterv", "135 000 135", + "scatter", "255 190 140", + + NULL, NULL, +}; + +static char *str_tolower (const char *str) +{ + char *ret = xbt_strdup (str); + int i, n = strlen (ret); + for (i = 0; i < n; i++) + ret[i] = tolower (str[i]); + return ret; +} + +static const char *instr_find_color (const char *state) +{ + char *target = str_tolower (state); + const char *ret = NULL; + const char *current; + unsigned int i = 0; + while ((current = smpi_colors[i])){ + if (strcmp (state, current) == 0){ ret = smpi_colors[i+1]; break; } //exact match + if (strstr(target, current)) { ret = smpi_colors[i+1]; break; }; //as substring + i+=2; + } + free (target); + return ret; +} + + static char *smpi_container(int rank, char *container, int n) { snprintf(container, n, "rank-%d", rank); @@ -87,8 +143,6 @@ void TRACE_smpi_alloc() void TRACE_smpi_start(void) { - if (!TRACE_smpi_is_enabled()) return; - TRACE_start(); } @@ -111,7 +165,7 @@ void TRACE_smpi_init(int rank) if (TRACE_smpi_is_grouped()){ father = getContainer (SIMIX_host_self_get_name()); }else{ - father = getContainer ("0"); + father = getRootContainer (); } xbt_assert(father!=NULL, "Could not find a parent for mpi rank %s at function %s", str, __FUNCTION__); @@ -135,7 +189,8 @@ void TRACE_smpi_collective_in(int rank, int root, const char *operation) smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); container_t container = getContainer (str); type_t type = getType ("MPI_STATE", container->type); - val_t value = getValue (operation, "1 1 1", type); + const char *color = instr_find_color (operation); + val_t value = getValue (operation, color, type); new_pajePushState (SIMIX_get_clock(), container, type, value); } @@ -156,11 +211,13 @@ void TRACE_smpi_ptp_in(int rank, int src, int dst, const char *operation) { if (!TRACE_smpi_is_enabled()) return; + char str[INSTR_DEFAULT_STR_SIZE]; smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE); container_t container = getContainer (str); type_t type = getType ("MPI_STATE", container->type); - val_t value = getValue (operation, "1 1 1", type); + const char *color = instr_find_color (operation); + val_t value = getValue (operation, color, type); new_pajePushState (SIMIX_get_clock(), container, type, value); } diff --git a/src/instr/instr_smx.c b/src/instr/instr_smx.c deleted file mode 100644 index 9ead4a28bb..0000000000 --- a/src/instr/instr_smx.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2010. The SimGrid Team. - * All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -#include "instr/instr_private.h" - -#ifdef HAVE_TRACING - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_simix, instr, "Tracing Simix"); - -void TRACE_smx_host_execute(smx_action_t act) -{ - if (!TRACE_is_active()) return; - TRACE_surf_resource_utilization_start(act); - return; -} - -void TRACE_smx_action_communicate(smx_action_t act, smx_process_t proc) -{ - if (!TRACE_is_active()) return; - TRACE_surf_resource_utilization_start(act); - return; -} - -void TRACE_smx_action_destroy(smx_action_t act) -{ - if (!TRACE_is_active()) return; - TRACE_surf_resource_utilization_end(act); - return; -} - -#endif /* HAVE_TRACING */ diff --git a/src/instr/instr_surf.c b/src/instr/instr_surf.c index 4318df001c..73926c9050 100644 --- a/src/instr/instr_surf.c +++ b/src/instr/instr_surf.c @@ -6,6 +6,7 @@ #include "instr/instr_private.h" #include "surf/surf_private.h" +#include "surf/network_gtnets_private.h" #ifdef HAVE_TRACING @@ -23,7 +24,7 @@ void TRACE_surf_release(void) void TRACE_surf_host_set_power(double date, const char *resource, double power) { - if (!TRACE_is_active()) + if (!TRACE_is_enabled()) return; container_t container = getContainerByName(resource); @@ -33,7 +34,7 @@ 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) { - if (!TRACE_is_active()) + if (!TRACE_is_enabled()) return; container_t container = getContainerByName(resource); @@ -44,7 +45,7 @@ void TRACE_surf_link_set_bandwidth(double date, const char *resource, double ban //FIXME: this function is not used (latency availability traces support exists in surf network models?) void TRACE_surf_link_set_latency(double date, const char *resource, double latency) { - if (!TRACE_is_active()) + if (!TRACE_is_enabled()) return; container_t container = getContainerByName(resource); @@ -53,27 +54,23 @@ void TRACE_surf_link_set_latency(double date, const char *resource, double laten } /* to trace gtnets */ -void TRACE_surf_gtnets_communicate(void *action, int src, int dst) +void TRACE_surf_gtnets_communicate(void *action, const char *src, const char *dst) { -} - -int TRACE_surf_gtnets_get_src(void *action) -{ - return -1; -} - -int TRACE_surf_gtnets_get_dst(void *action) -{ - return -1; + surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action; + gtnets_action->src_name = xbt_strdup (src); + gtnets_action->dst_name = xbt_strdup (dst); } void TRACE_surf_gtnets_destroy(void *action) { + surf_action_network_GTNETS_t gtnets_action = (surf_action_network_GTNETS_t)action; + xbt_free (gtnets_action->src_name); + xbt_free (gtnets_action->dst_name); } void TRACE_surf_action(surf_action_t surf_action, const char *category) { - if (!TRACE_is_active()) + if (!TRACE_is_enabled()) return; if (!TRACE_categorized ()) return; diff --git a/src/instr/jedule/jedule_sd_binding.c b/src/instr/jedule/jedule_sd_binding.c index 664ea59271..8894bb9fac 100644 --- a/src/instr/jedule/jedule_sd_binding.c +++ b/src/instr/jedule/jedule_sd_binding.c @@ -91,7 +91,7 @@ static void create_hierarchy(routing_component_t current_comp, void jedule_setup_platform() { routing_component_t root_comp; - e_surf_network_element_type_t type; + // e_surf_network_element_type_t type; jed_simgrid_container_t root_container; @@ -102,7 +102,7 @@ void jedule_setup_platform() { XBT_DEBUG("root name %s\n", root_comp->name); // that doesn't work - type = root_comp->get_network_element_type(root_comp->name); + // type = root_comp->get_network_element_type(root_comp->name); jed_simgrid_create_container(&root_container, root_comp->name); jedule->root_container = root_container; diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index a43de263c4..f2d404ba14 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -42,32 +42,26 @@ static void MC_snapshot_add_region(mc_snapshot_t snapshot, void *start_addr, siz void MC_take_snapshot(mc_snapshot_t snapshot) { unsigned int i = 0; - char copy = 0; s_map_region reg; memory_map_t maps = get_memory_map(); - /* Save the std heap and the writtable mapped pages of libsimgrid */ - while(i < maps->mapsize - && (maps->regions[i].pathname == NULL - || memcmp(maps->regions[i].pathname, "/lib/ld", 7))){ - reg = maps->regions[i]; - if((reg.prot & PROT_WRITE)){ - if(reg.start_addr == std_heap){ - MC_snapshot_add_region(snapshot, reg.start_addr, - (char*)reg.end_addr - (char*)reg.start_addr); - - }else if(copy || (reg.pathname != NULL - && !memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10))){ - MC_snapshot_add_region(snapshot, reg.start_addr, - (char*)reg.end_addr - (char*)reg.start_addr); - /* This will force the save of the regions in the next iterations, - * but we assume that ld will be found mapped and break the loop - * before saving a wrong region.(This is ugly I know). */ - copy = TRUE; + /* Save the std heap and the writable mapped pages of libsimgrid */ + while (i < maps->mapsize) { + reg = maps->regions[i]; + if ((reg.prot & PROT_WRITE)){ + if (maps->regions[i].pathname == NULL){ + if (reg.start_addr == std_heap){ + MC_snapshot_add_region(snapshot, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); + } + } else { + if (!memcmp(basename(maps->regions[i].pathname), "libsimgrid", 10)){ + MC_snapshot_add_region(snapshot, reg.start_addr, (char*)reg.end_addr - (char*)reg.start_addr); } } - i++; } + i++; + } + /* FIXME: free the memory map */ } diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index 48b6872b05..1142da7c2a 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -76,15 +76,18 @@ int MC_random(int min, int max) */ void MC_wait_for_requests(void) { - smx_req_t req = NULL; - - do { - SIMIX_context_runall(simix_global->process_to_run); - while((req = SIMIX_request_pop())){ - if(!MC_request_is_visible(req)) - SIMIX_request_pre(req, 0); + smx_process_t process; + smx_req_t req; + unsigned int iter; + + while (xbt_dynar_length(simix_global->process_to_run)) { + SIMIX_process_runall(); + xbt_dynar_foreach(simix_global->process_that_ran, iter, process) { + req = &process->request; + if (req->call != REQ_NO_REQ && !MC_request_is_visible(req)) + SIMIX_request_pre(req, 0); } - } while (xbt_dynar_length(simix_global->process_to_run)); + } } int MC_deadlock_check() diff --git a/src/mc/mc_memory.c b/src/mc/mc_memory.c index d6a5063b7e..c2fe2a132e 100644 --- a/src/mc/mc_memory.c +++ b/src/mc/mc_memory.c @@ -13,6 +13,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_memory, mc, /* Pointers to each of the heap regions to use */ void *std_heap = NULL; /* memory erased each time the MC stuff rollbacks to the beginning. Almost everything goes here */ void *raw_heap = NULL; /* memory persistent over the MC rollbacks. Only MC stuff should go there */ +/* int raw_heap_fd; */ /* unsued */ /* Initialize the model-checker memory subsystem */ /* It creates the two heap regions: std_heap and raw_heap */ diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index 75a27c0f74..4f484495b5 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -1,5 +1,11 @@ #include "private.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_request, mc, + "Logging specific to MC (request)"); + +static char* pointer_to_string(void* pointer); +static char* buff_size_to_string(size_t size); + int MC_request_depend(smx_req_t r1, smx_req_t r2) { if(_surf_do_model_check == 2) @@ -142,32 +148,53 @@ int MC_request_depend(smx_req_t r1, smx_req_t r2) return TRUE; } +static char* pointer_to_string(void* pointer) { + + if (XBT_LOG_ISENABLED(mc_request, xbt_log_priority_verbose)) + return bprintf("%p", pointer); + + return xbt_strdup("(verbose only)"); +} + +static char* buff_size_to_string(size_t buff_size) { + + if (XBT_LOG_ISENABLED(mc_request, xbt_log_priority_verbose)) + return bprintf("%zu", buff_size); + + return xbt_strdup("(verbose only)"); +} + + char *MC_request_to_string(smx_req_t req, int value) { - char *type = NULL, *args = NULL, *str = NULL; + char *type = NULL, *args = NULL, *str = NULL, *p = NULL, *bs = NULL; smx_action_t act = NULL; size_t size = 0; - + switch(req->call){ case REQ_COMM_ISEND: type = xbt_strdup("iSend"); - args = bprintf("src=%s, buff=%p, size=%zu", req->issuer->name, - req->comm_isend.src_buff, req->comm_isend.src_buff_size); + p = pointer_to_string(req->comm_isend.src_buff); + bs = buff_size_to_string(req->comm_isend.src_buff_size); + args = bprintf("src=%s, buff=%s, size=%s", req->issuer->name, p, bs); break; case REQ_COMM_IRECV: size = req->comm_irecv.dst_buff_size ? *req->comm_irecv.dst_buff_size : 0; type = xbt_strdup("iRecv"); - args = bprintf("dst=%s, buff=%p, size=%zu", req->issuer->name, - req->comm_irecv.dst_buff, size); + p = pointer_to_string(req->comm_irecv.dst_buff); + bs = buff_size_to_string(size); + args = bprintf("dst=%s, buff=%s, size=%s", req->issuer->name, p, bs); break; case REQ_COMM_WAIT: act = req->comm_wait.comm; if(value == -1){ type = xbt_strdup("WaitTimeout"); - args = bprintf("comm=%p", act); + p = pointer_to_string(act); + args = bprintf("comm=%p", p); }else{ type = xbt_strdup("Wait"); - args = bprintf("comm=%p [(%lu)%s -> (%lu)%s]", act, + p = pointer_to_string(act); + args = bprintf("comm=%s [(%lu)%s -> (%lu)%s]", p, act->comm.src_proc ? act->comm.src_proc->pid : 0, act->comm.src_proc ? act->comm.src_proc->name : "", act->comm.dst_proc ? act->comm.dst_proc->pid : 0, @@ -178,20 +205,23 @@ char *MC_request_to_string(smx_req_t req, int value) act = req->comm_test.comm; if(act->comm.src_proc == NULL || act->comm.src_proc == NULL){ type = xbt_strdup("Test FALSE"); - args = bprintf("comm=%p", act); + p = pointer_to_string(act); + args = bprintf("comm=%s", p); }else{ type = xbt_strdup("Test TRUE"); - args = bprintf("comm=%p [(%lu)%s -> (%lu)%s]", act, - act->comm.src_proc ? act->comm.src_proc->pid : 0, - act->comm.src_proc ? act->comm.src_proc->name : "", - act->comm.dst_proc ? act->comm.dst_proc->pid : 0, - act->comm.dst_proc ? act->comm.dst_proc->name : ""); + p = pointer_to_string(act); + args = bprintf("comm=%s [(%lu)%s -> (%lu)%s]", p, + act->comm.src_proc ? act->comm.src_proc->pid : 0, + act->comm.src_proc ? act->comm.src_proc->name : "", + act->comm.dst_proc ? act->comm.dst_proc->pid : 0, + act->comm.dst_proc ? act->comm.dst_proc->name : ""); } break; case REQ_COMM_WAITANY: type = xbt_strdup("WaitAny"); - args = bprintf("comm=%p (%d of %lu)", xbt_dynar_get_as(req->comm_waitany.comms, value, smx_action_t), + p = pointer_to_string(xbt_dynar_get_as(req->comm_waitany.comms, value, smx_action_t)); + args = bprintf("comm=%s (%d of %lu)", p, value+1, xbt_dynar_length(req->comm_waitany.comms)); break; @@ -212,6 +242,8 @@ char *MC_request_to_string(smx_req_t req, int value) str = bprintf("[(%lu)%s] %s (%s)", req->issuer->pid ,req->issuer->name, type, args); xbt_free(type); xbt_free(args); + xbt_free(p); + xbt_free(bs); return str; } diff --git a/src/mc/private.h b/src/mc/private.h index 7b4acca159..1adc99aa82 100644 --- a/src/mc/private.h +++ b/src/mc/private.h @@ -122,7 +122,7 @@ void MC_print_statistics(mc_stats_t); extern void *std_heap; extern void *raw_heap; -int raw_heap_fd; +/* extern int raw_heap_fd; */ /* unused */ #define STD_HEAP_SIZE 20480000 /* Maximum size of the system's heap */ /* FIXME: Horrible hack! because the mmalloc library doesn't provide yet of */ diff --git a/src/mk_supernovae.pl b/src/mk_supernovae.pl index 5eb51000a6..bd99ab4238 100755 --- a/src/mk_supernovae.pl +++ b/src/mk_supernovae.pl @@ -44,7 +44,16 @@ open OUT, ">$outfile" or die "ERROR: cannot open $outfile: $!\n"; print OUT < #include "portable.h" diff --git a/src/msg/global.c b/src/msg/global.c index 6aa780db65..0652b7eb85 100644 --- a/src/msg/global.c +++ b/src/msg/global.c @@ -80,7 +80,7 @@ void MSG_global_init(int *argc, char **argv) #endif XBT_DEBUG("ADD MSG LEVELS"); - MSG_HOST_LEVEL = xbt_lib_add_level(host_lib,free); + MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_destroy); } /** \defgroup m_channel_management Understanding channels @@ -185,9 +185,6 @@ MSG_error_t MSG_clean(void) MSG_process_killall(0); - free(msg_global); - msg_global = NULL; - /* initialization of the action module */ _MSG_action_exit(); @@ -197,10 +194,8 @@ MSG_error_t MSG_clean(void) SIMIX_clean(); - // Exit the LIB host_lib - xbt_lib_free(&host_lib); - xbt_lib_free(&link_lib); - xbt_lib_free(&as_router_lib); + free(msg_global); + msg_global = NULL; return MSG_OK; } diff --git a/src/msg/gos.c b/src/msg/gos.c index 7d929e1376..4a09c655dd 100644 --- a/src/msg/gos.c +++ b/src/msg/gos.c @@ -486,9 +486,9 @@ void MSG_task_dsend(m_task_t task, const char *alias, void_f_pvoid_t cleanup) * \param name of the mailbox to receive the task on * \return the msg_comm_t communication created */ -msg_comm_t MSG_task_irecv(m_task_t *task, const char *alias) +msg_comm_t MSG_task_irecv(m_task_t *task, const char *name) { - smx_rdv_t rdv = MSG_mailbox_get_by_alias(alias); + smx_rdv_t rdv = MSG_mailbox_get_by_alias(name); CHECK_HOST(); diff --git a/src/msg/host.c b/src/msg/host.c index eef179c87b..d1425a2cba 100644 --- a/src/msg/host.c +++ b/src/msg/host.c @@ -120,28 +120,19 @@ m_host_t MSG_host_self(void) return MSG_process_get_host(MSG_process_self()); } -/* - * Real function to destroy a host. - * MSG_host_destroy is just a front_end that also removes it from +/** \ingroup m_host_management + * + * \brief Destroys a host */ void __MSG_host_destroy(m_host_t host) { simdata_host_t simdata = NULL; - int i = 0; - char alias[MAX_ALIAS_NAME + 1] = { 0 }; /* buffer used to build the key of the mailbox */ xbt_assert((host != NULL), "Invalid parameters"); - /* Clean Simulator data */ - /* SIMIX host will be cleaned when MSG_clean calls SIMIX_clean */ + /* Clean simulator data */ simdata = (host)->simdata; - for (i = 0; i < msg_global->max_channel; i++) { - sprintf(alias, "%s:%d", host->name, i); - MSG_mailbox_free((void *) (simdata->mailboxes[i])); - memset(alias, 0, MAX_ALIAS_NAME + 1); - } - if (msg_global->max_channel > 0) free(simdata->mailboxes); diff --git a/src/msg/m_process.c b/src/msg/m_process.c index 99e606ae8f..a7b18f880e 100644 --- a/src/msg/m_process.c +++ b/src/msg/m_process.c @@ -158,15 +158,15 @@ m_process_t MSG_process_create_with_environment(const char *name, simdata->PPID = -1; } +#ifdef HAVE_TRACING + TRACE_msg_process_create(name, simdata->PID, simdata->m_host); +#endif + /* Let's create the process: SIMIX may decide to start it right now, * even before returning the flow control to us */ SIMIX_req_process_create(&process, name, code, simdata, host->name, argc, argv, properties); -#ifdef HAVE_TRACING - TRACE_msg_process_create(process); -#endif - if (!process) { /* Undo everything we have just changed */ msg_global->PID--; diff --git a/src/msg/msg_mailbox.c b/src/msg/msg_mailbox.c index 979b95786e..259cc056f5 100644 --- a/src/msg/msg_mailbox.c +++ b/src/msg/msg_mailbox.c @@ -131,14 +131,10 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, simdata_task_t t_simdata = NULL; m_process_t process = MSG_process_self(); simdata_process_t p_simdata = SIMIX_process_self_get_data(); -#ifdef HAVE_TRACING - volatile smx_action_t comm = NULL; - int call_end = 0; -#endif CHECK_HOST(); #ifdef HAVE_TRACING - call_end = TRACE_msg_task_put_start(task); //must be after CHECK_HOST() + int call_end = TRACE_msg_task_put_start(task); //must be after CHECK_HOST() #endif /* Prepare the task to send */ @@ -158,14 +154,19 @@ MSG_mailbox_put_with_timeout(msg_mailbox_t mailbox, m_task_t task, /* Try to send it by calling SIMIX network layer */ TRY { #ifdef HAVE_TRACING - comm = SIMIX_req_comm_isend(mailbox, t_simdata->message_size, - t_simdata->rate, task, sizeof(void *), NULL, NULL, 0); - t_simdata->comm = comm; - SIMIX_req_set_category(comm, task->category); - SIMIX_req_comm_wait(comm, timeout); -#else - SIMIX_req_comm_send(mailbox, t_simdata->message_size, - t_simdata->rate, task, sizeof(void*), NULL, NULL, timeout); + if (TRACE_is_enabled()) { + smx_action_t comm = SIMIX_req_comm_isend(mailbox, t_simdata->message_size, + t_simdata->rate, task, sizeof(void *), + NULL, NULL, 0); + SIMIX_req_set_category(comm, task->category); + SIMIX_req_comm_wait(comm, timeout); + } else { +#endif + SIMIX_req_comm_send(mailbox, t_simdata->message_size, + t_simdata->rate, task, sizeof(void*), + NULL, NULL, timeout); +#ifdef HAVE_TRACING + } #endif } diff --git a/src/msg/task.c b/src/msg/task.c index 2908b353fe..2a9a5c09d9 100644 --- a/src/msg/task.c +++ b/src/msg/task.c @@ -189,7 +189,7 @@ MSG_error_t MSG_task_destroy(m_task_t task) /** \ingroup m_task_management * \brief Cancel a #m_task_t. - * \param task the taskt to cancel. If it was executed or transfered, it + * \param task the task to cancel. If it was executed or transfered, it stops the process that were working on it. */ MSG_error_t MSG_task_cancel(m_task_t task) @@ -198,13 +198,18 @@ MSG_error_t MSG_task_cancel(m_task_t task) if (task->simdata->compute) { SIMIX_req_host_execution_cancel(task->simdata->compute); - return MSG_OK; } - if (task->simdata->comm) { + else if (task->simdata->comm) { SIMIX_req_comm_cancel(task->simdata->comm); - return MSG_OK; } - THROW_IMPOSSIBLE; + else { + static int warned = 0; + if (!warned) { + XBT_WARN("Cannot cancel a non-running task"); + warned = 1; + } + } + return MSG_OK; } /** \ingroup m_task_management diff --git a/src/simdag/dax_dtd.c b/src/simdag/dax_dtd.c index 38a4b3d07f..94df9368b5 100644 --- a/src/simdag/dax_dtd.c +++ b/src/simdag/dax_dtd.c @@ -1255,8 +1255,7 @@ int dax__flex_debug = 0; #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *dax_text; -/* Validating XML processor for /home/mquinson/Code/simgrid/src/simdag/dax.dtd. - * Generated 2010/12/01 17:15:43. +/* Validating XML processor for src/simdag/dax.dtd. * * This program was generated with the FleXML XML processor generator. * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. diff --git a/src/simdag/dax_dtd.h b/src/simdag/dax_dtd.h index deaba20490..de7b9574b9 100644 --- a/src/simdag/dax_dtd.h +++ b/src/simdag/dax_dtd.h @@ -1,5 +1,4 @@ /* XML processor/application API for src/simdag/dax.dtd. - * Generated 2010/12/01 17:15:43. * * This program was generated with the FleXML XML processor generator. * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. diff --git a/src/simdag/dax_dtd.l b/src/simdag/dax_dtd.l deleted file mode 100644 index fa9c1389ea..0000000000 --- a/src/simdag/dax_dtd.l +++ /dev/null @@ -1,877 +0,0 @@ -/* Validating XML processor for /home/mquinson/Code/simgrid/src/simdag/dax.dtd. - * Generated 2010/12/01 17:15:43. - * - * This program was generated with the FleXML XML processor generator. - * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. - * FleXML is Copyright (C) 2003-2006 Martin Quinson. All rights reserved. - * (Id: flexml.pl,v 1.62 2007/10/11 10:00:14 mquinson Exp). - * - * There are two, intertwined parts to this program, part A and part B. - * - * Part A - * ------ - * - * Some parts, here collectively called "Part A", are found in the - * FleXML package. They are Copyright (C) 1999-2005 Kristoffer Rose - * and Copyright (C) 2003-2006 Martin Quinson. All rights reserved. - * - * You can redistribute, use, perform, display and/or modify "Part A" - * provided the following two conditions hold: - * - * 1. The program is distributed WITHOUT ANY WARRANTY from the author of - * FleXML; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * 2. The program distribution conditions do not in any way affect the - * distribution conditions of the FleXML system used to generate this - * file or any version of FleXML derived from that system. - * - * Notice that these are explicit rights granted to you for files - * generated by the FleXML system. For your rights in connection with - * the FleXML system itself please consult the GNU General Public License. - * - * Part B - * ------ - * - * The other parts, here collectively called "Part B", and which came - * from the DTD used by FleXML to generate this program, can be - * distributed (or not, as the case may be) under the terms of whoever - * wrote them, provided these terms respect and obey the two conditions - * above under the heading "Part A". - * - * The author of and contributors to FleXML specifically disclaim - * any copyright interest in "Part B", unless "Part B" was written - * by the author of or contributors to FleXML. - * - */ - -%{ - -/* Version strings. */ -const char rcs_dax__flexml_skeleton[] = - "$" "Id: skel,v 1.40 2007/10/11 09:57:24 mquinson Exp $"; -const char rcs_dax__flexml[] = - "$" "Id: flexml.pl,v 1.62 2007/10/11 10:00:14 mquinson Exp $"; - -/* ANSI headers. */ -#include /* for realloc() -- needed here when using flex 2.5.4 */ -#include -#include -#include -#include -#include - -#if defined(_XBT_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__) -# ifndef __STRICT_ANSI__ -# include -# include -# endif -#else -# include -#endif - -#ifndef FLEXML_INDEXSTACKSIZE -#define FLEXML_INDEXSTACKSIZE 1000 -#endif - -/* Generated definitions. */ -#define FLEXML_yylineno -#ifndef FLEXML_BUFFERSTACKSIZE -#define FLEXML_BUFFERSTACKSIZE 1000000 -#endif -#define FLEXML_NEED_BUFFERLIT - -/* XML processor api. */ -/* FleXML-provided data. */ -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) -AT_dax__uses_type AX_dax__uses_type; -#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type) -AT_dax__uses_optional AX_dax__uses_optional; -#define A_dax__uses_optional AX_dax__uses_optional -AT_dax__adag_name AX_dax__adag_name; -#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name) -AT_dax__child_ref AX_dax__child_ref; -#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref) -AT_dax__adag_xmlns AX_dax__adag_xmlns; -#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns) -AT_dax__uses_transfer AX_dax__uses_transfer; -#define A_dax__uses_transfer AX_dax__uses_transfer -AT_dax__job_id AX_dax__job_id; -#define A_dax__job_id (dax__bufferstack + AX_dax__job_id) -AT_dax__uses_file AX_dax__uses_file; -#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file) -AT_dax__parent_ref AX_dax__parent_ref; -#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref) -AT_dax__adag_count AX_dax__adag_count; -#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count) -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) -AT_dax__adag_index AX_dax__adag_index; -#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index) -AT_dax__uses_size AX_dax__uses_size; -#define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size) -AT_dax__adag_childCount AX_dax__adag_childCount; -#define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount) -AT_dax__uses_link AX_dax__uses_link; -#define A_dax__uses_link AX_dax__uses_link -AT_dax__job_runtime AX_dax__job_runtime; -#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime) -AT_dax__job_level AX_dax__job_level; -#define A_dax__job_level (dax__bufferstack + AX_dax__job_level) -AT_dax__job_namespace AX_dax__job_namespace; -#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace) -AT_dax__job_name AX_dax__job_name; -#define A_dax__job_name (dax__bufferstack + AX_dax__job_name) -AT_dax__adag_jobCount AX_dax__adag_jobCount; -#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount) -AT_dax__job_version AX_dax__job_version; -#define A_dax__job_version (dax__bufferstack + AX_dax__job_version) -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) -AT_dax__uses_register AX_dax__uses_register; -#define A_dax__uses_register AX_dax__uses_register -AT_dax__adag_fileCount AX_dax__adag_fileCount; -#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount) - -/* XML state. */ -#ifdef FLEX_DEBUG -# define ENTER(state) debug_enter(state,#state) -# define LEAVE debug_leave() -# define SET(state) debug_set(state,#state) - static void debug_enter(int, const char*); - static void debug_leave(void); - static void debug_set(int, const char*); -#else -# define ENTER(state) (yy_push_state(state)) -# define LEAVE (yy_pop_state()) -# define SET(state) BEGIN(state) -#endif - -/* Generic actions. */ -#define SKIP /*skip*/ -#define SUCCEED CLEANUP; return 0 - -#define FAIL return fail -static int fail(const char*, ...); - -enum {flexml_max_err_msg_size = 512}; -static char flexml_err_msg[flexml_max_err_msg_size]; -const char * dax__parse_err_msg() -{ - return flexml_err_msg; -} -static void reset_dax__parse_err_msg() -{ - flexml_err_msg[0] = '\0'; -} - -/* Cleanup */ -static void cleanup(void); -#define CLEANUP cleanup() - -/* Text buffer stack handling. */ -char *dax__bufferstack = NULL; -static int blimit = FLEXML_BUFFERSTACKSIZE; -static int bnext = 1; - -static int *indexstack = NULL; -static int ilimit = FLEXML_INDEXSTACKSIZE; -static int inext = 1; - -#define BUFFERSET(P) (P = bnext) -#define BUFFERPUTC(C) (ck_blimit(), dax__bufferstack[bnext++] = (C)) -#define BUFFERDONE (BUFFERPUTC('\0')) - -#define BUFFERLITERAL(C, P) dax__bufferliteral(C, &(P), yytext) - -/* after this is called, there are at least 2 slots left in the stack */ -static int ck_blimit() -{ - if (bnext >= blimit) { - blimit += FLEXML_BUFFERSTACKSIZE + 2; - { - char *temp = (char *) realloc(dax__bufferstack, blimit); - assert(temp); - dax__bufferstack = temp; - } - } - return 0; -} - -/* after this is called, there are at least 2 slots left in the stack */ -static int ck_ilimit() -{ - if (inext >= ilimit) { - ilimit += FLEXML_INDEXSTACKSIZE + 2; - { - int *temp = (int *) realloc(indexstack, ilimit); - assert(temp); - indexstack = temp; - } - } - return 0; -} - -#ifdef FLEXML_NEED_BUFFERLIT -static void dax__bufferliteral(char c, int* pp, const char* text) -{ - const char *s = (c ? strchr(text,c) : text-1), *e = strrchr(text,c); - assert(s <= e); BUFFERSET(*pp); - while (++s= 2); - bnext = indexstack[--inext]; - return indexstack[--inext]; -} - -/* General internal entities are `unput' back onto the input stream... */ -#define ENTITYTEXT(T) \ - { char *s = (T), *e = s+strlen(s);\ - while (--e >= s) { unput(*e); }} - - -%} - -/* Flex standard options. */ -%option stack -%option noyy_top_state -%option noinput -%option noreject -%option noyymore -%option noyywrap - -/* Flex user-requested options. */ -%option yylineno -%option nounput - -/* XML character classes (currently restricted to ASCII). */ - -/* "Common syntactic structures." */ -S [ \t\n\r\f]+ -s [ \t\n\r\f]* - -/* "Names and Tokens." */ -NameChar [A-Za-z0-9.:_-] -Name [A-Za-z_:]{NameChar}* -Names {Name}({S}{Name})* -Nmtoken ({NameChar})+ -Nmtokens {Nmtoken}({S}{Nmtoken})* - -/* Miscellaneous. */ -VersionNum [a-zA-Z0-9_.:-]+ -Eq {s}"="{s} -Literal \'[^'']*\'|\"[^""]*\" - -/* Parser states (flex `exclusive start conditions'): - * - * PROLOG the XML prolog of the document before - * DOCTYPE the XML prolog of the document after - * EPILOG after the root element - * INCOMMENT inside an XML comment - * INPI inside an XML PI - * VALUE1 inside a '...'-delimited literal - * VALUE2 inside a "..."-delimited literal - * CDATA inside a section. - * ROOT_ expect root element - * AL_ inside the attribute list for - * IN_ inside a with element contents (ready for end tag) - * IMPOSSIBLE dummy to permit disabling rules; must be last - */ -%x PROLOG DOCTYPE EPILOG INCOMMENT INPI VALUE1 VALUE2 CDATA -%x ROOT_dax__adag AL_dax__adag S_dax__adag S_dax__adag_1 S_dax__adag_2 S_dax__adag_3 S_dax__adag_4 S_dax__adag_5 E_dax__adag -%x AL_dax__job S_dax__job S_dax__job_1 S_dax__job_2 E_dax__job -%x AL_dax__uses E_dax__uses -%x AL_dax__child S_dax__child S_dax__child_1 S_dax__child_2 E_dax__child -%x AL_dax__parent E_dax__parent -%x IMPOSSIBLE - -%{ -/* State names. */ -const char* *dax__statenames=NULL; -%} - -%% - - /* Bypass Flex's default INITIAL state and begin by parsing the XML prolog. */ - SET(PROLOG); - reset_dax__parse_err_msg(); - dax__bufferstack = (char *) malloc(FLEXML_BUFFERSTACKSIZE); - assert(dax__bufferstack); - #ifdef FLEX_DEBUG - { - int i; - for (i = 0; i < blimit; i++) { - dax__bufferstack[i] = '\377'; - } - } - #endif - dax__bufferstack[0] = '\0'; - indexstack = (int *) malloc(FLEXML_INDEXSTACKSIZE * sizeof(int)); - assert(indexstack); - indexstack[0] = 0; - - /* FleXML_init */ - bnext = inext = 1; - dax__bufferliteral('\0', &bnext, "http://pegasus.isi.edu/schema/DAX"); - dax__bufferliteral('\0', &bnext, "http://www.w3.org/2001/XMLSchema-instance"); - dax__bufferliteral('\0', &bnext, "http://pegasus.isi.edu/schema/DAX http://pegasus.isi.edu/schema/dax-2.1.xsd"); - dax__bufferliteral('\0', &bnext, "1.0"); - dax__bufferliteral('\0', &bnext, "0.0"); - dax__bufferliteral('\0', &bnext, "data"); - if(!dax__statenames) {dax__statenames= (const char **)calloc(IMPOSSIBLE,sizeof(char*)); - dax__statenames[PROLOG] = NULL; - dax__statenames[DOCTYPE] = NULL; - dax__statenames[EPILOG] = NULL; - dax__statenames[INCOMMENT] = NULL; - dax__statenames[INPI] = NULL; - dax__statenames[VALUE1] = NULL; - dax__statenames[VALUE2] = NULL; - dax__statenames[CDATA] = NULL; - dax__statenames[ROOT_dax__adag] = NULL; - dax__statenames[AL_dax__adag] = NULL; - dax__statenames[S_dax__adag] = "adag"; - dax__statenames[S_dax__adag_1] = "adag"; - dax__statenames[S_dax__adag_2] = "adag"; - dax__statenames[S_dax__adag_3] = "adag"; - dax__statenames[S_dax__adag_4] = "adag"; - dax__statenames[S_dax__adag_5] = "adag"; - dax__statenames[E_dax__adag] = "adag"; - dax__statenames[AL_dax__job] = NULL; - dax__statenames[S_dax__job] = "job"; - dax__statenames[S_dax__job_1] = "job"; - dax__statenames[S_dax__job_2] = "job"; - dax__statenames[E_dax__job] = "job"; - dax__statenames[AL_dax__uses] = NULL; - dax__statenames[E_dax__uses] = "uses"; - dax__statenames[AL_dax__child] = NULL; - dax__statenames[S_dax__child] = "child"; - dax__statenames[S_dax__child_1] = "child"; - dax__statenames[S_dax__child_2] = "child"; - dax__statenames[E_dax__child] = "child"; - dax__statenames[AL_dax__parent] = NULL; - dax__statenames[E_dax__parent] = "parent"; - } - - /* COMMENTS and PIs: handled uniformly for efficiency. */ - -{ - "" LEAVE; - "--" | - . | - \n SKIP; - <> FAIL("EOF in comment."); -} -{ - "?>" LEAVE; - . | - \n SKIP; - <> FAIL("EOF in PI (processing instruction)."); -} - - /* SPACES: skipped uniformly */ - -{S} SKIP; - - /* PROLOG: determine root element and process it. */ - -{ - "" SET(ROOT_dax__adag); - "]*">" FAIL("Bad declaration %s.",yytext); -} - -{ - "" SET(ROOT_dax__adag); - "-][^>]*">" FAIL("Bad declaration %s.",yytext); - . FAIL("Unexpected character `%c' in prolog.", yytext[0]); - <> FAIL("EOF in prolog."); -} - - /* RULES DERIVED FROM DTD. */ - - /* */ - -" is not allowed here."); - -"{ - "xmlns"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_xmlns); - "xmlns"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_xmlns); - - "xmlns:xsi"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_xmlns_c_xsi); - "xmlns:xsi"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_xmlns_c_xsi); - - "xsi:schemaLocation"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_xsi_c_schemaLocation); - "xsi:schemaLocation"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_xsi_c_schemaLocation); - - "version"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_version); - "version"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_version); - - "count"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_count); - "count"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_count); - - "index"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_index); - "index"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_index); - - "name"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_name); - "name"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_name); - - "jobCount"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_jobCount); - "jobCount"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_jobCount); - - "fileCount"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_fileCount); - "fileCount"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_fileCount); - - "childCount"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__adag_childCount); - "childCount"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__adag_childCount); - - ">" { - LEAVE; STag_dax__adag();dax__pcdata_ix = 0; ENTER(S_dax__adag); - } - "/>" { - LEAVE; STag_dax__adag(); dax__pcdata_ix = 0; ETag_dax__adag(); popbuffer(); /* attribute */ - switch (YY_START) { - case ROOT_dax__adag: SET(EPILOG); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of adag element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `adag' element start tag.",yytext); - <> FAIL("EOF in attribute list of `adag' element."); -} - -{ - "" { - LEAVE; - ETag_dax__adag(); - popbuffer(); /* attribute */ - switch (YY_START) { - case ROOT_dax__adag: SET(EPILOG); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__job_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__job_id); - - "namespace"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__job_namespace); - "namespace"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__job_namespace); - - "name"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__job_name); - "name"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__job_name); - - "version"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__job_version); - "version"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__job_version); - - "runtime"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__job_runtime); - "runtime"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__job_runtime); - - "level"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__job_level); - "level"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__job_level); - - ">" { - if (!AX_dax__job_id) FAIL("Required attribute `id' not set for `job' element."); - if (!AX_dax__job_name) FAIL("Required attribute `name' not set for `job' element."); - if (!AX_dax__job_runtime) FAIL("Required attribute `runtime' not set for `job' element."); - LEAVE; STag_dax__job();dax__pcdata_ix = 0; ENTER(S_dax__job); - } - "/>" { - if (!AX_dax__job_id) FAIL("Required attribute `id' not set for `job' element."); - if (!AX_dax__job_name) FAIL("Required attribute `name' not set for `job' element."); - 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; - } - } - . FAIL("Unexpected character `%c' in attribute list of job element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `job' element start tag.",yytext); - <> FAIL("EOF in attribute list of `job' element."); -} - -{ - "" { - LEAVE; - 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; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* - * */ - -" is not allowed here."); - -"{ - "file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__uses_file); - "file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__uses_file); - - "link"{Eq}"'input'" | - "link"{Eq}"\"input\"" A_dax__uses_link = A_dax__uses_link_input; - "link"{Eq}"'output'" | - "link"{Eq}"\"output\"" A_dax__uses_link = A_dax__uses_link_output; - - "register"{Eq}"'false'" | - "register"{Eq}"\"false\"" A_dax__uses_register = A_dax__uses_register_false; - "register"{Eq}"'true'" | - "register"{Eq}"\"true\"" A_dax__uses_register = A_dax__uses_register_true; - - "transfer"{Eq}"'false'" | - "transfer"{Eq}"\"false\"" A_dax__uses_transfer = A_dax__uses_transfer_false; - "transfer"{Eq}"'true'" | - "transfer"{Eq}"\"true\"" A_dax__uses_transfer = A_dax__uses_transfer_true; - - "optional"{Eq}"'false'" | - "optional"{Eq}"\"false\"" A_dax__uses_optional = A_dax__uses_optional_false; - "optional"{Eq}"'true'" | - "optional"{Eq}"\"true\"" A_dax__uses_optional = A_dax__uses_optional_true; - - "type"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__uses_type); - "type"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__uses_type); - - "size"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__uses_size); - "size"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__uses_size); - - ">" { - if (!AX_dax__uses_file) FAIL("Required attribute `file' not set for `uses' element."); - if (!AX_dax__uses_size) FAIL("Required attribute `size' not set for `uses' element."); - LEAVE; STag_dax__uses();dax__pcdata_ix = 0; ENTER(E_dax__uses); - } - "/>" { - if (!AX_dax__uses_file) FAIL("Required attribute `file' not set for `uses' element."); - 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; - } - } - . FAIL("Unexpected character `%c' in attribute list of uses element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `uses' element start tag.",yytext); - <> FAIL("EOF in attribute list of `uses' element."); -} - -{ - "" { - LEAVE; - 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; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "ref"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__child_ref); - "ref"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__child_ref); - - ">" { - if (!AX_dax__child_ref) FAIL("Required attribute `ref' not set for `child' element."); - LEAVE; STag_dax__child();dax__pcdata_ix = 0; ENTER(S_dax__child); - } - "/>" { - 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; - } - } - . FAIL("Unexpected character `%c' in attribute list of child element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `child' element start tag.",yytext); - <> FAIL("EOF in attribute list of `child' element."); -} - -{ - "" { - LEAVE; - 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; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "ref"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_dax__parent_ref); - "ref"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_dax__parent_ref); - - ">" { - if (!AX_dax__parent_ref) FAIL("Required attribute `ref' not set for `parent' element."); - LEAVE; STag_dax__parent();dax__pcdata_ix = 0; ENTER(E_dax__parent); - } - "/>" { - if (!AX_dax__parent_ref) FAIL("Required attribute `ref' not set for `parent' element."); - LEAVE; STag_dax__parent(); dax__pcdata_ix = 0; ETag_dax__parent(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_dax__child_2: case S_dax__child: case S_dax__child_1: SET(S_dax__child_2); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of parent element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `parent' element start tag.",yytext); - <> FAIL("EOF in attribute list of `parent' element."); -} - -{ - "" { - LEAVE; - ETag_dax__parent(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_dax__child_2: case S_dax__child: case S_dax__child_1: SET(S_dax__child_2); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* EPILOG: after the root element. */ - -{ - . {SET(PROLOG); yyless(0); CLEANUP; return -1;} - <> SUCCEED; -} - - /* CHARACTER DATA. */ - -{ - /* Non-defined standard entities... */ -"&" BUFFERPUTC('&'); -"<" BUFFERPUTC('<'); -">" BUFFERPUTC('>'); -"'" BUFFERPUTC('\''); -""" BUFFERPUTC('"'); - - /* Character entities. */ - "&#"[[:digit:]]+";" BUFFERPUTC((unsigned char)atoi(yytext+2)); - "&#x"[[:xdigit:]]+";" BUFFERPUTC((unsigned char)strtol(yytext+3,NULL,16)); -} - -{ - "\n" | - "\r" | - "\r\n" | - "\n\r" BUFFERPUTC('\n'); -} - -{ - "" FAIL("Unexpected `]""]>' in character data."); -} - -{ - \' BUFFERDONE; LEAVE; - <> FAIL("EOF in literal (\"'\" expected)."); -} - -{ - \" BUFFERDONE; LEAVE; - <> FAIL("EOF in literal (`\"' expected)."); -} - -{ - [^<&] BUFFERPUTC(yytext[0]); - [<&] FAIL("Spurious `%c' in character data.",yytext[0]); -} - -{ - "]""]>" LEAVE; - /* "]""]" BUFFERPUTC(yytext[0]); BUFFERPUTC(yytext[1]); */ - . BUFFERPUTC(yytext[0]); - <> FAIL("EOF in CDATA section."); -} - - /* Impossible rules to avoid warnings from flex(1). */ - /* Ideally, this should be replaced by code in flexml.pl that - generates just the states not covered by other rules. */ -<*>{ - .|[\n] FAIL("Syntax error on character `%c'.", yytext[0]); -} - -%% - -/* Element context stack lookup. */ -int dax__element_context(int i) -{ - return (0 #define SD_INITIALISED() (sd_global != NULL) @@ -40,6 +41,7 @@ typedef struct SD_global { xbt_swag_t done_task_set; xbt_swag_t failed_task_set; + xbt_swag_t return_set; int task_number; } s_SD_global_t, *SD_global_t; @@ -66,6 +68,7 @@ typedef struct SD_workstation { /* Task */ typedef struct SD_task { s_xbt_swag_hookup_t state_hookup; + s_xbt_swag_hookup_t return_hookup; xbt_swag_t state_set; e_SD_task_state_t state; void *data; /* user data */ @@ -110,6 +113,8 @@ typedef struct SD_dependency { } s_SD_dependency_t, *SD_dependency_t; /* SimDag private functions */ +XBT_PUBLIC(xbt_swag_t) SD_simulate_swag(double how_long); /* could be public, but you need to see the internals of the SD_task_t to use it */ + SD_link_t __SD_link_create(void *surf_link, void *data); void __SD_link_destroy(void *link); diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index 71c6cc4161..801315ed4f 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -27,17 +27,23 @@ xbt_dynar_t SD_dotload_generic(const char * filename); static double dot_parse_double(const char *string) { - if (string == NULL) - return -1; - int ret = 0; - double value = -1; - - ret = sscanf(string, "%lg", &value); - if (ret != 1) - XBT_WARN("%s is not a double", string); - return value; + if (string == NULL) + return -1; + double value = -1; + char *err; + + //ret = sscanf(string, "%lg", &value); + errno = 0; + value = strtod(string,&err); + if(errno) + { + XBT_WARN("Failed to convert string to double: %s\n",strerror(errno)); + return -1; + } + return value; } + static int dot_parse_int(const char *string) { if (string == NULL) @@ -148,7 +154,9 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename){ xbt_dynar_t SD_dotload_generic(const char * filename) { xbt_assert(filename, "Unable to use a null file descriptor\n"); - dag_dot = agopen((char*)filename,Agstrictdirected,0); +//dag_dot = agopen((char*)filename,Agstrictdirected,0); + FILE *in_file = fopen(filename, "r"); + dag_dot = agread(in_file, NIL(Agdisc_t *)); result = xbt_dynar_new(sizeof(SD_task_t), dot_task_free); files = xbt_dict_new(); @@ -228,6 +236,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename) /* Free previous copy of the files */ xbt_dict_free(&files); + fclose(in_file); if(acyclic_graph_detail(result)) return result; acyclic_graph_detail(result); @@ -345,9 +354,10 @@ void dot_add_task(Agnode_t * dag_node) void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge) { SD_task_t file; - - char name[80]; - sprintf(name, "%s->%s", agnameof(agtail(edge)), agnameof(aghead(edge))); + char *name_tail=agnameof(agtail(edge)); + char *name_head=agnameof(aghead(edge)); + char *name = malloc((strlen(name_head)+strlen(name_tail)+3)*sizeof(char)); + sprintf(name, "%s->%s", name_tail, name_head); double size = dot_parse_double(agget(edge, (char *) "size")); XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size")); @@ -372,6 +382,7 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge) SD_task_dependency_add(NULL, NULL, file, current_job); } } + free(name); } /* dot_add_output_dependencies create the dependencies between a @@ -381,8 +392,10 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge) void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge) { SD_task_t file; - char name[80]; - sprintf(name, "%s->%s", agnameof(agtail(edge)), agnameof(aghead(edge))); + char *name_tail=agnameof(agtail(edge)); + char *name_head=agnameof(aghead(edge)); + char *name = malloc((strlen(name_head)+strlen(name_tail)+3)*sizeof(char)); + sprintf(name, "%s->%s", name_tail, name_head); double size = dot_parse_double(agget(edge, (char *) "size")); XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size")); @@ -410,4 +423,5 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge) SD_task_dependency_add(NULL, NULL, current_job, file); } } + free(name); } diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index 87a0995d68..12682cc48a 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -82,6 +82,8 @@ void SD_init(int *argc, char **argv) xbt_swag_new(xbt_swag_offset(task, state_hookup)); sd_global->failed_task_set = xbt_swag_new(xbt_swag_offset(task, state_hookup)); + sd_global->return_set = + xbt_swag_new(xbt_swag_offset(task, return_hookup)); sd_global->task_number = 0; surf_init(argc, argv); @@ -202,6 +204,7 @@ void SD_create_environment(const char *platform_file) } xbt_lib_foreach(link_lib, cursor, name, surf_link) { + if(surf_link[SURF_LINK_LEVEL]) __SD_link_create(surf_link[SURF_LINK_LEVEL], NULL); } @@ -227,34 +230,46 @@ void SD_create_environment(const char *platform_file) * \return a NULL-terminated array of \ref SD_task_t whose state has changed. * \see SD_task_schedule(), SD_task_watch() */ -xbt_dynar_t SD_simulate(double how_long) -{ + +xbt_dynar_t SD_simulate(double how_long) { + xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); + SD_task_t task; + + SD_simulate_swag(how_long); + while( (task = xbt_swag_extract(sd_global->return_set)) != NULL) { + xbt_dynar_push(changed_tasks, &task); + } + + return changed_tasks; +} + +xbt_swag_t SD_simulate_swag(double how_long) { double total_time = 0.0; /* we stop the simulation when total_time >= how_long */ double elapsed_time = 0.0; SD_task_t task, task_safe, dst; SD_dependency_t dependency; surf_action_t action; - xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); unsigned int iter, depcnt; static int first_time = 1; SD_CHECK_INIT_DONE(); if (first_time) { - XBT_VERB("Starting simulation..."); + XBT_VERB("Starting simulation..."); - surf_presolve(); /* Takes traces into account */ - first_time = 0; - } + surf_presolve(); /* Takes traces into account */ + first_time = 0; + } sd_global->watch_point_reached = 0; + while(xbt_swag_extract(sd_global->return_set)) {} + /* explore the runnable tasks */ - xbt_swag_foreach_safe(task, task_safe, sd_global->runnable_task_set) { + xbt_swag_foreach(task, sd_global->runnable_task_set) { XBT_VERB("Executing task '%s'", SD_task_get_name(task)); - if (__SD_task_try_to_run(task) - && !xbt_dynar_member(changed_tasks, &task)) - xbt_dynar_push(changed_tasks, &task); + if (__SD_task_try_to_run(task)) + xbt_swag_insert(task,sd_global->return_set); } /* main loop */ @@ -288,8 +303,7 @@ xbt_dynar_t SD_simulate(double how_long) SD_task_get_name(task)); /* the state has changed */ - if (!xbt_dynar_member(changed_tasks, &task)) - xbt_dynar_push(changed_tasks, &task); + xbt_swag_insert(task,sd_global->return_set); /* remove the dependencies after this task */ xbt_dynar_foreach(task->tasks_after, depcnt, dependency) { @@ -325,9 +339,8 @@ xbt_dynar_t SD_simulate(double how_long) if (__SD_task_is_runnable(dst) && !sd_global->watch_point_reached) { XBT_VERB("Executing task '%s'", SD_task_get_name(dst)); - if (__SD_task_try_to_run(dst) && - !xbt_dynar_member(changed_tasks, &task)) - xbt_dynar_push(changed_tasks, &task); + if (__SD_task_try_to_run(dst)) + xbt_swag_insert(dst,sd_global->return_set); } } } @@ -344,8 +357,7 @@ xbt_dynar_t SD_simulate(double how_long) surf_workstation_model->action_unref(action); task->surf_action = NULL; - if (!xbt_dynar_member(changed_tasks, &task)) - xbt_dynar_push(changed_tasks, &task); + xbt_swag_insert(task,sd_global->return_set); } } } @@ -369,7 +381,7 @@ xbt_dynar_t SD_simulate(double how_long) elapsed_time, total_time, sd_global->watch_point_reached); XBT_DEBUG("current time = %f", surf_get_clock()); - return changed_tasks; + return sd_global->return_set; } /** @@ -424,11 +436,6 @@ void SD_exit(void) XBT_DEBUG("Exiting Surf..."); surf_exit(); - // Exit the LIB host_lib - xbt_lib_free(&host_lib); - xbt_lib_free(&link_lib); - xbt_lib_free(&as_router_lib); - xbt_free(sd_global); sd_global = NULL; @@ -447,7 +454,7 @@ void SD_exit(void) } /** - * \bried load script file + * \brief load script file */ void SD_load_environment_script(const char *script_file) diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index 555f6efb7e..57e34a8677 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -41,6 +41,9 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) task->state_hookup.next = NULL; task->state_set = sd_global->not_scheduled_task_set; task->state = SD_NOT_SCHEDULED; + task->return_hookup.prev = NULL; + task->return_hookup.next = NULL; + task->marked = 0; xbt_swag_insert(task, task->state_set); @@ -746,7 +749,7 @@ static XBT_INLINE void SD_task_do_schedule(SD_task_t task) * i.e. when its dependencies are satisfied. * * \param task the task you want to schedule - * \param workstation_nb number of workstations on which the task will be executed + * \param workstation_count number of workstations on which the task will be executed * \param workstation_list the workstations on which the task will be executed * \param computation_amount computation amount for each workstation * \param communication_amount communication amount between each pair of workstations @@ -1253,6 +1256,7 @@ void SD_task_destroy(SD_task_t task) if (__SD_task_is_scheduled_or_runnable(task)) __SD_task_destroy_scheduling_data(task); xbt_swag_remove(task, task->state_set); + xbt_swag_remove(task, sd_global->return_set); if (task->name != NULL) xbt_free(task->name); @@ -1364,7 +1368,7 @@ void SD_task_schedulev(SD_task_t task, int count, switch (task->kind) { case SD_TASK_COMM_E2E: case SD_TASK_COMP_SEQ: - xbt_assert(task->workstation_nb == count); + xbt_assert(task->workstation_nb == count,"Got %d locations, but were expecting %d locations",count,task->workstation_nb); for (i = 0; i < count; i++) task->workstation_list[i] = list[i]; SD_task_do_schedule(task); diff --git a/src/simix/private.h b/src/simix/private.h index ac5651690d..7b2d98c3c3 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -31,6 +31,7 @@ typedef struct s_smx_global { smx_context_factory_t context_factory; xbt_dynar_t process_to_run; + xbt_dynar_t process_that_ran; xbt_swag_t process_list; xbt_swag_t process_to_destroy; smx_process_t maestro_process; @@ -150,11 +151,11 @@ static XBT_INLINE e_smx_state_t SIMIX_action_map_state(e_surf_action_state_t sta } } - - void SIMIX_context_mod_init(void); void SIMIX_context_mod_exit(void); +XBT_INLINE void SIMIX_context_set_current(smx_context_t context); +XBT_INLINE smx_context_t SIMIX_context_get_current(void); /* All factories init */ void SIMIX_ctx_thread_factory_init(smx_context_factory_t *factory); @@ -260,14 +261,5 @@ static XBT_INLINE void* SIMIX_context_get_data(smx_context_t context) return (*(simix_global->context_factory->get_data))(context); } -/** - \brief returns the thread's pid running the current context - \return The pid - */ -static XBT_INLINE int SIMIX_context_get_thread_id(void) -{ - return (*(simix_global->context_factory->get_thread_id))(); -} - XBT_PUBLIC(int) SIMIX_process_get_maxpid(void); #endif diff --git a/src/simix/process_private.h b/src/simix/process_private.h index 8df718cf89..c832f6d597 100644 --- a/src/simix/process_private.h +++ b/src/simix/process_private.h @@ -9,11 +9,9 @@ #include "simix/datatypes.h" #include "smurf_private.h" -#include "xbt/setset.h" /** @brief Process datatype */ typedef struct s_smx_process { - XBT_SETSET_HEADERS; s_xbt_swag_hookup_t process_hookup; s_xbt_swag_hookup_t synchro_hookup; /* process_to_run or mutex->sleeping and co */ s_xbt_swag_hookup_t host_proc_hookup; @@ -53,6 +51,7 @@ void SIMIX_process_create(smx_process_t *process, const char *hostname, int argc, char **argv, xbt_dict_t properties); +void SIMIX_process_runall(void); void SIMIX_process_kill(smx_process_t process); void SIMIX_process_killall(smx_process_t issuer); smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args); diff --git a/src/simix/smurf_private.h b/src/simix/smurf_private.h index 1c15a37e59..251b40fd55 100644 --- a/src/simix/smurf_private.h +++ b/src/simix/smurf_private.h @@ -119,7 +119,6 @@ SIMIX_REQ_LIST * \brief Represents a SIMIX request. */ typedef struct s_smx_req { - s_xbt_swag_hookup_t reqtable_hookup; e_smx_req_t call; smx_process_t issuer; @@ -505,11 +504,7 @@ typedef struct s_smx_req { /******************************** General *************************************/ -void SIMIX_request_init(void); -void SIMIX_request_destroy(void); -xbt_swag_t SIMIX_request_get_reqlist(int thread_pid); void SIMIX_request_push(void); -smx_req_t SIMIX_request_pop(void); void SIMIX_request_answer(smx_req_t); void SIMIX_request_pre(smx_req_t, int); void SIMIX_request_post(smx_action_t); diff --git a/src/simix/smx_context.c b/src/simix/smx_context.c index 9a526f53ae..7e0b7e56c7 100644 --- a/src/simix/smx_context.c +++ b/src/simix/smx_context.c @@ -9,7 +9,8 @@ #include "portable.h" #include "xbt/log.h" #include "xbt/swag.h" -#include "private.h" +#include "xbt/xbt_os_thread.h" +#include "src/simix/private.h" #include "simix/context.h" #include "gras_config.h" @@ -20,14 +21,15 @@ char* smx_context_factory_name = NULL; /* factory name specified by --cfg=contex smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL; int smx_context_stack_size = 128 * 1024; -#ifdef CONTEXT_THREADS +#ifdef HAVE_THREAD_LOCAL_STORAGE __thread smx_context_t smx_current_context; #else -smx_context_t smx_current_context; +smx_context_t smx_current_context; /* define it anyway, will be used in non-parallel mode */ +static xbt_os_thread_key_t smx_current_context_key = 0; #endif static int smx_parallel_contexts = 1; -static int smx_parallel_threshold = 1; +static int smx_parallel_threshold = 2; /** * This function is called by SIMIX_global_init() to initialize the context module. @@ -40,9 +42,24 @@ void SIMIX_context_mod_init(void) (*smx_factory_initializer_to_use)(&(simix_global->context_factory)); } else { /* use the factory specified by --cfg=contexts/factory:value */ - if (smx_context_factory_name == NULL || !strcmp(smx_context_factory_name, "ucontext")) { + + if (smx_context_factory_name == NULL) { + /* use the default factory */ + #ifdef HAVE_RAWCTX + SIMIX_ctx_raw_factory_init(&simix_global->context_factory); + #elif CONTEXT_UCONTEXT + SIMIX_ctx_sysv_factory_init(&simix_global->context_factory); + #else + SIMIX_ctx_thread_factory_init(&simix_global->context_factory); + #endif + } + else if (!strcmp(smx_context_factory_name, "ucontext")) { /* use ucontext */ +#ifdef CONTEXT_UCONTEXT SIMIX_ctx_sysv_factory_init(&simix_global->context_factory); +#else + xbt_die("The context factory 'ucontext' unavailable on your system"); +#endif } else if (!strcmp(smx_context_factory_name, "thread")) { /* use os threads (either pthreads or windows ones) */ @@ -53,10 +70,28 @@ void SIMIX_context_mod_init(void) SIMIX_ctx_raw_factory_init(&simix_global->context_factory); } else { - xbt_die("Invalid context factory specified"); + XBT_ERROR("Invalid context factory specified. Valid factories on this machine:"); +#ifdef HAVE_RAWCTX + XBT_ERROR(" raw: high performance context factory implemented specifically for SimGrid"); +#else + XBT_ERROR(" (raw contextes are disabled at compilation time on this machine -- check configure logs for details)"); +#endif +#ifdef CONTEXT_UCONTEXT + XBT_ERROR(" ucontext: classical system V contextes (implemented with makecontext, swapcontext and friends)"); +#else + XBT_ERROR(" (ucontext is disabled at compilation time on this machine -- check configure logs for details)"); +#endif + XBT_ERROR(" thread: slow portability layer using system threads (pthreads on UNIX, CreateThread() on windows)"); + xbt_die("Please use a valid factory."); } } } + +#if defined(CONTEXT_THREADS) && !defined(HAVE_THREAD_LOCAL_STORAGE) + /* the __thread storage class is not available on this platform: + * use getspecific/setspecific instead to store the current context in each thread */ + xbt_os_thread_key_create(&smx_current_context_key); +#endif } /** @@ -141,3 +176,29 @@ XBT_INLINE int SIMIX_context_get_parallel_threshold(void) { return smx_parallel_threshold; } +/** + * \brief Returns the current context of this thread. + * \return the current context of this thread + */ +XBT_INLINE smx_context_t SIMIX_context_get_current(void) +{ +#ifdef HAVE_THREAD_LOCAL_STORAGE + return smx_current_context; +#else + return xbt_os_thread_get_specific(smx_current_context_key); +#endif +} + +/** + * \brief Sets the current context of this thread. + * \param context the context to set + */ +XBT_INLINE void SIMIX_context_set_current(smx_context_t context) +{ +#ifdef HAVE_THREAD_LOCAL_STORAGE + smx_current_context = context; +#else + xbt_os_thread_set_specific(smx_current_context_key, context); +#endif +} + diff --git a/src/simix/smx_context_base.c b/src/simix/smx_context_base.c index c28c3c3c93..810ef6cb59 100644 --- a/src/simix/smx_context_base.c +++ b/src/simix/smx_context_base.c @@ -1,4 +1,4 @@ -/* context_base - Code factorization accross context switching implementations */ +/* context_base - Code factorization across context switching implementations */ /* Copyright (c) 2010. The SimGrid Team. * All rights reserved. */ @@ -10,6 +10,7 @@ #include "xbt/function_types.h" #include "simix/simix.h" #include "simix/context.h" +#include "simix/private.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(bindings); @@ -26,7 +27,6 @@ void smx_ctx_base_factory_init(smx_context_factory_t *factory) (*factory)->runall = NULL; (*factory)->self = smx_ctx_base_self; (*factory)->get_data = smx_ctx_base_get_data; - (*factory)->get_thread_id = smx_ctx_base_get_thread_id; (*factory)->name = "base context factory"; } @@ -47,16 +47,16 @@ smx_ctx_base_factory_create_context_sized(size_t size, { smx_context_t context = xbt_malloc0(size); - /* If the user provided a function for the process then use it - otherwise is the context for maestro and we should set it as the + /* If the user provided a function for the process then use it. + Otherwise, it is the context for maestro and we should set it as the current context */ if (code) { context->cleanup_func = cleanup_func; context->argc = argc; context->argv = argv; context->code = code; - }else{ - smx_current_context = context; + } else { + SIMIX_context_set_current(context); } context->data = data; @@ -87,20 +87,16 @@ void smx_ctx_base_stop(smx_context_t context) { if (context->cleanup_func) (*(context->cleanup_func)) (context->data); + context->iwannadie = 0; SIMIX_req_process_cleanup(context->data); } smx_context_t smx_ctx_base_self(void) { - return smx_current_context; + return SIMIX_context_get_current(); } void *smx_ctx_base_get_data(smx_context_t context) { return context->data; } - -int smx_ctx_base_get_thread_id() -{ - return 0; -} diff --git a/src/simix/smx_context_raw.c b/src/simix/smx_context_raw.c index 239d0a75ff..059870eb84 100644 --- a/src/simix/smx_context_raw.c +++ b/src/simix/smx_context_raw.c @@ -14,12 +14,6 @@ # include #endif /* HAVE_VALGRIND_VALGRIND_H */ -#ifdef _XBT_WIN32 -#include "win32_ucontext.h" -#else -#include "ucontext.h" -#endif - typedef char * raw_stack_t; typedef void (*rawctx_entry_point_t)(void *); @@ -44,10 +38,16 @@ extern void raw_swapcontext(raw_stack_t* old, raw_stack_t new); #ifdef PROCESSOR_i686 __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_makecontext\n" + "_raw_makecontext:\n" +#else ".text\n" ".globl raw_makecontext\n" ".type raw_makecontext,@function\n" "raw_makecontext:\n" +#endif " movl 4(%esp),%eax\n" /* stack */ " addl 8(%esp),%eax\n" /* size */ " movl 12(%esp),%ecx\n" /* func */ @@ -64,10 +64,16 @@ __asm__ ( ); __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_swapcontext\n" + "_raw_swapcontext:\n" +#else ".text\n" ".globl raw_swapcontext\n" ".type raw_swapcontext,@function\n" "raw_swapcontext:\n" +#endif " movl 4(%esp),%eax\n" /* old */ " movl 8(%esp),%edx\n" /* new */ " pushl %ebp\n" @@ -84,10 +90,16 @@ __asm__ ( ); #elif PROCESSOR_x86_64 __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_makecontext\n" + "_raw_makecontext:\n" +#else ".text\n" ".globl raw_makecontext\n" ".type raw_makecontext,@function\n" - "raw_makecontext:\n" /* Calling convention sets the arguments in rdi, rsi, rdx and rcx, respectively */ + "raw_makecontext:\n"/* Calling convention sets the arguments in rdi, rsi, rdx and rcx, respectively */ +#endif " movq %rdi,%rax\n" /* stack */ " addq %rsi,%rax\n" /* size */ " movq $0, -8(%rax)\n" /* @return for func */ @@ -109,10 +121,16 @@ __asm__ ( ); __asm__ ( +#if defined(APPLE) || defined(_WIN32) + ".text\n" + ".globl _raw_swapcontext\n" + "_raw_swapcontext:\n" +#else ".text\n" ".globl raw_swapcontext\n" ".type raw_swapcontext,@function\n" - "raw_swapcontext:\n" /* Calling convention sets the arguments in rdi and rsi, respectively */ + "raw_swapcontext:\n" /* Calling convention sets the arguments in rdi and rsi, respectively */ +#endif " pushq %rdi\n" " pushq %rsi\n" " pushq %rdx\n" @@ -142,6 +160,10 @@ __asm__ ( " retq\n" ); #else + +/* If you implement raw contextes for other processors, don't forget to + update the definition of HAVE_RAWCTX in buildtools/Cmake/AddTests.cmake */ + raw_stack_t raw_makecontext(char* malloced_stack, int stack_size, rawctx_entry_point_t entry_point, void* arg) { THROW_UNIMPLEMENTED; @@ -159,8 +181,6 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); static xbt_parmap_t parmap; #endif -static smx_context_factory_t raw_factory; - #ifdef TIME_BENCH #include "xbt/xbt_os_time.h" #define NUM_THREADS 4 @@ -244,7 +264,7 @@ static void smx_ctx_raw_free(smx_context_t context) static void smx_ctx_raw_suspend(smx_context_t context) { - smx_current_context = (smx_context_t)maestro_raw_context; + SIMIX_context_set_current((smx_context_t) maestro_raw_context); raw_swapcontext( &((smx_ctx_raw_t) context)->stack_top, ((smx_ctx_raw_t) context)->old_stack_top); @@ -266,7 +286,7 @@ static void smx_ctx_raw_wrapper(smx_ctx_raw_t context) static void smx_ctx_raw_resume(smx_process_t process) { smx_ctx_raw_t context = (smx_ctx_raw_t)process->context; - smx_current_context = (smx_context_t)context; + SIMIX_context_set_current((smx_context_t) context); raw_swapcontext( &((smx_ctx_raw_t) context)->old_stack_top, ((smx_ctx_raw_t) context)->stack_top); @@ -318,8 +338,6 @@ static void smx_ctx_raw_runall_serial(xbt_dynar_t processes) XBT_VERB("Time SSR thread %u = %lf (max %lf)", cursor, time_thread_ssr[cursor], tmax); time_wasted_ssr += tmax - time_thread_ssr[cursor]; } - - xbt_dynar_reset(processes); } void smx_ctx_raw_new_sr(void); @@ -351,7 +369,6 @@ static void smx_ctx_raw_runall_serial(xbt_dynar_t processes) XBT_DEBUG("Schedule item %u of %lu",cursor,xbt_dynar_length(processes)); smx_ctx_raw_resume(process); } - xbt_dynar_reset(processes); } #endif @@ -360,29 +377,15 @@ static void smx_ctx_raw_runall_parallel(xbt_dynar_t processes) #ifdef CONTEXT_THREADS xbt_parmap_apply(parmap, (void_f_pvoid_t)smx_ctx_raw_resume, processes); #endif - xbt_dynar_reset(processes); -} - -static smx_context_t smx_ctx_raw_self_parallel(void) -{ - return smx_current_context; -} - -static int smx_ctx_raw_get_thread_id(){ - return (int)(unsigned long)xbt_os_thread_get_extra_data(); } static void smx_ctx_raw_runall(xbt_dynar_t processes) { if (xbt_dynar_length(processes) >= SIMIX_context_get_parallel_threshold()) { XBT_DEBUG("Runall // %lu", xbt_dynar_length(processes)); - raw_factory->self = smx_ctx_raw_self_parallel; - raw_factory->get_thread_id = smx_ctx_raw_get_thread_id; smx_ctx_raw_runall_parallel(processes); } else { XBT_DEBUG("Runall serial %lu", xbt_dynar_length(processes)); - raw_factory->self = smx_ctx_base_self; - raw_factory->get_thread_id = smx_ctx_base_get_thread_id; smx_ctx_raw_runall_serial(processes); } } @@ -410,18 +413,13 @@ void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory) } else { /* always parallel */ - (*factory)->self = smx_ctx_raw_self_parallel; - (*factory)->get_thread_id = smx_ctx_raw_get_thread_id; (*factory)->runall = smx_ctx_raw_runall_parallel; } } else { /* always serial */ - (*factory)->self = smx_ctx_base_self; - (*factory)->get_thread_id = smx_ctx_base_get_thread_id; (*factory)->runall = smx_ctx_raw_runall_serial; } - raw_factory = *factory; #ifdef TIME_BENCH timer = xbt_os_timer_new(); #endif diff --git a/src/simix/smx_context_sysv.c b/src/simix/smx_context_sysv.c index 41341b63c0..4d30329226 100644 --- a/src/simix/smx_context_sysv.c +++ b/src/simix/smx_context_sysv.c @@ -68,7 +68,6 @@ void SIMIX_ctx_sysv_factory_init(smx_context_factory_t *factory) parmap = xbt_parmap_new(2); (*factory)->runall = smx_ctx_sysv_runall_parallel; (*factory)->self = smx_ctx_sysv_self_parallel; - (*factory)->get_thread_id = smx_ctx_sysv_get_thread_id; #else THROWF(arg_error, 0, "No thread support for parallel context execution"); #endif @@ -190,7 +189,7 @@ void smx_ctx_sysv_wrapper(int first, ...) void smx_ctx_sysv_suspend(smx_context_t context) { - smx_current_context = (smx_context_t)maestro_context; + SIMIX_context_set_current((smx_context_t) maestro_context); int rv; rv = swapcontext(&((smx_ctx_sysv_t) context)->uc, &((smx_ctx_sysv_t)context)->old_uc); @@ -199,7 +198,7 @@ void smx_ctx_sysv_suspend(smx_context_t context) void smx_ctx_sysv_resume(smx_context_t context) { - smx_current_context = context; + SIMIX_context_set_current(context); int rv; rv = swapcontext(&((smx_ctx_sysv_t)context)->old_uc, &((smx_ctx_sysv_t) context)->uc); @@ -215,16 +214,15 @@ void smx_ctx_sysv_runall(xbt_dynar_t processes) XBT_DEBUG("Schedule item %u of %lu",cursor,xbt_dynar_length(processes)); smx_ctx_sysv_resume(process->context); } - xbt_dynar_reset(processes); } void smx_ctx_sysv_resume_parallel(smx_process_t process) { smx_context_t context = process->context; - smx_current_context = (smx_context_t)context; + SIMIX_context_set_current((smx_context_t) context); int rv; rv = swapcontext(&((smx_ctx_sysv_t)context)->old_uc, &((smx_ctx_sysv_t) context)->uc); - smx_current_context = (smx_context_t)maestro_context; + SIMIX_context_set_current((smx_context_t) maestro_context); xbt_assert((rv == 0), "Context swapping failure"); } @@ -234,17 +232,11 @@ void smx_ctx_sysv_runall_parallel(xbt_dynar_t processes) #ifdef CONTEXT_THREADS xbt_parmap_apply(parmap, (void_f_pvoid_t)smx_ctx_sysv_resume_parallel, processes); #endif - xbt_dynar_reset(processes); } smx_context_t smx_ctx_sysv_self_parallel(void) { /*smx_context_t self_context = (smx_context_t) xbt_os_thread_get_extra_data(); return self_context ? self_context : (smx_context_t) maestro_context;*/ - return smx_current_context; -} - -int smx_ctx_sysv_get_thread_id(void) -{ - return (int)(unsigned long)xbt_os_thread_get_extra_data(); + return SIMIX_context_get_current(); } diff --git a/src/simix/smx_context_thread.c b/src/simix/smx_context_thread.c index cc9de82775..a602a225f4 100644 --- a/src/simix/smx_context_thread.c +++ b/src/simix/smx_context_thread.c @@ -23,6 +23,8 @@ typedef struct s_smx_ctx_thread { xbt_os_sem_t end; /* this semaphore is used to schedule/unschedule the process */ } s_smx_ctx_thread_t, *smx_ctx_thread_t; +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, @@ -37,6 +39,7 @@ static void smx_ctx_thread_runall_serial(xbt_dynar_t processes); static void smx_ctx_thread_runall_parallel(xbt_dynar_t processes); static smx_context_t smx_ctx_thread_self(void); +static int smx_ctx_thread_factory_finalize(smx_context_factory_t *factory); static void *smx_ctx_thread_wrapper(void *param); void SIMIX_ctx_thread_factory_init(smx_context_factory_t * factory) @@ -44,6 +47,7 @@ void SIMIX_ctx_thread_factory_init(smx_context_factory_t * factory) smx_ctx_base_factory_init(factory); XBT_VERB("Activating thread context factory"); + (*factory)->finalize = smx_ctx_thread_factory_finalize; (*factory)->create_context = smx_ctx_thread_factory_create_context; /* Do not overload that method (*factory)->finalize */ (*factory)->free = smx_ctx_thread_free; @@ -57,6 +61,21 @@ void SIMIX_ctx_thread_factory_init(smx_context_factory_t * factory) (*factory)->self = smx_ctx_thread_self; (*factory)->name = "ctx_thread_factory"; + + if (SIMIX_context_is_parallel()) { + smx_ctx_thread_sem = xbt_os_sem_init(SIMIX_context_get_nthreads()); + } else { + smx_ctx_thread_sem = NULL; + } +} + +static int smx_ctx_thread_factory_finalize(smx_context_factory_t *factory) +{ + if (smx_ctx_thread_sem) { + xbt_os_sem_destroy(smx_ctx_thread_sem); + smx_ctx_thread_sem = NULL; + } + return smx_ctx_base_factory_finalize(factory); } static smx_context_t @@ -115,6 +134,9 @@ static void smx_ctx_thread_stop(smx_context_t pcontext) /* please no debug here: our procdata was already free'd */ smx_ctx_base_stop(pcontext); + if (smx_ctx_thread_sem) /* parallel run */ + xbt_os_sem_release(smx_ctx_thread_sem); + /* signal to the maestro that it has finished */ xbt_os_sem_release(((smx_ctx_thread_t) context)->end); @@ -130,6 +152,8 @@ static void *smx_ctx_thread_wrapper(void *param) /* Tell the maestro we are starting, and wait for its green light */ xbt_os_sem_release(context->end); xbt_os_sem_acquire(context->begin); + if (smx_ctx_thread_sem) /* parallel run */ + xbt_os_sem_acquire(smx_ctx_thread_sem); (context->super.code) (context->super.argc, context->super.argv); @@ -139,8 +163,12 @@ static void *smx_ctx_thread_wrapper(void *param) static void smx_ctx_thread_suspend(smx_context_t context) { + if (smx_ctx_thread_sem) /* parallel run */ + xbt_os_sem_release(smx_ctx_thread_sem); xbt_os_sem_release(((smx_ctx_thread_t) context)->end); xbt_os_sem_acquire(((smx_ctx_thread_t) context)->begin); + if (smx_ctx_thread_sem) /* parallel run */ + xbt_os_sem_acquire(smx_ctx_thread_sem); } static void smx_ctx_thread_runall_serial(xbt_dynar_t processes) @@ -152,7 +180,6 @@ static void smx_ctx_thread_runall_serial(xbt_dynar_t processes) xbt_os_sem_release(((smx_ctx_thread_t) process->context)->begin); xbt_os_sem_acquire(((smx_ctx_thread_t) process->context)->end); } - xbt_dynar_reset(processes); } static void smx_ctx_thread_runall_parallel(xbt_dynar_t processes) @@ -166,7 +193,6 @@ static void smx_ctx_thread_runall_parallel(xbt_dynar_t processes) xbt_dynar_foreach(processes, index, process) { xbt_os_sem_acquire(((smx_ctx_thread_t) process->context)->end); } - xbt_dynar_reset(processes); } static smx_context_t smx_ctx_thread_self(void) diff --git a/src/simix/smx_deployment.c b/src/simix/smx_deployment.c index 96e99815e4..4a21d8c67a 100644 --- a/src/simix/smx_deployment.c +++ b/src/simix/smx_deployment.c @@ -21,9 +21,10 @@ static double kill_time = -1.0; static void parse_process_init(void) { - parse_host = xbt_strdup(A_surfxml_process_host); - xbt_assert(SIMIX_host_get_by_name(parse_host), - "Host '%s' unknown", parse_host); + smx_host_t host = SIMIX_host_get_by_name(A_surfxml_process_host); + if (!host) + THROWF(arg_error, 0, "Host '%s' unknown", A_surfxml_process_host); + parse_host = host->name; parse_code = SIMIX_get_registered_function(A_surfxml_process_function); xbt_assert(parse_code, "Function '%s' unknown", A_surfxml_process_function); @@ -76,7 +77,6 @@ static void parse_process_finalize(void) current_property_set); /* verify if process has been created (won't be the case if the host is currently dead, but that's fine) */ if (!process) { - xbt_free(parse_host); return; } if (kill_time > SIMIX_get_clock()) { @@ -84,7 +84,6 @@ static void parse_process_finalize(void) SIMIX_timer_set(start_time, simix_global->kill_process_function, process); } } - xbt_free(parse_host); } current_property_set = NULL; } @@ -114,7 +113,7 @@ void SIMIX_launch_application(const char *file) surfxml_add_callback(STag_surfxml_process_cb_list, parse_process_init); surfxml_add_callback(ETag_surfxml_argument_cb_list, parse_argument); - surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties); + surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties_XML); surfxml_add_callback(ETag_surfxml_process_cb_list, parse_process_finalize); @@ -189,9 +188,10 @@ void SIMIX_process_set_function(const char *process_host, char *arg; /* init process */ - parse_host = xbt_strdup(process_host); - xbt_assert(SIMIX_host_get_by_name(parse_host), - "Host '%s' unknown", parse_host); + smx_host_t host = SIMIX_host_get_by_name(process_host); + if (!host) + THROWF(arg_error, 0, "Host '%s' unknown", process_host); + parse_host = host->name; parse_code = SIMIX_get_registered_function(process_function); xbt_assert(parse_code, "Function '%s' unknown", process_function); diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index b888675998..ebd3dea594 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -78,7 +78,8 @@ void SIMIX_global_init(int *argc, char **argv) simix_global = xbt_new0(s_smx_global_t, 1); - simix_global->process_to_run = xbt_dynar_new(sizeof(void *), NULL); + simix_global->process_to_run = xbt_dynar_new(sizeof(smx_process_t), NULL); + simix_global->process_that_ran = xbt_dynar_new(sizeof(smx_process_t), NULL); simix_global->process_list = xbt_swag_new(xbt_swag_offset(proc, process_hookup)); simix_global->process_to_destroy = @@ -102,9 +103,6 @@ void SIMIX_global_init(int *argc, char **argv) __xbt_running_ctx_fetch = SIMIX_process_get_running_context; __xbt_ex_terminate = SIMIX_process_exception_terminate; - /* Initialize request mechanism */ - SIMIX_request_init(); - /* Initialize the SIMIX network module */ SIMIX_network_init(); @@ -136,12 +134,10 @@ void SIMIX_clean(void) /* Exit the SIMIX network module */ SIMIX_network_exit(); - /* Exit request mechanism */ - SIMIX_request_destroy(); - xbt_heap_free(simix_timers); /* Free the remaining data structures */ xbt_dynar_free(&simix_global->process_to_run); + xbt_dynar_free(&simix_global->process_that_ran); xbt_swag_free(simix_global->process_to_destroy); xbt_swag_free(simix_global->process_list); simix_global->process_list = NULL; @@ -188,7 +184,7 @@ XBT_INLINE double SIMIX_get_clock(void) void SIMIX_run(void) { double time = 0; - smx_req_t req; + smx_process_t process; xbt_swag_t set; surf_action_t action; smx_timer_t timer; @@ -201,17 +197,21 @@ void SIMIX_run(void) #ifdef TIME_BENCH smx_ctx_raw_new_sr(); #endif - do { + while (xbt_dynar_length(simix_global->process_to_run)) { XBT_DEBUG("New Sub-Schedule Round; size(queue)=%lu", xbt_dynar_length(simix_global->process_to_run)); - SIMIX_context_runall(simix_global->process_to_run); - while ((req = SIMIX_request_pop())) { - XBT_DEBUG("Handling request %p", req); - SIMIX_request_pre(req, 0); + SIMIX_process_runall(); + xbt_dynar_foreach(simix_global->process_that_ran, iter, process) { + if (process->request.call != REQ_NO_REQ) { + XBT_DEBUG("Handling request %p", &process->request); + SIMIX_request_pre(&process->request, 0); + } } - } while (xbt_dynar_length(simix_global->process_to_run)); + } - time = surf_solve(SIMIX_timer_next()); + time = SIMIX_timer_next(); + if (time != -1.0 || xbt_swag_size(simix_global->process_list) != 0) + time = surf_solve(time); /* Notify all the hosts that have failed */ /* FIXME: iterate through the list of failed host and mark each of them */ @@ -236,10 +236,18 @@ void SIMIX_run(void) SIMIX_request_post((smx_action_t) action->data); } } + + /* Clean processes to destroy */ + SIMIX_process_empty_trash(); + } while (time != -1.0); if (xbt_swag_size(simix_global->process_list) != 0) { +#ifdef HAVE_TRACING + TRACE_end(); +#endif + XBT_WARN("Oops ! Deadlock or code not perfectly clean."); SIMIX_display_process_status(); xbt_abort(); @@ -320,7 +328,7 @@ void SIMIX_display_process_status(void) XBT_INFO("%d processes are still running, waiting for something.", nbprocess); /* List the process and their state */ XBT_INFO - ("Legend of the following listing: \" on : .\""); + ("Legend of the following listing: \"() on : .\""); xbt_swag_foreach(process, simix_global->process_list) { if (process->waiting_action) { @@ -352,7 +360,8 @@ void SIMIX_display_process_status(void) action_description = "I/O"; break; } - XBT_INFO("Waiting for %s action %p to finish", action_description, process->waiting_action); + XBT_INFO("Process %ld (%s@%s): waiting for %s action %p (%s) to finish", process->pid, process->name, process->smx_host->name, + action_description, process->waiting_action, process->waiting_action->name); } } } diff --git a/src/simix/smx_host.c b/src/simix/smx_host.c index c1d3e0ccd5..29589b1f4d 100644 --- a/src/simix/smx_host.c +++ b/src/simix/smx_host.c @@ -209,10 +209,6 @@ smx_action_t SIMIX_host_execute(const char *name, smx_host_t host, surf_workstation_model->set_priority(action->execution.surf_exec, priority); } -#ifdef HAVE_TRACING - TRACE_smx_host_execute(action); -#endif - XBT_DEBUG("Create execute action %p", action); return action; @@ -267,9 +263,6 @@ void SIMIX_host_execution_destroy(smx_action_t action) action->execution.surf_exec = NULL; } -#ifdef HAVE_TRACING - TRACE_smx_action_destroy(action); -#endif xbt_mallocator_release(simix_global->action_mallocator, action); } diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index eade5755b3..1325aac2ae 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -258,10 +258,6 @@ void SIMIX_comm_destroy(smx_action_t action) action->latency_limited = SIMIX_comm_is_latency_bounded( action ) ; #endif -#ifdef HAVE_TRACING - TRACE_smx_action_destroy(action); -#endif - xbt_free(action->name); SIMIX_comm_destroy_internal_actions(action); @@ -530,10 +526,6 @@ XBT_INLINE void SIMIX_comm_start(smx_action_t action) action->state = SIMIX_RUNNING; -#ifdef HAVE_TRACING - TRACE_smx_action_communicate(action, action->comm.src_proc); -#endif - /* If a link is failed, detect it immediately */ if (surf_workstation_model->action_state_get(action->comm.surf_comm) == SURF_ACTION_FAILED) { XBT_DEBUG("Communication from '%s' to '%s' failed to start because of a link failure", @@ -729,6 +721,10 @@ double SIMIX_comm_get_remains(smx_action_t action) { double remains; + if(!action){ + return 0; + } + switch (action->state) { case SIMIX_RUNNING: @@ -789,6 +785,9 @@ smx_process_t SIMIX_comm_get_dst_proc(smx_action_t action) */ XBT_INLINE 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); diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 3296198782..bf5707b098 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -166,6 +166,24 @@ void SIMIX_process_create(smx_process_t *process, } } +/** + * \brief Executes the processes from simix_global->process_to_run. + * + * The processes of simix_global->process_to_run are run (in parallel if + * possible). On exit, simix_global->process_to_run is empty, and + * simix_global->process_that_ran contains the list of processes that just ran. + * The two lists are swapped so, be careful when using them before and after a + * call to this function. + */ +void SIMIX_process_runall(void) +{ + SIMIX_context_runall(simix_global->process_to_run); + xbt_dynar_t tmp = simix_global->process_that_ran; + simix_global->process_that_ran = simix_global->process_to_run; + simix_global->process_to_run = tmp; + xbt_dynar_reset(simix_global->process_to_run); +} + /** * \brief Internal function to kill a SIMIX process. * @@ -477,9 +495,6 @@ void SIMIX_process_sleep_destroy(smx_action_t action) XBT_DEBUG("Destroy action %p", action); if (action->sleep.surf_sleep) action->sleep.surf_sleep->model_type->action_unref(action->sleep.surf_sleep); -#ifdef HAVE_TRACING - TRACE_smx_action_destroy(action); -#endif xbt_mallocator_release(simix_global->action_mallocator, action); } diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index 840166ae69..6a65331648 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -5,57 +5,19 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix, "Logging specific to SIMIX (SMURF)"); -/* Tables with the requests to handle at the end of this round of scheduling - * user processes. There is one for each thread of execution. */ -static xbt_swag_t *req_lists; - -void SIMIX_request_init(void) -{ - s_smx_req_t req; - int i, nthreads = SIMIX_context_get_nthreads(); - - req_lists = xbt_new0(xbt_swag_t, nthreads); - for(i=0; i < nthreads; i++) - req_lists[i] = xbt_swag_new(xbt_swag_offset(req, reqtable_hookup)); - -} - -void SIMIX_request_destroy(void) -{ - int i, nthreads = SIMIX_context_get_nthreads(); - - for(i=0; i < nthreads; i++) - xbt_swag_free(req_lists[i]); - - xbt_free(req_lists); -} - -xbt_swag_t SIMIX_request_get_reqlist(int thread_pid) -{ - return req_lists[thread_pid]; -} - /* FIXME: we may want to save the initialization of issuer... */ -XBT_INLINE smx_req_t SIMIX_req_mine() { +XBT_INLINE smx_req_t SIMIX_req_mine() +{ smx_process_t issuer = SIMIX_process_self(); return &issuer->request; } void SIMIX_request_push() { - xbt_swag_t req_table; smx_process_t issuer = SIMIX_process_self(); if (issuer != simix_global->maestro_process){ issuer->request.issuer = issuer; - req_table = SIMIX_request_get_reqlist(SIMIX_context_get_thread_id()); - - xbt_swag_insert_at_tail(&issuer->request, req_table); - - XBT_DEBUG("Pushed request %s (%d) of %s", - SIMIX_request_name(issuer->request.call), issuer->request.call, - issuer->name); - XBT_DEBUG("Yield process '%s' on request of type %s (%d)", issuer->name, SIMIX_request_name(issuer->request.call), issuer->request.call); SIMIX_process_yield(); @@ -64,25 +26,6 @@ void SIMIX_request_push() } } -smx_req_t SIMIX_request_pop(void) -{ - int i; - smx_req_t req = NULL; - int nthreads = SIMIX_context_get_nthreads(); - - for(i=0; i < nthreads; i++){ - if((req = xbt_swag_extract(req_lists[i]))){ - XBT_DEBUG("Popped request %s (%d) of %s", - SIMIX_request_name(req->issuer->request.call), - req->issuer->request.call, - req->issuer->name); - return req; - } - } - - return NULL; -} - void SIMIX_request_answer(smx_req_t req) { if (req->issuer != simix_global->maestro_process){ diff --git a/src/simix/smx_synchro.c b/src/simix/smx_synchro.c index aed9f50d2f..ca8f8dc7a7 100644 --- a/src/simix/smx_synchro.c +++ b/src/simix/smx_synchro.c @@ -23,6 +23,7 @@ static void SIMIX_sem_block_onto(smx_sem_t sem); 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; @@ -31,11 +32,13 @@ static smx_action_t SIMIX_synchro_wait(smx_host_t smx_host, double timeout) surf_workstation_model->extension.workstation.sleep(smx_host->host, timeout); surf_workstation_model->action_data_set(action->synchro.sleep, action); + XBT_OUT(); return action; } void SIMIX_synchro_stop_waiting(smx_process_t process, smx_req_t req) { + XBT_IN("(%p, %p)",process,req); switch (req->call) { case REQ_MUTEX_LOCK: @@ -61,28 +64,34 @@ void SIMIX_synchro_stop_waiting(smx_process_t process, smx_req_t req) default: THROW_IMPOSSIBLE; } + XBT_OUT(); } void SIMIX_synchro_destroy(smx_action_t action) { + XBT_IN("(%p)",action); XBT_DEBUG("Destroying synchro %p", action); action->synchro.sleep->model_type->action_unref(action->synchro.sleep); xbt_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) action->state = SIMIX_FAILED; else if(surf_workstation_model->action_state_get(action->synchro.sleep) == SURF_ACTION_DONE) action->state = SIMIX_SRC_TIMEOUT; SIMIX_synchro_finish(action); + XBT_OUT(); } static void SIMIX_synchro_finish(smx_action_t action) { + XBT_IN("(%p)",action); smx_req_t req = xbt_fifo_shift(action->request_list); switch (action->state) { @@ -90,7 +99,8 @@ static void SIMIX_synchro_finish(smx_action_t action) case SIMIX_SRC_TIMEOUT: TRY { THROWF(timeout_error, 0, "Synchro's wait timeout"); - } CATCH(req->issuer->running_ctx->exception) { + } + CATCH(req->issuer->running_ctx->exception) { req->issuer->doexception = 1; } break; @@ -98,7 +108,8 @@ static void SIMIX_synchro_finish(smx_action_t action) case SIMIX_FAILED: TRY { THROWF(host_error, 0, "Host failed"); - } CATCH(req->issuer->running_ctx->exception) { + } + CATCH(req->issuer->running_ctx->exception) { req->issuer->doexception = 1; } break; @@ -111,6 +122,7 @@ static void SIMIX_synchro_finish(smx_action_t action) SIMIX_synchro_stop_waiting(req->issuer, req); SIMIX_synchro_destroy(action); SIMIX_request_answer(req); + XBT_OUT(); } /*********************************** Mutex ************************************/ @@ -122,11 +134,13 @@ static void SIMIX_synchro_finish(smx_action_t action) */ smx_mutex_t SIMIX_mutex_init(void) { + XBT_IN("()"); s_smx_process_t p; /* useful to initialize sleeping swag */ smx_mutex_t mutex = xbt_new0(s_smx_mutex_t, 1); mutex->locked = 0; mutex->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); + XBT_OUT(); return mutex; } @@ -136,6 +150,7 @@ smx_mutex_t SIMIX_mutex_init(void) */ void SIMIX_pre_mutex_lock(smx_req_t req) { + XBT_IN("(%p)",req); /* FIXME: check where to validate the arguments */ smx_action_t sync_act = NULL; smx_mutex_t mutex = req->mutex_lock.mutex; @@ -154,6 +169,7 @@ void SIMIX_pre_mutex_lock(smx_req_t req) mutex->owner = req->issuer; SIMIX_request_answer(req); } + XBT_OUT(); } /** @@ -167,11 +183,15 @@ void SIMIX_pre_mutex_lock(smx_req_t req) */ int SIMIX_mutex_trylock(smx_mutex_t mutex, smx_process_t issuer) { - if (mutex->locked) - return 0; + XBT_IN("(%p, %p)",mutex,issuer); + if (mutex->locked){ + XBT_OUT(); + return 0; + } mutex->locked = 1; mutex->owner = issuer; + XBT_OUT(); return 1; } @@ -186,11 +206,14 @@ int SIMIX_mutex_trylock(smx_mutex_t mutex, smx_process_t issuer) */ void SIMIX_mutex_unlock(smx_mutex_t mutex, smx_process_t issuer) { + XBT_IN("(%p, %p)",mutex,issuer); smx_process_t p; /*process to wake up */ /* If the mutex is not owned by the issuer do nothing */ - if (issuer != mutex->owner) - return; + if (issuer != mutex->owner){ + XBT_OUT(); + return; + } if (xbt_swag_size(mutex->sleeping) > 0) { p = xbt_swag_extract(mutex->sleeping); @@ -203,6 +226,7 @@ void SIMIX_mutex_unlock(smx_mutex_t mutex, smx_process_t issuer) mutex->locked = 0; mutex->owner = NULL; } + XBT_OUT(); } /** @@ -213,10 +237,12 @@ void SIMIX_mutex_unlock(smx_mutex_t mutex, smx_process_t issuer) */ void SIMIX_mutex_destroy(smx_mutex_t mutex) { + XBT_IN("(%p)",mutex); if (mutex){ xbt_swag_free(mutex->sleeping); xbt_free(mutex); } + XBT_OUT(); } /********************************* Condition **********************************/ @@ -230,10 +256,12 @@ void SIMIX_mutex_destroy(smx_mutex_t mutex) */ smx_cond_t SIMIX_cond_init() { + XBT_IN("()"); s_smx_process_t p; smx_cond_t cond = xbt_new0(s_smx_cond_t, 1); cond->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); cond->mutex = NULL; + XBT_OUT(); return cond; } @@ -243,11 +271,13 @@ smx_cond_t SIMIX_cond_init() */ void SIMIX_pre_cond_wait(smx_req_t req) { + XBT_IN("(%p)",req); smx_process_t issuer = req->issuer; smx_cond_t cond = req->cond_wait.cond; smx_mutex_t mutex = req->cond_wait.mutex; _SIMIX_cond_wait(cond, mutex, -1, issuer, req); + XBT_OUT(); } /** @@ -256,18 +286,21 @@ void SIMIX_pre_cond_wait(smx_req_t req) */ void SIMIX_pre_cond_wait_timeout(smx_req_t req) { + XBT_IN("(%p)",req); smx_process_t issuer = req->issuer; smx_cond_t cond = req->cond_wait_timeout.cond; smx_mutex_t mutex = req->cond_wait_timeout.mutex; double timeout = req->cond_wait_timeout.timeout; _SIMIX_cond_wait(cond, mutex, timeout, issuer, req); + XBT_OUT(); } static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, smx_process_t issuer, smx_req_t req) { + XBT_IN("(%p, %p, %f, %p,%p)",cond,mutex,timeout,issuer,req); smx_action_t sync_act = NULL; XBT_DEBUG("Wait condition %p", cond); @@ -283,6 +316,7 @@ static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, xbt_fifo_unshift(sync_act->request_list, req); issuer->waiting_action = sync_act; xbt_swag_insert(req->issuer, cond->sleeping); + XBT_OUT(); } /** @@ -294,6 +328,7 @@ static void _SIMIX_cond_wait(smx_cond_t cond, smx_mutex_t mutex, double timeout, */ void SIMIX_cond_signal(smx_cond_t cond) { + XBT_IN("(%p)",cond); smx_process_t proc = NULL; smx_mutex_t mutex = NULL; smx_req_t req = NULL; @@ -320,6 +355,7 @@ void SIMIX_cond_signal(smx_cond_t cond) SIMIX_pre_mutex_lock(req); } + XBT_OUT(); } /** @@ -331,12 +367,14 @@ void SIMIX_cond_signal(smx_cond_t cond) */ void SIMIX_cond_broadcast(smx_cond_t cond) { + XBT_IN("(%p)",cond); XBT_DEBUG("Broadcast condition %p", cond); /* Signal the condition until nobody is waiting on it */ while (xbt_swag_size(cond->sleeping)) { SIMIX_cond_signal(cond); } + XBT_OUT(); } /** @@ -347,6 +385,7 @@ void SIMIX_cond_broadcast(smx_cond_t cond) */ void SIMIX_cond_destroy(smx_cond_t cond) { + XBT_IN("(%p)",cond); XBT_DEBUG("Destroy condition %p", cond); if (cond != NULL) { @@ -356,6 +395,7 @@ void SIMIX_cond_destroy(smx_cond_t cond) xbt_swag_free(cond->sleeping); xbt_free(cond); } + XBT_OUT(); } /******************************** Semaphores **********************************/ @@ -363,17 +403,20 @@ void SIMIX_cond_destroy(smx_cond_t cond) /** @brief Initialize a semaphore */ smx_sem_t SIMIX_sem_init(unsigned int value) { + XBT_IN("(%d)",value); s_smx_process_t p; smx_sem_t sem = xbt_new0(s_smx_sem_t, 1); sem->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup)); sem->value = value; + XBT_OUT(); return sem; } /** @brief Destroys a semaphore */ void SIMIX_sem_destroy(smx_sem_t sem) { + XBT_IN("(%p)",sem); XBT_DEBUG("Destroy semaphore %p", sem); if (sem != NULL) { xbt_assert(xbt_swag_size(sem->sleeping) == 0, @@ -381,6 +424,7 @@ void SIMIX_sem_destroy(smx_sem_t sem) xbt_swag_free(sem->sleeping); xbt_free(sem); } + XBT_OUT(); } /** @brief release the semaphore @@ -390,6 +434,7 @@ void SIMIX_sem_destroy(smx_sem_t sem) */ void SIMIX_sem_release(smx_sem_t sem) { + XBT_IN("(%p)",sem); smx_process_t proc; XBT_DEBUG("Sem release semaphore %p", sem); @@ -401,23 +446,29 @@ void SIMIX_sem_release(smx_sem_t sem) } else if (sem->value < SMX_SEM_NOLIMIT) { sem->value++; } + XBT_OUT(); } /** @brief Returns true if acquiring this semaphore would block */ XBT_INLINE int SIMIX_sem_would_block(smx_sem_t sem) { + XBT_IN("(%p)",sem); + XBT_OUT(); return (sem->value <= 0); } /** @brief Returns the current capacity of the semaphore */ int SIMIX_sem_get_capacity(smx_sem_t sem) { + XBT_IN("(%p)",sem); + XBT_OUT(); return sem->value; } static void _SIMIX_sem_wait(smx_sem_t sem, double timeout, smx_process_t issuer, smx_req_t req) { + XBT_IN("(%p, %f, %p, %p)",sem,timeout,issuer,req); smx_action_t sync_act = NULL; XBT_DEBUG("Wait semaphore %p (timeout:%f)", sem, timeout); @@ -430,6 +481,7 @@ static void _SIMIX_sem_wait(smx_sem_t sem, double timeout, smx_process_t issuer, sem->value--; SIMIX_request_answer(req); } + XBT_OUT(); } /** @@ -437,7 +489,9 @@ static void _SIMIX_sem_wait(smx_sem_t sem, double timeout, smx_process_t issuer, */ void SIMIX_pre_sem_acquire(smx_req_t req) { + XBT_IN("(%p)",req); _SIMIX_sem_wait(req->sem_acquire.sem, -1, req->issuer, req); + XBT_OUT(); } /** @@ -445,6 +499,8 @@ void SIMIX_pre_sem_acquire(smx_req_t req) */ void SIMIX_pre_sem_acquire_timeout(smx_req_t req) { + XBT_IN("(%p)",req); _SIMIX_sem_wait(req->sem_acquire_timeout.sem, req->sem_acquire_timeout.timeout, req->issuer, req); + XBT_OUT(); } diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index fbfc647b7d..243adf3082 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -1,6 +1,24 @@ +/* smx_user.c - public interface to simix */ + +/* Copyright (c) 2010, 2011. Da SimGrid team. All rights reserved. */ + +/* This program 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 _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 /* isfinite() */ + #include "private.h" #include "mc/mc.h" + XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix); static const char* request_names[] = { diff --git a/src/smpi/private.h b/src/smpi/private.h index 12bf309a46..d457c767b4 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -83,6 +83,7 @@ MPI_Comm smpi_comm_new(MPI_Group group); void smpi_comm_destroy(MPI_Comm comm); MPI_Group smpi_comm_group(MPI_Comm comm); int smpi_comm_size(MPI_Comm comm); +void smpi_comm_get_name(MPI_Comm comm, char* name, int* len); int smpi_comm_rank(MPI_Comm comm); MPI_Comm smpi_comm_split(MPI_Comm comm, int color, int key); diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 3d6b456d19..d1945536a1 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -476,13 +476,12 @@ void smpi_mpi_allgatherv(void *sendbuf, int sendcount, MPI_Datatype recvtype, MPI_Comm comm) { int system_tag = 666; - int rank, size, other, index, sendsize, recvsize; + int rank, size, other, index, sendsize; MPI_Request *requests; rank = smpi_comm_rank(comm); size = smpi_comm_size(comm); sendsize = smpi_datatype_size(sendtype); - recvsize = smpi_datatype_size(recvtype); // Local copy from self memcpy(&((char *) recvbuf)[displs[rank]], sendbuf, sendcount * sendsize * sizeof(char)); @@ -552,7 +551,7 @@ void smpi_mpi_scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm) { int system_tag = 666; - int rank, size, dst, index, sendsize, recvsize; + int rank, size, dst, index, recvsize; MPI_Request *requests; rank = smpi_comm_rank(comm); @@ -562,7 +561,6 @@ void smpi_mpi_scatterv(void *sendbuf, int *sendcounts, int *displs, smpi_mpi_recv(recvbuf, recvcount, recvtype, root, system_tag, comm, MPI_STATUS_IGNORE); } else { - sendsize = smpi_datatype_size(sendtype); recvsize = smpi_datatype_size(recvtype); // Local copy from root memcpy(recvbuf, &((char *) sendbuf)[displs[root]], diff --git a/src/smpi/smpi_bench.c b/src/smpi/smpi_bench.c index 8c81580389..c9d2c8b4ab 100644 --- a/src/smpi/smpi_bench.c +++ b/src/smpi/smpi_bench.c @@ -7,6 +7,7 @@ #include "private.h" #include "xbt/dict.h" #include "xbt/sysdep.h" +#include "xbt/ex.h" #include "surf/surf.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_bench, smpi, @@ -14,6 +15,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_bench, smpi, xbt_dict_t allocs = NULL; /* Allocated on first use */ xbt_dict_t samples = NULL; /* Allocated on first use */ +xbt_dict_t calls = NULL; /* Allocated on first use */ typedef struct { int count; @@ -39,6 +41,9 @@ void smpi_bench_destroy(void) if (samples) { xbt_dict_free(&samples); } + if(calls) { + xbt_dict_free(&calls); + } } static void smpi_execute_flops(double flops) @@ -223,3 +228,50 @@ void smpi_shared_free(void *ptr) xbt_dict_remove(allocs, loc); } } + +int smpi_shared_known_call(const char* func, const char* input) { + char* loc = bprintf("%s:%s", func, input); + xbt_ex_t ex; + int known; + + if(!calls) { + calls = xbt_dict_new(); + } + TRY { + xbt_dict_get(calls, loc); /* Succeed or throw */ + known = 1; + } + CATCH(ex) { + if(ex.category == not_found_error) { + known = 0; + xbt_ex_free(ex); + } else { + RETHROW; + } + } + free(loc); + return known; +} + +void* smpi_shared_get_call(const char* func, const char* input) { + char* loc = bprintf("%s:%s", func, input); + void* data; + + if(!calls) { + calls = xbt_dict_new(); + } + data = xbt_dict_get(calls, loc); + free(loc); + return data; +} + +void* smpi_shared_set_call(const char* func, const char* input, void* data) { + char* loc = bprintf("%s:%s", func, input); + + if(!calls) { + calls = xbt_dict_new(); + } + xbt_dict_set(calls, loc, data, NULL); + free(loc); + return data; +} diff --git a/src/smpi/smpi_comm.c b/src/smpi/smpi_comm.c index 70267cd79e..c189c4d569 100644 --- a/src/smpi/smpi_comm.c +++ b/src/smpi/smpi_comm.c @@ -67,6 +67,16 @@ int smpi_comm_rank(MPI_Comm comm) return smpi_group_rank(smpi_comm_group(comm), smpi_process_index()); } +void smpi_comm_get_name (MPI_Comm comm, char* name, int* len) +{ + if(comm == MPI_COMM_WORLD) { + strcpy(name, "WORLD"); + *len = 5; + } else { + *len = snprintf(name, MPI_MAX_NAME_STRING, "%p", comm); + } +} + MPI_Comm smpi_comm_split(MPI_Comm comm, int color, int key) { int system_tag = 666; diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 83647e1bf1..1b98966471 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -252,6 +252,10 @@ int MAIN__(void) xbt_cfgelm_double, &default_threshold, 1, 1, NULL, NULL); + if(getenv("SMPI_PRETEND_CC") != NULL) { + return 0; + } + #ifdef HAVE_TRACING TRACE_global_init(&xargc, xargv); #endif diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index e8dfd05570..d86fcd8c18 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -164,6 +164,11 @@ int MPI_Comm_size(MPI_Comm comm, int *size) return PMPI_Comm_size(comm, size); } +int MPI_Comm_get_name (MPI_Comm comm, char* name, int* len) +{ + return PMPI_Comm_get_name(comm, name, len); +} + int MPI_Comm_group(MPI_Comm comm, MPI_Group * group) { return PMPI_Comm_group(comm, group); @@ -189,6 +194,11 @@ int MPI_Comm_free(MPI_Comm * comm) return PMPI_Comm_free(comm); } +int MPI_Comm_disconnect(MPI_Comm * comm) +{ + return PMPI_Comm_disconnect(comm); +} + int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm* comm_out) { return PMPI_Comm_split(comm, color, key, comm_out); diff --git a/src/smpi/smpi_mpi_dt.c b/src/smpi/smpi_mpi_dt.c index cc85e55b86..700870df07 100644 --- a/src/smpi/smpi_mpi_dt.c +++ b/src/smpi/smpi_mpi_dt.c @@ -129,7 +129,7 @@ int smpi_datatype_extent(MPI_Datatype datatype, MPI_Aint * lb, *extent = datatype->ub - datatype->lb; retval = MPI_SUCCESS; } - return MPI_SUCCESS; + return retval; } int smpi_datatype_copy(void *sendbuf, int sendcount, MPI_Datatype sendtype, diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index d229642b43..ec3da34945 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -649,6 +649,23 @@ int PMPI_Comm_size(MPI_Comm comm, int *size) return retval; } +int PMPI_Comm_get_name (MPI_Comm comm, char* name, int* len) +{ + int retval; + + smpi_bench_end(); + if (comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else if (name == NULL || len == NULL) { + retval = MPI_ERR_ARG; + } else { + smpi_comm_get_name(comm, name, len); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + int PMPI_Comm_group(MPI_Comm comm, MPI_Group * group) { int retval; @@ -746,6 +763,25 @@ int PMPI_Comm_free(MPI_Comm * comm) return retval; } +int PMPI_Comm_disconnect(MPI_Comm * comm) +{ + /* TODO: wait until all communication in comm are done */ + int retval; + + smpi_bench_end(); + if (comm == NULL) { + retval = MPI_ERR_ARG; + } else if (*comm == MPI_COMM_NULL) { + retval = MPI_ERR_COMM; + } else { + smpi_comm_destroy(*comm); + *comm = MPI_COMM_NULL; + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + int PMPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm* comm_out) { int retval; diff --git a/src/smpi/smpicc.in b/src/smpi/smpicc.in index 84745dd5a4..7a77cbae13 100755 --- a/src/smpi/smpicc.in +++ b/src/smpi/smpicc.in @@ -1,12 +1,12 @@ #! /bin/bash -CC="gcc" +CC=@CMAKE_C_COMPILER@ CFLAGS="-O2 -Dmain=smpi_simulated_main" #FIXME: probably only want the last two pairs after 'make install' INCLUDEARGS="-I@top_srcdir@/include -I@top_srcdir@/include/smpi -I@includedir@ -I@includedir@/smpi" CMAKE_LINKARGS="-L@CMAKE_LINKARGS@" -LINKARGS="-lsimgrid -lsmpi " +LINKARGS="-lsimgrid -lsmpi -lm" CMDLINE="" while [ -n "$1" ]; do diff --git a/src/smpi/smpirun.in b/src/smpi/smpirun.in index 09ea663c3f..ec20d10f9f 100755 --- a/src/smpi/smpirun.in +++ b/src/smpi/smpirun.in @@ -18,6 +18,28 @@ POWER="${DEFAULT_POWER}" SIMOPTS="--cfg=maxmin/precision:1e-9 --cfg=network/model:SMPI --cfg=TCP_gamma:4194304" +#usage to print the way this script should be called +function usage () { + echo "usage:" + echo "$0 [-quiet] [-keep-temps]" + echo " [-np ] -platform -hostfile [-map] program [program-options]" + echo " [-trace] # activate tracing" + echo " [-trace-grouped] # group MPI processes by location" + echo " [-trace-resource] # trace resource utilization" + echo " [-trace-triva] # generate configuration for Triva's GraphView" + echo " [-trace-file ] # name of the tracefile (simgrid_smpi.trace)" + echo "or (deprecated usage):" + echo "$0 [-quiet] [-keep-temps] [-np ] [-bandwidth ] [-latency ] program [program-options]" + echo +} + +#check if we have at least one parameter +if [ $# -eq 0 ] +then + usage + exit +fi + while true; do case "$1" in "-np" | "-n") @@ -55,12 +77,27 @@ while true; do ;; "-trace") - TRACEOPT="$2" - shift 2 + TRACE_ACTIVE="true" + shift 1 + ;; + + "-trace-file") + TRACE_FILENAME="$2" + shift 2 + ;; + + "-trace-grouped") + TRACE_GROUPED="true" + shift 1 + ;; + + "-trace-resource") + TRACE_RESOURCE="true" + shift 1 ;; - "-triva") - TRIVA="true" + "-trace-triva") + TRACE_TRIVA="true" shift 1 ;; @@ -70,11 +107,7 @@ while true; do ;; "-help" | "--help" | "-h") - echo "usage:" - echo "$0 [-quiet] [-keep-temps] [-trace ] [-np ] -platform -hostfile [-map] program [program-options]" - echo "or (deprecated usage):" - echo "$0 [-quiet] [-keep-temps] [-np ] [-bandwidth ] [-latency ] program [program-options]" - echo + usage exit ;; @@ -96,6 +129,13 @@ shift ##----------------------------------- +# test if we have something to execute, otherwise show usage and exit +if [ -z ${EXEC} ] +then + echo "Program is missing" + usage + exit 1 +fi @@ -203,24 +243,32 @@ APPLICATIONFOOT ##-------------------------------- end DEFAULT APPLICATION -------------------------------------- ##---------------------- SMPI TRACING OPTIONS --------------------------------- - if [ -n "${TRACEOPT}" ]; then - TRACEOPTIONS="--cfg=tracing:1 --cfg=tracing/filename:${TRACEOPT} --cfg=tracing/smpi:1 --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1" - else - TRACEOPTIONS="" +if [ -n "${TRACE_ACTIVE}" ]; then + #define trace filename + if [ -z "${TRACE_FILENAME}" ]; then + TRACE_FILENAME="smpi_simgrid.trace" fi + TRACEOPTIONS="--cfg=tracing:1 --cfg=tracing/filename:${TRACE_FILENAME} --cfg=tracing/smpi:1" - if [ -n "${TRIVA}" ]; then - TRIVAOPTIONS="--cfg=triva/categorized:smpi_cat.plist --cfg=triva/uncategorized:smpi_uncat.plist" - else - TRIVAOPTIONS="" + if [ -n "${TRACE_GROUPED}" ]; then + TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/smpi/group:1" fi + + if [ -n "${TRACE_RESOURCE}" ]; then + TRACEOPTIONS="${TRACEOPTIONS} --cfg=tracing/categorized:1 --cfg=tracing/uncategorized:1" + fi + + if [ -n "${TRACE_TRIVA}" ]; then + TRACEOPTIONS="${TRACEOPTIONS} --cfg=triva/categorized:smpi_cat.plist --cfg=triva/uncategorized:smpi_uncat.plist" + fi +fi ##---------------------- end SMPI TRACING OPTIONS --------------------------------- export SMPI_GLOBAL_SIZE=${NUMPROCS} if [ -n "${KEEP}" ] ; then - echo ${EXEC} ${SIMOPTS} ${TRACEOPTIONS} ${TRIVAOPTIONS} ${PLATFORMTMP} ${APPLICATIONTMP} + echo ${EXEC} ${SIMOPTS} ${TRACEOPTIONS} ${PLATFORMTMP} ${APPLICATIONTMP} fi -${EXEC} ${SIMOPTS} ${TRACEOPTIONS} ${TRIVAOPTIONS} ${PLATFORMTMP} ${APPLICATIONTMP} +${EXEC} ${SIMOPTS} ${TRACEOPTIONS} ${PLATFORMTMP} ${APPLICATIONTMP} if [ -z "${KEEP}" ] ; then if [ -z "${PLATFORM}" ]; then diff --git a/src/surf/cpu.c b/src/surf/cpu.c index 0e6fe6517a..1a86a63c3f 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -201,17 +201,19 @@ static void cpu_update_actions_state(double now, double delta) xbt_swag_foreach_safe(action, next_action, running_actions) { #ifdef HAVE_TRACING - cpu_Cas01_t x = + if (TRACE_is_enabled()) { + cpu_Cas01_t x = lmm_constraint_id(lmm_get_cnst_from_var (cpu_maxmin_system, action->variable, 0)); - TRACE_surf_host_set_utilization(x->generic_resource.name, - action->generic_action.data, - (surf_action_t) action, - lmm_variable_getvalue - (action->variable), now - delta, - delta); - TRACE_last_timestamp_to_dump = now-delta; + TRACE_surf_host_set_utilization(x->generic_resource.name, + action->generic_action.data, + (surf_action_t) action, + 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); diff --git a/src/surf/cpu_im.c b/src/surf/cpu_im.c index 229c84de9d..19f1743728 100644 --- a/src/surf/cpu_im.c +++ b/src/surf/cpu_im.c @@ -234,15 +234,17 @@ static void cpu_im_update_remains(cpu_Cas01_im_t cpu, double now) (action).variable) * (now - cpu->last_update)); #ifdef HAVE_TRACING - TRACE_surf_host_set_utilization(cpu->generic_resource.name, - action-> - generic_lmm_action.generic_action. - data, (surf_action_t) action, - lmm_variable_getvalue - (GENERIC_LMM_ACTION - (action).variable), - cpu->last_update, - now - cpu->last_update); + if (TRACE_is_enabled()) { + TRACE_surf_host_set_utilization(cpu->generic_resource.name, + action-> + generic_lmm_action.generic_action. + data, (surf_action_t) action, + lmm_variable_getvalue + (GENERIC_LMM_ACTION + (action).variable), + cpu->last_update, + now - cpu->last_update); + } #endif XBT_DEBUG("Update action(%p) remains %lf", action, GENERIC_ACTION(action).remains); @@ -325,7 +327,7 @@ static void cpu_im_update_actions_state(double now, double delta) GENERIC_ACTION(action).finish = surf_get_clock(); /* set the remains to 0 due to precision problems when updating the remaining amount */ #ifdef HAVE_TRACING - { + if (TRACE_is_enabled()) { cpu_Cas01_im_t cpu = ((cpu_Cas01_im_t)(action->cpu)); TRACE_surf_host_set_utilization(cpu->generic_resource.name, action->generic_lmm_action.generic_action.data, @@ -340,26 +342,26 @@ static void cpu_im_update_actions_state(double now, double delta) cpu_im_update_remains(action->cpu, surf_get_clock()); } #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) - void **data; + void **data; cpu_Cas01_im_t cpu; xbt_lib_cursor_t cursor; char *key; double smaller = -1; xbt_lib_foreach(host_lib, cursor, key, data){ - if(data[SURF_CPU_LEVEL]){ - cpu = data[SURF_CPU_LEVEL]; - if (smaller < 0){ - smaller = cpu->last_update; - continue; - } - if (cpu->last_update < smaller){ - smaller = cpu->last_update; - } - } - } + if(data[SURF_CPU_LEVEL]){ + cpu = data[SURF_CPU_LEVEL]; + if (smaller < 0){ + smaller = cpu->last_update; + continue; + } + if (cpu->last_update < smaller){ + smaller = cpu->last_update; + } + } + } if (smaller > 0) { TRACE_last_timestamp_to_dump = smaller; } diff --git a/src/surf/cpu_ti.c b/src/surf/cpu_ti.c index 47a3e3e157..f40d1c62a6 100644 --- a/src/surf/cpu_ti.c +++ b/src/surf/cpu_ti.c @@ -733,7 +733,7 @@ static double surf_cpu_ti_get_power_scale(surf_cpu_ti_tgmr_t trace, 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->event_list, 0, &val); + xbt_dynar_get_cpy(trace->power_trace->event_list, point, &val); return val.value; } @@ -1103,18 +1103,21 @@ static double surf_cpu_ti_solve_trace_simple(surf_cpu_ti_trace_t trace, static int surf_cpu_ti_binary_search(double *array, double a, int low, int high) { - int mid = low + (high - low) / 2; - XBT_DEBUG("a %lf low %d high %d mid %d value %lf", a, low, high, mid, - array[mid]); - /* a == array[mid] */ - if (array[mid] == a) - return mid; - /* a is between mid and mid+1 */ - if (array[mid] < a && array[mid + 1] > a) - return mid; - - if (array[mid] < a) - return surf_cpu_ti_binary_search(array, a, mid + 1, high); - else - return surf_cpu_ti_binary_search(array, a, low, mid - 1); + 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 %lf low %d high %d mid %d value %lf", a, low, high, mid, + array[mid]); + + if (array[mid] > a) + high = mid; + else + low = mid; + } + while (low < high - 1); + + return low; } diff --git a/src/surf/fair_bottleneck.c b/src/surf/fair_bottleneck.c index 9ddb5a690e..ce44b58fb0 100644 --- a/src/surf/fair_bottleneck.c +++ b/src/surf/fair_bottleneck.c @@ -27,7 +27,6 @@ void bottleneck_solve(lmm_system_t sys) xbt_swag_t cnst_list = NULL; xbt_swag_t var_list = NULL; xbt_swag_t elem_list = NULL; - double min_usage = -1; int i; static s_xbt_swag_t cnst_to_update; @@ -87,7 +86,6 @@ void bottleneck_solve(lmm_system_t sys) } XBT_DEBUG("******* Constraints to process: %d *******", xbt_swag_size(cnst_list)); - min_usage = -1; xbt_swag_foreach_safe(cnst, cnst_next, cnst_list) { int nb = 0; XBT_DEBUG("Processing cnst %p ", cnst); diff --git a/src/surf/gtnets/gtnets_interface.cc b/src/surf/gtnets/gtnets_interface.cc index d0412eae28..0d366a4e2f 100644 --- a/src/surf/gtnets/gtnets_interface.cc +++ b/src/surf/gtnets/gtnets_interface.cc @@ -124,7 +124,26 @@ double gtnets_get_flow_rx(void *metadata){ // run for a given time (double) int gtnets_run(Time_t deltat){ + ofstream file; + streambuf* sbuf; + double value; + + if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) { + file.open ("/dev/null"); + sbuf = cout.rdbuf(); + cout.rdbuf(file.rdbuf()); + XBT_DEBUG("Enable GTNetS library quite mode"); + }else { + XBT_DEBUG("Disable GTNetS library quite mode"); + } + gtnets_sim->run(deltat); + + + if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) { + cout.rdbuf(sbuf); + file.close(); + } return 0; } diff --git a/src/surf/network.c b/src/surf/network.c index 7a139323d6..e22c2b6d37 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -437,17 +437,19 @@ static void net_update_actions_state(double now, double delta) action->weight); } #ifdef HAVE_TRACING - xbt_dynar_t route = - global_routing->get_route(action->src_name, action->dst_name); - link_CM02_t link; - unsigned int i; - xbt_dynar_foreach(route, i, link) { - TRACE_surf_link_set_utilization(link->lmm_resource.generic_resource.name, - action->generic_action.data, - (surf_action_t) action, - lmm_variable_getvalue - (action->variable), now - delta, - delta); + if (TRACE_is_enabled()) { + xbt_dynar_t route = global_routing->get_route(action->src_name, + action->dst_name); + link_CM02_t link; + unsigned int i; + xbt_dynar_foreach(route, i, link) { + TRACE_surf_link_set_utilization(link->lmm_resource.generic_resource.name, + action->generic_action.data, + (surf_action_t) action, + lmm_variable_getvalue + (action->variable), now - delta, + delta); + } } #endif if(!lmm_get_number_of_cnst_from_var(network_maxmin_system, action->variable)) { @@ -608,9 +610,9 @@ static surf_action_t net_communicate(const char *src_name, xbt_dynar_t back_route = NULL; int constraints_per_variable = 0; - // I will need this route for some time so let's call get_route_no_cleanup - xbt_dynar_t route = global_routing->get_route_no_cleanup(src_name, dst_name); - + xbt_dynar_t route; + // I will need this route for some time so require for no cleanup + global_routing->get_route_latency(src_name, dst_name, &route, &latency, 0); if (sg_network_fullduplex == 1) { back_route = global_routing->get_route(dst_name, src_name); @@ -622,7 +624,6 @@ static surf_action_t net_communicate(const char *src_name, XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate); /* LARGE PLATFORMS HACK: assert on total_route_size */ - latency = global_routing->get_latency(src_name,dst_name); xbt_assert(xbt_dynar_length(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); @@ -731,9 +732,12 @@ static surf_action_t net_communicate(const char *src_name, /* LARGE PLATFORMS HACK: expand also with src->link and dst->link */ #ifdef HAVE_TRACING - action->src_name = xbt_strdup(src_name); - - action->dst_name = xbt_strdup(dst_name); + if (TRACE_is_enabled()) { + action->src_name = xbt_strdup(src_name); + action->dst_name = xbt_strdup(dst_name); + } else { + action->src_name = action->dst_name = NULL; + } #endif xbt_dynar_free(&route); @@ -907,7 +911,7 @@ void surf_network_model_init_LegrandVelho(const char *filename) xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775); update_model_description(surf_network_model_description, - "LV08", surf_network_model); + "LV08_fullupdate", surf_network_model); } /***************************************************************************/ diff --git a/src/surf/network_constant.c b/src/surf/network_constant.c index 066cd014dc..7b811c41e8 100644 --- a/src/surf/network_constant.c +++ b/src/surf/network_constant.c @@ -125,7 +125,7 @@ static surf_action_t netcste_communicate(const char *src_name, action->suspended = 0; - action->latency = 1; //random_generate(random_latency); + action->latency = sg_latency_factor; //random_generate(random_latency); action->lat_init = action->latency; if (action->latency <= 0.0) { diff --git a/src/surf/network_gtnets.c b/src/surf/network_gtnets.c index efd9ad8230..e8891fdbb2 100644 --- a/src/surf/network_gtnets.c +++ b/src/surf/network_gtnets.c @@ -240,7 +240,7 @@ static void update_actions_state(double now, double delta) xbt_swag_t running_actions = surf_network_model->states.running_action_set; - /* If there are no renning flows, just return */ + /* If there are no running flows, just return */ if (time_to_next_flow_completion < 0.0) { return; } @@ -264,48 +264,75 @@ static void update_actions_state(double now, double delta) action->generic_action.remains); double sent = gtnets_get_flow_rx(action); + XBT_DEBUG("Sent value returned by GTNetS : %f", sent); + #ifdef HAVE_TRACING - double trace_sent = sent; - if (trace_sent == 0) { - //if sent is equals to 0, means that gtnets sent all the bytes - trace_sent = action->generic_action.cost; - } - // tracing resource utilization -// COMMENTED BY DAVID -// int src = TRACE_surf_gtnets_get_src (action); -// int dst = TRACE_surf_gtnets_get_dst (action); -// if (src != -1 && dst != -1){ -// xbt_dynar_t route = used_routing->get_route(src, dst); -// network_link_GTNETS_t link; -// unsigned int i; -// xbt_dynar_foreach(route, i, link) { -// TRACE_surf_link_set_utilization (link->generic_resource.name, -// action->generic_action.data, trace_sent/delta, now-delta, delta); -// } -// } + action->last_remains = action->generic_action.remains; #endif - XBT_DEBUG("Sent value returned by GTNetS : %f", sent); - //need to trust this remain value - if (sent == 0) { - action->generic_action.remains = 0; + //need to trust this remain value + if (sent == 0) { + action->generic_action.remains = 0; } else { action->generic_action.remains = action->generic_action.cost - sent; } - XBT_DEBUG("Action (%p) remains new value: %f", action, + + // 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 = global_routing->get_route(action->src_name, + action->dst_name); + network_link_GTNETS_t link; + unsigned int i; + xbt_dynar_foreach(route, i, link) { + TRACE_surf_link_set_utilization (link->generic_resource.name, + action->generic_action.data, + (surf_action_t) action, + (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); + #ifdef HAVE_TRACING TRACE_surf_gtnets_destroy(action); #endif - action_state_set((surf_action_t) action, SURF_ACTION_DONE); - XBT_DEBUG("----> Action (%p) just terminated", action); } @@ -351,12 +378,16 @@ static surf_action_t communicate(const char *src_name, 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, dst); + TRACE_surf_gtnets_communicate(action, src_name, dst_name); #endif return (surf_action_t) action; @@ -380,6 +411,13 @@ 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(); @@ -407,6 +445,9 @@ static void surf_network_model_init_internal(void) 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; @@ -425,7 +466,6 @@ static int get_latency_limited(surf_action_t action) } #endif -#ifdef HAVE_GTNETS void surf_network_model_init_GTNETS(const char *filename) { if (surf_network_model) @@ -446,4 +486,3 @@ void surf_network_model_init_GTNETS(const char *filename) update_model_description(surf_network_model_description, "GTNets", surf_network_model); } -#endif diff --git a/src/surf/network_gtnets_private.h b/src/surf/network_gtnets_private.h index b6acca57e7..9cd3ab8795 100644 --- a/src/surf/network_gtnets_private.h +++ b/src/surf/network_gtnets_private.h @@ -23,9 +23,16 @@ 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 + char *src_name; + char *dst_name; +#endif //HAVE_TRACING } s_surf_action_network_GTNETS_t, *surf_action_network_GTNETS_t; xbt_dict_t network_card_ids; diff --git a/src/surf/network_im.c b/src/surf/network_im.c index 3b1e091df1..24b49425d4 100644 --- a/src/surf/network_im.c +++ b/src/surf/network_im.c @@ -781,9 +781,12 @@ static surf_action_t im_net_communicate(const char *src_name, /* LARGE PLATFORMS HACK: expand also with src->link and dst->link */ #ifdef HAVE_TRACING - action->src_name = xbt_strdup(src_name); - - action->dst_name = xbt_strdup(dst_name); + if (TRACE_is_enabled()) { + action->src_name = xbt_strdup(src_name); + action->dst_name = xbt_strdup(dst_name); + } else { + action->src_name = action->dst_name = NULL; + } #endif xbt_dynar_free(&route); @@ -870,8 +873,6 @@ static void im_net_finalize(void) static void im_surf_network_model_init_internal(void) { s_surf_action_network_CM02_im_t comm; - XBT_INFO("You are using the UNSAFE lazy management optimization, I hope you know what you are doing."); - XBT_INFO("====> For now this optimization is only available for LV08_im network model."); surf_network_model = surf_model_init(); @@ -948,7 +949,7 @@ void im_surf_network_model_init_LegrandVelho(const char *filename) xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775); update_model_description(surf_network_model_description, - "LV08_im", surf_network_model); + "LV08", surf_network_model); } diff --git a/src/surf/network_ns3.c b/src/surf/network_ns3.c new file mode 100644 index 0000000000..595dfc5da3 --- /dev/null +++ b/src/surf/network_ns3.c @@ -0,0 +1,559 @@ +/* Copyright (c) 2007, 2008, 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is 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/maxmin.h" +#include "surf/ns3/ns3_interface.h" +#include "xbt/lib.h" +#include "surf/network_ns3_private.h" +#include "xbt/str.h" + +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_global_t global_routing; +extern xbt_dict_t dict_socket; + +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(const char *src_name, + const char *dst_name, 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; + +static void replace_str(char *str, const char *orig, const char *rep) +{ + char buffer[30]; + char *p; + + if(!(p = strstr(str, orig))) // Is 'orig' even in 'str'? + return; + + strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$ + buffer[p-str] = '\0'; + + sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); + xbt_free(str); + str = xbt_strdup(buffer); +} + +static void replace_bdw_ns3(char ** bdw) +{ + char *temp = xbt_strdup(*bdw); + xbt_free(*bdw); + *bdw = bprintf("%fBps",atof(temp)); + xbt_free(temp); + +} + +static void replace_lat_ns3(char ** lat) +{ + char *temp = xbt_strdup(*lat); + xbt_free(*lat); + *lat = bprintf("%fs",atof(temp)); + xbt_free(temp); +} + +void parse_ns3_add_host(void) +{ + XBT_DEBUG("NS3_ADD_HOST '%s'",A_surfxml_host_id); + xbt_lib_set(host_lib, + A_surfxml_host_id, + NS3_HOST_LEVEL, + ns3_add_host(A_surfxml_host_id) + ); +} + +static void ns3_free_dynar(void * elmts){ + if(elmts) + free(elmts); + return; +} + +void parse_ns3_add_link(void) +{ + XBT_DEBUG("NS3_ADD_LINK '%s'",A_surfxml_link_id); + + if(!IPV4addr) IPV4addr = xbt_dynar_new(sizeof(char*),ns3_free_dynar); + + tmgr_trace_t bw_trace; + tmgr_trace_t state_trace; + tmgr_trace_t lat_trace; + + bw_trace = tmgr_trace_new(A_surfxml_link_bandwidth_file); + lat_trace = tmgr_trace_new(A_surfxml_link_latency_file); + state_trace = tmgr_trace_new(A_surfxml_link_state_file); + + 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(A_surfxml_link_id); + link_ns3->bdw = xbt_strdup(A_surfxml_link_bandwidth); + link_ns3->lat = xbt_strdup(A_surfxml_link_latency); + + surf_ns3_link_t link = xbt_new0(s_surf_ns3_link_t,1); + link->generic_resource.name = xbt_strdup(A_surfxml_link_id); + link->generic_resource.properties = current_property_set; + link->data = link_ns3; + link->created = 1; + + xbt_lib_set(link_lib,A_surfxml_link_id,NS3_LINK_LEVEL,link_ns3); + xbt_lib_set(link_lib,A_surfxml_link_id,SURF_LINK_LEVEL,link); +} +void parse_ns3_add_router(void) +{ + XBT_DEBUG("NS3_ADD_ROUTER '%s'",A_surfxml_router_id); + xbt_lib_set(as_router_lib, + A_surfxml_router_id, + NS3_ASR_LEVEL, + ns3_add_router(A_surfxml_router_id) + ); +} +void parse_ns3_add_AS(void) +{ + XBT_DEBUG("NS3_ADD_AS '%s'",A_surfxml_AS_id); + xbt_lib_set(as_router_lib, + A_surfxml_AS_id, + NS3_ASR_LEVEL, + ns3_add_AS(A_surfxml_AS_id) + ); +} +void parse_ns3_add_cluster(void) +{ + char *cluster_prefix = A_surfxml_cluster_prefix; + char *cluster_suffix = A_surfxml_cluster_suffix; + char *cluster_radical = A_surfxml_cluster_radical; + char *cluster_bb_bw = A_surfxml_cluster_bb_bw; + char *cluster_bb_lat = A_surfxml_cluster_bb_lat; + char *cluster_bw = A_surfxml_cluster_bw; + char *cluster_lat = A_surfxml_cluster_lat; + char *groups = NULL; + + int start, end, i; + unsigned int iter; + + xbt_dynar_t radical_elements; + xbt_dynar_t radical_ends; + xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL); + + char *router_id,*host_id; + + radical_elements = xbt_str_split(cluster_radical, ","); + xbt_dynar_foreach(radical_elements, iter, groups) { + radical_ends = xbt_str_split(groups, "-"); + + switch (xbt_dynar_length(radical_ends)) { + case 1: + surf_parse_get_int(&start,xbt_dynar_get_as(radical_ends, 0, char *)); + xbt_dynar_push_as(tab_elements_num, int, start); + router_id = bprintf("ns3_%s%d%s", cluster_prefix, start, cluster_suffix); + xbt_lib_set(host_lib, + router_id, + NS3_HOST_LEVEL, + ns3_add_host_cluster(router_id) + ); + XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id); + free(router_id); + break; + + case 2: + surf_parse_get_int(&start,xbt_dynar_get_as(radical_ends, 0, char *)); + surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); + for (i = start; i <= end; i++){ + xbt_dynar_push_as(tab_elements_num, int, i); + router_id = bprintf("ns3_%s%d%s", cluster_prefix, i, cluster_suffix); + xbt_lib_set(host_lib, + router_id, + NS3_HOST_LEVEL, + ns3_add_host_cluster(router_id) + ); + XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id); + free(router_id); + } + break; + + default: + XBT_DEBUG("Malformed radical"); + } + } + + //Create links + unsigned int cpt; + int elmts; + char * lat = xbt_strdup(cluster_lat); + char * bw = xbt_strdup(cluster_bw); + replace_lat_ns3(&lat); + replace_bdw_ns3(&bw); + + xbt_dynar_foreach(tab_elements_num,cpt,elmts) + { + host_id = bprintf("%s%d%s", cluster_prefix, elmts, cluster_suffix); + 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); + + if(host_src && host_dst){} + else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); + + ns3_add_link(host_src->node_num,host_src->type, + host_dst->node_num,host_dst->type, + bw,lat); + + free(router_id); + free(host_id); + } + xbt_dynar_free(&tab_elements_num); + + + //Create link backbone + lat = xbt_strdup(cluster_bb_lat); + bw = xbt_strdup(cluster_bb_bw); + replace_lat_ns3(&lat); + replace_bdw_ns3(&bw); + ns3_add_cluster(bw,lat,A_surfxml_cluster_id); + xbt_free(lat); + xbt_free(bw); +} + +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; +} +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(const char *src, const char *dst) +{ + return global_routing->get_route(src, dst); +} + +void parse_ns3_end_platform(void) +{ + ns3_end_platform(); +} + +/* Create the ns3 topology based on routing strategy */ +void create_ns3_topology() +{ + XBT_DEBUG("Starting topology generation"); + + xbt_dynar_shrink(IPV4addr,0); + + //get the onelinks from the parsed platform + xbt_dynar_t onelink_routes = global_routing->get_onelink_routes(); + 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; + unsigned int iter; + xbt_dynar_foreach(onelink_routes, iter, onelink) { + char *src = onelink->src; + char *dst = onelink->dst; + 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 = bprintf("%s",((surf_ns3_link_t)link)->data->bdw); + char * link_lat = bprintf("%s",(((surf_ns3_link_t)link)->data->lat)); + replace_lat_ns3(&link_lat); + replace_bdw_ns3(&link_bdw); + ((surf_ns3_link_t)link)->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 + ); + + //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); + + if(host_src && host_dst){} + else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); + + ns3_add_link(host_src->node_num,host_src->type,host_dst->node_num,host_dst->type,link_bdw,link_lat); + + xbt_free(link_bdw); + xbt_free(link_lat); + } + } +} + +static void define_callbacks_ns3(const char *filename) +{ + surfxml_add_callback(STag_surfxml_host_cb_list, &parse_ns3_add_host); //HOST + surfxml_add_callback(STag_surfxml_router_cb_list, &parse_ns3_add_router); //ROUTER + surfxml_add_callback(STag_surfxml_link_cb_list, &parse_ns3_add_link); //LINK + surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_ns3_add_AS); //AS + surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_ns3_add_cluster); //CLUSTER + + surfxml_add_callback(ETag_surfxml_platform_cb_list, &create_ns3_topology); //get_one_link_routes + surfxml_add_callback(ETag_surfxml_platform_cb_list, &parse_ns3_end_platform); //InitializeRoutes +} + +static void free_ns3_elmts(void * elmts) +{ +} + +static void free_ns3_link(void * elmts) +{ + ns3_link_t link = elmts; + free(link->id); + free(link->bdw); + free(link->lat); + free(link); +} + +static void free_ns3_host(void * elmts) +{ + ns3_nodes_t host = 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(const char *filename) +{ + 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 + + /* Added the initialization for NS3 interface */ + + if (ns3_initialize(xbt_cfg_get_string(_surf_cfg_set,"ns3/TcpModel"))) { + xbt_die("Impossible to initialize NS3 interface"); + } + + routing_model_create(sizeof(s_surf_ns3_link_t), NULL, NULL); + define_callbacks_ns3(filename); + + 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); + update_model_description(surf_network_model_description, + "NS3", surf_network_model); + +#ifdef HAVE_LATENCY_BOUND_TRACKING + surf_network_model->get_latency_limited = ns3_get_link_latency_limited; +#endif +} + +static void finalize(void) +{ + ns3_finalize(); + xbt_dynar_free_container(&IPV4addr); + xbt_dict_free(&dict_socket); +} + +static double ns3_share_resources(double min) +{ + XBT_DEBUG("ns3_share_resources"); + + 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) || min == 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)); + + 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); + + return time_to_next_flow_completion; +} + +static void ns3_update_actions_state(double now, double delta) +{ + xbt_dict_cursor_t cursor = NULL; + char *key; + void *data; + + 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)) { + while(double_positive(now-ns3_time())) { + ns3_simulator(now-ns3_time()); + } + return; + } + + xbt_dict_foreach(dict_socket,cursor,key,data){ + action = (surf_action_network_ns3_t)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 = global_routing->get_route(action->src_name, action->dst_name); + 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, + action->generic_action.data, + (surf_action_t) action, + (data_delta_sent)/delta, + now-delta, + delta); + } + action->last_sent = data_sent; + } +#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); + } + } + + while (xbt_dynar_length(socket_to_destroy)){ + 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); + XBT_DEBUG ("Removing socket %p of action %p", key, action); + xbt_dict_remove(dict_socket,key); + } + return; +} + +/* Max durations are not supported */ +static surf_action_t ns3_communicate(const char *src_name, + const char *dst_name, double size, double rate) +{ + surf_action_network_ns3_t action = NULL; + + XBT_DEBUG("Communicate from %s to %s",src_name,dst_name); + action = surf_action_new(sizeof(s_surf_action_network_ns3_t), size, surf_network_model, 0); + + ns3_create_flow(src_name, dst_name, surf_get_clock(), size, action); + +#ifdef HAVE_TRACING + action->last_sent = 0; + action->src_name = xbt_strdup (src_name); + action->dst_name = xbt_strdup (dst_name); +#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; +} + +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(((surf_action_network_ns3_t)action)->src_name); + xbt_free(((surf_action_network_ns3_t)action)->dst_name); + if (action->category) + xbt_free(action->category); +#endif + XBT_DEBUG ("Removing action %p", action); + surf_action_free(&action); + return 1; + } + return 0; +} diff --git a/src/surf/network_ns3_private.h b/src/surf/network_ns3_private.h new file mode 100644 index 0000000000..271af77c2e --- /dev/null +++ b/src/surf/network_ns3_private.h @@ -0,0 +1,35 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#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; + char *src_name; + char *dst_name; +#endif //HAVE_TRACING +} s_surf_action_network_ns3_t, *surf_action_network_ns3_t; + + +#endif /* _SURF_NETWORK_NS3_PRIVATE_H */ diff --git a/src/surf/ns3/my-point-to-point-helper.cc b/src/surf/ns3/my-point-to-point-helper.cc new file mode 100644 index 0000000000..f59149a353 --- /dev/null +++ b/src/surf/ns3/my-point-to-point-helper.cc @@ -0,0 +1,440 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2008 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mathieu Lacage + */ + +#include "ns3/abort.h" +#include "ns3/log.h" +#include "ns3/simulator.h" +#include "ns3/point-to-point-net-device.h" +#include "ns3/point-to-point-channel.h" +#include "ns3/point-to-point-remote-channel.h" +#include "ns3/queue.h" +#include "ns3/config.h" +#include "ns3/packet.h" +#include "ns3/names.h" +#include "ns3/string.h" +#include "ns3/mpi-interface.h" +#include "ns3/mpi-receiver.h" + +#include "ns3/trace-helper.h" +#include "my-point-to-point-helper.h" + +NS_LOG_COMPONENT_DEFINE ("MyPointToPointHelper"); + +///> RED Parameters see src/node/red-queue.* for details +//.AddAttribute ("Mode", +// "Whether to use Bytes (see MaxBytes) or Packets (see MaxPackets) as the maximum queue size metric.", +// EnumValue (BYTES), ///> currently supports BYTES only +// MakeEnumAccessor (&RedQueue::SetMode), +// MakeEnumChecker (BYTES, "Bytes", +// PACKETS, "Packets")) +// .AddAttribute ("MaxPackets", +// "The maximum number of packets accepted by this RedQueue.", +// UintegerValue (100), +// MakeUintegerAccessor (&RedQueue::m_maxPackets), +// MakeUintegerChecker ()) +// .AddAttribute ("MaxBytes", +// "The maximum number of bytes accepted by this RedQueue.", +// UintegerValue (100000), +// MakeUintegerAccessor (&RedQueue::m_maxBytes), +// MakeUintegerChecker ()) +// .AddAttribute ("m_burst", +// "maximum number of m_burst packets accepted by this queue", +// UintegerValue (6), ///> bursts must be > minTh/avpkt +// MakeUintegerAccessor (&RedQueue::m_burst), +// MakeUintegerChecker ()) +// .AddAttribute ("m_avPkt", +// "In bytes, use with m_burst to determine the time constant for average queue size calculations", +// UintegerValue (1024), ///> average packet size +// MakeUintegerAccessor (&RedQueue::m_avPkt), +// MakeUintegerChecker ()) +// .AddAttribute ("m_minTh", +// "Average queue size at which marking becomes a m_prob", +// UintegerValue (5120), ///> in bytes 1024x5 +// MakeUintegerAccessor (&RedQueue::m_minTh), +// MakeUintegerChecker ()) +// .AddAttribute ("m_maxTh", +// "Maximal marking m_prob, should be at least twice min to prevent synchronous retransmits", +// UintegerValue (15360), ///> in bytes 1024x15 +// MakeUintegerAccessor (&RedQueue::m_maxTh), +// MakeUintegerChecker ()) +// .AddAttribute ("m_rate", +// "this m_rate is used for calculating the average queue size after some idle time.", +// UintegerValue (1500000), ///> in bps, should be set to bandwidth of interface +// MakeUintegerAccessor (&RedQueue::m_rate), +// MakeUintegerChecker ()) +// .AddAttribute ("m_prob", +// "Probability for marking, suggested values are 0.01 and 0.02", +// DoubleValue (0.02), +// MakeDoubleAccessor (&RedQueue::m_prob), +// MakeDoubleChecker ()) +std::string qMode = "Bytes"; +std::string qBurst = "6"; +std::string qAvPkt = "1024"; +std::string qLimit = "25600"; //"100000"; +std::string qthMin = "5120"; // 1024 x 5 bytes +std::string qthMax = "15360"; // 1024 x 15 bytes +std::string qIdleRate = "1500000"; //1.5 Mbps +std::string qProb = "0.02"; + +namespace ns3 { + +MyPointToPointHelper::MyPointToPointHelper () +{ + m_queueFactory.SetTypeId ("ns3::DropTailQueue"); + m_queueFactory_red.SetTypeId ("ns3::RedQueue"); +// m_queueFactory_red.Set ("Mode", StringValue (qMode)); +// m_queueFactory_red.Set ("MaxBytes",StringValue (qLimit)); +// m_queueFactory_red.Set ("m_burst", StringValue (qBurst)); +// m_queueFactory_red.Set ("m_avPkt", StringValue (qAvPkt)); +// m_queueFactory_red.Set ("m_minTh", StringValue (qthMin)); +// m_queueFactory_red.Set ("m_maxTh", StringValue (qthMax)); +// m_queueFactory_red.Set ("m_rate", StringValue (qIdleRate)); +// m_queueFactory_red.Set ("m_prob", StringValue (qProb)); + m_deviceFactory.SetTypeId ("ns3::PointToPointNetDevice"); + m_channelFactory.SetTypeId ("ns3::PointToPointChannel"); + m_remoteChannelFactory.SetTypeId ("ns3::PointToPointRemoteChannel"); +} + +void +MyPointToPointHelper::SetQueue (std::string type, + std::string n1, const AttributeValue &v1, + std::string n2, const AttributeValue &v2, + std::string n3, const AttributeValue &v3, + std::string n4, const AttributeValue &v4, + std::string n5, const AttributeValue &v5, + std::string n6, const AttributeValue &v6, + std::string n7, const AttributeValue &v7, + std::string n8, const AttributeValue &v8) +{ + m_queueFactory.SetTypeId (type); + m_queueFactory.Set (n1, v1); + m_queueFactory.Set (n2, v2); + m_queueFactory.Set (n3, v3); + m_queueFactory.Set (n4, v4); + m_queueFactory.Set (n5, v5); + m_queueFactory.Set (n6, v6); + m_queueFactory.Set (n7, v7); + m_queueFactory.Set (n8, v8); +} + +void +MyPointToPointHelper::SetDeviceAttribute (std::string n1, const AttributeValue &v1) +{ + m_deviceFactory.Set (n1, v1); +} + +void +MyPointToPointHelper::SetChannelAttribute (std::string n1, const AttributeValue &v1) +{ + m_channelFactory.Set (n1, v1); + m_remoteChannelFactory.Set (n1, v1); +} + +void +MyPointToPointHelper::EnablePcapInternal (std::string prefix, Ptr nd, bool promiscuous, bool explicitFilename) +{ + // + // All of the Pcap enable functions vector through here including the ones + // that are wandering through all of devices on perhaps all of the nodes in + // the system. We can only deal with devices of type PointToPointNetDevice. + // + Ptr device = nd->GetObject (); + if (device == 0) + { + NS_LOG_INFO ("MyPointToPointHelper::EnablePcapInternal(): Device " << device << " not of type ns3::PointToPointNetDevice"); + return; + } + + PcapHelper pcapHelper; + + std::string filename; + if (explicitFilename) + { + filename = prefix; + } + else + { + filename = pcapHelper.GetFilenameFromDevice (prefix, device); + } + + Ptr file = pcapHelper.CreateFile (filename, std::ios::out, + PcapHelper::DLT_PPP); + pcapHelper.HookDefaultSink (device, "PromiscSniffer", file); +} + +void +MyPointToPointHelper::EnableAsciiInternal ( + Ptr stream, + std::string prefix, + Ptr nd, + bool explicitFilename) +{ + // + // All of the ascii enable functions vector through here including the ones + // that are wandering through all of devices on perhaps all of the nodes in + // the system. We can only deal with devices of type PointToPointNetDevice. + // + Ptr device = nd->GetObject (); + if (device == 0) + { + NS_LOG_INFO ("MyPointToPointHelper::EnableAsciiInternal(): Device " << device << + " not of type ns3::PointToPointNetDevice"); + return; + } + + // + // Our default trace sinks are going to use packet printing, so we have to + // make sure that is turned on. + // + Packet::EnablePrinting (); + + // + // If we are not provided an OutputStreamWrapper, we are expected to create + // one using the usual trace filename conventions and do a Hook*WithoutContext + // since there will be one file per context and therefore the context would + // be redundant. + // + if (stream == 0) + { + // + // Set up an output stream object to deal with private ofstream copy + // constructor and lifetime issues. Let the helper decide the actual + // name of the file given the prefix. + // + AsciiTraceHelper asciiTraceHelper; + + std::string filename; + if (explicitFilename) + { + filename = prefix; + } + else + { + filename = asciiTraceHelper.GetFilenameFromDevice (prefix, device); + } + + Ptr theStream = asciiTraceHelper.CreateFileStream (filename); + + // + // The MacRx trace source provides our "r" event. + // + asciiTraceHelper.HookDefaultReceiveSinkWithoutContext (device, "MacRx", theStream); + + // + // The "+", '-', and 'd' events are driven by trace sources actually in the + // transmit queue. + // + Ptr queue = device->GetQueue (); + asciiTraceHelper.HookDefaultEnqueueSinkWithoutContext (queue, "Enqueue", theStream); + asciiTraceHelper.HookDefaultDropSinkWithoutContext (queue, "Drop", theStream); + asciiTraceHelper.HookDefaultDequeueSinkWithoutContext (queue, "Dequeue", theStream); + + // PhyRxDrop trace source for "d" event + asciiTraceHelper.HookDefaultDropSinkWithoutContext (device, "PhyRxDrop", theStream); + + return; + } + + // + // If we are provided an OutputStreamWrapper, we are expected to use it, and + // to providd a context. We are free to come up with our own context if we + // want, and use the AsciiTraceHelper Hook*WithContext functions, but for + // compatibility and simplicity, we just use Config::Connect and let it deal + // with the context. + // + // Note that we are going to use the default trace sinks provided by the + // ascii trace helper. There is actually no AsciiTraceHelper in sight here, + // but the default trace sinks are actually publicly available static + // functions that are always there waiting for just such a case. + // + uint32_t nodeid = nd->GetNode ()->GetId (); + uint32_t deviceid = nd->GetIfIndex (); + std::ostringstream oss; + + oss << "/NodeList/" << nd->GetNode ()->GetId () << "/DeviceList/" << deviceid << "/$ns3::PointToPointNetDevice/MacRx"; + Config::Connect (oss.str (), MakeBoundCallback (&AsciiTraceHelper::DefaultReceiveSinkWithContext, stream)); + + oss.str (""); + oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::PointToPointNetDevice/TxQueue/Enqueue"; + Config::Connect (oss.str (), MakeBoundCallback (&AsciiTraceHelper::DefaultEnqueueSinkWithContext, stream)); + + oss.str (""); + oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::PointToPointNetDevice/TxQueue/Dequeue"; + Config::Connect (oss.str (), MakeBoundCallback (&AsciiTraceHelper::DefaultDequeueSinkWithContext, stream)); + + oss.str (""); + oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::PointToPointNetDevice/TxQueue/Drop"; + Config::Connect (oss.str (), MakeBoundCallback (&AsciiTraceHelper::DefaultDropSinkWithContext, stream)); + + oss.str (""); + oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::PointToPointNetDevice/PhyRxDrop"; + Config::Connect (oss.str (), MakeBoundCallback (&AsciiTraceHelper::DefaultDropSinkWithContext, stream)); +} + +NetDeviceContainer +MyPointToPointHelper::Install (NodeContainer c) +{ + NS_ASSERT (c.GetN () == 2); + return Install (c.Get (0), c.Get (1)); +} + +NetDeviceContainer +MyPointToPointHelper::Install (Ptr a, e_ns3_network_element_type_t type_a, Ptr b, e_ns3_network_element_type_t type_b) +{ + NetDeviceContainer container; + Ptr queueA; + Ptr queueB; + + Ptr devA = m_deviceFactory.Create (); + devA->SetAddress (Mac48Address::Allocate ()); + a->AddDevice (devA); + + if(type_a == NS3_NETWORK_ELEMENT_ROUTER){ + queueA = m_queueFactory_red.Create (); + } + else + queueA = m_queueFactory.Create (); + devA->SetQueue (queueA); + + Ptr devB = m_deviceFactory.Create (); + devB->SetAddress (Mac48Address::Allocate ()); + b->AddDevice (devB); + + if(type_b == NS3_NETWORK_ELEMENT_ROUTER){ + queueB = m_queueFactory_red.Create (); + } + else + queueB = m_queueFactory.Create (); + devB->SetQueue (queueB); + + // If MPI is enabled, we need to see if both nodes have the same system id + // (rank), and the rank is the same as this instance. If both are true, + //use a normal p2p channel, otherwise use a remote channel + bool useNormalChannel = true; + Ptr channel = 0; + if (MpiInterface::IsEnabled ()) + { + uint32_t n1SystemId = a->GetSystemId (); + uint32_t n2SystemId = b->GetSystemId (); + uint32_t currSystemId = MpiInterface::GetSystemId (); + if (n1SystemId != currSystemId || n2SystemId != currSystemId) + { + useNormalChannel = false; + } + } + if (useNormalChannel) + { + channel = m_channelFactory.Create (); + } + else + { + channel = m_remoteChannelFactory.Create (); + Ptr mpiRecA = CreateObject (); + Ptr mpiRecB = CreateObject (); + mpiRecA->SetReceiveCallback (MakeCallback (&PointToPointNetDevice::Receive, devA)); + mpiRecB->SetReceiveCallback (MakeCallback (&PointToPointNetDevice::Receive, devB)); + devA->AggregateObject (mpiRecA); + devB->AggregateObject (mpiRecB); + } + + devA->Attach (channel); + devB->Attach (channel); + container.Add (devA); + container.Add (devB); + + return container; +} + +NetDeviceContainer +MyPointToPointHelper::Install (Ptr a, Ptr b) +{ + NetDeviceContainer container; + + Ptr devA = m_deviceFactory.Create (); + devA->SetAddress (Mac48Address::Allocate ()); + a->AddDevice (devA); + Ptr queueA = m_queueFactory.Create (); + devA->SetQueue (queueA); + Ptr devB = m_deviceFactory.Create (); + devB->SetAddress (Mac48Address::Allocate ()); + b->AddDevice (devB); + Ptr queueB = m_queueFactory.Create (); + devB->SetQueue (queueB); + // If MPI is enabled, we need to see if both nodes have the same system id + // (rank), and the rank is the same as this instance. If both are true, + //use a normal p2p channel, otherwise use a remote channel + bool useNormalChannel = true; + Ptr channel = 0; + if (MpiInterface::IsEnabled ()) + { + uint32_t n1SystemId = a->GetSystemId (); + uint32_t n2SystemId = b->GetSystemId (); + uint32_t currSystemId = MpiInterface::GetSystemId (); + if (n1SystemId != currSystemId || n2SystemId != currSystemId) + { + useNormalChannel = false; + } + } + if (useNormalChannel) + { + channel = m_channelFactory.Create (); + } + else + { + channel = m_remoteChannelFactory.Create (); + Ptr mpiRecA = CreateObject (); + Ptr mpiRecB = CreateObject (); + mpiRecA->SetReceiveCallback (MakeCallback (&PointToPointNetDevice::Receive, devA)); + mpiRecB->SetReceiveCallback (MakeCallback (&PointToPointNetDevice::Receive, devB)); + devA->AggregateObject (mpiRecA); + devB->AggregateObject (mpiRecB); + } + + devA->Attach (channel); + devB->Attach (channel); + container.Add (devA); + container.Add (devB); + + return container; +} + +NetDeviceContainer +MyPointToPointHelper::Install (Ptr a, std::string bName) +{ + Ptr b = Names::Find (bName); + return Install (a, b); +} + +NetDeviceContainer +MyPointToPointHelper::Install (std::string aName, Ptr b) +{ + Ptr a = Names::Find (aName); + return Install (a, b); +} + +NetDeviceContainer +MyPointToPointHelper::Install (std::string aName, std::string bName) +{ + Ptr a = Names::Find (aName); + Ptr b = Names::Find (bName); + return Install (a, b); +} + +} // namespace ns3 diff --git a/src/surf/ns3/my-point-to-point-helper.h b/src/surf/ns3/my-point-to-point-helper.h new file mode 100644 index 0000000000..7edd931dad --- /dev/null +++ b/src/surf/ns3/my-point-to-point-helper.h @@ -0,0 +1,205 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2008 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mathieu Lacage + */ +#ifndef POINT_TO_POINT_HELPER_H +#define POINT_TO_POINT_HELPER_H + +#include + +#include "ns3/object-factory.h" +#include "ns3/net-device-container.h" +#include "ns3/node-container.h" +#include "ns3/deprecated.h" + +#include "ns3/trace-helper.h" + +#include "ns3_interface.h" + +namespace ns3 { + +class Queue; +class NetDevice; +class Node; + +/** + * \brief Build a set of PointToPointNetDevice objects + * + * Normally we eschew multiple inheritance, however, the classes + * PcapUserHelperForDevice and AsciiTraceUserHelperForDevice are + * "mixins". + */ +class MyPointToPointHelper : public PcapHelperForDevice, public AsciiTraceHelperForDevice +{ +public: + /** + * Create a MyPointToPointHelper to make life easier when creating point to + * point networks. + */ + MyPointToPointHelper (); + virtual ~MyPointToPointHelper () {} + + /** + * Each point to point net device must have a queue to pass packets through. + * This method allows one to set the type of the queue that is automatically + * created when the device is created and attached to a node. + * + * \param type the type of queue + * \param n1 the name of the attribute to set on the queue + * \param v1 the value of the attribute to set on the queue + * \param n2 the name of the attribute to set on the queue + * \param v2 the value of the attribute to set on the queue + * \param n3 the name of the attribute to set on the queue + * \param v3 the value of the attribute to set on the queue + * \param n4 the name of the attribute to set on the queue + * \param v4 the value of the attribute to set on the queue + * + * Set the type of queue to create and associated to each + * PointToPointNetDevice created through MyPointToPointHelper::Install. + */ + void SetQueue (std::string type, + std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (), + std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (), + std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (), + std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (), + std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (), + std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (), + std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue (), + std::string n8 = "", const AttributeValue &v8 = EmptyAttributeValue ()); + + /** + * Set an attribute value to be propagated to each NetDevice created by the + * helper. + * + * \param name the name of the attribute to set + * \param value the value of the attribute to set + * + * Set these attributes on each ns3::PointToPointNetDevice created + * by MyPointToPointHelper::Install + */ + void SetDeviceAttribute (std::string name, const AttributeValue &value); + + /** + * Set an attribute value to be propagated to each Channel created by the + * helper. + * + * \param name the name of the attribute to set + * \param value the value of the attribute to set + * + * Set these attribute on each ns3::PointToPointChannel created + * by MyPointToPointHelper::Install + */ + void SetChannelAttribute (std::string name, const AttributeValue &value); + + /** + * \param c a set of nodes + * + * This method creates a ns3::PointToPointChannel with the + * attributes configured by MyPointToPointHelper::SetChannelAttribute, + * then, for each node in the input container, we create a + * ns3::PointToPointNetDevice with the requested attributes, + * a queue for this ns3::NetDevice, and associate the resulting + * ns3::NetDevice with the ns3::Node and ns3::PointToPointChannel. + */ + NetDeviceContainer Install (NodeContainer c); + + /** + * \param a first node + * \param b second node + * + * Saves you from having to construct a temporary NodeContainer. + * Also, if MPI is enabled, for distributed simulations, + * appropriate remote point-to-point channels are created. + */ + NetDeviceContainer Install (Ptr a, Ptr b); + + /** + * \param a first node + * \param b second node + * + * Saves you from having to construct a temporary NodeContainer. + * Also, if MPI is enabled, for distributed simulations, + * appropriate remote point-to-point channels are created. + */ + NetDeviceContainer Install (Ptr a, e_ns3_network_element_type_t type_a, Ptr b, e_ns3_network_element_type_t type_b); + + /** + * \param a first node + * \param bName name of second node + * + * Saves you from having to construct a temporary NodeContainer. + */ + NetDeviceContainer Install (Ptr a, std::string bName); + + /** + * \param aName Name of first node + * \param b second node + * + * Saves you from having to construct a temporary NodeContainer. + */ + NetDeviceContainer Install (std::string aName, Ptr b); + + /** + * \param aNode Name of first node + * \param bNode Name of second node + * + * Saves you from having to construct a temporary NodeContainer. + */ + NetDeviceContainer Install (std::string aNode, std::string bNode); + +private: + /** + * \brief Enable pcap output the indicated net device. + * + * NetDevice-specific implementation mechanism for hooking the trace and + * writing to the trace file. + * + * \param prefix Filename prefix to use for pcap files. + * \param nd Net device for which you want to enable tracing. + * \param promiscuous If true capture all possible packets available at the device. + * \param explicitFilename Treat the prefix as an explicit filename if true + */ + virtual void EnablePcapInternal (std::string prefix, Ptr nd, bool promiscuous, bool explicitFilename); + + /** + * \brief Enable ascii trace output on the indicated net device. + * \internal + * + * NetDevice-specific implementation mechanism for hooking the trace and + * writing to the trace file. + * + * \param stream The output stream object to use when logging ascii traces. + * \param prefix Filename prefix to use for ascii trace files. + * \param nd Net device for which you want to enable tracing. + */ + virtual void EnableAsciiInternal ( + Ptr stream, + std::string prefix, + Ptr nd, + bool explicitFilename); + + ObjectFactory m_queueFactory; + ObjectFactory m_queueFactory_red; + ObjectFactory m_channelFactory; + ObjectFactory m_remoteChannelFactory; + ObjectFactory m_deviceFactory; +}; + +} // namespace ns3 + +#endif /* POINT_TO_POINT_HELPER_H */ diff --git a/src/surf/ns3/ns3_interface.cc b/src/surf/ns3/ns3_interface.cc new file mode 100644 index 0000000000..21eb92ad15 --- /dev/null +++ b/src/surf/ns3/ns3_interface.cc @@ -0,0 +1,282 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "ns3_interface.h" +#include "ns3_simulator.h" +#include "xbt/lib.h" +#include "xbt/log.h" +#include "xbt/dynar.h" + + +using namespace ns3; + +extern xbt_lib_t host_lib; +extern int NS3_HOST_LEVEL; //host node for ns3 +extern xbt_dynar_t IPV4addr; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(interface_ns3, surf, + "Logging specific to the SURF network NS3 module"); + +InternetStackHelper stack; +NodeContainer nodes; +NodeContainer Cluster_nodes; +Ipv4InterfaceContainer interfaces; + +int number_of_nodes = 0; +int number_of_clusters_nodes = 0; +int number_of_links = 1; +int number_of_networks = 1; +int port_number = 1025; //Port number is limited from 1025 to 65 000 + +static NS3Sim* ns3_sim = 0; + +void ns3_simulator(double min){ + ns3_sim->simulator_start(min); +} + +void* ns3_get_socket_action(void *socket){ + return ns3_sim->get_action_from_socket(socket); +} + +double ns3_get_socket_remains(void *socket){ + return ns3_sim->get_remains_from_socket(socket); +} + +double ns3_get_socket_sent(void *socket){ + return ns3_sim->get_sent_from_socket(socket); +} + +char ns3_get_socket_is_finished(void *socket){ + return ns3_sim->get_finished(socket); +} + +double ns3_time(){ + return Simulator::Now().GetSeconds(); +} + +int ns3_create_flow(const char* a,const char *b,double start,u_int32_t TotalBytes,void * action) +{ + ns3_nodes_t node1 = (ns3_nodes_t) xbt_lib_get_or_null(host_lib,a,NS3_HOST_LEVEL); + ns3_nodes_t node2 = (ns3_nodes_t) xbt_lib_get_or_null(host_lib,b,NS3_HOST_LEVEL); + + Ptr src_node = nodes.Get(node1->node_num); + Ptr dst_node = nodes.Get(node2->node_num); + + char* addr = (char*)xbt_dynar_get_as(IPV4addr,node2->node_num,char*); + + XBT_DEBUG("ns3_create_flow %d Bytes from %d to %d with Interface %s",TotalBytes, node1->node_num, node2->node_num,addr); + ns3_sim->create_flow_NS3(src_node, + dst_node, + port_number, + start, + addr, + TotalBytes, + action); + + port_number++; + if(port_number >= 65001 ) xbt_die("Too many connections! Port number is saturated."); + return 0; +} + +// clean up +int ns3_finalize(void){ + if (!ns3_sim) return -1; + delete ns3_sim; + ns3_sim = 0; + return 0; +} + +// initialize the NS3 interface and environment +int ns3_initialize(const char* TcpProtocol){ + xbt_assert(!ns3_sim, "ns3 already initialized"); + ns3_sim = new NS3Sim(); + +// tcpModel are: +// "ns3::TcpNewReno" +// "ns3::TcpReno" +// "ns3::TcpTahoe" + + Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1024)); // 1024-byte packet for easier reading + Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1)); + + if(!strcmp(TcpProtocol,"default")){ + return 0; + } + if(!strcmp(TcpProtocol,"Reno")){ + XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol); + Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpReno")); + return 0; + } + if(!strcmp(TcpProtocol,"NewReno")){ + XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol); + Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpNewReno")); + return 0; + } + if(!strcmp(TcpProtocol,"Tahoe")){ + XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol); + Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpTahoe")); + return 0; + } + + XBT_ERROR("The ns3/TcpModel must be : NewReno or Reno or Tahoe"); +} + +void * ns3_add_host(char * id) +{ + ns3_nodes_t host = xbt_new0(s_ns3_nodes_t,1); + XBT_DEBUG("Interface ns3 add host[%d] '%s'",number_of_nodes,id); + Ptr node = CreateObject (0); + stack.Install(node); + nodes.Add(node); + host->node_num = number_of_nodes; + host->type = NS3_NETWORK_ELEMENT_HOST; + host->data = GetPointer(node); + number_of_nodes++; + return host; +} + +void * ns3_add_host_cluster(char * id) +{ + ns3_nodes_t host = xbt_new0(s_ns3_nodes_t,1); + XBT_DEBUG("Interface ns3 add host[%d] '%s'",number_of_nodes,id); + Ptr node = CreateObject (0); + stack.Install(node); + Cluster_nodes.Add(node); + nodes.Add(node); + host->node_num = number_of_nodes; + host->type = NS3_NETWORK_ELEMENT_HOST; + host->data = node; + number_of_nodes++; + return host; +} + +void * ns3_add_router(char * id) +{ + ns3_nodes_t router = xbt_new0(s_ns3_nodes_t,1); + XBT_DEBUG("Interface ns3 add router[%d] '%s'",number_of_nodes,id); + Ptr node = CreateObject (0); + stack.Install(node); + nodes.Add(node); + router->node_num = number_of_nodes; + router->type = NS3_NETWORK_ELEMENT_ROUTER; + router->data = node; + number_of_nodes++; + return router; +} + +void * ns3_add_cluster(char * bw,char * lat,char *id) +{ + + XBT_DEBUG("cluster_id: %s",id); + XBT_DEBUG("bw: %s lat: %s",bw,lat); + XBT_DEBUG("Number of %s nodes: %d",id,Cluster_nodes.GetN() - number_of_clusters_nodes); + + NodeContainer Nodes; + int i; + + for(i = number_of_clusters_nodes; i < Cluster_nodes.GetN() ; i++){ + Nodes.Add(Cluster_nodes.Get(i)); + XBT_DEBUG("Add node %d to cluster",i); + } + number_of_clusters_nodes = Cluster_nodes.GetN(); + + XBT_DEBUG("Add router %d to cluster",nodes.GetN()-Nodes.GetN()-1); + Nodes.Add(nodes.Get(nodes.GetN()-Nodes.GetN()-1)); + + if(Nodes.GetN() > 65000) + xbt_die("Cluster with NS3 is limited to 65000 nodes"); + CsmaHelper csma; + csma.SetChannelAttribute ("DataRate", StringValue (bw)); + csma.SetChannelAttribute ("Delay", StringValue (lat)); + NetDeviceContainer devices = csma.Install (Nodes); + XBT_DEBUG("Create CSMA"); + + char * adr = bprintf("%d.%d.0.0",number_of_networks,number_of_links); + XBT_DEBUG("Assign IP Addresses %s to CSMA.",adr); + Ipv4AddressHelper ipv4; + ipv4.SetBase (adr, "255.255.0.0"); + free(adr); + interfaces.Add(ipv4.Assign (devices)); + + if(number_of_links == 255){ + if(number_of_networks == 255) + xbt_die("Number of links and networks exceed 255*255"); + number_of_links = 1; + number_of_networks++; + }else{ + number_of_links++; + } + XBT_DEBUG("Number of nodes in Cluster_nodes: %d",Cluster_nodes.GetN()); +} + +void * ns3_add_AS(char * id) +{ + XBT_DEBUG("Interface ns3 add AS '%s'",id); + return NULL; +} + +static char* transformIpv4Address (Ipv4Address from){ + std::stringstream sstream; + sstream << from ; + std::string s = sstream.str(); + return bprintf("%s",s.c_str()); +} + +void * ns3_add_link(int src, e_ns3_network_element_type_t type_src, + int dst, e_ns3_network_element_type_t type_dst, + char * bw,char * lat) +{ + if(number_of_links == 1 ) { + LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); + LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO); + } + + + MyPointToPointHelper pointToPoint; + + NetDeviceContainer netA; + Ipv4AddressHelper address; + + Ptr a = nodes.Get(src); + Ptr b = nodes.Get(dst); + + XBT_DEBUG("\tAdd PTP from %d to %d bw:'%s' lat:'%s'",src,dst,bw,lat); + pointToPoint.SetDeviceAttribute ("DataRate", StringValue (bw)); + pointToPoint.SetChannelAttribute ("Delay", StringValue (lat)); + //pointToPoint.EnablePcapAll("test_ns3_trace"); //DEBUG + + netA.Add(pointToPoint.Install (a, type_src, b, type_dst)); + + char * adr = bprintf("%d.%d.0.0",number_of_networks,number_of_links); + address.SetBase (adr, "255.255.0.0"); + XBT_DEBUG("\tInterface stack '%s'",adr); + free(adr); + interfaces.Add(address.Assign (netA)); + + char *tmp = transformIpv4Address(interfaces.GetAddress(interfaces.GetN()-2)); + xbt_dynar_set_as(IPV4addr,src,char*,tmp); + XBT_DEBUG("Have write '%s' for Node '%d'",(char*)xbt_dynar_get_as(IPV4addr,src,char*),src); + + tmp = transformIpv4Address(interfaces.GetAddress(interfaces.GetN()-1)); + xbt_dynar_set_as(IPV4addr,dst,char*,tmp); + XBT_DEBUG("Have write '%s' for Node '%d'",(char*)xbt_dynar_get_as(IPV4addr,dst,char*),dst); + + if(number_of_links == 255){ + if(number_of_networks == 255) + xbt_die("Number of links and networks exceed 255*255"); + number_of_links = 1; + number_of_networks++; + }else{ + number_of_links++; + } +} + +void * ns3_end_platform(void) +{ + XBT_DEBUG("InitializeRoutes"); + GlobalRouteManager::BuildGlobalRoutingDatabase(); + GlobalRouteManager::InitializeRoutes(); +} diff --git a/src/surf/ns3/ns3_interface.h b/src/surf/ns3/ns3_interface.h new file mode 100644 index 0000000000..15f847db8f --- /dev/null +++ b/src/surf/ns3/ns3_interface.h @@ -0,0 +1,54 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef _NS3_INTERFACE_H +#define _NS3_INTERFACE_H + +#include "xbt/log.h" +#include "xbt/dynar.h" +#include "xbt/misc.h" +#include "xbt/sysdep.h" + +typedef enum { + NS3_NETWORK_ELEMENT_NULL = 0, /* NULL */ + NS3_NETWORK_ELEMENT_HOST, /* host type */ + NS3_NETWORK_ELEMENT_ROUTER, /* router type */ + NS3_NETWORK_ELEMENT_AS, /* AS type */ +} e_ns3_network_element_type_t; + +typedef struct ns3_nodes{ + int node_num; + e_ns3_network_element_type_t type; + void * data; +}s_ns3_nodes_t, *ns3_nodes_t; + +#ifdef __cplusplus +extern "C" { +#endif + +XBT_PUBLIC(int) ns3_finalize(void); +XBT_PUBLIC(int) ns3_initialize(const char* TcpProtocol); +XBT_PUBLIC(int) ns3_create_flow(const char* a,const char *b,double start,u_int32_t TotalBytes,void * action); +XBT_PUBLIC(void) ns3_simulator(double min); +XBT_PUBLIC(double) ns3_time(void); +XBT_PUBLIC(void*) ns3_get_socket_action(void *socket); +XBT_PUBLIC(double) ns3_get_socket_remains(void *socket); +XBT_PUBLIC(double) ns3_get_socket_sent(void *socket); +XBT_PUBLIC(char) ns3_get_socket_is_finished(void *socket); +XBT_PUBLIC(void *) ns3_add_host(char * id); +XBT_PUBLIC(void *) ns3_add_host_cluster(char * id); +XBT_PUBLIC(void *) ns3_add_router(char * id); +XBT_PUBLIC(void *) ns3_add_AS(char * id); +XBT_PUBLIC(void *) ns3_add_link(int src, e_ns3_network_element_type_t type_src, + int dst, e_ns3_network_element_type_t type_dst, + char * bw,char * lat); +XBT_PUBLIC(void *) ns3_end_platform(void); +XBT_PUBLIC(void *) ns3_add_cluster(char * bw,char * lat,char *id); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/surf/ns3/ns3_simulator.cc b/src/surf/ns3/ns3_simulator.cc new file mode 100644 index 0000000000..8b8a00cc40 --- /dev/null +++ b/src/surf/ns3/ns3_simulator.cc @@ -0,0 +1,209 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "surf/ns3/ns3_simulator.h" +#include "xbt/dict.h" +#include "xbt/log.h" +#include "xbt/sysdep.h" + +using namespace ns3; +using namespace std; + +xbt_dict_t dict_socket = NULL; + +NS3Sim SimulatorNS3; +static char socket_key[24]; + +static void receive_callback(Ptr localSocket); +static void send_callback(Ptr localSocket, uint32_t txSpace); +static void datasent_callback(Ptr localSocket, uint32_t dataSent); +static void StartFlow(Ptr sock, + const char *to, + uint16_t port_number); + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simulator_ns3, surf, + "Logging specific to the SURF network NS3 module"); + +// Constructor. +NS3Sim::NS3Sim(){ +} +//Destructor. +NS3Sim::~NS3Sim(){ +} + +static XBT_INLINE void transformSocketPtr (Ptr localSocket){ + std::stringstream sstream; + sstream << localSocket ; + std::string s = sstream.str(); + sprintf(socket_key,"%s",s.c_str()); +} + +/* + * This function create a flow from src to dst + * + * Parameters + * src: node source + * dst: node destination + * port_number: The port number to use + * start: the time the communication start + * addr: ip address + * totalBytes: number of bytes to transmit + */ +void NS3Sim::create_flow_NS3( + Ptr src, + Ptr dst, + uint16_t port_number, + double start, + const char *addr, + uint32_t totalBytes, + void * action) +{ + if(!dict_socket) dict_socket = xbt_dict_new(); + + PacketSinkHelper sink ("ns3::TcpSocketFactory", + InetSocketAddress (Ipv4Address::GetAny(), + port_number)); + sink.Install (dst); + + Ptr sock = Socket::CreateSocket (src, + TcpSocketFactory::GetTypeId()); + + MySocket *mysocket = new MySocket(); + mysocket->totalBytes = totalBytes; + mysocket->remaining = totalBytes; + mysocket->bufferedBytes = 0; + mysocket->sentBytes = 0; + mysocket->finished = 0; + mysocket->action = action; + + transformSocketPtr(sock); + xbt_dict_set(dict_socket,socket_key, mysocket,free); + + sock->Bind(InetSocketAddress(port_number)); + XBT_DEBUG("Create flow starting to %fs + %fs = %fs",start-ns3_time(), ns3_time(), start); + + Simulator::Schedule (Seconds(start-ns3_time()),&StartFlow, sock, addr, port_number); +// Simulator::Schedule (Seconds(0.0),&StartFlow, sock, addr, port_number); + +} + +void* NS3Sim::get_action_from_socket(void *socket){ + return ((MySocket *)socket)->action; +} + +char NS3Sim::get_finished(void *socket){ + return ((MySocket *)socket)->finished; +} + +double NS3Sim::get_remains_from_socket(void *socket){ + return ((MySocket *)socket)->remaining; +} + +double NS3Sim::get_sent_from_socket(void *socket){ + return ((MySocket *)socket)->sentBytes; +} + +void NS3Sim::simulator_start(double min){ + if(min > 0.0) + Simulator::Stop(Seconds(min)); + XBT_DEBUG("Start simulator"); + Simulator::Run (); +} + +static MySocket* get_my_socket(Ptr localSocket) { + transformSocketPtr(localSocket); + return (MySocket*)xbt_dict_get_or_null(dict_socket,socket_key); +} + +static void receive_callback(Ptr localSocket){ + MySocket* mysocket = get_my_socket(localSocket); + + if (mysocket->finished == 0){ + mysocket->finished = 1; + XBT_DEBUG("recv_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); + XBT_DEBUG("Stop simulator at %f seconds", Simulator::Now().GetSeconds()); + Simulator::Stop(Seconds(0.0)); + Simulator::Run(); + } +} + +static void send_callback(Ptr localSocket, uint32_t txSpace){ + MySocket* mysocket = get_my_socket(localSocket); + + if (mysocket->remaining == 0){ + //all data was already buffered (and socket was already closed), just return + return; + } + + uint8_t *data = (uint8_t*)malloc(sizeof(uint8_t)*txSpace); + + while (mysocket->bufferedBytes < mysocket->totalBytes + && localSocket->GetTxAvailable () > 0) + { + uint32_t toWrite = min ((mysocket->remaining), txSpace); + toWrite = min (toWrite, localSocket->GetTxAvailable ()); + int amountSent = localSocket->Send (data, toWrite, 0); + + if(amountSent < 0) + return; + (mysocket->bufferedBytes) += amountSent; + (mysocket->remaining) -= amountSent; + XBT_DEBUG("send_cb of F[%p, %p, %d] (%d/%d) %d buffered", mysocket, mysocket->action, mysocket->totalBytes, mysocket->remaining, mysocket->totalBytes, amountSent); + + } + + free(data); + + if ((mysocket->bufferedBytes) >= mysocket->totalBytes){ + localSocket->Close(); + } +} + +static void datasent_callback(Ptr localSocket, uint32_t dataSent){ + MySocket* mysocket = get_my_socket(localSocket); + mysocket->sentBytes += dataSent; + XBT_DEBUG("datasent_cb of F[%p, %p, %d] %d sent", mysocket, mysocket->action, mysocket->totalBytes, dataSent); +} + +static void normalClose_callback(Ptr localSocket){ + MySocket* mysocket = get_my_socket(localSocket); + XBT_DEBUG("normalClose_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); + receive_callback (localSocket); +} + +static void errorClose_callback(Ptr localSocket){ + MySocket* mysocket = get_my_socket(localSocket); + XBT_DEBUG("errorClose_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); + xbt_die("NS3: a socket was closed anormally"); +} + +static void succeededConnect_callback(Ptr localSocket){ + MySocket* mysocket = get_my_socket(localSocket); + XBT_DEBUG("succeededConnect_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); +} + +static void failedConnect_callback(Ptr localSocket){ + MySocket* mysocket = get_my_socket(localSocket); + XBT_DEBUG("failedConnect_cb of F[%p, %p, %d]", mysocket, mysocket->action, mysocket->totalBytes); + xbt_die("NS3: a socket failed to connect"); +} + +static void StartFlow(Ptr sock, + const char *to, + uint16_t port_number) +{ + InetSocketAddress serverAddr (to, port_number); + + sock->Connect(serverAddr); + sock->SetSendCallback (MakeCallback (&send_callback)); + sock->SetRecvCallback (MakeCallback (&receive_callback)); + sock->SetDataSentCallback (MakeCallback (&datasent_callback)); + sock->SetConnectCallback (MakeCallback (&succeededConnect_callback), MakeCallback (&failedConnect_callback)); + sock->SetCloseCallbacks (MakeCallback (&normalClose_callback), MakeCallback (&errorClose_callback)); + + MySocket* mysocket = get_my_socket(sock); + XBT_DEBUG("startFlow_cb of F[%p, %p, %d] dest=%s port=%d", mysocket, mysocket->action, mysocket->totalBytes, to, port_number); +} diff --git a/src/surf/ns3/ns3_simulator.h b/src/surf/ns3/ns3_simulator.h new file mode 100644 index 0000000000..aab3a04981 --- /dev/null +++ b/src/surf/ns3/ns3_simulator.h @@ -0,0 +1,72 @@ +/* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef _NS3_SIM_H +#define _NS3_SIM_H + +#ifdef __cplusplus + +#include "ns3/core-module.h" +#include "my-point-to-point-helper.h" + +#ifdef _NS3_3_10 + /*NS3 3.10*/ + #include "ns3/helper-module.h" + #include "ns3/simulator-module.h" + #include "ns3/node-module.h" + #include "ns3/helper-module.h" + #include "ns3/global-routing-module.h" + #include "ns3/tcp-socket-factory.h" +#else + /*NS3 3.12*/ + #include "ns3/node.h" + #include "ns3/global-route-manager.h" + #include "ns3/csma-helper.h" + #include "ns3/internet-stack-helper.h" + #include "ns3/ipv4-address-helper.h" + #include "ns3/point-to-point-helper.h" + #include "ns3/packet-sink-helper.h" + #include "ns3/inet-socket-address.h" + #include "ns3/tcp-socket-factory.h" +#endif + +using namespace ns3; +using namespace std; + +struct MySocket{ + uint32_t bufferedBytes; + uint32_t sentBytes; + uint32_t remaining; + uint32_t totalBytes; + char finished; + void* action; +}; + +//Simulator s; +class NS3Sim { + +private: + +public: + NS3Sim(); + ~NS3Sim(); + void create_flow_NS3(Ptr src, + Ptr dst, + uint16_t port_number, + double start, + const char *addr, + uint32_t TotalBytes, + void * action); + void simulator_start(double min); + void* get_action_from_socket(void *socket); + double get_remains_from_socket(void *socket); + double get_sent_from_socket(void *socket); + char get_finished(void *socket); +}; + +#endif /* __cplusplus */ + +#endif diff --git a/src/surf/ns3/red-queue.cc b/src/surf/ns3/red-queue.cc new file mode 100644 index 0000000000..ca26c5e46a --- /dev/null +++ b/src/surf/ns3/red-queue.cc @@ -0,0 +1,769 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2010 Regents of the University of California + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Duy Nguyen + * + */ + +#include "ns3/log.h" +#include "ns3/enum.h" +#include "ns3/uinteger.h" +#include "ns3/double.h" +#include "red-queue.h" +#include "ns3/simulator.h" +#include "ns3/nstime.h" +#include "ns3/random-variable.h" + +#include + +NS_LOG_COMPONENT_DEFINE ("red"); + +#define RED_STATS_TABLE_SIZE 256 +#define RED_STATS_MASK (RED_STATS_TABLE_SIZE - 1) + +namespace ns3 { + +NS_OBJECT_ENSURE_REGISTERED (RedQueue); + +TypeId RedQueue::GetTypeId (void) +{ + ///< Note: these paramemters must be worked out beforehand for RED to work correctly + ///< How these parameters are set up can affect RED performance greatly + static TypeId tid = TypeId ("ns3::RedQueue") + .SetParent () + .AddConstructor () + .AddAttribute ("Mode", + "Whether to use Bytes (see MaxBytes) or Packets (see MaxPackets) as the maximum queue size metric.", + EnumValue (BYTES), ///> currently supports BYTES only + MakeEnumAccessor (&RedQueue::SetMode), + MakeEnumChecker (BYTES, "Bytes", + PACKETS, "Packets")) + .AddAttribute ("MaxPackets", + "The maximum number of packets accepted by this RedQueue.", + UintegerValue (100), + MakeUintegerAccessor (&RedQueue::m_maxPackets), + MakeUintegerChecker ()) + .AddAttribute ("MaxBytes", + "The maximum number of bytes accepted by this RedQueue.", + UintegerValue (100000), + MakeUintegerAccessor (&RedQueue::m_maxBytes), + MakeUintegerChecker ()) + .AddAttribute ("m_burst", + "maximum number of m_burst packets accepted by this queue", + UintegerValue (6), ///> bursts must be > minTh/avpkt + MakeUintegerAccessor (&RedQueue::m_burst), + MakeUintegerChecker ()) + .AddAttribute ("m_avPkt", + "In bytes, use with m_burst to determine the time constant for average queue size calculations", + UintegerValue (1024), ///> average packet size + MakeUintegerAccessor (&RedQueue::m_avPkt), + MakeUintegerChecker ()) + .AddAttribute ("m_minTh", + "Average queue size at which marking becomes a m_prob", + UintegerValue (5120), ///> in bytes 1024x5 + MakeUintegerAccessor (&RedQueue::m_minTh), + MakeUintegerChecker ()) + .AddAttribute ("m_maxTh", + "Maximal marking m_prob, should be at least twice min to prevent synchronous retransmits", + UintegerValue (15360), ///> in bytes 1024x15 + MakeUintegerAccessor (&RedQueue::m_maxTh), + MakeUintegerChecker ()) + .AddAttribute ("m_rate", + "this m_rate is used for calculating the average queue size after some idle time.", + UintegerValue (1500000), ///> in bps, should be set to bandwidth of interface + MakeUintegerAccessor (&RedQueue::m_rate), + MakeUintegerChecker ()) + .AddAttribute ("m_prob", + "Probability for marking, suggested values are 0.01 and 0.02", + DoubleValue (0.02), + MakeDoubleAccessor (&RedQueue::m_prob), + MakeDoubleChecker ()) + ; + + return tid; +} + +RedQueue::RedQueue () + : Queue (), + m_packets (), + m_bytesInQueue (0), + m_wLog (0), + m_pLog (0), + m_rmask (0), + m_scellLog (0), + m_scellMax (0), + m_count (-1), + m_randNum (0), + m_qavg (0), + m_initialized (false) +{ + + m_sTable = Uint32tVector (RED_STATS_TABLE_SIZE); + +} + +RedQueue::~RedQueue () +{ + NS_LOG_FUNCTION_NOARGS (); +} + +void +RedQueue::SetMode (enum Mode mode) +{ + NS_LOG_FUNCTION (mode); + m_mode = mode; +} + +RedQueue::Mode +RedQueue::GetMode (void) +{ + return m_mode; +} + +uint64_t +RedQueue::GetAverageQueueSize (void) +{ + return m_qavg; +} + + +/** + * The paper says: + * Given minimum threshold min_th and that we wish to allow bursts of L packets + * Then Wq should be chosen to satisfy avg_L < min_th + * L + 1 + [(1-Wq)^(L+1) - 1]/ Wq < min_th + * L + 1 - min_th < [1 - (1-Wq)^(L+1)]/Wq + * i.e. given min_th 5, L=50, necessary that Wq <= 0.0042 + * + * Hence + * burst + 1 - minTh/avPkt < (1-(1-W)^burst)/W + * this low-pass filter is used to calculate the avg queue size + * + */ +uint32_t +RedQueue::evalEwma (uint32_t minTh, uint32_t burst, uint32_t avpkt) +{ + NS_LOG_FUNCTION (this); + uint32_t wlog = 1; + + + ///< Just a random W + double W = 0.5; + + double temp = 0; + + ///< Note: bursts must be larger than minTh/avpkt for it to work + temp = (double)burst + 1 - (double)minTh / avpkt; + + NS_LOG_DEBUG ( "\t temp =" << temp); + + if (temp < 1.0) + { + NS_LOG_DEBUG ("\tFailed to calculate EWMA constant"); + return -1; + } + + /** + * wlog =1 , W = .5 + * wlog =2 , W = .25 + * wlog =3 , W = .125 + * wlog =4 , W = .0625 + * wlog =5 , W = .03125 + * wlog =6 , W = .015625 + * wlog =7 , W = .0078125 + * wlog =8 , W = .00390625 + * wlog =9 , W = .001953125 + * wlog =10, W = .0009765625 + */ + for (wlog = 1; wlog < 32; wlog++, W /= 2) + { + if (temp <= (1 - pow (1 - W, burst)) / W ) + { + NS_LOG_DEBUG ("\t wlog=" << wlog); + return wlog; + } + } + + NS_LOG_DEBUG ("\tFailed to calculate EWMA constant"); + return -1; +} + +/** + * + * Plog = log (prob / (maxTh -minTh) ); + * + * Paper says: When a packet arrives at the gateway and the average queue size + * is between min_th and max_th, the initial packet marking probability is: + * Pb = C1*avg - C2 + * where, + * C1 = maxP/(max_th - mint_th) + * C2 = maxP*min_th/(max_th - mint_th) + * maxP could be chosen so that C1 a power of two + */ +uint32_t +RedQueue::evalP (uint32_t minTh, uint32_t maxTh, double prob) +{ + NS_LOG_FUNCTION (this); + + uint32_t i = maxTh - minTh ; + + if (i <= 0) + { + NS_LOG_DEBUG ("maxTh - minTh = 0"); + return -1; + } + + prob /= i; + + ///< It returns the index that makes C1 a power of two + for (i = 0; i < 32; i++) + { + if (prob > 1.0) + { + break; + } + prob *= 2; + } + + ///< Error checking + if (i >= 32 ) + { + NS_LOG_DEBUG ("i >= 32, this shouldn't happen"); + return -1; + } + + NS_LOG_DEBUG ("\t i(makes C1 power of two)=" << i); + return i; +} + + +/** + * avg = avg*(1-W)^m where m = t/xmitTime + * + * m_sTable[ t/2^cellLog] = -log(1-W) * t/xmitTime + * m_sTable[ t >> cellLog]= -log(1-W) * t/xmitTime + * + * t is converted to t/2^cellLog for storage in the table + * find out what is cellLog and return it + * + */ +uint32_t +RedQueue::evalIdleDamping (uint32_t wLog, uint32_t avpkt, uint32_t bps) +{ + NS_LOG_FUNCTION (this); + + ///> in microsecond ticks: 1 sec = 1000000 microsecond ticks + double xmitTime = ((double) avpkt / bps) * 1000000; + + ///> -log(1 - 1/2^wLog) / xmitTime + ///> note W = 1/2^wLog + double wLogTemp = -log (1.0 - 1.0 / (1 << wLog)) / xmitTime; + + + ///> the maximum allow idle time + double maxTime = 31 / wLogTemp; + + NS_LOG_DEBUG ("\t xmitTime=" << xmitTime << " wLogTemp=" << wLogTemp + << " maxTime=" << maxTime); + + + uint32_t cLog, i; + + for (cLog = 0; cLog < 32; cLog++) + { + + ///> maxTime < 512* 2^cLog + ///> finds the cLog that's able to cover this maxTime + if (maxTime / (1 << cLog) < 512) + { + break; + } + + } + if (cLog >= 32) + { + return -1; + } + + m_sTable[0] = 0; + + for (i = 1; i < 255; i++) + { + ///> wLogTemp * i * 2^cLog + m_sTable[i] = (i << cLog) * wLogTemp; + + + if (m_sTable[i] > 31) + { + m_sTable[i] = 31; + } + } + + m_sTable[255] = 31; + + NS_LOG_DEBUG ("\t cLog=" << cLog); + return cLog; +} + + +///> red random mask +uint32_t +RedQueue::Rmask (uint32_t pLog) +{ + ///> ~OUL creates a 32 bit mask + ///> 2^Plog - 1 + return pLog < 32 ? ((1 << pLog) - 1) : ~0UL; + +} + + +void +RedQueue::SetParams (uint32_t minTh, uint32_t maxTh, + uint32_t wLog, uint32_t pLog, uint64_t scellLog) +{ + NS_LOG_FUNCTION (this); + + m_qavg = 0; + m_count = -1; + m_minTh = minTh; + m_maxTh = maxTh; + m_wLog = wLog; + m_pLog = pLog; + m_rmask = Rmask (pLog); + m_scellLog = scellLog; + m_scellMax = (255 << m_scellLog); + + NS_LOG_DEBUG ("\t m_wLog" << m_wLog << " m_pLog" << m_pLog << " m_scellLog" << m_scellLog + << " m_minTh" << m_minTh << " m_maxTh" << m_maxTh + << " rmask=" << m_rmask << " m_scellMax=" << m_scellMax); +} + +int +RedQueue::IsIdling () +{ + NS_LOG_FUNCTION_NOARGS (); + + //use IsZero instead + if ( m_idleStart.GetNanoSeconds () != 0) + { + NS_LOG_DEBUG ("\t IsIdling"); + } + + return m_idleStart.GetNanoSeconds () != 0; +} +void +RedQueue::StartIdlePeriod () +{ + NS_LOG_FUNCTION_NOARGS (); + + m_idleStart = Simulator::Now (); +} +void +RedQueue::EndIdlePeriod () +{ + NS_LOG_FUNCTION_NOARGS (); + + m_idleStart = NanoSeconds (0); +} +void +RedQueue::Restart () +{ + + NS_LOG_FUNCTION_NOARGS (); + + EndIdlePeriod (); + m_qavg = 0; + m_count = -1; + +} + +/** + * m = idletime / s + * + * m is the number of pkts that might have been transmitted by the gateway + * during the time that the queue was free + * s is a typical transmission for a packet + * + * m = idletime / (average pkt size / bandwidth) + * + * avg = avg *(1-W)^m + * + * We need to precompute a table for this calculation because of the exp power + * + */ +uint64_t +RedQueue::AvgFromIdleTime () +{ + NS_LOG_FUNCTION_NOARGS (); + + uint64_t idleTime; + int shift; + + idleTime = ns3::Time(Simulator::Now() - m_idleStart).GetMicroSeconds(); + //idleTime = RedTimeToInteger (Simulator::Now() - m_idleStart, Time::US); + + if (idleTime > m_scellMax) + { + idleTime = m_scellMax; + } + + NS_LOG_DEBUG ("\t idleTime=" << idleTime); + //PrintTable (); + + shift = m_sTable [(idleTime >> m_scellLog) & RED_STATS_MASK]; + + if (shift) + { + //std::cout << "shift " << m_qavg << "=>" << (m_qavg >> shift) << std::endl; + return m_qavg >> shift; + } + else + { + idleTime = (m_qavg * idleTime) >> m_scellLog; + + + NS_LOG_DEBUG ("\t idleus=" << idleTime); + + if (idleTime < (m_qavg / 2)) + { + //std::cout <<"idleus " << m_qavg << " - " << idleus << " = " << (m_qavg-idleus) << std::endl; + return m_qavg - idleTime; + } + else + { + //std:: cout <<"half " << m_qavg << "=>" << (m_qavg/2) << std::endl; + return (m_qavg / 2) ; + } + } +} + +uint64_t +RedQueue::AvgFromNonIdleTime (uint32_t backlog) +{ + NS_LOG_FUNCTION (this << backlog); + + NS_LOG_DEBUG ("qavg " << m_qavg); + NS_LOG_DEBUG ("backlog" << backlog); + + /** + * This is basically EWMA + * m_qavg = q_avg*(1-W) + backlog*W + * m_qavg = q_avg + W(backlog - q_avg) + * + */ + return m_qavg + (backlog - (m_qavg >> m_wLog)); +} + +uint64_t +RedQueue::AvgCalc (uint32_t backlog) +{ + NS_LOG_FUNCTION (this << backlog); + + uint64_t qtemp; + + if ( !IsIdling ()) + { + qtemp = AvgFromNonIdleTime (backlog); + NS_LOG_DEBUG ("NonIdle Avg " << qtemp); + //std::cout <<"n "<< qtemp << std::endl; + return qtemp; + } + else + { + qtemp = AvgFromIdleTime (); + NS_LOG_DEBUG ("Idle Avg" << qtemp); + //std::cout <<"i "<< qtemp << std::endl; + return qtemp; + } +} + +int +RedQueue::CheckThresh (uint64_t avg) +{ + + NS_LOG_FUNCTION (this << avg); + NS_LOG_DEBUG ("\t check threshold: min " << m_minTh << " max" << m_maxTh); + + if (avg < m_minTh) + { + return BELOW_MIN_THRESH; + } + else if (avg >= m_maxTh) + { + return ABOVE_MAX_THRESH; + } + else + { + return BETWEEN_THRESH; + } +} +uint32_t +RedQueue::RedRandom () +{ + NS_LOG_FUNCTION_NOARGS (); + + ///> obtain a random u32 number + ///> return m_rmask & ran.GetInteger (); + //checkme + return m_rmask & rand (); +} +int +RedQueue::MarkProbability (uint64_t avg) +{ + NS_LOG_FUNCTION (this << avg); + NS_LOG_DEBUG ("\t m_randNum " << m_randNum); + NS_LOG_DEBUG ("\t right\t" << m_randNum); + NS_LOG_DEBUG ("\t left\t" << ((avg - m_minTh)*m_count)); + + ///> max_P* (qavg - qth_min)/(qth_max-qth_min) < rnd/qcount + //return !((avg - m_minTh ) * m_count < m_randNum); + //checkme + return !((avg - m_minTh )* m_count < m_randNum); + +} +int +RedQueue::Processing (uint64_t qavg) +{ + + NS_LOG_FUNCTION (this << "qavg" << qavg << " m_minTh" << m_minTh << " m_maxTh" << m_maxTh); + + switch (CheckThresh (qavg)) + { + case BELOW_MIN_THRESH: + NS_LOG_DEBUG ("\t below threshold "); + + m_count = -1; + return DONT_MARK; + + case BETWEEN_THRESH: + NS_LOG_DEBUG ("\t between threshold "); + + if (++m_count) + { + NS_LOG_DEBUG ("\t check Mark Prob"); + if (MarkProbability (qavg)) + { + m_count = 0; + m_randNum = RedRandom (); + + NS_LOG_DEBUG ("\t Marked Will Drop " << m_qavg); + + return PROB_MARK; + } + NS_LOG_DEBUG ("\t Marked Will Save " << m_qavg); + } + else + { + m_randNum = RedRandom (); + } + return DONT_MARK; + + case ABOVE_MAX_THRESH: + + NS_LOG_DEBUG ("\t above threshold "); + + m_count = -1; + return HARD_MARK; + } + + NS_LOG_DEBUG ("BUG HERE\n"); + return DONT_MARK; +} + + +bool +RedQueue::DoEnqueue (Ptr p) +{ + NS_LOG_FUNCTION (this << p); + + if (m_mode == PACKETS && (m_packets.size () >= m_maxPackets)) + { + NS_LOG_LOGIC ("Queue full (at max packets) -- droppping pkt"); + Drop (p); + return false; + } + + if (m_mode == BYTES && (m_bytesInQueue + p->GetSize () >= m_maxBytes)) + { + NS_LOG_LOGIC ("Queue full (packet would exceed max bytes) -- droppping pkt"); + Drop (p); + return false; + } + + if (!m_initialized) + { + // making sure all the variables are initialized ok + NS_LOG_DEBUG ("\t m_maxPackets" << m_maxPackets + << " m_maxBytes" << m_maxBytes + << " m_burst" << m_burst << " m_avPkt" << m_avPkt + << " m_minTh" << m_minTh << " m_maxTh" << m_maxTh + << " m_rate" << m_rate << " m_prob" << m_prob); + + m_wLog = evalEwma (m_minTh, m_burst, m_avPkt); + m_pLog = evalP (m_minTh, m_maxTh, m_prob); + m_scellLog = evalIdleDamping (m_wLog, m_avPkt, m_rate); + + SetParams (m_minTh, m_maxTh, m_wLog, m_pLog, m_scellLog); + EndIdlePeriod (); +// srand((unsigned)time(0)); + m_initialized = true; + } + +// PrintTable(); + + if (GetMode () == BYTES) + { + m_qavg = AvgCalc (m_bytesInQueue); + } + else if (GetMode () == PACKETS) + { + //not yet supported +// m_qavg = AvgCalc (m_packets.size ()); + } + + NS_LOG_DEBUG ("\t bytesInQueue " << m_bytesInQueue << "\tQavg " << m_qavg); + NS_LOG_DEBUG ("\t packetsInQueue " << m_packets.size () << "\tQavg " << m_qavg); + + + if (IsIdling ()) + { + EndIdlePeriod (); + } + + switch (Processing (m_qavg) ) + { + case DONT_MARK: + break; + + case PROB_MARK: + NS_LOG_DEBUG ("\t Dropping due to Prob Mark " << m_qavg); + m_stats.probDrop++; + m_stats.probMark++; + Drop (p); + return false; + + case HARD_MARK: + NS_LOG_DEBUG ("\t Dropping due to Hard Mark " << m_qavg); + m_stats.forcedMark++; + m_stats.probDrop++; + Drop (p); + return false; + } + + + m_bytesInQueue += p->GetSize (); + m_packets.push_back (p); + + NS_LOG_LOGIC ("Number packets " << m_packets.size ()); + NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue); + + return true; +} + +Ptr +RedQueue::DoDequeue (void) +{ + NS_LOG_FUNCTION (this); + + if (m_packets.empty ()) + { + NS_LOG_LOGIC ("Queue empty"); + return 0; + } + + Ptr p = m_packets.front (); + m_packets.pop_front (); + m_bytesInQueue -= p->GetSize (); + + NS_LOG_LOGIC ("Popped " << p); + + NS_LOG_LOGIC ("Number packets " << m_packets.size ()); + NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue); + + if (m_bytesInQueue <= 0 && !IsIdling ()) + { + StartIdlePeriod (); + } + + return p; +} + +///> just for completeness +/// m_packets.remove (p) also works +int +RedQueue::DropPacket (Ptr p) +{ + + NS_LOG_FUNCTION (this << p); + + NS_LOG_DEBUG ("\t Dropping Packet p"); + + std::list >::iterator iter; + uint32_t packetSize; + + for (iter = m_packets.begin(); iter != m_packets.end(); ++iter) + { + if (*iter == p) + { + packetSize= p->GetSize (); + m_packets.erase(iter); + m_bytesInQueue -= packetSize; + return 1; + } + } + + if (!IsIdling ()) + { + StartIdlePeriod (); + } + + return 0; +} + +Ptr +RedQueue::DoPeek (void) const +{ + NS_LOG_FUNCTION (this); + + if (m_packets.empty ()) + { + NS_LOG_LOGIC ("Queue empty"); + return NULL; + } + + Ptr p = m_packets.front (); + + NS_LOG_LOGIC ("Number packets " << m_packets.size ()); + NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue); + + return p; +} + +void +RedQueue::PrintTable () +{ + NS_LOG_FUNCTION_NOARGS (); + + for (uint32_t i = 0; i < RED_STATS_TABLE_SIZE; i++) + { + std::cout << m_sTable[i] << " "; + } + std::cout << std::endl; +} + + +} // namespace ns3 diff --git a/src/surf/ns3/red-queue.h b/src/surf/ns3/red-queue.h new file mode 100644 index 0000000000..1adece9d59 --- /dev/null +++ b/src/surf/ns3/red-queue.h @@ -0,0 +1,240 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2010 Regents of the University of California + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Duy Nguyen + * + * Random Early Detection (RED) algorithm. + * + * This implementation uses Bytes as queue size metric by default + * based on the Kuznetsov's implementation of Red in Linux. + * Therefore, only bytes as queue size metric is supported at the moment. + * + * Original RED is from + * Sally Floyd and Van Jacobson, "Random Early Detection Gateways for + * Congestion Avoidance", 1993, IEEE/ACM Transactions on Networking + * + * Description: + * + * Packet arrival: + * avg = (1-W)*avg + W*currentQueueLen + * W is the queue weight( chosen as 2^(-Wlog)). Decrease W for larger bursts + * + * if ( avg > maxTh) -> mark/drop packets + * if ( avg < minTh) -> allow packets + * if ( minTh < avg < maxTh) -> calculate probability for marking/dropping + * + * + * Pb = maxP*(avg - minTh)/(maxTh - minTh) + * Note: As avg varies from minTh to maxTh, Pb varies 0 to maxP + * + * Pa = Pb /(1 - count*Pb) + * The final marking probability Pa increases slowly as the count increases + * since the last marked packet + * + * maxP can be chosen s/t: + * maxP = (maxTh - minTh )/2^Plog + * + * To allow large bursts of L packets of size S, W can be chosen as: + * (see paper for details) + * + * L + 1 - minTh/S < (1-(1-W)^L)/W + * + * + * Some parameters: + * W = 0.002 + * maxP = .02 + * + * + */ + +#ifndef RED_QUEUE_H +#define RED_QUEUE_H + +#include +#include "ns3/packet.h" +#include "ns3/queue.h" +#include "ns3/nstime.h" + +namespace ns3 { + +class TraceContainer; + +/** + * \ingroup queue + * + * \brief A RED packet queue + */ +class RedQueue : public Queue +{ +public: + typedef std::vector< uint32_t> Uint32tVector; + + struct Stats + { + uint32_t probDrop; ///< Early probability drops + uint32_t probMark; ///< Early probability marks + uint32_t forcedDrop; ///< Forced drops, qavg > max threshold + uint32_t forcedMark; ///< Forced marks, qavg > max threshold + uint32_t pdrop; ///< Drops due to queue limits + uint32_t other; ///< Drops due to drop calls + uint32_t backlog; + }; + + static TypeId GetTypeId (void); + /** + * \brief RedQueue Constructor + * + */ + RedQueue (); + + virtual ~RedQueue (); + + /** + * Enumeration of the modes supported in the class. + * + */ + enum Mode + { + ILLEGAL, /**< Mode not set */ + PACKETS, /**< Use number of packets for maximum queue size */ + BYTES, /**< Use number of bytes for maximum queue size */ + }; + + /** + * Enumeration of RED thresholds + * + */ + enum + { + BELOW_MIN_THRESH, + ABOVE_MAX_THRESH, + BETWEEN_THRESH, + }; + + /** + * Enumeration Marking + * + */ + enum + { + DONT_MARK, + PROB_MARK, + HARD_MARK, + }; + + /** + * Set the operating mode of this device. + * + * \param mode The operating mode of this device. + * + */ + void SetMode (RedQueue::Mode mode); + + /** + * Get the encapsulation mode of this device. + * + * \returns The encapsulation mode of this device. + */ + RedQueue::Mode GetMode (void); + + /** + * Get the average queue size + * + * \returns The average queue size in bytes + */ + uint64_t GetAverageQueueSize (void); + + +private: + void SetParams (uint32_t minTh, uint32_t maxTh, + uint32_t wLog, uint32_t pLog, uint64_t scellLog ); + void StartIdlePeriod (); + void EndIdlePeriod (); + void Restart (); + void printRedOpt (); + void printStats (); + void PrintTable (); + + int IsIdling (); + int CheckThresh (uint64_t avg); + int Processing (uint64_t avg); + int MarkProbability (uint64_t avg); + int DropPacket (Ptr p); + + uint64_t AvgFromIdleTime (); + uint64_t AvgCalc (uint32_t backlog); + + ///< Avg = Avg*(1-W) + backlog*W + uint64_t AvgFromNonIdleTime (uint32_t backlog); + + ///< burst + 1 - qmin/avpkt < (1-(1-W)^burst)/W + ///< this low-pass filter is used to calculate the avg queue size + uint32_t evalEwma (uint32_t minTh, uint32_t burst, uint32_t avpkt); + + ///< Plog = log (prob / (qMax - qMin)) + uint32_t evalP (uint32_t minTh, uint32_t maxTh, double prob); + + ///< -log(1-W) * t/TxTime + uint32_t evalIdleDamping (uint32_t wLog, uint32_t avpkt, uint32_t rate); + + uint32_t Rmask (uint32_t pLog); + uint32_t RedRandom (); + + virtual bool DoEnqueue (Ptr p); + virtual Ptr DoDequeue (void); + virtual Ptr DoPeek (void) const; + + + std::list > m_packets; + + Mode m_mode; + + uint32_t m_bytesInQueue; + + ///< users' configurable options + uint32_t m_maxPackets; + uint32_t m_maxBytes; + uint32_t m_burst; + + /** + * in bytes, use with burst to determine the time constant + * for average queue size calculations, for ewma + */ + uint32_t m_avPkt; + uint32_t m_minTh; ///> Min avg length threshold (bytes), should be < maxTh/2 + uint32_t m_maxTh; ///> Max avg length threshold (bytes), should be >= 2*minTh + uint32_t m_rate; ///> bandwidth in bps + uint32_t m_wLog; ///> log(W) bits + uint32_t m_pLog; ///> random number bits log (P_max/(maxTh - minTh)) + uint32_t m_rmask; + uint32_t m_scellLog; ///> cell size for idle damping + uint64_t m_scellMax; + uint32_t m_count; ///> number of packets since last random number generation + uint32_t m_randNum; ///> a random number 0 ...2^Plog + + uint64_t m_qavg; ///> average q length + double m_prob; + bool m_initialized; + + Stats m_stats; + Time m_idleStart; ///> start of current idle period + Uint32tVector m_sTable; +}; + +}; // namespace ns3 + +#endif /* RED_QUEUE_H */ diff --git a/src/surf/simgrid.dtd b/src/surf/simgrid.dtd index 057282b55e..8d36c101a8 100644 --- a/src/surf/simgrid.dtd +++ b/src/surf/simgrid.dtd @@ -2,6 +2,9 @@ + + + @@ -22,11 +25,10 @@ - + - @@ -48,11 +50,12 @@ - - + + + diff --git a/src/surf/simgrid_dtd.c b/src/surf/simgrid_dtd.c index 47d107e605..36f1a5a7a2 100644 --- a/src/surf/simgrid_dtd.c +++ b/src/surf/simgrid_dtd.c @@ -403,8 +403,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 398 -#define YY_END_OF_BUFFER 399 +#define YY_NUM_RULES 405 +#define YY_END_OF_BUFFER 406 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -412,7 +412,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[2424] = +static yyconst flex_int16_t yy_accept[2421] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -433,244 +433,244 @@ static yyconst flex_int16_t yy_accept[2424] = 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, 399, 397, - 15, 10, 10, 15, 15, 377, 10, 377, 5, 6, - - 5, 8, 9, 8, 393, 385, 386, 394, 391, 394, - 392, 396, 385, 386, 396, 397, 22, 10, 22, 22, - 22, 20, 22, 26, 10, 26, 26, 397, 26, 397, - 397, 26, 37, 10, 37, 37, 37, 35, 37, 37, - 37, 394, 393, 67, 10, 67, 67, 67, 65, 67, - 67, 67, 67, 67, 71, 10, 71, 397, 71, 90, - 10, 90, 90, 90, 88, 90, 90, 90, 94, 10, - 94, 105, 10, 105, 105, 105, 103, 105, 105, 105, - 109, 10, 109, 109, 397, 109, 109, 397, 397, 109, - 397, 109, 397, 109, 132, 10, 132, 132, 132, 130, - - 132, 132, 132, 132, 132, 136, 10, 136, 136, 175, - 10, 175, 175, 175, 173, 175, 175, 175, 175, 175, - 175, 175, 175, 179, 10, 179, 204, 10, 204, 204, - 204, 202, 204, 204, 204, 204, 204, 204, 204, 208, - 10, 208, 217, 10, 217, 217, 217, 215, 217, 217, - 221, 10, 221, 248, 10, 248, 248, 248, 246, 248, - 248, 248, 248, 252, 10, 252, 252, 265, 10, 265, - 265, 265, 263, 265, 265, 269, 10, 269, 397, 269, - 286, 10, 286, 286, 286, 284, 286, 286, 286, 290, - 10, 290, 290, 303, 10, 303, 303, 303, 301, 303, - - 303, 307, 10, 307, 320, 10, 320, 320, 320, 318, - 320, 320, 320, 324, 10, 324, 324, 337, 10, 337, - 337, 337, 335, 337, 337, 337, 337, 341, 10, 341, - 397, 341, 348, 10, 348, 348, 348, 346, 348, 352, - 10, 352, 359, 10, 359, 359, 359, 357, 359, 363, - 10, 363, 363, 372, 10, 372, 372, 372, 370, 372, - 372, 376, 10, 376, 10, 0, 2, 2, 0, 4, - 7, 388, 387, 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, 406, 404, 15, 10, 10, 15, 15, 384, + + 10, 384, 5, 6, 5, 8, 9, 8, 400, 392, + 393, 401, 398, 401, 399, 403, 392, 393, 403, 404, + 22, 10, 22, 22, 22, 20, 22, 26, 10, 26, + 26, 404, 26, 404, 404, 26, 33, 10, 33, 33, + 33, 31, 33, 37, 10, 37, 48, 10, 48, 48, + 48, 46, 48, 48, 48, 401, 400, 78, 10, 78, + 78, 78, 76, 78, 78, 78, 78, 78, 82, 10, + 82, 404, 82, 101, 10, 101, 101, 101, 99, 101, + 101, 101, 105, 10, 105, 114, 10, 114, 114, 114, + 112, 114, 114, 118, 10, 118, 118, 404, 118, 118, + + 404, 404, 118, 404, 118, 404, 118, 141, 10, 141, + 141, 141, 139, 141, 141, 141, 141, 141, 145, 10, + 145, 145, 186, 10, 186, 186, 186, 184, 186, 186, + 186, 186, 186, 186, 186, 186, 190, 10, 190, 211, + 10, 211, 211, 211, 209, 211, 211, 211, 211, 211, + 211, 211, 215, 10, 215, 224, 10, 224, 224, 224, + 222, 224, 224, 228, 10, 228, 255, 10, 255, 255, + 255, 253, 255, 255, 255, 255, 259, 10, 259, 259, + 272, 10, 272, 272, 272, 270, 272, 272, 276, 10, + 276, 404, 276, 293, 10, 293, 293, 293, 291, 293, + + 293, 293, 297, 10, 297, 297, 310, 10, 310, 310, + 310, 308, 310, 310, 314, 10, 314, 327, 10, 327, + 327, 327, 325, 327, 327, 327, 331, 10, 331, 331, + 344, 10, 344, 344, 344, 342, 344, 344, 344, 344, + 348, 10, 348, 404, 348, 355, 10, 355, 355, 355, + 353, 355, 359, 10, 359, 366, 10, 366, 366, 366, + 364, 366, 370, 10, 370, 370, 379, 10, 379, 379, + 379, 377, 379, 379, 383, 10, 383, 10, 0, 2, + 2, 0, 4, 7, 395, 394, 0, 0, 0, 0, + 0, 0, 0, 21, 23, 23, 0, 0, 0, 0, - 0, 0, 36, 38, 38, 38, 38, 0, 0, 0, - 66, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 0, 0, 89, 91, 91, 91, 91, 0, 104, 106, - 106, 106, 106, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 133, 133, 133, 133, 133, 133, 0, - 174, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 0, 203, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 0, 216, 218, 218, 218, - 0, 247, 249, 249, 249, 249, 249, 249, 0, 264, - 266, 266, 266, 266, 0, 0, 285, 287, 287, 287, - - 287, 287, 0, 302, 304, 304, 304, 0, 319, 321, - 321, 321, 321, 0, 336, 338, 338, 338, 338, 338, - 0, 0, 347, 349, 349, 0, 358, 360, 360, 0, - 371, 373, 373, 373, 0, 0, 0, 0, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 395, 0, 23, - 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, - 0, 0, 38, 0, 0, 38, 0, 0, 0, 390, - 68, 0, 0, 68, 68, 68, 68, 68, 68, 0, - 0, 0, 91, 91, 91, 0, 0, 106, 0, 0, - - 106, 0, 0, 96, 0, 0, 0, 0, 95, 0, - 0, 133, 133, 133, 0, 0, 133, 133, 0, 0, - 176, 176, 0, 0, 176, 0, 0, 176, 176, 176, - 176, 176, 176, 176, 0, 0, 205, 205, 205, 0, - 0, 205, 205, 205, 205, 0, 0, 218, 0, 0, - 0, 0, 249, 0, 0, 249, 249, 249, 0, 0, - 266, 266, 266, 0, 0, 0, 287, 287, 287, 287, - 0, 0, 304, 0, 0, 0, 0, 321, 321, 321, - 0, 0, 338, 338, 338, 338, 0, 0, 0, 349, - 0, 0, 0, 0, 0, 0, 0, 0, 373, 0, - - 0, 0, 14, 1, 0, 0, 383, 0, 0, 0, - 380, 379, 0, 0, 23, 0, 0, 25, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, - 38, 0, 30, 29, 38, 0, 0, 0, 40, 0, - 68, 0, 44, 43, 0, 0, 68, 0, 0, 68, - 68, 68, 0, 0, 70, 0, 0, 91, 91, 91, - 0, 0, 93, 0, 106, 0, 98, 97, 106, 0, - 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, - 133, 133, 133, 0, 113, 112, 133, 133, 0, 0, - - 135, 0, 176, 176, 176, 176, 0, 152, 151, 176, - 0, 140, 139, 0, 0, 176, 176, 176, 176, 176, - 176, 0, 0, 178, 0, 205, 205, 205, 205, 0, - 183, 182, 0, 0, 205, 205, 205, 0, 0, 207, - 0, 218, 0, 212, 211, 0, 0, 220, 0, 249, - 0, 225, 224, 249, 249, 249, 0, 0, 251, 0, - 0, 0, 0, 0, 266, 0, 0, 268, 0, 0, - 0, 0, 287, 287, 0, 0, 287, 0, 0, 289, - 0, 304, 0, 294, 293, 0, 0, 306, 0, 0, - 0, 321, 321, 0, 0, 0, 0, 323, 0, 338, - - 338, 338, 338, 0, 0, 340, 0, 0, 349, 0, - 0, 351, 0, 0, 356, 355, 0, 0, 362, 0, - 0, 367, 366, 373, 0, 0, 375, 0, 0, 0, - 384, 378, 0, 0, 0, 23, 0, 0, 0, 0, - 0, 0, 110, 222, 181, 0, 0, 364, 0, 0, - 0, 0, 0, 0, 180, 0, 0, 0, 0, 38, - 0, 0, 68, 0, 48, 47, 0, 0, 0, 46, - 45, 68, 0, 0, 68, 0, 365, 91, 0, 0, - 91, 0, 106, 106, 0, 107, 0, 0, 111, 223, - 0, 0, 0, 133, 133, 0, 0, 133, 133, 0, - - 176, 176, 176, 176, 0, 0, 0, 154, 153, 176, - 176, 176, 176, 176, 176, 0, 205, 205, 205, 205, - 0, 191, 190, 205, 205, 205, 0, 218, 0, 249, - 249, 249, 249, 0, 0, 258, 257, 0, 256, 255, - 266, 0, 222, 0, 275, 274, 287, 287, 0, 273, - 272, 287, 0, 304, 0, 0, 313, 312, 321, 321, - 0, 311, 310, 0, 338, 0, 0, 338, 338, 0, - 0, 349, 0, 0, 373, 0, 0, 0, 0, 12, - 0, 381, 382, 0, 23, 0, 0, 0, 0, 0, - 0, 110, 222, 0, 181, 0, 0, 364, 0, 253, - - 28, 0, 0, 0, 180, 0, 27, 0, 32, 31, - 38, 0, 0, 68, 0, 50, 49, 68, 0, 54, - 53, 68, 0, 365, 91, 0, 0, 0, 0, 0, - 0, 106, 106, 0, 0, 111, 223, 254, 254, 253, - 133, 133, 0, 117, 116, 0, 0, 0, 0, 133, - 0, 176, 0, 0, 176, 176, 0, 150, 149, 0, - 0, 176, 176, 176, 176, 176, 0, 205, 0, 0, - 205, 205, 0, 0, 205, 205, 0, 218, 0, 249, - 249, 249, 0, 0, 249, 0, 266, 0, 0, 287, - 287, 287, 0, 304, 0, 321, 321, 0, 338, 0, - - 328, 327, 338, 338, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 0, 23, 0, - 0, 0, 0, 0, 354, 0, 0, 0, 42, 253, - 209, 28, 0, 353, 41, 0, 0, 27, 0, 38, - 0, 0, 68, 68, 68, 0, 91, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 85, 84, 0, 106, - 106, 0, 0, 254, 210, 133, 133, 0, 115, 114, - 0, 0, 0, 133, 0, 134, 176, 0, 162, 161, - 0, 0, 176, 0, 148, 147, 0, 0, 176, 176, - 176, 0, 0, 0, 205, 0, 187, 186, 0, 0, - - 205, 0, 185, 184, 205, 205, 0, 206, 218, 0, - 249, 249, 249, 0, 0, 0, 249, 0, 250, 266, - 0, 0, 0, 0, 0, 0, 287, 0, 304, 0, - 0, 0, 0, 0, 0, 338, 338, 338, 0, 0, - 0, 345, 344, 0, 0, 0, 369, 368, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, - 138, 354, 0, 0, 326, 42, 209, 0, 353, 41, - 137, 325, 0, 38, 0, 0, 39, 68, 0, 0, - 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 106, 0, 0, 271, 0, - - 210, 133, 133, 0, 0, 133, 176, 0, 164, 163, - 176, 0, 142, 141, 0, 0, 176, 176, 0, 144, - 143, 0, 205, 0, 189, 188, 205, 205, 205, 218, - 0, 249, 0, 0, 249, 249, 0, 0, 249, 266, - 0, 267, 0, 0, 279, 278, 0, 277, 276, 287, - 0, 304, 0, 0, 317, 316, 0, 315, 314, 0, - 338, 338, 338, 0, 0, 0, 0, 0, 0, 0, - 17, 0, 19, 18, 0, 270, 342, 0, 138, 291, - 16, 326, 0, 137, 325, 0, 38, 389, 68, 0, - 56, 55, 68, 0, 69, 0, 87, 86, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, - 0, 100, 99, 271, 0, 133, 133, 0, 0, 0, - 0, 133, 176, 176, 0, 146, 145, 176, 176, 0, - 205, 205, 205, 205, 218, 0, 219, 249, 0, 231, - 230, 249, 249, 0, 0, 0, 0, 249, 266, 292, - 287, 0, 304, 0, 0, 0, 0, 338, 338, 0, - 343, 0, 0, 361, 0, 0, 0, 17, 0, 342, - 0, 291, 16, 0, 0, 38, 0, 0, 68, 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, + 0, 100, 102, 102, 102, 102, 0, 113, 115, 115, + 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 140, 142, 142, 142, 142, 142, 142, 0, 185, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 0, 210, 212, 212, 212, 212, 212, + 212, 212, 212, 0, 223, 225, 225, 225, 0, 254, + + 256, 256, 256, 256, 256, 256, 0, 271, 273, 273, + 273, 273, 0, 0, 292, 294, 294, 294, 294, 294, + 0, 309, 311, 311, 311, 0, 326, 328, 328, 328, + 328, 0, 343, 345, 345, 345, 345, 345, 0, 0, + 354, 356, 356, 0, 365, 367, 367, 0, 378, 380, + 380, 380, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 402, 0, 23, 0, 0, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, + 0, 0, 34, 0, 0, 49, 0, 0, 49, 0, + + 0, 0, 397, 79, 0, 0, 79, 79, 79, 79, + 79, 79, 0, 0, 0, 102, 102, 102, 0, 0, + 0, 0, 115, 0, 0, 107, 0, 0, 0, 0, + 106, 0, 0, 142, 142, 142, 0, 0, 142, 142, + 0, 0, 187, 187, 0, 0, 187, 0, 0, 187, + 187, 187, 187, 187, 187, 187, 187, 0, 0, 212, + 212, 212, 0, 0, 212, 212, 212, 0, 0, 225, + 0, 0, 0, 0, 256, 0, 0, 256, 256, 256, + 0, 0, 273, 273, 273, 0, 0, 0, 294, 294, + 294, 294, 0, 0, 311, 0, 0, 0, 0, 328, + + 328, 328, 0, 0, 345, 345, 345, 345, 0, 0, + 0, 356, 0, 0, 0, 0, 0, 0, 0, 0, + 380, 0, 0, 0, 14, 1, 0, 0, 390, 0, + 0, 0, 387, 386, 0, 0, 23, 0, 0, 25, + 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 106, 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, 0, 102, 102, 102, 0, + + 0, 104, 0, 0, 109, 108, 115, 0, 0, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 142, 142, + 142, 0, 122, 121, 142, 142, 0, 0, 144, 0, + 187, 187, 187, 187, 0, 161, 160, 187, 0, 149, + 148, 0, 0, 187, 187, 187, 187, 187, 187, 187, + 0, 0, 189, 0, 212, 212, 212, 212, 0, 194, + 193, 0, 0, 212, 212, 0, 0, 214, 0, 225, + 0, 219, 218, 0, 0, 227, 0, 256, 0, 232, + 231, 256, 256, 256, 0, 0, 258, 0, 0, 0, + 0, 0, 273, 0, 0, 275, 0, 0, 0, 0, + + 294, 294, 0, 0, 294, 0, 0, 296, 0, 311, + 0, 301, 300, 0, 0, 313, 0, 0, 0, 328, + 328, 0, 0, 0, 0, 330, 0, 345, 345, 345, + 345, 0, 0, 347, 0, 0, 356, 0, 0, 358, + 0, 0, 363, 362, 0, 0, 369, 0, 0, 374, + 373, 380, 0, 0, 382, 0, 0, 0, 391, 385, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, + 119, 0, 229, 192, 0, 0, 371, 0, 0, 0, + 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 79, 0, 59, 58, 0, + + 0, 0, 57, 56, 79, 0, 0, 79, 0, 372, + 102, 0, 0, 102, 0, 115, 0, 116, 0, 0, + 120, 230, 0, 0, 0, 142, 142, 0, 0, 142, + 142, 0, 187, 187, 187, 187, 0, 0, 0, 163, + 162, 187, 187, 187, 187, 187, 187, 187, 0, 212, + 212, 212, 212, 0, 202, 201, 212, 212, 0, 225, + 0, 256, 256, 256, 256, 0, 0, 265, 264, 0, + 263, 262, 273, 0, 229, 0, 282, 281, 294, 294, + 0, 280, 279, 294, 0, 311, 0, 0, 320, 319, + 328, 328, 0, 318, 317, 0, 345, 0, 0, 345, + + 345, 0, 0, 356, 0, 0, 380, 0, 0, 0, + 0, 12, 0, 388, 389, 0, 23, 0, 0, 0, + 0, 0, 0, 119, 0, 229, 0, 192, 0, 0, + 371, 0, 260, 39, 0, 0, 0, 0, 191, 0, + 38, 0, 30, 29, 0, 0, 43, 42, 49, 0, + 0, 79, 0, 61, 60, 79, 0, 65, 64, 79, + 0, 372, 102, 0, 0, 0, 0, 0, 0, 115, + 0, 0, 120, 230, 261, 261, 260, 142, 142, 0, + 126, 125, 0, 0, 0, 0, 142, 0, 187, 0, + 0, 187, 187, 0, 159, 158, 0, 0, 187, 187, + + 187, 187, 187, 187, 0, 212, 0, 0, 212, 212, + 0, 0, 212, 0, 225, 0, 256, 256, 256, 0, + 0, 256, 0, 273, 0, 0, 294, 294, 294, 0, + 311, 0, 328, 328, 0, 345, 0, 335, 334, 345, + 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 0, 23, 0, 0, 0, 0, + 0, 361, 0, 0, 0, 0, 53, 260, 216, 39, + 0, 360, 52, 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, 115, + + 0, 0, 261, 217, 142, 142, 0, 124, 123, 0, + 0, 0, 142, 0, 143, 187, 0, 171, 170, 0, + 0, 187, 0, 157, 156, 0, 0, 187, 187, 187, + 187, 0, 0, 0, 212, 0, 198, 197, 0, 0, + 212, 0, 196, 195, 212, 0, 213, 225, 0, 256, + 256, 256, 0, 0, 0, 256, 0, 257, 273, 0, + 0, 0, 0, 0, 0, 294, 0, 311, 0, 0, + 0, 0, 0, 0, 345, 345, 345, 0, 0, 0, + 352, 351, 0, 0, 0, 376, 375, 0, 381, 0, + 0, 0, 0, 0, 0, 0, 277, 0, 0, 147, + + 361, 28, 0, 0, 333, 53, 216, 0, 360, 52, + 146, 27, 332, 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, 278, + 0, 217, 142, 142, 0, 0, 142, 187, 0, 173, + 172, 187, 0, 151, 150, 0, 0, 187, 187, 187, + 0, 153, 152, 0, 212, 0, 200, 199, 212, 212, + 225, 0, 256, 0, 0, 256, 256, 0, 0, 256, + 273, 0, 274, 0, 0, 286, 285, 0, 284, 283, + 294, 0, 311, 0, 0, 324, 323, 0, 322, 321, + + 0, 345, 345, 345, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 19, 18, 0, 277, 349, 0, 147, + 28, 298, 16, 333, 0, 146, 27, 332, 0, 0, + 49, 396, 79, 0, 67, 66, 79, 0, 80, 0, + 98, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 111, 110, 278, 0, 142, 142, + 0, 0, 0, 0, 142, 187, 187, 0, 155, 154, + 187, 187, 187, 0, 212, 212, 212, 225, 0, 226, + 256, 0, 238, 237, 256, 256, 0, 0, 0, 0, + 256, 273, 299, 294, 0, 311, 0, 0, 0, 0, + + 345, 345, 0, 350, 0, 0, 368, 0, 0, 0, + 17, 0, 349, 0, 298, 16, 0, 0, 0, 35, + 49, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 142, 142, 0, 132, + 0, 131, 142, 187, 187, 0, 0, 187, 187, 0, + 188, 212, 212, 212, 225, 0, 0, 256, 256, 256, + 0, 242, 0, 241, 256, 273, 299, 294, 0, 295, + 0, 0, 0, 0, 0, 337, 336, 0, 0, 345, + 0, 346, 350, 0, 0, 0, 0, 0, 24, 0, + 0, 0, 49, 0, 0, 0, 79, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, + 142, 134, 133, 0, 0, 187, 187, 0, 183, 182, + 187, 0, 0, 212, 212, 0, 0, 225, 0, 234, + 233, 256, 256, 256, 244, 243, 0, 0, 273, 294, + 0, 0, 0, 0, 312, 0, 0, 341, 340, 0, + 0, 0, 357, 0, 0, 0, 315, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 0, 0, 88, 0, 0, 0, 0, 87, 0, 316, + 142, 0, 0, 0, 136, 135, 187, 187, 187, 0, + 181, 180, 212, 0, 0, 0, 208, 207, 0, 0, + + 256, 256, 256, 0, 246, 245, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 339, 338, + 0, 0, 0, 315, 0, 0, 0, 45, 44, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, + 142, 0, 138, 137, 187, 187, 187, 212, 0, 204, + 203, 0, 221, 220, 256, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 0, 133, 133, 0, 123, 0, 122, 133, 176, - - 176, 176, 176, 0, 177, 205, 205, 205, 205, 218, - 0, 0, 249, 249, 249, 0, 235, 0, 234, 249, - 266, 292, 287, 0, 288, 0, 0, 0, 0, 0, - 330, 329, 0, 0, 338, 0, 339, 343, 0, 0, - 0, 0, 0, 24, 0, 0, 0, 38, 0, 0, - 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 106, 0, 133, 133, 125, 124, 0, - 0, 176, 176, 176, 0, 0, 205, 205, 205, 0, - 0, 218, 0, 227, 226, 249, 249, 249, 237, 236, - 0, 0, 266, 287, 0, 0, 0, 0, 305, 0, - - 0, 334, 333, 0, 0, 0, 350, 0, 0, 0, - 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 68, 0, 0, 0, 0, 77, 0, 0, 0, - 0, 76, 0, 0, 0, 309, 133, 0, 0, 0, - 127, 126, 176, 176, 176, 0, 172, 171, 205, 0, - 0, 205, 0, 201, 200, 0, 0, 249, 249, 249, - 0, 239, 238, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 332, 331, 0, 0, 0, - 308, 0, 0, 0, 34, 33, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 102, 101, 309, 0, 0, - 133, 0, 129, 128, 176, 176, 176, 205, 0, 193, - 192, 205, 0, 214, 213, 249, 0, 0, 249, 0, + 0, 0, 0, 0, 0, 84, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, + + 0, 0, 0, 93, 0, 0, 0, 128, 127, 142, + 187, 187, 187, 212, 256, 0, 240, 239, 256, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, + 0, 0, 302, 0, 329, 0, 0, 0, 0, 0, + 0, 84, 83, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 63, 62, 0, 0, 0, 0, 0, 0, + 0, 142, 187, 187, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 73, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 0, 0, 0, 82, 0, 0, 0, 119, 118, - 133, 176, 176, 176, 205, 205, 249, 0, 233, 232, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 296, 0, 0, 295, 0, 322, 0, 0, 0, - - 0, 0, 0, 73, 72, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 52, 51, 0, 0, 0, 0, - 0, 0, 0, 133, 176, 176, 0, 0, 205, 0, + 75, 71, 0, 0, 74, 70, 0, 92, 0, 0, + + 91, 0, 0, 0, 103, 142, 187, 187, 0, 0, + 0, 212, 0, 236, 235, 0, 0, 0, 269, 0, + 268, 0, 290, 0, 289, 0, 305, 307, 304, 306, + 0, 0, 0, 12, 0, 12, 0, 0, 0, 0, + 0, 86, 90, 85, 89, 142, 187, 187, 0, 0, + 0, 0, 212, 0, 0, 0, 0, 267, 266, 288, + 287, 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, 64, 60, 0, 0, 63, 59, - 0, 81, 0, 0, 80, 0, 0, 0, 92, 133, - 176, 176, 0, 0, 0, 205, 0, 0, 0, 0, - 229, 228, 0, 0, 0, 262, 0, 261, 0, 283, - 0, 282, 0, 298, 300, 297, 299, 0, 0, 0, - - 12, 0, 12, 0, 0, 0, 0, 0, 75, 79, - 74, 78, 133, 176, 176, 0, 0, 0, 0, 205, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 259, - 281, 280, 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, 58, 0, 57, - 0, 0, 121, 120, 0, 170, 169, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 199, 198, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 69, 0, 68, 0, 0, 130, 129, 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, 62, 61, 0, 0, 0, 0, + 179, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 206, 205, 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, 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, 0, 0, 156, 0, 0, 155, 0, 195, - 0, 194, 0, 0, 241, 0, 0, 240, 0, 0, - 0, 0, 0, 160, 0, 159, 0, 0, 0, 243, - - 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 166, 0, 165, 0, - 0, 0, 0, 0, 0, 0, 0, 168, 167, 158, - 157, 197, 196, 245, 244, 0, 0, 0, 0, 0, + 0, 0, 0, 165, 0, 0, 164, 0, 0, 248, + 0, 0, 247, 0, 0, 0, 0, 0, 169, 0, + + 168, 0, 250, 0, 249, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 175, 0, 174, + 0, 0, 0, 0, 0, 0, 177, 176, 167, 166, + 252, 251, 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, @@ -679,8 +679,7 @@ static yyconst flex_int16_t yy_accept[2424] = 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, 0, 0, 0, 13, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -727,2109 +726,2162 @@ static yyconst flex_int32_t yy_meta[73] = 5, 5 } ; -static yyconst flex_int16_t yy_base[2701] = +static yyconst flex_int16_t yy_base[2714] = { 0, 0, 0, 0, 3, 6, 9, 12, 29, 16, 19, 14, 17, 33, 36, 49, 55, 45, 61, 66, 72, 108, 177, 75, 78, 83, 128, 131, 134, 138, 141, 158, 197, 200, 203, 207, 210, 227, 230, 233, 236, - 239, 256, 274, 337, 306, 314, 400, 466, 294, 297, - 301, 360, 363, 367, 370, 420, 532, 599, 423, 426, - 666, 731, 430, 433, 486, 489, 492, 496, 499, 552, - 555, 558, 562, 565, 619, 622, 625, 629, 632, 686, - 689, 692, 696, 751, 754, 757, 761, 781, 787, 790, - 798, 807, 825, 891, 845, 848, 851, 855, 911, 914, - - 917, 921, 957, 0, 1028, 1031, 1049, 0, 1120, 1123, - 1141, 1198, 1161, 1164, 1255, 1321, 1167, 1171, 1218, 1221, - 1224, 1228, 1275, 1278, 1387, 1453, 1281, 1285, 1288, 1341, - 1344, 1347, 1351, 1354, 1519, 1585, 1407, 1410, 1413, 1417, - 1420, 1473, 1476, 1479, 1651, 1708, 1483, 1486, 1765, 1831, - 1539, 1542, 1545, 1549, 1552, 1605, 1608, 1611, 1897, 1963, - 1615, 1618, 1671, 1674, 1677, 1681, 1684, 1728, 2029, 2098, - 1731, 1734, 2167, 2224, 1738, 1741, 1785, 1788, 1791, 1795, - 1798, 1851, 2281, 2350, 1854, 1857, 0, 0, 6568, 7795, - 7795, 95, 100, 29, 41, 7795, 103, 51, 7795, 7795, - - 6557, 7795, 7795, 6541, 7795, 6555, 6549, 390, 7795, 7795, - 7795, 7795, 6547, 6542, 6497, 145, 7795, 161, 6523, 0, - 146, 7795, 6484, 7795, 166, 2415, 88, 204, 205, 260, - 6524, 6467, 7795, 169, 6509, 0, 153, 7795, 6471, 6470, - 6468, 374, 6468, 7795, 259, 6494, 0, 244, 7795, 6460, - 6455, 277, 6457, 197, 7795, 304, 31, 112, 181, 7795, - 373, 6480, 0, 248, 7795, 6440, 6441, 6427, 7795, 459, - 375, 7795, 516, 6471, 0, 308, 7795, 6423, 6432, 6421, - 7795, 525, 1869, 1870, 6418, 35, 6454, 16, 135, 565, - 583, 83, 6458, 155, 7795, 589, 6449, 0, 377, 7795, - - 6399, 6400, 6409, 6393, 6387, 7795, 594, 377, 380, 7795, - 651, 6433, 0, 437, 7795, 6378, 177, 6384, 6388, 6390, - 271, 6389, 441, 7795, 656, 644, 7795, 659, 6412, 0, - 501, 7795, 6362, 6355, 6362, 6371, 6368, 6354, 4, 7795, - 699, 703, 7795, 716, 6390, 0, 567, 7795, 6347, 6356, - 7795, 723, 792, 7795, 726, 6383, 0, 700, 7795, 6353, - 6349, 6351, 260, 7795, 764, 387, 419, 7795, 815, 6368, - 0, 701, 7795, 6321, 201, 7795, 818, 452, 6374, 6324, - 7795, 858, 6362, 0, 765, 7795, 6315, 6306, 387, 7795, - 875, 6363, 504, 7795, 881, 6354, 0, 766, 7795, 6314, - - 6318, 7795, 924, 802, 7795, 941, 6349, 0, 859, 7795, - 6298, 6293, 6297, 7795, 947, 6347, 512, 7795, 1034, 6338, - 0, 860, 7795, 6289, 6290, 6294, 6283, 7795, 1037, 1123, - 6335, 526, 7795, 1040, 6326, 0, 865, 7795, 6296, 7795, - 1126, 1172, 7795, 1129, 6320, 0, 925, 7795, 6287, 7795, - 1192, 404, 518, 7795, 1231, 6318, 0, 926, 7795, 6283, - 6285, 7795, 1248, 1292, 1305, 672, 6262, 7795, 6318, 6307, - 7795, 7795, 7795, 1302, 330, 6259, 6256, 6254, 6301, 6257, - 7795, 0, 6250, 6251, 6272, 6245, 6237, 515, 6242, 6246, - 1188, 589, 6237, 582, 1129, 6260, 714, 1311, 6233, 736, - - 1377, 1384, 7795, 0, 6238, 1860, 6227, 538, 6224, 6270, - 7795, 0, 6226, 1920, 6215, 6236, 6219, 6227, 6225, 6223, - 6209, 1387, 7795, 0, 6220, 6207, 6218, 6199, 7795, 0, - 6201, 1927, 6194, 6239, 6217, 6183, 6192, 6194, 1249, 6211, - 1312, 1317, 7795, 0, 6200, 741, 1933, 6174, 6194, 6186, - 7795, 0, 6190, 6190, 1938, 6172, 1983, 6167, 6163, 6179, - 6175, 6177, 6176, 6168, 6170, 7795, 0, 6171, 6167, 6152, - 1986, 6146, 6140, 6160, 6159, 6140, 7795, 0, 6140, 1989, - 6136, 7795, 0, 6137, 1992, 6130, 6147, 6142, 6131, 7795, - 0, 6122, 6135, 6125, 6119, 6122, 7795, 0, 6103, 6121, - - 6117, 6103, 6140, 7795, 0, 6096, 1995, 6097, 7795, 0, - 6088, 6106, 6098, 6098, 7795, 0, 6086, 6076, 6082, 6091, - 6072, 6069, 7795, 0, 6074, 6079, 7795, 0, 2049, 6076, - 7795, 0, 2052, 6067, 6058, 6100, 6109, 916, 6054, 7795, - 1368, 0, 6050, 6050, 6090, 6089, 6043, 7795, 6051, 6033, - 1864, 2061, 1504, 6043, 6030, 6024, 6030, 6020, 6024, 6031, - 6030, 6016, 6016, 6004, 6022, 6009, 6004, 1507, 5996, 6010, - 5996, 6008, 6003, 2055, 1573, 5994, 6026, 2058, 2126, 7795, - 5996, 2119, 1639, 2122, 5623, 2129, 5626, 5629, 5632, 2132, - 2191, 5617, 5618, 5625, 5625, 2195, 2198, 5610, 2147, 1819, - - 5606, 2201, 2258, 1513, 5609, 5604, 5601, 5593, 1759, 5591, - 5583, 5593, 5583, 5589, 2204, 2080, 5587, 5568, 2244, 2247, - 5577, 1131, 2250, 2088, 5579, 2253, 2151, 2301, 5574, 5572, - 5562, 5552, 5549, 5560, 2304, 2313, 5544, 26, 5535, 2310, - 2271, 2328, 5545, 5525, 5522, 2319, 2371, 5522, 2374, 2339, - 2378, 2381, 5534, 2384, 2402, 5531, 5514, 5511, 2410, 2413, - 2419, 2437, 2442, 2447, 2455, 5511, 2450, 2481, 2484, 2488, - 2491, 2495, 5518, 2502, 2510, 2506, 2520, 2525, 2533, 2539, - 2547, 2551, 5518, 5490, 5497, 5487, 2558, 2561, 5496, 5481, - 2566, 2570, 2585, 2589, 2580, 2599, 2603, 2606, 5480, 2614, - - 2625, 5504, 7795, 7795, 562, 5460, 7795, 5501, 5488, 5438, - 7795, 7795, 5435, 5430, 5439, 2628, 2634, 7795, 2637, 1316, - 5432, 5421, 5439, 5420, 5423, 5409, 5417, 5409, 5405, 239, - 5419, 5393, 5408, 5403, 5404, 1510, 5388, 5384, 711, 5397, - 2640, 2647, 7795, 7795, 2660, 5416, 2663, 2667, 7795, 2671, - 5374, 2690, 7795, 7795, 2678, 2698, 2706, 2709, 2712, 5387, - 2727, 5384, 2730, 2733, 7795, 2736, 761, 5370, 2739, 5369, - 2745, 2757, 7795, 2760, 5368, 2764, 7795, 7795, 5358, 2772, - 2779, 7795, 2782, 5351, 5363, 5343, 5338, 5309, 5308, 5306, - 5309, 5314, 2785, 2792, 7795, 7795, 5300, 5310, 2803, 2808, - - 7795, 2811, 5295, 5279, 5299, 5281, 2815, 7795, 7795, 2823, - 2830, 7795, 7795, 2841, 2844, 5263, 5262, 5265, 5257, 5250, - 5241, 2852, 2855, 7795, 2859, 5236, 5232, 5217, 5225, 2862, - 7795, 7795, 2878, 2881, 5211, 5209, 5212, 2889, 2892, 7795, - 2896, 5211, 2899, 7795, 7795, 2911, 2915, 7795, 2918, 5179, - 2930, 7795, 7795, 5187, 5188, 5189, 2921, 2926, 7795, 2940, - 2948, 2952, 2960, 2966, 5187, 2974, 2978, 7795, 2985, 5180, - 2981, 2993, 5171, 5170, 2988, 3006, 5168, 3014, 3017, 7795, - 3020, 5169, 3023, 7795, 7795, 3039, 3042, 7795, 3045, 3048, - 3052, 5152, 5147, 3067, 3070, 3078, 3085, 7795, 3088, 5143, - - 3091, 5157, 5137, 3097, 3100, 7795, 3109, 5134, 5141, 3112, - 3119, 7795, 3122, 3131, 7795, 7795, 3141, 3144, 7795, 3150, - 3153, 7795, 7795, 5140, 3163, 3170, 7795, 3176, 485, 3182, - 7795, 7795, 5169, 5168, 5129, 5115, 3185, 5107, 5110, 5103, - 5100, 5097, 1702, 1956, 1885, 5099, 5098, 1891, 5088, 5095, - 5088, 5078, 5071, 5065, 1945, 5077, 5072, 3189, 3195, 5065, - 5094, 3210, 5057, 3213, 7795, 7795, 3221, 3225, 3233, 7795, - 7795, 5056, 3241, 3244, 5042, 3252, 2020, 5033, 3255, 3260, - 3273, 3276, 5027, 5022, 3279, 7795, 5005, 5006, 2023, 2161, - 5017, 5006, 5001, 5004, 4994, 3282, 3285, 3303, 3306, 3309, - - 4993, 3312, 4973, 4985, 3315, 3333, 3341, 7795, 7795, 3349, - 4956, 4977, 4963, 4960, 4935, 3353, 4956, 3356, 4936, 4938, - 3360, 7795, 7795, 3368, 4929, 4940, 3375, 4930, 3378, 4928, - 4920, 4908, 3381, 3386, 3390, 7795, 7795, 3399, 7795, 7795, - 4901, 3407, 2528, 3411, 7795, 7795, 4899, 4910, 3419, 7795, - 7795, 4893, 3428, 4891, 3431, 3450, 7795, 7795, 4886, 4901, - 3458, 7795, 7795, 3435, 4893, 3439, 3466, 4872, 4890, 3474, - 4876, 3477, 3483, 3489, 3495, 3498, 315, 4915, 3502, 7795, - 4913, 7795, 7795, 4870, 4869, 3508, 4851, 4864, 4841, 4853, - 4849, 2332, 2674, 4844, 3513, 4831, 4826, 3517, 4830, 3527, - - 3530, 4834, 4827, 4822, 3533, 4808, 3536, 3543, 7795, 7795, - 4815, 4824, 3554, 4796, 3561, 7795, 7795, 4802, 3573, 7795, - 7795, 4791, 3583, 3586, 4790, 3591, 1601, 1781, 3602, 3606, - 3614, 4790, 4779, 4764, 4760, 3620, 3623, 3626, 3629, 3633, - 4771, 4742, 3637, 7795, 7795, 3645, 3648, 3656, 3659, 4748, - 3667, 4750, 3670, 3674, 3682, 4730, 3693, 7795, 7795, 3701, - 3704, 3712, 4735, 4734, 4733, 3715, 3719, 4736, 3722, 3726, - 3734, 4723, 3740, 3743, 4721, 4715, 3752, 4702, 3758, 4696, - 4674, 4690, 3761, 3764, 4689, 3772, 4663, 3779, 4676, 3785, - 3791, 3794, 3798, 4668, 3803, 3812, 3817, 3822, 4662, 3831, - - 7795, 7795, 4652, 4641, 3825, 4632, 3844, 3851, 3865, 3869, - 3872, 3877, 3890, 870, 795, 199, 7795, 4619, 3893, 3896, - 4628, 4619, 4640, 4612, 3899, 4601, 4588, 4586, 3902, 3905, - 3911, 3915, 4599, 3918, 3925, 4580, 4577, 3928, 4559, 4535, - 4561, 3931, 4510, 3934, 4512, 3937, 3940, 4542, 4526, 845, - 4525, 4534, 4509, 911, 4492, 3943, 7795, 7795, 3952, 4452, - 3958, 4441, 4374, 3961, 3964, 4349, 4264, 3967, 7795, 7795, - 3976, 4264, 4209, 4175, 3984, 7795, 4085, 3987, 7795, 7795, - 3999, 4003, 4066, 4011, 7795, 7795, 4019, 4022, 4030, 4074, - 4002, 4033, 4037, 4051, 3942, 4054, 7795, 7795, 4062, 4066, - - 3926, 4074, 7795, 7795, 3902, 3866, 4082, 7795, 3862, 4085, - 3783, 4088, 41, 4091, 323, 332, 399, 4106, 7795, 537, - 4109, 597, 4112, 4115, 4130, 4135, 652, 4143, 649, 4149, - 4152, 4155, 4163, 4170, 4181, 655, 687, 723, 4184, 720, - 4187, 7795, 7795, 4195, 4203, 4210, 7795, 7795, 4218, 7795, - 1114, 902, 869, 781, 4222, 4225, 4233, 4240, 801, 825, - 4252, 4257, 894, 896, 4260, 4263, 4266, 983, 4269, 4272, - 4275, 4278, 985, 991, 1090, 4281, 7795, 1072, 4284, 4287, - 1090, 4302, 4305, 4308, 1122, 1137, 1140, 1148, 1171, 1194, - 1198, 1198, 1205, 1200, 4316, 1181, 4323, 4326, 4335, 1192, - - 4341, 1212, 1219, 1325, 1391, 1235, 1236, 4344, 7795, 7795, - 1239, 4352, 7795, 7795, 4360, 4366, 1247, 1278, 4374, 7795, - 7795, 4382, 1304, 4385, 7795, 7795, 1308, 1314, 1325, 1319, - 4393, 1347, 4396, 4401, 1373, 1366, 1457, 1468, 1373, 1390, - 4414, 7795, 1383, 4417, 7795, 7795, 4426, 7795, 7795, 1394, - 4434, 1386, 4437, 4440, 7795, 7795, 4449, 7795, 7795, 4457, - 4460, 1395, 1390, 4463, 1384, 4466, 4469, 4472, 1473, 1498, - 4478, 4494, 7795, 7795, 4503, 4506, 4509, 1401, 4512, 4515, - 4518, 4522, 1435, 4528, 4531, 1437, 1435, 7795, 4534, 4537, - 7795, 7795, 1483, 4545, 7795, 4548, 7795, 7795, 1533, 1519, - - 1535, 1530, 1542, 1548, 1540, 1555, 1551, 1558, 4556, 1548, - 4564, 7795, 7795, 4575, 1548, 1568, 1574, 1601, 1629, 1612, - 1635, 1593, 1590, 1594, 4578, 7795, 7795, 1588, 1614, 4586, - 1625, 1637, 1629, 1640, 1641, 4589, 7795, 4592, 4595, 7795, - 7795, 1639, 1638, 1674, 1701, 1697, 1730, 1694, 1699, 4610, - 1701, 4613, 4617, 4621, 4624, 4627, 4645, 4653, 1698, 4656, - 4635, 4659, 4663, 7795, 4667, 1744, 1856, 4671, 4686, 4689, - 1686, 4692, 4695, 1696, 1697, 1709, 4698, 4701, 1748, 1764, - 1760, 1780, 1771, 1788, 1784, 1781, 1795, 1799, 1827, 4709, - 1804, 1804, 1806, 1808, 1874, 7795, 1876, 7795, 4712, 1823, - - 1848, 1867, 4716, 4719, 7795, 1860, 1866, 1879, 4730, 1879, - 4734, 4738, 1896, 1895, 1897, 1955, 7795, 1953, 7795, 4748, - 1920, 4752, 1941, 4755, 7795, 4758, 4762, 4770, 4776, 4779, - 7795, 7795, 4789, 4795, 4803, 4807, 7795, 4810, 4813, 1986, - 2057, 2008, 4816, 7795, 1948, 1950, 1954, 4821, 4826, 2102, - 2241, 1950, 1983, 1993, 1992, 1996, 2014, 2036, 2045, 2045, - 2050, 2064, 4835, 4839, 2026, 2008, 4843, 7795, 7795, 4846, - 4850, 2013, 2024, 2031, 4864, 4867, 2021, 4875, 2038, 4878, - 4882, 4896, 4899, 7795, 7795, 2039, 2086, 2085, 7795, 7795, - 4907, 4910, 4918, 4921, 4925, 2354, 2393, 4939, 7795, 4942, - - 4945, 7795, 7795, 4953, 4961, 4971, 7795, 2141, 2197, 2305, - 4974, 2092, 2096, 4977, 4980, 2118, 2122, 2161, 2121, 2126, - 2407, 2128, 2167, 2168, 2167, 2174, 7795, 2194, 2178, 2177, - 2217, 7795, 4990, 4995, 4998, 5009, 5013, 5016, 5019, 5027, - 7795, 7795, 2217, 2206, 2259, 5035, 7795, 7795, 2263, 5043, - 5046, 2267, 5054, 7795, 7795, 5062, 5065, 2260, 5073, 2275, - 5076, 7795, 7795, 5084, 5087, 5095, 5098, 2301, 2304, 2307, - 2310, 2313, 2353, 5106, 5109, 7795, 7795, 2380, 2405, 5117, - 5120, 2325, 2327, 5125, 7795, 7795, 2377, 2367, 2374, 2382, - 2404, 2396, 2397, 2407, 5136, 2408, 2433, 2456, 2441, 2428, - - 2450, 2464, 2454, 5140, 5143, 7795, 7795, 5154, 5159, 5162, - 2423, 5170, 7795, 7795, 2425, 2422, 2417, 2442, 5178, 7795, - 7795, 2429, 5186, 7795, 7795, 2465, 5194, 5197, 2448, 5205, - 2511, 2576, 5213, 2579, 2623, 2482, 2503, 2533, 2502, 2522, - 2550, 5221, 2559, 5224, 5227, 5230, 5249, 5252, 2531, 2549, - 2555, 2555, 2561, 2571, 2595, 2586, 5255, 5258, 2604, 2616, - 7795, 2617, 2623, 2625, 7795, 2630, 5266, 5269, 7795, 7795, - 2615, 2627, 2628, 5277, 2631, 5280, 5285, 5288, 7795, 7795, - 5298, 2653, 2669, 2662, 2677, 2669, 2680, 2681, 2693, 2688, - 2698, 7795, 2691, 2701, 7795, 5303, 7795, 2731, 5306, 5309, - - 5318, 5338, 5385, 5328, 5332, 2719, 2739, 2746, 2714, 2730, - 2748, 2760, 2731, 5358, 7795, 7795, 2766, 2745, 2746, 2781, - 2758, 2767, 5349, 2744, 2749, 2765, 5376, 5368, 2761, 5379, - 5405, 5397, 5415, 5423, 5431, 2816, 2790, 2821, 2796, 2831, - 2799, 2831, 2802, 2843, 2845, 2843, 2858, 2906, 5441, 2868, - 2869, 5461, 5508, 2855, 7795, 7795, 2832, 2859, 7795, 7795, - 2838, 7795, 2880, 2898, 7795, 2897, 2898, 5426, 7795, 2857, - 2858, 2865, 5449, 2918, 2920, 2887, 5481, 2926, 3036, 5489, - 7795, 7795, 5497, 3039, 3057, 7795, 2942, 7795, 2957, 7795, - 2967, 7795, 2965, 7795, 7795, 7795, 7795, 2973, 3008, 2983, - - 3000, 3048, 3002, 5519, 2998, 3004, 3016, 3009, 7795, 7795, - 7795, 7795, 5528, 5531, 5534, 3042, 3007, 3087, 3009, 5539, - 2998, 3031, 3036, 3068, 3097, 3078, 3108, 3089, 7795, 7795, - 7795, 7795, 5542, 3121, 3110, 3127, 5557, 3135, 3128, 3149, - 3138, 5561, 5564, 5572, 5579, 5590, 5593, 3123, 3135, 3147, - 3135, 3143, 3159, 5601, 5609, 3149, 3172, 3162, 3178, 3166, - 3174, 3187, 3170, 3185, 3198, 5604, 3201, 7795, 3192, 7795, - 3198, 5619, 7795, 7795, 5627, 7795, 7795, 5635, 3263, 3293, - 3196, 3208, 3211, 3214, 3232, 3229, 5643, 7795, 7795, 3235, - 3232, 3238, 3235, 3256, 3262, 3259, 3261, 3267, 3265, 3301, - - 7795, 3317, 3315, 3304, 3299, 3308, 3304, 3308, 3315, 3315, - 3318, 3324, 3335, 3340, 3341, 3349, 3360, 3361, 3372, 3378, - 3377, 3387, 3390, 3426, 7795, 7795, 3378, 3402, 3386, 3414, - 3410, 3408, 3425, 3420, 3422, 3441, 3430, 3448, 3441, 3458, - 3451, 3454, 3482, 3471, 3472, 3498, 3504, 3489, 3489, 3504, - 3504, 3522, 3513, 3547, 3528, 3522, 3551, 3529, 3562, 3532, - 3563, 3547, 3543, 3575, 3557, 3554, 3587, 3593, 3568, 3573, - 3571, 3576, 3605, 3581, 7795, 3611, 3605, 7795, 3609, 7795, - 3611, 7795, 3647, 3622, 7795, 3647, 3633, 7795, 3659, 3644, - 3657, 3651, 3665, 7795, 3666, 7795, 3674, 3683, 3685, 7795, - - 3686, 7795, 3701, 5651, 3707, 3734, 3722, 3741, 3707, 3713, - 3714, 3725, 3727, 3733, 5654, 3773, 7795, 3775, 7795, 3779, - 3781, 3785, 3794, 3802, 3800, 3802, 3821, 7795, 7795, 7795, - 7795, 7795, 7795, 7795, 7795, 3797, 3823, 3928, 3963, 3819, - 3824, 3836, 3845, 3818, 3850, 3972, 3996, 3961, 3978, 3792, - 3954, 3864, 3990, 3974, 4027, 4031, 4041, 4022, 4042, 4078, - 4083, 4157, 4183, 4105, 4107, 4047, 4155, 4108, 4232, 4175, - 4237, 4123, 4191, 4128, 4198, 4197, 4219, 4277, 4295, 4172, - 4272, 4275, 4301, 4303, 4351, 3999, 4025, 4354, 4362, 4339, - 4370, 4391, 4413, 4329, 4389, 4361, 4425, 4428, 4551, 4120, - - 4430, 4296, 4337, 4479, 4535, 4565, 4585, 4279, 4522, 4411, - 4473, 4555, 4582, 4053, 4182, 4583, 4612, 4482, 4405, 5662, - 5665, 7795, 7795, 5685, 5694, 5703, 5712, 5721, 5730, 5739, - 5748, 5757, 5766, 5775, 5784, 5793, 5802, 5811, 5820, 5829, - 5838, 5847, 5856, 5865, 5874, 5883, 5892, 5901, 5910, 5919, - 5928, 5937, 5946, 5955, 5964, 5973, 5982, 5991, 6000, 6009, - 6018, 6027, 6036, 6043, 6050, 6057, 6064, 6071, 6078, 6085, - 6092, 6099, 6106, 6113, 6120, 6127, 6134, 6141, 6148, 6155, - 6162, 6171, 6178, 6183, 6190, 6195, 6202, 6207, 6214, 6219, - 6226, 6231, 6236, 6243, 6248, 6255, 6260, 6267, 6272, 6279, - - 6284, 6291, 6296, 6303, 6308, 6315, 6320, 6327, 6332, 6339, - 6344, 6351, 6356, 6363, 6368, 6375, 6380, 6389, 6395, 6402, - 6410, 6417, 6425, 6432, 6440, 6447, 6455, 6462, 6470, 6477, - 6485, 6492, 6500, 6507, 6515, 6522, 6530, 6537, 6545, 6553, - 6561, 6569, 6577, 6584, 6592, 6600, 6608, 6615, 6623, 6630, - 6638, 6646, 6653, 6661, 6670, 6676, 6683, 6691, 6699, 6707, - 6714, 6722, 6729, 6737, 6744, 6752, 6759, 6767, 6774, 6782, - 6789, 6797, 6804, 6812, 6819, 6827, 6834, 6842, 6849, 6857, - 6864, 6872, 6879, 6887, 6894, 6902, 6909, 6917, 6925, 6932, - 6940, 6949, 6958, 6965, 6973, 6980, 6988, 6995, 7003, 7010, - - 7018, 7025, 7032, 7040, 7047, 7055, 7062, 7070, 7077, 7085, - 7092, 7100, 7107, 7115, 7122, 7130, 7137, 7145, 7152, 7160, - 7167, 7175, 7183, 7191, 7199, 7207, 7215, 7224, 7233, 7240, - 7248, 7255, 7263, 7270, 7278, 7285, 7293, 7300, 7307, 7315, - 7322, 7330, 7337, 7345, 7352, 7360, 7367, 7375, 7382, 7390, - 7398, 7406, 7413, 7421, 7429, 7437, 7444, 7452, 7460, 7468, - 7476, 7485, 7494, 7502, 7510, 7517, 7525, 7532, 7540, 7548, - 7556, 7563, 7570, 7577, 7585, 7592, 7599, 7607, 7614, 7621, - 7629, 7636, 7644, 7651, 7659, 7667, 7674, 7682, 7690, 7698, - 7707, 7716, 7724, 7731, 7740, 7749, 7758, 7767, 7776, 7785 - + 239, 256, 274, 328, 294, 297, 382, 445, 305, 351, + 508, 574, 300, 354, 358, 361, 402, 405, 408, 412, + 640, 707, 415, 465, 774, 839, 468, 471, 475, 478, + 528, 531, 534, 538, 541, 594, 597, 600, 604, 607, + 660, 663, 666, 670, 673, 727, 730, 733, 737, 740, + 794, 797, 800, 804, 807, 859, 904, 970, 862, 865, + + 869, 872, 924, 927, 930, 934, 1036, 0, 990, 993, + 1108, 0, 996, 1000, 1180, 1237, 1200, 1203, 1294, 1360, + 1206, 1210, 1257, 1260, 1263, 1267, 1314, 1317, 1426, 1492, + 1320, 1324, 1327, 1380, 1383, 1386, 1390, 1393, 1558, 1624, + 1446, 1449, 1452, 1456, 1459, 1512, 1515, 1518, 1690, 1747, + 1522, 1525, 1804, 1870, 1578, 1581, 1584, 1588, 1591, 1644, + 1647, 1650, 1936, 2002, 1654, 1657, 1710, 1713, 1716, 1720, + 1723, 1767, 2068, 2137, 1770, 1773, 2206, 2263, 1777, 1780, + 1824, 1827, 1830, 1834, 1837, 1890, 2320, 2389, 1893, 1896, + 0, 0, 6568, 8061, 8061, 95, 100, 29, 41, 8061, + + 103, 51, 8061, 8061, 6553, 8061, 8061, 6542, 8061, 6557, + 6555, 498, 8061, 8061, 8061, 8061, 6553, 6553, 6504, 145, + 8061, 161, 6530, 0, 146, 8061, 6496, 8061, 166, 2454, + 88, 204, 205, 254, 6534, 3, 8061, 169, 6525, 0, + 153, 8061, 6487, 8061, 260, 419, 8061, 322, 6519, 0, + 244, 8061, 6481, 6485, 6481, 420, 6486, 8061, 364, 6512, + 0, 248, 8061, 6474, 6474, 257, 6476, 360, 8061, 440, + 31, 6510, 6458, 8061, 567, 6500, 0, 306, 8061, 6456, + 6457, 6448, 8061, 624, 482, 8061, 633, 6490, 0, 416, + 8061, 6457, 6446, 8061, 692, 1908, 1909, 6444, 35, 6480, + + 240, 135, 740, 691, 59, 6489, 152, 8061, 697, 6478, + 0, 417, 8061, 6428, 6434, 6439, 6428, 6422, 8061, 702, + 6474, 181, 8061, 764, 6465, 0, 479, 8061, 6415, 300, + 6417, 6426, 6428, 185, 436, 439, 8061, 767, 546, 8061, + 824, 6454, 0, 483, 8061, 6404, 6402, 6405, 6414, 6416, + 6400, 6394, 8061, 830, 611, 8061, 833, 6440, 0, 543, + 8061, 6393, 6402, 8061, 889, 612, 8061, 895, 6433, 0, + 545, 8061, 6401, 6397, 6399, 434, 8061, 898, 6431, 210, + 8061, 937, 6422, 0, 609, 8061, 6375, 279, 8061, 954, + 626, 6426, 6378, 8061, 960, 6416, 0, 752, 8061, 6365, + + 6360, 306, 8061, 1003, 6417, 560, 8061, 1020, 6406, 0, + 808, 8061, 6368, 6372, 8061, 1026, 1211, 8061, 1231, 6399, + 0, 809, 8061, 6352, 6347, 6349, 8061, 1270, 6401, 690, + 8061, 1287, 6392, 0, 873, 8061, 6339, 6344, 6348, 6335, + 8061, 1344, 304, 512, 310, 8061, 1352, 6381, 0, 874, + 8061, 6351, 8061, 1355, 1331, 8061, 1410, 6375, 0, 938, + 8061, 6342, 8061, 1418, 6381, 527, 8061, 1421, 6370, 0, + 939, 8061, 6337, 6339, 8061, 1477, 1397, 1480, 451, 6312, + 8061, 6372, 6361, 8061, 8061, 8061, 1474, 317, 6311, 6310, + 6308, 6351, 6311, 8061, 0, 6304, 6303, 6326, 6299, 6287, + + 620, 6296, 6296, 6297, 30, 697, 6288, 621, 963, 6313, + 702, 6286, 967, 6273, 757, 1227, 1482, 8061, 0, 6278, + 6279, 8061, 0, 6272, 1899, 6265, 646, 6262, 6304, 8061, + 0, 6262, 1958, 6251, 6268, 6255, 6263, 6257, 6257, 6243, + 1489, 8061, 0, 6250, 6241, 6252, 6229, 8061, 0, 1966, + 6227, 6272, 6250, 6216, 6225, 6225, 1168, 6242, 1288, 1354, + 8061, 0, 6231, 819, 1976, 6205, 6225, 6217, 8061, 0, + 6219, 6219, 2022, 6201, 2025, 6194, 6190, 6206, 6202, 6185, + 6203, 6198, 6192, 6194, 8061, 0, 6191, 6191, 6176, 2028, + 6166, 6162, 6182, 6163, 8061, 0, 6163, 2031, 6159, 8061, + + 0, 6158, 2034, 6151, 6168, 6163, 6152, 8061, 0, 6143, + 5776, 5766, 5759, 5766, 8061, 0, 5755, 5773, 5769, 5759, + 5796, 8061, 0, 5751, 2088, 5756, 8061, 0, 5746, 5757, + 5753, 5752, 8061, 0, 5732, 5725, 5727, 5736, 5720, 5713, + 8061, 0, 5718, 5722, 8061, 0, 2091, 5718, 8061, 0, + 2094, 5709, 5703, 5741, 5750, 929, 5695, 8061, 1536, 0, + 5691, 5690, 5726, 5725, 5678, 8061, 5690, 5663, 1903, 2100, + 1553, 5673, 5663, 5650, 5656, 5649, 5659, 5648, 5654, 5657, + 5640, 5640, 5631, 5649, 5635, 5592, 1612, 5581, 5596, 5593, + 5582, 5590, 5585, 2097, 2161, 5583, 2158, 1678, 5570, 5602, + + 2165, 2168, 8061, 5572, 2171, 1858, 2176, 5563, 2226, 5565, + 5569, 5562, 2234, 2237, 5547, 5547, 5554, 5548, 2240, 2285, + 2288, 2119, 5531, 2291, 2297, 1618, 5533, 5525, 5523, 5515, + 1798, 5513, 5505, 5514, 5505, 5515, 2294, 2127, 5501, 5471, + 2340, 2343, 5477, 1170, 2300, 2190, 5479, 2349, 2352, 2367, + 5478, 5475, 5467, 5456, 5456, 5445, 5453, 2409, 2412, 5449, + 953, 5430, 2415, 2370, 2418, 5441, 5425, 2421, 2424, 5426, + 2436, 2378, 2445, 2450, 5434, 2459, 2477, 5422, 5409, 5405, + 2465, 2470, 2489, 2495, 2520, 2498, 2526, 5397, 2529, 2532, + 2538, 2541, 2550, 2561, 5404, 2564, 2569, 2583, 2587, 2590, + + 2593, 2602, 2611, 2614, 5404, 5386, 5393, 5385, 2620, 2623, + 5390, 5369, 2626, 2633, 2645, 2648, 2658, 2663, 2666, 2670, + 5368, 2687, 2690, 5406, 8061, 8061, 989, 5366, 8061, 5406, + 5392, 5342, 8061, 8061, 5338, 5335, 5343, 2693, 2697, 8061, + 2700, 1741, 5336, 5329, 5346, 5315, 5326, 5311, 5313, 5312, + 5300, 5297, 819, 5310, 5287, 5301, 5297, 5297, 1924, 5278, + 5284, 5276, 884, 5285, 2712, 2719, 2724, 8061, 2730, 2733, + 2678, 8061, 8061, 2738, 5310, 2743, 2756, 8061, 2762, 5268, + 2765, 8061, 8061, 2775, 2781, 2789, 2793, 2800, 5277, 2811, + 5274, 2814, 2817, 8061, 2820, 903, 5270, 2823, 5268, 2829, + + 2841, 8061, 2844, 2848, 8061, 8061, 5260, 2856, 2863, 8061, + 2866, 5253, 5254, 5235, 5239, 5229, 5223, 5218, 5225, 5222, + 2869, 2876, 8061, 8061, 5208, 5210, 2887, 2892, 8061, 2895, + 5203, 5182, 5202, 5185, 2899, 8061, 8061, 2907, 2914, 8061, + 8061, 2925, 2928, 5175, 5181, 5178, 5174, 5164, 5158, 5153, + 2936, 2939, 8061, 2943, 5149, 5142, 5134, 5148, 2946, 8061, + 8061, 2962, 2965, 5130, 5139, 2973, 2976, 8061, 2980, 5138, + 2983, 8061, 8061, 2995, 2999, 8061, 3002, 5101, 3014, 8061, + 8061, 5105, 5107, 5110, 3005, 3010, 8061, 3024, 3032, 3036, + 3044, 3050, 5108, 3058, 3062, 8061, 3069, 5089, 3065, 3077, + + 5079, 5079, 3072, 3090, 5089, 3098, 3101, 8061, 3104, 5086, + 3107, 8061, 8061, 3123, 3126, 8061, 3129, 3132, 3136, 5070, + 5069, 3151, 3154, 3162, 3169, 8061, 3172, 5062, 3175, 5080, + 5059, 3181, 3184, 8061, 3193, 5047, 5061, 3196, 3203, 8061, + 3206, 3215, 8061, 8061, 3225, 3228, 8061, 3234, 3237, 8061, + 8061, 5059, 3247, 3254, 8061, 3260, 732, 3266, 8061, 8061, + 5094, 5092, 5054, 5044, 3269, 5026, 5033, 5017, 5015, 5023, + 1930, 5004, 1994, 1984, 5017, 5016, 1997, 5004, 5012, 5010, + 4994, 4988, 4981, 4972, 2059, 4986, 4984, 3273, 3279, 3294, + 3297, 3300, 4980, 5009, 3308, 4980, 3315, 8061, 8061, 3323, + + 3328, 3337, 8061, 8061, 4977, 3345, 3348, 4971, 3358, 2062, + 4958, 3363, 3366, 3377, 3381, 4946, 3384, 8061, 4936, 4936, + 2198, 2201, 4940, 4922, 4921, 4914, 4905, 3387, 3391, 3405, + 3409, 3413, 4911, 3416, 4885, 4901, 3419, 3437, 3445, 8061, + 8061, 3423, 4874, 4893, 4860, 4863, 4874, 4850, 3456, 4870, + 3459, 4850, 4858, 3462, 8061, 8061, 3470, 4864, 3479, 4838, + 3482, 4836, 4841, 4825, 3488, 3492, 3502, 8061, 8061, 3511, + 8061, 8061, 4817, 3521, 3427, 3524, 8061, 8061, 4816, 4826, + 3536, 8061, 8061, 4809, 3544, 4804, 3549, 3552, 8061, 8061, + 4798, 4813, 3564, 8061, 8061, 3572, 4805, 3575, 3578, 4770, + + 4788, 3593, 4773, 3596, 3599, 3606, 3614, 3620, 718, 4812, + 3625, 8061, 4810, 8061, 8061, 4767, 4763, 3628, 4753, 4763, + 4738, 4749, 4742, 2244, 4743, 2312, 4743, 2485, 4729, 4720, + 2492, 4724, 3587, 3632, 4718, 4702, 4707, 4707, 3635, 4691, + 3639, 3647, 8061, 8061, 3655, 3659, 8061, 8061, 4698, 4712, + 3668, 4668, 3687, 8061, 8061, 4675, 3695, 8061, 8061, 4659, + 3682, 3703, 4656, 3706, 1574, 1820, 3714, 3722, 3732, 4667, + 4653, 4646, 3735, 3738, 3743, 3746, 3751, 4661, 4648, 3754, + 8061, 8061, 3762, 3765, 3773, 3780, 4654, 3776, 4656, 3791, + 3795, 3803, 4635, 3811, 8061, 8061, 3821, 3824, 3832, 4639, + + 4645, 4637, 4636, 3835, 3839, 4617, 3842, 3846, 3854, 4580, + 3860, 3863, 4586, 3872, 4577, 3878, 4581, 4560, 4575, 3881, + 3884, 4575, 3892, 4562, 3899, 4573, 3905, 3911, 3914, 3918, + 4566, 3923, 3932, 3937, 3942, 4555, 3951, 8061, 8061, 4532, + 4517, 3945, 4519, 3964, 3971, 3985, 3989, 3992, 3997, 4010, + 818, 1273, 670, 8061, 4505, 4013, 4016, 4513, 4490, 4512, + 4482, 4019, 4492, 4445, 4445, 4430, 4022, 4025, 4031, 4035, + 4440, 4038, 4045, 4414, 4409, 4375, 4048, 4388, 4051, 4331, + 4359, 4054, 4317, 4057, 4306, 4060, 4063, 4289, 4264, 583, + 4236, 4235, 4167, 1189, 4145, 4066, 8061, 8061, 4081, 4085, + + 4044, 4035, 4088, 4091, 3925, 3739, 4096, 8061, 8061, 4104, + 112, 139, 163, 4112, 8061, 250, 4115, 8061, 8061, 4123, + 4131, 324, 4141, 8061, 8061, 4149, 4152, 4160, 377, 387, + 440, 4163, 4167, 4181, 503, 4184, 8061, 8061, 4192, 4196, + 622, 4204, 8061, 8061, 640, 4212, 8061, 768, 4215, 756, + 4218, 776, 4221, 852, 853, 846, 4236, 8061, 863, 4239, + 879, 4242, 4245, 4260, 4265, 911, 4273, 907, 4279, 4282, + 4285, 4293, 4300, 4311, 925, 941, 974, 4314, 973, 4317, + 8061, 8061, 4325, 4333, 4340, 8061, 8061, 4348, 8061, 1256, + 1202, 1466, 975, 4352, 4355, 4363, 4370, 1129, 1153, 4382, + + 4387, 4390, 1164, 1208, 4393, 4396, 4399, 1215, 4402, 4405, + 4408, 4411, 4414, 1217, 4417, 1230, 1264, 4420, 8061, 1260, + 4423, 4427, 1284, 4441, 4444, 4447, 1304, 1310, 1336, 1356, + 1356, 1365, 1366, 1375, 1407, 1414, 4455, 4462, 4465, 4474, + 1403, 4480, 1407, 1401, 1573, 1628, 1410, 1412, 4483, 8061, + 8061, 1414, 4491, 8061, 8061, 4499, 4505, 1424, 1422, 1431, + 4513, 8061, 8061, 4521, 1432, 4524, 8061, 8061, 1441, 1464, + 1465, 4532, 1478, 4535, 4540, 1483, 1483, 1639, 1651, 1493, + 1523, 4553, 8061, 1528, 4556, 8061, 8061, 4565, 8061, 8061, + 1547, 4573, 1540, 4576, 4579, 8061, 8061, 4588, 8061, 8061, + + 4596, 4599, 1559, 1557, 4602, 1552, 4605, 4608, 4611, 1644, + 1603, 4617, 4633, 8061, 8061, 4642, 4645, 4648, 1572, 4651, + 4654, 4657, 4661, 4667, 1606, 4670, 4673, 4676, 1612, 4679, + 1618, 8061, 4682, 4685, 8061, 8061, 1621, 4693, 8061, 4701, + 8061, 8061, 1664, 1681, 1703, 1698, 1706, 1708, 1695, 1713, + 1708, 1720, 4712, 4715, 8061, 8061, 4723, 1695, 1721, 1733, + 1760, 1783, 1763, 1783, 1743, 1740, 1748, 4727, 8061, 8061, + 4735, 1758, 1782, 4738, 1787, 1793, 1794, 1801, 4741, 8061, + 4744, 4747, 8061, 8061, 1801, 1803, 1839, 1862, 1842, 1877, + 1851, 1860, 4762, 1861, 4765, 4768, 4773, 4776, 4779, 4797, + + 4786, 1859, 4805, 4808, 4811, 4815, 8061, 4819, 1932, 1909, + 4824, 4838, 4841, 1846, 4844, 4847, 1854, 1858, 4850, 8061, + 1852, 4853, 4857, 1878, 1920, 1917, 1936, 1926, 1937, 1938, + 1941, 1956, 1945, 1980, 4865, 1972, 1973, 1977, 2039, 8061, + 2037, 8061, 4871, 1984, 2004, 4877, 4885, 1995, 4895, 4898, + 8061, 1988, 1991, 4901, 1993, 4904, 4907, 2013, 2025, 2046, + 2100, 8061, 2099, 8061, 4925, 2050, 4928, 2052, 4931, 8061, + 4934, 4937, 4945, 4952, 4955, 8061, 8061, 4964, 4967, 4975, + 4978, 8061, 4982, 4985, 2107, 2096, 2114, 4988, 8061, 2059, + 2065, 2066, 4993, 4997, 2324, 2340, 2062, 2096, 2110, 2111, + + 2160, 2180, 2157, 2167, 2167, 2175, 2189, 5007, 2178, 2160, + 5011, 8061, 8061, 5014, 5019, 2162, 2172, 5032, 8061, 8061, + 2193, 5040, 5043, 2179, 5051, 5054, 5058, 5072, 5075, 8061, + 8061, 2198, 2203, 2201, 8061, 8061, 5083, 5086, 5094, 5097, + 5101, 2683, 2713, 5115, 8061, 5118, 5121, 8061, 8061, 5129, + 5137, 5147, 8061, 2259, 2423, 2486, 5150, 2208, 2210, 5153, + 5156, 2224, 2249, 2429, 2268, 2276, 2485, 2257, 2323, 2315, + 2319, 2341, 8061, 2360, 2346, 2385, 2389, 8061, 5166, 5171, + 5174, 5177, 5185, 5195, 8061, 8061, 2385, 2380, 2394, 5203, + 8061, 8061, 2402, 5211, 5214, 5222, 8061, 8061, 5230, 5233, + + 2397, 5241, 2406, 5244, 8061, 8061, 5252, 5255, 5263, 5266, + 2424, 2446, 2472, 2479, 2480, 2488, 5274, 5277, 8061, 8061, + 2535, 2506, 5285, 5180, 2470, 2471, 5289, 8061, 8061, 2527, + 2515, 2521, 2530, 2537, 2527, 2534, 2546, 5297, 2536, 2555, + 2573, 2560, 2559, 2586, 2601, 2589, 5304, 5307, 5310, 5316, + 2565, 5328, 8061, 8061, 2566, 2573, 2561, 2584, 5336, 8061, + 8061, 5344, 8061, 8061, 2586, 5354, 5357, 2569, 5365, 2674, + 2708, 5373, 2716, 2727, 2599, 2620, 2650, 2615, 2628, 2662, + 5381, 2657, 5384, 5387, 5390, 5409, 5412, 2640, 2679, 2681, + 2673, 2694, 2704, 2731, 2731, 5415, 5418, 2744, 2745, 8061, + + 2750, 2757, 2758, 8061, 2759, 5426, 5429, 8061, 8061, 2741, + 2742, 2744, 5437, 2748, 5440, 5445, 8061, 8061, 5458, 2771, + 2784, 2792, 2803, 2799, 2810, 2802, 2813, 2806, 2827, 8061, + 2820, 2830, 8061, 5461, 8061, 2842, 5464, 5467, 5476, 5496, + 5543, 5486, 5507, 2838, 2868, 2869, 2837, 2859, 2878, 2883, + 2860, 5516, 8061, 8061, 2900, 2880, 2881, 2910, 2888, 2889, + 5533, 2865, 2866, 2882, 5537, 5524, 2876, 5555, 5563, 5573, + 5576, 2930, 2912, 2944, 2915, 2951, 2919, 2951, 2923, 2964, + 2966, 2964, 2979, 2990, 5591, 3023, 3012, 5611, 5658, 2976, + 8061, 8061, 2953, 2980, 8061, 8061, 2957, 8061, 3018, 3025, + + 8061, 3028, 3032, 5584, 8061, 2996, 2997, 2985, 5599, 3120, + 3123, 3005, 5631, 8061, 8061, 5639, 3141, 3154, 8061, 3071, + 8061, 3078, 8061, 3082, 8061, 3081, 8061, 8061, 8061, 8061, + 3092, 3205, 3077, 3089, 3182, 3105, 5648, 3100, 3091, 3104, + 3094, 8061, 8061, 8061, 8061, 5652, 5670, 5678, 3100, 3094, + 3126, 3115, 5681, 3181, 3132, 3192, 3183, 8061, 8061, 8061, + 8061, 5688, 3209, 3199, 3225, 5691, 3236, 3222, 3238, 3230, + 5684, 5710, 5718, 5721, 5729, 5732, 3213, 3226, 3238, 3225, + 3233, 3256, 5743, 5747, 3239, 3251, 3268, 3251, 3260, 3272, + 5755, 3285, 8061, 3273, 8061, 3274, 5761, 8061, 8061, 5770, + + 8061, 8061, 5778, 3296, 3306, 3276, 3282, 3282, 3292, 3305, + 3306, 5786, 8061, 8061, 3318, 3323, 3320, 3326, 3338, 3335, + 3354, 8061, 3370, 3368, 3370, 3369, 3380, 3374, 3375, 3389, + 3408, 3406, 3412, 3418, 3415, 3425, 3426, 3423, 3430, 3430, + 3449, 8061, 8061, 3427, 3448, 3437, 3457, 3450, 3452, 3472, + 3461, 3459, 3476, 3466, 3468, 3485, 3479, 3477, 3494, 3517, + 3484, 3491, 3494, 3494, 3508, 3498, 3537, 3533, 3523, 3553, + 3537, 3528, 3565, 3546, 3546, 3576, 3585, 3556, 3567, 3574, + 3586, 3608, 3587, 8061, 3616, 3613, 8061, 3641, 3621, 8061, + 3646, 3631, 8061, 3661, 3629, 3644, 3636, 3649, 8061, 3650, + + 8061, 3651, 8061, 3653, 8061, 3666, 5794, 3674, 3697, 3685, + 3704, 3670, 3675, 3676, 3678, 5797, 3721, 8061, 3720, 8061, + 3724, 3723, 3737, 3742, 3753, 3812, 8061, 8061, 8061, 8061, + 8061, 8061, 3752, 3780, 3811, 3891, 3739, 3869, 3771, 3943, + 3750, 3809, 3879, 3885, 3857, 3884, 3950, 4024, 3850, 3909, + 3798, 3917, 4057, 4066, 4089, 4091, 3958, 4076, 3792, 3965, + 4119, 4137, 3977, 4118, 3922, 4116, 4110, 4139, 4157, 4171, + 3908, 4059, 3970, 4169, 4103, 4208, 3982, 4189, 4213, 4233, + 4216, 4235, 3741, 4209, 4313, 4321, 4177, 4285, 4305, 4367, + 4129, 4240, 4414, 4432, 4250, 4290, 3944, 4288, 4418, 4435, + + 4434, 4440, 4318, 4415, 4270, 4468, 4349, 4493, 4501, 4509, + 4520, 4528, 4511, 4512, 4356, 3851, 5805, 5808, 8061, 8061, + 5828, 5837, 5846, 5855, 5864, 5873, 5882, 5891, 5900, 5909, + 5918, 5927, 5936, 5945, 5954, 5963, 5972, 5981, 5990, 5999, + 6008, 6017, 6026, 6035, 6044, 6053, 6062, 6071, 6080, 6089, + 6098, 6107, 6116, 6125, 6134, 6143, 6152, 6161, 6170, 6179, + 6188, 6197, 6204, 6211, 6218, 6225, 6232, 6239, 6246, 6253, + 6260, 6267, 6274, 6281, 6288, 6295, 6302, 6309, 6316, 6323, + 6330, 6339, 6346, 6351, 6358, 6363, 6370, 6375, 6382, 6387, + 6394, 6399, 6406, 6411, 6418, 6423, 6430, 6435, 6442, 6447, + + 6454, 6459, 6466, 6471, 6478, 6483, 6490, 6495, 6502, 6507, + 6514, 6519, 6526, 6531, 6538, 6543, 6550, 6555, 6562, 6567, + 6576, 6582, 6589, 6597, 6604, 6612, 6619, 6627, 6634, 6642, + 6649, 6657, 6664, 6672, 6679, 6687, 6694, 6702, 6709, 6717, + 6724, 6732, 6739, 6747, 6755, 6763, 6771, 6779, 6786, 6794, + 6802, 6810, 6817, 6825, 6832, 6840, 6848, 6855, 6863, 6872, + 6878, 6885, 6893, 6901, 6909, 6917, 6925, 6932, 6940, 6947, + 6955, 6962, 6970, 6977, 6985, 6992, 7000, 7007, 7015, 7022, + 7030, 7037, 7045, 7052, 7060, 7067, 7075, 7082, 7090, 7097, + 7105, 7112, 7120, 7127, 7135, 7143, 7150, 7158, 7167, 7176, + + 7183, 7191, 7199, 7206, 7214, 7221, 7229, 7236, 7244, 7251, + 7258, 7266, 7273, 7281, 7288, 7296, 7303, 7311, 7318, 7326, + 7333, 7341, 7348, 7356, 7363, 7371, 7378, 7386, 7393, 7401, + 7409, 7417, 7425, 7433, 7441, 7450, 7459, 7466, 7474, 7482, + 7489, 7497, 7504, 7512, 7519, 7527, 7534, 7541, 7549, 7556, + 7564, 7571, 7579, 7586, 7594, 7601, 7609, 7616, 7624, 7632, + 7640, 7647, 7655, 7663, 7671, 7678, 7686, 7694, 7702, 7710, + 7719, 7728, 7736, 7744, 7752, 7759, 7767, 7774, 7782, 7790, + 7798, 7806, 7813, 7820, 7828, 7835, 7842, 7850, 7857, 7864, + 7872, 7879, 7887, 7894, 7902, 7910, 7917, 7925, 7933, 7941, + + 7950, 7959, 7967, 7975, 7982, 7989, 7997, 8006, 8015, 8024, + 8033, 8042, 8051 } ; -static yyconst flex_int16_t yy_def[2701] = +static yyconst flex_int16_t yy_def[2714] = { 0, - 2424, 2424, 2425, 2425, 2425, 2425, 2426, 2426, 2427, 2427, - 2428, 2428, 2429, 2429, 2429, 2429, 2430, 2430, 2424, 2424, - 2431, 2431, 2432, 2432, 2432, 2432, 2424, 2424, 2432, 2432, - 2432, 2432, 2424, 2424, 2432, 2432, 2424, 2424, 2432, 2432, - 2432, 2432, 2433, 2433, 2429, 2429, 2434, 2434, 2435, 2435, - 2424, 2424, 2435, 2435, 2435, 2435, 2436, 2436, 2437, 2437, - 2438, 2438, 2439, 2439, 2439, 2439, 2424, 2424, 2439, 2439, - 2439, 2439, 2424, 2424, 2439, 2439, 2424, 2424, 2439, 2439, - 2439, 2439, 2424, 2424, 2439, 2439, 2424, 2424, 2439, 2439, - 2439, 2439, 2440, 2440, 2441, 2441, 2424, 2424, 2441, 2441, - - 2441, 2441, 2423, 103, 2442, 2442, 2423, 107, 2443, 2443, - 2444, 2444, 2445, 2445, 2446, 2446, 2447, 2447, 2424, 2424, - 2447, 2447, 2447, 2447, 2448, 2448, 2449, 2449, 2424, 2424, - 2449, 2449, 2449, 2449, 2450, 2450, 2451, 2451, 2424, 2424, - 2451, 2451, 2451, 2451, 2452, 2452, 2453, 2453, 2454, 2454, - 2455, 2455, 2424, 2424, 2455, 2455, 2455, 2455, 2456, 2456, - 2457, 2457, 2424, 2424, 2457, 2457, 2457, 2457, 2458, 2458, - 2459, 2459, 2460, 2460, 2461, 2461, 2424, 2424, 2461, 2461, - 2461, 2461, 2462, 2462, 2463, 2463, 2424, 2424, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2464, - 2423, 2423, 2464, 2423, 2423, 2423, 226, 226, 228, 226, - 229, 229, 2423, 2423, 2423, 2465, 2423, 2423, 2465, 2465, - 2465, 2423, 2423, 2423, 2423, 2423, 2466, 2423, 2423, 2466, - 2466, 2466, 2466, 2466, 2423, 2423, 229, 229, 229, 2423, - 2423, 2423, 2467, 2423, 2423, 2467, 2467, 2467, 2423, 2423, - 2423, 2423, 2423, 2423, 2468, 2423, 2423, 2468, 2468, 2468, - 2423, 2423, 230, 230, 230, 283, 284, 284, 284, 284, - 290, 291, 290, 290, 2423, 2423, 2423, 2469, 2423, 2423, - - 2469, 2469, 2469, 2469, 2469, 2423, 2423, 229, 229, 2423, - 2423, 2423, 2470, 2423, 2423, 2470, 2470, 2470, 2470, 2470, - 2470, 2470, 2470, 2423, 2423, 2423, 2423, 2423, 2423, 2471, - 2423, 2423, 2471, 2471, 2471, 2471, 2471, 2471, 2471, 2423, - 2423, 2423, 2423, 2423, 2423, 2472, 2423, 2423, 2472, 2472, - 2423, 2423, 2423, 2423, 2423, 2423, 2473, 2423, 2423, 2473, - 2473, 2473, 2473, 2423, 2423, 229, 229, 2423, 2423, 2423, - 2474, 2423, 2423, 2474, 2474, 2423, 2423, 229, 378, 378, - 2423, 2423, 2423, 2475, 2423, 2423, 2475, 2475, 2475, 2423, - 2423, 378, 378, 2423, 2423, 2423, 2476, 2423, 2423, 2476, - - 2476, 2423, 2423, 2423, 2423, 2423, 2423, 2477, 2423, 2423, - 2477, 2477, 2477, 2423, 2423, 378, 378, 2423, 2423, 2423, - 2478, 2423, 2423, 2478, 2478, 2478, 2478, 2423, 2423, 229, - 430, 430, 2423, 2423, 2423, 2479, 2423, 2423, 2479, 2423, - 2423, 2423, 2423, 2423, 2423, 2480, 2423, 2423, 2480, 2423, - 2423, 430, 229, 2423, 2423, 2423, 2481, 2423, 2423, 2481, - 2481, 2423, 2423, 2423, 2423, 2482, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2483, 2483, 2484, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2485, 2485, 2485, 2485, 2423, 2486, 2423, - 2423, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, - 2488, 2423, 2423, 2489, 2489, 2489, 2489, 2490, 2423, 2491, - 2491, 2491, 2491, 2492, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2469, 2469, 2469, 2469, 2469, 2469, 2493, - 2423, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494, - 2494, 2494, 2494, 2494, 2495, 2423, 2496, 2496, 2496, 2496, - 2496, 2496, 2496, 2496, 2496, 2497, 2423, 2498, 2498, 2498, - 2499, 2423, 2500, 2500, 2500, 2500, 2500, 2500, 2501, 2423, - 2502, 2502, 2502, 2502, 2503, 2423, 2423, 2504, 2504, 2504, - - 2504, 2504, 2505, 2423, 2506, 2506, 2506, 2507, 2423, 2508, - 2508, 2508, 2508, 2509, 2423, 2510, 2510, 2510, 2510, 2510, - 2511, 2423, 2423, 2512, 2512, 2513, 2423, 2514, 2514, 2515, - 2423, 2516, 2516, 2516, 2517, 2518, 2423, 2518, 2423, 2423, - 2423, 2519, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2520, - 2521, 2521, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2522, 2423, 2423, 2522, 2423, 2523, 2523, 2423, - 2524, 2423, 2423, 2524, 2524, 2524, 2524, 2524, 2524, 2525, - 2525, 2423, 2526, 2526, 2526, 2527, 2527, 2528, 2423, 2423, - - 2528, 2529, 2529, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2530, 2530, 2530, 2423, 2423, 2530, 2530, 2531, 2531, - 2532, 2532, 2423, 2423, 2532, 2423, 2423, 2532, 2532, 2532, - 2532, 2532, 2532, 2532, 2533, 2533, 2534, 2534, 2534, 2423, - 2423, 2534, 2534, 2534, 2534, 2535, 2535, 2536, 2423, 2423, - 2537, 2537, 2538, 2423, 2423, 2538, 2538, 2538, 2539, 2539, - 2540, 2540, 2540, 2541, 2541, 2423, 2542, 2542, 2542, 2542, - 2543, 2543, 2544, 2423, 2423, 2545, 2545, 2546, 2546, 2546, - 2547, 2547, 2548, 2548, 2548, 2548, 2549, 2549, 2423, 2550, - 2551, 2551, 2423, 2423, 2552, 2552, 2423, 2423, 2553, 2554, - - 2554, 2555, 2423, 2423, 2555, 2423, 2423, 2556, 2423, 2423, - 2423, 2423, 2423, 2423, 2557, 2423, 2558, 2423, 2558, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2559, 2423, 2423, 2423, 2559, 2423, 2423, 2560, 2423, 2560, - 2561, 2423, 2423, 2423, 2423, 2423, 2561, 2423, 2423, 2561, - 2561, 2561, 2423, 2562, 2423, 2562, 2423, 2563, 2563, 2563, - 2423, 2564, 2423, 2564, 2565, 2423, 2423, 2423, 2565, 2423, - 2566, 2423, 2566, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2567, 2567, 2567, 2423, 2423, 2423, 2567, 2567, 2423, 2568, - - 2423, 2568, 2569, 2569, 2569, 2569, 2423, 2423, 2423, 2569, - 2423, 2423, 2423, 2423, 2423, 2569, 2569, 2569, 2569, 2569, - 2569, 2423, 2570, 2423, 2570, 2571, 2571, 2571, 2571, 2423, - 2423, 2423, 2423, 2423, 2571, 2571, 2571, 2423, 2572, 2423, - 2572, 2573, 2423, 2423, 2423, 2423, 2574, 2423, 2574, 2575, - 2423, 2423, 2423, 2575, 2575, 2575, 2423, 2576, 2423, 2576, - 2423, 2423, 2423, 2423, 2577, 2423, 2578, 2423, 2578, 2423, - 2423, 2423, 2579, 2579, 2423, 2423, 2579, 2423, 2580, 2423, - 2580, 2581, 2423, 2423, 2423, 2423, 2582, 2423, 2582, 2423, - 2423, 2583, 2583, 2423, 2423, 2423, 2584, 2423, 2584, 2585, - - 2585, 2585, 2585, 2423, 2586, 2423, 2586, 2423, 2587, 2423, - 2588, 2423, 2588, 2423, 2423, 2423, 2423, 2589, 2423, 2589, - 2423, 2423, 2423, 2590, 2423, 2591, 2423, 2591, 2592, 2593, - 2423, 2423, 2423, 2423, 2423, 2594, 2595, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2596, - 2423, 2597, 2598, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2598, 2423, 2423, 2598, 2599, 2423, 2600, 2423, 2423, - 2600, 2601, 2602, 2602, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2603, 2603, 2423, 2423, 2603, 2603, 2604, - - 2605, 2605, 2605, 2605, 2423, 2423, 2423, 2423, 2423, 2605, - 2605, 2605, 2605, 2605, 2605, 2606, 2607, 2607, 2607, 2607, - 2423, 2423, 2423, 2607, 2607, 2607, 2608, 2609, 2610, 2611, - 2611, 2611, 2611, 2612, 2423, 2423, 2423, 2423, 2423, 2423, - 2613, 2614, 2423, 2423, 2423, 2423, 2615, 2615, 2423, 2423, - 2423, 2615, 2616, 2617, 2618, 2423, 2423, 2423, 2619, 2619, - 2423, 2423, 2423, 2620, 2621, 2423, 2423, 2621, 2621, 2622, - 2423, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2629, 2423, - 2629, 2423, 2423, 2423, 2630, 2631, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2632, 2423, 2633, 2634, 2423, 2423, 2423, 2634, 2423, 2423, - 2423, 2634, 2635, 2423, 2636, 2423, 2423, 2423, 2423, 2423, - 2637, 2638, 2638, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2639, 2639, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2639, - 2640, 2641, 2423, 2423, 2641, 2641, 2423, 2423, 2423, 2423, - 2423, 2641, 2641, 2641, 2641, 2641, 2642, 2643, 2423, 2423, - 2643, 2643, 2423, 2423, 2643, 2643, 2644, 2645, 2646, 2647, - 2647, 2647, 2423, 2423, 2647, 2648, 2649, 2650, 2423, 2651, - 2651, 2651, 2652, 2653, 2654, 2655, 2655, 2656, 2657, 2423, - - 2423, 2423, 2657, 2657, 2658, 2423, 2423, 2423, 2659, 2660, - 2423, 2423, 2661, 2662, 2663, 2663, 2423, 2423, 2664, 2665, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2666, - 2423, 2667, 2668, 2668, 2668, 2669, 2670, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2671, 2672, - 2672, 2423, 2423, 2423, 2423, 2673, 2673, 2423, 2423, 2423, - 2423, 2423, 2423, 2673, 2423, 2423, 2674, 2423, 2423, 2423, - 2423, 2423, 2674, 2423, 2423, 2423, 2423, 2423, 2674, 2674, - 2674, 2423, 2423, 2675, 2676, 2423, 2423, 2423, 2423, 2423, - - 2676, 2423, 2423, 2423, 2676, 2676, 2423, 2423, 2677, 2678, - 2679, 2679, 2679, 2423, 2423, 2423, 2679, 2423, 2423, 2680, - 2681, 2423, 2423, 2423, 2423, 2423, 2682, 2683, 2684, 2685, - 2423, 2423, 2423, 2423, 2686, 2687, 2687, 2687, 2688, 2423, - 2423, 2423, 2423, 2689, 2690, 2423, 2423, 2423, 2423, 2423, - 2691, 2692, 2692, 2423, 2423, 2423, 2693, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2694, 2423, 2423, 2423, 2668, 2423, 2423, - 2668, 2669, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2671, 2672, 2423, 2423, 2423, 2423, - - 2423, 2673, 2673, 2423, 2423, 2673, 2674, 2423, 2423, 2423, - 2674, 2423, 2423, 2423, 2423, 2423, 2674, 2674, 2423, 2423, - 2423, 2675, 2676, 2423, 2423, 2423, 2676, 2676, 2676, 2677, - 2678, 2679, 2423, 2423, 2679, 2679, 2423, 2423, 2679, 2680, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2682, - 2683, 2684, 2685, 2423, 2423, 2423, 2423, 2423, 2423, 2686, - 2687, 2687, 2687, 2688, 2423, 2689, 2690, 2691, 2692, 2692, - 2423, 2423, 2423, 2423, 2693, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2694, 2423, 2668, 2423, - 2423, 2423, 2668, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2671, 2672, - 2423, 2423, 2423, 2423, 2423, 2673, 2673, 2423, 2423, 2423, - 2423, 2673, 2674, 2674, 2423, 2423, 2423, 2674, 2674, 2675, - 2676, 2676, 2676, 2676, 2677, 2423, 2423, 2679, 2423, 2423, - 2423, 2679, 2679, 2423, 2423, 2423, 2423, 2679, 2680, 2423, - 2682, 2683, 2684, 2685, 2686, 2423, 2423, 2687, 2687, 2688, - 2423, 2689, 2423, 2423, 2691, 2692, 2692, 2423, 2693, 2423, - 2423, 2423, 2423, 2423, 2423, 2694, 2423, 2423, 2668, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2671, - 2672, 2423, 2673, 2673, 2423, 2423, 2423, 2423, 2673, 2674, - - 2674, 2674, 2674, 2423, 2423, 2676, 2676, 2676, 2676, 2677, - 2423, 2423, 2679, 2679, 2679, 2423, 2423, 2423, 2423, 2679, - 2680, 2423, 2682, 2423, 2423, 2423, 2423, 2685, 2686, 2423, - 2423, 2423, 2423, 2423, 2687, 2423, 2423, 2423, 2689, 2691, - 2692, 2692, 2423, 2423, 2423, 2423, 2423, 2694, 2423, 2423, - 2423, 2668, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2671, 2672, 2423, 2673, 2673, 2423, 2423, 2423, - 2423, 2674, 2674, 2674, 2423, 2423, 2676, 2676, 2676, 2423, - 2423, 2677, 2423, 2423, 2423, 2679, 2679, 2679, 2423, 2423, - 2423, 2423, 2680, 2682, 2423, 2423, 2423, 2423, 2423, 2686, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2692, 2692, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2668, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2671, 2423, 2423, 2423, 2673, 2423, 2423, 2423, - 2423, 2423, 2674, 2674, 2674, 2423, 2423, 2423, 2676, 2423, - 2423, 2676, 2423, 2423, 2423, 2423, 2423, 2679, 2679, 2679, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2686, 2423, 2423, 2423, 2691, 2692, 2692, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2668, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2671, 2423, 2423, 2423, 2423, 2423, 2423, - 2673, 2423, 2423, 2423, 2674, 2674, 2674, 2676, 2423, 2423, - 2423, 2676, 2423, 2423, 2423, 2679, 2423, 2423, 2679, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2686, 2691, 2692, 2692, 2692, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2671, 2423, 2423, 2423, - 2673, 2674, 2674, 2674, 2676, 2676, 2679, 2423, 2423, 2423, - 2679, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2692, 2692, - - 2692, 2695, 2696, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2671, 2673, 2674, 2674, 2423, 2423, 2676, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2692, 2697, - 2698, 2695, 2696, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2673, - 2674, 2674, 2423, 2423, 2423, 2676, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2697, 2692, - - 2699, 2698, 2700, 2692, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2673, 2674, 2674, 2423, 2423, 2423, 2423, 2676, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2691, 2699, 2423, 2700, 2692, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2691, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2691, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2691, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2691, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2691, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2691, 2691, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, 2691, - 2691, 2423, 0, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423 - + 2421, 2421, 2422, 2422, 2422, 2422, 2423, 2423, 2424, 2424, + 2425, 2425, 2426, 2426, 2426, 2426, 2427, 2427, 2421, 2421, + 2428, 2428, 2429, 2429, 2429, 2429, 2421, 2421, 2429, 2429, + 2429, 2429, 2421, 2421, 2429, 2429, 2421, 2421, 2429, 2429, + 2429, 2429, 2430, 2430, 2431, 2431, 2432, 2432, 2426, 2426, + 2433, 2433, 2434, 2434, 2421, 2421, 2434, 2434, 2434, 2434, + 2435, 2435, 2436, 2436, 2437, 2437, 2438, 2438, 2438, 2438, + 2421, 2421, 2438, 2438, 2438, 2438, 2421, 2421, 2438, 2438, + 2421, 2421, 2438, 2438, 2438, 2438, 2421, 2421, 2438, 2438, + 2421, 2421, 2438, 2438, 2438, 2438, 2439, 2439, 2440, 2440, + + 2421, 2421, 2440, 2440, 2440, 2440, 2420, 107, 2441, 2441, + 2420, 111, 2442, 2442, 2443, 2443, 2444, 2444, 2445, 2445, + 2446, 2446, 2421, 2421, 2446, 2446, 2446, 2446, 2447, 2447, + 2448, 2448, 2421, 2421, 2448, 2448, 2448, 2448, 2449, 2449, + 2450, 2450, 2421, 2421, 2450, 2450, 2450, 2450, 2451, 2451, + 2452, 2452, 2453, 2453, 2454, 2454, 2421, 2421, 2454, 2454, + 2454, 2454, 2455, 2455, 2456, 2456, 2421, 2421, 2456, 2456, + 2456, 2456, 2457, 2457, 2458, 2458, 2459, 2459, 2460, 2460, + 2421, 2421, 2460, 2460, 2460, 2460, 2461, 2461, 2462, 2462, + 2421, 2421, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2463, 2420, 2420, 2463, 2420, 2420, 2420, + 230, 230, 230, 230, 233, 233, 2420, 2420, 2420, 2464, + 2420, 2420, 2464, 2420, 2420, 2420, 2420, 2420, 2420, 2465, + 2420, 2420, 2465, 2465, 2465, 2420, 2420, 2420, 2420, 2420, + 2466, 2420, 2420, 2466, 2466, 2466, 2466, 2466, 2420, 2420, + 233, 271, 271, 2420, 2420, 2420, 2467, 2420, 2420, 2467, + 2467, 2467, 2420, 2420, 2420, 2420, 2420, 2420, 2468, 2420, + 2420, 2468, 2468, 2420, 2420, 234, 271, 234, 296, 297, + + 297, 297, 297, 303, 304, 303, 303, 2420, 2420, 2420, + 2469, 2420, 2420, 2469, 2469, 2469, 2469, 2469, 2420, 2420, + 271, 271, 2420, 2420, 2420, 2470, 2420, 2420, 2470, 2470, + 2470, 2470, 2470, 2470, 2470, 2470, 2420, 2420, 2420, 2420, + 2420, 2420, 2471, 2420, 2420, 2471, 2471, 2471, 2471, 2471, + 2471, 2471, 2420, 2420, 2420, 2420, 2420, 2420, 2472, 2420, + 2420, 2472, 2472, 2420, 2420, 2420, 2420, 2420, 2420, 2473, + 2420, 2420, 2473, 2473, 2473, 2473, 2420, 2420, 271, 271, + 2420, 2420, 2420, 2474, 2420, 2420, 2474, 2474, 2420, 2420, + 271, 391, 391, 2420, 2420, 2420, 2475, 2420, 2420, 2475, + + 2475, 2475, 2420, 2420, 391, 391, 2420, 2420, 2420, 2476, + 2420, 2420, 2476, 2476, 2420, 2420, 2420, 2420, 2420, 2420, + 2477, 2420, 2420, 2477, 2477, 2477, 2420, 2420, 391, 391, + 2420, 2420, 2420, 2478, 2420, 2420, 2478, 2478, 2478, 2478, + 2420, 2420, 271, 271, 271, 2420, 2420, 2420, 2479, 2420, + 2420, 2479, 2420, 2420, 2420, 2420, 2420, 2420, 2480, 2420, + 2420, 2480, 2420, 2420, 271, 271, 2420, 2420, 2420, 2481, + 2420, 2420, 2481, 2481, 2420, 2420, 2420, 2420, 2482, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2483, 2483, 2484, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2485, 2485, + 2486, 2420, 2487, 2487, 2487, 2487, 2420, 2488, 2420, 2420, + 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2490, + 2420, 2420, 2491, 2491, 2491, 2491, 2492, 2420, 2493, 2493, + 2493, 2494, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2495, 2495, 2495, 2495, 2495, 2495, 2496, 2420, 2497, + 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, + 2497, 2497, 2497, 2498, 2420, 2499, 2499, 2499, 2499, 2499, + 2499, 2499, 2499, 2500, 2420, 2501, 2501, 2501, 2502, 2420, + + 2503, 2503, 2503, 2503, 2503, 2503, 2504, 2420, 2505, 2505, + 2505, 2505, 2506, 2420, 2420, 2507, 2507, 2507, 2507, 2507, + 2508, 2420, 2509, 2509, 2509, 2510, 2420, 2511, 2511, 2511, + 2511, 2512, 2420, 2513, 2513, 2513, 2513, 2513, 2514, 2420, + 2420, 2515, 2515, 2516, 2420, 2517, 2517, 2518, 2420, 2519, + 2519, 2519, 2520, 2521, 2420, 2521, 2420, 2420, 2420, 2522, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2523, 2524, 2524, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2525, 2526, 2526, 2527, 2420, 2420, 2527, 2420, + + 2528, 2528, 2420, 2529, 2420, 2420, 2529, 2529, 2529, 2529, + 2529, 2529, 2530, 2530, 2420, 2531, 2531, 2531, 2532, 2532, + 2420, 2420, 2533, 2534, 2534, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2535, 2535, 2535, 2420, 2420, 2535, 2535, + 2536, 2536, 2537, 2537, 2420, 2420, 2537, 2420, 2420, 2537, + 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2538, 2538, 2539, + 2539, 2539, 2420, 2420, 2539, 2539, 2539, 2540, 2540, 2541, + 2420, 2420, 2542, 2542, 2543, 2420, 2420, 2543, 2543, 2543, + 2544, 2544, 2545, 2545, 2545, 2546, 2546, 2420, 2547, 2547, + 2547, 2547, 2548, 2548, 2549, 2420, 2420, 2550, 2550, 2551, + + 2551, 2551, 2552, 2552, 2553, 2553, 2553, 2553, 2554, 2554, + 2420, 2555, 2556, 2556, 2420, 2420, 2557, 2557, 2420, 2420, + 2558, 2559, 2559, 2560, 2420, 2420, 2560, 2420, 2420, 2561, + 2420, 2420, 2420, 2420, 2420, 2420, 2562, 2420, 2563, 2420, + 2563, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2564, 2420, 2565, 2420, 2565, 2566, + 2420, 2420, 2420, 2566, 2420, 2420, 2567, 2420, 2567, 2568, + 2420, 2420, 2420, 2420, 2420, 2568, 2420, 2420, 2568, 2568, + 2568, 2420, 2569, 2420, 2569, 2420, 2570, 2570, 2570, 2420, + + 2571, 2420, 2571, 2420, 2420, 2420, 2572, 2420, 2573, 2420, + 2573, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2574, 2574, + 2574, 2420, 2420, 2420, 2574, 2574, 2420, 2575, 2420, 2575, + 2576, 2576, 2576, 2576, 2420, 2420, 2420, 2576, 2420, 2420, + 2420, 2420, 2420, 2576, 2576, 2576, 2576, 2576, 2576, 2576, + 2420, 2577, 2420, 2577, 2578, 2578, 2578, 2578, 2420, 2420, + 2420, 2420, 2420, 2578, 2578, 2420, 2579, 2420, 2579, 2580, + 2420, 2420, 2420, 2420, 2581, 2420, 2581, 2582, 2420, 2420, + 2420, 2582, 2582, 2582, 2420, 2583, 2420, 2583, 2420, 2420, + 2420, 2420, 2584, 2420, 2585, 2420, 2585, 2420, 2420, 2420, + + 2586, 2586, 2420, 2420, 2586, 2420, 2587, 2420, 2587, 2588, + 2420, 2420, 2420, 2420, 2589, 2420, 2589, 2420, 2420, 2590, + 2590, 2420, 2420, 2420, 2591, 2420, 2591, 2592, 2592, 2592, + 2592, 2420, 2593, 2420, 2593, 2420, 2594, 2420, 2595, 2420, + 2595, 2420, 2420, 2420, 2420, 2596, 2420, 2596, 2420, 2420, + 2420, 2597, 2420, 2598, 2420, 2598, 2599, 2600, 2420, 2420, + 2420, 2420, 2420, 2601, 2602, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2603, + 2420, 2420, 2604, 2420, 2605, 2606, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2606, 2420, 2420, 2606, 2607, 2420, + 2608, 2420, 2420, 2608, 2609, 2610, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2611, 2611, 2420, 2420, 2611, + 2611, 2612, 2613, 2613, 2613, 2613, 2420, 2420, 2420, 2420, + 2420, 2613, 2613, 2613, 2613, 2613, 2613, 2613, 2614, 2615, + 2615, 2615, 2615, 2420, 2420, 2420, 2615, 2615, 2616, 2617, + 2618, 2619, 2619, 2619, 2619, 2620, 2420, 2420, 2420, 2420, + 2420, 2420, 2621, 2622, 2420, 2420, 2420, 2420, 2623, 2623, + 2420, 2420, 2420, 2623, 2624, 2625, 2626, 2420, 2420, 2420, + 2627, 2627, 2420, 2420, 2420, 2628, 2629, 2420, 2420, 2629, + + 2629, 2630, 2420, 2631, 2632, 2633, 2634, 2635, 2636, 2637, + 2637, 2420, 2637, 2420, 2420, 2420, 2638, 2639, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2640, 2420, 2420, 2420, 2641, 2420, + 2642, 2643, 2420, 2420, 2420, 2643, 2420, 2420, 2420, 2643, + 2644, 2420, 2645, 2420, 2420, 2420, 2420, 2420, 2646, 2647, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2648, 2648, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2648, 2649, 2650, 2420, + 2420, 2650, 2650, 2420, 2420, 2420, 2420, 2420, 2650, 2650, + + 2650, 2650, 2650, 2650, 2651, 2652, 2420, 2420, 2652, 2652, + 2420, 2420, 2652, 2653, 2654, 2655, 2656, 2656, 2656, 2420, + 2420, 2656, 2657, 2658, 2659, 2420, 2660, 2660, 2660, 2661, + 2662, 2663, 2664, 2664, 2665, 2666, 2420, 2420, 2420, 2666, + 2666, 2667, 2420, 2420, 2420, 2668, 2669, 2420, 2420, 2670, + 2671, 2672, 2672, 2420, 2420, 2673, 2674, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2675, 2676, + 2420, 2677, 2678, 2678, 2678, 2679, 2680, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2681, 2682, + + 2420, 2420, 2420, 2420, 2683, 2683, 2420, 2420, 2420, 2420, + 2420, 2420, 2683, 2420, 2420, 2684, 2420, 2420, 2420, 2420, + 2420, 2684, 2420, 2420, 2420, 2420, 2420, 2684, 2684, 2684, + 2684, 2420, 2420, 2685, 2686, 2420, 2420, 2420, 2420, 2420, + 2686, 2420, 2420, 2420, 2686, 2420, 2420, 2687, 2688, 2689, + 2689, 2689, 2420, 2420, 2420, 2689, 2420, 2420, 2690, 2691, + 2420, 2420, 2420, 2420, 2420, 2692, 2693, 2694, 2695, 2420, + 2420, 2420, 2420, 2696, 2697, 2697, 2697, 2698, 2420, 2420, + 2420, 2420, 2699, 2700, 2420, 2420, 2420, 2420, 2420, 2701, + 2702, 2702, 2420, 2420, 2420, 2703, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2704, 2705, 2420, 2420, 2420, 2706, + 2420, 2420, 2706, 2707, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2681, 2420, 2420, 2420, + 2420, 2420, 2683, 2683, 2420, 2420, 2683, 2684, 2420, 2420, + 2420, 2684, 2420, 2420, 2420, 2420, 2420, 2684, 2684, 2684, + 2420, 2420, 2420, 2685, 2686, 2420, 2420, 2420, 2686, 2686, + 2687, 2688, 2689, 2420, 2420, 2689, 2689, 2420, 2420, 2689, + 2690, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2692, 2693, 2694, 2695, 2420, 2420, 2420, 2420, 2420, 2420, + + 2696, 2697, 2697, 2697, 2698, 2420, 2699, 2700, 2701, 2702, + 2702, 2420, 2420, 2420, 2420, 2703, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2704, + 2705, 2420, 2706, 2420, 2420, 2420, 2706, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2681, 2420, 2420, 2420, 2420, 2420, 2683, 2683, + 2420, 2420, 2420, 2420, 2683, 2684, 2684, 2420, 2420, 2420, + 2684, 2684, 2684, 2685, 2686, 2686, 2686, 2687, 2420, 2420, + 2689, 2420, 2420, 2420, 2689, 2689, 2420, 2420, 2420, 2420, + 2689, 2690, 2420, 2692, 2693, 2694, 2695, 2696, 2420, 2420, + + 2697, 2697, 2698, 2420, 2699, 2420, 2420, 2701, 2702, 2702, + 2420, 2703, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2705, 2420, 2420, 2706, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2681, 2420, 2683, 2683, 2420, 2420, + 2420, 2420, 2683, 2684, 2684, 2420, 2420, 2684, 2684, 2420, + 2420, 2686, 2686, 2686, 2687, 2420, 2420, 2689, 2689, 2689, + 2420, 2420, 2420, 2420, 2689, 2690, 2420, 2692, 2420, 2420, + 2420, 2420, 2695, 2696, 2420, 2420, 2420, 2420, 2420, 2697, + 2420, 2420, 2420, 2699, 2701, 2702, 2702, 2420, 2420, 2420, + 2420, 2420, 2705, 2420, 2420, 2420, 2706, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2681, 2420, 2683, + 2683, 2420, 2420, 2420, 2420, 2684, 2684, 2420, 2420, 2420, + 2684, 2420, 2420, 2686, 2686, 2420, 2420, 2687, 2420, 2420, + 2420, 2689, 2689, 2689, 2420, 2420, 2420, 2420, 2690, 2692, + 2420, 2420, 2420, 2420, 2420, 2696, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2701, 2702, 2702, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2706, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2681, 2420, + 2683, 2420, 2420, 2420, 2420, 2420, 2684, 2684, 2684, 2420, + 2420, 2420, 2686, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2689, 2689, 2689, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2696, 2420, 2420, 2420, + 2701, 2702, 2702, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2706, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2681, 2420, 2420, 2420, + 2683, 2420, 2420, 2420, 2684, 2684, 2684, 2686, 2420, 2420, + 2420, 2420, 2420, 2420, 2689, 2420, 2420, 2689, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2696, 2701, 2702, 2702, 2702, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2681, 2420, 2420, 2420, 2683, + 2684, 2684, 2684, 2686, 2689, 2420, 2420, 2420, 2689, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2701, 2702, 2702, 2702, 2708, + 2709, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2681, 2683, 2684, 2684, 2420, 2420, 2686, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2701, 2702, 2710, 2711, 2708, 2709, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2683, 2684, 2684, 2420, 2420, + 2420, 2686, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2701, 2710, 2702, 2712, 2711, 2713, 2702, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2683, 2684, 2684, 2420, 2420, + 2420, 2420, 2686, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2701, 2712, 2420, 2713, 2702, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2701, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2701, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2701, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2701, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2701, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2701, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2701, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2701, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2701, 2701, 2420, 2420, 2420, 2420, + 2420, 2420, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2420, 0, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420 } ; -static yyconst flex_int16_t yy_nxt[7868] = +static yyconst flex_int16_t yy_nxt[8134] = { 0, - 2423, 192, 193, 192, 192, 193, 192, 192, 193, 192, - 192, 193, 192, 197, 193, 197, 203, 194, 200, 203, - 194, 200, 2423, 195, 2423, 201, 195, 2423, 201, 198, - 197, 193, 197, 466, 204, 206, 207, 204, 206, 207, - 208, 209, 521, 208, 209, 466, 198, 213, 214, 467, - 210, 206, 207, 210, 211, 469, 208, 206, 207, 574, - 211, 468, 208, 213, 214, 487, 210, 193, 193, 193, - 575, 468, 210, 193, 193, 193, 225, 193, 225, 225, - 193, 225, 927, 216, 225, 193, 225, 928, 1536, 216, - 489, 215, 226, 522, 534, 226, 465, 465, 465, 495, - - 227, 465, 465, 465, 465, 465, 465, 215, 217, 218, - 193, 218, 217, 217, 217, 217, 217, 217, 217, 219, - 217, 217, 217, 2423, 217, 221, 217, 222, 217, 225, - 193, 225, 193, 193, 193, 193, 193, 193, 494, 225, - 193, 225, 225, 193, 225, 227, 2423, 539, 228, 469, - 469, 228, 495, 217, 217, 226, 496, 469, 226, 225, - 193, 225, 465, 465, 465, 468, 468, 465, 465, 465, - 465, 465, 465, 468, 522, 229, 223, 217, 218, 193, - 218, 217, 217, 217, 217, 217, 217, 217, 219, 217, - 217, 217, 521, 217, 221, 217, 222, 217, 225, 193, - - 225, 193, 193, 193, 193, 193, 193, 480, 225, 193, - 225, 225, 193, 225, 229, 2423, 484, 230, 1180, 495, - 230, 499, 217, 217, 227, 496, 554, 227, 193, 193, - 193, 193, 193, 193, 225, 193, 225, 225, 193, 225, - 225, 193, 225, 498, 231, 223, 555, 231, 469, 519, - 229, 1453, 469, 229, 497, 500, 232, 225, 193, 225, - 465, 465, 465, 520, 468, 593, 498, 501, 468, 495, - 499, 2423, 594, 232, 233, 234, 193, 234, 233, 233, - 233, 233, 233, 233, 233, 235, 233, 233, 233, 1047, - 233, 237, 233, 238, 233, 256, 193, 256, 256, 193, - - 256, 1048, 193, 193, 193, 465, 465, 465, 206, 207, - 494, 257, 469, 208, 257, 587, 206, 207, 258, 233, - 233, 208, 502, 242, 495, 515, 588, 239, 468, 516, - 240, 242, 559, 517, 803, 560, 241, 233, 234, 193, - 234, 233, 233, 233, 233, 233, 233, 233, 235, 233, - 233, 233, 243, 233, 237, 233, 238, 233, 1537, 1314, - 243, 193, 193, 193, 256, 193, 256, 1538, 256, 193, - 256, 256, 193, 256, 465, 465, 465, 258, 508, 469, - 257, 469, 233, 233, 257, 509, 528, 259, 550, 643, - 239, 550, 644, 240, 468, 468, 474, 468, 589, 241, - - 244, 245, 193, 245, 244, 244, 244, 244, 244, 244, - 244, 246, 244, 244, 244, 630, 244, 248, 244, 249, - 244, 256, 193, 256, 270, 193, 270, 270, 193, 270, - 589, 282, 193, 282, 282, 193, 282, 259, 475, 522, - 271, 469, 498, 271, 476, 244, 244, 283, 477, 522, - 283, 601, 486, 478, 250, 1539, 251, 468, 602, 252, - 465, 465, 465, 595, 253, 254, 244, 245, 193, 245, - 244, 244, 244, 244, 244, 244, 244, 246, 244, 244, - 244, 498, 244, 248, 244, 249, 244, 282, 193, 282, - 282, 193, 282, 193, 193, 193, 562, 193, 193, 193, - - 282, 193, 282, 284, 803, 469, 284, 563, 564, 285, - 596, 244, 244, 285, 498, 603, 286, 465, 465, 465, - 250, 468, 251, 614, 1177, 252, 465, 465, 465, 630, - 253, 254, 260, 261, 193, 261, 260, 260, 260, 260, - 260, 260, 260, 262, 260, 260, 260, 637, 260, 264, - 260, 265, 260, 282, 193, 282, 282, 193, 282, 282, - 193, 282, 490, 193, 193, 193, 193, 193, 193, 286, - 490, 469, 287, 656, 486, 287, 657, 260, 260, 288, - 498, 803, 288, 677, 266, 1029, 496, 468, 498, 267, - 465, 465, 465, 1540, 2423, 465, 465, 465, 268, 260, - - 261, 193, 261, 260, 260, 260, 260, 260, 260, 260, - 262, 260, 260, 260, 487, 260, 264, 260, 265, 260, - 282, 193, 282, 282, 193, 282, 193, 193, 193, 541, - 193, 193, 193, 282, 193, 282, 284, 663, 537, 284, - 656, 538, 289, 666, 260, 260, 289, 542, 469, 287, - 664, 266, 465, 465, 465, 565, 267, 465, 465, 465, - 465, 465, 465, 1543, 468, 268, 272, 273, 193, 273, - 272, 272, 272, 272, 272, 272, 272, 274, 272, 272, - 272, 637, 272, 276, 272, 277, 272, 282, 193, 282, - 282, 193, 282, 282, 193, 282, 638, 193, 193, 193, - - 465, 465, 465, 287, 469, 469, 290, 469, 1550, 290, - 1552, 272, 272, 291, 576, 1561, 278, 465, 465, 465, - 468, 468, 279, 468, 465, 465, 465, 465, 465, 465, - 280, 272, 273, 193, 273, 272, 272, 272, 272, 272, - 272, 272, 274, 272, 272, 272, 1562, 272, 276, 272, - 277, 272, 193, 193, 193, 282, 193, 282, 282, 193, - 282, 1056, 193, 193, 193, 465, 465, 465, 291, 469, - 469, 292, 669, 1048, 292, 657, 272, 272, 293, 1563, - 1565, 278, 193, 193, 193, 468, 468, 279, 282, 193, - 282, 282, 193, 282, 669, 280, 469, 666, 293, 282, - - 193, 282, 713, 581, 290, 714, 469, 290, 282, 193, - 282, 1056, 468, 608, 1180, 294, 465, 465, 465, 465, - 465, 465, 468, 1077, 294, 295, 296, 193, 296, 295, - 295, 295, 295, 295, 295, 295, 297, 295, 295, 295, - 1571, 295, 299, 295, 300, 295, 307, 193, 307, 307, - 193, 307, 193, 193, 193, 1452, 193, 193, 193, 465, - 465, 465, 308, 469, 469, 308, 1487, 1577, 258, 469, - 295, 295, 258, 301, 1488, 302, 465, 465, 465, 468, - 468, 303, 465, 465, 465, 468, 1578, 304, 1180, 803, - 305, 295, 296, 193, 296, 295, 295, 295, 295, 295, - - 295, 295, 297, 295, 295, 295, 1451, 295, 299, 295, - 300, 295, 307, 193, 307, 307, 193, 307, 307, 193, - 307, 1180, 307, 193, 307, 465, 465, 465, 308, 469, - 469, 308, 1492, 1570, 309, 803, 295, 295, 309, 301, - 1493, 302, 465, 465, 465, 468, 468, 303, 465, 465, - 465, 805, 1569, 304, 1580, 1581, 305, 310, 311, 193, - 311, 310, 310, 310, 310, 310, 310, 310, 312, 310, - 310, 310, 313, 310, 314, 310, 315, 310, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - - 313, 313, 310, 310, 313, 316, 317, 318, 313, 313, - 313, 313, 313, 319, 313, 320, 313, 313, 313, 321, - 313, 322, 323, 313, 313, 313, 313, 313, 313, 325, - 193, 325, 325, 193, 325, 465, 465, 465, 465, 465, - 465, 465, 465, 465, 1583, 326, 1586, 1587, 326, 327, - 328, 193, 328, 327, 327, 327, 327, 327, 327, 327, - 329, 327, 327, 327, 330, 327, 331, 327, 332, 327, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 327, 327, 330, 333, 334, 335, - - 330, 330, 330, 330, 330, 336, 330, 337, 330, 330, - 330, 338, 330, 330, 339, 330, 330, 330, 330, 330, - 330, 341, 193, 341, 341, 193, 341, 465, 465, 465, - 465, 465, 465, 803, 621, 1588, 1589, 342, 1593, 1568, - 342, 343, 344, 193, 344, 343, 343, 343, 343, 343, - 343, 343, 345, 343, 343, 343, 1599, 343, 347, 343, - 348, 343, 352, 193, 352, 352, 193, 352, 365, 193, - 365, 622, 365, 193, 365, 1600, 469, 667, 353, 1601, - 904, 353, 1602, 626, 366, 522, 343, 343, 366, 905, - 664, 349, 468, 465, 465, 465, 906, 350, 343, 344, - - 193, 344, 343, 343, 343, 343, 343, 343, 343, 345, - 343, 343, 343, 1603, 343, 347, 343, 348, 343, 193, - 193, 193, 193, 193, 193, 365, 193, 365, 1604, 365, - 193, 365, 465, 465, 465, 258, 1605, 1606, 258, 1607, - 660, 366, 1608, 343, 343, 366, 661, 1610, 349, 465, - 465, 465, 662, 1615, 350, 354, 355, 193, 355, 354, - 354, 354, 354, 354, 354, 354, 356, 354, 354, 354, - 1616, 354, 358, 354, 359, 354, 365, 193, 365, 365, - 193, 365, 377, 193, 377, 1617, 377, 193, 377, 193, - 193, 193, 367, 1622, 1623, 367, 469, 667, 378, 1624, - - 354, 354, 378, 635, 360, 379, 465, 465, 465, 1628, - 708, 361, 468, 362, 641, 641, 641, 820, 820, 820, - 363, 354, 355, 193, 355, 354, 354, 354, 354, 354, - 354, 354, 356, 354, 354, 354, 1629, 354, 358, 354, - 359, 354, 193, 193, 193, 377, 193, 377, 377, 193, - 377, 1618, 377, 193, 377, 377, 193, 377, 379, 1619, - 667, 378, 1631, 670, 378, 667, 354, 354, 380, 661, - 360, 380, 642, 710, 1632, 671, 1633, 361, 711, 362, - 641, 641, 641, 1634, 807, 1635, 363, 368, 369, 193, - 369, 368, 368, 368, 368, 368, 368, 368, 370, 368, - - 368, 368, 1638, 368, 372, 368, 373, 368, 391, 193, - 391, 391, 193, 391, 193, 193, 193, 1620, 193, 193, - 193, 391, 193, 391, 392, 1621, 1642, 392, 1643, 670, - 379, 1648, 368, 368, 379, 661, 660, 392, 374, 670, - 1649, 662, 661, 1650, 1651, 661, 1653, 1658, 671, 1659, - 1661, 692, 375, 368, 369, 193, 369, 368, 368, 368, - 368, 368, 368, 368, 370, 368, 368, 368, 1671, 368, - 372, 368, 373, 368, 391, 193, 391, 391, 193, 391, - 391, 193, 391, 1644, 403, 193, 403, 403, 193, 403, - 392, 1645, 1180, 393, 1646, 1674, 393, 1675, 368, 368, - - 404, 1676, 1647, 404, 374, 820, 820, 820, 836, 836, - 836, 836, 836, 836, 820, 820, 820, 1180, 375, 381, - 382, 193, 382, 381, 381, 381, 381, 381, 381, 381, - 383, 381, 381, 381, 1666, 381, 385, 381, 386, 381, - 415, 193, 415, 415, 193, 415, 193, 193, 193, 1679, - 193, 193, 193, 415, 193, 415, 416, 1680, 1681, 416, - 1682, 1683, 379, 1667, 381, 381, 379, 1684, 821, 416, - 387, 821, 1685, 388, 842, 842, 842, 884, 843, 1686, - 1687, 844, 1688, 1689, 389, 381, 382, 193, 382, 381, - 381, 381, 381, 381, 381, 381, 383, 381, 381, 381, - - 1691, 381, 385, 381, 386, 381, 415, 193, 415, 415, - 193, 415, 415, 193, 415, 1692, 429, 193, 429, 429, - 193, 429, 416, 1348, 1693, 417, 1694, 1695, 417, 1349, - 381, 381, 430, 1350, 1696, 430, 387, 1351, 1697, 388, - 852, 852, 852, 1698, 853, 1699, 1700, 854, 1701, 1702, - 389, 394, 395, 193, 395, 394, 394, 394, 394, 394, - 394, 394, 396, 394, 394, 394, 1703, 394, 398, 394, - 399, 394, 193, 193, 193, 193, 193, 193, 429, 193, - 429, 1706, 429, 193, 429, 429, 193, 429, 431, 1707, - 1708, 431, 1709, 1710, 430, 1714, 394, 394, 430, 1715, - - 1716, 432, 400, 1192, 1192, 1192, 1717, 401, 394, 395, - 193, 395, 394, 394, 394, 394, 394, 394, 394, 396, - 394, 394, 394, 1718, 394, 398, 394, 399, 394, 429, - 193, 429, 441, 193, 441, 441, 193, 441, 1719, 451, - 193, 451, 451, 193, 451, 432, 1720, 1721, 442, 1723, - 1735, 442, 1745, 394, 394, 452, 1746, 1747, 452, 400, - 836, 836, 836, 1180, 401, 405, 406, 193, 406, 405, - 405, 405, 405, 405, 405, 405, 407, 405, 405, 405, - 1748, 405, 409, 405, 410, 405, 193, 193, 193, 193, - 193, 193, 451, 193, 451, 1741, 451, 193, 451, 451, - - 193, 451, 258, 1352, 1752, 258, 1753, 1754, 452, 1353, - 405, 405, 452, 1354, 1755, 453, 411, 1355, 1756, 412, - 876, 876, 876, 884, 877, 1757, 1758, 878, 1759, 1760, - 413, 405, 406, 193, 406, 405, 405, 405, 405, 405, - 405, 405, 407, 405, 405, 405, 1761, 405, 409, 405, - 410, 405, 451, 193, 451, 463, 193, 463, 463, 193, - 463, 674, 674, 674, 1762, 816, 816, 816, 453, 1764, - 1765, 464, 1766, 1767, 464, 1180, 405, 405, 675, 1768, - 534, 534, 411, 818, 1769, 412, 1195, 1195, 1195, 1772, - 535, 540, 1198, 1198, 1198, 1773, 413, 418, 419, 193, - - 419, 418, 418, 418, 418, 418, 418, 418, 420, 418, - 418, 418, 1742, 418, 422, 418, 423, 418, 536, 536, - 500, 682, 682, 682, 537, 1774, 1777, 538, 699, 699, - 699, 1778, 498, 539, 715, 715, 715, 1779, 683, 723, - 723, 723, 418, 418, 1782, 700, 1205, 1205, 1205, 1786, - 424, 716, 425, 1787, 426, 1788, 724, 1193, 1193, 1193, - 1789, 1790, 427, 418, 419, 193, 419, 418, 418, 418, - 418, 418, 418, 418, 420, 418, 418, 418, 1793, 418, - 422, 418, 423, 418, 726, 726, 726, 740, 740, 740, - 749, 749, 749, 754, 754, 754, 774, 774, 774, 1794, - - 1811, 727, 1812, 1194, 741, 803, 1813, 750, 418, 418, - 755, 1822, 1823, 775, 1824, 1825, 424, 1826, 425, 1827, - 426, 1224, 1224, 1224, 1236, 1236, 1236, 1180, 427, 433, - 434, 193, 434, 433, 433, 433, 433, 433, 433, 433, - 435, 433, 433, 433, 1808, 433, 437, 433, 438, 433, - 793, 793, 793, 797, 797, 797, 674, 674, 674, 847, - 847, 847, 816, 816, 816, 1828, 1829, 794, 1830, 1810, - 798, 1831, 1832, 675, 433, 433, 1180, 849, 1836, 1837, - 818, 894, 894, 894, 1843, 895, 1844, 1845, 896, 907, - 907, 907, 1849, 908, 1852, 1858, 909, 439, 433, 434, - - 193, 434, 433, 433, 433, 433, 433, 433, 433, 435, - 433, 433, 433, 1809, 433, 437, 433, 438, 433, 819, - 682, 682, 682, 855, 855, 855, 1816, 847, 847, 847, - 858, 858, 858, 863, 863, 863, 1817, 683, 1859, 1818, - 856, 1860, 1882, 433, 433, 849, 1883, 859, 699, 699, - 699, 865, 911, 911, 911, 1887, 912, 1888, 1891, 913, - 803, 1892, 1237, 1237, 1237, 700, 439, 443, 444, 193, - 444, 443, 443, 443, 443, 443, 443, 443, 445, 443, - 443, 443, 1889, 443, 447, 443, 448, 443, 1895, 1878, - 850, 1896, 863, 863, 863, 1890, 871, 871, 871, 871, - - 871, 871, 880, 880, 880, 715, 715, 715, 1194, 1897, - 865, 1898, 443, 443, 873, 1899, 1180, 873, 1900, 1901, - 882, 1902, 716, 449, 443, 444, 193, 444, 443, 443, - 443, 443, 443, 443, 443, 445, 443, 443, 443, 866, - 443, 447, 443, 448, 443, 899, 899, 899, 899, 899, - 899, 723, 723, 723, 726, 726, 726, 1879, 1903, 880, - 880, 880, 874, 901, 1915, 1819, 901, 1916, 724, 443, - 443, 727, 930, 930, 930, 1820, 931, 882, 1821, 932, - 449, 454, 455, 193, 455, 454, 454, 454, 454, 454, - 454, 454, 456, 454, 454, 454, 883, 454, 458, 454, - - 459, 454, 914, 914, 914, 922, 922, 922, 902, 1917, - 1918, 740, 740, 740, 922, 922, 922, 1922, 1926, 915, - 938, 938, 938, 924, 1180, 1929, 454, 454, 741, 933, - 933, 933, 924, 1192, 1192, 1192, 1936, 460, 940, 1937, - 943, 943, 943, 1938, 944, 1939, 934, 945, 1940, 461, - 454, 455, 193, 455, 454, 454, 454, 454, 454, 454, - 454, 456, 454, 454, 454, 1880, 454, 458, 454, 459, - 454, 925, 938, 938, 938, 749, 749, 749, 1868, 946, - 946, 946, 946, 946, 946, 754, 754, 754, 1869, 1941, - 940, 1947, 750, 1948, 1870, 454, 454, 948, 1949, 803, - - 948, 1950, 755, 951, 951, 951, 460, 952, 1951, 1952, - 953, 957, 957, 957, 957, 957, 957, 1871, 461, 469, - 961, 961, 961, 941, 1180, 1953, 484, 1872, 1893, 959, - 1954, 1955, 959, 1873, 1956, 468, 485, 962, 963, 963, - 963, 1894, 949, 2423, 2423, 2423, 1943, 1959, 966, 966, - 966, 971, 971, 971, 1960, 964, 966, 966, 966, 1944, - 2423, 1961, 1962, 486, 487, 488, 968, 1963, 972, 960, - 489, 1964, 1965, 490, 968, 1966, 1971, 491, 1972, 492, - 1973, 493, 2423, 2423, 2423, 975, 975, 975, 1974, 2423, - 2423, 2423, 978, 978, 978, 1975, 978, 978, 978, 2423, - - 1976, 965, 976, 774, 774, 774, 2423, 986, 986, 986, - 980, 983, 983, 983, 980, 984, 969, 1977, 985, 1981, - 775, 986, 986, 986, 1990, 988, 990, 990, 990, 1193, - 1193, 1193, 973, 981, 2423, 2423, 2423, 1991, 1992, 988, - 994, 994, 994, 991, 1993, 1982, 974, 977, 996, 996, - 996, 2423, 996, 996, 996, 1983, 1994, 995, 1995, 1004, - 1004, 1004, 1004, 1004, 1004, 2006, 998, 1010, 1010, 1010, - 998, 1010, 1010, 1010, 2007, 1289, 989, 1006, 803, 2008, - 1006, 1017, 1017, 1017, 992, 1012, 793, 793, 793, 1012, - 1014, 1014, 1014, 2009, 1015, 2010, 2011, 1016, 993, 1019, - - 1017, 1017, 1017, 794, 797, 797, 797, 1021, 1021, 1021, - 1984, 1022, 1998, 1986, 1023, 1025, 1025, 1025, 1019, 2012, - 1985, 798, 999, 1987, 2013, 1007, 1025, 1025, 1025, 816, - 816, 816, 2017, 1027, 1013, 816, 816, 816, 816, 816, - 816, 1058, 1058, 1058, 1027, 2018, 2019, 818, 842, 842, - 842, 2020, 843, 818, 2021, 844, 818, 1988, 1059, 2022, - 1020, 2423, 2423, 2423, 847, 847, 847, 1989, 847, 847, - 847, 2024, 847, 847, 847, 1193, 1193, 1193, 2423, 855, - 855, 855, 849, 2025, 2026, 1037, 849, 2029, 2036, 1028, - 849, 852, 852, 852, 2037, 853, 856, 2038, 854, 1064, - - 1064, 1064, 2039, 1065, 2040, 2041, 1066, 1067, 1067, 1067, - 858, 858, 858, 1069, 1069, 1069, 2042, 1070, 2043, 1062, - 1071, 1060, 2044, 2045, 1068, 2046, 2047, 859, 1073, 1073, - 1073, 863, 863, 863, 863, 863, 863, 863, 863, 863, - 1079, 1079, 1079, 2054, 2055, 1074, 871, 871, 871, 865, - 803, 2056, 865, 2057, 2058, 865, 2059, 1080, 871, 871, - 871, 871, 871, 871, 873, 876, 876, 876, 2060, 877, - 2061, 2062, 878, 880, 880, 880, 873, 2063, 2064, 873, - 880, 880, 880, 1085, 1085, 1085, 1096, 1096, 1096, 2065, - 2066, 882, 2048, 894, 894, 894, 1076, 895, 882, 2067, - - 896, 1086, 2070, 1097, 899, 899, 899, 2071, 1082, 899, - 899, 899, 899, 899, 899, 2072, 907, 907, 907, 2076, - 908, 2086, 901, 909, 1105, 1105, 1105, 901, 2087, 2088, - 901, 911, 911, 911, 2089, 912, 2090, 2091, 913, 2092, - 2093, 1106, 914, 914, 914, 1107, 1107, 1107, 2094, 1108, - 2095, 2096, 1109, 922, 922, 922, 922, 922, 922, 915, - 922, 922, 922, 930, 930, 930, 2097, 931, 2105, 2106, - 932, 924, 2107, 2100, 924, 2108, 1100, 2100, 924, 933, - 933, 933, 1121, 1121, 1121, 2109, 1122, 2101, 2103, 1123, - 938, 938, 938, 938, 938, 938, 934, 938, 938, 938, - - 943, 943, 943, 2110, 944, 2111, 2112, 945, 940, 2113, - 2114, 940, 946, 946, 946, 940, 946, 946, 946, 946, - 946, 946, 957, 957, 957, 803, 1116, 957, 957, 957, - 948, 951, 951, 951, 948, 952, 2115, 948, 953, 2120, - 959, 957, 957, 957, 2116, 959, 2118, 2129, 1127, 961, - 961, 961, 2121, 1135, 1135, 1135, 2117, 1136, 2119, 959, - 1137, 963, 963, 963, 2122, 2130, 962, 1138, 1138, 1138, - 2098, 1139, 2131, 2132, 1140, 966, 966, 966, 964, 966, - 966, 966, 971, 971, 971, 1129, 966, 966, 966, 975, - 975, 975, 803, 968, 1144, 1144, 1144, 968, 1145, 972, - - 1134, 1146, 1180, 1181, 968, 2135, 976, 1149, 1149, 1149, - 2135, 1150, 2138, 2100, 1151, 978, 978, 978, 978, 978, - 978, 978, 978, 978, 983, 983, 983, 2101, 984, 2139, - 2140, 985, 2133, 980, 2141, 2150, 980, 2153, 2156, 980, - 986, 986, 986, 986, 986, 986, 986, 986, 986, 990, - 990, 990, 1142, 1156, 1156, 1156, 2100, 1157, 988, 2157, - 1158, 988, 2123, 2148, 988, 2125, 991, 2103, 994, 994, - 994, 1161, 1161, 1161, 2124, 1162, 2158, 2126, 1163, 996, - 996, 996, 2149, 2127, 1153, 995, 996, 996, 996, 996, - 996, 996, 1166, 1166, 1166, 2128, 2159, 998, 1004, 1004, - - 1004, 1004, 1004, 1004, 998, 1155, 2162, 998, 2151, 1167, - 1004, 1004, 1004, 1010, 1010, 1010, 1006, 2165, 2160, 1006, - 1010, 1010, 1010, 1010, 1010, 1010, 2135, 2152, 1006, 2163, - 2167, 1012, 1014, 1014, 1014, 2135, 1015, 2161, 1012, 1016, - 2168, 1012, 1017, 1017, 1017, 1017, 1017, 1017, 2164, 2169, - 1164, 1017, 1017, 1017, 1021, 1021, 1021, 2170, 1022, 2171, - 1019, 1023, 2181, 1019, 1025, 1025, 1025, 2182, 2183, 1019, - 1170, 1025, 1025, 1025, 2184, 2185, 1173, 1025, 1025, 1025, - 2186, 2190, 1027, 1179, 1179, 1179, 816, 816, 816, 1027, - 1058, 1058, 1058, 2191, 2192, 1027, 1208, 1208, 1208, 2193, - - 1209, 1180, 1181, 1210, 818, 2194, 2195, 1059, 2196, 2197, - 1174, 847, 847, 847, 1064, 1064, 1064, 2198, 1065, 2199, - 2201, 1066, 1067, 1067, 1067, 2202, 1215, 1215, 1215, 849, - 1216, 2203, 2208, 1217, 1069, 1069, 1069, 1176, 1070, 1068, - 2209, 1071, 1073, 1073, 1073, 1219, 1219, 1219, 2210, 1220, - 2211, 1186, 1221, 863, 863, 863, 1079, 1079, 1079, 1074, - 1213, 1226, 1226, 1226, 2212, 1227, 2213, 2214, 1228, 2215, - 2216, 865, 2217, 1080, 1229, 1229, 1229, 871, 871, 871, - 1085, 1085, 1085, 1096, 1096, 1096, 1243, 1243, 1243, 2204, - 1244, 1230, 2218, 1245, 2219, 873, 2220, 2221, 1086, 2222, - - 1097, 2205, 2223, 1223, 1246, 1246, 1246, 1248, 1248, 1248, - 899, 899, 899, 1253, 1253, 1253, 1105, 1105, 1105, 2206, - 803, 1247, 2225, 2226, 1249, 2227, 1231, 2228, 901, 2229, - 1254, 2207, 2230, 1106, 1257, 1257, 1257, 2231, 1258, 2232, - 2233, 1259, 1107, 1107, 1107, 2224, 1108, 2234, 2235, 1109, - 1260, 1260, 1260, 1250, 922, 922, 922, 1269, 1269, 1269, - 2236, 1121, 1121, 1121, 2237, 1122, 2238, 1261, 1123, 1273, - 1273, 1273, 924, 2239, 1270, 1251, 938, 938, 938, 946, - 946, 946, 1283, 1283, 1283, 2240, 1274, 957, 957, 957, - 2241, 1135, 1135, 1135, 940, 1136, 2242, 948, 1137, 1284, - - 1138, 1138, 1138, 2243, 1139, 959, 2244, 1140, 966, 966, - 966, 2245, 1144, 1144, 1144, 2246, 1145, 2248, 1267, 1146, - 1149, 1149, 1149, 2249, 1150, 2250, 968, 1151, 1285, 978, - 978, 978, 986, 986, 986, 2251, 996, 996, 996, 1277, - 1166, 1166, 1166, 1286, 1279, 803, 2252, 980, 2253, 2254, - 988, 1156, 1156, 1156, 998, 1157, 2255, 1167, 1158, 1161, - 1161, 1161, 2256, 1162, 2247, 2257, 1163, 1300, 1300, 1300, - 2258, 1301, 2259, 1288, 1302, 1004, 1004, 1004, 1307, 1307, - 1307, 2260, 2261, 1298, 1010, 1010, 1010, 2262, 1295, 1293, - 1017, 1017, 1017, 1006, 2263, 1308, 1311, 1311, 1311, 1025, - - 1025, 1025, 1012, 1179, 1179, 1179, 2264, 2265, 1019, 816, - 816, 816, 2266, 1312, 1195, 1195, 1195, 1027, 1198, 1198, - 1198, 1180, 2267, 803, 1305, 2269, 2270, 818, 1330, 1330, - 1330, 1332, 1332, 1332, 1205, 1205, 1205, 1338, 1338, 1338, - 2271, 2272, 1310, 2268, 1208, 1208, 1208, 2273, 1209, 2274, - 1309, 1210, 2275, 2276, 1315, 847, 847, 847, 2277, 2278, - 1313, 1320, 1215, 1215, 1215, 2279, 1216, 2280, 2281, 1217, - 1316, 2282, 2283, 849, 1219, 1219, 1219, 1333, 1220, 2284, - 2285, 1221, 2286, 1339, 863, 863, 863, 1224, 1224, 1224, - 2287, 1331, 1226, 1226, 1226, 2288, 1227, 2290, 2291, 1228, - - 2292, 2293, 865, 1229, 1229, 1229, 1342, 1356, 1356, 1356, - 2294, 1357, 803, 2295, 1358, 871, 871, 871, 2289, 2296, - 1230, 1236, 1236, 1236, 1237, 1237, 1237, 1364, 1364, 1364, - 1364, 1364, 1364, 873, 1330, 1330, 1330, 2297, 1243, 1243, - 1243, 2298, 1244, 2299, 1346, 1245, 1246, 1246, 1246, 1368, - 1368, 1368, 2300, 1369, 2301, 2302, 1370, 1248, 1248, 1248, - 1371, 1371, 1371, 1247, 1372, 2303, 1359, 1373, 1375, 1375, - 1375, 1253, 1253, 1253, 1249, 1378, 1378, 1378, 803, 1379, - 2305, 2306, 1380, 1381, 1381, 1381, 1376, 2307, 1254, 2308, - 1365, 2309, 2304, 1331, 1257, 1257, 1257, 1365, 1258, 2310, - - 1382, 1259, 1260, 1260, 1260, 1384, 1384, 1384, 2311, 1385, - 2312, 2313, 1386, 1387, 1387, 1387, 1392, 1392, 1392, 1261, - 922, 922, 922, 1269, 1269, 1269, 2314, 1396, 1396, 1396, - 1388, 1397, 2316, 1393, 1398, 1399, 1399, 1399, 924, 2317, - 1270, 1273, 1273, 1273, 1402, 1402, 1402, 2318, 1403, 2319, - 2320, 1404, 1400, 1407, 1407, 1407, 2321, 2322, 1274, 946, - 946, 946, 1283, 1283, 1283, 1414, 1414, 1414, 2323, 1415, - 2324, 1408, 1416, 1418, 1418, 1418, 2325, 948, 2328, 1284, - 966, 966, 966, 2329, 2330, 1394, 1423, 1423, 1423, 2331, - 2332, 1419, 1425, 1425, 1425, 2423, 2423, 2423, 968, 978, - - 978, 978, 2333, 1424, 986, 986, 986, 2334, 2335, 1426, - 1410, 803, 2423, 1431, 1431, 1431, 803, 980, 1433, 1433, - 1433, 803, 988, 996, 996, 996, 1004, 1004, 1004, 2346, - 1432, 1421, 1300, 1300, 1300, 1434, 1301, 803, 803, 1302, - 803, 998, 803, 803, 1006, 1307, 1307, 1307, 2352, 1532, - 1430, 2344, 1441, 1441, 1441, 803, 1442, 2336, 1427, 1443, - 2345, 2347, 1308, 2338, 803, 1428, 1010, 1010, 1010, 803, - 1017, 1017, 1017, 1311, 1311, 1311, 2337, 1439, 1446, 1446, - 1446, 2342, 1447, 803, 1012, 1448, 2343, 1435, 1019, 2339, - 1312, 1449, 1449, 1449, 1455, 1455, 1455, 816, 816, 816, - - 1462, 1462, 1462, 1466, 1466, 1466, 1330, 1330, 1330, 1450, - 1530, 1456, 1467, 1467, 1467, 818, 1332, 1332, 1332, 1469, - 1469, 1469, 1529, 2354, 1444, 1445, 1470, 1470, 1470, 1338, - 1338, 1338, 1476, 1476, 1476, 1479, 1479, 1479, 863, 863, - 863, 1483, 1483, 1483, 1356, 1356, 1356, 803, 1357, 1528, - 1477, 1358, 1480, 871, 871, 871, 865, 1457, 1484, 1497, - 1497, 1497, 1364, 1364, 1364, 1501, 1501, 1501, 1368, 1368, - 1368, 873, 1369, 803, 1527, 1370, 1498, 1371, 1371, 1371, - 803, 1372, 803, 2348, 1373, 1375, 1375, 1375, 1378, 1378, - 1378, 803, 1379, 803, 2340, 1380, 1482, 803, 1523, 1495, - - 1381, 1381, 1381, 1376, 1508, 1508, 1508, 2349, 1509, 803, - 2353, 1510, 1384, 1384, 1384, 803, 1385, 1382, 803, 1386, - 1387, 1387, 1387, 1512, 1512, 1512, 2350, 1513, 2356, 2341, - 1514, 1515, 1515, 1515, 1392, 1392, 1392, 1388, 1519, 1519, - 1519, 803, 1520, 2351, 803, 1521, 803, 2388, 1516, 2355, - 803, 1393, 922, 922, 922, 1396, 1396, 1396, 1518, 1397, - 803, 803, 1398, 1399, 1399, 1399, 803, 1524, 1524, 1524, - 924, 1525, 803, 2389, 1526, 1402, 1402, 1402, 2360, 1403, - 1400, 2357, 1404, 1407, 1407, 1407, 946, 946, 946, 1533, - 1533, 1533, 1414, 1414, 1414, 2358, 1415, 803, 2361, 1416, - - 2368, 1408, 803, 1522, 948, 2359, 1534, 1418, 1418, 1418, - 1541, 1541, 1541, 1423, 1423, 1423, 1544, 1544, 1544, 2416, - 1545, 1517, 1511, 1546, 803, 1419, 803, 803, 1542, 2362, - 1424, 1425, 1425, 1425, 2363, 1535, 1547, 1547, 1547, 803, - 1548, 1507, 803, 1549, 978, 978, 978, 803, 1426, 1531, - 986, 986, 986, 1431, 1431, 1431, 1554, 1554, 1554, 2366, - 1555, 2367, 980, 1556, 1433, 1433, 1433, 2364, 988, 2370, - 1432, 1557, 1557, 1557, 803, 1558, 803, 2374, 1559, 2402, - 2376, 1434, 996, 996, 996, 1004, 1004, 1004, 1441, 1441, - 1441, 803, 1442, 2365, 803, 1443, 1010, 1010, 1010, 1553, - - 998, 803, 803, 1006, 1017, 1017, 1017, 2378, 2369, 1551, - 803, 1446, 1446, 1446, 1012, 1447, 803, 803, 1448, 1449, - 1449, 1449, 1019, 1455, 1455, 1455, 1572, 1572, 1572, 2379, - 1573, 1506, 2382, 1574, 816, 816, 816, 1450, 803, 2372, - 1456, 1576, 1576, 1576, 1505, 2375, 1560, 1566, 2417, 1564, - 2377, 803, 818, 1579, 1579, 1579, 803, 1567, 1462, 1462, - 1462, 1582, 1582, 1582, 1466, 1466, 1466, 1467, 1467, 1467, - 1469, 1469, 1469, 1470, 1470, 1470, 1584, 1584, 1584, 1585, - 1585, 1585, 1476, 1476, 1476, 1479, 1479, 1479, 1590, 1590, - 1590, 803, 1591, 2371, 803, 1592, 803, 1575, 803, 1504, - - 1477, 2373, 1480, 1594, 1594, 1594, 1483, 1483, 1483, 1596, - 1596, 1596, 1503, 1597, 803, 803, 1598, 871, 871, 871, - 803, 1595, 803, 1484, 1497, 1497, 1497, 1611, 1611, 1611, - 2410, 1612, 2383, 2380, 1613, 873, 1614, 1614, 1614, 2384, - 2396, 1498, 1501, 1501, 1501, 1508, 1508, 1508, 803, 1509, - 2404, 2381, 1510, 1512, 1512, 1512, 803, 1513, 803, 2386, - 1514, 1515, 1515, 1515, 2390, 2385, 1609, 1625, 1625, 1625, - 803, 1626, 2391, 803, 1627, 1519, 1519, 1519, 1516, 1520, - 803, 803, 1521, 922, 922, 922, 1524, 1524, 1524, 803, - 1525, 2405, 2392, 1526, 1636, 1636, 1636, 1533, 1533, 1533, - - 2397, 924, 1639, 1639, 1639, 1502, 1640, 2387, 803, 1641, - 803, 1500, 1637, 2420, 1534, 1541, 1541, 1541, 1544, 1544, - 1544, 2412, 1545, 2393, 803, 1546, 2398, 1547, 1547, 1547, - 803, 1548, 803, 1542, 1549, 978, 978, 978, 986, 986, - 986, 1554, 1554, 1554, 803, 1555, 1630, 803, 1556, 803, - 1557, 1557, 1557, 980, 1558, 2394, 988, 1559, 996, 996, - 996, 1656, 1656, 1656, 1004, 1004, 1004, 1010, 1010, 1010, - 1663, 1663, 1663, 1665, 1665, 1665, 998, 2395, 1657, 1668, - 1668, 1668, 1006, 2413, 2400, 1012, 1652, 2420, 1664, 2403, - 2399, 803, 803, 1499, 1655, 1572, 1572, 1572, 803, 1573, - - 1496, 803, 1574, 1654, 816, 816, 816, 1576, 1576, 1576, - 1670, 1670, 1670, 1579, 1579, 1579, 1672, 1672, 1672, 1673, - 1673, 1673, 818, 1582, 1582, 1582, 1662, 1494, 1660, 1584, - 1584, 1584, 1585, 1585, 1585, 1677, 1677, 1677, 1590, 1590, - 1590, 803, 1591, 2406, 1491, 1592, 1594, 1594, 1594, 1596, - 1596, 1596, 1678, 1597, 803, 1490, 1598, 871, 871, 871, - 1489, 1486, 1669, 1485, 1595, 1611, 1611, 1611, 1481, 1612, - 803, 1478, 1613, 2411, 803, 873, 1614, 1614, 1614, 1625, - 1625, 1625, 1475, 1626, 803, 1474, 1627, 1704, 1704, 1704, - 1636, 1636, 1636, 1711, 1711, 1711, 1639, 1639, 1639, 2407, - - 1640, 803, 803, 1641, 803, 1705, 2414, 2401, 1637, 1473, - 1712, 1722, 1722, 1722, 1724, 1724, 1724, 1690, 1726, 1726, - 1726, 2408, 986, 986, 986, 996, 996, 996, 1656, 1656, - 1656, 803, 1725, 2415, 2418, 1727, 1738, 1738, 1738, 1713, - 988, 2409, 1472, 998, 1471, 1657, 1730, 1730, 1730, 1468, - 1731, 1465, 1464, 1732, 1733, 1733, 1733, 1736, 1736, 1736, - 1010, 1010, 1010, 2419, 1663, 1663, 1663, 1463, 1665, 1665, - 1665, 1734, 1668, 1668, 1668, 1737, 1461, 1460, 1012, 1459, - 1458, 1728, 1664, 1454, 1440, 1729, 803, 1743, 1743, 1743, - 1670, 1670, 1670, 1672, 1672, 1672, 1673, 1673, 1673, 1677, - - 1677, 1677, 1749, 1749, 1749, 1744, 1750, 1438, 1437, 1751, - 871, 871, 871, 1770, 1770, 1770, 1678, 1775, 1775, 1775, - 1704, 1704, 1704, 1436, 1429, 1739, 1422, 1420, 873, 1740, - 1771, 1780, 1780, 1780, 1776, 1711, 1711, 1711, 1705, 1783, - 1783, 1783, 1417, 1784, 1413, 1412, 1785, 1411, 1781, 1791, - 1791, 1791, 1712, 1722, 1722, 1722, 1724, 1724, 1724, 1726, - 1726, 1726, 1409, 1795, 1795, 1795, 1792, 1796, 1406, 1763, - 1797, 1798, 1798, 1798, 1725, 1405, 1727, 996, 996, 996, - 1730, 1730, 1730, 1401, 1731, 1395, 1391, 1732, 1390, 1799, - 1733, 1733, 1733, 1389, 1383, 998, 1801, 1801, 1801, 1377, - - 1802, 1374, 1367, 1803, 1804, 1804, 1804, 1734, 1736, 1736, - 1736, 1738, 1738, 1738, 1806, 1806, 1806, 1743, 1743, 1743, - 1366, 1805, 1814, 1814, 1814, 1363, 1737, 1749, 1749, 1749, - 1362, 1750, 1807, 1361, 1751, 1744, 871, 871, 871, 1815, - 1834, 1834, 1834, 1800, 1838, 1838, 1838, 1770, 1770, 1770, - 1360, 1840, 1840, 1840, 873, 1841, 1347, 1835, 1842, 1345, - 1344, 1839, 1343, 1341, 1771, 1775, 1775, 1775, 1846, 1846, - 1846, 1340, 1847, 1337, 1336, 1848, 1850, 1850, 1850, 1780, - 1780, 1780, 1776, 1853, 1853, 1853, 1335, 1854, 1334, 1329, - 1855, 1328, 1327, 1851, 1326, 1833, 1781, 1856, 1856, 1856, - - 1783, 1783, 1783, 1325, 1784, 1324, 1323, 1785, 1791, 1791, - 1791, 1861, 1861, 1861, 1857, 1862, 1322, 1321, 1863, 1864, - 1864, 1864, 1866, 1866, 1866, 1792, 1795, 1795, 1795, 1319, - 1796, 1318, 1317, 1797, 1180, 1306, 1865, 1304, 1303, 1867, - 1798, 1798, 1798, 996, 996, 996, 1801, 1801, 1801, 1299, - 1802, 1297, 1296, 1803, 1804, 1804, 1804, 1294, 1799, 1292, - 1291, 998, 1875, 1875, 1875, 1290, 1876, 1287, 1282, 1877, - 1281, 1805, 1806, 1806, 1806, 1881, 1881, 1881, 1814, 1814, - 1814, 1884, 1884, 1884, 1280, 1885, 1278, 1276, 1886, 1275, - 1807, 871, 871, 871, 1272, 1815, 1834, 1834, 1834, 1905, - - 1905, 1905, 1271, 1906, 1268, 1266, 1907, 1265, 1874, 873, - 1908, 1908, 1908, 1835, 1909, 1909, 1909, 1838, 1838, 1838, - 1912, 1912, 1912, 1264, 1913, 1263, 1262, 1914, 1840, 1840, - 1840, 1910, 1841, 1256, 1839, 1842, 1846, 1846, 1846, 1255, - 1847, 1252, 1904, 1848, 1850, 1850, 1850, 1919, 1919, 1919, - 1242, 1920, 1241, 1240, 1921, 1853, 1853, 1853, 1239, 1854, - 1911, 1851, 1855, 1856, 1856, 1856, 1923, 1923, 1923, 1238, - 1924, 1235, 1234, 1925, 1927, 1927, 1927, 1861, 1861, 1861, - 1857, 1862, 1233, 1232, 1863, 1864, 1864, 1864, 1930, 1930, - 1930, 1928, 1931, 1225, 1222, 1932, 1866, 1866, 1866, 1933, - - 1933, 1933, 1865, 1934, 1218, 1214, 1935, 996, 996, 996, - 1875, 1875, 1875, 1867, 1876, 1212, 1211, 1877, 1945, 1945, - 1945, 1881, 1881, 1881, 1207, 998, 1884, 1884, 1884, 1206, - 1885, 1204, 1203, 1886, 1202, 1946, 1180, 1957, 1957, 1957, - 1201, 871, 871, 871, 1905, 1905, 1905, 1200, 1906, 1199, - 1197, 1907, 1196, 1191, 1958, 1908, 1908, 1908, 1942, 873, - 1909, 1909, 1909, 1968, 1968, 1968, 1190, 1969, 1189, 1188, - 1970, 1912, 1912, 1912, 1187, 1913, 1185, 1910, 1914, 1919, - 1919, 1919, 1184, 1920, 1183, 1182, 1921, 1923, 1923, 1923, - 1967, 1924, 1175, 1172, 1925, 1927, 1927, 1927, 1978, 1978, - - 1978, 1171, 1979, 1169, 1168, 1980, 1930, 1930, 1930, 1165, - 1931, 1160, 1928, 1932, 1933, 1933, 1933, 1159, 1934, 1154, - 1152, 1935, 1996, 1996, 1996, 1999, 1999, 1999, 1945, 1945, - 1945, 2001, 2001, 2001, 1148, 2002, 1147, 1143, 2003, 1141, - 1997, 1133, 2000, 1180, 1132, 1946, 1180, 1131, 1130, 1180, - 2004, 2004, 2004, 2005, 2005, 2005, 1957, 1957, 1957, 2014, - 2014, 2014, 1128, 2015, 1126, 1125, 2016, 871, 871, 871, - 1968, 1968, 1968, 1958, 1969, 1124, 1120, 1970, 2027, 2027, - 2027, 2030, 2030, 2030, 1119, 873, 2032, 2032, 2032, 1978, - 1978, 1978, 1118, 1979, 1117, 2028, 1980, 1115, 2031, 2034, - - 2034, 2034, 1114, 2033, 1996, 1996, 1996, 1999, 1999, 1999, - 2049, 2049, 2049, 1113, 2050, 1112, 2035, 2051, 1111, 2001, - 2001, 2001, 1997, 2002, 2000, 1180, 2003, 1110, 1180, 2004, - 2004, 2004, 2023, 2005, 2005, 2005, 1104, 1180, 1178, 1178, - 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1103, 1102, 1178, - 2068, 2068, 2068, 1101, 1178, 1178, 1178, 1180, 1178, 2014, - 2014, 2014, 1099, 2015, 1098, 1095, 2016, 1094, 2069, 2073, - 2073, 2073, 1093, 2074, 1092, 1091, 2075, 2027, 2027, 2027, - 2030, 2030, 2030, 1178, 1178, 1178, 1178, 1178, 1178, 1178, - 1178, 1178, 1178, 1178, 2028, 1090, 1178, 2031, 2032, 2032, - - 2032, 1178, 1178, 1178, 1180, 1178, 2077, 2077, 2077, 1089, - 2078, 1088, 1087, 2079, 1084, 2033, 2080, 2080, 2080, 1083, - 2081, 1081, 1078, 2082, 2034, 2034, 2034, 2068, 2068, 2068, - 1178, 1178, 2083, 2083, 2083, 1075, 2084, 1072, 1063, 2085, - 1061, 2035, 2049, 2049, 2049, 2069, 2050, 1057, 1055, 2051, - 2073, 2073, 2073, 1054, 2074, 1053, 1052, 2075, 1051, 1050, - 1180, 1178, 1178, 1178, 1178, 1178, 2104, 1178, 1178, 1178, - 1049, 1046, 1178, 1045, 1044, 1043, 1042, 1178, 1178, 1178, - 1180, 1178, 2077, 2077, 2077, 1041, 2078, 1040, 1039, 2079, - 2080, 2080, 2080, 1038, 2081, 1036, 1035, 2082, 2083, 2083, - - 2083, 1034, 2084, 1033, 1032, 2085, 1178, 1178, 1178, 1178, - 1178, 1178, 1178, 1178, 1178, 1178, 2104, 1031, 1030, 1178, - 2137, 2137, 2137, 803, 1178, 1178, 1178, 1180, 1178, 2142, - 2142, 2142, 2144, 2144, 2144, 2146, 2146, 2146, 1180, 1181, - 2154, 2154, 2154, 2166, 2166, 2166, 2143, 1024, 1009, 2145, - 1008, 1003, 2147, 1178, 1178, 1002, 1001, 2155, 2137, 2137, - 2137, 803, 2142, 2142, 2142, 2172, 2172, 2172, 1000, 2173, - 982, 970, 2174, 2144, 2144, 2144, 1180, 956, 955, 2143, - 2175, 2175, 2175, 954, 2176, 950, 942, 2177, 937, 936, - 2145, 2146, 2146, 2146, 2178, 2178, 2178, 935, 2179, 929, - - 926, 2180, 2154, 2154, 2154, 2166, 2166, 2166, 2147, 1315, - 2187, 2187, 2187, 921, 2188, 920, 919, 2189, 918, 2155, - 2172, 2172, 2172, 803, 2173, 917, 916, 2174, 2175, 2175, - 2175, 910, 2176, 903, 898, 2177, 2178, 2178, 2178, 897, - 2179, 893, 2200, 2180, 2187, 2187, 2187, 892, 2188, 891, - 890, 2189, 2315, 2315, 2315, 2315, 2315, 2315, 889, 2326, - 888, 887, 2327, 2421, 2421, 2421, 2421, 2421, 2421, 886, - 803, 885, 879, 803, 875, 870, 869, 868, 867, 862, - 861, 2422, 860, 857, 2422, 190, 190, 190, 190, 190, - 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, - - 191, 191, 191, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 199, 199, 199, 199, 199, 199, 199, 199, - 199, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 236, 236, 236, 236, - 236, 236, 236, 236, 236, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 263, 263, 263, 263, 263, 263, 263, - - 263, 263, 269, 269, 269, 269, 269, 269, 269, 269, - 269, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 281, 281, 281, 281, 281, 281, 281, 281, 281, 298, - 298, 298, 298, 298, 298, 298, 298, 298, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 324, 324, 324, - 324, 324, 324, 324, 324, 324, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 346, 346, 346, 346, 346, - 346, 346, 346, 346, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 357, 357, 357, 357, 357, 357, 357, - 357, 357, 364, 364, 364, 364, 364, 364, 364, 364, - - 364, 371, 371, 371, 371, 371, 371, 371, 371, 371, - 376, 376, 376, 376, 376, 376, 376, 376, 376, 384, - 384, 384, 384, 384, 384, 384, 384, 384, 390, 390, - 390, 390, 390, 390, 390, 390, 390, 397, 397, 397, - 397, 397, 397, 397, 397, 397, 402, 402, 402, 402, - 402, 402, 402, 402, 402, 408, 408, 408, 408, 408, - 408, 408, 408, 408, 414, 414, 414, 414, 414, 414, - 414, 414, 414, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 428, 428, 428, 428, 428, 428, 428, 428, - 428, 436, 436, 436, 436, 436, 436, 436, 436, 436, - - 440, 440, 440, 440, 440, 440, 440, 440, 440, 446, - 446, 446, 446, 446, 446, 446, 446, 446, 450, 450, - 450, 450, 450, 450, 450, 450, 450, 457, 457, 457, - 457, 457, 457, 457, 457, 457, 462, 462, 462, 462, - 462, 462, 462, 462, 462, 482, 482, 482, 851, 846, - 845, 482, 504, 504, 504, 841, 840, 839, 504, 512, - 512, 512, 838, 837, 835, 512, 524, 524, 524, 834, - 833, 832, 524, 530, 530, 530, 831, 830, 829, 530, - 544, 544, 544, 828, 827, 826, 544, 552, 552, 552, - 825, 824, 823, 552, 567, 567, 567, 822, 815, 814, - - 567, 578, 578, 578, 813, 812, 811, 578, 583, 583, - 583, 810, 809, 806, 583, 591, 591, 591, 804, 803, - 801, 591, 598, 598, 598, 799, 796, 792, 598, 605, - 605, 605, 790, 789, 788, 605, 610, 610, 610, 786, - 785, 784, 610, 616, 616, 616, 783, 782, 780, 616, - 624, 624, 624, 779, 778, 777, 624, 628, 628, 628, - 773, 772, 770, 628, 632, 632, 632, 769, 768, 767, - 632, 636, 636, 636, 636, 636, 636, 636, 766, 636, - 482, 482, 482, 765, 763, 762, 482, 651, 761, 760, - 758, 651, 504, 504, 504, 757, 756, 753, 504, 678, - - 752, 748, 747, 678, 512, 512, 512, 745, 744, 743, - 512, 690, 742, 739, 738, 690, 524, 524, 524, 737, - 736, 734, 524, 696, 733, 732, 731, 696, 530, 530, - 530, 730, 729, 728, 530, 702, 725, 722, 721, 702, - 719, 720, 718, 717, 719, 552, 552, 552, 712, 709, - 707, 552, 735, 706, 705, 704, 735, 567, 567, 567, - 703, 701, 698, 567, 746, 697, 695, 694, 746, 578, - 578, 578, 693, 691, 689, 578, 751, 688, 687, 686, - 751, 583, 583, 583, 685, 684, 681, 583, 759, 680, - 679, 676, 759, 591, 591, 591, 673, 672, 668, 591, - - 764, 665, 659, 658, 764, 598, 598, 598, 655, 654, - 653, 598, 771, 652, 650, 649, 771, 605, 605, 605, - 648, 647, 646, 605, 776, 645, 640, 637, 776, 610, - 610, 610, 639, 634, 633, 610, 781, 631, 629, 627, - 781, 616, 616, 616, 625, 623, 2423, 616, 787, 620, - 619, 618, 787, 624, 624, 624, 617, 615, 614, 624, - 791, 613, 612, 611, 791, 628, 628, 628, 609, 607, - 606, 628, 795, 604, 603, 600, 795, 632, 632, 632, - 599, 597, 490, 632, 800, 2423, 592, 590, 800, 802, - 802, 802, 802, 802, 802, 802, 802, 802, 808, 586, - - 585, 584, 582, 808, 482, 482, 482, 580, 579, 577, - 482, 817, 817, 817, 817, 573, 572, 817, 817, 504, - 504, 504, 571, 570, 569, 504, 848, 848, 848, 848, - 568, 566, 848, 848, 512, 512, 512, 561, 558, 557, - 512, 864, 864, 864, 864, 556, 553, 864, 864, 524, - 524, 524, 551, 549, 548, 524, 872, 872, 872, 872, - 547, 546, 872, 872, 530, 530, 530, 545, 543, 2423, - 530, 881, 881, 881, 881, 496, 538, 881, 881, 544, - 544, 544, 533, 532, 531, 544, 900, 900, 900, 900, - 529, 527, 900, 900, 552, 552, 552, 526, 525, 523, - - 552, 923, 923, 923, 923, 518, 514, 923, 923, 567, - 567, 567, 513, 511, 510, 567, 939, 939, 939, 939, - 507, 506, 939, 939, 578, 578, 578, 505, 503, 498, - 578, 947, 947, 947, 947, 2423, 483, 947, 947, 583, - 583, 583, 481, 479, 473, 583, 958, 958, 958, 958, - 472, 473, 958, 958, 591, 591, 591, 591, 472, 591, - 471, 591, 967, 967, 967, 967, 470, 2423, 967, 967, - 598, 598, 598, 598, 2423, 598, 2423, 598, 979, 979, - 979, 979, 2423, 2423, 979, 979, 605, 605, 605, 2423, - 2423, 2423, 605, 987, 987, 987, 987, 2423, 2423, 987, - - 987, 610, 610, 610, 610, 2423, 610, 2423, 610, 997, - 997, 997, 997, 2423, 2423, 997, 997, 616, 616, 616, - 2423, 2423, 2423, 616, 1005, 1005, 1005, 1005, 2423, 2423, - 1005, 1005, 624, 624, 624, 2423, 2423, 2423, 624, 1011, - 1011, 1011, 1011, 2423, 2423, 1011, 1011, 1018, 1018, 1018, - 1018, 2423, 2423, 1018, 1018, 632, 632, 632, 2423, 2423, - 2423, 632, 1026, 1026, 1026, 1026, 2423, 2423, 1026, 1026, - 802, 802, 802, 802, 802, 802, 802, 802, 802, 808, - 2423, 808, 2423, 2423, 808, 482, 482, 482, 2423, 2423, - 2423, 482, 817, 817, 817, 817, 2423, 2423, 817, 817, - - 504, 504, 504, 504, 2423, 504, 2423, 504, 848, 848, - 848, 848, 2423, 2423, 848, 848, 512, 512, 512, 2423, - 2423, 2423, 512, 864, 864, 864, 864, 2423, 2423, 864, - 864, 524, 524, 524, 2423, 2423, 2423, 524, 872, 872, - 872, 872, 2423, 2423, 872, 872, 530, 530, 530, 2423, - 2423, 2423, 530, 881, 881, 881, 881, 2423, 2423, 881, - 881, 544, 544, 544, 2423, 2423, 2423, 544, 900, 900, - 900, 900, 2423, 2423, 900, 900, 552, 552, 552, 2423, - 2423, 2423, 552, 923, 923, 923, 923, 2423, 2423, 923, - 923, 567, 567, 567, 2423, 2423, 2423, 567, 939, 939, - - 939, 939, 2423, 2423, 939, 939, 578, 578, 578, 2423, - 2423, 2423, 578, 947, 947, 947, 947, 2423, 2423, 947, - 947, 583, 583, 583, 2423, 2423, 2423, 583, 958, 958, - 958, 958, 2423, 2423, 958, 958, 591, 591, 591, 2423, - 2423, 2423, 591, 967, 967, 967, 967, 2423, 2423, 967, - 967, 598, 598, 598, 2423, 2423, 2423, 598, 979, 979, - 979, 979, 2423, 2423, 979, 979, 605, 605, 605, 2423, - 2423, 2423, 605, 987, 987, 987, 987, 2423, 2423, 987, - 987, 610, 610, 610, 2423, 2423, 2423, 610, 997, 997, - 997, 997, 2423, 2423, 997, 997, 616, 616, 616, 2423, - - 2423, 2423, 616, 1005, 1005, 1005, 1005, 2423, 2423, 1005, - 1005, 624, 624, 624, 2423, 2423, 2423, 624, 1011, 1011, - 1011, 1011, 2423, 2423, 1011, 1011, 1018, 1018, 1018, 1018, - 2423, 2423, 1018, 1018, 632, 632, 632, 2423, 2423, 2423, - 632, 1026, 1026, 1026, 1026, 2423, 2423, 1026, 1026, 802, - 802, 802, 802, 802, 802, 802, 802, 802, 1178, 1178, - 1178, 1178, 1178, 1178, 1178, 1178, 1178, 482, 482, 482, - 2423, 2423, 2423, 482, 817, 817, 817, 817, 2423, 2423, - 817, 817, 504, 504, 504, 2423, 2423, 2423, 504, 848, - 848, 848, 848, 2423, 2423, 848, 848, 512, 512, 512, - - 2423, 2423, 2423, 512, 864, 864, 864, 864, 2423, 2423, - 864, 864, 524, 524, 524, 2423, 2423, 2423, 524, 872, - 872, 872, 872, 2423, 2423, 872, 872, 530, 530, 530, - 2423, 2423, 2423, 530, 544, 544, 544, 2423, 2423, 2423, - 544, 900, 900, 900, 900, 2423, 2423, 900, 900, 552, - 552, 552, 2423, 2423, 2423, 552, 923, 923, 923, 923, - 2423, 2423, 923, 923, 567, 567, 567, 2423, 2423, 2423, - 567, 939, 939, 939, 939, 2423, 2423, 939, 939, 578, - 578, 578, 2423, 2423, 2423, 578, 947, 947, 947, 947, - 2423, 2423, 947, 947, 583, 583, 583, 2423, 2423, 2423, - - 583, 958, 958, 958, 958, 2423, 2423, 958, 958, 591, - 591, 591, 2423, 2423, 2423, 591, 967, 967, 967, 967, - 2423, 2423, 967, 967, 598, 598, 598, 2423, 2423, 2423, - 598, 979, 979, 979, 979, 2423, 2423, 979, 979, 605, - 605, 605, 2423, 2423, 2423, 605, 987, 987, 987, 987, - 2423, 2423, 987, 987, 610, 610, 610, 2423, 2423, 2423, - 610, 997, 997, 997, 997, 2423, 2423, 997, 997, 616, - 616, 616, 2423, 2423, 2423, 616, 1005, 1005, 1005, 1005, - 2423, 2423, 1005, 1005, 624, 624, 624, 624, 2423, 624, - 2423, 624, 1011, 1011, 1011, 1011, 2423, 2423, 1011, 1011, - - 1018, 1018, 1018, 1018, 2423, 2423, 1018, 1018, 632, 632, - 632, 632, 2423, 632, 2423, 632, 1026, 1026, 1026, 1026, - 2423, 2423, 1026, 1026, 802, 802, 802, 802, 802, 802, - 802, 802, 802, 1178, 1178, 1178, 1178, 1178, 1178, 1178, - 1178, 1178, 482, 482, 482, 2423, 2423, 2423, 482, 817, - 817, 817, 817, 2423, 2423, 817, 817, 504, 504, 504, - 2423, 2423, 2423, 504, 848, 848, 848, 848, 2423, 2423, - 848, 848, 512, 512, 512, 2423, 2423, 2423, 512, 864, - 864, 864, 864, 2423, 2423, 864, 864, 524, 524, 524, - 2423, 2423, 2423, 524, 872, 872, 872, 872, 2423, 2423, - - 872, 872, 530, 530, 530, 2423, 2423, 2423, 530, 544, - 544, 544, 2423, 2423, 2423, 544, 900, 900, 900, 900, - 2423, 2423, 900, 900, 552, 552, 552, 2423, 2423, 2423, - 552, 923, 923, 923, 923, 2423, 2423, 923, 923, 567, - 567, 567, 2423, 2423, 2423, 567, 939, 939, 939, 939, - 2423, 2423, 939, 939, 578, 578, 578, 2423, 2423, 2423, - 578, 947, 947, 947, 947, 2423, 2423, 947, 947, 583, - 583, 583, 2423, 2423, 2423, 583, 958, 958, 958, 958, - 2423, 2423, 958, 958, 591, 591, 591, 2423, 2423, 2423, - 591, 967, 967, 967, 967, 2423, 2423, 967, 967, 598, - - 598, 598, 598, 2423, 598, 2423, 598, 979, 979, 979, - 979, 2423, 2423, 979, 979, 605, 605, 605, 2423, 2423, - 2423, 605, 987, 987, 987, 987, 2423, 2423, 987, 987, - 610, 610, 610, 610, 2423, 610, 2423, 610, 997, 997, - 997, 997, 2423, 2423, 997, 997, 616, 616, 616, 2423, - 2423, 2423, 616, 1005, 1005, 1005, 1005, 2423, 2423, 1005, - 1005, 1011, 1011, 1011, 1011, 2423, 2423, 1011, 1011, 1018, - 1018, 1018, 1018, 2423, 2423, 1018, 1018, 1026, 1026, 1026, - 1026, 2423, 2423, 1026, 1026, 802, 802, 802, 802, 802, - 802, 802, 802, 802, 1178, 1178, 1178, 1178, 1178, 1178, - - 1178, 1178, 1178, 482, 482, 482, 482, 2423, 482, 2423, - 482, 817, 817, 817, 817, 2423, 2423, 817, 817, 504, - 504, 504, 2423, 2423, 2423, 504, 848, 848, 848, 848, - 2423, 2423, 848, 848, 512, 512, 512, 2423, 2423, 2423, - 512, 864, 864, 864, 864, 2423, 2423, 864, 864, 524, - 524, 524, 524, 2423, 524, 2423, 524, 872, 872, 872, - 872, 2423, 2423, 872, 872, 530, 530, 530, 2423, 2423, - 2423, 530, 544, 544, 544, 2423, 2423, 2423, 544, 552, - 552, 552, 2423, 2423, 2423, 552, 923, 923, 923, 923, - 2423, 2423, 923, 923, 567, 567, 567, 2423, 2423, 2423, - - 567, 578, 578, 578, 2423, 2423, 2423, 578, 947, 947, - 947, 947, 2423, 2423, 947, 947, 583, 583, 583, 2423, - 2423, 2423, 583, 591, 591, 591, 2423, 2423, 2423, 591, - 967, 967, 967, 967, 2423, 2423, 967, 967, 598, 598, - 598, 2423, 2423, 2423, 598, 979, 979, 979, 979, 2423, - 2423, 979, 979, 605, 605, 605, 2423, 2423, 2423, 605, - 987, 987, 987, 987, 2423, 2423, 987, 987, 997, 997, - 997, 997, 2423, 2423, 997, 997, 616, 616, 616, 2423, - 2423, 2423, 616, 1005, 1005, 1005, 1005, 2423, 2423, 1005, - 1005, 1011, 1011, 1011, 1011, 2423, 2423, 1011, 1011, 1018, - - 1018, 1018, 1018, 2423, 2423, 1018, 1018, 802, 802, 802, - 802, 802, 802, 802, 802, 802, 1178, 1178, 1178, 1178, - 1178, 1178, 1178, 1178, 1178, 817, 817, 817, 817, 2423, - 2423, 817, 817, 504, 504, 504, 2423, 2423, 2423, 504, - 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2053, - 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2099, 2099, - 2099, 2099, 2099, 2099, 2099, 2099, 2099, 2102, 2102, 2102, - 2102, 2102, 2102, 2102, 2102, 2102, 2134, 2134, 2134, 2134, - 2134, 2134, 2134, 2134, 2134, 2136, 2136, 2136, 2136, 2136, - 2136, 2136, 2136, 2136, 189, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423 + 2420, 196, 197, 196, 196, 197, 196, 196, 197, 196, + 196, 197, 196, 201, 197, 201, 207, 198, 204, 207, + 198, 204, 2420, 199, 2420, 205, 199, 2420, 205, 202, + 201, 197, 201, 479, 208, 210, 211, 208, 210, 211, + 212, 213, 540, 212, 213, 479, 202, 217, 218, 480, + 214, 210, 211, 214, 215, 482, 212, 210, 211, 512, + 215, 481, 212, 217, 218, 513, 214, 197, 197, 197, + 552, 481, 214, 197, 197, 197, 229, 197, 229, 229, + 197, 229, 679, 220, 229, 197, 229, 512, 680, 220, + 502, 219, 230, 541, 681, 230, 478, 478, 478, 509, + + 231, 478, 478, 478, 478, 478, 478, 219, 221, 222, + 197, 222, 221, 221, 221, 221, 221, 221, 221, 223, + 221, 221, 221, 557, 221, 225, 221, 226, 221, 229, + 197, 229, 197, 197, 197, 197, 197, 197, 508, 229, + 197, 229, 229, 197, 229, 231, 2420, 1545, 232, 482, + 482, 232, 509, 221, 221, 230, 510, 482, 230, 229, + 197, 229, 478, 478, 478, 481, 481, 478, 478, 478, + 478, 478, 478, 481, 1546, 233, 227, 221, 222, 197, + 222, 221, 221, 221, 221, 221, 221, 221, 223, 221, + 221, 221, 568, 221, 225, 221, 226, 221, 229, 197, + + 229, 197, 197, 197, 197, 197, 197, 493, 229, 197, + 229, 229, 197, 229, 233, 2420, 509, 234, 514, 1547, + 234, 607, 221, 221, 231, 510, 510, 231, 197, 197, + 197, 197, 197, 197, 229, 197, 229, 229, 197, 229, + 229, 197, 229, 513, 235, 227, 577, 235, 482, 578, + 233, 2420, 482, 233, 511, 515, 236, 229, 197, 229, + 512, 478, 478, 478, 481, 2420, 513, 516, 481, 509, + 514, 514, 513, 236, 237, 238, 197, 238, 237, 237, + 237, 237, 237, 237, 237, 239, 237, 237, 237, 500, + 237, 241, 237, 242, 237, 245, 197, 245, 245, 197, + + 245, 270, 197, 270, 508, 534, 1548, 210, 211, 535, + 482, 246, 212, 536, 246, 639, 517, 271, 509, 237, + 237, 639, 256, 478, 478, 478, 481, 243, 237, 238, + 197, 238, 237, 237, 237, 237, 237, 237, 237, 239, + 237, 237, 237, 611, 237, 241, 237, 242, 237, 572, + 612, 257, 640, 210, 211, 270, 197, 270, 212, 197, + 197, 197, 197, 197, 197, 478, 478, 478, 256, 573, + 619, 271, 513, 237, 237, 272, 661, 620, 272, 662, + 1552, 243, 247, 248, 197, 248, 247, 247, 247, 247, + 247, 247, 247, 249, 247, 247, 247, 257, 247, 251, + + 247, 252, 247, 270, 197, 270, 270, 197, 270, 270, + 197, 270, 538, 270, 197, 270, 284, 197, 284, 271, + 482, 482, 271, 482, 527, 273, 539, 247, 247, 273, + 521, 528, 285, 1558, 1559, 253, 481, 481, 254, 481, + 481, 478, 478, 478, 255, 247, 248, 197, 248, 247, + 247, 247, 247, 247, 247, 247, 249, 247, 247, 247, + 655, 247, 251, 247, 252, 247, 284, 197, 284, 295, + 197, 295, 295, 197, 295, 656, 295, 197, 295, 295, + 197, 295, 285, 482, 579, 296, 482, 482, 296, 605, + 247, 247, 297, 547, 581, 297, 1560, 580, 253, 481, + + 606, 254, 481, 481, 487, 582, 583, 255, 258, 259, + 197, 259, 258, 258, 258, 258, 258, 258, 258, 260, + 258, 258, 258, 2420, 258, 262, 258, 263, 258, 197, + 197, 197, 197, 197, 197, 295, 197, 295, 648, 295, + 197, 295, 295, 197, 295, 298, 488, 482, 298, 482, + 482, 299, 489, 258, 258, 299, 490, 584, 300, 1565, + 640, 491, 264, 481, 265, 481, 481, 266, 478, 478, + 478, 621, 267, 268, 258, 259, 197, 259, 258, 258, + 258, 258, 258, 258, 258, 260, 258, 258, 258, 513, + 258, 262, 258, 263, 258, 295, 197, 295, 197, 197, + + 197, 197, 197, 197, 1529, 295, 197, 295, 295, 197, + 295, 300, 1530, 482, 301, 482, 482, 301, 504, 258, + 258, 297, 594, 599, 297, 478, 478, 478, 264, 481, + 265, 481, 481, 266, 478, 478, 478, 613, 267, 268, + 274, 275, 197, 275, 274, 274, 274, 274, 274, 274, + 274, 276, 274, 274, 274, 655, 274, 278, 274, 279, + 274, 197, 197, 197, 197, 197, 197, 295, 197, 295, + 1569, 295, 197, 295, 295, 197, 295, 302, 674, 674, + 302, 675, 685, 300, 614, 274, 274, 300, 513, 1212, + 303, 700, 280, 478, 478, 478, 1570, 281, 478, 478, + + 478, 632, 2420, 478, 478, 478, 282, 274, 275, 197, + 275, 274, 274, 274, 274, 274, 274, 274, 276, 274, + 274, 274, 1492, 274, 278, 274, 279, 274, 295, 197, + 295, 197, 197, 197, 197, 197, 197, 825, 295, 197, + 295, 295, 197, 295, 303, 682, 555, 304, 504, 556, + 304, 825, 274, 274, 305, 560, 482, 305, 683, 280, + 688, 510, 1351, 675, 281, 478, 478, 478, 478, 478, + 478, 1209, 481, 282, 286, 287, 197, 287, 286, 286, + 286, 286, 286, 286, 286, 288, 286, 286, 286, 500, + 286, 290, 286, 291, 286, 197, 197, 197, 197, 197, + + 197, 295, 197, 295, 559, 295, 197, 295, 295, 197, + 295, 306, 482, 482, 306, 688, 1571, 303, 685, 286, + 286, 303, 1573, 1577, 307, 478, 478, 478, 481, 481, + 292, 478, 478, 478, 478, 478, 478, 825, 293, 286, + 287, 197, 287, 286, 286, 286, 286, 286, 286, 286, + 288, 286, 286, 286, 1490, 286, 290, 286, 291, 286, + 295, 197, 295, 320, 197, 320, 320, 197, 320, 1076, + 197, 197, 197, 197, 197, 197, 307, 482, 482, 321, + 735, 1077, 321, 736, 286, 286, 272, 1578, 1579, 272, + 478, 478, 478, 481, 481, 292, 478, 478, 478, 478, + + 478, 478, 1580, 293, 308, 309, 197, 309, 308, 308, + 308, 308, 308, 308, 308, 310, 308, 308, 308, 1581, + 308, 312, 308, 313, 308, 320, 197, 320, 320, 197, + 320, 320, 197, 320, 1086, 320, 197, 320, 478, 478, + 478, 321, 482, 482, 321, 1584, 1077, 322, 825, 308, + 308, 322, 314, 1086, 315, 478, 478, 478, 481, 481, + 316, 478, 478, 478, 827, 1110, 317, 1591, 1593, 318, + 308, 309, 197, 309, 308, 308, 308, 308, 308, 308, + 308, 310, 308, 308, 308, 1602, 308, 312, 308, 313, + 308, 338, 197, 338, 338, 197, 338, 354, 197, 354, + + 1603, 354, 197, 354, 478, 478, 478, 339, 825, 956, + 339, 686, 1057, 355, 957, 308, 308, 355, 314, 690, + 315, 478, 478, 478, 683, 680, 316, 478, 478, 478, + 1604, 691, 317, 1606, 1612, 318, 323, 324, 197, 324, + 323, 323, 323, 323, 323, 323, 323, 325, 323, 323, + 323, 326, 323, 327, 323, 328, 323, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, + 326, 323, 323, 326, 329, 330, 331, 326, 326, 326, + 326, 326, 332, 326, 333, 326, 326, 326, 334, 326, + + 335, 336, 326, 326, 326, 326, 326, 326, 340, 341, + 197, 341, 340, 340, 340, 340, 340, 340, 340, 342, + 340, 340, 340, 343, 340, 344, 340, 345, 340, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 343, 340, 340, 343, 346, 347, 348, 343, + 343, 343, 343, 343, 349, 343, 350, 343, 343, 343, + 351, 343, 343, 352, 343, 343, 343, 343, 343, 343, + 356, 357, 197, 357, 356, 356, 356, 356, 356, 356, + 356, 358, 356, 356, 356, 1618, 356, 360, 356, 361, + + 356, 365, 197, 365, 365, 197, 365, 378, 197, 378, + 1534, 378, 197, 378, 1619, 482, 686, 366, 1535, 932, + 366, 1212, 626, 379, 1622, 356, 356, 379, 933, 730, + 362, 481, 478, 478, 478, 934, 363, 356, 357, 197, + 357, 356, 356, 356, 356, 356, 356, 356, 358, 356, + 356, 356, 1610, 356, 360, 356, 361, 356, 197, 197, + 197, 197, 197, 197, 378, 197, 378, 1623, 378, 197, + 378, 478, 478, 478, 272, 825, 1625, 272, 1629, 690, + 379, 1609, 356, 356, 379, 680, 1631, 362, 478, 478, + 478, 681, 1212, 363, 367, 368, 197, 368, 367, 367, + + 367, 367, 367, 367, 367, 369, 367, 367, 367, 1632, + 367, 371, 367, 372, 367, 378, 197, 378, 378, 197, + 378, 390, 197, 390, 1633, 390, 197, 390, 197, 197, + 197, 380, 1637, 1491, 380, 482, 686, 391, 1643, 367, + 367, 391, 644, 373, 392, 478, 478, 478, 1644, 732, + 374, 481, 375, 478, 478, 478, 478, 478, 478, 376, + 367, 368, 197, 368, 367, 367, 367, 367, 367, 367, + 367, 369, 367, 367, 367, 1645, 367, 371, 367, 372, + 367, 197, 197, 197, 390, 197, 390, 390, 197, 390, + 1646, 390, 197, 390, 390, 197, 390, 392, 1647, 1648, + + 391, 482, 686, 391, 1649, 367, 367, 393, 653, 373, + 393, 478, 478, 478, 1650, 733, 374, 481, 375, 478, + 478, 478, 478, 478, 478, 376, 381, 382, 197, 382, + 381, 381, 381, 381, 381, 381, 381, 383, 381, 381, + 381, 1651, 381, 385, 381, 386, 381, 404, 197, 404, + 404, 197, 404, 197, 197, 197, 1652, 197, 197, 197, + 404, 197, 404, 405, 1658, 1659, 405, 1660, 1665, 392, + 1666, 381, 381, 392, 1667, 1671, 405, 387, 478, 478, + 478, 478, 478, 478, 1672, 1212, 659, 659, 659, 1673, + 1675, 388, 381, 382, 197, 382, 381, 381, 381, 381, + + 381, 381, 381, 383, 381, 381, 381, 1676, 381, 385, + 381, 386, 381, 404, 197, 404, 404, 197, 404, 404, + 197, 404, 1677, 416, 197, 416, 416, 197, 416, 405, + 1611, 1678, 406, 1681, 679, 406, 1685, 381, 381, 417, + 680, 690, 417, 387, 660, 1686, 691, 680, 659, 659, + 659, 1691, 829, 715, 842, 842, 842, 388, 394, 395, + 197, 395, 394, 394, 394, 394, 394, 394, 394, 396, + 394, 394, 394, 1692, 394, 398, 394, 399, 394, 428, + 197, 428, 428, 197, 428, 197, 197, 197, 1693, 197, + 197, 197, 428, 197, 428, 429, 1388, 1694, 429, 1661, + + 1696, 392, 1389, 394, 394, 392, 1390, 1662, 429, 400, + 1391, 1701, 401, 859, 859, 859, 1702, 843, 1704, 842, + 842, 842, 1212, 402, 394, 395, 197, 395, 394, 394, + 394, 394, 394, 394, 394, 396, 394, 394, 394, 1714, + 394, 398, 394, 399, 394, 428, 197, 428, 428, 197, + 428, 428, 197, 428, 1663, 442, 197, 442, 442, 197, + 442, 429, 1664, 1212, 430, 1687, 1717, 430, 1710, 394, + 394, 443, 1718, 1688, 443, 400, 843, 1689, 401, 871, + 871, 871, 912, 872, 1721, 1690, 873, 1724, 1725, 402, + 407, 408, 197, 408, 407, 407, 407, 407, 407, 407, + + 407, 409, 407, 407, 407, 1709, 407, 411, 407, 412, + 407, 197, 197, 197, 197, 197, 197, 442, 197, 442, + 1726, 442, 197, 442, 442, 197, 442, 444, 1727, 1728, + 444, 1729, 1730, 443, 1731, 407, 407, 443, 1732, 1733, + 445, 413, 842, 842, 842, 1734, 414, 407, 408, 197, + 408, 407, 407, 407, 407, 407, 407, 407, 409, 407, + 407, 407, 1736, 407, 411, 407, 412, 407, 442, 197, + 442, 454, 197, 454, 454, 197, 454, 1737, 464, 197, + 464, 464, 197, 464, 445, 1738, 1739, 455, 1740, 1741, + 455, 1742, 407, 407, 465, 1743, 1744, 465, 413, 859, + + 859, 859, 1745, 414, 418, 419, 197, 419, 418, 418, + 418, 418, 418, 418, 418, 420, 418, 418, 418, 1748, + 418, 422, 418, 423, 418, 197, 197, 197, 197, 197, + 197, 464, 197, 464, 1749, 464, 197, 464, 464, 197, + 464, 272, 1392, 1752, 272, 1753, 1754, 465, 1393, 418, + 418, 465, 1394, 1755, 466, 424, 1395, 1759, 425, 881, + 881, 881, 912, 882, 1760, 1761, 883, 1762, 1763, 426, + 418, 419, 197, 419, 418, 418, 418, 418, 418, 418, + 418, 420, 418, 418, 418, 1764, 418, 422, 418, 423, + 418, 464, 197, 464, 476, 197, 476, 476, 197, 476, + + 697, 697, 697, 1765, 838, 838, 838, 466, 1766, 1768, + 477, 1780, 1790, 477, 1791, 418, 418, 698, 1792, 552, + 552, 424, 840, 1793, 425, 859, 859, 859, 1212, 553, + 558, 1224, 1224, 1224, 1797, 426, 431, 432, 197, 432, + 431, 431, 431, 431, 431, 431, 431, 433, 431, 431, + 431, 1212, 431, 435, 431, 436, 431, 554, 554, 705, + 705, 705, 1798, 555, 1799, 1787, 556, 721, 721, 721, + 1800, 513, 557, 1801, 1802, 507, 706, 737, 737, 737, + 1803, 431, 431, 1786, 722, 1228, 1228, 1228, 1804, 437, + 1805, 438, 1806, 439, 738, 1226, 1226, 1226, 1231, 1231, + + 1231, 440, 431, 432, 197, 432, 431, 431, 431, 431, + 431, 431, 431, 433, 431, 431, 431, 1807, 431, 435, + 431, 436, 431, 745, 745, 745, 748, 748, 748, 763, + 763, 763, 771, 771, 771, 776, 776, 776, 1809, 1810, + 746, 1227, 1811, 749, 1812, 1813, 764, 431, 431, 772, + 1816, 1817, 777, 1821, 1824, 437, 1825, 438, 1828, 439, + 1239, 1239, 1239, 1262, 1262, 1262, 1832, 440, 446, 447, + 197, 447, 446, 446, 446, 446, 446, 446, 446, 448, + 446, 446, 446, 1833, 446, 450, 446, 451, 446, 796, + 796, 796, 815, 815, 815, 819, 819, 819, 866, 866, + + 866, 838, 838, 838, 1834, 1835, 797, 1836, 1839, 816, + 1840, 1857, 820, 446, 446, 1212, 868, 1858, 1859, 840, + 904, 904, 904, 1868, 905, 1869, 825, 906, 922, 922, + 922, 1870, 923, 1212, 1871, 924, 452, 446, 447, 197, + 447, 446, 446, 446, 446, 446, 446, 446, 448, 446, + 446, 446, 1855, 446, 450, 446, 451, 446, 841, 697, + 697, 697, 866, 866, 866, 1854, 876, 876, 876, 876, + 876, 876, 705, 705, 705, 1856, 698, 884, 884, 884, + 868, 1872, 446, 446, 878, 1873, 1874, 878, 1875, 706, + 1876, 935, 935, 935, 885, 936, 1877, 1878, 937, 1273, + + 1273, 1273, 1274, 1274, 1274, 452, 456, 457, 197, 457, + 456, 456, 456, 456, 456, 456, 456, 458, 456, 456, + 456, 869, 456, 460, 456, 461, 456, 887, 887, 887, + 1880, 1881, 879, 1887, 1888, 892, 892, 892, 892, 892, + 892, 900, 900, 900, 888, 1224, 1224, 1224, 1227, 1889, + 1893, 456, 456, 894, 1901, 1902, 894, 1903, 1925, 902, + 1926, 1930, 462, 456, 457, 197, 457, 456, 456, 456, + 456, 456, 456, 456, 458, 456, 456, 456, 825, 456, + 460, 456, 461, 456, 1931, 895, 900, 900, 900, 721, + 721, 721, 908, 908, 908, 737, 737, 737, 908, 908, + + 908, 745, 745, 745, 902, 1934, 722, 1921, 456, 456, + 910, 1935, 738, 1226, 1226, 1226, 910, 1938, 746, 462, + 467, 468, 197, 468, 467, 467, 467, 467, 467, 467, + 467, 469, 467, 467, 467, 911, 467, 471, 467, 472, + 467, 927, 927, 927, 927, 927, 927, 1939, 1862, 903, + 748, 748, 748, 939, 939, 939, 1940, 940, 1863, 929, + 941, 1864, 929, 1941, 1865, 467, 467, 749, 942, 942, + 942, 959, 959, 959, 1866, 960, 473, 1867, 961, 971, + 971, 971, 1942, 972, 1943, 943, 973, 1944, 474, 467, + 468, 197, 468, 467, 467, 467, 467, 467, 467, 467, + + 469, 467, 467, 467, 930, 467, 471, 467, 472, 467, + 951, 951, 951, 951, 951, 951, 763, 763, 763, 962, + 962, 962, 966, 966, 966, 966, 966, 966, 953, 1945, + 1946, 953, 1955, 764, 467, 467, 963, 771, 771, 771, + 968, 1956, 1212, 968, 1957, 473, 974, 974, 974, 1958, + 1932, 974, 974, 974, 772, 1965, 1968, 474, 482, 1975, + 776, 776, 776, 1933, 976, 497, 985, 985, 985, 976, + 954, 985, 985, 985, 481, 498, 969, 777, 979, 979, + 979, 1976, 980, 1922, 987, 981, 1228, 1228, 1228, 987, + 989, 989, 989, 1231, 1231, 1231, 991, 991, 991, 994, + + 994, 994, 499, 500, 501, 1212, 1936, 990, 1977, 502, + 503, 977, 504, 992, 1978, 1979, 505, 996, 506, 1937, + 507, 2420, 2420, 2420, 1980, 1212, 988, 994, 994, 994, + 999, 999, 999, 2420, 2420, 2420, 1986, 1987, 2420, 1003, + 1003, 1003, 2420, 2420, 2420, 996, 1923, 1000, 1988, 1989, + 2420, 1006, 1006, 1006, 825, 1990, 1004, 1991, 1992, 2420, + 1983, 1993, 1006, 1006, 1006, 796, 796, 796, 1994, 1008, + 1011, 1011, 1011, 1995, 1012, 1998, 1999, 1013, 2000, 993, + 1008, 2001, 797, 1001, 1014, 1014, 1014, 997, 1014, 1014, + 1014, 1018, 1018, 1018, 2420, 2420, 2420, 1002, 2002, 1009, + + 1005, 1982, 1016, 1022, 1022, 1022, 1016, 2003, 1019, 2004, + 2005, 2420, 1024, 1024, 1024, 1024, 1024, 1024, 2010, 2011, + 1023, 1032, 1032, 1032, 1032, 1032, 1032, 1038, 1038, 1038, + 1026, 2012, 2013, 1026, 1038, 1038, 1038, 2014, 2015, 1034, + 2019, 2028, 1034, 1017, 1020, 1040, 815, 815, 815, 1042, + 1042, 1042, 1040, 1043, 2029, 2030, 1044, 2031, 1021, 1045, + 1045, 1045, 2032, 816, 1045, 1045, 1045, 819, 819, 819, + 2033, 1049, 1049, 1049, 2044, 1050, 825, 1047, 1051, 871, + 871, 871, 1047, 872, 820, 1027, 873, 1035, 1053, 1053, + 1053, 1053, 1053, 1053, 838, 838, 838, 1041, 838, 838, + + 838, 838, 838, 838, 2045, 2046, 1055, 1911, 2020, 1055, + 2036, 2047, 840, 1088, 1088, 1088, 840, 1912, 2021, 840, + 866, 866, 866, 1913, 1048, 866, 866, 866, 2048, 2049, + 1089, 866, 866, 866, 1091, 1091, 1091, 1914, 868, 2420, + 2420, 2420, 2022, 868, 876, 876, 876, 1915, 1065, 868, + 2024, 1092, 2023, 1916, 1056, 2050, 2420, 876, 876, 876, + 2025, 2026, 878, 876, 876, 876, 881, 881, 881, 2051, + 882, 2027, 2055, 883, 2056, 878, 884, 884, 884, 2057, + 1090, 878, 1097, 1097, 1097, 2058, 1098, 2059, 2060, 1099, + 1100, 1100, 1100, 885, 887, 887, 887, 2062, 2063, 1093, + + 2064, 1102, 1102, 1102, 2067, 1103, 2072, 1101, 1104, 2073, + 1095, 888, 1106, 1106, 1106, 892, 892, 892, 892, 892, + 892, 892, 892, 892, 1112, 1112, 1112, 2074, 2075, 1107, + 900, 900, 900, 894, 2076, 2077, 894, 2078, 2079, 894, + 2080, 1113, 900, 900, 900, 900, 900, 900, 902, 904, + 904, 904, 2081, 905, 2082, 2083, 906, 908, 908, 908, + 902, 825, 2090, 902, 908, 908, 908, 1117, 1117, 1117, + 1128, 1128, 1128, 2091, 2092, 910, 2093, 922, 922, 922, + 1109, 923, 910, 2094, 924, 1118, 2095, 1129, 927, 927, + 927, 2096, 1115, 927, 927, 927, 927, 927, 927, 2097, + + 935, 935, 935, 2084, 936, 2098, 929, 937, 1137, 1137, + 1137, 929, 2099, 2100, 929, 939, 939, 939, 2101, 940, + 2102, 2103, 941, 2106, 2107, 1138, 942, 942, 942, 1139, + 1139, 1139, 2108, 1140, 2112, 2119, 1141, 951, 951, 951, + 951, 951, 951, 943, 951, 951, 951, 959, 959, 959, + 2120, 960, 2121, 2122, 961, 953, 2123, 2124, 953, 2125, + 1132, 2126, 953, 962, 962, 962, 1154, 1154, 1154, 2127, + 1155, 2128, 2129, 1156, 966, 966, 966, 966, 966, 966, + 963, 966, 966, 966, 971, 971, 971, 2130, 972, 2138, + 2139, 973, 968, 2140, 2141, 968, 974, 974, 974, 968, + + 974, 974, 974, 974, 974, 974, 985, 985, 985, 825, + 1149, 985, 985, 985, 976, 979, 979, 979, 976, 980, + 2133, 976, 981, 2142, 987, 985, 985, 985, 2133, 987, + 2143, 2136, 1159, 989, 989, 989, 2144, 1167, 1167, 1167, + 2145, 1168, 2134, 987, 1169, 991, 991, 991, 2146, 2147, + 990, 1170, 1170, 1170, 2131, 1171, 2148, 2153, 1172, 994, + 994, 994, 992, 994, 994, 994, 999, 999, 999, 1161, + 994, 994, 994, 1003, 1003, 1003, 2158, 996, 1176, 1176, + 1176, 996, 1177, 1000, 1166, 1178, 2159, 2160, 996, 2161, + 1004, 1181, 1181, 1181, 2164, 1182, 1212, 1213, 1183, 1006, + + 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1011, 1011, + 1011, 825, 1012, 2164, 2167, 1013, 2168, 1008, 2169, 2170, + 1008, 2177, 2179, 1008, 1014, 1014, 1014, 1014, 1014, 1014, + 1014, 1014, 1014, 1018, 1018, 1018, 1174, 1188, 1188, 1188, + 2178, 1189, 1016, 2182, 1190, 1016, 2149, 2180, 1016, 2151, + 1019, 2162, 1022, 1022, 1022, 1193, 1193, 1193, 2150, 1194, + 2187, 2152, 1195, 1024, 1024, 1024, 2181, 2154, 1185, 1023, + 1024, 1024, 1024, 1024, 1024, 1024, 1198, 1198, 1198, 2155, + 2156, 1026, 1032, 1032, 1032, 1032, 1032, 1032, 1026, 1187, + 2133, 1026, 2157, 1199, 1032, 1032, 1032, 1038, 1038, 1038, + + 1034, 2136, 2185, 1034, 1038, 1038, 1038, 1038, 1038, 1038, + 2133, 2190, 1034, 2188, 2164, 1040, 1042, 1042, 1042, 2192, + 1043, 2186, 1040, 1044, 2134, 1040, 1045, 1045, 1045, 1045, + 1045, 1045, 2189, 2164, 1196, 1045, 1045, 1045, 1049, 1049, + 1049, 2193, 1050, 2194, 1047, 1051, 2195, 1047, 1053, 1053, + 1053, 2196, 2206, 1047, 1202, 1053, 1053, 1053, 2207, 2208, + 1205, 1053, 1053, 1053, 2209, 2210, 1055, 1211, 1211, 1211, + 838, 838, 838, 1055, 1088, 1088, 1088, 2211, 2215, 1055, + 1242, 1242, 1242, 2216, 1243, 1212, 1213, 1244, 840, 2217, + 2218, 1089, 2219, 2220, 1206, 866, 866, 866, 1091, 1091, + + 1091, 1246, 1246, 1246, 2222, 1247, 2223, 2224, 1248, 876, + 876, 876, 2229, 868, 2230, 1092, 1097, 1097, 1097, 2231, + 1098, 1208, 2225, 1099, 1100, 1100, 1100, 878, 2232, 1253, + 1253, 1253, 2227, 1254, 2226, 1218, 1255, 2233, 1102, 1102, + 1102, 1101, 1103, 2234, 2228, 1104, 1106, 1106, 1106, 1257, + 1257, 1257, 1245, 1258, 2235, 2236, 1259, 2237, 1251, 892, + 892, 892, 2238, 1107, 1112, 1112, 1112, 1264, 1264, 1264, + 2239, 1265, 2240, 825, 1266, 2242, 2243, 894, 1267, 1267, + 1267, 1113, 900, 900, 900, 1117, 1117, 1117, 1128, 1128, + 1128, 2244, 1280, 1280, 1280, 1268, 1281, 2245, 2241, 1282, + + 902, 2246, 2247, 1118, 2248, 1129, 1283, 1283, 1283, 1261, + 1285, 1285, 1285, 2249, 927, 927, 927, 1290, 1290, 1290, + 1137, 1137, 1137, 1284, 1297, 1297, 1297, 1286, 1226, 1226, + 1226, 1269, 929, 2250, 1291, 2251, 2252, 1138, 1294, 1294, + 1294, 1298, 1295, 2253, 2254, 1296, 1139, 1139, 1139, 2255, + 1140, 2256, 2257, 1141, 2258, 2259, 1287, 951, 951, 951, + 1307, 1307, 1307, 1154, 1154, 1154, 2261, 1155, 825, 2262, + 1156, 1311, 1311, 1311, 1326, 953, 2263, 1308, 2264, 1288, + 966, 966, 966, 974, 974, 974, 2265, 2260, 1312, 1320, + 1320, 1320, 2266, 985, 985, 985, 2267, 2268, 968, 2269, + + 2270, 976, 2271, 1167, 1167, 1167, 1321, 1168, 2272, 2273, + 1169, 987, 1170, 1170, 1170, 2274, 1171, 2275, 2276, 1172, + 2278, 1305, 994, 994, 994, 1176, 1176, 1176, 2279, 1177, + 2280, 2281, 1178, 2282, 2283, 1322, 825, 1181, 1181, 1181, + 996, 1182, 2284, 1314, 1183, 1006, 1006, 1006, 1316, 1323, + 1014, 1014, 1014, 1188, 1188, 1188, 2277, 1189, 2285, 2286, + 1190, 2287, 2288, 1008, 2289, 1193, 1193, 1193, 1016, 1194, + 2290, 2291, 1195, 1024, 1024, 1024, 1198, 1198, 1198, 1337, + 1337, 1337, 2292, 1338, 2293, 2295, 1339, 1325, 1368, 1368, + 1368, 1026, 2296, 1199, 1032, 1032, 1032, 1344, 1344, 1344, + + 1038, 1038, 1038, 2297, 825, 1330, 1332, 1045, 1045, 1045, + 2294, 2298, 1034, 2299, 1345, 1348, 1348, 1348, 1040, 2300, + 1335, 1053, 1053, 1053, 2301, 1047, 1211, 1211, 1211, 838, + 838, 838, 1349, 1370, 1370, 1370, 1239, 1239, 1239, 1055, + 1377, 1377, 1377, 1342, 1212, 2302, 2303, 840, 1242, 1242, + 1242, 1369, 1243, 2304, 2305, 1244, 866, 866, 866, 1347, + 1246, 1246, 1246, 2306, 1247, 2308, 1346, 1248, 2309, 876, + 876, 876, 2310, 2311, 868, 2312, 2313, 1352, 2314, 1371, + 825, 1357, 1350, 892, 892, 892, 1378, 878, 1253, 1253, + 1253, 2315, 1254, 1353, 2307, 1255, 1257, 1257, 1257, 2317, + + 1258, 894, 2318, 1259, 1262, 1262, 1262, 1264, 1264, 1264, + 2319, 1265, 2320, 2321, 1266, 1267, 1267, 1267, 2322, 2323, + 1382, 2324, 1379, 1396, 1396, 1396, 2327, 1397, 2328, 2329, + 1398, 2330, 1268, 900, 900, 900, 1273, 1273, 1273, 1274, + 1274, 1274, 2331, 1386, 1403, 1403, 1403, 1403, 1403, 1403, + 2332, 902, 1368, 1368, 1368, 1280, 1280, 1280, 825, 1281, + 825, 2343, 1282, 1283, 1283, 1283, 1407, 1407, 1407, 825, + 1408, 825, 825, 1409, 1285, 1285, 1285, 1414, 1414, 1414, + 1284, 1410, 1410, 1410, 1399, 1411, 2341, 1544, 1412, 2385, + 825, 1286, 1290, 1290, 1290, 1415, 1417, 1417, 1417, 825, + + 1418, 2339, 2361, 1419, 1420, 1420, 1420, 1404, 2333, 1291, + 1369, 825, 1294, 1294, 1294, 1404, 1295, 825, 2335, 1296, + 2344, 1421, 1297, 1297, 1297, 1423, 1423, 1423, 825, 1424, + 825, 825, 1425, 1426, 1426, 1426, 1432, 1432, 1432, 1298, + 951, 951, 951, 1307, 1307, 1307, 2336, 1436, 1436, 1436, + 1427, 1437, 2353, 1433, 1438, 1439, 1439, 1439, 953, 2417, + 1308, 1311, 1311, 1311, 1442, 1442, 1442, 2334, 1443, 825, + 825, 1444, 1440, 1446, 1446, 1446, 825, 2337, 1312, 974, + 974, 974, 1320, 1320, 1320, 1453, 1453, 1453, 825, 1454, + 2345, 1447, 1455, 1457, 1457, 1457, 2346, 976, 825, 1321, + + 994, 994, 994, 825, 825, 1434, 1462, 1462, 1462, 2351, + 825, 1458, 1464, 1464, 1464, 2420, 2420, 2420, 996, 1006, + 1006, 1006, 2347, 1463, 1014, 1014, 1014, 825, 825, 1465, + 1449, 2340, 2420, 1470, 1470, 1470, 825, 1008, 1472, 1472, + 1472, 825, 1016, 1024, 1024, 1024, 1032, 1032, 1032, 2348, + 1471, 1460, 1337, 1337, 1337, 1473, 1338, 2338, 2342, 1339, + 2373, 1026, 825, 825, 1034, 1344, 1344, 1344, 2352, 825, + 1469, 2354, 1480, 1480, 1480, 2362, 1481, 825, 1466, 1482, + 2375, 1543, 1345, 2367, 825, 1467, 1038, 1038, 1038, 825, + 1045, 1045, 1045, 1348, 1348, 1348, 825, 1478, 1485, 1485, + + 1485, 825, 1486, 2399, 1040, 1487, 2349, 1474, 1047, 2359, + 1349, 1488, 1488, 1488, 1494, 1494, 1494, 838, 838, 838, + 1501, 1501, 1501, 1506, 1506, 1506, 1368, 1368, 1368, 1489, + 2365, 1495, 1507, 1507, 1507, 840, 1370, 1370, 1370, 1509, + 1509, 1509, 2379, 825, 1483, 1484, 1510, 1510, 1510, 1377, + 1377, 1377, 866, 866, 866, 1518, 1518, 1518, 1521, 1521, + 1521, 892, 892, 892, 1525, 1525, 1525, 1396, 1396, 1396, + 868, 1397, 1541, 1519, 1398, 1522, 825, 1496, 825, 894, + 2350, 1526, 900, 900, 900, 825, 1538, 1538, 1538, 1403, + 1403, 1403, 1542, 1542, 1542, 825, 1540, 1407, 1407, 1407, + + 902, 1408, 1515, 1539, 1409, 1410, 1410, 1410, 825, 1411, + 825, 2374, 1412, 1414, 1414, 1414, 1417, 1417, 1417, 1524, + 1418, 2355, 825, 1419, 1420, 1420, 1420, 2360, 1537, 825, + 2356, 1415, 1549, 1549, 1549, 825, 1550, 825, 825, 1551, + 2393, 1421, 1423, 1423, 1423, 2357, 1424, 2358, 825, 1425, + 1426, 1426, 1426, 1553, 1553, 1553, 825, 1554, 825, 2377, + 1555, 1556, 1556, 1556, 1432, 1432, 1432, 1427, 1561, 1561, + 1561, 2366, 1562, 2363, 2369, 1563, 825, 2368, 1557, 2376, + 1536, 1433, 951, 951, 951, 1436, 1436, 1436, 825, 1437, + 825, 2364, 1438, 1439, 1439, 1439, 825, 1566, 1566, 1566, + + 953, 1567, 1533, 2370, 1568, 1442, 1442, 1442, 825, 1443, + 1440, 2371, 1444, 1446, 1446, 1446, 974, 974, 974, 1574, + 1574, 1574, 1453, 1453, 1453, 2372, 1454, 825, 825, 1455, + 2389, 1447, 825, 1564, 976, 825, 1575, 1457, 1457, 1457, + 1582, 1582, 1582, 1462, 1462, 1462, 1585, 1585, 1585, 2380, + 1586, 2394, 825, 1587, 825, 1458, 1532, 2386, 1583, 825, + 1463, 1464, 1464, 1464, 2378, 1576, 1588, 1588, 1588, 825, + 1589, 1531, 2383, 1590, 1006, 1006, 1006, 2381, 1465, 1572, + 1014, 1014, 1014, 1470, 1470, 1470, 1595, 1595, 1595, 825, + 1596, 2384, 1008, 1597, 1472, 1472, 1472, 2382, 1016, 1528, + + 1471, 1598, 1598, 1598, 825, 1599, 2397, 825, 1600, 825, + 1527, 1473, 1024, 1024, 1024, 1032, 1032, 1032, 1480, 1480, + 1480, 2407, 1481, 2387, 825, 1482, 1038, 1038, 1038, 1594, + 1026, 2388, 825, 1034, 1045, 1045, 1045, 825, 2390, 1592, + 825, 1485, 1485, 1485, 1040, 1486, 2398, 2400, 1487, 1488, + 1488, 1488, 1047, 1494, 1494, 1494, 1613, 1613, 1613, 2409, + 1614, 2417, 1523, 1615, 838, 838, 838, 1489, 825, 2391, + 1495, 1617, 1617, 1617, 2405, 825, 1601, 1607, 1520, 1605, + 1517, 1516, 840, 1620, 1620, 1620, 825, 1608, 1501, 1501, + 1501, 1621, 1621, 1621, 1624, 1624, 1624, 1506, 1506, 1506, + + 1507, 1507, 1507, 1509, 1509, 1509, 1510, 1510, 1510, 1626, + 1626, 1626, 1627, 1627, 1627, 1628, 1628, 1628, 866, 866, + 866, 1518, 1518, 1518, 1521, 1521, 1521, 1616, 1634, 1634, + 1634, 2392, 1635, 825, 825, 1636, 868, 825, 1514, 1519, + 1513, 1522, 1638, 1638, 1638, 1525, 1525, 1525, 1640, 1640, + 1640, 825, 1641, 825, 825, 1642, 900, 900, 900, 825, + 1639, 1512, 1526, 1538, 1538, 1538, 1654, 1654, 1654, 1630, + 1655, 2406, 2401, 1656, 902, 1657, 1657, 1657, 1511, 2395, + 1539, 1542, 1542, 1542, 1549, 1549, 1549, 825, 1550, 2402, + 1508, 1551, 1553, 1553, 1553, 1505, 1554, 2396, 2403, 1555, + + 1556, 1556, 1556, 2410, 2404, 1653, 1668, 1668, 1668, 1504, + 1669, 1503, 825, 1670, 1561, 1561, 1561, 1557, 1562, 2408, + 825, 1563, 951, 951, 951, 1566, 1566, 1566, 825, 1567, + 825, 825, 1568, 1679, 1679, 1679, 1574, 1574, 1574, 825, + 953, 1682, 1682, 1682, 1502, 1683, 1500, 825, 1684, 1499, + 1498, 1680, 2411, 1575, 1582, 1582, 1582, 1585, 1585, 1585, + 2412, 1586, 2415, 2416, 1587, 1497, 1588, 1588, 1588, 1493, + 1589, 1479, 1583, 1590, 1006, 1006, 1006, 1014, 1014, 1014, + 1595, 1595, 1595, 1477, 1596, 1674, 2413, 1597, 1476, 1598, + 1598, 1598, 1008, 1599, 2414, 1016, 1600, 1024, 1024, 1024, + + 1699, 1699, 1699, 1032, 1032, 1032, 1038, 1038, 1038, 1706, + 1706, 1706, 1708, 1708, 1708, 1026, 1475, 1700, 1711, 1711, + 1711, 1034, 1468, 1461, 1040, 1695, 1459, 1707, 1456, 1452, + 825, 1451, 1450, 1698, 1613, 1613, 1613, 1448, 1614, 1445, + 1441, 1615, 1697, 838, 838, 838, 1617, 1617, 1617, 1713, + 1713, 1713, 1620, 1620, 1620, 1621, 1621, 1621, 1715, 1715, + 1715, 840, 1716, 1716, 1716, 1705, 1435, 1703, 1624, 1624, + 1624, 1626, 1626, 1626, 1627, 1627, 1627, 1628, 1628, 1628, + 1719, 1719, 1719, 1722, 1722, 1722, 1634, 1634, 1634, 1431, + 1635, 1430, 1429, 1636, 1638, 1638, 1638, 1428, 1720, 1422, + + 1723, 1712, 1640, 1640, 1640, 1416, 1641, 1413, 1406, 1642, + 1405, 1402, 1639, 900, 900, 900, 1654, 1654, 1654, 1401, + 1655, 1400, 1387, 1656, 1657, 1657, 1657, 1385, 1668, 1668, + 1668, 902, 1669, 1384, 1383, 1670, 1746, 1746, 1746, 1750, + 1750, 1750, 1679, 1679, 1679, 1756, 1756, 1756, 1682, 1682, + 1682, 1381, 1683, 1747, 1380, 1684, 1376, 1751, 1375, 1374, + 1680, 1373, 1757, 1767, 1767, 1767, 1769, 1769, 1769, 1771, + 1771, 1771, 1372, 1735, 1014, 1014, 1014, 1024, 1024, 1024, + 1699, 1699, 1699, 1367, 1770, 1366, 1772, 1778, 1778, 1778, + 1365, 1758, 1016, 1364, 1363, 1026, 1362, 1700, 1775, 1775, + + 1775, 1361, 1776, 1360, 1779, 1777, 1781, 1781, 1781, 1783, + 1783, 1783, 1038, 1038, 1038, 1359, 1706, 1706, 1706, 1358, + 1708, 1708, 1708, 1356, 1782, 1711, 1711, 1711, 1355, 1354, + 1040, 1212, 1343, 1773, 1707, 1341, 1340, 1774, 825, 1788, + 1788, 1788, 1713, 1713, 1713, 1715, 1715, 1715, 1716, 1716, + 1716, 1719, 1719, 1719, 1722, 1722, 1722, 1789, 1794, 1794, + 1794, 1336, 1795, 1334, 1333, 1796, 900, 900, 900, 1720, + 1331, 1723, 1814, 1814, 1814, 1329, 1328, 1784, 1746, 1746, + 1746, 1785, 1327, 1324, 902, 1319, 1818, 1818, 1818, 1815, + 1819, 1318, 1317, 1820, 1315, 1747, 1822, 1822, 1822, 1750, + + 1750, 1750, 1826, 1826, 1826, 1756, 1756, 1756, 1829, 1829, + 1829, 1313, 1830, 1823, 1310, 1831, 1309, 1751, 1306, 1827, + 1304, 1303, 1757, 1302, 1301, 1808, 1837, 1837, 1837, 1767, + 1767, 1767, 1769, 1769, 1769, 1771, 1771, 1771, 1841, 1841, + 1841, 1300, 1842, 1838, 1299, 1843, 1844, 1844, 1844, 1293, + 1770, 1292, 1772, 1024, 1024, 1024, 1775, 1775, 1775, 1289, + 1776, 1279, 1278, 1777, 1845, 1778, 1778, 1778, 1847, 1847, + 1847, 1026, 1848, 1277, 1276, 1849, 1850, 1850, 1850, 1781, + 1781, 1781, 1779, 1783, 1783, 1783, 1852, 1852, 1852, 1788, + 1788, 1788, 1275, 1851, 1860, 1860, 1860, 1782, 1794, 1794, + + 1794, 1272, 1795, 1271, 1853, 1796, 1270, 1789, 900, 900, + 900, 1861, 1882, 1882, 1882, 1814, 1814, 1814, 1263, 1846, + 1884, 1884, 1884, 1260, 1885, 1256, 902, 1886, 1252, 1883, + 1250, 1249, 1815, 1818, 1818, 1818, 1241, 1819, 1240, 1238, + 1820, 1822, 1822, 1822, 1890, 1890, 1890, 1237, 1891, 1236, + 1235, 1892, 1894, 1894, 1894, 1826, 1826, 1826, 1823, 1896, + 1896, 1896, 1234, 1897, 1233, 1232, 1898, 1879, 1230, 1895, + 1229, 1225, 1827, 1899, 1899, 1899, 1829, 1829, 1829, 1223, + 1830, 1222, 1221, 1831, 1837, 1837, 1837, 1904, 1904, 1904, + 1900, 1905, 1220, 1219, 1906, 1907, 1907, 1907, 1909, 1909, + + 1909, 1838, 1841, 1841, 1841, 1217, 1842, 1216, 1215, 1843, + 1214, 1207, 1908, 1204, 1203, 1910, 1844, 1844, 1844, 1024, + 1024, 1024, 1847, 1847, 1847, 1201, 1848, 1200, 1197, 1849, + 1850, 1850, 1850, 1192, 1845, 1191, 1186, 1026, 1918, 1918, + 1918, 1184, 1919, 1180, 1179, 1920, 1175, 1851, 1852, 1852, + 1852, 1924, 1924, 1924, 1860, 1860, 1860, 1927, 1927, 1927, + 1173, 1928, 1165, 1164, 1929, 1163, 1853, 900, 900, 900, + 1162, 1861, 1948, 1948, 1948, 1949, 1949, 1949, 1882, 1882, + 1882, 1924, 1924, 1924, 1917, 902, 1952, 1952, 1952, 1160, + 1953, 1158, 1950, 1954, 1157, 1883, 1884, 1884, 1884, 1153, + + 1885, 1152, 1151, 1886, 1890, 1890, 1890, 1150, 1891, 1148, + 1147, 1892, 1894, 1894, 1894, 1959, 1959, 1959, 1947, 1960, + 1146, 1951, 1961, 1896, 1896, 1896, 1145, 1897, 1144, 1895, + 1898, 1899, 1899, 1899, 1962, 1962, 1962, 1143, 1963, 1142, + 1136, 1964, 1966, 1966, 1966, 1904, 1904, 1904, 1900, 1905, + 1135, 1134, 1906, 1907, 1907, 1907, 1969, 1969, 1969, 1967, + 1970, 1133, 1131, 1971, 1909, 1909, 1909, 1972, 1972, 1972, + 1908, 1973, 1130, 1127, 1974, 1024, 1024, 1024, 1918, 1918, + 1918, 1910, 1919, 1126, 1125, 1920, 1984, 1984, 1984, 1124, + 1927, 1927, 1927, 1026, 1928, 1123, 1122, 1929, 1996, 1996, + + 1996, 1121, 1120, 1985, 1212, 900, 900, 900, 1948, 1948, + 1948, 1949, 1949, 1949, 1119, 1997, 1116, 2007, 2007, 2007, + 1114, 2008, 1111, 902, 2009, 1108, 1981, 1105, 1950, 1952, + 1952, 1952, 1096, 1953, 1094, 1087, 1954, 1959, 1959, 1959, + 1085, 1960, 1084, 1083, 1961, 1962, 1962, 1962, 1082, 1963, + 1081, 1080, 1964, 1079, 2006, 1966, 1966, 1966, 2016, 2016, + 2016, 1078, 2017, 1075, 1074, 2018, 1969, 1969, 1969, 1073, + 1970, 1072, 1967, 1971, 1972, 1972, 1972, 1071, 1973, 1070, + 1069, 1974, 2034, 2034, 2034, 2037, 2037, 2037, 1984, 1984, + 1984, 2039, 2039, 2039, 1068, 2040, 1067, 1066, 2041, 1064, + + 2035, 1063, 2038, 1212, 1062, 1985, 1212, 1061, 1060, 1212, + 2042, 2042, 2042, 2043, 2043, 2043, 1996, 1996, 1996, 2052, + 2052, 2052, 1059, 2053, 1058, 825, 2054, 900, 900, 900, + 2007, 2007, 2007, 1997, 2008, 1052, 1037, 2009, 2065, 2065, + 2065, 2068, 2068, 2068, 1036, 902, 2016, 2016, 2016, 1031, + 2017, 1030, 1029, 2018, 1028, 2066, 1010, 998, 2069, 2070, + 2070, 2070, 2034, 2034, 2034, 2037, 2037, 2037, 2085, 2085, + 2085, 984, 2086, 983, 982, 2087, 2071, 2039, 2039, 2039, + 2035, 2040, 2038, 1212, 2041, 978, 1212, 2042, 2042, 2042, + 970, 965, 2061, 964, 958, 1212, 1210, 1210, 1210, 1210, + + 1210, 1210, 1210, 1210, 1210, 955, 950, 1210, 2043, 2043, + 2043, 949, 1210, 1210, 1210, 1212, 1210, 2052, 2052, 2052, + 948, 2053, 947, 946, 2054, 2109, 2109, 2109, 945, 2110, + 944, 938, 2111, 931, 2104, 2104, 2104, 926, 2065, 2065, + 2065, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, + 1210, 1210, 2105, 925, 1210, 2066, 2068, 2068, 2068, 1210, + 1210, 1210, 1212, 1210, 2113, 2113, 2113, 921, 2114, 920, + 919, 2115, 918, 2069, 2070, 2070, 2070, 2116, 2116, 2116, + 917, 2117, 916, 915, 2118, 2104, 2104, 2104, 1210, 1210, + 914, 2071, 2085, 2085, 2085, 913, 2086, 907, 899, 2087, + + 2109, 2109, 2109, 2105, 2110, 898, 897, 2111, 896, 891, + 1212, 1210, 1210, 1210, 1210, 1210, 2137, 1210, 1210, 1210, + 890, 889, 1210, 886, 880, 875, 874, 1210, 1210, 1210, + 1212, 1210, 2113, 2113, 2113, 870, 2114, 865, 864, 2115, + 2116, 2116, 2116, 863, 2117, 862, 861, 2118, 860, 2166, + 2166, 2166, 858, 2171, 2171, 2171, 1210, 1210, 1210, 1210, + 1210, 1210, 1210, 1210, 1210, 1210, 2137, 1212, 1213, 1210, + 2172, 2173, 2173, 2173, 1210, 1210, 1210, 1212, 1210, 2175, + 2175, 2175, 2183, 2183, 2183, 2171, 2171, 2171, 2174, 2191, + 2191, 2191, 2166, 2166, 2166, 857, 2176, 856, 855, 2184, + + 854, 853, 2172, 1210, 1210, 852, 851, 825, 850, 849, + 1212, 2197, 2197, 2197, 848, 2198, 847, 846, 2199, 2173, + 2173, 2173, 2200, 2200, 2200, 845, 2201, 844, 837, 2202, + 2175, 2175, 2175, 2203, 2203, 2203, 2174, 2204, 836, 835, + 2205, 834, 833, 1352, 2183, 2183, 2183, 2176, 2212, 2212, + 2212, 832, 2213, 831, 828, 2214, 2191, 2191, 2191, 826, + 825, 2184, 2197, 2197, 2197, 823, 2198, 821, 818, 2199, + 814, 2200, 2200, 2200, 825, 2201, 812, 811, 2202, 2203, + 2203, 2203, 810, 2204, 808, 807, 2205, 2212, 2212, 2212, + 806, 2213, 805, 2221, 2214, 2316, 2316, 2316, 2316, 2316, + + 2316, 804, 2325, 802, 801, 2326, 2418, 2418, 2418, 2418, + 2418, 2418, 800, 825, 799, 795, 825, 794, 792, 791, + 790, 789, 788, 787, 2419, 785, 784, 2419, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 200, 200, 200, 200, + 200, 200, 200, 200, 200, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 224, 224, 224, 224, 224, 224, 224, 224, 224, + + 228, 228, 228, 228, 228, 228, 228, 228, 228, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 289, 289, 289, 289, 289, 289, 289, 289, + 289, 294, 294, 294, 294, 294, 294, 294, 294, 294, + 311, 311, 311, 311, 311, 311, 311, 311, 311, 319, + + 319, 319, 319, 319, 319, 319, 319, 319, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 364, 364, 364, 364, 364, + 364, 364, 364, 364, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 377, 377, 377, 377, 377, 377, 377, + 377, 377, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 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, 427, 427, 427, 427, 427, + 427, 427, 427, 427, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 441, 441, 441, 441, 441, 441, 441, + 441, 441, 449, 449, 449, 449, 449, 449, 449, 449, + 449, 453, 453, 453, 453, 453, 453, 453, 453, 453, + 459, 459, 459, 459, 459, 459, 459, 459, 459, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 470, 470, + 470, 470, 470, 470, 470, 470, 470, 475, 475, 475, + + 475, 475, 475, 475, 475, 475, 495, 495, 495, 783, + 782, 780, 495, 519, 519, 519, 779, 778, 775, 519, + 523, 523, 523, 774, 770, 769, 523, 531, 531, 531, + 767, 766, 765, 531, 543, 543, 543, 762, 761, 760, + 543, 549, 549, 549, 759, 757, 756, 549, 562, 562, + 562, 755, 754, 753, 562, 570, 570, 570, 752, 751, + 750, 570, 586, 586, 586, 747, 744, 743, 586, 596, + 596, 596, 742, 740, 739, 596, 601, 601, 601, 734, + 731, 729, 601, 609, 609, 609, 728, 727, 726, 609, + 616, 616, 616, 725, 723, 720, 616, 623, 623, 623, + + 718, 717, 716, 623, 628, 628, 628, 714, 712, 711, + 628, 634, 634, 634, 710, 709, 708, 634, 642, 642, + 642, 707, 704, 703, 642, 646, 646, 646, 702, 699, + 696, 646, 650, 650, 650, 695, 693, 692, 650, 654, + 654, 654, 654, 654, 654, 654, 689, 654, 495, 495, + 495, 687, 684, 678, 495, 669, 677, 676, 673, 669, + 519, 519, 519, 672, 671, 670, 519, 694, 668, 667, + 666, 694, 523, 523, 523, 665, 664, 663, 523, 701, + 658, 655, 657, 701, 531, 531, 531, 652, 651, 649, + 531, 713, 648, 647, 645, 713, 543, 543, 543, 643, + + 641, 638, 543, 719, 637, 636, 635, 719, 549, 549, + 549, 633, 632, 631, 549, 724, 630, 629, 627, 724, + 562, 562, 562, 625, 624, 622, 562, 741, 621, 618, + 617, 741, 570, 570, 570, 615, 504, 2420, 570, 758, + 610, 608, 607, 758, 586, 586, 586, 604, 603, 602, + 586, 768, 600, 598, 597, 768, 596, 596, 596, 595, + 593, 592, 596, 773, 591, 590, 589, 773, 601, 601, + 601, 588, 587, 585, 601, 781, 576, 575, 574, 781, + 609, 609, 609, 571, 569, 568, 609, 786, 567, 566, + 565, 786, 616, 616, 616, 564, 563, 561, 616, 793, + + 2420, 510, 556, 793, 623, 623, 623, 551, 550, 548, + 623, 798, 546, 545, 544, 798, 628, 628, 628, 542, + 513, 2420, 628, 803, 537, 533, 532, 803, 634, 634, + 634, 530, 529, 526, 634, 809, 525, 524, 522, 809, + 642, 642, 642, 520, 518, 2420, 642, 813, 496, 494, + 492, 813, 646, 646, 646, 486, 485, 486, 646, 817, + 485, 484, 483, 817, 650, 650, 650, 2420, 2420, 2420, + 650, 822, 2420, 2420, 2420, 822, 824, 824, 824, 824, + 824, 824, 824, 824, 824, 830, 2420, 2420, 2420, 2420, + 830, 495, 495, 495, 2420, 2420, 2420, 495, 839, 839, + + 839, 839, 2420, 2420, 839, 839, 519, 519, 519, 2420, + 2420, 2420, 519, 867, 867, 867, 867, 2420, 2420, 867, + 867, 523, 523, 523, 2420, 2420, 2420, 523, 877, 877, + 877, 877, 2420, 2420, 877, 877, 531, 531, 531, 2420, + 2420, 2420, 531, 893, 893, 893, 893, 2420, 2420, 893, + 893, 543, 543, 543, 2420, 2420, 2420, 543, 901, 901, + 901, 901, 2420, 2420, 901, 901, 549, 549, 549, 2420, + 2420, 2420, 549, 909, 909, 909, 909, 2420, 2420, 909, + 909, 562, 562, 562, 2420, 2420, 2420, 562, 928, 928, + 928, 928, 2420, 2420, 928, 928, 570, 570, 570, 2420, + + 2420, 2420, 570, 952, 952, 952, 952, 2420, 2420, 952, + 952, 586, 586, 586, 2420, 2420, 2420, 586, 967, 967, + 967, 967, 2420, 2420, 967, 967, 596, 596, 596, 2420, + 2420, 2420, 596, 975, 975, 975, 975, 2420, 2420, 975, + 975, 601, 601, 601, 2420, 2420, 2420, 601, 986, 986, + 986, 986, 2420, 2420, 986, 986, 609, 609, 609, 609, + 2420, 609, 2420, 609, 995, 995, 995, 995, 2420, 2420, + 995, 995, 616, 616, 616, 616, 2420, 616, 2420, 616, + 1007, 1007, 1007, 1007, 2420, 2420, 1007, 1007, 623, 623, + 623, 2420, 2420, 2420, 623, 1015, 1015, 1015, 1015, 2420, + + 2420, 1015, 1015, 628, 628, 628, 628, 2420, 628, 2420, + 628, 1025, 1025, 1025, 1025, 2420, 2420, 1025, 1025, 634, + 634, 634, 2420, 2420, 2420, 634, 1033, 1033, 1033, 1033, + 2420, 2420, 1033, 1033, 642, 642, 642, 2420, 2420, 2420, + 642, 1039, 1039, 1039, 1039, 2420, 2420, 1039, 1039, 1046, + 1046, 1046, 1046, 2420, 2420, 1046, 1046, 650, 650, 650, + 2420, 2420, 2420, 650, 1054, 1054, 1054, 1054, 2420, 2420, + 1054, 1054, 824, 824, 824, 824, 824, 824, 824, 824, + 824, 830, 2420, 830, 2420, 2420, 830, 495, 495, 495, + 2420, 2420, 2420, 495, 839, 839, 839, 839, 2420, 2420, + + 839, 839, 519, 519, 519, 519, 2420, 519, 2420, 519, + 867, 867, 867, 867, 2420, 2420, 867, 867, 523, 523, + 523, 523, 2420, 523, 2420, 523, 877, 877, 877, 877, + 2420, 2420, 877, 877, 531, 531, 531, 2420, 2420, 2420, + 531, 893, 893, 893, 893, 2420, 2420, 893, 893, 543, + 543, 543, 2420, 2420, 2420, 543, 901, 901, 901, 901, + 2420, 2420, 901, 901, 549, 549, 549, 2420, 2420, 2420, + 549, 909, 909, 909, 909, 2420, 2420, 909, 909, 562, + 562, 562, 2420, 2420, 2420, 562, 928, 928, 928, 928, + 2420, 2420, 928, 928, 570, 570, 570, 2420, 2420, 2420, + + 570, 952, 952, 952, 952, 2420, 2420, 952, 952, 586, + 586, 586, 2420, 2420, 2420, 586, 967, 967, 967, 967, + 2420, 2420, 967, 967, 596, 596, 596, 2420, 2420, 2420, + 596, 975, 975, 975, 975, 2420, 2420, 975, 975, 601, + 601, 601, 2420, 2420, 2420, 601, 986, 986, 986, 986, + 2420, 2420, 986, 986, 609, 609, 609, 2420, 2420, 2420, + 609, 995, 995, 995, 995, 2420, 2420, 995, 995, 616, + 616, 616, 2420, 2420, 2420, 616, 1007, 1007, 1007, 1007, + 2420, 2420, 1007, 1007, 623, 623, 623, 2420, 2420, 2420, + 623, 1015, 1015, 1015, 1015, 2420, 2420, 1015, 1015, 628, + + 628, 628, 2420, 2420, 2420, 628, 1025, 1025, 1025, 1025, + 2420, 2420, 1025, 1025, 634, 634, 634, 2420, 2420, 2420, + 634, 1033, 1033, 1033, 1033, 2420, 2420, 1033, 1033, 642, + 642, 642, 2420, 2420, 2420, 642, 1039, 1039, 1039, 1039, + 2420, 2420, 1039, 1039, 1046, 1046, 1046, 1046, 2420, 2420, + 1046, 1046, 650, 650, 650, 2420, 2420, 2420, 650, 1054, + 1054, 1054, 1054, 2420, 2420, 1054, 1054, 824, 824, 824, + 824, 824, 824, 824, 824, 824, 1210, 1210, 1210, 1210, + 1210, 1210, 1210, 1210, 1210, 495, 495, 495, 2420, 2420, + 2420, 495, 839, 839, 839, 839, 2420, 2420, 839, 839, + + 867, 867, 867, 867, 2420, 2420, 867, 867, 523, 523, + 523, 2420, 2420, 2420, 523, 877, 877, 877, 877, 2420, + 2420, 877, 877, 531, 531, 531, 2420, 2420, 2420, 531, + 893, 893, 893, 893, 2420, 2420, 893, 893, 543, 543, + 543, 2420, 2420, 2420, 543, 901, 901, 901, 901, 2420, + 2420, 901, 901, 549, 549, 549, 2420, 2420, 2420, 549, + 562, 562, 562, 2420, 2420, 2420, 562, 928, 928, 928, + 928, 2420, 2420, 928, 928, 570, 570, 570, 2420, 2420, + 2420, 570, 952, 952, 952, 952, 2420, 2420, 952, 952, + 586, 586, 586, 2420, 2420, 2420, 586, 967, 967, 967, + + 967, 2420, 2420, 967, 967, 596, 596, 596, 2420, 2420, + 2420, 596, 975, 975, 975, 975, 2420, 2420, 975, 975, + 601, 601, 601, 2420, 2420, 2420, 601, 986, 986, 986, + 986, 2420, 2420, 986, 986, 609, 609, 609, 2420, 2420, + 2420, 609, 995, 995, 995, 995, 2420, 2420, 995, 995, + 616, 616, 616, 2420, 2420, 2420, 616, 1007, 1007, 1007, + 1007, 2420, 2420, 1007, 1007, 623, 623, 623, 2420, 2420, + 2420, 623, 1015, 1015, 1015, 1015, 2420, 2420, 1015, 1015, + 628, 628, 628, 2420, 2420, 2420, 628, 1025, 1025, 1025, + 1025, 2420, 2420, 1025, 1025, 634, 634, 634, 2420, 2420, + + 2420, 634, 1033, 1033, 1033, 1033, 2420, 2420, 1033, 1033, + 642, 642, 642, 642, 2420, 642, 2420, 642, 1039, 1039, + 1039, 1039, 2420, 2420, 1039, 1039, 1046, 1046, 1046, 1046, + 2420, 2420, 1046, 1046, 650, 650, 650, 650, 2420, 650, + 2420, 650, 1054, 1054, 1054, 1054, 2420, 2420, 1054, 1054, + 824, 824, 824, 824, 824, 824, 824, 824, 824, 1210, + 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 495, 495, + 495, 2420, 2420, 2420, 495, 839, 839, 839, 839, 2420, + 2420, 839, 839, 867, 867, 867, 867, 2420, 2420, 867, + 867, 523, 523, 523, 2420, 2420, 2420, 523, 877, 877, + + 877, 877, 2420, 2420, 877, 877, 531, 531, 531, 2420, + 2420, 2420, 531, 893, 893, 893, 893, 2420, 2420, 893, + 893, 543, 543, 543, 2420, 2420, 2420, 543, 901, 901, + 901, 901, 2420, 2420, 901, 901, 549, 549, 549, 2420, + 2420, 2420, 549, 562, 562, 562, 2420, 2420, 2420, 562, + 928, 928, 928, 928, 2420, 2420, 928, 928, 570, 570, + 570, 2420, 2420, 2420, 570, 952, 952, 952, 952, 2420, + 2420, 952, 952, 586, 586, 586, 2420, 2420, 2420, 586, + 967, 967, 967, 967, 2420, 2420, 967, 967, 596, 596, + 596, 2420, 2420, 2420, 596, 975, 975, 975, 975, 2420, + + 2420, 975, 975, 601, 601, 601, 2420, 2420, 2420, 601, + 986, 986, 986, 986, 2420, 2420, 986, 986, 609, 609, + 609, 2420, 2420, 2420, 609, 995, 995, 995, 995, 2420, + 2420, 995, 995, 616, 616, 616, 616, 2420, 616, 2420, + 616, 1007, 1007, 1007, 1007, 2420, 2420, 1007, 1007, 623, + 623, 623, 2420, 2420, 2420, 623, 1015, 1015, 1015, 1015, + 2420, 2420, 1015, 1015, 628, 628, 628, 628, 2420, 628, + 2420, 628, 1025, 1025, 1025, 1025, 2420, 2420, 1025, 1025, + 634, 634, 634, 2420, 2420, 2420, 634, 1033, 1033, 1033, + 1033, 2420, 2420, 1033, 1033, 1039, 1039, 1039, 1039, 2420, + + 2420, 1039, 1039, 1046, 1046, 1046, 1046, 2420, 2420, 1046, + 1046, 1054, 1054, 1054, 1054, 2420, 2420, 1054, 1054, 824, + 824, 824, 824, 824, 824, 824, 824, 824, 1210, 1210, + 1210, 1210, 1210, 1210, 1210, 1210, 1210, 495, 495, 495, + 495, 2420, 495, 2420, 495, 839, 839, 839, 839, 2420, + 2420, 839, 839, 867, 867, 867, 867, 2420, 2420, 867, + 867, 523, 523, 523, 2420, 2420, 2420, 523, 877, 877, + 877, 877, 2420, 2420, 877, 877, 531, 531, 531, 2420, + 2420, 2420, 531, 893, 893, 893, 893, 2420, 2420, 893, + 893, 543, 543, 543, 543, 2420, 543, 2420, 543, 901, + + 901, 901, 901, 2420, 2420, 901, 901, 549, 549, 549, + 549, 2420, 549, 2420, 549, 562, 562, 562, 2420, 2420, + 2420, 562, 570, 570, 570, 2420, 2420, 2420, 570, 952, + 952, 952, 952, 2420, 2420, 952, 952, 586, 586, 586, + 2420, 2420, 2420, 586, 596, 596, 596, 2420, 2420, 2420, + 596, 975, 975, 975, 975, 2420, 2420, 975, 975, 601, + 601, 601, 2420, 2420, 2420, 601, 609, 609, 609, 2420, + 2420, 2420, 609, 995, 995, 995, 995, 2420, 2420, 995, + 995, 616, 616, 616, 2420, 2420, 2420, 616, 1007, 1007, + 1007, 1007, 2420, 2420, 1007, 1007, 623, 623, 623, 2420, + + 2420, 2420, 623, 1015, 1015, 1015, 1015, 2420, 2420, 1015, + 1015, 1025, 1025, 1025, 1025, 2420, 2420, 1025, 1025, 634, + 634, 634, 2420, 2420, 2420, 634, 1033, 1033, 1033, 1033, + 2420, 2420, 1033, 1033, 1039, 1039, 1039, 1039, 2420, 2420, + 1039, 1039, 1046, 1046, 1046, 1046, 2420, 2420, 1046, 1046, + 824, 824, 824, 824, 824, 824, 824, 824, 824, 1210, + 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 839, 839, + 839, 839, 2420, 2420, 839, 839, 867, 867, 867, 867, + 2420, 2420, 867, 867, 523, 523, 523, 2420, 2420, 2420, + 523, 531, 531, 531, 2420, 2420, 2420, 531, 893, 893, + + 893, 893, 2420, 2420, 893, 893, 2088, 2088, 2088, 2088, + 2088, 2088, 2088, 2088, 2088, 2089, 2089, 2089, 2089, 2089, + 2089, 2089, 2089, 2089, 2132, 2132, 2132, 2132, 2132, 2132, + 2132, 2132, 2132, 2135, 2135, 2135, 2135, 2135, 2135, 2135, + 2135, 2135, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, + 2163, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, + 193, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420 } ; -static yyconst flex_int16_t yy_chk[7868] = +static yyconst flex_int16_t yy_chk[8134] = { 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, 288, 10, 7, - 8, 8, 8, 194, 11, 13, 13, 12, 14, 14, - 13, 13, 257, 14, 14, 195, 8, 17, 17, 194, - 13, 15, 15, 14, 15, 198, 15, 16, 16, 339, - 16, 195, 16, 18, 18, 288, 15, 19, 19, 19, - 339, 198, 16, 20, 20, 20, 23, 23, 23, 24, - 24, 24, 738, 19, 25, 25, 25, 738, 1413, 20, - 286, 17, 23, 257, 292, 24, 192, 192, 192, 286, - - 25, 193, 193, 193, 197, 197, 197, 18, 21, 21, + 4, 10, 0, 5, 0, 9, 6, 0, 10, 7, + 8, 8, 8, 198, 11, 13, 13, 12, 14, 14, + 13, 13, 271, 14, 14, 199, 8, 17, 17, 198, + 13, 15, 15, 14, 15, 202, 15, 16, 16, 236, + 16, 199, 16, 18, 18, 236, 15, 19, 19, 19, + 305, 202, 16, 20, 20, 20, 23, 23, 23, 24, + 24, 24, 505, 19, 25, 25, 25, 271, 505, 20, + 299, 17, 23, 271, 505, 24, 196, 196, 196, 299, + + 25, 197, 197, 197, 201, 201, 201, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 258, 21, 21, 21, 21, 21, 26, - 26, 26, 27, 27, 27, 28, 28, 28, 227, 29, - 29, 29, 30, 30, 30, 26, 289, 292, 27, 216, - 221, 28, 227, 21, 21, 29, 289, 237, 30, 31, - 31, 31, 218, 218, 218, 216, 221, 225, 225, 225, - 234, 234, 234, 237, 258, 31, 21, 22, 22, 22, + 21, 21, 21, 305, 21, 21, 21, 21, 21, 26, + 26, 26, 27, 27, 27, 28, 28, 28, 231, 29, + 29, 29, 30, 30, 30, 26, 302, 1411, 27, 220, + 225, 28, 231, 21, 21, 29, 302, 241, 30, 31, + 31, 31, 222, 222, 222, 220, 225, 229, 229, 229, + 238, 238, 238, 241, 1412, 31, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 259, 22, 22, 22, 22, 22, 32, 32, + 22, 22, 322, 22, 22, 22, 22, 22, 32, 32, - 32, 33, 33, 33, 34, 34, 34, 216, 35, 35, - 35, 36, 36, 36, 32, 228, 229, 33, 1316, 294, - 34, 294, 22, 22, 35, 228, 317, 36, 37, 37, + 32, 33, 33, 33, 34, 34, 34, 220, 35, 35, + 35, 36, 36, 36, 32, 232, 307, 33, 307, 1413, + 34, 380, 22, 22, 35, 232, 233, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, - 41, 41, 41, 259, 37, 22, 317, 38, 248, 254, - 39, 1316, 264, 40, 228, 229, 41, 42, 42, 42, - 245, 245, 245, 254, 248, 375, 228, 229, 264, 229, - 228, 230, 375, 42, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 830, - 43, 43, 43, 43, 43, 49, 49, 49, 50, 50, - - 50, 830, 51, 51, 51, 256, 256, 256, 45, 45, - 230, 49, 276, 45, 50, 363, 46, 46, 51, 43, - 43, 46, 230, 45, 230, 252, 363, 43, 276, 252, - 43, 46, 321, 252, 1177, 321, 43, 44, 44, 44, + 41, 41, 41, 322, 37, 22, 334, 38, 251, 334, + 39, 301, 262, 40, 232, 233, 41, 42, 42, 42, + 232, 245, 245, 245, 251, 234, 232, 233, 262, 233, + 232, 233, 380, 42, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 301, + 43, 43, 43, 43, 43, 45, 45, 45, 46, 46, + + 46, 53, 53, 53, 234, 266, 1416, 49, 49, 266, + 278, 45, 49, 266, 46, 443, 234, 53, 234, 43, + 43, 445, 49, 248, 248, 248, 278, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 45, 44, 44, 44, 44, 44, 1415, 1177, - 46, 52, 52, 52, 53, 53, 53, 1416, 54, 54, - 54, 55, 55, 55, 261, 261, 261, 52, 242, 271, - 53, 299, 44, 44, 54, 242, 271, 55, 308, 475, - 44, 309, 475, 44, 242, 271, 208, 299, 366, 44, - - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 452, 47, 47, 47, 47, - 47, 56, 56, 56, 59, 59, 59, 60, 60, 60, - 367, 63, 63, 63, 64, 64, 64, 56, 208, 308, - 59, 314, 309, 60, 208, 47, 47, 63, 208, 366, - 64, 389, 452, 208, 47, 1417, 47, 314, 389, 47, - 270, 270, 270, 378, 47, 47, 48, 48, 48, 48, + 44, 44, 44, 388, 44, 44, 44, 44, 44, 330, + 388, 49, 443, 50, 50, 54, 54, 54, 50, 55, + 55, 55, 56, 56, 56, 259, 259, 259, 50, 330, + 402, 54, 445, 44, 44, 55, 488, 402, 56, 488, + 1422, 44, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 50, 47, 47, + + 47, 47, 47, 57, 57, 57, 58, 58, 58, 59, + 59, 59, 268, 60, 60, 60, 63, 63, 63, 57, + 290, 312, 58, 246, 256, 59, 268, 47, 47, 60, + 246, 256, 63, 1429, 1430, 47, 290, 312, 47, 246, + 256, 270, 270, 270, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 367, 48, 48, 48, 48, 48, 65, 65, 65, - 66, 66, 66, 67, 67, 67, 323, 68, 68, 68, - - 69, 69, 69, 65, 1029, 331, 66, 323, 323, 67, - 378, 48, 48, 68, 378, 393, 69, 273, 273, 273, - 48, 331, 48, 417, 1029, 48, 282, 282, 282, 453, - 48, 48, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 508, 57, 57, - 57, 57, 57, 70, 70, 70, 71, 71, 71, 72, - 72, 72, 393, 73, 73, 73, 74, 74, 74, 70, - 417, 347, 71, 488, 432, 72, 488, 57, 57, 73, - 453, 805, 74, 508, 57, 805, 290, 347, 432, 57, - 296, 296, 296, 1420, 291, 307, 307, 307, 57, 58, - - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 290, 58, 58, 58, 58, 58, - 75, 75, 75, 76, 76, 76, 77, 77, 77, 290, - 78, 78, 78, 79, 79, 79, 75, 492, 291, 76, - 494, 291, 77, 494, 58, 58, 78, 291, 326, 79, - 492, 58, 311, 311, 311, 326, 58, 325, 325, 325, - 328, 328, 328, 1422, 326, 58, 61, 61, 61, 61, + 479, 48, 48, 48, 48, 48, 64, 64, 64, 67, + 67, 67, 68, 68, 68, 479, 69, 69, 69, 70, + 70, 70, 64, 327, 335, 67, 285, 344, 68, 376, + 48, 48, 69, 285, 336, 70, 1431, 335, 48, 327, + + 376, 48, 285, 344, 212, 336, 336, 48, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 444, 51, 51, 51, 51, 51, 71, + 71, 71, 72, 72, 72, 73, 73, 73, 466, 74, + 74, 74, 75, 75, 75, 71, 212, 360, 72, 371, + 339, 73, 212, 51, 51, 74, 212, 339, 75, 1435, + 444, 212, 51, 360, 51, 371, 339, 51, 275, 275, + 275, 406, 51, 51, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 466, + 52, 52, 52, 52, 52, 76, 76, 76, 77, 77, + + 77, 78, 78, 78, 1390, 79, 79, 79, 80, 80, + 80, 76, 1390, 385, 77, 355, 366, 78, 406, 52, + 52, 79, 355, 366, 80, 284, 284, 284, 52, 385, + 52, 355, 366, 52, 287, 287, 287, 391, 52, 52, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 61, 466, 61, 61, 61, 61, 61, 80, 80, 80, - 81, 81, 81, 82, 82, 82, 466, 83, 83, 83, - - 341, 341, 341, 80, 358, 372, 81, 342, 1427, 82, - 1429, 61, 61, 83, 342, 1436, 61, 344, 344, 344, - 358, 372, 61, 342, 352, 352, 352, 355, 355, 355, - 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 1437, 62, 62, 62, - 62, 62, 84, 84, 84, 85, 85, 85, 86, 86, - 86, 839, 87, 87, 87, 365, 365, 365, 84, 385, - 398, 85, 497, 839, 86, 497, 62, 62, 87, 1438, - 1440, 62, 88, 88, 88, 385, 398, 62, 89, 89, - 89, 90, 90, 90, 500, 62, 353, 500, 88, 91, - - 91, 91, 546, 353, 89, 546, 404, 90, 92, 92, - 92, 867, 353, 404, 1315, 91, 369, 369, 369, 377, - 377, 377, 404, 867, 92, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 1454, 93, 93, 93, 93, 93, 95, 95, 95, 96, - 96, 96, 97, 97, 97, 1315, 98, 98, 98, 382, - 382, 382, 95, 409, 422, 96, 1350, 1459, 97, 437, - 93, 93, 98, 93, 1350, 93, 391, 391, 391, 409, - 422, 93, 395, 395, 395, 437, 1460, 93, 1453, 1314, - 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, - - 94, 94, 94, 94, 94, 94, 1314, 94, 94, 94, - 94, 94, 99, 99, 99, 100, 100, 100, 101, 101, - 101, 1452, 102, 102, 102, 403, 403, 403, 99, 447, - 458, 100, 1354, 1453, 101, 638, 94, 94, 102, 94, - 1354, 94, 406, 406, 406, 447, 458, 94, 415, 415, - 415, 638, 1452, 94, 1463, 1464, 94, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 105, - 105, 105, 106, 106, 106, 419, 419, 419, 429, 429, - 429, 434, 434, 434, 1468, 105, 1473, 1474, 106, 107, + 61, 61, 61, 61, 61, 527, 61, 61, 61, 61, + 61, 81, 81, 81, 82, 82, 82, 83, 83, 83, + 1441, 84, 84, 84, 85, 85, 85, 81, 501, 508, + 82, 501, 508, 83, 391, 61, 61, 84, 391, 1353, + 85, 527, 61, 295, 295, 295, 1445, 61, 309, 309, + + 309, 430, 304, 320, 320, 320, 61, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 1353, 62, 62, 62, 62, 62, 86, 86, + 86, 87, 87, 87, 88, 88, 88, 1209, 89, 89, + 89, 90, 90, 90, 86, 506, 304, 87, 430, 304, + 88, 1057, 62, 62, 89, 304, 398, 90, 506, 62, + 511, 303, 1209, 511, 62, 324, 324, 324, 338, 338, + 338, 1057, 398, 62, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 303, + 65, 65, 65, 65, 65, 91, 91, 91, 92, 92, + + 92, 93, 93, 93, 303, 94, 94, 94, 95, 95, + 95, 91, 411, 422, 92, 515, 1448, 93, 515, 65, + 65, 94, 1450, 1452, 95, 341, 341, 341, 411, 422, + 65, 354, 354, 354, 357, 357, 357, 1351, 65, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 1351, 66, 66, 66, 66, 66, + 96, 96, 96, 99, 99, 99, 100, 100, 100, 853, + 101, 101, 101, 102, 102, 102, 96, 435, 450, 99, + 564, 853, 100, 564, 66, 66, 101, 1454, 1455, 102, + 365, 365, 365, 435, 450, 66, 368, 368, 368, 378, + + 378, 378, 1456, 66, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 1459, + 97, 97, 97, 97, 97, 103, 103, 103, 104, 104, + 104, 105, 105, 105, 863, 106, 106, 106, 382, 382, + 382, 103, 460, 471, 104, 1461, 863, 105, 656, 97, + 97, 106, 97, 896, 97, 390, 390, 390, 460, 471, + 97, 395, 395, 395, 656, 896, 97, 1466, 1468, 97, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 1475, 98, 98, 98, 98, + 98, 109, 109, 109, 110, 110, 110, 113, 113, 113, + + 1476, 114, 114, 114, 404, 404, 404, 109, 827, 761, + 110, 509, 827, 113, 761, 98, 98, 114, 98, 513, + 98, 408, 408, 408, 509, 513, 98, 416, 416, 416, + 1477, 513, 98, 1479, 1493, 98, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 109, 109, 109, 110, 110, 110, 441, 441, 441, - 444, 444, 444, 1451, 430, 1475, 1478, 109, 1481, 1451, - 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 1485, 111, 111, 111, - 111, 111, 113, 113, 113, 114, 114, 114, 117, 117, - 117, 430, 118, 118, 118, 1486, 442, 495, 113, 1487, - 722, 114, 1488, 442, 117, 430, 111, 111, 118, 722, - 495, 111, 442, 451, 451, 451, 722, 111, 112, 112, - - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 1489, 112, 112, 112, 112, 112, 119, - 119, 119, 120, 120, 120, 121, 121, 121, 1490, 122, - 122, 122, 455, 455, 455, 119, 1491, 1492, 120, 1493, - 491, 121, 1494, 112, 112, 122, 491, 1496, 112, 463, - 463, 463, 491, 1500, 112, 115, 115, 115, 115, 115, + + 107, 107, 107, 107, 107, 107, 107, 107, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 1502, 115, 115, 115, 115, 115, 123, 123, 123, 124, - 124, 124, 127, 127, 127, 1503, 128, 128, 128, 129, - 129, 129, 123, 1506, 1507, 124, 464, 539, 127, 1511, - - 115, 115, 128, 464, 115, 129, 465, 465, 465, 1517, - 539, 115, 464, 115, 474, 474, 474, 820, 820, 820, - 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 1518, 116, 116, 116, - 116, 116, 130, 130, 130, 131, 131, 131, 132, 132, - 132, 1504, 133, 133, 133, 134, 134, 134, 130, 1504, - 541, 131, 1523, 498, 132, 542, 116, 116, 133, 498, - 116, 134, 474, 541, 1527, 498, 1528, 116, 542, 116, - 641, 641, 641, 1529, 641, 1530, 116, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - - 125, 125, 1532, 125, 125, 125, 125, 125, 137, 137, - 137, 138, 138, 138, 139, 139, 139, 1505, 140, 140, - 140, 141, 141, 141, 137, 1505, 1535, 138, 1536, 501, - 139, 1539, 125, 125, 140, 501, 502, 141, 125, 522, - 1540, 501, 502, 1543, 1550, 522, 1552, 1562, 502, 1563, - 1565, 522, 125, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 1578, 126, - 126, 126, 126, 126, 142, 142, 142, 143, 143, 143, - 144, 144, 144, 1537, 147, 147, 147, 148, 148, 148, - 142, 1537, 1569, 143, 1538, 1583, 144, 1586, 126, 126, - - 147, 1587, 1538, 148, 126, 653, 653, 653, 668, 668, - 668, 836, 836, 836, 704, 704, 704, 1570, 126, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 1569, 135, 135, 135, 135, 135, - 151, 151, 151, 152, 152, 152, 153, 153, 153, 1593, - 154, 154, 154, 155, 155, 155, 151, 1599, 1600, 152, - 1601, 1602, 153, 1570, 135, 135, 154, 1603, 653, 155, - 135, 668, 1604, 135, 675, 675, 675, 704, 675, 1605, - 1606, 675, 1607, 1608, 135, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - - 1610, 136, 136, 136, 136, 136, 156, 156, 156, 157, - 157, 157, 158, 158, 158, 1615, 161, 161, 161, 162, - 162, 162, 156, 1227, 1616, 157, 1617, 1618, 158, 1227, - 136, 136, 161, 1227, 1619, 162, 136, 1227, 1620, 136, - 683, 683, 683, 1621, 683, 1622, 1623, 683, 1624, 1628, - 136, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 145, 1629, 145, 145, 145, - 145, 145, 163, 163, 163, 164, 164, 164, 165, 165, - 165, 1631, 166, 166, 166, 167, 167, 167, 163, 1632, - 1633, 164, 1634, 1635, 165, 1642, 145, 145, 166, 1643, - - 1644, 167, 145, 1043, 1043, 1043, 1645, 145, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 1646, 146, 146, 146, 146, 146, 168, - 168, 168, 171, 171, 171, 172, 172, 172, 1647, 175, - 175, 175, 176, 176, 176, 168, 1648, 1649, 171, 1651, - 1659, 172, 1671, 146, 146, 175, 1674, 1675, 176, 146, - 709, 709, 709, 1666, 146, 149, 149, 149, 149, 149, + 115, 115, 115, 115, 115, 1498, 115, 115, 115, 115, + + 115, 117, 117, 117, 118, 118, 118, 121, 121, 121, + 1394, 122, 122, 122, 1499, 417, 557, 117, 1394, 744, + 118, 1491, 417, 121, 1503, 115, 115, 122, 744, 557, + 115, 417, 419, 419, 419, 744, 115, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 1491, 116, 116, 116, 116, 116, 123, 123, + 123, 124, 124, 124, 125, 125, 125, 1504, 126, 126, + 126, 428, 428, 428, 123, 1490, 1508, 124, 1514, 516, + 125, 1490, 116, 116, 126, 516, 1516, 116, 432, 432, + 432, 516, 1352, 116, 119, 119, 119, 119, 119, 119, + + 119, 119, 119, 119, 119, 119, 119, 119, 119, 1517, + 119, 119, 119, 119, 119, 127, 127, 127, 128, 128, + 128, 131, 131, 131, 1520, 132, 132, 132, 133, 133, + 133, 127, 1523, 1352, 128, 455, 559, 131, 1527, 119, + 119, 132, 455, 119, 133, 442, 442, 442, 1528, 559, + 119, 455, 119, 447, 447, 447, 454, 454, 454, 119, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 1529, 120, 120, 120, 120, + 120, 134, 134, 134, 135, 135, 135, 136, 136, 136, + 1530, 137, 137, 137, 138, 138, 138, 134, 1531, 1532, + + 135, 477, 560, 136, 1533, 120, 120, 137, 477, 120, + 138, 457, 457, 457, 1534, 560, 120, 477, 120, 464, + 464, 464, 468, 468, 468, 120, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 1535, 129, 129, 129, 129, 129, 141, 141, 141, + 142, 142, 142, 143, 143, 143, 1536, 144, 144, 144, + 145, 145, 145, 141, 1541, 1543, 142, 1544, 1547, 143, + 1548, 129, 129, 144, 1552, 1558, 145, 129, 476, 476, + 476, 478, 478, 478, 1559, 1492, 487, 487, 487, 1560, + 1565, 129, 130, 130, 130, 130, 130, 130, 130, 130, + + 130, 130, 130, 130, 130, 130, 130, 1569, 130, 130, + 130, 130, 130, 146, 146, 146, 147, 147, 147, 148, + 148, 148, 1570, 151, 151, 151, 152, 152, 152, 146, + 1492, 1571, 147, 1573, 517, 148, 1576, 130, 130, 151, + 517, 541, 152, 130, 487, 1577, 517, 541, 659, 659, + 659, 1580, 659, 541, 671, 671, 671, 130, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 1581, 139, 139, 139, 139, 139, 155, + 155, 155, 156, 156, 156, 157, 157, 157, 1584, 158, + 158, 158, 159, 159, 159, 155, 1265, 1591, 156, 1545, + + 1593, 157, 1265, 139, 139, 158, 1265, 1545, 159, 139, + 1265, 1603, 139, 687, 687, 687, 1604, 671, 1606, 726, + 726, 726, 1611, 139, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 1619, + 140, 140, 140, 140, 140, 160, 160, 160, 161, 161, + 161, 162, 162, 162, 1546, 165, 165, 165, 166, 166, + 166, 160, 1546, 1610, 161, 1578, 1625, 162, 1611, 140, + 140, 165, 1629, 1578, 166, 140, 687, 1579, 140, 698, + 698, 698, 726, 698, 1631, 1579, 698, 1637, 1643, 140, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 1676, 149, 149, 149, 149, 149, 177, 177, 177, 178, - 178, 178, 179, 179, 179, 1666, 180, 180, 180, 181, - - 181, 181, 177, 1228, 1679, 178, 1680, 1681, 179, 1228, - 149, 149, 180, 1228, 1682, 181, 149, 1228, 1683, 149, - 700, 700, 700, 709, 700, 1684, 1685, 700, 1686, 1687, - 149, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 1688, 150, 150, 150, - 150, 150, 182, 182, 182, 185, 185, 185, 186, 186, - 186, 506, 506, 506, 1689, 651, 651, 651, 182, 1691, - 1692, 185, 1693, 1694, 186, 1667, 150, 150, 506, 1695, - 283, 284, 150, 651, 1697, 150, 1045, 1045, 1045, 1700, - 283, 284, 1048, 1048, 1048, 1701, 150, 159, 159, 159, - - 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, - 159, 159, 1667, 159, 159, 159, 159, 159, 283, 284, - 284, 514, 514, 514, 283, 1702, 1706, 283, 532, 532, - 532, 1707, 284, 283, 547, 547, 547, 1708, 514, 555, - 555, 555, 159, 159, 1710, 532, 1055, 1055, 1055, 1713, - 159, 547, 159, 1714, 159, 1715, 555, 1044, 1044, 1044, - 1716, 1718, 159, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 1721, 160, - 160, 160, 160, 160, 557, 557, 557, 571, 571, 571, - 580, 580, 580, 585, 585, 585, 607, 607, 607, 1723, - - 1745, 557, 1746, 1044, 571, 1740, 1747, 580, 160, 160, - 585, 1752, 1753, 607, 1754, 1755, 160, 1756, 160, 1757, - 160, 1077, 1077, 1077, 1089, 1089, 1089, 1742, 160, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 1740, 169, 169, 169, 169, 169, - 629, 629, 629, 633, 633, 633, 674, 674, 674, 678, - 678, 678, 652, 652, 652, 1758, 1759, 629, 1760, 1742, - 633, 1761, 1762, 674, 169, 169, 1741, 678, 1765, 1766, - 652, 716, 716, 716, 1772, 716, 1773, 1774, 716, 724, - 724, 724, 1777, 724, 1779, 1786, 724, 169, 170, 170, - - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 1741, 170, 170, 170, 170, 170, 652, - 682, 682, 682, 684, 684, 684, 1750, 679, 679, 679, - 686, 686, 686, 690, 690, 690, 1750, 682, 1787, 1750, - 684, 1788, 1812, 170, 170, 679, 1813, 686, 699, 699, - 699, 690, 727, 727, 727, 1816, 727, 1817, 1819, 727, - 1808, 1820, 1090, 1090, 1090, 699, 170, 173, 173, 173, + + 149, 149, 149, 149, 149, 1610, 149, 149, 149, 149, + 149, 167, 167, 167, 168, 168, 168, 169, 169, 169, + 1644, 170, 170, 170, 171, 171, 171, 167, 1645, 1646, + 168, 1647, 1648, 169, 1649, 149, 149, 170, 1650, 1651, + 171, 149, 842, 842, 842, 1652, 149, 150, 150, 150, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 1658, 150, 150, 150, 150, 150, 172, 172, + 172, 175, 175, 175, 176, 176, 176, 1659, 179, 179, + 179, 180, 180, 180, 172, 1660, 1661, 175, 1662, 1663, + 176, 1664, 150, 150, 179, 1665, 1666, 180, 150, 731, + + 731, 731, 1667, 150, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 1672, + 153, 153, 153, 153, 153, 181, 181, 181, 182, 182, + 182, 183, 183, 183, 1673, 184, 184, 184, 185, 185, + 185, 181, 1266, 1675, 182, 1676, 1677, 183, 1266, 153, + 153, 184, 1266, 1678, 185, 153, 1266, 1685, 153, 706, + 706, 706, 731, 706, 1686, 1687, 706, 1688, 1689, 153, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 1690, 154, 154, 154, 154, + 154, 186, 186, 186, 189, 189, 189, 190, 190, 190, + + 525, 525, 525, 1691, 669, 669, 669, 186, 1692, 1694, + 189, 1702, 1714, 190, 1717, 154, 154, 525, 1718, 296, + 297, 154, 669, 1721, 154, 859, 859, 859, 1710, 296, + 297, 1071, 1071, 1071, 1724, 154, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 1709, 163, 163, 163, 163, 163, 296, 297, 533, + 533, 533, 1725, 296, 1726, 1710, 296, 550, 550, 550, + 1727, 297, 296, 1728, 1729, 297, 533, 565, 565, 565, + 1730, 163, 163, 1709, 550, 1074, 1074, 1074, 1731, 163, + 1732, 163, 1733, 163, 565, 1073, 1073, 1073, 1077, 1077, + + 1077, 163, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 1734, 164, 164, + 164, 164, 164, 573, 573, 573, 575, 575, 575, 590, + 590, 590, 598, 598, 598, 603, 603, 603, 1736, 1737, + 573, 1073, 1738, 575, 1739, 1741, 590, 164, 164, 598, + 1744, 1745, 603, 1748, 1752, 164, 1753, 164, 1755, 164, + 1085, 1085, 1085, 1110, 1110, 1110, 1758, 164, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 1818, 173, 173, 173, 173, 173, 1822, 1808, - 679, 1823, 691, 691, 691, 1818, 696, 696, 696, 697, - - 697, 697, 702, 702, 702, 715, 715, 715, 1090, 1824, - 691, 1825, 173, 173, 696, 1826, 1809, 697, 1828, 1829, - 702, 1830, 715, 173, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 691, - 174, 174, 174, 174, 174, 719, 719, 719, 720, 720, - 720, 723, 723, 723, 726, 726, 726, 1809, 1831, 703, - 703, 703, 697, 719, 1843, 1751, 720, 1844, 723, 174, - 174, 726, 741, 741, 741, 1751, 741, 703, 1751, 741, - 174, 183, 183, 183, 183, 183, 183, 183, 183, 183, - 183, 183, 183, 183, 183, 183, 703, 183, 183, 183, - - 183, 183, 728, 728, 728, 735, 735, 735, 720, 1845, - 1849, 740, 740, 740, 736, 736, 736, 1852, 1858, 728, - 746, 746, 746, 735, 1810, 1860, 183, 183, 740, 742, - 742, 742, 736, 1192, 1192, 1192, 1868, 183, 746, 1869, - 750, 750, 750, 1870, 750, 1871, 742, 750, 1872, 183, - 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, - 184, 184, 184, 184, 184, 1810, 184, 184, 184, 184, - 184, 736, 747, 747, 747, 749, 749, 749, 1796, 751, - 751, 751, 752, 752, 752, 754, 754, 754, 1796, 1873, - 747, 1882, 749, 1883, 1796, 184, 184, 751, 1887, 1878, - - 752, 1888, 754, 755, 755, 755, 184, 755, 1889, 1890, - 755, 759, 759, 759, 760, 760, 760, 1797, 184, 226, - 761, 761, 761, 747, 1879, 1891, 226, 1797, 1821, 759, - 1892, 1893, 760, 1797, 1894, 226, 226, 761, 762, 762, - 762, 1821, 752, 763, 763, 763, 1878, 1896, 764, 764, - 764, 767, 767, 767, 1897, 762, 765, 765, 765, 1879, - 763, 1898, 1899, 226, 226, 226, 764, 1900, 767, 760, - 226, 1901, 1902, 226, 765, 1903, 1911, 226, 1915, 226, - 1916, 226, 768, 768, 768, 769, 769, 769, 1917, 770, - 770, 770, 771, 771, 771, 1918, 772, 772, 772, 768, - - 1922, 763, 769, 774, 774, 774, 770, 776, 776, 776, - 771, 775, 775, 775, 772, 775, 765, 1926, 775, 1929, - 774, 777, 777, 777, 1936, 776, 778, 778, 778, 1143, - 1143, 1143, 768, 772, 779, 779, 779, 1937, 1938, 777, - 780, 780, 780, 778, 1939, 1931, 768, 770, 781, 781, - 781, 779, 782, 782, 782, 1931, 1940, 780, 1941, 787, - 787, 787, 788, 788, 788, 1949, 781, 791, 791, 791, - 782, 792, 792, 792, 1950, 1143, 777, 787, 1943, 1951, - 788, 795, 795, 795, 779, 791, 793, 793, 793, 792, - 794, 794, 794, 1952, 794, 1953, 1954, 794, 779, 795, - - 796, 796, 796, 793, 797, 797, 797, 798, 798, 798, - 1932, 798, 1943, 1934, 798, 800, 800, 800, 796, 1955, - 1932, 797, 782, 1934, 1956, 788, 801, 801, 801, 816, - 816, 816, 1959, 800, 792, 817, 817, 817, 819, 819, - 819, 841, 841, 841, 801, 1960, 1962, 816, 842, 842, - 842, 1963, 842, 817, 1964, 842, 819, 1935, 841, 1966, - 796, 845, 845, 845, 847, 847, 847, 1935, 848, 848, - 848, 1971, 850, 850, 850, 1193, 1193, 1193, 845, 855, - 855, 855, 847, 1972, 1973, 819, 848, 1975, 1982, 801, - 850, 852, 852, 852, 1983, 852, 855, 1984, 852, 856, - - 856, 856, 1985, 856, 1986, 1987, 856, 857, 857, 857, - 858, 858, 858, 859, 859, 859, 1988, 859, 1989, 850, - 859, 845, 1990, 1991, 857, 1993, 1994, 858, 861, 861, - 861, 863, 863, 863, 864, 864, 864, 866, 866, 866, - 869, 869, 869, 2006, 2007, 861, 871, 871, 871, 863, - 1998, 2008, 864, 2009, 2010, 866, 2011, 869, 872, 872, - 872, 874, 874, 874, 871, 876, 876, 876, 2012, 876, - 2013, 2017, 876, 880, 880, 880, 872, 2018, 2019, 874, - 881, 881, 881, 883, 883, 883, 893, 893, 893, 2020, - 2021, 880, 1998, 894, 894, 894, 866, 894, 881, 2022, - - 894, 883, 2024, 893, 899, 899, 899, 2025, 874, 900, - 900, 900, 902, 902, 902, 2026, 907, 907, 907, 2029, - 907, 2036, 899, 907, 910, 910, 910, 900, 2037, 2038, - 902, 911, 911, 911, 2039, 911, 2040, 2041, 911, 2042, - 2043, 910, 914, 914, 914, 915, 915, 915, 2044, 915, - 2045, 2046, 915, 922, 922, 922, 923, 923, 923, 914, - 925, 925, 925, 930, 930, 930, 2047, 930, 2054, 2057, - 930, 922, 2058, 2050, 923, 2061, 902, 2051, 925, 933, - 933, 933, 934, 934, 934, 2063, 934, 2050, 2051, 934, - 938, 938, 938, 939, 939, 939, 933, 941, 941, 941, - - 943, 943, 943, 2064, 943, 2066, 2067, 943, 938, 2070, - 2071, 939, 946, 946, 946, 941, 947, 947, 947, 949, - 949, 949, 957, 957, 957, 2048, 925, 958, 958, 958, - 946, 951, 951, 951, 947, 951, 2072, 949, 951, 2076, - 957, 960, 960, 960, 2074, 958, 2075, 2087, 941, 961, - 961, 961, 2078, 962, 962, 962, 2074, 962, 2075, 960, - 962, 963, 963, 963, 2078, 2089, 961, 964, 964, 964, - 2048, 964, 2091, 2093, 964, 966, 966, 966, 963, 967, - 967, 967, 971, 971, 971, 949, 969, 969, 969, 975, - 975, 975, 2098, 966, 972, 972, 972, 967, 972, 971, - - 960, 972, 2100, 2100, 969, 2101, 975, 976, 976, 976, - 2103, 976, 2105, 2099, 976, 978, 978, 978, 979, 979, - 979, 981, 981, 981, 983, 983, 983, 2099, 983, 2106, - 2107, 983, 2098, 978, 2108, 2117, 979, 2119, 2121, 981, - 986, 986, 986, 987, 987, 987, 989, 989, 989, 990, - 990, 990, 969, 991, 991, 991, 2102, 991, 986, 2122, - 991, 987, 2079, 2116, 989, 2084, 990, 2102, 994, 994, - 994, 995, 995, 995, 2079, 995, 2123, 2084, 995, 996, - 996, 996, 2116, 2085, 981, 994, 997, 997, 997, 999, - 999, 999, 1001, 1001, 1001, 2085, 2124, 996, 1004, 1004, - - 1004, 1005, 1005, 1005, 997, 989, 2126, 999, 2118, 1001, - 1007, 1007, 1007, 1010, 1010, 1010, 1004, 2128, 2125, 1005, - 1011, 1011, 1011, 1013, 1013, 1013, 2134, 2118, 1007, 2127, - 2135, 1010, 1014, 1014, 1014, 2136, 1014, 2125, 1011, 1014, - 2138, 1013, 1017, 1017, 1017, 1018, 1018, 1018, 2127, 2139, - 999, 1020, 1020, 1020, 1021, 1021, 1021, 2140, 1021, 2141, - 1017, 1021, 2148, 1018, 1025, 1025, 1025, 2149, 2150, 1020, - 1007, 1026, 1026, 1026, 2151, 2152, 1013, 1028, 1028, 1028, - 2153, 2156, 1025, 1030, 1030, 1030, 1037, 1037, 1037, 1026, - 1058, 1058, 1058, 2157, 2158, 1028, 1059, 1059, 1059, 2159, - - 1059, 1030, 1030, 1059, 1037, 2160, 2161, 1058, 2162, 2163, - 1020, 1062, 1062, 1062, 1064, 1064, 1064, 2164, 1064, 2165, - 2167, 1064, 1067, 1067, 1067, 2169, 1068, 1068, 1068, 1062, - 1068, 2171, 2181, 1068, 1069, 1069, 1069, 1028, 1069, 1067, - 2182, 1069, 1073, 1073, 1073, 1074, 1074, 1074, 2183, 1074, - 2184, 1037, 1074, 1076, 1076, 1076, 1079, 1079, 1079, 1073, - 1062, 1080, 1080, 1080, 2185, 1080, 2186, 2190, 1080, 2191, - 2192, 1076, 2193, 1079, 1081, 1081, 1081, 1082, 1082, 1082, - 1085, 1085, 1085, 1096, 1096, 1096, 1097, 1097, 1097, 2179, - 1097, 1081, 2194, 1097, 2195, 1082, 2196, 2197, 1085, 2198, - - 1096, 2179, 2199, 1076, 1098, 1098, 1098, 1099, 1099, 1099, - 1100, 1100, 1100, 1102, 1102, 1102, 1105, 1105, 1105, 2180, - 2200, 1098, 2202, 2203, 1099, 2204, 1082, 2205, 1100, 2206, - 1102, 2180, 2207, 1105, 1106, 1106, 1106, 2208, 1106, 2209, - 2210, 1106, 1107, 1107, 1107, 2200, 1107, 2211, 2212, 1107, - 1110, 1110, 1110, 1099, 1116, 1116, 1116, 1118, 1118, 1118, - 2213, 1121, 1121, 1121, 2214, 1121, 2215, 1110, 1121, 1124, - 1124, 1124, 1116, 2216, 1118, 1100, 1127, 1127, 1127, 1129, - 1129, 1129, 1133, 1133, 1133, 2217, 1124, 1134, 1134, 1134, - 2218, 1135, 1135, 1135, 1127, 1135, 2219, 1129, 1135, 1133, - - 1138, 1138, 1138, 2220, 1138, 1134, 2221, 1138, 1142, 1142, - 1142, 2222, 1144, 1144, 1144, 2223, 1144, 2227, 1116, 1144, - 1149, 1149, 1149, 2228, 1149, 2229, 1142, 1149, 1133, 1153, - 1153, 1153, 1155, 1155, 1155, 2230, 1164, 1164, 1164, 1127, - 1166, 1166, 1166, 1134, 1129, 2224, 2231, 1153, 2232, 2233, - 1155, 1156, 1156, 1156, 1164, 1156, 2234, 1166, 1156, 1161, - 1161, 1161, 2235, 1161, 2224, 2236, 1161, 1167, 1167, 1167, - 2237, 1167, 2238, 1142, 1167, 1170, 1170, 1170, 1172, 1172, - 1172, 2239, 2240, 1164, 1173, 1173, 1173, 2241, 1155, 1153, - 1174, 1174, 1174, 1170, 2242, 1172, 1175, 1175, 1175, 1176, - - 1176, 1176, 1173, 1179, 1179, 1179, 2243, 2244, 1174, 1186, - 1186, 1186, 2245, 1175, 1195, 1195, 1195, 1176, 1198, 1198, - 1198, 1179, 2246, 2247, 1170, 2248, 2249, 1186, 1200, 1200, - 1200, 1201, 1201, 1201, 1205, 1205, 1205, 1207, 1207, 1207, - 2250, 2251, 1174, 2247, 1208, 1208, 1208, 2252, 1208, 2253, - 1173, 1208, 2254, 2255, 1179, 1213, 1213, 1213, 2256, 2257, - 1176, 1186, 1215, 1215, 1215, 2258, 1215, 2259, 2260, 1215, - 1179, 2261, 2262, 1213, 1219, 1219, 1219, 1201, 1219, 2263, - 2264, 1219, 2265, 1207, 1223, 1223, 1223, 1224, 1224, 1224, - 2266, 1200, 1226, 1226, 1226, 2267, 1226, 2269, 2270, 1226, - - 2271, 2272, 1223, 1229, 1229, 1229, 1213, 1230, 1230, 1230, - 2273, 1230, 2268, 2274, 1230, 1231, 1231, 1231, 2268, 2276, - 1229, 1236, 1236, 1236, 1237, 1237, 1237, 1238, 1238, 1238, - 1239, 1239, 1239, 1231, 1240, 1240, 1240, 2277, 1243, 1243, - 1243, 2279, 1243, 2281, 1223, 1243, 1246, 1246, 1246, 1247, - 1247, 1247, 2283, 1247, 2284, 2286, 1247, 1248, 1248, 1248, - 1249, 1249, 1249, 1246, 1249, 2287, 1231, 1249, 1251, 1251, - 1251, 1253, 1253, 1253, 1248, 1254, 1254, 1254, 2289, 1254, - 2290, 2291, 1254, 1255, 1255, 1255, 1251, 2292, 1253, 2293, - 1238, 2295, 2289, 1239, 1257, 1257, 1257, 1240, 1257, 2297, - - 1255, 1257, 1260, 1260, 1260, 1261, 1261, 1261, 2298, 1261, - 2299, 2301, 1261, 1262, 1262, 1262, 1266, 1266, 1266, 1260, - 1267, 1267, 1267, 1269, 1269, 1269, 2303, 1270, 1270, 1270, - 1262, 1270, 2305, 1266, 1270, 1271, 1271, 1271, 1267, 2306, - 1269, 1273, 1273, 1273, 1274, 1274, 1274, 2307, 1274, 2308, - 2309, 1274, 1271, 1277, 1277, 1277, 2310, 2311, 1273, 1279, - 1279, 1279, 1283, 1283, 1283, 1284, 1284, 1284, 2312, 1284, - 2313, 1277, 1284, 1286, 1286, 1286, 2314, 1279, 2316, 1283, - 1288, 1288, 1288, 2318, 2320, 1267, 1290, 1290, 1290, 2321, - 2322, 1286, 1291, 1291, 1291, 1292, 1292, 1292, 1288, 1293, - - 1293, 1293, 2323, 1290, 1295, 1295, 1295, 2324, 2325, 1291, - 1279, 2350, 1292, 1296, 1296, 1296, 2336, 1293, 1297, 1297, - 1297, 2326, 1295, 1298, 1298, 1298, 1305, 1305, 1305, 2344, - 1296, 1288, 1300, 1300, 1300, 1297, 1300, 2344, 2340, 1300, - 2327, 1298, 2337, 2341, 1305, 1307, 1307, 1307, 2350, 1411, - 1295, 2342, 1308, 1308, 1308, 2342, 1308, 2326, 1292, 1308, - 2343, 2345, 1307, 2336, 2343, 1293, 1309, 1309, 1309, 2345, - 1310, 1310, 1310, 1311, 1311, 1311, 2327, 1305, 1312, 1312, - 1312, 2340, 1312, 2352, 1309, 1312, 2341, 1298, 1310, 2337, - 1311, 1313, 1313, 1313, 1319, 1319, 1319, 1320, 1320, 1320, - - 1325, 1325, 1325, 1329, 1329, 1329, 1330, 1330, 1330, 1313, - 1409, 1319, 1331, 1331, 1331, 1320, 1332, 1332, 1332, 1334, - 1334, 1334, 1406, 2352, 1309, 1310, 1335, 1335, 1335, 1338, - 1338, 1338, 1342, 1342, 1342, 1344, 1344, 1344, 1346, 1346, - 1346, 1347, 1347, 1347, 1356, 1356, 1356, 2338, 1356, 1405, - 1342, 1356, 1344, 1359, 1359, 1359, 1346, 1320, 1347, 1361, - 1361, 1361, 1364, 1364, 1364, 1365, 1365, 1365, 1368, 1368, - 1368, 1359, 1368, 2351, 1401, 1368, 1361, 1371, 1371, 1371, - 2348, 1371, 2339, 2346, 1371, 1375, 1375, 1375, 1378, 1378, - 1378, 2346, 1378, 2354, 2338, 1378, 1346, 2349, 1395, 1359, - - 1381, 1381, 1381, 1375, 1382, 1382, 1382, 2347, 1382, 2353, - 2351, 1382, 1384, 1384, 1384, 2347, 1384, 1381, 2386, 1384, - 1387, 1387, 1387, 1388, 1388, 1388, 2348, 1388, 2354, 2339, - 1388, 1389, 1389, 1389, 1392, 1392, 1392, 1387, 1393, 1393, - 1393, 2358, 1393, 2349, 2387, 1393, 2355, 2386, 1389, 2353, - 2356, 1392, 1394, 1394, 1394, 1396, 1396, 1396, 1391, 1396, - 2357, 2359, 1396, 1399, 1399, 1399, 2366, 1400, 1400, 1400, - 1394, 1400, 2414, 2387, 1400, 1402, 1402, 1402, 2358, 1402, - 1399, 2355, 1402, 1407, 1407, 1407, 1410, 1410, 1410, 1412, - 1412, 1412, 1414, 1414, 1414, 2356, 1414, 2360, 2359, 1414, - - 2366, 1407, 2361, 1394, 1410, 2357, 1412, 1418, 1418, 1418, - 1421, 1421, 1421, 1423, 1423, 1423, 1424, 1424, 1424, 2414, - 1424, 1390, 1383, 1424, 2364, 1418, 2365, 2368, 1421, 2360, - 1423, 1425, 1425, 1425, 2361, 1412, 1426, 1426, 1426, 2400, - 1426, 1377, 2372, 1426, 1428, 1428, 1428, 2374, 1425, 1410, - 1430, 1430, 1430, 1431, 1431, 1431, 1432, 1432, 1432, 2364, - 1432, 2365, 1428, 1432, 1433, 1433, 1433, 2362, 1430, 2368, - 1431, 1434, 1434, 1434, 2367, 1434, 2362, 2372, 1434, 2400, - 2374, 1433, 1435, 1435, 1435, 1439, 1439, 1439, 1441, 1441, - 1441, 2380, 1441, 2363, 2370, 1441, 1444, 1444, 1444, 1430, - - 1435, 2415, 2363, 1439, 1445, 1445, 1445, 2376, 2367, 1428, - 2373, 1446, 1446, 1446, 1444, 1446, 2376, 2375, 1446, 1449, - 1449, 1449, 1445, 1455, 1455, 1455, 1456, 1456, 1456, 2377, - 1456, 1374, 2380, 1456, 1457, 1457, 1457, 1449, 2377, 2370, - 1455, 1458, 1458, 1458, 1373, 2373, 1435, 1444, 2415, 1439, - 2375, 2369, 1457, 1461, 1461, 1461, 2371, 1445, 1462, 1462, - 1462, 1465, 1465, 1465, 1466, 1466, 1466, 1467, 1467, 1467, - 1469, 1469, 1469, 1470, 1470, 1470, 1471, 1471, 1471, 1472, - 1472, 1472, 1476, 1476, 1476, 1479, 1479, 1479, 1480, 1480, - 1480, 2381, 1480, 2369, 2382, 1480, 2378, 1457, 2408, 1372, - - 1476, 2371, 1479, 1482, 1482, 1482, 1483, 1483, 1483, 1484, - 1484, 1484, 1367, 1484, 2379, 2402, 1484, 1495, 1495, 1495, - 2383, 1482, 2384, 1483, 1497, 1497, 1497, 1498, 1498, 1498, - 2408, 1498, 2381, 2378, 1498, 1495, 1499, 1499, 1499, 2382, - 2394, 1497, 1501, 1501, 1501, 1508, 1508, 1508, 2394, 1508, - 2402, 2379, 1508, 1512, 1512, 1512, 2403, 1512, 2390, 2384, - 1512, 1515, 1515, 1515, 2388, 2383, 1495, 1516, 1516, 1516, - 2385, 1516, 2389, 2388, 1516, 1519, 1519, 1519, 1515, 1519, - 2396, 2389, 1519, 1522, 1522, 1522, 1524, 1524, 1524, 2391, - 1524, 2403, 2390, 1524, 1531, 1531, 1531, 1533, 1533, 1533, - - 2395, 1522, 1534, 1534, 1534, 1366, 1534, 2385, 2395, 1534, - 2392, 1363, 1531, 2419, 1533, 1541, 1541, 1541, 1544, 1544, - 1544, 2410, 1544, 2391, 2419, 1544, 2396, 1547, 1547, 1547, - 2410, 1547, 2393, 1541, 1547, 1551, 1551, 1551, 1553, 1553, - 1553, 1554, 1554, 1554, 2397, 1554, 1522, 2398, 1554, 2401, - 1557, 1557, 1557, 1551, 1557, 2392, 1553, 1557, 1560, 1560, - 1560, 1561, 1561, 1561, 1564, 1564, 1564, 1566, 1566, 1566, - 1567, 1567, 1567, 1568, 1568, 1568, 1560, 2393, 1561, 1571, - 1571, 1571, 1564, 2411, 2398, 1566, 1551, 2418, 1567, 2401, - 2397, 1568, 2411, 1362, 1560, 1572, 1572, 1572, 2404, 1572, - - 1360, 2418, 1572, 1553, 1575, 1575, 1575, 1576, 1576, 1576, - 1577, 1577, 1577, 1579, 1579, 1579, 1580, 1580, 1580, 1581, - 1581, 1581, 1575, 1582, 1582, 1582, 1566, 1355, 1564, 1584, - 1584, 1584, 1585, 1585, 1585, 1589, 1589, 1589, 1590, 1590, - 1590, 2409, 1590, 2404, 1353, 1590, 1594, 1594, 1594, 1596, - 1596, 1596, 1589, 1596, 2405, 1352, 1596, 1609, 1609, 1609, - 1351, 1349, 1575, 1348, 1594, 1611, 1611, 1611, 1345, 1611, - 2399, 1343, 1611, 2409, 2412, 1609, 1614, 1614, 1614, 1625, - 1625, 1625, 1341, 1625, 2406, 1340, 1625, 1630, 1630, 1630, - 1636, 1636, 1636, 1638, 1638, 1638, 1639, 1639, 1639, 2405, - - 1639, 2413, 2416, 1639, 2407, 1630, 2412, 2399, 1636, 1339, - 1638, 1650, 1650, 1650, 1652, 1652, 1652, 1609, 1653, 1653, - 1653, 2406, 1654, 1654, 1654, 1655, 1655, 1655, 1656, 1656, - 1656, 2417, 1652, 2413, 2416, 1653, 1661, 1661, 1661, 1638, - 1654, 2407, 1337, 1655, 1336, 1656, 1657, 1657, 1657, 1333, - 1657, 1328, 1327, 1657, 1658, 1658, 1658, 1660, 1660, 1660, - 1662, 1662, 1662, 2417, 1663, 1663, 1663, 1326, 1665, 1665, - 1665, 1658, 1668, 1668, 1668, 1660, 1324, 1323, 1662, 1322, - 1321, 1654, 1663, 1318, 1306, 1655, 1665, 1669, 1669, 1669, - 1670, 1670, 1670, 1672, 1672, 1672, 1673, 1673, 1673, 1677, - - 1677, 1677, 1678, 1678, 1678, 1669, 1678, 1304, 1303, 1678, - 1690, 1690, 1690, 1699, 1699, 1699, 1677, 1703, 1703, 1703, - 1704, 1704, 1704, 1299, 1294, 1662, 1289, 1287, 1690, 1665, - 1699, 1709, 1709, 1709, 1703, 1711, 1711, 1711, 1704, 1712, - 1712, 1712, 1285, 1712, 1282, 1281, 1712, 1280, 1709, 1720, - 1720, 1720, 1711, 1722, 1722, 1722, 1724, 1724, 1724, 1726, - 1726, 1726, 1278, 1727, 1727, 1727, 1720, 1727, 1276, 1690, - 1727, 1728, 1728, 1728, 1724, 1275, 1726, 1729, 1729, 1729, - 1730, 1730, 1730, 1272, 1730, 1268, 1265, 1730, 1264, 1728, - 1733, 1733, 1733, 1263, 1256, 1729, 1734, 1734, 1734, 1252, - - 1734, 1250, 1242, 1734, 1735, 1735, 1735, 1733, 1736, 1736, - 1736, 1738, 1738, 1738, 1739, 1739, 1739, 1743, 1743, 1743, - 1241, 1735, 1748, 1748, 1748, 1235, 1736, 1749, 1749, 1749, - 1234, 1749, 1739, 1233, 1749, 1743, 1763, 1763, 1763, 1748, - 1764, 1764, 1764, 1729, 1767, 1767, 1767, 1770, 1770, 1770, - 1232, 1771, 1771, 1771, 1763, 1771, 1225, 1764, 1771, 1222, - 1218, 1767, 1214, 1212, 1770, 1775, 1775, 1775, 1776, 1776, - 1776, 1211, 1776, 1206, 1204, 1776, 1778, 1778, 1778, 1780, - 1780, 1780, 1775, 1781, 1781, 1781, 1203, 1781, 1202, 1199, - 1781, 1197, 1196, 1778, 1194, 1763, 1780, 1782, 1782, 1782, - - 1783, 1783, 1783, 1191, 1783, 1190, 1189, 1783, 1791, 1791, - 1791, 1792, 1792, 1792, 1782, 1792, 1188, 1187, 1792, 1793, - 1793, 1793, 1794, 1794, 1794, 1791, 1795, 1795, 1795, 1185, - 1795, 1184, 1181, 1795, 1178, 1171, 1793, 1169, 1168, 1794, - 1798, 1798, 1798, 1800, 1800, 1800, 1801, 1801, 1801, 1165, - 1801, 1160, 1159, 1801, 1804, 1804, 1804, 1154, 1798, 1152, - 1148, 1800, 1805, 1805, 1805, 1147, 1805, 1141, 1132, 1805, - 1131, 1804, 1806, 1806, 1806, 1811, 1811, 1811, 1814, 1814, - 1814, 1815, 1815, 1815, 1130, 1815, 1128, 1126, 1815, 1125, - 1806, 1833, 1833, 1833, 1120, 1814, 1834, 1834, 1834, 1835, - - 1835, 1835, 1119, 1835, 1117, 1115, 1835, 1114, 1800, 1833, - 1836, 1836, 1836, 1834, 1837, 1837, 1837, 1838, 1838, 1838, - 1839, 1839, 1839, 1113, 1839, 1112, 1111, 1839, 1840, 1840, - 1840, 1837, 1840, 1104, 1838, 1840, 1846, 1846, 1846, 1103, - 1846, 1101, 1833, 1846, 1850, 1850, 1850, 1851, 1851, 1851, - 1095, 1851, 1094, 1093, 1851, 1853, 1853, 1853, 1092, 1853, - 1837, 1850, 1853, 1856, 1856, 1856, 1857, 1857, 1857, 1091, - 1857, 1088, 1087, 1857, 1859, 1859, 1859, 1861, 1861, 1861, - 1856, 1861, 1084, 1083, 1861, 1864, 1864, 1864, 1865, 1865, - 1865, 1859, 1865, 1078, 1075, 1865, 1866, 1866, 1866, 1867, - - 1867, 1867, 1864, 1867, 1072, 1063, 1867, 1874, 1874, 1874, - 1875, 1875, 1875, 1866, 1875, 1061, 1060, 1875, 1880, 1880, - 1880, 1881, 1881, 1881, 1057, 1874, 1884, 1884, 1884, 1056, - 1884, 1054, 1053, 1884, 1052, 1880, 1880, 1895, 1895, 1895, - 1051, 1904, 1904, 1904, 1905, 1905, 1905, 1050, 1905, 1049, - 1047, 1905, 1046, 1042, 1895, 1908, 1908, 1908, 1874, 1904, - 1909, 1909, 1909, 1910, 1910, 1910, 1041, 1910, 1040, 1039, - 1910, 1912, 1912, 1912, 1038, 1912, 1036, 1909, 1912, 1919, - 1919, 1919, 1035, 1919, 1034, 1033, 1919, 1923, 1923, 1923, - 1904, 1923, 1024, 1009, 1923, 1927, 1927, 1927, 1928, 1928, - - 1928, 1008, 1928, 1003, 1002, 1928, 1930, 1930, 1930, 1000, - 1930, 993, 1927, 1930, 1933, 1933, 1933, 992, 1933, 982, - 977, 1933, 1942, 1942, 1942, 1944, 1944, 1944, 1945, 1945, - 1945, 1946, 1946, 1946, 974, 1946, 973, 970, 1946, 965, - 1942, 956, 1944, 1944, 955, 1945, 1945, 954, 950, 1946, - 1947, 1947, 1947, 1948, 1948, 1948, 1957, 1957, 1957, 1958, - 1958, 1958, 942, 1958, 937, 936, 1958, 1967, 1967, 1967, - 1968, 1968, 1968, 1957, 1968, 935, 929, 1968, 1974, 1974, - 1974, 1976, 1976, 1976, 928, 1967, 1977, 1977, 1977, 1978, - 1978, 1978, 927, 1978, 926, 1974, 1978, 921, 1976, 1981, - - 1981, 1981, 920, 1977, 1996, 1996, 1996, 1999, 1999, 1999, - 2000, 2000, 2000, 919, 2000, 918, 1981, 2000, 917, 2001, - 2001, 2001, 1996, 2001, 1999, 1999, 2001, 916, 2000, 2004, - 2004, 2004, 1967, 2005, 2005, 2005, 906, 2001, 2002, 2002, - 2002, 2002, 2002, 2002, 2002, 2002, 2002, 905, 904, 2002, - 2023, 2023, 2023, 903, 2002, 2002, 2002, 2002, 2002, 2014, - 2014, 2014, 898, 2014, 897, 892, 2014, 891, 2023, 2028, - 2028, 2028, 890, 2028, 889, 888, 2028, 2027, 2027, 2027, - 2030, 2030, 2030, 2002, 2002, 2003, 2003, 2003, 2003, 2003, - 2003, 2003, 2003, 2003, 2027, 887, 2003, 2030, 2032, 2032, - - 2032, 2003, 2003, 2003, 2003, 2003, 2031, 2031, 2031, 886, - 2031, 885, 884, 2031, 879, 2032, 2033, 2033, 2033, 875, - 2033, 870, 868, 2033, 2034, 2034, 2034, 2068, 2068, 2068, - 2003, 2003, 2035, 2035, 2035, 862, 2035, 860, 851, 2035, - 846, 2034, 2049, 2049, 2049, 2068, 2049, 840, 838, 2049, - 2073, 2073, 2073, 837, 2073, 835, 834, 2073, 833, 832, - 2049, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, - 831, 829, 2052, 828, 827, 826, 825, 2052, 2052, 2052, - 2052, 2052, 2077, 2077, 2077, 824, 2077, 823, 822, 2077, - 2080, 2080, 2080, 821, 2080, 815, 814, 2080, 2083, 2083, - - 2083, 813, 2083, 810, 809, 2083, 2052, 2052, 2053, 2053, - 2053, 2053, 2053, 2053, 2053, 2053, 2053, 808, 806, 2053, - 2104, 2104, 2104, 802, 2053, 2053, 2053, 2053, 2053, 2113, - 2113, 2113, 2114, 2114, 2114, 2115, 2115, 2115, 2104, 2104, - 2120, 2120, 2120, 2133, 2133, 2133, 2113, 799, 790, 2114, - 789, 786, 2115, 2053, 2053, 785, 784, 2120, 2137, 2137, - 2137, 2133, 2142, 2142, 2142, 2143, 2143, 2143, 783, 2143, - 773, 766, 2143, 2144, 2144, 2144, 2137, 758, 757, 2142, - 2145, 2145, 2145, 756, 2145, 753, 748, 2145, 745, 744, - 2144, 2146, 2146, 2146, 2147, 2147, 2147, 743, 2147, 739, - - 737, 2147, 2154, 2154, 2154, 2166, 2166, 2166, 2146, 2137, - 2155, 2155, 2155, 734, 2155, 733, 732, 2155, 731, 2154, - 2172, 2172, 2172, 2166, 2172, 730, 729, 2172, 2175, 2175, - 2175, 725, 2175, 721, 718, 2175, 2178, 2178, 2178, 717, - 2178, 714, 2166, 2178, 2187, 2187, 2187, 713, 2187, 712, - 711, 2187, 2304, 2304, 2304, 2315, 2315, 2315, 710, 2315, - 708, 707, 2315, 2420, 2420, 2420, 2421, 2421, 2421, 706, - 2304, 705, 701, 2315, 698, 695, 694, 693, 692, 689, - 688, 2420, 687, 685, 2421, 2424, 2424, 2424, 2424, 2424, + 173, 173, 173, 1759, 173, 173, 173, 173, 173, 625, + 625, 625, 647, 647, 647, 651, 651, 651, 694, 694, + + 694, 670, 670, 670, 1760, 1761, 625, 1763, 1766, 647, + 1768, 1790, 651, 173, 173, 1786, 694, 1791, 1792, 670, + 722, 722, 722, 1797, 722, 1798, 1785, 722, 738, 738, + 738, 1799, 738, 1787, 1800, 738, 173, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 1786, 174, 174, 174, 174, 174, 670, 697, + 697, 697, 695, 695, 695, 1785, 701, 701, 701, 702, + 702, 702, 705, 705, 705, 1787, 697, 707, 707, 707, + 695, 1801, 174, 174, 701, 1802, 1803, 702, 1804, 705, + 1805, 746, 746, 746, 707, 746, 1806, 1807, 746, 1121, + + 1121, 1121, 1122, 1122, 1122, 174, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 177, 695, 177, 177, 177, 177, 177, 709, 709, 709, + 1809, 1810, 702, 1816, 1817, 713, 713, 713, 714, 714, + 714, 719, 719, 719, 709, 1224, 1224, 1224, 1122, 1821, + 1824, 177, 177, 713, 1832, 1833, 714, 1834, 1858, 719, + 1859, 1862, 177, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 1854, 178, + 178, 178, 178, 178, 1863, 714, 720, 720, 720, 721, + 721, 721, 724, 724, 724, 737, 737, 737, 725, 725, + + 725, 745, 745, 745, 720, 1865, 721, 1854, 178, 178, + 724, 1866, 737, 1226, 1226, 1226, 725, 1868, 745, 178, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 725, 187, 187, 187, 187, + 187, 741, 741, 741, 742, 742, 742, 1869, 1795, 720, + 748, 748, 748, 749, 749, 749, 1870, 749, 1795, 741, + 749, 1795, 742, 1871, 1796, 187, 187, 748, 750, 750, + 750, 764, 764, 764, 1796, 764, 187, 1796, 764, 772, + 772, 772, 1872, 772, 1874, 750, 772, 1875, 187, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + + 188, 188, 188, 188, 742, 188, 188, 188, 188, 188, + 758, 758, 758, 759, 759, 759, 763, 763, 763, 765, + 765, 765, 768, 768, 768, 769, 769, 769, 758, 1876, + 1877, 759, 1887, 763, 188, 188, 765, 771, 771, 771, + 768, 1888, 1855, 769, 1889, 188, 773, 773, 773, 1893, + 1864, 774, 774, 774, 771, 1901, 1903, 188, 230, 1911, + 776, 776, 776, 1864, 773, 230, 781, 781, 781, 774, + 759, 782, 782, 782, 230, 230, 769, 776, 777, 777, + 777, 1912, 777, 1855, 781, 777, 1228, 1228, 1228, 782, + 783, 783, 783, 1231, 1231, 1231, 784, 784, 784, 786, + + 786, 786, 230, 230, 230, 1856, 1867, 783, 1913, 230, + 230, 774, 230, 784, 1914, 1915, 230, 786, 230, 1867, + 230, 785, 785, 785, 1916, 1922, 782, 787, 787, 787, + 789, 789, 789, 790, 790, 790, 1925, 1926, 785, 791, + 791, 791, 792, 792, 792, 787, 1856, 789, 1930, 1931, + 790, 793, 793, 793, 1921, 1932, 791, 1933, 1934, 792, + 1922, 1935, 794, 794, 794, 796, 796, 796, 1936, 793, + 797, 797, 797, 1937, 797, 1939, 1940, 797, 1941, 785, + 794, 1942, 796, 790, 798, 798, 798, 787, 799, 799, + 799, 800, 800, 800, 801, 801, 801, 790, 1943, 794, + + 792, 1921, 798, 802, 802, 802, 799, 1944, 800, 1945, + 1946, 801, 803, 803, 803, 804, 804, 804, 1951, 1955, + 802, 809, 809, 809, 810, 810, 810, 813, 813, 813, + 803, 1956, 1957, 804, 814, 814, 814, 1958, 1965, 809, + 1968, 1975, 810, 799, 801, 813, 815, 815, 815, 816, + 816, 816, 814, 816, 1976, 1977, 816, 1978, 801, 817, + 817, 817, 1979, 815, 818, 818, 818, 819, 819, 819, + 1980, 820, 820, 820, 1988, 820, 1982, 817, 820, 871, + 871, 871, 818, 871, 819, 804, 871, 810, 822, 822, + 822, 823, 823, 823, 838, 838, 838, 814, 839, 839, + + 839, 841, 841, 841, 1989, 1990, 822, 1842, 1970, 823, + 1982, 1991, 838, 865, 865, 865, 839, 1842, 1970, 841, + 866, 866, 866, 1842, 818, 867, 867, 867, 1992, 1993, + 865, 869, 869, 869, 870, 870, 870, 1843, 866, 874, + 874, 874, 1971, 867, 876, 876, 876, 1843, 841, 869, + 1973, 870, 1971, 1843, 823, 1994, 874, 877, 877, 877, + 1973, 1974, 876, 879, 879, 879, 881, 881, 881, 1995, + 881, 1974, 1998, 881, 1999, 877, 884, 884, 884, 2001, + 869, 879, 885, 885, 885, 2002, 885, 2003, 2005, 885, + 886, 886, 886, 884, 887, 887, 887, 2010, 2011, 874, + + 2012, 888, 888, 888, 2014, 888, 2020, 886, 888, 2021, + 879, 887, 890, 890, 890, 892, 892, 892, 893, 893, + 893, 895, 895, 895, 898, 898, 898, 2022, 2023, 890, + 900, 900, 900, 892, 2024, 2025, 893, 2026, 2027, 895, + 2028, 898, 901, 901, 901, 903, 903, 903, 900, 904, + 904, 904, 2029, 904, 2031, 2032, 904, 908, 908, 908, + 901, 2036, 2044, 903, 909, 909, 909, 911, 911, 911, + 921, 921, 921, 2045, 2046, 908, 2047, 922, 922, 922, + 895, 922, 909, 2048, 922, 911, 2049, 921, 927, 927, + 927, 2050, 903, 928, 928, 928, 930, 930, 930, 2051, + + 935, 935, 935, 2036, 935, 2055, 927, 935, 938, 938, + 938, 928, 2056, 2057, 930, 939, 939, 939, 2058, 939, + 2059, 2060, 939, 2062, 2063, 938, 942, 942, 942, 943, + 943, 943, 2064, 943, 2067, 2072, 943, 951, 951, 951, + 952, 952, 952, 942, 954, 954, 954, 959, 959, 959, + 2073, 959, 2074, 2075, 959, 951, 2076, 2077, 952, 2078, + 930, 2079, 954, 962, 962, 962, 963, 963, 963, 2080, + 963, 2081, 2082, 963, 966, 966, 966, 967, 967, 967, + 962, 969, 969, 969, 971, 971, 971, 2083, 971, 2090, + 2093, 971, 966, 2094, 2097, 967, 974, 974, 974, 969, + + 975, 975, 975, 977, 977, 977, 985, 985, 985, 2084, + 954, 986, 986, 986, 974, 979, 979, 979, 975, 979, + 2087, 977, 979, 2099, 985, 988, 988, 988, 2086, 986, + 2100, 2087, 969, 989, 989, 989, 2102, 990, 990, 990, + 2103, 990, 2086, 988, 990, 991, 991, 991, 2106, 2107, + 989, 992, 992, 992, 2084, 992, 2108, 2112, 992, 994, + 994, 994, 991, 995, 995, 995, 999, 999, 999, 977, + 997, 997, 997, 1003, 1003, 1003, 2120, 994, 1000, 1000, + 1000, 995, 1000, 999, 988, 1000, 2122, 2124, 997, 2126, + 1003, 1004, 1004, 1004, 2134, 1004, 2133, 2133, 1004, 1006, + + 1006, 1006, 1007, 1007, 1007, 1009, 1009, 1009, 1011, 1011, + 1011, 2131, 1011, 2136, 2138, 1011, 2139, 1006, 2140, 2141, + 1007, 2149, 2150, 1009, 1014, 1014, 1014, 1015, 1015, 1015, + 1017, 1017, 1017, 1018, 1018, 1018, 997, 1019, 1019, 1019, + 2149, 1019, 1014, 2152, 1019, 1015, 2110, 2151, 1017, 2111, + 1018, 2131, 1022, 1022, 1022, 1023, 1023, 1023, 2110, 1023, + 2155, 2111, 1023, 1024, 1024, 1024, 2151, 2117, 1009, 1022, + 1025, 1025, 1025, 1027, 1027, 1027, 1029, 1029, 1029, 2117, + 2118, 1024, 1032, 1032, 1032, 1033, 1033, 1033, 1025, 1017, + 2135, 1027, 2118, 1029, 1035, 1035, 1035, 1038, 1038, 1038, + + 1032, 2135, 2154, 1033, 1039, 1039, 1039, 1041, 1041, 1041, + 2132, 2157, 1035, 2156, 2163, 1038, 1042, 1042, 1042, 2164, + 1042, 2154, 1039, 1042, 2132, 1041, 1045, 1045, 1045, 1046, + 1046, 1046, 2156, 2165, 1027, 1048, 1048, 1048, 1049, 1049, + 1049, 2167, 1049, 2168, 1045, 1049, 2169, 1046, 1053, 1053, + 1053, 2170, 2177, 1048, 1035, 1054, 1054, 1054, 2178, 2179, + 1041, 1056, 1056, 1056, 2180, 2181, 1053, 1058, 1058, 1058, + 1065, 1065, 1065, 1054, 1088, 1088, 1088, 2182, 2185, 1056, + 1089, 1089, 1089, 2186, 1089, 1058, 1058, 1089, 1065, 2187, + 2188, 1088, 2189, 2190, 1048, 1090, 1090, 1090, 1091, 1091, + + 1091, 1092, 1092, 1092, 2192, 1092, 2194, 2196, 1092, 1095, + 1095, 1095, 2206, 1090, 2207, 1091, 1097, 1097, 1097, 2208, + 1097, 1056, 2204, 1097, 1100, 1100, 1100, 1095, 2209, 1101, + 1101, 1101, 2205, 1101, 2204, 1065, 1101, 2210, 1102, 1102, + 1102, 1100, 1102, 2211, 2205, 1102, 1106, 1106, 1106, 1107, + 1107, 1107, 1090, 1107, 2215, 2216, 1107, 2217, 1095, 1109, + 1109, 1109, 2218, 1106, 1112, 1112, 1112, 1113, 1113, 1113, + 2219, 1113, 2220, 2221, 1113, 2223, 2224, 1109, 1114, 1114, + 1114, 1112, 1115, 1115, 1115, 1117, 1117, 1117, 1128, 1128, + 1128, 2225, 1129, 1129, 1129, 1114, 1129, 2226, 2221, 1129, + + 1115, 2227, 2228, 1117, 2229, 1128, 1130, 1130, 1130, 1109, + 1131, 1131, 1131, 2230, 1132, 1132, 1132, 1134, 1134, 1134, + 1137, 1137, 1137, 1130, 1142, 1142, 1142, 1131, 1175, 1175, + 1175, 1115, 1132, 2231, 1134, 2232, 2233, 1137, 1138, 1138, + 1138, 1142, 1138, 2234, 2235, 1138, 1139, 1139, 1139, 2236, + 1139, 2237, 2238, 1139, 2239, 2240, 1131, 1149, 1149, 1149, + 1151, 1151, 1151, 1154, 1154, 1154, 2244, 1154, 2241, 2245, + 1154, 1157, 1157, 1157, 1175, 1149, 2246, 1151, 2247, 1132, + 1159, 1159, 1159, 1161, 1161, 1161, 2248, 2241, 1157, 1165, + 1165, 1165, 2249, 1166, 1166, 1166, 2250, 2251, 1159, 2252, + + 2253, 1161, 2254, 1167, 1167, 1167, 1165, 1167, 2255, 2256, + 1167, 1166, 1170, 1170, 1170, 2257, 1170, 2258, 2259, 1170, + 2261, 1149, 1174, 1174, 1174, 1176, 1176, 1176, 2262, 1176, + 2263, 2264, 1176, 2265, 2266, 1165, 2260, 1181, 1181, 1181, + 1174, 1181, 2267, 1159, 1181, 1185, 1185, 1185, 1161, 1166, + 1187, 1187, 1187, 1188, 1188, 1188, 2260, 1188, 2268, 2269, + 1188, 2270, 2271, 1185, 2272, 1193, 1193, 1193, 1187, 1193, + 2273, 2274, 1193, 1196, 1196, 1196, 1198, 1198, 1198, 1199, + 1199, 1199, 2275, 1199, 2276, 2278, 1199, 1174, 1233, 1233, + 1233, 1196, 2279, 1198, 1202, 1202, 1202, 1204, 1204, 1204, + + 1205, 1205, 1205, 2280, 2277, 1185, 1187, 1206, 1206, 1206, + 2277, 2281, 1202, 2282, 1204, 1207, 1207, 1207, 1205, 2283, + 1196, 1208, 1208, 1208, 2285, 1206, 1211, 1211, 1211, 1218, + 1218, 1218, 1207, 1234, 1234, 1234, 1239, 1239, 1239, 1208, + 1241, 1241, 1241, 1202, 1211, 2286, 2288, 1218, 1242, 1242, + 1242, 1233, 1242, 2289, 2291, 1242, 1245, 1245, 1245, 1206, + 1246, 1246, 1246, 2292, 1246, 2295, 1205, 1246, 2296, 1251, + 1251, 1251, 2297, 2298, 1245, 2300, 2302, 1211, 2304, 1234, + 2294, 1218, 1208, 1261, 1261, 1261, 1241, 1251, 1253, 1253, + 1253, 2306, 1253, 1211, 2294, 1253, 1257, 1257, 1257, 2308, + + 1257, 1261, 2309, 1257, 1262, 1262, 1262, 1264, 1264, 1264, + 2310, 1264, 2311, 2312, 1264, 1267, 1267, 1267, 2313, 2314, + 1251, 2315, 1245, 1268, 1268, 1268, 2317, 1268, 2319, 2321, + 1268, 2322, 1267, 1269, 1269, 1269, 1273, 1273, 1273, 1274, + 1274, 1274, 2323, 1261, 1275, 1275, 1275, 1276, 1276, 1276, + 2324, 1269, 1277, 1277, 1277, 1280, 1280, 1280, 2337, 1280, + 2383, 2341, 1280, 1283, 1283, 1283, 1284, 1284, 1284, 2341, + 1284, 2333, 2325, 1284, 1285, 1285, 1285, 1288, 1288, 1288, + 1283, 1286, 1286, 1286, 1269, 1286, 2339, 1406, 1286, 2383, + 2339, 1285, 1290, 1290, 1290, 1288, 1291, 1291, 1291, 2334, + + 1291, 2337, 2359, 1291, 1292, 1292, 1292, 1275, 2325, 1290, + 1276, 2359, 1294, 1294, 1294, 1277, 1294, 2351, 2333, 1294, + 2342, 1292, 1297, 1297, 1297, 1298, 1298, 1298, 2342, 1298, + 2335, 2326, 1298, 1299, 1299, 1299, 1304, 1304, 1304, 1297, + 1305, 1305, 1305, 1307, 1307, 1307, 2334, 1308, 1308, 1308, + 1299, 1308, 2351, 1304, 1308, 1309, 1309, 1309, 1305, 2416, + 1307, 1311, 1311, 1311, 1312, 1312, 1312, 2326, 1312, 2349, + 2416, 1312, 1309, 1314, 1314, 1314, 2345, 2335, 1311, 1316, + 1316, 1316, 1320, 1320, 1320, 1321, 1321, 1321, 2338, 1321, + 2343, 1314, 1321, 1323, 1323, 1323, 2344, 1316, 2343, 1320, + + 1325, 1325, 1325, 2346, 2344, 1305, 1327, 1327, 1327, 2349, + 2336, 1323, 1328, 1328, 1328, 1329, 1329, 1329, 1325, 1330, + 1330, 1330, 2345, 1327, 1332, 1332, 1332, 2371, 2350, 1328, + 1316, 2338, 1329, 1333, 1333, 1333, 2352, 1330, 1334, 1334, + 1334, 2365, 1332, 1335, 1335, 1335, 1342, 1342, 1342, 2346, + 1333, 1325, 1337, 1337, 1337, 1334, 1337, 2336, 2340, 1337, + 2371, 1335, 2340, 2397, 1342, 1344, 1344, 1344, 2350, 2347, + 1332, 2352, 1345, 1345, 1345, 2360, 1345, 2357, 1329, 1345, + 2373, 1405, 1344, 2365, 2360, 1330, 1346, 1346, 1346, 2373, + 1347, 1347, 1347, 1348, 1348, 1348, 2363, 1342, 1349, 1349, + + 1349, 2377, 1349, 2397, 1346, 1349, 2347, 1335, 1347, 2357, + 1348, 1350, 1350, 1350, 1356, 1356, 1356, 1357, 1357, 1357, + 1362, 1362, 1362, 1367, 1367, 1367, 1368, 1368, 1368, 1350, + 2363, 1356, 1369, 1369, 1369, 1357, 1370, 1370, 1370, 1372, + 1372, 1372, 2377, 2348, 1346, 1347, 1373, 1373, 1373, 1377, + 1377, 1377, 1379, 1379, 1379, 1382, 1382, 1382, 1384, 1384, + 1384, 1386, 1386, 1386, 1387, 1387, 1387, 1396, 1396, 1396, + 1379, 1396, 1402, 1382, 1396, 1384, 2353, 1357, 2372, 1386, + 2348, 1387, 1399, 1399, 1399, 2354, 1400, 1400, 1400, 1403, + 1403, 1403, 1404, 1404, 1404, 2358, 1401, 1407, 1407, 1407, + + 1399, 1407, 1379, 1400, 1407, 1410, 1410, 1410, 2355, 1410, + 2356, 2372, 1410, 1414, 1414, 1414, 1417, 1417, 1417, 1386, + 1417, 2353, 2375, 1417, 1420, 1420, 1420, 2358, 1399, 2367, + 2354, 1414, 1421, 1421, 1421, 2366, 1421, 2364, 2361, 1421, + 2391, 1420, 1423, 1423, 1423, 2355, 1423, 2356, 2391, 1423, + 1426, 1426, 1426, 1427, 1427, 1427, 2362, 1427, 2368, 2375, + 1427, 1428, 1428, 1428, 1432, 1432, 1432, 1426, 1433, 1433, + 1433, 2364, 1433, 2361, 2367, 1433, 2369, 2366, 1428, 2374, + 1395, 1432, 1434, 1434, 1434, 1436, 1436, 1436, 2374, 1436, + 2370, 2362, 1436, 1439, 1439, 1439, 2387, 1440, 1440, 1440, + + 1434, 1440, 1393, 2368, 1440, 1442, 1442, 1442, 2378, 1442, + 1439, 2369, 1442, 1446, 1446, 1446, 1449, 1449, 1449, 1451, + 1451, 1451, 1453, 1453, 1453, 2370, 1453, 2376, 2384, 1453, + 2387, 1446, 2379, 1434, 1449, 2381, 1451, 1457, 1457, 1457, + 1460, 1460, 1460, 1462, 1462, 1462, 1463, 1463, 1463, 2378, + 1463, 2392, 2380, 1463, 2382, 1457, 1392, 2384, 1460, 2392, + 1462, 1464, 1464, 1464, 2376, 1451, 1465, 1465, 1465, 2395, + 1465, 1391, 2381, 1465, 1467, 1467, 1467, 2379, 1464, 1449, + 1469, 1469, 1469, 1470, 1470, 1470, 1471, 1471, 1471, 2405, + 1471, 2382, 1467, 1471, 1472, 1472, 1472, 2380, 1469, 1389, + + 1470, 1473, 1473, 1473, 2388, 1473, 2395, 2398, 1473, 2396, + 1388, 1472, 1474, 1474, 1474, 1478, 1478, 1478, 1480, 1480, + 1480, 2405, 1480, 2385, 2389, 1480, 1483, 1483, 1483, 1469, + 1474, 2386, 2385, 1478, 1484, 1484, 1484, 2403, 2388, 1467, + 2386, 1485, 1485, 1485, 1483, 1485, 2396, 2398, 1485, 1488, + 1488, 1488, 1484, 1494, 1494, 1494, 1495, 1495, 1495, 2407, + 1495, 2415, 1385, 1495, 1496, 1496, 1496, 1488, 2407, 2389, + 1494, 1497, 1497, 1497, 2403, 2415, 1474, 1483, 1383, 1478, + 1381, 1380, 1496, 1500, 1500, 1500, 2390, 1484, 1501, 1501, + 1501, 1502, 1502, 1502, 1505, 1505, 1505, 1506, 1506, 1506, + + 1507, 1507, 1507, 1509, 1509, 1509, 1510, 1510, 1510, 1511, + 1511, 1511, 1512, 1512, 1512, 1513, 1513, 1513, 1515, 1515, + 1515, 1518, 1518, 1518, 1521, 1521, 1521, 1496, 1522, 1522, + 1522, 2390, 1522, 2393, 2404, 1522, 1515, 2399, 1378, 1518, + 1376, 1521, 1524, 1524, 1524, 1525, 1525, 1525, 1526, 1526, + 1526, 2394, 1526, 2401, 2400, 1526, 1537, 1537, 1537, 2402, + 1524, 1375, 1525, 1538, 1538, 1538, 1539, 1539, 1539, 1515, + 1539, 2404, 2399, 1539, 1537, 1540, 1540, 1540, 1374, 2393, + 1538, 1542, 1542, 1542, 1549, 1549, 1549, 2406, 1549, 2400, + 1371, 1549, 1553, 1553, 1553, 1366, 1553, 2394, 2401, 1553, + + 1556, 1556, 1556, 2408, 2402, 1537, 1557, 1557, 1557, 1365, + 1557, 1364, 2408, 1557, 1561, 1561, 1561, 1556, 1561, 2406, + 2409, 1561, 1564, 1564, 1564, 1566, 1566, 1566, 2410, 1566, + 2413, 2414, 1566, 1572, 1572, 1572, 1574, 1574, 1574, 2411, + 1564, 1575, 1575, 1575, 1363, 1575, 1361, 2412, 1575, 1360, + 1359, 1572, 2409, 1574, 1582, 1582, 1582, 1585, 1585, 1585, + 2410, 1585, 2413, 2414, 1585, 1358, 1588, 1588, 1588, 1355, + 1588, 1343, 1582, 1588, 1592, 1592, 1592, 1594, 1594, 1594, + 1595, 1595, 1595, 1341, 1595, 1564, 2411, 1595, 1340, 1598, + 1598, 1598, 1592, 1598, 2412, 1594, 1598, 1601, 1601, 1601, + + 1602, 1602, 1602, 1605, 1605, 1605, 1607, 1607, 1607, 1608, + 1608, 1608, 1609, 1609, 1609, 1601, 1336, 1602, 1612, 1612, + 1612, 1605, 1331, 1326, 1607, 1592, 1324, 1608, 1322, 1319, + 1609, 1318, 1317, 1601, 1613, 1613, 1613, 1315, 1613, 1313, + 1310, 1613, 1594, 1616, 1616, 1616, 1617, 1617, 1617, 1618, + 1618, 1618, 1620, 1620, 1620, 1621, 1621, 1621, 1622, 1622, + 1622, 1616, 1623, 1623, 1623, 1607, 1306, 1605, 1624, 1624, + 1624, 1626, 1626, 1626, 1627, 1627, 1627, 1628, 1628, 1628, + 1630, 1630, 1630, 1633, 1633, 1633, 1634, 1634, 1634, 1303, + 1634, 1302, 1301, 1634, 1638, 1638, 1638, 1300, 1630, 1293, + + 1633, 1616, 1640, 1640, 1640, 1289, 1640, 1287, 1279, 1640, + 1278, 1272, 1638, 1653, 1653, 1653, 1654, 1654, 1654, 1271, + 1654, 1270, 1263, 1654, 1657, 1657, 1657, 1260, 1668, 1668, + 1668, 1653, 1668, 1256, 1252, 1668, 1671, 1671, 1671, 1674, + 1674, 1674, 1679, 1679, 1679, 1681, 1681, 1681, 1682, 1682, + 1682, 1250, 1682, 1671, 1249, 1682, 1240, 1674, 1238, 1237, + 1679, 1236, 1681, 1693, 1693, 1693, 1695, 1695, 1695, 1696, + 1696, 1696, 1235, 1653, 1697, 1697, 1697, 1698, 1698, 1698, + 1699, 1699, 1699, 1232, 1695, 1230, 1696, 1701, 1701, 1701, + 1229, 1681, 1697, 1227, 1225, 1698, 1223, 1699, 1700, 1700, + + 1700, 1222, 1700, 1221, 1701, 1700, 1703, 1703, 1703, 1704, + 1704, 1704, 1705, 1705, 1705, 1220, 1706, 1706, 1706, 1219, + 1708, 1708, 1708, 1217, 1703, 1711, 1711, 1711, 1216, 1213, + 1705, 1210, 1203, 1697, 1706, 1201, 1200, 1698, 1708, 1712, + 1712, 1712, 1713, 1713, 1713, 1715, 1715, 1715, 1716, 1716, + 1716, 1719, 1719, 1719, 1722, 1722, 1722, 1712, 1723, 1723, + 1723, 1197, 1723, 1192, 1191, 1723, 1735, 1735, 1735, 1719, + 1186, 1722, 1743, 1743, 1743, 1184, 1180, 1705, 1746, 1746, + 1746, 1708, 1179, 1173, 1735, 1164, 1747, 1747, 1747, 1743, + 1747, 1163, 1162, 1747, 1160, 1746, 1749, 1749, 1749, 1750, + + 1750, 1750, 1754, 1754, 1754, 1756, 1756, 1756, 1757, 1757, + 1757, 1158, 1757, 1749, 1153, 1757, 1152, 1750, 1150, 1754, + 1148, 1147, 1756, 1146, 1145, 1735, 1765, 1765, 1765, 1767, + 1767, 1767, 1769, 1769, 1769, 1771, 1771, 1771, 1772, 1772, + 1772, 1144, 1772, 1765, 1143, 1772, 1773, 1773, 1773, 1136, + 1769, 1135, 1771, 1774, 1774, 1774, 1775, 1775, 1775, 1133, + 1775, 1127, 1126, 1775, 1773, 1778, 1778, 1778, 1779, 1779, + 1779, 1774, 1779, 1125, 1124, 1779, 1780, 1780, 1780, 1781, + 1781, 1781, 1778, 1783, 1783, 1783, 1784, 1784, 1784, 1788, + 1788, 1788, 1123, 1780, 1793, 1793, 1793, 1781, 1794, 1794, + + 1794, 1120, 1794, 1119, 1784, 1794, 1116, 1788, 1808, 1808, + 1808, 1793, 1811, 1811, 1811, 1814, 1814, 1814, 1111, 1774, + 1815, 1815, 1815, 1108, 1815, 1105, 1808, 1815, 1096, 1811, + 1094, 1093, 1814, 1818, 1818, 1818, 1087, 1818, 1086, 1084, + 1818, 1822, 1822, 1822, 1823, 1823, 1823, 1083, 1823, 1082, + 1081, 1823, 1825, 1825, 1825, 1826, 1826, 1826, 1822, 1827, + 1827, 1827, 1080, 1827, 1079, 1078, 1827, 1808, 1076, 1825, + 1075, 1072, 1826, 1828, 1828, 1828, 1829, 1829, 1829, 1070, + 1829, 1069, 1068, 1829, 1837, 1837, 1837, 1838, 1838, 1838, + 1828, 1838, 1067, 1066, 1838, 1839, 1839, 1839, 1840, 1840, + + 1840, 1837, 1841, 1841, 1841, 1064, 1841, 1063, 1062, 1841, + 1061, 1052, 1839, 1037, 1036, 1840, 1844, 1844, 1844, 1846, + 1846, 1846, 1847, 1847, 1847, 1031, 1847, 1030, 1028, 1847, + 1850, 1850, 1850, 1021, 1844, 1020, 1010, 1846, 1851, 1851, + 1851, 1005, 1851, 1002, 1001, 1851, 998, 1850, 1852, 1852, + 1852, 1857, 1857, 1857, 1860, 1860, 1860, 1861, 1861, 1861, + 993, 1861, 984, 983, 1861, 982, 1852, 1879, 1879, 1879, + 978, 1860, 1880, 1880, 1880, 1881, 1881, 1881, 1882, 1882, + 1882, 1924, 1924, 1924, 1846, 1879, 1883, 1883, 1883, 970, + 1883, 965, 1881, 1883, 964, 1882, 1884, 1884, 1884, 958, + + 1884, 957, 956, 1884, 1890, 1890, 1890, 955, 1890, 950, + 949, 1890, 1894, 1894, 1894, 1895, 1895, 1895, 1879, 1895, + 948, 1881, 1895, 1896, 1896, 1896, 947, 1896, 946, 1894, + 1896, 1899, 1899, 1899, 1900, 1900, 1900, 945, 1900, 944, + 934, 1900, 1902, 1902, 1902, 1904, 1904, 1904, 1899, 1904, + 933, 932, 1904, 1907, 1907, 1907, 1908, 1908, 1908, 1902, + 1908, 931, 926, 1908, 1909, 1909, 1909, 1910, 1910, 1910, + 1907, 1910, 925, 920, 1910, 1917, 1917, 1917, 1918, 1918, + 1918, 1909, 1918, 919, 918, 1918, 1923, 1923, 1923, 917, + 1927, 1927, 1927, 1917, 1927, 916, 915, 1927, 1938, 1938, + + 1938, 914, 913, 1923, 1923, 1947, 1947, 1947, 1948, 1948, + 1948, 1949, 1949, 1949, 912, 1938, 907, 1950, 1950, 1950, + 899, 1950, 897, 1947, 1950, 891, 1917, 889, 1949, 1952, + 1952, 1952, 880, 1952, 875, 864, 1952, 1959, 1959, 1959, + 862, 1959, 861, 860, 1959, 1962, 1962, 1962, 858, 1962, + 857, 856, 1962, 855, 1947, 1966, 1966, 1966, 1967, 1967, + 1967, 854, 1967, 852, 851, 1967, 1969, 1969, 1969, 850, + 1969, 849, 1966, 1969, 1972, 1972, 1972, 848, 1972, 847, + 846, 1972, 1981, 1981, 1981, 1983, 1983, 1983, 1984, 1984, + 1984, 1985, 1985, 1985, 845, 1985, 844, 843, 1985, 837, + + 1981, 836, 1983, 1983, 835, 1984, 1984, 832, 831, 1985, + 1986, 1986, 1986, 1987, 1987, 1987, 1996, 1996, 1996, 1997, + 1997, 1997, 830, 1997, 828, 824, 1997, 2006, 2006, 2006, + 2007, 2007, 2007, 1996, 2007, 821, 812, 2007, 2013, 2013, + 2013, 2015, 2015, 2015, 811, 2006, 2016, 2016, 2016, 808, + 2016, 807, 806, 2016, 805, 2013, 795, 788, 2015, 2019, + 2019, 2019, 2034, 2034, 2034, 2037, 2037, 2037, 2038, 2038, + 2038, 780, 2038, 779, 778, 2038, 2019, 2039, 2039, 2039, + 2034, 2039, 2037, 2037, 2039, 775, 2038, 2042, 2042, 2042, + 770, 767, 2006, 766, 762, 2039, 2040, 2040, 2040, 2040, + + 2040, 2040, 2040, 2040, 2040, 760, 757, 2040, 2043, 2043, + 2043, 756, 2040, 2040, 2040, 2040, 2040, 2052, 2052, 2052, + 755, 2052, 754, 753, 2052, 2066, 2066, 2066, 752, 2066, + 751, 747, 2066, 743, 2061, 2061, 2061, 740, 2065, 2065, + 2065, 2040, 2040, 2041, 2041, 2041, 2041, 2041, 2041, 2041, + 2041, 2041, 2061, 739, 2041, 2065, 2068, 2068, 2068, 2041, + 2041, 2041, 2041, 2041, 2069, 2069, 2069, 736, 2069, 735, + 734, 2069, 733, 2068, 2070, 2070, 2070, 2071, 2071, 2071, + 732, 2071, 730, 729, 2071, 2104, 2104, 2104, 2041, 2041, + 728, 2070, 2085, 2085, 2085, 727, 2085, 723, 718, 2085, + + 2109, 2109, 2109, 2104, 2109, 717, 716, 2109, 715, 712, + 2085, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, 2088, + 711, 710, 2088, 708, 704, 700, 699, 2088, 2088, 2088, + 2088, 2088, 2113, 2113, 2113, 696, 2113, 693, 692, 2113, + 2116, 2116, 2116, 691, 2116, 690, 689, 2116, 688, 2137, + 2137, 2137, 686, 2146, 2146, 2146, 2088, 2088, 2089, 2089, + 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2137, 2137, 2089, + 2146, 2147, 2147, 2147, 2089, 2089, 2089, 2089, 2089, 2148, + 2148, 2148, 2153, 2153, 2153, 2171, 2171, 2171, 2147, 2162, + 2162, 2162, 2166, 2166, 2166, 685, 2148, 684, 683, 2153, + + 682, 681, 2171, 2089, 2089, 680, 679, 2162, 678, 677, + 2166, 2172, 2172, 2172, 676, 2172, 675, 674, 2172, 2173, + 2173, 2173, 2174, 2174, 2174, 673, 2174, 672, 668, 2174, + 2175, 2175, 2175, 2176, 2176, 2176, 2173, 2176, 667, 665, + 2176, 664, 663, 2166, 2183, 2183, 2183, 2175, 2184, 2184, + 2184, 662, 2184, 661, 657, 2184, 2191, 2191, 2191, 655, + 654, 2183, 2197, 2197, 2197, 653, 2197, 652, 648, 2197, + 644, 2200, 2200, 2200, 2191, 2200, 643, 640, 2200, 2203, + 2203, 2203, 639, 2203, 638, 637, 2203, 2212, 2212, 2212, + 636, 2212, 635, 2191, 2212, 2307, 2307, 2307, 2316, 2316, + + 2316, 632, 2316, 631, 630, 2316, 2417, 2417, 2417, 2418, + 2418, 2418, 629, 2307, 626, 624, 2316, 621, 620, 619, + 618, 617, 614, 613, 2417, 612, 611, 2418, 2421, 2421, + 2421, 2421, 2421, 2421, 2421, 2421, 2421, 2422, 2422, 2422, + 2422, 2422, 2422, 2422, 2422, 2422, 2423, 2423, 2423, 2423, + 2423, 2423, 2423, 2423, 2423, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2425, 2425, 2425, 2425, 2425, 2425, - 2425, 2425, 2425, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, + 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2432, 2432, 2432, @@ -2837,10 +2889,10 @@ static yyconst flex_int16_t yy_chk[7868] = 2433, 2433, 2433, 2433, 2433, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2436, 2436, 2436, 2436, 2436, 2436, 2436, - 2436, 2436, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2440, + 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2443, 2443, 2443, 2443, @@ -2848,10 +2900,10 @@ static yyconst flex_int16_t yy_chk[7868] = 2444, 2444, 2444, 2444, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2447, 2447, 2447, 2447, 2447, 2447, 2447, 2447, - 2447, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2451, 2451, + 2451, 2451, 2451, 2451, 2451, 2451, 2451, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2452, 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2453, 2454, 2454, 2454, 2454, 2454, @@ -2859,237 +2911,249 @@ static yyconst flex_int16_t yy_chk[7868] = 2455, 2455, 2455, 2456, 2456, 2456, 2456, 2456, 2456, 2456, 2456, 2456, 2457, 2457, 2457, 2457, 2457, 2457, 2457, 2457, 2457, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 2458, - 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2462, 2462, 2462, - 2462, 2462, 2462, 2462, 2462, 2462, 2463, 2463, 2463, 2463, - 2463, 2463, 2463, 2463, 2463, 2464, 2464, 2464, 681, 677, - 676, 2464, 2465, 2465, 2465, 673, 672, 671, 2465, 2466, - 2466, 2466, 670, 669, 667, 2466, 2467, 2467, 2467, 666, - 665, 664, 2467, 2468, 2468, 2468, 663, 662, 661, 2468, - 2469, 2469, 2469, 660, 659, 658, 2469, 2470, 2470, 2470, - 657, 656, 655, 2470, 2471, 2471, 2471, 654, 650, 649, - - 2471, 2472, 2472, 2472, 647, 646, 645, 2472, 2473, 2473, - 2473, 644, 643, 639, 2473, 2474, 2474, 2474, 637, 636, - 635, 2474, 2475, 2475, 2475, 634, 630, 626, 2475, 2476, - 2476, 2476, 625, 622, 621, 2476, 2477, 2477, 2477, 620, - 619, 618, 2477, 2478, 2478, 2478, 617, 614, 613, 2478, - 2479, 2479, 2479, 612, 611, 608, 2479, 2480, 2480, 2480, - 606, 603, 602, 2480, 2481, 2481, 2481, 601, 600, 599, - 2481, 2482, 2482, 2482, 2482, 2482, 2482, 2482, 596, 2482, - 2483, 2483, 2483, 595, 594, 593, 2483, 2484, 592, 589, - 588, 2484, 2485, 2485, 2485, 587, 586, 584, 2485, 2486, - - 581, 579, 576, 2486, 2487, 2487, 2487, 575, 574, 573, - 2487, 2488, 572, 570, 569, 2488, 2489, 2489, 2489, 568, - 565, 564, 2489, 2490, 563, 562, 561, 2490, 2491, 2491, - 2491, 560, 559, 558, 2491, 2492, 556, 554, 553, 2492, - 2493, 550, 549, 548, 2493, 2494, 2494, 2494, 545, 540, - 538, 2494, 2495, 537, 536, 535, 2495, 2496, 2496, 2496, - 534, 533, 531, 2496, 2497, 528, 527, 526, 2497, 2498, - 2498, 2498, 525, 521, 520, 2498, 2499, 519, 518, 517, - 2499, 2500, 2500, 2500, 516, 515, 513, 2500, 2501, 510, - 509, 507, 2501, 2502, 2502, 2502, 505, 499, 496, 2502, - - 2503, 493, 490, 489, 2503, 2504, 2504, 2504, 487, 486, - 485, 2504, 2505, 484, 483, 480, 2505, 2506, 2506, 2506, - 479, 478, 477, 2506, 2507, 476, 470, 469, 2507, 2508, - 2508, 2508, 467, 461, 460, 2508, 2509, 456, 449, 445, - 2509, 2510, 2510, 2510, 439, 435, 431, 2510, 2511, 427, - 426, 425, 2511, 2512, 2512, 2512, 424, 420, 416, 2512, - 2513, 413, 412, 411, 2513, 2514, 2514, 2514, 407, 401, - 400, 2514, 2515, 396, 392, 388, 2515, 2516, 2516, 2516, - 387, 383, 380, 2516, 2517, 379, 374, 370, 2517, 2518, - 2518, 2518, 2518, 2518, 2518, 2518, 2518, 2518, 2519, 362, - - 361, 360, 356, 2519, 2520, 2520, 2520, 350, 349, 345, - 2520, 2521, 2521, 2521, 2521, 338, 337, 2521, 2521, 2522, - 2522, 2522, 336, 335, 334, 2522, 2523, 2523, 2523, 2523, - 333, 329, 2523, 2523, 2524, 2524, 2524, 322, 320, 319, - 2524, 2525, 2525, 2525, 2525, 318, 316, 2525, 2525, 2526, - 2526, 2526, 312, 305, 304, 2526, 2527, 2527, 2527, 2527, - 303, 302, 2527, 2527, 2528, 2528, 2528, 301, 297, 293, - 2528, 2529, 2529, 2529, 2529, 287, 285, 2529, 2529, 2530, - 2530, 2530, 280, 279, 278, 2530, 2531, 2531, 2531, 2531, - 274, 268, 2531, 2531, 2532, 2532, 2532, 267, 266, 262, - - 2532, 2533, 2533, 2533, 2533, 253, 251, 2533, 2533, 2534, - 2534, 2534, 250, 246, 243, 2534, 2535, 2535, 2535, 2535, - 241, 240, 2535, 2535, 2536, 2536, 2536, 239, 235, 232, - 2536, 2537, 2537, 2537, 2537, 231, 223, 2537, 2537, 2538, - 2538, 2538, 219, 215, 214, 2538, 2539, 2539, 2539, 2539, - 213, 207, 2539, 2539, 2540, 2540, 2540, 2540, 206, 2540, - 204, 2540, 2541, 2541, 2541, 2541, 201, 189, 2541, 2541, - 2542, 2542, 2542, 2542, 0, 2542, 0, 2542, 2543, 2543, - 2543, 2543, 0, 0, 2543, 2543, 2544, 2544, 2544, 0, - 0, 0, 2544, 2545, 2545, 2545, 2545, 0, 0, 2545, - - 2545, 2546, 2546, 2546, 2546, 0, 2546, 0, 2546, 2547, - 2547, 2547, 2547, 0, 0, 2547, 2547, 2548, 2548, 2548, - 0, 0, 0, 2548, 2549, 2549, 2549, 2549, 0, 0, - 2549, 2549, 2550, 2550, 2550, 0, 0, 0, 2550, 2551, - 2551, 2551, 2551, 0, 0, 2551, 2551, 2552, 2552, 2552, - 2552, 0, 0, 2552, 2552, 2553, 2553, 2553, 0, 0, - 0, 2553, 2554, 2554, 2554, 2554, 0, 0, 2554, 2554, - 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2555, 2556, - 0, 2556, 0, 0, 2556, 2557, 2557, 2557, 0, 0, - 0, 2557, 2558, 2558, 2558, 2558, 0, 0, 2558, 2558, - - 2559, 2559, 2559, 2559, 0, 2559, 0, 2559, 2560, 2560, - 2560, 2560, 0, 0, 2560, 2560, 2561, 2561, 2561, 0, - 0, 0, 2561, 2562, 2562, 2562, 2562, 0, 0, 2562, - 2562, 2563, 2563, 2563, 0, 0, 0, 2563, 2564, 2564, - 2564, 2564, 0, 0, 2564, 2564, 2565, 2565, 2565, 0, - 0, 0, 2565, 2566, 2566, 2566, 2566, 0, 0, 2566, - 2566, 2567, 2567, 2567, 0, 0, 0, 2567, 2568, 2568, - 2568, 2568, 0, 0, 2568, 2568, 2569, 2569, 2569, 0, - 0, 0, 2569, 2570, 2570, 2570, 2570, 0, 0, 2570, - 2570, 2571, 2571, 2571, 0, 0, 0, 2571, 2572, 2572, - - 2572, 2572, 0, 0, 2572, 2572, 2573, 2573, 2573, 0, - 0, 0, 2573, 2574, 2574, 2574, 2574, 0, 0, 2574, - 2574, 2575, 2575, 2575, 0, 0, 0, 2575, 2576, 2576, - 2576, 2576, 0, 0, 2576, 2576, 2577, 2577, 2577, 0, - 0, 0, 2577, 2578, 2578, 2578, 2578, 0, 0, 2578, - 2578, 2579, 2579, 2579, 0, 0, 0, 2579, 2580, 2580, - 2580, 2580, 0, 0, 2580, 2580, 2581, 2581, 2581, 0, - 0, 0, 2581, 2582, 2582, 2582, 2582, 0, 0, 2582, - 2582, 2583, 2583, 2583, 0, 0, 0, 2583, 2584, 2584, - 2584, 2584, 0, 0, 2584, 2584, 2585, 2585, 2585, 0, - - 0, 0, 2585, 2586, 2586, 2586, 2586, 0, 0, 2586, - 2586, 2587, 2587, 2587, 0, 0, 0, 2587, 2588, 2588, - 2588, 2588, 0, 0, 2588, 2588, 2589, 2589, 2589, 2589, - 0, 0, 2589, 2589, 2590, 2590, 2590, 0, 0, 0, - 2590, 2591, 2591, 2591, 2591, 0, 0, 2591, 2591, 2592, - 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2592, 2593, 2593, - 2593, 2593, 2593, 2593, 2593, 2593, 2593, 2594, 2594, 2594, - 0, 0, 0, 2594, 2595, 2595, 2595, 2595, 0, 0, - 2595, 2595, 2596, 2596, 2596, 0, 0, 0, 2596, 2597, - 2597, 2597, 2597, 0, 0, 2597, 2597, 2598, 2598, 2598, - - 0, 0, 0, 2598, 2599, 2599, 2599, 2599, 0, 0, - 2599, 2599, 2600, 2600, 2600, 0, 0, 0, 2600, 2601, - 2601, 2601, 2601, 0, 0, 2601, 2601, 2602, 2602, 2602, - 0, 0, 0, 2602, 2603, 2603, 2603, 0, 0, 0, - 2603, 2604, 2604, 2604, 2604, 0, 0, 2604, 2604, 2605, - 2605, 2605, 0, 0, 0, 2605, 2606, 2606, 2606, 2606, - 0, 0, 2606, 2606, 2607, 2607, 2607, 0, 0, 0, - 2607, 2608, 2608, 2608, 2608, 0, 0, 2608, 2608, 2609, - 2609, 2609, 0, 0, 0, 2609, 2610, 2610, 2610, 2610, - 0, 0, 2610, 2610, 2611, 2611, 2611, 0, 0, 0, - - 2611, 2612, 2612, 2612, 2612, 0, 0, 2612, 2612, 2613, - 2613, 2613, 0, 0, 0, 2613, 2614, 2614, 2614, 2614, - 0, 0, 2614, 2614, 2615, 2615, 2615, 0, 0, 0, - 2615, 2616, 2616, 2616, 2616, 0, 0, 2616, 2616, 2617, - 2617, 2617, 0, 0, 0, 2617, 2618, 2618, 2618, 2618, - 0, 0, 2618, 2618, 2619, 2619, 2619, 0, 0, 0, - 2619, 2620, 2620, 2620, 2620, 0, 0, 2620, 2620, 2621, - 2621, 2621, 0, 0, 0, 2621, 2622, 2622, 2622, 2622, - 0, 0, 2622, 2622, 2623, 2623, 2623, 2623, 0, 2623, - 0, 2623, 2624, 2624, 2624, 2624, 0, 0, 2624, 2624, - - 2625, 2625, 2625, 2625, 0, 0, 2625, 2625, 2626, 2626, - 2626, 2626, 0, 2626, 0, 2626, 2627, 2627, 2627, 2627, - 0, 0, 2627, 2627, 2628, 2628, 2628, 2628, 2628, 2628, - 2628, 2628, 2628, 2629, 2629, 2629, 2629, 2629, 2629, 2629, - 2629, 2629, 2630, 2630, 2630, 0, 0, 0, 2630, 2631, - 2631, 2631, 2631, 0, 0, 2631, 2631, 2632, 2632, 2632, - 0, 0, 0, 2632, 2633, 2633, 2633, 2633, 0, 0, - 2633, 2633, 2634, 2634, 2634, 0, 0, 0, 2634, 2635, - 2635, 2635, 2635, 0, 0, 2635, 2635, 2636, 2636, 2636, - 0, 0, 0, 2636, 2637, 2637, 2637, 2637, 0, 0, - - 2637, 2637, 2638, 2638, 2638, 0, 0, 0, 2638, 2639, - 2639, 2639, 0, 0, 0, 2639, 2640, 2640, 2640, 2640, - 0, 0, 2640, 2640, 2641, 2641, 2641, 0, 0, 0, - 2641, 2642, 2642, 2642, 2642, 0, 0, 2642, 2642, 2643, - 2643, 2643, 0, 0, 0, 2643, 2644, 2644, 2644, 2644, - 0, 0, 2644, 2644, 2645, 2645, 2645, 0, 0, 0, - 2645, 2646, 2646, 2646, 2646, 0, 0, 2646, 2646, 2647, - 2647, 2647, 0, 0, 0, 2647, 2648, 2648, 2648, 2648, - 0, 0, 2648, 2648, 2649, 2649, 2649, 0, 0, 0, - 2649, 2650, 2650, 2650, 2650, 0, 0, 2650, 2650, 2651, - - 2651, 2651, 2651, 0, 2651, 0, 2651, 2652, 2652, 2652, - 2652, 0, 0, 2652, 2652, 2653, 2653, 2653, 0, 0, - 0, 2653, 2654, 2654, 2654, 2654, 0, 0, 2654, 2654, - 2655, 2655, 2655, 2655, 0, 2655, 0, 2655, 2656, 2656, - 2656, 2656, 0, 0, 2656, 2656, 2657, 2657, 2657, 0, - 0, 0, 2657, 2658, 2658, 2658, 2658, 0, 0, 2658, - 2658, 2659, 2659, 2659, 2659, 0, 0, 2659, 2659, 2660, - 2660, 2660, 2660, 0, 0, 2660, 2660, 2661, 2661, 2661, - 2661, 0, 0, 2661, 2661, 2662, 2662, 2662, 2662, 2662, - 2662, 2662, 2662, 2662, 2663, 2663, 2663, 2663, 2663, 2663, - - 2663, 2663, 2663, 2664, 2664, 2664, 2664, 0, 2664, 0, - 2664, 2665, 2665, 2665, 2665, 0, 0, 2665, 2665, 2666, - 2666, 2666, 0, 0, 0, 2666, 2667, 2667, 2667, 2667, - 0, 0, 2667, 2667, 2668, 2668, 2668, 0, 0, 0, - 2668, 2669, 2669, 2669, 2669, 0, 0, 2669, 2669, 2670, - 2670, 2670, 2670, 0, 2670, 0, 2670, 2671, 2671, 2671, - 2671, 0, 0, 2671, 2671, 2672, 2672, 2672, 0, 0, - 0, 2672, 2673, 2673, 2673, 0, 0, 0, 2673, 2674, - 2674, 2674, 0, 0, 0, 2674, 2675, 2675, 2675, 2675, - 0, 0, 2675, 2675, 2676, 2676, 2676, 0, 0, 0, - - 2676, 2677, 2677, 2677, 0, 0, 0, 2677, 2678, 2678, - 2678, 2678, 0, 0, 2678, 2678, 2679, 2679, 2679, 0, - 0, 0, 2679, 2680, 2680, 2680, 0, 0, 0, 2680, - 2681, 2681, 2681, 2681, 0, 0, 2681, 2681, 2682, 2682, - 2682, 0, 0, 0, 2682, 2683, 2683, 2683, 2683, 0, - 0, 2683, 2683, 2684, 2684, 2684, 0, 0, 0, 2684, - 2685, 2685, 2685, 2685, 0, 0, 2685, 2685, 2686, 2686, - 2686, 2686, 0, 0, 2686, 2686, 2687, 2687, 2687, 0, - 0, 0, 2687, 2688, 2688, 2688, 2688, 0, 0, 2688, - 2688, 2689, 2689, 2689, 2689, 0, 0, 2689, 2689, 2690, - - 2690, 2690, 2690, 0, 0, 2690, 2690, 2691, 2691, 2691, - 2691, 2691, 2691, 2691, 2691, 2691, 2692, 2692, 2692, 2692, - 2692, 2692, 2692, 2692, 2692, 2693, 2693, 2693, 2693, 0, - 0, 2693, 2693, 2694, 2694, 2694, 0, 0, 0, 2694, - 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2695, 2696, - 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2696, 2697, 2697, - 2697, 2697, 2697, 2697, 2697, 2697, 2697, 2698, 2698, 2698, - 2698, 2698, 2698, 2698, 2698, 2698, 2699, 2699, 2699, 2699, - 2699, 2699, 2699, 2699, 2699, 2700, 2700, 2700, 2700, 2700, - 2700, 2700, 2700, 2700, 2423, 2423, 2423, 2423, 2423, 2423, - - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, - 2423, 2423, 2423, 2423, 2423, 2423, 2423 + + 2462, 2462, 2462, 2462, 2462, 2462, 2463, 2463, 2463, 610, + 607, 606, 2463, 2464, 2464, 2464, 605, 604, 602, 2464, + 2465, 2465, 2465, 599, 597, 594, 2465, 2466, 2466, 2466, + 593, 592, 591, 2466, 2467, 2467, 2467, 589, 588, 587, + 2467, 2468, 2468, 2468, 584, 583, 582, 2468, 2469, 2469, + 2469, 581, 580, 579, 2469, 2470, 2470, 2470, 578, 577, + 576, 2470, 2471, 2471, 2471, 574, 572, 571, 2471, 2472, + 2472, 2472, 568, 567, 566, 2472, 2473, 2473, 2473, 563, + 558, 556, 2473, 2474, 2474, 2474, 555, 554, 553, 2474, + 2475, 2475, 2475, 552, 551, 547, 2475, 2476, 2476, 2476, + + 546, 545, 544, 2476, 2477, 2477, 2477, 540, 539, 538, + 2477, 2478, 2478, 2478, 537, 536, 535, 2478, 2479, 2479, + 2479, 534, 532, 529, 2479, 2480, 2480, 2480, 528, 526, + 524, 2480, 2481, 2481, 2481, 521, 520, 514, 2481, 2482, + 2482, 2482, 2482, 2482, 2482, 2482, 512, 2482, 2483, 2483, + 2483, 510, 507, 504, 2483, 2484, 503, 502, 500, 2484, + 2485, 2485, 2485, 499, 498, 497, 2485, 2486, 496, 493, + 492, 2486, 2487, 2487, 2487, 491, 490, 489, 2487, 2488, + 483, 482, 480, 2488, 2489, 2489, 2489, 474, 473, 469, + 2489, 2490, 465, 462, 458, 2490, 2491, 2491, 2491, 452, + + 448, 440, 2491, 2492, 439, 438, 437, 2492, 2493, 2493, + 2493, 433, 429, 426, 2493, 2494, 425, 424, 420, 2494, + 2495, 2495, 2495, 414, 413, 409, 2495, 2496, 405, 401, + 400, 2496, 2497, 2497, 2497, 396, 393, 392, 2497, 2498, + 387, 383, 379, 2498, 2499, 2499, 2499, 375, 374, 373, + 2499, 2500, 369, 363, 362, 2500, 2501, 2501, 2501, 358, + 352, 351, 2501, 2502, 350, 349, 348, 2502, 2503, 2503, + 2503, 347, 346, 342, 2503, 2504, 333, 332, 331, 2504, + 2505, 2505, 2505, 329, 325, 321, 2505, 2506, 318, 317, + 316, 2506, 2507, 2507, 2507, 315, 314, 310, 2507, 2508, + + 306, 300, 298, 2508, 2509, 2509, 2509, 293, 292, 288, + 2509, 2510, 282, 281, 280, 2510, 2511, 2511, 2511, 276, + 273, 272, 2511, 2512, 267, 265, 264, 2512, 2513, 2513, + 2513, 260, 257, 255, 2513, 2514, 254, 253, 249, 2514, + 2515, 2515, 2515, 243, 239, 235, 2515, 2516, 227, 223, + 219, 2516, 2517, 2517, 2517, 218, 217, 211, 2517, 2518, + 210, 208, 205, 2518, 2519, 2519, 2519, 193, 0, 0, + 2519, 2520, 0, 0, 0, 2520, 2521, 2521, 2521, 2521, + 2521, 2521, 2521, 2521, 2521, 2522, 0, 0, 0, 0, + 2522, 2523, 2523, 2523, 0, 0, 0, 2523, 2524, 2524, + + 2524, 2524, 0, 0, 2524, 2524, 2525, 2525, 2525, 0, + 0, 0, 2525, 2526, 2526, 2526, 2526, 0, 0, 2526, + 2526, 2527, 2527, 2527, 0, 0, 0, 2527, 2528, 2528, + 2528, 2528, 0, 0, 2528, 2528, 2529, 2529, 2529, 0, + 0, 0, 2529, 2530, 2530, 2530, 2530, 0, 0, 2530, + 2530, 2531, 2531, 2531, 0, 0, 0, 2531, 2532, 2532, + 2532, 2532, 0, 0, 2532, 2532, 2533, 2533, 2533, 0, + 0, 0, 2533, 2534, 2534, 2534, 2534, 0, 0, 2534, + 2534, 2535, 2535, 2535, 0, 0, 0, 2535, 2536, 2536, + 2536, 2536, 0, 0, 2536, 2536, 2537, 2537, 2537, 0, + + 0, 0, 2537, 2538, 2538, 2538, 2538, 0, 0, 2538, + 2538, 2539, 2539, 2539, 0, 0, 0, 2539, 2540, 2540, + 2540, 2540, 0, 0, 2540, 2540, 2541, 2541, 2541, 0, + 0, 0, 2541, 2542, 2542, 2542, 2542, 0, 0, 2542, + 2542, 2543, 2543, 2543, 0, 0, 0, 2543, 2544, 2544, + 2544, 2544, 0, 0, 2544, 2544, 2545, 2545, 2545, 2545, + 0, 2545, 0, 2545, 2546, 2546, 2546, 2546, 0, 0, + 2546, 2546, 2547, 2547, 2547, 2547, 0, 2547, 0, 2547, + 2548, 2548, 2548, 2548, 0, 0, 2548, 2548, 2549, 2549, + 2549, 0, 0, 0, 2549, 2550, 2550, 2550, 2550, 0, + + 0, 2550, 2550, 2551, 2551, 2551, 2551, 0, 2551, 0, + 2551, 2552, 2552, 2552, 2552, 0, 0, 2552, 2552, 2553, + 2553, 2553, 0, 0, 0, 2553, 2554, 2554, 2554, 2554, + 0, 0, 2554, 2554, 2555, 2555, 2555, 0, 0, 0, + 2555, 2556, 2556, 2556, 2556, 0, 0, 2556, 2556, 2557, + 2557, 2557, 2557, 0, 0, 2557, 2557, 2558, 2558, 2558, + 0, 0, 0, 2558, 2559, 2559, 2559, 2559, 0, 0, + 2559, 2559, 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560, + 2560, 2561, 0, 2561, 0, 0, 2561, 2562, 2562, 2562, + 0, 0, 0, 2562, 2563, 2563, 2563, 2563, 0, 0, + + 2563, 2563, 2564, 2564, 2564, 2564, 0, 2564, 0, 2564, + 2565, 2565, 2565, 2565, 0, 0, 2565, 2565, 2566, 2566, + 2566, 2566, 0, 2566, 0, 2566, 2567, 2567, 2567, 2567, + 0, 0, 2567, 2567, 2568, 2568, 2568, 0, 0, 0, + 2568, 2569, 2569, 2569, 2569, 0, 0, 2569, 2569, 2570, + 2570, 2570, 0, 0, 0, 2570, 2571, 2571, 2571, 2571, + 0, 0, 2571, 2571, 2572, 2572, 2572, 0, 0, 0, + 2572, 2573, 2573, 2573, 2573, 0, 0, 2573, 2573, 2574, + 2574, 2574, 0, 0, 0, 2574, 2575, 2575, 2575, 2575, + 0, 0, 2575, 2575, 2576, 2576, 2576, 0, 0, 0, + + 2576, 2577, 2577, 2577, 2577, 0, 0, 2577, 2577, 2578, + 2578, 2578, 0, 0, 0, 2578, 2579, 2579, 2579, 2579, + 0, 0, 2579, 2579, 2580, 2580, 2580, 0, 0, 0, + 2580, 2581, 2581, 2581, 2581, 0, 0, 2581, 2581, 2582, + 2582, 2582, 0, 0, 0, 2582, 2583, 2583, 2583, 2583, + 0, 0, 2583, 2583, 2584, 2584, 2584, 0, 0, 0, + 2584, 2585, 2585, 2585, 2585, 0, 0, 2585, 2585, 2586, + 2586, 2586, 0, 0, 0, 2586, 2587, 2587, 2587, 2587, + 0, 0, 2587, 2587, 2588, 2588, 2588, 0, 0, 0, + 2588, 2589, 2589, 2589, 2589, 0, 0, 2589, 2589, 2590, + + 2590, 2590, 0, 0, 0, 2590, 2591, 2591, 2591, 2591, + 0, 0, 2591, 2591, 2592, 2592, 2592, 0, 0, 0, + 2592, 2593, 2593, 2593, 2593, 0, 0, 2593, 2593, 2594, + 2594, 2594, 0, 0, 0, 2594, 2595, 2595, 2595, 2595, + 0, 0, 2595, 2595, 2596, 2596, 2596, 2596, 0, 0, + 2596, 2596, 2597, 2597, 2597, 0, 0, 0, 2597, 2598, + 2598, 2598, 2598, 0, 0, 2598, 2598, 2599, 2599, 2599, + 2599, 2599, 2599, 2599, 2599, 2599, 2600, 2600, 2600, 2600, + 2600, 2600, 2600, 2600, 2600, 2601, 2601, 2601, 0, 0, + 0, 2601, 2602, 2602, 2602, 2602, 0, 0, 2602, 2602, + + 2603, 2603, 2603, 2603, 0, 0, 2603, 2603, 2604, 2604, + 2604, 0, 0, 0, 2604, 2605, 2605, 2605, 2605, 0, + 0, 2605, 2605, 2606, 2606, 2606, 0, 0, 0, 2606, + 2607, 2607, 2607, 2607, 0, 0, 2607, 2607, 2608, 2608, + 2608, 0, 0, 0, 2608, 2609, 2609, 2609, 2609, 0, + 0, 2609, 2609, 2610, 2610, 2610, 0, 0, 0, 2610, + 2611, 2611, 2611, 0, 0, 0, 2611, 2612, 2612, 2612, + 2612, 0, 0, 2612, 2612, 2613, 2613, 2613, 0, 0, + 0, 2613, 2614, 2614, 2614, 2614, 0, 0, 2614, 2614, + 2615, 2615, 2615, 0, 0, 0, 2615, 2616, 2616, 2616, + + 2616, 0, 0, 2616, 2616, 2617, 2617, 2617, 0, 0, + 0, 2617, 2618, 2618, 2618, 2618, 0, 0, 2618, 2618, + 2619, 2619, 2619, 0, 0, 0, 2619, 2620, 2620, 2620, + 2620, 0, 0, 2620, 2620, 2621, 2621, 2621, 0, 0, + 0, 2621, 2622, 2622, 2622, 2622, 0, 0, 2622, 2622, + 2623, 2623, 2623, 0, 0, 0, 2623, 2624, 2624, 2624, + 2624, 0, 0, 2624, 2624, 2625, 2625, 2625, 0, 0, + 0, 2625, 2626, 2626, 2626, 2626, 0, 0, 2626, 2626, + 2627, 2627, 2627, 0, 0, 0, 2627, 2628, 2628, 2628, + 2628, 0, 0, 2628, 2628, 2629, 2629, 2629, 0, 0, + + 0, 2629, 2630, 2630, 2630, 2630, 0, 0, 2630, 2630, + 2631, 2631, 2631, 2631, 0, 2631, 0, 2631, 2632, 2632, + 2632, 2632, 0, 0, 2632, 2632, 2633, 2633, 2633, 2633, + 0, 0, 2633, 2633, 2634, 2634, 2634, 2634, 0, 2634, + 0, 2634, 2635, 2635, 2635, 2635, 0, 0, 2635, 2635, + 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2636, 2637, + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2638, 2638, + 2638, 0, 0, 0, 2638, 2639, 2639, 2639, 2639, 0, + 0, 2639, 2639, 2640, 2640, 2640, 2640, 0, 0, 2640, + 2640, 2641, 2641, 2641, 0, 0, 0, 2641, 2642, 2642, + + 2642, 2642, 0, 0, 2642, 2642, 2643, 2643, 2643, 0, + 0, 0, 2643, 2644, 2644, 2644, 2644, 0, 0, 2644, + 2644, 2645, 2645, 2645, 0, 0, 0, 2645, 2646, 2646, + 2646, 2646, 0, 0, 2646, 2646, 2647, 2647, 2647, 0, + 0, 0, 2647, 2648, 2648, 2648, 0, 0, 0, 2648, + 2649, 2649, 2649, 2649, 0, 0, 2649, 2649, 2650, 2650, + 2650, 0, 0, 0, 2650, 2651, 2651, 2651, 2651, 0, + 0, 2651, 2651, 2652, 2652, 2652, 0, 0, 0, 2652, + 2653, 2653, 2653, 2653, 0, 0, 2653, 2653, 2654, 2654, + 2654, 0, 0, 0, 2654, 2655, 2655, 2655, 2655, 0, + + 0, 2655, 2655, 2656, 2656, 2656, 0, 0, 0, 2656, + 2657, 2657, 2657, 2657, 0, 0, 2657, 2657, 2658, 2658, + 2658, 0, 0, 0, 2658, 2659, 2659, 2659, 2659, 0, + 0, 2659, 2659, 2660, 2660, 2660, 2660, 0, 2660, 0, + 2660, 2661, 2661, 2661, 2661, 0, 0, 2661, 2661, 2662, + 2662, 2662, 0, 0, 0, 2662, 2663, 2663, 2663, 2663, + 0, 0, 2663, 2663, 2664, 2664, 2664, 2664, 0, 2664, + 0, 2664, 2665, 2665, 2665, 2665, 0, 0, 2665, 2665, + 2666, 2666, 2666, 0, 0, 0, 2666, 2667, 2667, 2667, + 2667, 0, 0, 2667, 2667, 2668, 2668, 2668, 2668, 0, + + 0, 2668, 2668, 2669, 2669, 2669, 2669, 0, 0, 2669, + 2669, 2670, 2670, 2670, 2670, 0, 0, 2670, 2670, 2671, + 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2672, 2672, + 2672, 2672, 2672, 2672, 2672, 2672, 2672, 2673, 2673, 2673, + 2673, 0, 2673, 0, 2673, 2674, 2674, 2674, 2674, 0, + 0, 2674, 2674, 2675, 2675, 2675, 2675, 0, 0, 2675, + 2675, 2676, 2676, 2676, 0, 0, 0, 2676, 2677, 2677, + 2677, 2677, 0, 0, 2677, 2677, 2678, 2678, 2678, 0, + 0, 0, 2678, 2679, 2679, 2679, 2679, 0, 0, 2679, + 2679, 2680, 2680, 2680, 2680, 0, 2680, 0, 2680, 2681, + + 2681, 2681, 2681, 0, 0, 2681, 2681, 2682, 2682, 2682, + 2682, 0, 2682, 0, 2682, 2683, 2683, 2683, 0, 0, + 0, 2683, 2684, 2684, 2684, 0, 0, 0, 2684, 2685, + 2685, 2685, 2685, 0, 0, 2685, 2685, 2686, 2686, 2686, + 0, 0, 0, 2686, 2687, 2687, 2687, 0, 0, 0, + 2687, 2688, 2688, 2688, 2688, 0, 0, 2688, 2688, 2689, + 2689, 2689, 0, 0, 0, 2689, 2690, 2690, 2690, 0, + 0, 0, 2690, 2691, 2691, 2691, 2691, 0, 0, 2691, + 2691, 2692, 2692, 2692, 0, 0, 0, 2692, 2693, 2693, + 2693, 2693, 0, 0, 2693, 2693, 2694, 2694, 2694, 0, + + 0, 0, 2694, 2695, 2695, 2695, 2695, 0, 0, 2695, + 2695, 2696, 2696, 2696, 2696, 0, 0, 2696, 2696, 2697, + 2697, 2697, 0, 0, 0, 2697, 2698, 2698, 2698, 2698, + 0, 0, 2698, 2698, 2699, 2699, 2699, 2699, 0, 0, + 2699, 2699, 2700, 2700, 2700, 2700, 0, 0, 2700, 2700, + 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 2702, + 2702, 2702, 2702, 2702, 2702, 2702, 2702, 2702, 2703, 2703, + 2703, 2703, 0, 0, 2703, 2703, 2704, 2704, 2704, 2704, + 0, 0, 2704, 2704, 2705, 2705, 2705, 0, 0, 0, + 2705, 2706, 2706, 2706, 0, 0, 0, 2706, 2707, 2707, + + 2707, 2707, 0, 0, 2707, 2707, 2708, 2708, 2708, 2708, + 2708, 2708, 2708, 2708, 2708, 2709, 2709, 2709, 2709, 2709, + 2709, 2709, 2709, 2709, 2710, 2710, 2710, 2710, 2710, 2710, + 2710, 2710, 2710, 2711, 2711, 2711, 2711, 2711, 2711, 2711, + 2711, 2711, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, + 2712, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, 2713, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, 2420, + 2420, 2420, 2420 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[399] = +static yyconst flex_int32_t yy_rule_can_match_eol[406] = { 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, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 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, 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, 0, 0, 0, 0, 1, 1, 0, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; @@ -3106,7 +3170,6 @@ int surf_parse__flex_debug = 0; #define YY_RESTORE_YY_MORE_OFFSET char *surf_parse_text; /* Validating XML processor for src/surf/simgrid.dtd. - * Generated 2011/02/14 15:04:44. * * This program was generated with the FleXML XML processor generator. * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. @@ -3311,6 +3374,8 @@ AT_surfxml_process_function AX_surfxml_process_function; #define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function) AT_surfxml_peer_id AX_surfxml_peer_id; #define A_surfxml_peer_id (surfxml_bufferstack + AX_surfxml_peer_id) +AT_surfxml_cluster_router_id AX_surfxml_cluster_router_id; +#define A_surfxml_cluster_router_id (surfxml_bufferstack + AX_surfxml_cluster_router_id) AT_surfxml_cluster_sharing_policy AX_surfxml_cluster_sharing_policy; #define A_surfxml_cluster_sharing_policy AX_surfxml_cluster_sharing_policy AT_surfxml_bypassRoute_dst AX_surfxml_bypassRoute_dst; @@ -3329,8 +3394,6 @@ AT_surfxml_host_coordinates AX_surfxml_host_coordinates; #define A_surfxml_host_coordinates (surfxml_bufferstack + AX_surfxml_host_coordinates) AT_surfxml_trace_id AX_surfxml_trace_id; #define A_surfxml_trace_id (surfxml_bufferstack + AX_surfxml_trace_id) -AT_surfxml_peer_sharing_policy AX_surfxml_peer_sharing_policy; -#define A_surfxml_peer_sharing_policy AX_surfxml_peer_sharing_policy AT_surfxml_peer_power AX_surfxml_peer_power; #define A_surfxml_peer_power (surfxml_bufferstack + AX_surfxml_peer_power) AT_surfxml_cluster_radical AX_surfxml_cluster_radical; @@ -3341,12 +3404,12 @@ AT_surfxml_bypassRoute_gw_src AX_surfxml_bypassRoute_gw_src; #define A_surfxml_bypassRoute_gw_src (surfxml_bufferstack + AX_surfxml_bypassRoute_gw_src) AT_surfxml_cluster_core AX_surfxml_cluster_core; #define A_surfxml_cluster_core (surfxml_bufferstack + AX_surfxml_cluster_core) +AT_surfxml_include_file AX_surfxml_include_file; +#define A_surfxml_include_file (surfxml_bufferstack + AX_surfxml_include_file) AT_surfxml_random_std_deviation AX_surfxml_random_std_deviation; #define A_surfxml_random_std_deviation (surfxml_bufferstack + AX_surfxml_random_std_deviation) AT_surfxml_host_state_file AX_surfxml_host_state_file; #define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file) -AT_surfxml_AS_coordinates AX_surfxml_AS_coordinates; -#define A_surfxml_AS_coordinates (surfxml_bufferstack + AX_surfxml_AS_coordinates) AT_surfxml_route_dst AX_surfxml_route_dst; #define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst) AT_surfxml_cluster_bw AX_surfxml_cluster_bw; @@ -3512,79 +3575,81 @@ const char* *surfxml_statenames=NULL; #define S_surfxml_platform_7 18 #define S_surfxml_platform_8 19 #define E_surfxml_platform 20 -#define AL_surfxml_trace 21 -#define IN_trace 22 -#define AL_surfxml_random 23 -#define S_surfxml_random 24 -#define S_surfxml_random_1 25 -#define S_surfxml_random_2 26 -#define E_surfxml_random 27 -#define AL_surfxml_trace_connect 28 -#define E_surfxml_trace_connect 29 -#define AL_surfxml_AS 30 -#define S_surfxml_AS 31 -#define S_surfxml_AS_1 32 -#define S_surfxml_AS_2 33 -#define S_surfxml_AS_3 34 -#define S_surfxml_AS_4 35 -#define S_surfxml_AS_5 36 -#define S_surfxml_AS_6 37 -#define S_surfxml_AS_7 38 -#define S_surfxml_AS_8 39 -#define S_surfxml_AS_9 40 -#define S_surfxml_AS_10 41 -#define S_surfxml_AS_11 42 -#define S_surfxml_AS_12 43 -#define S_surfxml_AS_13 44 -#define E_surfxml_AS 45 -#define AL_surfxml_host 46 -#define S_surfxml_host 47 -#define S_surfxml_host_1 48 -#define S_surfxml_host_2 49 -#define E_surfxml_host 50 -#define AL_surfxml_cluster 51 -#define E_surfxml_cluster 52 -#define AL_surfxml_peer 53 -#define E_surfxml_peer 54 -#define AL_surfxml_router 55 -#define E_surfxml_router 56 -#define AL_surfxml_link 57 -#define S_surfxml_link 58 -#define S_surfxml_link_1 59 -#define S_surfxml_link_2 60 -#define E_surfxml_link 61 -#define AL_surfxml_route 62 -#define S_surfxml_route 63 -#define S_surfxml_route_1 64 -#define S_surfxml_route_2 65 -#define E_surfxml_route 66 -#define AL_surfxml_ASroute 67 -#define S_surfxml_ASroute 68 -#define S_surfxml_ASroute_1 69 -#define S_surfxml_ASroute_2 70 -#define E_surfxml_ASroute 71 -#define AL_surfxml_link_ctn 72 -#define E_surfxml_link_ctn 73 -#define AL_surfxml_bypassRoute 74 -#define S_surfxml_bypassRoute 75 -#define S_surfxml_bypassRoute_1 76 -#define S_surfxml_bypassRoute_2 77 -#define E_surfxml_bypassRoute 78 -#define AL_surfxml_process 79 -#define S_surfxml_process 80 -#define S_surfxml_process_1 81 -#define S_surfxml_process_2 82 -#define E_surfxml_process 83 -#define AL_surfxml_argument 84 -#define E_surfxml_argument 85 -#define AL_surfxml_config 86 -#define S_surfxml_config 87 -#define S_surfxml_config_1 88 -#define S_surfxml_config_2 89 -#define E_surfxml_config 90 -#define AL_surfxml_prop 91 -#define E_surfxml_prop 92 -#define IMPOSSIBLE 93 +#define AL_surfxml_include 21 +#define E_surfxml_include 22 +#define AL_surfxml_trace 23 +#define IN_trace 24 +#define AL_surfxml_random 25 +#define S_surfxml_random 26 +#define S_surfxml_random_1 27 +#define S_surfxml_random_2 28 +#define E_surfxml_random 29 +#define AL_surfxml_trace_connect 30 +#define E_surfxml_trace_connect 31 +#define AL_surfxml_AS 32 +#define S_surfxml_AS 33 +#define S_surfxml_AS_1 34 +#define S_surfxml_AS_2 35 +#define S_surfxml_AS_3 36 +#define S_surfxml_AS_4 37 +#define S_surfxml_AS_5 38 +#define S_surfxml_AS_6 39 +#define S_surfxml_AS_7 40 +#define S_surfxml_AS_8 41 +#define S_surfxml_AS_9 42 +#define S_surfxml_AS_10 43 +#define S_surfxml_AS_11 44 +#define S_surfxml_AS_12 45 +#define S_surfxml_AS_13 46 +#define E_surfxml_AS 47 +#define AL_surfxml_host 48 +#define S_surfxml_host 49 +#define S_surfxml_host_1 50 +#define S_surfxml_host_2 51 +#define E_surfxml_host 52 +#define AL_surfxml_cluster 53 +#define E_surfxml_cluster 54 +#define AL_surfxml_peer 55 +#define E_surfxml_peer 56 +#define AL_surfxml_router 57 +#define E_surfxml_router 58 +#define AL_surfxml_link 59 +#define S_surfxml_link 60 +#define S_surfxml_link_1 61 +#define S_surfxml_link_2 62 +#define E_surfxml_link 63 +#define AL_surfxml_route 64 +#define S_surfxml_route 65 +#define S_surfxml_route_1 66 +#define S_surfxml_route_2 67 +#define E_surfxml_route 68 +#define AL_surfxml_ASroute 69 +#define S_surfxml_ASroute 70 +#define S_surfxml_ASroute_1 71 +#define S_surfxml_ASroute_2 72 +#define E_surfxml_ASroute 73 +#define AL_surfxml_link_ctn 74 +#define E_surfxml_link_ctn 75 +#define AL_surfxml_bypassRoute 76 +#define S_surfxml_bypassRoute 77 +#define S_surfxml_bypassRoute_1 78 +#define S_surfxml_bypassRoute_2 79 +#define E_surfxml_bypassRoute 80 +#define AL_surfxml_process 81 +#define S_surfxml_process 82 +#define S_surfxml_process_1 83 +#define S_surfxml_process_2 84 +#define E_surfxml_process 85 +#define AL_surfxml_argument 86 +#define E_surfxml_argument 87 +#define AL_surfxml_config 88 +#define S_surfxml_config 89 +#define S_surfxml_config_1 90 +#define S_surfxml_config_2 91 +#define E_surfxml_config 92 +#define AL_surfxml_prop 93 +#define E_surfxml_prop 94 +#define IMPOSSIBLE 95 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way @@ -3831,6 +3896,8 @@ YY_DECL surfxml_statenames[S_surfxml_platform_7] = "platform"; surfxml_statenames[S_surfxml_platform_8] = "platform"; surfxml_statenames[E_surfxml_platform] = "platform"; + surfxml_statenames[AL_surfxml_include] = NULL; + surfxml_statenames[E_surfxml_include] = "include"; surfxml_statenames[AL_surfxml_trace] = NULL; surfxml_statenames[IN_trace] = "trace"; surfxml_statenames[AL_surfxml_random] = NULL; @@ -3958,13 +4025,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 2424 ) + if ( yy_current_state >= 2421 ) 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] != 7795 ); + while ( yy_base[yy_current_state] != 8061 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -4161,11 +4228,93 @@ FAIL("Premature EOF: `' expected."); case 27: /* rule 27 can match eol */ YY_RULE_SETUP -FAIL("Starting tag is not allowed here."); +FAIL("Starting tag is not allowed here."); YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP +{ + AX_surfxml_include_file = 0; + ENTER(AL_surfxml_include); pushbuffer(0); + } + YY_BREAK + +case 29: +/* rule 29 can match eol */ +YY_RULE_SETUP +ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file); + YY_BREAK +case 30: +/* rule 30 can match eol */ +YY_RULE_SETUP +ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file); + YY_BREAK +case 31: +YY_RULE_SETUP +{ + if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element."); + LEAVE; STag_surfxml_include();surfxml_pcdata_ix = 0; ENTER(E_surfxml_include); + } + YY_BREAK +case 32: +YY_RULE_SETUP +{ + if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element."); + LEAVE; STag_surfxml_include(); surfxml_pcdata_ix = 0; ETag_surfxml_include(); popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS_2: case S_surfxml_AS_3: case S_surfxml_AS: SET(S_surfxml_AS_3); break; + case S_surfxml_platform_5: SET(S_surfxml_platform_6); break; + case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_6: case S_surfxml_platform_8: case S_surfxml_platform_7: case S_surfxml_platform_3: case S_surfxml_platform_4: SET(S_surfxml_platform_8); break; + } + } + YY_BREAK +case 33: +YY_RULE_SETUP +FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]); + YY_BREAK +case 34: +YY_RULE_SETUP +FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text); + YY_BREAK +case YY_STATE_EOF(AL_surfxml_include): +FAIL("EOF in attribute list of `include' element."); + YY_BREAK + +case 35: +/* rule 35 can match eol */ +YY_RULE_SETUP +{ + LEAVE; + ETag_surfxml_include(); + popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS_2: case S_surfxml_AS_3: case S_surfxml_AS: SET(S_surfxml_AS_3); break; + case S_surfxml_platform_5: SET(S_surfxml_platform_6); break; + case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_6: case S_surfxml_platform_8: case S_surfxml_platform_7: case S_surfxml_platform_3: case S_surfxml_platform_4: SET(S_surfxml_platform_8); break; + } + } + YY_BREAK +case 36: +/* rule 36 can match eol */ +YY_RULE_SETUP +FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); + YY_BREAK +case 37: +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_include): +FAIL("Premature EOF: `' expected."); + YY_BREAK + +case 38: +/* rule 38 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 39: +/* rule 39 can match eol */ +YY_RULE_SETUP { AX_surfxml_trace_id = 0; AX_surfxml_trace_file = 0; @@ -4174,37 +4323,37 @@ YY_RULE_SETUP } YY_BREAK -case 29: -/* rule 29 can match eol */ +case 40: +/* rule 40 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id); YY_BREAK -case 30: -/* rule 30 can match eol */ +case 41: +/* rule 41 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id); YY_BREAK -case 31: -/* rule 31 can match eol */ +case 42: +/* rule 42 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file); YY_BREAK -case 32: -/* rule 32 can match eol */ +case 43: +/* rule 43 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file); YY_BREAK -case 33: -/* rule 33 can match eol */ +case 44: +/* rule 44 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity); YY_BREAK -case 34: -/* rule 34 can match eol */ +case 45: +/* rule 45 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity); YY_BREAK -case 35: +case 46: YY_RULE_SETUP { if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element."); @@ -4212,7 +4361,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace); } YY_BREAK -case 36: +case 47: YY_RULE_SETUP { if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element."); @@ -4228,11 +4377,11 @@ YY_RULE_SETUP } } YY_BREAK -case 37: +case 48: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of trace element.", surf_parse_text[0]); YY_BREAK -case 38: +case 49: YY_RULE_SETUP FAIL("Bad attribute `%s' in `trace' element start tag.",surf_parse_text); YY_BREAK @@ -4240,8 +4389,8 @@ case YY_STATE_EOF(AL_surfxml_trace): FAIL("EOF in attribute list of `trace' element."); YY_BREAK -case 39: -/* rule 39 can match eol */ +case 50: +/* rule 50 can match eol */ YY_RULE_SETUP { LEAVE; @@ -4259,8 +4408,8 @@ YY_RULE_SETUP } } YY_BREAK -case 40: -/* rule 40 can match eol */ +case 51: +/* rule 51 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK @@ -4268,13 +4417,13 @@ case YY_STATE_EOF(IN_trace): FAIL("Premature EOF: `' expected."); YY_BREAK -case 41: -/* rule 41 can match eol */ +case 52: +/* rule 52 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 42: -/* rule 42 can match eol */ +case 53: +/* rule 53 can match eol */ YY_RULE_SETUP { AX_surfxml_random_id = 0; @@ -4289,105 +4438,105 @@ YY_RULE_SETUP } YY_BREAK -case 43: -/* rule 43 can match eol */ +case 54: +/* rule 54 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id); YY_BREAK -case 44: -/* rule 44 can match eol */ +case 55: +/* rule 55 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id); YY_BREAK -case 45: -/* rule 45 can match eol */ +case 56: +/* rule 56 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min); YY_BREAK -case 46: -/* rule 46 can match eol */ +case 57: +/* rule 57 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min); YY_BREAK -case 47: -/* rule 47 can match eol */ +case 58: +/* rule 58 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max); YY_BREAK -case 48: -/* rule 48 can match eol */ +case 59: +/* rule 59 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max); YY_BREAK -case 49: -/* rule 49 can match eol */ +case 60: +/* rule 60 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean); YY_BREAK -case 50: -/* rule 50 can match eol */ +case 61: +/* rule 61 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean); YY_BREAK -case 51: -/* rule 51 can match eol */ +case 62: +/* rule 62 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std_deviation); YY_BREAK -case 52: -/* rule 52 can match eol */ +case 63: +/* rule 63 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std_deviation); YY_BREAK -case 53: -/* rule 53 can match eol */ +case 64: +/* rule 64 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_seed); YY_BREAK -case 54: -/* rule 54 can match eol */ +case 65: +/* rule 65 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_seed); YY_BREAK -case 55: -/* rule 55 can match eol */ +case 66: +/* rule 66 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_random_radical); YY_BREAK -case 56: -/* rule 56 can match eol */ +case 67: +/* rule 67 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_random_radical); YY_BREAK -case 57: -/* rule 57 can match eol */ -case 58: -/* rule 58 can match eol */ +case 68: +/* rule 68 can match eol */ +case 69: +/* rule 69 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_DRAND48; YY_BREAK -case 59: -/* rule 59 can match eol */ -case 60: -/* rule 60 can match eol */ +case 70: +/* rule 70 can match eol */ +case 71: +/* rule 71 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_RAND; YY_BREAK -case 61: -/* rule 61 can match eol */ -case 62: -/* rule 62 can match eol */ +case 72: +/* rule 72 can match eol */ +case 73: +/* rule 73 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_RNGSTREAM; YY_BREAK -case 63: -/* rule 63 can match eol */ -case 64: -/* rule 64 can match eol */ +case 74: +/* rule 74 can match eol */ +case 75: +/* rule 75 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_NONE; YY_BREAK -case 65: +case 76: YY_RULE_SETUP { if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element."); @@ -4398,7 +4547,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(S_surfxml_random); } YY_BREAK -case 66: +case 77: YY_RULE_SETUP { if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element."); @@ -4412,11 +4561,11 @@ YY_RULE_SETUP } } YY_BREAK -case 67: +case 78: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of random element.", surf_parse_text[0]); YY_BREAK -case 68: +case 79: YY_RULE_SETUP FAIL("Bad attribute `%s' in `random' element start tag.",surf_parse_text); YY_BREAK @@ -4424,8 +4573,8 @@ case YY_STATE_EOF(AL_surfxml_random): FAIL("EOF in attribute list of `random' element."); YY_BREAK -case 69: -/* rule 69 can match eol */ +case 80: +/* rule 80 can match eol */ YY_RULE_SETUP { LEAVE; @@ -4436,12 +4585,12 @@ YY_RULE_SETUP } } YY_BREAK -case 70: -/* rule 70 can match eol */ +case 81: +/* rule 81 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 71: +case 82: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -4451,13 +4600,13 @@ case YY_STATE_EOF(E_surfxml_random): FAIL("Premature EOF: `' expected."); YY_BREAK -case 72: -/* rule 72 can match eol */ +case 83: +/* rule 83 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 73: -/* rule 73 can match eol */ +case 84: +/* rule 84 can match eol */ YY_RULE_SETUP { AX_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_HOST_AVAIL; @@ -4467,62 +4616,62 @@ YY_RULE_SETUP } YY_BREAK -case 74: -/* rule 74 can match eol */ -case 75: -/* rule 75 can match eol */ +case 85: +/* rule 85 can match eol */ +case 86: +/* rule 86 can match eol */ YY_RULE_SETUP A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_HOST_AVAIL; YY_BREAK -case 76: -/* rule 76 can match eol */ -case 77: -/* rule 77 can match eol */ +case 87: +/* rule 87 can match eol */ +case 88: +/* rule 88 can match eol */ YY_RULE_SETUP A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_POWER; YY_BREAK -case 78: -/* rule 78 can match eol */ -case 79: -/* rule 79 can match eol */ +case 89: +/* rule 89 can match eol */ +case 90: +/* rule 90 can match eol */ YY_RULE_SETUP A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_LINK_AVAIL; YY_BREAK -case 80: -/* rule 80 can match eol */ -case 81: -/* rule 81 can match eol */ +case 91: +/* rule 91 can match eol */ +case 92: +/* rule 92 can match eol */ YY_RULE_SETUP A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_BANDWIDTH; YY_BREAK -case 82: -/* rule 82 can match eol */ -case 83: -/* rule 83 can match eol */ +case 93: +/* rule 93 can match eol */ +case 94: +/* rule 94 can match eol */ YY_RULE_SETUP A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_LATENCY; YY_BREAK -case 84: -/* rule 84 can match eol */ +case 95: +/* rule 95 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_connect_trace); YY_BREAK -case 85: -/* rule 85 can match eol */ +case 96: +/* rule 96 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_connect_trace); YY_BREAK -case 86: -/* rule 86 can match eol */ +case 97: +/* rule 97 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_connect_element); YY_BREAK -case 87: -/* rule 87 can match eol */ +case 98: +/* rule 98 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_connect_element); YY_BREAK -case 88: +case 99: YY_RULE_SETUP { if (!AX_surfxml_trace_connect_trace) FAIL("Required attribute `trace' not set for `trace_connect' element."); @@ -4530,7 +4679,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_trace_connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace_connect); } YY_BREAK -case 89: +case 100: YY_RULE_SETUP { if (!AX_surfxml_trace_connect_trace) FAIL("Required attribute `trace' not set for `trace_connect' element."); @@ -4546,11 +4695,11 @@ YY_RULE_SETUP } } YY_BREAK -case 90: +case 101: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of trace_connect element.", surf_parse_text[0]); YY_BREAK -case 91: +case 102: YY_RULE_SETUP FAIL("Bad attribute `%s' in `trace_connect' element start tag.",surf_parse_text); YY_BREAK @@ -4558,8 +4707,8 @@ case YY_STATE_EOF(AL_surfxml_trace_connect): FAIL("EOF in attribute list of `trace_connect' element."); YY_BREAK -case 92: -/* rule 92 can match eol */ +case 103: +/* rule 103 can match eol */ YY_RULE_SETUP { LEAVE; @@ -4575,12 +4724,12 @@ YY_RULE_SETUP } } YY_BREAK -case 93: -/* rule 93 can match eol */ +case 104: +/* rule 104 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 94: +case 105: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -4588,53 +4737,42 @@ case YY_STATE_EOF(E_surfxml_trace_connect): FAIL("Premature EOF: `' expected."); YY_BREAK -case 95: -/* rule 95 can match eol */ +case 106: +/* rule 106 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 96: -/* rule 96 can match eol */ +case 107: +/* rule 107 can match eol */ YY_RULE_SETUP { AX_surfxml_AS_id = 0; AX_surfxml_AS_routing = 0; - AX_surfxml_AS_coordinates = 0; ENTER(AL_surfxml_AS); pushbuffer(0); } YY_BREAK -case 97: -/* rule 97 can match eol */ +case 108: +/* rule 108 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_AS_id); YY_BREAK -case 98: -/* rule 98 can match eol */ +case 109: +/* rule 109 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_AS_id); YY_BREAK -case 99: -/* rule 99 can match eol */ +case 110: +/* rule 110 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_AS_routing); YY_BREAK -case 100: -/* rule 100 can match eol */ +case 111: +/* rule 111 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_AS_routing); YY_BREAK -case 101: -/* rule 101 can match eol */ -YY_RULE_SETUP -ENTER(VALUE1); BUFFERSET(AX_surfxml_AS_coordinates); - YY_BREAK -case 102: -/* rule 102 can match eol */ -YY_RULE_SETUP -ENTER(VALUE2); BUFFERSET(AX_surfxml_AS_coordinates); - YY_BREAK -case 103: +case 112: YY_RULE_SETUP { if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element."); @@ -4642,7 +4780,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_AS();surfxml_pcdata_ix = 0; ENTER(S_surfxml_AS); } YY_BREAK -case 104: +case 113: YY_RULE_SETUP { if (!AX_surfxml_AS_id) FAIL("Required attribute `id' not set for `AS' element."); @@ -4654,11 +4792,11 @@ YY_RULE_SETUP } } YY_BREAK -case 105: +case 114: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of AS element.", surf_parse_text[0]); YY_BREAK -case 106: +case 115: YY_RULE_SETUP FAIL("Bad attribute `%s' in `AS' element start tag.",surf_parse_text); YY_BREAK @@ -4666,8 +4804,8 @@ case YY_STATE_EOF(AL_surfxml_AS): FAIL("EOF in attribute list of `AS' element."); YY_BREAK -case 107: -/* rule 107 can match eol */ +case 116: +/* rule 116 can match eol */ YY_RULE_SETUP { LEAVE; @@ -4679,12 +4817,12 @@ YY_RULE_SETUP } } YY_BREAK -case 108: -/* rule 108 can match eol */ +case 117: +/* rule 117 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 109: +case 118: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -4701,13 +4839,13 @@ case YY_STATE_EOF(S_surfxml_AS_4): FAIL("Premature EOF: `' expected."); YY_BREAK -case 110: -/* rule 110 can match eol */ +case 119: +/* rule 119 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 111: -/* rule 111 can match eol */ +case 120: +/* rule 120 can match eol */ YY_RULE_SETUP { AX_surfxml_host_id = 0; @@ -4722,91 +4860,91 @@ YY_RULE_SETUP } YY_BREAK -case 112: -/* rule 112 can match eol */ +case 121: +/* rule 121 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id); YY_BREAK -case 113: -/* rule 113 can match eol */ +case 122: +/* rule 122 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id); YY_BREAK -case 114: -/* rule 114 can match eol */ +case 123: +/* rule 123 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power); YY_BREAK -case 115: -/* rule 115 can match eol */ +case 124: +/* rule 124 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power); YY_BREAK -case 116: -/* rule 116 can match eol */ +case 125: +/* rule 125 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core); YY_BREAK -case 117: -/* rule 117 can match eol */ +case 126: +/* rule 126 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core); YY_BREAK -case 118: -/* rule 118 can match eol */ +case 127: +/* rule 127 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability); YY_BREAK -case 119: -/* rule 119 can match eol */ +case 128: +/* rule 128 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability); YY_BREAK -case 120: -/* rule 120 can match eol */ +case 129: +/* rule 129 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability_file); YY_BREAK -case 121: -/* rule 121 can match eol */ +case 130: +/* rule 130 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability_file); YY_BREAK -case 122: -/* rule 122 can match eol */ -case 123: -/* rule 123 can match eol */ +case 131: +/* rule 131 can match eol */ +case 132: +/* rule 132 can match eol */ YY_RULE_SETUP A_surfxml_host_state = A_surfxml_host_state_ON; YY_BREAK -case 124: -/* rule 124 can match eol */ -case 125: -/* rule 125 can match eol */ +case 133: +/* rule 133 can match eol */ +case 134: +/* rule 134 can match eol */ YY_RULE_SETUP A_surfxml_host_state = A_surfxml_host_state_OFF; YY_BREAK -case 126: -/* rule 126 can match eol */ +case 135: +/* rule 135 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state_file); YY_BREAK -case 127: -/* rule 127 can match eol */ +case 136: +/* rule 136 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state_file); YY_BREAK -case 128: -/* rule 128 can match eol */ +case 137: +/* rule 137 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 129: -/* rule 129 can match eol */ +case 138: +/* rule 138 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 130: +case 139: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -4814,7 +4952,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host); } YY_BREAK -case 131: +case 140: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -4825,11 +4963,11 @@ YY_RULE_SETUP } } YY_BREAK -case 132: +case 141: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]); YY_BREAK -case 133: +case 142: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text); YY_BREAK @@ -4837,8 +4975,8 @@ case YY_STATE_EOF(AL_surfxml_host): FAIL("EOF in attribute list of `host' element."); YY_BREAK -case 134: -/* rule 134 can match eol */ +case 143: +/* rule 143 can match eol */ YY_RULE_SETUP { LEAVE; @@ -4849,12 +4987,12 @@ YY_RULE_SETUP } } YY_BREAK -case 135: -/* rule 135 can match eol */ +case 144: +/* rule 144 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 136: +case 145: YY_RULE_SETUP FAIL("Unexpected character `%c': `
' expected.",surf_parse_text[0]); YY_BREAK @@ -4864,13 +5002,13 @@ case YY_STATE_EOF(S_surfxml_host_2): FAIL("Premature EOF: `
' expected."); YY_BREAK -case 137: -/* rule 137 can match eol */ +case 146: +/* rule 146 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 138: -/* rule 138 can match eol */ +case 147: +/* rule 147 can match eol */ YY_RULE_SETUP { AX_surfxml_cluster_id = 0; @@ -4887,166 +5025,177 @@ YY_RULE_SETUP AX_surfxml_cluster_bb_sharing_policy = A_surfxml_cluster_bb_sharing_policy_SHARED; AX_surfxml_cluster_availability_file = 0; AX_surfxml_cluster_state_file = 0; + AX_surfxml_cluster_router_id = 0; ENTER(AL_surfxml_cluster); pushbuffer(0); } YY_BREAK -case 139: -/* rule 139 can match eol */ +case 148: +/* rule 148 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); YY_BREAK -case 140: -/* rule 140 can match eol */ +case 149: +/* rule 149 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); YY_BREAK -case 141: -/* rule 141 can match eol */ +case 150: +/* rule 150 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK -case 142: -/* rule 142 can match eol */ +case 151: +/* rule 151 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK -case 143: -/* rule 143 can match eol */ +case 152: +/* rule 152 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK -case 144: -/* rule 144 can match eol */ +case 153: +/* rule 153 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK -case 145: -/* rule 145 can match eol */ +case 154: +/* rule 154 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK -case 146: -/* rule 146 can match eol */ +case 155: +/* rule 155 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK -case 147: -/* rule 147 can match eol */ +case 156: +/* rule 156 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power); YY_BREAK -case 148: -/* rule 148 can match eol */ +case 157: +/* rule 157 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power); YY_BREAK -case 149: -/* rule 149 can match eol */ +case 158: +/* rule 158 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK -case 150: -/* rule 150 can match eol */ +case 159: +/* rule 159 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK -case 151: -/* rule 151 can match eol */ +case 160: +/* rule 160 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK -case 152: -/* rule 152 can match eol */ +case 161: +/* rule 161 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK -case 153: -/* rule 153 can match eol */ +case 162: +/* rule 162 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK -case 154: -/* rule 154 can match eol */ +case 163: +/* rule 163 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK -case 155: -/* rule 155 can match eol */ -case 156: -/* rule 156 can match eol */ +case 164: +/* rule 164 can match eol */ +case 165: +/* rule 165 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_SHARED; YY_BREAK -case 157: -/* rule 157 can match eol */ -case 158: -/* rule 158 can match eol */ +case 166: +/* rule 166 can match eol */ +case 167: +/* rule 167 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_FULLDUPLEX; YY_BREAK -case 159: -/* rule 159 can match eol */ -case 160: -/* rule 160 can match eol */ +case 168: +/* rule 168 can match eol */ +case 169: +/* rule 169 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_FATPIPE; YY_BREAK -case 161: -/* rule 161 can match eol */ +case 170: +/* rule 170 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_bw); YY_BREAK -case 162: -/* rule 162 can match eol */ +case 171: +/* rule 171 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_bw); YY_BREAK -case 163: -/* rule 163 can match eol */ +case 172: +/* rule 172 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_lat); YY_BREAK -case 164: -/* rule 164 can match eol */ +case 173: +/* rule 173 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_lat); YY_BREAK -case 165: -/* rule 165 can match eol */ -case 166: -/* rule 166 can match eol */ +case 174: +/* rule 174 can match eol */ +case 175: +/* rule 175 can match eol */ YY_RULE_SETUP A_surfxml_cluster_bb_sharing_policy = A_surfxml_cluster_bb_sharing_policy_SHARED; YY_BREAK -case 167: -/* rule 167 can match eol */ -case 168: -/* rule 168 can match eol */ +case 176: +/* rule 176 can match eol */ +case 177: +/* rule 177 can match eol */ YY_RULE_SETUP A_surfxml_cluster_bb_sharing_policy = A_surfxml_cluster_bb_sharing_policy_FATPIPE; YY_BREAK -case 169: -/* rule 169 can match eol */ +case 178: +/* rule 178 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability_file); YY_BREAK -case 170: -/* rule 170 can match eol */ +case 179: +/* rule 179 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability_file); YY_BREAK -case 171: -/* rule 171 can match eol */ +case 180: +/* rule 180 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state_file); YY_BREAK -case 172: -/* rule 172 can match eol */ +case 181: +/* rule 181 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state_file); YY_BREAK -case 173: +case 182: +/* rule 182 can match eol */ +YY_RULE_SETUP +ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router_id); + YY_BREAK +case 183: +/* rule 183 can match eol */ +YY_RULE_SETUP +ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router_id); + YY_BREAK +case 184: YY_RULE_SETUP { if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); @@ -5056,12 +5205,10 @@ YY_RULE_SETUP if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element."); if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element."); LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cluster); } YY_BREAK -case 174: +case 185: YY_RULE_SETUP { if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); @@ -5071,8 +5218,6 @@ YY_RULE_SETUP if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element."); if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element."); LEAVE; STag_surfxml_cluster(); surfxml_pcdata_ix = 0; ETag_surfxml_cluster(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; @@ -5080,11 +5225,11 @@ YY_RULE_SETUP } } YY_BREAK -case 175: +case 186: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]); YY_BREAK -case 176: +case 187: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text); YY_BREAK @@ -5092,8 +5237,8 @@ case YY_STATE_EOF(AL_surfxml_cluster): FAIL("EOF in attribute list of `cluster' element."); YY_BREAK -case 177: -/* rule 177 can match eol */ +case 188: +/* rule 188 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5105,12 +5250,12 @@ YY_RULE_SETUP } } YY_BREAK -case 178: -/* rule 178 can match eol */ +case 189: +/* rule 189 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 179: +case 190: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5118,13 +5263,13 @@ case YY_STATE_EOF(E_surfxml_cluster): FAIL("Premature EOF: `' expected."); YY_BREAK -case 180: -/* rule 180 can match eol */ +case 191: +/* rule 191 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 181: -/* rule 181 can match eol */ +case 192: +/* rule 192 can match eol */ YY_RULE_SETUP { AX_surfxml_peer_id = 0; @@ -5133,108 +5278,93 @@ YY_RULE_SETUP AX_surfxml_peer_bw_out = 0; AX_surfxml_peer_lat = 0; AX_surfxml_peer_coordinates = 0; - AX_surfxml_peer_sharing_policy = A_surfxml_peer_sharing_policy_FULLDUPLEX; AX_surfxml_peer_availability_file = 0; AX_surfxml_peer_state_file = 0; ENTER(AL_surfxml_peer); pushbuffer(0); } YY_BREAK -case 182: -/* rule 182 can match eol */ +case 193: +/* rule 193 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); YY_BREAK -case 183: -/* rule 183 can match eol */ +case 194: +/* rule 194 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); YY_BREAK -case 184: -/* rule 184 can match eol */ +case 195: +/* rule 195 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power); YY_BREAK -case 185: -/* rule 185 can match eol */ +case 196: +/* rule 196 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power); YY_BREAK -case 186: -/* rule 186 can match eol */ +case 197: +/* rule 197 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw_in); YY_BREAK -case 187: -/* rule 187 can match eol */ +case 198: +/* rule 198 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw_in); YY_BREAK -case 188: -/* rule 188 can match eol */ +case 199: +/* rule 199 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw_out); YY_BREAK -case 189: -/* rule 189 can match eol */ +case 200: +/* rule 200 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw_out); YY_BREAK -case 190: -/* rule 190 can match eol */ +case 201: +/* rule 201 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK -case 191: -/* rule 191 can match eol */ +case 202: +/* rule 202 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK -case 192: -/* rule 192 can match eol */ +case 203: +/* rule 203 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK -case 193: -/* rule 193 can match eol */ +case 204: +/* rule 204 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK -case 194: -/* rule 194 can match eol */ -case 195: -/* rule 195 can match eol */ -YY_RULE_SETUP -A_surfxml_peer_sharing_policy = A_surfxml_peer_sharing_policy_SHARED; - YY_BREAK -case 196: -/* rule 196 can match eol */ -case 197: -/* rule 197 can match eol */ -YY_RULE_SETUP -A_surfxml_peer_sharing_policy = A_surfxml_peer_sharing_policy_FULLDUPLEX; - YY_BREAK -case 198: -/* rule 198 can match eol */ +case 205: +/* rule 205 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability_file); YY_BREAK -case 199: -/* rule 199 can match eol */ +case 206: +/* rule 206 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability_file); YY_BREAK -case 200: -/* rule 200 can match eol */ +case 207: +/* rule 207 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state_file); YY_BREAK -case 201: -/* rule 201 can match eol */ +case 208: +/* rule 208 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state_file); YY_BREAK -case 202: +case 209: YY_RULE_SETUP { if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); @@ -5245,7 +5375,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer); } YY_BREAK -case 203: +case 210: YY_RULE_SETUP { if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); @@ -5260,11 +5390,11 @@ YY_RULE_SETUP } } YY_BREAK -case 204: +case 211: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]); YY_BREAK -case 205: +case 212: YY_RULE_SETUP FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text); YY_BREAK @@ -5272,8 +5402,8 @@ case YY_STATE_EOF(AL_surfxml_peer): FAIL("EOF in attribute list of `peer' element."); YY_BREAK -case 206: -/* rule 206 can match eol */ +case 213: +/* rule 213 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5285,12 +5415,12 @@ YY_RULE_SETUP } } YY_BREAK -case 207: -/* rule 207 can match eol */ +case 214: +/* rule 214 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 208: +case 215: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5298,13 +5428,13 @@ case YY_STATE_EOF(E_surfxml_peer): FAIL("Premature EOF: `' expected."); YY_BREAK -case 209: -/* rule 209 can match eol */ +case 216: +/* rule 216 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 210: -/* rule 210 can match eol */ +case 217: +/* rule 217 can match eol */ YY_RULE_SETUP { AX_surfxml_router_id = 0; @@ -5313,34 +5443,34 @@ YY_RULE_SETUP } YY_BREAK -case 211: -/* rule 211 can match eol */ +case 218: +/* rule 218 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 212: -/* rule 212 can match eol */ +case 219: +/* rule 219 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 213: -/* rule 213 can match eol */ +case 220: +/* rule 220 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 214: -/* rule 214 can match eol */ +case 221: +/* rule 221 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 215: +case 222: 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 216: +case 223: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); @@ -5350,11 +5480,11 @@ YY_RULE_SETUP } } YY_BREAK -case 217: +case 224: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]); YY_BREAK -case 218: +case 225: YY_RULE_SETUP FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text); YY_BREAK @@ -5362,8 +5492,8 @@ case YY_STATE_EOF(AL_surfxml_router): FAIL("EOF in attribute list of `router' element."); YY_BREAK -case 219: -/* rule 219 can match eol */ +case 226: +/* rule 226 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5374,12 +5504,12 @@ YY_RULE_SETUP } } YY_BREAK -case 220: -/* rule 220 can match eol */ +case 227: +/* rule 227 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 221: +case 228: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5387,13 +5517,13 @@ case YY_STATE_EOF(E_surfxml_router): FAIL("Premature EOF: `' expected."); YY_BREAK -case 222: -/* rule 222 can match eol */ +case 229: +/* rule 229 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 223: -/* rule 223 can match eol */ +case 230: +/* rule 230 can match eol */ YY_RULE_SETUP { AX_surfxml_link_id = 0; @@ -5408,102 +5538,102 @@ YY_RULE_SETUP } YY_BREAK -case 224: -/* rule 224 can match eol */ +case 231: +/* rule 231 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); YY_BREAK -case 225: -/* rule 225 can match eol */ +case 232: +/* rule 232 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); YY_BREAK -case 226: -/* rule 226 can match eol */ +case 233: +/* rule 233 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK -case 227: -/* rule 227 can match eol */ +case 234: +/* rule 234 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK -case 228: -/* rule 228 can match eol */ +case 235: +/* rule 235 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth_file); YY_BREAK -case 229: -/* rule 229 can match eol */ +case 236: +/* rule 236 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth_file); YY_BREAK -case 230: -/* rule 230 can match eol */ +case 237: +/* rule 237 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); YY_BREAK -case 231: -/* rule 231 can match eol */ +case 238: +/* rule 238 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); YY_BREAK -case 232: -/* rule 232 can match eol */ +case 239: +/* rule 239 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency_file); YY_BREAK -case 233: -/* rule 233 can match eol */ +case 240: +/* rule 240 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency_file); YY_BREAK -case 234: -/* rule 234 can match eol */ -case 235: -/* rule 235 can match eol */ +case 241: +/* rule 241 can match eol */ +case 242: +/* rule 242 can match eol */ YY_RULE_SETUP A_surfxml_link_state = A_surfxml_link_state_ON; YY_BREAK -case 236: -/* rule 236 can match eol */ -case 237: -/* rule 237 can match eol */ +case 243: +/* rule 243 can match eol */ +case 244: +/* rule 244 can match eol */ YY_RULE_SETUP A_surfxml_link_state = A_surfxml_link_state_OFF; YY_BREAK -case 238: -/* rule 238 can match eol */ +case 245: +/* rule 245 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state_file); YY_BREAK -case 239: -/* rule 239 can match eol */ +case 246: +/* rule 246 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state_file); YY_BREAK -case 240: -/* rule 240 can match eol */ -case 241: -/* rule 241 can match eol */ +case 247: +/* rule 247 can match eol */ +case 248: +/* rule 248 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; YY_BREAK -case 242: -/* rule 242 can match eol */ -case 243: -/* rule 243 can match eol */ +case 249: +/* rule 249 can match eol */ +case 250: +/* rule 250 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE; YY_BREAK -case 244: -/* rule 244 can match eol */ -case 245: -/* rule 245 can match eol */ +case 251: +/* rule 251 can match eol */ +case 252: +/* rule 252 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX; YY_BREAK -case 246: +case 253: YY_RULE_SETUP { if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); @@ -5511,7 +5641,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link); } YY_BREAK -case 247: +case 254: YY_RULE_SETUP { if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); @@ -5523,11 +5653,11 @@ YY_RULE_SETUP } } YY_BREAK -case 248: +case 255: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]); YY_BREAK -case 249: +case 256: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text); YY_BREAK @@ -5535,8 +5665,8 @@ case YY_STATE_EOF(AL_surfxml_link): FAIL("EOF in attribute list of `link' element."); YY_BREAK -case 250: -/* rule 250 can match eol */ +case 257: +/* rule 257 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5548,12 +5678,12 @@ YY_RULE_SETUP } } YY_BREAK -case 251: -/* rule 251 can match eol */ +case 258: +/* rule 258 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 252: +case 259: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5563,13 +5693,13 @@ case YY_STATE_EOF(S_surfxml_link): FAIL("Premature EOF: `' expected."); YY_BREAK -case 253: -/* rule 253 can match eol */ +case 260: +/* rule 260 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 254: -/* rule 254 can match eol */ +case 261: +/* rule 261 can match eol */ YY_RULE_SETUP { AX_surfxml_route_src = 0; @@ -5579,41 +5709,41 @@ YY_RULE_SETUP } YY_BREAK -case 255: -/* rule 255 can match eol */ +case 262: +/* rule 262 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); YY_BREAK -case 256: -/* rule 256 can match eol */ +case 263: +/* rule 263 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); YY_BREAK -case 257: -/* rule 257 can match eol */ +case 264: +/* rule 264 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); YY_BREAK -case 258: -/* rule 258 can match eol */ +case 265: +/* rule 265 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); YY_BREAK -case 259: -/* rule 259 can match eol */ -case 260: -/* rule 260 can match eol */ +case 266: +/* rule 266 can match eol */ +case 267: +/* rule 267 can match eol */ YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; YY_BREAK -case 261: -/* rule 261 can match eol */ -case 262: -/* rule 262 can match eol */ +case 268: +/* rule 268 can match eol */ +case 269: +/* rule 269 can match eol */ YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; YY_BREAK -case 263: +case 270: YY_RULE_SETUP { if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); @@ -5621,7 +5751,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route); } YY_BREAK -case 264: +case 271: YY_RULE_SETUP { if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); @@ -5632,11 +5762,11 @@ YY_RULE_SETUP } } YY_BREAK -case 265: +case 272: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]); YY_BREAK -case 266: +case 273: YY_RULE_SETUP FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text); YY_BREAK @@ -5644,8 +5774,8 @@ case YY_STATE_EOF(AL_surfxml_route): FAIL("EOF in attribute list of `route' element."); YY_BREAK -case 267: -/* rule 267 can match eol */ +case 274: +/* rule 274 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5656,12 +5786,12 @@ YY_RULE_SETUP } } YY_BREAK -case 268: -/* rule 268 can match eol */ +case 275: +/* rule 275 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 269: +case 276: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5671,13 +5801,13 @@ case YY_STATE_EOF(E_surfxml_route): FAIL("Premature EOF: `' expected."); YY_BREAK -case 270: -/* rule 270 can match eol */ +case 277: +/* rule 277 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 271: -/* rule 271 can match eol */ +case 278: +/* rule 278 can match eol */ YY_RULE_SETUP { AX_surfxml_ASroute_src = 0; @@ -5689,61 +5819,61 @@ YY_RULE_SETUP } YY_BREAK -case 272: -/* rule 272 can match eol */ +case 279: +/* rule 279 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src); YY_BREAK -case 273: -/* rule 273 can match eol */ +case 280: +/* rule 280 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src); YY_BREAK -case 274: -/* rule 274 can match eol */ +case 281: +/* rule 281 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst); YY_BREAK -case 275: -/* rule 275 can match eol */ +case 282: +/* rule 282 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst); YY_BREAK -case 276: -/* rule 276 can match eol */ +case 283: +/* rule 283 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw_src); YY_BREAK -case 277: -/* rule 277 can match eol */ +case 284: +/* rule 284 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw_src); YY_BREAK -case 278: -/* rule 278 can match eol */ +case 285: +/* rule 285 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw_dst); YY_BREAK -case 279: -/* rule 279 can match eol */ +case 286: +/* rule 286 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw_dst); YY_BREAK -case 280: -/* rule 280 can match eol */ -case 281: -/* rule 281 can match eol */ +case 287: +/* rule 287 can match eol */ +case 288: +/* rule 288 can match eol */ YY_RULE_SETUP A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; YY_BREAK -case 282: -/* rule 282 can match eol */ -case 283: -/* rule 283 can match eol */ +case 289: +/* rule 289 can match eol */ +case 290: +/* rule 290 can match eol */ YY_RULE_SETUP A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO; YY_BREAK -case 284: +case 291: YY_RULE_SETUP { if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); @@ -5753,7 +5883,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute); } YY_BREAK -case 285: +case 292: YY_RULE_SETUP { if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); @@ -5766,11 +5896,11 @@ YY_RULE_SETUP } } YY_BREAK -case 286: +case 293: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]); YY_BREAK -case 287: +case 294: YY_RULE_SETUP FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text); YY_BREAK @@ -5778,8 +5908,8 @@ case YY_STATE_EOF(AL_surfxml_ASroute): FAIL("EOF in attribute list of `ASroute' element."); YY_BREAK -case 288: -/* rule 288 can match eol */ +case 295: +/* rule 295 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5790,12 +5920,12 @@ YY_RULE_SETUP } } YY_BREAK -case 289: -/* rule 289 can match eol */ +case 296: +/* rule 296 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 290: +case 297: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5805,13 +5935,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2): FAIL("Premature EOF: `' expected."); YY_BREAK -case 291: -/* rule 291 can match eol */ +case 298: +/* rule 298 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 292: -/* rule 292 can match eol */ +case 299: +/* rule 299 can match eol */ YY_RULE_SETUP { AX_surfxml_link_ctn_id = 0; @@ -5820,45 +5950,45 @@ YY_RULE_SETUP } YY_BREAK -case 293: -/* rule 293 can match eol */ +case 300: +/* rule 300 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_link_ctn_id); YY_BREAK -case 294: -/* rule 294 can match eol */ +case 301: +/* rule 301 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_link_ctn_id); YY_BREAK -case 295: -/* rule 295 can match eol */ -case 296: -/* rule 296 can match eol */ +case 302: +/* rule 302 can match eol */ +case 303: +/* rule 303 can match eol */ YY_RULE_SETUP A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP; YY_BREAK -case 297: -/* rule 297 can match eol */ -case 298: -/* rule 298 can match eol */ +case 304: +/* rule 304 can match eol */ +case 305: +/* rule 305 can match eol */ YY_RULE_SETUP A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN; YY_BREAK -case 299: -/* rule 299 can match eol */ -case 300: -/* rule 300 can match eol */ +case 306: +/* rule 306 can match eol */ +case 307: +/* rule 307 can match eol */ YY_RULE_SETUP A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; YY_BREAK -case 301: +case 308: 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 302: +case 309: YY_RULE_SETUP { if (!AX_surfxml_link_ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); @@ -5870,11 +6000,11 @@ YY_RULE_SETUP } } YY_BREAK -case 303: +case 310: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]); YY_BREAK -case 304: +case 311: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text); YY_BREAK @@ -5882,8 +6012,8 @@ case YY_STATE_EOF(AL_surfxml_link_ctn): FAIL("EOF in attribute list of `link_ctn' element."); YY_BREAK -case 305: -/* rule 305 can match eol */ +case 312: +/* rule 312 can match eol */ YY_RULE_SETUP { LEAVE; @@ -5896,12 +6026,12 @@ YY_RULE_SETUP } } YY_BREAK -case 306: -/* rule 306 can match eol */ +case 313: +/* rule 313 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 307: +case 314: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5909,13 +6039,13 @@ case YY_STATE_EOF(E_surfxml_link_ctn): FAIL("Premature EOF: `' expected."); YY_BREAK -case 308: -/* rule 308 can match eol */ +case 315: +/* rule 315 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 309: -/* rule 309 can match eol */ +case 316: +/* rule 316 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassRoute_src = 0; @@ -5926,47 +6056,47 @@ YY_RULE_SETUP } YY_BREAK -case 310: -/* rule 310 can match eol */ +case 317: +/* rule 317 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 311: -/* rule 311 can match eol */ +case 318: +/* rule 318 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 312: -/* rule 312 can match eol */ +case 319: +/* rule 319 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 313: -/* rule 313 can match eol */ +case 320: +/* rule 320 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 314: -/* rule 314 can match eol */ +case 321: +/* rule 321 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_gw_src); YY_BREAK -case 315: -/* rule 315 can match eol */ +case 322: +/* rule 322 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_gw_src); YY_BREAK -case 316: -/* rule 316 can match eol */ +case 323: +/* rule 323 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_gw_dst); YY_BREAK -case 317: -/* rule 317 can match eol */ +case 324: +/* rule 324 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_gw_dst); YY_BREAK -case 318: +case 325: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); @@ -5976,7 +6106,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute); } YY_BREAK -case 319: +case 326: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); @@ -5989,11 +6119,11 @@ YY_RULE_SETUP } } YY_BREAK -case 320: +case 327: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]); YY_BREAK -case 321: +case 328: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text); YY_BREAK @@ -6001,8 +6131,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute): FAIL("EOF in attribute list of `bypassRoute' element."); YY_BREAK -case 322: -/* rule 322 can match eol */ +case 329: +/* rule 329 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6013,12 +6143,12 @@ YY_RULE_SETUP } } YY_BREAK -case 323: -/* rule 323 can match eol */ +case 330: +/* rule 330 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 324: +case 331: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6028,13 +6158,13 @@ case YY_STATE_EOF(E_surfxml_bypassRoute): FAIL("Premature EOF: `' expected."); YY_BREAK -case 325: -/* rule 325 can match eol */ +case 332: +/* rule 332 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 326: -/* rule 326 can match eol */ +case 333: +/* rule 333 can match eol */ YY_RULE_SETUP { AX_surfxml_process_host = 0; @@ -6045,47 +6175,47 @@ YY_RULE_SETUP } YY_BREAK -case 327: -/* rule 327 can match eol */ +case 334: +/* rule 334 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); YY_BREAK -case 328: -/* rule 328 can match eol */ +case 335: +/* rule 335 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); YY_BREAK -case 329: -/* rule 329 can match eol */ +case 336: +/* rule 336 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); YY_BREAK -case 330: -/* rule 330 can match eol */ +case 337: +/* rule 337 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); YY_BREAK -case 331: -/* rule 331 can match eol */ +case 338: +/* rule 338 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start_time); YY_BREAK -case 332: -/* rule 332 can match eol */ +case 339: +/* rule 339 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start_time); YY_BREAK -case 333: -/* rule 333 can match eol */ +case 340: +/* rule 340 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill_time); YY_BREAK -case 334: -/* rule 334 can match eol */ +case 341: +/* rule 341 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill_time); YY_BREAK -case 335: +case 342: YY_RULE_SETUP { if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); @@ -6093,7 +6223,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process); } YY_BREAK -case 336: +case 343: YY_RULE_SETUP { if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); @@ -6104,11 +6234,11 @@ YY_RULE_SETUP } } YY_BREAK -case 337: +case 344: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]); YY_BREAK -case 338: +case 345: YY_RULE_SETUP FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text); YY_BREAK @@ -6116,8 +6246,8 @@ case YY_STATE_EOF(AL_surfxml_process): FAIL("EOF in attribute list of `process' element."); YY_BREAK -case 339: -/* rule 339 can match eol */ +case 346: +/* rule 346 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6128,12 +6258,12 @@ YY_RULE_SETUP } } YY_BREAK -case 340: -/* rule 340 can match eol */ +case 347: +/* rule 347 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 341: +case 348: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6143,13 +6273,13 @@ case YY_STATE_EOF(S_surfxml_process_2): FAIL("Premature EOF: `' expected."); YY_BREAK -case 342: -/* rule 342 can match eol */ +case 349: +/* rule 349 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 343: -/* rule 343 can match eol */ +case 350: +/* rule 350 can match eol */ YY_RULE_SETUP { AX_surfxml_argument_value = 0; @@ -6157,24 +6287,24 @@ YY_RULE_SETUP } YY_BREAK -case 344: -/* rule 344 can match eol */ +case 351: +/* rule 351 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value); YY_BREAK -case 345: -/* rule 345 can match eol */ +case 352: +/* rule 352 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value); YY_BREAK -case 346: +case 353: 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 347: +case 354: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); @@ -6184,11 +6314,11 @@ YY_RULE_SETUP } } YY_BREAK -case 348: +case 355: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]); YY_BREAK -case 349: +case 356: YY_RULE_SETUP FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text); YY_BREAK @@ -6196,8 +6326,8 @@ case YY_STATE_EOF(AL_surfxml_argument): FAIL("EOF in attribute list of `argument' element."); YY_BREAK -case 350: -/* rule 350 can match eol */ +case 357: +/* rule 357 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6208,12 +6338,12 @@ YY_RULE_SETUP } } YY_BREAK -case 351: -/* rule 351 can match eol */ +case 358: +/* rule 358 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 352: +case 359: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6221,13 +6351,13 @@ case YY_STATE_EOF(E_surfxml_argument): FAIL("Premature EOF: `' expected."); YY_BREAK -case 353: -/* rule 353 can match eol */ +case 360: +/* rule 360 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 354: -/* rule 354 can match eol */ +case 361: +/* rule 361 can match eol */ YY_RULE_SETUP { AX_surfxml_config_id = 0; @@ -6235,23 +6365,23 @@ YY_RULE_SETUP } YY_BREAK -case 355: -/* rule 355 can match eol */ +case 362: +/* rule 362 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 356: -/* rule 356 can match eol */ +case 363: +/* rule 363 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 357: +case 364: YY_RULE_SETUP { LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config); } YY_BREAK -case 358: +case 365: YY_RULE_SETUP { LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */ @@ -6260,11 +6390,11 @@ YY_RULE_SETUP } } YY_BREAK -case 359: +case 366: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]); YY_BREAK -case 360: +case 367: YY_RULE_SETUP FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text); YY_BREAK @@ -6272,8 +6402,8 @@ case YY_STATE_EOF(AL_surfxml_config): FAIL("EOF in attribute list of `config' element."); YY_BREAK -case 361: -/* rule 361 can match eol */ +case 368: +/* rule 368 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6284,12 +6414,12 @@ YY_RULE_SETUP } } YY_BREAK -case 362: -/* rule 362 can match eol */ +case 369: +/* rule 369 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 363: +case 370: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6301,13 +6431,13 @@ FAIL("Premature EOF: `' expected."); /* * */ -case 364: -/* rule 364 can match eol */ +case 371: +/* rule 371 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 365: -/* rule 365 can match eol */ +case 372: +/* rule 372 can match eol */ YY_RULE_SETUP { AX_surfxml_prop_id = 0; @@ -6316,27 +6446,27 @@ YY_RULE_SETUP } YY_BREAK -case 366: -/* rule 366 can match eol */ +case 373: +/* rule 373 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 367: -/* rule 367 can match eol */ +case 374: +/* rule 374 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 368: -/* rule 368 can match eol */ +case 375: +/* rule 375 can match eol */ YY_RULE_SETUP ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 369: -/* rule 369 can match eol */ +case 376: +/* rule 376 can match eol */ YY_RULE_SETUP ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 370: +case 377: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -6344,7 +6474,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop); } YY_BREAK -case 371: +case 378: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -6359,11 +6489,11 @@ YY_RULE_SETUP } } YY_BREAK -case 372: +case 379: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]); YY_BREAK -case 373: +case 380: YY_RULE_SETUP FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text); YY_BREAK @@ -6371,8 +6501,8 @@ case YY_STATE_EOF(AL_surfxml_prop): FAIL("EOF in attribute list of `prop' element."); YY_BREAK -case 374: -/* rule 374 can match eol */ +case 381: +/* rule 381 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6387,12 +6517,12 @@ YY_RULE_SETUP } } YY_BREAK -case 375: -/* rule 375 can match eol */ +case 382: +/* rule 382 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 376: +case 383: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6402,7 +6532,7 @@ FAIL("Premature EOF: `' expected."); /* EPILOG: after the root element. */ -case 377: +case 384: YY_RULE_SETUP {SET(PROLOG); yyless(0); CLEANUP; return -1;} YY_BREAK @@ -6413,58 +6543,58 @@ SUCCEED; /* CHARACTER DATA. */ /* Non-defined standard entities... */ -case 378: +case 385: YY_RULE_SETUP BUFFERPUTC('&'); YY_BREAK -case 379: +case 386: YY_RULE_SETUP BUFFERPUTC('<'); YY_BREAK -case 380: +case 387: YY_RULE_SETUP BUFFERPUTC('>'); YY_BREAK -case 381: +case 388: YY_RULE_SETUP BUFFERPUTC('\''); YY_BREAK -case 382: +case 389: YY_RULE_SETUP BUFFERPUTC('"'); YY_BREAK /* Character entities. */ -case 383: +case 390: YY_RULE_SETUP BUFFERPUTC((unsigned char)atoi(surf_parse_text+2)); YY_BREAK -case 384: +case 391: YY_RULE_SETUP BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16)); YY_BREAK -case 385: -/* rule 385 can match eol */ -case 386: -/* rule 386 can match eol */ -case 387: -/* rule 387 can match eol */ -case 388: -/* rule 388 can match eol */ +case 392: +/* rule 392 can match eol */ +case 393: +/* rule 393 can match eol */ +case 394: +/* rule 394 can match eol */ +case 395: +/* rule 395 can match eol */ YY_RULE_SETUP BUFFERPUTC('\n'); YY_BREAK -case 389: +case 396: YY_RULE_SETUP ENTER(CDATA); YY_BREAK -case 390: +case 397: YY_RULE_SETUP FAIL("Unexpected `]""]>' in character data."); YY_BREAK -case 391: +case 398: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -6472,7 +6602,7 @@ case YY_STATE_EOF(VALUE1): FAIL("EOF in literal (\"'\" expected)."); YY_BREAK -case 392: +case 399: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -6480,22 +6610,22 @@ case YY_STATE_EOF(VALUE2): FAIL("EOF in literal (`\"' expected)."); YY_BREAK -case 393: -/* rule 393 can match eol */ +case 400: +/* rule 400 can match eol */ YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK -case 394: +case 401: YY_RULE_SETUP FAIL("Spurious `%c' in character data.",surf_parse_text[0]); YY_BREAK -case 395: +case 402: YY_RULE_SETUP LEAVE; YY_BREAK /* "]""]" BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */ -case 396: +case 403: YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK @@ -6507,13 +6637,13 @@ FAIL("EOF in CDATA section."); /* Ideally, this should be replaced by code in flexml.pl that generates just the states not covered by other rules. */ -case 397: -/* rule 397 can match eol */ +case 404: +/* rule 404 can match eol */ YY_RULE_SETUP FAIL("Syntax error on character `%c'.", surf_parse_text[0]); YY_BREAK -case 398: +case 405: YY_RULE_SETUP ECHO; YY_BREAK @@ -6826,7 +6956,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 2424 ) + if ( yy_current_state >= 2421 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -6854,11 +6984,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 2424 ) + if ( yy_current_state >= 2421 ) 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 == 2423); + yy_is_jam = (yy_current_state == 2420); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/surf/simgrid_dtd.l b/src/surf/simgrid_dtd.l deleted file mode 100644 index cfdac2468c..0000000000 --- a/src/surf/simgrid_dtd.l +++ /dev/null @@ -1,1844 +0,0 @@ -/* Validating XML processor for src/surf/simgrid.dtd. - * Generated 2010/12/03 11:37:14. - * - * This program was generated with the FleXML XML processor generator. - * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. - * FleXML is Copyright (C) 2003-2006 Martin Quinson. All rights reserved. - * (Id: flexml.pl,v 1.62 2007/10/11 10:00:14 mquinson Exp). - * - * There are two, intertwined parts to this program, part A and part B. - * - * Part A - * ------ - * - * Some parts, here collectively called "Part A", are found in the - * FleXML package. They are Copyright (C) 1999-2005 Kristoffer Rose - * and Copyright (C) 2003-2006 Martin Quinson. All rights reserved. - * - * You can redistribute, use, perform, display and/or modify "Part A" - * provided the following two conditions hold: - * - * 1. The program is distributed WITHOUT ANY WARRANTY from the author of - * FleXML; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * 2. The program distribution conditions do not in any way affect the - * distribution conditions of the FleXML system used to generate this - * file or any version of FleXML derived from that system. - * - * Notice that these are explicit rights granted to you for files - * generated by the FleXML system. For your rights in connection with - * the FleXML system itself please consult the GNU General Public License. - * - * Part B - * ------ - * - * The other parts, here collectively called "Part B", and which came - * from the DTD used by FleXML to generate this program, can be - * distributed (or not, as the case may be) under the terms of whoever - * wrote them, provided these terms respect and obey the two conditions - * above under the heading "Part A". - * - * The author of and contributors to FleXML specifically disclaim - * any copyright interest in "Part B", unless "Part B" was written - * by the author of or contributors to FleXML. - * - */ - -%{ - -/* Version strings. */ -const char rcs_surfxml_flexml_skeleton[] = - "$" "Id: skel,v 1.40 2007/10/11 09:57:24 mquinson Exp $"; -const char rcs_surfxml_flexml[] = - "$" "Id: flexml.pl,v 1.62 2007/10/11 10:00:14 mquinson Exp $"; - -/* ANSI headers. */ -#include /* for realloc() -- needed here when using flex 2.5.4 */ -#include -#include -#include -#include -#include - -#if defined(_XBT_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__) -# ifndef __STRICT_ANSI__ -# include -# include -# endif -#else -# include -#endif - -#ifndef FLEXML_INDEXSTACKSIZE -#define FLEXML_INDEXSTACKSIZE 1000 -#endif - -/* Generated definitions. */ -#define FLEXML_yylineno -#ifndef FLEXML_BUFFERSTACKSIZE -#define FLEXML_BUFFERSTACKSIZE 1000000 -#endif -#define FLEXML_NEED_BUFFERLIT - -/* XML processor api. */ -/* FleXML-provided data. */ -int surfxml_pcdata_ix; -extern char *surfxml_bufferstack; -#define surfxml_pcdata (surfxml_bufferstack + surfxml_pcdata_ix) -AT_surfxml_random_generator AX_surfxml_random_generator; -#define A_surfxml_random_generator AX_surfxml_random_generator -AT_surfxml_ASroute_gw_dst AX_surfxml_ASroute_gw_dst; -#define A_surfxml_ASroute_gw_dst (surfxml_bufferstack + AX_surfxml_ASroute_gw_dst) -AT_surfxml_trace_connect_element AX_surfxml_trace_connect_element; -#define A_surfxml_trace_connect_element (surfxml_bufferstack + AX_surfxml_trace_connect_element) -AT_surfxml_prop_id AX_surfxml_prop_id; -#define A_surfxml_prop_id (surfxml_bufferstack + AX_surfxml_prop_id) -AT_surfxml_host_id AX_surfxml_host_id; -#define A_surfxml_host_id (surfxml_bufferstack + AX_surfxml_host_id) -AT_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical; -#define A_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical -AT_surfxml_peer_lat AX_surfxml_peer_lat; -#define A_surfxml_peer_lat (surfxml_bufferstack + AX_surfxml_peer_lat) -AT_surfxml_link_latency_file AX_surfxml_link_latency_file; -#define A_surfxml_link_latency_file (surfxml_bufferstack + AX_surfxml_link_latency_file) -AT_surfxml_link_ctn_direction AX_surfxml_link_ctn_direction; -#define A_surfxml_link_ctn_direction AX_surfxml_link_ctn_direction -AT_surfxml_host_state AX_surfxml_host_state; -#define A_surfxml_host_state AX_surfxml_host_state -AT_surfxml_AS_id AX_surfxml_AS_id; -#define A_surfxml_AS_id (surfxml_bufferstack + AX_surfxml_AS_id) -AT_surfxml_host_power AX_surfxml_host_power; -#define A_surfxml_host_power (surfxml_bufferstack + AX_surfxml_host_power) -AT_surfxml_router_id AX_surfxml_router_id; -#define A_surfxml_router_id (surfxml_bufferstack + AX_surfxml_router_id) -AT_surfxml_process_start_time AX_surfxml_process_start_time; -#define A_surfxml_process_start_time (surfxml_bufferstack + AX_surfxml_process_start_time) -AT_surfxml_cluster_suffix AX_surfxml_cluster_suffix; -#define A_surfxml_cluster_suffix (surfxml_bufferstack + AX_surfxml_cluster_suffix) -AT_surfxml_ASroute_src AX_surfxml_ASroute_src; -#define A_surfxml_ASroute_src (surfxml_bufferstack + AX_surfxml_ASroute_src) -AT_surfxml_cluster_prefix AX_surfxml_cluster_prefix; -#define A_surfxml_cluster_prefix (surfxml_bufferstack + AX_surfxml_cluster_prefix) -AT_surfxml_trace_file AX_surfxml_trace_file; -#define A_surfxml_trace_file (surfxml_bufferstack + AX_surfxml_trace_file) -AT_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy; -#define A_surfxml_link_sharing_policy AX_surfxml_link_sharing_policy -AT_surfxml_random_min AX_surfxml_random_min; -#define A_surfxml_random_min (surfxml_bufferstack + AX_surfxml_random_min) -AT_surfxml_link_ctn_id AX_surfxml_link_ctn_id; -#define A_surfxml_link_ctn_id (surfxml_bufferstack + AX_surfxml_link_ctn_id) -AT_surfxml_peer_bw_out AX_surfxml_peer_bw_out; -#define A_surfxml_peer_bw_out (surfxml_bufferstack + AX_surfxml_peer_bw_out) -AT_surfxml_process_kill_time AX_surfxml_process_kill_time; -#define A_surfxml_process_kill_time (surfxml_bufferstack + AX_surfxml_process_kill_time) -AT_surfxml_cluster_bb_bw AX_surfxml_cluster_bb_bw; -#define A_surfxml_cluster_bb_bw (surfxml_bufferstack + AX_surfxml_cluster_bb_bw) -AT_surfxml_argument_value AX_surfxml_argument_value; -#define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value) -AT_surfxml_link_state AX_surfxml_link_state; -#define A_surfxml_link_state AX_surfxml_link_state -AT_surfxml_ASroute_gw_src AX_surfxml_ASroute_gw_src; -#define A_surfxml_ASroute_gw_src (surfxml_bufferstack + AX_surfxml_ASroute_gw_src) -AT_surfxml_AS_routing AX_surfxml_AS_routing; -#define A_surfxml_AS_routing (surfxml_bufferstack + AX_surfxml_AS_routing) -AT_surfxml_link_bandwidth AX_surfxml_link_bandwidth; -#define A_surfxml_link_bandwidth (surfxml_bufferstack + AX_surfxml_link_bandwidth) -AT_surfxml_cluster_id AX_surfxml_cluster_id; -#define A_surfxml_cluster_id (surfxml_bufferstack + AX_surfxml_cluster_id) -AT_surfxml_peer_bw_in AX_surfxml_peer_bw_in; -#define A_surfxml_peer_bw_in (surfxml_bufferstack + AX_surfxml_peer_bw_in) -AT_surfxml_random_mean AX_surfxml_random_mean; -#define A_surfxml_random_mean (surfxml_bufferstack + AX_surfxml_random_mean) -AT_surfxml_cluster_bb_lat AX_surfxml_cluster_bb_lat; -#define A_surfxml_cluster_bb_lat (surfxml_bufferstack + AX_surfxml_cluster_bb_lat) -AT_surfxml_link_latency AX_surfxml_link_latency; -#define A_surfxml_link_latency (surfxml_bufferstack + AX_surfxml_link_latency) -AT_surfxml_trace_connect_kind AX_surfxml_trace_connect_kind; -#define A_surfxml_trace_connect_kind AX_surfxml_trace_connect_kind -AT_surfxml_link_bandwidth_file AX_surfxml_link_bandwidth_file; -#define A_surfxml_link_bandwidth_file (surfxml_bufferstack + AX_surfxml_link_bandwidth_file) -AT_surfxml_route_symmetrical AX_surfxml_route_symmetrical; -#define A_surfxml_route_symmetrical AX_surfxml_route_symmetrical -AT_surfxml_random_id AX_surfxml_random_id; -#define A_surfxml_random_id (surfxml_bufferstack + AX_surfxml_random_id) -AT_surfxml_random_max AX_surfxml_random_max; -#define A_surfxml_random_max (surfxml_bufferstack + AX_surfxml_random_max) -AT_surfxml_link_id AX_surfxml_link_id; -#define A_surfxml_link_id (surfxml_bufferstack + AX_surfxml_link_id) -AT_surfxml_process_host AX_surfxml_process_host; -#define A_surfxml_process_host (surfxml_bufferstack + AX_surfxml_process_host) -AT_surfxml_host_availability_file AX_surfxml_host_availability_file; -#define A_surfxml_host_availability_file (surfxml_bufferstack + AX_surfxml_host_availability_file) -AT_surfxml_cluster_lat AX_surfxml_cluster_lat; -#define A_surfxml_cluster_lat (surfxml_bufferstack + AX_surfxml_cluster_lat) -AT_surfxml_trace_periodicity AX_surfxml_trace_periodicity; -#define A_surfxml_trace_periodicity (surfxml_bufferstack + AX_surfxml_trace_periodicity) -AT_surfxml_cluster_bb_sharing_policy AX_surfxml_cluster_bb_sharing_policy; -#define A_surfxml_cluster_bb_sharing_policy AX_surfxml_cluster_bb_sharing_policy -AT_surfxml_router_coordinates AX_surfxml_router_coordinates; -#define A_surfxml_router_coordinates (surfxml_bufferstack + AX_surfxml_router_coordinates) -AT_surfxml_peer_coordinates AX_surfxml_peer_coordinates; -#define A_surfxml_peer_coordinates (surfxml_bufferstack + AX_surfxml_peer_coordinates) -AT_surfxml_prop_value AX_surfxml_prop_value; -#define A_surfxml_prop_value (surfxml_bufferstack + AX_surfxml_prop_value) -AT_surfxml_ASroute_dst AX_surfxml_ASroute_dst; -#define A_surfxml_ASroute_dst (surfxml_bufferstack + AX_surfxml_ASroute_dst) -AT_surfxml_link_state_file AX_surfxml_link_state_file; -#define A_surfxml_link_state_file (surfxml_bufferstack + AX_surfxml_link_state_file) -AT_surfxml_trace_connect_trace AX_surfxml_trace_connect_trace; -#define A_surfxml_trace_connect_trace (surfxml_bufferstack + AX_surfxml_trace_connect_trace) -AT_surfxml_cluster_power AX_surfxml_cluster_power; -#define A_surfxml_cluster_power (surfxml_bufferstack + AX_surfxml_cluster_power) -AT_surfxml_process_function AX_surfxml_process_function; -#define A_surfxml_process_function (surfxml_bufferstack + AX_surfxml_process_function) -AT_surfxml_peer_id AX_surfxml_peer_id; -#define A_surfxml_peer_id (surfxml_bufferstack + AX_surfxml_peer_id) -AT_surfxml_cluster_sharing_policy AX_surfxml_cluster_sharing_policy; -#define A_surfxml_cluster_sharing_policy AX_surfxml_cluster_sharing_policy -AT_surfxml_bypassRoute_dst AX_surfxml_bypassRoute_dst; -#define A_surfxml_bypassRoute_dst (surfxml_bufferstack + AX_surfxml_bypassRoute_dst) -AT_surfxml_host_core AX_surfxml_host_core; -#define A_surfxml_host_core (surfxml_bufferstack + AX_surfxml_host_core) -AT_surfxml_host_availability AX_surfxml_host_availability; -#define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability) -AT_surfxml_bypassRoute_src AX_surfxml_bypassRoute_src; -#define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src) -AT_surfxml_route_src AX_surfxml_route_src; -#define A_surfxml_route_src (surfxml_bufferstack + AX_surfxml_route_src) -AT_surfxml_bypassRoute_gw_dst AX_surfxml_bypassRoute_gw_dst; -#define A_surfxml_bypassRoute_gw_dst (surfxml_bufferstack + AX_surfxml_bypassRoute_gw_dst) -AT_surfxml_host_coordinates AX_surfxml_host_coordinates; -#define A_surfxml_host_coordinates (surfxml_bufferstack + AX_surfxml_host_coordinates) -AT_surfxml_trace_id AX_surfxml_trace_id; -#define A_surfxml_trace_id (surfxml_bufferstack + AX_surfxml_trace_id) -AT_surfxml_peer_sharing_policy AX_surfxml_peer_sharing_policy; -#define A_surfxml_peer_sharing_policy AX_surfxml_peer_sharing_policy -AT_surfxml_peer_power AX_surfxml_peer_power; -#define A_surfxml_peer_power (surfxml_bufferstack + AX_surfxml_peer_power) -AT_surfxml_cluster_radical AX_surfxml_cluster_radical; -#define A_surfxml_cluster_radical (surfxml_bufferstack + AX_surfxml_cluster_radical) -AT_surfxml_config_id AX_surfxml_config_id; -#define A_surfxml_config_id (surfxml_bufferstack + AX_surfxml_config_id) -AT_surfxml_bypassRoute_gw_src AX_surfxml_bypassRoute_gw_src; -#define A_surfxml_bypassRoute_gw_src (surfxml_bufferstack + AX_surfxml_bypassRoute_gw_src) -AT_surfxml_cluster_core AX_surfxml_cluster_core; -#define A_surfxml_cluster_core (surfxml_bufferstack + AX_surfxml_cluster_core) -AT_surfxml_random_std_deviation AX_surfxml_random_std_deviation; -#define A_surfxml_random_std_deviation (surfxml_bufferstack + AX_surfxml_random_std_deviation) -AT_surfxml_host_state_file AX_surfxml_host_state_file; -#define A_surfxml_host_state_file (surfxml_bufferstack + AX_surfxml_host_state_file) -AT_surfxml_route_dst AX_surfxml_route_dst; -#define A_surfxml_route_dst (surfxml_bufferstack + AX_surfxml_route_dst) -AT_surfxml_cluster_bw AX_surfxml_cluster_bw; -#define A_surfxml_cluster_bw (surfxml_bufferstack + AX_surfxml_cluster_bw) -AT_surfxml_platform_version AX_surfxml_platform_version; -#define A_surfxml_platform_version (surfxml_bufferstack + AX_surfxml_platform_version) - -/* XML state. */ -#ifdef FLEX_DEBUG -# define ENTER(state) debug_enter(state,#state) -# define LEAVE debug_leave() -# define SET(state) debug_set(state,#state) - static void debug_enter(int, const char*); - static void debug_leave(void); - static void debug_set(int, const char*); -#else -# define ENTER(state) (yy_push_state(state)) -# define LEAVE (yy_pop_state()) -# define SET(state) BEGIN(state) -#endif - -/* Generic actions. */ -#define SKIP /*skip*/ -#define SUCCEED CLEANUP; return 0 - -#define FAIL return fail -static int fail(const char*, ...); - -enum {flexml_max_err_msg_size = 512}; -static char flexml_err_msg[flexml_max_err_msg_size]; -const char * surfxml_parse_err_msg() -{ - return flexml_err_msg; -} -static void reset_surfxml_parse_err_msg() -{ - flexml_err_msg[0] = '\0'; -} - -/* Cleanup */ -static void cleanup(void); -#define CLEANUP cleanup() - -/* Text buffer stack handling. */ -char *surfxml_bufferstack = NULL; -static int blimit = FLEXML_BUFFERSTACKSIZE; -static int bnext = 1; - -static int *indexstack = NULL; -static int ilimit = FLEXML_INDEXSTACKSIZE; -static int inext = 1; - -#define BUFFERSET(P) (P = bnext) -#define BUFFERPUTC(C) (ck_blimit(), surfxml_bufferstack[bnext++] = (C)) -#define BUFFERDONE (BUFFERPUTC('\0')) - -#define BUFFERLITERAL(C, P) surfxml_bufferliteral(C, &(P), yytext) - -/* after this is called, there are at least 2 slots left in the stack */ -static int ck_blimit() -{ - if (bnext >= blimit) { - blimit += FLEXML_BUFFERSTACKSIZE + 2; - { - char *temp = (char *) realloc(surfxml_bufferstack, blimit); - assert(temp); - surfxml_bufferstack = temp; - } - } - return 0; -} - -/* after this is called, there are at least 2 slots left in the stack */ -static int ck_ilimit() -{ - if (inext >= ilimit) { - ilimit += FLEXML_INDEXSTACKSIZE + 2; - { - int *temp = (int *) realloc(indexstack, ilimit); - assert(temp); - indexstack = temp; - } - } - return 0; -} - -#ifdef FLEXML_NEED_BUFFERLIT -static void surfxml_bufferliteral(char c, int* pp, const char* text) -{ - const char *s = (c ? strchr(text,c) : text-1), *e = strrchr(text,c); - assert(s <= e); BUFFERSET(*pp); - while (++s= 2); - bnext = indexstack[--inext]; - return indexstack[--inext]; -} - -/* General internal entities are `unput' back onto the input stream... */ -#define ENTITYTEXT(T) \ - { char *s = (T), *e = s+strlen(s);\ - while (--e >= s) { unput(*e); }} - - -%} - -/* Flex standard options. */ -%option stack -%option noyy_top_state -%option noinput -%option noreject -%option noyymore -%option noyywrap - -/* Flex user-requested options. */ -%option yylineno -%option nounput - -/* XML character classes (currently restricted to ASCII). */ - -/* "Common syntactic structures." */ -S [ \t\n\r\f]+ -s [ \t\n\r\f]* - -/* "Names and Tokens." */ -NameChar [A-Za-z0-9.:_-] -Name [A-Za-z_:]{NameChar}* -Names {Name}({S}{Name})* -Nmtoken ({NameChar})+ -Nmtokens {Nmtoken}({S}{Nmtoken})* - -/* Miscellaneous. */ -VersionNum [a-zA-Z0-9_.:-]+ -Eq {s}"="{s} -Literal \'[^'']*\'|\"[^""]*\" - -/* Parser states (flex `exclusive start conditions'): - * - * PROLOG the XML prolog of the document before - * DOCTYPE the XML prolog of the document after - * EPILOG after the root element - * INCOMMENT inside an XML comment - * INPI inside an XML PI - * VALUE1 inside a '...'-delimited literal - * VALUE2 inside a "..."-delimited literal - * CDATA inside a section. - * ROOT_ expect root element - * AL_ inside the attribute list for - * IN_ inside a with element contents (ready for end tag) - * IMPOSSIBLE dummy to permit disabling rules; must be last - */ -%x PROLOG DOCTYPE EPILOG INCOMMENT INPI VALUE1 VALUE2 CDATA -%x ROOT_surfxml_platform AL_surfxml_platform S_surfxml_platform S_surfxml_platform_1 S_surfxml_platform_2 S_surfxml_platform_3 S_surfxml_platform_4 S_surfxml_platform_5 S_surfxml_platform_6 E_surfxml_platform -%x AL_surfxml_trace IN_trace -%x AL_surfxml_random S_surfxml_random S_surfxml_random_1 S_surfxml_random_2 E_surfxml_random -%x AL_surfxml_trace_connect E_surfxml_trace_connect -%x AL_surfxml_AS S_surfxml_AS S_surfxml_AS_1 S_surfxml_AS_2 S_surfxml_AS_3 S_surfxml_AS_4 S_surfxml_AS_5 S_surfxml_AS_6 S_surfxml_AS_7 S_surfxml_AS_8 S_surfxml_AS_9 S_surfxml_AS_10 S_surfxml_AS_11 S_surfxml_AS_12 S_surfxml_AS_13 E_surfxml_AS -%x AL_surfxml_host S_surfxml_host S_surfxml_host_1 S_surfxml_host_2 E_surfxml_host -%x AL_surfxml_cluster E_surfxml_cluster -%x AL_surfxml_peer E_surfxml_peer -%x AL_surfxml_router E_surfxml_router -%x AL_surfxml_link S_surfxml_link S_surfxml_link_1 S_surfxml_link_2 E_surfxml_link -%x AL_surfxml_route S_surfxml_route S_surfxml_route_1 S_surfxml_route_2 E_surfxml_route -%x AL_surfxml_ASroute S_surfxml_ASroute S_surfxml_ASroute_1 S_surfxml_ASroute_2 E_surfxml_ASroute -%x AL_surfxml_link_ctn E_surfxml_link_ctn -%x AL_surfxml_bypassRoute S_surfxml_bypassRoute S_surfxml_bypassRoute_1 S_surfxml_bypassRoute_2 E_surfxml_bypassRoute -%x AL_surfxml_process S_surfxml_process S_surfxml_process_1 S_surfxml_process_2 E_surfxml_process -%x AL_surfxml_argument E_surfxml_argument -%x AL_surfxml_config S_surfxml_config S_surfxml_config_1 S_surfxml_config_2 E_surfxml_config -%x AL_surfxml_prop E_surfxml_prop -%x IMPOSSIBLE - -%{ -/* State names. */ -const char* *surfxml_statenames=NULL; -%} - -%% - - /* Bypass Flex's default INITIAL state and begin by parsing the XML prolog. */ - SET(PROLOG); - reset_surfxml_parse_err_msg(); - surfxml_bufferstack = (char *) malloc(FLEXML_BUFFERSTACKSIZE); - assert(surfxml_bufferstack); - #ifdef FLEX_DEBUG - { - int i; - for (i = 0; i < blimit; i++) { - surfxml_bufferstack[i] = '\377'; - } - } - #endif - surfxml_bufferstack[0] = '\0'; - indexstack = (int *) malloc(FLEXML_INDEXSTACKSIZE * sizeof(int)); - assert(indexstack); - indexstack[0] = 0; - - /* FleXML_init */ - bnext = inext = 1; - surfxml_bufferliteral('\0', &bnext, "0.0"); - surfxml_bufferliteral('\0', &bnext, "1"); - surfxml_bufferliteral('\0', &bnext, "1.0"); - surfxml_bufferliteral('\0', &bnext, "1"); - surfxml_bufferliteral('\0', &bnext, "0.0"); - surfxml_bufferliteral('\0', &bnext, "-1.0"); - surfxml_bufferliteral('\0', &bnext, "-1.0"); - if(!surfxml_statenames) {surfxml_statenames= (const char **)calloc(IMPOSSIBLE,sizeof(char*)); - surfxml_statenames[PROLOG] = NULL; - surfxml_statenames[DOCTYPE] = NULL; - surfxml_statenames[EPILOG] = NULL; - surfxml_statenames[INCOMMENT] = NULL; - surfxml_statenames[INPI] = NULL; - surfxml_statenames[VALUE1] = NULL; - surfxml_statenames[VALUE2] = NULL; - surfxml_statenames[CDATA] = NULL; - surfxml_statenames[ROOT_surfxml_platform] = NULL; - surfxml_statenames[AL_surfxml_platform] = NULL; - surfxml_statenames[S_surfxml_platform] = "platform"; - surfxml_statenames[S_surfxml_platform_1] = "platform"; - surfxml_statenames[S_surfxml_platform_2] = "platform"; - surfxml_statenames[S_surfxml_platform_3] = "platform"; - surfxml_statenames[S_surfxml_platform_4] = "platform"; - surfxml_statenames[S_surfxml_platform_5] = "platform"; - surfxml_statenames[S_surfxml_platform_6] = "platform"; - surfxml_statenames[E_surfxml_platform] = "platform"; - surfxml_statenames[AL_surfxml_trace] = NULL; - surfxml_statenames[IN_trace] = "trace"; - surfxml_statenames[AL_surfxml_random] = NULL; - surfxml_statenames[S_surfxml_random] = "random"; - surfxml_statenames[S_surfxml_random_1] = "random"; - surfxml_statenames[S_surfxml_random_2] = "random"; - surfxml_statenames[E_surfxml_random] = "random"; - surfxml_statenames[AL_surfxml_trace_connect] = NULL; - surfxml_statenames[E_surfxml_trace_connect] = "trace_connect"; - surfxml_statenames[AL_surfxml_AS] = NULL; - surfxml_statenames[S_surfxml_AS] = "AS"; - surfxml_statenames[S_surfxml_AS_1] = "AS"; - surfxml_statenames[S_surfxml_AS_2] = "AS"; - surfxml_statenames[S_surfxml_AS_3] = "AS"; - surfxml_statenames[S_surfxml_AS_4] = "AS"; - surfxml_statenames[S_surfxml_AS_5] = "AS"; - surfxml_statenames[S_surfxml_AS_6] = "AS"; - surfxml_statenames[S_surfxml_AS_7] = "AS"; - surfxml_statenames[S_surfxml_AS_8] = "AS"; - surfxml_statenames[S_surfxml_AS_9] = "AS"; - surfxml_statenames[S_surfxml_AS_10] = "AS"; - surfxml_statenames[S_surfxml_AS_11] = "AS"; - surfxml_statenames[S_surfxml_AS_12] = "AS"; - surfxml_statenames[S_surfxml_AS_13] = "AS"; - surfxml_statenames[E_surfxml_AS] = "AS"; - surfxml_statenames[AL_surfxml_host] = NULL; - surfxml_statenames[S_surfxml_host] = "host"; - surfxml_statenames[S_surfxml_host_1] = "host"; - surfxml_statenames[S_surfxml_host_2] = "host"; - surfxml_statenames[E_surfxml_host] = "host"; - surfxml_statenames[AL_surfxml_cluster] = NULL; - surfxml_statenames[E_surfxml_cluster] = "cluster"; - surfxml_statenames[AL_surfxml_peer] = NULL; - surfxml_statenames[E_surfxml_peer] = "peer"; - surfxml_statenames[AL_surfxml_router] = NULL; - surfxml_statenames[E_surfxml_router] = "router"; - surfxml_statenames[AL_surfxml_link] = NULL; - surfxml_statenames[S_surfxml_link] = "link"; - surfxml_statenames[S_surfxml_link_1] = "link"; - surfxml_statenames[S_surfxml_link_2] = "link"; - surfxml_statenames[E_surfxml_link] = "link"; - surfxml_statenames[AL_surfxml_route] = NULL; - surfxml_statenames[S_surfxml_route] = "route"; - surfxml_statenames[S_surfxml_route_1] = "route"; - surfxml_statenames[S_surfxml_route_2] = "route"; - surfxml_statenames[E_surfxml_route] = "route"; - surfxml_statenames[AL_surfxml_ASroute] = NULL; - surfxml_statenames[S_surfxml_ASroute] = "ASroute"; - surfxml_statenames[S_surfxml_ASroute_1] = "ASroute"; - surfxml_statenames[S_surfxml_ASroute_2] = "ASroute"; - surfxml_statenames[E_surfxml_ASroute] = "ASroute"; - surfxml_statenames[AL_surfxml_link_ctn] = NULL; - surfxml_statenames[E_surfxml_link_ctn] = "link_ctn"; - surfxml_statenames[AL_surfxml_bypassRoute] = NULL; - surfxml_statenames[S_surfxml_bypassRoute] = "bypassRoute"; - surfxml_statenames[S_surfxml_bypassRoute_1] = "bypassRoute"; - surfxml_statenames[S_surfxml_bypassRoute_2] = "bypassRoute"; - surfxml_statenames[E_surfxml_bypassRoute] = "bypassRoute"; - surfxml_statenames[AL_surfxml_process] = NULL; - surfxml_statenames[S_surfxml_process] = "process"; - surfxml_statenames[S_surfxml_process_1] = "process"; - surfxml_statenames[S_surfxml_process_2] = "process"; - surfxml_statenames[E_surfxml_process] = "process"; - surfxml_statenames[AL_surfxml_argument] = NULL; - surfxml_statenames[E_surfxml_argument] = "argument"; - surfxml_statenames[AL_surfxml_config] = NULL; - surfxml_statenames[S_surfxml_config] = "config"; - surfxml_statenames[S_surfxml_config_1] = "config"; - surfxml_statenames[S_surfxml_config_2] = "config"; - surfxml_statenames[E_surfxml_config] = "config"; - surfxml_statenames[AL_surfxml_prop] = NULL; - surfxml_statenames[E_surfxml_prop] = "prop"; - } - - /* COMMENTS and PIs: handled uniformly for efficiency. */ - -{ - "" LEAVE; - "--" | - . | - \n SKIP; - <> FAIL("EOF in comment."); -} -{ - "?>" LEAVE; - . | - \n SKIP; - <> FAIL("EOF in PI (processing instruction)."); -} - - /* SPACES: skipped uniformly */ - -{S} SKIP; - - /* PROLOG: determine root element and process it. */ - -{ - "" SET(DOCTYPE); - "]*">" FAIL("Bad declaration %s.",yytext); -} - -{ - "" SET(ROOT_surfxml_platform); - "-][^>]*">" FAIL("Bad declaration %s.",yytext); - . FAIL("Unexpected character `%c' in prolog.", yytext[0]); - <> FAIL("EOF in prolog."); -} - - /* RULES DERIVED FROM DTD. */ - - /* */ - -" is not allowed here."); - -"{ - "version"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version); - "version"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version); - - ">" { - LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform); - } - "/>" { - LEAVE; STag_surfxml_platform(); surfxml_pcdata_ix = 0; ETag_surfxml_platform(); popbuffer(); /* attribute */ - switch (YY_START) { - case ROOT_surfxml_platform: SET(EPILOG); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of platform element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `platform' element start tag.",yytext); - <> FAIL("EOF in attribute list of `platform' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_platform(); - popbuffer(); /* attribute */ - switch (YY_START) { - case ROOT_surfxml_platform: SET(EPILOG); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id); - - "file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file); - "file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file); - - "periodicity"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity); - "periodicity"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity); - - ">" { - if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element."); - if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element."); - LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace); - } - "/>" { - if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element."); - if (!AX_surfxml_trace_periodicity) FAIL("Required attribute `periodicity' not set for `trace' element."); - LEAVE; STag_surfxml_trace(); surfxml_pcdata_ix = 0; ETag_surfxml_trace(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_8: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_8); break; - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - case S_surfxml_AS_2: SET(S_surfxml_AS_3); break; - case S_surfxml_AS_1: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - case S_surfxml_AS_12: case S_surfxml_AS_9: case S_surfxml_AS_13: SET(S_surfxml_AS_13); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of trace element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `trace' element start tag.",yytext); - <> FAIL("EOF in attribute list of `trace' element."); -} - -{ - "" { - LEAVE; - BUFFERDONE; - ETag_surfxml_trace(); - surfxml_pcdata_ix = popbuffer(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_8: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_8); break; - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - case S_surfxml_AS_2: SET(S_surfxml_AS_3); break; - case S_surfxml_AS_1: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - case S_surfxml_AS_12: case S_surfxml_AS_9: case S_surfxml_AS_13: SET(S_surfxml_AS_13); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id); - - "min"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min); - "min"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min); - - "max"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max); - "max"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max); - - "mean"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean); - "mean"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean); - - "std_deviation"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std_deviation); - "std_deviation"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std_deviation); - - "generator"{Eq}"'DRAND48'" | - "generator"{Eq}"\"DRAND48\"" A_surfxml_random_generator = A_surfxml_random_generator_DRAND48; - "generator"{Eq}"'RAND'" | - "generator"{Eq}"\"RAND\"" A_surfxml_random_generator = A_surfxml_random_generator_RAND; - - ">" { - if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element."); - if (!AX_surfxml_random_min) FAIL("Required attribute `min' not set for `random' element."); - if (!AX_surfxml_random_max) FAIL("Required attribute `max' not set for `random' element."); - if (!AX_surfxml_random_mean) FAIL("Required attribute `mean' not set for `random' element."); - if (!AX_surfxml_random_std_deviation) FAIL("Required attribute `std_deviation' not set for `random' element."); - LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(S_surfxml_random); - } - "/>" { - if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element."); - if (!AX_surfxml_random_min) FAIL("Required attribute `min' not set for `random' element."); - if (!AX_surfxml_random_max) FAIL("Required attribute `max' not set for `random' element."); - if (!AX_surfxml_random_mean) FAIL("Required attribute `mean' not set for `random' element."); - if (!AX_surfxml_random_std_deviation) FAIL("Required attribute `std_deviation' not set for `random' element."); - LEAVE; STag_surfxml_random(); surfxml_pcdata_ix = 0; ETag_surfxml_random(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_config: SET(E_surfxml_config); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of random element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `random' element start tag.",yytext); - <> FAIL("EOF in attribute list of `random' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_random(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_config: SET(E_surfxml_config); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "kind"{Eq}"'HOST_AVAIL'" | - "kind"{Eq}"\"HOST_AVAIL\"" A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_HOST_AVAIL; - "kind"{Eq}"'POWER'" | - "kind"{Eq}"\"POWER\"" A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_POWER; - "kind"{Eq}"'LINK_AVAIL'" | - "kind"{Eq}"\"LINK_AVAIL\"" A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_LINK_AVAIL; - "kind"{Eq}"'BANDWIDTH'" | - "kind"{Eq}"\"BANDWIDTH\"" A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_BANDWIDTH; - "kind"{Eq}"'LATENCY'" | - "kind"{Eq}"\"LATENCY\"" A_surfxml_trace_connect_kind = A_surfxml_trace_connect_kind_LATENCY; - - "trace"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_connect_trace); - "trace"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_connect_trace); - - "element"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_connect_element); - "element"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_connect_element); - - ">" { - if (!AX_surfxml_trace_connect_trace) FAIL("Required attribute `trace' not set for `trace_connect' element."); - if (!AX_surfxml_trace_connect_element) FAIL("Required attribute `element' not set for `trace_connect' element."); - LEAVE; STag_surfxml_trace_connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace_connect); - } - "/>" { - if (!AX_surfxml_trace_connect_trace) FAIL("Required attribute `trace' not set for `trace_connect' element."); - if (!AX_surfxml_trace_connect_element) FAIL("Required attribute `element' not set for `trace_connect' element."); - LEAVE; STag_surfxml_trace_connect(); surfxml_pcdata_ix = 0; ETag_surfxml_trace_connect(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_8: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_8); break; - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - case S_surfxml_AS_2: SET(S_surfxml_AS_3); break; - case S_surfxml_AS_1: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - case S_surfxml_AS_12: case S_surfxml_AS_9: case S_surfxml_AS_13: SET(S_surfxml_AS_13); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of trace_connect element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `trace_connect' element start tag.",yytext); - <> FAIL("EOF in attribute list of `trace_connect' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_trace_connect(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_8: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_8); break; - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - case S_surfxml_AS_2: SET(S_surfxml_AS_3); break; - case S_surfxml_AS_1: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - case S_surfxml_AS_12: case S_surfxml_AS_9: case S_surfxml_AS_13: SET(S_surfxml_AS_13); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_AS_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_AS_id); - - "routing"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_AS_routing); - "routing"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_AS_routing); - - ">" { - 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); - } - "/>" { - 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_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of AS element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `AS' element start tag.",yytext); - <> FAIL("EOF in attribute list of `AS' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_AS(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id); - - "power"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power); - "power"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power); - - "core"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core); - "core"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core); - - "availability"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability); - "availability"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability); - - "availability_file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability_file); - "availability_file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability_file); - - "state"{Eq}"'ON'" | - "state"{Eq}"\"ON\"" A_surfxml_host_state = A_surfxml_host_state_ON; - "state"{Eq}"'OFF'" | - "state"{Eq}"\"OFF\"" A_surfxml_host_state = A_surfxml_host_state_OFF; - - "state_file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state_file); - "state_file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state_file); - - "coordinates"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates); - "coordinates"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates); - - ">" { - if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); - if (!AX_surfxml_host_power) FAIL("Required attribute `power' not set for `host' element."); - LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host); - } - "/>" { - if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); - if (!AX_surfxml_host_power) FAIL("Required attribute `power' not set for `host' element."); - LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of host element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `host' element start tag.",yytext); - <> FAIL("EOF in attribute list of `host' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_host(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); - - "prefix"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); - "prefix"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); - - "suffix"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); - "suffix"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); - - "radical"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); - "radical"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); - - "power"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power); - "power"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power); - - "core"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); - "core"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); - - "bw"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); - "bw"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); - - "lat"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); - "lat"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); - - "sharing_policy"{Eq}"'SHARED'" | - "sharing_policy"{Eq}"\"SHARED\"" A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_SHARED; - "sharing_policy"{Eq}"'FULLDUPLEX'" | - "sharing_policy"{Eq}"\"FULLDUPLEX\"" A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_FULLDUPLEX; - "sharing_policy"{Eq}"'FATPIPE'" | - "sharing_policy"{Eq}"\"FATPIPE\"" A_surfxml_cluster_sharing_policy = A_surfxml_cluster_sharing_policy_FATPIPE; - - "bb_bw"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_bw); - "bb_bw"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_bw); - - "bb_lat"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb_lat); - "bb_lat"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb_lat); - - "bb_sharing_policy"{Eq}"'SHARED'" | - "bb_sharing_policy"{Eq}"\"SHARED\"" A_surfxml_cluster_bb_sharing_policy = A_surfxml_cluster_bb_sharing_policy_SHARED; - "bb_sharing_policy"{Eq}"'FATPIPE'" | - "bb_sharing_policy"{Eq}"\"FATPIPE\"" A_surfxml_cluster_bb_sharing_policy = A_surfxml_cluster_bb_sharing_policy_FATPIPE; - - ">" { - if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); - if (!AX_surfxml_cluster_prefix) FAIL("Required attribute `prefix' not set for `cluster' element."); - if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element."); - if (!AX_surfxml_cluster_radical) FAIL("Required attribute `radical' not set for `cluster' element."); - if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element."); - if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); - if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element."); - LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cluster); - } - "/>" { - if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); - if (!AX_surfxml_cluster_prefix) FAIL("Required attribute `prefix' not set for `cluster' element."); - if (!AX_surfxml_cluster_suffix) FAIL("Required attribute `suffix' not set for `cluster' element."); - if (!AX_surfxml_cluster_radical) FAIL("Required attribute `radical' not set for `cluster' element."); - if (!AX_surfxml_cluster_power) FAIL("Required attribute `power' not set for `cluster' element."); - if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); - if (!AX_surfxml_cluster_lat) FAIL("Required attribute `lat' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_bw) FAIL("Required attribute `bb_bw' not set for `cluster' element."); - if (!AX_surfxml_cluster_bb_lat) FAIL("Required attribute `bb_lat' not set for `cluster' element."); - LEAVE; STag_surfxml_cluster(); surfxml_pcdata_ix = 0; ETag_surfxml_cluster(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of cluster element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `cluster' element start tag.",yytext); - <> FAIL("EOF in attribute list of `cluster' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_cluster(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); - - "power"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power); - "power"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power); - - "bw_in"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw_in); - "bw_in"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw_in); - - "bw_out"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw_out); - "bw_out"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw_out); - - "lat"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); - "lat"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); - - "coordinates"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); - "coordinates"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); - - "sharing_policy"{Eq}"'SHARED'" | - "sharing_policy"{Eq}"\"SHARED\"" A_surfxml_peer_sharing_policy = A_surfxml_peer_sharing_policy_SHARED; - "sharing_policy"{Eq}"'FULLDUPLEX'" | - "sharing_policy"{Eq}"\"FULLDUPLEX\"" A_surfxml_peer_sharing_policy = A_surfxml_peer_sharing_policy_FULLDUPLEX; - - ">" { - if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); - if (!AX_surfxml_peer_power) FAIL("Required attribute `power' not set for `peer' element."); - if (!AX_surfxml_peer_bw_in) FAIL("Required attribute `bw_in' not set for `peer' element."); - if (!AX_surfxml_peer_bw_out) FAIL("Required attribute `bw_out' not set for `peer' element."); - if (!AX_surfxml_peer_lat) FAIL("Required attribute `lat' not set for `peer' element."); - LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer); - } - "/>" { - if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); - if (!AX_surfxml_peer_power) FAIL("Required attribute `power' not set for `peer' element."); - if (!AX_surfxml_peer_bw_in) FAIL("Required attribute `bw_in' not set for `peer' element."); - if (!AX_surfxml_peer_bw_out) FAIL("Required attribute `bw_out' not set for `peer' element."); - if (!AX_surfxml_peer_lat) FAIL("Required attribute `lat' not set for `peer' element."); - LEAVE; STag_surfxml_peer(); surfxml_pcdata_ix = 0; ETag_surfxml_peer(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of peer element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `peer' element start tag.",yytext); - <> FAIL("EOF in attribute list of `peer' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_peer(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_2: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - case S_surfxml_platform_4: case S_surfxml_platform_1: case S_surfxml_platform: case S_surfxml_platform_3: SET(S_surfxml_platform_4); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id); - - "coordinates"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates); - "coordinates"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates); - - ">" { - 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); - } - "/>" { - if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); - LEAVE; STag_surfxml_router(); surfxml_pcdata_ix = 0; ETag_surfxml_router(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of router element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `router' element start tag.",yytext); - <> FAIL("EOF in attribute list of `router' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_router(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); - - "bandwidth"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); - "bandwidth"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); - - "bandwidth_file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth_file); - "bandwidth_file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth_file); - - "latency"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); - "latency"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); - - "latency_file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency_file); - "latency_file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency_file); - - "state"{Eq}"'ON'" | - "state"{Eq}"\"ON\"" A_surfxml_link_state = A_surfxml_link_state_ON; - "state"{Eq}"'OFF'" | - "state"{Eq}"\"OFF\"" A_surfxml_link_state = A_surfxml_link_state_OFF; - - "state_file"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state_file); - "state_file"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state_file); - - "sharing_policy"{Eq}"'SHARED'" | - "sharing_policy"{Eq}"\"SHARED\"" A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; - "sharing_policy"{Eq}"'FATPIPE'" | - "sharing_policy"{Eq}"\"FATPIPE\"" A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE; - "sharing_policy"{Eq}"'FULLDUPLEX'" | - "sharing_policy"{Eq}"\"FULLDUPLEX\"" A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX; - - ">" { - if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); - if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element."); - LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link); - } - "/>" { - if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); - if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element."); - LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - case S_surfxml_AS_2: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of link element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `link' element start tag.",yytext); - <> FAIL("EOF in attribute list of `link' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_link(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_11: case S_surfxml_AS_10: case S_surfxml_AS: SET(S_surfxml_AS_11); break; - case S_surfxml_AS_2: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "src"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); - "src"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); - - "dst"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); - "dst"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); - - "symmetrical"{Eq}"'YES'" | - "symmetrical"{Eq}"\"YES\"" A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; - "symmetrical"{Eq}"'NO'" | - "symmetrical"{Eq}"\"NO\"" A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; - - ">" { - if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); - if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element."); - LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route); - } - "/>" { - if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); - if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element."); - LEAVE; STag_surfxml_route(); surfxml_pcdata_ix = 0; ETag_surfxml_route(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_12: case S_surfxml_AS_9: case S_surfxml_AS_11: case S_surfxml_AS_13: case S_surfxml_AS: SET(S_surfxml_AS_13); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of route element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `route' element start tag.",yytext); - <> FAIL("EOF in attribute list of `route' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_route(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_12: case S_surfxml_AS_9: case S_surfxml_AS_11: case S_surfxml_AS_13: case S_surfxml_AS: SET(S_surfxml_AS_13); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "src"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src); - "src"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src); - - "dst"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst); - "dst"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst); - - "gw_src"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw_src); - "gw_src"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw_src); - - "gw_dst"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw_dst); - "gw_dst"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw_dst); - - "symmetrical"{Eq}"'YES'" | - "symmetrical"{Eq}"\"YES\"" A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; - "symmetrical"{Eq}"'NO'" | - "symmetrical"{Eq}"\"NO\"" A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO; - - ">" { - if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); - if (!AX_surfxml_ASroute_dst) FAIL("Required attribute `dst' not set for `ASroute' element."); - if (!AX_surfxml_ASroute_gw_src) FAIL("Required attribute `gw_src' not set for `ASroute' element."); - if (!AX_surfxml_ASroute_gw_dst) FAIL("Required attribute `gw_dst' not set for `ASroute' element."); - LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute); - } - "/>" { - if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); - if (!AX_surfxml_ASroute_dst) FAIL("Required attribute `dst' not set for `ASroute' element."); - if (!AX_surfxml_ASroute_gw_src) FAIL("Required attribute `gw_src' not set for `ASroute' element."); - if (!AX_surfxml_ASroute_gw_dst) FAIL("Required attribute `gw_dst' not set for `ASroute' element."); - LEAVE; STag_surfxml_ASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_ASroute(); 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; - } - } - . FAIL("Unexpected character `%c' in attribute list of ASroute element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `ASroute' element start tag.",yytext); - <> FAIL("EOF in attribute list of `ASroute' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_ASroute(); - 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; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_link_ctn_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_link_ctn_id); - - "direction"{Eq}"'UP'" | - "direction"{Eq}"\"UP\"" A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP; - "direction"{Eq}"'DOWN'" | - "direction"{Eq}"\"DOWN\"" A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN; - "direction"{Eq}"'NONE'" | - "direction"{Eq}"\"NONE\"" A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - - ">" { - 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); - } - "/>" { - 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; ETag_surfxml_link_ctn(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_bypassRoute: case S_surfxml_bypassRoute_2: case S_surfxml_bypassRoute_1: SET(S_surfxml_bypassRoute_2); break; - case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break; - case S_surfxml_ASroute: case S_surfxml_ASroute_1: case S_surfxml_ASroute_2: SET(S_surfxml_ASroute_2); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of link_ctn element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `link_ctn' element start tag.",yytext); - <> FAIL("EOF in attribute list of `link_ctn' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_link_ctn(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_bypassRoute: case S_surfxml_bypassRoute_2: case S_surfxml_bypassRoute_1: SET(S_surfxml_bypassRoute_2); break; - case S_surfxml_route_1: case S_surfxml_route: case S_surfxml_route_2: SET(S_surfxml_route_2); break; - case S_surfxml_ASroute: case S_surfxml_ASroute_1: case S_surfxml_ASroute_2: SET(S_surfxml_ASroute_2); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "src"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src); - "src"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src); - - "dst"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst); - "dst"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst); - - "gw_src"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_gw_src); - "gw_src"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_gw_src); - - "gw_dst"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_gw_dst); - "gw_dst"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_gw_dst); - - ">" { - if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); - if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element."); - if (!AX_surfxml_bypassRoute_gw_src) FAIL("Required attribute `gw_src' not set for `bypassRoute' element."); - if (!AX_surfxml_bypassRoute_gw_dst) FAIL("Required attribute `gw_dst' not set for `bypassRoute' element."); - LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute); - } - "/>" { - if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); - if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element."); - if (!AX_surfxml_bypassRoute_gw_src) FAIL("Required attribute `gw_src' not set for `bypassRoute' element."); - if (!AX_surfxml_bypassRoute_gw_dst) FAIL("Required attribute `gw_dst' not set for `bypassRoute' element."); - LEAVE; STag_surfxml_bypassRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassRoute(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_1: case S_surfxml_AS: case S_surfxml_AS_8: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_8); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",yytext); - <> FAIL("EOF in attribute list of `bypassRoute' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_bypassRoute(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_1: case S_surfxml_AS: case S_surfxml_AS_8: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_6: case S_surfxml_AS_3: SET(S_surfxml_AS_8); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "host"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); - "host"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); - - "function"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); - "function"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); - - "start_time"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start_time); - "start_time"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start_time); - - "kill_time"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill_time); - "kill_time"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill_time); - - ">" { - if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); - if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element."); - LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process); - } - "/>" { - if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); - if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element."); - LEAVE; STag_surfxml_process(); surfxml_pcdata_ix = 0; ETag_surfxml_process(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_platform_6: case S_surfxml_platform_4: case S_surfxml_platform_5: case S_surfxml_platform_2: case S_surfxml_platform_1: case S_surfxml_platform: SET(S_surfxml_platform_6); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of process element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `process' element start tag.",yytext); - <> FAIL("EOF in attribute list of `process' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_process(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_platform_6: case S_surfxml_platform_4: case S_surfxml_platform_5: case S_surfxml_platform_2: case S_surfxml_platform_1: case S_surfxml_platform: SET(S_surfxml_platform_6); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "value"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value); - "value"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value); - - ">" { - 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); - } - "/>" { - if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); - LEAVE; STag_surfxml_argument(); surfxml_pcdata_ix = 0; ETag_surfxml_argument(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of argument element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `argument' element start tag.",yytext); - <> FAIL("EOF in attribute list of `argument' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_argument(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id); - - ">" { - LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config); - } - "/>" { - LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_platform: SET(S_surfxml_platform_1); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of config element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `config' element start tag.",yytext); - <> FAIL("EOF in attribute list of `config' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_config(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_platform: SET(S_surfxml_platform_1); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* - * */ - -" is not allowed here."); - -"{ - "id"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id); - "id"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id); - - "value"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value); - "value"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value); - - ">" { - if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); - if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element."); - LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop); - } - "/>" { - if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); - if (!AX_surfxml_prop_value) FAIL("Required attribute `value' not set for `prop' element."); - LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_random: case S_surfxml_random_2: case S_surfxml_random_1: SET(S_surfxml_random_2); break; - case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break; - case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; - case S_surfxml_host_1: case S_surfxml_host_2: case S_surfxml_host: SET(S_surfxml_host_2); break; - case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of prop element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `prop' element start tag.",yytext); - <> FAIL("EOF in attribute list of `prop' element."); -} - -{ - "" { - LEAVE; - ETag_surfxml_prop(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_random: case S_surfxml_random_2: case S_surfxml_random_1: SET(S_surfxml_random_2); break; - case S_surfxml_config_1: case S_surfxml_config: case S_surfxml_config_2: SET(S_surfxml_config_2); break; - case S_surfxml_process_1: case S_surfxml_process: case S_surfxml_process_2: SET(S_surfxml_process_2); break; - case S_surfxml_host_1: case S_surfxml_host_2: case S_surfxml_host: SET(S_surfxml_host_2); break; - case S_surfxml_link_1: case S_surfxml_link_2: case S_surfxml_link: SET(S_surfxml_link_2); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* EPILOG: after the root element. */ - -{ - . {SET(PROLOG); yyless(0); CLEANUP; return -1;} - <> SUCCEED; -} - - /* CHARACTER DATA. */ - -{ - /* Non-defined standard entities... */ -"&" BUFFERPUTC('&'); -"<" BUFFERPUTC('<'); -">" BUFFERPUTC('>'); -"'" BUFFERPUTC('\''); -""" BUFFERPUTC('"'); - - /* Character entities. */ - "&#"[[:digit:]]+";" BUFFERPUTC((unsigned char)atoi(yytext+2)); - "&#x"[[:xdigit:]]+";" BUFFERPUTC((unsigned char)strtol(yytext+3,NULL,16)); -} - -{ - "\n" | - "\r" | - "\r\n" | - "\n\r" BUFFERPUTC('\n'); -} - -{ - "" FAIL("Unexpected `]""]>' in character data."); -} - -{ - \' BUFFERDONE; LEAVE; - <> FAIL("EOF in literal (\"'\" expected)."); -} - -{ - \" BUFFERDONE; LEAVE; - <> FAIL("EOF in literal (`\"' expected)."); -} - -{ - [^<&] BUFFERPUTC(yytext[0]); - [<&] FAIL("Spurious `%c' in character data.",yytext[0]); -} - -{ - "]""]>" LEAVE; - /* "]""]" BUFFERPUTC(yytext[0]); BUFFERPUTC(yytext[1]); */ - . BUFFERPUTC(yytext[0]); - <> FAIL("EOF in CDATA section."); -} - - /* Impossible rules to avoid warnings from flex(1). */ - /* Ideally, this should be replaced by code in flexml.pl that - generates just the states not covered by other rules. */ -<*>{ - .|[\n] FAIL("Syntax error on character `%c'.", yytext[0]); -} - -%% - -/* Element context stack lookup. */ -int surfxml_element_context(int i) -{ - return (0= 64 KiB)", NULL, surf_network_model_init_SMPI}, @@ -131,6 +131,11 @@ s_surf_model_description_t surf_network_model_description[] = { {"GTNets", "Network Pseudo-model using the GTNets simulator instead of an analytic model", NULL, surf_network_model_init_GTNETS}, +#endif +#ifdef HAVE_NS3 + {"NS3", + "Use NS3 tcp model", + NULL, surf_network_model_init_NS3}, #endif {"Reno", "Model using lagrange_solve instead of lmm_solve (experts only)", NULL, @@ -382,9 +387,14 @@ void surf_exit(void) if (surf_path) xbt_dynar_free(&surf_path); + xbt_lib_free(&host_lib); + xbt_lib_free(&link_lib); + xbt_lib_free(&as_router_lib); + tmgr_finalize(); surf_parse_lex_destroy(); surf_parse_free_callbacks(); + NOW = 0; /* Just in case the user plans to restart the simulation afterward */ } @@ -430,23 +440,48 @@ double surf_solve(double max_date) min = max_date - NOW; } - XBT_DEBUG("Looking for next action end"); + XBT_DEBUG("Looking for next action end for all models except NS3"); xbt_dynar_foreach(model_list, iter, model) { - XBT_DEBUG("Running for Resource [%s]", model->name); - model_next_action_end = model->model_private->share_resources(NOW); - XBT_DEBUG("Resource [%s] : next action end = %f", - model->name, model_next_action_end); - if (((min < 0.0) || (model_next_action_end < min)) - && (model_next_action_end >= 0.0)) - min = model_next_action_end; + if(strcmp(model->name,"network NS3") ){ + XBT_DEBUG("Running for Resource [%s]", model->name); + model_next_action_end = model->model_private->share_resources(NOW); + XBT_DEBUG("Resource [%s] : next action end = %f", + model->name, model_next_action_end); + if (((min < 0.0) || (model_next_action_end < min)) + && (model_next_action_end >= 0.0)) + min = model_next_action_end; + } } - XBT_DEBUG("Next action end : %f", min); - XBT_DEBUG("Looking for next event"); - while ((next_event_date = tmgr_history_next_date(history)) != -1.0) { + XBT_DEBUG("Min for resources (except NS3) : %f", min); + + XBT_DEBUG("Looking for next trace event"); + + do { XBT_DEBUG("Next TRACE event : %f", next_event_date); - if ((min != -1.0) && (next_event_date > NOW + min)) - break; + + 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 NS3 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 NS3 : %f", model_next_action_end); + if(model_next_action_end>=0.0) + min = model_next_action_end; + } + + if (next_event_date == -1.0) break; + + if ((min != -1.0) && (next_event_date > NOW + min)) break; + XBT_DEBUG("Updating models"); while ((event = tmgr_history_get_next_event_leq(history, next_event_date, @@ -466,8 +501,7 @@ double surf_solve(double max_date) event, value, NOW + min); } - } - + } while (1); /* FIXME: Moved this test to here to avoid stoping 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. diff --git a/src/surf/surf_config.c b/src/surf/surf_config.c index 0fff09fabb..f269695277 100644 --- a/src/surf/surf_config.c +++ b/src/surf/surf_config.c @@ -9,6 +9,7 @@ #include "xbt/config.h" #include "xbt/str.h" #include "surf/surf_private.h" +#include "surf/surf_routing.h" /* COORD_HOST_LEVEL and COORD_ASR_LEVEL */ #include "simix/context.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_config, surf, @@ -220,6 +221,23 @@ static void _surf_cfg_cb_contexts_parallel_threshold(const char *name, int pos) SIMIX_context_set_parallel_threshold(xbt_cfg_get_int(_surf_cfg_set, name)); } +static void _surf_cfg_cb__surf_network_coordinates(const char *name, + int pos) +{ + char *val = xbt_cfg_get_string(_surf_cfg_set, name); + if (!strcmp(val, "yes")) { + if (!COORD_HOST_LEVEL) { + COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); + COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); + } + } else if (!strcmp(val, "no")) { + if (COORD_HOST_LEVEL) + XBT_WARN("Cannot disable CMD prop coordinates, once set."); + } else { + XBT_WARN("Setting CMD prop coordinates must be \"yes\" or \"no\""); + } +} + static void _surf_cfg_cb__surf_network_fullduplex(const char *name, int pos) { @@ -397,9 +415,16 @@ void surf_config_init(int *argc, char **argv) xbt_cfgelm_int, &default_value_int, 1, 1, _surf_cfg_cb_contexts_parallel_threshold, NULL); + default_value = xbt_strdup("no"); + xbt_cfg_register(&_surf_cfg_set, "coordinates", + "\"yes\" or \"no\" (FIXME: document)", + xbt_cfgelm_string, &default_value, 1, 1, + _surf_cfg_cb__surf_network_coordinates, NULL); + xbt_cfg_setdefault_string(_surf_cfg_set, "coordinates", default_value); + default_value_int = 0; xbt_cfg_register(&_surf_cfg_set, "fullduplex", - "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM03)", + "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM02)", xbt_cfgelm_int, &default_value_int, 0, 1, _surf_cfg_cb__surf_network_fullduplex, NULL); xbt_cfg_setdefault_int(_surf_cfg_set, "fullduplex", default_value_int); @@ -417,7 +442,13 @@ void surf_config_init(int *argc, char **argv) xbt_cfgelm_int, &default_value_int, 0, 1, _surf_cfg_cb__gtnets_jitter_seed, NULL); #endif - +#ifdef HAVE_NS3 + xbt_cfg_register(&_surf_cfg_set, "ns3/TcpModel", + "The ns3 tcp model can be : NewReno or Reno or Tahoe", + xbt_cfgelm_string, NULL, 1, 1, + NULL, NULL); + xbt_cfg_setdefault_string(_surf_cfg_set, "ns3/TcpModel", "default"); +#endif if (!surf_path) { /* retrieves the current directory of the current process */ const char *initial_path = __surf_get_initial_path(); @@ -460,14 +491,16 @@ void surf_config_models_setup(const char *platform_file) * we should switch to the "compound" workstation model to correctly dispatch stuff to * the right net/cpu models. */ - if ((strcmp(network_model_name, "LV08") - || strcmp(cpu_model_name, "Cas01")) - && !strcmp(workstation_model_name, "CLM03")) { - const char *val = "compound"; - XBT_INFO - ("Switching workstation model to compound since you changed the network and/or cpu model(s)"); - xbt_cfg_set_string(_surf_cfg_set, "workstation/model", val); - workstation_model_name = (char *) "compound"; + + if((!xbt_cfg_is_default_value(_surf_cfg_set, "network/model") || + !xbt_cfg_is_default_value(_surf_cfg_set, "cpu/model")) && + xbt_cfg_is_default_value(_surf_cfg_set, "workstation/model")) + { + const char *val = "compound"; + XBT_INFO + ("Switching workstation model to compound since you changed the network and/or cpu model(s)"); + xbt_cfg_set_string(_surf_cfg_set, "workstation/model", val); + workstation_model_name = (char *) "compound"; } XBT_DEBUG("Workstation model: %s", workstation_model_name); diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index c264a261ae..d1bc0fc6f0 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -154,7 +154,7 @@ typedef struct s_routing_component { route_extended_t(*get_route) (routing_component_t rc, const char *src, const char *dst); double(*get_latency) (routing_component_t rc, const char *src, - const char *dst); + const char *dst, route_extended_t e_route); xbt_dynar_t(*get_onelink_routes) (routing_component_t rc); e_surf_network_element_type_t(*get_network_element_type) (const char *name); @@ -182,18 +182,22 @@ struct s_routing_global { routing_component_t root; void *loopback; size_t size_of_link; - xbt_dynar_t(*get_route) (const char *src, const char *dst); - xbt_dynar_t(*get_route_no_cleanup) (const char *src, const char *dst); - xbt_dynar_t(*get_onelink_routes) (void); - double (*get_latency) (const char *src, const char *dst); - e_surf_network_element_type_t(*get_network_element_type) (const char - *name); + xbt_dynar_t(*get_route) (const char *src, const char *dst); + xbt_dynar_t(*get_route_or_null) (const char *src, const char *dst); + xbt_dynar_t(*get_route_no_cleanup) (const char *src, const char *dst); + xbt_dynar_t(*get_onelink_routes) (void); + double (*get_latency) (const char *src, const char *dst); + void (*get_route_latency)(const char *src, const char *dst, + xbt_dynar_t *route, double *latency, int cleanup); + e_surf_network_element_type_t(*get_network_element_type) (const char *name); void (*finalize) (void); xbt_dynar_t last_route; }; XBT_PUBLIC(void) routing_model_create(size_t size_of_link, void *loopback, double_f_cpvoid_t get_link_latency_fun); +XBT_PUBLIC(void) routing_parse_Scluster(void); /* cluster bypass */ + /** * Resource protected methods */ diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index b8dff627de..8fb18e696f 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -4,74 +4,54 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ - - -#include -#include "gras_config.h" - -#ifdef HAVE_PCRE_LIB -#include /* regular expresion library */ -#endif -#include "surf_private.h" -#include "xbt/dynar.h" -#include "xbt/str.h" -#include "xbt/config.h" -#include "xbt/graph.h" -#include "xbt/set.h" -#include "surf/surfxml_parse.h" - -xbt_dict_t patterns = NULL; -xbt_dict_t random_value = NULL; - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf"); +#include /* regular expression library */ +#include "surf_routing_private.h" +#include "surf/surf_routing.h" + +xbt_lib_t host_lib; +int ROUTING_HOST_LEVEL; //Routing level +int SURF_CPU_LEVEL; //Surf cpu level +int SURF_WKS_LEVEL; //Surf workstation level +int SIMIX_HOST_LEVEL; //Simix level +int MSG_HOST_LEVEL; //Msg level +int SD_HOST_LEVEL; //Simdag level +int COORD_HOST_LEVEL; //Coordinates level +int NS3_HOST_LEVEL; //host node for ns3 + +xbt_lib_t link_lib; +int SD_LINK_LEVEL; //Simdag level +int SURF_LINK_LEVEL; //Surf level +int NS3_LINK_LEVEL; //link for ns3 + +xbt_lib_t as_router_lib; +int ROUTING_ASR_LEVEL; //Routing level +int COORD_ASR_LEVEL; //Coordinates level +int NS3_ASR_LEVEL; //host node for ns3 + +static xbt_dict_t patterns = NULL; +static xbt_dict_t random_value = NULL; /* Global vars */ routing_global_t global_routing = NULL; routing_component_t current_routing = NULL; model_type_t current_routing_model = NULL; + +/* global parse functions */ +xbt_dynar_t link_list = NULL; /* temporary store of current list link of a route */ +static const char *src = NULL; /* temporary store the source name of a route */ +static const char *dst = NULL; /* temporary store the destination name of a route */ +static char *gw_src = NULL; /* temporary store the gateway source name of a route */ +static char *gw_dst = NULL; /* temporary store the gateway destination name of a route */ static double_f_cpvoid_t get_link_latency = NULL; -/* Prototypes of each model */ -static void *model_full_create(void); /* create structures for full routing model */ -static void model_full_load(void); /* load parse functions for full routing model */ -static void model_full_unload(void); /* unload parse functions for full routing model */ -static void model_full_end(void); /* finalize the creation of full routing model */ -static void model_full_set_route( /* Set the route and ASroute between src and dst */ - routing_component_t rc, const char *src, const char *dst, name_route_extended_t route); - -static void *model_floyd_create(void); /* create structures for floyd routing model */ -static void model_floyd_load(void); /* load parse functions for floyd routing model */ -static void model_floyd_unload(void); /* unload parse functions for floyd routing model */ -static void model_floyd_end(void); /* finalize the creation of floyd routing model */ -static void model_floyd_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route); - -static void *model_dijkstra_both_create(int cached); /* create by calling dijkstra or dijkstracache */ -static void *model_dijkstra_create(void); /* create structures for dijkstra routing model */ -static void *model_dijkstracache_create(void); /* create structures for dijkstracache routing model */ -static void model_dijkstra_both_load(void); /* load parse functions for dijkstra routing model */ -static void model_dijkstra_both_unload(void); /* unload parse functions for dijkstra routing model */ -static void model_dijkstra_both_end(void); /* finalize the creation of dijkstra routing model */ -static void model_dijkstra_both_set_route (routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route); - -static void *model_rulebased_create(void); /* create structures for rulebased routing model */ -static void model_rulebased_load(void); /* load parse functions for rulebased routing model */ -static void model_rulebased_unload(void); /* unload parse functions for rulebased routing model */ -static void model_rulebased_end(void); /* finalize the creation of rulebased routing model */ - -static void *model_none_create(void); /* none routing model */ -static void model_none_load(void); /* none routing model */ -static void model_none_unload(void); /* none routing model */ -static void model_none_end(void); /* none routing model */ - -static void routing_parse_Scluster(void); /*cluster bypass */ -static void routing_parse_Speer(void); /*peer bypass */ -static void routing_parse_Srandom(void); /*random bypass */ -static void routing_parse_Erandom(void); /*random bypass */ - -static void routing_parse_Sconfig(void); /*config Tag */ -static void routing_parse_Econfig(void); /*config Tag */ +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf"); + +static void routing_parse_Speer(void); /* peer bypass */ +static void routing_parse_Srandom(void); /* random bypass */ +static void routing_parse_Erandom(void); /* random bypass */ + +static void routing_parse_Sconfig(void); /* config Tag */ +static void routing_parse_Econfig(void); /* config Tag */ static char* replace_random_parameter(char * chaine); static void clean_dict_random(void); @@ -83,13 +63,9 @@ typedef enum { SURF_MODEL_DIJKSTRA, SURF_MODEL_DIJKSTRACACHE, SURF_MODEL_NONE, -#ifdef HAVE_PCRE_LIB SURF_MODEL_RULEBASED -#endif } e_routing_types; - -/* must be finish with null and carefull if change de order */ struct s_model_type routing_models[] = { {"Full", "Full routing data (fast, large memory requirements, fully expressive)", model_full_create, @@ -110,68 +86,14 @@ struct s_model_type routing_models[] = { {"Full", model_dijkstra_both_unload, model_dijkstra_both_end}, {"none", "No routing (usable with Constant network only)", model_none_create, model_none_load, model_none_unload, model_none_end}, -#ifdef HAVE_PCRE_LIB {"RuleBased", "Rule-Based routing data (...)", model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end}, {"Vivaldi", "Vivaldi routing", model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end}, -#endif {NULL, NULL, NULL, NULL, NULL, NULL} }; -/* ************************************************************************** */ -/* ***************** GENERIC PARSE FUNCTIONS (declarations) ***************** */ - -static void generic_set_processing_unit(routing_component_t rc, - const char *name); -static void generic_set_autonomous_system(routing_component_t rc, - const char *name); -static void generic_set_bypassroute(routing_component_t rc, - const char *src, const char *dst, - route_extended_t e_route); - -static int surf_link_resource_cmp(const void *a, const void *b); -static int surf_pointer_resource_cmp(const void *a, const void *b); - -/* ************************************************************************** */ -/* *************** GENERIC BUSINESS METHODS (declarations) ****************** */ - -static double generic_get_link_latency(routing_component_t rc, const char *src, const char *dst); -static xbt_dynar_t generic_get_onelink_routes(routing_component_t rc); -static route_extended_t generic_get_bypassroute(routing_component_t rc, - const char *src, - const char *dst); - -/* ************************************************************************** */ -/* ****************** GENERIC AUX FUNCTIONS (declarations) ****************** */ - -static route_extended_t -generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, - void *data, int order); -static route_t -generic_new_route(e_surf_routing_hierarchy_t hierarchy, - void *data, int order); -static void generic_free_route(route_t route); -static void generic_free_extended_route(route_extended_t e_route); -static routing_component_t -generic_autonomous_system_exist(routing_component_t rc, char *element); -static routing_component_t -generic_processing_units_exist(routing_component_t rc, char *element); -static void generic_src_dst_check(routing_component_t rc, const char *src, - const char *dst); - -/* ************************************************************************** */ -/* **************************** GLOBAL FUNCTIONS **************************** */ - -/* global parse functions */ -static const char *src = NULL; /* temporary store the source name of a route */ -static const char *dst = NULL; /* temporary store the destination name of a route */ -static char *gw_src = NULL; /* temporary store the gateway source name of a route */ -static char *gw_dst = NULL; /* temporary store the gateway destination name of a route */ -static xbt_dynar_t link_list = NULL; /* temporary store of current list link of a route */ - - -static double eculidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) +static double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) { double src_coord, dst_coord; @@ -182,7 +104,7 @@ static double eculidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) } -static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst) +static double base_vivaldi_get_latency (const char *src, const char *dst) { double euclidean_dist; xbt_dynar_t src_ctn, dst_ctn; @@ -194,25 +116,27 @@ static double vivaldi_get_link_latency (routing_component_t rc,const char *src, if(dst_ctn == NULL || src_ctn == NULL) xbt_die("Coord src '%s' :%p dst '%s' :%p",src,src_ctn,dst,dst_ctn); - euclidean_dist = sqrt (eculidean_dist_comp(0,src_ctn,dst_ctn)+eculidean_dist_comp(1,src_ctn,dst_ctn)) - +fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *))); + euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn)) + + fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *))); xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist); - return euclidean_dist; - - /* - x = atof(xbt_dynar_get_as(src_ctn, 0, char *))-atof(xbt_dynar_get_as(dst_ctn, 0, char *)); - y = atof(xbt_dynar_get_as(src_ctn, 1, char *)); - h = atof(xbt_dynar_get_as(ctn, 2, char *)); - sqrt((c1->x - c2->x) * (c1->x - c2->x) + (c1->y - c2->y) * (c1->y - c2->y)) + fabs(c1->h) + fabs(c2->h); + //From .ms to .s + return euclidean_dist / 1000; +} - if (strcmp(coord,"")) { - xbt_dynar_t ctn = xbt_str_split_str(coord, " "); - xbt_dynar_shrink(ctn,0); - xbt_lib_set(host_lib, host_id, COORD_HOST_LEVEL, ctn); +static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst, route_extended_t e_route) +{ + if(get_network_element_type(src) == SURF_NETWORK_ELEMENT_AS) { + int need_to_clean = e_route?0:1; + double latency; + e_route = e_route?e_route:(*(rc->get_route)) (rc, src, dst); + latency = base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway); + if(need_to_clean) generic_free_extended_route(e_route); + return latency; + } else { + return base_vivaldi_get_latency(src,dst); } - */ } /** @@ -564,13 +488,6 @@ static void parse_S_AS(char *AS_id, char *AS_routing) static void parse_S_AS_XML(void) { parse_S_AS(A_surfxml_AS_id, A_surfxml_AS_routing); - - if (strcmp(A_surfxml_AS_coordinates,"")) { - if(!COORD_ASR_LEVEL) xbt_die("To use coordinates, you must set configuration 'coordinates' to 'yes'"); - xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_AS_coordinates, " "); - xbt_dynar_shrink(ctn, 0); - xbt_lib_set(as_router_lib,A_surfxml_AS_id,COORD_ASR_LEVEL,(void *) ctn); - } } /* @@ -654,269 +571,219 @@ static char* elements_As_name(const char *name) * Get the common father of the to processing units, and the first different * father in the chain */ -static xbt_dynar_t elements_father(const char *src, const char *dst) +static void elements_father(const char *src, const char *dst, + routing_component_t *res_father, + routing_component_t *res_src, + routing_component_t *res_dst) { - xbt_assert(src && dst, "bad parameters for \"elements_father\" method"); - - xbt_dynar_t result = xbt_dynar_new(sizeof(char *), NULL); - +#define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */ routing_component_t src_as, dst_as; - int index_src, index_dst, index_father_src, index_father_dst; - xbt_dynar_t path_src = NULL; - xbt_dynar_t path_dst = NULL; - routing_component_t current = NULL; - routing_component_t *current_src = NULL; - routing_component_t *current_dst = NULL; - routing_component_t *father = NULL; + routing_component_t path_src[ELEMENTS_FATHER_MAXDEPTH]; + routing_component_t path_dst[ELEMENTS_FATHER_MAXDEPTH]; + int index_src = 0; + int index_dst = 0; + routing_component_t current; + routing_component_t current_src; + routing_component_t current_dst; + routing_component_t father; /* (1) find the as where the src and dst are located */ - void * src_data = xbt_lib_get_or_null(host_lib,src, ROUTING_HOST_LEVEL); - void * dst_data = xbt_lib_get_or_null(host_lib,dst, ROUTING_HOST_LEVEL); - if(!src_data) src_data = xbt_lib_get_or_null(as_router_lib,src, ROUTING_ASR_LEVEL); - if(!dst_data) dst_data = xbt_lib_get_or_null(as_router_lib,dst, ROUTING_ASR_LEVEL); - src_as = ((network_element_info_t)src_data)->rc_component; - dst_as = ((network_element_info_t)dst_data)->rc_component; - - xbt_assert(src_as - && dst_as, - "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, - dst); + network_element_info_t src_data = xbt_lib_get_or_null(host_lib, src, + ROUTING_HOST_LEVEL); + network_element_info_t dst_data = xbt_lib_get_or_null(host_lib, dst, + ROUTING_HOST_LEVEL); + if (!src_data) + src_data = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL); + if (!dst_data) + dst_data = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL); + src_as = src_data->rc_component; + dst_as = dst_data->rc_component; + + xbt_assert(src_as && dst_as, + "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, dst); /* (2) find the path to the root routing component */ - path_src = xbt_dynar_new(sizeof(routing_component_t), NULL); - current = src_as; - while (current != NULL) { - xbt_dynar_push(path_src, ¤t); - current = current->routing_father; + for (current = src_as ; current != NULL ; current = current->routing_father) { + if (index_src >= ELEMENTS_FATHER_MAXDEPTH) + xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_src"); + path_src[index_src++] = current; } - path_dst = xbt_dynar_new(sizeof(routing_component_t), NULL); - current = dst_as; - while (current != NULL) { - xbt_dynar_push(path_dst, ¤t); - current = current->routing_father; + for (current = dst_as ; current != NULL ; current = current->routing_father) { + if (index_dst >= ELEMENTS_FATHER_MAXDEPTH) + xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_dst"); + path_dst[index_dst++] = current; } /* (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); - while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) { - current_src = xbt_dynar_get_ptr(path_src, index_src); - current_dst = xbt_dynar_get_ptr(path_dst, index_dst); - index_src--; - index_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); + do { + current_src = path_src[--index_src]; + current_dst = path_dst[--index_dst]; + } while (index_src > 0 && index_dst > 0 && current_src == current_dst); /* (4) they are not in the same routing component, make the path */ - index_father_src = index_src + 1; - index_father_dst = index_dst + 1; - - if (*current_src == *current_dst) + if (current_src == current_dst) father = current_src; else - father = xbt_dynar_get_ptr(path_src, index_father_src); + father = path_src[index_src + 1]; /* (5) result generation */ - xbt_dynar_push(result, father); /* first same the father of src and dst */ - xbt_dynar_push(result, current_src); /* second the first different father of src */ - xbt_dynar_push(result, current_dst); /* three the first different father of dst */ - - xbt_dynar_free(&path_src); - xbt_dynar_free(&path_dst); + *res_father = father; /* first the common father of src and dst */ + *res_src = current_src; /* second the first different father of src */ + *res_dst = current_dst; /* three the first different father of dst */ - return result; +#undef ELEMENTS_FATHER_MAXDEPTH } /* Global Business methods */ /** - * \brief Recursive function for get_route + * \brief Recursive function for get_route_latency * * \param src the source host name * \param dst the destination host name + * \param *e_route the route where the links are stored + * \param *latency the latency, if needed * - * This fuction is call by "get_route". It allow to walk through the - * routing components tree. + * This function is called by "get_route" and "get_latency". It allows to walk + * recursively through the routing components tree. */ -static route_extended_t _get_route(const char *src, const char *dst) +static void _get_route_latency(const char *src, const char *dst, + xbt_dynar_t *route, double *latency) { + XBT_DEBUG("Solve route/latency \"%s\" to \"%s\"", src, dst); + xbt_assert(src && dst, "bad parameters for \"_get_route_latency\" method"); - void *link; - unsigned int cpt = 0; - - XBT_DEBUG("Solve route \"%s\" to \"%s\"", src, dst); - - xbt_assert(src && dst, "bad parameters for \"_get_route\" method"); - - route_extended_t e_route, e_route_cnt, e_route_src = NULL, e_route_dst = - NULL; + routing_component_t common_father; + routing_component_t src_father; + routing_component_t dst_father; + elements_father(src, dst, &common_father, &src_father, &dst_father); - xbt_dynar_t elem_father_list = elements_father(src, dst); + if (src_father == dst_father) { /* SURF_ROUTING_BASE */ - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - routing_component_t src_father = - xbt_dynar_get_as(elem_father_list, 1, routing_component_t); - routing_component_t dst_father = - xbt_dynar_get_as(elem_father_list, 2, routing_component_t); - - e_route = xbt_new0(s_route_extended_t, 1); - e_route->src_gateway = NULL; - e_route->dst_gateway = NULL; - e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - - if (src_father == dst_father) { /* SURF_ROUTING_BASE */ - - if (strcmp(src, dst)) { - e_route_cnt = - (*(common_father->get_route)) (common_father, src, dst); - xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", src, - dst); - xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); - } - generic_free_extended_route(e_route_cnt); + route_extended_t e_route = NULL; + if (route) { + e_route = common_father->get_route(common_father, src, dst); + xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); + *route = e_route->generic_route.link_list; + } + if (latency) { + *latency = common_father->get_latency(common_father, src, dst, e_route); + xbt_assert(*latency >= 0.0, + "latency error on route between \"%s\" and \"%s\"", src, dst); + } + if (e_route) { + xbt_free(e_route->src_gateway); + xbt_free(e_route->dst_gateway); + xbt_free(e_route); } } else { /* SURF_ROUTING_RECURSIVE */ route_extended_t e_route_bypass = NULL; - if (common_father->get_bypass_route) - e_route_bypass = - (*(common_father->get_bypass_route)) (common_father, src, dst); + e_route_bypass = common_father->get_bypass_route(common_father, src, dst); - if (e_route_bypass) - e_route_cnt = e_route_bypass; - else - e_route_cnt = - (*(common_father->get_route)) (common_father, src_father->name, - dst_father->name); + xbt_assert(!latency || !e_route_bypass, + "Bypass cannot work yet with get_latency"); + + route_extended_t e_route_cnt = e_route_bypass + ? e_route_bypass + : common_father->get_route(common_father, + src_father->name, dst_father->name); xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); + src_father->name, dst_father->name); xbt_assert((e_route_cnt->src_gateway == NULL) == - (e_route_cnt->dst_gateway == NULL), - "bad gateway for route between \"%s\" and \"%s\"", src, - dst); + (e_route_cnt->dst_gateway == NULL), + "bad gateway for route between \"%s\" and \"%s\"", src, dst); + + if (route) { + *route = xbt_dynar_new(global_routing->size_of_link, NULL); + } + if (latency) { + *latency = common_father->get_latency(common_father, + src_father->name, dst_father->name, + e_route_cnt); + xbt_assert(*latency >= 0.0, + "latency error on route between \"%s\" and \"%s\"", + src_father->name, dst_father->name); + } + + void *link; + unsigned int cpt; if (strcmp(src, e_route_cnt->src_gateway)) { - e_route_src = _get_route(src, e_route_cnt->src_gateway); - xbt_assert(e_route_src, "no route between \"%s\" and \"%s\"", src, - e_route_cnt->src_gateway); - xbt_dynar_foreach(e_route_src->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + double latency_src; + xbt_dynar_t route_src; + + _get_route_latency(src, e_route_cnt->src_gateway, + (route ? &route_src : NULL), + (latency ? &latency_src : NULL)); + if (route) { + xbt_assert(route_src, "no route between \"%s\" and \"%s\"", + src, e_route_cnt->src_gateway); + xbt_dynar_foreach(route_src, cpt, link) { + xbt_dynar_push(*route, &link); + } + xbt_dynar_free(&route_src); + } + if (latency) { + xbt_assert(latency_src >= 0.0, + "latency error on route between \"%s\" and \"%s\"", + src, e_route_cnt->src_gateway); + *latency += latency_src; } } - xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + if (route) { + xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { + xbt_dynar_push(*route, &link); + } } if (strcmp(e_route_cnt->dst_gateway, dst)) { - e_route_dst = _get_route(e_route_cnt->dst_gateway, dst); - xbt_assert(e_route_dst, "no route between \"%s\" and \"%s\"", - e_route_cnt->dst_gateway, dst); - xbt_dynar_foreach(e_route_dst->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + double latency_dst; + xbt_dynar_t route_dst; + + _get_route_latency(e_route_cnt->dst_gateway, dst, + (route ? &route_dst : NULL), + (latency ? &latency_dst : NULL)); + if (route) { + xbt_assert(route_dst, "no route between \"%s\" and \"%s\"", + e_route_cnt->dst_gateway, dst); + xbt_dynar_foreach(route_dst, cpt, link) { + xbt_dynar_push(*route, &link); + } + xbt_dynar_free(&route_dst); + } + if (latency) { + xbt_assert(latency_dst >= 0.0, + "latency error on route between \"%s\" and \"%s\"", + e_route_cnt->dst_gateway, dst); + *latency += latency_dst; } } - e_route->src_gateway = xbt_strdup(e_route_cnt->src_gateway); - e_route->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway); - - generic_free_extended_route(e_route_src); generic_free_extended_route(e_route_cnt); - generic_free_extended_route(e_route_dst); } - - xbt_dynar_free(&elem_father_list); - - return e_route; } -static double _get_latency(const char *src, const char *dst) +/** + * \brief Generic function for get_route, get_route_no_cleanup, and get_latency + */ +static void get_route_latency(const char *src, const char *dst, + xbt_dynar_t *route, double *latency, int cleanup) { - double latency, latency_src, latency_dst = 0.0; - - XBT_DEBUG("Solve route \"%s\" to \"%s\"", src, dst); - xbt_assert(src && dst, "bad parameters for \"_get_route\" method"); - - route_extended_t e_route_cnt; - - xbt_dynar_t elem_father_list = elements_father(src, dst); - - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - routing_component_t src_father = - xbt_dynar_get_as(elem_father_list, 1, routing_component_t); - routing_component_t dst_father = - xbt_dynar_get_as(elem_father_list, 2, routing_component_t); - - if (src_father == dst_father) { /* SURF_ROUTING_BASE */ - - if (strcmp(src, dst)) { - latency = - (*(common_father->get_latency)) (common_father, src, dst); - xbt_assert(latency>=0, "no route between \"%s\" and \"%s\"", src, - dst); - } else latency = 0; - } else { /* SURF_ROUTING_RECURSIVE */ - route_extended_t e_route_bypass = NULL; - if (common_father->get_bypass_route) - e_route_bypass = - (*(common_father->get_bypass_route)) (common_father, src, dst); - - xbt_assert(!e_route_bypass,"Bypass cannot work yet with get_latency"); - - e_route_cnt = - (*(common_father->get_route)) (common_father, src_father->name, - dst_father->name); - - xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); - - xbt_assert((e_route_cnt->src_gateway == NULL) == - (e_route_cnt->dst_gateway == NULL), - "bad gateway for route between \"%s\" and \"%s\"", src, - dst); - latency = - (*(common_father->get_latency)) (common_father, elements_As_name(src), - elements_As_name(dst)); - - xbt_assert(latency>=0, "no route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); - - - if (src != e_route_cnt->src_gateway) { - - latency_src = _get_latency(src, e_route_cnt->src_gateway); - xbt_assert(latency_src>=0, "no route between \"%s\" and \"%s\"", src, - e_route_cnt->src_gateway); - latency += latency_src; - } - - if (e_route_cnt->dst_gateway != dst) { - - latency_dst = _get_latency(e_route_cnt->dst_gateway, dst); - xbt_assert(latency_dst>=0, "no route between \"%s\" and \"%s\"", - e_route_cnt->dst_gateway, dst); - latency += latency_dst; - } - + _get_route_latency(src, dst, route, latency); + xbt_assert(!route || *route, "no route between \"%s\" and \"%s\"", src, dst); + xbt_assert(!latency || *latency >= 0.0, + "latency error on route between \"%s\" and \"%s\"", src, dst); + if (route) { + xbt_dynar_free(&global_routing->last_route); + global_routing->last_route = cleanup ? *route : NULL; } - - xbt_dynar_free(&elem_father_list); - - return latency; } /** @@ -931,41 +798,30 @@ static double _get_latency(const char *src, const char *dst) */ static xbt_dynar_t get_route(const char *src, const char *dst) { + xbt_dynar_t route = NULL; + get_route_latency(src, dst, &route, NULL, 1); + return route; +} - route_extended_t e_route; - xbt_dynar_t elem_father_list = NULL; - routing_component_t common_father = NULL; - - if (strcmp(src, dst)) - e_route = _get_route(src, dst); - else { - elem_father_list = elements_father(src, dst); - common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - - e_route = (*(common_father->get_route)) (common_father, src, dst); - xbt_dynar_free(&elem_father_list); - } - - xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); - - if (global_routing->last_route) - xbt_dynar_free(&(global_routing->last_route)); - global_routing->last_route = e_route->generic_route.link_list; - - if (e_route->src_gateway) - xbt_free(e_route->src_gateway); - if (e_route->dst_gateway) - xbt_free(e_route->dst_gateway); - - xbt_free(e_route); - -/* - if (xbt_dynar_length(global_routing->last_route) == 0) +/** + * \brief Generic method: find a route between hosts + * + * \param src the source host name + * \param dst the destination host name + * + * same as get_route, but return NULL if any exception is raised. + */ +static xbt_dynar_t get_route_or_null(const char *src, const char *dst) +{ + xbt_dynar_t route = NULL; + xbt_ex_t exception; + TRY { + get_route_latency(src, dst, &route, NULL, 1); + }CATCH(exception) { + xbt_ex_free(exception); return NULL; - else -*/ - return global_routing->last_route; + } + return route; } /** @@ -980,28 +836,16 @@ static xbt_dynar_t get_route(const char *src, const char *dst) */ static xbt_dynar_t get_route_no_cleanup(const char *src, const char *dst) { - xbt_dynar_t d = get_route(src,dst); - global_routing->last_route = NULL; - return d; + xbt_dynar_t route = NULL; + get_route_latency(src, dst, &route, NULL, 0); + return route; } /*Get Latency*/ static double get_latency(const char *src, const char *dst) { - double latency = -1.0; - xbt_dynar_t elem_father_list = elements_father(src, dst); - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - - if (strcmp(src, dst)) - latency = _get_latency(src, dst); - else - latency = (*(common_father->get_latency)) (common_father, src, dst); - - xbt_assert(latency>=0.0, "no route between \"%s\" and \"%s\"", src, dst); - xbt_dynar_free(&elem_father_list); - + get_route_latency(src, dst, NULL, &latency, 0); return latency; } @@ -1106,9 +950,11 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ global_routing = xbt_new0(s_routing_global_t, 1); global_routing->root = NULL; global_routing->get_route = get_route; + global_routing->get_route_or_null = get_route_or_null; global_routing->get_latency = get_latency; global_routing->get_route_no_cleanup = get_route_no_cleanup; global_routing->get_onelink_routes = get_onelink_routes; + global_routing->get_route_latency = get_route_latency; global_routing->get_network_element_type = get_network_element_type; global_routing->finalize = finalize; global_routing->loopback = loopback; @@ -1161,7 +1007,7 @@ void surf_parse_add_callback_config(void) { surfxml_add_callback(STag_surfxml_config_cb_list, &routing_parse_Sconfig); surfxml_add_callback(ETag_surfxml_config_cb_list, &routing_parse_Econfig); - surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); + surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties_XML); surfxml_add_callback(STag_surfxml_AS_cb_list, &surf_parse_models_setup); surfxml_add_callback(STag_surfxml_random_cb_list, &routing_parse_Srandom); } @@ -1174,1767 +1020,91 @@ void surf_parse_models_setup() free(platform_filename); } -/* ************************************************************************** */ -/* *************************** FULL ROUTING ********************************* */ +/* ************************************************** */ +/* ********** PATERN FOR NEW ROUTING **************** */ + +/* The minimal configuration of a new routing model need the next functions, + * also you need to set at the start of the file, the new model in the model + * list. Remember keep the null ending of the list. + */ +/*** Routing model structure ***/ +// typedef struct { +// s_routing_component_t generic_routing; +// /* things that your routing model need */ +// } s_routing_component_NEW_t,*routing_component_NEW_t; + +/*** Parse routing model functions ***/ +// static void model_NEW_set_processing_unit(routing_component_t rc, const char* name) {} +// static void model_NEW_set_autonomous_system(routing_component_t rc, const char* name) {} +// static void model_NEW_set_route(routing_component_t rc, const char* src, const char* dst, route_t route) {} +// static void model_NEW_set_ASroute(routing_component_t rc, const char* src, const char* dst, route_extended_t route) {} +// static void model_NEW_set_bypassroute(routing_component_t rc, const char* src, const char* dst, route_extended_t e_route) {} -#define TO_ROUTE_FULL(i,j) routing->routing_table[(i)+(j)*table_size] +/*** Business methods ***/ +// static route_extended_t NEW_get_route(routing_component_t rc, const char* src,const char* dst) {return NULL;} +// static route_extended_t NEW_get_bypass_route(routing_component_t rc, const char* src,const char* dst) {return NULL;} +// static void NEW_finalize(routing_component_t rc) { xbt_free(rc);} -/* Routing model structure */ +/*** Creation routing model functions ***/ +// static void* model_NEW_create(void) { +// routing_component_NEW_t new_component = xbt_new0(s_routing_component_NEW_t,1); +// new_component->generic_routing.set_processing_unit = model_NEW_set_processing_unit; +// new_component->generic_routing.set_autonomous_system = model_NEW_set_autonomous_system; +// new_component->generic_routing.set_route = model_NEW_set_route; +// new_component->generic_routing.set_ASroute = model_NEW_set_ASroute; +// new_component->generic_routing.set_bypassroute = model_NEW_set_bypassroute; +// new_component->generic_routing.get_route = NEW_get_route; +// new_component->generic_routing.get_bypass_route = NEW_get_bypass_route; +// new_component->generic_routing.finalize = NEW_finalize; +// /* initialization of internal structures */ +// return new_component; +// } /* mandatory */ +// static void model_NEW_load(void) {} /* mandatory */ +// static void model_NEW_unload(void) {} /* mandatory */ +// static void model_NEW_end(void) {} /* mandatory */ -typedef struct { - s_routing_component_t generic_routing; - route_extended_t *routing_table; -} s_routing_component_full_t, *routing_component_full_t; +/* ************************************************************************** */ +/* ************************* GENERIC PARSE FUNCTIONS ************************ */ -/* Business methods */ -static xbt_dynar_t full_get_onelink_routes(routing_component_t rc) +void generic_set_processing_unit(routing_component_t rc, + const char *name) { - xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); - - routing_component_full_t routing = (routing_component_full_t) rc; - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - xbt_dict_cursor_t c1 = NULL, c2 = NULL; - char *k1, *d1, *k2, *d2; - xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) { - xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) { - int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k1); - int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k2); - xbt_assert(src_id - && dst_id, - "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", - src, dst); - route_extended_t route = TO_ROUTE_FULL(*src_id, *dst_id); - if (route) { - if (xbt_dynar_length(route->generic_route.link_list) == 1) { - void *link = - *(void **) xbt_dynar_get_ptr(route->generic_route.link_list, - 0); - onelink_t onelink = xbt_new0(s_onelink_t, 1); - onelink->link_ptr = link; - if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) { - onelink->src = xbt_strdup(k1); - onelink->dst = xbt_strdup(k2); - } else if (routing->generic_routing.hierarchy == - SURF_ROUTING_RECURSIVE) { - onelink->src = xbt_strdup(route->src_gateway); - onelink->dst = xbt_strdup(route->dst_gateway); - } - xbt_dynar_push(ret, &onelink); - } - } - } - } - return ret; + XBT_DEBUG("Load process unit \"%s\"", name); + int *id = xbt_new0(int, 1); + xbt_dict_t _to_index; + _to_index = current_routing->to_index; + *id = xbt_dict_length(_to_index); + xbt_dict_set(_to_index, name, id, xbt_free); } -static route_extended_t full_get_route(routing_component_t rc, - const char *src, const char *dst) +void generic_set_autonomous_system(routing_component_t rc, + const char *name) { - xbt_assert(rc && src - && dst, - "Invalid params for \"get_route\" function at AS \"%s\"", - rc->name); - - /* set utils vars */ - routing_component_full_t routing = (routing_component_full_t) rc; - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + XBT_DEBUG("Load Autonomous system \"%s\"", name); + int *id = xbt_new0(int, 1); + xbt_dict_t _to_index; + _to_index = current_routing->to_index; + *id = xbt_dict_length(_to_index); + xbt_dict_set(_to_index, name, id, xbt_free); +} - generic_src_dst_check(rc, src, dst); - int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, src); - int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, dst); - xbt_assert(src_id - && dst_id, - "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", - src, dst); +int surf_pointer_resource_cmp(const void *a, const void *b) +{ + return a != b; +} - route_extended_t e_route = NULL; - route_extended_t new_e_route = NULL; - void *link; - unsigned int cpt = 0; +int surf_link_resource_cmp(const void *a, const void *b) +{ + return !!memcmp(a,b,global_routing->size_of_link); +} - e_route = TO_ROUTE_FULL(*src_id, *dst_id); - - if (e_route) { - new_e_route = xbt_new0(s_route_extended_t, 1); - new_e_route->src_gateway = xbt_strdup(e_route->src_gateway); - new_e_route->dst_gateway = xbt_strdup(e_route->dst_gateway); - new_e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_foreach(e_route->generic_route.link_list, cpt, link) { - xbt_dynar_push(new_e_route->generic_route.link_list, &link); - } - } - return new_e_route; -} - -static void full_finalize(routing_component_t rc) -{ - routing_component_full_t routing = (routing_component_full_t) rc; - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - int i, j; - if (routing) { - /* Delete routing table */ - for (i = 0; i < table_size; i++) - for (j = 0; j < table_size; j++) - generic_free_extended_route(TO_ROUTE_FULL(i, j)); - xbt_free(routing->routing_table); - /* Delete bypass dict */ - xbt_dict_free(&rc->bypassRoutes); - /* Delete index dict */ - xbt_dict_free(&rc->to_index); - /* Delete structure */ - xbt_free(rc); - } -} - -/* Creation routing model functions */ - -static void *model_full_create(void) -{ - routing_component_full_t new_component = - xbt_new0(s_routing_component_full_t, 1); - new_component->generic_routing.set_processing_unit = - generic_set_processing_unit; - new_component->generic_routing.set_autonomous_system = - generic_set_autonomous_system; - new_component->generic_routing.set_route = model_full_set_route; - new_component->generic_routing.set_ASroute = model_full_set_route; - new_component->generic_routing.set_bypassroute = generic_set_bypassroute; - new_component->generic_routing.get_route = full_get_route; - new_component->generic_routing.get_latency = generic_get_link_latency; - new_component->generic_routing.get_onelink_routes = - full_get_onelink_routes; - new_component->generic_routing.get_bypass_route = - generic_get_bypassroute; - new_component->generic_routing.finalize = full_finalize; - new_component->generic_routing.to_index = xbt_dict_new(); - new_component->generic_routing.bypassRoutes = xbt_dict_new(); - new_component->generic_routing.get_network_element_type = get_network_element_type; - return new_component; -} - -static void model_full_load(void) -{ - /* use "surfxml_add_callback" to add a parse function call */ -} - -static void model_full_unload(void) -{ - /* use "surfxml_del_callback" to remove a parse function call */ -} - -static void model_full_end(void) -{ - unsigned int i; - route_extended_t e_route; - - /* set utils vars */ - routing_component_full_t routing = - ((routing_component_full_t) current_routing); - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - - /* Create table if necessary */ - if(!routing->routing_table) - routing->routing_table = xbt_new0(route_extended_t, table_size * table_size); - - /* Add the loopback if needed */ - if (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_route_extended_t, 1); - e_route->src_gateway = NULL; - e_route->dst_gateway = NULL; - e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_push(e_route->generic_route.link_list, - &global_routing->loopback); - TO_ROUTE_FULL(i, i) = e_route; - } - } - } -} - -static void model_full_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route) -{ - int *src_id, *dst_id; - src_id = xbt_dict_get_or_null(rc->to_index, src); - dst_id = xbt_dict_get_or_null(rc->to_index, dst); - routing_component_full_t routing = ((routing_component_full_t) rc); - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - - xbt_assert(src_id - && dst_id, "Network elements %s or %s not found", src, dst); - - xbt_assert(xbt_dynar_length(route->generic_route.link_list) > 0, - "Invalid count of links, must be greater than zero (%s,%s)", - src, dst); - - if(!routing->routing_table) - routing->routing_table = xbt_new0(route_extended_t, table_size * table_size); - - if(TO_ROUTE_FULL(*src_id, *dst_id)) - { - char * link_name; - unsigned int i; - xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_foreach(route->generic_route.link_list,i,link_name) - { - 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_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, - (void*)link_route_to_test, - (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exists. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.", src,dst); - } - else - { - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); - else{ - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, - route->src_gateway, dst, route->dst_gateway); - if(global_routing->get_network_element_type((const char*)route->dst_gateway) == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The dst_gateway '%s' does not exist!",route->dst_gateway); - if(global_routing->get_network_element_type((const char*)route->src_gateway) == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The src_gateway '%s' does not exist!",route->src_gateway); - } - TO_ROUTE_FULL(*src_id, *dst_id) = generic_new_extended_route(rc->hierarchy,route,1); - xbt_dynar_shrink(TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, 0); - } - - if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES - || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) - { - if(route->dst_gateway && route->src_gateway) - { - char *gw_src = xbt_strdup(route->src_gateway); - char *gw_dst = xbt_strdup(route->dst_gateway); - route->src_gateway = gw_dst; - route->dst_gateway = gw_src; - } - if(TO_ROUTE_FULL(*dst_id, *src_id)) - { - char * link_name; - unsigned int i; - xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); - for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--) - { - link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *); - 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_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, - (void*)link_route_to_test, - (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exists", src,dst); - } - else - { - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src); - else - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, - route->src_gateway, src, route->dst_gateway); - TO_ROUTE_FULL(*dst_id, *src_id) = generic_new_extended_route(rc->hierarchy,route,0); - xbt_dynar_shrink(TO_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, 0); - } - - } -} - -/* ************************************************************************** */ -/* *************************** FLOYD ROUTING ******************************** */ - -#define TO_FLOYD_COST(i,j) (routing->cost_table)[(i)+(j)*table_size] -#define TO_FLOYD_PRED(i,j) (routing->predecessor_table)[(i)+(j)*table_size] -#define TO_FLOYD_LINK(i,j) (routing->link_table)[(i)+(j)*table_size] - -/* Routing model structure */ - -typedef struct { - s_routing_component_t generic_routing; - /* vars for calculate the floyd algorith. */ - int *predecessor_table; - double *cost_table; - route_extended_t *link_table; /* char* -> int* */ -} s_routing_component_floyd_t, *routing_component_floyd_t; - -static route_extended_t floyd_get_route(routing_component_t rc, - const char *src, const char *dst); - -/* Business methods */ -static xbt_dynar_t floyd_get_onelink_routes(routing_component_t rc) -{ - xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); - - routing_component_floyd_t routing = (routing_component_floyd_t) rc; - //size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - xbt_dict_cursor_t c1 = NULL, c2 = NULL; - char *k1, *d1, *k2, *d2; - xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) { - xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) { - route_extended_t route = floyd_get_route(rc, k1, k2); - if (route) { - if (xbt_dynar_length(route->generic_route.link_list) == 1) { - void *link = - *(void **) xbt_dynar_get_ptr(route->generic_route.link_list, - 0); - onelink_t onelink = xbt_new0(s_onelink_t, 1); - onelink->link_ptr = link; - if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) { - onelink->src = xbt_strdup(k1); - onelink->dst = xbt_strdup(k2); - } else if (routing->generic_routing.hierarchy == - SURF_ROUTING_RECURSIVE) { - onelink->src = xbt_strdup(route->src_gateway); - onelink->dst = xbt_strdup(route->dst_gateway); - } - xbt_dynar_push(ret, &onelink); - } - } - } - } - return ret; -} - -static route_extended_t floyd_get_route(routing_component_t rc, - const char *src, const char *dst) -{ - xbt_assert(rc && src - && dst, - "Invalid params for \"get_route\" function at AS \"%s\"", - rc->name); - - /* set utils vars */ - routing_component_floyd_t routing = (routing_component_floyd_t) rc; - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - - generic_src_dst_check(rc, src, dst); - int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, src); - int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, dst); - xbt_assert(src_id - && dst_id, - "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", - src, dst); - - /* create a result route */ - route_extended_t new_e_route = xbt_new0(s_route_extended_t, 1); - new_e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - new_e_route->src_gateway = NULL; - new_e_route->dst_gateway = NULL; - - int first = 1; - int pred = *dst_id; - int prev_pred = 0; - char *gw_src = NULL, *gw_dst = - NULL, *prev_gw_src, *prev_gw_dst, *first_gw = NULL; - unsigned int cpt; - void *link; - xbt_dynar_t links; - - do { - prev_pred = pred; - pred = TO_FLOYD_PRED(*src_id, pred); - if (pred == -1) /* if no pred in route -> no route to host */ - break; - xbt_assert(TO_FLOYD_LINK(pred, prev_pred), - "Invalid link for the route between \"%s\" or \"%s\"", src, - dst); - - prev_gw_src = gw_src; - prev_gw_dst = gw_dst; - - route_extended_t e_route = TO_FLOYD_LINK(pred, prev_pred); - gw_src = e_route->src_gateway; - gw_dst = e_route->dst_gateway; - - if (first) - first_gw = gw_dst; - - if (rc->hierarchy == SURF_ROUTING_RECURSIVE && !first - && strcmp(gw_dst, prev_gw_src)) { - xbt_dynar_t e_route_as_to_as = - (*(global_routing->get_route)) (gw_dst, prev_gw_src); - xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"", - gw_dst, prev_gw_src); - links = e_route_as_to_as; - int pos = 0; - xbt_dynar_foreach(links, cpt, link) { - xbt_dynar_insert_at(new_e_route->generic_route.link_list, pos, - &link); - pos++; - } - } - - links = e_route->generic_route.link_list; - xbt_dynar_foreach(links, cpt, link) { - xbt_dynar_unshift(new_e_route->generic_route.link_list, &link); - } - first = 0; - - } while (pred != *src_id); - xbt_assert(pred != -1, "no route from host %d to %d (\"%s\" to \"%s\")", - *src_id, *dst_id, src, dst); - - if (rc->hierarchy == SURF_ROUTING_RECURSIVE) { - new_e_route->src_gateway = xbt_strdup(gw_src); - new_e_route->dst_gateway = xbt_strdup(first_gw); - } - - return new_e_route; -} - -static void floyd_finalize(routing_component_t rc) -{ - routing_component_floyd_t routing = (routing_component_floyd_t) rc; - int i, j; - size_t table_size; - if (routing) { - table_size = xbt_dict_length(routing->generic_routing.to_index); - /* Delete link_table */ - for (i = 0; i < table_size; i++) - for (j = 0; j < table_size; j++) - generic_free_extended_route(TO_FLOYD_LINK(i, j)); - xbt_free(routing->link_table); - /* Delete bypass dict */ - xbt_dict_free(&routing->generic_routing.bypassRoutes); - /* Delete index dict */ - xbt_dict_free(&(routing->generic_routing.to_index)); - /* Delete dictionary index dict, predecessor and links table */ - xbt_free(routing->predecessor_table); - /* Delete structure */ - xbt_free(rc); - } -} - -static void *model_floyd_create(void) -{ - routing_component_floyd_t new_component = - xbt_new0(s_routing_component_floyd_t, 1); - new_component->generic_routing.set_processing_unit = - generic_set_processing_unit; - new_component->generic_routing.set_autonomous_system = - generic_set_autonomous_system; - new_component->generic_routing.set_route = model_floyd_set_route; - new_component->generic_routing.set_ASroute = model_floyd_set_route; - new_component->generic_routing.set_bypassroute = generic_set_bypassroute; - new_component->generic_routing.get_route = floyd_get_route; - new_component->generic_routing.get_latency = generic_get_link_latency; - new_component->generic_routing.get_onelink_routes = - floyd_get_onelink_routes; - new_component->generic_routing.get_bypass_route = - generic_get_bypassroute; - new_component->generic_routing.finalize = floyd_finalize; - new_component->generic_routing.to_index = xbt_dict_new(); - new_component->generic_routing.bypassRoutes = xbt_dict_new(); - new_component->generic_routing.get_network_element_type = get_network_element_type; - return new_component; -} - -static void model_floyd_load(void) -{ - /* use "surfxml_add_callback" to add a parse function call */ -} - -static void model_floyd_unload(void) -{ - /* use "surfxml_del_callback" to remove a parse function call */ -} - -static void model_floyd_end(void) -{ - - routing_component_floyd_t routing = - ((routing_component_floyd_t) current_routing); - - unsigned int i, j, a, b, c; - - /* set the size of table routing */ - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - - if(!routing->link_table) - { - /* Create Cost, Predecessor and Link tables */ - routing->cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ - routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ - routing->link_table = xbt_new0(route_extended_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 (current_routing->hierarchy == SURF_ROUTING_BASE) { - for (i = 0; i < table_size; i++) { - route_extended_t e_route = TO_FLOYD_LINK(i, i); - if (!e_route) { - e_route = xbt_new0(s_route_extended_t, 1); - e_route->src_gateway = NULL; - e_route->dst_gateway = NULL; - e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_push(e_route->generic_route.link_list, - &global_routing->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 void model_floyd_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route) -{ - routing_component_floyd_t routing = (routing_component_floyd_t) rc; - - /* set the size of table routing */ - size_t table_size = xbt_dict_length(rc->to_index); - int *src_id, *dst_id; - int i,j; - - src_id = xbt_dict_get_or_null(rc->to_index, src); - dst_id = xbt_dict_get_or_null(rc->to_index, dst); - - if(!routing->link_table) - { - /* Create Cost, Predecessor and Link tables */ - routing->cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ - routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ - routing->link_table = xbt_new0(route_extended_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 */ - } - } - - if(TO_FLOYD_LINK(*src_id, *dst_id)) - { - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("See Route from \"%s\" to \"%s\"", src, dst); - else - XBT_DEBUG("See ASroute from \"%s(%s)\" to \"%s(%s)\"", src, - route->src_gateway, dst, route->dst_gateway); - char * link_name; - unsigned int cpt; - xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_foreach(route->generic_route.link_list,cpt,link_name) - { - 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(*src_id, *dst_id)->generic_route.link_list, - (void*)link_route_to_test, - (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exists", src,dst); - } - else - { - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); - else{ - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, - route->src_gateway, dst, route->dst_gateway); - if(global_routing->get_network_element_type((const char*)route->dst_gateway) == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The dst_gateway '%s' does not exist!",route->dst_gateway); - if(global_routing->get_network_element_type((const char*)route->src_gateway) == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The src_gateway '%s' does not exist!",route->src_gateway); - } - TO_FLOYD_LINK(*src_id, *dst_id) = - generic_new_extended_route(rc->hierarchy, route, 1); - TO_FLOYD_PRED(*src_id, *dst_id) = *src_id; - TO_FLOYD_COST(*src_id, *dst_id) = - ((TO_FLOYD_LINK(*src_id, *dst_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ - } - - if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES - || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) - { - if(TO_FLOYD_LINK(*dst_id, *src_id)) - { - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("See Route from \"%s\" to \"%s\"", dst, src); - else - XBT_DEBUG("See ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, - route->src_gateway, src, route->dst_gateway); - char * link_name; - unsigned int i; - xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); - for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--) - { - link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *); - 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_id, *src_id)->generic_route.link_list, - (void*)link_route_to_test, - (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exists", src,dst); - } - else - { - if(route->dst_gateway && route->src_gateway) - { - char *gw_src = xbt_strdup(route->src_gateway); - char *gw_dst = xbt_strdup(route->dst_gateway); - route->src_gateway = gw_dst; - route->dst_gateway = gw_src; - } - - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src); - else - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, - route->src_gateway, src, route->dst_gateway); - - TO_FLOYD_LINK(*dst_id, *src_id) = - generic_new_extended_route(rc->hierarchy, route, 0); - TO_FLOYD_PRED(*dst_id, *src_id) = *dst_id; - TO_FLOYD_COST(*dst_id, *src_id) = - ((TO_FLOYD_LINK(*dst_id, *src_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ - } - } -} - -/* ************************************************************************** */ -/* ********** Dijkstra & Dijkstra Cached ROUTING **************************** */ - -typedef struct { - s_routing_component_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_routing_component_dijkstra_t, *routing_component_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) -{ - route_cache_element_t elm = (route_cache_element_t) e; - if (elm) { - xbt_free(elm->pred_arr); - xbt_free(elm); - } -} - -static void graph_node_map_elem_free(void *e) -{ - graph_node_map_element_t elm = (graph_node_map_element_t) e; - if (elm) { - xbt_free(elm); - } -} - -static void graph_edge_data_free(void *e) -{ - route_extended_t e_route = (route_extended_t) e; - if (e_route) { - xbt_dynar_free(&(e_route->generic_route.link_list)); - if (e_route->src_gateway) - xbt_free(e_route->src_gateway); - if (e_route->dst_gateway) - xbt_free(e_route->dst_gateway); - xbt_free(e_route); - } -} - -/* Utility functions */ - -static xbt_node_t route_graph_new_node(routing_component_dijkstra_t rc, - int id, int graph_id) -{ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - xbt_node_t node = NULL; - graph_node_data_t data = NULL; - graph_node_map_element_t elm = NULL; - - data = xbt_new0(struct graph_node_data, 1); - data->id = id; - data->graph_id = graph_id; - node = xbt_graph_new_node(routing->route_graph, data); - - elm = xbt_new0(struct graph_node_map_element, 1); - elm->node = node; - xbt_dict_set_ext(routing->graph_node_map, (char *) (&id), sizeof(int), - (xbt_set_elm_t) elm, &graph_node_map_elem_free); - - return node; -} - -static graph_node_map_element_t -graph_node_map_search(routing_component_dijkstra_t rc, int id) -{ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - graph_node_map_element_t elm = (graph_node_map_element_t) - xbt_dict_get_or_null_ext(routing->graph_node_map, - (char *) (&id), - sizeof(int)); - return elm; -} - -/* Parsing */ - -static void route_new_dijkstra(routing_component_dijkstra_t rc, int src_id, - int dst_id, route_extended_t e_route) -{ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - 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(routing->graph_node_map, - (char *) (&src_id), - sizeof(int)); - graph_node_map_element_t dst_elm = (graph_node_map_element_t) - xbt_dict_get_or_null_ext(routing->graph_node_map, - (char *) (&dst_id), - sizeof(int)); - - - if (src_elm) - src = src_elm->node; - - if (dst_elm) - dst = dst_elm->node; - - /* add nodes if they don't exist in the graph */ - if (src_id == dst_id && src == NULL && dst == NULL) { - src = route_graph_new_node(rc, src_id, -1); - dst = src; - } else { - if (src == NULL) { - src = route_graph_new_node(rc, src_id, -1); - } - if (dst == NULL) { - dst = route_graph_new_node(rc, dst_id, -1); - } - } - - /* add link as edge to graph */ - xbt_graph_new_edge(routing->route_graph, src, dst, e_route); -} - -static void add_loopback_dijkstra(routing_component_dijkstra_t rc) -{ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - - xbt_dynar_t nodes = xbt_graph_get_nodes(routing->route_graph); - - xbt_node_t node = NULL; - unsigned int cursor2; - xbt_dynar_foreach(nodes, cursor2, node) { - xbt_dynar_t out_edges = xbt_graph_node_get_outedges(node); - xbt_edge_t edge = NULL; - unsigned int cursor; - - int found = 0; - xbt_dynar_foreach(out_edges, cursor, edge) { - xbt_node_t other_node = xbt_graph_edge_get_target(edge); - if (other_node == node) { - found = 1; - break; - } - } - - if (!found) { - route_extended_t e_route = xbt_new0(s_route_extended_t, 1); - e_route->src_gateway = NULL; - e_route->dst_gateway = NULL; - e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_push(e_route->generic_route.link_list, - &global_routing->loopback); - xbt_graph_new_edge(routing->route_graph, node, node, e_route); - } - } -} - -/* Business methods */ -static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc) -{ - xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet"); -} - -static route_extended_t dijkstra_get_route(routing_component_t rc, - const char *src, - const char *dst) -{ - xbt_assert(rc && src - && dst, - "Invalid params for \"get_route\" function at AS \"%s\"", - rc->name); - - /* set utils vars */ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - - generic_src_dst_check(rc, src, dst); - int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, src); - int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, dst); - xbt_assert(src_id - && dst_id, - "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", - src, dst); - - /* create a result route */ - route_extended_t new_e_route = xbt_new0(s_route_extended_t, 1); - new_e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - new_e_route->src_gateway = NULL; - new_e_route->dst_gateway = NULL; - - int *pred_arr = NULL; - int src_node_id = 0; - int dst_node_id = 0; - int *nodeid = NULL; - int v; - route_extended_t e_route; - int size = 0; - unsigned int cpt; - void *link; - xbt_dynar_t links = NULL; - route_cache_element_t elm = NULL; - xbt_dynar_t nodes = xbt_graph_get_nodes(routing->route_graph); - - /* Use the graph_node id mapping set to quickly find the nodes */ - graph_node_map_element_t src_elm = - graph_node_map_search(routing, *src_id); - graph_node_map_element_t dst_elm = - graph_node_map_search(routing, *dst_id); - xbt_assert(src_elm != NULL - && dst_elm != NULL, "src %d or dst %d does not exist", - *src_id, *dst_id); - src_node_id = ((graph_node_data_t) - xbt_graph_node_get_data(src_elm->node))->graph_id; - dst_node_id = ((graph_node_data_t) - xbt_graph_node_get_data(dst_elm->node))->graph_id; - - /* if the src and dst are the same *//* fixed, missing in the previous version */ - if (src_node_id == dst_node_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(routing->route_graph, node_s_v, node_e_v); - - xbt_assert(edge != NULL, "no route between host %d and %d", *src_id, - *dst_id); - - e_route = (route_extended_t) xbt_graph_edge_get_data(edge); - - links = e_route->generic_route.link_list; - xbt_dynar_foreach(links, cpt, link) { - xbt_dynar_unshift(new_e_route->generic_route.link_list, &link); - } - - return new_e_route; - } - - if (routing->cached) { - /*check if there is a cached predecessor list avail */ - elm = (route_cache_element_t) - xbt_dict_get_or_null_ext(routing->route_cache, (char *) (&src_id), - sizeof(int)); - } - - if (elm) { /* cached mode and cache hit */ - pred_arr = elm->pred_arr; - } else { /* not cached mode or cache miss */ - double *cost_arr = NULL; - xbt_heap_t pqueue = NULL; - int i = 0; - - int nr_nodes = xbt_dynar_length(nodes); - cost_arr = xbt_new0(double, nr_nodes); /* link cost from src to other hosts */ - pred_arr = xbt_new0(int, nr_nodes); /* predecessors in path from src */ - pqueue = xbt_heap_new(nr_nodes, xbt_free); - - /* initialize */ - cost_arr[src_node_id] = 0.0; - - for (i = 0; i < nr_nodes; i++) { - if (i != src_node_id) { - cost_arr[i] = DBL_MAX; - } - - pred_arr[i] = 0; - - /* initialize priority queue */ - nodeid = xbt_new0(int, 1); - *nodeid = i; - xbt_heap_push(pqueue, nodeid, cost_arr[i]); - - } - - /* apply dijkstra using the indexes from the graph's node array */ - while (xbt_heap_size(pqueue) > 0) { - int *v_id = 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; - unsigned int cursor; - - 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); - int u_id = data->graph_id; - route_extended_t tmp_e_route = - (route_extended_t) xbt_graph_edge_get_data(edge); - int cost_v_u = (tmp_e_route->generic_route.link_list)->used; /* count of links, old model assume 1 */ - - if (cost_v_u + cost_arr[*v_id] < cost_arr[u_id]) { - pred_arr[u_id] = *v_id; - cost_arr[u_id] = cost_v_u + cost_arr[*v_id]; - nodeid = xbt_new0(int, 1); - *nodeid = u_id; - xbt_heap_push(pqueue, nodeid, cost_arr[u_id]); - } - } - - /* free item popped from pqueue */ - xbt_free(v_id); - } - - xbt_free(cost_arr); - xbt_heap_free(pqueue); - } - - /* compose route path with links */ - char *gw_src = NULL, *gw_dst = - NULL, *prev_gw_src, *prev_gw_dst, *first_gw = 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(routing->route_graph, node_pred_v, node_v); - - xbt_assert(edge != NULL, "no route between host %d and %d", *src_id, - *dst_id); - - prev_gw_src = gw_src; - prev_gw_dst = gw_dst; - - e_route = (route_extended_t) xbt_graph_edge_get_data(edge); - gw_src = e_route->src_gateway; - gw_dst = e_route->dst_gateway; - - if (v == dst_node_id) - first_gw = gw_dst; - - if (rc->hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id - && strcmp(gw_dst, prev_gw_src)) { - xbt_dynar_t e_route_as_to_as = - (*(global_routing->get_route)) (gw_dst, prev_gw_src); - xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"", - gw_dst, prev_gw_src); - links = e_route_as_to_as; - int pos = 0; - xbt_dynar_foreach(links, cpt, link) { - xbt_dynar_insert_at(new_e_route->generic_route.link_list, pos, - &link); - pos++; - } - } - - links = e_route->generic_route.link_list; - xbt_dynar_foreach(links, cpt, link) { - xbt_dynar_unshift(new_e_route->generic_route.link_list, &link); - } - size++; - } - - if (rc->hierarchy == SURF_ROUTING_RECURSIVE) { - new_e_route->src_gateway = xbt_strdup(gw_src); - new_e_route->dst_gateway = xbt_strdup(first_gw); - } - - if (routing->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(routing->route_cache, (char *) (&src_id), sizeof(int), - (xbt_set_elm_t) elm, &route_cache_elem_free); - } - - if (!routing->cached) - xbt_free(pred_arr); - - return new_e_route; -} - -static void dijkstra_finalize(routing_component_t rc) -{ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - - if (routing) { - xbt_graph_free_graph(routing->route_graph, &xbt_free, - &graph_edge_data_free, &xbt_free); - xbt_dict_free(&routing->graph_node_map); - if (routing->cached) - xbt_dict_free(&routing->route_cache); - /* Delete bypass dict */ - xbt_dict_free(&routing->generic_routing.bypassRoutes); - /* Delete index dict */ - xbt_dict_free(&(routing->generic_routing.to_index)); - /* Delete structure */ - xbt_free(routing); - } -} - -/* Creation routing model functions */ - -static void *model_dijkstra_both_create(int cached) -{ - routing_component_dijkstra_t new_component = - xbt_new0(s_routing_component_dijkstra_t, 1); - new_component->generic_routing.set_processing_unit = - generic_set_processing_unit; - new_component->generic_routing.set_autonomous_system = - generic_set_autonomous_system; - new_component->generic_routing.set_route = model_dijkstra_both_set_route; - new_component->generic_routing.set_ASroute = model_dijkstra_both_set_route; - new_component->generic_routing.set_bypassroute = generic_set_bypassroute; - new_component->generic_routing.get_route = dijkstra_get_route; - new_component->generic_routing.get_latency = generic_get_link_latency; - new_component->generic_routing.get_onelink_routes = - dijkstra_get_onelink_routes; - new_component->generic_routing.get_bypass_route = - generic_get_bypassroute; - new_component->generic_routing.finalize = dijkstra_finalize; - new_component->cached = cached; - new_component->generic_routing.to_index = xbt_dict_new(); - new_component->generic_routing.bypassRoutes = xbt_dict_new(); - new_component->generic_routing.get_network_element_type = get_network_element_type; - return new_component; -} - -static void *model_dijkstra_create(void) -{ - return model_dijkstra_both_create(0); -} - -static void *model_dijkstracache_create(void) -{ - return model_dijkstra_both_create(1); -} - -static void model_dijkstra_both_load(void) -{ - /* use "surfxml_add_callback" to add a parse function call */ -} - -static void model_dijkstra_both_unload(void) -{ - /* use "surfxml_del_callback" to remove a parse function call */ -} - -static void model_dijkstra_both_end(void) -{ - routing_component_dijkstra_t routing = - (routing_component_dijkstra_t) current_routing; - - xbt_node_t node = NULL; - unsigned int cursor2; - xbt_dynar_t nodes = NULL; - - /* Create the topology graph */ - if(!routing->route_graph) - routing->route_graph = xbt_graph_new_graph(1, NULL); - if(!routing->graph_node_map) - routing->graph_node_map = xbt_dict_new(); - - if (routing->cached && !routing->route_cache) - routing->route_cache = xbt_dict_new(); - - /* Add the loopback if needed */ - if (current_routing->hierarchy == SURF_ROUTING_BASE) - add_loopback_dijkstra(routing); - - /* initialize graph indexes in nodes after graph has been built */ - nodes = xbt_graph_get_nodes(routing->route_graph); - - xbt_dynar_foreach(nodes, cursor2, node) { - graph_node_data_t data = xbt_graph_node_get_data(node); - data->graph_id = cursor2; - } - -} -static void model_dijkstra_both_set_route (routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route) -{ - routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - int *src_id, *dst_id; - src_id = xbt_dict_get_or_null(rc->to_index, src); - dst_id = xbt_dict_get_or_null(rc->to_index, dst); - - /* Create the topology graph */ - if(!routing->route_graph) - routing->route_graph = xbt_graph_new_graph(1, NULL); - if(!routing->graph_node_map) - routing->graph_node_map = xbt_dict_new(); - - if (routing->cached && !routing->route_cache) - routing->route_cache = xbt_dict_new(); - - if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES - || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) - xbt_die("Route symmetrical not supported on model dijkstra"); - - if(!route->dst_gateway && !route->src_gateway) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); - else{ - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, - route->src_gateway, dst, route->dst_gateway); - if(global_routing->get_network_element_type((const char*)route->dst_gateway) == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The dst_gateway '%s' does not exist!",route->dst_gateway); - if(global_routing->get_network_element_type((const char*)route->src_gateway) == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The src_gateway '%s' does not exist!",route->src_gateway); - } - - route_extended_t e_route = - generic_new_extended_route(current_routing->hierarchy, route, 1); - route_new_dijkstra(routing, *src_id, *dst_id, e_route); -} - -#ifdef HAVE_PCRE_LIB -/* ************************************************** */ -/* ************** RULE-BASED ROUTING **************** */ - -/* Routing model structure */ - -typedef struct { - s_routing_component_t generic_routing; - xbt_dict_t dict_processing_units; - xbt_dict_t dict_autonomous_systems; - xbt_dynar_t list_route; - xbt_dynar_t list_ASroute; -} s_routing_component_rulebased_t, *routing_component_rulebased_t; - -typedef struct s_rule_route s_rule_route_t, *rule_route_t; -typedef struct s_rule_route_extended s_rule_route_extended_t, - *rule_route_extended_t; - -struct s_rule_route { - xbt_dynar_t re_str_link; // dynar of char* - pcre *re_src; - pcre *re_dst; -}; - -struct s_rule_route_extended { - s_rule_route_t generic_rule_route; - char *re_src_gateway; - char *re_dst_gateway; -}; - -static void rule_route_free(void *e) -{ - rule_route_t *elem = (rule_route_t *) (e); - if (*elem) { - xbt_dynar_free(&(*elem)->re_str_link); - pcre_free((*elem)->re_src); - pcre_free((*elem)->re_dst); - xbt_free(*elem); - } - *elem = NULL; -} - -static void rule_route_extended_free(void *e) -{ - rule_route_extended_t *elem = (rule_route_extended_t *) e; - if (*elem) { - xbt_dynar_free(&(*elem)->generic_rule_route.re_str_link); - pcre_free((*elem)->generic_rule_route.re_src); - pcre_free((*elem)->generic_rule_route.re_dst); - xbt_free((*elem)->re_src_gateway); - xbt_free((*elem)->re_dst_gateway); - xbt_free(*elem); - } -} - -/* Parse routing model functions */ - -static void model_rulebased_set_processing_unit(routing_component_t rc, - const char *name) -{ - routing_component_rulebased_t routing = - (routing_component_rulebased_t) rc; - xbt_dict_set(routing->dict_processing_units, name, (void *) (-1), NULL); -} - -static void model_rulebased_set_autonomous_system(routing_component_t rc, - const char *name) -{ - routing_component_rulebased_t routing = - (routing_component_rulebased_t) rc; - xbt_dict_set(routing->dict_autonomous_systems, name, (void *) (-1), - NULL); -} - -static void model_rulebased_set_route(routing_component_t rc, - const char *src, const char *dst, - name_route_extended_t route) -{ - routing_component_rulebased_t routing = - (routing_component_rulebased_t) rc; - rule_route_t ruleroute = xbt_new0(s_rule_route_t, 1); - const char *error; - int erroffset; - ruleroute->re_src = pcre_compile(src, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute->re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, src, error); - ruleroute->re_dst = pcre_compile(dst, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute->re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, dst, error); - ruleroute->re_str_link = route->generic_route.link_list; - xbt_dynar_push(routing->list_route, &ruleroute); - xbt_free(route); -} - -static void model_rulebased_set_ASroute(routing_component_t rc, - const char *src, const char *dst, - name_route_extended_t route) -{ - routing_component_rulebased_t routing = - (routing_component_rulebased_t) rc; - rule_route_extended_t ruleroute_e = xbt_new0(s_rule_route_extended_t, 1); - const char *error; - int erroffset; - ruleroute_e->generic_rule_route.re_src = - pcre_compile(src, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute_e->generic_rule_route.re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, src, error); - ruleroute_e->generic_rule_route.re_dst = - pcre_compile(dst, 0, &error, &erroffset, NULL); - xbt_assert(ruleroute_e->generic_rule_route.re_src, - "PCRE compilation failed at offset %d (\"%s\"): %s\n", - erroffset, dst, error); - ruleroute_e->generic_rule_route.re_str_link = - route->generic_route.link_list; - ruleroute_e->re_src_gateway = route->src_gateway; - ruleroute_e->re_dst_gateway = route->dst_gateway; - xbt_dynar_push(routing->list_ASroute, &ruleroute_e); -// xbt_free(route->src_gateway); -// xbt_free(route->dst_gateway); - xbt_free(route); -} - -static void model_rulebased_set_bypassroute(routing_component_t rc, - const char *src, - const char *dst, - route_extended_t e_route) -{ - xbt_die("bypass routing not supported for Route-Based model"); -} - -#define BUFFER_SIZE 4096 /* result buffer size */ -#define OVECCOUNT 30 /* should be a multiple of 3 */ - -static char *remplace(char *value, const char **src_list, int src_size, - const char **dst_list, int dst_size) -{ - - char result_result[BUFFER_SIZE]; - int i_result_buffer; - int value_length = (int) strlen(value); - int number = 0; - - int i = 0; - i_result_buffer = 0; - do { - if (value[i] == '$') { - i++; // skip $ - - // find the number - int number_length = 0; - while ('0' <= value[i + number_length] - && value[i + number_length] <= '9') { - number_length++; - } - xbt_assert(number_length != 0, - "bad string parameter, no number indication, at offset: %d (\"%s\")", - i, value); - - // solve number - number = atoi(value + i); - i = i + number_length; - xbt_assert(i + 2 < value_length, - "bad string parameter, too few chars, at offset: %d (\"%s\")", - i, value); - - // solve the indication - const char **param_list; - int param_size; - if (value[i] == 's' && value[i + 1] == 'r' && value[i + 2] == 'c') { - param_list = src_list; - param_size = src_size; - } else if (value[i] == 'd' && value[i + 1] == 's' - && value[i + 2] == 't') { - param_list = dst_list; - param_size = dst_size; - } else { - xbt_die("bad string parameter, support only \"src\" and \"dst\", " - "at offset: %d (\"%s\")", i, value); - } - i = i + 3; - - xbt_assert(param_size >= number, - "bad string parameter, not enough length param_size, at offset: %d (\"%s\") %d %d", - i, value, param_size, number); - - const char *param = param_list[number]; - int size = strlen(param); - int cp; - for (cp = 0; cp < size; cp++) { - result_result[i_result_buffer] = param[cp]; - i_result_buffer++; - if (i_result_buffer >= BUFFER_SIZE) - break; - } - } else { - result_result[i_result_buffer] = value[i]; - i_result_buffer++; - i++; // next char - } - - } while (i < value_length && i_result_buffer < BUFFER_SIZE); - - xbt_assert(i_result_buffer < BUFFER_SIZE, - "solving string \"%s\", small buffer size (%d)", value, - BUFFER_SIZE); - result_result[i_result_buffer] = 0; - return xbt_strdup(result_result); -} - -static route_extended_t rulebased_get_route(routing_component_t rc, - const char *src, - const char *dst); -static xbt_dynar_t rulebased_get_onelink_routes(routing_component_t rc) -{ - xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); - routing_component_rulebased_t routing = (routing_component_rulebased_t)rc; - - xbt_dict_cursor_t c1 = NULL; - char *k1, *d1; - - //find router - char *router = NULL; - xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) { - if (strstr (k1, "router")){ - router = k1; - } - } - if (!router){ - xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); - } - - xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) { - route_extended_t route = rulebased_get_route (rc, router, k1); - - int number_of_links = xbt_dynar_length(route->generic_route.link_list); - if (number_of_links != 3) { - xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); - } - - void *link_ptr; - xbt_dynar_get_cpy (route->generic_route.link_list, 2, &link_ptr); - onelink_t onelink = xbt_new0 (s_onelink_t, 1); - onelink->src = xbt_strdup (k1); - onelink->dst = xbt_strdup (router); - onelink->link_ptr = link_ptr; - xbt_dynar_push (ret, &onelink); - } - return ret; -} - -/* Business methods */ -static route_extended_t rulebased_get_route(routing_component_t rc, - const char *src, - const char *dst) -{ - xbt_assert(rc && src - && dst, - "Invalid params for \"get_route\" function at AS \"%s\"", - rc->name); - - /* set utils vars */ - routing_component_rulebased_t routing = - (routing_component_rulebased_t) rc; - - int are_processing_units=0; - xbt_dynar_t rule_list; - if (xbt_dict_get_or_null(routing->dict_processing_units, src) - && xbt_dict_get_or_null(routing->dict_processing_units, dst)) { - are_processing_units = 1; - rule_list = routing->list_route; - } else if (xbt_dict_get_or_null(routing->dict_autonomous_systems, src) - && xbt_dict_get_or_null(routing->dict_autonomous_systems, - dst)) { - are_processing_units = 0; - rule_list = routing->list_ASroute; - } else - xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found in " - "the local table", src, dst); - - int rc_src = -1; - int rc_dst = -1; - int src_length = (int) strlen(src); - int dst_length = (int) strlen(dst); - - xbt_dynar_t links_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - - rule_route_t ruleroute; - unsigned int cpt; - int ovector_src[OVECCOUNT]; - int ovector_dst[OVECCOUNT]; - const char **list_src = NULL; - const char **list_dst = NULL; - int res; - xbt_dynar_foreach(rule_list, cpt, ruleroute) { - rc_src = - pcre_exec(ruleroute->re_src, NULL, src, src_length, 0, 0, - ovector_src, OVECCOUNT); - if (rc_src >= 0) { - rc_dst = - pcre_exec(ruleroute->re_dst, NULL, dst, dst_length, 0, 0, - ovector_dst, OVECCOUNT); - if (rc_dst >= 0) { - res = pcre_get_substring_list(src, ovector_src, rc_src, &list_src); - xbt_assert(!res, "error solving substring list for src \"%s\"", src); - res = pcre_get_substring_list(dst, ovector_dst, rc_dst, &list_dst); - xbt_assert(!res, "error solving substring list for src \"%s\"", dst); - char *link_name; - xbt_dynar_foreach(ruleroute->re_str_link, cpt, link_name) { - char *new_link_name = - remplace(link_name, list_src, rc_src, list_dst, rc_dst); - void *link = - xbt_lib_get_or_null(link_lib, new_link_name, SURF_LINK_LEVEL); - if (link) - xbt_dynar_push(links_list, &link); - else - THROWF(mismatch_error, 0, "Link %s not found", new_link_name); - xbt_free(new_link_name); - } - } - } - if (rc_src >= 0 && rc_dst >= 0) - break; - } - - route_extended_t new_e_route = NULL; - if (rc_src >= 0 && rc_dst >= 0) { - new_e_route = xbt_new0(s_route_extended_t, 1); - new_e_route->generic_route.link_list = links_list; - } else if (!strcmp(src, dst) && are_processing_units) { - new_e_route = xbt_new0(s_route_extended_t, 1); - xbt_dynar_push(links_list, &(global_routing->loopback)); - new_e_route->generic_route.link_list = links_list; - } else { - xbt_dynar_free(&link_list); - } - - if (!are_processing_units && new_e_route) { - rule_route_extended_t ruleroute_extended = - (rule_route_extended_t) ruleroute; - new_e_route->src_gateway = - remplace(ruleroute_extended->re_src_gateway, list_src, rc_src, - list_dst, rc_dst); - new_e_route->dst_gateway = - remplace(ruleroute_extended->re_dst_gateway, list_src, rc_src, - list_dst, rc_dst); - } - - if (list_src) - pcre_free_substring_list(list_src); - if (list_dst) - pcre_free_substring_list(list_dst); - - return new_e_route; -} - -static route_extended_t rulebased_get_bypass_route(routing_component_t rc, - const char *src, - const char *dst) -{ - return NULL; -} - -static void rulebased_finalize(routing_component_t rc) -{ - routing_component_rulebased_t routing = - (routing_component_rulebased_t) rc; - if (routing) { - xbt_dict_free(&routing->dict_processing_units); - xbt_dict_free(&routing->dict_autonomous_systems); - xbt_dynar_free(&routing->list_route); - xbt_dynar_free(&routing->list_ASroute); - /* Delete structure */ - xbt_free(routing); - } -} - -/* Creation routing model functions */ -static void *model_rulebased_create(void) -{ - routing_component_rulebased_t new_component = - xbt_new0(s_routing_component_rulebased_t, 1); - new_component->generic_routing.set_processing_unit = - model_rulebased_set_processing_unit; - new_component->generic_routing.set_autonomous_system = - model_rulebased_set_autonomous_system; - new_component->generic_routing.set_route = model_rulebased_set_route; - new_component->generic_routing.set_ASroute = model_rulebased_set_ASroute; - new_component->generic_routing.set_bypassroute = model_rulebased_set_bypassroute; - new_component->generic_routing.get_onelink_routes = rulebased_get_onelink_routes; - new_component->generic_routing.get_route = rulebased_get_route; - new_component->generic_routing.get_latency = generic_get_link_latency; - new_component->generic_routing.get_bypass_route = rulebased_get_bypass_route; - new_component->generic_routing.finalize = rulebased_finalize; - new_component->generic_routing.get_network_element_type = get_network_element_type; - /* initialization of internal structures */ - new_component->dict_processing_units = xbt_dict_new(); - new_component->dict_autonomous_systems = xbt_dict_new(); - new_component->list_route = xbt_dynar_new(sizeof(rule_route_t), &rule_route_free); - new_component->list_ASroute = - xbt_dynar_new(sizeof(rule_route_extended_t), - &rule_route_extended_free); - return new_component; -} - -static void model_rulebased_load(void) -{ - /* use "surfxml_add_callback" to add a parse function call */ -} - -static void model_rulebased_unload(void) -{ - /* use "surfxml_del_callback" to remove a parse function call */ -} - -static void model_rulebased_end(void) -{ -} - -#endif /* HAVE_PCRE_LIB */ - -/* ************************************************************************** */ -/* ******************************* NO ROUTING ******************************* */ - -/* Routing model structure */ -typedef struct { - s_routing_component_t generic_routing; -} s_routing_component_none_t, *routing_component_none_t; - -/* Business methods */ -static xbt_dynar_t none_get_onelink_routes(routing_component_t rc) -{ - return NULL; -} - -static route_extended_t none_get_route(routing_component_t rc, - const char *src, const char *dst) -{ - return NULL; -} - -static route_extended_t none_get_bypass_route(routing_component_t rc, - const char *src, - const char *dst) -{ - return NULL; -} - -static void none_finalize(routing_component_t rc) -{ - xbt_free(rc); -} - -static void none_set_processing_unit(routing_component_t rc, - const char *name) -{ -} - -static void none_set_autonomous_system(routing_component_t rc, - const char *name) -{ -} - -/* Creation routing model functions */ -static void *model_none_create(void) -{ - routing_component_none_t new_component = - xbt_new0(s_routing_component_none_t, 1); - new_component->generic_routing.set_processing_unit = - none_set_processing_unit; - new_component->generic_routing.set_autonomous_system = - none_set_autonomous_system; - new_component->generic_routing.set_route = NULL; - new_component->generic_routing.set_ASroute = NULL; - new_component->generic_routing.set_bypassroute = NULL; - new_component->generic_routing.get_route = none_get_route; - new_component->generic_routing.get_onelink_routes = - none_get_onelink_routes; - new_component->generic_routing.get_bypass_route = none_get_bypass_route; - new_component->generic_routing.finalize = none_finalize; - return new_component; -} - -static void model_none_load(void) -{ -} - -static void model_none_unload(void) -{ -} - -static void model_none_end(void) -{ -} - -/* ************************************************** */ -/* ********** PATERN FOR NEW ROUTING **************** */ - -/* The minimal configuration of a new routing model need the next functions, - * also you need to set at the start of the file, the new model in the model - * list. Remember keep the null ending of the list. - */ -/*** Routing model structure ***/ -// typedef struct { -// s_routing_component_t generic_routing; -// /* things that your routing model need */ -// } s_routing_component_NEW_t,*routing_component_NEW_t; - -/*** Parse routing model functions ***/ -// static void model_NEW_set_processing_unit(routing_component_t rc, const char* name) {} -// static void model_NEW_set_autonomous_system(routing_component_t rc, const char* name) {} -// static void model_NEW_set_route(routing_component_t rc, const char* src, const char* dst, route_t route) {} -// static void model_NEW_set_ASroute(routing_component_t rc, const char* src, const char* dst, route_extended_t route) {} -// static void model_NEW_set_bypassroute(routing_component_t rc, const char* src, const char* dst, route_extended_t e_route) {} - -/*** Business methods ***/ -// static route_extended_t NEW_get_route(routing_component_t rc, const char* src,const char* dst) {return NULL;} -// static route_extended_t NEW_get_bypass_route(routing_component_t rc, const char* src,const char* dst) {return NULL;} -// static void NEW_finalize(routing_component_t rc) { xbt_free(rc);} - -/*** Creation routing model functions ***/ -// static void* model_NEW_create(void) { -// routing_component_NEW_t new_component = xbt_new0(s_routing_component_NEW_t,1); -// new_component->generic_routing.set_processing_unit = model_NEW_set_processing_unit; -// new_component->generic_routing.set_autonomous_system = model_NEW_set_autonomous_system; -// new_component->generic_routing.set_route = model_NEW_set_route; -// new_component->generic_routing.set_ASroute = model_NEW_set_ASroute; -// new_component->generic_routing.set_bypassroute = model_NEW_set_bypassroute; -// new_component->generic_routing.get_route = NEW_get_route; -// new_component->generic_routing.get_bypass_route = NEW_get_bypass_route; -// new_component->generic_routing.finalize = NEW_finalize; -// /* initialization of internal structures */ -// return new_component; -// } /* mandatory */ -// static void model_NEW_load(void) {} /* mandatory */ -// static void model_NEW_unload(void) {} /* mandatory */ -// static void model_NEW_end(void) {} /* mandatory */ - -/* ************************************************************************** */ -/* ************************* GENERIC PARSE FUNCTIONS ************************ */ - -static void generic_set_processing_unit(routing_component_t rc, - const char *name) -{ - XBT_DEBUG("Load process unit \"%s\"", name); - int *id = xbt_new0(int, 1); - xbt_dict_t _to_index; - _to_index = current_routing->to_index; - *id = xbt_dict_length(_to_index); - xbt_dict_set(_to_index, name, id, xbt_free); -} - -static void generic_set_autonomous_system(routing_component_t rc, - const char *name) -{ - XBT_DEBUG("Load Autonomous system \"%s\"", name); - int *id = xbt_new0(int, 1); - xbt_dict_t _to_index; - _to_index = current_routing->to_index; - *id = xbt_dict_length(_to_index); - xbt_dict_set(_to_index, name, id, xbt_free); -} - -static int surf_pointer_resource_cmp(const void *a, const void *b) -{ - return a != b; -} - -static int surf_link_resource_cmp(const void *a, const void *b) -{ - return !!memcmp(a,b,global_routing->size_of_link); -} - -static void generic_set_bypassroute(routing_component_t rc, - const char *src, const char *dst, - route_extended_t e_route) -{ - XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst); - xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; - char *route_name; +void generic_set_bypassroute(routing_component_t rc, + const char *src, const char *dst, + route_extended_t e_route) +{ + XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst); + xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; + char *route_name; route_name = bprintf("%s#%s", src, dst); xbt_assert(xbt_dynar_length(e_route->generic_route.link_list) > 0, @@ -2957,27 +1127,30 @@ static void generic_set_bypassroute(routing_component_t rc, /* ************************************************************************** */ /* *********************** GENERIC BUSINESS METHODS ************************* */ -static double generic_get_link_latency(routing_component_t rc, - const char *src, const char *dst) +double generic_get_link_latency(routing_component_t rc, + const char *src, const char *dst, + route_extended_t route) { - route_extended_t route = rc->get_route(rc,src,dst); + int need_to_clean = route?0:1; void * link; unsigned int i; double latency = 0.0; + route = route?route:rc->get_route(rc,src,dst); + xbt_dynar_foreach(route->generic_route.link_list,i,link) { latency += get_link_latency(link); } - generic_free_extended_route(route); + if(need_to_clean) generic_free_extended_route(route); return latency; } -static xbt_dynar_t generic_get_onelink_routes(routing_component_t rc) +xbt_dynar_t generic_get_onelink_routes(routing_component_t rc) { xbt_die("\"generic_get_onelink_routes\" not implemented yet"); } -static route_extended_t generic_get_bypassroute(routing_component_t rc, +route_extended_t generic_get_bypassroute(routing_component_t rc, const char *src, const char *dst) { @@ -3023,9 +1196,8 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, current_src = xbt_dynar_get_ptr(path_src, index_src); current_dst = xbt_dynar_get_ptr(path_dst, index_dst); while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) { - routing_component_t *tmp_src, *tmp_dst; - tmp_src = xbt_dynar_pop_ptr(path_src); - tmp_dst = xbt_dynar_pop_ptr(path_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); @@ -3114,7 +1286,7 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, /* ************************************************************************** */ /* ************************* GENERIC AUX FUNCTIONS ************************** */ -static route_t +route_t generic_new_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order) { @@ -3152,7 +1324,7 @@ generic_new_route(e_surf_routing_hierarchy_t hierarchy, return new_route; } -static route_extended_t +route_extended_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order) { @@ -3186,8 +1358,8 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, links = e_route->generic_route.link_list; /* remeber not erase the gateway names */ - new_e_route->src_gateway = e_route->src_gateway; - new_e_route->dst_gateway = e_route->dst_gateway; + new_e_route->src_gateway = strdup(e_route->src_gateway); + new_e_route->dst_gateway = strdup(e_route->dst_gateway); } links_id = new_e_route->generic_route.link_list; @@ -3208,7 +1380,7 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, return new_e_route; } -static void generic_free_route(route_t route) +void generic_free_route(route_t route) { if (route) { xbt_dynar_free(&(route->link_list)); @@ -3216,7 +1388,7 @@ static void generic_free_route(route_t route) } } -static void generic_free_extended_route(route_extended_t e_route) +void generic_free_extended_route(route_extended_t e_route) { if (e_route) { xbt_dynar_free(&(e_route->generic_route.link_list)); @@ -3247,7 +1419,7 @@ static routing_component_t generic_as_exist(routing_component_t find_from, return NULL; } -static routing_component_t +routing_component_t generic_autonomous_system_exist(routing_component_t rc, char *element) { //return rc; // FIXME: BYPASSERROR OF FOREACH WITH BREAK @@ -3273,7 +1445,7 @@ generic_autonomous_system_exist(routing_component_t rc, char *element) return NULL; } -static routing_component_t +routing_component_t generic_processing_units_exist(routing_component_t rc, char *element) { routing_component_t element_as; @@ -3285,7 +1457,7 @@ generic_processing_units_exist(routing_component_t rc, char *element) return generic_as_exist(rc, element_as); } -static void generic_src_dst_check(routing_component_t rc, const char *src, +void generic_src_dst_check(routing_component_t rc, const char *src, const char *dst) { @@ -3305,8 +1477,8 @@ static void generic_src_dst_check(routing_component_t rc, const char *src, xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS", src, src_as->name, dst, dst_as->name); if(rc != dst_as) - xbt_die("The routing component of src and dst is not the same as the network elements belong (%s==%s)", - rc->name, dst_as->name); + xbt_die("The routing component of src'%s' and dst'%s' is not the same as the network elements belong (%s?=%s?=%s)", + src,dst,src_as->name, dst_as->name,rc->name); } static void routing_parse_Sconfig(void) @@ -3331,7 +1503,7 @@ static void routing_parse_Econfig(void) XBT_DEBUG("End configuration name = %s",A_surfxml_config_id); } -static void routing_parse_Scluster(void) +void routing_parse_Scluster(void) { static int AX_ptr = 0; @@ -3351,7 +1523,7 @@ static void routing_parse_Scluster(void) char *cluster_availability_file = A_surfxml_cluster_availability_file; char *cluster_state_file = A_surfxml_cluster_state_file; char *host_id, *groups, *link_id = NULL; - char *router_id, *link_router, *link_backbone; + char *router_id = xbt_strdup(A_surfxml_cluster_router_id); char *availability_file = xbt_strdup(cluster_availability_file); char *state_file = xbt_strdup(cluster_state_file); @@ -3362,9 +1534,7 @@ static void routing_parse_Scluster(void) xbt_dict_set(patterns,"prefix",cluster_prefix,NULL); xbt_dict_set(patterns,"suffix",cluster_suffix,NULL); -#ifdef HAVE_PCRE_LIB char *route_src_dst; -#endif unsigned int iter; int start, end, i; xbt_dynar_t radical_elements; @@ -3372,12 +1542,6 @@ static void routing_parse_Scluster(void) int cluster_sharing_policy = AX_surfxml_cluster_sharing_policy; int cluster_bb_sharing_policy = AX_surfxml_cluster_bb_sharing_policy; -#ifndef HAVE_PCRE_LIB - xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL); - char *route_src, *route_dst; - int j; -#endif - static unsigned int surfxml_buffer_stack_stack_ptr = 1; static unsigned int surfxml_buffer_stack_stack[1024]; @@ -3386,15 +1550,8 @@ static void routing_parse_Scluster(void) surfxml_bufferstack_push(1); SURFXML_BUFFER_SET(AS_id, cluster_id); -#ifdef HAVE_PCRE_LIB SURFXML_BUFFER_SET(AS_routing, "RuleBased"); - SURFXML_BUFFER_SET(AS_coordinates, ""); XBT_DEBUG("", cluster_id); -#else - SURFXML_BUFFER_SET(AS_routing, "Full"); - SURFXML_BUFFER_SET(AS_coordinates, ""); - XBT_DEBUG("", cluster_id); -#endif SURFXML_START_TAG(AS); radical_elements = xbt_str_split(cluster_radical, ","); @@ -3405,9 +1562,6 @@ static void routing_parse_Scluster(void) surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *)); host_id = bprintf("%s%d%s", cluster_prefix, start, cluster_suffix); -#ifndef HAVE_PCRE_LIB - xbt_dynar_push_as(tab_elements_num, int, start); -#endif link_id = bprintf("%s_link_%d", cluster_id, start); xbt_dict_set(patterns, "radical", bprintf("%d", start), xbt_free); @@ -3467,9 +1621,6 @@ static void routing_parse_Scluster(void) surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); for (i = start; i <= end; i++) { host_id = bprintf("%s%d%s", cluster_prefix, i, cluster_suffix); -#ifndef HAVE_PCRE_LIB - xbt_dynar_push_as(tab_elements_num, int, i); -#endif link_id = bprintf("%s_link_%d", cluster_id, i); xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free); @@ -3532,11 +1683,8 @@ static void routing_parse_Scluster(void) xbt_dynar_free(&radical_elements); XBT_DEBUG(" "); - router_id = - bprintf("%s%s_router%s", cluster_prefix, cluster_id, - cluster_suffix); - link_router = bprintf("%s_link_%s_router", cluster_id, cluster_id); - link_backbone = bprintf("%s_backbone", cluster_id); + if(!strcmp(router_id,"")) + router_id = bprintf("%s%s_router%s", cluster_prefix, cluster_id, cluster_suffix); XBT_DEBUG("", router_id); SURFXML_BUFFER_SET(router_id, router_id); @@ -3544,31 +1692,8 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(router); SURFXML_END_TAG(router); - //TODO - xbt_dict_set(patterns, "radical", xbt_strdup("_router"), xbt_free); - temp_cluster_bw = xbt_strdup(cluster_bw); - temp_cluster_bw = replace_random_parameter(temp_cluster_bw); - temp_cluster_lat = xbt_strdup(cluster_lat); - temp_cluster_lat = replace_random_parameter(temp_cluster_lat); - XBT_DEBUG("", link_router,temp_cluster_bw, temp_cluster_lat); - A_surfxml_link_state = A_surfxml_link_state_ON; - A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; - if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) - {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;} - if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE) - {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;} - SURFXML_BUFFER_SET(link_id, link_router); - SURFXML_BUFFER_SET(link_bandwidth, temp_cluster_bw); - SURFXML_BUFFER_SET(link_latency, temp_cluster_lat); - SURFXML_BUFFER_SET(link_bandwidth_file, ""); - SURFXML_BUFFER_SET(link_latency_file, ""); - SURFXML_BUFFER_SET(link_state_file, ""); - SURFXML_START_TAG(link); - SURFXML_END_TAG(link); - - xbt_free(temp_cluster_bw); - xbt_free(temp_cluster_lat); - + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ + char *link_backbone = bprintf("%s_backbone", cluster_id); XBT_DEBUG("", link_backbone,cluster_bb_bw, cluster_bb_lat); A_surfxml_link_state = A_surfxml_link_state_ON; A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; @@ -3582,10 +1707,11 @@ static void routing_parse_Scluster(void) SURFXML_BUFFER_SET(link_state_file, ""); SURFXML_START_TAG(link); SURFXML_END_TAG(link); + free(link_backbone); + } XBT_DEBUG(" "); -#ifdef HAVE_PCRE_LIB char *new_suffix = xbt_strdup(""); radical_elements = xbt_str_split(cluster_suffix, "."); @@ -3604,6 +1730,80 @@ static void routing_parse_Scluster(void) char *pcre_link_backbone = bprintf("%s_backbone", cluster_id); char *pcre_link_dst = bprintf("%s_link_$1dst", cluster_id); + //from router to router + XBT_DEBUG(""); + SURFXML_BUFFER_SET(route_src, router_id); + SURFXML_BUFFER_SET(route_dst, router_id); + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; + SURFXML_START_TAG(route); + + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ + XBT_DEBUG("", pcre_link_backbone); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + } + + XBT_DEBUG(""); + SURFXML_END_TAG(route); + + //from host to router + XBT_DEBUG(""); + SURFXML_BUFFER_SET(route_src, route_src_dst); + SURFXML_BUFFER_SET(route_dst, router_id); + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; + SURFXML_START_TAG(route); + + XBT_DEBUG("", pcre_link_src); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_src); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) + {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ + XBT_DEBUG("", pcre_link_backbone); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + } + + XBT_DEBUG(""); + SURFXML_END_TAG(route); + + //from router to host + XBT_DEBUG(""); + SURFXML_BUFFER_SET(route_src, router_id); + SURFXML_BUFFER_SET(route_dst, route_src_dst); + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; + SURFXML_START_TAG(route); + + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ + XBT_DEBUG("", pcre_link_backbone); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + } + + XBT_DEBUG("", pcre_link_dst); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_dst); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) + {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + XBT_DEBUG(""); + SURFXML_END_TAG(route); + + //from host to host XBT_DEBUG(""); SURFXML_BUFFER_SET(route_src, route_src_dst); @@ -3619,11 +1819,13 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ XBT_DEBUG("", pcre_link_backbone); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + } XBT_DEBUG("", pcre_link_dst); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_dst); @@ -3640,83 +1842,8 @@ static void routing_parse_Scluster(void) free(pcre_link_backbone); free(pcre_link_src); free(route_src_dst); -#else - for (i = 0; i <= xbt_dynar_length(tab_elements_num); i++) { - for (j = 0; j <= xbt_dynar_length(tab_elements_num); j++) { - if (i == xbt_dynar_length(tab_elements_num)) { - route_src = router_id; - } else { - route_src = - bprintf("%s%d%s", cluster_prefix, - xbt_dynar_get_as(tab_elements_num, i, int), - cluster_suffix); - } - - if (j == xbt_dynar_length(tab_elements_num)) { - route_dst = router_id; - } else { - route_dst = - bprintf("%s%d%s", cluster_prefix, - xbt_dynar_get_as(tab_elements_num, j, int), - cluster_suffix); - } - - XBT_DEBUG(""); - SURFXML_BUFFER_SET(route_src, route_src); - SURFXML_BUFFER_SET(route_dst, route_dst); - A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; - SURFXML_START_TAG(route); - - if (i == xbt_dynar_length(tab_elements_num)) { - route_src = link_router; - } else { - route_src = - bprintf("%s_link_%d", cluster_id, - xbt_dynar_get_as(tab_elements_num, i, int)); - } - - if (j == xbt_dynar_length(tab_elements_num)) { - route_dst = link_router; - } else { - route_dst = - bprintf("%s_link_%d", cluster_id, - xbt_dynar_get_as(tab_elements_num, j, int)); - } - - XBT_DEBUG("", route_src); - SURFXML_BUFFER_SET(link_ctn_id, route_src); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) - {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - - XBT_DEBUG("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone", cluster_id)); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - - XBT_DEBUG("", route_dst); - SURFXML_BUFFER_SET(link_ctn_id, route_dst); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) - {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;} - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - - XBT_DEBUG(""); - SURFXML_END_TAG(route); - } - } - xbt_dynar_free(&tab_elements_num); - -#endif free(router_id); - free(link_backbone); - free(link_router); xbt_dict_free(&patterns); free(availability_file); free(state_file); @@ -3781,7 +1908,6 @@ static void routing_parse_Speer(void) surfxml_bufferstack_push(1); SURFXML_BUFFER_SET(AS_id, peer_id); - SURFXML_BUFFER_SET(AS_coordinates, peer_coord); SURFXML_BUFFER_SET(AS_routing, "Full"); XBT_DEBUG("", peer_id); diff --git a/src/surf/surf_routing_dijkstra.c b/src/surf/surf_routing_dijkstra.c new file mode 100644 index 0000000000..6a89c34957 --- /dev/null +++ b/src/surf/surf_routing_dijkstra.c @@ -0,0 +1,564 @@ +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is 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_global_t global_routing; +extern routing_component_t current_routing; +extern model_type_t current_routing_model; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf"); + +typedef struct { + s_routing_component_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_routing_component_dijkstra_t, *routing_component_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) +{ + route_cache_element_t elm = (route_cache_element_t) e; + if (elm) { + xbt_free(elm->pred_arr); + xbt_free(elm); + } +} + +static void graph_node_map_elem_free(void *e) +{ + graph_node_map_element_t elm = (graph_node_map_element_t) e; + if (elm) { + xbt_free(elm); + } +} + +static void graph_edge_data_free(void *e) +{ + route_extended_t e_route = (route_extended_t) e; + if (e_route) { + xbt_dynar_free(&(e_route->generic_route.link_list)); + if (e_route->src_gateway) + xbt_free(e_route->src_gateway); + if (e_route->dst_gateway) + xbt_free(e_route->dst_gateway); + xbt_free(e_route); + } +} + +/* Utility functions */ + +static xbt_node_t route_graph_new_node(routing_component_dijkstra_t rc, + int id, int graph_id) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + xbt_node_t node = NULL; + graph_node_data_t data = NULL; + graph_node_map_element_t elm = NULL; + + data = xbt_new0(struct graph_node_data, 1); + data->id = id; + data->graph_id = graph_id; + node = xbt_graph_new_node(routing->route_graph, data); + + elm = xbt_new0(struct graph_node_map_element, 1); + elm->node = node; + xbt_dict_set_ext(routing->graph_node_map, (char *) (&id), sizeof(int), + (xbt_set_elm_t) elm, &graph_node_map_elem_free); + + return node; +} + +static graph_node_map_element_t +graph_node_map_search(routing_component_dijkstra_t rc, int id) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + graph_node_map_element_t elm = (graph_node_map_element_t) + xbt_dict_get_or_null_ext(routing->graph_node_map, + (char *) (&id), + sizeof(int)); + return elm; +} + +/* Parsing */ + +static void route_new_dijkstra(routing_component_dijkstra_t rc, int src_id, + int dst_id, route_extended_t e_route) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + 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(routing->graph_node_map, + (char *) (&src_id), + sizeof(int)); + graph_node_map_element_t dst_elm = (graph_node_map_element_t) + xbt_dict_get_or_null_ext(routing->graph_node_map, + (char *) (&dst_id), + sizeof(int)); + + + if (src_elm) + src = src_elm->node; + + if (dst_elm) + dst = dst_elm->node; + + /* add nodes if they don't exist in the graph */ + if (src_id == dst_id && src == NULL && dst == NULL) { + src = route_graph_new_node(rc, src_id, -1); + dst = src; + } else { + if (src == NULL) { + src = route_graph_new_node(rc, src_id, -1); + } + if (dst == NULL) { + dst = route_graph_new_node(rc, dst_id, -1); + } + } + + /* add link as edge to graph */ + xbt_graph_new_edge(routing->route_graph, src, dst, e_route); +} + +static void add_loopback_dijkstra(routing_component_dijkstra_t rc) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + + xbt_dynar_t nodes = xbt_graph_get_nodes(routing->route_graph); + + xbt_node_t node = NULL; + unsigned int cursor2; + xbt_dynar_foreach(nodes, cursor2, node) { + xbt_dynar_t out_edges = xbt_graph_node_get_outedges(node); + xbt_edge_t edge = NULL; + unsigned int cursor; + + int found = 0; + xbt_dynar_foreach(out_edges, cursor, edge) { + xbt_node_t other_node = xbt_graph_edge_get_target(edge); + if (other_node == node) { + found = 1; + break; + } + } + + if (!found) { + route_extended_t e_route = xbt_new0(s_route_extended_t, 1); + e_route->src_gateway = NULL; + e_route->dst_gateway = NULL; + e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_push(e_route->generic_route.link_list, + &global_routing->loopback); + xbt_graph_new_edge(routing->route_graph, node, node, e_route); + } + } +} + +static route_extended_t dijkstra_get_route(routing_component_t rc, + const char *src, + const char *dst); + +static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc) +{ + // xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet"); + xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); + + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + //size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) { + xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) { + route_extended_t route = dijkstra_get_route(rc, k1, k2); + if (route) { + if (xbt_dynar_length(route->generic_route.link_list) == 1) { + void *link = + *(void **) xbt_dynar_get_ptr(route->generic_route.link_list, + 0); + onelink_t onelink = xbt_new0(s_onelink_t, 1); + onelink->link_ptr = link; + if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) { + onelink->src = xbt_strdup(k1); + onelink->dst = xbt_strdup(k2); + } else if (routing->generic_routing.hierarchy == + SURF_ROUTING_RECURSIVE) { + onelink->src = xbt_strdup(route->src_gateway); + onelink->dst = xbt_strdup(route->dst_gateway); + } + xbt_dynar_push(ret, &onelink); + } + } + } + } + return ret; +} + +static route_extended_t dijkstra_get_route(routing_component_t rc, + const char *src, + const char *dst) +{ + xbt_assert(rc && src + && dst, + "Invalid params for \"get_route\" function at AS \"%s\"", + rc->name); + + /* set utils vars */ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + + generic_src_dst_check(rc, src, dst); + int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, src); + int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, dst); + xbt_assert(src_id + && dst_id, + "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", + src, dst); + + /* create a result route */ + route_extended_t new_e_route = xbt_new0(s_route_extended_t, 1); + new_e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + new_e_route->src_gateway = NULL; + new_e_route->dst_gateway = NULL; + + int *pred_arr = NULL; + int src_node_id = 0; + int dst_node_id = 0; + int *nodeid = NULL; + int v; + route_extended_t e_route; + int size = 0; + unsigned int cpt; + void *link; + xbt_dynar_t links = NULL; + route_cache_element_t elm = NULL; + xbt_dynar_t nodes = xbt_graph_get_nodes(routing->route_graph); + + /* Use the graph_node id mapping set to quickly find the nodes */ + graph_node_map_element_t src_elm = + graph_node_map_search(routing, *src_id); + graph_node_map_element_t dst_elm = + graph_node_map_search(routing, *dst_id); + xbt_assert(src_elm != NULL + && dst_elm != NULL, "src %d or dst %d does not exist", + *src_id, *dst_id); + src_node_id = ((graph_node_data_t) + xbt_graph_node_get_data(src_elm->node))->graph_id; + dst_node_id = ((graph_node_data_t) + xbt_graph_node_get_data(dst_elm->node))->graph_id; + + /* if the src and dst are the same *//* fixed, missing in the previous version */ + if (src_node_id == dst_node_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(routing->route_graph, node_s_v, node_e_v); + + xbt_assert(edge != NULL, "no route between host %d and %d", *src_id, + *dst_id); + + e_route = (route_extended_t) xbt_graph_edge_get_data(edge); + + links = e_route->generic_route.link_list; + xbt_dynar_foreach(links, cpt, link) { + xbt_dynar_unshift(new_e_route->generic_route.link_list, &link); + } + + return new_e_route; + } + + if (routing->cached) { + /*check if there is a cached predecessor list avail */ + elm = (route_cache_element_t) + xbt_dict_get_or_null_ext(routing->route_cache, (char *) (&src_id), + sizeof(int)); + } + + if (elm) { /* cached mode and cache hit */ + pred_arr = elm->pred_arr; + } else { /* not cached mode or cache miss */ + double *cost_arr = NULL; + xbt_heap_t pqueue = NULL; + int i = 0; + + int nr_nodes = xbt_dynar_length(nodes); + cost_arr = xbt_new0(double, nr_nodes); /* link cost from src to other hosts */ + pred_arr = xbt_new0(int, nr_nodes); /* predecessors in path from src */ + pqueue = xbt_heap_new(nr_nodes, xbt_free); + + /* initialize */ + cost_arr[src_node_id] = 0.0; + + for (i = 0; i < nr_nodes; i++) { + if (i != src_node_id) { + cost_arr[i] = DBL_MAX; + } + + pred_arr[i] = 0; + + /* initialize priority queue */ + nodeid = xbt_new0(int, 1); + *nodeid = i; + xbt_heap_push(pqueue, nodeid, cost_arr[i]); + + } + + /* apply dijkstra using the indexes from the graph's node array */ + while (xbt_heap_size(pqueue) > 0) { + int *v_id = 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; + unsigned int cursor; + + 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); + int u_id = data->graph_id; + route_extended_t tmp_e_route = + (route_extended_t) xbt_graph_edge_get_data(edge); + int cost_v_u = (tmp_e_route->generic_route.link_list)->used; /* count of links, old model assume 1 */ + + if (cost_v_u + cost_arr[*v_id] < cost_arr[u_id]) { + pred_arr[u_id] = *v_id; + cost_arr[u_id] = cost_v_u + cost_arr[*v_id]; + nodeid = xbt_new0(int, 1); + *nodeid = u_id; + xbt_heap_push(pqueue, nodeid, cost_arr[u_id]); + } + } + + /* free item popped from pqueue */ + xbt_free(v_id); + } + + xbt_free(cost_arr); + xbt_heap_free(pqueue); + } + + /* compose route path with links */ + char *gw_src = NULL, *gw_dst = NULL, *prev_gw_src, *first_gw = 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(routing->route_graph, node_pred_v, node_v); + + xbt_assert(edge != NULL, "no route between host %d and %d", *src_id, + *dst_id); + + prev_gw_src = gw_src; + + e_route = (route_extended_t) xbt_graph_edge_get_data(edge); + gw_src = e_route->src_gateway; + gw_dst = e_route->dst_gateway; + + if (v == dst_node_id) + first_gw = gw_dst; + + if (rc->hierarchy == SURF_ROUTING_RECURSIVE && v != dst_node_id + && strcmp(gw_dst, prev_gw_src)) { + xbt_dynar_t e_route_as_to_as = + (*(global_routing->get_route)) (gw_dst, prev_gw_src); + xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"", + gw_dst, prev_gw_src); + links = e_route_as_to_as; + int pos = 0; + xbt_dynar_foreach(links, cpt, link) { + xbt_dynar_insert_at(new_e_route->generic_route.link_list, pos, + &link); + pos++; + } + } + + links = e_route->generic_route.link_list; + xbt_dynar_foreach(links, cpt, link) { + xbt_dynar_unshift(new_e_route->generic_route.link_list, &link); + } + size++; + } + + if (rc->hierarchy == SURF_ROUTING_RECURSIVE) { + new_e_route->src_gateway = xbt_strdup(gw_src); + new_e_route->dst_gateway = xbt_strdup(first_gw); + } + + if (routing->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(routing->route_cache, (char *) (&src_id), sizeof(int), + (xbt_set_elm_t) elm, &route_cache_elem_free); + } + + if (!routing->cached) + xbt_free(pred_arr); + + return new_e_route; +} + +static void dijkstra_finalize(routing_component_t rc) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + + if (routing) { + xbt_graph_free_graph(routing->route_graph, &xbt_free, + &graph_edge_data_free, &xbt_free); + xbt_dict_free(&routing->graph_node_map); + if (routing->cached) + xbt_dict_free(&routing->route_cache); + /* Delete bypass dict */ + xbt_dict_free(&routing->generic_routing.bypassRoutes); + /* Delete index dict */ + xbt_dict_free(&(routing->generic_routing.to_index)); + /* Delete structure */ + xbt_free(routing); + } +} + +/* Creation routing model functions */ + +void *model_dijkstra_both_create(int cached) +{ + routing_component_dijkstra_t new_component = + xbt_new0(s_routing_component_dijkstra_t, 1); + new_component->generic_routing.set_processing_unit = + generic_set_processing_unit; + new_component->generic_routing.set_autonomous_system = + generic_set_autonomous_system; + new_component->generic_routing.set_route = model_dijkstra_both_set_route; + new_component->generic_routing.set_ASroute = model_dijkstra_both_set_route; + new_component->generic_routing.set_bypassroute = generic_set_bypassroute; + new_component->generic_routing.get_route = dijkstra_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; + new_component->generic_routing.get_onelink_routes = + dijkstra_get_onelink_routes; + new_component->generic_routing.get_bypass_route = + generic_get_bypassroute; + new_component->generic_routing.finalize = dijkstra_finalize; + new_component->cached = cached; + new_component->generic_routing.to_index = xbt_dict_new(); + new_component->generic_routing.bypassRoutes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; + return new_component; +} + +void *model_dijkstra_create(void) +{ + return model_dijkstra_both_create(0); +} + +void *model_dijkstracache_create(void) +{ + return model_dijkstra_both_create(1); +} + +void model_dijkstra_both_load(void) +{ + /* use "surfxml_add_callback" to add a parse function call */ +} + +void model_dijkstra_both_unload(void) +{ + /* use "surfxml_del_callback" to remove a parse function call */ +} + +void model_dijkstra_both_end(void) +{ + routing_component_dijkstra_t routing = + (routing_component_dijkstra_t) current_routing; + + xbt_node_t node = NULL; + unsigned int cursor2; + xbt_dynar_t nodes = NULL; + + /* Create the topology graph */ + if(!routing->route_graph) + routing->route_graph = xbt_graph_new_graph(1, NULL); + if(!routing->graph_node_map) + routing->graph_node_map = xbt_dict_new(); + + if (routing->cached && !routing->route_cache) + routing->route_cache = xbt_dict_new(); + + /* Add the loopback if needed */ + if (current_routing->hierarchy == SURF_ROUTING_BASE) + add_loopback_dijkstra(routing); + + /* initialize graph indexes in nodes after graph has been built */ + nodes = xbt_graph_get_nodes(routing->route_graph); + + xbt_dynar_foreach(nodes, cursor2, node) { + graph_node_data_t data = xbt_graph_node_get_data(node); + data->graph_id = cursor2; + } + +} +void model_dijkstra_both_set_route (routing_component_t rc, const char *src, + const char *dst, name_route_extended_t route) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + int *src_id, *dst_id; + src_id = xbt_dict_get_or_null(rc->to_index, src); + dst_id = xbt_dict_get_or_null(rc->to_index, dst); + + xbt_assert(src_id, "Network elements %s not found", src); + xbt_assert(dst_id, "Network elements %s not found", dst); + + /* Create the topology graph */ + if(!routing->route_graph) + routing->route_graph = xbt_graph_new_graph(1, NULL); + if(!routing->graph_node_map) + routing->graph_node_map = xbt_dict_new(); + + if (routing->cached && !routing->route_cache) + routing->route_cache = xbt_dict_new(); + + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) + xbt_die("Route symmetrical not supported on model dijkstra"); + + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); + else{ + XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + if(global_routing->get_network_element_type((const char*)route->dst_gateway) == SURF_NETWORK_ELEMENT_NULL) + xbt_die("The dst_gateway '%s' does not exist!",route->dst_gateway); + if(global_routing->get_network_element_type((const char*)route->src_gateway) == SURF_NETWORK_ELEMENT_NULL) + xbt_die("The src_gateway '%s' does not exist!",route->src_gateway); + } + + route_extended_t e_route = + generic_new_extended_route(current_routing->hierarchy, route, 1); + route_new_dijkstra(routing, *src_id, *dst_id, e_route); +} diff --git a/src/surf/surf_routing_floyd.c b/src/surf/surf_routing_floyd.c new file mode 100644 index 0000000000..e744b8670e --- /dev/null +++ b/src/surf/surf_routing_floyd.c @@ -0,0 +1,396 @@ +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is 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_global_t global_routing; +extern routing_component_t current_routing; +extern model_type_t current_routing_model; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_floyd, surf, "Routing part of surf"); + +#define TO_FLOYD_COST(i,j) (routing->cost_table)[(i)+(j)*table_size] +#define TO_FLOYD_PRED(i,j) (routing->predecessor_table)[(i)+(j)*table_size] +#define TO_FLOYD_LINK(i,j) (routing->link_table)[(i)+(j)*table_size] + +/* Routing model structure */ + +typedef struct { + s_routing_component_t generic_routing; + /* vars for calculate the floyd algorith. */ + int *predecessor_table; + double *cost_table; + route_extended_t *link_table; /* char* -> int* */ +} s_routing_component_floyd_t, *routing_component_floyd_t; + +static route_extended_t floyd_get_route(routing_component_t rc, + const char *src, const char *dst); + +/* Business methods */ +static xbt_dynar_t floyd_get_onelink_routes(routing_component_t rc) +{ + xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); + + routing_component_floyd_t routing = (routing_component_floyd_t) rc; + //size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) { + xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) { + route_extended_t route = floyd_get_route(rc, k1, k2); + if (route) { + if (xbt_dynar_length(route->generic_route.link_list) == 1) { + void *link = + *(void **) xbt_dynar_get_ptr(route->generic_route.link_list, + 0); + onelink_t onelink = xbt_new0(s_onelink_t, 1); + onelink->link_ptr = link; + if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) { + onelink->src = xbt_strdup(k1); + onelink->dst = xbt_strdup(k2); + } else if (routing->generic_routing.hierarchy == + SURF_ROUTING_RECURSIVE) { + onelink->src = xbt_strdup(route->src_gateway); + onelink->dst = xbt_strdup(route->dst_gateway); + } + xbt_dynar_push(ret, &onelink); + } + } + } + } + return ret; +} + +static route_extended_t floyd_get_route(routing_component_t rc, + const char *src, const char *dst) +{ + xbt_assert(rc && src + && dst, + "Invalid params for \"get_route\" function at AS \"%s\"", + rc->name); + + /* set utils vars */ + routing_component_floyd_t routing = (routing_component_floyd_t) rc; + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + + generic_src_dst_check(rc, src, dst); + int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, src); + int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, dst); + xbt_assert(src_id + && dst_id, + "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", + src, dst); + + /* create a result route */ + route_extended_t new_e_route = xbt_new0(s_route_extended_t, 1); + new_e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + new_e_route->src_gateway = NULL; + new_e_route->dst_gateway = NULL; + + int first = 1; + int pred = *dst_id; + int prev_pred = 0; + char *gw_src = NULL, *gw_dst = NULL, *prev_gw_src, *first_gw = NULL; + unsigned int cpt; + void *link; + xbt_dynar_t links; + + do { + prev_pred = pred; + pred = TO_FLOYD_PRED(*src_id, pred); + if (pred == -1) /* if no pred in route -> no route to host */ + break; + xbt_assert(TO_FLOYD_LINK(pred, prev_pred), + "Invalid link for the route between \"%s\" or \"%s\"", src, + dst); + + prev_gw_src = gw_src; + + route_extended_t e_route = TO_FLOYD_LINK(pred, prev_pred); + gw_src = e_route->src_gateway; + gw_dst = e_route->dst_gateway; + + if (first) + first_gw = gw_dst; + + if (rc->hierarchy == SURF_ROUTING_RECURSIVE && !first + && strcmp(gw_dst, prev_gw_src)) { + xbt_dynar_t e_route_as_to_as = + (*(global_routing->get_route)) (gw_dst, prev_gw_src); + xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"", + gw_dst, prev_gw_src); + links = e_route_as_to_as; + int pos = 0; + xbt_dynar_foreach(links, cpt, link) { + xbt_dynar_insert_at(new_e_route->generic_route.link_list, pos, + &link); + pos++; + } + } + + links = e_route->generic_route.link_list; + xbt_dynar_foreach(links, cpt, link) { + xbt_dynar_unshift(new_e_route->generic_route.link_list, &link); + } + first = 0; + + } while (pred != *src_id); + xbt_assert(pred != -1, "no route from host %d to %d (\"%s\" to \"%s\")", + *src_id, *dst_id, src, dst); + + if (rc->hierarchy == SURF_ROUTING_RECURSIVE) { + new_e_route->src_gateway = xbt_strdup(gw_src); + new_e_route->dst_gateway = xbt_strdup(first_gw); + } + + return new_e_route; +} + +static void floyd_finalize(routing_component_t rc) +{ + routing_component_floyd_t routing = (routing_component_floyd_t) rc; + int i, j; + size_t table_size; + if (routing) { + table_size = xbt_dict_length(routing->generic_routing.to_index); + /* Delete link_table */ + for (i = 0; i < table_size; i++) + for (j = 0; j < table_size; j++) + generic_free_extended_route(TO_FLOYD_LINK(i, j)); + xbt_free(routing->link_table); + /* Delete bypass dict */ + xbt_dict_free(&routing->generic_routing.bypassRoutes); + /* Delete index dict */ + xbt_dict_free(&(routing->generic_routing.to_index)); + /* Delete dictionary index dict, predecessor and links table */ + xbt_free(routing->predecessor_table); + /* Delete structure */ + xbt_free(rc); + } +} + +void *model_floyd_create(void) +{ + routing_component_floyd_t new_component = + xbt_new0(s_routing_component_floyd_t, 1); + new_component->generic_routing.set_processing_unit = + generic_set_processing_unit; + new_component->generic_routing.set_autonomous_system = + generic_set_autonomous_system; + new_component->generic_routing.set_route = model_floyd_set_route; + new_component->generic_routing.set_ASroute = model_floyd_set_route; + new_component->generic_routing.set_bypassroute = generic_set_bypassroute; + new_component->generic_routing.get_route = floyd_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; + new_component->generic_routing.get_onelink_routes = + floyd_get_onelink_routes; + new_component->generic_routing.get_bypass_route = + generic_get_bypassroute; + new_component->generic_routing.finalize = floyd_finalize; + new_component->generic_routing.to_index = xbt_dict_new(); + new_component->generic_routing.bypassRoutes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; + return new_component; +} + +void model_floyd_load(void) +{ + /* use "surfxml_add_callback" to add a parse function call */ +} + +void model_floyd_unload(void) +{ + /* use "surfxml_del_callback" to remove a parse function call */ +} + +void model_floyd_end(void) +{ + + routing_component_floyd_t routing = + ((routing_component_floyd_t) current_routing); + + unsigned int i, j, a, b, c; + + /* set the size of table routing */ + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + + if(!routing->link_table) + { + /* Create Cost, Predecessor and Link tables */ + routing->cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ + routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ + routing->link_table = xbt_new0(route_extended_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 (current_routing->hierarchy == SURF_ROUTING_BASE) { + for (i = 0; i < table_size; i++) { + route_extended_t e_route = TO_FLOYD_LINK(i, i); + if (!e_route) { + e_route = xbt_new0(s_route_extended_t, 1); + e_route->src_gateway = NULL; + e_route->dst_gateway = NULL; + e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_push(e_route->generic_route.link_list, + &global_routing->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); + } + } + } + } + } +} + +void model_floyd_set_route(routing_component_t rc, const char *src, + const char *dst, name_route_extended_t route) +{ + routing_component_floyd_t routing = (routing_component_floyd_t) rc; + + /* set the size of table routing */ + size_t table_size = xbt_dict_length(rc->to_index); + int *src_id, *dst_id; + int i,j; + + src_id = xbt_dict_get_or_null(rc->to_index, src); + dst_id = xbt_dict_get_or_null(rc->to_index, dst); + + xbt_assert(src_id, "Network elements %s not found", src); + xbt_assert(dst_id, "Network elements %s not found", dst); + + if(!routing->link_table) + { + /* Create Cost, Predecessor and Link tables */ + routing->cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ + routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ + routing->link_table = xbt_new0(route_extended_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 */ + } + } + + if(TO_FLOYD_LINK(*src_id, *dst_id)) + { + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("See Route from \"%s\" to \"%s\"", src, dst); + else + XBT_DEBUG("See ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + char * link_name; + unsigned int cpt; + xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_foreach(route->generic_route.link_list,cpt,link_name) + { + 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(*src_id, *dst_id)->generic_route.link_list, + (void*)link_route_to_test, + (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), + "The route between \"%s\" and \"%s\" already exists", src,dst); + } + else + { + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); + else{ + XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + if(global_routing->get_network_element_type((const char*)route->dst_gateway) == SURF_NETWORK_ELEMENT_NULL) + xbt_die("The dst_gateway '%s' does not exist!",route->dst_gateway); + if(global_routing->get_network_element_type((const char*)route->src_gateway) == SURF_NETWORK_ELEMENT_NULL) + xbt_die("The src_gateway '%s' does not exist!",route->src_gateway); + } + TO_FLOYD_LINK(*src_id, *dst_id) = + generic_new_extended_route(rc->hierarchy, route, 1); + TO_FLOYD_PRED(*src_id, *dst_id) = *src_id; + TO_FLOYD_COST(*src_id, *dst_id) = + ((TO_FLOYD_LINK(*src_id, *dst_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ + } + + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) + { + if(TO_FLOYD_LINK(*dst_id, *src_id)) + { + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("See Route from \"%s\" to \"%s\"", dst, src); + else + XBT_DEBUG("See ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, + route->src_gateway, src, route->dst_gateway); + char * link_name; + unsigned int i; + xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); + for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--) + { + link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *); + 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_id, *src_id)->generic_route.link_list, + (void*)link_route_to_test, + (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), + "The route between \"%s\" and \"%s\" already exists", src,dst); + } + else + { + if(route->dst_gateway && route->src_gateway) + { + char *gw_src = xbt_strdup(route->src_gateway); + char *gw_dst = xbt_strdup(route->dst_gateway); + route->src_gateway = gw_dst; + route->dst_gateway = gw_src; + } + + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src); + else + XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, + route->src_gateway, src, route->dst_gateway); + + TO_FLOYD_LINK(*dst_id, *src_id) = + generic_new_extended_route(rc->hierarchy, route, 0); + TO_FLOYD_PRED(*dst_id, *src_id) = *dst_id; + TO_FLOYD_COST(*dst_id, *src_id) = + ((TO_FLOYD_LINK(*dst_id, *src_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ + } + } +} diff --git a/src/surf/surf_routing_full.c b/src/surf/surf_routing_full.c new file mode 100644 index 0000000000..be6166c689 --- /dev/null +++ b/src/surf/surf_routing_full.c @@ -0,0 +1,287 @@ +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is 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_global_t global_routing; +extern routing_component_t current_routing; +extern model_type_t current_routing_model; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_full, surf, "Routing part of surf"); + +#define TO_ROUTE_FULL(i,j) routing->routing_table[(i)+(j)*table_size] + +/* Routing model structure */ + +typedef struct { + s_routing_component_t generic_routing; + route_extended_t *routing_table; +} s_routing_component_full_t, *routing_component_full_t; + +/* Business methods */ +static xbt_dynar_t full_get_onelink_routes(routing_component_t rc) +{ + xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); + + routing_component_full_t routing = (routing_component_full_t) rc; + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) { + xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) { + int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k1); + int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k2); + xbt_assert(src_id + && dst_id, + "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", + k1, k2); + route_extended_t route = TO_ROUTE_FULL(*src_id, *dst_id); + if (route) { + if (xbt_dynar_length(route->generic_route.link_list) == 1) { + void *link = + *(void **) xbt_dynar_get_ptr(route->generic_route.link_list, + 0); + onelink_t onelink = xbt_new0(s_onelink_t, 1); + onelink->link_ptr = link; + if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) { + onelink->src = xbt_strdup(k1); + onelink->dst = xbt_strdup(k2); + } else if (routing->generic_routing.hierarchy == + SURF_ROUTING_RECURSIVE) { + onelink->src = xbt_strdup(route->src_gateway); + onelink->dst = xbt_strdup(route->dst_gateway); + } + xbt_dynar_push(ret, &onelink); + } + } + } + } + return ret; +} + +static route_extended_t full_get_route(routing_component_t rc, + const char *src, const char *dst) +{ + xbt_assert(rc && src + && dst, + "Invalid params for \"get_route\" function at AS \"%s\"", + rc->name); + + /* set utils vars */ + routing_component_full_t routing = (routing_component_full_t) rc; + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + + int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, src); + int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, dst); + xbt_assert(src_id + && dst_id, + "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table", + src, dst); + + route_extended_t e_route = NULL; + route_extended_t new_e_route = NULL; + void *link; + unsigned int cpt = 0; + + e_route = TO_ROUTE_FULL(*src_id, *dst_id); + + if (e_route) { + new_e_route = xbt_new0(s_route_extended_t, 1); + new_e_route->src_gateway = xbt_strdup(e_route->src_gateway); + new_e_route->dst_gateway = xbt_strdup(e_route->dst_gateway); + new_e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_foreach(e_route->generic_route.link_list, cpt, link) { + xbt_dynar_push(new_e_route->generic_route.link_list, &link); + } + } + return new_e_route; +} + +static void full_finalize(routing_component_t rc) +{ + routing_component_full_t routing = (routing_component_full_t) rc; + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + int i, j; + if (routing) { + /* Delete routing table */ + for (i = 0; i < table_size; i++) + for (j = 0; j < table_size; j++) + generic_free_extended_route(TO_ROUTE_FULL(i, j)); + xbt_free(routing->routing_table); + /* Delete bypass dict */ + xbt_dict_free(&rc->bypassRoutes); + /* Delete index dict */ + xbt_dict_free(&rc->to_index); + /* Delete structure */ + xbt_free(rc); + } +} + +/* Creation routing model functions */ + +void *model_full_create(void) +{ + routing_component_full_t new_component = + xbt_new0(s_routing_component_full_t, 1); + new_component->generic_routing.set_processing_unit = + generic_set_processing_unit; + new_component->generic_routing.set_autonomous_system = + generic_set_autonomous_system; + new_component->generic_routing.set_route = model_full_set_route; + new_component->generic_routing.set_ASroute = model_full_set_route; + new_component->generic_routing.set_bypassroute = generic_set_bypassroute; + new_component->generic_routing.get_route = full_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; + new_component->generic_routing.get_onelink_routes = + full_get_onelink_routes; + new_component->generic_routing.get_bypass_route = + generic_get_bypassroute; + new_component->generic_routing.finalize = full_finalize; + new_component->generic_routing.to_index = xbt_dict_new(); + new_component->generic_routing.bypassRoutes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; + return new_component; +} + +void model_full_load(void) +{ + /* use "surfxml_add_callback" to add a parse function call */ +} + +void model_full_unload(void) +{ + /* use "surfxml_del_callback" to remove a parse function call */ +} + +void model_full_end(void) +{ + unsigned int i; + route_extended_t e_route; + + /* set utils vars */ + routing_component_full_t routing = + ((routing_component_full_t) current_routing); + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + + /* Create table if necessary */ + if(!routing->routing_table) + routing->routing_table = xbt_new0(route_extended_t, table_size * table_size); + + /* Add the loopback if needed */ + if (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_route_extended_t, 1); + e_route->src_gateway = NULL; + e_route->dst_gateway = NULL; + e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_push(e_route->generic_route.link_list, + &global_routing->loopback); + TO_ROUTE_FULL(i, i) = e_route; + } + } + } +} + +void model_full_set_route(routing_component_t rc, const char *src, + const char *dst, name_route_extended_t route) +{ + int *src_id, *dst_id; + src_id = xbt_dict_get_or_null(rc->to_index, src); + dst_id = xbt_dict_get_or_null(rc->to_index, dst); + routing_component_full_t routing = ((routing_component_full_t) rc); + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + + xbt_assert(src_id, "Network elements %s not found", src); + xbt_assert(dst_id, "Network elements %s not found", dst); + + xbt_assert(xbt_dynar_length(route->generic_route.link_list) > 0, + "Invalid count of links, must be greater than zero (%s,%s)", + src, dst); + + if(!routing->routing_table) + routing->routing_table = xbt_new0(route_extended_t, table_size * table_size); + + if(TO_ROUTE_FULL(*src_id, *dst_id)) + { + char * link_name; + unsigned int i; + xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_foreach(route->generic_route.link_list,i,link_name) + { + 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_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, + (void*)link_route_to_test, + (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), + "The route between \"%s\" and \"%s\" already exists. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.", src,dst); + } + else + { + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); + else{ + XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + if(global_routing->get_network_element_type((const char*)route->dst_gateway) == SURF_NETWORK_ELEMENT_NULL) + xbt_die("The dst_gateway '%s' does not exist!",route->dst_gateway); + if(global_routing->get_network_element_type((const char*)route->src_gateway) == SURF_NETWORK_ELEMENT_NULL) + xbt_die("The src_gateway '%s' does not exist!",route->src_gateway); + } + TO_ROUTE_FULL(*src_id, *dst_id) = generic_new_extended_route(rc->hierarchy,route,1); + xbt_dynar_shrink(TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, 0); + } + + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) + { + if(route->dst_gateway && route->src_gateway) + { + char *gw_tmp ; + gw_tmp = route->src_gateway; + route->src_gateway = route->dst_gateway; + route->dst_gateway = gw_tmp; + } + if(TO_ROUTE_FULL(*dst_id, *src_id)) + { + char * link_name; + unsigned int i; + xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); + for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--) + { + link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *); + 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_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, + (void*)link_route_to_test, + (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), + "The route between \"%s\" and \"%s\" already exists", src,dst); + } + else + { + if(!route->dst_gateway && !route->src_gateway) + XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src); + else + XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, + route->src_gateway, src, route->dst_gateway); + TO_ROUTE_FULL(*dst_id, *src_id) = generic_new_extended_route(rc->hierarchy,route,0); + xbt_dynar_shrink(TO_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, 0); + } + } + + if (rc->hierarchy == SURF_ROUTING_BASE) generic_free_route((route_t)route) ; + else generic_free_extended_route((route_extended_t)route); +} diff --git a/src/surf/surf_routing_none.c b/src/surf/surf_routing_none.c new file mode 100644 index 0000000000..43b347b48e --- /dev/null +++ b/src/surf/surf_routing_none.c @@ -0,0 +1,85 @@ +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is 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_global_t global_routing; +extern routing_component_t current_routing; +extern model_type_t current_routing_model; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_none, surf, "Routing part of surf"); + +/* Routing model structure */ +typedef struct { + s_routing_component_t generic_routing; +} s_routing_component_none_t, *routing_component_none_t; + +/* Business methods */ +static xbt_dynar_t none_get_onelink_routes(routing_component_t rc) +{ + return NULL; +} + +static route_extended_t none_get_route(routing_component_t rc, + const char *src, const char *dst) +{ + return NULL; +} + +static route_extended_t none_get_bypass_route(routing_component_t rc, + const char *src, + const char *dst) +{ + return NULL; +} + +static void none_finalize(routing_component_t rc) +{ + xbt_free(rc); +} + +static void none_set_processing_unit(routing_component_t rc, + const char *name) +{ +} + +static void none_set_autonomous_system(routing_component_t rc, + const char *name) +{ +} + +/* Creation routing model functions */ +void *model_none_create(void) +{ + routing_component_none_t new_component = + xbt_new0(s_routing_component_none_t, 1); + new_component->generic_routing.set_processing_unit = + none_set_processing_unit; + new_component->generic_routing.set_autonomous_system = + none_set_autonomous_system; + new_component->generic_routing.set_route = NULL; + new_component->generic_routing.set_ASroute = NULL; + new_component->generic_routing.set_bypassroute = NULL; + new_component->generic_routing.get_route = none_get_route; + new_component->generic_routing.get_onelink_routes = + none_get_onelink_routes; + new_component->generic_routing.get_bypass_route = none_get_bypass_route; + new_component->generic_routing.finalize = none_finalize; + return new_component; +} + +void model_none_load(void) +{ +} + +void model_none_unload(void) +{ +} + +void model_none_end(void) +{ +} diff --git a/src/surf/surf_routing_private.h b/src/surf/surf_routing_private.h new file mode 100644 index 0000000000..91923c8ac3 --- /dev/null +++ b/src/surf/surf_routing_private.h @@ -0,0 +1,108 @@ +/* + * surf_routing_private.h + * + * Created on: 14 avr. 2011 + * Author: navarrop + */ + +#ifndef _SURF_SURF_ROUTING_PRIVATE_H +#define _SURF_SURF_ROUTING_PRIVATE_H + +#include +#include "gras_config.h" + +#include "surf_private.h" +#include "xbt/dynar.h" +#include "xbt/str.h" +#include "xbt/config.h" +#include "xbt/graph.h" +#include "xbt/set.h" +#include "surf/surfxml_parse.h" + +/* ************************************************************************** */ +/* ***************** GENERIC PARSE FUNCTIONS (declarations) ***************** */ + +void generic_set_processing_unit(routing_component_t rc, + const char *name); +void generic_set_autonomous_system(routing_component_t rc, + const char *name); +void generic_set_bypassroute(routing_component_t rc, + const char *src, const char *dst, + route_extended_t e_route); + +int surf_link_resource_cmp(const void *a, const void *b); +int surf_pointer_resource_cmp(const void *a, const void *b); + +/* ************************************************************************** */ +/* *************** GENERIC BUSINESS METHODS (declarations) ****************** */ + +double generic_get_link_latency(routing_component_t rc, const char *src, const char *dst, + route_extended_t e_route); +xbt_dynar_t generic_get_onelink_routes(routing_component_t rc); +route_extended_t generic_get_bypassroute(routing_component_t rc, + const char *src, + const char *dst); + +/* ************************************************************************** */ +/* ****************** GENERIC AUX FUNCTIONS (declarations) ****************** */ + +route_extended_t +generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, + void *data, int order); +route_t +generic_new_route(e_surf_routing_hierarchy_t hierarchy, + void *data, int order); +void generic_free_route(route_t route); +void generic_free_extended_route(route_extended_t e_route); +routing_component_t +generic_autonomous_system_exist(routing_component_t rc, char *element); +routing_component_t +generic_processing_units_exist(routing_component_t rc, char *element); +void generic_src_dst_check(routing_component_t rc, const char *src, + const char *dst); + + +/* ************************************************************************** */ +/* *************************** FLOYD ROUTING ******************************** */ +void *model_floyd_create(void); /* create structures for floyd routing model */ +void model_floyd_load(void); /* load parse functions for floyd routing model */ +void model_floyd_unload(void); /* unload parse functions for floyd routing model */ +void model_floyd_end(void); /* finalize the creation of floyd routing model */ +void model_floyd_set_route(routing_component_t rc, const char *src, + const char *dst, name_route_extended_t route); + +/* ************************************************** */ +/* ************** RULE-BASED ROUTING **************** */ +void *model_rulebased_create(void); /* create structures for rulebased routing model */ +void model_rulebased_load(void); /* load parse functions for rulebased routing model */ +void model_rulebased_unload(void); /* unload parse functions for rulebased routing model */ +void model_rulebased_end(void); /* finalize the creation of rulebased routing model */ + +/* ************************************************************************** */ +/* ********** Dijkstra & Dijkstra Cached ROUTING **************************** */ +void *model_dijkstra_both_create(int cached); /* create by calling dijkstra or dijkstracache */ +void *model_dijkstra_create(void); /* create structures for dijkstra routing model */ +void *model_dijkstracache_create(void); /* create structures for dijkstracache routing model */ +void model_dijkstra_both_load(void); /* load parse functions for dijkstra routing model */ +void model_dijkstra_both_unload(void); /* unload parse functions for dijkstra routing model */ +void model_dijkstra_both_end(void); /* finalize the creation of dijkstra routing model */ +void model_dijkstra_both_set_route (routing_component_t rc, const char *src, + const char *dst, name_route_extended_t route); + +/* ************************************************************************** */ +/* *************************** FULL ROUTING ********************************* */ +void *model_full_create(void); /* create structures for full routing model */ +void model_full_load(void); /* load parse functions for full routing model */ +void model_full_unload(void); /* unload parse functions for full routing model */ +void model_full_end(void); /* finalize the creation of full routing model */ +void model_full_set_route( /* Set the route and ASroute between src and dst */ + routing_component_t rc, const char *src, const char *dst, name_route_extended_t route); + +/* ************************************************************************** */ +/* ******************************* NO ROUTING ******************************* */ +void *model_none_create(void); /* none routing model */ +void model_none_load(void); /* none routing model */ +void model_none_unload(void); /* none routing model */ +void model_none_end(void); /* none routing model */ + +#endif /* _SURF_SURF_ROUTING_PRIVATE_H */ diff --git a/src/surf/surf_routing_rulebased.c b/src/surf/surf_routing_rulebased.c new file mode 100644 index 0000000000..8a57a5d0b7 --- /dev/null +++ b/src/surf/surf_routing_rulebased.c @@ -0,0 +1,436 @@ +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is 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 /* regular expression library */ + +/* Global vars */ +extern routing_global_t global_routing; +extern routing_component_t current_routing; +extern model_type_t current_routing_model; +extern xbt_dynar_t link_list; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_rulebased, surf, "Routing part of surf"); + +/* Routing model structure */ + +typedef struct { + s_routing_component_t generic_routing; + xbt_dict_t dict_processing_units; + xbt_dict_t dict_autonomous_systems; + xbt_dynar_t list_route; + xbt_dynar_t list_ASroute; +} s_routing_component_rulebased_t, *routing_component_rulebased_t; + +typedef struct s_rule_route s_rule_route_t, *rule_route_t; +typedef struct s_rule_route_extended s_rule_route_extended_t, + *rule_route_extended_t; + +struct s_rule_route { + xbt_dynar_t re_str_link; // dynar of char* + pcre *re_src; + pcre *re_dst; +}; + +struct s_rule_route_extended { + s_rule_route_t generic_rule_route; + char *re_src_gateway; + char *re_dst_gateway; +}; + +static void rule_route_free(void *e) +{ + rule_route_t *elem = (rule_route_t *) (e); + if (*elem) { + xbt_dynar_free(&(*elem)->re_str_link); + pcre_free((*elem)->re_src); + pcre_free((*elem)->re_dst); + xbt_free(*elem); + } + *elem = NULL; +} + +static void rule_route_extended_free(void *e) +{ + rule_route_extended_t *elem = (rule_route_extended_t *) e; + if (*elem) { + xbt_dynar_free(&(*elem)->generic_rule_route.re_str_link); + pcre_free((*elem)->generic_rule_route.re_src); + pcre_free((*elem)->generic_rule_route.re_dst); + xbt_free((*elem)->re_src_gateway); + xbt_free((*elem)->re_dst_gateway); + xbt_free(*elem); + } +} + +/* Parse routing model functions */ + +static void model_rulebased_set_processing_unit(routing_component_t rc, + const char *name) +{ + routing_component_rulebased_t routing = + (routing_component_rulebased_t) rc; + xbt_dict_set(routing->dict_processing_units, name, (void *) (-1), NULL); +} + +static void model_rulebased_set_autonomous_system(routing_component_t rc, + const char *name) +{ + routing_component_rulebased_t routing = + (routing_component_rulebased_t) rc; + xbt_dict_set(routing->dict_autonomous_systems, name, (void *) (-1), + NULL); +} + +static void model_rulebased_set_route(routing_component_t rc, + const char *src, const char *dst, + name_route_extended_t route) +{ + routing_component_rulebased_t routing = + (routing_component_rulebased_t) rc; + rule_route_t ruleroute = xbt_new0(s_rule_route_t, 1); + const char *error; + int erroffset; + + if(!strcmp(rc->routing->name,"Vivaldi")){ + if(xbt_dynar_length(route->generic_route.link_list) != 0) + xbt_die("You can't have link_ctn with Model Vivaldi."); + } + + ruleroute->re_src = pcre_compile(src, 0, &error, &erroffset, NULL); + xbt_assert(ruleroute->re_src, + "PCRE compilation failed at offset %d (\"%s\"): %s\n", + erroffset, src, error); + ruleroute->re_dst = pcre_compile(dst, 0, &error, &erroffset, NULL); + xbt_assert(ruleroute->re_src, + "PCRE compilation failed at offset %d (\"%s\"): %s\n", + erroffset, dst, error); + ruleroute->re_str_link = route->generic_route.link_list; + xbt_dynar_push(routing->list_route, &ruleroute); + xbt_free(route); +} + +static void model_rulebased_set_ASroute(routing_component_t rc, + const char *src, const char *dst, + name_route_extended_t route) +{ + routing_component_rulebased_t routing = + (routing_component_rulebased_t) rc; + rule_route_extended_t ruleroute_e = xbt_new0(s_rule_route_extended_t, 1); + const char *error; + int erroffset; + + if(!strcmp(rc->routing->name,"Vivaldi")){ + if(xbt_dynar_length(route->generic_route.link_list) != 0) + xbt_die("You can't have link_ctn with Model Vivaldi."); + } + + ruleroute_e->generic_rule_route.re_src = + pcre_compile(src, 0, &error, &erroffset, NULL); + xbt_assert(ruleroute_e->generic_rule_route.re_src, + "PCRE compilation failed at offset %d (\"%s\"): %s\n", + erroffset, src, error); + ruleroute_e->generic_rule_route.re_dst = + pcre_compile(dst, 0, &error, &erroffset, NULL); + xbt_assert(ruleroute_e->generic_rule_route.re_src, + "PCRE compilation failed at offset %d (\"%s\"): %s\n", + erroffset, dst, error); + ruleroute_e->generic_rule_route.re_str_link = + route->generic_route.link_list; + ruleroute_e->re_src_gateway = route->src_gateway; + ruleroute_e->re_dst_gateway = route->dst_gateway; + xbt_dynar_push(routing->list_ASroute, &ruleroute_e); +// xbt_free(route->src_gateway); +// xbt_free(route->dst_gateway); + xbt_free(route); +} + +static void model_rulebased_set_bypassroute(routing_component_t rc, + const char *src, + const char *dst, + route_extended_t e_route) +{ + xbt_die("bypass routing not supported for Route-Based model"); +} + +#define BUFFER_SIZE 4096 /* result buffer size */ +#define OVECCOUNT 30 /* should be a multiple of 3 */ + +static char *remplace(char *value, const char **src_list, int src_size, + const char **dst_list, int dst_size) +{ + char result[BUFFER_SIZE]; + int i_res = 0; + int i = 0; + + while (value[i]) { + if (value[i] == '$') { + i++; /* skip the '$' */ + if (value[i] < '0' || value[i] > '9') + xbt_die("bad string parameter, no number indication, at offset: " + "%d (\"%s\")", i, value); + + /* solve the number */ + int number = value[i++] - '0'; + while (value[i] >= '0' && value[i] <= '9') + number = 10 * number + (value[i++] - '0'); + + /* solve the indication */ + const char **param_list; + int param_size; + if (value[i] == 's' && value[i + 1] == 'r' && value[i + 2] == 'c') { + param_list = src_list; + param_size = src_size; + } else if (value[i] == 'd' && value[i + 1] == 's' + && value[i + 2] == 't') { + param_list = dst_list; + param_size = dst_size; + } else { + xbt_die("bad string parameter, support only \"src\" and \"dst\", " + "at offset: %d (\"%s\")", i, value); + } + i += 3; + + xbt_assert(number < param_size, + "bad string parameter, not enough length param_size, " + "at offset: %d (\"%s\") %d %d", i, value, param_size, number); + + const char *param = param_list[number]; + int j = 0; + while (param[j] && i_res < BUFFER_SIZE) + result[i_res++] = param[j++]; + } else { + result[i_res++] = value[i++]; /* next char */ + } + if (i_res >= BUFFER_SIZE) + xbt_die("solving string \"%s\", small buffer size (%d)", + value, BUFFER_SIZE); + } + result[i_res++] = '\0'; + char *res = xbt_malloc(i_res); + return memcpy(res, result, i_res); +} + +static route_extended_t rulebased_get_route(routing_component_t rc, + const char *src, + const char *dst); +static xbt_dynar_t rulebased_get_onelink_routes(routing_component_t rc) +{ + xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); + + //We have already bypass cluster routes with network NS3 + if(!strcmp(surf_network_model->name,"network NS3")) + return ret; + + routing_component_rulebased_t routing = (routing_component_rulebased_t)rc; + + xbt_dict_cursor_t c1 = NULL; + char *k1, *d1; + + //find router + char *router = NULL; + xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) { + if (rc->get_network_element_type(k1) == SURF_NETWORK_ELEMENT_ROUTER){ + router = k1; + } + } + + if (!router){ + xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); + } + + xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) { + route_extended_t route = rulebased_get_route (rc, router, k1); + + int number_of_links = xbt_dynar_length(route->generic_route.link_list); + + if(number_of_links == 1) { + //loopback + } + else{ + if (number_of_links != 2) { + xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); + } + + void *link_ptr; + xbt_dynar_get_cpy (route->generic_route.link_list, 1, &link_ptr); + onelink_t onelink = xbt_new0 (s_onelink_t, 1); + onelink->src = xbt_strdup (k1); + onelink->dst = xbt_strdup (router); + onelink->link_ptr = link_ptr; + xbt_dynar_push (ret, &onelink); + } + } + return ret; +} + +/* Business methods */ +static route_extended_t rulebased_get_route(routing_component_t rc, + const char *src, + const char *dst) +{ + xbt_assert(rc && src + && dst, + "Invalid params for \"get_route\" function at AS \"%s\"", + rc->name); + + /* set utils vars */ + routing_component_rulebased_t routing = + (routing_component_rulebased_t) rc; + + int are_processing_units=0; + xbt_dynar_t rule_list; + if (xbt_dict_get_or_null(routing->dict_processing_units, src) + && xbt_dict_get_or_null(routing->dict_processing_units, dst)) { + are_processing_units = 1; + rule_list = routing->list_route; + } else if (xbt_dict_get_or_null(routing->dict_autonomous_systems, src) + && xbt_dict_get_or_null(routing->dict_autonomous_systems, + dst)) { + are_processing_units = 0; + rule_list = routing->list_ASroute; + } else + xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found in " + "the local table", src, dst); + + int rc_src = -1; + int rc_dst = -1; + int src_length = (int) strlen(src); + int dst_length = (int) strlen(dst); + + xbt_dynar_t links_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + + rule_route_t ruleroute; + unsigned int cpt; + int ovector_src[OVECCOUNT]; + int ovector_dst[OVECCOUNT]; + const char **list_src = NULL; + const char **list_dst = NULL; + int res; + xbt_dynar_foreach(rule_list, cpt, ruleroute) { + rc_src = + pcre_exec(ruleroute->re_src, NULL, src, src_length, 0, 0, + ovector_src, OVECCOUNT); + if (rc_src >= 0) { + rc_dst = + pcre_exec(ruleroute->re_dst, NULL, dst, dst_length, 0, 0, + ovector_dst, OVECCOUNT); + if (rc_dst >= 0) { + res = pcre_get_substring_list(src, ovector_src, rc_src, &list_src); + xbt_assert(!res, "error solving substring list for src \"%s\"", src); + res = pcre_get_substring_list(dst, ovector_dst, rc_dst, &list_dst); + xbt_assert(!res, "error solving substring list for src \"%s\"", dst); + char *link_name; + xbt_dynar_foreach(ruleroute->re_str_link, cpt, link_name) { + char *new_link_name = + remplace(link_name, list_src, rc_src, list_dst, rc_dst); + void *link = + xbt_lib_get_or_null(link_lib, new_link_name, SURF_LINK_LEVEL); + if (link) + xbt_dynar_push(links_list, &link); + else + THROWF(mismatch_error, 0, "Link %s not found", new_link_name); + xbt_free(new_link_name); + } + } + } + if (rc_src >= 0 && rc_dst >= 0) + break; + } + + route_extended_t new_e_route = NULL; + if (rc_src >= 0 && rc_dst >= 0) { + new_e_route = xbt_new0(s_route_extended_t, 1); + new_e_route->generic_route.link_list = links_list; + } else if (!strcmp(src, dst) && are_processing_units) { + new_e_route = xbt_new0(s_route_extended_t, 1); + xbt_dynar_push(links_list, &(global_routing->loopback)); + new_e_route->generic_route.link_list = links_list; + } else { + xbt_dynar_free(&link_list); + } + + if (!are_processing_units && new_e_route) { + rule_route_extended_t ruleroute_extended = + (rule_route_extended_t) ruleroute; + new_e_route->src_gateway = + remplace(ruleroute_extended->re_src_gateway, list_src, rc_src, + list_dst, rc_dst); + new_e_route->dst_gateway = + remplace(ruleroute_extended->re_dst_gateway, list_src, rc_src, + list_dst, rc_dst); + } + + if (list_src) + pcre_free_substring_list(list_src); + if (list_dst) + pcre_free_substring_list(list_dst); + + return new_e_route; +} + +static route_extended_t rulebased_get_bypass_route(routing_component_t rc, + const char *src, + const char *dst) +{ + return NULL; +} + +static void rulebased_finalize(routing_component_t rc) +{ + routing_component_rulebased_t routing = + (routing_component_rulebased_t) rc; + if (routing) { + xbt_dict_free(&routing->dict_processing_units); + xbt_dict_free(&routing->dict_autonomous_systems); + xbt_dynar_free(&routing->list_route); + xbt_dynar_free(&routing->list_ASroute); + /* Delete structure */ + xbt_free(routing); + } +} + +/* Creation routing model functions */ +void *model_rulebased_create(void) +{ + routing_component_rulebased_t new_component = + xbt_new0(s_routing_component_rulebased_t, 1); + new_component->generic_routing.set_processing_unit = + model_rulebased_set_processing_unit; + new_component->generic_routing.set_autonomous_system = + model_rulebased_set_autonomous_system; + new_component->generic_routing.set_route = model_rulebased_set_route; + new_component->generic_routing.set_ASroute = model_rulebased_set_ASroute; + new_component->generic_routing.set_bypassroute = model_rulebased_set_bypassroute; + new_component->generic_routing.get_onelink_routes = rulebased_get_onelink_routes; + new_component->generic_routing.get_route = rulebased_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; + new_component->generic_routing.get_bypass_route = rulebased_get_bypass_route; + new_component->generic_routing.finalize = rulebased_finalize; + new_component->generic_routing.get_network_element_type = get_network_element_type; + /* initialization of internal structures */ + new_component->dict_processing_units = xbt_dict_new(); + new_component->dict_autonomous_systems = xbt_dict_new(); + new_component->list_route = xbt_dynar_new(sizeof(rule_route_t), &rule_route_free); + new_component->list_ASroute = + xbt_dynar_new(sizeof(rule_route_extended_t), + &rule_route_extended_free); + return new_component; +} + +void model_rulebased_load(void) +{ + /* use "surfxml_add_callback" to add a parse function call */ +} + +void model_rulebased_unload(void) +{ + /* use "surfxml_del_callback" to remove a parse function call */ +} + +void model_rulebased_end(void) +{ +} diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 6b48d7f1c8..9244f2da95 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -16,6 +16,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, #undef CLEANUP #include "simgrid_dtd.c" +char *platform_filename; + /* Initialize the parsing globals */ xbt_dict_t traces_set_list = NULL; xbt_dict_t trace_connect_list_host_avail = NULL; @@ -92,6 +94,8 @@ xbt_dynar_t STag_surfxml_bypassRoute_cb_list = NULL; xbt_dynar_t ETag_surfxml_bypassRoute_cb_list = NULL; xbt_dynar_t STag_surfxml_config_cb_list = NULL; xbt_dynar_t ETag_surfxml_config_cb_list = NULL; +xbt_dynar_t STag_surfxml_include_cb_list = NULL; +xbt_dynar_t ETag_surfxml_include_cb_list = NULL; /* store the current property set for any tag */ xbt_dict_t current_property_set = NULL; @@ -112,6 +116,31 @@ static void parse_Stag_trace_connect(void); static void init_randomness(void); static void add_randomness(void); +static xbt_dynar_t surf_input_buffer_stack = NULL; +static xbt_dynar_t surf_file_to_parse_stack = NULL; + +void STag_surfxml_include(void) +{ + XBT_INFO("STag_surfxml_include '%s'",A_surfxml_include_file); + xbt_dynar_push(surf_file_to_parse_stack, &surf_file_to_parse); + + surf_file_to_parse = surf_fopen(A_surfxml_include_file, "r"); + xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", + A_surfxml_include_file); + surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, YY_BUF_SIZE); + surf_parse_push_buffer_state(surf_input_buffer); + fflush(NULL); +} + +void ETag_surfxml_include(void) +{ + fflush(NULL); + fclose(surf_file_to_parse); + xbt_dynar_pop(surf_file_to_parse_stack, &surf_file_to_parse); + surf_parse_pop_buffer_state(); + XBT_INFO("ETag_surfxml_include '%s'",A_surfxml_include_file); +} + /* * This function return 0 or 1 if callbacks are empty or not. */ @@ -152,7 +181,9 @@ int surf_parse_no_callbacks(void) xbt_dynar_is_empty(STag_surfxml_peer_cb_list) && xbt_dynar_is_empty(ETag_surfxml_peer_cb_list) && xbt_dynar_is_empty(STag_surfxml_config_cb_list) && - xbt_dynar_is_empty(ETag_surfxml_config_cb_list); + xbt_dynar_is_empty(ETag_surfxml_config_cb_list) && + xbt_dynar_is_empty(STag_surfxml_include_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_include_cb_list); } void surf_parse_init_callbacks(void) @@ -213,6 +244,10 @@ void surf_parse_init_callbacks(void) xbt_dynar_new(sizeof(void_f_void_t), NULL); ETag_surfxml_config_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_include_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_include_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); } void surf_parse_reset_callbacks(void) @@ -259,6 +294,8 @@ void surf_parse_free_callbacks(void) xbt_dynar_free(&ETag_surfxml_peer_cb_list); xbt_dynar_free(&STag_surfxml_config_cb_list); xbt_dynar_free(&ETag_surfxml_config_cb_list); + xbt_dynar_free(&STag_surfxml_include_cb_list); + xbt_dynar_free(&ETag_surfxml_include_cb_list); } /* Stag and Etag parse functions */ @@ -346,15 +383,26 @@ void surf_parse_open(const char *file) } return; } + + if (!surf_input_buffer_stack) + surf_input_buffer_stack = xbt_dynar_new(sizeof(YY_BUFFER_STATE), NULL); + if (!surf_file_to_parse_stack) + surf_file_to_parse_stack = xbt_dynar_new(sizeof(FILE *), NULL); + surf_file_to_parse = surf_fopen(file, "r"); xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", file); - surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, 10); + surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, YY_BUF_SIZE); surf_parse__switch_to_buffer(surf_input_buffer); surf_parse_lineno = 1; } void surf_parse_close(void) { + if (surf_input_buffer_stack) + xbt_dynar_free(&surf_input_buffer_stack); + if (surf_file_to_parse_stack) + xbt_dynar_free(&surf_file_to_parse_stack); + if (surf_file_to_parse) { surf_parse__delete_buffer(surf_input_buffer); fclose(surf_file_to_parse); @@ -408,7 +456,8 @@ void surfxml_del_callback(xbt_dynar_t cb_list, void_f_void_t function) TRY { it = xbt_dynar_search(cb_list,&function); - } CATCH(e) { + } + CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); xbt_die("Trying to remove a callback that is not here! This should not happen"); @@ -478,25 +527,41 @@ void parse_platform_file(const char *file) /* Prop tag functions */ -void parse_properties(void) -{ - char *value = NULL; - if (!current_property_set) - current_property_set = xbt_dict_new(); // Maybe, it should be make a error - if(!strcmp(A_surfxml_prop_id,"coordinates")){ - if(!strcmp(A_surfxml_prop_value,"yes") && !COORD_HOST_LEVEL) - { - XBT_INFO("Configuration change: Set '%s' to '%s'", A_surfxml_prop_id, A_surfxml_prop_value); - COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); - COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); +void parse_properties(const char* prop_id, const char* prop_value) +{ + char *value = NULL; + if (!current_property_set) + current_property_set = xbt_dict_new(); // Maybe, it should be make a error + if(!strcmp(prop_id,"coordinates")){ + if(!strcmp(prop_value,"yes") && !COORD_HOST_LEVEL) + { + XBT_INFO("Configuration change: Set '%s' to '%s'", prop_id, prop_value); + COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); + COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); + } + if(strcmp(A_surfxml_prop_value,"yes")) + xbt_die("Setting XML prop coordinates must be \"yes\""); } - if(strcmp(A_surfxml_prop_value,"yes")) - xbt_die("Setting XML prop coordinates must be \"yes\""); - } - else{ - value = xbt_strdup(A_surfxml_prop_value); - xbt_dict_set(current_property_set, A_surfxml_prop_id, value, free); - } + else{ + value = xbt_strdup(prop_value); + xbt_dict_set(current_property_set, prop_id, value, free); + } +} + +/** + * With XML parser + */ +void parse_properties_XML(void) +{ + parse_properties(A_surfxml_prop_id, A_surfxml_prop_value); +} + +/* + * With lua console + */ +void parse_properties_lua(const char* prop_id, const char* prop_value) +{ + parse_properties(prop_id, prop_value); } /* Trace management functions */ diff --git a/src/xbt/backtrace_linux.c b/src/xbt/backtrace_linux.c index 1892aa1b83..e4eda28d87 100644 --- a/src/xbt/backtrace_linux.c +++ b/src/xbt/backtrace_linux.c @@ -28,6 +28,12 @@ void xbt_backtrace_postexit(void) void xbt_backtrace_current(xbt_ex_t * e) { e->used = backtrace((void **) e->bt, XBT_BACKTRACE_SIZE); + if (e->used == 0) { + fprintf(stderr, "The backtrace() function failed, which probably means that the memory is exhausted. Here is a crude dump of the exception that I was trying to build:"); + fprintf(stderr, "%s:%s(%d) [%s:%d] %s", e->host,e->procname,e->pid, e->file,e->line,e->msg); + fprintf(stderr, "Bailing out now since there is nothing I can do without a decent amount of memory. Please go fix the memleaks\n"); + exit(1); + } } @@ -185,10 +191,8 @@ void xbt_ex_setup_backtrace(xbt_ex_t * e) maps_name = bprintf("/proc/%d/maps", (int) getpid()); maps = fopen(maps_name, "r"); - sscanf(addrs[i], "%lx", &addr); - sprintf(maps_buff, "%#lx", addr); - - if (strcmp(addrs[i], maps_buff)) { + addr = strtol(addrs[i], &p, 16); + if (*p != '\0') { XBT_CRITICAL("Cannot parse backtrace address '%s' (addr=%#lx)", addrs[i], addr); } diff --git a/src/xbt/config.c b/src/xbt/config.c index a5207db770..a9071df134 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -18,7 +18,6 @@ #include "xbt/peer.h" #include "xbt/config.h" /* prototypes of this module */ -#include "surf/surf.h" /* COORD_HOST_LEVEL and COORD_ASR_LEVEL */ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support"); @@ -292,7 +291,7 @@ void xbt_cfg_unregister(xbt_cfg_t cfg, const char *name) * Each of them must use the following syntax: \:\_to_\_\ * with type being one of 'string','int', 'peer' or 'double'. * - * @fixme: this does not allow to set the description + * FIXME: this does not allow to set the description */ void xbt_cfg_register_str(xbt_cfg_t * cfg, const char *entry) @@ -516,7 +515,8 @@ void xbt_cfg_set_vargs(xbt_cfg_t cfg, const char *name, va_list pa) TRY { type = xbt_cfg_get_type(cfg, name); - } CATCH(e) { + } + CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); THROWF(not_found_error, 0, @@ -651,33 +651,21 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) } *(val++) = '\0'; - if (!strcmp(name,"coordinates")){ - if(!strcmp(val,"yes") && !COORD_HOST_LEVEL){ - XBT_INFO("Configuration change: Set '%s' to '%s'", name, val); - COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); - COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); - free(optionlist_cpy); - return; - } - if(strcmp(val,"yes")) - xbt_die("Setting CMD prop coordinates must be \"yes\""); - } - - if (strcmp(name,"contexts/factory")) + if (strncmp(name, "contexts/", strlen("contexts/"))) XBT_INFO("Configuration change: Set '%s' to '%s'", name, val); TRY { variable = xbt_dict_get((xbt_dict_t) cfg, name); } CATCH(e) { - /* put it back on what won't get freed, ie within "options" and out of "optionlist_cpy" */ - name = (char *) (optionlist_cpy - name + options); - free(optionlist_cpy); if (e.category == not_found_error) { xbt_ex_free(e); + name = xbt_strdup(name); + free(optionlist_cpy); THROWF(not_found_error, 0, "No registered variable corresponding to '%s'.", name); } + free(optionlist_cpy); RETHROW; } @@ -732,7 +720,7 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) name); } } - CATCH(e) { + CATCH_ANONYMOUS { free(optionlist_cpy); RETHROW; } @@ -1145,7 +1133,8 @@ void xbt_cfg_empty(xbt_cfg_t cfg, const char *name) TRY { variable = xbt_dict_get((xbt_dict_t) cfg, name); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) RETHROW; @@ -1306,7 +1295,8 @@ xbt_dynar_t xbt_cfg_get_dynar(xbt_cfg_t cfg, const char *name) TRY { variable = xbt_dict_get((xbt_dict_t) cfg, name); - } CATCH(e) { + } + CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); THROWF(not_found_error, 0, @@ -1485,7 +1475,8 @@ XBT_TEST_UNIT("use", test_config_use, "Data retrieving tests") TRY { xbt_cfg_set_parse(myset, "color:blue"); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) xbt_test_exception(e); xbt_ex_free(e); diff --git a/src/xbt/dict.c b/src/xbt/dict.c index 82c8a9c15a..d4320000f1 100644 --- a/src/xbt/dict.c +++ b/src/xbt/dict.c @@ -941,7 +941,8 @@ static void search_not_found(xbt_dict_t head, const char *data) data = xbt_dict_get(head, data); THROWF(unknown_error, 0, "Found something which shouldn't be there (%s)", data); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) xbt_test_exception(e); xbt_ex_free(e); @@ -1014,7 +1015,8 @@ XBT_TEST_UNIT("basic", test_dict_basic, "Basic usage: change, retrieve, traverse traverse(head); TRY { debuged_remove(head, "12346"); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) xbt_test_exception(e); xbt_ex_free(e); @@ -1248,7 +1250,7 @@ static int countelems(xbt_dict_t head) XBT_TEST_UNIT("crash", test_dict_crash, "Crash test") { xbt_dict_t head = NULL; - int i, j, k, nb; + int i, j, k; char *key; void *data; @@ -1263,7 +1265,6 @@ XBT_TEST_UNIT("crash", test_dict_crash, "Crash test") SIZEOFKEY); head = xbt_dict_new(); /* if (i%10) printf("."); else printf("%d",i/10); fflush(stdout); */ - nb = 0; for (j = 0; j < 1000; j++) { char *data = NULL; key = xbt_malloc(SIZEOFKEY); diff --git a/src/xbt/dict_multi.c b/src/xbt/dict_multi.c index a11b2c96ce..6dc05e09f2 100644 --- a/src/xbt/dict_multi.c +++ b/src/xbt/dict_multi.c @@ -85,7 +85,6 @@ xbt_multidict_set(xbt_dict_t mdict, { xbt_dynar_t lens = xbt_dynar_new(sizeof(unsigned long int), NULL); unsigned long i; - xbt_ex_t e; for (i = 0; i < xbt_dynar_length(keys); i++) { char *thiskey = xbt_dynar_get_as(keys, i, char *); @@ -96,9 +95,11 @@ xbt_multidict_set(xbt_dict_t mdict, TRY { xbt_multidict_set_ext(mdict, keys, lens, data, free_ctn); - } TRY_CLEANUP { + } + TRY_CLEANUP { xbt_dynar_free(&lens); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROW; } } @@ -221,8 +222,6 @@ xbt_multidict_remove_ext(xbt_dict_t mdict, xbt_dynar_t keys, void xbt_multidict_remove(xbt_dict_t mdict, xbt_dynar_t keys) { - - xbt_ex_t e; xbt_dynar_t lens = xbt_dynar_new(sizeof(unsigned long int), NULL); unsigned long i; @@ -234,9 +233,11 @@ void xbt_multidict_remove(xbt_dict_t mdict, xbt_dynar_t keys) TRY { xbt_multidict_remove_ext(mdict, keys, lens); - } TRY_CLEANUP { + } + TRY_CLEANUP { xbt_dynar_free(&lens); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROW; } } diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 52d11fbada..b5468e3b9f 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -86,27 +86,18 @@ static XBT_INLINE const unsigned long old_size = dynar->size; if (nb > old_size) { - char *const old_data = (char *) dynar->data; - + void *const old_data = dynar->data; const unsigned long elmsize = dynar->elmsize; + const unsigned long old_length = old_size * elmsize; - const unsigned long used = dynar->used; - const unsigned long used_length = used * elmsize; - - const unsigned long new_size = - nb > (2 * (old_size + 1)) ? nb : (2 * (old_size + 1)); + const unsigned long expand = 2 * (old_size + 1); + const unsigned long new_size = (nb > expand ? nb : expand); const unsigned long new_length = new_size * elmsize; - char *const new_data = (char *) xbt_malloc0(elmsize * new_size); + void *const new_data = xbt_realloc(old_data, new_length); - XBT_DEBUG("expand %p from %lu to %lu elements", (void *) dynar, - (unsigned long) old_size, nb); - - if (old_data) { - memcpy(new_data, old_data, used_length); - free(old_data); - } + XBT_DEBUG("expand %p from %lu to %lu elements", dynar, old_size, new_size); - _xbt_clear_mem(new_data + used_length, new_length - used_length); + _xbt_clear_mem((char *)new_data + old_length, new_length - old_length); dynar->size = new_size; dynar->data = new_data; @@ -583,7 +574,8 @@ int xbt_dynar_member(xbt_dynar_t const dynar, void *const elem) TRY { xbt_dynar_search(dynar, elem); - } CATCH(e) { + } + CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); return 0; @@ -676,12 +668,13 @@ XBT_INLINE void xbt_dynar_shift(xbt_dynar_t const dynar, void *const dst) static void _dynar_map(const xbt_dynar_t dynar, void_f_pvoid_t const op) { - char elm[SIZEOF_MAX]; + char *const data = (char *) dynar->data; + const unsigned long elmsize = dynar->elmsize; const unsigned long used = dynar->used; - unsigned long i = 0; + unsigned long i; for (i = 0; i < used; i++) { - _xbt_dynar_get_elm(elm, dynar, i); + char* elm = (char*) data + i * elmsize; (*op) (elm); } } @@ -744,8 +737,11 @@ XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar, _dynar_lock(dynar); +#ifdef HAVE_MERGESORT + mergesort(dynar->data, dynar->used, dynar->elmsize, compar_fn); +#else qsort(dynar->data, dynar->used, dynar->elmsize, compar_fn); - +#endif _dynar_unlock(dynar); } diff --git a/src/xbt/ex.c b/src/xbt/ex.c index 5087b0c92f..b2052e1c81 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -266,7 +266,7 @@ XBT_TEST_UNIT("controlflow", test_controlflow, "basic nested control flow") n++; THROWF(unknown_error, 0, "something"); } - CATCH(ex) { + CATCH_ANONYMOUS { if (n != 6) xbt_test_fail("M3: n=%d (!= 6)", n); n++; @@ -315,7 +315,8 @@ XBT_TEST_UNIT("variables", test_variables, "variable value preservation") r2 = 5678; v2 = 5678; THROWF(unknown_error, 0, "toto"); - } CATCH(ex) { + } + CATCH(ex) { xbt_test_add("variable preservation"); if (r1 != 1234) xbt_test_fail("r1=%d (!= 1234)", r1); @@ -341,7 +342,8 @@ XBT_TEST_UNIT("cleanup", test_cleanup, "cleanup handling") TRY { v1 = 5678; THROWF(1, 2, "blah"); - } TRY_CLEANUP { + } + TRY_CLEANUP { if (v1 != 5678) xbt_test_fail("v1 = %d (!= 5678)", v1); c = 1; @@ -389,7 +391,8 @@ static void bad_example(void) cp3 = mallocex(SMALLAMOUNT); strcpy(cp1, "foo"); strcpy(cp2, "bar"); - } TRY_CLEANUP { + } + TRY_CLEANUP { if (cp3 != NULL) free(cp3); if (cp2 != NULL) @@ -397,7 +400,7 @@ static void bad_example(void) if (cp1 != NULL) free(cp1); } - CATCH(ex) { + CATCH_ANONYMOUS { printf("cp3=%s", cp3); RETHROW; } @@ -411,7 +414,6 @@ typedef struct { static void good_example(void) { global_context_t *global_context = malloc(sizeof(global_context_t)); - xbt_ex_t ex; /* GOOD_EXAMPLE */ { /*01 */ @@ -426,7 +428,8 @@ static void good_example(void) cp3 = mallocex(SMALLAMOUNT); strcpy(cp1, "foo"); strcpy(cp2, "bar"); - } TRY_CLEANUP { /*04 */ + } + TRY_CLEANUP { /*04 */ printf("cp3=%s", cp3 == NULL /*02 */ ? "" : cp3); if (cp3 != NULL) free(cp3); @@ -434,7 +437,7 @@ static void good_example(void) free(cp2); /*05 cp1 was given away */ } - CATCH(ex) { + CATCH_ANONYMOUS { /*05 global context untouched */ RETHROW; } diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 7dc01d15c9..14ed08dc52 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -6,6 +6,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "simgrid_config.h" /* getline */ +#include #include #include "xbt/sysdep.h" #include "xbt/log.h" @@ -14,6 +16,7 @@ #include "xbt/graphxml_parse.h" #include "xbt/dict.h" #include "xbt/heap.h" +#include "xbt/str.h" @@ -725,3 +728,109 @@ void xbt_graph_export_graphxml(xbt_graph_t g, const char *filename, fprintf(file, "\n"); fclose(file); } + +/** @brief Load a graph from a file (in the SimGrid Graph format) */ +xbt_graph_t xbt_graph_load (const char *filename) +{ + FILE *file = NULL; + ssize_t read; + file = fopen (filename, "r"); + xbt_assert(file, "Failed to open %s \n", filename); + + xbt_dict_t nodes_dict = xbt_dict_new (); + xbt_graph_t ret = xbt_graph_new_graph (0, NULL); + + //read the number of nodes + size_t size; + char *nnodes_str = NULL; + read = getline (&nnodes_str, &size, file); + if (read == -1) + THROWF(system_error, 0, "getline failed to read the number of nodes (errno = %d)", errno); + int i, nnodes = atoi (nnodes_str); + free (nnodes_str); + + //read all nodes + for (i = 0; i < nnodes; i++){ + char *node_str = NULL; + read = getline (&node_str, &size, file); + if (read == -1) + THROWF(system_error, 0, "getline failed to read all nodes (errno = %d)", errno); + xbt_node_t n; + char *name = xbt_strdup (node_str); + xbt_str_subst (name, '\n', '\0', 0); + n = xbt_graph_new_node (ret, name); + xbt_dict_set (nodes_dict, name, n, NULL); + free (node_str); + } + + //read the number of edges + char *nedges_str = NULL; + read = getline (&nedges_str, &size, file); + if (read == -1) + THROWF(system_error, 0, "getline failed to read the number of edges (errno = %d)", errno); + int nedges = atoi (nedges_str); + free (nedges_str); + + //read all edges + for (i = 0; i < nedges; i++){ + char *edge_str = NULL, edge_id[200], node_source[200], node_target[200]; + read = getline (&edge_str, &size, file); + if (read == -1) + THROWF(system_error, 0, "getline failed to read all edges (errno = %d)", errno); + sscanf (edge_str, "%s %s %s", edge_id, node_source, node_target); + free (edge_str); + xbt_str_subst (edge_id, '\n', '\0', 0); + xbt_str_subst (node_source, '\n', '\0', 0); + xbt_str_subst (node_target, '\n', '\0', 0); + + xbt_node_t source = xbt_dict_get (nodes_dict, node_source); + xbt_node_t target = xbt_dict_get (nodes_dict, node_target); + xbt_graph_new_edge (ret, source, target, xbt_strdup(edge_id)); + } + xbt_dict_free (&nodes_dict); + return ret; +} + +/** @brief Save a graph from a file (in the SimGrid Graph format) */ +void xbt_graph_save (xbt_graph_t span, + const char *filename, + const char *(nname) (xbt_node_t), + const char *(ename) (xbt_edge_t)) +{ + FILE *file = NULL; + file = fopen(filename, "w"); + xbt_assert(file, "Failed to open %s \n", filename); + + xbt_dynar_t nodes = xbt_graph_get_nodes (span); + xbt_dynar_t edges = xbt_graph_get_edges (span); + unsigned int cpt; + xbt_node_t node; + fprintf (file, "%ld\n", xbt_dynar_length (nodes)); + xbt_dynar_foreach (nodes, cpt, node) { + if (nname){ + fprintf (file, "%s\n", nname(node)); + }else{ + fprintf (file, "%p\n", node); + } + } + fprintf (file, "%ld\n", xbt_dynar_length (edges)); + xbt_edge_t edge; + xbt_dynar_foreach (edges, cpt, edge) { + xbt_node_t source = xbt_graph_edge_get_source (edge); + xbt_node_t target = xbt_graph_edge_get_target (edge); + if (ename){ + if (nname){ + fprintf (file, "%s %s %s\n", ename(edge), nname(source), nname(target)); + }else{ + fprintf (file, "%s %p %p\n", ename(edge), source, target); + } + }else{ + if (nname){ + fprintf (file, "%p %s %s\n", edge, nname(source), nname(target)); + }else{ + fprintf (file, "%p %p %p\n", edge, source, target); + } + } + } + fclose (file); +} diff --git a/src/xbt/graphxml.c b/src/xbt/graphxml.c index 42ca4d595d..59d9895d55 100644 --- a/src/xbt/graphxml.c +++ b/src/xbt/graphxml.c @@ -1054,7 +1054,6 @@ int xbt_graph_parse__flex_debug = 0; #define YY_RESTORE_YY_MORE_OFFSET char *xbt_graph_parse_text; /* Validating XML processor for src/xbt/graphxml.dtd. - * Generated 2010/12/01 17:15:43. * * This program was generated with the FleXML XML processor generator. * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. diff --git a/src/xbt/graphxml.l b/src/xbt/graphxml.l deleted file mode 100644 index 2c880a00e7..0000000000 --- a/src/xbt/graphxml.l +++ /dev/null @@ -1,723 +0,0 @@ -/* Validating XML processor for src/xbt/graphxml.dtd. - * Generated 2010/12/01 17:15:43. - * - * This program was generated with the FleXML XML processor generator. - * FleXML is Copyright (C) 1999-2005 Kristoffer Rose. All rights reserved. - * FleXML is Copyright (C) 2003-2006 Martin Quinson. All rights reserved. - * (Id: flexml.pl,v 1.62 2007/10/11 10:00:14 mquinson Exp). - * - * There are two, intertwined parts to this program, part A and part B. - * - * Part A - * ------ - * - * Some parts, here collectively called "Part A", are found in the - * FleXML package. They are Copyright (C) 1999-2005 Kristoffer Rose - * and Copyright (C) 2003-2006 Martin Quinson. All rights reserved. - * - * You can redistribute, use, perform, display and/or modify "Part A" - * provided the following two conditions hold: - * - * 1. The program is distributed WITHOUT ANY WARRANTY from the author of - * FleXML; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - * - * 2. The program distribution conditions do not in any way affect the - * distribution conditions of the FleXML system used to generate this - * file or any version of FleXML derived from that system. - * - * Notice that these are explicit rights granted to you for files - * generated by the FleXML system. For your rights in connection with - * the FleXML system itself please consult the GNU General Public License. - * - * Part B - * ------ - * - * The other parts, here collectively called "Part B", and which came - * from the DTD used by FleXML to generate this program, can be - * distributed (or not, as the case may be) under the terms of whoever - * wrote them, provided these terms respect and obey the two conditions - * above under the heading "Part A". - * - * The author of and contributors to FleXML specifically disclaim - * any copyright interest in "Part B", unless "Part B" was written - * by the author of or contributors to FleXML. - * - */ - -%{ - -/* Version strings. */ -const char rcs_graphxml_flexml_skeleton[] = - "$" "Id: skel,v 1.40 2007/10/11 09:57:24 mquinson Exp $"; -const char rcs_graphxml_flexml[] = - "$" "Id: flexml.pl,v 1.62 2007/10/11 10:00:14 mquinson Exp $"; - -/* ANSI headers. */ -#include /* for realloc() -- needed here when using flex 2.5.4 */ -#include -#include -#include -#include -#include - -#if defined(_XBT_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__TOS_WIN__) -# ifndef __STRICT_ANSI__ -# include -# include -# endif -#else -# include -#endif - -#ifndef FLEXML_INDEXSTACKSIZE -#define FLEXML_INDEXSTACKSIZE 1000 -#endif - -/* Generated definitions. */ -#define FLEXML_yylineno -#ifndef FLEXML_BUFFERSTACKSIZE -#define FLEXML_BUFFERSTACKSIZE 1000000 -#endif -#define FLEXML_NEED_BUFFERLIT - -/* XML processor api. */ -/* FleXML-provided data. */ -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) -AT_graphxml_edge_source AX_graphxml_edge_source; -#define A_graphxml_edge_source (graphxml_bufferstack + AX_graphxml_edge_source) -AT_graphxml_node_position_y AX_graphxml_node_position_y; -#define A_graphxml_node_position_y (graphxml_bufferstack + AX_graphxml_node_position_y) -AT_graphxml_node_position_x AX_graphxml_node_position_x; -#define A_graphxml_node_position_x (graphxml_bufferstack + AX_graphxml_node_position_x) -AT_graphxml_edge_data AX_graphxml_edge_data; -#define A_graphxml_edge_data (graphxml_bufferstack + AX_graphxml_edge_data) -AT_graphxml_edge_target AX_graphxml_edge_target; -#define A_graphxml_edge_target (graphxml_bufferstack + AX_graphxml_edge_target) -AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected; -#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected -AT_graphxml_node_label AX_graphxml_node_label; -#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label) -AT_graphxml_node_data AX_graphxml_node_data; -#define A_graphxml_node_data (graphxml_bufferstack + AX_graphxml_node_data) -AT_graphxml_edge_label AX_graphxml_edge_label; -#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label) -AT_graphxml_edge_length AX_graphxml_edge_length; -#define A_graphxml_edge_length (graphxml_bufferstack + AX_graphxml_edge_length) -AT_graphxml_edge_name AX_graphxml_edge_name; -#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name) - -/* XML state. */ -#ifdef FLEX_DEBUG -# define ENTER(state) debug_enter(state,#state) -# define LEAVE debug_leave() -# define SET(state) debug_set(state,#state) - static void debug_enter(int, const char*); - static void debug_leave(void); - static void debug_set(int, const char*); -#else -# define ENTER(state) (yy_push_state(state)) -# define LEAVE (yy_pop_state()) -# define SET(state) BEGIN(state) -#endif - -/* Generic actions. */ -#define SKIP /*skip*/ -#define SUCCEED CLEANUP; return 0 - -#define FAIL return fail -static int fail(const char*, ...); - -enum {flexml_max_err_msg_size = 512}; -static char flexml_err_msg[flexml_max_err_msg_size]; -const char * graphxml_parse_err_msg() -{ - return flexml_err_msg; -} -static void reset_graphxml_parse_err_msg() -{ - flexml_err_msg[0] = '\0'; -} - -/* Cleanup */ -static void cleanup(void); -#define CLEANUP cleanup() - -/* Text buffer stack handling. */ -char *graphxml_bufferstack = NULL; -static int blimit = FLEXML_BUFFERSTACKSIZE; -static int bnext = 1; - -static int *indexstack = NULL; -static int ilimit = FLEXML_INDEXSTACKSIZE; -static int inext = 1; - -#define BUFFERSET(P) (P = bnext) -#define BUFFERPUTC(C) (ck_blimit(), graphxml_bufferstack[bnext++] = (C)) -#define BUFFERDONE (BUFFERPUTC('\0')) - -#define BUFFERLITERAL(C, P) graphxml_bufferliteral(C, &(P), yytext) - -/* after this is called, there are at least 2 slots left in the stack */ -static int ck_blimit() -{ - if (bnext >= blimit) { - blimit += FLEXML_BUFFERSTACKSIZE + 2; - { - char *temp = (char *) realloc(graphxml_bufferstack, blimit); - assert(temp); - graphxml_bufferstack = temp; - } - } - return 0; -} - -/* after this is called, there are at least 2 slots left in the stack */ -static int ck_ilimit() -{ - if (inext >= ilimit) { - ilimit += FLEXML_INDEXSTACKSIZE + 2; - { - int *temp = (int *) realloc(indexstack, ilimit); - assert(temp); - indexstack = temp; - } - } - return 0; -} - -#ifdef FLEXML_NEED_BUFFERLIT -static void graphxml_bufferliteral(char c, int* pp, const char* text) -{ - const char *s = (c ? strchr(text,c) : text-1), *e = strrchr(text,c); - assert(s <= e); BUFFERSET(*pp); - while (++s= 2); - bnext = indexstack[--inext]; - return indexstack[--inext]; -} - -/* General internal entities are `unput' back onto the input stream... */ -#define ENTITYTEXT(T) \ - { char *s = (T), *e = s+strlen(s);\ - while (--e >= s) { unput(*e); }} - - -%} - -/* Flex standard options. */ -%option stack -%option noyy_top_state -%option noinput -%option noreject -%option noyymore -%option noyywrap - -/* Flex user-requested options. */ -%option yylineno -%option nounput - -/* XML character classes (currently restricted to ASCII). */ - -/* "Common syntactic structures." */ -S [ \t\n\r\f]+ -s [ \t\n\r\f]* - -/* "Names and Tokens." */ -NameChar [A-Za-z0-9.:_-] -Name [A-Za-z_:]{NameChar}* -Names {Name}({S}{Name})* -Nmtoken ({NameChar})+ -Nmtokens {Nmtoken}({S}{Nmtoken})* - -/* Miscellaneous. */ -VersionNum [a-zA-Z0-9_.:-]+ -Eq {s}"="{s} -Literal \'[^'']*\'|\"[^""]*\" - -/* Parser states (flex `exclusive start conditions'): - * - * PROLOG the XML prolog of the document before - * DOCTYPE the XML prolog of the document after - * EPILOG after the root element - * INCOMMENT inside an XML comment - * INPI inside an XML PI - * VALUE1 inside a '...'-delimited literal - * VALUE2 inside a "..."-delimited literal - * CDATA inside a section. - * ROOT_ expect root element - * AL_ inside the attribute list for - * IN_ inside a with element contents (ready for end tag) - * IMPOSSIBLE dummy to permit disabling rules; must be last - */ -%x PROLOG DOCTYPE EPILOG INCOMMENT INPI VALUE1 VALUE2 CDATA -%x ROOT_graphxml_graph AL_graphxml_graph S_graphxml_graph S_graphxml_graph_1 S_graphxml_graph_2 S_graphxml_graph_3 S_graphxml_graph_4 S_graphxml_graph_5 E_graphxml_graph -%x ROOT_graphxml_node AL_graphxml_node E_graphxml_node -%x ROOT_graphxml_edge AL_graphxml_edge E_graphxml_edge -%x IMPOSSIBLE - -%{ -/* State names. */ -const char* *graphxml_statenames=NULL; -%} - -%% - - /* Bypass Flex's default INITIAL state and begin by parsing the XML prolog. */ - SET(PROLOG); - reset_graphxml_parse_err_msg(); - graphxml_bufferstack = (char *) malloc(FLEXML_BUFFERSTACKSIZE); - assert(graphxml_bufferstack); - #ifdef FLEX_DEBUG - { - int i; - for (i = 0; i < blimit; i++) { - graphxml_bufferstack[i] = '\377'; - } - } - #endif - graphxml_bufferstack[0] = '\0'; - indexstack = (int *) malloc(FLEXML_INDEXSTACKSIZE * sizeof(int)); - assert(indexstack); - indexstack[0] = 0; - - /* FleXML_init */ - bnext = inext = 1; - graphxml_bufferliteral('\0', &bnext, "-1.0"); - graphxml_bufferliteral('\0', &bnext, "-1.0"); - graphxml_bufferliteral('\0', &bnext, "-1.0"); - if(!graphxml_statenames) {graphxml_statenames= (const char **)calloc(IMPOSSIBLE,sizeof(char*)); - graphxml_statenames[PROLOG] = NULL; - graphxml_statenames[DOCTYPE] = NULL; - graphxml_statenames[EPILOG] = NULL; - graphxml_statenames[INCOMMENT] = NULL; - graphxml_statenames[INPI] = NULL; - graphxml_statenames[VALUE1] = NULL; - graphxml_statenames[VALUE2] = NULL; - graphxml_statenames[CDATA] = NULL; - graphxml_statenames[ROOT_graphxml_graph] = NULL; - graphxml_statenames[AL_graphxml_graph] = NULL; - graphxml_statenames[S_graphxml_graph] = "graph"; - graphxml_statenames[S_graphxml_graph_1] = "graph"; - graphxml_statenames[S_graphxml_graph_2] = "graph"; - graphxml_statenames[S_graphxml_graph_3] = "graph"; - graphxml_statenames[S_graphxml_graph_4] = "graph"; - graphxml_statenames[S_graphxml_graph_5] = "graph"; - graphxml_statenames[E_graphxml_graph] = "graph"; - graphxml_statenames[ROOT_graphxml_node] = NULL; - graphxml_statenames[AL_graphxml_node] = NULL; - graphxml_statenames[E_graphxml_node] = "node"; - graphxml_statenames[ROOT_graphxml_edge] = NULL; - graphxml_statenames[AL_graphxml_edge] = NULL; - graphxml_statenames[E_graphxml_edge] = "edge"; - } - - /* COMMENTS and PIs: handled uniformly for efficiency. */ - -{ - "" LEAVE; - "--" | - . | - \n SKIP; - <> FAIL("EOF in comment."); -} -{ - "?>" LEAVE; - . | - \n SKIP; - <> FAIL("EOF in PI (processing instruction)."); -} - - /* SPACES: skipped uniformly */ - -{S} SKIP; - - /* PROLOG: determine root element and process it. */ - -{ - "" SET(DOCTYPE); - "]*">" FAIL("Bad declaration %s.",yytext); -} - -{ - "" SET(ROOT_graphxml_edge); - "" SET(ROOT_graphxml_node); - "" SET(ROOT_graphxml_graph); - "-][^>]*">" FAIL("Bad declaration %s.",yytext); - . FAIL("Unexpected character `%c' in prolog.", yytext[0]); - <> FAIL("EOF in prolog."); -} - - /* RULES DERIVED FROM DTD. */ - - /* */ - - /* isDirected (true|false) "true" - * > */ - -" is not allowed here."); - -"{ - "isDirected"{Eq}"'true'" | - "isDirected"{Eq}"\"true\"" A_graphxml_graph_isDirected = A_graphxml_graph_isDirected_true; - "isDirected"{Eq}"'false'" | - "isDirected"{Eq}"\"false\"" A_graphxml_graph_isDirected = A_graphxml_graph_isDirected_false; - - ">" { - LEAVE; STag_graphxml_graph();graphxml_pcdata_ix = 0; ENTER(S_graphxml_graph); - } - "/>" { - LEAVE; STag_graphxml_graph(); graphxml_pcdata_ix = 0; ETag_graphxml_graph(); popbuffer(); /* attribute */ - switch (YY_START) { - case ROOT_graphxml_graph: SET(EPILOG); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of graph element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `graph' element start tag.",yytext); - <> FAIL("EOF in attribute list of `graph' element."); -} - -{ - "" { - LEAVE; - ETag_graphxml_graph(); - popbuffer(); /* attribute */ - switch (YY_START) { - case ROOT_graphxml_graph: SET(EPILOG); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* label CDATA "" - * name CDATA #REQUIRED - * data CDATA "" - * position_x CDATA "-1.0" - * position_y CDATA "-1.0" - * > */ - -" is not allowed here."); - -"{ - "label"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_node_label); - "label"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_node_label); - - "name"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_node_name); - "name"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_node_name); - - "data"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_node_data); - "data"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_node_data); - - "position_x"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_node_position_x); - "position_x"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_node_position_x); - - "position_y"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_node_position_y); - "position_y"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_node_position_y); - - ">" { - if (!AX_graphxml_node_name) FAIL("Required attribute `name' not set for `node' element."); - LEAVE; STag_graphxml_node();graphxml_pcdata_ix = 0; ENTER(E_graphxml_node); - } - "/>" { - 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 ROOT_graphxml_node: SET(EPILOG); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of node element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `node' element start tag.",yytext); - <> FAIL("EOF in attribute list of `node' element."); -} - -{ - "" { - LEAVE; - 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 ROOT_graphxml_node: SET(EPILOG); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* label CDATA "" - * name CDATA #IMPLIED - * source CDATA #REQUIRED - * target CDATA #REQUIRED - * length CDATA "-1.0" - * data CDATA "" - * > */ - -" is not allowed here."); - -"{ - "label"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_edge_label); - "label"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_edge_label); - - "name"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_edge_name); - "name"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_edge_name); - - "source"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_edge_source); - "source"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_edge_source); - - "target"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_edge_target); - "target"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_edge_target); - - "length"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_edge_length); - "length"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_edge_length); - - "data"{Eq}\' ENTER(VALUE1); BUFFERSET(AX_graphxml_edge_data); - "data"{Eq}\" ENTER(VALUE2); BUFFERSET(AX_graphxml_edge_data); - - ">" { - if (!AX_graphxml_edge_source) FAIL("Required attribute `source' not set for `edge' element."); - if (!AX_graphxml_edge_target) FAIL("Required attribute `target' not set for `edge' element."); - LEAVE; STag_graphxml_edge();graphxml_pcdata_ix = 0; ENTER(E_graphxml_edge); - } - "/>" { - if (!AX_graphxml_edge_source) FAIL("Required attribute `source' not set for `edge' element."); - 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 ROOT_graphxml_edge: SET(EPILOG); break; - } - } - . FAIL("Unexpected character `%c' in attribute list of edge element.", yytext[0]); - {Name} FAIL("Bad attribute `%s' in `edge' element start tag.",yytext); - <> FAIL("EOF in attribute list of `edge' element."); -} - -{ - "" { - LEAVE; - 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 ROOT_graphxml_edge: SET(EPILOG); break; - } - } - "" FAIL("Unexpected end-tag `%s': `' expected.",yytext); - . FAIL("Unexpected character `%c': `' expected.",yytext[0]); - <> FAIL("Premature EOF: `' expected."); -} - - /* EPILOG: after the root element. */ - -{ - . {SET(PROLOG); yyless(0); CLEANUP; return -1;} - <> SUCCEED; -} - - /* CHARACTER DATA. */ - -{ - /* Non-defined standard entities... */ -"&" BUFFERPUTC('&'); -"<" BUFFERPUTC('<'); -">" BUFFERPUTC('>'); -"'" BUFFERPUTC('\''); -""" BUFFERPUTC('"'); - - /* Character entities. */ - "&#"[[:digit:]]+";" BUFFERPUTC((unsigned char)atoi(yytext+2)); - "&#x"[[:xdigit:]]+";" BUFFERPUTC((unsigned char)strtol(yytext+3,NULL,16)); -} - -{ - "\n" | - "\r" | - "\r\n" | - "\n\r" BUFFERPUTC('\n'); -} - -{ - "" FAIL("Unexpected `]""]>' in character data."); -} - -{ - \' BUFFERDONE; LEAVE; - <> FAIL("EOF in literal (\"'\" expected)."); -} - -{ - \" BUFFERDONE; LEAVE; - <> FAIL("EOF in literal (`\"' expected)."); -} - -{ - [^<&] BUFFERPUTC(yytext[0]); - [<&] FAIL("Spurious `%c' in character data.",yytext[0]); -} - -{ - "]""]>" LEAVE; - /* "]""]" BUFFERPUTC(yytext[0]); BUFFERPUTC(yytext[1]); */ - . BUFFERPUTC(yytext[0]); - <> FAIL("EOF in CDATA section."); -} - - /* Impossible rules to avoid warnings from flex(1). */ - /* Ideally, this should be replaced by code in flexml.pl that - generates just the states not covered by other rules. */ -<*>{ - .|[\n] FAIL("Syntax error on character `%c'.", yytext[0]); -} - -%% - -/* Element context stack lookup. */ -int graphxml_element_context(int i) -{ - return (0extremely
verbose while \verbatim --log=root.thres:critical\endverbatim should shut it almost -completely off. +completely off. The full list of recognized thresholds is the following: + + - trace: enter and return of some functions + - debug: crufty output + - verbose: verbose output for the user wanting more + - info: output about the regular functionning + - warning: minor issue encountered + - error: issue encountered + - critical: major issue encountered \subsection log_use_conf_multi 3.1.2 Passing several settings @@ -456,11 +466,7 @@ The default appender function currently prints to stderr, and the only other existing one writes to the specified file. More would be needed, like the one able to send the logs to a remote dedicated server. This is on our TODO list for quite a while now, but your help would be -welcome here, too. - - - *//*' */ - +welcome here, too. */ xbt_log_appender_t xbt_log_default_appender = NULL; /* set in log_init */ xbt_log_layout_t xbt_log_default_layout = NULL; /* set in log_init */ @@ -526,6 +532,7 @@ void xbt_log_preinit(void) xbt_log_default_layout = xbt_log_layout_simple_new(NULL); _XBT_LOGV(XBT_LOG_ROOT_CAT).appender = xbt_log_default_appender; _XBT_LOGV(XBT_LOG_ROOT_CAT).layout = xbt_log_default_layout; + log_cat_init_mutex = xbt_os_rmutex_init(); } /** @brief Get all logging settings from the command line @@ -592,6 +599,7 @@ static void log_cat_exit(xbt_log_category_t cat) void xbt_log_postexit(void) { XBT_VERB("Exiting log"); + xbt_os_rmutex_destroy(log_cat_init_mutex); xbt_dynar_free(&xbt_log_settings); log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT)); } @@ -618,10 +626,6 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) } va_end(ev->ap); va_end(ev->ap_copy); - -#ifdef _XBT_WIN32 - free(ev->buffer); -#endif } /* NOTE: @@ -683,6 +687,17 @@ int _xbt_log_cat_init(xbt_log_category_t category, { #define _xbt_log_cat_init(a, b) (0) + if (log_cat_init_mutex != NULL) { + xbt_os_rmutex_acquire(log_cat_init_mutex); + } + + if (category->threshold != xbt_log_priority_uninitialized) { + if (log_cat_init_mutex != NULL) { + xbt_os_rmutex_release(log_cat_init_mutex); + } + return priority >= category->threshold; + } + unsigned int cursor; xbt_log_setting_t setting = NULL; int found = 0; @@ -735,8 +750,12 @@ int _xbt_log_cat_init(xbt_log_category_t category, } /* Apply the control */ - if (!xbt_log_settings) + if (!xbt_log_settings) { + if (log_cat_init_mutex != NULL) { + xbt_os_rmutex_release(log_cat_init_mutex); + } return priority >= category->threshold; + } xbt_assert(category, "NULL category"); xbt_assert(category->name); @@ -761,6 +780,9 @@ int _xbt_log_cat_init(xbt_log_category_t category, category->name, xbt_log_priority_names[category->threshold], category->threshold); + if (log_cat_init_mutex != NULL) { + xbt_os_rmutex_release(log_cat_init_mutex); + } return priority >= category->threshold; #undef _xbt_log_cat_init @@ -768,7 +790,6 @@ int _xbt_log_cat_init(xbt_log_category_t category, void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent) { - xbt_assert(cat, "NULL category to be given a parent"); xbt_assert(parent, "The parent category of %s is NULL", cat->name); @@ -802,7 +823,6 @@ void xbt_log_parent_set(xbt_log_category_t cat, xbt_log_category_t parent) cat->threshold = parent->threshold; cat->isThreshInherited = 1; - } static void _set_inherited_thresholds(xbt_log_category_t cat) diff --git a/src/xbt/mallocator.c b/src/xbt/mallocator.c index f1972a00d0..1b0a3ced13 100644 --- a/src/xbt/mallocator.c +++ b/src/xbt/mallocator.c @@ -111,17 +111,27 @@ void *xbt_mallocator_get(xbt_mallocator_t m) { void *object; - if (m->current_size > 0) { - /* there is at least an available object */ - /* XBT_DEBUG("Reuse an old object for mallocator %p (size:%d/%d)", m, - m->current_size, m->max_size); */ - object = m->objects[--m->current_size]; - } else { - /* otherwise we must allocate a new object */ + if (m->current_size <= 0) { + /* No object is ready yet. Create a bunch of them to try to group the mallocs + * on the same memory pages (to help the cache lines) */ + /* XBT_DEBUG("Create a new object for mallocator %p (size:%d/%d)", m, m->current_size, m->max_size); */ - object = (*(m->new_f)) (); + int i; + int amount=MIN( (m->max_size) /2,1000); + for (i=0;iobjects[i] = (*(m->new_f)) (); + m->current_size=amount; } + + /* there is at least an available object, now */ + /* XBT_DEBUG("Reuse an old object for mallocator %p (size:%d/%d)", m, + m->current_size, m->max_size); */ + if (MC_IS_ENABLED) /* no mallocator with MC */ + object = (*(m->new_f)) (); + else + object = m->objects[--m->current_size]; + (*(m->reset_f)) (object); return object; } diff --git a/src/xbt/mmalloc/attach.c b/src/xbt/mmalloc/attach.c index 7963a467fd..254182e635 100644 --- a/src/xbt/mmalloc/attach.c +++ b/src/xbt/mmalloc/attach.c @@ -28,6 +28,7 @@ Boston, MA 02111-1307, USA. */ #include /* Prototypes for lseek */ #endif #include "mmprivate.h" +#include "xbt/ex.h" #ifndef SEEK_SET #define SEEK_SET 0 @@ -131,7 +132,7 @@ void *mmalloc_attach(int fd, void *baseaddr) if ((mbase = mdp->morecore(mdp, sizeof(mtemp))) != NULL) { memcpy(mbase, mdp, sizeof(mtemp)); } else { - abort(); + THROWF(system_error,0,"morecore failed to get some memory!"); } /* Add the new heap to the linked list of heaps attached by mmalloc */ diff --git a/src/xbt/mmalloc/mm_legacy.c b/src/xbt/mmalloc/mm_legacy.c index 4d46fd6a5d..2bced98dd1 100644 --- a/src/xbt/mmalloc/mm_legacy.c +++ b/src/xbt/mmalloc/mm_legacy.c @@ -93,9 +93,10 @@ void free(void *p) /* Make sure it works with md==NULL */ -#define HEAP_OFFSET (128<<20) /* Safety gap from the heap's break address. - * Try to increase this first if you experience - * strange errors under valgrind. */ +/* Safety gap from the heap's break address. + * Try to increase this first if you experience strange errors under + * valgrind. */ +#define HEAP_OFFSET (128UL<<20) void *mmalloc_get_default_md(void) { @@ -143,13 +144,16 @@ static void mmalloc_fork_child(void) /* Initialize the default malloc descriptor. */ void mmalloc_preinit(void) { + int res; if (!__mmalloc_default_mdp) { - __mmalloc_default_mdp = - mmalloc_attach(-1, (char *) sbrk(0) + HEAP_OFFSET); + unsigned long mask = ~((unsigned long)getpagesize() - 1); + void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask); + __mmalloc_default_mdp = mmalloc_attach(-1, addr); /* Fixme? only the default mdp in protected against forks */ - if (xbt_os_thread_atfork(mmalloc_fork_prepare, - mmalloc_fork_parent, mmalloc_fork_child) != 0) - abort(); + res = xbt_os_thread_atfork(mmalloc_fork_prepare, + mmalloc_fork_parent, mmalloc_fork_child); + if (res != 0) + THROWF(system_error,0,"xbt_os_thread_atfork() failed: return value %d",res); } xbt_assert(__mmalloc_default_mdp != NULL); } diff --git a/src/xbt/mmalloc/mmap-sup.c b/src/xbt/mmalloc/mmap-sup.c index 3b48e726e0..28f89bc386 100644 --- a/src/xbt/mmalloc/mmap-sup.c +++ b/src/xbt/mmalloc/mmap-sup.c @@ -25,6 +25,7 @@ #endif #include "mmprivate.h" +#include "xbt/ex.h" /* Cache the pagesize for the current host machine. Note that if the host does not readily provide a getpagesize() function, we need to emulate it @@ -77,6 +78,7 @@ void *__mmalloc_mmap_morecore(struct mdesc *mdp, int size) if (size == 0) { /* Just return the current "break" value. */ result = mdp->breakval; + } else if (size < 0) { /* We are deallocating memory. If the amount requested would cause us to try to deallocate back past the base of the mmap'd region @@ -94,6 +96,7 @@ void *__mmalloc_mmap_morecore(struct mdesc *mdp, int size) /* We are allocating memory. Make sure we have an open file descriptor if not working with anonymous memory. */ if (!(mdp->flags & MMALLOC_ANONYMOUS) && mdp->fd < 0) { + THROWF(system_error,0,"mmap file descriptor <0 (%d), without MMALLOC_ANONYMOUS being in the flags",mdp->fd); result = NULL; } else if ((char *) mdp->breakval + size > (char *) mdp->top) { /* The request would move us past the end of the currently @@ -106,9 +109,11 @@ void *__mmalloc_mmap_morecore(struct mdesc *mdp, int size) foffset = (char *) mdp->top - (char *) mdp->base; if (mdp->fd > 0) { - /* FIXME: Test results of lseek() and write() */ + /* FIXME: Test results of lseek() */ lseek(mdp->fd, foffset + mapbytes - 1, SEEK_SET); test = write(mdp->fd, &buf, 1); + if (test == -1) + THROWF(system_error, 0, "write to mmap'ed fd failed! error: %s", strerror(errno)); } /* Let's call mmap. Note that it is possible that mdp->top @@ -117,7 +122,7 @@ void *__mmalloc_mmap_morecore(struct mdesc *mdp, int size) MAP_PRIVATE_OR_SHARED(mdp) | MAP_IS_ANONYMOUS(mdp) | MAP_FIXED, MAP_ANON_OR_FD(mdp), foffset); - if (mapto != (void *) -1) { + if (mapto != (void *) -1/* That's MAP_FAILED */) { if (mdp->top == 0) mdp->base = mdp->breakval = mapto; @@ -125,6 +130,8 @@ void *__mmalloc_mmap_morecore(struct mdesc *mdp, int size) mdp->top = PAGE_ALIGN((char *) mdp->breakval + size); result = (void *) mdp->breakval; mdp->breakval = (char *) mdp->breakval + size; + } else { + THROWF(system_error,0,"mmap returned MAP_FAILED! error: %s",strerror(errno)); } } else { result = (void *) mdp->breakval; diff --git a/src/xbt/parmap.c b/src/xbt/parmap.c index b48954960f..c88a26ba49 100644 --- a/src/xbt/parmap.c +++ b/src/xbt/parmap.c @@ -69,6 +69,7 @@ void xbt_parmap_destroy(xbt_parmap_t parmap) /* Assign resources to worker threads*/ parmap->fun = fun; parmap->data = data; + parmap->index = 0; #ifdef HAVE_FUTEX_H xbt_event_signal(parmap->sync_event); #endif @@ -77,7 +78,7 @@ void xbt_parmap_destroy(xbt_parmap_t parmap) static void *_xbt_parmap_worker_main(void *arg) { - unsigned int data_start, data_end, data_size, worker_id; + unsigned int worker_id; xbt_parmap_t parmap = (xbt_parmap_t)arg; /* Fetch a worker id */ @@ -92,27 +93,19 @@ static void *_xbt_parmap_worker_main(void *arg) xbt_event_wait(parmap->sync_event); #endif if(parmap->status == PARMAP_WORK){ - XBT_DEBUG("Worker %u got a job", worker_id); - - /* Compute how much data does every worker gets */ - data_size = (xbt_dynar_length(parmap->data) / parmap->num_workers) - + ((xbt_dynar_length(parmap->data) % parmap->num_workers) ? 1 : 0); - - /* Each worker data segment starts in a position associated with its id*/ - data_start = data_size * worker_id; - - /* The end of the worker data segment must be bounded by the end of the data vector */ - data_end = MIN(data_start + data_size, xbt_dynar_length(parmap->data)); + unsigned int i; + unsigned int n = 0; - XBT_DEBUG("Worker %u: data_start=%u data_end=%u (data_size=%u)", - worker_id, data_start, data_end, data_size); + XBT_DEBUG("Worker %u got a job", worker_id); - /* While the worker don't pass the end of it data segment apply the function */ - while(data_start < data_end){ - parmap->fun(*(void **)xbt_dynar_get_ptr(parmap->data, data_start)); - data_start++; + while ((i = __sync_fetch_and_add(&parmap->index, 1)) + < xbt_dynar_length(parmap->data)) { + parmap->fun(xbt_dynar_get_as(parmap->data, i, void*)); + n++; } + XBT_DEBUG("Worker %u processed %u tasks", worker_id, n); + /* We are destroying the parmap */ }else{ #ifdef HAVE_FUTEX_H @@ -170,10 +163,8 @@ void xbt_event_wait(xbt_event_t event) void xbt_event_end(xbt_event_t event) { - int myflag; unsigned int mycount; - myflag = event->work; mycount = __sync_add_and_fetch(&event->thread_counter, 1); if(mycount == event->threads_to_wait){ event->done++; diff --git a/src/xbt/parmap_private.h b/src/xbt/parmap_private.h index b6309be2ac..8b6c1bb677 100644 --- a/src/xbt/parmap_private.h +++ b/src/xbt/parmap_private.h @@ -42,6 +42,7 @@ typedef struct s_xbt_parmap { unsigned int workers_max_id; void_f_pvoid_t fun; xbt_dynar_t data; + unsigned int index; } s_xbt_parmap_t; #endif diff --git a/src/xbt/set.c b/src/xbt/set.c index f0d6b9082d..8b3efbfce0 100644 --- a/src/xbt/set.c +++ b/src/xbt/set.c @@ -434,7 +434,8 @@ static void search_not_found(xbt_set_t set, const char *data) xbt_set_get_by_name(set, data); THROWF(unknown_error, 0, "Found something which shouldn't be there (%s)", data); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) xbt_test_exception(e); xbt_ex_free(e); diff --git a/src/xbt/swag.c b/src/xbt/swag.c index 5a11ab7fc5..d64067f22e 100644 --- a/src/xbt/swag.c +++ b/src/xbt/swag.c @@ -56,32 +56,6 @@ XBT_INLINE void xbt_swag_init(xbt_swag_t swag, size_t offset) swag->count = 0; } - -/** - * \param obj the objet to insert in the swag - * \param swag a swag - * - * insert \a obj in \a swag - */ -XBT_INLINE void xbt_swag_insert(void *obj, xbt_swag_t swag) -{ - - if (xbt_swag_belongs(obj, swag)) - return; - - (swag->count)++; - if (swag->head == NULL) { - xbt_assert(!(swag->tail), "Inconsistent swag."); - swag->head = obj; - swag->tail = obj; - return; - } - - xbt_swag_getPrev(obj, swag->offset) = swag->tail; - xbt_swag_getNext(swag->tail, swag->offset) = obj; - swag->tail = obj; -} - /** * \param obj the objet to insert in the swag * \param swag a swag diff --git a/src/xbt/win32_ucontext.c b/src/xbt/win32_ucontext.c index 5dc89593f6..c91c39e426 100644 --- a/src/xbt/win32_ucontext.c +++ b/src/xbt/win32_ucontext.c @@ -21,6 +21,7 @@ */ #include "win32_ucontext.h" + int getcontext(ucontext_t * ucp) { int ret; @@ -45,31 +46,40 @@ int makecontext(ucontext_t * ucp, void (*func) (), int argc, ...) int i; va_list ap; char *sp; - - /* Stack grows down */ + + /* Stack grows down */ sp = (char *) (size_t) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size; /* Reserve stack space for the arguments (maximum possible: argc*(8 bytes per argument)) */ - sp -= argc * 8; + sp -= argc * sizeof(void*); if (sp < (char *) ucp->uc_stack.ss_sp) { /* errno = ENOMEM; */ return -1; } - /* Set the instruction and the stack pointer */ - ucp->uc_mcontext.Eip = (unsigned long) func; - ucp->uc_mcontext.Esp = (unsigned long) sp - 4; - + /* Set the instruction and the stack pointer */ + #ifdef I_X86_ + ucp->uc_mcontext.Eip = (DWORD) func; + ucp->uc_mcontext.Esp = (DWORD) sp - sizeof(void*); + #endif + #ifdef _IA64_ + # error "_IA64_" + #endif + #ifdef _AMD64_ + ucp->uc_mcontext.Rip = (DWORD64) func; + ucp->uc_mcontext.Rsp = (DWORD64) sp - sizeof(void*); + #endif + /* Save/Restore the full machine context */ ucp->uc_mcontext.ContextFlags = CONTEXT_FULL; /* Copy the arguments */ va_start(ap, argc); for (i = 0; i < argc; i++) { - memcpy(sp, ap, 8); - ap += 8; - sp += 8; + memcpy(sp, ap, sizeof(void*)); + ap += sizeof(void*); + sp += sizeof(void*); } va_end(ap); return 0; diff --git a/src/xbt/xbt_main.c b/src/xbt/xbt_main.c index 897ea4373d..c0cac04a49 100644 --- a/src/xbt/xbt_main.c +++ b/src/xbt/xbt_main.c @@ -92,7 +92,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, static void xbt_preinit(void) { -#ifdef HAVE_MMAP +#ifdef MMALLOC_WANT_OVERIDE_LEGACY mmalloc_preinit(); #endif xbt_log_preinit(); @@ -123,25 +123,25 @@ static void xbt_preinit(void) XBT_LOG_CONNECT(xbt_parmap,xbt); XBT_LOG_CONNECT(xbt_parmap_unit,xbt_parmap); - xbt_fifo_preinit(); - xbt_dict_preinit(); xbt_backtrace_preinit(); xbt_os_thread_mod_preinit(); + xbt_fifo_preinit(); + xbt_dict_preinit(); } static void xbt_postexit(void) { - xbt_os_thread_mod_postexit(); xbt_backtrace_postexit(); xbt_fifo_postexit(); xbt_dict_postexit(); xbt_log_postexit(); + xbt_os_thread_mod_postexit(); free(xbt_binary_name); -#ifdef HAVE_MMAP +#ifdef MMALLOC_WANT_OVERIDE_LEGACY mmalloc_postexit(); #endif } diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 2efd81eb2d..b2be4c7fe6 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -23,7 +23,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync_os, xbt, /* ********************************* PTHREAD IMPLEMENTATION ************************************ */ #ifdef HAVE_PTHREAD_H -#include #include #ifdef HAVE_MUTEX_TIMEDLOCK @@ -219,6 +218,24 @@ xbt_os_thread_t xbt_os_thread_self(void) return res; } +void xbt_os_thread_key_create(xbt_os_thread_key_t* key) { + + int errcode; + if ((errcode = pthread_key_create(key, NULL))) + THROWF(system_error, errcode, "pthread_key_create failed"); +} + +void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) { + + int errcode; + if ((errcode = pthread_setspecific(key, value))) + THROWF(system_error, errcode, "pthread_setspecific failed"); +} + +void* xbt_os_thread_get_specific(xbt_os_thread_key_t key) { + return pthread_getspecific(key); +} + void xbt_os_thread_detach(xbt_os_thread_t thread) { thread->detached = 1; @@ -478,7 +495,7 @@ xbt_os_sem_t xbt_os_sem_init(unsigned int value) if ((res->ps == (sem_t *) SEM_FAILED) && (errno == ENAMETOOLONG)) { /* Old darwins only allow 13 chars. Did you create *that* amount of semaphores? */ res->name[13] = '\0'; - res->ps = sem_open(res->name, O_CREAT, 0644, 1); + res->ps = sem_open(res->name, O_CREAT, 0644, value); } if ((res->ps == (sem_t *) SEM_FAILED)) THROWF(system_error, errno, "sem_open() failed: %s", strerror(errno)); @@ -726,6 +743,21 @@ void xbt_os_thread_exit(int *retval) ExitThread(0); } +void xbt_os_thread_key_create(xbt_os_thread_key_t* key) { + + *key = TlsAlloc(); +} + +void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) { + + if (!TlsSetValue(key, value)) + THROWF(system_error, (int) GetLastError(), "TlsSetValue() failed"); +} + +void* xbt_os_thread_get_specific(xbt_os_thread_key_t key) { + return TlsGetValue(key); +} + void xbt_os_thread_detach(xbt_os_thread_t thread) { THROW_UNIMPLEMENTED; @@ -1128,6 +1160,13 @@ void xbt_os_sem_get_value(xbt_os_sem_t sem, int *svalue) #endif +/***** reentrant mutexes *****/ +typedef struct xbt_os_rmutex_ { + xbt_os_mutex_t mutex; + xbt_os_thread_t owner; + int count; +} s_xbt_os_rmutex_t; + void xbt_os_thread_set_extra_data(void *data) { xbt_os_thread_self()->extra_data = data; @@ -1137,3 +1176,52 @@ void *xbt_os_thread_get_extra_data(void) { return xbt_os_thread_self()->extra_data; } + +xbt_os_rmutex_t xbt_os_rmutex_init(void) +{ + xbt_os_rmutex_t rmutex = xbt_new0(struct xbt_os_rmutex_, 1); + rmutex->mutex = xbt_os_mutex_init(); + rmutex->owner = NULL; + rmutex->count = 0; + return rmutex; +} + +void xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex) +{ + xbt_os_thread_t self = xbt_os_thread_self(); + + if (self == NULL) { + /* the thread module is not initialized yet */ + rmutex->owner = NULL; + return; + } + + if (self != rmutex->owner) { + xbt_os_mutex_acquire(rmutex->mutex); + rmutex->owner = self; + rmutex->count = 1; + } else { + rmutex->count++; + } +} + +void xbt_os_rmutex_release(xbt_os_rmutex_t rmutex) +{ + if (rmutex->owner == NULL) { + /* the thread module was not initialized */ + return; + } + + xbt_assert(rmutex->owner == xbt_os_thread_self()); + + if (--rmutex->count == 0) { + rmutex->owner = NULL; + xbt_os_mutex_release(rmutex->mutex); + } +} + +void xbt_os_rmutex_destroy(xbt_os_rmutex_t rmutex) +{ + xbt_os_mutex_destroy(rmutex->mutex); + xbt_free(rmutex); +} diff --git a/src/xbt/xbt_queue.c b/src/xbt/xbt_queue.c index ad6027b2a0..7a38199528 100644 --- a/src/xbt/xbt_queue.c +++ b/src/xbt/xbt_queue.c @@ -159,7 +159,6 @@ void xbt_queue_shift(xbt_queue_t queue, void *const dst) void xbt_queue_push_timed(xbt_queue_t queue, const void *src, double delay) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -183,7 +182,7 @@ void xbt_queue_push_timed(xbt_queue_t queue, const void *src, double delay) xbt_cond_timedwait(queue->not_full, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } @@ -204,7 +203,6 @@ void xbt_queue_push_timed(xbt_queue_t queue, const void *src, double delay) void xbt_queue_pop_timed(xbt_queue_t queue, void *const dst, double delay) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -221,7 +219,7 @@ void xbt_queue_pop_timed(xbt_queue_t queue, void *const dst, double delay) xbt_cond_timedwait(queue->not_empty, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } @@ -241,7 +239,6 @@ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src, double delay) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -265,7 +262,7 @@ void xbt_queue_unshift_timed(xbt_queue_t queue, const void *src, xbt_cond_timedwait(queue->not_full, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } @@ -287,7 +284,6 @@ void xbt_queue_shift_timed(xbt_queue_t queue, void *const dst, double delay) { double begin = xbt_time(); - xbt_ex_t e; xbt_mutex_acquire(queue->mutex); @@ -304,7 +300,7 @@ void xbt_queue_shift_timed(xbt_queue_t queue, void *const dst, xbt_cond_timedwait(queue->not_empty, queue->mutex, delay < 0 ? -1 : delay - (xbt_time() - begin)); } - CATCH(e) { + CATCH_ANONYMOUS { xbt_mutex_release(queue->mutex); RETHROW; } diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index 9ec3dde089..12b674aa75 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -316,7 +316,7 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep) return res; } -/** @brief Just like @xbt_str_split_quoted (Splits a string into a dynar of strings), but without memory allocation +/** @brief Just like @ref xbt_str_split_quoted (Splits a string into a dynar of strings), but without memory allocation * * The string passed as argument must be writable (not const) * The elements of the dynar are just parts of the string passed as argument. @@ -449,66 +449,6 @@ xbt_dynar_t xbt_str_split_quoted(const char *s) return res; } -#ifdef SIMGRID_TEST -#include "xbt/str.h" - -#define mytest(name, input, expected) \ - xbt_test_add(name); \ - d=xbt_str_split_quoted(input); \ - s=xbt_str_join(d,"XXX"); \ - xbt_test_assert(!strcmp(s,expected),\ - "Input (%s) leads to (%s) instead of (%s)", \ - input,s,expected);\ - free(s); \ - xbt_dynar_free(&d); - -XBT_TEST_SUITE("xbt_str", "String Handling"); -XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted, "test the function xbt_str_split_quoted") -{ - xbt_dynar_t d; - char *s; - - mytest("Empty", "", ""); - mytest("Basic test", "toto tutu", "totoXXXtutu"); - mytest("Useless backslashes", "\\t\\o\\t\\o \\t\\u\\t\\u", - "totoXXXtutu"); - mytest("Protected space", "toto\\ tutu", "toto tutu"); - mytest("Several spaces", "toto tutu", "totoXXXtutu"); - mytest("LTriming", " toto tatu", "totoXXXtatu"); - mytest("Triming", " toto tutu ", "totoXXXtutu"); - mytest("Single quotes", "'toto tutu' tata", "toto tutuXXXtata"); - mytest("Double quotes", "\"toto tutu\" tata", "toto tutuXXXtata"); - mytest("Mixed quotes", "\"toto' 'tutu\" tata", "toto' 'tutuXXXtata"); - mytest("Backslashed quotes", "\\'toto tutu\\' tata", - "'totoXXXtutu'XXXtata"); - mytest("Backslashed quotes + quotes", "'toto \\'tutu' tata", - "toto 'tutuXXXtata"); - -} - -#define mytest_str(name, input, separator, expected) \ - xbt_test_add(name); \ - d=xbt_str_split_str(input, separator); \ - s=xbt_str_join(d,"XXX"); \ - xbt_test_assert(!strcmp(s,expected),\ - "Input (%s) leads to (%s) instead of (%s)", \ - input,s,expected);\ - free(s); \ - xbt_dynar_free(&d); - -XBT_TEST_UNIT("xbt_str_split_str", test_split_str, "test the function xbt_str_split_str") -{ - xbt_dynar_t d; - char *s; - - mytest_str("Empty string and separator", "", "", ""); - mytest_str("Empty string", "", "##", ""); - mytest_str("Empty separator", "toto", "", "toto"); - mytest_str("String with no separator in it", "toto", "##", "toto"); - mytest_str("Basic test", "toto##tutu", "##", "totoXXXtutu"); -} -#endif /* SIMGRID_TEST */ - /** @brief Join a set of strings as a single string */ char *xbt_str_join(xbt_dynar_t dyn, const char *sep) { @@ -627,48 +567,43 @@ long getline(char **buf, size_t * n, FILE * stream) /* * Diff related functions */ +static XBT_INLINE int diff_get(xbt_matrix_t C, int i, int j) +{ + return (i == -1 || j == -1) ? 0 : xbt_matrix_get_as(C, i, j, int); +} + static xbt_matrix_t diff_build_LCS(xbt_dynar_t da, xbt_dynar_t db) { xbt_matrix_t C = xbt_matrix_new(xbt_dynar_length(da), xbt_dynar_length(db), sizeof(int), NULL); - unsigned long i, j; + int i, j; /* Compute the LCS */ /* - C = array(0..m, 0..n) - for i := 0..m - C[i,0] = 0 - for j := 1..n - C[0,j] = 0 - for i := 1..m - for j := 1..n - if X[i] = Y[j] - C[i,j] := C[i-1,j-1] + 1 - else: - C[i,j] := max(C[i,j-1], C[i-1,j]) - return C[m,n] + function LCSLength(X[1..m], Y[1..n]) + C = array(0..m, 0..n) + for i := 0..m + C[i,0] = 0 + for j := 1..n + C[0,j] = 0 + for i := 1..m + for j := 1..n + if X[i] = Y[j] + C[i,j] := C[i-1,j-1] + 1 + else: + C[i,j] := max(C[i,j-1], C[i-1,j]) + return C[m,n] */ - if (xbt_dynar_length(db) != 0) - for (i = 0; i < xbt_dynar_length(da); i++) - *((int *) xbt_matrix_get_ptr(C, i, 0)) = 0; - - if (xbt_dynar_length(da) != 0) - for (j = 0; j < xbt_dynar_length(db); j++) - *((int *) xbt_matrix_get_ptr(C, 0, j)) = 0; - - for (i = 1; i < xbt_dynar_length(da); i++) - for (j = 1; j < xbt_dynar_length(db); j++) { - - if (!strcmp - (xbt_dynar_get_as(da, i, char *), - xbt_dynar_get_as(db, j, char *))) - *((int *) xbt_matrix_get_ptr(C, i, j)) = - xbt_matrix_get_as(C, i - 1, j - 1, int) + 1; + for (i = 0; i < (int)xbt_dynar_length(da); i++) + for (j = 0; j < (int)xbt_dynar_length(db); j++) { + + if (!strcmp(xbt_dynar_get_as(da, i, char *), + xbt_dynar_get_as(db, j, char *))) + *((int *) xbt_matrix_get_ptr(C, i, j)) = diff_get(C, i - 1, j - 1) + 1; else - *((int *) xbt_matrix_get_ptr(C, i, j)) = - max(xbt_matrix_get_as(C, i, j - 1, int), - xbt_matrix_get_as(C, i - 1, j, int)); + *((int *) xbt_matrix_get_ptr(C, i, j)) = max(diff_get(C, i, j - 1), + diff_get(C, i - 1, j)); } return C; } @@ -680,16 +615,16 @@ static void diff_build_diff(xbt_dynar_t res, char *topush; /* Construct the diff function printDiff(C[0..m,0..n], X[1..m], Y[1..n], i, j) - if i > 0 and j > 0 and X[i] = Y[j] - printDiff(C, X, Y, i-1, j-1) - print " " + X[i] - else - if j > 0 and (i = 0 or C[i,j-1] >= C[i-1,j]) - printDiff(C, X, Y, i, j-1) - print "+ " + Y[j] - else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j]) - printDiff(C, X, Y, i-1, j) - print "- " + X[i] + if i > 0 and j > 0 and X[i] = Y[j] + printDiff(C, X, Y, i-1, j-1) + print " " + X[i] + else + if j > 0 and (i = 0 or C[i,j-1] >= C[i-1,j]) + printDiff(C, X, Y, i, j-1) + print "+ " + Y[j] + else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j]) + printDiff(C, X, Y, i-1, j) + print "- " + X[i] */ if (i >= 0 && j >= 0 && !strcmp(xbt_dynar_get_as(da, i, char *), @@ -698,56 +633,47 @@ static void diff_build_diff(xbt_dynar_t res, topush = bprintf(" %s", xbt_dynar_get_as(da, i, char *)); xbt_dynar_push(res, &topush); } else if (j >= 0 && - (i <= 0 || j == 0 - || xbt_matrix_get_as(C, i, j - 1, - int) >= xbt_matrix_get_as(C, i - 1, j, - int))) { + (i == -1 || diff_get(C, i, j - 1) >= diff_get(C, i - 1, j))) { diff_build_diff(res, C, da, db, i, j - 1); topush = bprintf("+ %s", xbt_dynar_get_as(db, j, char *)); xbt_dynar_push(res, &topush); } else if (i >= 0 && - (j <= 0 - || xbt_matrix_get_as(C, i, j - 1, int) < xbt_matrix_get_as(C, - i - - - 1, - j, - int))) - { + (j == -1 || diff_get(C, i, j - 1) < diff_get(C, i - 1, j))) { diff_build_diff(res, C, da, db, i - 1, j); topush = bprintf("- %s", xbt_dynar_get_as(da, i, char *)); xbt_dynar_push(res, &topush); - } else if (i <= 0 && j <= 0) { - return; - } else { - THROWF(arg_error, 0, "Invalid values: i=%d, j=%d", i, j); } - } /** @brief Compute the unified diff of two strings */ -char *xbt_str_diff(char *a, char *b) +char *xbt_str_diff(const char *a, const char *b) { xbt_dynar_t da = xbt_str_split(a, "\n"); xbt_dynar_t db = xbt_str_split(b, "\n"); + xbt_matrix_t C; + xbt_dynar_t diff; + char *res; + size_t len; - xbt_matrix_t C = diff_build_LCS(da, db); - xbt_dynar_t diff = xbt_dynar_new(sizeof(char *), &xbt_free_ref); - char *res = NULL; + /* Clean empty lines at the end of da and db */ + len = strlen(a); + if (len > 0 && a[len - 1] == '\n') { + char *str; + xbt_dynar_pop(da, &str); + free(str); + } + len = strlen(b); + if (len > 0 && b[len - 1] == '\n') { + char *str; + xbt_dynar_pop(db, &str); + free(str); + } + + C = diff_build_LCS(da, db); + diff = xbt_dynar_new(sizeof(char *), &xbt_free_ref); diff_build_diff(diff, C, da, db, xbt_dynar_length(da) - 1, xbt_dynar_length(db) - 1); - /* Clean empty lines at the end */ - while (xbt_dynar_length(diff) > 0) { - char *str; - xbt_dynar_pop(diff, &str); - if (str[0] == '\0' || !strcmp(str, " ")) { - free(str); - } else { - xbt_dynar_push(diff, &str); - break; - } - } res = xbt_str_join(diff, "\n"); xbt_dynar_free(&da); @@ -779,3 +705,193 @@ char *xbt_str_from_file(FILE * file) xbt_strbuff_free_container(buff); return res; } + +#ifdef SIMGRID_TEST +#include "xbt/str.h" + +#define mytest(name, input, expected) \ + xbt_test_add(name); \ + d=xbt_str_split_quoted(input); \ + s=xbt_str_join(d,"XXX"); \ + xbt_test_assert(!strcmp(s,expected),\ + "Input (%s) leads to (%s) instead of (%s)", \ + input,s,expected);\ + free(s); \ + xbt_dynar_free(&d); + +XBT_TEST_SUITE("xbt_str", "String Handling"); +XBT_TEST_UNIT("xbt_str_split_quoted", test_split_quoted, "test the function xbt_str_split_quoted") +{ + xbt_dynar_t d; + char *s; + + mytest("Empty", "", ""); + mytest("Basic test", "toto tutu", "totoXXXtutu"); + mytest("Useless backslashes", "\\t\\o\\t\\o \\t\\u\\t\\u", + "totoXXXtutu"); + mytest("Protected space", "toto\\ tutu", "toto tutu"); + mytest("Several spaces", "toto tutu", "totoXXXtutu"); + mytest("LTriming", " toto tatu", "totoXXXtatu"); + mytest("Triming", " toto tutu ", "totoXXXtutu"); + mytest("Single quotes", "'toto tutu' tata", "toto tutuXXXtata"); + mytest("Double quotes", "\"toto tutu\" tata", "toto tutuXXXtata"); + mytest("Mixed quotes", "\"toto' 'tutu\" tata", "toto' 'tutuXXXtata"); + mytest("Backslashed quotes", "\\'toto tutu\\' tata", + "'totoXXXtutu'XXXtata"); + mytest("Backslashed quotes + quotes", "'toto \\'tutu' tata", + "toto 'tutuXXXtata"); + +} + +#define mytest_str(name, input, separator, expected) \ + xbt_test_add(name); \ + d=xbt_str_split_str(input, separator); \ + s=xbt_str_join(d,"XXX"); \ + xbt_test_assert(!strcmp(s,expected),\ + "Input (%s) leads to (%s) instead of (%s)", \ + input,s,expected);\ + free(s); \ + xbt_dynar_free(&d); + +XBT_TEST_UNIT("xbt_str_split_str", test_split_str, "test the function xbt_str_split_str") +{ + xbt_dynar_t d; + char *s; + + mytest_str("Empty string and separator", "", "", ""); + mytest_str("Empty string", "", "##", ""); + mytest_str("Empty separator", "toto", "", "toto"); + mytest_str("String with no separator in it", "toto", "##", "toto"); + mytest_str("Basic test", "toto##tutu", "##", "totoXXXtutu"); +} + +/* Last args are format string and parameters for xbt_test_add */ +#define mytest_diff(s1, s2, diff, ...) \ + do { \ + char *mytest_diff_res; \ + xbt_test_add(__VA_ARGS__); \ + mytest_diff_res = xbt_str_diff(s1, s2); \ + xbt_test_assert(!strcmp(mytest_diff_res, diff), \ + "Wrong output:\n--- got:\n%s\n--- expected:\n%s\n---", \ + mytest_diff_res, diff); \ + free(mytest_diff_res); \ + } while (0) + +XBT_TEST_UNIT("xbt_str_diff", test_diff, "test the function xbt_str_diff") +{ + unsigned i; + + /* Trivial cases */ + mytest_diff("a", "a", " a", "1 word, no difference"); + mytest_diff("a", "A", "- a\n+ A", "1 word, different"); + mytest_diff("a\n", "a\n", " a", "1 line, no difference"); + mytest_diff("a\n", "A\n", "- a\n+ A", "1 line, different"); + + /* Empty strings */ + mytest_diff("", "", "", "empty strings"); + mytest_diff("", "a", "+ a", "1 word, added"); + mytest_diff("a", "", "- a", "1 word, removed"); + mytest_diff("", "a\n", "+ a", "1 line, added"); + mytest_diff("a\n", "", "- a", "1 line, removed"); + mytest_diff("", "a\nb\nc\n", "+ a\n+ b\n+ c", "4 lines, all added"); + mytest_diff("a\nb\nc\n", "", "- a\n- b\n- c", "4 lines, all removed"); + + /* Empty lines */ + mytest_diff("\n", "\n", " ", "empty lines"); + mytest_diff("", "\n", "+ ", "empty line, added"); + mytest_diff("\n", "", "- ", "empty line, removed"); + + mytest_diff("a", "\na", "+ \n a", "empty line added before word"); + mytest_diff("a", "a\n\n", " a\n+ ", "empty line added after word"); + mytest_diff("\na", "a", "- \n a", "empty line removed before word"); + mytest_diff("a\n\n", "a", " a\n- ", "empty line removed after word"); + + mytest_diff("a\n", "\na\n", "+ \n a", "empty line added before line"); + mytest_diff("a\n", "a\n\n", " a\n+ ", "empty line added after line"); + mytest_diff("\na\n", "a\n", "- \n a", "empty line removed before line"); + mytest_diff("a\n\n", "a\n", " a\n- ", "empty line removed after line"); + + mytest_diff("a\nb\nc\nd\n", "\na\nb\nc\nd\n", "+ \n a\n b\n c\n d", + "empty line added before 4 lines"); + mytest_diff("a\nb\nc\nd\n", "a\nb\nc\nd\n\n", " a\n b\n c\n d\n+ ", + "empty line added after 4 lines"); + mytest_diff("\na\nb\nc\nd\n", "a\nb\nc\nd\n", "- \n a\n b\n c\n d", + "empty line removed before 4 lines"); + mytest_diff("a\nb\nc\nd\n\n", "a\nb\nc\nd\n", " a\n b\n c\n d\n- ", + "empty line removed after 4 lines"); + + /* Missing newline at the end of one of the strings */ + mytest_diff("a\n", "a", " a", "1 line, 1 word, no difference"); + mytest_diff("a", "a\n", " a", "1 word, 1 line, no difference"); + mytest_diff("a\n", "A", "- a\n+ A", "1 line, 1 word, different"); + mytest_diff("a", "A\n", "- a\n+ A", "1 word, 1 line, different"); + + mytest_diff("a\nb\nc\nd", "a\nb\nc\nd\n", " a\n b\n c\n d", + "4 lines, no newline on first"); + mytest_diff("a\nb\nc\nd\n", "a\nb\nc\nd", " a\n b\n c\n d", + "4 lines, no newline on second"); + + /* Four lines, all combinations of differences */ + for (i = 0 ; i < (1U << 4) ; i++) { + char d2[4 + 1]; + char s2[4 * 2 + 1]; + char res[4 * 8 + 1]; + char *pd = d2; + char *ps = s2; + char *pr = res; + unsigned j = 0; + while (j < 4) { + unsigned k; + for (/* j */ ; j < 4 && !(i & (1U << j)) ; j++) { + *pd++ = "abcd"[j]; + ps += sprintf(ps, "%c\n", "abcd"[j]); + pr += sprintf(pr, " %c\n", "abcd"[j]); + } + for (k = j ; k < 4 && (i & (1U << k)) ; k++) { + *pd++ = "ABCD"[k]; + ps += sprintf(ps, "%c\n", "ABCD"[k]); + pr += sprintf(pr, "- %c\n", "abcd"[k]); + } + for (/* j */ ; j < k ; j++) { + pr += sprintf(pr, "+ %c\n", "ABCD"[j]); + } + } + *pd = '\0'; + *--pr = '\0'; /* strip last '\n' from expected result */ + mytest_diff("a\nb\nc\nd\n", s2, res, + "compare (abcd) with changed (%s)", d2); + } + + /* Subsets of four lines, do not test for empty subset */ + for (i = 1 ; i < (1U << 4) ; i++) { + char d2[4 + 1]; + char s2[4 * 2 + 1]; + char res[4 * 8 + 1]; + char *pd = d2; + char *ps = s2; + char *pr = res; + unsigned j = 0; + while (j < 4) { + for (/* j */ ; j < 4 && (i & (1U << j)) ; j++) { + *pd++ = "abcd"[j]; + ps += sprintf(ps, "%c\n", "abcd"[j]); + pr += sprintf(pr, " %c\n", "abcd"[j]); + } + for (/* j */; j < 4 && !(i & (1U << j)) ; j++) { + pr += sprintf(pr, "- %c\n", "abcd"[j]); + } + } + *pd = '\0'; + *--pr = '\0'; /* strip last '\n' from expected result */ + mytest_diff("a\nb\nc\nd\n", s2, res, + "compare (abcd) with subset (%s)", d2); + + for (pr = res ; *pr != '\0' ; pr++) + if (*pr == '-') + *pr = '+'; + mytest_diff(s2, "a\nb\nc\nd\n", res, + "compare subset (%s) with (abcd)", d2); + } +} + +#endif /* SIMGRID_TEST */ diff --git a/src/xbt/xbt_strbuff.c b/src/xbt/xbt_strbuff.c index 6f470ed7cc..a474b3a258 100644 --- a/src/xbt/xbt_strbuff.c +++ b/src/xbt/xbt_strbuff.c @@ -26,8 +26,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(strbuff, xbt, "String buffers"); XBT_INLINE void xbt_strbuff_empty(xbt_strbuff_t b) { b->used = 0; - b->data[0] = '\n'; - b->data[1] = '\0'; + b->data[0] = '\0'; } xbt_strbuff_t xbt_strbuff_new(void) @@ -89,10 +88,9 @@ void xbt_strbuff_append(xbt_strbuff_t b, const char *toadd) XBT_INLINE void xbt_strbuff_chomp(xbt_strbuff_t b) { - while (b->data[b->used] == '\n') { + while (b->used && b->data[b->used - 1] == '\n') { + b->used--; b->data[b->used] = '\0'; - if (b->used) - b->used--; } } diff --git a/src/xbt/xbt_synchro.c b/src/xbt/xbt_synchro.c index 0a3976a5e0..5b78e0a0cf 100644 --- a/src/xbt/xbt_synchro.c +++ b/src/xbt/xbt_synchro.c @@ -46,7 +46,7 @@ void xbt_dynar_dopar(xbt_dynar_t datas, void_f_int_pvoid_t function) return; } /* Start all workers */ - XBT_INFO("Dopar for %ld elements", xbt_dynar_length(datas)); + XBT_DEBUG("Dopar for %ld elements", xbt_dynar_length(datas)); xbt_dynar_foreach(datas, cursor, data) { worker_data_t w = xbt_new0(s_worker_data_t, 1); w->data = datas; diff --git a/teshsuite/gras/datadesc/datadesc.big32_8_4 b/teshsuite/gras/datadesc/datadesc.big32_8_4 index be8283cc6f..f230874d3c 100644 Binary files a/teshsuite/gras/datadesc/datadesc.big32_8_4 and b/teshsuite/gras/datadesc/datadesc.big32_8_4 differ diff --git a/teshsuite/gras/datadesc/datadesc.little32_4 b/teshsuite/gras/datadesc/datadesc.little32_4 index f291d4d54a..84dcda72f0 100644 Binary files a/teshsuite/gras/datadesc/datadesc.little32_4 and b/teshsuite/gras/datadesc/datadesc.little32_4 differ diff --git a/teshsuite/gras/datadesc/datadesc.little64 b/teshsuite/gras/datadesc/datadesc.little64 index b7bd066175..b3e5e7da5a 100644 Binary files a/teshsuite/gras/datadesc/datadesc.little64 and b/teshsuite/gras/datadesc/datadesc.little64 differ diff --git a/teshsuite/gras/datadesc/datadesc_mem.tesh b/teshsuite/gras/datadesc/datadesc_mem.tesh index a49e13e161..7ba1b77dbe 100644 --- a/teshsuite/gras/datadesc/datadesc_mem.tesh +++ b/teshsuite/gras/datadesc/datadesc_mem.tesh @@ -10,7 +10,7 @@ $ gras/datadesc/datadesc_usage --copy "--log=root.fmt:%m%n" > ---- Test on string (ref to dynamic array) ---- > ---- Test on dynar containing integers ---- > ---- Test on empty dynar of integers ---- -> ---- Test on all possible struct having 3 fields (49 structs) ---- +> ---- Test on all possible struct having 4 fields (49 structs) ---- > ---- Test on homogeneous structure ---- > ---- Test on heterogeneous structure ---- > ---- Test on nested structures ---- diff --git a/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh b/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh index 8b2013f5a5..94ae55ee1c 100644 --- a/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh +++ b/teshsuite/gras/datadesc/datadesc_r_big32_8_4.tesh @@ -1,7 +1,8 @@ p Check the marshaling facilities (trying to read the result of AIX) -$ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.big32_8_4 "--log=root.fmt:%m%n" +$ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.big32_8_4 --log=test.thres:verbose --log=structs.thres:info "--log=root.fmt:%m%n" > Read from file datadesc.big32_8_4 +> This file was generated on big32_8_4 (7) > ---- Test on integer ---- > ---- Test on float ---- > ---- Test on double ---- @@ -10,7 +11,7 @@ $ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.big32_ > ---- Test on string (ref to dynamic array) ---- > ---- Test on dynar containing integers ---- > ---- Test on empty dynar of integers ---- -> ---- Test on all possible struct having 3 fields (49 structs) ---- +> ---- Test on all possible struct having 4 fields (49 structs) ---- > ---- Test on homogeneous structure ---- > ---- Test on heterogeneous structure ---- > ---- Test on nested structures ---- diff --git a/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh b/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh index 53ffc59c63..bbed12263b 100644 --- a/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh +++ b/teshsuite/gras/datadesc/datadesc_r_little32_4.tesh @@ -1,7 +1,8 @@ p Check the marshaling facilities (trying to read the result of linux/x86) -$ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little32_4 "--log=root.fmt:%m%n" +$ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little32_4 --log=test.thres:verbose --log=structs.thres:info "--log=root.fmt:%m%n" > Read from file datadesc.little32_4 +> This file was generated on little32_4 (2) > ---- Test on integer ---- > ---- Test on float ---- > ---- Test on double ---- @@ -10,7 +11,7 @@ $ gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little > ---- Test on string (ref to dynamic array) ---- > ---- Test on dynar containing integers ---- > ---- Test on empty dynar of integers ---- -> ---- Test on all possible struct having 3 fields (49 structs) ---- +> ---- Test on all possible struct having 4 fields (49 structs) ---- > ---- Test on homogeneous structure ---- > ---- Test on heterogeneous structure ---- > ---- Test on nested structures ---- diff --git a/teshsuite/gras/datadesc/datadesc_r_little64.tesh b/teshsuite/gras/datadesc/datadesc_r_little64.tesh index b07c87b38c..cf5babc969 100644 --- a/teshsuite/gras/datadesc/datadesc_r_little64.tesh +++ b/teshsuite/gras/datadesc/datadesc_r_little64.tesh @@ -1,7 +1,8 @@ p Check the marshaling facilities (trying to read the result of linux/amd64) -$ $SG_TEST_EXENV gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little64 "--log=root.fmt:%m%n" $ARGS +$ $SG_TEST_EXENV gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/datadesc.little64 --log=test.thres:verbose --log=structs.thres:info "--log=root.fmt:%m%n" $ARGS > Read from file datadesc.little64 +> This file was generated on little64 (4) > ---- Test on integer ---- > ---- Test on float ---- > ---- Test on double ---- @@ -10,7 +11,7 @@ $ $SG_TEST_EXENV gras/datadesc/datadesc_usage --read ${srcdir:=.}/gras/datadesc/ > ---- Test on string (ref to dynamic array) ---- > ---- Test on dynar containing integers ---- > ---- Test on empty dynar of integers ---- -> ---- Test on all possible struct having 3 fields (49 structs) ---- +> ---- Test on all possible struct having 4 fields (49 structs) ---- > ---- Test on homogeneous structure ---- > ---- Test on heterogeneous structure ---- > ---- Test on nested structures ---- diff --git a/teshsuite/gras/datadesc/datadesc_rw.tesh b/teshsuite/gras/datadesc/datadesc_rw.tesh index d13f672abe..1769849e7c 100644 --- a/teshsuite/gras/datadesc/datadesc_rw.tesh +++ b/teshsuite/gras/datadesc/datadesc_rw.tesh @@ -12,7 +12,7 @@ $ gras/datadesc/datadesc_usage --write "--log=root.fmt:%m%n" > ---- Test on string (ref to dynamic array) ---- > ---- Test on dynar containing integers ---- > ---- Test on empty dynar of integers ---- -> ---- Test on all possible struct having 3 fields (49 structs) ---- +> ---- Test on all possible struct having 4 fields (49 structs) ---- > ---- Test on homogeneous structure ---- > ---- Test on heterogeneous structure ---- > ---- Test on nested structures ---- @@ -35,7 +35,7 @@ $ gras/datadesc/datadesc_usage --read "--log=root.fmt:%m%n" > ---- Test on string (ref to dynamic array) ---- > ---- Test on dynar containing integers ---- > ---- Test on empty dynar of integers ---- -> ---- Test on all possible struct having 3 fields (49 structs) ---- +> ---- Test on all possible struct having 4 fields (49 structs) ---- > ---- Test on homogeneous structure ---- > ---- Test on heterogeneous structure ---- > ---- Test on nested structures ---- diff --git a/teshsuite/gras/datadesc/datadesc_structs.c b/teshsuite/gras/datadesc/datadesc_structs.c index 8ad25f704b..57fb7e1832 100644 --- a/teshsuite/gras/datadesc/datadesc_structs.c +++ b/teshsuite/gras/datadesc/datadesc_structs.c @@ -610,7 +610,7 @@ void test_structures(gras_socket_t * sock, int direction) { 1424420.11331 + (double) 1, 'w' + (char) 2, 1424420.11331 + (double) 3, 'w' + (char) 4 }, my_dcdc2; XBT_INFO - ("---- Test on all possible struct having 3 fields (49 structs) ----"); + ("---- Test on all possible struct having 4 fields (49 structs) ----"); write_read("cccc", &my_cccc, &my_cccc2, sock, direction); if (direction == READ || direction == RW) { int failed = 0; diff --git a/teshsuite/gras/datadesc/datadesc_usage.c b/teshsuite/gras/datadesc/datadesc_usage.c index 10a5e8b1e8..3c2bc0f911 100644 --- a/teshsuite/gras/datadesc/datadesc_usage.c +++ b/teshsuite/gras/datadesc/datadesc_usage.c @@ -475,12 +475,11 @@ static void test_pbio(gras_socket_t sock, int direction) { int cpt; int cpt2; - gras_datadesc_type_t pbio_type; pbio_t i, j; XBT_INFO ("---- Test on the PBIO IEEE struct (also tests GRAS DEFINE TYPE) ----"); - pbio_type = gras_datadesc_by_symbol(s_pbio); + gras_datadesc_by_symbol(s_pbio); /* Fill in that damn struct */ i.Cnstatv = 325115; diff --git a/teshsuite/gras/datadesc/mk_datadesc_structs.pl b/teshsuite/gras/datadesc/mk_datadesc_structs.pl index 5c9a121b0b..a8c22b1943 100755 --- a/teshsuite/gras/datadesc/mk_datadesc_structs.pl +++ b/teshsuite/gras/datadesc/mk_datadesc_structs.pl @@ -66,7 +66,7 @@ for $i (0..$max_i) { for $j (0..$max_j) { for $k (0..$max_k) { for $l (0..$max_l .$val[$l]."+(".$types[$l].")4}, my_${struct}2;\n"; }}}} -print " XBT_INFO(\"---- Test on all possible struct having 3 fields (".(($max_i+1)*($max_j+1)*($max_k+1)*($max_l+1))." structs) ----\");\n"; +print " XBT_INFO(\"---- Test on all possible struct having 4 fields (".(($max_i+1)*($max_j+1)*($max_k+1)*($max_l+1))." structs) ----\");\n"; for $i (0..$max_i) { for $j (0..$max_j) { for $k (0..$max_k) { for $l (0..$max_l) { my $struct=$abrev[$i].$abrev[$j].$abrev[$k].$abrev[$l]; print " write_read(\"$struct\", &my_$struct, &my_${struct}2, sock,direction);\n"; diff --git a/teshsuite/gras/msg_handle/msg_handle.c b/teshsuite/gras/msg_handle/msg_handle.c index dcc37ce412..08f00cef69 100644 --- a/teshsuite/gras/msg_handle/msg_handle.c +++ b/teshsuite/gras/msg_handle/msg_handle.c @@ -46,13 +46,15 @@ int server(int argc, char *argv[]) XBT_INFO("Launch server (port=%d)", myport); TRY { me = gras_socket_server(myport); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to establish a server socket: %s"); } gras_os_sleep(1); /* Wait for pal to startup */ TRY { pal = gras_socket_client_from_string(palstr); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to establish a socket to %s: %s", palstr); } XBT_INFO("Initialization done."); @@ -62,7 +64,8 @@ int server(int argc, char *argv[]) got_expected = 0; TRY { gras_msg_handle(0); - } CATCH(e) { + } + CATCH(e) { if (e.category == timeout_error) { got_expected = 1; xbt_ex_free(e); @@ -117,10 +120,6 @@ int client(int argc, char *argv[]) int myport; char *palstr; - xbt_ex_t e; - int got_expected; - - gras_init(&argc, argv); xbt_assert(argc == 3, "Usage: client "); myport = atoi(argv[1]); @@ -132,22 +131,24 @@ int client(int argc, char *argv[]) XBT_INFO("Launch client (port=%d)", myport); TRY { me = gras_socket_server(myport); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to establish a server socket: %s"); } gras_os_sleep(1); /* Wait for pal to startup */ TRY { pal = gras_socket_client_from_string(palstr); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("Unable to establish a socket to %s: %s", palstr); } XBT_INFO("Initialization done."); /* Launch handle(-1). Lock until message from server expected */ - got_expected = 0; TRY { gras_msg_handle(-1); - } CATCH(e) { + } + CATCH_ANONYMOUS { RETHROWF("No exception expected during handle(-1), but got %s"); } XBT_INFO("gras_msg_handle(-1) works as expected (locked)"); diff --git a/teshsuite/simdag/.gitignore b/teshsuite/simdag/.gitignore deleted file mode 100644 index 9cdc1c8167..0000000000 --- a/teshsuite/simdag/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -basic0 -basic1 -basic2 -basic3 -basic4 -basic5 -basic6 diff --git a/teshsuite/simdag/network/.gitignore b/teshsuite/simdag/network/.gitignore deleted file mode 100644 index e954405a9e..0000000000 --- a/teshsuite/simdag/network/.gitignore +++ /dev/null @@ -1 +0,0 @@ -test_reinit_costs diff --git a/teshsuite/simdag/network/mxn/.gitignore b/teshsuite/simdag/network/mxn/.gitignore deleted file mode 100644 index fa1ef1e5f2..0000000000 --- a/teshsuite/simdag/network/mxn/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -test_intra_all2all -test_intra_independent_comm -test_intra_scatter diff --git a/teshsuite/simdag/network/p2p/.gitignore b/teshsuite/simdag/network/p2p/.gitignore deleted file mode 100644 index 037da5f9bc..0000000000 --- a/teshsuite/simdag/network/p2p/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -test_latency1 -test_latency2 -test_latency3 -test_latency_bound diff --git a/teshsuite/simdag/partask/.gitignore b/teshsuite/simdag/partask/.gitignore deleted file mode 100644 index 9b843b4ed4..0000000000 --- a/teshsuite/simdag/partask/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -test_comp_only_par -test_comp_only_seq diff --git a/teshsuite/simdag/platforms/CMakeLists.txt b/teshsuite/simdag/platforms/CMakeLists.txt index 4e960d0dfd..f797d98c7a 100644 --- a/teshsuite/simdag/platforms/CMakeLists.txt +++ b/teshsuite/simdag/platforms/CMakeLists.txt @@ -5,15 +5,20 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") add_executable(basic_parsing_test basic_parsing_test.c) add_executable(is_router_test is_router_test.c) add_executable(flatifier flatifier.c) +add_executable(evaluate_parse_time Evaluate_parse_time.c) +add_executable(evaluate_get_route_time Evaluate_get_route_time.c) ### Add definitions for compile if(NOT WIN32) -target_link_libraries(basic_parsing_test simgrid m pthread ) -target_link_libraries(is_router_test simgrid m pthread ) -target_link_libraries(flatifier simgrid m pthread ) +target_link_libraries(evaluate_get_route_time simgrid m) +target_link_libraries(evaluate_parse_time simgrid m) +target_link_libraries(basic_parsing_test simgrid m) +target_link_libraries(is_router_test simgrid m) +target_link_libraries(flatifier simgrid m) else(NOT WIN32) +target_link_libraries(evaluate_parse_time simgrid) +target_link_libraries(evaluate_get_route_time simgrid) target_link_libraries(basic_parsing_test simgrid) target_link_libraries(is_router_test simgrid) target_link_libraries(flatifier simgrid) -endif(NOT WIN32) - +endif(NOT WIN32) \ No newline at end of file diff --git a/teshsuite/simdag/platforms/Evaluate_get_route_time.c b/teshsuite/simdag/platforms/Evaluate_get_route_time.c new file mode 100644 index 0000000000..02720c58d4 --- /dev/null +++ b/teshsuite/simdag/platforms/Evaluate_get_route_time.c @@ -0,0 +1,57 @@ +/* Copyright (c) 2008, 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +//for i in $(seq 1 100); do teshsuite/simdag/platforms/evaluate_get_route_time ../examples/platforms/One_cluster.xml 1 2> /tmp/null ; done + + +#include +#include +#include "simdag/simdag.h" +#include "surf/surf_private.h" +#include "xbt/xbt_os_time.h" + +#define BILLION 1000000000L; +extern routing_global_t global_routing; + +int main(int argc, char **argv) +{ + SD_workstation_t w1, w2; + const SD_workstation_t *workstations; + int i, j; + int list_size; + xbt_os_timer_t timer = xbt_os_timer_new(); + + /* initialisation of SD */ + SD_init(&argc, argv); + + /* creation of the environment */ + SD_create_environment(argv[1]); + + workstations = SD_workstation_get_list(); + list_size = SD_workstation_get_number(); + + /* Random number initialization */ + srand( (int) (xbt_os_time()*1000) ); + + do{ + i = rand()%list_size; + j = rand()%list_size; + }while(i==j); + + w1 = workstations[i]; + w2 = workstations[j]; + printf("%d\tand\t%d\t\t",i,j); + + xbt_os_timer_start(timer); + SD_route_get_list(w1, w2); + xbt_os_timer_stop(timer); + + printf("%lf\n", xbt_os_timer_elapsed(timer) ); + + SD_exit(); + + return 0; +} diff --git a/teshsuite/simdag/platforms/Evaluate_parse_time.c b/teshsuite/simdag/platforms/Evaluate_parse_time.c new file mode 100644 index 0000000000..d79e47ea6d --- /dev/null +++ b/teshsuite/simdag/platforms/Evaluate_parse_time.c @@ -0,0 +1,37 @@ +/* Copyright (c) 2008, 2009, 2010, 2011. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +//teshsuite/simdag/platforms/evaluate_parse_time ../examples/platforms/nancy.xml + +#include +#include +#include "simdag/simdag.h" +#include "surf/surf_private.h" +#include "xbt/xbt_os_time.h" + +extern routing_global_t global_routing; + +int main(int argc, char **argv) +{ + xbt_os_timer_t timer = xbt_os_timer_new(); + + /* initialization of SD */ + SD_init(&argc, argv); + + /* creation of the environment, timed */ + xbt_os_timer_start(timer); + SD_create_environment(argv[1]); + xbt_os_timer_stop(timer); + + /* Display the result and exit after cleanup */ + printf( "%lf\n", xbt_os_timer_elapsed(timer) ); + + sleep(20); + + SD_exit(); + + return 0; +} diff --git a/teshsuite/simdag/platforms/basic_parsing_test.c b/teshsuite/simdag/platforms/basic_parsing_test.c index 9b9a5be9d6..7e3f5e3785 100644 --- a/teshsuite/simdag/platforms/basic_parsing_test.c +++ b/teshsuite/simdag/platforms/basic_parsing_test.c @@ -23,6 +23,8 @@ int main(int argc, char **argv) int route_size, i, j, k; int list_size; + setvbuf(stdout, NULL, _IOLBF, 0); + SD_init(&argc, argv); /* creation of the environment */ diff --git a/teshsuite/simdag/platforms/basic_parsing_test.tesh b/teshsuite/simdag/platforms/basic_parsing_test.tesh index a1e09a341b..b81c47ed87 100644 --- a/teshsuite/simdag/platforms/basic_parsing_test.tesh +++ b/teshsuite/simdag/platforms/basic_parsing_test.tesh @@ -1,6 +1,6 @@ $ ${bindir:=.}/basic_parsing_test one_cluster.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) surf_workstation_model_init_ptask_L07 -> Workstation number: 5, link number: 8 +> Workstation number: 5, link number: 7 $ ${bindir:=.}/basic_parsing_test one_host_availability.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) surf_workstation_model_init_ptask_L07 @@ -56,7 +56,7 @@ $ ${bindir:=.}/basic_parsing_test three_hosts_non_symmetric_route.xml "--log=roo $ ${bindir:=.}/basic_parsing_test two_clusters.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) surf_workstation_model_init_ptask_L07 -> Workstation number: 10, link number: 16 +> Workstation number: 10, link number: 14 $ ${bindir:=.}/basic_parsing_test two_hosts_multi_hop.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) surf_workstation_model_init_ptask_L07 @@ -93,11 +93,11 @@ $ ${bindir:=.}/basic_parsing_test ./properties.xml --cfg=cpu/model:CpuTI $ ${bindir:=.}/basic_parsing_test ./one_cluster_file.xml > [0.000000] [surf_workstation/INFO] surf_workstation_model_init_ptask_L07 -> Workstation number: 2, link number: 5 +> Workstation number: 2, link number: 4 $ ${bindir:=.}/is_router_test ./test_of_is_router.xml > [0.000000] [surf_workstation/INFO] surf_workstation_model_init_ptask_L07 -> Workstation number: 12, link number: 1, elmts number: 25 +> Workstation number: 10, link number: 1, elmts number: 21 > - Seen: "host01" is type : 1 > - Seen: "host02" is type : 1 > - Seen: "host03" is type : 1 @@ -108,18 +108,14 @@ $ ${bindir:=.}/is_router_test ./test_of_is_router.xml > - Seen: "host08" is type : 1 > - Seen: "host09" is type : 1 > - Seen: "host10" is type : 1 -> - Seen: "host11" is type : 1 -> - Seen: "host12" is type : 1 > - Seen: "router1" is type : 2 > - Seen: "router2" is type : 2 > - Seen: "router3" is type : 2 > - Seen: "router4" is type : 2 > - Seen: "router5" is type : 2 -> - Seen: "router6" is type : 2 > - Seen: "AS0" is type : 3 > - Seen: "AS1" is type : 3 > - Seen: "AS2" is type : 3 > - Seen: "AS3" is type : 3 > - Seen: "AS4" is type : 3 -> - Seen: "AS5" is type : 3 -> - Seen: "AS" is type : 3 \ No newline at end of file +> - Seen: "AS" is type : 3 diff --git a/teshsuite/simdag/platforms/basic_parsing_test_sym_full.tesh b/teshsuite/simdag/platforms/basic_parsing_test_sym_full.tesh index c26faa453c..e52e9ad88d 100644 --- a/teshsuite/simdag/platforms/basic_parsing_test_sym_full.tesh +++ b/teshsuite/simdag/platforms/basic_parsing_test_sym_full.tesh @@ -1,7 +1,7 @@ #! ./tesh $ ${bindir:=.}/basic_parsing_test one_cluster_fullduplex.xml FULL_LINK "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) surf_workstation_model_init_ptask_L07 -> Workstation number: 5, link number: 14 +> Workstation number: 5, link number: 12 > Route between bob3.hamburger.edu and bob3.hamburger.edu > Route size 3 > Link bob_cluster_link_3_UP: latency = 0.000050, bandwidth = 125000000.000000 @@ -155,7 +155,7 @@ $ ${bindir:=.}/basic_parsing_test one_cluster_fullduplex.xml FULL_LINK "--log=ro $ ${bindir:=.}/basic_parsing_test two_clusters_symmetric.xml FULL_LINK "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) surf_workstation_model_init_ptask_L07 -> Workstation number: 4, link number: 10 +> Workstation number: 4, link number: 8 > Route between bob1.hamburger.edu and bob1.hamburger.edu > Route size 3 > Link bob_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 @@ -169,25 +169,21 @@ $ ${bindir:=.}/basic_parsing_test two_clusters_symmetric.xml FULL_LINK "--log=ro > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 > Route latency = 0.000600, route bandwidth = 125000000.000000 > Route between bob1.hamburger.edu and alice0.crepe.fr -> Route size 7 +> Route size 5 > Link bob_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link alice_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between bob1.hamburger.edu and alice1.crepe.fr -> Route size 7 +> Route size 5 > Link bob_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link alice_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between bob0.hamburger.edu and bob1.hamburger.edu > Route size 3 > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 @@ -201,45 +197,37 @@ $ ${bindir:=.}/basic_parsing_test two_clusters_symmetric.xml FULL_LINK "--log=ro > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 > Route latency = 0.000600, route bandwidth = 125000000.000000 > Route between bob0.hamburger.edu and alice0.crepe.fr -> Route size 7 +> Route size 5 > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link alice_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between bob0.hamburger.edu and alice1.crepe.fr -> Route size 7 +> Route size 5 > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link alice_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between alice0.crepe.fr and bob1.hamburger.edu -> Route size 7 +> Route size 5 > Link alice_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link bob_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between alice0.crepe.fr and bob0.hamburger.edu -> Route size 7 +> Route size 5 > Link alice_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between alice0.crepe.fr and alice0.crepe.fr > Route size 3 > Link alice_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 @@ -253,25 +241,21 @@ $ ${bindir:=.}/basic_parsing_test two_clusters_symmetric.xml FULL_LINK "--log=ro > Link alice_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 > Route latency = 0.000600, route bandwidth = 125000000.000000 > Route between alice1.crepe.fr and bob1.hamburger.edu -> Route size 7 +> Route size 5 > Link alice_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link bob_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between alice1.crepe.fr and bob0.hamburger.edu -> Route size 7 +> Route size 5 > Link alice_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 > Link alice_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 -> Link alice_cluster_link_alice_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link backbone: latency = 0.000500, bandwidth = 1250000000.000000 -> Link bob_cluster_link_bob_cluster_router: latency = 0.000050, bandwidth = 125000000.000000 > Link bob_cluster_backbone: latency = 0.000500, bandwidth = 2250000000.000000 > Link bob_cluster_link_0: latency = 0.000050, bandwidth = 125000000.000000 -> Route latency = 0.001700, route bandwidth = 125000000.000000 +> Route latency = 0.001600, route bandwidth = 125000000.000000 > Route between alice1.crepe.fr and alice0.crepe.fr > Route size 3 > Link alice_cluster_link_1: latency = 0.000050, bandwidth = 125000000.000000 diff --git a/teshsuite/simdag/platforms/clusterA.xml b/teshsuite/simdag/platforms/clusterA.xml new file mode 100644 index 0000000000..ea8f73f42c --- /dev/null +++ b/teshsuite/simdag/platforms/clusterA.xml @@ -0,0 +1,5 @@ + + + diff --git a/teshsuite/simdag/platforms/clusterB.xml b/teshsuite/simdag/platforms/clusterB.xml new file mode 100644 index 0000000000..5dcc474f13 --- /dev/null +++ b/teshsuite/simdag/platforms/clusterB.xml @@ -0,0 +1,5 @@ + + + diff --git a/teshsuite/simdag/platforms/flatifier.c b/teshsuite/simdag/platforms/flatifier.c index 907169a93a..e7321c98dc 100644 --- a/teshsuite/simdag/platforms/flatifier.c +++ b/teshsuite/simdag/platforms/flatifier.c @@ -59,13 +59,16 @@ int main(int argc, char **argv) const SD_workstation_t *hosts; const SD_link_t *links; + setvbuf(stdout, NULL, _IOLBF, 0); + SD_init(&argc, argv); platformFile = argv[1]; XBT_DEBUG("%s", platformFile); TRY { SD_create_environment(platformFile); - } CATCH(e) { + } + CATCH(e) { xbt_die("Error while loading %s: %s",platformFile,e.msg); } diff --git a/teshsuite/simdag/platforms/flatifier.tesh b/teshsuite/simdag/platforms/flatifier.tesh index 15d366b344..29386e3c07 100644 --- a/teshsuite/simdag/platforms/flatifier.tesh +++ b/teshsuite/simdag/platforms/flatifier.tesh @@ -19,7 +19,6 @@ $ ${bindir:=.}/flatifier$EXEEXT one_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P > > > -> > > > @@ -36,7 +35,7 @@ $ ${bindir:=.}/flatifier$EXEEXT one_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P > > > -> +> > > > @@ -54,7 +53,7 @@ $ ${bindir:=.}/flatifier$EXEEXT one_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P > > > -> +> > > > @@ -72,7 +71,7 @@ $ ${bindir:=.}/flatifier$EXEEXT one_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P > > > -> +> > > > @@ -90,7 +89,7 @@ $ ${bindir:=.}/flatifier$EXEEXT one_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P > > > -> +> > > > @@ -108,29 +107,30 @@ $ ${bindir:=.}/flatifier$EXEEXT one_cluster.xml "--log=root.fmt:[%10.6r]%e[%i:%P > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > + $ ${bindir:=.}/flatifier$EXEEXT one_host_availability.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" > [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 > @@ -375,7 +375,6 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> > > > @@ -383,7 +382,6 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> > > > @@ -391,10 +389,10 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > > @@ -406,19 +404,19 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -427,10 +425,10 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > > @@ -442,25 +440,25 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -469,13 +467,13 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > > @@ -487,16 +485,16 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -505,13 +503,13 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > > @@ -523,10 +521,10 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > > @@ -535,10 +533,10 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > > @@ -550,19 +548,19 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -571,10 +569,10 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > > @@ -586,19 +584,19 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -607,10 +605,10 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > > @@ -622,25 +620,25 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -649,13 +647,13 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > > @@ -667,16 +665,16 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -685,13 +683,13 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > > @@ -703,16 +701,16 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > -> +> > > > @@ -721,13 +719,13 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > > @@ -739,82 +737,82 @@ $ ${bindir:=.}/flatifier$EXEEXT two_clusters.xml "--log=root.fmt:[%10.6r]%e[%i:% > > > -> +> > > -> +> > > -> +> > > > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > -> +> > > > diff --git a/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml b/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml new file mode 100644 index 0000000000..a700f8217f --- /dev/null +++ b/teshsuite/simdag/platforms/four_hosts_Dijkstra_ns3.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml b/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml new file mode 100644 index 0000000000..381e5e4972 --- /dev/null +++ b/teshsuite/simdag/platforms/four_hosts_floyd_ns3.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/teshsuite/simdag/platforms/one_cluster_router_id.xml b/teshsuite/simdag/platforms/one_cluster_router_id.xml new file mode 100644 index 0000000000..269186ba59 --- /dev/null +++ b/teshsuite/simdag/platforms/one_cluster_router_id.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/teshsuite/simdag/platforms/platform_include.xml b/teshsuite/simdag/platforms/platform_include.xml new file mode 100644 index 0000000000..0fc194d99f --- /dev/null +++ b/teshsuite/simdag/platforms/platform_include.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/teshsuite/simdag/platforms/test_of_is_router.xml b/teshsuite/simdag/platforms/test_of_is_router.xml index 0b51230ba8..6d58ebd1b8 100644 --- a/teshsuite/simdag/platforms/test_of_is_router.xml +++ b/teshsuite/simdag/platforms/test_of_is_router.xml @@ -28,11 +28,6 @@ - - - - - diff --git a/teshsuite/simdag/platforms/two_clusters_router_id.xml b/teshsuite/simdag/platforms/two_clusters_router_id.xml new file mode 100644 index 0000000000..cc8b09dad7 --- /dev/null +++ b/teshsuite/simdag/platforms/two_clusters_router_id.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/teshsuite/xbt/.gitignore b/teshsuite/xbt/.gitignore deleted file mode 100644 index f39c7369fb..0000000000 --- a/teshsuite/xbt/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -log_large_test -parallel_log_crashtest diff --git a/testsuite/.gitignore b/testsuite/.gitignore deleted file mode 100644 index 934c8cd804..0000000000 --- a/testsuite/.gitignore +++ /dev/null @@ -1 +0,0 @@ -run_tests \ No newline at end of file diff --git a/testsuite/surf/.gitignore b/testsuite/surf/.gitignore deleted file mode 100644 index 9dbe5232df..0000000000 --- a/testsuite/surf/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -lmm_usage -maxmin_bench -surf_usage -trace_usage diff --git a/testsuite/surf/surf_usage.c b/testsuite/surf/surf_usage.c index 2d88528ac8..a3dc2cabf5 100644 --- a/testsuite/surf/surf_usage.c +++ b/testsuite/surf/surf_usage.c @@ -47,7 +47,6 @@ void test(char *platform) surf_action_t actionA = NULL; surf_action_t actionB = NULL; surf_action_t actionC = NULL; - surf_action_t commAB = NULL; e_surf_action_state_t stateActionA; e_surf_action_state_t stateActionB; e_surf_action_state_t stateActionC; @@ -91,9 +90,8 @@ void test(char *platform) XBT_DEBUG("%s : %p", surf_resource_name(cardB), cardB); /* Let's do something on it */ - commAB = - surf_network_model->extension.network.communicate("Cpu A", "Cpu B", - 150.0, -1.0); + surf_network_model->extension.network.communicate("Cpu A", "Cpu B", + 150.0, -1.0); surf_solve(-1.0); /* Takes traces into account. Returns 0.0 */ do { diff --git a/testsuite/surf/surf_usage2.c b/testsuite/surf/surf_usage2.c index 5c10de061c..3dcab9697a 100644 --- a/testsuite/surf/surf_usage2.c +++ b/testsuite/surf/surf_usage2.c @@ -42,10 +42,6 @@ void test(char *platform) { void *workstationA = NULL; void *workstationB = NULL; - surf_action_t actionA = NULL; - surf_action_t actionB = NULL; - surf_action_t actionC = NULL; - surf_action_t commAB = NULL; double now = -1.0; int running; @@ -71,18 +67,11 @@ void test(char *platform) XBT_DEBUG("%s : %p", surf_resource_name(workstationB), workstationB); /* Let's do something on it */ - actionA = - surf_workstation_model->extension.workstation.execute(workstationA, - 1000.0); - actionB = - surf_workstation_model->extension.workstation.execute(workstationB, - 1000.0); - actionC = - surf_workstation_model->extension.workstation.sleep(workstationB, - 7.32); - - commAB = - surf_workstation_model->extension.workstation. + 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_model->extension.workstation. communicate(workstationA, workstationB, 150.0, -1.0); surf_solve(-1.0); /* Takes traces into account. Returns 0.0 */ diff --git a/testsuite/xbt/.gitignore b/testsuite/xbt/.gitignore deleted file mode 100644 index 16d7158166..0000000000 --- a/testsuite/xbt/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -context_usage -graphxml_usage -heap_bench -log_usage diff --git a/tools/.gitignore b/tools/.gitignore deleted file mode 100644 index 95b00a81ea..0000000000 --- a/tools/.gitignore +++ /dev/null @@ -1 +0,0 @@ -graspe-slave diff --git a/tools/doxygen/doxygen_postprocesser.pl b/tools/doxygen/doxygen_postprocesser.pl index 6481604be9..bd15975168 100755 --- a/tools/doxygen/doxygen_postprocesser.pl +++ b/tools/doxygen/doxygen_postprocesser.pl @@ -3,10 +3,10 @@ use strict; # Add here the pages of the documentation generated by a @page doxygen macro -my @extra_files = qw(html/index.html html/faq.html html/history.html html/contrib.html html/people.html - html/publis.html html/publis_core.html html/publis_extern.html html/publis_intra.html - html/pages.html html/modules.html html/annotated.html html/functions.html html/functions_vars.html index.php - html/GRAS_tut.html); +my @extra_files = qw(html/index.html html/pages.html html/modules.html html/annotated.html html/functions.html + html/functions_vars.html index.php + html/GRAS_tut.html html/tracing.html html/installSimgrid.html html/bindings.html + html/options.html html/use.html html/pls.html); # GRAS tutorial map {push @extra_files, "html/GRAS_tut_$_.html"} qw (intro @@ -211,7 +211,8 @@ sub handle_page { # we generate the tabs bottom up begining from where we are in the tree # and display them top down, as it should in a file my @tabs = (); - + my $found_div_tabs=0; + if (defined ($current->{'label'}) and $current->{'label'} ne 'ROOT') { # print "handle $current->{'file'}, at level $level\n"; # generate the tabs @@ -246,11 +247,13 @@ sub handle_page { # add "current" to the module API granfather page s|
  • [^<]*
  • |
  • Modules API
  • |; # print "++Write $_"; + $found_div_tabs=1 if m/div.*class="tabs"/; print TO "$_"; - last if (m||); + last if ((m||)&&($found_div_tabs)); } - + print TO "\n\n"; + foreach (@tabs) { # print "TAB: $_"; print TO "$_"; @@ -258,26 +261,26 @@ sub handle_page { print TO "\n\n"; if ($current->{'file'} =~ m/^class/) { - while () { - last if (m||); - } + while () { + last if (m||); + } print TO "$_"; } while () { if (m/POST-PROCESSED TABS/) { - while () { + while () { last if (m/END OF POST-PROCESSED TABS/); - } - next; + } + next; } if (m/The documentation for/) { - while () { + while () { last if (m/

    /); - } + } } print TO "$_"; - } + } close FROM; close TO; rename("$newname","html/$current->{'file'}") unless $debug{'rename'}; @@ -292,15 +295,51 @@ sub handle_page { ### ### Launch the modules navbar reworking ### -handle_page($top,-2);# skip roots (we have 2 roots) in level counting +handle_page($top,-1);# skip roots (we have 2 roots) in level counting + +### +### Add the modules navbar reworking to the modules.html file +### +sub add_tabs_to_module_html { + my $found_div_tabs=0; + my $module_tabs = "

    \n
    \n"; + + my $oldname = "html/modules.html"; + open FROM,$oldname || die; + my $newname=$oldname; + $newname =~ s/.html/.handlepage.html/; + open TO,">$newname" || die; + while () { + $found_div_tabs=1 if m/div.*class="tabs"/; + print TO "$_"; + last if ((m||)&&($found_div_tabs)); + } + + print TO "\n\n"; + print TO $module_tabs; + print TO "\n\n"; + + while () { + print TO "$_"; + } + close FROM; + close TO; + rename($newname, $oldname) unless $debug{'rename'}; + + # die; +} +add_tabs_to_module_html; ### ### Post-processsing common to all pages ### map {push @allfiles,$_} @extra_files; print "All files: ".(join(", ",@allfiles))."\n" if $debug{'parse'}; - my $tabs; foreach my $file (@allfiles) { @@ -316,46 +355,114 @@ foreach my $file (@allfiles) { print TO ''."\n" if (m||); + if($tabs){ + if($file =~ /^html\/index\..*/){ + $_ =~ s/
  • /
  • /g; + $_ =~ s/
  • /
  • /g; + } + $_ =~ s/
  • /
  • /g; + + if($file =~ /^html\/pages\..*/){ + $_ =~ s/
  • /
  • /g; + } + } + + if($file =~ /^html\/publis.*/){ + $_ =~ s/
    /
    /g; + $_ =~ s/
    /
    /g; + } + + # Add the FAQ PUBLIS PEOPLE HISTORY and CONTRIB to the top navbar. + if( $_ =~ //){ + $tabs = 1; + } + if( $_ =~ /<\/div>/){ + $tabs = 0; + } + if( $_ =~ /<\/ul>/ && $tabs){ + my $tmp_buff=""; + $tmp_buff .= '
  • Using SimGrid
  • '."\n"; + $tmp_buff .= '
  • Forge
  • '."\n"; + $tmp_buff .= '
  • Website
  • '."\n"; + $tmp_buff .= '
  • Documentation index
  • '."\n"; + $tmp_buff .= $_; + $tabs = 0; + + # Rework the navbar and add menu for use.html + # Fix the current "button" of buggy Doxygen tabs + if($file =~ /^html\/use.*/ + || $file =~ /^html\/installSimgrid.*/ + || $file =~ /^html\/options.*/ + || $file =~ /^html\/tracing.*/ + || $file =~ /^html\/bindings.*/ + || $file =~ /^html\/pls.*/ + || $file =~ /^html\/modules.*/ + || $file =~ /^html\/annotated.*/ + || $file =~ /^html\/group__.*/ + || $file =~ /^html\/functions.*/) + { + $tmp_buff .= '
    '."\n"; + $tmp_buff .= '
    '."\n"; + $tmp_buff .= ' '."\n"; + + my $filename = $file; + $filename =~ s/html\///g; + $filename =~ s/\.html//g; + $filename =~ s/publis_.*/publis/g; + $tmp_buff =~ s/
  • /
  • /g; + $tmp_buff =~ s/
  • /
  • /g; + $tmp_buff =~ s/
  • /
  • /g; + + } - # Rework the navbar - if($file =~ "^html/index.*"){ - if ($_ =~ /
  • Main Page<\/span><\/a><\/li>/) { - print TO '
  • Main Page
  • '."\n"; - next; + # Rework the navbar + # Fix the current "button" of buggy Doxygen tabs + if($file =~ /^html\/pages.*/) + { + my $filename = $file; + $filename =~ s/html\///g; + $filename =~ s/\.html//g; + $tmp_buff =~ s/
  • /
  • /g; + $tmp_buff =~ s/
  • /
  • /g; } - elsif ($_ =~ /[\ ]*
  • .*/) { - $_ =~ s/ class="current"//g; - print TO $_; - next; + if($file =~ /^html\/group__.*/) + { + $tmp_buff =~ s/
  • /
  • /g; } - } - if($file =~ "^html/faq.*"){ - if ($_ =~ /[\ ]*
  • .*/) { - $_ =~ s/ class="current"//g; - print TO $_; - next; + if($file =~ /^html\/functions.*/) + { + $tmp_buff =~ s/
  • /
  • /g; } + + + print TO $tmp_buff; + next; + } + s|Modules|Modules API|g; + s|Related Pages
  • \n||g; + s|
  • Modules API
  • \n||g; + s|
  • Modules API
  • \n||g; + if($file =~ /^html\/group__.*/) + { + s|
  • |
  • |g; + s|
  • Modules API
  • \n|
  • Modules API
  • \n|g; } - if( $_ =~ //){$tabs = 1;} - if( $_ =~ /<\/div>/){$tabs = 0;} - if( $_ =~ /<\/ul>/ && $tabs){ - if($file =~ "^html/faq.*"){ - print TO '
  • FAQ Page
  • '."\n";} - else{ - print TO '
  • FAQ Page
  • '."\n";} - print TO $_; - next; + else + { + s|
  • Modules API
  • \n||g; } -# if (m,
  • Data\ Structures
  • ,) { -# print TO ' Publications'."\n"; -# print TO ' People'."\n"; -# print TO ' History'."\n"; -# print TO ' Contrib'."\n"; -# next; -# } - s|Modules|Modules API|g; - s|Related Pages|Site Plan|g; - + s|
  • Data Structures
  • \n||g; + s|
  • Data Structures
  • \n||g; + s|Related Pages<|Documentation index<|g; + print TO $_; } close FROM; diff --git a/tools/doxygen/index_php.pl b/tools/doxygen/index_php.pl index 4d8a9d05e1..3a2e6144fd 100755 --- a/tools/doxygen/index_php.pl +++ b/tools/doxygen/index_php.pl @@ -21,7 +21,7 @@ while(defined($line=)) { $onglets.=$line; } $onglets.=$line; - $onglets.="


    \n" + #$onglets.="


    \n" } if($line =~/(.*)$/) { $tmp=$1; @@ -54,6 +54,7 @@ open OUTPUT,"> $output"; while(defined($line=)) { chomp $line; if($line =~/______ONGLETS______/) { + $onglets =~ s/

  • #endif -#include -#include -#include -#include -#include - - -#include "simdag/simdag.h" -#include "xbt/log.h" -#include "xbt/dict.h" -#include "xbt/ex.h" +#include "msg/msg.h" #include "xbt/graph.h" -#include "surf/surf.h" -#include "surf/surf_private.h" XBT_LOG_NEW_DEFAULT_CATEGORY(graphicator, "Graphicator Logging System"); -static int name_compare_links(const void *n1, const void *n2) -{ - char name1[80], name2[80]; - strcpy(name1, SD_link_get_name(*((SD_link_t *) n1))); - strcpy(name2, SD_link_get_name(*((SD_link_t *) n2))); - - return strcmp(name1, name2); -} - -static const char *node_name(xbt_node_t n) -{ - return xbt_graph_node_get_data(n); -} - -static const char *edge_name(xbt_edge_t n) -{ - return xbt_graph_edge_get_data(n); -} - -static xbt_node_t xbt_graph_search_node (xbt_graph_t graph, void *data, int (*compare_function)(const char *, const char *)) -{ - unsigned int cursor = 0; - void *tmp = NULL; - - xbt_dynar_t dynar = xbt_graph_get_nodes (graph); - xbt_dynar_foreach(dynar, cursor, tmp) { - xbt_node_t node = (xbt_node_t)tmp; - if (!compare_function (data, xbt_graph_node_get_data (node))) return node; - } - return NULL; -} - -static xbt_edge_t xbt_graph_search_edge (xbt_graph_t graph, xbt_node_t n1, xbt_node_t n2) -{ - unsigned int cursor = 0; - void *tmp = NULL; - xbt_dynar_t dynar = xbt_graph_get_edges (graph); - xbt_dynar_foreach(dynar, cursor, tmp) { - xbt_edge_t edge = (xbt_edge_t)tmp; - if (( xbt_graph_edge_get_source(edge) == n1 && - xbt_graph_edge_get_target(edge) == n2) || - ( xbt_graph_edge_get_source(edge) == n2 && - xbt_graph_edge_get_target(edge) == n1)){ - return edge; - } - } - return NULL; -} - int main(int argc, char **argv) { - char *platformFile = NULL; - char *graphvizFile = NULL; - - unsigned int i; - char *src; - char *dst; - xbt_ex_t e; - xbt_lib_cursor_t cursor,cursor_src,cursor_dst; - char * key; - char **data; - - SD_init(&argc, argv); +#ifdef HAVE_TRACING + MSG_global_init(&argc, argv); if (argc < 3){ XBT_INFO("Usage: %s ", argv[0]); return 1; } - platformFile = argv[1]; - graphvizFile = argv[2]; + char *platformFile = argv[1]; + char *graphvizFile = argv[2]; - TRY { - SD_create_environment(platformFile); - } CATCH(e) { - xbt_die("Error while loading %s: %s",platformFile,e.msg); - } + MSG_create_environment(platformFile); //creating the graph structure - xbt_graph_t graph = xbt_graph_new_graph (0, NULL); - - //adding hosts - xbt_lib_foreach(host_lib,cursor,key,data){ - if(get_network_element_type(key) == SURF_NETWORK_ELEMENT_HOST || - get_network_element_type(key) == SURF_NETWORK_ELEMENT_ROUTER ) - xbt_graph_new_node (graph, xbt_strdup(key)); + xbt_graph_t graph = TRACE_platform_graph(); + if (graph == NULL){ + XBT_INFO ("%s expects --cfg=tracing:1 --cfg=tracing/platform:1", argv[0]); + }else{ + TRACE_platform_graph_export_graphviz (graph, graphvizFile); + XBT_INFO ("Output is in file %s", graphvizFile); } - - //adding links - int totalLinks = SD_link_get_number(); - const SD_link_t *links = SD_link_get_list(); - qsort((void *) links, totalLinks, sizeof(SD_link_t), name_compare_links); - for (i = 0; i < totalLinks; i++) { - xbt_graph_new_node (graph, xbt_strdup (SD_link_get_name(links[i]))); - } - - - xbt_lib_foreach(host_lib,cursor_src,src,data){ - xbt_lib_foreach(host_lib,cursor_dst,dst,data){ - - xbt_node_t src_node = xbt_graph_search_node (graph, src, strcmp); - xbt_node_t dst_node = xbt_graph_search_node (graph, dst, strcmp); - if(get_network_element_type(src) != SURF_NETWORK_ELEMENT_AS && - get_network_element_type(dst) != SURF_NETWORK_ELEMENT_AS ){ - xbt_dynar_t route = global_routing->get_route(src,dst); - xbt_node_t previous = src_node; - for(i=0;iname); - if (strcmp(link_name, "loopback")==0 || strcmp(link_name, "__loopback__")==0) continue; - xbt_node_t link_node = xbt_graph_search_node (graph, link_name, strcmp); - if (!link_node){ - link_node = xbt_graph_new_node (graph, strdup(link_name)); - } - xbt_edge_t edge = xbt_graph_search_edge (graph, previous, link_node); - if (!edge){ - XBT_DEBUG("\%s %s", (char*)xbt_graph_node_get_data(previous), (char*)xbt_graph_node_get_data(link_node)); - xbt_graph_new_edge (graph, previous, link_node, NULL); - } - previous = link_node; - free(link_name); - } - xbt_edge_t edge = xbt_graph_search_edge (graph, previous, dst_node); - if (!edge){ - XBT_DEBUG("\%s %s", (char*)xbt_graph_node_get_data(previous), (char*)xbt_graph_node_get_data(dst_node)); - xbt_graph_new_edge (graph, previous, dst_node, NULL); - } - } - } - } - xbt_graph_export_graphviz (graph, graphvizFile, node_name, edge_name); - xbt_graph_free_graph (graph, NULL, NULL, NULL); - SD_exit(); - + MSG_clean(); +#else + XBT_INFO ("works only if simgrid was compiled with tracing enabled."); +#endif return 0; } diff --git a/tools/graphicator/graphicator.tesh b/tools/graphicator/graphicator.tesh index 0e70163100..8b9eacc02f 100644 --- a/tools/graphicator/graphicator.tesh +++ b/tools/graphicator/graphicator.tesh @@ -1,6 +1,9 @@ #! ./tesh -$ ${bindir:=.}/graphicator ${srcdir:=.}/teshsuite/simdag/platforms/one_cluster.xml test.dot -> [0.000000] [surf_workstation/INFO] surf_workstation_model_init_ptask_L07 +$ ${bindir:=.}/graphicator ${srcdir:=.}/teshsuite/simdag/platforms/one_cluster.xml --cfg=tracing:1 --cfg=tracing/platform:1 test.dot +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing' to '1' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'tracing/platform' to '1' +> [0.000000] [graphicator/INFO] Output is in file test.dot + $ rm test.dot diff --git a/tools/gras/.gitignore b/tools/gras/.gitignore deleted file mode 100644 index d115769d39..0000000000 --- a/tools/gras/.gitignore +++ /dev/null @@ -1 +0,0 @@ -gras_stub_generator diff --git a/tools/gras/gras_stub_generator.h b/tools/gras/gras_stub_generator.h index 189f7b68ae..e50590ffd1 100644 --- a/tools/gras/gras_stub_generator.h +++ b/tools/gras/gras_stub_generator.h @@ -15,16 +15,16 @@ #include "xbt/dynar.h" #include "xbt/dict.h" -xbt_dict_t process_function_set; -xbt_dynar_t process_list; -xbt_dict_t machine_set; +extern xbt_dict_t process_function_set; +extern xbt_dynar_t process_list; +extern xbt_dict_t machine_set; +extern char *warning; typedef struct s_process_t { int argc; char **argv; char *host; } s_process_t; -char *warning; void s_process_free(void *process); diff --git a/tools/gras/stub_generator.c b/tools/gras/stub_generator.c index 6c02c9d0eb..dfe760ce2d 100644 --- a/tools/gras/stub_generator.c +++ b/tools/gras/stub_generator.c @@ -22,11 +22,8 @@ #include "gras_stub_generator.h" #include - - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(stubgen, gras, "Stub generator"); - #ifdef _XBT_WIN32 #include #endif @@ -43,6 +40,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(stubgen, gras, "Stub generator"); xbt_dict_t process_function_set = NULL; xbt_dynar_t process_list = NULL; xbt_dict_t machine_set = NULL; +char *warning = NULL; void s_process_free(void *process) { @@ -176,6 +174,11 @@ int main(int argc, char *argv[]) #endif free(warning); + + xbt_dict_free(&process_function_set); + xbt_dynar_free(&process_list); + xbt_dict_free(&machine_set); surf_exit(); + return 0; } diff --git a/tools/gras/unix_stub_generator.c b/tools/gras/unix_stub_generator.c index fade69be39..42aabfc17d 100644 --- a/tools/gras/unix_stub_generator.c +++ b/tools/gras/unix_stub_generator.c @@ -58,8 +58,6 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(stubgen); #define MAKEFILE_FILENAME_REMOTE "%s.Makefile.remote" #define DEPLOYMENT "%s.deploy.sh" -char *warning = NULL; - /**********************************************/ /**** Generate the file for the simulator *****/ /**********************************************/ diff --git a/tools/simgrid_update_xml.pl b/tools/simgrid_update_xml.pl index 16d4bc783c..ba6211b021 100755 --- a/tools/simgrid_update_xml.pl +++ b/tools/simgrid_update_xml.pl @@ -1,14 +1,108 @@ -#! /usr/bin/perl +#! /usr/bin/env perl +eval 'exec perl -S $0 ${1+"$@"}' + if $running_under_some_shell; # This script updates the simgrid XML file passed as argument (modification in place) # It is built to do the conversion incrementally. -# Copyright (C) 2006-2010. The SimGrid team. All rights reserved. +# Copyright (C) 2006-2011. 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. +=encoding UTF-8 + +=head1 NAME + +simgrid_update_xml - updates simgrid XML files to lastest version + +=head1 SYNOPSIS + +B I + +=head1 DESCRIPTION + +simgrid_update_xml updates the simgrid XML file passed as argument. The file +is modified in place, without any kind of backup. You may want to save a copy +before running the script. + +In SimGrid XML files, the standard version is indicated in the version +attribute of the platform tag. Current version is 3. Here is a list of major +changes in each version. + +=over 4 + +=item B Used before SimGrid 3.3 + +=item B Introduced in SimGrid 3.3 + +=over 4 + +=item + +The version attribute of platform were added to allow file versionning. + +=item + +The link bandwidth changed from Mb/s to b/s; and the CPU power were changed +from MFlop/s to Flop/s + +=back + +=item B Introduced in SimGrid 3.4 + +=over + +=item + +Several tags were renamed: + + CPU -> HOST + NETWORK_LINK -> LINK + ROUTE_ELEMENT -> LINK_CTN + PLATFORM_DESCRIPTION -> PLATFORM + +=back + +=item B Introduced in SimGrid 3.5 (this is the current version) + +=over 4 + +=item + +The AS tag were introduced. Every plaform should now contain an englobing AS +tag. + +=item + +Routes are now symmetric by default. + +=item + +Several tags were renamed (for sake of XML sanity): + + LINK:CTN -> LINK_CTN + TRACE:CONNECT -> TRACE_CONNECT + +=back + +=back + +=head1 AUTHORS + + The SimGrid team (simgrid-devel@lists.gforge.inria.fr) + +=head1 COPYRIGHT AND LICENSE + +Copyright 2006-2011. 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. + +=cut + + use strict; my $fromversion=-1; diff --git a/tools/tesh/.gitignore b/tools/tesh/.gitignore deleted file mode 100644 index c1dc7155d6..0000000000 --- a/tools/tesh/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tesh diff --git a/tools/tesh/IO-orders.tesh b/tools/tesh/IO-orders.tesh index 14db63d9b5..79483162fe 100644 --- a/tools/tesh/IO-orders.tesh +++ b/tools/tesh/IO-orders.tesh @@ -5,53 +5,59 @@ p Order: in, out, cmd < < TOTO < > TOTO < $ cat +> Enable coverage > Test suite from stdin > [(stdin):3] cat > Test suite from stdin OK -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' p Order: out, in, cmd < > TOTO < < TOTO < $ cat +> Enable coverage > Test suite from stdin > [(stdin):3] cat > Test suite from stdin OK -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' p Order: out, cmd, in < > TOTO < $ cat < < TOTO +> Enable coverage > Test suite from stdin > [(stdin):2] cat > Test suite from stdin OK -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' p Order: in, cmd, out < < TOTO < $ cat < > TOTO +> Enable coverage > Test suite from stdin > [(stdin):2] cat > Test suite from stdin OK -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' p Order: cmd, out, in < $ cat < > TOTO < < TOTO +> Enable coverage > Test suite from stdin > [(stdin):1] cat > Test suite from stdin OK -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' p Order: cmd, in, out < $ cat < < TOTO < > TOTO +> Enable coverage > Test suite from stdin > [(stdin):1] cat > Test suite from stdin OK -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' diff --git a/tools/tesh/basic.tesh b/tools/tesh/basic.tesh index fd7de37e71..d26a68ee98 100644 --- a/tools/tesh/basic.tesh +++ b/tools/tesh/basic.tesh @@ -29,3 +29,17 @@ $ wc -l tmp_fich > 4 tmp_fich $ rm tmp_fich + +$ ${bindir:=.}/tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' basic2.tesh +> Enable coverage +> Test suite `basic2' +> [basic2:3] Test sorting and filtering of output +> [basic2:5] printf 'a\\nb\\nc\\nd\\n' +> [basic2:11] printf 'a\\nb\\nc\\nd' +> [basic2:18] printf 'c\\nd\\nb\\na\\n' +> [basic2:25] printf 'c\\nd\\nb\\na' +> [basic2:31] printf 'a\\nprofiling: foo\\nprofiling: bar\\nb\\nc\\nd\\nprofiling: baz\\n' +> [basic2:37] printf 'a\\nprofiling: foo\\nprofiling: bar\\nb\\nc\\nd\\nprofiling: baz' +> [basic2:44] printf 'c\\nprofiling: foo\\nprofiling: bar\\nd\\nb\\na\\nprofiling: baz\\n' +> [basic2:51] printf 'c\\nprofiling: foo\\nprofiling: bar\\nd\\nb\\na\\nprofiling: baz' +> Test suite `basic2' OK diff --git a/tools/tesh/basic2.tesh b/tools/tesh/basic2.tesh new file mode 100644 index 0000000000..9e08b11561 --- /dev/null +++ b/tools/tesh/basic2.tesh @@ -0,0 +1,55 @@ +#! ./tesh + +p Test sorting and filtering of output + +$ printf 'a\\nb\\nc\\nd\\n' +> a +> b +> c +> d + +$ printf 'a\\nb\\nc\\nd' +> a +> b +> c +> d + +! output sort +$ printf 'c\\nd\\nb\\na\\n' +> a +> b +> c +> d + +! output sort +$ printf 'c\\nd\\nb\\na' +> a +> b +> c +> d + +$ printf 'a\\nprofiling: foo\\nprofiling: bar\\nb\\nc\\nd\\nprofiling: baz\\n' +> a +> b +> c +> d + +$ printf 'a\\nprofiling: foo\\nprofiling: bar\\nb\\nc\\nd\\nprofiling: baz' +> a +> b +> c +> d + +! output sort +$ printf 'c\\nprofiling: foo\\nprofiling: bar\\nd\\nb\\na\\nprofiling: baz\\n' +> a +> b +> c +> d + +! output sort +$ printf 'c\\nprofiling: foo\\nprofiling: bar\\nd\\nb\\na\\nprofiling: baz' +> a +> b +> c +> d diff --git a/tools/tesh/catch-return.tesh b/tools/tesh/catch-return.tesh index b7d39c592d..94bf5c854e 100644 --- a/tools/tesh/catch-return.tesh +++ b/tools/tesh/catch-return.tesh @@ -16,7 +16,8 @@ $ gcc -o return1 return1.c ! expect return 41 < $ ./return1 -$ ../tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ../tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' +> Enable coverage > Test suite from stdin > [(stdin):1] ./return1 > Test suite `(stdin)': NOK (<(stdin):1> returned code 1) diff --git a/tools/tesh/catch-signal.tesh b/tools/tesh/catch-signal.tesh index 2b0436f2aa..7cde9813b1 100644 --- a/tools/tesh/catch-signal.tesh +++ b/tools/tesh/catch-signal.tesh @@ -17,7 +17,8 @@ $ gcc -o segfault segfault.c ! expect return 15 < $ ./segfault -$ ../tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ../tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' +> Enable coverage > Test suite from stdin > [(stdin):1] ./segfault > Test suite `(stdin)': NOK (<(stdin):1> got signal SIGSEGV) diff --git a/tools/tesh/catch-timeout.tesh b/tools/tesh/catch-timeout.tesh index ebab52a61d..d9daf92e95 100644 --- a/tools/tesh/catch-timeout.tesh +++ b/tools/tesh/catch-timeout.tesh @@ -6,9 +6,10 @@ ! expect return 3 < ! timeout 1 < $ sleep 6 +> Enable coverage > Test suite from stdin > [(stdin):2] sleep 6 > <(stdin):2> timeouted. Kill the process. > <(stdin):2> No output before timeout > Test suite `(stdin)': NOK (<(stdin):2> timeout after 1 sec) -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' diff --git a/tools/tesh/catch-wrong-output.tesh b/tools/tesh/catch-wrong-output.tesh index 135ae4cbfa..bfb2adbf98 100644 --- a/tools/tesh/catch-wrong-output.tesh +++ b/tools/tesh/catch-wrong-output.tesh @@ -6,7 +6,8 @@ p This tests whether TESH detects wrong outputs < > TOTO < < TUTU < $ cat -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' +> Enable coverage > Test suite from stdin > [(stdin):3] cat > Output of <(stdin):3> mismatch: diff --git a/tools/tesh/cd.tesh b/tools/tesh/cd.tesh index 221ea43715..807086412a 100644 --- a/tools/tesh/cd.tesh +++ b/tools/tesh/cd.tesh @@ -12,10 +12,11 @@ $ ls # Check that tesh detects properly cd to non-existing directories ! expect return 4 < $ cd toto +> Enable coverage > Test suite from stdin > Chdir to toto failed: No such file or directory > Test suite `(stdin)': NOK (system error) -$ ../tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ../tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' # The next command checks that there is a testdir_temp-cd in the upper directory, # ie that mkdir and cd both worked. diff --git a/tools/tesh/run_context.c b/tools/tesh/run_context.c index 60b38bf0e1..fa0c8ac220 100644 --- a/tools/tesh/run_context.c +++ b/tools/tesh/run_context.c @@ -707,6 +707,41 @@ void *rctx_wait(void *r) return NULL; xbt_os_mutex_acquire(rctx->interruption); */ + { + xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); + xbt_dynar_t b = xbt_dynar_new(sizeof(char *), NULL); + unsigned cpt; + char *str; + xbt_dynar_foreach(a, cpt, str) { + if (strncmp(str, "TESH_ERROR ", (sizeof "TESH_ERROR ") - 1) == 0) { + XBT_CRITICAL("%s", str); + errcode = 1; + } else if (coverage && + strncmp(str, "profiling:", (sizeof "profiling:") - 1) == 0) { + XBT_DEBUG("Remove line [%u]: '%s'", cpt, str); + } else { + xbt_dynar_push_as(b, char *, str); + } + } + + if (rctx->output_sort) { + xbt_dynar_sort(b, cmpstringp); + /* If empty lines moved in first position, remove them */ + while (*xbt_dynar_getfirst_as(b, char *) == '\0') + xbt_dynar_shift(b, NULL); + } + + if (rctx->output_sort || xbt_dynar_length(b) != xbt_dynar_length(a)) { + char *newbuf = xbt_str_join(b, "\n"); + strcpy(rctx->output_got->data, newbuf); + rctx->output_got->used = strlen(newbuf); + xbt_free(newbuf); + } + + xbt_dynar_free(&b); + xbt_dynar_free(&a); + } + xbt_strbuff_chomp(rctx->output_got); xbt_strbuff_chomp(rctx->output_wanted); xbt_strbuff_trim(rctx->output_got); @@ -781,34 +816,7 @@ void *rctx_wait(void *r) rctx->expected_signal = NULL; } } - while (rctx->output_got->used - && !strncmp(rctx->output_got->data, "TESH_ERROR ", - strlen("TESH_ERROR "))) { - int marklen = strlen("TESH_ERROR "); - char *endline = strchr(rctx->output_got->data, '\n'); - - XBT_CRITICAL("%.*s", (int) (endline - rctx->output_got->data - marklen), - rctx->output_got->data + marklen); - memmove(rctx->output_got->data, rctx->output_got->data + marklen, - rctx->output_got->used - marklen); - rctx->output_got->used -= endline - rctx->output_got->data + 1; - rctx->output_got->data[rctx->output_got->used] = '\0'; - errcode = 1; - } - if (rctx->output_sort) { - xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); - xbt_dynar_sort(a,cmpstringp); - char *sorted_output = xbt_str_join(a, "\n"); - strcpy(rctx->output_got->data, sorted_output); - xbt_free(sorted_output); - xbt_dynar_free(&a); - /* If an empty line moved in first position, move it back to the end */ - if (rctx->output_got->data[0]=='\n') { - memmove(rctx->output_got->data,rctx->output_got->data+1,rctx->output_got->used-1); - rctx->output_got->data[rctx->output_got->used-1] = '\n'; - } - } if ((errcode && errcode != 1) || rctx->interrupted) { /* checking output, and matching */ xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); diff --git a/tools/tesh/set-ignore-output.tesh b/tools/tesh/set-ignore-output.tesh index af80e581e4..1fba40114d 100644 --- a/tools/tesh/set-ignore-output.tesh +++ b/tools/tesh/set-ignore-output.tesh @@ -6,7 +6,8 @@ p This tests whether TESH accepts to ignore command output < > TOTO < < TUTU < $ cat -$ ./tesh --log='log.thresh:info tesh.fmt:%m%n' +$ ./tesh --enable-coverage --log='log.thresh:info tesh.fmt:%m%n' +> Enable coverage > Test suite from stdin > [(stdin):4] cat > (ignoring the output of <(stdin):4> as requested) diff --git a/tools/tesh/tesh.c b/tools/tesh/tesh.c index cd963991e7..b4659fcf0a 100644 --- a/tools/tesh/tesh.c +++ b/tools/tesh/tesh.c @@ -21,8 +21,14 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(tesh, "TEst SHell utility"); /*** Options ***/ int timeout_value = 5; /* child timeout value */ int sort_len = 19; /* length of the prefix to sort */ +char *option; +int coverage = 0; /* whether the code coverage is enable */ +rctx_t rctx; const char *testsuite_name; + +xbt_dict_t env; + static void handle_line(const char *filepos, char *line) { /* Search end */ @@ -250,6 +256,13 @@ int main(int argc, char *argv[]) argc -= 2; i -= 2; } + else if (!strcmp(argv[i], "--enable-coverage" )){ + coverage = 1; + XBT_INFO("Enable coverage"); + memmove(argv + i, argv + i + 1, (argc - i - 1) * sizeof(char *)); + argc -= 1; + i -= 1; + } } /* Find the description file */ diff --git a/tools/tesh/tesh.h b/tools/tesh/tesh.h index 326c1f5515..4029614c5d 100644 --- a/tools/tesh/tesh.h +++ b/tools/tesh/tesh.h @@ -22,13 +22,14 @@ const char *signal_name(unsigned int got, char *expected); #include "run_context.h" /*** Options ***/ -int timeout_value; /* child timeout value */ -int sort_len; /* length of the prefix to sort */ -char* option; /* cfg for command line */ +extern int timeout_value; /* child timeout value */ +extern int sort_len; /* length of the prefix to sort */ +extern char* option; /* cfg for command line */ #define SORT_LEN_DEFAULT 19 +extern int coverage; /* coverage */ -rctx_t rctx; -const char *testsuite_name; +extern rctx_t rctx; +extern const char *testsuite_name; /* Environment related definitions */ @@ -41,6 +42,6 @@ const char *testsuite_name; extern char **environ; # endif -xbt_dict_t env; /* the environment, stored as a dict (for variable substitution) */ +extern xbt_dict_t env; /* the environment, stored as a dict (for variable substitution) */ #endif /* TESH_H */