diff --git a/Control/AthenaCommon/CMakeLists.txt b/Control/AthenaCommon/CMakeLists.txt index b2befffbf3cba79013c6ac7781b212897dbed7c7..023a4bf985c840c7b74c18e3eab55c8914ff25d9 100644 --- a/Control/AthenaCommon/CMakeLists.txt +++ b/Control/AthenaCommon/CMakeLists.txt @@ -13,7 +13,7 @@ atlas_depends_on_subdirs( PRIVATE atlas_install_headers( AthenaCommon ) atlas_install_python_modules( python/*.py python/Utils ) atlas_install_joboptions( share/Preparation.py share/Execution.py share/Atlas.UnixStandardJob.py test/*.py share/Atlas_Gen.UnixStandardJob.py share/MemTraceInclude.py share/runbatch.py ) -atlas_install_scripts( share/athena.py share/athena-app.py share/chappy.py share/find_cfg_dups.py share/test_cfg_pickling.py ) +atlas_install_scripts( share/athena.py share/athena_preload.sh share/athena-app.py share/chappy.py share/find_cfg_dups.py share/test_cfg_pickling.py ) # Aliases: atlas_add_alias( athena-app "athena-app.py" ) diff --git a/Control/AthenaCommon/share/athena.py b/Control/AthenaCommon/share/athena.py index 02d1d3402083ee1808735e3b126c2d3d43e9eb2a..d3c843be833e3b3a897419c17ac59e43056df02b 100755 --- a/Control/AthenaCommon/share/athena.py +++ b/Control/AthenaCommon/share/athena.py @@ -1,42 +1,21 @@ #!/bin/sh - +# +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +# +# athena.py is born as shell script to preload some optional libraries +# """date" -python_path=`which python` - -### Ugly hack to preload libtcmalloc.so - -#use tcmalloc by default if TCMALLOCDIR is defined, but only on non-macs +# defaults export USETCMALLOC=0 +export USEIMF=0 -# possibly, allow user to run with full tcmalloc by setting this variable -if [ -z $USETCMALLOCMINIMAL ]; then - export USETCMALLOCMINIMAL=1 +# but use tcmalloc by default if TCMALLOCDIR is defined +if [ -n "$TCMALLOCDIR" ]; then + export USETCMALLOC=1 fi -# if any of these variables is defined, we use tcmalloc to do some -# profiling, then we need the full library ! - -if [ -n "$CPUPROFILE" ] || [ -n "$HEAPPROFILE" ] || [ -n "$HEAPCHECK" ]; then - USETCMALLOCMINIMAL=0 -fi - -if [ -z $TCMALLOCDIR ]; then - if [[ $CMTEXTRATAGS != *ManaCore* ]]; then - echo "WARNING: TCMALLOCDIR not defined, will use libc malloc" - fi -else - USETCMALLOC=1 -fi - -export ATHENA_ADD_PRELOAD -ATHENA_DROP_RELOAD=0 - -export USEIMF=false -export IMF_LIB1="libimf.so" -export IMF_LIB2="libintlc.so.5" - - +# parse command line arguments for a in ${@} do case "$a" in @@ -46,79 +25,16 @@ do --tcmalloc) USETCMALLOC=1;; --stdcmath) USEIMF=0;; --imf) USEIMF=1;; - --preloadlib*) ATHENA_ADD_PRELOAD=${a#*=};; - --drop-and-reload) ATHENA_DROP_RELOAD=1;; + --preloadlib*) export ATHENA_ADD_PRELOAD=${a#*=};; + --drop-and-reload) export ATHENA_DROP_RELOAD=1;; esac done -if [ "$USETCMALLOC" = "1" ] || [ "$USETCMALLOC" = "true" ] ; then - if [ -z $TCMALLOCDIR ]; then - echo "ERROR: TCMALLOCDIR not defined" - exit 1 - fi - # test, if minimal tcmalloc is available. fallback to full library, if not - if [ "$USETCMALLOCMINIMAL" = "1" ] || [ "$USETCMALLOCMINIMAL" = "true" ] ; then - if [ ! -e "$TCMALLOCDIR/libtcmalloc_minimal.so" ]; then - echo "WARNING: $TCMALLOCDIR/libtcmalloc_minimal.so does not exist. Falling back to libtcmalloc" - USETCMALLOCMINIMAL=0 - else - echo "Preloading tcmalloc_minimal.so" - fi - fi - # preload and run with correct tcmalloc, if requested - if [ "$USETCMALLOCMINIMAL" = "0" ]; then - if [ ! -e "$TCMALLOCDIR/libtcmalloc.so" ]; then - echo "ERROR: $TCMALLOCDIR/libtcmalloc.so does not exist" - exit 1 - fi - echo "Preloading tcmalloc.so" - - if [ -z $LD_PRELOAD ]; then - export LD_PRELOAD="$TCMALLOCDIR/libtcmalloc.so" - else - export LD_PRELOAD="$TCMALLOCDIR/libtcmalloc.so:$LD_PRELOAD" - fi - else - if [ -z $LD_PRELOAD ]; then - export LD_PRELOAD="$TCMALLOCDIR/libtcmalloc_minimal.so" - else - export LD_PRELOAD="$TCMALLOCDIR/libtcmalloc_minimal.so:$LD_PRELOAD" - fi - fi -fi - -if [ $USEIMF == "1" ] || [ $USEIMF == true ]; then -fullimf1="$ATLASMKLLIBDIR_PRELOAD/$IMF_LIB1" -fullimf2="$ATLASMKLLIBDIR_PRELOAD/$IMF_LIB2" - if [ ! -e "$fullimf1" ]; then - echo "ERROR: $fullimf1 does not exit" - exit 1 - elif [ ! -e "$fullimf2" ]; then - echo "ERROR: $fullimf2 does not exit" - exit 1 - else - echo "Preloading $IMF_LIB1" - echo "Preloading $IMF_LIB2" - if [ -z $LD_PRELOAD ]; then - export LD_PRELOAD="$fullimf1:$fullimf2" - else - export LD_PRELOAD="$fullimf1:$fullimf2:$LD_PRELOAD" - fi - fi -fi - -# optionally add user-specific preload library -if [ "x$ATHENA_ADD_PRELOAD" != "x" ] && [ $ATHENA_DROP_RELOAD -eq 0 ]; then - echo "Preloading $ATHENA_ADD_PRELOAD" - if [ -z $LD_PRELOAD ]; then - export LD_PRELOAD="$ATHENA_ADD_PRELOAD" - else - export LD_PRELOAD="$ATHENA_ADD_PRELOAD:$LD_PRELOAD" - fi -else - unset ATHENA_ADD_PRELOAD -fi +# Do the actual preloading via LD_PRELOAD +source `which athena_preload.sh ` +# Now resurrect ourselves as python script +python_path=`which python` "exec" "$python_path" "-tt" "$0" "$@"; """ diff --git a/Control/AthenaCommon/share/athena_preload.sh b/Control/AthenaCommon/share/athena_preload.sh new file mode 100755 index 0000000000000000000000000000000000000000..2ad52120603de22911a9ed90bd4ac09b5545add7 --- /dev/null +++ b/Control/AthenaCommon/share/athena_preload.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +# +# Shell script to handle the possible preload libraries for athena, steered by: +# +# $TCMALLOCDIR : tcmalloc directory +# $USETCMALLOC : use tcmalloc (instead of std malloc) +# $USETCMALLOCMINIMAL : use minimal version of tcmalloc +# $ATLASMKLLIBDIR_PRELOAD : location of Intel math library +# $USEIMF : use Intel math library +# $ATHENA_ADD_PRELOAD : preload user specific library +# $ATHENA_DROP_RELOAD : are we in drop/reload mode? +# + +ld_preload() +{ + export LD_PRELOAD="$1${LD_PRELOAD:+:$LD_PRELOAD}" # set or prepend +} + +# possibly, allow user to run with full tcmalloc by setting this variable +export USETCMALLOCMINIMAL +if [ -z "$USETCMALLOCMINIMAL" ]; then + USETCMALLOCMINIMAL=1 +fi + +# for profiling we need the full tcmalloc library +if [ -n "$CPUPROFILE" ] || [ -n "$HEAPPROFILE" ] || [ -n "$HEAPCHECK" ]; then + USETCMALLOCMINIMAL=0 +fi + +# +# tcmalloc +# +if [ "$USETCMALLOC" = "1" ] || [ "$USETCMALLOC" = "true" ] ; then + if [ -z $TCMALLOCDIR ]; then + echo "ERROR: TCMALLOCDIR not defined" + exit 1 + fi + # test, if minimal tcmalloc is available. fallback to full library, if not + if [ "$USETCMALLOCMINIMAL" = "1" ] || [ "$USETCMALLOCMINIMAL" = "true" ] ; then + if [ ! -e "$TCMALLOCDIR/libtcmalloc_minimal.so" ]; then + echo "WARNING: $TCMALLOCDIR/libtcmalloc_minimal.so does not exist. Falling back to libtcmalloc" + USETCMALLOCMINIMAL=0 + fi + fi + # preload and run with correct tcmalloc, if requested + if [ "$USETCMALLOCMINIMAL" = "0" ]; then + if [ ! -e "$TCMALLOCDIR/libtcmalloc.so" ]; then + echo "ERROR: $TCMALLOCDIR/libtcmalloc.so does not exist" + exit 1 + fi + echo "Preloading tcmalloc.so" + ld_preload "$TCMALLOCDIR/libtcmalloc.so" + else + echo "Preloading tcmalloc_minimal.so" + ld_preload "$TCMALLOCDIR/libtcmalloc_minimal.so" + fi +fi + +# +# Intel math library +# +if [ "$USEIMF" = "1" ] || [ "$USEIMF" = "true" ]; then + IMF_LIB1="$ATLASMKLLIBDIR_PRELOAD/libimf.so" + IMF_LIB2="$ATLASMKLLIBDIR_PRELOAD/libintlc.so.5" + if [ ! -e "$IMF_LIB1" ]; then + echo "ERROR: $IMF_LIB1 does not exit" + exit 1 + elif [ ! -e "$IMF_LIB2" ]; then + echo "ERROR: $IMF_LIB2 does not exit" + exit 1 + else + echo "Preloading `basename $IMF_LIB1`" + echo "Preloading `basename $IMF_LIB2`" + ld_preload "$IMF_LIB1" + ld_preload "$IMF_LIB2" + fi +fi + +# +# User specific preload +# +if [ -n "$ATHENA_ADD_PRELOAD" ] && [ "$ATHENA_DROP_RELOAD" != "1" ]; then + echo "Preloading $ATHENA_ADD_PRELOAD" + ld_preload "$ATHENA_ADD_PRELOAD" +else + unset ATHENA_ADD_PRELOAD +fi