- added tool 'otfinfo' which can be used to get basic information of a trace
(also usable to check validation of a trace) - removed OTF python bindings (a working version of the OTF python bindings are available in the latest stand-alone release; see http://www.tu-dresden.de/zih/otf/) - incremented OTF version number This commit was SVN r21601.
Этот коммит содержится в:
родитель
92e40cb20a
Коммит
b4026c40ad
@ -1,4 +1,5 @@
|
||||
5.4.9
|
||||
- updated version of internal OTF to 1.3.12 (see extlib/otf/ChangeLog)
|
||||
- install header files to 'PREFIX/include/vampirtrace' by default to
|
||||
avoid conflicts with the OpenMPI integrated version of VT
|
||||
- added configure option '--with[out]-bfd' to control usage of BFD
|
||||
|
@ -1,164 +1,53 @@
|
||||
1.0
|
||||
- initial version
|
||||
1.3.12
|
||||
- added tool 'otfinfo' which can be used to get basic information of
|
||||
a trace
|
||||
- removed python bindings
|
||||
(a working version of the OTF python bindings are available in the
|
||||
latest stand-alone release; see http://www.tu-dresden.de/zih/otf/)
|
||||
|
||||
1.1.1
|
||||
- OTF_Reader now considers the return values of the handlers
|
||||
- added OTF_VERBOSE, OTF_DEBUG macro for error treatment
|
||||
- introduced 'UnknownRecord' handler which allows to catch
|
||||
unknown record types
|
||||
1.3.11
|
||||
- build/install tool 'otfdump' by default
|
||||
- install documentation
|
||||
- bugfix: removed included system headers inside 'extern "C" {}'
|
||||
- bugfix: added configure check for functions 'fseeko()' and 'ftello()'
|
||||
(these functions are not available on NEC SX platforms)
|
||||
|
||||
1.1.2
|
||||
- inverted return value of call-back handlers:
|
||||
'0' is non-error, '!= 0' is regarded as an error, now!
|
||||
(this makes OTF conform with the VTF3 scheme.)
|
||||
1.3.10
|
||||
- added configure option '--[enable|disable]-binaries' to control
|
||||
building of binaries (useful for multi-lib installations)
|
||||
|
||||
1.1.3
|
||||
- fixed a minor bug in otfaux
|
||||
1.3.9
|
||||
- fixed a portability bug: use own implementation of function
|
||||
'strdup()'
|
||||
- install a symbolic link 'otfdecompress' which is a synonym for
|
||||
'otfcompress -d'
|
||||
|
||||
1.1.4
|
||||
- fixed a bug in OTF_Reader which might have caused the very first
|
||||
time stamp of a trace to be not properly sorted
|
||||
- introduced '--snapshots' and '--statistics' switches to do only
|
||||
snapshots or statistics. for statistics a selective mode is allowed
|
||||
which regards only some streams. By this means statistics can be created
|
||||
in parallel by calling otfaux multiple times.
|
||||
1.3.8
|
||||
- generate OTF_inttypes.h during configuring which provides
|
||||
the integer types like int64_t, int8_t,...
|
||||
- shared OTF library will be linked with zlib, thus additionally
|
||||
linking with zlib is not necessary
|
||||
- bugfix in otf2vtf: correctly handle function leave records with id 0
|
||||
|
||||
1.1.5
|
||||
- have UnknownRecord report handle incomplete records or additional bytes at
|
||||
the end of a file.
|
||||
1.3.7
|
||||
- added example for using OTF_MasterControl to the doxygen documentation
|
||||
- general improvement of the documentation
|
||||
- improved autoconf's m4 scripts for cross buildings
|
||||
|
||||
1.2
|
||||
- introduce transparent zlib compression
|
||||
1.3.6
|
||||
- OTF_{Keywords.h,Parse.h,Platform.h} will no longer be installed
|
||||
- added a compile time assert making sure the correct sizes of the
|
||||
integer types ([u]int*_T)
|
||||
- OTF is now Windows Visual Studio compatible
|
||||
|
||||
1.2.1
|
||||
- added progress functions using read bytes instead of timestamps
|
||||
1.3.5
|
||||
- added doxygen html documentation (docu/doxygen/html/index.html)
|
||||
- fixed issue, where newlines were forbidden in def, stats and snaps
|
||||
- added missing const to OTF_WStream_writeDefProcessGroup()
|
||||
|
||||
1.2.2
|
||||
- important bugfix: definitionstream 0 was ignored since version 1.2
|
||||
|
||||
1.2.3
|
||||
- bugfix: provided copy handlers returned wrong value
|
||||
|
||||
1.2.4
|
||||
- bugfix: zlib compression bug, wrong sanity check fixed
|
||||
|
||||
1.2.5
|
||||
- bugfix: correctly handle process groups with more than 1000 entries
|
||||
|
||||
1.2.6
|
||||
- support shared libraries
|
||||
1.2.7
|
||||
- added progress functions to OTF_RStream
|
||||
- added a progress counter to otfmerge
|
||||
1.2.8
|
||||
- allow suffix '.dylib' for zlib library file (from Mac OS X)
|
||||
- removed configure warning
|
||||
|
||||
1.2.9
|
||||
- changeable zlevel
|
||||
- changeable zbuffersize
|
||||
|
||||
1.2.10
|
||||
- bugfix: otfmerge does no longer accept traces with local streams
|
||||
|
||||
1.2.11
|
||||
- changed OTF_RETURN*( 0=success, !0 = error )
|
||||
- added these macros to all internal functions and tools for better
|
||||
consistency
|
||||
- fixed various memoryleaks in otf and otfmerge
|
||||
- added otfconfig to tools. otfconfig shows installationparameters
|
||||
important for developers
|
||||
- updated documentation
|
||||
|
||||
1.2.12
|
||||
- removed intel compiler warnings in otfmerge
|
||||
- removed debug output
|
||||
- fixed 64bit issue
|
||||
|
||||
1.2.13
|
||||
- removed intel compiler warnings
|
||||
- changed OTF_FILETYPE_*-macros
|
||||
- fixed issues with OTF_getFilename()
|
||||
|
||||
1.2.14
|
||||
- do not linke with '-lz' if '--with-zlibsymbols' was specified
|
||||
- added zlib include line to otflib/Makefile.am
|
||||
|
||||
1.2.15
|
||||
- 3 new records introduced (NOTE: these are experimental):
|
||||
- DefFile
|
||||
- DefFileGroup
|
||||
- FileOperation
|
||||
1.2.16
|
||||
- fixed a problem with comments in otfmerge
|
||||
- 2 new records introduced (NOTE: these are experimental):
|
||||
- OpenFileSnapshot
|
||||
- FileOperationSummary
|
||||
1.2.17
|
||||
- bugfixed parser (wrong treatment of unknown records)
|
||||
- added FileGroupOperationSummary record
|
||||
- changed FileOperation-, OpenFileSnapshot- and FileOperationSummary- record
|
||||
NOTE: these records are still experimental
|
||||
- included file operation records into all tools
|
||||
NOTE: some parameters were added/changed
|
||||
- the byte-parameter in the FileOperation record does now contain the
|
||||
new position in the file file after the seek operation
|
||||
- bugfixed otfmerge
|
||||
|
||||
1.2.18
|
||||
- added fwrite check for writting less bytes than expected
|
||||
- re-write of otfdump. Now, it uses OTF read lib instead of plain scanf.
|
||||
It produces nicer output and numbers records in read order.
|
||||
|
||||
1.2.19
|
||||
- finished otfdump
|
||||
- removed debug output in OTF_Reader.c
|
||||
- re-introduced DefVersion record as read only
|
||||
|
||||
1.2.20
|
||||
- added own inttypes definitions in case there is no on the platform
|
||||
(necessary on NEC SX6)
|
||||
|
||||
1.2.21
|
||||
- fixed "--with-zlib-symbols"-bug
|
||||
|
||||
1.2.22
|
||||
- fixed inttypes/stdint bug
|
||||
|
||||
1.2.23
|
||||
- removed libtool from autoconf to make configure much faster,
|
||||
libtool was not used by automake anyhow
|
||||
- removed some autoconf-generated files from CVS,
|
||||
you might need to re-run 'sh bootstrap' yourself
|
||||
|
||||
1.2.24
|
||||
- minor change in otf[de|un]compress
|
||||
- strictly avoid writing of unsorted time stamps. Now, there will be an
|
||||
error message and the corresponding buffer/stream will be disabled for
|
||||
further writing. The write routines provide an invlaid return code but
|
||||
currently there is no way to "repair" the buffer/stream after an unsorted
|
||||
time stamp has been issued.
|
||||
|
||||
1.3
|
||||
- integrated libtool for shared and static linkage to otf
|
||||
- removed the possibility to include zlib symbols into otf
|
||||
- fixed warning which appeared when not using zlib
|
||||
- added python bindings to the otf library
|
||||
|
||||
1.3.1
|
||||
- if an fopen() call fails an error is now printed out every time
|
||||
- OTF_READ_ERROR was introduced as an error return value for all
|
||||
OTF_Reader_readXXX and OTF_RStream_readXXX functions. So (uint64_t)-1 is
|
||||
now a reserved value, thus cannot be used as record limit.
|
||||
The record limit always has to be smaller than or equal to
|
||||
OTF_READ_MAXRECORDS.
|
||||
- fixed issue in otfmerge, when using many streams
|
||||
|
||||
1.3.2
|
||||
- added small functions to convert various variable types to common
|
||||
counter type uint64_t. By this means, other types can be transported
|
||||
as uint64_t and re-casted during reading.
|
||||
This requires type information as additional counter property flags!
|
||||
1.3.4
|
||||
- bug fix in otfmerge: missing handling of DefCollectiveOperation
|
||||
- bugfix in the documentation: overview.eps was broken
|
||||
|
||||
1.3.3
|
||||
- fixed configure bug when searching for zlib on mac
|
||||
@ -171,46 +60,168 @@
|
||||
- fixed configure bug, when using python bindings
|
||||
- updated python bindings to support user defined counters
|
||||
|
||||
1.3.4
|
||||
- bug fix in otfmerge: missing handling of DefCollectiveOperation
|
||||
- bugfix in the documentation: overview.eps was broken
|
||||
1.3.2
|
||||
- added small functions to convert various variable types to common
|
||||
counter type uint64_t. By this means, other types can be transported
|
||||
as uint64_t and re-casted during reading.
|
||||
This requires type information as additional counter property flags!
|
||||
|
||||
1.3.5
|
||||
- added doxygen html documentation (docu/doxygen/html/index.html)
|
||||
- fixed issue, where newlines were forbidden in def, stats and snaps
|
||||
- added missing const to OTF_WStream_writeDefProcessGroup()
|
||||
1.3.1
|
||||
- if an fopen() call fails an error is now printed out every time
|
||||
- OTF_READ_ERROR was introduced as an error return value for all
|
||||
OTF_Reader_readXXX and OTF_RStream_readXXX functions. So (uint64_t)-1 is
|
||||
now a reserved value, thus cannot be used as record limit.
|
||||
The record limit always has to be smaller than or equal to
|
||||
OTF_READ_MAXRECORDS.
|
||||
- fixed issue in otfmerge, when using many streams
|
||||
|
||||
1.3.6
|
||||
- OTF_{Keywords.h,Parse.h,Platform.h} will no longer be installed
|
||||
- added a compile time assert making sure the correct sizes of the
|
||||
integer types ([u]int*_T)
|
||||
- OTF is now Windows Visual Studio compatible
|
||||
1.3
|
||||
- integrated libtool for shared and static linkage to otf
|
||||
- removed the possibility to include zlib symbols into otf
|
||||
- fixed warning which appeared when not using zlib
|
||||
- added python bindings to the otf library
|
||||
|
||||
1.3.7
|
||||
- added example for using OTF_MasterControl to the doxygen documentation
|
||||
- general improvement of the documentation
|
||||
- improved autoconf's m4 scripts for cross buildings
|
||||
1.2.24
|
||||
- minor change in otf[de|un]compress
|
||||
- strictly avoid writing of unsorted time stamps. Now, there will be an
|
||||
error message and the corresponding buffer/stream will be disabled for
|
||||
further writing. The write routines provide an invlaid return code but
|
||||
currently there is no way to "repair" the buffer/stream after an unsorted
|
||||
time stamp has been issued.
|
||||
|
||||
1.3.8
|
||||
- generate OTF_inttypes.h during configuring which provides
|
||||
the integer types like int64_t, int8_t,...
|
||||
- shared OTF library will be linked with zlib, thus additionally
|
||||
linking with zlib is not necessary
|
||||
- bugfix in otf2vtf: correctly handle function leave records with id 0
|
||||
1.2.23
|
||||
- removed libtool from autoconf to make configure much faster,
|
||||
libtool was not used by automake anyhow
|
||||
- removed some autoconf-generated files from CVS,
|
||||
you might need to re-run 'sh bootstrap' yourself
|
||||
|
||||
1.3.9
|
||||
- fixed a portability bug: use own implementation of function
|
||||
'strdup()'
|
||||
- install a symbolic link 'otfdecompress' which is a synonym for
|
||||
'otfcompress -d'
|
||||
1.2.22
|
||||
- fixed inttypes/stdint bug
|
||||
|
||||
1.3.10
|
||||
- added configure option '--[enable|disable]-binaries' to control
|
||||
building of binaries (useful for multi-lib installations)
|
||||
1.2.21
|
||||
- fixed "--with-zlib-symbols"-bug
|
||||
|
||||
1.3.11
|
||||
- build/install tool 'otfdump' by default
|
||||
- install documentation
|
||||
- bugfix: removed included system headers inside 'extern "C" {}'
|
||||
- bugfix: added configure check for functions 'fseeko()' and 'ftello()'
|
||||
(these functions are not available on NEC SX platforms)
|
||||
1.2.20
|
||||
- added own inttypes definitions in case there is no on the platform
|
||||
(necessary on NEC SX6)
|
||||
|
||||
1.2.19
|
||||
- finished otfdump
|
||||
- removed debug output in OTF_Reader.c
|
||||
- re-introduced DefVersion record as read only
|
||||
|
||||
1.2.18
|
||||
- added fwrite check for writting less bytes than expected
|
||||
- re-write of otfdump. Now, it uses OTF read lib instead of plain scanf.
|
||||
It produces nicer output and numbers records in read order.
|
||||
|
||||
1.2.17
|
||||
- bugfixed parser (wrong treatment of unknown records)
|
||||
- added FileGroupOperationSummary record
|
||||
- changed FileOperation-, OpenFileSnapshot- and FileOperationSummary- record
|
||||
NOTE: these records are still experimental
|
||||
- included file operation records into all tools
|
||||
NOTE: some parameters were added/changed
|
||||
- the byte-parameter in the FileOperation record does now contain the
|
||||
new position in the file file after the seek operation
|
||||
- bugfixed otfmerge
|
||||
|
||||
1.2.16
|
||||
- fixed a problem with comments in otfmerge
|
||||
- 2 new records introduced (NOTE: these are experimental):
|
||||
- OpenFileSnapshot
|
||||
- FileOperationSummary
|
||||
|
||||
1.2.15
|
||||
- 3 new records introduced (NOTE: these are experimental):
|
||||
- DefFile
|
||||
- DefFileGroup
|
||||
- FileOperation
|
||||
|
||||
1.2.14
|
||||
- do not linke with '-lz' if '--with-zlibsymbols' was specified
|
||||
- added zlib include line to otflib/Makefile.am
|
||||
|
||||
1.2.13
|
||||
- removed intel compiler warnings
|
||||
- changed OTF_FILETYPE_*-macros
|
||||
- fixed issues with OTF_getFilename()
|
||||
|
||||
1.2.12
|
||||
- removed intel compiler warnings in otfmerge
|
||||
- removed debug output
|
||||
- fixed 64bit issue
|
||||
|
||||
1.2.11
|
||||
- changed OTF_RETURN*( 0=success, !0 = error )
|
||||
- added these macros to all internal functions and tools for better
|
||||
consistency
|
||||
- fixed various memoryleaks in otf and otfmerge
|
||||
- added otfconfig to tools. otfconfig shows installationparameters
|
||||
important for developers
|
||||
- updated documentation
|
||||
|
||||
1.2.10
|
||||
- bugfix: otfmerge does no longer accept traces with local streams
|
||||
|
||||
1.2.9
|
||||
- changeable zlevel
|
||||
- changeable zbuffersize
|
||||
|
||||
1.2.8
|
||||
- allow suffix '.dylib' for zlib library file (from Mac OS X)
|
||||
- removed configure warning
|
||||
|
||||
1.2.7
|
||||
- added progress functions to OTF_RStream
|
||||
- added a progress counter to otfmerge
|
||||
|
||||
1.2.6
|
||||
- support shared libraries
|
||||
|
||||
1.2.5
|
||||
- bugfix: correctly handle process groups with more than 1000 entries
|
||||
|
||||
1.2.4
|
||||
- bugfix: zlib compression bug, wrong sanity check fixed
|
||||
|
||||
1.2.3
|
||||
- bugfix: provided copy handlers returned wrong value
|
||||
|
||||
1.2.2
|
||||
- important bugfix: definitionstream 0 was ignored since version 1.2
|
||||
|
||||
1.2.1
|
||||
- added progress functions using read bytes instead of timestamps
|
||||
|
||||
1.2
|
||||
- introduce transparent zlib compression
|
||||
|
||||
1.1.5
|
||||
- have UnknownRecord report handle incomplete records or additional bytes at
|
||||
the end of a file.
|
||||
|
||||
1.1.4
|
||||
- fixed a bug in OTF_Reader which might have caused the very first
|
||||
time stamp of a trace to be not properly sorted
|
||||
- introduced '--snapshots' and '--statistics' switches to do only
|
||||
snapshots or statistics. for statistics a selective mode is allowed
|
||||
which regards only some streams. By this means statistics can be created
|
||||
in parallel by calling otfaux multiple times.
|
||||
|
||||
1.1.3
|
||||
- fixed a minor bug in otfaux
|
||||
|
||||
1.1.2
|
||||
- inverted return value of call-back handlers:
|
||||
'0' is non-error, '!= 0' is regarded as an error, now!
|
||||
(this makes OTF conform with the VTF3 scheme.)
|
||||
|
||||
1.1.1
|
||||
- OTF_Reader now considers the return values of the handlers
|
||||
- added OTF_VERBOSE, OTF_DEBUG macro for error treatment
|
||||
- introduced 'UnknownRecord' handler which allows to catch
|
||||
unknown record types
|
||||
|
||||
1.0
|
||||
- initial version
|
||||
|
@ -1,12 +1,5 @@
|
||||
if AMHAVEPYTHONSWIG
|
||||
OTFLIB_PY = otflib_py
|
||||
else
|
||||
OTFLIB_PY =
|
||||
endif
|
||||
|
||||
SUBDIRS = \
|
||||
otflib \
|
||||
$(OTFLIB_PY) \
|
||||
tools \
|
||||
docu
|
||||
|
||||
|
@ -208,263 +208,3 @@ AC_DEFUN([WITH_VERBOSE],
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([SWIG_PYTHON],[
|
||||
|
||||
#
|
||||
#enable python bindings
|
||||
#
|
||||
AC_ARG_ENABLE([python-bindings],
|
||||
AC_HELP_STRING([--enable-python-bindings],
|
||||
[force generation of Python bindings]),
|
||||
[enable_python_bindings="yes"],
|
||||
[enable_python_bindings=""])
|
||||
|
||||
|
||||
#
|
||||
#with python version
|
||||
#
|
||||
AC_ARG_WITH([python-version],
|
||||
AC_HELP_STRING([--with-python-version=VERSION],
|
||||
[force a custom python version]),
|
||||
[PYTHON_VERSION=$withval])
|
||||
|
||||
|
||||
#
|
||||
#only check if the user did --enable-python-bindings
|
||||
#
|
||||
if test x"$enable_python_bindings" = xyes; then
|
||||
|
||||
#
|
||||
#test for swig >= 1.3
|
||||
#
|
||||
AC_PROG_SWIG(1.3)
|
||||
|
||||
#
|
||||
#test for python-dev
|
||||
#
|
||||
AC_PYTHON_DEVEL
|
||||
|
||||
test "x$1" != "xno" || swig_shadow=" -noproxy"
|
||||
|
||||
#
|
||||
#set the swig options
|
||||
#
|
||||
AC_SUBST([SWIG_PYTHON_OPT],[-python])
|
||||
|
||||
#
|
||||
#set the python compiler flags
|
||||
#
|
||||
AC_SUBST([SWIG_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS])
|
||||
|
||||
fi
|
||||
|
||||
])
|
||||
AC_DEFUN([AC_PYTHON_DEVEL],[
|
||||
|
||||
#
|
||||
# Allow the use of a (user set) custom python version
|
||||
#
|
||||
AC_ARG_VAR([PYTHON_VERSION],[The installed Python
|
||||
version to use, for example '2.3'. This string
|
||||
will be appended to the Python interpreter
|
||||
canonical name.])
|
||||
|
||||
AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]])
|
||||
if test -z "$PYTHON"; then
|
||||
|
||||
AC_MSG_WARN([Cannot find python$PYTHON_VERSION in your system path])
|
||||
PYTHON_VERSION=""
|
||||
|
||||
else
|
||||
|
||||
|
||||
#
|
||||
# Check for Python include path
|
||||
#
|
||||
AC_MSG_CHECKING([for python include path])
|
||||
if test -z "$PYTHON_CPPFLAGS"; then
|
||||
python_path=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc();" 2> /dev/null`
|
||||
if test -n "${python_path}"; then
|
||||
python_path="-I$python_path"
|
||||
fi
|
||||
PYTHON_CPPFLAGS=$python_path
|
||||
fi
|
||||
if test -n "$PYTHON_CPPFLAGS"; then
|
||||
AC_MSG_RESULT([$PYTHON_CPPFLAGS])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_SUBST([PYTHON_CPPFLAGS])
|
||||
|
||||
#
|
||||
# Check for Python library path
|
||||
#
|
||||
AC_MSG_CHECKING([for python library path])
|
||||
if test -z "$PYTHON_LDFLAGS"; then
|
||||
# (makes two attempts to ensure we've got a version number
|
||||
# from the interpreter)
|
||||
py_version=`$PYTHON -c "from distutils.sysconfig import *; \
|
||||
from string import join; \
|
||||
print join(get_config_vars('VERSION'))" 2> /dev/null`
|
||||
if test "$py_version" = "[None]" -o -z "$py_version"; then
|
||||
if test -n "$PYTHON_VERSION"; then
|
||||
py_version=$PYTHON_VERSION
|
||||
else
|
||||
py_version=`$PYTHON -c "import sys; \
|
||||
print sys.version[[:3]]"`
|
||||
fi
|
||||
fi
|
||||
|
||||
PYTHON_LDFLAGS=`$PYTHON -c "from distutils.sysconfig import *; \
|
||||
from string import join; \
|
||||
print '-L' + get_python_lib(0,1), \
|
||||
'-lpython';" 2> /dev/null`$py_version
|
||||
fi
|
||||
if test ! "$PYTHON_LDFLAGS" = "$py_version"; then
|
||||
AC_MSG_RESULT([$PYTHON_LDFLAGS])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_SUBST([PYTHON_LDFLAGS])
|
||||
|
||||
#
|
||||
# Check for site packages
|
||||
#
|
||||
AC_MSG_CHECKING([for python site-packages path])
|
||||
if test -z "$PYTHON_SITE_PKG"; then
|
||||
PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \
|
||||
print distutils.sysconfig.get_python_lib(0,0);" 2> /dev/null`
|
||||
fi
|
||||
if test -n "$PYTHON_SITE_PKG"; then
|
||||
AC_MSG_RESULT([$PYTHON_SITE_PKG])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_SUBST([PYTHON_SITE_PKG])
|
||||
|
||||
#
|
||||
# libraries which must be linked in when embedding
|
||||
#
|
||||
AC_MSG_CHECKING(python extra libraries)
|
||||
if test -z "$PYTHON_EXTRA_LIBS"; then
|
||||
PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \
|
||||
conf = distutils.sysconfig.get_config_var; \
|
||||
print conf('LOCALMODLIBS'), conf('LIBS')" 2> /dev/null`
|
||||
fi
|
||||
if test -n "$PYTHON_EXTRA_LIBS"; then
|
||||
AC_MSG_RESULT([$PYTHON_EXTRA_LIBS])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_SUBST(PYTHON_EXTRA_LIBS)
|
||||
|
||||
#
|
||||
# linking flags needed when embedding
|
||||
#
|
||||
AC_MSG_CHECKING(python extra linking flags)
|
||||
if test -z "$PYTHON_EXTRA_LDFLAGS"; then
|
||||
PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \
|
||||
conf = distutils.sysconfig.get_config_var; \
|
||||
print conf('LINKFORSHARED')" 2> /dev/null`
|
||||
fi
|
||||
if test -n "$PYTHON_EXTRA_LDFLAGS"; then
|
||||
AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_SUBST(PYTHON_EXTRA_LDFLAGS)
|
||||
|
||||
#
|
||||
# final check to see if everything compiles alright
|
||||
#
|
||||
AC_MSG_CHECKING([consistency of all components of python development environment])
|
||||
AC_LANG_PUSH([C])
|
||||
# save current global flags
|
||||
LIBS="$ac_save_LIBS $PYTHON_LDFLAGS"
|
||||
CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
|
||||
AC_TRY_LINK([
|
||||
#include <Python.h>
|
||||
],[
|
||||
Py_Initialize();
|
||||
],[pythonexists=yes],[pythonexists=no])
|
||||
|
||||
AC_MSG_RESULT([$pythonexists])
|
||||
|
||||
if test ! "$pythonexists" = "yes"; then
|
||||
AC_MSG_ERROR([Cannot find python development environment. You probably have to install the development version of the python package.])
|
||||
PYTHON_VERSION=""
|
||||
fi
|
||||
|
||||
AC_LANG_POP
|
||||
# turn back to default flags
|
||||
CPPFLAGS="$ac_save_CPPFLAGS"
|
||||
LIBS="$ac_save_LIBS"
|
||||
|
||||
|
||||
#get the paths where to install the package
|
||||
AC_SUBST([pkgpythondir],
|
||||
['${prefix}'/lib/python${py_version}/site-packages/otf])
|
||||
|
||||
AC_SUBST([pkgpyexecdir],
|
||||
['${exec_prefix}'/lib/python${py_version}/site-packages/otf])
|
||||
|
||||
fi
|
||||
|
||||
])
|
||||
AC_DEFUN([AC_PROG_SWIG],[
|
||||
AC_PATH_PROG([SWIG],[swig])
|
||||
if test -z "$SWIG" ; then
|
||||
|
||||
AC_MSG_ERROR([Cannot find 'swig' program.])
|
||||
|
||||
elif test -n "$1" ; then
|
||||
AC_MSG_CHECKING([for swig version])
|
||||
[swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`]
|
||||
AC_MSG_RESULT([$swig_version])
|
||||
if test -n "$swig_version" ; then
|
||||
# Calculate the required version number components
|
||||
[required=$1]
|
||||
[required_major=`echo $required | sed 's/[^0-9].*//'`]
|
||||
if test -z "$required_major" ; then
|
||||
[required_major=0]
|
||||
fi
|
||||
[required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
|
||||
[required_minor=`echo $required | sed 's/[^0-9].*//'`]
|
||||
if test -z "$required_minor" ; then
|
||||
[required_minor=0]
|
||||
fi
|
||||
[required=`echo $required | sed 's/[0-9]*[^0-9]//'`]
|
||||
[required_patch=`echo $required | sed 's/[^0-9].*//'`]
|
||||
if test -z "$required_patch" ; then
|
||||
[required_patch=0]
|
||||
fi
|
||||
# Calculate the available version number components
|
||||
[available=$swig_version]
|
||||
[available_major=`echo $available | sed 's/[^0-9].*//'`]
|
||||
if test -z "$available_major" ; then
|
||||
[available_major=0]
|
||||
fi
|
||||
[available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
|
||||
[available_minor=`echo $available | sed 's/[^0-9].*//'`]
|
||||
if test -z "$available_minor" ; then
|
||||
[available_minor=0]
|
||||
fi
|
||||
[available=`echo $available | sed 's/[0-9]*[^0-9]//'`]
|
||||
[available_patch=`echo $available | sed 's/[^0-9].*//'`]
|
||||
if test -z "$available_patch" ; then
|
||||
[available_patch=0]
|
||||
fi
|
||||
if test $available_major -ne $required_major \
|
||||
-o $available_minor -ne $required_minor \
|
||||
-o $available_patch -lt $required_patch ; then
|
||||
AC_MSG_ERROR([swig version >= $1 is required. You have $swig_version.])
|
||||
else
|
||||
swigexists=yes
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([Cannot determine swig version])
|
||||
fi
|
||||
fi
|
||||
|
||||
])
|
||||
|
||||
|
@ -3,9 +3,9 @@
|
||||
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT(OTF, 1.3.11, andreas.knuepfer@tu-dresden.de )
|
||||
AC_INIT(OTF, 1.3.12, andreas.knuepfer@tu-dresden.de )
|
||||
AC_CANONICAL_SYSTEM
|
||||
AM_INIT_AUTOMAKE(OTF, 1.3.11)
|
||||
AM_INIT_AUTOMAKE(OTF, 1.3.12)
|
||||
AC_CONFIG_SRCDIR([config.h.in])
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
@ -35,10 +35,6 @@ if test x"$force_zlib" = "xyes" -a x"$zlib_error" = "xyes"; then exit 1; fi
|
||||
AM_CONDITIONAL(AMHAVEZLIB, test x"$have_zlib" = xyes)
|
||||
AM_CONDITIONAL(AMDEPZLIB, test x"$have_zlib" = xyes -a x"$enable_shared" = xyes)
|
||||
|
||||
# Checks for swig and python-dev.
|
||||
SWIG_PYTHON
|
||||
AM_CONDITIONAL(AMHAVEPYTHONSWIG, [test "$pythonexists" = yes -a "$swigexists" = yes] )
|
||||
|
||||
WITH_DEBUG
|
||||
WITH_VERBOSE
|
||||
|
||||
@ -82,12 +78,12 @@ AC_SUBST([sizeof_long])
|
||||
AC_CONFIG_FILES([Makefile
|
||||
otflib/Makefile
|
||||
otflib/OTF_inttypes_unix.h
|
||||
otflib_py/Makefile
|
||||
tools/Makefile
|
||||
tools/otfaux/Makefile
|
||||
tools/otfcompress/Makefile
|
||||
tools/otfconfig/Makefile
|
||||
tools/otfdump/Makefile
|
||||
tools/otfinfo/Makefile
|
||||
tools/otfmerge/Makefile
|
||||
tools/otf2vtf/Makefile
|
||||
tools/vtf2otf/Makefile
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#define OTF_VERSION_MAYOR 1
|
||||
#define OTF_VERSION_MINOR 3
|
||||
#define OTF_VERSION_SUB 11
|
||||
#define OTF_VERSION_SUB 12
|
||||
#define OTF_VERSION_STRING "jellyfish"
|
||||
|
||||
/* version history:
|
||||
|
@ -1,4 +1,4 @@
|
||||
TMP1 = otfaux otfconfig otfdump otfmerge
|
||||
TMP1 = otfaux otfconfig otfdump otfinfo otfmerge
|
||||
|
||||
if AMHAVEVTF3
|
||||
TMP2 = otf2vtf vtf2otf
|
||||
|
21
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/Makefile.am
Обычный файл
21
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/Makefile.am
Обычный файл
@ -0,0 +1,21 @@
|
||||
INCLUDES = -I$(top_builddir)/otflib -I$(top_srcdir)/otflib
|
||||
|
||||
if AMBUILDBINARIES
|
||||
bin_PROGRAMS = \
|
||||
otfinfo
|
||||
endif
|
||||
|
||||
otfinfo_LDADD = $(top_builddir)/otflib/libotf.la
|
||||
if ! AMDEPZLIB
|
||||
otfinfo_LDADD += $(ZLIB_LIB_LINE)
|
||||
endif
|
||||
|
||||
otfinfo_SOURCES = \
|
||||
handler.h \
|
||||
hash.h \
|
||||
otfinfo_error.h \
|
||||
handler.c \
|
||||
hash.c \
|
||||
otfinfo.c \
|
||||
otfinfo_error.c
|
||||
|
369
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/handler.c
Обычный файл
369
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/handler.c
Обычный файл
@ -0,0 +1,369 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#include "handler.h"
|
||||
#include "otfinfo_error.h"
|
||||
|
||||
#include "otf.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAXINFOLEVEL 4
|
||||
|
||||
/* Level 1/4 handles */
|
||||
|
||||
int handleUnknownRecord( void *userData, uint64_t time, uint32_t process,
|
||||
const char *record )
|
||||
{
|
||||
otfinfo_assert(0);
|
||||
return OTF_RETURN_ABORT;
|
||||
}
|
||||
|
||||
int handleDefCreator( void *userData, uint32_t stream, const char *creator )
|
||||
{
|
||||
((definitionInfoT*)userData)->creatorName = strdup(creator);
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefVersion( void *userData, uint32_t stream, uint8_t major,
|
||||
uint8_t minor, uint8_t sub, const char *string )
|
||||
{
|
||||
definitionInfoT *info = userData;
|
||||
info->otfVersionMajor = major;
|
||||
info->otfVersionMinor = minor;
|
||||
info->otfVersionSub = sub;
|
||||
info->otfVersionString = strdup(string);
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefProcess( void *userData, uint32_t stream, uint32_t process,
|
||||
const char *name, uint32_t parent )
|
||||
{
|
||||
/* in a low info level, increment the process counter */
|
||||
if( MAXINFOLEVEL > ((definitionInfoT*)userData)->infoLevel )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterProcessDefinition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* in the max info level, get the process names */
|
||||
int index=0;
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
while(info->processNames[index])
|
||||
index++;
|
||||
(info->processNames)[index] = strdup(name);
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefTimerResolution( void *userData, uint32_t stream,
|
||||
uint64_t ticksPerSecond )
|
||||
{
|
||||
((definitionInfoT*)userData)->timerResolution = ticksPerSecond;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefinitionComment( void *userData, uint32_t stream,
|
||||
const char *comment )
|
||||
{
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
uint32_t index = (info->counterDefinitionComment)++;
|
||||
(info->definitionComments) = (char**)realloc(info->definitionComments,(index + 1) * sizeof(char**));
|
||||
(info->definitionComments)[index] = strdup(comment);
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
/* Level 2 handles */
|
||||
|
||||
int handleDefFunction( void *userData, uint32_t stream, uint32_t func,
|
||||
const char *name, uint32_t funcGroup, uint32_t source )
|
||||
{
|
||||
/*in a low info level, increment the function counter*/
|
||||
if( MAXINFOLEVEL > ((definitionInfoT*)userData)->infoLevel )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterFunctionDefinition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*in the max info level, get the function names*/
|
||||
int index = 0;
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
while(info->functionNames[index])
|
||||
index++;
|
||||
(info->functionNames)[index] = strdup(name);
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefCounter( void *userData, uint32_t stream, uint32_t counter,
|
||||
const char *name, uint32_t properties,
|
||||
uint32_t counterGroup, const char *unit )
|
||||
{
|
||||
/*in a low info level, increment the counter counter*/
|
||||
if( 3 > ((definitionInfoT*)userData)->infoLevel)
|
||||
{
|
||||
((definitionInfoT*)userData)->counterCounterDefinition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*in the max info level, get the counter names*/
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
uint64_t i = 0;
|
||||
while( ((info->counters)[i].name) && (i < info->counterCounterDefinition) )
|
||||
i++;
|
||||
(info->counters)[i].name = strdup(name);
|
||||
(info->counters)[i].id = counter;
|
||||
(info->counters)[i].properties = properties;
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefProcessGroup( void *userData, uint32_t stream, uint32_t procGroup,
|
||||
const char *name, uint32_t numberOfProcs, const uint32_t *procs )
|
||||
{
|
||||
/*in a low info level, increment the process group counter*/
|
||||
if( MAXINFOLEVEL > ((definitionInfoT*)userData)->infoLevel )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterProcessGroupDefinition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*in the max info level, get the process group names*/
|
||||
int index = 0;
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
while( info->processGroupNames[index] )
|
||||
index++;
|
||||
(info->processGroupNames)[index] = strdup(name);
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefFunctionGroup( void *userData, uint32_t stream,
|
||||
uint32_t funcGroup, const char *name)
|
||||
{
|
||||
/*in a low info level, increment the function group counter*/
|
||||
if( MAXINFOLEVEL > ((definitionInfoT*)userData)->infoLevel )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterFunctionGroupDefinition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*in the max info level, get the function group names*/
|
||||
int index = 0;
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
while(info->functionGroupNames[index])
|
||||
index++;
|
||||
(info->functionGroupNames)[index] = strdup(name);
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefCounterGroup( void *userData, uint32_t stream,
|
||||
uint32_t counterGroup, const char *name )
|
||||
{
|
||||
/*in a low info level, increment the counter group counter*/
|
||||
if( MAXINFOLEVEL > ((definitionInfoT*)userData)->infoLevel )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterCounterGroupDefinition++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*in the max info level, get the counter group names*/
|
||||
int index = 0;
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
while(info->counterGroupNames[index])
|
||||
index++;
|
||||
(info->counterGroupNames)[index] = strdup(name);
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefSclFile( void *userData, uint32_t stream, uint32_t sourceFile,
|
||||
const char *name)
|
||||
{
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
uint32_t index = (info->counterSourceFileName)++;
|
||||
(info->sourceFileNames) = (char**)realloc( info->sourceFileNames,(index + 1)
|
||||
* sizeof(char**) );
|
||||
(info->sourceFileNames)[index] = strdup(name);
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
/* Level 3 handles */
|
||||
|
||||
int handleEnter( void *userData, uint64_t time, uint32_t function,
|
||||
uint32_t process, uint32_t source )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterEnter++;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleLeave( void *userData, uint64_t time, uint32_t function,
|
||||
uint32_t process, uint32_t source )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterLeave++;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleSendMsg( void *userData, uint64_t time, uint32_t sender,
|
||||
uint32_t receiver, uint32_t group, uint32_t type,
|
||||
uint32_t length, uint32_t source )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterSend++;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleRecvMsg( void *userData, uint64_t time, uint32_t recvProc,
|
||||
uint32_t sendProc, uint32_t group, uint32_t type,
|
||||
uint32_t length, uint32_t source )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterReceive++;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefCollectiveOperation( void *userData, uint32_t stream,
|
||||
uint32_t collOp, const char *name,
|
||||
uint32_t type )
|
||||
{
|
||||
/*in a low info level, increment the collective counter*/
|
||||
((definitionInfoT*)userData)->counterCollectiveOperation++;
|
||||
if( MAXINFOLEVEL <= ((definitionInfoT*)userData)->infoLevel )
|
||||
{
|
||||
/*in the max info level, get the collective operation names*/
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
int index = ((definitionInfoT*)userData)->counterCollectiveOperation;
|
||||
(info->collectiveOperationNames) = (char**)realloc(
|
||||
info->collectiveOperationNames,
|
||||
(index) * sizeof(char**) );
|
||||
(info->collectiveOperationNames)[index-1] = strdup(name);
|
||||
}
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleFileOperation( void *userData, uint64_t time, uint32_t fileid,
|
||||
uint32_t process, uint64_t handleid,
|
||||
uint32_t operation, uint64_t bytes, uint64_t duration,
|
||||
uint32_t source )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterFileOperation++;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleEnterSnapshot( void *userData, uint64_t time, uint64_t originaltime,
|
||||
uint32_t function, uint32_t process, uint32_t source )
|
||||
{
|
||||
((definitionInfoT*)userData)->counterSnapshot++;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleCounter( void* userData, uint64_t time, uint32_t process,
|
||||
uint32_t counter, uint64_t value )
|
||||
{
|
||||
uint64_t i = 0;
|
||||
double valueDif = 0.0;
|
||||
double timeDif = 0.0;
|
||||
double rate = 0.0;
|
||||
mapInfoProcessT *currentElement = NULL;
|
||||
definitionInfoT *info = (definitionInfoT*)userData;
|
||||
|
||||
while( (info->counters[i].id != counter) &&
|
||||
(i < info->counterCounterDefinition) )
|
||||
{
|
||||
i++;
|
||||
}
|
||||
if( i >= info->counterCounterDefinition )
|
||||
return OTF_RETURN_ABORT;
|
||||
|
||||
/*for the counter type*/
|
||||
if( ((info->counters[i].properties) & OTF_COUNTER_TYPE_BITS)
|
||||
== OTF_COUNTER_TYPE_ACC )
|
||||
{
|
||||
if( (info->counters)[i].processMap == NULL )
|
||||
(info->counters)[i].processMap = hash_new();
|
||||
|
||||
/*calculate the current counter rate*/
|
||||
currentElement = hash_search( info->counters[i].processMap, process );
|
||||
|
||||
if( !currentElement )
|
||||
{
|
||||
currentElement = hash_add( info->counters[i].processMap, process );
|
||||
}
|
||||
else
|
||||
{
|
||||
valueDif = value - currentElement->lastValue;
|
||||
timeDif = time - currentElement->lastTime;
|
||||
|
||||
if( timeDif > 0 )
|
||||
{
|
||||
rate = (valueDif / timeDif) * (double)(info->timerResolution);
|
||||
}
|
||||
if( rate > currentElement->highestRate )
|
||||
currentElement->highestRate = rate;
|
||||
}
|
||||
|
||||
currentElement->lastValue = value;
|
||||
currentElement->lastTime = time;
|
||||
}
|
||||
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
uint64_t process_get_sum_time( mapInfoProcessT *set )
|
||||
{
|
||||
uint64_t sumTime = 0;
|
||||
uint32_t i;
|
||||
mapInfoProcessT *currentElement = NULL;
|
||||
for( i = 0; i < HASH_SIZE; i++ )
|
||||
{
|
||||
currentElement = &set[i];
|
||||
while( currentElement )
|
||||
{
|
||||
if( (uint32_t)-1 != currentElement->process )
|
||||
sumTime += currentElement->lastTime;
|
||||
currentElement = currentElement->next;
|
||||
}
|
||||
}
|
||||
return sumTime;
|
||||
}
|
||||
|
||||
uint64_t process_get_sum_value( mapInfoProcessT *set )
|
||||
{
|
||||
uint64_t sumValue = 0;
|
||||
uint32_t i;
|
||||
mapInfoProcessT *currentElement = NULL;
|
||||
for( i = 0; i < HASH_SIZE; i++ )
|
||||
{
|
||||
currentElement = &set[i];
|
||||
while( currentElement )
|
||||
{
|
||||
if( (uint32_t)-1 != currentElement->process )
|
||||
sumValue += currentElement->lastValue;
|
||||
currentElement = currentElement->next;
|
||||
}
|
||||
}
|
||||
return sumValue;
|
||||
}
|
||||
|
||||
double process_get_highest_rate( mapInfoProcessT *set )
|
||||
{
|
||||
double highestRate = 0;
|
||||
uint32_t i;
|
||||
mapInfoProcessT *currentElement = NULL;
|
||||
for( i = 0; i < HASH_SIZE; i++ )
|
||||
{
|
||||
currentElement = &set[i];
|
||||
while( currentElement )
|
||||
{
|
||||
if( (uint32_t)-1 != currentElement->process )
|
||||
{
|
||||
if( highestRate < currentElement->highestRate )
|
||||
highestRate = currentElement->highestRate;
|
||||
}
|
||||
currentElement = currentElement->next;
|
||||
}
|
||||
}
|
||||
return highestRate;
|
||||
}
|
138
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/handler.h
Обычный файл
138
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/handler.h
Обычный файл
@ -0,0 +1,138 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#ifndef HANDLER_H
|
||||
#define HANDLER_H
|
||||
|
||||
#include "hash.h"
|
||||
|
||||
#include "OTF_inttypes.h"
|
||||
|
||||
typedef struct counterS
|
||||
{
|
||||
char *name;
|
||||
uint32_t id;
|
||||
uint32_t properties;
|
||||
mapInfoProcessT *processMap;
|
||||
} counterT;
|
||||
|
||||
typedef struct definitionInfoS
|
||||
{
|
||||
char *filePrefix;
|
||||
char *creatorName;
|
||||
char **definitionComments;
|
||||
char **sourceFileNames;
|
||||
char **processNames;
|
||||
char **processGroupNames;
|
||||
char **functionNames;
|
||||
char **functionGroupNames;
|
||||
char **collectiveOperationNames;
|
||||
counterT *counters;
|
||||
char **counterGroupNames;
|
||||
char *otfVersionString;
|
||||
int infoLevel;
|
||||
uint8_t otfVersionMajor;
|
||||
uint8_t otfVersionMinor;
|
||||
uint8_t otfVersionSub;
|
||||
uint64_t traceFileSize;
|
||||
uint64_t counterCollectiveOperation;
|
||||
uint64_t counterDefinitionComment;
|
||||
uint64_t counterSourceFileName;
|
||||
uint64_t counterFunctionGroupDefinition;
|
||||
uint64_t counterFunctionDefinition;
|
||||
uint64_t counterProcessGroupDefinition;
|
||||
uint64_t counterProcessDefinition;
|
||||
uint64_t counterCounterDefinition;
|
||||
uint64_t counterCounterGroupDefinition;
|
||||
uint64_t counterLeave;
|
||||
uint64_t counterEnter;
|
||||
uint64_t counterSend;
|
||||
uint64_t counterReceive;
|
||||
uint64_t timerResolution;
|
||||
uint64_t counterFileOperation;
|
||||
uint64_t counterSnapshot;
|
||||
} definitionInfoT;
|
||||
|
||||
/* Level 1/4 handles */
|
||||
|
||||
int handleUnknownRecord( void *userData, uint64_t time, uint32_t process,
|
||||
const char *record );
|
||||
|
||||
int handleDefCreator( void *userData, uint32_t stream, const char *creator );
|
||||
|
||||
int handleDefVersion( void *userData, uint32_t stream, uint8_t major,
|
||||
uint8_t minor, uint8_t sub, const char *string );
|
||||
|
||||
int handleDefProcess( void *userData, uint32_t stream, uint32_t process,
|
||||
const char *name, uint32_t parent );
|
||||
|
||||
int handleDefTimerResolution( void *userData, uint32_t stream,
|
||||
uint64_t ticksPerSecond );
|
||||
|
||||
int handleDefinitionComment( void *userData, uint32_t stream,
|
||||
const char *comment );
|
||||
|
||||
/* Level 2 handles */
|
||||
|
||||
int handleDefFunction( void *userData, uint32_t stream, uint32_t func,
|
||||
const char *name, uint32_t funcGroup, uint32_t source );
|
||||
|
||||
int handleDefCounter( void *userData, uint32_t stream, uint32_t counter,
|
||||
const char *name, uint32_t properties,
|
||||
uint32_t counterGroup, const char *unit );
|
||||
|
||||
int handleDefProcessGroup( void *userData, uint32_t stream, uint32_t procGroup,
|
||||
const char *name, uint32_t numberOfProcs,
|
||||
const uint32_t *procs );
|
||||
|
||||
int handleDefFunctionGroup( void *userData, uint32_t stream,
|
||||
uint32_t funcGroup, const char *name );
|
||||
|
||||
int handleDefCounterGroup( void *userData, uint32_t stream,
|
||||
uint32_t counterGroup, const char *name );
|
||||
|
||||
int handleDefSclFile( void *userData, uint32_t stream, uint32_t sourceFile,
|
||||
const char *name );
|
||||
|
||||
/* Level 3 handles */
|
||||
|
||||
int handleEnter( void *userData, uint64_t time, uint32_t function,
|
||||
uint32_t process, uint32_t source );
|
||||
|
||||
int handleLeave( void *userData, uint64_t time, uint32_t function,
|
||||
uint32_t process, uint32_t source );
|
||||
|
||||
int handleSendMsg( void *userData, uint64_t time, uint32_t sender,
|
||||
uint32_t receiver, uint32_t group, uint32_t type,
|
||||
uint32_t length, uint32_t source );
|
||||
|
||||
int handleRecvMsg( void *userData, uint64_t time, uint32_t recvProc,
|
||||
uint32_t sendProc, uint32_t group, uint32_t type,
|
||||
uint32_t length, uint32_t source );
|
||||
|
||||
int handleDefCollectiveOperation( void *userData, uint32_t stream,
|
||||
uint32_t collOp, const char *name,
|
||||
uint32_t type );
|
||||
|
||||
int handleFileOperation( void *userData, uint64_t time, uint32_t fileid,
|
||||
uint32_t process, uint64_t handleid,
|
||||
uint32_t operation, uint64_t bytes, uint64_t duration,
|
||||
uint32_t source );
|
||||
|
||||
int handleEnterSnapshot( void *userData, uint64_t time, uint64_t originaltime,
|
||||
uint32_t function, uint32_t process,
|
||||
uint32_t source );
|
||||
|
||||
int handleCounter( void* userData, uint64_t time, uint32_t process,
|
||||
uint32_t counter, uint64_t value );
|
||||
|
||||
|
||||
uint64_t process_get_sum_time( mapInfoProcessT *set );
|
||||
|
||||
uint64_t process_get_sum_value( mapInfoProcessT *set );
|
||||
|
||||
double process_get_highest_rate(mapInfoProcessT *set );
|
||||
|
||||
#endif /* HANDLER_H */
|
96
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/hash.c
Обычный файл
96
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/hash.c
Обычный файл
@ -0,0 +1,96 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#include "hash.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
static mapInfoProcessT *add_inner( mapInfoProcessT **current, uint32_t process )
|
||||
{
|
||||
if( NULL != *current )
|
||||
{
|
||||
return add_inner( &((mapInfoProcessT*)(*current))->next, process );
|
||||
}
|
||||
else
|
||||
{
|
||||
*current = (mapInfoProcessT*)calloc( 1, sizeof(mapInfoProcessT) );
|
||||
(*current)->process = process;
|
||||
return *current;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static mapInfoProcessT *search_inner( mapInfoProcessT *current, uint32_t process )
|
||||
{
|
||||
if( current )
|
||||
{
|
||||
if( current->process == process )
|
||||
return current;
|
||||
return search_inner( current->next, process );
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mapInfoProcessT *hash_new( )
|
||||
{
|
||||
mapInfoProcessT *ret;
|
||||
|
||||
ret = (mapInfoProcessT*)calloc( HASH_SIZE, sizeof(mapInfoProcessT) );
|
||||
ret->process = (uint32_t)-1;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
mapInfoProcessT *hash_add( mapInfoProcessT *hash, uint32_t process)
|
||||
{
|
||||
uint32_t hashkey = process;
|
||||
|
||||
HASH_GET_KEY( hashkey );
|
||||
|
||||
if( hash[hashkey].process == (uint32_t)-1 )
|
||||
{
|
||||
hash[hashkey].process = process;
|
||||
return &(hash[hashkey]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return add_inner( &(hash[hashkey].next), process );
|
||||
}
|
||||
}
|
||||
|
||||
mapInfoProcessT *hash_search( mapInfoProcessT *hash, uint32_t process)
|
||||
{
|
||||
uint32_t hashkey = process;
|
||||
|
||||
HASH_GET_KEY( hashkey );
|
||||
|
||||
if( hash[hashkey].process == process )
|
||||
{
|
||||
return &(hash[hashkey]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return search_inner( hash[hashkey].next, process );
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void hash_delete( mapInfoProcessT *hash )
|
||||
{
|
||||
int i;
|
||||
|
||||
for( i = 0; i < HASH_SIZE; i++ )
|
||||
{
|
||||
mapInfoProcessT *currentElement = hash[i].next;
|
||||
while( NULL != currentElement )
|
||||
{
|
||||
mapInfoProcessT *tmpElement = currentElement;
|
||||
currentElement = currentElement->next;
|
||||
free( tmpElement );
|
||||
}
|
||||
}
|
||||
|
||||
free( hash );
|
||||
}
|
45
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/hash.h
Обычный файл
45
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/hash.h
Обычный файл
@ -0,0 +1,45 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#ifndef HASH_H
|
||||
#define HASH_H
|
||||
|
||||
#include "OTF_inttypes.h"
|
||||
|
||||
/* 0x1000 = 4096 */
|
||||
#define HASH_SIZE 0X1000
|
||||
#define HASH_GET_KEY(key) \
|
||||
{ \
|
||||
key += ~(key << 15); \
|
||||
key ^= (key >> 10); \
|
||||
key += (key << 3); \
|
||||
key ^= (key >> 6); \
|
||||
key += ~(key << 11); \
|
||||
key ^= (key >> 16); \
|
||||
key &= HASH_SIZE - 1; \
|
||||
}
|
||||
|
||||
typedef struct mapInfoProcessS
|
||||
{
|
||||
uint32_t process;
|
||||
uint64_t lastValue;
|
||||
uint64_t lastTime;
|
||||
double highestRate;
|
||||
struct mapInfoProcessS *next;
|
||||
} mapInfoProcessT;
|
||||
|
||||
/* initialize the hash */
|
||||
mapInfoProcessT* hash_new( void );
|
||||
|
||||
/* add an entry to the hash */
|
||||
mapInfoProcessT* hash_add( mapInfoProcessT *hash, uint32_t process );
|
||||
|
||||
/* search an entry in the hash */
|
||||
mapInfoProcessT* hash_search( mapInfoProcessT *hash, uint32_t process );
|
||||
|
||||
/* free all mem of the hash */
|
||||
void hash_delete( mapInfoProcessT *hash );
|
||||
|
||||
#endif /* HASH_H */
|
800
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo.c
Обычный файл
800
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo.c
Обычный файл
@ -0,0 +1,800 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#include "handler.h"
|
||||
#include "otfinfo_error.h"
|
||||
|
||||
#include "otf.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define PROGRESSBARLEN 20
|
||||
|
||||
static void set_handles_level_1( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info );
|
||||
static void set_handles_level_2( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info );
|
||||
static void set_handles_level_3( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info );
|
||||
static void set_handles_level_4( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info );
|
||||
|
||||
static void show_info_level_1( definitionInfoT info );
|
||||
static void show_info_level_2( definitionInfoT info );
|
||||
static void show_info_level_3( definitionInfoT info );
|
||||
static void show_info_level_4( definitionInfoT info );
|
||||
|
||||
static void free_data_level_1( definitionInfoT info );
|
||||
static void free_data_level_2( definitionInfoT info );
|
||||
static void free_data_level_3( definitionInfoT info );
|
||||
static void free_data_level_4( definitionInfoT info );
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
definitionInfoT info; /*structur where the trace information are stored*/
|
||||
int i = 0;
|
||||
uint32_t numFileHandles = 1; /*number of filehandles */
|
||||
uint64_t checkVal = 0; /*value used for asserts*/
|
||||
uint64_t size = 0; /*size of the event files*/
|
||||
uint64_t minRead = 0; /*variable for progress*/
|
||||
uint64_t currRead = 0; /*count of current read bytes*/
|
||||
char* parameter = NULL; /*reference to the parameters*/
|
||||
char* fileLocation = NULL; /*path to the tracefiles*/
|
||||
OTF_FileManager *manager = NULL;
|
||||
OTF_Reader *reader = NULL;
|
||||
OTF_HandlerArray *handles = NULL;
|
||||
int showProgress = 0;
|
||||
int infoLevel = 1; /*level for the output of information (local)*/
|
||||
|
||||
static const char* Helptext[] = {
|
||||
" \n",
|
||||
" otfinfo - program to get basic information of a trace. \n",
|
||||
" \n",
|
||||
" otfinfo [Options] <input file name> \n",
|
||||
" \n",
|
||||
" options: \n",
|
||||
" -h, --help show this help message \n",
|
||||
" -V show OTF version \n",
|
||||
" -f <n> set max number of filehandles available \n",
|
||||
" -l <ilevel> set the information level for the output \n",
|
||||
" (0 - 4) the default level is 1 \n",
|
||||
" -a set the information level to 4 \n",
|
||||
" -p show progress bar for reading event files \n",
|
||||
" \n",
|
||||
" \n", NULL };
|
||||
|
||||
info.infoLevel = 1; /*level of information for the handles*/
|
||||
|
||||
/*if no parameter was given printing the helptext*/
|
||||
if( 1 >= argc )
|
||||
{
|
||||
int l = 0;
|
||||
while( Helptext[l] )
|
||||
{
|
||||
printf( "%s",Helptext[l++] );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*checking for additional parameters*/
|
||||
for( i = 1 ; i < argc; i++ )
|
||||
{
|
||||
parameter = argv[i];
|
||||
if( (strcmp(parameter,"-f") == 0) && (i+1 < argc) )
|
||||
{
|
||||
i++;
|
||||
numFileHandles = atoi(argv[i]);
|
||||
}
|
||||
else if( (strcmp(parameter,"-l") == 0) && (i+1 < argc) )
|
||||
{
|
||||
i++;
|
||||
infoLevel = atoi(argv[i]);
|
||||
}
|
||||
else if( strcmp(parameter,"-a") == 0 )
|
||||
{
|
||||
infoLevel = 4;
|
||||
}
|
||||
else if( strcmp(parameter,"-p") == 0 )
|
||||
{
|
||||
showProgress = 1;
|
||||
}
|
||||
else if( strcmp(parameter,"-V") == 0 )
|
||||
{
|
||||
printf( "%u.%u.%u \"%s\"\n", OTF_VERSION_MAYOR, OTF_VERSION_MINOR,
|
||||
OTF_VERSION_SUB, OTF_VERSION_STRING );
|
||||
return 0;
|
||||
}
|
||||
else if( (strcmp(parameter,"-h") == 0) ||
|
||||
(strcmp(parameter,"--help") == 0) )
|
||||
{
|
||||
int l=0;
|
||||
while(Helptext[l])
|
||||
{
|
||||
printf( "%s",Helptext[l++] );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else if( '-' != parameter[0] )
|
||||
{
|
||||
char* p;
|
||||
fileLocation = parameter;
|
||||
p = strrchr( parameter, '.' );
|
||||
if( p && strlen(p) >= 4 && strcmp(p, ".otf") == 0 )
|
||||
*p = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"ERROR: Unknown option: '%s'\n",argv[i]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
if( numFileHandles < 1 )
|
||||
{
|
||||
fprintf( stderr, "ERROR: less than 1 filehandle is not permitted\n" );
|
||||
exit(1);
|
||||
}
|
||||
if( NULL == fileLocation )
|
||||
{
|
||||
fprintf( stderr, "ERROR: no trace file was specified\n" );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
info.filePrefix = OTF_getFilename( fileLocation, 0, OTF_FILETYPE_MASTER,
|
||||
0, NULL );
|
||||
|
||||
/*preparing the reader*/
|
||||
manager = OTF_FileManager_open( numFileHandles );
|
||||
otfinfo_assert( manager );
|
||||
reader = OTF_Reader_open( fileLocation, manager );
|
||||
otfinfo_assert( reader );
|
||||
handles = OTF_HandlerArray_open();
|
||||
otfinfo_assert( handles );
|
||||
if( 0 < infoLevel )
|
||||
{
|
||||
info.infoLevel = 1;
|
||||
set_handles_level_1( handles, &info );
|
||||
if( 1 < infoLevel )
|
||||
{
|
||||
info.infoLevel = 2;
|
||||
set_handles_level_2( handles,&info );
|
||||
}
|
||||
}
|
||||
|
||||
/*read definition file*/
|
||||
checkVal = OTF_Reader_readDefinitions( reader, handles );
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR );
|
||||
|
||||
/*getting the size of the event files*/
|
||||
OTF_Reader_setRecordLimit( reader, 0 );
|
||||
checkVal = OTF_Reader_readEvents( reader, handles );
|
||||
otfinfo_assert(checkVal != OTF_READ_ERROR);
|
||||
checkVal = OTF_Reader_eventBytesProgress( reader, &minRead,
|
||||
&currRead, &size);
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR );
|
||||
info.traceFileSize = size;
|
||||
|
||||
/*printing the results and cleanup*/
|
||||
if( 0 < infoLevel )
|
||||
{
|
||||
show_info_level_1( info );
|
||||
free_data_level_1( info );
|
||||
if( 1 < infoLevel )
|
||||
{
|
||||
show_info_level_2( info );
|
||||
free_data_level_2( info );
|
||||
}
|
||||
}
|
||||
checkVal = OTF_HandlerArray_close( handles );
|
||||
otfinfo_assert( checkVal );
|
||||
checkVal = OTF_Reader_close( reader );
|
||||
otfinfo_assert( checkVal );
|
||||
OTF_FileManager_close( manager );
|
||||
|
||||
/*if the info level is higher than two, we have to read again the files*/
|
||||
if( 2 < infoLevel )
|
||||
{
|
||||
/*prepare for reading*/
|
||||
manager = OTF_FileManager_open( numFileHandles );
|
||||
otfinfo_assert( manager );
|
||||
reader = OTF_Reader_open( fileLocation, manager );
|
||||
otfinfo_assert( reader );
|
||||
handles = OTF_HandlerArray_open();
|
||||
otfinfo_assert( handles );
|
||||
|
||||
info.infoLevel = 3;
|
||||
set_handles_level_3( handles, &info );
|
||||
if( 3 < infoLevel )
|
||||
{
|
||||
info.infoLevel = 4;
|
||||
set_handles_level_4( handles, &info );
|
||||
}
|
||||
|
||||
/*read definitions*/
|
||||
checkVal = OTF_Reader_readDefinitions( reader, handles );
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR );
|
||||
|
||||
if( 1 == showProgress )
|
||||
{
|
||||
/*printing a kind of progress bar*/
|
||||
OTF_Reader_setRecordLimit( reader, 10000 );
|
||||
size = 1;
|
||||
currRead = 0;
|
||||
printf( "\n\n" );
|
||||
printf( "reading events:\n" );
|
||||
for( i = 0; i < PROGRESSBARLEN + 3; i++ )
|
||||
printf( " " );
|
||||
printf( "|100%%\r" );
|
||||
printf( "0%%|" ); fflush( stdout );
|
||||
i = 0;
|
||||
while( (checkVal = OTF_Reader_readEvents( reader, handles )) == 10000 )
|
||||
{
|
||||
int current;
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR )
|
||||
OTF_Reader_eventBytesProgress( reader, &minRead, &currRead, &size );
|
||||
current = ( PROGRESSBARLEN * currRead ) / size;
|
||||
for( ; i < current; i++ )
|
||||
printf( "#" ); fflush( stdout );
|
||||
}
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR )
|
||||
for( ; i < PROGRESSBARLEN; i++ )
|
||||
printf( "#" );
|
||||
printf( "\n\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
checkVal = OTF_Reader_readEvents( reader, handles );
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR );
|
||||
}
|
||||
/*printing the results and cleanup*/
|
||||
show_info_level_3( info );
|
||||
free_data_level_3( info );
|
||||
if( 3 < infoLevel )
|
||||
{
|
||||
show_info_level_4( info );
|
||||
free_data_level_4( info );
|
||||
}
|
||||
checkVal = OTF_HandlerArray_close( handles );
|
||||
otfinfo_assert( checkVal );
|
||||
checkVal = OTF_Reader_close( reader );
|
||||
otfinfo_assert( checkVal );
|
||||
OTF_FileManager_close( manager );
|
||||
}
|
||||
|
||||
free( info.filePrefix );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_handles_level_1( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info )
|
||||
{
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleUnknownRecord,
|
||||
OTF_UNKNOWN_RECORD );
|
||||
|
||||
/*handler and inits for getting the creator name*/
|
||||
info->creatorName = NULL;
|
||||
OTF_HandlerArray_setHandler( handles, (OTF_FunctionPointer*)handleDefCreator,
|
||||
OTF_DEFCREATOR_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCREATOR_RECORD );
|
||||
|
||||
/*handler and inits for getting the otf version*/
|
||||
info->otfVersionString = NULL;
|
||||
info->otfVersionMajor = 0;
|
||||
info->otfVersionMinor = 0;
|
||||
info->otfVersionSub = 0;
|
||||
OTF_HandlerArray_setHandler( handles, (OTF_FunctionPointer*)handleDefVersion,
|
||||
OTF_DEFVERSION_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFVERSION_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of process definitions*/
|
||||
info->counterProcessDefinition = 0;
|
||||
OTF_HandlerArray_setHandler( handles, (OTF_FunctionPointer*)handleDefProcess,
|
||||
OTF_DEFPROCESS_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFPROCESS_RECORD );
|
||||
|
||||
/*handler and inits for getting the timer resolution*/
|
||||
info->timerResolution = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefTimerResolution,
|
||||
OTF_DEFTIMERRESOLUTION_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFTIMERRESOLUTION_RECORD );
|
||||
|
||||
/*handler and inits for getting comments*/
|
||||
info->definitionComments = NULL;
|
||||
info->counterDefinitionComment = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefinitionComment,
|
||||
OTF_DEFINITIONCOMMENT_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFINITIONCOMMENT_RECORD );
|
||||
}
|
||||
|
||||
static void show_info_level_1( definitionInfoT info )
|
||||
{
|
||||
uint32_t i = 0, index = 0;
|
||||
double resolution = info.timerResolution;
|
||||
double fileSize = info.traceFileSize;
|
||||
char* unitTimer;
|
||||
char* unitFileSize;
|
||||
|
||||
/*formating the timerresolution*/
|
||||
while( (resolution / 1000 >= 1.0) && (i < 4) )
|
||||
{
|
||||
resolution /= 1000;
|
||||
i++;
|
||||
}
|
||||
switch( i )
|
||||
{
|
||||
case 0: unitTimer = "s";break;
|
||||
case 1: unitTimer = "ms";break;
|
||||
case 2: unitTimer = "µs";break;
|
||||
default: unitTimer = "ns";break;
|
||||
}
|
||||
|
||||
/*formating the size of the event files*/
|
||||
i = 0;
|
||||
while( (fileSize / 1024 >= 1.0) && (i < 4) )
|
||||
{
|
||||
fileSize /= 1024;
|
||||
i++;
|
||||
}
|
||||
switch( i )
|
||||
{
|
||||
case 0: unitFileSize = "Bytes"; break;
|
||||
case 1: unitFileSize = "KB"; break;
|
||||
case 2: unitFileSize = "MB"; break;
|
||||
default: unitFileSize = "TB";break;
|
||||
}
|
||||
|
||||
printf( "\n##############" );
|
||||
printf( "\n#info level 1#" );
|
||||
printf( "\n##############\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| general information \n" );
|
||||
printf( "+----------------------+--------------------------------------------------------\n" );
|
||||
printf( "| tracefile name | %s\n", info.filePrefix );
|
||||
printf( "| creator of the trace | %s\n", info.creatorName );
|
||||
printf( "| used OTF version | %i.%i.%i %s\n", info.otfVersionMajor,
|
||||
info.otfVersionMinor, info.otfVersionSub, info.otfVersionString );
|
||||
printf( "| event files size | %.2f %s\n", fileSize,unitFileSize );
|
||||
printf( "| process definitions | %llu\n",
|
||||
(unsigned long long)info.counterProcessDefinition );
|
||||
printf( "| timer resolution | %.2f %s\n",resolution,unitTimer );
|
||||
printf( "+----------------------+--------------------------------------------------------\n" );
|
||||
index = info.counterDefinitionComment;
|
||||
printf( "| definition comments\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < index; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.definitionComments[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_1( definitionInfoT info )
|
||||
{
|
||||
uint32_t i, index;
|
||||
free( info.creatorName );
|
||||
|
||||
index = info.counterDefinitionComment;
|
||||
for( i = 0; i < index; i++ )
|
||||
{
|
||||
free( info.definitionComments[i] );
|
||||
}
|
||||
free( info.definitionComments );
|
||||
free( info.otfVersionString );
|
||||
}
|
||||
|
||||
static void set_handles_level_2( OTF_HandlerArray *handles, definitionInfoT *info )
|
||||
{
|
||||
/*handler and inits for getting the count of function definitions*/
|
||||
info->counterFunctionDefinition = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefFunction,
|
||||
OTF_DEFFUNCTION_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFFUNCTION_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of counter definitions*/
|
||||
info->counterCounterDefinition = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefCounter,
|
||||
OTF_DEFCOUNTER_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCOUNTER_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of process group definitions*/
|
||||
info->counterProcessGroupDefinition = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefProcessGroup,
|
||||
OTF_DEFPROCESSGROUP_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFPROCESSGROUP_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of function group definitions*/
|
||||
info->counterFunctionGroupDefinition = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefFunctionGroup,
|
||||
OTF_DEFFUNCTIONGROUP_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFFUNCTIONGROUP_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of counter group definitions*/
|
||||
info->counterCounterGroupDefinition = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefCounterGroup,
|
||||
OTF_DEFCOUNTERGROUP_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCOUNTERGROUP_RECORD );
|
||||
|
||||
/*handler and inits for getting the source files*/
|
||||
info->sourceFileNames = NULL;
|
||||
info->counterSourceFileName = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefSclFile,
|
||||
OTF_DEFSCLFILE_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFSCLFILE_RECORD );
|
||||
}
|
||||
|
||||
static void show_info_level_2( definitionInfoT info )
|
||||
{
|
||||
int index,i;
|
||||
|
||||
printf( "\n##############" );
|
||||
printf( "\n#info level 2#" );
|
||||
printf( "\n##############\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| trace content\n" );
|
||||
printf( "+----------------------------+--------------------------------------------------\n" );
|
||||
printf( "| function definitions | %llu\n",
|
||||
(unsigned long long)info.counterFunctionDefinition );
|
||||
printf( "| counter definitions | %llu\n",
|
||||
(unsigned long long)info.counterCounterDefinition );
|
||||
printf( "| |\n" );
|
||||
printf( "| process group definitions | %llu\n",
|
||||
(unsigned long long)info.counterProcessGroupDefinition );
|
||||
printf( "| function group definitions | %llu\n",
|
||||
(unsigned long long)info.counterFunctionGroupDefinition );
|
||||
printf( "| counter group definitions | %llu\n",
|
||||
(unsigned long long)info.counterCounterGroupDefinition );
|
||||
printf( "+----------------------------+--------------------------------------------------\n" );
|
||||
|
||||
index = info.counterSourceFileName;
|
||||
printf( "| source file names\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < index; i++)
|
||||
{
|
||||
printf( "| %s\n", info.sourceFileNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_2( definitionInfoT info )
|
||||
{
|
||||
int i, index;
|
||||
|
||||
index = info.counterSourceFileName;
|
||||
|
||||
for( i = 0; i < index; i++ )
|
||||
{
|
||||
free( (info.sourceFileNames)[i] );
|
||||
}
|
||||
free( info.sourceFileNames );
|
||||
}
|
||||
|
||||
static void set_handles_level_3( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info )
|
||||
{
|
||||
uint64_t i = 0;
|
||||
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleUnknownRecord,
|
||||
OTF_UNKNOWN_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of enters*/
|
||||
info->counterEnter = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleEnter,
|
||||
OTF_ENTER_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_ENTER_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of leaves*/
|
||||
info->counterLeave = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleLeave,
|
||||
OTF_LEAVE_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_LEAVE_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of sends*/
|
||||
info->counterSend = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleSendMsg,
|
||||
OTF_SEND_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_SEND_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of receives*/
|
||||
info->counterReceive = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleRecvMsg,
|
||||
OTF_RECEIVE_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_RECEIVE_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of collective operations*/
|
||||
info->counterCollectiveOperation = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefCollectiveOperation,
|
||||
OTF_DEFCOLLOP_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCOLLOP_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of file operations*/
|
||||
info->counterFileOperation = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleFileOperation,
|
||||
OTF_FILEOPERATION_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_FILEOPERATION_RECORD );
|
||||
|
||||
/*handler and inits for getting the count of snapshots*/
|
||||
info->counterSnapshot = 0;
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleEnterSnapshot,
|
||||
OTF_ENTERSNAPSHOT_RECORD );
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_ENTERSNAPSHOT_RECORD );
|
||||
|
||||
(info->counters) = (counterT*)malloc( info->counterCounterDefinition *
|
||||
sizeof(counterT) );
|
||||
for( i = 0; i < info->counterCounterDefinition; i++ )
|
||||
{
|
||||
(info->counters)[i].name = NULL;
|
||||
(info->counters)[i].id = 0;
|
||||
(info->counters)[i].properties = 3;
|
||||
(info->counters)[i].processMap = NULL;
|
||||
}
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefCounter,
|
||||
OTF_DEFCOUNTER_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCOUNTER_RECORD );
|
||||
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleCounter,
|
||||
OTF_COUNTER_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_COUNTER_RECORD );
|
||||
|
||||
}
|
||||
|
||||
static void show_info_level_3( definitionInfoT info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
printf( "\n##############" );
|
||||
printf( "\n#info level 3#" );
|
||||
printf( "\n##############\n" );
|
||||
printf( "+-----------------------+-------------------------------------------------------\n" );
|
||||
printf( "| enters | %llu\n",
|
||||
(unsigned long long)info.counterEnter );
|
||||
printf( "| leaves | %llu\n",
|
||||
(unsigned long long)info.counterLeave );
|
||||
printf( "| sends | %llu\n",
|
||||
(unsigned long long)info.counterSend );
|
||||
printf( "| receives | %llu\n",
|
||||
(unsigned long long)info.counterReceive );
|
||||
printf( "| collective operations | %llu\n",
|
||||
(unsigned long long)info.counterCollectiveOperation );
|
||||
printf( "| file operations | %llu\n",
|
||||
(unsigned long long)info.counterFileOperation );
|
||||
printf( "| snapshots | %llu\n",
|
||||
(unsigned long long)info.counterSnapshot );
|
||||
printf( "+-----------------------+-------------------------------------------------------\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| counters[%llu]\n",
|
||||
(unsigned long long)info.counterCounterDefinition );
|
||||
printf( "+---------------+---------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterCounterDefinition; i++ )
|
||||
{
|
||||
printf( "| name | %s\n", info.counters[i].name );
|
||||
if( ((info.counters[i].properties) & OTF_COUNTER_TYPE_BITS) ==
|
||||
OTF_COUNTER_TYPE_ACC )
|
||||
{
|
||||
uint64_t lastValue =
|
||||
process_get_sum_value( info.counters[i].processMap );
|
||||
uint64_t lastTime =
|
||||
process_get_sum_time( info.counters[i].processMap );
|
||||
double average =
|
||||
((double)(lastValue)) * ((double)(info.timerResolution)) /
|
||||
((double)(lastTime));
|
||||
double highestRate =
|
||||
process_get_highest_rate(info.counters[i].processMap);
|
||||
|
||||
printf( "| last value | %llu\n", (unsigned long long)lastValue );
|
||||
printf( "| average rate | %7.4E per sec\n", average );
|
||||
printf( "| highest rate | %7.4E per sec\n", highestRate );
|
||||
}
|
||||
printf( "| |\n" );
|
||||
}
|
||||
printf( "+---------------+---------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_3( definitionInfoT info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
for( i = 0; i < info.counterCounterDefinition; i++ )
|
||||
{
|
||||
free( (info.counters)[i].name );
|
||||
if( NULL != (info.counters)[i].processMap )
|
||||
hash_delete( (info.counters)[i].processMap );
|
||||
}
|
||||
free( info.counters );
|
||||
}
|
||||
|
||||
static void set_handles_level_4( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info )
|
||||
{
|
||||
/*handler and inits for getting the names of processes*/
|
||||
info->processNames = NULL;
|
||||
info->processNames = (char**)calloc( info->counterProcessDefinition,
|
||||
sizeof(char*) );
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefProcess,
|
||||
OTF_DEFPROCESS_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFPROCESS_RECORD );
|
||||
|
||||
/*handler and inits for getting the names of functions*/
|
||||
info->functionNames = NULL;
|
||||
info->functionNames = (char**)calloc( info->counterFunctionDefinition,
|
||||
sizeof(char*) );
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefFunction,
|
||||
OTF_DEFFUNCTION_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFFUNCTION_RECORD );
|
||||
|
||||
/*handler and inits for getting the names of processe groups*/
|
||||
info->processGroupNames = NULL;
|
||||
info->processGroupNames = (char**)calloc( info->counterProcessGroupDefinition,
|
||||
sizeof(char*) );
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefProcessGroup,
|
||||
OTF_DEFPROCESSGROUP_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFPROCESSGROUP_RECORD );
|
||||
|
||||
info->collectiveOperationNames = NULL;
|
||||
|
||||
/*handler and inits for getting the names of function groups*/
|
||||
info->functionGroupNames = NULL;
|
||||
info->functionGroupNames = (char**)calloc( info->counterFunctionGroupDefinition,
|
||||
sizeof(char*) );
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefFunctionGroup,
|
||||
OTF_DEFFUNCTIONGROUP_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFFUNCTIONGROUP_RECORD );
|
||||
|
||||
/*handler and inits for getting the names of counter groupss*/
|
||||
info->counterGroupNames = NULL;
|
||||
info->counterGroupNames = (char**)calloc( info->counterCounterGroupDefinition,
|
||||
sizeof(char*) );
|
||||
OTF_HandlerArray_setHandler( handles,
|
||||
(OTF_FunctionPointer*)handleDefCounterGroup,
|
||||
OTF_DEFCOUNTERGROUP_RECORD);
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCOUNTERGROUP_RECORD );
|
||||
}
|
||||
|
||||
static void show_info_level_4( definitionInfoT info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
printf( "\n##############" );
|
||||
printf( "\n#info level 4#" );
|
||||
printf( "\n##############\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| process definitions[%llu]\n",
|
||||
(unsigned long long)info.counterProcessDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterProcessDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.processNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| function definitions[%llu]\n",
|
||||
(unsigned long long)info.counterFunctionDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for(i = 0; i < info.counterFunctionDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n",info.functionNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| collective operation definitions[%llu]\n",
|
||||
(unsigned long long)info.counterCollectiveOperation );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterCollectiveOperation; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.collectiveOperationNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| process group definitions[%llu]\n",
|
||||
(unsigned long long)info.counterProcessGroupDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterProcessGroupDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.processGroupNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| function group definitions[%llu]\n",
|
||||
(unsigned long long)info.counterFunctionGroupDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterFunctionGroupDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.functionGroupNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| counter group definitions[%llu]\n",
|
||||
(unsigned long long)info.counterCounterGroupDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterCounterGroupDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.counterGroupNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_4( definitionInfoT info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
if( info.processNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterProcessDefinition; i++ )
|
||||
{
|
||||
free( (info.processNames)[i] );
|
||||
}
|
||||
free( info.processNames );
|
||||
}
|
||||
|
||||
if( info.processGroupNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterProcessGroupDefinition; i++ )
|
||||
{
|
||||
free( (info.processGroupNames)[i] );
|
||||
}
|
||||
free( info.processGroupNames );
|
||||
}
|
||||
|
||||
if( info.functionNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterFunctionDefinition; i++ )
|
||||
{
|
||||
free( (info.functionNames)[i] );
|
||||
}
|
||||
free( info.functionNames );
|
||||
}
|
||||
|
||||
if( info.functionGroupNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterFunctionGroupDefinition; i++ )
|
||||
{
|
||||
free( (info.functionGroupNames)[i] );
|
||||
}
|
||||
free( info.functionGroupNames );
|
||||
}
|
||||
|
||||
for(i = 0; i < info.counterCollectiveOperation; i++ )
|
||||
{
|
||||
free( (info.collectiveOperationNames)[i] );
|
||||
}
|
||||
free( info.collectiveOperationNames );
|
||||
|
||||
for(i = 0; i < info.counterCounterGroupDefinition; i++ )
|
||||
{
|
||||
free( (info.counterGroupNames)[i] );
|
||||
}
|
||||
free( info.counterGroupNames );
|
||||
}
|
15
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo_error.c
Обычный файл
15
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo_error.c
Обычный файл
@ -0,0 +1,15 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#include "otfinfo_error.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void otfinfo_assert_impl(const char* file, int line, const char* expr)
|
||||
{
|
||||
fprintf(stderr, "FATAL: %s:%d: Assertion `%s' failed\n",file, line, expr);
|
||||
exit(1);
|
||||
}
|
12
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo_error.h
Обычный файл
12
ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo_error.h
Обычный файл
@ -0,0 +1,12 @@
|
||||
/*
|
||||
This is part of the OTF library. Copyright by ZIH, TU Dresden 2005-2009.
|
||||
Authors: Michael Heyde
|
||||
*/
|
||||
|
||||
#ifndef OTFINFO_ERROR_H
|
||||
#define OTFINFO_ERROR_H
|
||||
|
||||
#define otfinfo_assert(expr) if(!(expr)) otfinfo_assert_impl(__FILE__, __LINE__, #expr);
|
||||
void otfinfo_assert_impl(const char* f, int l, const char* expr);
|
||||
|
||||
#endif /* OTFINFO_ERROR_H */
|
Загрузка…
Ссылка в новой задаче
Block a user