diff options
408 files changed, 19636 insertions, 3799 deletions
diff --git a/HOWTO/INSTALL.md b/HOWTO/INSTALL.md index 8051bc4393..fa1b9d2e89 100644 --- a/HOWTO/INSTALL.md +++ b/HOWTO/INSTALL.md @@ -288,6 +288,14 @@ Some of the available `configure` options are: implementation available, you typically want to try using the `libatomic_ops` library. It can be downloaded from <http://www.hpl.hp.com/research/linux/atomic_ops/>. +* `--disable-smp-require-native-atomics` - By default `configure` will + fail if an SMP runtime system is about to be built, and no implementation + for native atomic memory accesses can be found. If this happens, you are + encouraged to find a native atomic implementation that can be used, e.g., + using `libatomic_ops`, but by passing `--disable-smp-require-native-atomics` + you can build using a fallback implementation based on mutexes or spinlocks. + Performance of the SMP runtime system will however suffer immensely without + an implementation for native atomic memory accesses. If you or your system has special requirements please read the `Makefile` for additional configuration information. @@ -28,10 +28,13 @@ Here are the [instructions for submitting patches] [2]. In short: * We prefer to receive proposed updates via email on the - [`erlang-patches`] [3] mailing list rather than through a pull request. - Pull requests are not practical because we have a strict policy never to - merge any untested changes to the development branch (the only exception - being **obviously** correct changes, such as corrections of typos). + [`erlang-patches`] [3] mailing list or through a pull request. + +* Pull requests will be handled once everyday and there will be + essential testing before we will take a decision on the outcome + of the request. If the essential testings fails, the pull request + will be closed and you will have to fix the problem and submit another + pull request when this is done. * We merge all proposed updates to the `pu` (*proposed updates*) branch, typically within one working day. diff --git a/aclocal.m4 b/aclocal.m4 index 25f40944e7..46b30a16b3 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -954,6 +954,40 @@ dnl AC_DEFUN(ERL_FIND_ETHR_LIB, [ +AC_ARG_ENABLE(native-ethr-impls, + AS_HELP_STRING([--disable-native-ethr-impls], + [disable native ethread implementations]), +[ case "$enableval" in + no) disable_native_ethr_impls=yes ;; + *) disable_native_ethr_impls=no ;; + esac ], disable_native_ethr_impls=no) + +test "X$disable_native_ethr_impls" = "Xyes" && + AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) + +AC_ARG_ENABLE(x86-out-of-order, + AS_HELP_STRING([--enable-x86-out-of-order], + [enable x86/x84_64 out of order support (default disabled)])) + +AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, + AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], + [prefer gcc native ethread implementations]), +[ case "$enableval" in + yes) enable_prefer_gcc_native_ethr_impls=yes ;; + *) enable_prefer_gcc_native_ethr_impls=no ;; + esac ], enable_prefer_gcc_native_ethr_impls=no) + +test $enable_prefer_gcc_native_ethr_impls = yes && + AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) + +AC_ARG_WITH(libatomic_ops, + AS_HELP_STRING([--with-libatomic_ops=PATH], + [specify and prefer usage of libatomic_ops in the ethread library])) + +AC_ARG_WITH(with_sparc_memory_order, + AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], + [specify sparc memory order (defaults to RMO)])) + LM_CHECK_THR_LIB ERL_INTERNAL_LIBS @@ -1003,40 +1037,44 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads]) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) - + if test "X$disable_native_ethr_impls" = "Xyes"; then + have_interlocked_op=no + ethr_have_native_atomics=no + else + ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) + fi test "$ethr_have_native_atomics" = "yes" && ethr_have_native_spinlock=yes ;; @@ -1303,93 +1341,98 @@ case "$THR_LIB_NAME" in int128="__int128_t" fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + if test "X$disable_native_ethr_impls" = "Xyes"; then + ethr_have_native_atomics=no + else + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + + if test $int128 != no; then + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) + fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + AC_MSG_CHECKING([for a usable libatomic_ops implementation]) + case "x$with_libatomic_ops" in + xno | xyes | x) + libatomic_ops_include= + ;; + *) + if test -d "${with_libatomic_ops}/include"; then + libatomic_ops_include="-I$with_libatomic_ops/include" + CPPFLAGS="$CPPFLAGS $libatomic_ops_include" + else + AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) + fi;; + esac + ethr_have_libatomic_ops=no + AC_TRY_LINK([#include "atomic_ops.h"], + [ + volatile AO_t x; + AO_t y; + int z; + + AO_nop_full(); + AO_store(&x, (AO_t) 0); + z = AO_load(&x); + z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); + ], + [ethr_have_native_atomics=yes + ethr_have_libatomic_ops=yes]) + AC_MSG_RESULT([$ethr_have_libatomic_ops]) + if test $ethr_have_libatomic_ops = yes; then + AC_CHECK_SIZEOF(AO_t, , + [ + #include <stdio.h> + #include "atomic_ops.h" + ]) + AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) + + AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) + if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) + fi + ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" + elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_MSG_ERROR([No usable libatomic_ops implementation found]) + fi - if test $int128 != no; then - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) - fi + case "$host_cpu" in + sparc | sun4u | sparc64 | sun4v) + case "$with_sparc_memory_order" in + "TSO") + AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; + "PSO") + AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; + "RMO"|"") + AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; + *) + AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; + esac + ethr_have_native_atomics=yes;; + i86pc | i*86 | x86_64 | amd64) + if test "$enable_x86_out_of_order" = "yes"; then + AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) + fi + ethr_have_native_atomics=yes;; + macppc | ppc | powerpc | "Power Macintosh") + ethr_have_native_atomics=yes;; + tile) + ethr_have_native_atomics=yes;; + *) + ;; + esac - AC_MSG_CHECKING([for a usable libatomic_ops implementation]) - case "x$with_libatomic_ops" in - xno | xyes | x) - libatomic_ops_include= - ;; - *) - if test -d "${with_libatomic_ops}/include"; then - libatomic_ops_include="-I$with_libatomic_ops/include" - CPPFLAGS="$CPPFLAGS $libatomic_ops_include" - else - AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) - fi;; - esac - ethr_have_libatomic_ops=no - AC_TRY_LINK([#include "atomic_ops.h"], - [ - volatile AO_t x; - AO_t y; - int z; - - AO_nop_full(); - AO_store(&x, (AO_t) 0); - z = AO_load(&x); - z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); - ], - [ethr_have_native_atomics=yes - ethr_have_libatomic_ops=yes]) - AC_MSG_RESULT([$ethr_have_libatomic_ops]) - if test $ethr_have_libatomic_ops = yes; then - AC_CHECK_SIZEOF(AO_t, , - [ - #include <stdio.h> - #include "atomic_ops.h" - ]) - AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) - - AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) - if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) - fi - ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" - elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_MSG_ERROR([No usable libatomic_ops implementation found]) fi - case "$host_cpu" in - sparc | sun4u | sparc64 | sun4v) - case "$with_sparc_memory_order" in - "TSO") - AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; - "PSO") - AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; - "RMO"|"") - AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; - *) - AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; - esac - ethr_have_native_atomics=yes;; - i86pc | i*86 | x86_64 | amd64) - if test "$enable_x86_out_of_order" = "yes"; then - AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) - fi - ethr_have_native_atomics=yes;; - macppc | ppc | "Power Macintosh") - ethr_have_native_atomics=yes;; - tile) - ethr_have_native_atomics=yes;; - *) - ;; - esac - test ethr_have_native_atomics = "yes" && ethr_have_native_spinlock=yes dnl Restore LIBS @@ -1451,40 +1494,6 @@ esac AC_C_DOUBLE_MIDDLE_ENDIAN -AC_ARG_ENABLE(native-ethr-impls, - AS_HELP_STRING([--disable-native-ethr-impls], - [disable native ethread implementations]), -[ case "$enableval" in - no) disable_native_ethr_impls=yes ;; - *) disable_native_ethr_impls=no ;; - esac ], disable_native_ethr_impls=no) - -AC_ARG_ENABLE(x86-out-of-order, - AS_HELP_STRING([--enable-x86-out-of-order], - [enable x86/x84_64 out of order support (default disabled)])) - -test "X$disable_native_ethr_impls" = "Xyes" && - AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) - -AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, - AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], - [prefer gcc native ethread implementations]), -[ case "$enableval" in - yes) enable_prefer_gcc_native_ethr_impls=yes ;; - *) enable_prefer_gcc_native_ethr_impls=no ;; - esac ], enable_prefer_gcc_native_ethr_impls=no) - -test $enable_prefer_gcc_native_ethr_impls = yes && - AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) - -AC_ARG_WITH(libatomic_ops, - AS_HELP_STRING([--with-libatomic_ops=PATH], - [specify and prefer usage of libatomic_ops in the ethread library])) - -AC_ARG_WITH(with_sparc_memory_order, - AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], - [specify sparc memory order (defaults to RMO)])) - ETHR_X86_SSE2_ASM=no case "$GCC-$ac_cv_sizeof_void_p-$host_cpu" in yes-4-i86pc | yes-4-i*86 | yes-4-x86_64 | yes-4-amd64) diff --git a/bootstrap/lib/compiler/ebin/beam_utils.beam b/bootstrap/lib/compiler/ebin/beam_utils.beam Binary files differindex a2e0f1050e..9360e60827 100644 --- a/bootstrap/lib/compiler/ebin/beam_utils.beam +++ b/bootstrap/lib/compiler/ebin/beam_utils.beam diff --git a/bootstrap/lib/compiler/ebin/cerl_inline.beam b/bootstrap/lib/compiler/ebin/cerl_inline.beam Binary files differindex 0d7a4c0e87..3fa8c7d69f 100644 --- a/bootstrap/lib/compiler/ebin/cerl_inline.beam +++ b/bootstrap/lib/compiler/ebin/cerl_inline.beam diff --git a/bootstrap/lib/compiler/ebin/compiler.appup b/bootstrap/lib/compiler/ebin/compiler.appup index 8cc82fff38..577ebb149d 100644 --- a/bootstrap/lib/compiler/ebin/compiler.appup +++ b/bootstrap/lib/compiler/ebin/compiler.appup @@ -1 +1 @@ -{"4.9",[],[]}. +{"4.9.1",[],[]}. diff --git a/bootstrap/lib/kernel/ebin/inet.beam b/bootstrap/lib/kernel/ebin/inet.beam Binary files differindex 06010a82dd..e4362955bd 100644 --- a/bootstrap/lib/kernel/ebin/inet.beam +++ b/bootstrap/lib/kernel/ebin/inet.beam diff --git a/bootstrap/lib/kernel/ebin/inet_db.beam b/bootstrap/lib/kernel/ebin/inet_db.beam Binary files differindex 116aacacdc..674fef3a42 100644 --- a/bootstrap/lib/kernel/ebin/inet_db.beam +++ b/bootstrap/lib/kernel/ebin/inet_db.beam diff --git a/bootstrap/lib/kernel/ebin/inet_hosts.beam b/bootstrap/lib/kernel/ebin/inet_hosts.beam Binary files differindex c73b477683..78e81ce23d 100644 --- a/bootstrap/lib/kernel/ebin/inet_hosts.beam +++ b/bootstrap/lib/kernel/ebin/inet_hosts.beam diff --git a/bootstrap/lib/kernel/ebin/inet_res.beam b/bootstrap/lib/kernel/ebin/inet_res.beam Binary files differindex 18ccc23eb0..698fd4b721 100644 --- a/bootstrap/lib/kernel/ebin/inet_res.beam +++ b/bootstrap/lib/kernel/ebin/inet_res.beam diff --git a/bootstrap/lib/kernel/ebin/kernel.appup b/bootstrap/lib/kernel/ebin/kernel.appup index 5a6be8c68e..9c715bacd8 100644 --- a/bootstrap/lib/kernel/ebin/kernel.appup +++ b/bootstrap/lib/kernel/ebin/kernel.appup @@ -15,7 +15,7 @@ %% under the License. %% %% %CopyrightEnd% -{"2.16.1", +{"2.16.2", %% Up from - max two major revisions back [{<<"2\\.16(\\.[0-9]+)*">>,[restart_new_emulator]}, %% R16 {<<"2\\.15(\\.[0-9]+)*">>,[restart_new_emulator]}, %% R15 diff --git a/bootstrap/lib/stdlib/ebin/c.beam b/bootstrap/lib/stdlib/ebin/c.beam Binary files differindex e02d502159..b2999a6255 100644 --- a/bootstrap/lib/stdlib/ebin/c.beam +++ b/bootstrap/lib/stdlib/ebin/c.beam diff --git a/bootstrap/lib/stdlib/ebin/otp_internal.beam b/bootstrap/lib/stdlib/ebin/otp_internal.beam Binary files differindex c19ca1763a..de1c007a77 100644 --- a/bootstrap/lib/stdlib/ebin/otp_internal.beam +++ b/bootstrap/lib/stdlib/ebin/otp_internal.beam diff --git a/bootstrap/lib/stdlib/ebin/stdlib.appup b/bootstrap/lib/stdlib/ebin/stdlib.appup index 0f374eb279..382b0438c0 100644 --- a/bootstrap/lib/stdlib/ebin/stdlib.appup +++ b/bootstrap/lib/stdlib/ebin/stdlib.appup @@ -15,7 +15,7 @@ %% under the License. %% %% %CopyrightEnd% -{"1.19.1", +{"1.19.2", %% Up from - max two major revisions back [{<<"1\\.19(\\.[0-9]+)*">>,[restart_new_emulator]}, %% R16 {<<"1\\.18(\\.[0-9]+)*">>,[restart_new_emulator]}, %% R15 diff --git a/configure.in b/configure.in index c0994245e8..4b3884864c 100644 --- a/configure.in +++ b/configure.in @@ -419,6 +419,7 @@ if test "$files" != "$pattern" || test -f erts/CONF_INFO; then echo '********************** APPLICATIONS INFORMATION *******************' echo '*********************************************************************' echo + test "$files" != "$pattern" || files="" test ! -f erts/CONF_INFO || files="$files erts/CONF_INFO" for infofile in $files; do app=`dirname $infofile`; app=`basename $app` diff --git a/erts/aclocal.m4 b/erts/aclocal.m4 index 25f40944e7..46b30a16b3 100644 --- a/erts/aclocal.m4 +++ b/erts/aclocal.m4 @@ -954,6 +954,40 @@ dnl AC_DEFUN(ERL_FIND_ETHR_LIB, [ +AC_ARG_ENABLE(native-ethr-impls, + AS_HELP_STRING([--disable-native-ethr-impls], + [disable native ethread implementations]), +[ case "$enableval" in + no) disable_native_ethr_impls=yes ;; + *) disable_native_ethr_impls=no ;; + esac ], disable_native_ethr_impls=no) + +test "X$disable_native_ethr_impls" = "Xyes" && + AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) + +AC_ARG_ENABLE(x86-out-of-order, + AS_HELP_STRING([--enable-x86-out-of-order], + [enable x86/x84_64 out of order support (default disabled)])) + +AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, + AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], + [prefer gcc native ethread implementations]), +[ case "$enableval" in + yes) enable_prefer_gcc_native_ethr_impls=yes ;; + *) enable_prefer_gcc_native_ethr_impls=no ;; + esac ], enable_prefer_gcc_native_ethr_impls=no) + +test $enable_prefer_gcc_native_ethr_impls = yes && + AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) + +AC_ARG_WITH(libatomic_ops, + AS_HELP_STRING([--with-libatomic_ops=PATH], + [specify and prefer usage of libatomic_ops in the ethread library])) + +AC_ARG_WITH(with_sparc_memory_order, + AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], + [specify sparc memory order (defaults to RMO)])) + LM_CHECK_THR_LIB ERL_INTERNAL_LIBS @@ -1003,40 +1037,44 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads]) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) - + if test "X$disable_native_ethr_impls" = "Xyes"; then + have_interlocked_op=no + ethr_have_native_atomics=no + else + ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) + fi test "$ethr_have_native_atomics" = "yes" && ethr_have_native_spinlock=yes ;; @@ -1303,93 +1341,98 @@ case "$THR_LIB_NAME" in int128="__int128_t" fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + if test "X$disable_native_ethr_impls" = "Xyes"; then + ethr_have_native_atomics=no + else + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + + if test $int128 != no; then + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) + fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + AC_MSG_CHECKING([for a usable libatomic_ops implementation]) + case "x$with_libatomic_ops" in + xno | xyes | x) + libatomic_ops_include= + ;; + *) + if test -d "${with_libatomic_ops}/include"; then + libatomic_ops_include="-I$with_libatomic_ops/include" + CPPFLAGS="$CPPFLAGS $libatomic_ops_include" + else + AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) + fi;; + esac + ethr_have_libatomic_ops=no + AC_TRY_LINK([#include "atomic_ops.h"], + [ + volatile AO_t x; + AO_t y; + int z; + + AO_nop_full(); + AO_store(&x, (AO_t) 0); + z = AO_load(&x); + z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); + ], + [ethr_have_native_atomics=yes + ethr_have_libatomic_ops=yes]) + AC_MSG_RESULT([$ethr_have_libatomic_ops]) + if test $ethr_have_libatomic_ops = yes; then + AC_CHECK_SIZEOF(AO_t, , + [ + #include <stdio.h> + #include "atomic_ops.h" + ]) + AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) + + AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) + if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) + fi + ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" + elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_MSG_ERROR([No usable libatomic_ops implementation found]) + fi - if test $int128 != no; then - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) - fi + case "$host_cpu" in + sparc | sun4u | sparc64 | sun4v) + case "$with_sparc_memory_order" in + "TSO") + AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; + "PSO") + AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; + "RMO"|"") + AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; + *) + AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; + esac + ethr_have_native_atomics=yes;; + i86pc | i*86 | x86_64 | amd64) + if test "$enable_x86_out_of_order" = "yes"; then + AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) + fi + ethr_have_native_atomics=yes;; + macppc | ppc | powerpc | "Power Macintosh") + ethr_have_native_atomics=yes;; + tile) + ethr_have_native_atomics=yes;; + *) + ;; + esac - AC_MSG_CHECKING([for a usable libatomic_ops implementation]) - case "x$with_libatomic_ops" in - xno | xyes | x) - libatomic_ops_include= - ;; - *) - if test -d "${with_libatomic_ops}/include"; then - libatomic_ops_include="-I$with_libatomic_ops/include" - CPPFLAGS="$CPPFLAGS $libatomic_ops_include" - else - AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) - fi;; - esac - ethr_have_libatomic_ops=no - AC_TRY_LINK([#include "atomic_ops.h"], - [ - volatile AO_t x; - AO_t y; - int z; - - AO_nop_full(); - AO_store(&x, (AO_t) 0); - z = AO_load(&x); - z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); - ], - [ethr_have_native_atomics=yes - ethr_have_libatomic_ops=yes]) - AC_MSG_RESULT([$ethr_have_libatomic_ops]) - if test $ethr_have_libatomic_ops = yes; then - AC_CHECK_SIZEOF(AO_t, , - [ - #include <stdio.h> - #include "atomic_ops.h" - ]) - AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) - - AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) - if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) - fi - ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" - elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_MSG_ERROR([No usable libatomic_ops implementation found]) fi - case "$host_cpu" in - sparc | sun4u | sparc64 | sun4v) - case "$with_sparc_memory_order" in - "TSO") - AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; - "PSO") - AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; - "RMO"|"") - AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; - *) - AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; - esac - ethr_have_native_atomics=yes;; - i86pc | i*86 | x86_64 | amd64) - if test "$enable_x86_out_of_order" = "yes"; then - AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) - fi - ethr_have_native_atomics=yes;; - macppc | ppc | "Power Macintosh") - ethr_have_native_atomics=yes;; - tile) - ethr_have_native_atomics=yes;; - *) - ;; - esac - test ethr_have_native_atomics = "yes" && ethr_have_native_spinlock=yes dnl Restore LIBS @@ -1451,40 +1494,6 @@ esac AC_C_DOUBLE_MIDDLE_ENDIAN -AC_ARG_ENABLE(native-ethr-impls, - AS_HELP_STRING([--disable-native-ethr-impls], - [disable native ethread implementations]), -[ case "$enableval" in - no) disable_native_ethr_impls=yes ;; - *) disable_native_ethr_impls=no ;; - esac ], disable_native_ethr_impls=no) - -AC_ARG_ENABLE(x86-out-of-order, - AS_HELP_STRING([--enable-x86-out-of-order], - [enable x86/x84_64 out of order support (default disabled)])) - -test "X$disable_native_ethr_impls" = "Xyes" && - AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) - -AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, - AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], - [prefer gcc native ethread implementations]), -[ case "$enableval" in - yes) enable_prefer_gcc_native_ethr_impls=yes ;; - *) enable_prefer_gcc_native_ethr_impls=no ;; - esac ], enable_prefer_gcc_native_ethr_impls=no) - -test $enable_prefer_gcc_native_ethr_impls = yes && - AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) - -AC_ARG_WITH(libatomic_ops, - AS_HELP_STRING([--with-libatomic_ops=PATH], - [specify and prefer usage of libatomic_ops in the ethread library])) - -AC_ARG_WITH(with_sparc_memory_order, - AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], - [specify sparc memory order (defaults to RMO)])) - ETHR_X86_SSE2_ASM=no case "$GCC-$ac_cv_sizeof_void_p-$host_cpu" in yes-4-i86pc | yes-4-i*86 | yes-4-x86_64 | yes-4-amd64) diff --git a/erts/autoconf/vxworks/sed.general b/erts/autoconf/vxworks/sed.general index e2d2f415f1..dbb9420b67 100644 --- a/erts/autoconf/vxworks/sed.general +++ b/erts/autoconf/vxworks/sed.general @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 1997-2012. All Rights Reserved. +# Copyright Ericsson AB 1997-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/autoconf/vxworks/sed.vxworks_ppc32 b/erts/autoconf/vxworks/sed.vxworks_ppc32 index 48ec912b4f..f00daef74c 100644 --- a/erts/autoconf/vxworks/sed.vxworks_ppc32 +++ b/erts/autoconf/vxworks/sed.vxworks_ppc32 @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2006-2010. All Rights Reserved. +# Copyright Ericsson AB 2006-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/autoconf/vxworks/sed.vxworks_simlinux b/erts/autoconf/vxworks/sed.vxworks_simlinux index fbf6d7bc9d..67ddbf1575 100644 --- a/erts/autoconf/vxworks/sed.vxworks_simlinux +++ b/erts/autoconf/vxworks/sed.vxworks_simlinux @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2008-2010. All Rights Reserved. +# Copyright Ericsson AB 2008-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/autoconf/vxworks/sed.vxworks_simso b/erts/autoconf/vxworks/sed.vxworks_simso index 17ec092dee..1af88cef31 100644 --- a/erts/autoconf/vxworks/sed.vxworks_simso +++ b/erts/autoconf/vxworks/sed.vxworks_simso @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2005-2010. All Rights Reserved. +# Copyright Ericsson AB 2005-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/configure.in b/erts/configure.in index b056ba44e2..2f624e5853 100644 --- a/erts/configure.in +++ b/erts/configure.in @@ -150,6 +150,14 @@ AS_HELP_STRING([--disable-smp-support], [disable smp support]), *) enable_smp_support=yes ;; esac ], enable_smp_support=unknown) +AC_ARG_ENABLE(smp-require-native-atomics, + AS_HELP_STRING([--disable-smp-require-native-atomics], + [disable the SMP requirement of a native atomic implementation]), +[ case "$enableval" in + no) smp_require_native_atomics=no ;; + *) smp_require_native_atomics=yes ;; + esac ], smp_require_native_atomics=yes) + AC_ARG_WITH(termcap, AS_HELP_STRING([--with-termcap], [use termcap (default)]) AS_HELP_STRING([--without-termcap], @@ -1043,11 +1051,15 @@ if test $ERTS_BUILD_SMP_EMU = yes; then AC_DEFINE(ERTS_HAVE_SMP_EMU, 1, [Define if the smp emulator is built]) - case "$ethr_have_native_atomics-$ethr_have_native_spinlock" in + case "$ethr_have_native_atomics-$smp_require_native_atomics-$ethr_have_native_spinlock" in yes-*) ;; - no-yes) + no-yes-*) + AC_MSG_ERROR([No native atomic implementation found. See INSTALL.md for more information.]) + ;; + + no-no-yes) test -f "$ERL_TOP/erts/CONF_INFO" || echo "" > "$ERL_TOP/erts/CONF_INFO" @@ -1056,12 +1068,13 @@ if test $ERTS_BUILD_SMP_EMU = yes; then No native atomic implementation available. Fallbacks implemented using spinlocks will be used. Note that the performance of the SMP - runtime system will suffer due to this. + runtime system will suffer immensely due to + this. EOF ;; - no-no) + no-no-no) test -f "$ERL_TOP/erts/CONF_INFO" || echo "" > "$ERL_TOP/erts/CONF_INFO" @@ -1071,7 +1084,7 @@ EOF spinlock implementation available. Fallbacks implemented using mutexes will be used. Note that the performance of the SMP runtime system - will suffer much due to this. + will suffer immensely due to this. EOF ;; diff --git a/erts/doc/src/crash_dump.xml b/erts/doc/src/crash_dump.xml index 73212e6143..8f5515baca 100644 --- a/erts/doc/src/crash_dump.xml +++ b/erts/doc/src/crash_dump.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>1999</year><year>2010</year> + <year>1999</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml index 8dca7402e8..70569b1c6c 100644 --- a/erts/doc/src/erl.xml +++ b/erts/doc/src/erl.xml @@ -1037,6 +1037,20 @@ <p>For more information, see <seealso marker="erlang#system_info_cpu_topology">erlang:system_info(cpu_topology)</seealso>.</p> </item> + <tag><marker id="+sfwi"><c>+sfwi Interval</c></marker></tag> + <item> + <p>Set scheduler forced wakeup interval. All run queues will + be scanned each <c>Interval</c> milliseconds. While there are + sleeping schedulers in the system, one scheduler will be woken + for each non-empty run queue found. An <c>Interval</c> of zero + disables this feature, which also is the default. + </p> + <p>This feature has been introduced as a temporary workaround + for lengthy executing native code, and native code that do not + bump reductions properly in OTP. When these bugs have be fixed + the <c>+sfwi</c> flag will be removed. + </p> + </item> <tag><marker id="+stbt"><c>+stbt BindType</c></marker></tag> <item> <p>Try to set scheduler bind type. The same as the diff --git a/erts/doc/src/erts_alloc.xml b/erts/doc/src/erts_alloc.xml index 2ffb55c6ab..6ce2261430 100644 --- a/erts/doc/src/erts_alloc.xml +++ b/erts/doc/src/erts_alloc.xml @@ -170,6 +170,15 @@ used. The time complexity is proportional to log N, where N is the number of free blocks.</p> </item> + <tag>Address order first fit carrier best fit</tag> + <item> + <p>Strategy: Find the <em>carrier</em> with the lowest address that + can satisfy the requested block size, then find a block within + that carrier using the "best fit" strategy.</p> + <p>Implementation: Balanced binary search trees are + used. The time complexity is proportional to log N, where + N is the number of free blocks.</p> + </item> <tag>Address order first fit carrier address order best fit</tag> <item> <p>Strategy: Find the <em>carrier</em> with the lowest address that @@ -330,20 +339,21 @@ fetched it will function as an ordinary carrier. This feature has special requirements on the <seealso marker="#M_as">allocation strategy</seealso> used. Currently - only the <c>aoff</c> and the <c>aoffcaobf</c> strategies support + only the strategies <c>aoff</c>, <c>aoffcbf</c> and <c>aoffcaobf</c> support abandoned carriers. This feature also requires <seealso marker="#M_t">multiple thread specific instances</seealso> to be enabled. When enabling this feature, multiple thread specific instances will be enabled if not already enabled, and the - <c>aoffcaobf</c> strategy will be enabled if current strategy does not + <c>aoffcbf</c> strategy will be enabled if current strategy does not support abandoned carriers. This feature can be enabled on all allocators based on the <c>alloc_util</c> framework with the exception of <c>temp_alloc</c> (which would be pointless). </item> - <tag><marker id="M_as"><c><![CDATA[+M<S>as bf|aobf|aoff|aoffcaobf|gf|af]]></c></marker></tag> + <tag><marker id="M_as"><c><![CDATA[+M<S>as bf|aobf|aoff|aoffcbf|aoffcaobf|gf|af]]></c></marker></tag> <item> Allocation strategy. Valid strategies are <c>bf</c> (best fit), <c>aobf</c> (address order best fit), <c>aoff</c> (address order first fit), + <c>aoffcbf</c> (address order first fit carrier best fit), <c>aoffcaobf</c> (address order first fit carrier address order best fit), <c>gf</c> (good fit), and <c>af</c> (a fit). See <seealso marker="#strategy">the description of allocation strategies</seealso> in "the <c>alloc_util</c> framework" section.</item> diff --git a/erts/doc/src/notes.xml b/erts/doc/src/notes.xml index 3a2c644ff7..f94d71ee3d 100644 --- a/erts/doc/src/notes.xml +++ b/erts/doc/src/notes.xml @@ -30,6 +30,369 @@ </header> <p>This document describes the changes made to the ERTS application.</p> +<section><title>Erts 5.10.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + A bug in prim_inet has been corrected. If the port owner + was killed at a bad time while closing the socket port + the port could become orphaned hence causing port and + socket leaking. Reported by Fred Herbert, Dmitry Belyaev + and others.</p> + <p> + Own Id: OTP-10497 Aux Id: OTP-10562 </p> + </item> + <item> + <p> + Compilation fixes for NetBSD. Thanks to YAMAMOTO Takashi.</p> + <p> + Own Id: OTP-10941</p> + </item> + <item> + <p> + Fixed a race condition when using delayed_write when + writing to a file which would cause the same data to be + written multiple times.</p> + <p> + Own Id: OTP-10984</p> + </item> + <item> + <p> + Fix small memory leak from tracing with option + <c>meta</c>.</p> + <p> + Own Id: OTP-10997</p> + </item> + <item> + <p> + Correct typo in erlsrv usage. Thanks to Bryan Hunter</p> + <p> + Own Id: OTP-11002</p> + </item> + <item> + <p> + ct_run: delete unused function. Thanks to Tuncer Ayaz.</p> + <p> + Own Id: OTP-11003</p> + </item> + <item> + <p> + Corrections to run_erl/to_erl handshake behaviour.</p> + <p> + Own Id: OTP-11012</p> + </item> + <item> + <p> + Fix typo in type: erlang:process_info_item(). Thanks to + Andrew Tunnell-Jones.</p> + <p> + Own Id: OTP-11024</p> + </item> + <item> + <p> + Fix src/dest overlap issue in ttsl driver. Thanks to + Steve Vinoski.</p> + <p> + Own Id: OTP-11064</p> + </item> + <item> + <p> + When sending to a port using <c>erlang:send(Port, Msg, + [nosuspend])</c>, the send operation was performed + synchronously. This bug has now been fixed.</p> + <p> + Own Id: OTP-11076 Aux Id: OTP-10336 </p> + </item> + <item> + <p> + When converting a faulty binary to a list with + unicode:characters_to_list, the error return value could + contain a faulty "rest", i.e. the io_list of characters + that could not be converted was wrong. This happened only + if input was a sub binary and conversion was from utf8. + This is now corrected.</p> + <p> + Own Id: OTP-11080</p> + </item> + <item> + <p> + Runtime system could crash when reporting stale + <c>driver_select()</c>.</p> + <p> + Own Id: OTP-11084</p> + </item> + <item> + <p> + Fix lock order violation for memory instrumentation + (+Mim, +Mis, +Mit).</p> + <p> + Own Id: OTP-11085</p> + </item> + <item> + <p> + Fixed some compilation warnings on miscellaneous + platforms. Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11086</p> + </item> + <item> + <p> + Fixed issue when flushing i/o during shutdown on windows + where the Erlang VM would sometime hang due to a race + condition.</p> + <p> + Own Id: OTP-11096</p> + </item> + <item> + <p> + Fixed issue where repeated calls to erlang:nodes() could + cause unnecessary contention in the dist_table lock.</p> + <p> + Own Id: OTP-11097</p> + </item> + <item> + <p> + Properly guard WIDE_TAG use with HAVE_WCWIDTH in + ttsl_drv. Thanks to Anthony Ramine</p> + <p> + Own Id: OTP-11106</p> + </item> + <item> + <p> + Fix some Makefile rules that didn't support silent rules. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11111</p> + </item> + <item> + <p> + Fix receive support in erl_eval with a BEAM module. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11137</p> + </item> + <item> + <p> + erlang:now() could suddenly jump ~24 days into the future + on Windows. This is now corrected. Thanks to Garret Smith + for reporting and testing fixes.</p> + <p> + Own Id: OTP-11146</p> + </item> + <item> + <p> + erlang:term_to_binary will now cost an appropriate amount + of reductions and will interrupt (yield) for reschedule + if the term is big. This avoids too long schedules when + term_to_binary is used. </p> + <p> + Impact: Programs running term_to_binary on large terms + will run more smothly, but rescheduling will impact the + single process performance of the BIF. Single threaded + benchmarks will show degraded performance of the BIF when + called with very large terms, while general system + behaviour will be improved. The overhead for allowing + restart and reduction counting also degrades local + performance of the BIF with between 5% and 10% even for + small terms.</p> + <p> + Own Id: OTP-11163</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Replaced the lock protecting gathering of garbage + collection statistics with a lock-free solution.</p> + <p> + Own Id: OTP-10271 Aux Id: kunagi-108 + [04c5410f-9cc4-4696-8639-36bf98686c7a-7] </p> + </item> + <item> + <p>Support for migration of memory carriers between + memory allocator instances has been introduced.</p> + <p>By default this feature is not enabled and do not + effect the characteristics of the system. When enabled it + has the following impact on the characteristics of the + system:</p> <list> <item>Reduced memory footprint when + the memory load is unevenly distributed between scheduler + specific allocator instances.</item> <item>Depending on + the default allocaton strategy used on a specific + allocator there might or might not be a slight + performance loss.</item> <item>When enabled on the + <c>fix_alloc</c> allocator, a different strategy for + management of fix blocks will be used.</item> <item>The + information returned from <seealso + marker="erlang:system_info_allocator_tuple"><c>erlang:system_info({allocator, + A})</c></seealso>, and <seealso + marker="erlang:system_info_allocator_sizes"><c>erlang:system_info({allocator_sizes, + A})</c></seealso> will be slightly different when this + feature has been enabled. An <c>mbcs_pool</c> tuple will + be present giving information about abandoned carriers, + and in the <c>fix_alloc</c> case no <c>fix_types</c> + tuple will be present. </item></list> + <p>For more information, see the documentation of the + <seealso + marker="erts_alloc#M_acul"><c>+M<S>acul</c></seealso> + command line argument.</p> + <p> + Own Id: OTP-10279</p> + </item> + <item> + <p> + Change specs for spawn_opt to use the process_level() + type declaration instead of re-defining it in various + places. Thanks to Kostis Sagonas.</p> + <p> + Own Id: OTP-11008</p> + </item> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + <item> + <p>Erlang source files with non-ASCII characters are now + encoded in UTF-8 (instead of latin1).</p> + <p> + Own Id: OTP-11041 Aux Id: OTP-10907 </p> + </item> + <item> + <p> + Optimization of simultaneous <c>inet_db</c> operations on + the same socket by using a lock free implementation.</p> + <p> + Impact on the characteristics of the system: Improved + performance.</p> + <p> + Own Id: OTP-11074</p> + </item> + <item> + <p> + The <c>high_msgq_watermark</c> and + <c>low_msgq_watermark</c> <c>inet</c> socket options + introduced in OTP-R16A could only be set on TCP sockets. + These options are now generic and can be set on all types + of sockets.</p> + <p> + Own Id: OTP-11075 Aux Id: OTP-10336 </p> + </item> + <item> + <p>A new better algorithm for management of the process, + and port tables has been introduced.</p> + <p>Impact on the characteristics of the system:</p> + <list> <item>The new algorithm ensures that both insert + and delete operations can be made in O(1) time + complexity. Previously used algorithm either caused + insert or delete to be O(N).</item> <item>The new + algorithm will also ensure that reuse of identifiers will + be less frequent than when the old algorithm was + used.</item> <item>Previously used algorithm ensured that + the latest created identifier compared as the largest + when comparing two identifiers of the same type that had + been created on the same node as long as no identifiers + had been reused. Since identifiers can be reused quite + fast, one has never been able to rely on this property. + Due to the introduction of this new algorithm this + property will not hold even if no identifiers has been + reused yet. This could be considered as an + incompatibility.</item> </list> + <p>Due to the above mensioned potential incompatibility, + it will still be possible to enable the old algorithm for + some time. The command line argument <seealso + marker="erl#+P"><c>+P legacy</c></seealso> will enable + the old algorithm on the process table, and <seealso + marker="erl#+Q"><c>+Q legacy</c></seealso> will do the + same for the port table. These command line arguments are + however deprecated as of their introduction and have been + scheduled for removal in OTP-R18.</p> + <p> + *** POTENTIAL INCOMPATIBILITY ***</p> + <p> + Own Id: OTP-11077</p> + </item> + <item> + <p> + Support wide characters in the shell through wcwidth(). + Thanks to Anthony Ramine. Reported by Lo�c Hoguin.</p> + <p> + Own Id: OTP-11088</p> + </item> + <item> + <p> + Added total used memory for each process in erlang crash + dumps.</p> + <p> + Own Id: OTP-11098</p> + </item> + <item> + <p> + Added support for hipe on Raspberry Pi (armv6l). Thanks + to Klaus Alfert.</p> + <p> + Own Id: OTP-11125</p> + </item> + <item> + <p> + Remove 'query' from the list of reserved words in docs. + Thanks to Matthias Endler and Lo�c Hoguin.</p> + <p> + Own Id: OTP-11158</p> + </item> + <item> + <p> + Lift static limitation (FD_SETSIZE) for file descriptors + on Mac OS X. (Thanks to Anthony Ramine)</p> + <p> + Own Id: OTP-11159</p> + </item> + </list> + </section> + + + <section><title>Known Bugs and Problems</title> + <list> + <item> + <p>Miscellaneous native code in OTP misbehave either due + to lengthy execution, or due to not bumping reductions + properly. Problems typically occur when passing huge sets + of data to a misbehaving BIF. Fixing this has high + priority and is being worked on, but there will remain + issues like this for some time.</p> + <p>In order to alleviate problems with scheduling which + might occur when executing misbehaving native code, the + command line argument <seealso + marker="erl#+sfwi">+sfwi</seealso> has been + introduced.</p> + <p>By default this feature is disabled and you are + advised not to enable it if you do not encounter problems + with misbehaving native code.</p> + <p>When enabled it has the following impact on the + characteristics of the system:</p> <list> <item>Work will + always be distributed between schedulers even when + executing misbehaving native code.</item> <item>It may + cause an increased amount of processes and/or ports + bouncing between schedulers which in turn will cause a + performance loss.</item> <item>It may cause reduced + performance due to reduced or lost work compaction when + all schedulers do not execute under full load.</item> + <item>An increased contention on run queue locks.</item> + </list> + <p> + Own Id: OTP-11164</p> + </item> + </list> + </section> + +</section> + <section><title>Erts 5.10.1.2</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in index 58e83540e1..9751982103 100644 --- a/erts/emulator/Makefile.in +++ b/erts/emulator/Makefile.in @@ -387,6 +387,13 @@ else UNIX_ONLY_BUILDS = endif +ifeq ($(TARGET), win32) +TMPVAR := $(shell LANG=C $(PERL) utils/make_compiler_flags -o $(TTF_DIR)/erl_compile_flags.h -v CONFIG_H "N/A" -v CFLAGS "$(CFLAGS)" -v LDFLAGS "$(LDFLAGS)") +else +# We force this to be run every time this makefile is executed +TMPVAR := $(shell LANG=C $(PERL) utils/make_compiler_flags -o $(TTF_DIR)/erl_compile_flags.h -f CONFIG_H "$(ERL_TOP)/erts/$(TARGET)/config.h" -v CFLAGS "$(CFLAGS)" -v LDFLAGS "$(LDFLAGS)") +endif + .PHONY: all ifdef VOID_EMULATOR all: @@ -959,6 +966,7 @@ SED_REPL_TTF_DIR=s|$(TTF_DIR)/|$$(TTF_DIR)/|g SED_REPL_ERL_TOP=s|\([ ]\)$(ERL_TOP)/|\1$$(ERL_TOP)/|g;s|^$(ERL_TOP)/|$$(ERL_TOP)/|g SED_REPL_POLL=s|$$(OBJDIR)/erl_poll.o|$$(OBJDIR)/erl_poll.kp.o $$(OBJDIR)/erl_poll.nkp.o|g SED_REPL_CHK_IO=s|$$(OBJDIR)/erl_check_io.o|$$(OBJDIR)/erl_check_io.kp.o $$(OBJDIR)/erl_check_io.nkp.o|g +SED_REPL_TTF_COMP_FLAGS=s|\([^/]\)erl_compile_flags\.h|\1$$(TTF_DIR)/erl_compile_flags\.h|g ifeq ($(TARGET),win32) #SED_PREFIX=$(SED_REPL_WIN_DRIVE); @@ -973,7 +981,7 @@ else SED_SUFFIX= endif -SED_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_O);$(SED_REPL_TTF_DIR);$(SED_REPL_ERL_TOP)$(SED_SUFFIX)' +SED_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_O);$(SED_REPL_TTF_DIR);$(SED_REPL_ERL_TOP)$(SED_SUFFIX);$(SED_REPL_TTF_COMP_FLAGS)' SED_DEPEND_ZLIB=sed '$(SED_PREFIX)$(SED_REPL_O_ZLIB)' ifdef HIPE_ENABLED diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names index 3ee9eb0f88..c2f32ba089 100644 --- a/erts/emulator/beam/atom.names +++ b/erts/emulator/beam/atom.names @@ -139,6 +139,7 @@ atom caseless atom catchlevel atom cd atom cdr +atom cflags atom characters_to_binary_int atom characters_to_list_int atom clear @@ -150,6 +151,7 @@ atom compact atom compat_rel atom compile atom compressed +atom config_h atom connect atom connected atom connection_closed @@ -301,6 +303,7 @@ atom label atom large_heap atom last_calls atom latin1 +atom ldflags atom Le='=<' atom lf atom line @@ -534,6 +537,7 @@ atom system_version atom system_architecture atom SYSTEM='SYSTEM' atom table +atom term_to_binary_trap atom this atom thread_pool_size atom threads diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c index ce025c9b6d..68907a771a 100644 --- a/erts/emulator/beam/beam_bp.c +++ b/erts/emulator/beam/beam_bp.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2000-2012. All Rights Reserved. + * Copyright Ericsson AB 2000-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 5781009f58..da36c4437e 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -6256,3 +6256,12 @@ erts_current_reductions(Process *current, Process *p) } } +int +erts_beam_jump_table(void) +{ +#if defined(NO_JUMP_TABLE) + return 0; +#else + return 1; +#endif +} diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c index 6f9b171224..6b43c53985 100644 --- a/erts/emulator/beam/big.c +++ b/erts/emulator/beam/big.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2012. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/break.c b/erts/emulator/beam/break.c index f8cfd60a6f..ad9a89b642 100644 --- a/erts/emulator/beam/break.c +++ b/erts/emulator/beam/break.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2012. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c index a547191d6d..5eacff8829 100644 --- a/erts/emulator/beam/erl_alloc.c +++ b/erts/emulator/beam/erl_alloc.c @@ -240,15 +240,21 @@ do { \ sys_memcpy((void *) (IP), (void *) &aui__, sizeof(struct au_init)); \ } while (0) +#if ERTS_ALC_DEFAULT_ACUL \ + || ERTS_ALC_DEFAULT_ACUL_LL_ALLOC \ + || ERTS_ALC_DEFAULT_ACUL_EHEAP_ALLOC + static ERTS_INLINE void set_default_acul(struct au_init *ip, int acul) { ip->thr_spec = 1; ip->atype = AOFIRSTFIT; - ip->init.aoff.bf_within_carrier = 1; + ip->init.aoff.flavor = AOFF_BF; ip->init.util.acul = acul; } +#endif + static void set_default_sl_alloc_opts(struct au_init *ip) { @@ -558,7 +564,7 @@ static ERTS_INLINE int strategy_support_carrier_migration(struct au_init *auip) { /* - * Currently only aoff and aoffcaobf support carrier + * Currently only aoff, aoffcbf and aoffcaobf support carrier * migration, i.e, type AOFIRSTFIT. */ return auip->atype == AOFIRSTFIT; @@ -581,9 +587,9 @@ ensure_carrier_migration_support(struct au_init *auip) * default to a strategy that can... */ if (!strategy_support_carrier_migration(auip)) { - /* Default to aoffcaobf */ + /* Default to aoffcbf */ auip->atype = AOFIRSTFIT; - auip->init.aoff.bf_within_carrier = 1; + auip->init.aoff.flavor = AOFF_BF; } } @@ -1284,11 +1290,15 @@ handle_au_arg(struct au_init *auip, } else if (strcmp("aoff", alg) == 0) { auip->atype = AOFIRSTFIT; - auip->init.aoff.bf_within_carrier = 0; + auip->init.aoff.flavor = AOFF_AOFF; + } + else if (strcmp("aoffcbf", alg) == 0) { + auip->atype = AOFIRSTFIT; + auip->init.aoff.flavor = AOFF_BF; } else if (strcmp("aoffcaobf", alg) == 0) { auip->atype = AOFIRSTFIT; - auip->init.aoff.bf_within_carrier = 1; + auip->init.aoff.flavor = AOFF_AOBF; } else { bad_value(param, sub_param + 1, alg); diff --git a/erts/emulator/beam/erl_alloc.h b/erts/emulator/beam/erl_alloc.h index d9fdfc6f58..b5975c6c32 100644 --- a/erts/emulator/beam/erl_alloc.h +++ b/erts/emulator/beam/erl_alloc.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2002-2012. All Rights Reserved. + * Copyright Ericsson AB 2002-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_alloc.types b/erts/emulator/beam/erl_alloc.types index 095ad24387..bb5eba80be 100644 --- a/erts/emulator/beam/erl_alloc.types +++ b/erts/emulator/beam/erl_alloc.types @@ -150,6 +150,7 @@ type LINK_LH STANDARD PROCESSES link_lh type SUSPEND_MON STANDARD PROCESSES suspend_monitor type PEND_SUSPEND SHORT_LIVED PROCESSES pending_suspend type PROC_LIST SHORT_LIVED PROCESSES proc_list +type EXTRA_ROOT SHORT_LIVED PROCESSES extra_root type FUN_ENTRY LONG_LIVED CODE fun_entry type ATOM_TXT LONG_LIVED ATOM atom_text type BEAM_REGISTER EHEAP PROCESSES beam_register @@ -397,6 +398,7 @@ type POLLSET_UPDREQ SHORT_LIVED SYSTEM pollset_update_req type POLL_FDS LONG_LIVED SYSTEM poll_fds type POLL_RES_EVS LONG_LIVED SYSTEM poll_result_events type FD_STATUS LONG_LIVED SYSTEM fd_status +type SELECT_FDS LONG_LIVED SYSTEM select_fds +if unix diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index b19e603a5f..bf8a37c71b 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -1753,7 +1753,8 @@ handle_delayed_dealloc(Allctr_t *allctr, if (IS_FREE_LAST_MBC_BLK(blk)) { /* * A multiblock carrier that previously has been migrated away - * from us and now is back to be deallocated... + * from us and now is back to be deallocated. For more info + * see schedule_dealloc_carrier(). * * Note that we cannot use FBLK_TO_MBC(blk) since it * data has been overwritten by the queue. @@ -1761,6 +1762,12 @@ handle_delayed_dealloc(Allctr_t *allctr, Carrier_t *crr = FIRST_BLK_TO_MBC(allctr, blk); ERTS_ALC_CPOOL_ASSERT(ERTS_ALC_IS_CPOOL_ENABLED(allctr)); ERTS_ALC_CPOOL_ASSERT(allctr == crr->cpool.orig_allctr); + ERTS_ALC_CPOOL_ASSERT(((erts_aint_t) allctr) + != (erts_smp_atomic_read_nob(&crr->allctr) + & ~FLG_MASK)); + + erts_smp_atomic_set_nob(&crr->allctr, ((erts_aint_t) allctr)); + schedule_dealloc_carrier(allctr, crr); } else { @@ -3001,7 +3008,7 @@ check_pending_dealloc_carrier(Allctr_t *allctr, static void schedule_dealloc_carrier(Allctr_t *allctr, Carrier_t *crr) { - Allctr_t *used_allctr; + Allctr_t *orig_allctr; int check_pending_dealloc; erts_aint_t max_size; @@ -3010,25 +3017,37 @@ schedule_dealloc_carrier(Allctr_t *allctr, Carrier_t *crr) return; } - used_allctr = crr->cpool.orig_allctr; + orig_allctr = crr->cpool.orig_allctr; - if (allctr != used_allctr) { + if (allctr != orig_allctr) { Block_t *blk = MBC_TO_FIRST_BLK(allctr, crr); - int cinit = used_allctr->dd.ix - allctr->dd.ix; + int cinit = orig_allctr->dd.ix - allctr->dd.ix; /* - * Receiver will recognize that this is a carrier to - * deallocate since the block is an mbc block that - * is free and last in carrier... + * We send the carrier to its origin for deallocation. + * This in order: + * - not to complicate things for the thread specific + * instances of mseg_alloc, and + * - to ensure that we always only reuse empty carriers + * originating from our own thread specific mseg_alloc + * instance which is beneficial on NUMA systems. + * + * The receiver will recognize that this is a carrier to + * deallocate (and not a block which is the common case) + * since the block is an mbc block that is free and last + * in the carrier. */ ERTS_ALC_CPOOL_ASSERT(IS_FREE_LAST_MBC_BLK(blk)); ERTS_ALC_CPOOL_ASSERT(IS_MBC_FIRST_ABLK(allctr, blk)); ERTS_ALC_CPOOL_ASSERT(crr == FBLK_TO_MBC(blk)); - ERTS_ALC_CPOOL_ASSERT(crr == FIRST_BLK_TO_MBC(used_allctr, blk)); + ERTS_ALC_CPOOL_ASSERT(crr == FIRST_BLK_TO_MBC(allctr, blk)); + ERTS_ALC_CPOOL_ASSERT(((erts_aint_t) allctr) + == (erts_smp_atomic_read_nob(&crr->allctr) + & ~FLG_MASK)); - if (ddq_enqueue(&used_allctr->dd.q, BLK2UMEM(blk), cinit)) - erts_alloc_notify_delayed_dealloc(used_allctr->ix); + if (ddq_enqueue(&orig_allctr->dd.q, BLK2UMEM(blk), cinit)) + erts_alloc_notify_delayed_dealloc(orig_allctr->ix); return; } diff --git a/erts/emulator/beam/erl_alloc_util.h b/erts/emulator/beam/erl_alloc_util.h index 5e52b9b733..02cbe5c5d0 100644 --- a/erts/emulator/beam/erl_alloc_util.h +++ b/erts/emulator/beam/erl_alloc_util.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2002-2012. All Rights Reserved. + * Copyright Ericsson AB 2002-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_ao_firstfit_alloc.c b/erts/emulator/beam/erl_ao_firstfit_alloc.c index f73ac2eb6e..4e6c8b317e 100644 --- a/erts/emulator/beam/erl_ao_firstfit_alloc.c +++ b/erts/emulator/beam/erl_ao_firstfit_alloc.c @@ -34,10 +34,11 @@ * sub-tree ('max_sz'). By that we can start from root and keep * left (for low addresses) while dismissing entire sub-trees with * too small blocks. - * AOFFCBF: + * Bestfit within carrier: * The only difference for "bestfit within carrier" is the tree * sorting order. Blocks within the same carrier are sorted - * wrt size instead of address. + * wrt size instead of address. The 'max_sz' field is maintained + * in order to dismiss entire carriers with too small blocks. * * Authors: Rickard Green/Sverker Eriksson */ @@ -67,6 +68,15 @@ # define LEFT_VISITED_FLG (((Uint) 1) << 2) # define RIGHT_VISITED_FLG (((Uint) 1) << 3) #endif +#ifdef DEBUG +# define IS_BF_FLG (((Uint) 1) << 4) +#endif + +#define IS_TREE_NODE(N) (((AOFF_RBTree_t *) (N))->flags & TREE_NODE_FLG) +#define IS_LIST_ELEM(N) (!IS_TREE_NODE(((AOFF_RBTree_t *) (N)))) + +#define SET_TREE_NODE(N) (((AOFF_RBTree_t *) (N))->flags |= TREE_NODE_FLG) +#define SET_LIST_ELEM(N) (((AOFF_RBTree_t *) (N))->flags &= ~TREE_NODE_FLG) #define IS_RED(N) (((AOFF_RBTree_t *) (N)) \ && ((AOFF_RBTree_t *) (N))->flags & RED_FLG) @@ -98,6 +108,16 @@ struct AOFF_RBTree_t_ { }; #define AOFF_BLK_SZ(B) MBC_FBLK_SZ(&(B)->hdr) +/* BF block nodes keeps list of all with equal size + */ +typedef struct { + AOFF_RBTree_t t; + AOFF_RBTree_t *next; +}AOFF_RBTreeList_t; + +#define LIST_NEXT(N) (((AOFF_RBTreeList_t*) (N))->next) +#define LIST_PREV(N) (((AOFF_RBTreeList_t*) (N))->t.parent) + typedef struct AOFF_Carrier_t_ AOFF_Carrier_t; struct AOFF_Carrier_t_ { @@ -119,11 +139,11 @@ struct AOFF_Carrier_t_ { #ifdef HARD_DEBUG # define HARD_CHECK_IS_MEMBER(ROOT,NODE) rbt_assert_is_member(ROOT,NODE) -# define HARD_CHECK_TREE(CRR,BF,ROOT,SZ) check_tree(CRR, BF, ROOT, SZ) -static AOFF_RBTree_t * check_tree(Carrier_t* within_crr, int bestfit, AOFF_RBTree_t* root, Uint); +# define HARD_CHECK_TREE(CRR,FLV,ROOT,SZ) check_tree(CRR, FLV, ROOT, SZ) +static AOFF_RBTree_t * check_tree(Carrier_t* within_crr, enum AOFF_Flavor flavor, AOFF_RBTree_t* root, Uint); #else # define HARD_CHECK_IS_MEMBER(ROOT,NODE) -# define HARD_CHECK_TREE(CRR,BF,ROOT,SZ) +# define HARD_CHECK_TREE(CRR,FLV,ROOT,SZ) #endif @@ -161,25 +181,25 @@ static ERTS_INLINE void lower_max_size(AOFF_RBTree_t *node, else ASSERT(new_max == old_max); } -static ERTS_INLINE SWord cmp_blocks(int bestfit, +static ERTS_INLINE SWord cmp_blocks(enum AOFF_Flavor flavor, AOFF_RBTree_t* lhs, AOFF_RBTree_t* rhs) { ASSERT(lhs != rhs); - ASSERT(!bestfit || FBLK_TO_MBC(&lhs->hdr) == FBLK_TO_MBC(&rhs->hdr)); - if (bestfit) { + ASSERT(flavor == AOFF_AOFF || FBLK_TO_MBC(&lhs->hdr) == FBLK_TO_MBC(&rhs->hdr)); + if (flavor != AOFF_AOFF) { SWord diff = (SWord)AOFF_BLK_SZ(lhs) - (SWord)AOFF_BLK_SZ(rhs); - if (diff) return diff; + if (diff || flavor == AOFF_BF) return diff; } return (char*)lhs - (char*)rhs; } -static ERTS_INLINE SWord cmp_cand_blk(int bestfit, +static ERTS_INLINE SWord cmp_cand_blk(enum AOFF_Flavor flavor, Block_t* cand_blk, AOFF_RBTree_t* rhs) { - if (bestfit) { + if (flavor != AOFF_AOFF) { if (BLK_TO_MBC(cand_blk) == FBLK_TO_MBC(&rhs->hdr)) { SWord diff = (SWord)MBC_BLK_SZ(cand_blk) - (SWord)MBC_FBLK_SZ(&rhs->hdr); - if (diff) return diff; + if (diff || flavor == AOFF_BF) return diff; } } return (char*)cand_blk - (char*)rhs; @@ -198,7 +218,7 @@ static UWord aoff_largest_fblk_in_mbc(Allctr_t*, Carrier_t*); /* Generic tree functions used by both carrier and block trees. */ static void rbt_delete(AOFF_RBTree_t** root, AOFF_RBTree_t* del); -static void rbt_insert(int bestfit, AOFF_RBTree_t** root, AOFF_RBTree_t* blk); +static void rbt_insert(enum AOFF_Flavor flavor, AOFF_RBTree_t** root, AOFF_RBTree_t* blk); static AOFF_RBTree_t* rbt_search(AOFF_RBTree_t* root, Uint size); #ifdef HARD_DEBUG static int rbt_assert_is_member(AOFF_RBTree_t* root, AOFF_RBTree_t* node); @@ -234,21 +254,21 @@ erts_aoffalc_start(AOFFAllctr_t *alc, sys_memcpy((void *) alc, (void *) &zero.allctr, sizeof(AOFFAllctr_t)); - alc->bf_within_carrier = aoffinit->bf_within_carrier; + alc->flavor = aoffinit->flavor; allctr->mbc_header_size = sizeof(AOFF_Carrier_t); allctr->min_mbc_size = MIN_MBC_SZ; allctr->min_mbc_first_free_size = MIN_MBC_FIRST_FREE_SZ; - allctr->min_block_size = sizeof(AOFF_RBTree_t); + allctr->min_block_size = (aoffinit->flavor == AOFF_BF ? + sizeof(AOFF_RBTreeList_t):sizeof(AOFF_RBTree_t)); - allctr->vsn_str = aoffinit->bf_within_carrier ? - ERTS_ALC_AOFF_CBF_ALLOC_VSN_STR : ERTS_ALC_AOFF_ALLOC_VSN_STR; + allctr->vsn_str = ERTS_ALC_AOFF_ALLOC_VSN_STR; /* Callback functions */ allctr->get_free_block = aoff_get_free_block; allctr->link_free_block = aoff_link_free_block; - allctr->unlink_free_block = aoff_unlink_free_block; + allctr->unlink_free_block = aoff_unlink_free_block; allctr->info_options = info_options; allctr->get_next_mbc_size = NULL; @@ -359,9 +379,7 @@ replace(AOFF_RBTree_t **root, AOFF_RBTree_t *x, AOFF_RBTree_t *y) y->parent = x->parent; y->right = x->right; y->left = x->left; - - y->max_sz = x->max_sz; - lower_max_size(y, NULL); + y->max_sz = x->max_sz; } static void @@ -458,23 +476,47 @@ tree_insert_fixup(AOFF_RBTree_t** root, AOFF_RBTree_t *blk) } static void -aoff_unlink_free_block(Allctr_t *allctr, Block_t *del) +aoff_unlink_free_block(Allctr_t *allctr, Block_t *blk) { -#ifdef HARD_DEBUG AOFFAllctr_t* alc = (AOFFAllctr_t*)allctr; -#endif - AOFF_Carrier_t *crr = (AOFF_Carrier_t*) FBLK_TO_MBC(del); + AOFF_RBTree_t* del = (AOFF_RBTree_t*)blk; + AOFF_Carrier_t *crr = (AOFF_Carrier_t*) FBLK_TO_MBC(&del->hdr); ASSERT(crr->rbt_node.hdr.bhdr == crr->root->max_sz); - HARD_CHECK_IS_MEMBER(alc->mbc_root, &crr->rbt_node); - HARD_CHECK_TREE(&crr->crr, alc->bf_within_carrier, crr->root, 0); + HARD_CHECK_TREE(&crr->crr, alc->flavor, crr->root, 0); + + if (alc->flavor == AOFF_BF) { + ASSERT(del->flags & IS_BF_FLG); + if (IS_LIST_ELEM(del)) { + /* Remove from list */ + ASSERT(LIST_PREV(del)); + ASSERT(LIST_PREV(del)->flags & IS_BF_FLG); + LIST_NEXT(LIST_PREV(del)) = LIST_NEXT(del); + if (LIST_NEXT(del)) { + ASSERT(LIST_NEXT(del)->flags & IS_BF_FLG); + LIST_PREV(LIST_NEXT(del)) = LIST_PREV(del); + } + return; + } + else if (LIST_NEXT(del)) { + /* Replace tree node by next element in list... */ + + ASSERT(AOFF_BLK_SZ(LIST_NEXT(del)) == AOFF_BLK_SZ(del)); + ASSERT(IS_LIST_ELEM(LIST_NEXT(del))); + + replace(&crr->root, (AOFF_RBTree_t*)del, LIST_NEXT(del)); + + HARD_CHECK_TREE(&crr->crr, alc->flavor, crr->root, 0); + return; + } + } rbt_delete(&crr->root, (AOFF_RBTree_t*)del); - HARD_CHECK_TREE(&crr->crr, alc->bf_within_carrier, crr->root, 0); + HARD_CHECK_TREE(&crr->crr, alc->flavor, crr->root, 0); - /* Update the carrier tree with a potentially new (lower) max_sz - */ + /* Update the carrier tree with a potentially new (lower) max_sz + */ if (crr->root) { if (crr->rbt_node.hdr.bhdr == crr->root->max_sz) { return; @@ -488,6 +530,7 @@ aoff_unlink_free_block(Allctr_t *allctr, Block_t *del) lower_max_size(&crr->rbt_node, NULL); } + static void rbt_delete(AOFF_RBTree_t** root, AOFF_RBTree_t* del) { @@ -542,7 +585,9 @@ rbt_delete(AOFF_RBTree_t** root, AOFF_RBTree_t* del) } if (y != z) { /* We spliced out the successor of z; replace z by the successor */ + ASSERT(z != &null_x); replace(root, z, y); + lower_max_size(y, NULL); } if (spliced_is_black) { @@ -666,12 +711,11 @@ aoff_link_free_block(Allctr_t *allctr, Block_t *block) ASSERT(allctr == ERTS_ALC_CARRIER_TO_ALLCTR(&blk_crr->crr)); ASSERT(blk_crr->rbt_node.hdr.bhdr == (blk_crr->root ? blk_crr->root->max_sz : 0)); - HARD_CHECK_IS_MEMBER(alc->mbc_root, &blk_crr->rbt_node); - HARD_CHECK_TREE(&blk_crr->crr, alc->bf_within_carrier, blk_crr->root, 0); + HARD_CHECK_TREE(&blk_crr->crr, alc->flavor, blk_crr->root, 0); - rbt_insert(alc->bf_within_carrier, &blk_crr->root, blk); + rbt_insert(alc->flavor, &blk_crr->root, blk); - /* Update the carrier tree with a potential new (larger) max_sz + /* Update the carrier tree with a potentially new (larger) max_sz */ crr_node = &blk_crr->rbt_node; if (blk_sz > crr_node->hdr.bhdr) { @@ -683,15 +727,19 @@ aoff_link_free_block(Allctr_t *allctr, Block_t *block) if (!crr_node) break; } } - HARD_CHECK_TREE(&blk_crr->crr, alc->bf_within_carrier, blk_crr->root, 0); + HARD_CHECK_TREE(&blk_crr->crr, alc->flavor, blk_crr->root, 0); } static void -rbt_insert(int bestfit, AOFF_RBTree_t** root, AOFF_RBTree_t* blk) +rbt_insert(enum AOFF_Flavor flavor, AOFF_RBTree_t** root, AOFF_RBTree_t* blk) { Uint blk_sz = AOFF_BLK_SZ(blk); - blk->flags = 0; +#ifdef DEBUG + blk->flags = (flavor == AOFF_BF) ? IS_BF_FLG : 0; +#else + blk->flags = 0; +#endif blk->left = NULL; blk->right = NULL; blk->max_sz = blk_sz; @@ -704,10 +752,12 @@ rbt_insert(int bestfit, AOFF_RBTree_t** root, AOFF_RBTree_t* blk) else { AOFF_RBTree_t *x = *root; while (1) { + SWord diff; if (x->max_sz < blk_sz) { x->max_sz = blk_sz; } - if (cmp_blocks(bestfit, blk, x) < 0) { + diff = cmp_blocks(flavor, blk, x); + if (diff < 0) { if (!x->left) { blk->parent = x; x->left = blk; @@ -715,7 +765,7 @@ rbt_insert(int bestfit, AOFF_RBTree_t** root, AOFF_RBTree_t* blk) } x = x->left; } - else { + else if (diff > 0) { if (!x->right) { blk->parent = x; x->right = blk; @@ -723,6 +773,18 @@ rbt_insert(int bestfit, AOFF_RBTree_t** root, AOFF_RBTree_t* blk) } x = x->right; } + else { + ASSERT(flavor == AOFF_BF); + ASSERT(blk->flags & IS_BF_FLG); + ASSERT(x->flags & IS_BF_FLG); + SET_LIST_ELEM(blk); + LIST_NEXT(blk) = LIST_NEXT(x); + LIST_PREV(blk) = x; + if (LIST_NEXT(x)) + LIST_PREV(LIST_NEXT(x)) = blk; + LIST_NEXT(x) = blk; + return; + } } /* Insert block into size tree */ @@ -732,6 +794,10 @@ rbt_insert(int bestfit, AOFF_RBTree_t** root, AOFF_RBTree_t* blk) if (IS_RED(blk->parent)) tree_insert_fixup(root, blk); } + if (flavor == AOFF_BF) { + SET_TREE_NODE(blk); + LIST_NEXT(blk) = NULL; + } } static AOFF_RBTree_t* @@ -780,7 +846,7 @@ aoff_get_free_block(Allctr_t *allctr, Uint size, /* Get block within carrier tree */ #ifdef HARD_DEBUG - dbg_blk = HARD_CHECK_TREE(&crr->crr, alc->bf_within_carrier, crr->root, size); + dbg_blk = HARD_CHECK_TREE(&crr->crr, alc->flavor, crr->root, size); #endif blk = rbt_search(crr->root, size); @@ -793,7 +859,7 @@ aoff_get_free_block(Allctr_t *allctr, Uint size, if (!blk) return NULL; - if (cand_blk && cmp_cand_blk(alc->bf_within_carrier, cand_blk, blk) < 0) { + if (cand_blk && cmp_cand_blk(alc->flavor, cand_blk, blk) < 0) { return NULL; /* cand_blk was better */ } @@ -813,7 +879,7 @@ static void aoff_creating_mbc(Allctr_t *allctr, Carrier_t *carrier) /* Link carrier in address order tree */ crr->rbt_node.hdr.bhdr = 0; - rbt_insert(0, root, &crr->rbt_node); + rbt_insert(AOFF_AOFF, root, &crr->rbt_node); /* aoff_link_free_block will add free block later */ crr->root = NULL; @@ -843,7 +909,7 @@ static void aoff_add_mbc(Allctr_t *allctr, Carrier_t *carrier) /* Link carrier in address order tree */ - rbt_insert(0, root, &crr->rbt_node); + rbt_insert(AOFF_AOFF, root, &crr->rbt_node); HARD_CHECK_TREE(NULL, 0, *root, 0); } @@ -883,6 +949,7 @@ static struct { Eterm as; Eterm aoff; Eterm aoffcaobf; + Eterm aoffcbf; #ifdef DEBUG Eterm end_of_atoms; #endif @@ -912,6 +979,7 @@ init_atoms(void) AM_INIT(as); AM_INIT(aoff); AM_INIT(aoffcaobf); + AM_INIT(aoffcbf); #ifdef DEBUG for (atom = (Eterm *) &am; atom < &am.end_of_atoms; atom++) { @@ -943,13 +1011,15 @@ info_options(Allctr_t *allctr, { AOFFAllctr_t* alc = (AOFFAllctr_t*) allctr; Eterm res = THE_NON_VALUE; + const char* flavor_str[3] = {"aoff", "aoffcaobf", "aoffcbf"}; + Eterm flavor_atom[3] = {am.aoff, am.aoffcaobf, am.aoffcbf}; if (print_to_p) { erts_print(*print_to_p, print_to_arg, "%sas: %s\n", prefix, - alc->bf_within_carrier ? "aoffcaobf" : "aoff"); + flavor_str[alc->flavor]); } if (hpp || szp) { @@ -959,8 +1029,7 @@ info_options(Allctr_t *allctr, __FILE__, __LINE__);; res = NIL; - add_2tup(hpp, szp, &res, am.as, - alc->bf_within_carrier ? am.aoffcaobf : am.aoff); + add_2tup(hpp, szp, &res, am.as, flavor_atom[alc->flavor]); } return res; @@ -978,6 +1047,7 @@ UWord erts_aoffalc_test(UWord op, UWord a1, UWord a2) { switch (op) { + case 0x500: return (UWord) ((AOFFAllctr_t *) a1)->flavor == AOFF_AOBF; case 0x501: { AOFF_RBTree_t *node = ((AOFFAllctr_t *) a1)->mbc_root; Uint size = (Uint) a2; @@ -987,10 +1057,13 @@ erts_aoffalc_test(UWord op, UWord a1, UWord a2) case 0x502: return (UWord) ((AOFF_RBTree_t *) a1)->parent; case 0x503: return (UWord) ((AOFF_RBTree_t *) a1)->left; case 0x504: return (UWord) ((AOFF_RBTree_t *) a1)->right; + case 0x505: return (UWord) LIST_NEXT(a1); case 0x506: return (UWord) IS_BLACK((AOFF_RBTree_t *) a1); + case 0x507: return (UWord) IS_TREE_NODE((AOFF_RBTree_t *) a1); case 0x508: return (UWord) 0; /* IS_BF_ALGO */ case 0x509: return (UWord) ((AOFF_RBTree_t *) a1)->max_sz; - case 0x50a: return (UWord) ((AOFFAllctr_t *) a1)->bf_within_carrier; + case 0x50a: return (UWord) ((AOFFAllctr_t *) a1)->flavor == AOFF_BF; + case 0x50b: return (UWord) LIST_PREV(a1); default: ASSERT(0); return ~((UWord) 0); } } @@ -1049,7 +1122,7 @@ static void print_tree(AOFF_RBTree_t*); */ static AOFF_RBTree_t * -check_tree(Carrier_t* within_crr, int bestfit, AOFF_RBTree_t* root, Uint size) +check_tree(Carrier_t* within_crr, enum AOFF_Flavor flavor, AOFF_RBTree_t* root, Uint size) { AOFF_RBTree_t *res = NULL; Sint blacks; @@ -1061,6 +1134,7 @@ check_tree(Carrier_t* within_crr, int bestfit, AOFF_RBTree_t* root, Uint size) #ifdef PRINT_TREE print_tree(root); #endif + ASSERT(within_crr || flavor == AOFF_AOFF); if (!root) return res; @@ -1116,6 +1190,20 @@ check_tree(Carrier_t* within_crr, int bestfit, AOFF_RBTree_t* root, Uint size) ASSERT(crr == within_crr); ASSERT((char*)x > (char*)crr); ASSERT(((char*)x + AOFF_BLK_SZ(x)) <= ((char*)crr + CARRIER_SZ(crr))); + + } + if (flavor == AOFF_BF) { + AOFF_RBTree_t* y = x; + AOFF_RBTree_t* nxt = LIST_NEXT(y); + ASSERT(IS_TREE_NODE(x)); + while (nxt) { + ASSERT(IS_LIST_ELEM(nxt)); + ASSERT(AOFF_BLK_SZ(nxt) == AOFF_BLK_SZ(x)); + ASSERT(FBLK_TO_MBC(&nxt->hdr) == within_crr); + ASSERT(LIST_PREV(nxt) == y); + y = nxt; + nxt = LIST_NEXT(nxt); + } } if (IS_RED(x)) { @@ -1127,13 +1215,13 @@ check_tree(Carrier_t* within_crr, int bestfit, AOFF_RBTree_t* root, Uint size) if (x->left) { ASSERT(x->left->parent == x); - ASSERT(cmp_blocks(bestfit, x->left, x) < 0); + ASSERT(cmp_blocks(flavor, x->left, x) < 0); ASSERT(x->left->max_sz <= x->max_sz); } if (x->right) { ASSERT(x->right->parent == x); - ASSERT(cmp_blocks(bestfit, x->right, x) > 0); + ASSERT(cmp_blocks(flavor, x->right, x) > 0); ASSERT(x->right->max_sz <= x->max_sz); } ASSERT(x->max_sz >= AOFF_BLK_SZ(x)); @@ -1142,7 +1230,7 @@ check_tree(Carrier_t* within_crr, int bestfit, AOFF_RBTree_t* root, Uint size) || x->max_sz == (x->right ? x->right->max_sz : 0)); if (size && AOFF_BLK_SZ(x) >= size) { - if (!res || cmp_blocks(bestfit, x, res) < 0) { + if (!res || cmp_blocks(flavor, x, res) < 0) { res = x; } } diff --git a/erts/emulator/beam/erl_ao_firstfit_alloc.h b/erts/emulator/beam/erl_ao_firstfit_alloc.h index 87427e8e62..25b344c6a8 100644 --- a/erts/emulator/beam/erl_ao_firstfit_alloc.h +++ b/erts/emulator/beam/erl_ao_firstfit_alloc.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2003-2011. All Rights Reserved. + * Copyright Ericsson AB 2003-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -24,12 +24,17 @@ #include "erl_alloc_util.h" #define ERTS_ALC_AOFF_ALLOC_VSN_STR "0.9" -#define ERTS_ALC_AOFF_CBF_ALLOC_VSN_STR "0.9" typedef struct AOFFAllctr_t_ AOFFAllctr_t; +enum AOFF_Flavor { + AOFF_AOFF = 0, + AOFF_AOBF = 1, + AOFF_BF = 2 +}; + typedef struct { - int bf_within_carrier; + enum AOFF_Flavor flavor; } AOFFAllctrInit_t; #define ERTS_DEFAULT_AOFF_ALLCTR_INIT {0/*dummy*/} @@ -52,7 +57,7 @@ struct AOFFAllctr_t_ { Allctr_t allctr; /* Has to be first! */ struct AOFF_RBTree_t_* mbc_root; - int bf_within_carrier; + enum AOFF_Flavor flavor; }; UWord erts_aoffalc_test(UWord, UWord, UWord); diff --git a/erts/emulator/beam/erl_bestfit_alloc.c b/erts/emulator/beam/erl_bestfit_alloc.c index 58e53c3d00..41f449bb28 100644 --- a/erts/emulator/beam/erl_bestfit_alloc.c +++ b/erts/emulator/beam/erl_bestfit_alloc.c @@ -966,15 +966,17 @@ UWord erts_bfalc_test(UWord op, UWord a1, UWord a2) { switch (op) { - case 0x200: return (UWord) ((BFAllctr_t *) a1)->address_order; + case 0x200: return (UWord) ((BFAllctr_t *) a1)->address_order; /* IS_AOBF */ case 0x201: return (UWord) ((BFAllctr_t *) a1)->mbc_root; case 0x202: return (UWord) ((RBTree_t *) a1)->parent; case 0x203: return (UWord) ((RBTree_t *) a1)->left; case 0x204: return (UWord) ((RBTree_t *) a1)->right; - case 0x205: return (UWord) ((RBTreeList_t *) a1)->next; + case 0x205: return (UWord) LIST_NEXT(a1); case 0x206: return (UWord) IS_BLACK((RBTree_t *) a1); case 0x207: return (UWord) IS_TREE_NODE((RBTree_t *) a1); case 0x208: return (UWord) 1; /* IS_BF_ALGO */ + case 0x20a: return (UWord) !((BFAllctr_t *) a1)->address_order; /* IS_BF */ + case 0x20b: return (UWord) LIST_PREV(a1); default: ASSERT(0); return ~((UWord) 0); } } diff --git a/erts/emulator/beam/erl_bestfit_alloc.h b/erts/emulator/beam/erl_bestfit_alloc.h index be8b2b871d..870439e886 100644 --- a/erts/emulator/beam/erl_bestfit_alloc.h +++ b/erts/emulator/beam/erl_bestfit_alloc.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2003-2011. All Rights Reserved. + * Copyright Ericsson AB 2003-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index 74a37f374d..673dfc658c 100755 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -30,6 +30,7 @@ #include "bif.h" #include "big.h" #include "erl_version.h" +#include "erl_compile_flags.h" #include "erl_db_util.h" #include "erl_message.h" #include "erl_binary.h" @@ -2577,74 +2578,14 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1) hp = hsz ? HAlloc(BIF_P, hsz) : NULL; res = erts_bld_uint(&hp, NULL, erts_dist_buf_busy_limit); BIF_RET(res); - } else if (ERTS_IS_ATOM_STR("print_ethread_info", BIF_ARG_1)) { -#if defined(ETHR_NATIVE_ATOMIC32_IMPL) \ - || defined(ETHR_NATIVE_ATOMIC64_IMPL) \ - || defined(ETHR_NATIVE_DW_ATOMIC_IMPL) - int i; - char **str; -#endif -#ifdef ETHR_NATIVE_ATOMIC32_IMPL - erts_printf("32-bit native atomics: %s\n", - ETHR_NATIVE_ATOMIC32_IMPL); - str = ethr_native_atomic32_ops(); - for (i = 0; str[i]; i++) - erts_printf("ethr_native_atomic32_%s()\n", str[i]); -#endif -#ifdef ETHR_NATIVE_ATOMIC64_IMPL - erts_printf("64-bit native atomics: %s\n", - ETHR_NATIVE_ATOMIC64_IMPL); - str = ethr_native_atomic64_ops(); - for (i = 0; str[i]; i++) - erts_printf("ethr_native_atomic64_%s()\n", str[i]); -#endif -#ifdef ETHR_NATIVE_DW_ATOMIC_IMPL - if (ethr_have_native_dw_atomic()) { - erts_printf("Double word native atomics: %s\n", - ETHR_NATIVE_DW_ATOMIC_IMPL); - str = ethr_native_dw_atomic_ops(); - for (i = 0; str[i]; i++) - erts_printf("ethr_native_dw_atomic_%s()\n", str[i]); - str = ethr_native_su_dw_atomic_ops(); - for (i = 0; str[i]; i++) - erts_printf("ethr_native_su_dw_atomic_%s()\n", str[i]); - } -#endif -#ifdef ETHR_NATIVE_SPINLOCK_IMPL - erts_printf("Native spin-locks: %s\n", ETHR_NATIVE_SPINLOCK_IMPL); -#endif -#ifdef ETHR_NATIVE_RWSPINLOCK_IMPL - erts_printf("Native rwspin-locks: %s\n", ETHR_NATIVE_RWSPINLOCK_IMPL); -#endif -#ifdef ETHR_X86_RUNTIME_CONF_HAVE_SSE2__ - erts_printf("SSE2 support: %s\n", (ETHR_X86_RUNTIME_CONF_HAVE_SSE2__ - ? "yes" : "no")); -#endif -#ifdef ETHR_X86_OUT_OF_ORDER - erts_printf("x86" -#ifdef ARCH_64 - "_64" -#endif - " out of order\n"); -#endif -#ifdef ETHR_SPARC_TSO - erts_printf("Sparc TSO\n"); -#endif -#ifdef ETHR_SPARC_PSO - erts_printf("Sparc PSO\n"); -#endif -#ifdef ETHR_SPARC_RMO - erts_printf("Sparc RMO\n"); -#endif -#if defined(ETHR_PPC_HAVE_LWSYNC) - erts_printf("Have lwsync instruction: yes\n"); -#elif defined(ETHR_PPC_HAVE_NO_LWSYNC) - erts_printf("Have lwsync instruction: no\n"); -#elif defined(ETHR_PPC_RUNTIME_CONF_HAVE_LWSYNC__) - erts_printf("Have lwsync instruction: %s (runtime test)\n", - ETHR_PPC_RUNTIME_CONF_HAVE_LWSYNC__ ? "yes" : "no"); -#endif - BIF_RET(am_true); + } else if (ERTS_IS_ATOM_STR("ethread_info", BIF_ARG_1)) { + BIF_RET(erts_get_ethread_info(BIF_P)); + } + else if (ERTS_IS_ATOM_STR("emu_args", BIF_ARG_1)) { + BIF_RET(erts_get_emu_args(BIF_P)); + } + else if (ERTS_IS_ATOM_STR("beam_jump_table", BIF_ARG_1)) { + BIF_RET(erts_beam_jump_table() ? am_true : am_false); } else if (ERTS_IS_ATOM_STR("dynamic_trace", BIF_ARG_1)) { #if defined(USE_DTRACE) @@ -2670,6 +2611,31 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1) BIF_RET(am_true); } #endif + else if (ERTS_IS_ATOM_STR("compile_info",BIF_ARG_1)) { + Uint sz; + Eterm res = NIL, tup, text; + Eterm *hp = HAlloc(BIF_P, 3*(2 + 3) + /* three 2-tuples and three cons */ + 2*(strlen(erts_build_flags_CONFIG_H) + + strlen(erts_build_flags_CFLAGS) + + strlen(erts_build_flags_LDFLAGS))); + + sz = strlen(erts_build_flags_CONFIG_H); + text = buf_to_intlist(&hp, erts_build_flags_CONFIG_H, sz, NIL); + tup = TUPLE2(hp, am_config_h, text); hp += 3; + res = CONS(hp, tup, res); hp += 2; + + sz = strlen(erts_build_flags_CFLAGS); + text = buf_to_intlist(&hp, erts_build_flags_CFLAGS, sz, NIL); + tup = TUPLE2(hp, am_cflags, text); hp += 3; + res = CONS(hp, tup, res); hp += 2; + + sz = strlen(erts_build_flags_LDFLAGS); + text = buf_to_intlist(&hp, erts_build_flags_LDFLAGS, sz, NIL); + tup = TUPLE2(hp, am_ldflags, text); hp += 3; + res = CONS(hp, tup, res); hp += 2; + + BIF_RET(res); + } BIF_ERROR(BIF_P, BADARG); } diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c index 3753b618e1..43eb691338 100644 --- a/erts/emulator/beam/erl_bits.c +++ b/erts/emulator/beam/erl_bits.c @@ -484,8 +484,16 @@ erts_bs_get_float_2(Process *p, Uint num_bits, unsigned flags, ErlBinMatchBuffer ERTS_FP_ERROR_THOROUGH(p, f32, return THE_NON_VALUE); f.fd = f32; } else { +#ifdef DOUBLE_MIDDLE_ENDIAN + FloatDef ftmp; + ftmp.fd = f64; + f.fw[0] = ftmp.fw[1]; + f.fw[1] = ftmp.fw[0]; + ERTS_FP_ERROR_THOROUGH(p, f.fd, return THE_NON_VALUE); +#else ERTS_FP_ERROR_THOROUGH(p, f64, return THE_NON_VALUE); f.fd = f64; +#endif } mb->offset += num_bits; hp = HeapOnlyAlloc(p, FLOAT_SIZE_OBJECT); @@ -1014,8 +1022,13 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags) #endif } else if (is_small(arg)) { u.f64 = (double) signed_val(arg); +#ifdef DOUBLE_MIDDLE_ENDIAN + a = u.i32[1]; + b = u.i32[0]; +#else a = u.i32[0]; b = u.i32[1]; +#endif } else if (is_big(arg)) { if (big_to_double(arg, &u.f64) < 0) { return 0; @@ -1118,21 +1131,42 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags) byte *bptr; double f64; float f32; +#ifdef DOUBLE_MIDDLE_ENDIAN + FloatDef fbuf, ftmp; +#endif if (num_bits == 64) { if (is_float(arg)) { +#ifdef DOUBLE_MIDDLE_ENDIAN + FloatDef *fdp = (FloatDef*)(float_val(arg) + 1); + ftmp = *fdp; +#else bptr = (byte *) (float_val(arg) + 1); +#endif } else if (is_small(arg)) { f64 = (double) signed_val(arg); +#ifdef DOUBLE_MIDDLE_ENDIAN + ftmp.fd = f64; +#else bptr = (byte *) &f64; +#endif } else if (is_big(arg)) { if (big_to_double(arg, &f64) < 0) { return 0; } +#ifdef DOUBLE_MIDDLE_ENDIAN + ftmp.fd = f64; +#else bptr = (byte *) &f64; +#endif } else { return 0; } +#ifdef DOUBLE_MIDDLE_ENDIAN + fbuf.fw[0] = ftmp.fw[1]; + fbuf.fw[1] = ftmp.fw[0]; + bptr = fbuf.fb; +#endif } else if (num_bits == 32) { if (is_float(arg)) { FloatDef f; diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index 0d12e658d9..8ba94d89e9 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -1964,6 +1964,17 @@ setup_rootset(Process *p, Eterm *objv, int nobj, Rootset *rootset) ++n; } + /* + * A trapping BIF can add to rootset by setting the extra_root + * in the process_structure. + */ + if (p->extra_root != NULL) { + roots[n].v = p->extra_root->objv; + roots[n].sz = p->extra_root->sz; + ++n; + } + + ASSERT((is_nil(p->seq_trace_token) || is_tuple(follow_moved(p->seq_trace_token)) || is_atom(p->seq_trace_token))); @@ -2541,6 +2552,12 @@ offset_one_rootset(Process *p, Sint offs, char* area, Uint area_size, p->dictionary->used, offs, area, area_size); } + if (p->extra_root != NULL) { + offset_heap_ptr(p->extra_root->objv, + p->extra_root->sz, + offs, area, area_size); + } + offset_heap_ptr(&p->fvalue, 1, offs, area, area_size); offset_heap_ptr(&p->ftrace, 1, offs, area, area_size); offset_heap_ptr(&p->seq_trace_token, 1, offs, area, area_size); diff --git a/erts/emulator/beam/erl_goodfit_alloc.h b/erts/emulator/beam/erl_goodfit_alloc.h index 11bef77e7f..385de0da23 100644 --- a/erts/emulator/beam/erl_goodfit_alloc.h +++ b/erts/emulator/beam/erl_goodfit_alloc.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2003-2010. All Rights Reserved. + * Copyright Ericsson AB 2003-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index b3a3c3d403..8d137df7ae 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -340,6 +340,7 @@ erl_init(int ncpu, erts_init_bif_binary(); erts_init_bif_re(); erts_init_unicode(); /* after RE to get access to PCRE unicode */ + erts_init_external(); erts_delay_trap = erts_export_put(am_erlang, am_delay_trap, 2); erts_late_init_process(); #if HAVE_ERTS_MSEG @@ -636,6 +637,8 @@ early_init(int *argc, char **argv) /* char envbuf[21]; /* enough for any 64-bit integer */ size_t envbufsz; + erts_save_emu_args(*argc, argv); + erts_sched_compact_load = 1; erts_printf_eterm_func = erts_printf_term; erts_disable_tolerant_timeofday = 0; @@ -1479,6 +1482,22 @@ erl_start(int argc, char **argv) ("suggested scheduler thread stack size %d kilo words\n", erts_sched_thread_suggested_stack_size)); } + else if (has_prefix("fwi", sub_param)) { + long val; + arg = get_arg(sub_param+3, argv[i+1], &i); + errno = 0; + val = strtol(arg, NULL, 10); + if (errno != 0 || val < 0) { + erts_fprintf(stderr, + "bad scheduler forced wakeup " + "interval %s\n", + arg); + erts_usage(); + } +#ifdef ERTS_SMP + erts_runq_supervision_interval = val; +#endif + } else { erts_fprintf(stderr, "bad scheduling option %s\n", argv[i]); erts_usage(); diff --git a/erts/emulator/beam/erl_lock_check.c b/erts/emulator/beam/erl_lock_check.c index 2ac5e24d3a..2114d0c001 100644 --- a/erts/emulator/beam/erl_lock_check.c +++ b/erts/emulator/beam/erl_lock_check.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2005-2012. All Rights Reserved. + * Copyright Ericsson AB 2005-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index d4c2b5bdcc..48f8be8dd3 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -310,9 +310,6 @@ int enif_send(ErlNifEnv* env, const ErlNifPid* to_pid, Process* rp; Process* c_p; ErlHeapFragment* frags; -#if defined(ERTS_ENABLE_LOCK_CHECK) && defined(ERTS_SMP) - ErtsProcLocks rp_had_locks; -#endif Eterm receiver = to_pid->pid; int flush_me = 0; int scheduler = erts_get_scheduler_id() != 0; @@ -332,10 +329,6 @@ int enif_send(ErlNifEnv* env, const ErlNifPid* to_pid, #endif } -#if defined(ERTS_ENABLE_LOCK_CHECK) && defined(ERTS_SMP) - rp_had_locks = rp_locks; -#endif - rp = (scheduler ? erts_proc_lookup(receiver) : erts_pid2proc_opt(c_p, ERTS_PROC_LOCK_MAIN, diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c index e688e55c88..c6d136f951 100644 --- a/erts/emulator/beam/erl_node_tables.c +++ b/erts/emulator/beam/erl_node_tables.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2001-2012. All Rights Reserved. + * Copyright Ericsson AB 2001-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_port_task.h b/erts/emulator/beam/erl_port_task.h index d35a15c27b..e4d964146e 100644 --- a/erts/emulator/beam/erl_port_task.h +++ b/erts/emulator/beam/erl_port_task.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2006-2012. All Rights Reserved. + * Copyright Ericsson AB 2006-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index 3d161f2aa0..2439a46ab6 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -246,6 +246,10 @@ static erts_smp_atomic32_t function_calls; #ifdef ERTS_SMP static erts_smp_atomic32_t doing_sys_schedule; static erts_smp_atomic32_t no_empty_run_queues; +long erts_runq_supervision_interval = 0; +static ethr_event runq_supervision_event; +static erts_tid_t runq_supervisor_tid; +static erts_atomic_t runq_supervisor_sleeping; #else /* !ERTS_SMP */ ErtsSchedulerData *erts_scheduler_data; #endif @@ -2045,7 +2049,13 @@ empty_runq(ErtsRunQueue *rq) */ ASSERT(0 <= empty && empty < 2*erts_no_run_queues); #endif - erts_smp_atomic32_inc_relb(&no_empty_run_queues); + if (!erts_runq_supervision_interval) + erts_smp_atomic32_inc_relb(&no_empty_run_queues); + else { + erts_smp_atomic32_inc_mb(&no_empty_run_queues); + if (erts_atomic_read_nob(&runq_supervisor_sleeping)) + ethr_event_set(&runq_supervision_event); + } } } @@ -2062,7 +2072,14 @@ non_empty_runq(ErtsRunQueue *rq) */ ASSERT(0 < empty && empty <= 2*erts_no_run_queues); #endif - erts_smp_atomic32_dec_relb(&no_empty_run_queues); + if (!erts_runq_supervision_interval) + erts_smp_atomic32_dec_relb(&no_empty_run_queues); + else { + erts_aint32_t no; + no = erts_smp_atomic32_dec_read_mb(&no_empty_run_queues); + if (no > 0 && erts_atomic_read_nob(&runq_supervisor_sleeping)) + ethr_event_set(&runq_supervision_event); + } } } @@ -2666,7 +2683,6 @@ try_inc_no_active_runqs(int active) return 0; } - static ERTS_INLINE int chk_wake_sched(ErtsRunQueue *crq, int ix, int activate) { @@ -4332,6 +4348,53 @@ set_wakeup_other_data(void) } } +static int +no_runqs_to_supervise(void) +{ + int used; + erts_aint32_t nerq = erts_smp_atomic32_read_acqb(&no_empty_run_queues); + if (nerq <= 0) + return 0; + get_no_runqs(NULL, &used); + if (nerq >= used) + return 0; + return used; +} + +static void * +runq_supervisor(void *unused) +{ + while (1) { + int ix, no_rqs; + + erts_milli_sleep(erts_runq_supervision_interval); + no_rqs = no_runqs_to_supervise(); + if (!no_rqs) { + erts_atomic_set_nob(&runq_supervisor_sleeping, 1); + while (1) { + ethr_event_reset(&runq_supervision_event); + no_rqs = no_runqs_to_supervise(); + if (no_rqs) { + erts_atomic_set_nob(&runq_supervisor_sleeping, 0); + break; + } + ethr_event_wait(&runq_supervision_event); + } + } + + for (ix = 0; ix < no_rqs; ix++) { + ErtsRunQueue *rq = ERTS_RUNQ_IX(ix); + if (ERTS_RUNQ_FLGS_GET(rq) & ERTS_RUNQ_FLG_NONEMPTY) { + erts_smp_runq_lock(rq); + if (rq->len != 0) + wake_scheduler_on_empty_runq(rq); /* forced wakeup... */ + erts_smp_runq_unlock(rq); + } + } + } + return NULL; +} + #endif void @@ -5755,6 +5818,22 @@ erts_start_schedulers(void) ethr_thr_opts opts = ETHR_THR_OPTS_DEFAULT_INITER; opts.detached = 1; + +#ifdef ERTS_SMP + if (erts_runq_supervision_interval) { + opts.suggested_stack_size = 16; + erts_atomic_init_nob(&runq_supervisor_sleeping, 0); + if (0 != ethr_event_init(&runq_supervision_event)) + erl_exit(1, "Failed to create run-queue supervision event\n"); + if (0 != ethr_thr_create(&runq_supervisor_tid, + runq_supervisor, + NULL, + &opts)) + erl_exit(1, "Failed to create run-queue supervision thread\n"); + + } +#endif + opts.suggested_stack_size = erts_sched_thread_suggested_stack_size; if (wanted < 1) @@ -7513,6 +7592,7 @@ erl_create_process(Process* parent, /* Parent of process (default group leader). p->htop = p->heap; p->heap_sz = sz; p->catches = 0; + p->extra_root = NULL; p->bin_vheap_sz = p->min_vheap_size; p->bin_old_vheap_sz = p->min_vheap_size; @@ -8945,6 +9025,12 @@ erts_continue_exit_process(Process *p) if (pbt) erts_free(ERTS_ALC_T_BPD, (void *) pbt); + if (p->extra_root != NULL) { + (p->extra_root->cleanup)(p->extra_root); /* Should deallocate + whole structure */ + p->extra_root = NULL; + } + delete_process(p); #ifdef ERTS_SMP diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h index 3c1edfad7a..8e5467f196 100644 --- a/erts/emulator/beam/erl_process.h +++ b/erts/emulator/beam/erl_process.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2012. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -387,6 +387,10 @@ struct ErtsRunQueue_ { } ports; }; +#ifdef ERTS_SMP +extern long erts_runq_supervision_interval; +#endif + typedef union { ErtsRunQueue runq; char align[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(sizeof(ErtsRunQueue))]; @@ -699,6 +703,14 @@ struct ErtsPendingSuspend_ { #endif + +typedef struct ErlExtraRootSet_ ErlExtraRootSet; +struct ErlExtraRootSet_ { + Eterm *objv; + Uint sz; + void (*cleanup)(ErlExtraRootSet *); +}; + /* Defines to ease the change of memory architecture */ # define HEAP_START(p) (p)->heap # define HEAP_TOP(p) (p)->htop @@ -792,6 +804,8 @@ struct process { ErlMessageQueue msg; /* Message queue */ + ErlExtraRootSet *extra_root; /* Used by trapping BIF's */ + union { ErtsBifTimer *bif_timers; /* Bif timers aiming at this process */ void *terminate; @@ -1976,6 +1990,7 @@ erts_sched_poke(ErtsSchedulerSleepInfo *ssi) } } + #endif /* #if ERTS_GLB_INLINE_INCL_FUNC_DEF */ #endif /* #ifdef ERTS_SMP */ diff --git a/erts/emulator/beam/erl_ptab.c b/erts/emulator/beam/erl_ptab.c index 8da135b2c8..d69619dd44 100644 --- a/erts/emulator/beam/erl_ptab.c +++ b/erts/emulator/beam/erl_ptab.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2012. All Rights Reserved. + * Copyright Ericsson AB 2012-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -1435,7 +1435,7 @@ erts_ptab_test_next_id(ErtsPTab *ptab, int set, Uint next) aid_ix = max_ix; else aid_ix--; - ASSERT((aid_ix & max_ix) == (((Uint32) erts_atomic32_read_nob(&ptab->vola.tile.fid_ix)) & max_ix)); + ASSERT((aid_ix & max_ix) == (((Uint32) erts_smp_atomic32_read_nob(&ptab->vola.tile.fid_ix)) & max_ix)); #endif } diff --git a/erts/emulator/beam/erl_ptab.h b/erts/emulator/beam/erl_ptab.h index 84ff7d0de4..c2d8bd9cad 100644 --- a/erts/emulator/beam/erl_ptab.h +++ b/erts/emulator/beam/erl_ptab.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2012. All Rights Reserved. + * Copyright Ericsson AB 2012-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_thr_progress.h b/erts/emulator/beam/erl_thr_progress.h index 1aeecf2b06..5f392944c2 100644 --- a/erts/emulator/beam/erl_thr_progress.h +++ b/erts/emulator/beam/erl_thr_progress.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2011-2012. All Rights Reserved. + * Copyright Ericsson AB 2011-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c index bb6ed44523..fa015ee4b9 100644 --- a/erts/emulator/beam/erl_trace.c +++ b/erts/emulator/beam/erl_trace.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1999-2012. All Rights Reserved. + * Copyright Ericsson AB 1999-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_trace.h b/erts/emulator/beam/erl_trace.h index 54d3aafdda..853c6cb0d8 100644 --- a/erts/emulator/beam/erl_trace.h +++ b/erts/emulator/beam/erl_trace.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2012. All Rights Reserved. + * Copyright Ericsson AB 2012-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/beam/erl_utils.h b/erts/emulator/beam/erl_utils.h index a2064bd8a3..80d29d554a 100644 --- a/erts/emulator/beam/erl_utils.h +++ b/erts/emulator/beam/erl_utils.h @@ -24,6 +24,8 @@ #include "erl_smp.h" #include "erl_printf.h" +struct process; + typedef struct { #ifdef DEBUG int smp_api; @@ -155,6 +157,9 @@ Uint32 block_hash(byte *, unsigned, Uint32); Uint32 make_hash2(Eterm); Uint32 make_hash(Eterm); +void erts_save_emu_args(int argc, char **argv); +Eterm erts_get_emu_args(struct process *c_p); +Eterm erts_get_ethread_info(struct process * c_p); Eterm erts_bld_atom(Uint **hpp, Uint *szp, char *str); Eterm erts_bld_uint(Uint **hpp, Uint *szp, Uint ui); diff --git a/erts/emulator/beam/erl_zlib.c b/erts/emulator/beam/erl_zlib.c index f73d48b6c2..47fd92988e 100644 --- a/erts/emulator/beam/erl_zlib.c +++ b/erts/emulator/beam/erl_zlib.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2009. All Rights Reserved. + * Copyright Ericsson AB 2009-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -44,6 +44,48 @@ void erl_zlib_zfree_callback (voidpf opaque, voidpf ptr) erts_free(ERTS_ALC_T_ZLIB, ptr); } +/* + * Initialize a z_stream with a source, to later *chunk* data into a destination + * Returns Z_OK or Error. + */ +int ZEXPORT erl_zlib_deflate_start(z_stream *streamp, const Bytef* source, + uLong sourceLen, int level) +{ + streamp->next_in = (Bytef*)source; + streamp->avail_in = (uInt)sourceLen; + streamp->total_out = streamp->avail_out = 0; + streamp->next_out = NULL; + erl_zlib_alloc_init(streamp); + return deflateInit(streamp, level); +} +/* + * Deflate a chunk, The destination length is the limit. + * Returns Z_OK if more to process, Z_STREAM_END if we are done. + */ +int ZEXPORT erl_zlib_deflate_chunk(z_stream *streamp, Bytef* dest, uLongf* destLen) +{ + int err; + uLongf last_tot = streamp->total_out; + + streamp->next_out = dest; + streamp->avail_out = (uInt)*destLen; + + if ((uLong)streamp->avail_out != *destLen) return Z_BUF_ERROR; + + err = deflate(streamp, Z_FINISH); + *destLen = streamp->total_out - last_tot; + return err; +} + + +/* + * When we are done, free up the deflate structure + * Retyurns Z_OK or Error + */ +int ZEXPORT erl_zlib_deflate_finish(z_stream *streamp) +{ + return deflateEnd(streamp); +} int ZEXPORT erl_zlib_compress2 (Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen, diff --git a/erts/emulator/beam/erl_zlib.h b/erts/emulator/beam/erl_zlib.h index 9054a5e428..5ac849d21c 100644 --- a/erts/emulator/beam/erl_zlib.h +++ b/erts/emulator/beam/erl_zlib.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2009. All Rights Reserved. + * Copyright Ericsson AB 2009-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -31,6 +31,14 @@ (s)->zfree = erl_zlib_zfree_callback; \ } while (0) +/* + * Chunked interface, used by term_to_binary among others. + */ +int ZEXPORT erl_zlib_deflate_start(z_stream *streamp, const Bytef* source, + uLong sourceLen, int level); +int ZEXPORT erl_zlib_deflate_chunk(z_stream *streamp, Bytef* dest, uLongf* destLen); +int ZEXPORT erl_zlib_deflate_finish(z_stream *streamp); + /* Use instead of compress */ #define erl_zlib_compress(dest,destLen,source,sourceLen) \ diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 8420cfae24..1c88765381 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -81,7 +81,11 @@ * */ +static Export term_to_binary_trap_export; + static byte* enc_term(ErtsAtomCacheMap *, Eterm, byte*, Uint32, struct erl_off_heap_header** off_heap); +static int enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, + struct erl_off_heap_header** off_heap, Sint *reds, byte **res); static Uint is_external_string(Eterm obj, int* p_is_string); static byte* enc_atom(ErtsAtomCacheMap *, Eterm, byte*, Uint32); static byte* enc_pid(ErtsAtomCacheMap *, Eterm, byte*, Uint32); @@ -89,9 +93,31 @@ static byte* dec_term(ErtsDistExternal *, Eterm**, byte*, ErlOffHeap*, Eterm*); static byte* dec_atom(ErtsDistExternal *, byte*, Eterm*); static byte* dec_pid(ErtsDistExternal *, Eterm**, byte*, ErlOffHeap*, Eterm*); static Sint decoded_size(byte *ep, byte* endp, int internal_tags); +static BIF_RETTYPE term_to_binary_trap_1(BIF_ALIST_1); +static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint flags, + Binary *context_b); static Uint encode_size_struct2(ErtsAtomCacheMap *, Eterm, unsigned); +static int encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj, + unsigned dflags, Sint *reds, Uint *res); + +void erts_init_external(void) { +#if 1 /* In R16 */ + erts_init_trap_export(&term_to_binary_trap_export, + am_erlang, am_term_to_binary_trap, 1, + &term_to_binary_trap_1); +#else + sys_memset((void *) &term_to_binary_trap_export, 0, sizeof(Export)); + term_to_binary_trap_export.address = &term_to_binary_trap_export.code[3]; + term_to_binary_trap_export.code[0] = am_erlang; + term_to_binary_trap_export.code[1] = am_term_to_binary_trap; + term_to_binary_trap_export.code[2] = 1; + term_to_binary_trap_export.code[3] = (BeamInstr) em_apply_bif; + term_to_binary_trap_export.code[4] = (BeamInstr) &term_to_binary_trap_1; +#endif + return; +} #define ERTS_MAX_INTERNAL_ATOM_CACHE_ENTRIES 255 @@ -1009,10 +1035,28 @@ BIF_RETTYPE erts_debug_dist_ext_to_term_2(BIF_ALIST_2) BIF_ERROR(BIF_P, BADARG); } - +static BIF_RETTYPE term_to_binary_trap_1(BIF_ALIST_1) +{ + Eterm *tp = tuple_val(BIF_ARG_1); + Eterm Term = tp[1]; + Eterm bt = tp[2]; + Binary *bin = ((ProcBin *) binary_val(bt))->val; + Eterm res = erts_term_to_binary_int(BIF_P, Term, 0, 0,bin); + if (is_tuple(res)) { + BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res); + } else { + BIF_RET(res); + } +} + BIF_RETTYPE term_to_binary_1(BIF_ALIST_1) { - return erts_term_to_binary(BIF_P, BIF_ARG_1, 0, TERM_TO_BINARY_DFLAGS); + Eterm res = erts_term_to_binary_int(BIF_P, BIF_ARG_1, 0, TERM_TO_BINARY_DFLAGS, NULL); + if (is_tuple(res)) { + BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res); + } else { + BIF_RET(res); + } } BIF_RETTYPE term_to_binary_2(BIF_ALIST_2) @@ -1022,6 +1066,8 @@ BIF_RETTYPE term_to_binary_2(BIF_ALIST_2) Eterm Flags = BIF_ARG_2; int level = 0; Uint flags = TERM_TO_BINARY_DFLAGS; + Eterm res; + Binary *bin = NULL; while (is_list(Flags)) { Eterm arg = CAR(list_val(Flags)); @@ -1058,7 +1104,12 @@ BIF_RETTYPE term_to_binary_2(BIF_ALIST_2) goto error; } - return erts_term_to_binary(p, Term, level, flags); + res = erts_term_to_binary_int(p, Term, level, flags, bin); + if (is_tuple(res)) { + BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res); + } else { + BIF_RET(res); + } } static uLongf binary2term_uncomp_size(byte* data, Sint size) @@ -1335,16 +1386,13 @@ external_size_2(BIF_ALIST_2) } } -Eterm -erts_term_to_binary(Process* p, Eterm Term, int level, Uint flags) +static Eterm +erts_term_to_binary_simple(Process* p, Eterm Term, Uint size, int level, Uint flags) { - Uint size; Eterm bin; size_t real_size; byte* endp; - size = encode_size_struct2(NULL, Term, flags) + 1 /* VERSION_MAGIC */; - if (level != 0) { byte buf[256]; byte* bytes = buf; @@ -1414,6 +1462,327 @@ erts_term_to_binary(Process* p, Eterm Term, int level, Uint flags) } } +Eterm +erts_term_to_binary(Process* p, Eterm Term, int level, Uint flags) { + Uint size; + size = encode_size_struct2(NULL, Term, flags) + 1 /* VERSION_MAGIC */; + return erts_term_to_binary_simple(p, Term, size, level, flags); +} + +/* Define for testing */ +/* #define EXTREME_TTB_TRAPPING 1 */ + +#ifndef EXTREME_TTB_TRAPPING +#define TERM_TO_BINARY_LOOP_FACTOR 500 +#define TERM_TO_BINARY_SIZE_FACTOR 500000 +#define TERM_TO_BINARY_COMPRESS_CHUNK 500000 +#else +#define TERM_TO_BINARY_LOOP_FACTOR 1 +#define TERM_TO_BINARY_SIZE_FACTOR 10 +#define TERM_TO_BINARY_COMPRESS_CHUNK 10 +#endif + + +typedef enum { TTBSize, TTBEncode, TTBCompress } TTBState; +typedef struct { + Uint flags; + int level; +} TTBSizeContext; + +typedef struct { + Uint flags; + int level; + Binary *result_bin; +} TTBEncodeContext; + +typedef struct { + Uint real_size; + Uint dest_len; + byte *dbytes; + Binary *result_bin; + Binary *destination_bin; + z_stream stream; +} TTBCompressContext; + +typedef struct { + int alive; + TTBState state; + union { + TTBSizeContext sc; + TTBEncodeContext ec; + TTBCompressContext cc; + } s; +} TTBContext; + +static void context_destructor(Binary *context_bin) +{ + TTBContext *context = ERTS_MAGIC_BIN_DATA(context_bin); + if (context->alive) { + context->alive = 0; + switch (context->state) { + case TTBSize: + break; + case TTBEncode: + if (context->s.ec.result_bin != NULL) { /* Set to NULL if ever made alive! */ + ASSERT(erts_refc_read(&(context->s.ec.result_bin->refc),0) == 0); + erts_bin_free(context->s.ec.result_bin); + context->s.ec.result_bin = NULL; + } + break; + case TTBCompress: + erl_zlib_deflate_finish(&(context->s.cc.stream)); + + if (context->s.cc.destination_bin != NULL) { /* Set to NULL if ever made alive! */ + ASSERT(erts_refc_read(&(context->s.cc.destination_bin->refc),0) == 0); + erts_bin_free(context->s.cc.destination_bin); + context->s.cc.destination_bin = NULL; + } + + if (context->s.cc.result_bin != NULL) { /* Set to NULL if ever made alive! */ + ASSERT(erts_refc_read(&(context->s.cc.result_bin->refc),0) == 0); + erts_bin_free(context->s.cc.result_bin); + context->s.cc.result_bin = NULL; + } + break; + } + } +} + +static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint flags, + Binary *context_b) +{ + Eterm *hp; + Eterm res; + Eterm c_term; +#ifndef EXTREME_TTB_TRAPPING + Sint reds = (Sint) (ERTS_BIF_REDS_LEFT(p) * TERM_TO_BINARY_LOOP_FACTOR); +#else + Sint reds = 20; /* For testing */ +#endif + Sint initial_reds = reds; + TTBContext c_buff; + TTBContext *context = &c_buff; + +#define EXPORT_CONTEXT() \ + do { \ + if (context_b == NULL) { \ + context_b = erts_create_magic_binary(sizeof(TTBContext), \ + context_destructor); \ + context = ERTS_MAGIC_BIN_DATA(context_b); \ + memcpy(context,&c_buff,sizeof(TTBContext)); \ + } \ + } while (0) + +#define RETURN_STATE() \ + do { \ + hp = HAlloc(p, PROC_BIN_SIZE+3); \ + c_term = erts_mk_magic_binary_term(&hp, &MSO(p), context_b); \ + res = TUPLE2(hp, Term, c_term); \ + BUMP_ALL_REDS(p); \ + return res; \ + } while (0); + + + if (context_b == NULL) { + /* Setup enough to get started */ + context->state = TTBSize; + context->alive = 1; + context->s.sc.flags = flags; + context->s.sc.level = level; + } else { + context = ERTS_MAGIC_BIN_DATA(context_b); + } + /* Initialization done, now we will go through the states */ + for (;;) { + switch (context->state) { + case TTBSize: + { + Uint size; + Binary *result_bin; + int level; + Uint flags; + /* Try for fast path */ + if (encode_size_struct_int(p, NULL, Term, context->s.sc.flags, &reds, &size) < 0) { + EXPORT_CONTEXT(); + /* Same state */ + RETURN_STATE(); + } + ++size; /* VERSION_MAGIC */ + /* Move these to next state */ + flags = context->s.sc.flags; + level = context->s.sc.level; + if (size <= ERL_ONHEAP_BIN_LIMIT) { + /* Finish in one go */ + res = erts_term_to_binary_simple(p, Term, size, + level, flags); + BUMP_REDS(p, size / TERM_TO_BINARY_SIZE_FACTOR); + return res; + } + + result_bin = erts_bin_nrml_alloc(size); + result_bin->flags = 0; + result_bin->orig_size = size; + erts_refc_init(&result_bin->refc, 0); + result_bin->orig_bytes[0] = VERSION_MAGIC; + /* Next state immediately, no need to export context */ + context->state = TTBEncode; + context->s.ec.flags = flags; + context->s.ec.level = level; + context->s.ec.result_bin = result_bin; + break; + } + case TTBEncode: + { + byte *endp; + byte *bytes = (byte *) context->s.ec.result_bin->orig_bytes; + size_t real_size; + Binary *result_bin; + + flags = context->s.ec.flags; + if (enc_term_int(p,NULL,Term, bytes+1, flags, NULL, &reds, &endp) < 0) { + EXPORT_CONTEXT(); + RETURN_STATE(); + } + real_size = endp - bytes; + result_bin = erts_bin_realloc(context->s.ec.result_bin,real_size); + level = context->s.ec.level; + BUMP_REDS(p, (initial_reds - reds) / TERM_TO_BINARY_LOOP_FACTOR); + if (level == 0 || real_size < 6) { /* We are done */ + ProcBin* pb; + return_normal: + context->s.ec.result_bin = NULL; + context->alive = 0; + pb = (ProcBin *) HAlloc(p, PROC_BIN_SIZE); + pb->thing_word = HEADER_PROC_BIN; + pb->size = real_size; + pb->next = MSO(p).first; + MSO(p).first = (struct erl_off_heap_header*)pb; + pb->val = result_bin; + pb->bytes = (byte*) result_bin->orig_bytes; + pb->flags = 0; + OH_OVERHEAD(&(MSO(p)), pb->size / sizeof(Eterm)); + erts_refc_inc(&result_bin->refc, 1); + if (context_b && erts_refc_read(&context_b->refc,0) == 0) { + erts_bin_free(context_b); + } + return make_binary(pb); + } + /* Continue with compression... */ + /* To make absolutely sure that zlib does not barf on a reallocated context, + we make sure it's "exported" before doing anything compession-like */ + EXPORT_CONTEXT(); + bytes = (byte *) result_bin->orig_bytes; /* result_bin is reallocated */ + if (erl_zlib_deflate_start(&(context->s.cc.stream),bytes+1,real_size-1,level) + != Z_OK) { + goto return_normal; + } + context->state = TTBCompress; + context->s.cc.real_size = real_size; + context->s.cc.result_bin = result_bin; + + result_bin = erts_bin_nrml_alloc(real_size); + result_bin->flags = 0; + result_bin->orig_size = real_size; + erts_refc_init(&result_bin->refc, 0); + result_bin->orig_bytes[0] = VERSION_MAGIC; + + context->s.cc.destination_bin = result_bin; + context->s.cc.dest_len = 0; + context->s.cc.dbytes = (byte *) result_bin->orig_bytes+6; + break; + } + case TTBCompress: + { + uLongf tot_dest_len = context->s.cc.real_size - 6; + uLongf left = (tot_dest_len - context->s.cc.dest_len); + uLongf this_time = (left > TERM_TO_BINARY_COMPRESS_CHUNK) ? + TERM_TO_BINARY_COMPRESS_CHUNK : + left; + Binary *result_bin; + ProcBin *pb; + Uint max = (ERTS_BIF_REDS_LEFT(p) * TERM_TO_BINARY_COMPRESS_CHUNK) / CONTEXT_REDS; + + if (max < this_time) { + this_time = max + 1; /* do not set this_time to 0 */ + } + + res = erl_zlib_deflate_chunk(&(context->s.cc.stream), context->s.cc.dbytes, &this_time); + context->s.cc.dbytes += this_time; + context->s.cc.dest_len += this_time; + switch (res) { + case Z_OK: + if (context->s.cc.dest_len >= tot_dest_len) { + goto no_use_compressing; + } + RETURN_STATE(); + case Z_STREAM_END: + { + byte *dbytes = (byte *) context->s.cc.destination_bin->orig_bytes + 1; + + dbytes[0] = COMPRESSED; + put_int32(context->s.cc.real_size-1,dbytes+1); + erl_zlib_deflate_finish(&(context->s.cc.stream)); + result_bin = erts_bin_realloc(context->s.cc.destination_bin, + context->s.cc.dest_len+6); + context->s.cc.destination_bin = NULL; + pb = (ProcBin *) HAlloc(p, PROC_BIN_SIZE); + pb->thing_word = HEADER_PROC_BIN; + pb->size = context->s.cc.dest_len+6; + pb->next = MSO(p).first; + MSO(p).first = (struct erl_off_heap_header*)pb; + pb->val = result_bin; + pb->bytes = (byte*) result_bin->orig_bytes; + pb->flags = 0; + OH_OVERHEAD(&(MSO(p)), pb->size / sizeof(Eterm)); + erts_refc_inc(&result_bin->refc, 1); + erts_bin_free(context->s.cc.result_bin); + context->s.cc.result_bin = NULL; + context->alive = 0; + BUMP_REDS(p, (this_time * CONTEXT_REDS) / TERM_TO_BINARY_COMPRESS_CHUNK); + if (context_b && erts_refc_read(&context_b->refc,0) == 0) { + erts_bin_free(context_b); + } + return make_binary(pb); + } + default: /* Compression error, revert to uncompressed binary (still in + context) */ + no_use_compressing: + result_bin = context->s.cc.result_bin; + context->s.cc.result_bin = NULL; + pb = (ProcBin *) HAlloc(p, PROC_BIN_SIZE); + pb->thing_word = HEADER_PROC_BIN; + pb->size = context->s.cc.real_size; + pb->next = MSO(p).first; + MSO(p).first = (struct erl_off_heap_header*)pb; + pb->val = result_bin; + pb->bytes = (byte*) result_bin->orig_bytes; + pb->flags = 0; + OH_OVERHEAD(&(MSO(p)), pb->size / sizeof(Eterm)); + erts_refc_inc(&result_bin->refc, 1); + erl_zlib_deflate_finish(&(context->s.cc.stream)); + erts_bin_free(context->s.cc.destination_bin); + context->s.cc.destination_bin = NULL; + context->alive = 0; + BUMP_REDS(p, (this_time * CONTEXT_REDS) / TERM_TO_BINARY_COMPRESS_CHUNK); + if (context_b && erts_refc_read(&context_b->refc,0) == 0) { + erts_bin_free(context_b); + } + return make_binary(pb); + } + } + } + } +#undef EXPORT_CONTEXT +#undef RETURN_STATE +} + + + + + + + + /* * This function fills ext with the external format of atom. * If it's an old atom we just supply an index, otherwise @@ -1678,32 +2047,71 @@ dec_pid(ErtsDistExternal *edep, Eterm** hpp, byte* ep, ErlOffHeap* off_heap, Ete #define ENC_PATCH_FUN_SIZE ((Eterm) 2) #define ENC_LAST_ARRAY_ELEMENT ((Eterm) 3) +/* Free extra rootset (used when trapping) */ +static void cleanup_ttb_extra_root(ErlExtraRootSet *rs) +{ + if (rs->objv != NULL) { + erts_free(ERTS_ALC_T_EXTRA_ROOT, rs->objv); + } + erts_free(ERTS_ALC_T_EXTRA_ROOT, rs); +} + +/* Same as above, but we have an extra "stack" beyond GC reach, i.e. an array of two extra roots */ +static void cleanup_ttb_extra_root_2(ErlExtraRootSet *rs) +{ + if (rs->objv != NULL) { + erts_free(ERTS_ALC_T_EXTRA_ROOT, rs->objv); + } + if (rs[1].objv != NULL) { + erts_free(ERTS_ALC_T_EXTRA_ROOT, rs[1].objv); + } + + erts_free(ERTS_ALC_T_EXTRA_ROOT, rs); +} + static byte* enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, struct erl_off_heap_header** off_heap) { - DECLARE_WSTACK(s); + byte *res; + (void) enc_term_int(NULL, acmp, obj, ep, dflags, off_heap, NULL, &res); + return res; +} + +static int +enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, + struct erl_off_heap_header** off_heap, Sint *reds, byte **res) +{ + DECLARE_ESTACK(s); + DECLARE_WSTACK(com); Uint n; Uint i; Uint j; Uint* ptr; Eterm val; FloatDef f; -#if HALFWORD_HEAP - UWord wobj; -#endif + int count_reds = (p != NULL && reds != NULL); + Sint r = 0; + + if (count_reds) { + ESTACK_CHANGE_ALLOCATOR(s, ERTS_ALC_T_EXTRA_ROOT); + WSTACK_CHANGE_ALLOCATOR(com, ERTS_ALC_T_EXTRA_ROOT); + r = *reds; + } + if (p && p->extra_root) { /* restore saved stacks and byte pointer */ + ESTACK_RESTORE(s,p->extra_root[0].objv, p->extra_root[0].sz); + obj = ESTACK_POP(s); + WSTACK_RESTORE(com, p->extra_root[1].objv, p->extra_root[1].sz); + ep = (byte *) WSTACK_POP(com); + } goto L_jump_start; outer_loop: - while (!WSTACK_ISEMPTY(s)) { -#if HALFWORD_HEAP - obj = (Eterm) (wobj = WSTACK_POP(s)); -#else - obj = WSTACK_POP(s); -#endif - switch (val = WSTACK_POP(s)) { + while (!ESTACK_ISEMPTY(s)) { + obj = ESTACK_POP(s); + switch (val = WSTACK_POP(com)) { case ENC_TERM: break; case ENC_ONE_CONS: @@ -1714,45 +2122,57 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, obj = CAR(cons); tl = CDR(cons); - WSTACK_PUSH(s, is_list(tl) ? ENC_ONE_CONS : ENC_TERM); - WSTACK_PUSH(s, tl); + WSTACK_PUSH(com, is_list(tl) ? ENC_ONE_CONS : ENC_TERM); + ESTACK_PUSH(s, tl); } break; case ENC_PATCH_FUN_SIZE: + /* obj will be discarded, it was NIL */ { -#if HALFWORD_HEAP - byte* size_p = (byte *) wobj; -#else - byte* size_p = (byte *) obj; -#endif + byte* size_p = (byte *) WSTACK_POP(com); put_int32(ep - size_p, size_p); } goto outer_loop; case ENC_LAST_ARRAY_ELEMENT: + /* obj is the tuple */ { -#if HALFWORD_HEAP - Eterm* ptr = (Eterm *) wobj; -#else - Eterm* ptr = (Eterm *) obj; -#endif - obj = *ptr; + Eterm* ptr = tuple_val(obj); + i = arityval(*ptr); + obj = ptr[i]; } break; default: /* ENC_LAST_ARRAY_ELEMENT+1 and upwards */ { -#if HALFWORD_HEAP - Eterm* ptr = (Eterm *) wobj; -#else - Eterm* ptr = (Eterm *) obj; -#endif - obj = *ptr++; - WSTACK_PUSH(s, val-1); - WSTACK_PUSH(s, (UWord) ptr); + Eterm* ptr = tuple_val(obj); + i = arityval(*ptr); + ESTACK_PUSH(s, obj); /* put back tuple and next element index */ + WSTACK_PUSH(com, val-1); + obj = ptr[i - (val - ENC_LAST_ARRAY_ELEMENT)]; /* the index is counting down */ } break; } L_jump_start: + + if (count_reds && --r == 0) { + *reds = r; + ESTACK_PUSH(s,obj); /* push back current object, to be popped on restore */ + WSTACK_PUSH(com,((UWord) ep)); + if (p->extra_root == NULL) { + /* NB. Allocate an array of two "extra-roots", of which only the first element + is seen and handled by the GC. Index 1 holds the Wstack. */ + p->extra_root = erts_alloc(ERTS_ALC_T_EXTRA_ROOT, sizeof(ErlExtraRootSet)*2); + p->extra_root->objv = NULL; + p->extra_root->sz = 0; + p->extra_root->cleanup = cleanup_ttb_extra_root_2; + p->extra_root[1].objv = NULL; + p->extra_root[1].sz = 0; + p->extra_root[1].cleanup = NULL; /* Never used */ + } + ESTACK_SAVE(s, p->extra_root[0].objv, p->extra_root[0].sz); + WSTACK_SAVE(com, p->extra_root[1].objv, (p->extra_root[1].sz)); + return -1; + } switch(tag_val_def(obj)) { case NIL_DEF: *ep++ = NIL_EXT; @@ -1896,8 +2316,8 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, ep += 4; } if (i > 0) { - WSTACK_PUSH(s, ENC_LAST_ARRAY_ELEMENT+i-1); - WSTACK_PUSH(s, (UWord) ptr); + WSTACK_PUSH(com, ENC_LAST_ARRAY_ELEMENT+i-1); + ESTACK_PUSH(s, obj); } break; @@ -1905,7 +2325,7 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, GET_DOUBLE(obj, f); if (dflags & DFLAG_NEW_FLOATS) { *ep++ = NEW_FLOAT_EXT; -#ifdef WORDS_BIGENDIAN +#if defined(WORDS_BIGENDIAN) || defined(DOUBLE_MIDDLE_ENDIAN) put_int32(f.fw[0], ep); ep += 4; put_int32(f.fw[1], ep); @@ -2041,8 +2461,9 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, int ei; *ep++ = NEW_FUN_EXT; - WSTACK_PUSH(s, ENC_PATCH_FUN_SIZE); - WSTACK_PUSH(s, (UWord) ep); /* Position for patching in size */ + WSTACK_PUSH(com, (UWord) ep); /* Position for patching in size */ + WSTACK_PUSH(com, ENC_PATCH_FUN_SIZE); + ESTACK_PUSH(s,NIL); /* Will be thrown away */ ep += 4; *ep = funp->arity; ep += 1; @@ -2059,8 +2480,8 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, fun_env: for (ei = funp->num_free-1; ei > 0; ei--) { - WSTACK_PUSH(s, ENC_TERM); - WSTACK_PUSH(s, (UWord) funp->env[ei]); + WSTACK_PUSH(com, ENC_TERM); + ESTACK_PUSH(s, (UWord) funp->env[ei]); } if (funp->num_free != 0) { obj = funp->env[0]; @@ -2103,8 +2524,17 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags, break; } } - DESTROY_WSTACK(s); - return ep; + DESTROY_ESTACK(s); + DESTROY_WSTACK(com); + if (p && p->extra_root) { + cleanup_ttb_extra_root_2(p->extra_root); + p->extra_root = NULL; + } + if (count_reds) { + *reds = r; + } + *res = ep; + return 0; } static @@ -2374,7 +2804,7 @@ dec_term_atom_common: volatile unsigned long *fpexnp = erts_get_current_fp_exception(); #endif -#ifdef WORDS_BIGENDIAN +#if defined(WORDS_BIGENDIAN) || defined(DOUBLE_MIDDLE_ENDIAN) ff.fw[0] = get_int32(ep); ep += 4; ff.fw[1] = get_int32(ep); @@ -2892,51 +3322,47 @@ dec_term_atom_common: to a sequence of bytes N.B. That this must agree with to_external2() above!!! (except for cached atoms) */ +static Uint encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dflags) { + Uint res; + (void) encode_size_struct_int(NULL, acmp, obj, dflags, NULL, &res); + return res; +} -static Uint -encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dflags) +static int +encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj, + unsigned dflags, Sint *reds, Uint *res) { - DECLARE_WSTACK(s); + DECLARE_ESTACK(s); Uint m, i, arity; Uint result = 0; -#if HALFWORD_HEAP - UWord wobj = 0; -#endif + int count_reds = (p != NULL && reds != 0); + Sint r = 0; + + if (count_reds) { + ESTACK_CHANGE_ALLOCATOR(s, ERTS_ALC_T_EXTRA_ROOT); + r = *reds; + } + + if (p && p->extra_root) { /* restore saved stack */ + ESTACK_RESTORE(s,p->extra_root->objv, p->extra_root->sz + 1); + result = ESTACK_POP(s); /*Untagged, beyond p->extra_root->sz */ + obj = ESTACK_POP(s); + + } goto L_jump_start; outer_loop: - while (!WSTACK_ISEMPTY(s)) { -#if HALFWORD_HEAP - obj = (Eterm) (wobj = WSTACK_POP(s)); -#else - obj = WSTACK_POP(s); -#endif + while (!ESTACK_ISEMPTY(s)) { + obj = ESTACK_POP(s); handle_popped_obj: - if (is_CP(obj)) { /* Does not look for CP, looks for "no tag" */ -#if HALFWORD_HEAP - Eterm* ptr = (Eterm *) wobj; -#else - Eterm* ptr = (Eterm *) obj; -#endif - /* - * Pointer into a tuple. - */ - obj = *ptr--; - if (!is_header(obj)) { - WSTACK_PUSH(s, (UWord)ptr); - } else { - /* Reached tuple header */ - ASSERT(header_is_arityval(obj)); - goto outer_loop; - } - } else if (is_list(obj)) { + if (is_list(obj)) { Eterm* cons = list_val(obj); Eterm tl; tl = CDR(cons); obj = CAR(cons); - WSTACK_PUSH(s, tl); + ESTACK_PUSH(s, tl); } else if (is_nil(obj)) { result++; goto outer_loop; @@ -2948,6 +3374,20 @@ encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dflags) } L_jump_start: + if (count_reds && --r == 0) { + *reds = r; + ESTACK_PUSH(s,obj); /* push back current object */ + ESTACK_PUSH(s,result); /* Untagged, will be out of GC reach */ + if (p->extra_root == NULL) { + p->extra_root = erts_alloc(ERTS_ALC_T_EXTRA_ROOT, sizeof(ErlExtraRootSet)); + p->extra_root->objv = NULL; + p->extra_root->sz = 0; + p->extra_root->cleanup = cleanup_ttb_extra_root; + } + ESTACK_SAVE(s, p->extra_root->objv, p->extra_root->sz); + --p->extra_root->sz; /* Hide result from GC */ + return -1; + } switch (tag_val_def(obj)) { case NIL_DEF: result++; @@ -3034,20 +3474,24 @@ encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dflags) case TUPLE_DEF: { Eterm* ptr = tuple_val(obj); - + Uint i; arity = arityval(*ptr); if (arity <= 0xff) { result += 1 + 1; } else { result += 1 + 4; } - ptr += arity; -#if HALFWORD_HEAP - obj = (Eterm) (wobj = (UWord) ptr); -#else - obj = (Eterm) ptr; -#endif - goto handle_popped_obj; + for (i = 1; i <= arity; ++i) { + if (is_list(ptr[i])) { + if ((m = is_string(obj)) && (m < MAX_STRING_LEN)) { + result += m + 2 + 1; + } else { + result += 5; + } + } + ESTACK_PUSH(s,ptr[i]); + } + goto outer_loop; } break; case FLOAT_DEF: @@ -3105,14 +3549,14 @@ encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dflags) if (is_not_list(obj)) { /* Push any non-list terms on the stack */ - WSTACK_PUSH(s, obj); + ESTACK_PUSH(s, obj); } else { /* Lists must be handled specially. */ if ((m = is_string(obj)) && (m < MAX_STRING_LEN)) { result += m + 2 + 1; } else { result += 5; - WSTACK_PUSH(s, obj); + ESTACK_PUSH(s, obj); } } } @@ -3143,8 +3587,16 @@ encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dflags) } } - DESTROY_WSTACK(s); - return result; + DESTROY_ESTACK(s); + if (p && p->extra_root) { + cleanup_ttb_extra_root(p->extra_root); + p->extra_root = NULL; + } + if (count_reds) { + *reds = r; + } + *res = result; + return 0; } static Sint diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index 12eb3bfb7c..cecfa8a0fd 100755 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -376,7 +376,7 @@ extern int stackdump_on_exit; */ -void erl_grow_stack(Eterm** start, Eterm** sp, Eterm** end); +void erl_grow_stack(ErtsAlcType_t a_type, Eterm** start, Eterm** sp, Eterm** end); #define ESTK_CONCAT(a,b) a##b #define ESTK_SUBSCRIPT(s,i) *((Eterm *)((byte *)ESTK_CONCAT(s,_start) + (i))) #define DEF_ESTACK_SIZE (16) @@ -385,20 +385,79 @@ void erl_grow_stack(Eterm** start, Eterm** sp, Eterm** end); Eterm ESTK_CONCAT(s,_default_stack)[DEF_ESTACK_SIZE]; \ Eterm* ESTK_CONCAT(s,_start) = ESTK_CONCAT(s,_default_stack); \ Eterm* ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start); \ - Eterm* ESTK_CONCAT(s,_end) = ESTK_CONCAT(s,_start) + DEF_ESTACK_SIZE + Eterm* ESTK_CONCAT(s,_end) = ESTK_CONCAT(s,_start) + DEF_ESTACK_SIZE;\ + ErtsAlcType_t ESTK_CONCAT(s,_alloc_type) = ERTS_ALC_T_ESTACK + +#define ESTACK_CHANGE_ALLOCATOR(s,t) \ +do { \ + if (ESTK_CONCAT(s,_start) != ESTK_CONCAT(s,_default_stack)) { \ + erl_exit(1, "Internal error - trying to change allocator " \ + "type of active estack\n"); \ + } \ + ESTK_CONCAT(s,_alloc_type) = (t); \ + } while (0) + +/* + * Do not free the stack after this, it may have pointers into what + * was saved in 'v'. 'v' and 'vsize' are changed by this macro. If + * 'v' points to anything, it should have been allocated by a previous + * call to this macro. Be careful to set a correct allocator prior to + * saving. + * 'v' can be any lvalue pointer, it will point to an array of UWord + * after calling this macro. + */ +#define ESTACK_SAVE(s,v,vsize) /* v and vsize are "name parameters" */ \ +do { \ + Uint _esz = ESTACK_COUNT(s); \ + if (ESTK_CONCAT(s,_start) == ESTK_CONCAT(s,_default_stack)) { \ + if ((v) == NULL) { \ + (v) = erts_alloc(ESTK_CONCAT(s,_alloc_type), \ + DEF_ESTACK_SIZE * sizeof(Eterm)); \ + } \ + memcpy((v),ESTK_CONCAT(s,_start),_esz*sizeof(Eterm)); \ + } else { \ + (v) = (void *) ESTK_CONCAT(s,_start); \ + } \ + (vsize) = _esz; \ + } while (0) + +/* + * Use on empty stack, only the allocator can be changed before this + * The vector parameter is reset to NULL if the vector is moved to stack, + * otherwise it's kept for reuse, so a saved and restored vector might + * need freeing using the correct allocator parameter. + * 'v' can be any lvalue pointer, it's cast to an (Eterm *). + */ +#define ESTACK_RESTORE(s, v, vsize) /*v is a "name parameter"*/ \ +do { \ + if ((vsize) > DEF_ESTACK_SIZE) { \ + Uint _ca = DEF_ESTACK_SIZE; \ + while (_ca < (vsize)) \ + _ca = _ca * 2; \ + ESTK_CONCAT(s,_start) = (Eterm *) (v); \ + ESTK_CONCAT(s,_end) = ((Eterm *)(v)) + _ca; \ + ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start) + (vsize); \ + (v) = NULL; \ + } else { \ + memcpy(ESTK_CONCAT(s,_start),(v),(vsize)*sizeof(Eterm));\ + ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start) + (vsize); \ + } \ + } while (0) + +#define ESTACK_IS_STATIC(s) (ESTK_CONCAT(s,_start) == ESTK_CONCAT(s,_default_stack)) #define DESTROY_ESTACK(s) \ do { \ if (ESTK_CONCAT(s,_start) != ESTK_CONCAT(s,_default_stack)) { \ - erts_free(ERTS_ALC_T_ESTACK, ESTK_CONCAT(s,_start)); \ + erts_free(ESTK_CONCAT(s,_alloc_type), ESTK_CONCAT(s,_start)); \ } \ } while(0) #define ESTACK_PUSH(s, x) \ do { \ if (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_end)) { \ - erl_grow_stack(&ESTK_CONCAT(s,_start), &ESTK_CONCAT(s,_sp), \ - &ESTK_CONCAT(s,_end)); \ + erl_grow_stack(ESTK_CONCAT(s,_alloc_type),&ESTK_CONCAT(s,_start), \ + &ESTK_CONCAT(s,_sp), &ESTK_CONCAT(s,_end)); \ } \ *ESTK_CONCAT(s,_sp)++ = (x); \ } while(0) @@ -406,8 +465,8 @@ do { \ #define ESTACK_PUSH2(s, x, y) \ do { \ if (ESTK_CONCAT(s,_sp) > ESTK_CONCAT(s,_end) - 2) { \ - erl_grow_stack(&ESTK_CONCAT(s,_start), &ESTK_CONCAT(s,_sp), \ - &ESTK_CONCAT(s,_end)); \ + erl_grow_stack(ESTK_CONCAT(s,_alloc_type),&ESTK_CONCAT(s,_start), \ + &ESTK_CONCAT(s,_sp), &ESTK_CONCAT(s,_end)); \ } \ *ESTK_CONCAT(s,_sp)++ = (x); \ *ESTK_CONCAT(s,_sp)++ = (y); \ @@ -430,7 +489,7 @@ do { \ #define ESTACK_POP(s) (*(--ESTK_CONCAT(s,_sp))) -void erl_grow_wstack(UWord** start, UWord** sp, UWord** end); +void erl_grow_wstack(ErtsAlcType_t a_type, UWord** start, UWord** sp, UWord** end); #define WSTK_CONCAT(a,b) a##b #define WSTK_SUBSCRIPT(s,i) *((UWord *)((byte *)WSTK_CONCAT(s,_start) + (i))) #define DEF_WSTACK_SIZE (16) @@ -439,20 +498,79 @@ void erl_grow_wstack(UWord** start, UWord** sp, UWord** end); UWord WSTK_CONCAT(s,_default_stack)[DEF_WSTACK_SIZE]; \ UWord* WSTK_CONCAT(s,_start) = WSTK_CONCAT(s,_default_stack); \ UWord* WSTK_CONCAT(s,_sp) = WSTK_CONCAT(s,_start); \ - UWord* WSTK_CONCAT(s,_end) = WSTK_CONCAT(s,_start) + DEF_WSTACK_SIZE + UWord* WSTK_CONCAT(s,_end) = WSTK_CONCAT(s,_start) + DEF_WSTACK_SIZE; \ + ErtsAlcType_t WSTK_CONCAT(s,_alloc_type) = ERTS_ALC_T_ESTACK + +#define WSTACK_CHANGE_ALLOCATOR(s,t) \ +do { \ + if (WSTK_CONCAT(s,_start) != WSTK_CONCAT(s,_default_stack)) { \ + erl_exit(1, "Internal error - trying to change allocator " \ + "type of active wstack\n"); \ + } \ + WSTK_CONCAT(s,_alloc_type) = (t); \ + } while (0) #define DESTROY_WSTACK(s) \ do { \ if (WSTK_CONCAT(s,_start) != WSTK_CONCAT(s,_default_stack)) { \ - erts_free(ERTS_ALC_T_ESTACK, WSTK_CONCAT(s,_start)); \ + erts_free(WSTK_CONCAT(s,_alloc_type), WSTK_CONCAT(s,_start)); \ } \ } while(0) +/* + * Do not free the stack after this, it may have pointers into what + * was saved in 'v'. 'v' and 'vsize' are changed by this macro. If + * 'v' points to anything, it should have been allocated by a previous + * call to this macro. Be careful to set a correct allocator prior to + * saving. + * 'v' can be any lvalue pointer, it will point to an array of UWord + * after calling this macro. + */ +#define WSTACK_SAVE(s,v,vsize) /* v and vsize are "name parameters" */ \ +do { \ + Uint _wsz = WSTACK_COUNT(s); \ + if (WSTK_CONCAT(s,_start) == WSTK_CONCAT(s,_default_stack)) { \ + if ((v) == NULL) { \ + (v) = erts_alloc(WSTK_CONCAT(s,_alloc_type), \ + DEF_WSTACK_SIZE * sizeof(UWord)); \ + } \ + memcpy((v),WSTK_CONCAT(s,_start),_wsz*sizeof(UWord)); \ + } else { \ + (v) = (void *) WSTK_CONCAT(s,_start); \ + } \ + (vsize) = _wsz; \ + } while (0) + +/* + * Use on empty stack, only the allocator can be changed before this + * The vector parameter is reset to NULL if the vector is moved to stack, + * otherwise it's kept for reuse, so a saved and restored vector might + * need freeing using the correct allocator parameter. + * 'v' can be any lvalue pointer, it's cast to an (UWord *). + */ +#define WSTACK_RESTORE(s, v, vsize) /*v is a "name parameter"*/ \ +do { \ + if ((vsize) > DEF_WSTACK_SIZE) { \ + Uint _ca = DEF_WSTACK_SIZE; \ + while (_ca < (vsize)) \ + _ca = _ca * 2; \ + WSTK_CONCAT(s,_start) = (UWord *) (v); \ + WSTK_CONCAT(s,_end) = ((UWord *)(v)) + _ca; \ + WSTK_CONCAT(s,_sp) = WSTK_CONCAT(s,_start) + (vsize); \ + (v) = NULL; \ + } else { \ + memcpy(WSTK_CONCAT(s,_start),(v),(vsize)*sizeof(UWord));\ + WSTK_CONCAT(s,_sp) = WSTK_CONCAT(s,_start) + (vsize); \ + } \ + } while (0) + +#define WSTACK_IS_STATIC(s) (WSTK_CONCAT(s,_start) == WSTK_CONCAT(s,_default_stack)) + #define WSTACK_PUSH(s, x) \ do { \ if (WSTK_CONCAT(s,_sp) == WSTK_CONCAT(s,_end)) { \ - erl_grow_wstack(&WSTK_CONCAT(s,_start), &WSTK_CONCAT(s,_sp), \ - &WSTK_CONCAT(s,_end)); \ + erl_grow_wstack(WSTK_CONCAT(s,_alloc_type), &WSTK_CONCAT(s,_start), \ + &WSTK_CONCAT(s,_sp), &WSTK_CONCAT(s,_end)); \ } \ *WSTK_CONCAT(s,_sp)++ = (x); \ } while(0) @@ -460,8 +578,8 @@ do { \ #define WSTACK_PUSH2(s, x, y) \ do { \ if (WSTK_CONCAT(s,_sp) > WSTK_CONCAT(s,_end) - 2) { \ - erl_grow_wstack(&WSTK_CONCAT(s,_start), &WSTK_CONCAT(s,_sp), \ - &WSTK_CONCAT(s,_end)); \ + erl_grow_wstack(WSTK_CONCAT(s,_alloc_type), &WSTK_CONCAT(s,_start), \ + &WSTK_CONCAT(s,_sp), &WSTK_CONCAT(s,_end)); \ } \ *WSTK_CONCAT(s,_sp)++ = (x); \ *WSTK_CONCAT(s,_sp)++ = (y); \ @@ -470,8 +588,8 @@ do { \ #define WSTACK_PUSH3(s, x, y, z) \ do { \ if (WSTK_CONCAT(s,_sp) > WSTK_CONCAT(s,_end) - 3) { \ - erl_grow_wstack(&WSTK_CONCAT(s,_start), &WSTK_CONCAT(s,_sp), \ - &WSTK_CONCAT(s,_end)); \ + erl_grow_wstack(WSTK_CONCAT(s,_alloc_type), &WSTK_CONCAT(s,_start), \ + &WSTK_CONCAT(s,_sp), &WSTK_CONCAT(s,_end)); \ } \ *WSTK_CONCAT(s,_sp)++ = (x); \ *WSTK_CONCAT(s,_sp)++ = (y); \ @@ -773,6 +891,9 @@ Sint erts_re_set_loop_limit(Sint limit); void erts_init_bif_binary(void); Sint erts_binary_set_loop_limit(Sint limit); +/* external.c */ +void erts_init_external(void); + /* erl_unicode.c */ void erts_init_unicode(void); Sint erts_unicode_set_loop_limit(Sint limit); @@ -816,7 +937,7 @@ char* Sint_to_buf(Sint, struct Sint_buf*); #define ERTS_IOLIST_OVERFLOW 1 #define ERTS_IOLIST_TYPE 2 -Eterm buf_to_intlist(Eterm**, char*, size_t, Eterm); /* most callers pass plain char*'s */ +Eterm buf_to_intlist(Eterm**, const char*, size_t, Eterm); /* most callers pass plain char*'s */ #define ERTS_IOLIST_TO_BUF_OVERFLOW (~((ErlDrvSizeT) 0)) #define ERTS_IOLIST_TO_BUF_TYPE_ERROR (~((ErlDrvSizeT) 1)) @@ -921,6 +1042,8 @@ extern erts_driver_t vanilla_driver; extern erts_driver_t spawn_driver; extern erts_driver_t fd_driver; +int erts_beam_jump_table(void); + /* Should maybe be placed in erl_message.h, but then we get an include mess. */ ERTS_GLB_INLINE Eterm * erts_alloc_message_heap_state(Uint size, @@ -1096,6 +1219,13 @@ erts_alloc_message_heap(Uint size, # define UnUseTmpHeapNoproc(Size) /* Nothing */ #endif /* HEAP_ON_C_STACK */ +ERTS_GLB_INLINE void dtrace_pid_str(Eterm pid, char *process_buf); +ERTS_GLB_INLINE void dtrace_proc_str(Process *process, char *process_buf); +ERTS_GLB_INLINE void dtrace_port_str(Port *port, char *port_buf); +ERTS_GLB_INLINE void dtrace_fun_decode(Process *process, + Eterm module, Eterm function, int arity, + char *process_buf, char *mfa_buf); + #if ERTS_GLB_INLINE_INCL_FUNC_DEF #include "dtrace-wrapper.h" diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c index 01e130bd64..c1e66b59af 100644 --- a/erts/emulator/beam/io.c +++ b/erts/emulator/beam/io.c @@ -4842,7 +4842,7 @@ erts_stale_drv_select(Eterm port, if (drv_port == ERTS_INVALID_ERL_DRV_PORT) { Port *prt = erts_port_lookup_raw(port); if (prt) - drv_port = ERTS_Port2ErlDrvPort(port); + drv_port = ERTS_Port2ErlDrvPort(prt); else drv_port = ERTS_INVALID_ERL_DRV_PORT; } diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c index 0a833f7e66..bd2be7afca 100644 --- a/erts/emulator/beam/utils.c +++ b/erts/emulator/beam/utils.c @@ -185,15 +185,15 @@ erts_set_hole_marker(Eterm* ptr, Uint sz) * Helper function for the ESTACK macros defined in global.h. */ void -erl_grow_stack(Eterm** start, Eterm** sp, Eterm** end) +erl_grow_stack(ErtsAlcType_t a_type, Eterm** start, Eterm** sp, Eterm** end) { Uint old_size = (*end - *start); Uint new_size = old_size * 2; Uint sp_offs = *sp - *start; if (new_size > 2 * DEF_ESTACK_SIZE) { - *start = erts_realloc(ERTS_ALC_T_ESTACK, (void *) *start, new_size*sizeof(Eterm)); + *start = erts_realloc(a_type, (void *) *start, new_size*sizeof(Eterm)); } else { - Eterm* new_ptr = erts_alloc(ERTS_ALC_T_ESTACK, new_size*sizeof(Eterm)); + Eterm* new_ptr = erts_alloc(a_type, new_size*sizeof(Eterm)); sys_memcpy(new_ptr, *start, old_size*sizeof(Eterm)); *start = new_ptr; } @@ -204,15 +204,15 @@ erl_grow_stack(Eterm** start, Eterm** sp, Eterm** end) * Helper function for the ESTACK macros defined in global.h. */ void -erl_grow_wstack(UWord** start, UWord** sp, UWord** end) +erl_grow_wstack(ErtsAlcType_t a_type, UWord** start, UWord** sp, UWord** end) { Uint old_size = (*end - *start); Uint new_size = old_size * 2; Uint sp_offs = *sp - *start; if (new_size > 2 * DEF_ESTACK_SIZE) { - *start = erts_realloc(ERTS_ALC_T_ESTACK, (void *) *start, new_size*sizeof(UWord)); + *start = erts_realloc(a_type, (void *) *start, new_size*sizeof(UWord)); } else { - UWord* new_ptr = erts_alloc(ERTS_ALC_T_ESTACK, new_size*sizeof(UWord)); + UWord* new_ptr = erts_alloc(a_type, new_size*sizeof(UWord)); sys_memcpy(new_ptr, *start, old_size*sizeof(UWord)); *start = new_ptr; } @@ -1319,7 +1319,7 @@ make_hash2(Eterm term) { FloatDef ff; GET_DOUBLE(term, ff); -#if defined(WORDS_BIGENDIAN) +#if defined(WORDS_BIGENDIAN) || defined(DOUBLE_MIDDLE_ENDIAN) UINT32_HASH_2(ff.fw[0], ff.fw[1], HCONST_12); #else UINT32_HASH_2(ff.fw[1], ff.fw[0], HCONST_12); @@ -2983,7 +2983,7 @@ char* Sint_to_buf(Sint n, struct Sint_buf *buf) */ Eterm -buf_to_intlist(Eterm** hpp, char *buf, size_t len, Eterm tail) +buf_to_intlist(Eterm** hpp, const char *buf, size_t len, Eterm tail) { Eterm* hp = *hpp; size_t i = len; @@ -3466,6 +3466,291 @@ erts_free_read_env(void *value) erts_free(ERTS_ALC_T_TMP, value); } + +typedef struct { + size_t sz; + char *ptr; +} ErtsEmuArg; + +typedef struct { + int argc; + ErtsEmuArg *arg; + size_t no_bytes; +} ErtsEmuArgs; + +ErtsEmuArgs saved_emu_args = {0}; + +void +erts_save_emu_args(int argc, char **argv) +{ +#ifdef DEBUG + char *end_ptr; +#endif + char *ptr; + int i; + size_t arg_sz[100]; + size_t size; + + ASSERT(!saved_emu_args.argc); + + size = sizeof(ErtsEmuArg)*argc; + for (i = 0; i < argc; i++) { + size_t sz = sys_strlen(argv[i]); + if (i < sizeof(arg_sz)/sizeof(arg_sz[0])) + arg_sz[i] = sz; + size += sz+1; + } + ptr = (char *) malloc(size); +#ifdef DEBUG + end_ptr = ptr + size; +#endif + saved_emu_args.arg = (ErtsEmuArg *) ptr; + ptr += sizeof(ErtsEmuArg)*argc; + saved_emu_args.argc = argc; + saved_emu_args.no_bytes = 0; + for (i = 0; i < argc; i++) { + size_t sz; + if (i < sizeof(arg_sz)/sizeof(arg_sz[0])) + sz = arg_sz[i]; + else + sz = sys_strlen(argv[i]); + saved_emu_args.arg[i].ptr = ptr; + saved_emu_args.arg[i].sz = sz; + saved_emu_args.no_bytes += sz; + ptr += sz+1; + sys_strcpy(saved_emu_args.arg[i].ptr, argv[i]); + } + ASSERT(ptr == end_ptr); +} + +Eterm +erts_get_emu_args(Process *c_p) +{ +#ifdef DEBUG + Eterm *end_hp; +#endif + int i; + Uint hsz; + Eterm *hp, res; + + hsz = saved_emu_args.no_bytes*2; + hsz += saved_emu_args.argc*2; + + hp = HAlloc(c_p, hsz); +#ifdef DEBUG + end_hp = hp + hsz; +#endif + res = NIL; + + for (i = saved_emu_args.argc-1; i >= 0; i--) { + Eterm arg = buf_to_intlist(&hp, + saved_emu_args.arg[i].ptr, + saved_emu_args.arg[i].sz, + NIL); + res = CONS(hp, arg, res); + hp += 2; + } + + ASSERT(hp == end_hp); + + return res; +} + + +Eterm +erts_get_ethread_info(Process *c_p) +{ + Uint sz, *szp; + Eterm res, *hp, **hpp, *end_hp = NULL; + + sz = 0; + szp = &sz; + hpp = NULL; + + while (1) { + Eterm tup, list, name; +#if defined(ETHR_NATIVE_ATOMIC32_IMPL) \ + || defined(ETHR_NATIVE_ATOMIC64_IMPL) \ + || defined(ETHR_NATIVE_DW_ATOMIC_IMPL) + char buf[1024]; + int i; + char **str; +#endif + + res = NIL; + +#ifdef ETHR_X86_MEMBAR_H__ + + tup = erts_bld_tuple(hpp, szp, 2, + erts_bld_string(hpp, szp, "sse2"), +#ifdef ETHR_X86_RUNTIME_CONF_HAVE_SSE2__ + erts_bld_string(hpp, szp, + (ETHR_X86_RUNTIME_CONF_HAVE_SSE2__ + ? "yes" : "no")) +#else + erts_bld_string(hpp, szp, "yes") +#endif + ); + res = erts_bld_cons(hpp, szp, tup, res); + + tup = erts_bld_tuple(hpp, szp, 2, + erts_bld_string(hpp, szp, + "x86" +#ifdef ARCH_64 + "_64" +#endif + " OOO"), + erts_bld_string(hpp, szp, +#ifdef ETHR_X86_OUT_OF_ORDER + "yes" +#else + "no" +#endif + )); + + res = erts_bld_cons(hpp, szp, tup, res); +#endif + +#ifdef ETHR_SPARC_V9_MEMBAR_H__ + + tup = erts_bld_tuple(hpp, szp, 2, + erts_bld_string(hpp, szp, "Sparc V9"), + erts_bld_string(hpp, szp, +#if defined(ETHR_SPARC_TSO) + "TSO" +#elif defined(ETHR_SPARC_PSO) + "PSO" +#elif defined(ETHR_SPARC_RMO) + "RMO" +#else + "undefined" +#endif + )); + + res = erts_bld_cons(hpp, szp, tup, res); + +#endif + +#ifdef ETHR_PPC_MEMBAR_H__ + + tup = erts_bld_tuple(hpp, szp, 2, + erts_bld_string(hpp, szp, "lwsync"), + erts_bld_string(hpp, szp, +#if defined(ETHR_PPC_HAVE_LWSYNC) + "yes" +#elif defined(ETHR_PPC_HAVE_NO_LWSYNC) + "no" +#elif defined(ETHR_PPC_RUNTIME_CONF_HAVE_LWSYNC__) + ETHR_PPC_RUNTIME_CONF_HAVE_LWSYNC__ ? "yes" : "no" +#else + "undefined" +#endif + )); + + res = erts_bld_cons(hpp, szp, tup, res); + +#endif + + tup = erts_bld_tuple(hpp, szp, 2, + erts_bld_string(hpp, szp, "Native rw-spinlocks"), +#ifdef ETHR_NATIVE_RWSPINLOCK_IMPL + erts_bld_string(hpp, szp, ETHR_NATIVE_RWSPINLOCK_IMPL) +#else + erts_bld_string(hpp, szp, "no") +#endif + ); + res = erts_bld_cons(hpp, szp, tup, res); + + tup = erts_bld_tuple(hpp, szp, 2, + erts_bld_string(hpp, szp, "Native spinlocks"), +#ifdef ETHR_NATIVE_SPINLOCK_IMPL + erts_bld_string(hpp, szp, ETHR_NATIVE_SPINLOCK_IMPL) +#else + erts_bld_string(hpp, szp, "no") +#endif + ); + res = erts_bld_cons(hpp, szp, tup, res); + + + list = NIL; +#ifdef ETHR_NATIVE_DW_ATOMIC_IMPL + if (ethr_have_native_dw_atomic()) { + name = erts_bld_string(hpp, szp, ETHR_NATIVE_DW_ATOMIC_IMPL); + str = ethr_native_dw_atomic_ops(); + for (i = 0; str[i]; i++) { + erts_snprintf(buf, sizeof(buf), "ethr_native_dw_atomic_%s()", str[i]); + list = erts_bld_cons(hpp, szp, + erts_bld_string(hpp, szp, buf), + list); + } + str = ethr_native_su_dw_atomic_ops(); + for (i = 0; str[i]; i++) { + erts_snprintf(buf, sizeof(buf), "ethr_native_su_dw_atomic_%s()", str[i]); + list = erts_bld_cons(hpp, szp, + erts_bld_string(hpp, szp, buf), + list); + } + } + else +#endif + name = erts_bld_string(hpp, szp, "no"); + + tup = erts_bld_tuple(hpp, szp, 3, + erts_bld_string(hpp, szp, "Double word native atomics"), + name, + list); + res = erts_bld_cons(hpp, szp, tup, res); + + list = NIL; +#ifdef ETHR_NATIVE_ATOMIC64_IMPL + name = erts_bld_string(hpp, szp, ETHR_NATIVE_ATOMIC64_IMPL); + str = ethr_native_atomic64_ops(); + for (i = 0; str[i]; i++) { + erts_snprintf(buf, sizeof(buf), "ethr_native_atomic64_%s()", str[i]); + list = erts_bld_cons(hpp, szp, + erts_bld_string(hpp, szp, buf), + list); + } +#else + name = erts_bld_string(hpp, szp, "no"); +#endif + tup = erts_bld_tuple(hpp, szp, 3, + erts_bld_string(hpp, szp, "64-bit native atomics"), + name, + list); + res = erts_bld_cons(hpp, szp, tup, res); + + list = NIL; +#ifdef ETHR_NATIVE_ATOMIC32_IMPL + name = erts_bld_string(hpp, szp, ETHR_NATIVE_ATOMIC32_IMPL); + str = ethr_native_atomic32_ops(); + for (i = 0; str[i]; i++) { + erts_snprintf(buf, sizeof(buf), "ethr_native_atomic32_%s()", str[i]); + list = erts_bld_cons(hpp, szp, + erts_bld_string(hpp, szp, buf), + list); + } +#else + name = erts_bld_string(hpp, szp, "no"); +#endif + tup = erts_bld_tuple(hpp, szp, 3, + erts_bld_string(hpp, szp, "32-bit native atomics"), + name, + list); + res = erts_bld_cons(hpp, szp, tup, res); + + if (hpp) { + HRelease(c_p, end_hp, *hpp) + return res; + } + + hp = HAlloc(c_p, sz); + end_hp = hp + sz; + hpp = &hp; + szp = NULL; + } +} + /* * To be used to silence unused result warnings, but do not abuse it. */ diff --git a/erts/emulator/drivers/common/erl_efile.h b/erts/emulator/drivers/common/erl_efile.h index bd85e43b8c..5387f75efc 100644 --- a/erts/emulator/drivers/common/erl_efile.h +++ b/erts/emulator/drivers/common/erl_efile.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1997-2011. All Rights Reserved. + * Copyright Ericsson AB 1997-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/drivers/common/zlib_drv.c b/erts/emulator/drivers/common/zlib_drv.c index 89b7be14f2..3fe5d282dc 100644 --- a/erts/emulator/drivers/common/zlib_drv.c +++ b/erts/emulator/drivers/common/zlib_drv.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2003-2012. All Rights Reserved. + * Copyright Ericsson AB 2003-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/drivers/unix/unix_efile.c b/erts/emulator/drivers/unix/unix_efile.c index 2bd5177be1..55539b44dd 100644 --- a/erts/emulator/drivers/unix/unix_efile.c +++ b/erts/emulator/drivers/unix/unix_efile.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1997-2012. All Rights Reserved. + * Copyright Ericsson AB 1997-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/drivers/win32/ttsl_drv.c b/erts/emulator/drivers/win32/ttsl_drv.c index 8b5e3eeefd..502cb58dfa 100644 --- a/erts/emulator/drivers/win32/ttsl_drv.c +++ b/erts/emulator/drivers/win32/ttsl_drv.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2011. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/drivers/win32/win_efile.c b/erts/emulator/drivers/win32/win_efile.c index 1059fa5c3a..be3d86a1d2 100644 --- a/erts/emulator/drivers/win32/win_efile.c +++ b/erts/emulator/drivers/win32/win_efile.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1997-2012. All Rights Reserved. + * Copyright Ericsson AB 1997-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/hipe/hipe_x86_signal.c b/erts/emulator/hipe/hipe_x86_signal.c index 19fc448742..8f997aafab 100644 --- a/erts/emulator/hipe/hipe_x86_signal.c +++ b/erts/emulator/hipe/hipe_x86_signal.c @@ -2,7 +2,7 @@ * %CopyrightBegin% * - * Copyright Ericsson AB 2001-2011. All Rights Reserved. + * Copyright Ericsson AB 2001-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/internal_doc/dec.erl b/erts/emulator/internal_doc/dec.erl index 255018abe0..bb69e6e81b 100644 --- a/erts/emulator/internal_doc/dec.erl +++ b/erts/emulator/internal_doc/dec.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2000-2010. All Rights Reserved. +%% Copyright Ericsson AB 2000-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/sys/common/erl_poll.c b/erts/emulator/sys/common/erl_poll.c index a523d67158..5861b30315 100644 --- a/erts/emulator/sys/common/erl_poll.c +++ b/erts/emulator/sys/common/erl_poll.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2006-2012. All Rights Reserved. + * Copyright Ericsson AB 2006-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -40,6 +40,13 @@ # include "config.h" #endif +#if defined(__DARWIN__) || defined(__APPLE__) && defined(__MACH__) +/* Setting _DARWIN_UNLIMITED_SELECT before including sys/select.h enables + * the version of select() that does not place a limit on the fd_set. + */ +# define _DARWIN_UNLIMITED_SELECT +#endif + #ifndef WANT_NONBLOCKING # define WANT_NONBLOCKING #endif @@ -90,6 +97,52 @@ #define HARD_DEBUG #endif +#ifdef _DARWIN_UNLIMITED_SELECT +typedef struct { + size_t sz; + fd_set* ptr; +}ERTS_fd_set; +# define ERTS_FD_CLR(fd, fds) FD_CLR((fd), (fds)->ptr) +# define ERTS_FD_SET(fd, fds) FD_SET((fd), (fds)->ptr) +# define ERTS_FD_ISSET(fd,fds) FD_ISSET((fd), (fds)->ptr) +# define ERTS_FD_ZERO(fds) memset((fds)->ptr, 0, (fds)->sz) +# define ERTS_FD_SIZE(n) ((((n)+NFDBITS-1)/NFDBITS)*sizeof(fd_mask)) + +static void ERTS_FD_COPY(ERTS_fd_set *src, ERTS_fd_set *dst) +{ + if (dst->sz != src->sz) { + dst->ptr = dst->ptr + ? erts_realloc(ERTS_ALC_T_SELECT_FDS, dst->ptr, src->sz) + : erts_alloc(ERTS_ALC_T_SELECT_FDS, src->sz); + dst->sz = src->sz; + } + memcpy(dst->ptr, src->ptr, src->sz); +} + +static ERTS_INLINE +int ERTS_SELECT(int nfds, ERTS_fd_set *readfds, ERTS_fd_set *writefds, + ERTS_fd_set *exceptfds, struct timeval *timeout) +{ + ASSERT(!readfds || readfds->sz >= nfds); + ASSERT(!writefds || writefds->sz >= nfds); + ASSERT(!exceptfds); + return select(nfds, + (readfds ? readfds->ptr : NULL ), + (writefds ? writefds->ptr : NULL), + NULL, + timeout); +} + +#else /* !_DARWIN_UNLIMITED_SELECT */ +# define ERTS_fd_set fd_set +# define ERTS_FD_CLR FD_CLR +# define ERTS_FD_ISSET FD_ISSET +# define ERTS_FD_SET FD_SET +# define ERTS_FD_ZERO FD_ZERO +# define ERTS_FD_COPY(src,dst) (*(dst) = *(src)) +# define ERTS_SELECT select +#endif + #define ERTS_POLL_USE_BATCH_UPDATE_POLLSET (ERTS_POLL_USE_DEVPOLL \ || ERTS_POLL_USE_KQUEUE) #define ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE \ @@ -244,10 +297,10 @@ struct ErtsPollSet_ { #if ERTS_POLL_USE_FALLBACK int no_select_fds; #endif - fd_set input_fds; - fd_set res_input_fds; - fd_set output_fds; - fd_set res_output_fds; + ERTS_fd_set input_fds; + ERTS_fd_set res_input_fds; + ERTS_fd_set output_fds; + ERTS_fd_set res_output_fds; #endif #if ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE ErtsPollSetUpdateRequestsBlock update_requests; @@ -624,6 +677,33 @@ grow_poll_fds(ErtsPollSet ps, int min_ix) } #endif +#ifdef _DARWIN_UNLIMITED_SELECT +static void +grow_select_fds(int fd, ERTS_fd_set* fds) +{ + int new_len = ERTS_POLL_EXPORT(erts_poll_get_table_len)(fd + 1); + if (new_len > max_fds) + new_len = max_fds; + new_len = ERTS_FD_SIZE(new_len); + fds->ptr = fds->sz + ? erts_realloc(ERTS_ALC_T_SELECT_FDS, fds->ptr, new_len) + : erts_alloc(ERTS_ALC_T_SELECT_FDS, new_len); + memset((char*)fds->ptr + fds->sz, 0, new_len - fds->sz); + fds->sz = new_len; +} +static ERTS_INLINE void +ensure_select_fds(int fd, ERTS_fd_set* in, ERTS_fd_set* out) +{ + ASSERT(in->sz == out->sz); + if (ERTS_FD_SIZE(fd+1) > in->sz) { + grow_select_fds(fd, in); + grow_select_fds(fd, out); + } +} +#else +# define ensure_select_fds(fd, in, out) do {} while(0) +#endif /* _DARWIN_UNLIMITED_SELECT */ + static void grow_fds_status(ErtsPollSet ps, int min_fd) { @@ -1290,22 +1370,23 @@ static int update_pollset(ErtsPollSet ps, int fd) #elif ERTS_POLL_USE_SELECT /* --- select ------------------------------ */ { ErtsPollEvents events = ps->fds_status[fd].events; + ensure_select_fds(fd, &ps->input_fds, &ps->output_fds); if ((ERTS_POLL_EV_IN & events) != (ERTS_POLL_EV_IN & ps->fds_status[fd].used_events)) { if (ERTS_POLL_EV_IN & events) { - FD_SET(fd, &ps->input_fds); + ERTS_FD_SET(fd, &ps->input_fds); } else { - FD_CLR(fd, &ps->input_fds); + ERTS_FD_CLR(fd, &ps->input_fds); } } if ((ERTS_POLL_EV_OUT & events) != (ERTS_POLL_EV_OUT & ps->fds_status[fd].used_events)) { if (ERTS_POLL_EV_OUT & events) { - FD_SET(fd, &ps->output_fds); + ERTS_FD_SET(fd, &ps->output_fds); } else { - FD_CLR(fd, &ps->output_fds); + ERTS_FD_CLR(fd, &ps->output_fds); } } @@ -1789,7 +1870,7 @@ save_poll_result(ErtsPollSet ps, ErtsPollResFd pr[], int max_res, while (fd < end_fd && res < max_res) { pr[res].events = (ErtsPollEvents) 0; - if (FD_ISSET(fd, &ps->res_input_fds)) { + if (ERTS_FD_ISSET(fd, &ps->res_input_fds)) { #if ERTS_POLL_USE_FALLBACK if (fd == ps->kp_fd) { res += get_kp_results(ps, &pr[res], max_res-res); @@ -1805,7 +1886,7 @@ save_poll_result(ErtsPollSet ps, ErtsPollResFd pr[], int max_res, #endif pr[res].events |= ERTS_POLL_EV_IN; } - if (FD_ISSET(fd, &ps->res_output_fds)) + if (ERTS_FD_ISSET(fd, &ps->res_output_fds)) pr[res].events |= ERTS_POLL_EV_OUT; if (pr[res].events) { pr[res].fd = fd; @@ -1832,24 +1913,23 @@ save_poll_result(ErtsPollSet ps, ErtsPollResFd pr[], int max_res, while (fd < end_fd && res < max_res) { if (ps->fds_status[fd].events) { int sres; - fd_set *iset = NULL; - fd_set *oset = NULL; + ERTS_fd_set *iset = NULL; + ERTS_fd_set *oset = NULL; if (ps->fds_status[fd].events & ERTS_POLL_EV_IN) { iset = &ps->res_input_fds; - FD_ZERO(iset); - FD_SET(fd, iset); + ERTS_FD_ZERO(iset); + ERTS_FD_SET(fd, iset); } if (ps->fds_status[fd].events & ERTS_POLL_EV_OUT) { oset = &ps->res_output_fds; - FD_ZERO(oset); - FD_SET(fd, oset); - + ERTS_FD_ZERO(oset); + ERTS_FD_SET(fd, oset); } do { /* Initiate 'tv' each time; select() may modify it */ SysTimeval tv = {0, 0}; - sres = select(ps->max_fd+1, iset, oset, NULL, &tv); + sres = ERTS_SELECT(ps->max_fd+1, iset, oset, NULL, &tv); } while (sres < 0 && errno == EINTR); if (sres < 0) { #if ERTS_POLL_USE_FALLBACK @@ -1873,7 +1953,7 @@ save_poll_result(ErtsPollSet ps, ErtsPollResFd pr[], int max_res, } else if (sres > 0) { pr[res].fd = fd; - if (iset && FD_ISSET(fd, iset)) { + if (iset && ERTS_FD_ISSET(fd, iset)) { #if ERTS_POLL_USE_FALLBACK if (fd == ps->kp_fd) { res += get_kp_results(ps, @@ -1891,7 +1971,7 @@ save_poll_result(ErtsPollSet ps, ErtsPollResFd pr[], int max_res, #endif pr[res].events |= ERTS_POLL_EV_IN; } - if (oset && FD_ISSET(fd, oset)) { + if (oset && ERTS_FD_ISSET(fd, oset)) { pr[res].events |= ERTS_POLL_EV_OUT; } ASSERT(pr[res].events); @@ -1992,14 +2072,14 @@ check_fd_events(ErtsPollSet ps, SysTimeval *tv, int max_res) #elif ERTS_POLL_USE_SELECT /* --- select ------------------------------ */ SysTimeval to = *tv; - ps->res_input_fds = ps->input_fds; - ps->res_output_fds = ps->output_fds; - + ERTS_FD_COPY(&ps->input_fds, &ps->res_input_fds); + ERTS_FD_COPY(&ps->output_fds, &ps->res_output_fds); + #ifdef ERTS_SMP if (to.tv_sec || to.tv_usec) erts_thr_progress_prepare_wait(NULL); #endif - res = select(ps->max_fd + 1, + res = ERTS_SELECT(ps->max_fd + 1, &ps->res_input_fds, &ps->res_output_fds, NULL, @@ -2027,7 +2107,7 @@ check_fd_events(ErtsPollSet ps, SysTimeval *tv, int max_res) ERTS_POLLSET_LOCK(ps); handle_update_requests(ps); ERTS_POLLSET_UNLOCK(ps); - res = select(ps->max_fd + 1, + res = ERTS_SELECT(ps->max_fd + 1, &ps->res_input_fds, &ps->res_output_fds, NULL, @@ -2233,7 +2313,8 @@ ERTS_POLL_EXPORT(erts_poll_init)(void) max_fds = OPEN_MAX; #endif -#if ERTS_POLL_USE_SELECT && defined(FD_SETSIZE) +#if ERTS_POLL_USE_SELECT && defined(FD_SETSIZE) && \ + !defined(_DARWIN_UNLIMITED_SELECT) if (max_fds > FD_SETSIZE) max_fds = FD_SETSIZE; #endif @@ -2301,10 +2382,21 @@ ERTS_POLL_EXPORT(erts_poll_create_pollset)(void) #if ERTS_POLL_USE_FALLBACK ps->no_select_fds = 0; #endif - FD_ZERO(&ps->input_fds); - FD_ZERO(&ps->res_input_fds); - FD_ZERO(&ps->output_fds); - FD_ZERO(&ps->res_output_fds); +#ifdef _DARWIN_UNLIMITED_SELECT + ps->input_fds.sz = 0; + ps->input_fds.ptr = NULL; + ps->res_input_fds.sz = 0; + ps->res_input_fds.ptr = NULL; + ps->output_fds.sz = 0; + ps->output_fds.ptr = NULL; + ps->res_output_fds.sz = 0; + ps->res_output_fds.ptr = NULL; +#else + ERTS_FD_ZERO(&ps->input_fds); + ERTS_FD_ZERO(&ps->res_input_fds); + ERTS_FD_ZERO(&ps->output_fds); + ERTS_FD_ZERO(&ps->res_output_fds); +#endif #endif #if ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE ps->update_requests.next = NULL; @@ -2382,6 +2474,16 @@ ERTS_POLL_EXPORT(erts_poll_destroy_pollset)(ErtsPollSet ps) if (ps->poll_fds) erts_free(ERTS_ALC_T_POLL_FDS, (void *) ps->poll_fds); #elif ERTS_POLL_USE_SELECT +#ifdef _DARWIN_UNLIMITED_SELECT + if (ps->input_fds.ptr) + erts_free(ERTS_ALC_T_SELECT_FDS, (void *) ps->input_fds.ptr); + if (ps->res_input_fds.ptr) + erts_free(ERTS_ALC_T_SELECT_FDS, (void *) ps->res_input_fds.ptr); + if (ps->output_fds.ptr) + erts_free(ERTS_ALC_T_SELECT_FDS, (void *) ps->output_fds.ptr); + if (ps->res_output_fds.ptr) + erts_free(ERTS_ALC_T_SELECT_FDS, (void *) ps->res_output_fds.ptr); +#endif #endif #if ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE { @@ -2445,6 +2547,10 @@ ERTS_POLL_EXPORT(erts_poll_info)(ErtsPollSet ps, ErtsPollInfo *pip) #if ERTS_POLL_USE_POLL size += ps->poll_fds_len*sizeof(struct pollfd); #elif ERTS_POLL_USE_SELECT +#ifdef _DARWIN_UNLIMITED_SELECT + size += ps->input_fds.sz + ps->res_input_fds.sz + + ps->output_fds.sz + ps->res_output_fds.sz; +#endif #endif #if ERTS_POLL_USE_UPDATE_REQUESTS_QUEUE diff --git a/erts/emulator/sys/win32/sys_time.c b/erts/emulator/sys/win32/sys_time.c index f7f0161b58..b84c8f85ce 100644 --- a/erts/emulator/sys/win32/sys_time.c +++ b/erts/emulator/sys/win32/sys_time.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1997-2011. All Rights Reserved. + * Copyright Ericsson AB 1997-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/test/a_SUITE.erl b/erts/emulator/test/a_SUITE.erl index b541be3df6..195c9c0a5f 100644 --- a/erts/emulator/test/a_SUITE.erl +++ b/erts/emulator/test/a_SUITE.erl @@ -68,6 +68,9 @@ pollset_size(doc) -> pollset_size(suite) -> []; pollset_size(Config) when is_list(Config) -> + %% Ensure inet_gethost_native port program started, in order to + %% allow other suites to use it... + inet_gethost_native:gethostbyname("localhost"), ?line Parent = self(), ?line Go = make_ref(), ?line spawn(fun () -> diff --git a/erts/emulator/test/alloc_SUITE.erl b/erts/emulator/test/alloc_SUITE.erl index 33abd45982..801ed0f85a 100644 --- a/erts/emulator/test/alloc_SUITE.erl +++ b/erts/emulator/test/alloc_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2003-2011. All Rights Reserved. +%% Copyright Ericsson AB 2003-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/test/alloc_SUITE_data/allocator_test.h b/erts/emulator/test/alloc_SUITE_data/allocator_test.h index c37b074f93..2d6c5f9dc7 100644 --- a/erts/emulator/test/alloc_SUITE_data/allocator_test.h +++ b/erts/emulator/test/alloc_SUITE_data/allocator_test.h @@ -102,7 +102,8 @@ typedef void* erts_cond; #define RBT_IS_TREE(T) ((Ulong) ALC_TEST1(RBT_OP(7), (T))) #define IS_BF_ALGO(A) ((Ulong) ALC_TEST1(RBT_OP(8), (A))) #define RBT_MAX_SZ(T) ((Ulong) ALC_TEST1(RBT_OP(9), (T))) -#define IS_CBF(A) ((Ulong) ALC_TEST1(RBT_OP(0xa), (A))) +#define IS_BF(A) ((Ulong) ALC_TEST1(RBT_OP(0xa), (A))) +#define RBT_PREV(T) ((RBTL_t *) ALC_TEST1(RBT_OP(0xb), (T))) /* From erl_mseg.c */ #define HAVE_MSEG() ((int) ALC_TEST0(0x400)) diff --git a/erts/emulator/test/alloc_SUITE_data/coalesce.c b/erts/emulator/test/alloc_SUITE_data/coalesce.c index 36710bf7b5..9da49a0d14 100644 --- a/erts/emulator/test/alloc_SUITE_data/coalesce.c +++ b/erts/emulator/test/alloc_SUITE_data/coalesce.c @@ -267,7 +267,7 @@ void testcase_run(TestCaseState_t *tcs) { char *argv_org[] = {"-tsmbcs511","-tmmbcs511", "-tsbct512", "-trmbcmt100", "-tas", NULL, NULL}; - char *alg[] = {"af", "gf", "bf", "aobf", "aoff", "aoffcaobf", NULL}; + char *alg[] = {"af", "gf", "bf", "aobf", "aoff", "aoffcbf", "aoffcaobf", NULL}; int i; for (i = 0; alg[i]; i++) { diff --git a/erts/emulator/test/alloc_SUITE_data/rbtree.c b/erts/emulator/test/alloc_SUITE_data/rbtree.c index 702f075304..49df2f0245 100644 --- a/erts/emulator/test/alloc_SUITE_data/rbtree.c +++ b/erts/emulator/test/alloc_SUITE_data/rbtree.c @@ -85,23 +85,21 @@ print_tree(TestCaseState_t *tcs, RBT_t *root) static RBT_t * check_tree(TestCaseState_t *tcs, Allctr_t *alc, Ulong size) { - enum { BF, AOBF, AOFF, AOFFCAOBF }type; + enum { BF, AOBF, AOFF } type; int i, max_i; char stk[128]; RBT_t *root, *x, *y, *res; Ulong x_sz, y_sz, is_x_black; long blacks, curr_blacks; + int have_max_sz; res = NULL; - if (IS_BF_ALGO(alc)) { - if (IS_AOBF(alc)) type = AOBF; - else type = BF; - } - else { /* AOFF_ALGO */ - if (IS_CBF(alc)) type = AOFFCAOBF; - else type = AOFF; - } + if (IS_AOBF(alc)) type = AOBF; + else if (IS_BF(alc)) type = BF; + else type = AOFF; + + have_max_sz = !IS_BF_ALGO(alc); root = RBT_ROOT(alc, size); @@ -191,17 +189,10 @@ check_tree(TestCaseState_t *tcs, Allctr_t *alc, Ulong size) break; case AOFF: ASSERT(tcs, y < x); - ASSERT(tcs, RBT_MAX_SZ(y) <= RBT_MAX_SZ(x)); break; - case AOFFCAOBF: - { - void* x_crr = BLK_TO_MBC(x); - void* y_crr = BLK_TO_MBC(y); - ASSERT(tcs, (y < x && (x_crr != y_crr || x_sz == y_sz)) - || (y_sz < x_sz && x_crr == y_crr)); - ASSERT(tcs, RBT_MAX_SZ(y) <= RBT_MAX_SZ(x)); - break; - } + } + if (have_max_sz) { + ASSERT(tcs, RBT_MAX_SZ(y) <= RBT_MAX_SZ(x)); } } @@ -219,27 +210,22 @@ check_tree(TestCaseState_t *tcs, Allctr_t *alc, Ulong size) break; case AOFF: ASSERT(tcs, y > x); - ASSERT(tcs, RBT_MAX_SZ(y) <= RBT_MAX_SZ(x)); break; - case AOFFCAOBF: - { - void* x_crr = BLK_TO_MBC(x); - void* y_crr = BLK_TO_MBC(y); - ASSERT(tcs, (y > x && (x_crr != y_crr || x_sz == y_sz)) - || (y_sz > x_sz && x_crr == y_crr)); - ASSERT(tcs, RBT_MAX_SZ(y) <= RBT_MAX_SZ(x)); - break; - } + } + if (have_max_sz) { + ASSERT(tcs, RBT_MAX_SZ(y) <= RBT_MAX_SZ(x)); } } if (type == BF) { Ulong l_sz; - RBTL_t *l = RBT_NEXT(x); + RBTL_t *l, *prev=x; for (l = RBT_NEXT(x); l; l = RBT_NEXT(l)) { l_sz = BLK_SZ(l); ASSERT(tcs, l_sz == x_sz); ASSERT(tcs, !RBT_IS_TREE(l)); + ASSERT(tcs, RBT_PREV(l) == prev); + prev = l; } } @@ -262,18 +248,7 @@ check_tree(TestCaseState_t *tcs, Allctr_t *alc, Ulong size) res = x; } break; - case AOFFCAOBF: - if (BLK_TO_MBC(x) != BLK_TO_MBC(res) || x_sz == y_sz) { - if (x < res) { - res = x; - } - } - else if (x_sz < y_sz) { - res = x; - } - break; } - } } @@ -310,7 +285,7 @@ do_check(TestCaseState_t *tcs, Allctr_t *a, Ulong size, int ignore_null) tmp = ALLOC(a, sz - ABLK_HDR_SZ); ASSERT(tcs, tmp); y = UMEM2BLK(tmp); - if (!(IS_BF_ALGO(a) && !IS_AOBF(a))) { + if (!IS_BF(a)) { ASSERT(tcs, x == y); } else { @@ -488,6 +463,7 @@ testcase_run(TestCaseState_t *tcs) char *argv2[] = {"-tasaobf", NULL}; char *argv3[] = {"-tasaoff", NULL}; char *argv4[] = {"-tasaoffcaobf", NULL}; + char *argv5[] = {"-tasaoffcbf", NULL}; Allctr_t *a; rbtree_test_data *td; @@ -511,6 +487,7 @@ testcase_run(TestCaseState_t *tcs) ASSERT(tcs, a); ASSERT(tcs, IS_BF_ALGO(a)); ASSERT(tcs, !IS_AOBF(a)); + ASSERT(tcs, IS_BF(a)); test_it(tcs); @@ -529,6 +506,7 @@ testcase_run(TestCaseState_t *tcs) ASSERT(tcs, a); ASSERT(tcs, IS_BF_ALGO(a)); ASSERT(tcs, IS_AOBF(a)); + ASSERT(tcs, !IS_BF(a)); test_it(tcs); @@ -546,7 +524,8 @@ testcase_run(TestCaseState_t *tcs) ASSERT(tcs, a); ASSERT(tcs, !IS_BF_ALGO(a)); - ASSERT(tcs, !IS_CBF(a)); + ASSERT(tcs, !IS_AOBF(a)); + ASSERT(tcs, !IS_BF(a)); test_it(tcs); test_carrier_migration(tcs); @@ -556,7 +535,7 @@ testcase_run(TestCaseState_t *tcs) testcase_printf(tcs, "Address order first fit test succeeded!\n"); - /* Address order first fit, best fit within carrier */ + /* Address order first fit, aobf within carrier */ testcase_printf(tcs, "Starting test of aoffcaobf...\n"); @@ -565,7 +544,28 @@ testcase_run(TestCaseState_t *tcs) ASSERT(tcs, a); ASSERT(tcs, !IS_BF_ALGO(a)); - ASSERT(tcs, IS_CBF(a)); + ASSERT(tcs, IS_AOBF(a)); + ASSERT(tcs, !IS_BF(a)); + + test_it(tcs); + test_carrier_migration(tcs); + + STOP_ALC(a); + td->allocator = NULL; + + testcase_printf(tcs, "aoffcaobf test succeeded!\n"); + + /* Address order first fit, bf within carrier */ + + testcase_printf(tcs, "Starting test of aoffcbf...\n"); + + current_rbt_type_op_base = AO_FIRSTFIT_OP_BASE; + td->allocator = a = START_ALC("rbtree_aoffcbf_", 0, argv5); + + ASSERT(tcs, a); + ASSERT(tcs, !IS_BF_ALGO(a)); + ASSERT(tcs, !IS_AOBF(a)); + ASSERT(tcs, IS_BF(a)); test_it(tcs); test_carrier_migration(tcs); diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl index babdb3363f..08ab094019 100644 --- a/erts/emulator/test/binary_SUITE.erl +++ b/erts/emulator/test/binary_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -47,7 +47,8 @@ copy_terms/1, conversions/1, deep_lists/1, deep_bitstr_lists/1, bad_list_to_binary/1, bad_binary_to_list/1, t_split_binary/1, bad_split/1, - terms/1, terms_float/1, external_size/1, t_iolist_size/1, + terms/1, terms_float/1, float_middle_endian/1, + external_size/1, t_iolist_size/1, t_hash/1, bad_size/1, bad_term_to_binary/1, @@ -57,10 +58,10 @@ ordering/1,unaligned_order/1,gc_test/1, bit_sized_binary_sizes/1, otp_6817/1,deep/1,obsolete_funs/1,robustness/1,otp_8117/1, - otp_8180/1]). + otp_8180/1, ttb_trap/1]). %% Internal exports. --export([sleeper/0]). +-export([sleeper/0,ttb_loop/2]). suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,2}}]. @@ -69,13 +70,13 @@ all() -> [copy_terms, conversions, deep_lists, deep_bitstr_lists, t_split_binary, bad_split, bad_list_to_binary, bad_binary_to_list, terms, - terms_float, external_size, t_iolist_size, + terms_float, float_middle_endian, external_size, t_iolist_size, bad_binary_to_term_2, safe_binary_to_term2, bad_binary_to_term, bad_terms, t_hash, bad_size, bad_term_to_binary, more_bad_terms, otp_5484, otp_5933, ordering, unaligned_order, gc_test, bit_sized_binary_sizes, otp_6817, otp_8117, deep, - obsolete_funs, robustness, otp_8180]. + obsolete_funs, robustness, otp_8180, ttb_trap]. groups() -> []. @@ -486,6 +487,11 @@ terms_float(Config) when is_list(Config) -> true = Size1 < Size0 end). +float_middle_endian(Config) when is_list(Config) -> + %% Testing for roundtrip is not enough. + ?line <<131,70,63,240,0,0,0,0,0,0>> = term_to_binary(1.0, [{minor_version,1}]), + ?line 1.0 = binary_to_term(<<131,70,63,240,0,0,0,0,0,0>>). + external_size(Config) when is_list(Config) -> %% Build a term whose external size only fits in a big num (on 32-bit CPU). ?line external_size_1(16#11111111111111117777777777777777888889999, 0, 16#FFFFFFF), @@ -1322,6 +1328,38 @@ run_otp_8180(Name) -> end || Bin <- Bins], ok. +%% Test that exit and GC during term_to_binary trap does not crash. +ttb_trap(Config) when is_list(Config)-> + case erlang:system_info(wordsize) of + N when N < 8 -> + {skipped, "Only on 64bit machines"}; + _ -> + do_ttb_trap(5) + end. + +do_ttb_trap(0) -> + ok; +do_ttb_trap(N) -> + Pid = spawn(?MODULE,ttb_loop,[1000,self()]), + receive ok -> ok end, + receive after 100 -> ok end, + erlang:garbage_collect(Pid), + receive after 100 -> ok end, + exit(Pid,kill), + receive after 1 -> ok end, + do_ttb_trap(N-1). + +ttb_loop(N,Pid) -> + Term = lists:duplicate(2000000,2000000), + Pid ! ok, + ttb_loop2(N,Term). +ttb_loop2(0,_T) -> + ok; +ttb_loop2(N,T) -> + apply(erlang,term_to_binary,[T]), + ttb_loop2(N-1,T). + + %% Utilities. make_sub_binary(Bin) when is_binary(Bin) -> diff --git a/erts/emulator/test/bs_construct_SUITE.erl b/erts/emulator/test/bs_construct_SUITE.erl index 123952d01d..1a8724d63b 100644 --- a/erts/emulator/test/bs_construct_SUITE.erl +++ b/erts/emulator/test/bs_construct_SUITE.erl @@ -438,6 +438,8 @@ in_guard(Config) when is_list(Config) -> ?line 1 = in_guard(<<16#74ad:16>>, 16#e95, 5), ?line 2 = in_guard(<<16#3A,16#F7,"hello">>, 16#3AF7, <<"hello">>), ?line 3 = in_guard(<<16#FBCD:14,3.1415/float,3:2>>, 16#FBCD, 3.1415), + ?line 3 = in_guard(<<16#FBCD:14,3/float,3:2>>, 16#FBCD, 3), + ?line 3 = in_guard(<<16#FBCD:14,(2 bsl 226)/float,3:2>>, 16#FBCD, 2 bsl 226), nope = in_guard(<<1>>, 42, b), nope = in_guard(<<1>>, a, b), nope = in_guard(<<1,2>>, 1, 1), diff --git a/erts/emulator/test/bs_match_misc_SUITE.erl b/erts/emulator/test/bs_match_misc_SUITE.erl index 15427661f3..b0904acbe9 100644 --- a/erts/emulator/test/bs_match_misc_SUITE.erl +++ b/erts/emulator/test/bs_match_misc_SUITE.erl @@ -23,7 +23,8 @@ bound_var/1,bound_tail/1,t_float/1,little_float/1,sean/1, kenneth/1,encode_binary/1,native/1,happi/1, size_var/1,wiger/1,x0_context/1,huge_float_field/1, - writable_binary_matched/1,otp_7198/1,unordered_bindings/1]). + writable_binary_matched/1,otp_7198/1,unordered_bindings/1, + float_middle_endian/1]). -include_lib("test_server/include/test_server.hrl"). @@ -33,7 +34,7 @@ all() -> [bound_var, bound_tail, t_float, little_float, sean, kenneth, encode_binary, native, happi, size_var, wiger, x0_context, huge_float_field, writable_binary_matched, - otp_7198, unordered_bindings]. + otp_7198, unordered_bindings, float_middle_endian]. groups() -> []. @@ -92,6 +93,13 @@ t_float(Config) when is_list(Config) -> ok. +float_middle_endian(Config) when is_list(Config) -> + F = 9007199254740990.0, % turns to -NaN when word-swapped + ?line fcmp(F, match_float(<<F:64/float>>, 64, 0)), + ?line fcmp(F, match_float(<<1:1,F:64/float,127:7>>, 64, 1)), + ?line fcmp(F, match_float(<<1:13,F:64/float,127:3>>, 64, 13)), + ok. + fcmp(F1, F2) when (F1 - F2) / F2 < 0.0000001 -> ok. diff --git a/erts/emulator/test/code_parallel_load_SUITE.erl b/erts/emulator/test/code_parallel_load_SUITE.erl index d2c80c1ca0..1cfe015ea6 100644 --- a/erts/emulator/test/code_parallel_load_SUITE.erl +++ b/erts/emulator/test/code_parallel_load_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2012. All Rights Reserved. +%% Copyright Ericsson AB 2012-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/test/port_SUITE.erl b/erts/emulator/test/port_SUITE.erl index e467e844b3..fcd4457c34 100644 --- a/erts/emulator/test/port_SUITE.erl +++ b/erts/emulator/test/port_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -628,7 +628,7 @@ iter_max_ports(Config) when is_list(Config) -> iter_max_ports_test(Config) -> - Dog = test_server:timetrap(test_server:minutes(20)), + Dog = test_server:timetrap(test_server:minutes(30)), PortTest = port_test(Config), Command = lists:concat([PortTest, " -h0 -q"]), Iters = case os:type() of diff --git a/erts/emulator/test/process_SUITE.erl b/erts/emulator/test/process_SUITE.erl index 72f3e8fe85..e3aae17df4 100644 --- a/erts/emulator/test/process_SUITE.erl +++ b/erts/emulator/test/process_SUITE.erl @@ -90,9 +90,19 @@ groups() -> otp_7738_resume]}]. init_per_suite(Config) -> - Config. + A0 = case application:start(sasl) of + ok -> [sasl]; + _ -> [] + end, + A = case application:start(os_mon) of + ok -> [os_mon|A0]; + _ -> A0 + end, + [{started_apps, A}|Config]. end_per_suite(Config) -> + As = ?config(started_apps, Config), + lists:foreach(fun (A) -> application:stop(A) end, As), catch erts_debug:set_internal_state(available_internal_state, false), Config. @@ -102,7 +112,6 @@ init_per_group(_GroupName, Config) -> end_per_group(_GroupName, Config) -> Config. - init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) -> Dog=?t:timetrap(?t:minutes(10)), [{watchdog, Dog},{testcase, Func}|Config]. @@ -1379,6 +1388,9 @@ processes_large_tab(doc) -> processes_large_tab(suite) -> []; processes_large_tab(Config) when is_list(Config) -> + sys_mem_cond_run(2048, fun () -> processes_large_tab_test(Config) end). + +processes_large_tab_test(Config) -> enable_internal_state(), MaxDbgLvl = 20, MinProcTabSize = 2*(1 bsl 15), @@ -1430,6 +1442,9 @@ processes_default_tab(doc) -> processes_default_tab(suite) -> []; processes_default_tab(Config) when is_list(Config) -> + sys_mem_cond_run(1024, fun () -> processes_default_tab_test(Config) end). + +processes_default_tab_test(Config) -> {ok, DefaultNode} = start_node(Config, ""), Res = rpc:call(DefaultNode, ?MODULE, processes_bif_test, []), stop_node(DefaultNode), @@ -1452,7 +1467,7 @@ processes_this_tab(doc) -> processes_this_tab(suite) -> []; processes_this_tab(Config) when is_list(Config) -> - chk_processes_bif_test_res(processes_bif_test()). + sys_mem_cond_run(1024, fun () -> chk_processes_bif_test_res(processes_bif_test()) end). chk_processes_bif_test_res(ok) -> ok; chk_processes_bif_test_res({comment, _} = Comment) -> Comment; @@ -2095,6 +2110,9 @@ otp_7738_resume(Config) when is_list(Config) -> otp_7738_test(resume). otp_7738_test(Type) -> + sys_mem_cond_run(3072, fun () -> do_otp_7738_test(Type) end). + +do_otp_7738_test(Type) -> T = self(), S = spawn_link(fun () -> receive @@ -2239,3 +2257,31 @@ enable_internal_state() -> true -> true; _ -> erts_debug:set_internal_state(available_internal_state, true) end. + +sys_mem_cond_run(ReqSizeMB, TestFun) when is_integer(ReqSizeMB) -> + case total_memory() of + TotMem when is_integer(TotMem), TotMem >= ReqSizeMB -> + TestFun(); + TotMem when is_integer(TotMem) -> + {skipped, "Not enough memory ("++integer_to_list(TotMem)++" MB)"}; + undefined -> + {skipped, "Could not retrieve memory information"} + end. + + +total_memory() -> + %% Totat memory in MB. + try + MemoryData = memsup:get_system_memory_data(), + case lists:keysearch(total_memory, 1, MemoryData) of + {value, {total_memory, TM}} -> + TM div (1024*1024); + false -> + {value, {system_total_memory, STM}} = + lists:keysearch(system_total_memory, 1, MemoryData), + STM div (1024*1024) + end + catch + _ : _ -> + undefined + end. diff --git a/erts/emulator/test/receive_SUITE.erl b/erts/emulator/test/receive_SUITE.erl index b070e2b986..2e7ac1f50c 100644 --- a/erts/emulator/test/receive_SUITE.erl +++ b/erts/emulator/test/receive_SUITE.erl @@ -59,22 +59,25 @@ end_per_testcase(_Func, Config) -> ?t:timetrap_cancel(Dog). call_with_huge_message_queue(Config) when is_list(Config) -> - ?line Pid = spawn_link(fun echo_loop/0), + Pid = spawn_link(fun echo_loop/0), - ?line {Time,ok} = tc(fun() -> calls(10, Pid) end), + {Time,ok} = tc(fun() -> calls(10, Pid) end), - ?line [self() ! {msg,N} || N <- lists:seq(1, 500000)], + [self() ! {msg,N} || N <- lists:seq(1, 500000)], erlang:garbage_collect(), - ?line {NewTime,ok} = tc(fun() -> calls(10, Pid) end), + {NewTime1,ok} = tc(fun() -> calls(10, Pid) end), + {NewTime2,ok} = tc(fun() -> calls(10, Pid) end), + io:format("Time for empty message queue: ~p", [Time]), - io:format("Time for huge message queue: ~p", [NewTime]), + io:format("Time1 for huge message queue: ~p", [NewTime1]), + io:format("Time2 for huge message queue: ~p", [NewTime2]), - case (NewTime+1) / (Time+1) of + case hd(lists:sort([(NewTime1+1) / (Time+1), (NewTime2+1) / (Time+1)])) of Q when Q < 10 -> ok; Q -> - io:format("Q = ~p", [Q]), - ?line ?t:fail() + io:format("Best Q = ~p", [Q]), + ?t:fail() end, ok. @@ -95,8 +98,8 @@ call(Pid, Msg) -> end. receive_in_between(Config) when is_list(Config) -> - ?line Pid = spawn_link(fun echo_loop/0), - ?line [{ok,{a,b}} = call2(Pid, {a,b}) || _ <- lists:seq(1, 100000)], + Pid = spawn_link(fun echo_loop/0), + [{ok,{a,b}} = call2(Pid, {a,b}) || _ <- lists:seq(1, 100000)], ok. call2(Pid, Msg) -> diff --git a/erts/emulator/test/send_term_SUITE.erl b/erts/emulator/test/send_term_SUITE.erl index 6615873392..b631f55a03 100644 --- a/erts/emulator/test/send_term_SUITE.erl +++ b/erts/emulator/test/send_term_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2005-2011. All Rights Reserved. +%% Copyright Ericsson AB 2005-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/test/smoke_test_SUITE.erl b/erts/emulator/test/smoke_test_SUITE.erl index 6f5c2080c0..10b7e16a74 100644 --- a/erts/emulator/test/smoke_test_SUITE.erl +++ b/erts/emulator/test/smoke_test_SUITE.erl @@ -26,14 +26,14 @@ init_per_group/2,end_per_group/2, init_per_testcase/2, end_per_testcase/2]). --export([boot_combo/1]). +-export([boot_combo/1, native_atomics/1, jump_table/1]). -define(DEFAULT_TIMEOUT, ?t:minutes(2)). suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> - [boot_combo]. + [boot_combo, native_atomics, jump_table]. groups() -> []. @@ -105,6 +105,41 @@ boot_combo(Config) when is_list(Config) -> end) end. +native_atomics(Config) when is_list(Config) -> + NA32Key = "32-bit native atomics", + NA64Key = "64-bit native atomics", + DWNAKey = "Double word native atomics", + EthreadInfo = erlang:system_info(ethread_info), + ?t:format("~p~n", [EthreadInfo]), + {value,{NA32Key, NA32, _}} = lists:keysearch(NA32Key, 1, EthreadInfo), + {value,{NA64Key, NA64, _}} = lists:keysearch(NA64Key, 1, EthreadInfo), + {value,{DWNAKey, DWNA, _}} = lists:keysearch(DWNAKey, 1, EthreadInfo), + case {erlang:system_info(build_type), erlang:system_info(smp_support), NA32, NA64, DWNA} of + {opt, true, "no", "no", _} -> + ?t:fail(optimized_smp_runtime_without_native_atomics); + {_, false, "no", "no", _} -> + {comment, "No native atomics"}; + _ -> + {comment, + NA32 ++ " 32-bit, " + ++ NA64 ++ " 64-bit, and " + ++ DWNA ++ " double word native atomics"} + end. + +jump_table(Config) when is_list(Config) -> + case erlang:system_info(beam_jump_table) of + true -> + ok; + false -> + case erlang:system_info(build_type) of + opt -> + ?t:fail(optimized_without_beam_jump_table); + BT -> + {comment, "No beam jump table, but build type is " ++ atom_to_list(BT)} + end + end. + + %%% %%% Aux functions -------------------------------------------------------------- %%% diff --git a/erts/emulator/test/system_profile_SUITE.erl b/erts/emulator/test/system_profile_SUITE.erl index ba94a371be..a387c08ef9 100644 --- a/erts/emulator/test/system_profile_SUITE.erl +++ b/erts/emulator/test/system_profile_SUITE.erl @@ -198,7 +198,9 @@ check_multi_scheduling_block(Nodes) -> Pid = start_profiler_process(), undefined = erlang:system_profile(Pid, [scheduler]), {ok, Supervisor} = start_load(Nodes), + wait(600), erlang:system_flag(multi_scheduling, block), + wait(600), erlang:system_flag(multi_scheduling, unblock), {Pid, [scheduler]} = erlang:system_profile(undefined, []), Events = get_profiler_events(), @@ -213,7 +215,6 @@ check_block_system(Nodes) -> Pid = start_profiler_process(), undefined = erlang:system_profile(Pid, [scheduler]), {ok, Supervisor} = start_load(Nodes), - % FIXME: remove wait !! wait(300), undefined = erlang:system_monitor(Dummy, [busy_port]), {Dummy, [busy_port]} = erlang:system_monitor(undefined, []), diff --git a/erts/emulator/test/trace_SUITE.erl b/erts/emulator/test/trace_SUITE.erl index caa58ae281..0f513f0dcb 100644 --- a/erts/emulator/test/trace_SUITE.erl +++ b/erts/emulator/test/trace_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2011. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/emulator/utils/make_compiler_flags b/erts/emulator/utils/make_compiler_flags new file mode 100755 index 0000000000..cebe8cd0c5 --- /dev/null +++ b/erts/emulator/utils/make_compiler_flags @@ -0,0 +1,87 @@ +#!/usr/bin/env perl +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1999-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +use strict; +use File::Copy; +# This program generates global constants that contains +# config.h, CFLAGS and LDFLAGS + +my $file = ""; +my %constants = (); +my $prev_file = ""; + +while (@ARGV) { + my $d = shift; + if ( $d =~ /^-o$/ ) { + $file = shift or die("-o requires argument"); + open FILE, "<$file" or next; + $prev_file = do { local $/; <FILE> }; + close FILE; + next; + } + if ( $d =~ /^-f/ ) { + my $var = shift or die("-f requires two argument"); + my $value = shift or die("-f requires two argument"); + open FILE, "<$value"; + $value = do { local $/; <FILE> }; + close FILE; + + $value =~ s/\n/\\n\\\n/g; + + $constants{$var} = $value; + } + if ( $d =~ /^-v/ ) { + my $var = shift or die("-v requires two argument"); + my $value = shift; + $constants{$var} = $value; + } +} + +foreach(keys %constants) { + my $value = $constants{$_}; + $value =~ s/"/\\"/g; + $constants{$_} = $value +} + +# Did we want output to a file? +open(my $oldout, ">&STDOUT") or die "Can't dup STDOUT: $!"; +if ( $file ) { + open STDOUT, ">$file.tmp" or die("can't open $file for writing"); +} + +my(@prog) = split('/', $0); +my($prog) = $prog[$#prog]; +print "/* Warning: Do not edit this file.\n"; +print " Auto-generated by '$prog'.*/\n"; + +foreach(keys %constants) { + print "const char* erts_build_flags_$_ = \"$constants{$_}\";\n" +} + +open(STDOUT, ">&", $oldout) or die "Can't dup \$oldout: $!"; + +open FILE, "<$file.tmp"; +my $new_file = do { local $/; <FILE> }; +close FILE; + +if ($new_file ne $prev_file) { + move("$file.tmp","$file"); +} else { + unlink("$file.tmp"); +} diff --git a/erts/emulator/valgrind/suppress.standard b/erts/emulator/valgrind/suppress.standard index beecf1a7b5..a4da31a61d 100644 --- a/erts/emulator/valgrind/suppress.standard +++ b/erts/emulator/valgrind/suppress.standard @@ -174,6 +174,7 @@ obj:*/crypto.valgrind.* { Crypto internal... Memcheck:Cond +... obj:*/libcrypto.* } { @@ -194,6 +195,7 @@ obj:*/crypto.valgrind.* { Crypto internal... Memcheck:Value8 +... obj:*/libcrypto.* } { diff --git a/erts/etc/common/erlexec.c b/erts/etc/common/erlexec.c index 01134dd718..e61ebe15f5 100644 --- a/erts/etc/common/erlexec.c +++ b/erts/etc/common/erlexec.c @@ -122,6 +122,7 @@ static char *pluss_val_switches[] = { "bwt", "cl", "ct", + "fwi", "tbt", "wct", "wt", diff --git a/erts/etc/unix/cerl.src b/erts/etc/unix/cerl.src index 691b32e143..0d45917e4b 100644 --- a/erts/etc/unix/cerl.src +++ b/erts/etc/unix/cerl.src @@ -2,7 +2,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2003-2012. All Rights Reserved. +# Copyright Ericsson AB 2003-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/etc/unix/etp-commands b/erts/etc/unix/etp-commands index f059662271..35f75df5c1 100644 --- a/erts/etc/unix/etp-commands +++ b/erts/etc/unix/etp-commands @@ -2075,6 +2075,33 @@ document etp-system-info %--------------------------------------------------------------------------- end +define etp-compile-info + printf "--------------- Compile Information ---------------\n" + printf "CFLAGS: %s\n", erts_build_flags_CFLAGS + printf "LDFLAGS: %s\n", erts_build_flags_LDFLAGS + printf "Use etp-config-h-info to dump config.h\n" +end + +document etp-compile-info +%--------------------------------------------------------------------------- +% etp-compile-info +% +% Print information about how the system was compiled +%--------------------------------------------------------------------------- +end + +define etp-config-h-info + printf "%s", erts_build_flags_CONFIG_H +end + +document etp-config-h-info +%--------------------------------------------------------------------------- +% etp-config-h-info +% +% Dump the contents of config.h when the system was compiled +%--------------------------------------------------------------------------- +end + define etp-dictdump # Args: ProcDict* # diff --git a/erts/etc/unix/run_erl.c b/erts/etc/unix/run_erl.c index a3bcdb85d9..53c779b1be 100644 --- a/erts/etc/unix/run_erl.c +++ b/erts/etc/unix/run_erl.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2012. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/etc/unix/to_erl.c b/erts/etc/unix/to_erl.c index 094006c5fd..b9e397cbf2 100644 --- a/erts/etc/unix/to_erl.c +++ b/erts/etc/unix/to_erl.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2012. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in @@ -339,7 +339,7 @@ int main(int argc, char **argv) tty_smode.c_cc[VTIME] =0;/* Note that VTIME is the same as VEOL! */ tty_smode.c_cc[VINTR] =3; - tcsetattr(0, TCSANOW, &tty_smode); + tcsetattr(0, TCSADRAIN, &tty_smode); #ifdef DEBUG show_terminal_settings(&tty_smode); @@ -484,7 +484,7 @@ int main(int argc, char **argv) * Reset terminal characterstics * XXX */ - tcsetattr(0, TCSANOW, &tty_rmode); + tcsetattr(0, TCSADRAIN, &tty_rmode); return 0; } diff --git a/erts/etc/win32/erlsrv/erlsrv_interactive.c b/erts/etc/win32/erlsrv/erlsrv_interactive.c index 3f7e20b923..e8d73ae047 100644 --- a/erts/etc/win32/erlsrv/erlsrv_interactive.c +++ b/erts/etc/win32/erlsrv/erlsrv_interactive.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1998-2011. All Rights Reserved. + * Copyright Ericsson AB 1998-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/include/internal/ethread.h b/erts/include/internal/ethread.h index ab728c65fa..407097d4b1 100644 --- a/erts/include/internal/ethread.h +++ b/erts/include/internal/ethread.h @@ -411,6 +411,7 @@ extern ethr_runtime_t ethr_runtime__; #ifdef VALGRIND /* mutex as fallback for spinlock for VALGRIND */ # undef ETHR_HAVE_NATIVE_SPINLOCKS +# undef ETHR_HAVE_NATIVE_RWSPINLOCKS #else # include "ethr_optimized_fallbacks.h" #endif @@ -693,7 +694,7 @@ static ETHR_INLINE int ETHR_INLINE_FUNC_NAME_(ethr_rwlock_destroy)(ethr_rwlock_t *lock) { #ifdef ETHR_HAVE_NATIVE_RWSPINLOCKS - return 0; + return ethr_native_rwlock_destroy(lock); #else return ethr_rwmutex_destroy((ethr_rwmutex *) lock); #endif diff --git a/erts/preloaded/.gitignore b/erts/preloaded/.gitignore new file mode 100644 index 0000000000..40e4c68638 --- /dev/null +++ b/erts/preloaded/.gitignore @@ -0,0 +1,2 @@ +ebin/erts.app +src/prim_eval.abstr diff --git a/erts/preloaded/Makefile b/erts/preloaded/Makefile index 4235a7fe57..31fdeb96c5 100644 --- a/erts/preloaded/Makefile +++ b/erts/preloaded/Makefile @@ -18,7 +18,6 @@ # include $(ERL_TOP)/make/target.mk - SUB_DIRECTORIES = src include $(ERL_TOP)/make/otp_subdir.mk diff --git a/erts/preloaded/ebin/erl_prim_loader.beam b/erts/preloaded/ebin/erl_prim_loader.beam Binary files differindex 7903f01f76..a8c9961d87 100644 --- a/erts/preloaded/ebin/erl_prim_loader.beam +++ b/erts/preloaded/ebin/erl_prim_loader.beam diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam Binary files differindex d977b237be..09eafbcc29 100644 --- a/erts/preloaded/ebin/erlang.beam +++ b/erts/preloaded/ebin/erlang.beam diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam Binary files differindex 1b47509a53..78a45c4325 100644 --- a/erts/preloaded/ebin/erts_internal.beam +++ b/erts/preloaded/ebin/erts_internal.beam diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam Binary files differindex c2bd80df1a..f95a09c003 100644 --- a/erts/preloaded/ebin/init.beam +++ b/erts/preloaded/ebin/init.beam diff --git a/erts/preloaded/ebin/otp_ring0.beam b/erts/preloaded/ebin/otp_ring0.beam Binary files differindex 226e5a4134..25c620bdd7 100644 --- a/erts/preloaded/ebin/otp_ring0.beam +++ b/erts/preloaded/ebin/otp_ring0.beam diff --git a/erts/preloaded/ebin/prim_eval.beam b/erts/preloaded/ebin/prim_eval.beam Binary files differindex 6c7b7e5262..12e6471159 100644 --- a/erts/preloaded/ebin/prim_eval.beam +++ b/erts/preloaded/ebin/prim_eval.beam diff --git a/erts/preloaded/ebin/prim_file.beam b/erts/preloaded/ebin/prim_file.beam Binary files differindex 67e62e53f1..0b9562b8c6 100644 --- a/erts/preloaded/ebin/prim_file.beam +++ b/erts/preloaded/ebin/prim_file.beam diff --git a/erts/preloaded/ebin/prim_inet.beam b/erts/preloaded/ebin/prim_inet.beam Binary files differindex a0a4314128..8638ef677e 100644 --- a/erts/preloaded/ebin/prim_inet.beam +++ b/erts/preloaded/ebin/prim_inet.beam diff --git a/erts/preloaded/ebin/prim_zip.beam b/erts/preloaded/ebin/prim_zip.beam Binary files differindex 589f45e75e..58da9ce5ea 100644 --- a/erts/preloaded/ebin/prim_zip.beam +++ b/erts/preloaded/ebin/prim_zip.beam diff --git a/erts/preloaded/ebin/zlib.beam b/erts/preloaded/ebin/zlib.beam Binary files differindex 72d1090a52..35e4d963fd 100644 --- a/erts/preloaded/ebin/zlib.beam +++ b/erts/preloaded/ebin/zlib.beam diff --git a/erts/preloaded/src/Makefile b/erts/preloaded/src/Makefile index f53809e765..c1580b1495 100644 --- a/erts/preloaded/src/Makefile +++ b/erts/preloaded/src/Makefile @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2008-2012. All Rights Reserved. +# Copyright Ericsson AB 2008-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in @@ -55,9 +55,15 @@ ERL_FILES= $(PRE_LOADED_ERL_MODULES:%=%.erl) BEAM_FILES= $(PRE_LOADED_BEAM_MODULES:%=%.S) STUBS_FILES= $(PRE_LOADED_BEAM_MODULES:%=%.erl) -TARGET_FILES = $(PRE_LOADED_MODULES:%=$(EBIN)/%.$(EMULATOR)) +TARGET_FILES = $(PRE_LOADED_MODULES:%=$(EBIN)/%.$(EMULATOR)) \ + $(APP_TARGET) STATIC_TARGET_FILES = $(PRE_LOADED_MODULES:%=$(STATIC_EBIN)/%.$(EMULATOR)) +APP_FILE= erts.app +APP_SRC= $(APP_FILE).src +APP_TARGET= $(STATIC_EBIN)/$(APP_FILE) + + KERNEL_SRC=$(ERL_TOP)/lib/kernel/src KERNEL_INCLUDE=$(ERL_TOP)/lib/kernel/include STDLIB_INCLUDE=$(ERL_TOP)/lib/stdlib/include @@ -72,14 +78,17 @@ clean: copy: cp *.beam $(STATIC_EBIN) +$(APP_TARGET): $(APP_SRC) $(ERL_TOP)/erts/vsn.mk + $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@ + include $(ERL_TOP)/make/otp_release_targets.mk -release_spec: +release_spec: $(APP_TARGET) $(INSTALL_DIR) "$(RELSYSDIR)/src" $(INSTALL_DATA) $(ERL_FILES) $(BEAM_FILES) $(STUBS_FILES) "$(RELSYSDIR)/src" $(INSTALL_DIR) "$(RELSYSDIR)/ebin" - $(INSTALL_DATA) $(STATIC_TARGET_FILES) "$(RELSYSDIR)/ebin" + $(INSTALL_DATA) $(STATIC_TARGET_FILES) $(APP_TARGET) "$(RELSYSDIR)/ebin" release_docs_spec: diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl index 34785ff2a9..e016a50c4c 100644 --- a/erts/preloaded/src/erlang.erl +++ b/erts/preloaded/src/erlang.erl @@ -3554,8 +3554,8 @@ sched_wall_time(Ref, N, Acc) -> {Ref, SWT} -> sched_wall_time(Ref, N-1, [SWT|Acc]) end. --spec erlang:gather_gc_info_result(Ref) -> [{number(),number(),0}] when - Ref :: reference(). +-spec erlang:gather_gc_info_result(Ref) -> + {number(),number(),0} when Ref :: reference(). gather_gc_info_result(Ref) when erlang:is_reference(Ref) -> gc_info(Ref, erlang:system_info(schedulers), {0,0}). diff --git a/erts/preloaded/src/erts.app.src b/erts/preloaded/src/erts.app.src new file mode 100644 index 0000000000..fd3e8cb692 --- /dev/null +++ b/erts/preloaded/src/erts.app.src @@ -0,0 +1,41 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2013. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +{application, erts, [ + {description, "ERTS CXC 138 10"}, + {vsn, "%VSN%"}, + {modules, [ + %% preloaded + erlang, + erl_prim_loader, + erts_internal, + init, + otp_ring0, + prim_eval, + prim_file, + prim_inet, + prim_zip, + zlib + ]}, + {registered, []}, + {applications, []}, + {env, []}, + {mod, {erts, []}} + ]}. + +%% vim: ft=erlang diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl index 507bc3afb9..8a8cd52d64 100644 --- a/erts/preloaded/src/erts_internal.erl +++ b/erts/preloaded/src/erts_internal.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2012. All Rights Reserved. +%% Copyright Ericsson AB 2012-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/preloaded/src/prim_inet.erl b/erts/preloaded/src/prim_inet.erl index 36a650cb5c..fb1269cf91 100644 --- a/erts/preloaded/src/prim_inet.erl +++ b/erts/preloaded/src/prim_inet.erl @@ -177,8 +177,32 @@ close_pend_loop(S, N) -> end. close_port(S) -> - catch erlang:port_close(S), - receive {'EXIT',S,_} -> ok after 0 -> ok end. + case erlang:process_info(self(), trap_exit) of + {trap_exit,true} -> + %% Ensure exit message and consume it + link(S), + %% This is still not a perfect solution. + %% + %% The problem is to close the port and consume any exit + %% message while not knowing if this process traps exit + %% nor if this process has a link to the port. Here we + %% just knows that this process traps exit. + %% + %% If we right here get killed for some reason that exit + %% signal will propagate to the port and onwards to anyone + %% that is linked to the port. E.g when we close a socket + %% that is not ours. + %% + %% The problem can be solved with lists:member on our link + %% list but we deem that as potentially too expensive. We + %% need an is_linked/1 function or guard, or we need + %% a port_close function that can atomically unlink... + catch erlang:port_close(S), + receive {'EXIT',S,_} -> ok end; + {trap_exit,false} -> + catch erlang:port_close(S), + ok + end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% diff --git a/erts/test/nt_SUITE.erl b/erts/test/nt_SUITE.erl index 7580a7b364..e440b9e5d9 100644 --- a/erts/test/nt_SUITE.erl +++ b/erts/test/nt_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1998-2011. All Rights Reserved. +%% Copyright Ericsson AB 1998-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/test/z_SUITE.erl b/erts/test/z_SUITE.erl index 9abc73c081..ccf22a9b6b 100644 --- a/erts/test/z_SUITE.erl +++ b/erts/test/z_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2012. All Rights Reserved. +%% Copyright Ericsson AB 2008-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/erts/vsn.mk b/erts/vsn.mk index 255def22ca..e235c50f0b 100644 --- a/erts/vsn.mk +++ b/erts/vsn.mk @@ -17,8 +17,8 @@ # %CopyrightEnd% # -VSN = 5.10.2 -SYSTEM_VSN = R16B01 +VSN = 5.10.3 +SYSTEM_VSN = R16B02 # Port number 4365 in 4.2 # Port number 4366 in 4.3 diff --git a/lib/asn1/doc/src/notes.xml b/lib/asn1/doc/src/notes.xml index 76d605569d..4b5bba742c 100644 --- a/lib/asn1/doc/src/notes.xml +++ b/lib/asn1/doc/src/notes.xml @@ -31,6 +31,72 @@ <p>This document describes the changes made to the asn1 application.</p> +<section><title>Asn1 2.0.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fix some Makefile rules that didn't support silent rules. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11111</p> + </item> + <item> + <p>PER/UPER: A semi-constrained INTEGER with a non-zero + lower bound would be incorrectly decoded. This bug was + introduced in R16.</p> + <p>PER/UPER: Given <c>INTEGER (10..MAX, ...)</c>, + attempting to decode any integer below 10 would cause the + encoder to enter an infinite loop.</p> + <p>PER/UPER: For a type with an extensible SIZE + constraint, sizes outside of the root range were + incorrectly encoded.</p> + <p>Given a constraint such as <c>(SIZE (5, ...))</c>, + encoding a size less than 5 would fail (PER/UPER). + Similarly, for BER decoding would fail.</p> + <p>PER: The encoder did not align a known multiplier + string (such as IA5String) of length 16 bits (exactly) to + an octet boundary.</p> + <p>In rare circumstances, DEFAULT values for the UPER + backend could be wrongly encoded.</p> + <p> + Own Id: OTP-11134</p> + </item> + <item> + <p>UPER: The compiler would crash when compiling an + ENUMERATED having more than 63 extended values.</p> + <p>PER/UPER: A SEQUENCE with more 64 extended values + could not be decoded.</p> + <p> + Own Id: OTP-11153</p> + </item> + <item> + <p> + When decoding a SEQUENCE defined inline inside a an + extension addition group, the record named generated by + the decoding code would not match the name in the + generated .hrl file.</p> + <p> + Own Id: OTP-11154 Aux Id: seq12339 </p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + <section><title>Asn1 2.0.1.2</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/asn1/src/asn1_db.erl b/lib/asn1/src/asn1_db.erl index e96ca9ae25..869b36ddbd 100644 --- a/lib/asn1/src/asn1_db.erl +++ b/lib/asn1/src/asn1_db.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl index efb55cf015..d279e9697f 100644 --- a/lib/asn1/src/asn1ct_constructed_per.erl +++ b/lib/asn1/src/asn1ct_constructed_per.erl @@ -354,8 +354,7 @@ gen_dec_constructed_imm_2(Typename, CompList, %% we don't return named lists any more Cnames = mkcnamelist(CompList), demit({"Result = "}), %dbg %% return value as record - RecordName = lists:concat([get_record_name_prefix(), - asn1ct_gen:list2rname(Typename)]), + RecordName = record_name(Typename), case Typename of ['EXTERNAL'] -> emit({" OldFormat={'",RecordName, @@ -377,6 +376,29 @@ gen_dec_constructed_imm_2(Typename, CompList, end, emit({{curr,bytes},"}"}). +%% record_name([TypeName]) -> RecordNameString +%% Construct a record name for the constructed type, ignoring any +%% fake sequences that are used to represent an extension addition +%% group. Such fake sequences never appear as a top type, and their +%% name always start with "ExtAddGroup". + +record_name(Typename0) -> + [TopType|Typename1] = lists:reverse(Typename0), + Typename = filter_ext_add_groups(Typename1, [TopType]), + lists:concat([get_record_name_prefix(), + asn1ct_gen:list2rname(Typename)]). + +filter_ext_add_groups([H|T], Acc) when is_atom(H) -> + case atom_to_list(H) of + "ExtAddGroup"++_ -> + filter_ext_add_groups(T, Acc); + _ -> + filter_ext_add_groups(T, [H|Acc]) + end; +filter_ext_add_groups([H|T], Acc) -> + filter_ext_add_groups(T, [H|Acc]); +filter_ext_add_groups([], Acc) -> Acc. + textual_order([#'ComponentType'{textual_order=undefined}|_],TermList) -> TermList; textual_order(CompList,TermList) when is_list(CompList) -> diff --git a/lib/asn1/src/asn1ct_func.erl b/lib/asn1/src/asn1ct_func.erl index 262bef6862..ab0dbcce8f 100644 --- a/lib/asn1/src/asn1ct_func.erl +++ b/lib/asn1/src/asn1ct_func.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2012. All Rights Reserved. +%% Copyright Ericsson AB 2012-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/src/asn1ct_gen_per.erl b/lib/asn1/src/asn1ct_gen_per.erl index 30c9ab9365..69d9d51bf1 100644 --- a/lib/asn1/src/asn1ct_gen_per.erl +++ b/lib/asn1/src/asn1ct_gen_per.erl @@ -250,7 +250,8 @@ emit_enc_enumerated_case(Erules, C, EnumName, Count) -> enc_ext_and_val(per, E, F, Args) -> [E|apply(asn1ct_eval_per, F, Args)]; enc_ext_and_val(uper, E, F, Args) -> - <<E:1,(apply(asn1ct_eval_uper, F, Args))/bitstring>>. + Bs = list_to_bitstring([apply(asn1ct_eval_uper, F, Args)]), + <<E:1,Bs/bitstring>>. %% Object code generating for encoding and decoding diff --git a/lib/asn1/src/asn1ct_imm.erl b/lib/asn1/src/asn1ct_imm.erl index c6803a0f96..bf362db843 100644 --- a/lib/asn1/src/asn1ct_imm.erl +++ b/lib/asn1/src/asn1ct_imm.erl @@ -86,7 +86,7 @@ per_dec_enumerated(BaseNamedList, NamedListExt0, Aligned) -> bit_case(Base, Ext). per_dec_extension_map(Aligned) -> - Len = {add,per_dec_normally_small_number(Aligned),1}, + Len = per_dec_normally_small_length(Aligned), {get_bits,Len,[1,bitstring]}. per_dec_integer(Constraint0, Aligned) -> @@ -240,6 +240,11 @@ per_dec_normally_small_number(Aligned) -> Unlimited = per_decode_semi_constrained(0, Aligned), bit_case(Small, Unlimited). +per_dec_normally_small_length(Aligned) -> + Small = {add,{get_bits,6,[1]},1}, + Unlimited = decode_unconstrained_length(false, Aligned), + bit_case(Small, Unlimited). + per_decode_semi_constrained(Lb, Aligned) -> add_lb(Lb, {get_bits,decode_unconstrained_length(false, Aligned),[8]}). diff --git a/lib/asn1/src/asn1ct_name.erl b/lib/asn1/src/asn1ct_name.erl index c0c2ed302c..ba52e66ce3 100644 --- a/lib/asn1/src/asn1ct_name.erl +++ b/lib/asn1/src/asn1ct_name.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/src/asn1ct_parser2.erl b/lib/asn1/src/asn1ct_parser2.erl index 344fdf44dd..1abccc8626 100644 --- a/lib/asn1/src/asn1ct_parser2.erl +++ b/lib/asn1/src/asn1ct_parser2.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2000-2012. All Rights Reserved. +%% Copyright Ericsson AB 2000-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/asn1_SUITE.erl b/lib/asn1/test/asn1_SUITE.erl index 6be493320c..f00b23a8b2 100644 --- a/lib/asn1/test/asn1_SUITE.erl +++ b/lib/asn1/test/asn1_SUITE.erl @@ -454,10 +454,13 @@ testSeqDefault(Config, Rule, Opts) -> testSeqExtension(Config) -> test(Config, fun testSeqExtension/3). testSeqExtension(Config, Rule, Opts) -> - asn1_test_lib:compile_all(["External", "SeqExtension"], Config, + asn1_test_lib:compile_all(["External", + "SeqExtension", + "SeqExtension2"], + Config, [Rule|Opts]), DataDir = ?config(data_dir, Config), - testSeqExtension:main(DataDir, [Rule|Opts]). + testSeqExtension:main(Rule, DataDir, [Rule|Opts]). testSeqExternal(Config) -> test(Config, fun testSeqExternal/3). testSeqExternal(Config, Rule, Opts) -> diff --git a/lib/asn1/test/asn1_SUITE_data/EnumExt.asn1 b/lib/asn1/test/asn1_SUITE_data/EnumExt.asn1 index 3a727e46bb..8dc5f3d7e1 100644 --- a/lib/asn1/test/asn1_SUITE_data/EnumExt.asn1 +++ b/lib/asn1/test/asn1_SUITE_data/EnumExt.asn1 @@ -31,5 +31,25 @@ Seq ::= SEQUENCE { i INTEGER } +EnumExtBig ::= ENUMERATED { + base, + ..., + e00,e01,e02,e03,e04,e05,e06,e07,e08,e09,e0a,e0b,e0c,e0d,e0e,e0f, + e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e1a,e1b,e1c,e1d,e1e,e1f, + e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e2a,e2b,e2c,e2d,e2e,e2f, + e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e3a,e3b,e3c,e3d,e3e,e3f, + e40,e41,e42,e43,e44,e45,e46,e47,e48,e49,e4a,e4b,e4c,e4d,e4e,e4f, + e50,e51,e52,e53,e54,e55,e56,e57,e58,e59,e5a,e5b,e5c,e5d,e5e,e5f, + e60,e61,e62,e63,e64,e65,e66,e67,e68,e69,e6a,e6b,e6c,e6d,e6e,e6f, + e70,e71,e72,e73,e74,e75,e76,e77,e78,e79,e7a,e7b,e7c,e7d,e7e,e7f, + e80 +} + +SeqBig ::= SEQUENCE { + b BOOLEAN, + e EnumExtBig, + i INTEGER +} + END diff --git a/lib/asn1/test/asn1_SUITE_data/Extension-Addition-Group.asn b/lib/asn1/test/asn1_SUITE_data/Extension-Addition-Group.asn index b07dcd8baa..0e905d8839 100644 --- a/lib/asn1/test/asn1_SUITE_data/Extension-Addition-Group.asn +++ b/lib/asn1/test/asn1_SUITE_data/Extension-Addition-Group.asn @@ -118,4 +118,23 @@ AC-BarringConfig ::= SEQUENCE { ac-BarringForSpecialAC BIT STRING (SIZE(5)) } +InlinedSeq ::= SEQUENCE { + ..., + [[ + s SEQUENCE { + a INTEGER, + b BOOLEAN + } + ]] +} + +-- 'ExtAddGroup1' is used internally to represent fake sequences for +-- extension addition groups. Make sure that a real sequence with that +-- name at the top-level doesn't cause a problem. + +ExtAddGroup1 ::= SEQUENCE { + x INTEGER, + y INTEGER +} + END diff --git a/lib/asn1/test/asn1_SUITE_data/SeqExtension2.asn1 b/lib/asn1/test/asn1_SUITE_data/SeqExtension2.asn1 new file mode 100644 index 0000000000..44900d9d39 --- /dev/null +++ b/lib/asn1/test/asn1_SUITE_data/SeqExtension2.asn1 @@ -0,0 +1,208 @@ +SeqExtension2 DEFINITIONS AUTOMATIC TAGS ::= +BEGIN + +SeqExt66 ::= SEQUENCE { + ..., + i0 INTEGER (0..127) OPTIONAL, + i1 INTEGER (0..127) OPTIONAL, + i2 INTEGER (0..127) OPTIONAL, + i3 INTEGER (0..127) OPTIONAL, + i4 INTEGER (0..127) OPTIONAL, + i5 INTEGER (0..127) OPTIONAL, + i6 INTEGER (0..127) OPTIONAL, + i7 INTEGER (0..127) OPTIONAL, + i8 INTEGER (0..127) OPTIONAL, + i9 INTEGER (0..127) OPTIONAL, + i10 INTEGER (0..127) OPTIONAL, + i11 INTEGER (0..127) OPTIONAL, + i12 INTEGER (0..127) OPTIONAL, + i13 INTEGER (0..127) OPTIONAL, + i14 INTEGER (0..127) OPTIONAL, + i15 INTEGER (0..127) OPTIONAL, + i16 INTEGER (0..127) OPTIONAL, + i17 INTEGER (0..127) OPTIONAL, + i18 INTEGER (0..127) OPTIONAL, + i19 INTEGER (0..127) OPTIONAL, + i20 INTEGER (0..127) OPTIONAL, + i21 INTEGER (0..127) OPTIONAL, + i22 INTEGER (0..127) OPTIONAL, + i23 INTEGER (0..127) OPTIONAL, + i24 INTEGER (0..127) OPTIONAL, + i25 INTEGER (0..127) OPTIONAL, + i26 INTEGER (0..127) OPTIONAL, + i27 INTEGER (0..127) OPTIONAL, + i28 INTEGER (0..127) OPTIONAL, + i29 INTEGER (0..127) OPTIONAL, + i30 INTEGER (0..127) OPTIONAL, + i31 INTEGER (0..127) OPTIONAL, + i32 INTEGER (0..127) OPTIONAL, + i33 INTEGER (0..127) OPTIONAL, + i34 INTEGER (0..127) OPTIONAL, + i35 INTEGER (0..127) OPTIONAL, + i36 INTEGER (0..127) OPTIONAL, + i37 INTEGER (0..127) OPTIONAL, + i38 INTEGER (0..127) OPTIONAL, + i39 INTEGER (0..127) OPTIONAL, + i40 INTEGER (0..127) OPTIONAL, + i41 INTEGER (0..127) OPTIONAL, + i42 INTEGER (0..127) OPTIONAL, + i43 INTEGER (0..127) OPTIONAL, + i44 INTEGER (0..127) OPTIONAL, + i45 INTEGER (0..127) OPTIONAL, + i46 INTEGER (0..127) OPTIONAL, + i47 INTEGER (0..127) OPTIONAL, + i48 INTEGER (0..127) OPTIONAL, + i49 INTEGER (0..127) OPTIONAL, + i50 INTEGER (0..127) OPTIONAL, + i51 INTEGER (0..127) OPTIONAL, + i52 INTEGER (0..127) OPTIONAL, + i53 INTEGER (0..127) OPTIONAL, + i54 INTEGER (0..127) OPTIONAL, + i55 INTEGER (0..127) OPTIONAL, + i56 INTEGER (0..127) OPTIONAL, + i57 INTEGER (0..127) OPTIONAL, + i58 INTEGER (0..127) OPTIONAL, + i59 INTEGER (0..127) OPTIONAL, + i60 INTEGER (0..127) OPTIONAL, + i61 INTEGER (0..127) OPTIONAL, + i62 INTEGER (0..127) OPTIONAL, + i63 INTEGER (0..127) OPTIONAL, + i64 INTEGER (0..127) OPTIONAL, + i65 INTEGER (0..127) OPTIONAL +} + +SeqExt130 ::= SEQUENCE { + ..., + i0 INTEGER (0..255) OPTIONAL, + i1 INTEGER (0..255) OPTIONAL, + i2 INTEGER (0..255) OPTIONAL, + i3 INTEGER (0..255) OPTIONAL, + i4 INTEGER (0..255) OPTIONAL, + i5 INTEGER (0..255) OPTIONAL, + i6 INTEGER (0..255) OPTIONAL, + i7 INTEGER (0..255) OPTIONAL, + i8 INTEGER (0..255) OPTIONAL, + i9 INTEGER (0..255) OPTIONAL, + i10 INTEGER (0..255) OPTIONAL, + i11 INTEGER (0..255) OPTIONAL, + i12 INTEGER (0..255) OPTIONAL, + i13 INTEGER (0..255) OPTIONAL, + i14 INTEGER (0..255) OPTIONAL, + i15 INTEGER (0..255) OPTIONAL, + i16 INTEGER (0..255) OPTIONAL, + i17 INTEGER (0..255) OPTIONAL, + i18 INTEGER (0..255) OPTIONAL, + i19 INTEGER (0..255) OPTIONAL, + i20 INTEGER (0..255) OPTIONAL, + i21 INTEGER (0..255) OPTIONAL, + i22 INTEGER (0..255) OPTIONAL, + i23 INTEGER (0..255) OPTIONAL, + i24 INTEGER (0..255) OPTIONAL, + i25 INTEGER (0..255) OPTIONAL, + i26 INTEGER (0..255) OPTIONAL, + i27 INTEGER (0..255) OPTIONAL, + i28 INTEGER (0..255) OPTIONAL, + i29 INTEGER (0..255) OPTIONAL, + i30 INTEGER (0..255) OPTIONAL, + i31 INTEGER (0..255) OPTIONAL, + i32 INTEGER (0..255) OPTIONAL, + i33 INTEGER (0..255) OPTIONAL, + i34 INTEGER (0..255) OPTIONAL, + i35 INTEGER (0..255) OPTIONAL, + i36 INTEGER (0..255) OPTIONAL, + i37 INTEGER (0..255) OPTIONAL, + i38 INTEGER (0..255) OPTIONAL, + i39 INTEGER (0..255) OPTIONAL, + i40 INTEGER (0..255) OPTIONAL, + i41 INTEGER (0..255) OPTIONAL, + i42 INTEGER (0..255) OPTIONAL, + i43 INTEGER (0..255) OPTIONAL, + i44 INTEGER (0..255) OPTIONAL, + i45 INTEGER (0..255) OPTIONAL, + i46 INTEGER (0..255) OPTIONAL, + i47 INTEGER (0..255) OPTIONAL, + i48 INTEGER (0..255) OPTIONAL, + i49 INTEGER (0..255) OPTIONAL, + i50 INTEGER (0..255) OPTIONAL, + i51 INTEGER (0..255) OPTIONAL, + i52 INTEGER (0..255) OPTIONAL, + i53 INTEGER (0..255) OPTIONAL, + i54 INTEGER (0..255) OPTIONAL, + i55 INTEGER (0..255) OPTIONAL, + i56 INTEGER (0..255) OPTIONAL, + i57 INTEGER (0..255) OPTIONAL, + i58 INTEGER (0..255) OPTIONAL, + i59 INTEGER (0..255) OPTIONAL, + i60 INTEGER (0..255) OPTIONAL, + i61 INTEGER (0..255) OPTIONAL, + i62 INTEGER (0..255) OPTIONAL, + i63 INTEGER (0..255) OPTIONAL, + i64 INTEGER (0..255) OPTIONAL, + i65 INTEGER (0..255) OPTIONAL, + i66 INTEGER (0..255) OPTIONAL, + i67 INTEGER (0..255) OPTIONAL, + i68 INTEGER (0..255) OPTIONAL, + i69 INTEGER (0..255) OPTIONAL, + i70 INTEGER (0..255) OPTIONAL, + i71 INTEGER (0..255) OPTIONAL, + i72 INTEGER (0..255) OPTIONAL, + i73 INTEGER (0..255) OPTIONAL, + i74 INTEGER (0..255) OPTIONAL, + i75 INTEGER (0..255) OPTIONAL, + i76 INTEGER (0..255) OPTIONAL, + i77 INTEGER (0..255) OPTIONAL, + i78 INTEGER (0..255) OPTIONAL, + i79 INTEGER (0..255) OPTIONAL, + i80 INTEGER (0..255) OPTIONAL, + i81 INTEGER (0..255) OPTIONAL, + i82 INTEGER (0..255) OPTIONAL, + i83 INTEGER (0..255) OPTIONAL, + i84 INTEGER (0..255) OPTIONAL, + i85 INTEGER (0..255) OPTIONAL, + i86 INTEGER (0..255) OPTIONAL, + i87 INTEGER (0..255) OPTIONAL, + i88 INTEGER (0..255) OPTIONAL, + i89 INTEGER (0..255) OPTIONAL, + i90 INTEGER (0..255) OPTIONAL, + i91 INTEGER (0..255) OPTIONAL, + i92 INTEGER (0..255) OPTIONAL, + i93 INTEGER (0..255) OPTIONAL, + i94 INTEGER (0..255) OPTIONAL, + i95 INTEGER (0..255) OPTIONAL, + i96 INTEGER (0..255) OPTIONAL, + i97 INTEGER (0..255) OPTIONAL, + i98 INTEGER (0..255) OPTIONAL, + i99 INTEGER (0..255) OPTIONAL, + i100 INTEGER (0..255) OPTIONAL, + i101 INTEGER (0..255) OPTIONAL, + i102 INTEGER (0..255) OPTIONAL, + i103 INTEGER (0..255) OPTIONAL, + i104 INTEGER (0..255) OPTIONAL, + i105 INTEGER (0..255) OPTIONAL, + i106 INTEGER (0..255) OPTIONAL, + i107 INTEGER (0..255) OPTIONAL, + i108 INTEGER (0..255) OPTIONAL, + i109 INTEGER (0..255) OPTIONAL, + i110 INTEGER (0..255) OPTIONAL, + i111 INTEGER (0..255) OPTIONAL, + i112 INTEGER (0..255) OPTIONAL, + i113 INTEGER (0..255) OPTIONAL, + i114 INTEGER (0..255) OPTIONAL, + i115 INTEGER (0..255) OPTIONAL, + i116 INTEGER (0..255) OPTIONAL, + i117 INTEGER (0..255) OPTIONAL, + i118 INTEGER (0..255) OPTIONAL, + i119 INTEGER (0..255) OPTIONAL, + i120 INTEGER (0..255) OPTIONAL, + i121 INTEGER (0..255) OPTIONAL, + i122 INTEGER (0..255) OPTIONAL, + i123 INTEGER (0..255) OPTIONAL, + i124 INTEGER (0..255) OPTIONAL, + i125 INTEGER (0..255) OPTIONAL, + i126 INTEGER (0..255) OPTIONAL, + i127 INTEGER (0..255) OPTIONAL, + i128 INTEGER (0..255) OPTIONAL, + i129 INTEGER (0..255) OPTIONAL +} + +END diff --git a/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl b/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl index 00e4c707dd..8e21e6ca84 100644 --- a/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl +++ b/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl @@ -34,6 +34,9 @@ run(Erule) -> run3(), run3(Erule), + roundtrip('InlinedSeq', #'InlinedSeq'{s=#'InlinedSeq_s'{a=42,b=true}}), + roundtrip('ExtAddGroup1', #'ExtAddGroup1'{x=42,y=1023}), + ok. %% From X.691 (07/2002) A.4. diff --git a/lib/asn1/test/asn1_test_lib.erl b/lib/asn1/test/asn1_test_lib.erl index b839dfcf2a..60b2b2b42e 100644 --- a/lib/asn1/test/asn1_test_lib.erl +++ b/lib/asn1/test/asn1_test_lib.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2012. All Rights Reserved. +%% Copyright Ericsson AB 2008-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -22,6 +22,7 @@ -export([compile/3]). -export([compile_all/3]). -export([compile_erlang/3]). +-export([hex_to_bin/1]). -export([ticket_7407_compile/2,ticket_7407_code/1, ticket_7678/2, ticket_7708/2, ticket_7763/1, ticket_7876/3]). @@ -61,6 +62,13 @@ compile_erlang(Mod, Config, Options) -> {ok, M} = compile:file(filename:join(DataDir, Mod), [report,{i,CaseDir},{outdir,CaseDir}|Options]). +hex_to_bin(S) -> + << <<(hex2num(C)):4>> || C <- S, C =/= $\s >>. + +%%% +%%% Internal functions. +%%% + should_load(File, Options) -> case lists:member(abs, Options) of true -> @@ -79,6 +87,10 @@ strip_extension(File, Ext) when Ext == ".asn"; Ext == ".set"; Ext == ".asn1"-> strip_extension(File, _Ext) -> File. +hex2num(C) when $0 =< C, C =< $9 -> C - $0; +hex2num(C) when $A =< C, C =< $F -> C - $A + 10; +hex2num(C) when $a =< C, C =< $f -> C - $a + 10. + ticket_7407_compile(Config,Option) -> ?line DataDir = ?config(data_dir,Config), diff --git a/lib/asn1/test/testChoExtension.erl b/lib/asn1/test/testChoExtension.erl index 5c67ff62ce..c6a07646c2 100644 --- a/lib/asn1/test/testChoExtension.erl +++ b/lib/asn1/test/testChoExtension.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/testCompactBitString.erl b/lib/asn1/test/testCompactBitString.erl index 28ab2464e9..f74992a79e 100644 --- a/lib/asn1/test/testCompactBitString.erl +++ b/lib/asn1/test/testCompactBitString.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2012. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/testConstraints.erl b/lib/asn1/test/testConstraints.erl index e825302629..03a09492af 100644 --- a/lib/asn1/test/testConstraints.erl +++ b/lib/asn1/test/testConstraints.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2012. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -126,19 +126,29 @@ int_constraints(Rules) -> %%========================================================== roundtrip('SemiConstrained', 100), + v_roundtrip(Rules, 'SemiConstrained', 100+128), roundtrip('SemiConstrained', 397249742397243), + roundtrip('SemiConstrained', 100 + 1 bsl 128*8), + roundtrip('SemiConstrained', 100 + 1 bsl 256*8), + roundtrip('NegSemiConstrained', -128), + v_roundtrip(Rules, 'NegSemiConstrained', 0), roundtrip('NegSemiConstrained', -1), roundtrip('NegSemiConstrained', 500), roundtrip('SemiConstrainedExt', -65536), roundtrip('SemiConstrainedExt', 0), roundtrip('SemiConstrainedExt', 42), + v_roundtrip(Rules, 'SemiConstrainedExt', 42+128), roundtrip('SemiConstrainedExt', 100), roundtrip('SemiConstrainedExt', 47777789), + roundtrip('SemiConstrainedExt', 42 + 1 bsl 128*8), + roundtrip('SemiConstrainedExt', 42 + 1 bsl 256*8), + roundtrip('NegSemiConstrainedExt', -1023), roundtrip('NegSemiConstrainedExt', -128), roundtrip('NegSemiConstrainedExt', -1), + v_roundtrip(Rules, 'NegSemiConstrainedExt', 0), roundtrip('NegSemiConstrainedExt', 500), %%========================================================== @@ -174,6 +184,21 @@ int_constraints(Rules) -> ok. +%% PER: Ensure that if the lower bound is Lb, Lb+16#80 is encoded +%% in two bytes as 16#0180. (Not in three bytes as 16#010080.) +v(ber, 'SemiConstrained', 100+128) -> "020200E4"; +v(per, 'SemiConstrained', 100+128) -> "0180"; +v(uper, 'SemiConstrained', 100+128) -> "0180"; +v(ber, 'NegSemiConstrained', 0) -> "020100"; +v(per, 'NegSemiConstrained', 0) -> "0180"; +v(uper, 'NegSemiConstrained', 0) -> "0180"; +v(ber, 'SemiConstrainedExt', 42+128) -> "020200AA"; +v(per, 'SemiConstrainedExt', 42+128) -> "000180"; +v(uper, 'SemiConstrainedExt', 42+128) -> "00C000"; +v(ber, 'NegSemiConstrainedExt', 0) -> "020100"; +v(per, 'NegSemiConstrainedExt', 0) -> "000180"; +v(uper, 'NegSemiConstrainedExt', 0) -> "00C000". + shorter_ext(per, "a") -> <<16#80,16#01,16#61>>; shorter_ext(uper, "a") -> <<16#80,16#E1>>; shorter_ext(ber, _) -> none. @@ -183,13 +208,17 @@ refed_NNL_name(_Erule) -> ?line {error,_Reason} = asn1_wrapper:encode('Constraints','AnotherThing',fred3). +v_roundtrip(Erule, Type, Value) -> + Encoded = asn1_test_lib:hex_to_bin(v(Erule, Type, Value)), + Encoded = roundtrip('Constraints', Type, Value). + roundtrip(Type, Value) -> roundtrip('Constraints', Type, Value). roundtrip(Module, Type, Value) -> {ok,Encoded} = Module:encode(Type, Value), {ok,Value} = Module:decode(Type, Encoded), - ok. + Encoded. roundtrip_enc(Type, Value, Enc) -> Module = 'Constraints', diff --git a/lib/asn1/test/testDeepTConstr.erl b/lib/asn1/test/testDeepTConstr.erl index e826cafa0c..f17dedc043 100644 --- a/lib/asn1/test/testDeepTConstr.erl +++ b/lib/asn1/test/testDeepTConstr.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2012. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/testEnumExt.erl b/lib/asn1/test/testEnumExt.erl index 8840ed6d2f..cbc13ee6da 100644 --- a/lib/asn1/test/testEnumExt.erl +++ b/lib/asn1/test/testEnumExt.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1998-2012. All Rights Reserved. +%% Copyright Ericsson AB 1998-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -38,7 +38,7 @@ main(Rule) when Rule =:= per; Rule =:= uper -> %% ENUMERATED no extensionmark B64 = <<64>>, B64 = roundtrip('Noext', red), - common(); + common(Rule); main(ber) -> io:format("main(ber)~n",[]), %% ENUMERATED with extensionmark (value is in root set) @@ -56,18 +56,38 @@ main(ber) -> roundtrip('Globalstate', preop), roundtrip('Globalstate', com), - common(). + common(ber). -common() -> +common(Erule) -> roundtrip('Seq', {'Seq',blue,42}), roundtrip('Seq', {'Seq',red,42}), roundtrip('Seq', {'Seq',green,42}), roundtrip('Seq', {'Seq',orange,47}), roundtrip('Seq', {'Seq',black,4711}), roundtrip('Seq', {'Seq',magenta,4712}), + + [begin + S = io_lib:format("e~2.016.0b", [I]), + E = list_to_atom(lists:flatten(S)), + roundtrip('SeqBig', {'SeqBig',true,E,9357}) + end || I <- lists:seq(0, 128)], + + v_roundtrip(Erule, 'SeqBig', {'SeqBig',true,e40,9357}), + v_roundtrip(Erule, 'SeqBig', {'SeqBig',true,e80,9357}), ok. roundtrip(Type, Value) -> {ok,Encoded} = 'EnumExt':encode(Type, Value), {ok,Value} = 'EnumExt':decode(Type, Encoded), Encoded. + +v_roundtrip(Erule, Type, Value) -> + Encoded = roundtrip(Type, Value), + Encoded = asn1_test_lib:hex_to_bin(v(Erule, Value)). + +v(ber, {'SeqBig',true,e40,9357}) -> "300A8001 FF810141 8202248D"; +v(ber, {'SeqBig',true,e80,9357}) -> "300B8001 FF810200 81820224 8D"; +v(per, {'SeqBig',true,e40,9357}) -> "E0014002 248D"; +v(per, {'SeqBig',true,e80,9357}) -> "E0018002 248D"; +v(uper, {'SeqBig',true,e40,9357}) -> "E0280044 91A0"; +v(uper, {'SeqBig',true,e80,9357}) -> "E0300044 91A0". diff --git a/lib/asn1/test/testInfObj.erl b/lib/asn1/test/testInfObj.erl index 75f4dae310..c7b19a0cbb 100644 --- a/lib/asn1/test/testInfObj.erl +++ b/lib/asn1/test/testInfObj.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2012. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/testParameterizedInfObj.erl b/lib/asn1/test/testParameterizedInfObj.erl index 212df79fd4..1dfa52f401 100644 --- a/lib/asn1/test/testParameterizedInfObj.erl +++ b/lib/asn1/test/testParameterizedInfObj.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2012. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/testPrim.erl b/lib/asn1/test/testPrim.erl index 990e7adcd9..a6e68a9fe0 100644 --- a/lib/asn1/test/testPrim.erl +++ b/lib/asn1/test/testPrim.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/test/testSeqExtension.erl b/lib/asn1/test/testSeqExtension.erl index 1128d9a7c3..b996634996 100644 --- a/lib/asn1/test/testSeqExtension.erl +++ b/lib/asn1/test/testSeqExtension.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -20,7 +20,7 @@ -module(testSeqExtension). -include("External.hrl"). --export([main/2]). +-export([main/3]). -include_lib("test_server/include/test_server.hrl"). @@ -32,7 +32,7 @@ -record('SeqExt6',{i1,i2,i3,i4,i5,i6,i7}). -record('SuperSeq',{s1,s2,s3,s4,s5,s6,i}). -main(DataDir, Opts) -> +main(Erule, DataDir, Opts) -> roundtrip('SeqExt1', #'SeqExt1'{}), roundtrip('SeqExt2', #'SeqExt2'{bool=true,int=99}), @@ -92,9 +92,38 @@ main(DataDir, Opts) -> s5={'SeqExt5'}, s6={'SeqExt6',531,601,999,777,11953}, i=BigInt} = DecodedSuperSeq, + + + %% Test more than 64 extensions. + roundtrip2('SeqExt66', + list_to_tuple(['SeqExt66'|lists:seq(0, 65)])), + v_roundtrip2(Erule, 'SeqExt66', + list_to_tuple(['SeqExt66'| + lists:duplicate(65, asn1_NOVALUE)++[125]])), + roundtrip2('SeqExt130', + list_to_tuple(['SeqExt130'|lists:seq(0, 129)])), + v_roundtrip2(Erule, 'SeqExt130', + list_to_tuple(['SeqExt130'| + lists:duplicate(129, asn1_NOVALUE)++[199]])), ok. roundtrip(Type, Value) -> {ok,Encoded} = 'SeqExtension':encode(Type, Value), {ok,Value} = 'SeqExtension':decode(Type, Encoded), ok. + +v_roundtrip2(Erule, Type, Value) -> + Encoded = asn1_test_lib:hex_to_bin(v(Erule, Type)), + Encoded = roundtrip2(Type, Value). + +roundtrip2(Type, Value) -> + {ok,Encoded} = 'SeqExtension2':encode(Type, Value), + {ok,Value} = 'SeqExtension2':decode(Type, Encoded), + Encoded. + +v(ber, 'SeqExt66') -> "30049F41 017D"; +v(per, 'SeqExt66') -> "C0420000 00000000 00004001 FA"; +v(uper, 'SeqExt66') -> "D0800000 00000000 00101FA0"; +v(ber, 'SeqExt130') -> "30069F81 010200C7"; +v(per, 'SeqExt130') -> "C0808200 00000000 00000000 00000000 00000040 01C7"; +v(uper, 'SeqExt130') -> "E0208000 00000000 00000000 00000000 0000101C 70". diff --git a/lib/asn1/test/testSeqOf.erl b/lib/asn1/test/testSeqOf.erl index c1af0d7a32..db537b1478 100644 --- a/lib/asn1/test/testSeqOf.erl +++ b/lib/asn1/test/testSeqOf.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/asn1/vsn.mk b/lib/asn1/vsn.mk index 9245f83280..b75de179dc 100644 --- a/lib/asn1/vsn.mk +++ b/lib/asn1/vsn.mk @@ -1,2 +1,2 @@ #next version number to use is 2.0 -ASN1_VSN = 2.0.1.2 +ASN1_VSN = 2.0.2 diff --git a/lib/common_test/doc/src/notes.xml b/lib/common_test/doc/src/notes.xml index 5d2c065385..2d6bcc0d8b 100644 --- a/lib/common_test/doc/src/notes.xml +++ b/lib/common_test/doc/src/notes.xml @@ -32,6 +32,158 @@ <file>notes.xml</file> </header> +<section><title>Common_Test 1.7.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + A design flaw in the generic connection handling in + Common Test made it impossible to implement a connection + handler that could map multiple connection names (i.e. + configuration variable aliases) to single connection + pids. This problem has been solved.</p> + <p> + Own Id: OTP-10126 Aux Id: kunagi-178 [89] </p> + </item> + <item> + <p> + If a telnet connection is hanging, then a call to + ct_telnet:close/1 will time out after 5 seconds and the + connection process is brutally killed. In some cases the + connection would not be unregistered and attempts at + opening a new connection with the same name would make + common_test try to reuse the same connection since it + believed that it was still alive. This has been corrected + - a killed connection is now always unregistered.</p> + <p> + Own Id: OTP-10648 Aux Id: seq12212 </p> + </item> + <item> + <p> + Test performance has been improved by means of a cache + for the top level HTML index logs (all_runs.html and + index.html, in the logdir directory). This solves + problems with slow start up times and test execution + times increasing with the number of ct_run directories + stored in logdir. The cached index entries are stored in + RAM during test execution and are saved to file in logdir + (for faster start up times) whenever a test run finishes.</p> + <p> + Own Id: OTP-10855</p> + </item> + <item> + <p> + Testing of the test specification functionality has been + improved and a couple of minor bugs have been discovered + and corrected.</p> + <p> + Own Id: OTP-10857</p> + </item> + <item> + <p> + Links to the top level index files in some HTML footers + had disappeared. This error has been corrected. Also, a + problem with the suite overview log file not being closed + properly has been solved.</p> + <p> + Own Id: OTP-11046</p> + </item> + <item> + <p> + Common Test would, in case of timetrap error, print a + warning in the log if end_per_testcase wasn't implemented + in the suite, even though it's an optional function. This + printout has been removed.</p> + <p> + Own Id: OTP-11052</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + If it could not be decided which test case a certain log + printout belonged to, the common test framework log was + earlier used. Such printouts are now instead sent to + unexpected_io.log.html in test_server so that there is + only one place to look for "missing" printouts.</p> + <p> + Own Id: OTP-10494 Aux Id: kunagi-319 [230] </p> + </item> + <item> + <p> + Make cover smarter about finding source from beam.</p> + <p> + In particular, search using the source path in + module_info if the current heuristic fails.</p> + <p> + Own Id: OTP-10902</p> + </item> + <item> + <p> + Add a variant of ct_slave:start/2 that starts a node with + specified options on the local host.</p> + <p> + Own Id: OTP-10920</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + <item> + <p> + A link is added from the red error printout in a test + case log (for a failed test case) to the full error + description at the end of the log. The reason for this is + that the error description in the red field is sometimes + truncated at 50 characters in order to keep the log as + short and easy to read as possible.</p> + <p> + Own Id: OTP-11044 Aux Id: seq12304 </p> + </item> + <item> + <p> + A new option 'no_prompt_check' is added to + ct_telnet:expect/3. If this option is used, ct_telnet + will not wait for a prompt or a newline before attempting + to match the given pattern.</p> + <p> + Own Id: OTP-11095</p> + </item> + </list> + </section> + +</section> + <section><title>Common_Test 1.7.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/common_test/src/ct_ftp.erl b/lib/common_test/src/ct_ftp.erl index b91a521bd4..71fd8754ff 100644 --- a/lib/common_test/src/ct_ftp.erl +++ b/lib/common_test/src/ct_ftp.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2003-2012. All Rights Reserved. +%% Copyright Ericsson AB 2003-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/common_test/src/ct_netconfc.erl b/lib/common_test/src/ct_netconfc.erl index e094ee877a..7f10e1db09 100644 --- a/lib/common_test/src/ct_netconfc.erl +++ b/lib/common_test/src/ct_netconfc.erl @@ -247,7 +247,11 @@ -define(is_timeout(T), (is_integer(T) orelse T==infinity)). -define(is_filter(F), - (is_atom(F) orelse (is_tuple(F) andalso is_atom(element(1,F))))). + (?is_simple_xml(F) + orelse (F==[]) + orelse (is_list(F) andalso ?is_simple_xml(hd(F))))). +-define(is_simple_xml(Xml), + (is_atom(Xml) orelse (is_tuple(Xml) andalso is_atom(element(1,Xml))))). -define(is_string(S), (is_list(S) andalso is_integer(hd(S)))). %%---------------------------------------------------------------------- @@ -540,22 +544,51 @@ get_capabilities(Client) -> get_capabilities(Client, Timeout) -> call(Client, get_capabilities, Timeout). -%% @private +%%---------------------------------------------------------------------- +%% @spec send(Client, SimpleXml) -> Result +%% @equiv send(Client, SimpleXml, infinity) send(Client, SimpleXml) -> send(Client, SimpleXml, ?DEFAULT_TIMEOUT). -%% @private + +%%---------------------------------------------------------------------- +-spec send(Client, SimpleXml, Timeout) -> Result when + Client :: client(), + SimpleXml :: simple_xml(), + Timeout :: timeout(), + Result :: ok | {error,error_reason()}. +%% @doc Send an XML document to the server. +%% +%% The given XML document is sent as is to the server. This function +%% can be used for sending XML documents that can not be expressed by +%% other interface functions in this module. send(Client, SimpleXml, Timeout) -> call(Client,{send, Timeout, SimpleXml}). -%% @private +%%---------------------------------------------------------------------- +%% @spec send_rpc(Client, SimpleXml) -> Result +%% @equiv send_rpc(Client, SimpleXml, infinity) send_rpc(Client, SimpleXml) -> send_rpc(Client, SimpleXml, ?DEFAULT_TIMEOUT). -%% @private + +%%---------------------------------------------------------------------- +-spec send_rpc(Client, SimpleXml, Timeout) -> Result when + Client :: client(), + SimpleXml :: simple_xml(), + Timeout :: timeout(), + Result :: ok | {error,error_reason()}. +%% @doc Send a Netconf <code>rpc</code> request to the server. +%% +%% The given XML document is wrapped in a valid Netconf +%% <code>rpc</code> request and sent to the server. The +%% <code>message-id</code> and namespace attributes are added to the +%% <code>rpc</code> element. +%% +%% This function can be used for sending <code>rpc</code> requests +%% that can not be expressed by other interface functions in this +%% module. send_rpc(Client, SimpleXml, Timeout) -> call(Client,{send_rpc, SimpleXml, Timeout}). - - %%---------------------------------------------------------------------- %% @spec lock(Client, Target) -> Result %% @equiv lock(Client, Target, infinity) @@ -761,7 +794,7 @@ create_subscription(Client,Timeout) when ?is_timeout(Timeout) -> create_subscription(Client,?DEFAULT_STREAM,Timeout); create_subscription(Client,Stream) - when is_list(Stream) -> + when ?is_string(Stream) -> create_subscription(Client,Stream,?DEFAULT_TIMEOUT); create_subscription(Client,Filter) when ?is_filter(Filter) -> @@ -769,14 +802,14 @@ create_subscription(Client,Filter) ?DEFAULT_TIMEOUT). create_subscription(Client,Stream,Timeout) - when is_list(Stream) andalso + when ?is_string(Stream) andalso ?is_timeout(Timeout) -> call(Client,{send_rpc_op,{create_subscription,self()}, [Stream,undefined,undefined,undefined], Timeout}); create_subscription(Client,StartTime,StopTime) - when is_list(StartTime) andalso - is_list(StopTime) -> + when ?is_string(StartTime) andalso + ?is_string(StopTime) -> create_subscription(Client,?DEFAULT_STREAM,StartTime,StopTime, ?DEFAULT_TIMEOUT); create_subscription(Client,Filter,Timeout) @@ -784,28 +817,28 @@ create_subscription(Client,Filter,Timeout) ?is_timeout(Timeout) -> create_subscription(Client,?DEFAULT_STREAM,Filter,Timeout); create_subscription(Client,Stream,Filter) - when is_list(Stream) andalso + when ?is_string(Stream) andalso ?is_filter(Filter) -> create_subscription(Client,Stream,Filter,?DEFAULT_TIMEOUT). create_subscription(Client,StartTime,StopTime,Timeout) - when is_list(StartTime) andalso - is_list(StopTime) andalso + when ?is_string(StartTime) andalso + ?is_string(StopTime) andalso ?is_timeout(Timeout) -> create_subscription(Client,?DEFAULT_STREAM,StartTime,StopTime,Timeout); create_subscription(Client,Stream,StartTime,StopTime) - when is_list(Stream) andalso - is_list(StartTime) andalso - is_list(StopTime) -> + when ?is_string(Stream) andalso + ?is_string(StartTime) andalso + ?is_string(StopTime) -> create_subscription(Client,Stream,StartTime,StopTime,?DEFAULT_TIMEOUT); create_subscription(Client,Filter,StartTime,StopTime) when ?is_filter(Filter) andalso - is_list(StartTime) andalso - is_list(StopTime) -> + ?is_string(StartTime) andalso + ?is_string(StopTime) -> create_subscription(Client,?DEFAULT_STREAM,Filter, StartTime,StopTime,?DEFAULT_TIMEOUT); create_subscription(Client,Stream,Filter,Timeout) - when is_list(Stream) andalso + when ?is_string(Stream) andalso ?is_filter(Filter) andalso ?is_timeout(Timeout) -> call(Client,{send_rpc_op,{create_subscription,self()}, @@ -813,18 +846,18 @@ create_subscription(Client,Stream,Filter,Timeout) Timeout}). create_subscription(Client,Stream,StartTime,StopTime,Timeout) - when is_list(Stream) andalso - is_list(StartTime) andalso - is_list(StopTime) andalso + when ?is_string(Stream) andalso + ?is_string(StartTime) andalso + ?is_string(StopTime) andalso ?is_timeout(Timeout) -> call(Client,{send_rpc_op,{create_subscription,self()}, [Stream,undefined,StartTime,StopTime], Timeout}); create_subscription(Client,Stream,Filter,StartTime,StopTime) - when is_list(Stream) andalso + when ?is_string(Stream) andalso ?is_filter(Filter) andalso - is_list(StartTime) andalso - is_list(StopTime) -> + ?is_string(StartTime) andalso + ?is_string(StopTime) -> create_subscription(Client,Stream,Filter,StartTime,StopTime,?DEFAULT_TIMEOUT). %%---------------------------------------------------------------------- @@ -832,7 +865,7 @@ create_subscription(Client,Stream,Filter,StartTime,StopTime) Result when Client :: client(), Stream :: stream_name(), - Filter :: simple_xml(), + Filter :: simple_xml() | [simple_xml()], StartTime :: xs_datetime(), StopTime :: xs_datetime(), Timeout :: timeout(), @@ -855,8 +888,7 @@ create_subscription(Client,Stream,Filter,StartTime,StopTime) %% possible events is of interest. The format of this parameter is %% the same as that of the filter parameter in the NETCONF protocol %% operations. If not present, all events not precluded by other -%% parameters will be sent. See section 3.6 for more information on -%% filters.</dd> +%% parameters will be sent.</dd> %% %% <dt>StartTime:</dt> %% <dd>An optional parameter used to trigger the replay feature and @@ -1241,8 +1273,10 @@ filter(undefined) -> []; filter({xpath,Filter}) when ?is_string(Filter) -> [{filter,[{type,"xpath"},{select, Filter}],[]}]; +filter(Filter) when is_list(Filter) -> + [{filter,[{type,"subtree"}],Filter}]; filter(Filter) -> - [{filter,[{type,"subtree"}],[Filter]}]. + filter([Filter]). maybe_element(_,undefined) -> []; diff --git a/lib/common_test/src/ct_ssh.erl b/lib/common_test/src/ct_ssh.erl index 1adc79d358..974791bd70 100644 --- a/lib/common_test/src/ct_ssh.erl +++ b/lib/common_test/src/ct_ssh.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2009-2012. All Rights Reserved. +%% Copyright Ericsson AB 2009-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/common_test/test/ct_gen_conn_SUITE.erl b/lib/common_test/test/ct_gen_conn_SUITE.erl index 2a2183854e..49d6edca86 100644 --- a/lib/common_test/test/ct_gen_conn_SUITE.erl +++ b/lib/common_test/test/ct_gen_conn_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2010-2012. All Rights Reserved. +%% Copyright Ericsson AB 2010-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl b/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl index 6877e0c2d2..1344878675 100644 --- a/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl +++ b/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl index 0535eb924b..6ee7fdd6f6 100644 --- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl @@ -886,6 +886,19 @@ create_subscription(Config) -> ?NS:expect_do_reply('close-session',close,ok), ?ok = ct_netconfc:close_session(Client8), + %% Multiple filters + {ok,Client9} = open_success(DataDir), + ?NS:expect_reply({'create-subscription',[stream,filter]},ok), + MultiFilters = [{event,[{xmlns,"http://my.namespaces.com/event"}], + [{eventClass,["fault"]}, + {severity,["critical"]}]}, + {event,[{xmlns,"http://my.namespaces.com/event"}], + [{eventClass,["fault"]}, + {severity,["major"]}]}], + ?ok = ct_netconfc:create_subscription(Client9,MultiFilters), + ?NS:expect_do_reply('close-session',close,ok), + ?ok = ct_netconfc:close_session(Client9), + ok. receive_event(Config) -> diff --git a/lib/common_test/vsn.mk b/lib/common_test/vsn.mk index 87d762b697..d60b4ba675 100644 --- a/lib/common_test/vsn.mk +++ b/lib/common_test/vsn.mk @@ -1 +1 @@ -COMMON_TEST_VSN = 1.7.1 +COMMON_TEST_VSN = 1.7.2 diff --git a/lib/compiler/doc/src/notes.xml b/lib/compiler/doc/src/notes.xml index 94fea84557..33b32a3dce 100644 --- a/lib/compiler/doc/src/notes.xml +++ b/lib/compiler/doc/src/notes.xml @@ -31,6 +31,57 @@ <p>This document describes the changes made to the Compiler application.</p> +<section><title>Compiler 4.9.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Compiling functions with complex boolean operations in + guards could be very slow. (Thanks to Magnus Muller for + reporting this issue.)</p> + <p> + Own Id: OTP-10939</p> + </item> + <item> + <p> + Certain guard expressions used in a receive statement + could cause the compiler to crash.</p> + <p> + Own Id: OTP-11119 Aux Id: seq12342 </p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Fix optimization of some binary comprehensions. Thanks to + Anthony Ramine.</p> + <p> + Own Id: OTP-11005</p> + </item> + <item> + <p> + Use a set to store ref registers in beam_receive. Thanks + to Anthony Ramine.</p> + <p> + Own Id: OTP-11069</p> + </item> + <item> + <p> + Fix renaming of bs_put_string instructions. Thanks to + Anthony Ramine.</p> + <p> + Own Id: OTP-11129</p> + </item> + </list> + </section> + +</section> + <section><title>Compiler 4.9.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/compiler/src/beam_a.erl b/lib/compiler/src/beam_a.erl index b348e854a0..c590c5e35b 100644 --- a/lib/compiler/src/beam_a.erl +++ b/lib/compiler/src/beam_a.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2012. All Rights Reserved. +%% Copyright Ericsson AB 2012-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl index e623bcc6a5..e9911fefd9 100644 --- a/lib/compiler/src/beam_utils.erl +++ b/lib/compiler/src/beam_utils.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2012. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/compiler/src/cerl_inline.erl b/lib/compiler/src/cerl_inline.erl index 2e7554c1ff..c6de63c69f 100644 --- a/lib/compiler/src/cerl_inline.erl +++ b/lib/compiler/src/cerl_inline.erl @@ -52,7 +52,7 @@ clause_pats/1, clause_vars/1, concrete/1, cons_hd/1, cons_tl/1, data_arity/1, data_es/1, data_type/1, fun_body/1, fun_vars/1, get_ann/1, int_val/1, - is_c_atom/1, is_c_cons/1, is_c_fun/1, is_c_int/1, + is_c_atom/1, is_c_cons/1, is_c_fname/1, is_c_int/1, is_c_list/1, is_c_seq/1, is_c_tuple/1, is_c_var/1, is_data/1, is_literal/1, is_literal_term/1, let_arg/1, let_body/1, let_vars/1, letrec_body/1, letrec_defs/1, @@ -1578,7 +1578,7 @@ make_let_binding_1(R, E, S) -> %% completely. copy(R, Opnd, E, Ctxt, Env, S) -> - case is_c_var(E) of + case is_c_var(E) andalso not is_c_fname(E) of true -> %% The operand reduces to another variable - get its %% ref-structure and attempt to propagate further. @@ -1628,12 +1628,12 @@ copy_var(R, Ctxt, Env, S) -> end. copy_1(R, Opnd, E, Ctxt, Env, S) -> - %% Fun-expression (lambdas) are a bit special; they are copyable, - %% but should preferably not be duplicated, so they should not be - %% copy propagated except into application contexts, where they can - %% be inlined. - case is_c_fun(E) of - true -> + case type(E) of + 'fun' -> + %% Fun-expression (lambdas) are a bit special; they are copyable, + %% but should preferably not be duplicated, so they should not be + %% copy propagated except into application contexts, where they can + %% be inlined. case Ctxt of #app{} -> %% First test if the operand is "outer-pending"; if @@ -1649,7 +1649,28 @@ copy_1(R, Opnd, E, Ctxt, Env, S) -> _ -> residualize_var(R, S) end; - false -> + var -> + %% Variables at this point only refer to local functions; they are + %% copyable but can't appear in guards, so they should not be + %% copy propagated except into application contexts, where they can + %% be inlined. + case Ctxt of + #app{} -> + %% First test if the operand is "outer-pending"; if + %% so, don't inline. + case st__test_outer_pending(Opnd#opnd.loc, S) of + false -> + R1 = env__get(var_name(E), Opnd#opnd.env), + copy_var(R1, Ctxt, Env, S); + true -> + %% Cyclic reference forced inlining to stop + %% (avoiding infinite unfolding). + residualize_var(R, S) + end; + _ -> + residualize_var(R, S) + end; + _ -> %% We have no other cases to handle here residualize_var(R, S) end. diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl index f243127b66..1195937d91 100644 --- a/lib/compiler/src/v3_core.erl +++ b/lib/compiler/src/v3_core.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2012. All Rights Reserved. +%% Copyright Ericsson AB 1999-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/compiler/test/bs_bincomp_SUITE.erl b/lib/compiler/test/bs_bincomp_SUITE.erl index 451a9b1e3b..f6d8b1c532 100644 --- a/lib/compiler/test/bs_bincomp_SUITE.erl +++ b/lib/compiler/test/bs_bincomp_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2011. All Rights Reserved. +%% Copyright Ericsson AB 2006-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/compiler/test/bs_construct_SUITE.erl b/lib/compiler/test/bs_construct_SUITE.erl index 4ea5235bb6..ce39de2a82 100644 --- a/lib/compiler/test/bs_construct_SUITE.erl +++ b/lib/compiler/test/bs_construct_SUITE.erl @@ -319,6 +319,8 @@ in_guard(Config) when is_list(Config) -> ?line 1 = in_guard_1(<<16#74ad:16>>, 16#e95, 5), ?line 2 = in_guard_1(<<16#3A,16#F7,"hello">>, 16#3AF7, <<"hello">>), ?line 3 = in_guard_1(<<16#FBCD:14,3.1415/float,3:2>>, 16#FBCD, 3.1415), + ?line 3 = in_guard_1(<<16#FBCD:14,3/float,3:2>>, 16#FBCD, 3), + ?line 3 = in_guard_1(<<16#FBCD:14,(2 bsl 226)/float,3:2>>, 16#FBCD, 2 bsl 226), ?line nope = in_guard_1(<<1>>, 42, b), ?line nope = in_guard_1(<<1>>, a, b), ?line nope = in_guard_1(<<1,2>>, 1, 1), diff --git a/lib/compiler/test/compile_SUITE.erl b/lib/compiler/test/compile_SUITE.erl index c635d13c89..97777568b6 100644 --- a/lib/compiler/test/compile_SUITE.erl +++ b/lib/compiler/test/compile_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/compiler/test/inline_SUITE.erl b/lib/compiler/test/inline_SUITE.erl index d9b92766e4..e5c2d4f73a 100644 --- a/lib/compiler/test/inline_SUITE.erl +++ b/lib/compiler/test/inline_SUITE.erl @@ -36,7 +36,7 @@ all() -> groups() -> [{p,test_lib:parallel(), - [attribute,bsdecode,bsdes,barnes2,decode1,smith, + [attribute,bsdecode,bsdes,barnes2,decode1,smith,fname, itracer,pseudoknot,comma_splitter,lists,really_inlined,otp_7223, coverage]}]. @@ -84,6 +84,7 @@ attribute(Config) when is_list(Config) -> ?comp(itracer). ?comp(pseudoknot). ?comp(comma_splitter). +?comp(fname). try_inline(Mod, Config) -> Node = ?config(testing_node, Config), diff --git a/lib/compiler/test/inline_SUITE_data/fname.erl b/lib/compiler/test/inline_SUITE_data/fname.erl new file mode 100644 index 0000000000..7ad4446bf3 --- /dev/null +++ b/lib/compiler/test/inline_SUITE_data/fname.erl @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2013. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(fname). +-export([?MODULE/0]). + +?MODULE() -> + F = fun bar/1, + G = lists:last([(fun (X) when F =:= X -> X end)]), + F = G(F), + ok. + +bar(X) -> + X. diff --git a/lib/compiler/vsn.mk b/lib/compiler/vsn.mk index 90d2bff0ad..1c6f49d89b 100644 --- a/lib/compiler/vsn.mk +++ b/lib/compiler/vsn.mk @@ -1 +1 @@ -COMPILER_VSN = 4.9.1 +COMPILER_VSN = 4.9.2 diff --git a/lib/cosEvent/doc/src/notes.xml b/lib/cosEvent/doc/src/notes.xml index b0ac50ab10..ba986792c5 100644 --- a/lib/cosEvent/doc/src/notes.xml +++ b/lib/cosEvent/doc/src/notes.xml @@ -32,7 +32,22 @@ <file>notes.xml</file> </header> - <section><title>cosEvent 2.1.13</title> + <section><title>cosEvent 2.1.14</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + +<section><title>cosEvent 2.1.13</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/cosEvent/vsn.mk b/lib/cosEvent/vsn.mk index 85c5c6aadd..6745bee079 100644 --- a/lib/cosEvent/vsn.mk +++ b/lib/cosEvent/vsn.mk @@ -1,3 +1,3 @@ -COSEVENT_VSN = 2.1.13 +COSEVENT_VSN = 2.1.14 diff --git a/lib/cosFileTransfer/doc/src/notes.xml b/lib/cosFileTransfer/doc/src/notes.xml index 56a85f2060..d68a52655a 100644 --- a/lib/cosFileTransfer/doc/src/notes.xml +++ b/lib/cosFileTransfer/doc/src/notes.xml @@ -30,7 +30,22 @@ <file>notes.xml</file> </header> - <section><title>cosFileTransfer 1.1.14</title> + <section><title>cosFileTransfer 1.1.15</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + +<section><title>cosFileTransfer 1.1.14</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/cosFileTransfer/vsn.mk b/lib/cosFileTransfer/vsn.mk index 58545be931..cf33926334 100644 --- a/lib/cosFileTransfer/vsn.mk +++ b/lib/cosFileTransfer/vsn.mk @@ -1 +1 @@ -COSFILETRANSFER_VSN = 1.1.14 +COSFILETRANSFER_VSN = 1.1.15 diff --git a/lib/cosNotification/doc/src/notes.xml b/lib/cosNotification/doc/src/notes.xml index babf29d4a9..2d126271a9 100644 --- a/lib/cosNotification/doc/src/notes.xml +++ b/lib/cosNotification/doc/src/notes.xml @@ -31,7 +31,22 @@ <file>notes.xml</file> </header> - <section><title>cosNotification 1.1.19</title> + <section><title>cosNotification 1.1.20</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + +<section><title>cosNotification 1.1.19</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/cosNotification/vsn.mk b/lib/cosNotification/vsn.mk index 20eb6167ac..ea59800164 100644 --- a/lib/cosNotification/vsn.mk +++ b/lib/cosNotification/vsn.mk @@ -1,2 +1,2 @@ -COSNOTIFICATION_VSN = 1.1.19 +COSNOTIFICATION_VSN = 1.1.20 diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c index 98ebb21f29..c28ff8136c 100644 --- a/lib/crypto/c_src/crypto.c +++ b/lib/crypto/c_src/crypto.c @@ -142,6 +142,19 @@ (s)[3] = (char)((i) & 0xff);\ } +/* This shall correspond to the similar macro in crypto.erl */ +/* Current value is: erlang:system_info(context_reductions) * 10 */ +#define MAX_BYTES_TO_NIF 20000 + +#define CONSUME_REDS(NifEnv, Ibin) \ +do { \ + int _cost = ((Ibin).size * 100) / MAX_BYTES_TO_NIF;\ + if (_cost) { \ + (void) enif_consume_timeslice((NifEnv), \ + (_cost > 100) ? 100 : _cost); \ + } \ + } while (0) + /* NIF interface declarations */ static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info); static int upgrade(ErlNifEnv* env, void** priv_data, void** old_priv_data, ERL_NIF_TERM load_info); @@ -208,7 +221,7 @@ static ERL_NIF_TERM mod_exp_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg static ERL_NIF_TERM dss_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM rsa_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM aes_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -static ERL_NIF_TERM exor(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); +static ERL_NIF_TERM do_exor(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM rc4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM rc4_set_key(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM rc4_encrypt_with_state(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); @@ -229,8 +242,6 @@ static ERL_NIF_TERM bf_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar static ERL_NIF_TERM bf_ecb_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM blowfish_ofb64_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -static ERL_NIF_TERM ec_key_to_term_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -static ERL_NIF_TERM term_to_ec_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM ecdsa_sign_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM ecdsa_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); @@ -338,7 +349,7 @@ static ErlNifFunc nif_funcs[] = { {"dss_verify_nif", 4, dss_verify_nif}, {"rsa_verify_nif", 4, rsa_verify_nif}, {"aes_cbc_crypt", 4, aes_cbc_crypt}, - {"exor", 2, exor}, + {"do_exor", 2, do_exor}, {"rc4_encrypt", 2, rc4_encrypt}, {"rc4_set_key", 1, rc4_set_key}, {"rc4_encrypt_with_state", 2, rc4_encrypt_with_state}, @@ -359,12 +370,10 @@ static ErlNifFunc nif_funcs[] = { {"bf_ecb_crypt", 3, bf_ecb_crypt}, {"blowfish_ofb64_encrypt", 3, blowfish_ofb64_encrypt}, - {"ec_key_to_term_nif", 1, ec_key_to_term_nif}, - {"term_to_ec_key_nif", 3, term_to_ec_key_nif}, {"ec_key_generate", 1, ec_key_generate}, - {"ecdsa_sign_nif", 3, ecdsa_sign_nif}, - {"ecdsa_verify_nif", 4, ecdsa_verify_nif}, - {"ecdh_compute_key_nif", 2, ecdh_compute_key_nif} + {"ecdsa_sign_nif", 4, ecdsa_sign_nif}, + {"ecdsa_verify_nif", 5, ecdsa_verify_nif}, + {"ecdh_compute_key_nif", 3, ecdh_compute_key_nif} }; #if defined(HAVE_EC) @@ -459,10 +468,7 @@ static struct nid_map ec_curves[] = { #define EC_CURVES_CNT (sizeof(ec_curves)/sizeof(struct nid_map)) -struct nif_ec_key { - EC_KEY *key; -}; -#endif +#endif /* HAVE_EC */ ERL_NIF_INIT(crypto,nif_funcs,load,NULL,upgrade,unload) @@ -515,17 +521,13 @@ static ERL_NIF_TERM atom_none; static ERL_NIF_TERM atom_notsup; static ERL_NIF_TERM atom_digest; -static ERL_NIF_TERM atom_ec; - #if defined(HAVE_EC) +static ERL_NIF_TERM atom_ec; static ERL_NIF_TERM atom_prime_field; static ERL_NIF_TERM atom_characteristic_two_field; static ERL_NIF_TERM atom_tpbasis; static ERL_NIF_TERM atom_ppbasis; static ERL_NIF_TERM atom_onbasis; - -static ErlNifResourceType* res_type_ec_key; -static void ec_key_dtor(ErlNifEnv* env, void* obj); #endif /* @@ -557,7 +559,6 @@ static void error_handler(void* null, const char* errstr) static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) { - int i; ErlNifSysInfo sys_info; get_crypto_callbacks_t* funcp; struct crypto_callbacks* ccb; @@ -577,6 +578,7 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) PRINTF_ERR1("CRYPTO: Invalid load_info '%T'", load_info); return 0; } + if (library_refc > 0) { /* Repeated loading of this library (module upgrade). * Atoms and callbacks are already set, we are done. @@ -618,13 +620,11 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info) atom_ppbasis = enif_make_atom(env,"ppbasis"); atom_onbasis = enif_make_atom(env,"onbasis"); - for (i = 0; i < EC_CURVES_CNT; i++) + { + int i; + for (i = 0; i < EC_CURVES_CNT; i++) ec_curves[i].atom = enif_make_atom(env,ec_curves[i].name); - - res_type_ec_key = enif_open_resource_type(env,NULL,"crypto.EC_KEY", - ec_key_dtor, - ERL_NIF_RT_CREATE|ERL_NIF_RT_TAKEOVER, - NULL); + } #endif init_digest_types(env); @@ -778,6 +778,7 @@ static ERL_NIF_TERM md5(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } MD5((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,MD5_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; } static ERL_NIF_TERM md5_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -799,6 +800,7 @@ static ERL_NIF_TERM md5_update(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv new_ctx = (MD5_CTX*) enif_make_new_binary(env,MD5_CTX_LEN, &ret); memcpy(new_ctx, ctx_bin.data, MD5_CTX_LEN); MD5_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; } static ERL_NIF_TERM md5_final(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -820,10 +822,11 @@ static ERL_NIF_TERM ripemd160(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[ ERL_NIF_TERM ret; if (!enif_inspect_iolist_as_binary(env, argv[0], &ibin)) { - return enif_make_badarg(env); + return enif_make_badarg(env); } RIPEMD160((unsigned char *) ibin.data, ibin.size, - enif_make_new_binary(env,RIPEMD160_LEN, &ret)); + enif_make_new_binary(env,RIPEMD160_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; } static ERL_NIF_TERM ripemd160_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -838,13 +841,14 @@ static ERL_NIF_TERM ripemd160_update(ErlNifEnv* env, int argc, const ERL_NIF_TER ErlNifBinary ctx_bin, data_bin; ERL_NIF_TERM ret; if (!enif_inspect_binary(env, argv[0], &ctx_bin) - || ctx_bin.size != RIPEMD160_CTX_LEN - || !enif_inspect_iolist_as_binary(env, argv[1], &data_bin)) { - return enif_make_badarg(env); + || ctx_bin.size != RIPEMD160_CTX_LEN + || !enif_inspect_iolist_as_binary(env, argv[1], &data_bin)) { + return enif_make_badarg(env); } new_ctx = (RIPEMD160_CTX*) enif_make_new_binary(env,RIPEMD160_CTX_LEN, &ret); memcpy(new_ctx, ctx_bin.data, RIPEMD160_CTX_LEN); RIPEMD160_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env, data_bin); return ret; } static ERL_NIF_TERM ripemd160_final(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -853,7 +857,7 @@ static ERL_NIF_TERM ripemd160_final(ErlNifEnv* env, int argc, const ERL_NIF_TERM RIPEMD160_CTX ctx_clone; ERL_NIF_TERM ret; if (!enif_inspect_binary(env, argv[0], &ctx_bin) || ctx_bin.size != RIPEMD160_CTX_LEN) { - return enif_make_badarg(env); + return enif_make_badarg(env); } memcpy(&ctx_clone, ctx_bin.data, RIPEMD160_CTX_LEN); /* writable */ RIPEMD160_Final(enif_make_new_binary(env, RIPEMD160_LEN, &ret), &ctx_clone); @@ -871,6 +875,7 @@ static ERL_NIF_TERM sha(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } SHA1((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,SHA_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; } static ERL_NIF_TERM sha_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -891,6 +896,7 @@ static ERL_NIF_TERM sha_update(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv new_ctx = (SHA_CTX*) enif_make_new_binary(env,SHA_CTX_LEN, &ret); memcpy(new_ctx, ctx_bin.data, SHA_CTX_LEN); SHA1_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; } static ERL_NIF_TERM sha_final(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -917,6 +923,7 @@ static ERL_NIF_TERM sha224_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv } SHA224((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,SHA224_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; #else return atom_notsup; @@ -945,6 +952,7 @@ static ERL_NIF_TERM sha224_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TE new_ctx = (SHA256_CTX*) enif_make_new_binary(env,sizeof(SHA256_CTX), &ret); memcpy(new_ctx, ctx_bin.data, sizeof(SHA256_CTX)); SHA224_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; #else return atom_notsup; @@ -978,6 +986,7 @@ static ERL_NIF_TERM sha256_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv } SHA256((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,SHA256_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; #else return atom_notsup; @@ -1006,6 +1015,7 @@ static ERL_NIF_TERM sha256_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TE new_ctx = (SHA256_CTX*) enif_make_new_binary(env,sizeof(SHA256_CTX), &ret); memcpy(new_ctx, ctx_bin.data, sizeof(SHA256_CTX)); SHA256_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; #else return atom_notsup; @@ -1039,6 +1049,7 @@ static ERL_NIF_TERM sha384_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv } SHA384((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,SHA384_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; #else return atom_notsup; @@ -1067,6 +1078,7 @@ static ERL_NIF_TERM sha384_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TE new_ctx = (SHA512_CTX*) enif_make_new_binary(env,sizeof(SHA512_CTX), &ret); memcpy(new_ctx, ctx_bin.data, sizeof(SHA512_CTX)); SHA384_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; #else return atom_notsup; @@ -1100,6 +1112,7 @@ static ERL_NIF_TERM sha512_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv } SHA512((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,SHA512_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; #else return atom_notsup; @@ -1128,6 +1141,7 @@ static ERL_NIF_TERM sha512_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TE new_ctx = (SHA512_CTX*) enif_make_new_binary(env,sizeof(SHA512_CTX), &ret); memcpy(new_ctx, ctx_bin.data, sizeof(SHA512_CTX)); SHA512_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; #else return atom_notsup; @@ -1161,6 +1175,7 @@ static ERL_NIF_TERM md4(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } MD4((unsigned char *) ibin.data, ibin.size, enif_make_new_binary(env,MD4_LEN, &ret)); + CONSUME_REDS(env,ibin); return ret; } static ERL_NIF_TERM md4_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -1181,6 +1196,7 @@ static ERL_NIF_TERM md4_update(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv new_ctx = (MD4_CTX*) enif_make_new_binary(env,MD4_CTX_LEN, &ret); memcpy(new_ctx, ctx_bin.data, MD4_CTX_LEN); MD4_Update(new_ctx, data_bin.data, data_bin.size); + CONSUME_REDS(env,data_bin); return ret; } static ERL_NIF_TERM md4_final(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) @@ -1210,6 +1226,7 @@ static ERL_NIF_TERM md5_mac_n(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[ } hmac_md5(key.data, key.size, data.data, data.size, hmacbuf); memcpy(enif_make_new_binary(env, mac_sz, &ret), hmacbuf, mac_sz); + CONSUME_REDS(env,data); return ret; } @@ -1228,6 +1245,7 @@ static ERL_NIF_TERM sha_mac_n(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[ hmac_sha1(key.data, key.size, data.data, data.size, hmacbuf); memcpy(enif_make_new_binary(env, mac_sz, &ret), hmacbuf, mac_sz); + CONSUME_REDS(env,data); return ret; } @@ -1247,6 +1265,7 @@ static ERL_NIF_TERM sha224_mac_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM hmac_sha224(key.data, key.size, data.data, data.size, hmacbuf); memcpy(enif_make_new_binary(env, mac_sz, &ret), hmacbuf, mac_sz); + CONSUME_REDS(env,data); return ret; #else return atom_notsup; @@ -1269,6 +1288,7 @@ static ERL_NIF_TERM sha256_mac_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM hmac_sha256(key.data, key.size, data.data, data.size, hmacbuf); memcpy(enif_make_new_binary(env, mac_sz, &ret), hmacbuf, mac_sz); + CONSUME_REDS(env,data); return ret; #else return atom_notsup; @@ -1291,6 +1311,7 @@ static ERL_NIF_TERM sha384_mac_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM hmac_sha384(key.data, key.size, data.data, data.size, hmacbuf); memcpy(enif_make_new_binary(env, mac_sz, &ret), hmacbuf, mac_sz); + CONSUME_REDS(env,data); return ret; #else return atom_notsup; @@ -1314,6 +1335,7 @@ static ERL_NIF_TERM sha512_mac_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM hmac_sha512(key.data, key.size, data.data, data.size, hmacbuf); memcpy(enif_make_new_binary(env, mac_sz, &ret), hmacbuf, mac_sz); + CONSUME_REDS(env,data); return ret; #else return atom_notsup; @@ -1371,6 +1393,7 @@ static ERL_NIF_TERM hmac_update(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg ctx_buf = enif_make_new_binary(env, sizeof(HMAC_CTX), &ret); memcpy(ctx_buf, context.data, context.size); HMAC_Update((HMAC_CTX *)ctx_buf, data.data, data.size); + CONSUME_REDS(env,data); return ret; } @@ -1401,7 +1424,7 @@ static ERL_NIF_TERM hmac_final(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv HMAC_CTX_cleanup(&ctx); if (argc == 2 && req_len < mac_len) { - // Only truncate to req_len bytes if asked. + /* Only truncate to req_len bytes if asked. */ mac_len = req_len; } mac_bin = enif_make_new_binary(env, mac_len, &ret); @@ -1427,6 +1450,7 @@ static ERL_NIF_TERM des_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM a DES_set_key((const_DES_cblock*)key.data, &schedule); DES_ncbc_encrypt(text.data, enif_make_new_binary(env, text.size, &ret), text.size, &schedule, &ivec_clone, (argv[3] == atom_true)); + CONSUME_REDS(env,text); return ret; } @@ -1446,6 +1470,7 @@ static ERL_NIF_TERM des_cfb_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM a DES_set_key((const_DES_cblock*)key.data, &schedule); DES_cfb_encrypt(text.data, enif_make_new_binary(env, text.size, &ret), 8, text.size, &schedule, &ivec_clone, (argv[3] == atom_true)); + CONSUME_REDS(env,text); return ret; } @@ -1462,6 +1487,7 @@ static ERL_NIF_TERM des_ecb_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM a DES_ecb_encrypt((const_DES_cblock*)text.data, (DES_cblock*)enif_make_new_binary(env, 8, &ret), &schedule, (argv[2] == atom_true)); + CONSUME_REDS(env,text); return ret; } @@ -1488,6 +1514,7 @@ static ERL_NIF_TERM des_ede3_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_T DES_ede3_cbc_encrypt(text.data, enif_make_new_binary(env,text.size,&ret), text.size, &schedule1, &schedule2, &schedule3, &ivec_clone, (argv[5] == atom_true)); + CONSUME_REDS(env,text); return ret; } @@ -1514,6 +1541,7 @@ static ERL_NIF_TERM des_ede3_cfb_crypt_nif(ErlNifEnv* env, int argc, const ERL_N DES_ede3_cfb_encrypt(text.data, enif_make_new_binary(env,text.size,&ret), 8, text.size, &schedule1, &schedule2, &schedule3, &ivec_clone, (argv[5] == atom_true)); + CONSUME_REDS(env,text); return ret; #else return atom_notsup; @@ -1540,6 +1568,7 @@ static ERL_NIF_TERM aes_cfb_128_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TE enif_make_new_binary(env, text.size, &ret), text.size, &aes_key, ivec_clone, &new_ivlen, (argv[3] == atom_true)); + CONSUME_REDS(env,text); return ret; } @@ -1565,6 +1594,7 @@ static ERL_NIF_TERM aes_ctr_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM AES_ctr128_encrypt((unsigned char *) text.data, enif_make_new_binary(env, text.size, &ret), text.size, &aes_key, ivec_clone, ecount_buf, &num); + CONSUME_REDS(env,text); /* To do an incremental {en|de}cryption, the state to to keep between calls must include ivec_clone, ecount_buf and num. */ @@ -1608,6 +1638,7 @@ static ERL_NIF_TERM aes_ctr_stream_encrypt(ErlNifEnv* env, int argc, const ERL_N num2_term = enif_make_uint(env, num); new_state_term = enif_make_tuple4(env, state_term[0], ivec2_term, ecount2_term, num2_term); ret = enif_make_tuple2(env, new_state_term, cipher_term); + CONSUME_REDS(env,text_bin); return ret; } @@ -2055,10 +2086,11 @@ static ERL_NIF_TERM aes_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM a ret_ptr = enif_make_new_binary(env, data_bin.size, &ret); memcpy(ivec, ivec_bin.data, 16); /* writable copy */ AES_cbc_encrypt(data_bin.data, ret_ptr, data_bin.size, &aes_key, ivec, i); + CONSUME_REDS(env,data_bin); return ret; } -static ERL_NIF_TERM exor(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +static ERL_NIF_TERM do_exor(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {/* (Data1, Data2) */ ErlNifBinary d1, d2; unsigned char* ret_ptr; @@ -2075,6 +2107,7 @@ static ERL_NIF_TERM exor(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) for (i=0; i<d1.size; i++) { ret_ptr[i] = d1.data[i] ^ d2.data[i]; } + CONSUME_REDS(env,d1); return ret; } @@ -2091,6 +2124,7 @@ static ERL_NIF_TERM rc4_encrypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg RC4_set_key(&rc4_key, key.size, key.data); RC4(&rc4_key, data.size, data.data, enif_make_new_binary(env, data.size, &ret)); + CONSUME_REDS(env,data); return ret; } @@ -2123,7 +2157,7 @@ static ERL_NIF_TERM rc4_encrypt_with_state(ErlNifEnv* env, int argc, const ERL_N memcpy(rc4_key, state.data, sizeof(RC4_KEY)); RC4(rc4_key, data.size, data.data, enif_make_new_binary(env, data.size, &new_data)); - + CONSUME_REDS(env,data); return enif_make_tuple2(env,new_state,new_data); } @@ -2150,6 +2184,7 @@ static ERL_NIF_TERM rc2_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM a data_bin.size, &rc2_key, iv_copy, (argv[3] == atom_true)); + CONSUME_REDS(env,data_bin); return ret; } @@ -2781,6 +2816,7 @@ static ERL_NIF_TERM bf_cfb64_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM BF_cfb64_encrypt(data_bin.data, enif_make_new_binary(env,data_bin.size,&ret), data_bin.size, &bf_key, bf_tkey, &bf_n, (argv[3] == atom_true ? BF_ENCRYPT : BF_DECRYPT)); + CONSUME_REDS(env,data_bin); return ret; } @@ -2804,6 +2840,7 @@ static ERL_NIF_TERM bf_cbc_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar BF_cbc_encrypt(data_bin.data, enif_make_new_binary(env,data_bin.size,&ret), data_bin.size, &bf_key, bf_tkey, (argv[3] == atom_true ? BF_ENCRYPT : BF_DECRYPT)); + CONSUME_REDS(env,data_bin); return ret; } @@ -2821,6 +2858,7 @@ static ERL_NIF_TERM bf_ecb_crypt(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar BF_set_key(&bf_key, key_bin.size, key_bin.data); BF_ecb_encrypt(data_bin.data, enif_make_new_binary(env,data_bin.size,&ret), &bf_key, (argv[2] == atom_true ? BF_ENCRYPT : BF_DECRYPT)); + CONSUME_REDS(env,data_bin); return ret; } @@ -2843,6 +2881,7 @@ static ERL_NIF_TERM blowfish_ofb64_encrypt(ErlNifEnv* env, int argc, const ERL_N memcpy(bf_tkey, ivec_bin.data, 8); BF_ofb64_encrypt(data_bin.data, enif_make_new_binary(env,data_bin.size,&ret), data_bin.size, &bf_key, bf_tkey, &bf_n); + CONSUME_REDS(env,data_bin); return ret; } @@ -2884,7 +2923,7 @@ static EC_KEY* ec_key_new(ErlNifEnv* env, ERL_NIF_TERM curve_arg) && c_arity == 5 && get_bn_from_bin(env, curve[3], &bn_order) && (curve[4] != atom_none && get_bn_from_bin(env, curve[4], &cofactor))) { - //* {Field, Prime, Point, Order, CoFactor} = Curve */ + /* {Field, Prime, Point, Order, CoFactor} = Curve */ int f_arity = -1; const ERL_NIF_TERM* field; @@ -3038,7 +3077,7 @@ static ERL_NIF_TERM bn2term(ErlNifEnv* env, const BIGNUM *bn) dlen = BN_num_bytes(bn); ptr = enif_make_new_binary(env, dlen, &ret); BN_bn2bin(bn, ptr); - + ERL_VALGRIND_MAKE_MEM_DEFINED(ptr, dlen); return ret; } @@ -3061,39 +3100,10 @@ static ERL_NIF_TERM point2term(ErlNifEnv* env, enif_release_binary(&bin); return enif_make_badarg(env); } - + ERL_VALGRIND_MAKE_MEM_DEFINED(bin.data, bin.size); return enif_make_binary(env, &bin); } -#endif - -static ERL_NIF_TERM ec_key_to_term_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{ -#if defined(HAVE_EC) - struct nif_ec_key *obj; - const EC_GROUP *group; - const EC_POINT *public_key; - const BIGNUM *priv_key = NULL; - ERL_NIF_TERM pub_key = atom_undefined; - - if (!enif_get_resource(env, argv[0], res_type_ec_key, (void **)&obj)) - return enif_make_badarg(env); - - group = EC_KEY_get0_group(obj->key); - public_key = EC_KEY_get0_public_key(obj->key); - priv_key = EC_KEY_get0_private_key(obj->key); - if (group) { - if (public_key) - pub_key = point2term(env, group, public_key, EC_KEY_get_conv_form(obj->key)); - } - - return enif_make_tuple2(env, pub_key, bn2term(env, priv_key)); -#else - return atom_notsup; -#endif -} - -#if defined(HAVE_EC) static int term2point(ErlNifEnv* env, ERL_NIF_TERM term, EC_GROUP *group, EC_POINT **pptr) { @@ -3121,24 +3131,22 @@ static int term2point(ErlNifEnv* env, ERL_NIF_TERM term, return ret; } -#endif -static ERL_NIF_TERM term_to_ec_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +static int get_ec_key(ErlNifEnv* env, + ERL_NIF_TERM curve, ERL_NIF_TERM priv, ERL_NIF_TERM pub, + EC_KEY** res) { -#if defined(HAVE_EC) - ERL_NIF_TERM ret; EC_KEY *key = NULL; BIGNUM *priv_key = NULL; EC_POINT *pub_key = NULL; - struct nif_ec_key *obj; EC_GROUP *group = NULL; - if (!(argv[1] == atom_undefined || get_bn_from_bin(env, argv[1], &priv_key)) - || !(argv[2] == atom_undefined || enif_is_binary(env, argv[2]))) { + if (!(priv == atom_undefined || get_bn_from_bin(env, priv, &priv_key)) + || !(pub == atom_undefined || enif_is_binary(env, pub))) { goto out_err; } - key = ec_key_new(env, argv[0]); + key = ec_key_new(env, curve); if (!key) { goto out_err; @@ -3147,12 +3155,12 @@ static ERL_NIF_TERM term_to_ec_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_T if (!group) group = EC_GROUP_dup(EC_KEY_get0_group(key)); - if (term2point(env, argv[2], group, &pub_key)) { + if (term2point(env, pub, group, &pub_key)) { if (!EC_KEY_set_public_key(key, pub_key)) { goto out_err; } } - if (argv[1] != atom_undefined + if (priv != atom_undefined && !BN_is_zero(priv_key)) { if (!EC_KEY_set_private_key(key, priv_key)) goto out_err; @@ -3171,19 +3179,11 @@ static ERL_NIF_TERM term_to_ec_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_T } } - obj = enif_alloc_resource(res_type_ec_key, sizeof(struct nif_ec_key)); - if (!obj) - goto out_err; - - obj->key = key; - ret = enif_make_resource(env, obj); - enif_release_resource(obj); - goto out; out_err: if (key) EC_KEY_free(key); - ret = enif_make_badarg(env); + key = NULL; out: /* some OpenSSL structures are mem-dup'ed into the key, @@ -3191,11 +3191,12 @@ out: if (priv_key) BN_clear_free(priv_key); if (pub_key) EC_POINT_free(pub_key); if (group) EC_GROUP_free(group); - return ret; -#else - return atom_notsup; -#endif + if (!key) + return 0; + *res = key; + return 1; } +#endif /* HAVE_EC */ static ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { @@ -3203,14 +3204,21 @@ static ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM EC_KEY *key = ec_key_new(env, argv[0]); if (key && EC_KEY_generate_key(key)) { - ERL_NIF_TERM term; - struct nif_ec_key *obj = enif_alloc_resource(res_type_ec_key, sizeof(struct nif_ec_key)); - if (!obj) - return atom_error; - obj->key = key; - term = enif_make_resource(env, obj); - enif_release_resource(obj); - return term; + const EC_GROUP *group; + const EC_POINT *public_key; + ERL_NIF_TERM priv_key; + ERL_NIF_TERM pub_key = atom_undefined; + + group = EC_KEY_get0_group(key); + public_key = EC_KEY_get0_public_key(key); + + if (group && public_key) { + pub_key = point2term(env, group, public_key, + EC_KEY_get_conv_form(key)); + } + priv_key = bn2term(env, EC_KEY_get0_private_key(key)); + EC_KEY_free(key); + return enif_make_tuple2(env, pub_key, priv_key); } else return enif_make_badarg(env); @@ -3219,21 +3227,13 @@ static ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM #endif } -#if defined(HAVE_EC) -static void ec_key_dtor(ErlNifEnv* env, void* obj) -{ - struct nif_ec_key *key = (struct nif_ec_key*) obj; - EC_KEY_free(key->key); -} -#endif - static ERL_NIF_TERM ecdsa_sign_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{/* (Type, Data|{digest,Digest}, Key) */ +{/* (Type, Data|{digest,Digest}, Curve, Key) */ #if defined(HAVE_EC) ErlNifBinary data_bin, ret_bin; unsigned char hmacbuf[SHA_DIGEST_LENGTH]; unsigned int dsa_s_len; - struct nif_ec_key *obj; + EC_KEY* key = NULL; int i; const ERL_NIF_TERM* tpl_terms; int tpl_arity; @@ -3248,30 +3248,32 @@ static ERL_NIF_TERM ecdsa_sign_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM return atom_notsup; } - if (!enif_get_resource(env, argv[2], res_type_ec_key, (void **)&obj)) - return enif_make_badarg(env); + if (!get_ec_key(env, argv[2], argv[3], atom_undefined, &key)) + goto badarg; if (enif_get_tuple(env, argv[1], &tpl_arity, &tpl_terms)) { if (tpl_arity != 2 || tpl_terms[0] != atom_digest || !enif_inspect_binary(env, tpl_terms[1], &data_bin) || data_bin.size != digp->len) { - return enif_make_badarg(env); + goto badarg; } digest = data_bin.data; } else { if (!enif_inspect_binary(env,argv[1],&data_bin)) { - return enif_make_badarg(env); + goto badarg; } digest = hmacbuf; digp->funcp(data_bin.data, data_bin.size, digest); } - enif_alloc_binary(ECDSA_size(obj->key), &ret_bin); + enif_alloc_binary(ECDSA_size(key), &ret_bin); i = ECDSA_sign(digp->NID_type, digest, digp->len, - ret_bin.data, &dsa_s_len, obj->key); + ret_bin.data, &dsa_s_len, key); + + EC_KEY_free(key); if (i) { if (dsa_s_len != ret_bin.size) { enif_realloc_binary(&ret_bin, dsa_s_len); @@ -3282,18 +3284,23 @@ static ERL_NIF_TERM ecdsa_sign_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM enif_release_binary(&ret_bin); return atom_error; } + +badarg: + if (key) + EC_KEY_free(key); + return enif_make_badarg(env); #else return atom_notsup; #endif } static ERL_NIF_TERM ecdsa_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) -{/* (Type, Data|{digest,Digest}, Signature, Key) */ +{/* (Type, Data|{digest,Digest}, Signature, Curve, Key) */ #if defined(HAVE_EC) ErlNifBinary data_bin, sign_bin; unsigned char hmacbuf[SHA512_LEN]; int i; - struct nif_ec_key *obj; + EC_KEY* key = NULL; const ERL_NIF_TERM type = argv[0]; const ERL_NIF_TERM* tpl_terms; int tpl_arity; @@ -3309,15 +3316,15 @@ static ERL_NIF_TERM ecdsa_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER } if (!enif_inspect_binary(env, argv[2], &sign_bin) - || !enif_get_resource(env, argv[3], res_type_ec_key, (void **)&obj)) - return enif_make_badarg(env); + || !get_ec_key(env, argv[3], atom_undefined, argv[4], &key)) + goto badarg; if (enif_get_tuple(env, argv[1], &tpl_arity, &tpl_terms)) { if (tpl_arity != 2 || tpl_terms[0] != atom_digest || !enif_inspect_binary(env, tpl_terms[1], &data_bin) || data_bin.size != digp->len) { - return enif_make_badarg(env); + goto badarg; } digest = data_bin.data; } @@ -3326,13 +3333,20 @@ static ERL_NIF_TERM ecdsa_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER digp->funcp(data_bin.data, data_bin.size, digest); } else { - return enif_make_badarg(env); + goto badarg; } i = ECDSA_verify(digp->NID_type, digest, digp->len, - sign_bin.data, sign_bin.size, obj->key); + sign_bin.data, sign_bin.size, key); + + EC_KEY_free(key); return (i==1 ? atom_true : atom_false); + +badarg: + if (key) + EC_KEY_free(key); + return enif_make_badarg(env); #else return atom_notsup; #endif @@ -3343,24 +3357,24 @@ static ERL_NIF_TERM ecdsa_verify_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER (_OthersPublicKey, _MyEC_Point) */ static ERL_NIF_TERM ecdh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) +/* (OtherPublicKey, Curve, My) */ { #if defined(HAVE_EC) ERL_NIF_TERM ret; unsigned char *p; - struct nif_ec_key *other_key; + EC_KEY* key = NULL; int field_size = 0; int i; - EC_GROUP *group; const BIGNUM *priv_key; EC_POINT *my_ecpoint; EC_KEY *other_ecdh = NULL; - if (!enif_get_resource(env, argv[1], res_type_ec_key, (void **)&other_key)) + if (!get_ec_key(env, argv[1], argv[2], atom_undefined, &key)) return enif_make_badarg(env); - group = EC_GROUP_dup(EC_KEY_get0_group(other_key->key)); - priv_key = EC_KEY_get0_private_key(other_key->key); + group = EC_GROUP_dup(EC_KEY_get0_group(key)); + priv_key = EC_KEY_get0_private_key(key); if (!term2point(env, argv[0], group, &my_ecpoint)) { goto out_err; @@ -3384,6 +3398,7 @@ out: if (group) EC_GROUP_free(group); if (my_ecpoint) EC_POINT_free(my_ecpoint); if (other_ecdh) EC_KEY_free(other_ecdh); + if (key) EC_KEY_free(key); return ret; diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml index 2df407018e..99d167bfa9 100644 --- a/lib/crypto/doc/src/crypto.xml +++ b/lib/crypto/doc/src/crypto.xml @@ -208,7 +208,7 @@ </type> <desc> <p>Computes the shared secret from the private key and the other party's public key. - See also <seealso marker="public_key:public_key#compute_key/2">public_key:compute_key/2</seealso> + See also <seealso marker="public_key:public_key#compute_key-2">public_key:compute_key/2</seealso> </p> </desc> </func> @@ -240,7 +240,7 @@ </type> <desc> <p>Generates public keys of type <c>Type</c>. - See also <seealso marker="public_key:public_key#generate_key/1">public_key:generate_key/1</seealso> + See also <seealso marker="public_key:public_key#generate_key-1">public_key:generate_key/1</seealso> </p> </desc> </func> @@ -269,7 +269,7 @@ <desc> <p>Initializes the context for streaming hash operations. <c>Type</c> determines which digest to use. The returned context should be used as argument - to <seealso marker="#hash_update/2">hash_update</seealso>.</p> + to <seealso marker="#hash_update-2">hash_update</seealso>.</p> <p>May throw exception <c>notsup</c> in case the chosen <c>Type</c> is not supported by the underlying OpenSSL implementation.</p> </desc> @@ -283,10 +283,10 @@ </type> <desc> <p>Updates the digest represented by <c>Context</c> using the given <c>Data</c>. <c>Context</c> - must have been generated using <seealso marker="#hash_init/1">hash_init</seealso> + must have been generated using <seealso marker="#hash_init-1">hash_init</seealso> or a previous call to this function. <c>Data</c> can be any length. <c>NewContext</c> must be passed into the next call to <c>hash_update</c> - or <seealso marker="#hash_final/1">hash_final</seealso>.</p> + or <seealso marker="#hash_final-1">hash_final</seealso>.</p> </desc> </func> <func> @@ -297,7 +297,7 @@ </type> <desc> <p>Finalizes the hash operation referenced by <c>Context</c> returned - from a previous call to <seealso marker="#hash_update/2">hash_update</seealso>. + from a previous call to <seealso marker="#hash_update-2">hash_update</seealso>. The size of <c>Digest</c> is determined by the type of hash function used to generate it.</p> </desc> @@ -346,10 +346,10 @@ <desc> <p>Updates the HMAC represented by <c>Context</c> using the given <c>Data</c>. <c>Context</c> must have been generated using an HMAC init function (such as - <seealso marker="#hmac_init/2">hmac_init</seealso>). <c>Data</c> can be any length. <c>NewContext</c> + <seealso marker="#hmac_init-2">hmac_init</seealso>). <c>Data</c> can be any length. <c>NewContext</c> must be passed into the next call to <c>hmac_update</c> - or to one of the functions <seealso marker="#hmac_final/1">hmac_final</seealso> and - <seealso marker="#hmac_final_n/1">hmac_final_n</seealso> + or to one of the functions <seealso marker="#hmac_final-1">hmac_final</seealso> and + <seealso marker="#hmac_final_n-2">hmac_final_n</seealso> </p> </desc> @@ -447,36 +447,36 @@ <v>PlainText = binary()</v> </type> <desc> - <p>Decrypts the <c>ChipherText</c> (usually a session key encrypted with - <seealso marker="#public_encrypt/3">public_encrypt/3</seealso>) - using the <c>PrivateKey</c> and returns the - message. The <c>Padding</c> is the padding mode that was - used to encrypt the data, - see <seealso marker="#public_encrypt/3">public_encrypt/3</seealso>. - See also <seealso marker="public_key:public_key#decrypt_private/2">public_key:decrypt_private/[2,3]</seealso> + <p>Decrypts the <c>ChipherText</c>, encrypted with + <seealso marker="#public_encrypt-4">public_encrypt/4</seealso> (or equivalent function) + using the <c>PrivateKey</c>, and returns the + plaintext (message digest). This is a low level signature verification operation + used for instance by older versions of the SSL protocol. + See also <seealso marker="public_key:public_key#decrypt_private-2">public_key:decrypt_private/[2,3]</seealso> </p> </desc> </func> - + <func> <name>private_encrypt(Type, PlainText, PrivateKey, Padding) -> ChipherText</name> - <fsummary>Encrypts Msg using the private Key.</fsummary> + <fsummary>Encrypts PlainText using the private Key.</fsummary> <type> <v>Type = rsa</v> <v>PlainText = binary()</v> + <d> The size of the <c>PlainText</c> must be less + than <c>byte_size(N)-11</c> if <c>rsa_pkcs1_padding</c> is + used, and <c>byte_size(N)</c> if <c>rsa_no_padding</c> is + used, where N is public modulus of the RSA key.</d> <v>PrivateKey = rsa_private()</v> <v>Padding = rsa_pkcs1_padding | rsa_no_padding</v> <v>ChipherText = binary()</v> </type> <desc> <p>Encrypts the <c>PlainText</c> using the <c>PrivateKey</c> - and returns the cipher. The <c>Padding</c> decides what padding mode is used, - <c>rsa_pkcs1_padding</c> is PKCS #1 v1.5 currently the most - used mode. - The size of the <c>Msg</c> must be less than <c>byte_size(N)-11</c> if - <c>rsa_pkcs1_padding</c> is used, and <c>byte_size(N)</c> if <c>rsa_no_padding</c> - is used, where N is public modulus of the RSA key. - See also <seealso marker="public_key:public_key#encrypt_private/2">public_key:encrypt_private/[2,3]</seealso> + and returns the ciphertext. This is a low level signature operation + used for instance by older versions of the SSL protocol. See + also <seealso + marker="public_key:public_key#encrypt_private-2">public_key:encrypt_private/[2,3]</seealso> </p> </desc> </func> @@ -491,42 +491,35 @@ <v>PlainText = binary()</v> </type> <desc> - <p>Decrypts the <c>ChipherText</c> (encrypted with - <seealso marker="#private_encrypt/3">private_encrypt/3</seealso>) - using the <c>PrivateKey</c> and returns the - message. The <c>Padding</c> is the padding mode that was - used to encrypt the data, - see <seealso marker="#private_encrypt/3">private_encrypt/3</seealso>. - See also <seealso marker="public_key:public_key#decrypt_public/2">public_key:decrypt_public/[2,3]</seealso> + <p>Decrypts the <c>ChipherText</c>, encrypted with + <seealso marker="#private_encrypt-4">private_encrypt/4</seealso>(or equivalent function) + using the <c>PrivateKey</c>, and returns the + plaintext (message digest). This is a low level signature verification operation + used for instance by older versions of the SSL protocol. + See also <seealso marker="public_key:public_key#decrypt_public-2">public_key:decrypt_public/[2,3]</seealso> </p> </desc> </func> <func> <name>public_encrypt(Type, PlainText, PublicKey, Padding) -> ChipherText</name> - <fsummary>Encrypts Msg using the public Key.</fsummary> + <fsummary>Encrypts PlainText using the public Key.</fsummary> <type> <v>Type = rsa</v> <v>PlainText = binary()</v> + <d> The size of the <c>PlainText</c> must be less + than <c>byte_size(N)-11</c> if <c>rsa_pkcs1_padding</c> is + used, and <c>byte_size(N)</c> if <c>rsa_no_padding</c> is + used, where N is public modulus of the RSA key.</d> <v>PublicKey = rsa_public()</v> <v>Padding = rsa_pkcs1_padding | rsa_pkcs1_oaep_padding | rsa_no_padding</v> <v>ChipherText = binary()</v> </type> <desc> - <p>Encrypts the <c>PlainText</c> (usually a session key) using - the <c>PublicKey</c> and returns the <c>CipherText</c>. The - <c>Padding</c> decides what padding mode is used, - <c>rsa_pkcs1_padding</c> is PKCS #1 v1.5 currently the most - used mode and <c>rsa_pkcs1_oaep_padding</c> is EME-OAEP as - defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding - parameter. This mode is recommended for all new - applications. The size of the <c>Msg</c> must be less than - <c>byte_size(N)-11</c> if <c>rsa_pkcs1_padding</c> is - used, <c>byte_size(N)-41</c> if - <c>rsa_pkcs1_oaep_padding</c> is used and - <c>byte_size(N)</c> if <c>rsa_no_padding</c> is used, where N is public modulus of the RSA key. - See also <seealso - marker="public_key:public_key#encrypt_public/2">public_key:encrypt_public/[2,3]</seealso> + <p>Encrypts the <c>PlainText</c> (message digest) using the <c>PublicKey</c> + and returns the <c>CipherText</c>. This is a low level signature operation + used for instance by older versions of the SSL protocol. See also <seealso + marker="public_key:public_key#encrypt_public-2">public_key:encrypt_public/[2,3]</seealso> </p> </desc> </func> @@ -563,9 +556,9 @@ <type> <v>Algorithm = rsa | dss | ecdsa </v> <v>Msg = binary() | {digest,binary()}</v> - <d>The msg is either the binary "plain text" data to be - signed or it is the hashed value of "plain text" i.e. the - digest.</d> + <d>The msg is either the binary "cleartext" data to be + signed or it is the hashed value of "cleartext" i.e. the + digest (plaintext).</d> <v>DigestType = digest_type()</v> <v>Key = rsa_private() | dss_private() | [ecdh_private(),ecdh_params()]</v> </type> @@ -573,7 +566,7 @@ <p>Creates a digital signature.</p> <p>Algorithm <c>dss</c> can only be used together with digest type <c>sha</c>.</p> - See also <seealso marker="public_key:public_key#sign/3">public_key:sign/3</seealso> + See also <seealso marker="public_key:public_key#sign-3">public_key:sign/3</seealso> </desc> </func> @@ -617,8 +610,8 @@ </type> <desc> <p>Initializes the state for use in RC4 stream encryption - <seealso marker="#stream_encrypt/2">stream_encrypt</seealso> and - <seealso marker="#stream_decrypt/2">stream_decrypt</seealso></p> + <seealso marker="#stream_encrypt-2">stream_encrypt</seealso> and + <seealso marker="#stream_decrypt-2">stream_decrypt</seealso></p> </desc> </func> @@ -635,8 +628,8 @@ <p>Initializes the state for use in streaming AES encryption using Counter mode (CTR). <c>Key</c> is the AES key and must be either 128, 192, or 256 bts long. <c>IVec</c> is an arbitrary initializing vector of 128 bits (16 bytes). This state is for use with - <seealso marker="#stream_encrypt/2">stream_encrypt</seealso> and - <seealso marker="#stream_decrypt/2">stream_decrypt</seealso>.</p> + <seealso marker="#stream_encrypt-2">stream_encrypt</seealso> and + <seealso marker="#stream_decrypt-2">stream_decrypt</seealso>.</p> </desc> </func> @@ -650,7 +643,7 @@ <desc> <p>Encrypts <c>PlainText</c> according to the stream cipher <c>Type</c> specified in stream_init/3. <c>Text</c> can be any number of bytes. The initial <c>State</c> is created using - <seealso marker="#stream_init/2">stream_init</seealso>. + <seealso marker="#stream_init-2">stream_init</seealso>. <c>NewState</c> must be passed into the next call to <c>stream_encrypt</c>.</p> </desc> </func> @@ -665,7 +658,7 @@ <desc> <p>Decrypts <c>CipherText</c> according to the stream cipher <c>Type</c> specified in stream_init/3. <c>PlainText</c> can be any number of bytes. The initial <c>State</c> is created using - <seealso marker="#stream_init/2">stream_init</seealso>. + <seealso marker="#stream_init-2">stream_init</seealso>. <c>NewState</c> must be passed into the next call to <c>stream_encrypt</c>.</p> </desc> </func> @@ -692,8 +685,8 @@ <type> <v> Algorithm = rsa | dss | ecdsa </v> <v>Msg = binary() | {digest,binary()}</v> - <d>The msg is either the binary "plain text" data - or it is the hashed value of "plain text" i.e. the digest.</d> + <d>The msg is either the binary "cleartext" data + or it is the hashed value of "cleartext" i.e. the digest (plaintext).</d> <v>DigestType = digest_type()</v> <v>Signature = binary()</v> <v>Key = rsa_public() | dss_public() | [ecdh_public(),ecdh_params()]</v> @@ -703,7 +696,7 @@ <p>Algorithm <c>dss</c> can only be used together with digest type <c>sha</c>.</p> - See also <seealso marker="public_key:public_key#sign/3">public_key:verify/3</seealso> + See also <seealso marker="public_key:public_key#verify-4">public_key:verify/4</seealso> </desc> </func> diff --git a/lib/crypto/doc/src/notes.xml b/lib/crypto/doc/src/notes.xml index bd1f179f7d..09ecc97ef7 100644 --- a/lib/crypto/doc/src/notes.xml +++ b/lib/crypto/doc/src/notes.xml @@ -30,6 +30,65 @@ </header> <p>This document describes the changes made to the Crypto application.</p> +<section><title>Crypto 3.0</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + <item> + <p> + Fixed a spelling mistake in crypto docs. Thanks to Klaus + Trainer</p> + <p> + Own Id: OTP-11058</p> + </item> + </list> + </section> + + + <section><title>Known Bugs and Problems</title> + <list> + <item> + <p> + Make the crypto functions interruptible by chunking input + when it is very large and bumping reductions in the nifs.</p> + <p> + Not yet implemented for block_encrypt|decrypt/4</p> + <p> + Impact: Individual calls to crypto functions may take + longer time but over all system performance should + improve as crypto calls will not become throughput + bottlenecks.</p> + <p> + Own Id: OTP-11142</p> + </item> + </list> + </section> + +</section> + <section><title>Crypto 2.3</title> <section><title>Improvements and New Features</title> diff --git a/lib/crypto/src/crypto.appup.src b/lib/crypto/src/crypto.appup.src index b39ef734eb..5b4ce5acee 100644 --- a/lib/crypto/src/crypto.appup.src +++ b/lib/crypto/src/crypto.appup.src @@ -1,7 +1,8 @@ +%% -*- erlang -*- %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% Copyright Ericsson AB 1999-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -17,6 +18,11 @@ %% %CopyrightEnd% %% {"%VSN%", - [], - [] -}. + [ + {<<"2\\.*">>, [{restart_application, crypto}]} + {<<"1\\.*">>, [{restart_application, crypto}]} + ], + [ + {<<"2\\.*">>, [{restart_application, crypto}]} + {<<"1\\.*">>, [{restart_application, crypto}]} + ]}. diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl index e042545094..8e8370f3b0 100644 --- a/lib/crypto/src/crypto.erl +++ b/lib/crypto/src/crypto.erl @@ -35,7 +35,6 @@ -export([private_encrypt/4, public_decrypt/4]). -export([dh_generate_parameters/2, dh_check/1]). %% Testing see - %% DEPRECATED %% Replaced by hash_* -export([md4/1, md4_init/0, md4_update/2, md4_final/1]). @@ -165,60 +164,8 @@ -export([info/0]). -deprecated({info, 0, next_major_release}). --define(FUNC_LIST, [hash, hash_init, hash_update, hash_final, - hmac, hmac_init, hmac_update, hmac_final, hmac_final_n, - %% deprecated - md4, md4_init, md4_update, md4_final, - md5, md5_init, md5_update, md5_final, - sha, sha_init, sha_update, sha_final, - md5_mac, md5_mac_96, - sha_mac, sha_mac_96, - %% - block_encrypt, block_decrypt, - %% deprecated - des_cbc_encrypt, des_cbc_decrypt, - des_cfb_encrypt, des_cfb_decrypt, - des_ecb_encrypt, des_ecb_decrypt, - des3_cbc_encrypt, des3_cbc_decrypt, - des3_cfb_encrypt, des3_cfb_decrypt, - aes_cfb_128_encrypt, aes_cfb_128_decrypt, - rc2_cbc_encrypt, rc2_cbc_decrypt, - rc2_40_cbc_encrypt, rc2_40_cbc_decrypt, - aes_cbc_128_encrypt, aes_cbc_128_decrypt, - aes_cbc_256_encrypt, aes_cbc_256_decrypt, - blowfish_cbc_encrypt, blowfish_cbc_decrypt, - blowfish_cfb64_encrypt, blowfish_cfb64_decrypt, - blowfish_ecb_encrypt, blowfish_ecb_decrypt, blowfish_ofb64_encrypt, - %% - rand_bytes, - strong_rand_bytes, - rand_uniform, - mod_pow, - exor, - %% deprecated - mod_exp,strong_rand_mpint,erlint, mpint, - %% - sign, verify, generate_key, compute_key, - %% deprecated - dss_verify,dss_sign, - rsa_verify,rsa_sign, - rsa_public_encrypt,rsa_private_decrypt, - rsa_private_encrypt,rsa_public_decrypt, - dh_generate_key, dh_compute_key, - %% - stream_init, stream_encrypt, stream_decrypt, - %% deprecated - rc4_encrypt, rc4_set_key, rc4_encrypt_with_state, - aes_ctr_encrypt, aes_ctr_decrypt, - aes_ctr_stream_init, aes_ctr_stream_encrypt, aes_ctr_stream_decrypt, - %% - next_iv, - %% deprecated - aes_cbc_ivec, - des_cbc_ivec, des_cfb_ivec, - info, - %% - info_lib, supports]). +%% This should correspond to the similar macro in crypto.c +-define(MAX_BYTES_TO_NIF, 20000). %% Current value is: erlang:system_info(context_reductions) * 10 -type mpint() :: binary(). -type rsa_digest_type() :: 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512'. @@ -235,76 +182,27 @@ %%-type ec_curve() :: ec_named_curve() | ec_curve_spec(). %%-type ec_key() :: {Curve :: ec_curve(), PrivKey :: binary() | undefined, PubKey :: ec_point() | undefined}. --define(nif_stub,nif_stub_error(?LINE)). - -on_load(on_load/0). - -define(CRYPTO_NIF_VSN,201). -on_load() -> - LibBaseName = "crypto", - PrivDir = code:priv_dir(crypto), - LibName = case erlang:system_info(build_type) of - opt -> - LibBaseName; - Type -> - LibTypeName = LibBaseName ++ "." ++ atom_to_list(Type), - case (filelib:wildcard( - filename:join( - [PrivDir, - "lib", - LibTypeName ++ "*"])) /= []) orelse - (filelib:wildcard( - filename:join( - [PrivDir, - "lib", - erlang:system_info(system_architecture), - LibTypeName ++ "*"])) /= []) of - true -> LibTypeName; - false -> LibBaseName - end - end, - Lib = filename:join([PrivDir, "lib", LibName]), - Status = case erlang:load_nif(Lib, {?CRYPTO_NIF_VSN,Lib}) of - ok -> ok; - {error, {load_failed, _}}=Error1 -> - ArchLibDir = - filename:join([PrivDir, "lib", - erlang:system_info(system_architecture)]), - Candidate = - filelib:wildcard(filename:join([ArchLibDir,LibName ++ "*" ])), - case Candidate of - [] -> Error1; - _ -> - ArchLib = filename:join([ArchLibDir, LibName]), - erlang:load_nif(ArchLib, {?CRYPTO_NIF_VSN,ArchLib}) - end; - Error1 -> Error1 - end, - case Status of - ok -> ok; - {error, {E, Str}} -> - error_logger:error_msg("Unable to load crypto library. Failed with error:~n\"~p, ~s\"~n" - "OpenSSL might not be installed on this system.~n",[E,Str]), - Status - end. - +-define(nif_stub,nif_stub_error(?LINE)). nif_stub_error(Line) -> erlang:nif_error({nif_not_loaded,module,?MODULE,line,Line}). +%%-------------------------------------------------------------------- +%%% API +%%-------------------------------------------------------------------- +%% Crypto app version history: +%% (no version): Driver implementation +%% 2.0 : NIF implementation, requires OTP R14 +version() -> ?CRYPTO_VSN. + start() -> application:start(crypto). stop() -> application:stop(crypto). -info() -> - ?FUNC_LIST. - -info_lib() -> ?nif_stub. - -algorithms() -> ?nif_stub. - supports()-> Algs = algorithms(), PubKeyAlgs = @@ -316,32 +214,20 @@ supports()-> end, [{hashs, Algs -- [ec]}, {ciphers, [des_cbc, des_cfb, des3_cbc, des3_cbf, des_ede3, blowfish_cbc, - blowfish_cfb64, blowfish_ofb64, blowfish_ecb, aes_cbc128, aes_cfb128, aes_cbc256, rc2_cbc, aes_ctr, rc4 + blowfish_cfb64, blowfish_ofb64, blowfish_ecb, aes_cbc128, aes_cfb128, + aes_cbc256, rc2_cbc, aes_ctr, rc4 ]}, PubKeyAlgs ]. -%% Crypto app version history: -%% (no version): Driver implementation -%% 2.0 : NIF implementation, requires OTP R14 -version() -> ?CRYPTO_VSN. - -%% Below Key and Data are binaries or IO-lists. IVec is a binary. -%% Output is always a binary. Context is a binary. - -%% -%% MESSAGE DIGESTS -%% +info_lib() -> ?nif_stub. -spec hash(_, iodata()) -> binary(). -hash(md5, Data) -> md5(Data); -hash(md4, Data) -> md4(Data); -hash(sha, Data) -> sha(Data); -hash(ripemd160, Data) -> ripemd160(Data); -hash(sha224, Data) -> sha224(Data); -hash(sha256, Data) -> sha256(Data); -hash(sha384, Data) -> sha384(Data); -hash(sha512, Data) -> sha512(Data). + +hash(Hash, Data0) -> + Data = iolist_to_binary(Data0), + MaxByts = max_bytes(), + hash(Hash, Data, erlang:byte_size(Data), MaxByts, initial). -spec hash_init('md5'|'md4'|'ripemd160'| 'sha'|'sha224'|'sha256'|'sha384'|'sha512') -> any(). @@ -357,14 +243,10 @@ hash_init(sha512) -> {sha512, sha512_init()}. -spec hash_update(_, iodata()) -> any(). -hash_update({md5,Context}, Data) -> {md5, md5_update(Context,Data)}; -hash_update({md4,Context}, Data) -> {md4, md4_update(Context,Data)}; -hash_update({sha,Context}, Data) -> {sha, sha_update(Context,Data)}; -hash_update({ripemd160,Context}, Data) -> {ripemd160, ripemd160_update(Context,Data)}; -hash_update({sha224,Context}, Data) -> {sha224, sha224_update(Context,Data)}; -hash_update({sha256,Context}, Data) -> {sha256, sha256_update(Context,Data)}; -hash_update({sha384,Context}, Data) -> {sha384, sha384_update(Context,Data)}; -hash_update({sha512,Context}, Data) -> {sha512, sha512_update(Context,Data)}. +hash_update(State, Data0) -> + Data = iolist_to_binary(Data0), + MaxBytes = max_bytes(), + hash_update(State, Data, erlang:byte_size(Data), MaxBytes). -spec hash_final(_) -> binary(). @@ -377,6 +259,458 @@ hash_final({sha256,Context}) -> sha256_final(Context); hash_final({sha384,Context}) -> sha384_final(Context); hash_final({sha512,Context}) -> sha512_final(Context). + +-spec hmac(_, iodata(), iodata()) -> binary(). +-spec hmac(_, iodata(), iodata(), integer()) -> binary(). +-spec hmac_init(atom(), iodata()) -> binary(). +-spec hmac_update(binary(), iodata()) -> binary(). +-spec hmac_final(binary()) -> binary(). +-spec hmac_final_n(binary(), integer()) -> binary(). + +hmac(Type, Key, Data0) -> + Data = iolist_to_binary(Data0), + hmac(Type, Key, Data, undefined, erlang:byte_size(Data), max_bytes(), initial). +hmac(Type, Key, Data0, MacSize) -> + Data = iolist_to_binary(Data0), + hmac(Type, Key, Data, MacSize, erlang:byte_size(Data), max_bytes(), initial). + + +hmac_init(_Type, _Key) -> ?nif_stub. + +hmac_update(State, Data0) -> + Data = iolist_to_binary(Data0), + hmac_update(State, Data, erlang:byte_size(Data), max_bytes()). +hmac_final(_Context) -> ? nif_stub. +hmac_final_n(_Context, _HashLen) -> ? nif_stub. + +%% Ecrypt/decrypt %%% + +-spec block_encrypt(des_cbc | des_cfb | des3_cbc | des3_cbf | des_ede3 | blowfish_cbc | + blowfish_cfb64 | aes_cbc128 | aes_cfb128 | aes_cbc256 | rc2_cbc, + Key::iodata(), Ivec::binary(), Data::iodata()) -> binary(). + +block_encrypt(des_cbc, Key, Ivec, Data) -> + des_cbc_encrypt(Key, Ivec, Data); +block_encrypt(des_cfb, Key, Ivec, Data) -> + des_cfb_encrypt(Key, Ivec, Data); +block_encrypt(des3_cbc, [Key1, Key2, Key3], Ivec, Data) -> + des3_cbc_encrypt(Key1, Key2, Key3, Ivec, Data); +block_encrypt(des3_cbf, [Key1, Key2, Key3], Ivec, Data) -> + des3_cfb_encrypt(Key1, Key2, Key3, Ivec, Data); +block_encrypt(des_ede3, [Key1, Key2, Key3], Ivec, Data) -> + des_ede3_cbc_encrypt(Key1, Key2, Key3, Ivec, Data); +block_encrypt(blowfish_cbc, Key, Ivec, Data) -> + blowfish_cbc_encrypt(Key, Ivec, Data); +block_encrypt(blowfish_cfb64, Key, Ivec, Data) -> + blowfish_cfb64_encrypt(Key, Ivec, Data); +block_encrypt(blowfish_ofb64, Key, Ivec, Data) -> + blowfish_ofb64_encrypt(Key, Ivec, Data); +block_encrypt(aes_cbc128, Key, Ivec, Data) -> + aes_cbc_128_encrypt(Key, Ivec, Data); +block_encrypt(aes_cbc256, Key, Ivec, Data) -> + aes_cbc_256_encrypt(Key, Ivec, Data); +block_encrypt(aes_cfb128, Key, Ivec, Data) -> + aes_cfb_128_encrypt(Key, Ivec, Data); +block_encrypt(rc2_cbc, Key, Ivec, Data) -> + rc2_cbc_encrypt(Key, Ivec, Data). + +-spec block_decrypt(des_cbc | des_cfb | des3_cbc | des3_cbf | des_ede3 | blowfish_cbc | + blowfish_cfb64 | blowfish_ofb64 | aes_cbc128 | aes_cbc256 | aes_cfb128 | rc2_cbc, + Key::iodata(), Ivec::binary(), Data::iodata()) -> binary(). + +block_decrypt(des_cbc, Key, Ivec, Data) -> + des_cbc_decrypt(Key, Ivec, Data); +block_decrypt(des_cfb, Key, Ivec, Data) -> + des_cfb_decrypt(Key, Ivec, Data); +block_decrypt(des3_cbc, [Key1, Key2, Key3], Ivec, Data) -> + des3_cbc_decrypt(Key1, Key2, Key3, Ivec, Data); +block_decrypt(des3_cbf, [Key1, Key2, Key3], Ivec, Data) -> + des3_cfb_decrypt(Key1, Key2, Key3, Ivec, Data); +block_decrypt(des_ede3, [Key1, Key2, Key3], Ivec, Data) -> + des_ede3_cbc_decrypt(Key1, Key2, Key3, Ivec, Data); +block_decrypt(blowfish_cbc, Key, Ivec, Data) -> + blowfish_cbc_decrypt(Key, Ivec, Data); +block_decrypt(blowfish_cfb64, Key, Ivec, Data) -> + blowfish_cfb64_decrypt(Key, Ivec, Data); +block_decrypt(blowfish_ofb64, Key, Ivec, Data) -> + blowfish_ofb64_decrypt(Key, Ivec, Data); +block_decrypt(aes_cbc128, Key, Ivec, Data) -> + aes_cbc_128_decrypt(Key, Ivec, Data); +block_decrypt(aes_cbc256, Key, Ivec, Data) -> + aes_cbc_256_decrypt(Key, Ivec, Data); +block_decrypt(aes_cfb128, Key, Ivec, Data) -> + aes_cfb_128_decrypt(Key, Ivec, Data); +block_decrypt(rc2_cbc, Key, Ivec, Data) -> + rc2_cbc_decrypt(Key, Ivec, Data). + +-spec block_encrypt(des_ecb | blowfish_ecb, Key::iodata(), Data::iodata()) -> binary(). + +block_encrypt(des_ecb, Key, Data) -> + des_ecb_encrypt(Key, Data); +block_encrypt(blowfish_ecb, Key, Data) -> + blowfish_ecb_encrypt(Key, Data). + +-spec block_decrypt(des_ecb | blowfish_ecb, Key::iodata(), Data::iodata()) -> binary(). + +block_decrypt(des_ecb, Key, Data) -> + des_ecb_decrypt(Key, Data); +block_decrypt(blowfish_ecb, Key, Data) -> + blowfish_ecb_decrypt(Key, Data). + +-spec next_iv(des_cbc | des3_cbc | aes_cbc, Data::iodata()) -> binary(). + +next_iv(des_cbc, Data) -> + des_cbc_ivec(Data); +next_iv(des3_cbc, Data) -> + des_cbc_ivec(Data); +next_iv(aes_cbc, Data) -> + aes_cbc_ivec(Data). + +-spec next_iv(des_cfb, Data::iodata(), Ivec::binary()) -> binary(). + +next_iv(des_cfb, Data, Ivec) -> + des_cfb_ivec(Ivec, Data); +next_iv(Type, Data, _Ivec) -> + next_iv(Type, Data). + +stream_init(aes_ctr, Key, Ivec) -> + {aes_ctr, aes_ctr_stream_init(Key, Ivec)}. +stream_init(rc4, Key) -> + {rc4, rc4_set_key(Key)}. + +stream_encrypt(State, Data0) -> + Data = iolist_to_binary(Data0), + MaxByts = max_bytes(), + stream_crypt(fun do_stream_encrypt/2, State, Data, erlang:byte_size(Data), MaxByts, []). + +stream_decrypt(State, Data0) -> + Data = iolist_to_binary(Data0), + MaxByts = max_bytes(), + stream_crypt(fun do_stream_decrypt/2, State, Data, erlang:byte_size(Data), MaxByts, []). + +%% +%% RAND - pseudo random numbers using RN_ functions in crypto lib +%% +-spec rand_bytes(non_neg_integer()) -> binary(). +-spec strong_rand_bytes(non_neg_integer()) -> binary(). +-spec rand_uniform(crypto_integer(), crypto_integer()) -> + crypto_integer(). + +rand_bytes(_Bytes) -> ?nif_stub. + +strong_rand_bytes(Bytes) -> + case strong_rand_bytes_nif(Bytes) of + false -> erlang:error(low_entropy); + Bin -> Bin + end. +strong_rand_bytes_nif(_Bytes) -> ?nif_stub. + +rand_bytes(_Bytes, _Topmask, _Bottommask) -> ?nif_stub. + + +rand_uniform(From,To) when is_binary(From), is_binary(To) -> + case rand_uniform_nif(From,To) of + <<Len:32/integer, MSB, Rest/binary>> when MSB > 127 -> + <<(Len + 1):32/integer, 0, MSB, Rest/binary>>; + Whatever -> + Whatever + end; +rand_uniform(From,To) when is_integer(From),is_integer(To) -> + if From < 0 -> + rand_uniform_pos(0, To - From) + From; + true -> + rand_uniform_pos(From, To) + end. + +rand_uniform_pos(From,To) when From < To -> + BinFrom = mpint(From), + BinTo = mpint(To), + case rand_uniform(BinFrom, BinTo) of + Result when is_binary(Result) -> + erlint(Result); + Other -> + Other + end; +rand_uniform_pos(_,_) -> + error(badarg). + +rand_uniform_nif(_From,_To) -> ?nif_stub. + + +-spec mod_pow(binary()|integer(), binary()|integer(), binary()|integer()) -> binary() | error. +mod_pow(Base, Exponent, Prime) -> + case mod_exp_nif(ensure_int_as_bin(Base), ensure_int_as_bin(Exponent), ensure_int_as_bin(Prime), 0) of + <<0>> -> error; + R -> R + end. +verify(dss, none, Data, Signature, Key) when is_binary(Data) -> + verify(dss, sha, {digest, Data}, Signature, Key); +verify(Alg, Type, Data, Signature, Key) when is_binary(Data) -> + verify(Alg, Type, {digest, hash(Type, Data)}, Signature, Key); +verify(dss, Type, Data, Signature, Key) -> + dss_verify_nif(Type, Data, Signature, map_ensure_int_as_bin(Key)); +verify(rsa, Type, DataOrDigest, Signature, Key) -> + case rsa_verify_nif(Type, DataOrDigest, Signature, map_ensure_int_as_bin(Key)) of + notsup -> erlang:error(notsup); + Bool -> Bool + end; +verify(ecdsa, Type, DataOrDigest, Signature, [Key, Curve]) -> + case ecdsa_verify_nif(Type, DataOrDigest, Signature, nif_curve_params(Curve), ensure_int_as_bin(Key)) of + notsup -> erlang:error(notsup); + Bool -> Bool + end. +sign(dss, none, Data, Key) when is_binary(Data) -> + sign(dss, sha, {digest, Data}, Key); +sign(Alg, Type, Data, Key) when is_binary(Data) -> + sign(Alg, Type, {digest, hash(Type, Data)}, Key); +sign(rsa, Type, DataOrDigest, Key) -> + case rsa_sign_nif(Type, DataOrDigest, map_ensure_int_as_bin(Key)) of + error -> erlang:error(badkey, [Type,DataOrDigest,Key]); + Sign -> Sign + end; +sign(dss, Type, DataOrDigest, Key) -> + case dss_sign_nif(Type, DataOrDigest, map_ensure_int_as_bin(Key)) of + error -> erlang:error(badkey, [DataOrDigest, Key]); + Sign -> Sign + end; +sign(ecdsa, Type, DataOrDigest, [Key, Curve]) -> + case ecdsa_sign_nif(Type, DataOrDigest, nif_curve_params(Curve), ensure_int_as_bin(Key)) of + error -> erlang:error(badkey, [Type,DataOrDigest,Key]); + Sign -> Sign + end. + +-spec public_encrypt(rsa, binary(), [binary()], rsa_padding()) -> + binary(). +-spec public_decrypt(rsa, binary(), [integer() | binary()], rsa_padding()) -> + binary(). +-spec private_encrypt(rsa, binary(), [integer() | binary()], rsa_padding()) -> + binary(). +-spec private_decrypt(rsa, binary(), [integer() | binary()], rsa_padding()) -> + binary(). + +public_encrypt(rsa, BinMesg, Key, Padding) -> + case rsa_public_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, true) of + error -> + erlang:error(encrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign + end. + +%% Binary, Key = [E,N,D] +private_decrypt(rsa, BinMesg, Key, Padding) -> + case rsa_private_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, false) of + error -> + erlang:error(decrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign + end. + + +%% Binary, Key = [E,N,D] +private_encrypt(rsa, BinMesg, Key, Padding) -> + case rsa_private_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, true) of + error -> + erlang:error(encrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign + end. + +%% Binary, Key = [E,N] +public_decrypt(rsa, BinMesg, Key, Padding) -> + case rsa_public_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, false) of + error -> + erlang:error(decrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign + end. + +%% +%% XOR - xor to iolists and return a binary +%% NB doesn't check that they are the same size, just concatenates +%% them and sends them to the driver +%% +-spec exor(iodata(), iodata()) -> binary(). + +exor(Bin1, Bin2) -> + Data1 = iolist_to_binary(Bin1), + Data2 = iolist_to_binary(Bin2), + MaxBytes = max_bytes(), + exor(Data1, Data2, erlang:byte_size(Data1), MaxBytes, []). + +generate_key(Type, Params) -> + generate_key(Type, Params, undefined). + +generate_key(dh, DHParameters, PrivateKey) -> + dh_generate_key_nif(ensure_int_as_bin(PrivateKey), + map_ensure_int_as_bin(DHParameters), 0); + +generate_key(srp, {host, [Verifier, Generator, Prime, Version]}, PrivArg) + when is_binary(Verifier), is_binary(Generator), is_binary(Prime), is_atom(Version) -> + Private = case PrivArg of + undefined -> random_bytes(32); + _ -> ensure_int_as_bin(PrivArg) + end, + host_srp_gen_key(Private, Verifier, Generator, Prime, Version); + +generate_key(srp, {user, [Generator, Prime, Version]}, PrivateArg) + when is_binary(Generator), is_binary(Prime), is_atom(Version) -> + Private = case PrivateArg of + undefined -> random_bytes(32); + _ -> PrivateArg + end, + user_srp_gen_key(Private, Generator, Prime); + +generate_key(ecdh, Curve, undefined) -> + ec_key_generate(Curve). + + +compute_key(dh, OthersPublicKey, MyPrivateKey, DHParameters) -> + case dh_compute_key_nif(ensure_int_as_bin(OthersPublicKey), + ensure_int_as_bin(MyPrivateKey), + map_ensure_int_as_bin(DHParameters)) of + error -> erlang:error(computation_failed, + [OthersPublicKey,MyPrivateKey,DHParameters]); + Ret -> Ret + end; + +compute_key(srp, HostPublic, {UserPublic, UserPrivate}, + {user, [DerivedKey, Prime, Generator, Version | ScramblerArg]}) when + is_binary(Prime), + is_binary(Generator), + is_atom(Version) -> + HostPubBin = ensure_int_as_bin(HostPublic), + Multiplier = srp_multiplier(Version, Generator, Prime), + Scrambler = case ScramblerArg of + [] -> srp_scrambler(Version, ensure_int_as_bin(UserPublic), + HostPubBin, Prime); + [S] -> S + end, + srp_user_secret_nif(ensure_int_as_bin(UserPrivate), Scrambler, HostPubBin, + Multiplier, Generator, DerivedKey, Prime); + +compute_key(srp, UserPublic, {HostPublic, HostPrivate}, + {host,[Verifier, Prime, Version | ScramblerArg]}) when + is_binary(Verifier), + is_binary(Prime), + is_atom(Version) -> + UserPubBin = ensure_int_as_bin(UserPublic), + Scrambler = case ScramblerArg of + [] -> srp_scrambler(Version, UserPubBin, ensure_int_as_bin(HostPublic), Prime); + [S] -> S + end, + srp_host_secret_nif(Verifier, ensure_int_as_bin(HostPrivate), Scrambler, + UserPubBin, Prime); + +compute_key(ecdh, Others, My, Curve) -> + ecdh_compute_key_nif(ensure_int_as_bin(Others), + nif_curve_params(Curve), + ensure_int_as_bin(My)). + + +random_bytes(N) -> + try strong_rand_bytes(N) of + RandBytes -> + RandBytes + catch + error:low_entropy -> + rand_bytes(N) + end. + +%%-------------------------------------------------------------------- +%%% On load +%%-------------------------------------------------------------------- + +on_load() -> + LibBaseName = "crypto", + PrivDir = code:priv_dir(crypto), + LibName = case erlang:system_info(build_type) of + opt -> + LibBaseName; + Type -> + LibTypeName = LibBaseName ++ "." ++ atom_to_list(Type), + case (filelib:wildcard( + filename:join( + [PrivDir, + "lib", + LibTypeName ++ "*"])) /= []) orelse + (filelib:wildcard( + filename:join( + [PrivDir, + "lib", + erlang:system_info(system_architecture), + LibTypeName ++ "*"])) /= []) of + true -> LibTypeName; + false -> LibBaseName + end + end, + Lib = filename:join([PrivDir, "lib", LibName]), + Status = case erlang:load_nif(Lib, {?CRYPTO_NIF_VSN,Lib}) of + ok -> ok; + {error, {load_failed, _}}=Error1 -> + ArchLibDir = + filename:join([PrivDir, "lib", + erlang:system_info(system_architecture)]), + Candidate = + filelib:wildcard(filename:join([ArchLibDir,LibName ++ "*" ])), + case Candidate of + [] -> Error1; + _ -> + ArchLib = filename:join([ArchLibDir, LibName]), + erlang:load_nif(ArchLib, {?CRYPTO_NIF_VSN,ArchLib}) + end; + Error1 -> Error1 + end, + case Status of + ok -> ok; + {error, {E, Str}} -> + error_logger:error_msg("Unable to load crypto library. Failed with error:~n\"~p, ~s\"~n" + "OpenSSL might not be installed on this system.~n",[E,Str]), + Status + end. +%%-------------------------------------------------------------------- +%%% Internal functions (some internal API functions are part of the deprecated API) +%%-------------------------------------------------------------------- +max_bytes() -> + ?MAX_BYTES_TO_NIF. + +%% HASH -------------------------------------------------------------------- +hash(Hash, Data, Size, Max, initial) when Size =< Max -> + do_hash(Hash, Data); +hash(State0, Data, Size, Max, continue) when Size =< Max -> + State = do_hash_update(State0, Data), + hash_final(State); +hash(Hash, Data, _Size, Max, initial) -> + <<Increment:Max/binary, Rest/binary>> = Data, + State0 = hash_init(Hash), + State = do_hash_update(State0, Increment), + hash(State, Rest, erlang:byte_size(Rest), max_bytes(), continue); +hash(State0, Data, _Size, MaxByts, continue) -> + <<Increment:MaxByts/binary, Rest/binary>> = Data, + State = do_hash_update(State0, Increment), + hash(State, Rest, erlang:byte_size(Rest), max_bytes(), continue). + +do_hash(md5, Data) -> md5(Data); +do_hash(md4, Data) -> md4(Data); +do_hash(sha, Data) -> sha(Data); +do_hash(ripemd160, Data) -> ripemd160(Data); +do_hash(sha224, Data) -> sha224(Data); +do_hash(sha256, Data) -> sha256(Data); +do_hash(sha384, Data) -> sha384(Data); +do_hash(sha512, Data) -> sha512(Data). + +hash_update(State, Data, Size, MaxBytes) when Size =< MaxBytes -> + do_hash_update(State, Data); +hash_update(State0, Data, _, MaxBytes) -> + <<Increment:MaxBytes/binary, Rest/binary>> = Data, + State = do_hash_update(State0, Increment), + hash_update(State, Rest, erlang:byte_size(Rest), MaxBytes). + +do_hash_update({md5,Context}, Data) -> {md5, md5_update(Context,Data)}; +do_hash_update({md4,Context}, Data) -> {md4, md4_update(Context,Data)}; +do_hash_update({sha,Context}, Data) -> {sha, sha_update(Context,Data)}; +do_hash_update({ripemd160,Context}, Data) -> {ripemd160, ripemd160_update(Context,Data)}; +do_hash_update({sha224,Context}, Data) -> {sha224, sha224_update(Context,Data)}; +do_hash_update({sha256,Context}, Data) -> {sha256, sha256_update(Context,Data)}; +do_hash_update({sha384,Context}, Data) -> {sha384, sha384_update(Context,Data)}; +do_hash_update({sha512,Context}, Data) -> {sha512, sha512_update(Context,Data)}. + + %% %% MD5 %% @@ -567,40 +901,56 @@ sha512_init_nif() -> ?nif_stub. sha512_update_nif(_Context, _Data) -> ?nif_stub. sha512_final_nif(_Context) -> ?nif_stub. -%% -%% MESSAGE AUTHENTICATION CODES -%% - -%% -%% HMAC (multiple hash options) -%% +%% HMAC -------------------------------------------------------------------- --spec hmac(_, iodata(), iodata()) -> binary(). --spec hmac(_, iodata(), iodata(), integer()) -> binary(). --spec hmac_init(atom(), iodata()) -> binary(). --spec hmac_update(binary(), iodata()) -> binary(). --spec hmac_final(binary()) -> binary(). --spec hmac_final_n(binary(), integer()) -> binary(). - -hmac(md5, Key, Data) -> md5_mac(Key, Data); -hmac(sha, Key, Data) -> sha_mac(Key, Data); -hmac(sha224, Key, Data) -> sha224_mac(Key, Data); -hmac(sha256, Key, Data) -> sha256_mac(Key, Data); -hmac(sha384, Key, Data) -> sha384_mac(Key, Data); -hmac(sha512, Key, Data) -> sha512_mac(Key, Data). - -hmac(md5, Key, Data, Size) -> md5_mac_n(Key, Data, Size); -hmac(sha, Key, Data, Size) -> sha_mac_n(Key, Data, Size); -hmac(sha224, Key, Data, Size) -> sha224_mac(Key, Data, Size); -hmac(sha256, Key, Data, Size) -> sha256_mac(Key, Data, Size); -hmac(sha384, Key, Data, Size) -> sha384_mac(Key, Data, Size); -hmac(sha512, Key, Data, Size) -> sha512_mac(Key, Data, Size). +hmac(Type, Key, Data, MacSize, Size, MaxBytes, initial) when Size =< MaxBytes -> + case MacSize of + undefined -> + do_hmac(Type, Key, Data); + _ -> + do_hmac(Type, Key, Data, MacSize) + end; +hmac(Type, Key, Data, MacSize, _, MaxBytes, initial) -> + <<Increment:MaxBytes/binary, Rest/binary>> = Data, + State0 = hmac_init(Type, Key), + State = hmac_update(State0, Increment), + hmac(State, Rest, MacSize, erlang:byte_size(Rest), max_bytes(), continue). +hmac(State0, Data, MacSize, Size, MaxBytes, continue) when Size =< MaxBytes -> + State = hmac_update(State0, Data), + case MacSize of + undefined -> + hmac_final(State); + _ -> + hmac_final_n(State, MacSize) + end; +hmac(State0, Data, MacSize, _Size, MaxBytes, continue) -> + <<Increment:MaxBytes/binary, Rest/binary>> = Data, + State = hmac_update(State0, Increment), + hmac(State, Rest, MacSize, erlang:byte_size(Rest), max_bytes(), continue). + +hmac_update(State, Data, Size, MaxBytes) when Size =< MaxBytes -> + do_hmac_update(State, Data); +hmac_update(State0, Data, _, MaxBytes) -> + <<Increment:MaxBytes/binary, Rest/binary>> = Data, + State = do_hmac_update(State0, Increment), + hmac_update(State, Rest, erlang:byte_size(Rest), MaxBytes). + +do_hmac(md5, Key, Data) -> md5_mac(Key, Data); +do_hmac(sha, Key, Data) -> sha_mac(Key, Data); +do_hmac(sha224, Key, Data) -> sha224_mac(Key, Data); +do_hmac(sha256, Key, Data) -> sha256_mac(Key, Data); +do_hmac(sha384, Key, Data) -> sha384_mac(Key, Data); +do_hmac(sha512, Key, Data) -> sha512_mac(Key, Data). + +do_hmac(md5, Key, Data, Size) -> md5_mac_n(Key, Data, Size); +do_hmac(sha, Key, Data, Size) -> sha_mac_n(Key, Data, Size); +do_hmac(sha224, Key, Data, Size) -> sha224_mac(Key, Data, Size); +do_hmac(sha256, Key, Data, Size) -> sha256_mac(Key, Data, Size); +do_hmac(sha384, Key, Data, Size) -> sha384_mac(Key, Data, Size); +do_hmac(sha512, Key, Data, Size) -> sha512_mac(Key, Data, Size). + +do_hmac_update(_Context, _Data) -> ? nif_stub. -hmac_init(_Type, _Key) -> ?nif_stub. -hmac_update(_Context, _Data) -> ? nif_stub. -hmac_final(_Context) -> ? nif_stub. -hmac_final_n(_Context, _HashLen) -> ? nif_stub. - %% %% MD5_MAC %% @@ -696,172 +1046,7 @@ sha512_mac(Key, Data, MacSz) -> sha512_mac_nif(_Key,_Data,_MacSz) -> ?nif_stub. - -%% Ecrypt/decrypt %%% - --spec block_encrypt(des_cbc | des_cfb | des3_cbc | des3_cbf | des_ede3 | blowfish_cbc | - blowfish_cfb64 | aes_cbc128 | aes_cfb128 | aes_cbc256 | rc2_cbc, - Key::iodata(), Ivec::binary(), Data::iodata()) -> binary(). - -block_encrypt(des_cbc, Key, Ivec, Data) -> - des_cbc_encrypt(Key, Ivec, Data); -block_encrypt(des_cfb, Key, Ivec, Data) -> - des_cfb_encrypt(Key, Ivec, Data); -block_encrypt(des3_cbc, [Key1, Key2, Key3], Ivec, Data) -> - des3_cbc_encrypt(Key1, Key2, Key3, Ivec, Data); -block_encrypt(des3_cbf, [Key1, Key2, Key3], Ivec, Data) -> - des3_cfb_encrypt(Key1, Key2, Key3, Ivec, Data); -block_encrypt(des_ede3, [Key1, Key2, Key3], Ivec, Data) -> - des_ede3_cbc_encrypt(Key1, Key2, Key3, Ivec, Data); -block_encrypt(blowfish_cbc, Key, Ivec, Data) -> - blowfish_cbc_encrypt(Key, Ivec, Data); -block_encrypt(blowfish_cfb64, Key, Ivec, Data) -> - blowfish_cfb64_encrypt(Key, Ivec, Data); -block_encrypt(blowfish_ofb64, Key, Ivec, Data) -> - blowfish_ofb64_encrypt(Key, Ivec, Data); -block_encrypt(aes_cbc128, Key, Ivec, Data) -> - aes_cbc_128_encrypt(Key, Ivec, Data); -block_encrypt(aes_cbc256, Key, Ivec, Data) -> - aes_cbc_256_encrypt(Key, Ivec, Data); -block_encrypt(aes_cfb128, Key, Ivec, Data) -> - aes_cfb_128_encrypt(Key, Ivec, Data); -block_encrypt(rc2_cbc, Key, Ivec, Data) -> - rc2_cbc_encrypt(Key, Ivec, Data). - --spec block_decrypt(des_cbc | des_cfb | des3_cbc | des3_cbf | des_ede3 | blowfish_cbc | - blowfish_cfb64 | blowfish_ofb64 | aes_cbc128 | aes_cbc256 | aes_cfb128 | rc2_cbc, - Key::iodata(), Ivec::binary(), Data::iodata()) -> binary(). - -block_decrypt(des_cbc, Key, Ivec, Data) -> - des_cbc_decrypt(Key, Ivec, Data); -block_decrypt(des_cfb, Key, Ivec, Data) -> - des_cfb_decrypt(Key, Ivec, Data); -block_decrypt(des3_cbc, [Key1, Key2, Key3], Ivec, Data) -> - des3_cbc_decrypt(Key1, Key2, Key3, Ivec, Data); -block_decrypt(des3_cbf, [Key1, Key2, Key3], Ivec, Data) -> - des3_cfb_decrypt(Key1, Key2, Key3, Ivec, Data); -block_decrypt(des_ede3, [Key1, Key2, Key3], Ivec, Data) -> - des_ede3_cbc_decrypt(Key1, Key2, Key3, Ivec, Data); -block_decrypt(blowfish_cbc, Key, Ivec, Data) -> - blowfish_cbc_decrypt(Key, Ivec, Data); -block_decrypt(blowfish_cfb64, Key, Ivec, Data) -> - blowfish_cfb64_decrypt(Key, Ivec, Data); -block_decrypt(blowfish_ofb64, Key, Ivec, Data) -> - blowfish_ofb64_decrypt(Key, Ivec, Data); -block_decrypt(aes_cbc128, Key, Ivec, Data) -> - aes_cbc_128_decrypt(Key, Ivec, Data); -block_decrypt(aes_cbc256, Key, Ivec, Data) -> - aes_cbc_256_decrypt(Key, Ivec, Data); -block_decrypt(aes_cfb128, Key, Ivec, Data) -> - aes_cfb_128_decrypt(Key, Ivec, Data); -block_decrypt(rc2_cbc, Key, Ivec, Data) -> - rc2_cbc_decrypt(Key, Ivec, Data). - --spec block_encrypt(des_ecb | blowfish_ecb, Key::iodata(), Data::iodata()) -> binary(). - -block_encrypt(des_ecb, Key, Data) -> - des_ecb_encrypt(Key, Data); -block_encrypt(blowfish_ecb, Key, Data) -> - blowfish_ecb_encrypt(Key, Data). - --spec block_decrypt(des_ecb | blowfish_ecb, Key::iodata(), Data::iodata()) -> binary(). - -block_decrypt(des_ecb, Key, Data) -> - des_ecb_decrypt(Key, Data); -block_decrypt(blowfish_ecb, Key, Data) -> - blowfish_ecb_decrypt(Key, Data). - --spec next_iv(des_cbc | des3_cbc | aes_cbc, Data::iodata()) -> binary(). - -next_iv(des_cbc, Data) -> - des_cbc_ivec(Data); -next_iv(des3_cbc, Data) -> - des_cbc_ivec(Data); -next_iv(aes_cbc, Data) -> - aes_cbc_ivec(Data). - --spec next_iv(des_cfb, Data::iodata(), Ivec::binary()) -> binary(). - -next_iv(des_cfb, Data, Ivec) -> - des_cfb_ivec(Ivec, Data); -next_iv(Type, Data, _Ivec) -> - next_iv(Type, Data). - -stream_init(aes_ctr, Key, Ivec) -> - {aes_ctr, aes_ctr_stream_init(Key, Ivec)}. -stream_init(rc4, Key) -> - {rc4, rc4_set_key(Key)}. -stream_encrypt({aes_ctr, State0}, Data) -> - {State, Cipher} = aes_ctr_stream_encrypt(State0, Data), - {{aes_ctr, State}, Cipher}; -stream_encrypt({rc4, State0}, Data) -> - {State, Cipher} = rc4_encrypt_with_state(State0, Data), - {{rc4, State}, Cipher}. -stream_decrypt({aes_ctr, State0}, Data) -> - {State, Text} = aes_ctr_stream_decrypt(State0, Data), - {{aes_ctr, State}, Text}; -stream_decrypt({rc4, State0}, Data) -> - {State, Text} = rc4_encrypt_with_state (State0, Data), - {{rc4, State}, Text}. - -%% -%% CRYPTO FUNCTIONS -%% - -%% -%% DES - in cipher block chaining mode (CBC) -%% --spec des_cbc_encrypt(iodata(), binary(), iodata()) -> binary(). --spec des_cbc_decrypt(iodata(), binary(), iodata()) -> binary(). - -des_cbc_encrypt(Key, IVec, Data) -> - des_cbc_crypt(Key, IVec, Data, true). - -des_cbc_decrypt(Key, IVec, Data) -> - des_cbc_crypt(Key, IVec, Data, false). - -des_cbc_crypt(_Key, _IVec, _Data, _IsEncrypt) -> ?nif_stub. - -%% -%% dec_cbc_ivec(Data) -> binary() -%% -%% Returns the IVec to be used in the next iteration of -%% des_cbc_[encrypt|decrypt]. -%% --spec des_cbc_ivec(iodata()) -> binary(). - -des_cbc_ivec(Data) when is_binary(Data) -> - {_, IVec} = split_binary(Data, size(Data) - 8), - IVec; -des_cbc_ivec(Data) when is_list(Data) -> - des_cbc_ivec(list_to_binary(Data)). - -%% -%% DES - in 8-bits cipher feedback mode (CFB) -%% --spec des_cfb_encrypt(iodata(), binary(), iodata()) -> binary(). --spec des_cfb_decrypt(iodata(), binary(), iodata()) -> binary(). - -des_cfb_encrypt(Key, IVec, Data) -> - des_cfb_crypt(Key, IVec, Data, true). - -des_cfb_decrypt(Key, IVec, Data) -> - des_cfb_crypt(Key, IVec, Data, false). - -des_cfb_crypt(_Key, _IVec, _Data, _IsEncrypt) -> ?nif_stub. - -%% -%% dec_cfb_ivec(IVec, Data) -> binary() -%% -%% Returns the IVec to be used in the next iteration of -%% des_cfb_[encrypt|decrypt]. -%% --spec des_cfb_ivec(iodata(), iodata()) -> binary(). - -des_cfb_ivec(IVec, Data) -> - IVecAndData = list_to_binary([IVec, Data]), - {_, NewIVec} = split_binary(IVecAndData, byte_size(IVecAndData) - 8), - NewIVec. +%% CIPHERS -------------------------------------------------------------------- %% %% DES - in electronic codebook mode (ECB) @@ -973,292 +1158,63 @@ aes_cfb_128_decrypt(Key, IVec, Data) -> aes_cfb_128_crypt(_Key, _IVec, _Data, _IsEncrypt) -> ?nif_stub. -%% -%% RAND - pseudo random numbers using RN_ functions in crypto lib %% --spec rand_bytes(non_neg_integer()) -> binary(). --spec strong_rand_bytes(non_neg_integer()) -> binary(). --spec rand_uniform(crypto_integer(), crypto_integer()) -> - crypto_integer(). --spec strong_rand_mpint(Bits::non_neg_integer(), - Top::-1..1, - Bottom::0..1) -> binary(). - -rand_bytes(_Bytes) -> ?nif_stub. - -strong_rand_bytes(Bytes) -> - case strong_rand_bytes_nif(Bytes) of - false -> erlang:error(low_entropy); - Bin -> Bin - end. -strong_rand_bytes_nif(_Bytes) -> ?nif_stub. - -rand_bytes(_Bytes, _Topmask, _Bottommask) -> ?nif_stub. - -strong_rand_mpint(Bits, Top, Bottom) -> - case strong_rand_mpint_nif(Bits,Top,Bottom) of - false -> erlang:error(low_entropy); - Bin -> Bin - end. -strong_rand_mpint_nif(_Bits, _Top, _Bottom) -> ?nif_stub. - +%% DES - in cipher block chaining mode (CBC) +%% +-spec des_cbc_encrypt(iodata(), binary(), iodata()) -> binary(). +-spec des_cbc_decrypt(iodata(), binary(), iodata()) -> binary(). -rand_uniform(From,To) when is_binary(From), is_binary(To) -> - case rand_uniform_nif(From,To) of - <<Len:32/integer, MSB, Rest/binary>> when MSB > 127 -> - <<(Len + 1):32/integer, 0, MSB, Rest/binary>>; - Whatever -> - Whatever - end; -rand_uniform(From,To) when is_integer(From),is_integer(To) -> - if From < 0 -> - rand_uniform_pos(0, To - From) + From; - true -> - rand_uniform_pos(From, To) - end. +des_cbc_encrypt(Key, IVec, Data) -> + des_cbc_crypt(Key, IVec, Data, true). -rand_uniform_pos(From,To) when From < To -> - BinFrom = mpint(From), - BinTo = mpint(To), - case rand_uniform(BinFrom, BinTo) of - Result when is_binary(Result) -> - erlint(Result); - Other -> - Other - end; -rand_uniform_pos(_,_) -> - error(badarg). +des_cbc_decrypt(Key, IVec, Data) -> + des_cbc_crypt(Key, IVec, Data, false). -rand_uniform_nif(_From,_To) -> ?nif_stub. +des_cbc_crypt(_Key, _IVec, _Data, _IsEncrypt) -> ?nif_stub. %% -%% mod_exp - utility for rsa generation and SRP +%% dec_cbc_ivec(Data) -> binary() %% -mod_exp(Base, Exponent, Modulo) - when is_integer(Base), is_integer(Exponent), is_integer(Modulo) -> - bin_to_int(mod_exp_nif(int_to_bin(Base), int_to_bin(Exponent), int_to_bin(Modulo), 0)); - -mod_exp(Base, Exponent, Modulo) -> - mod_exp_nif(mpint_to_bin(Base),mpint_to_bin(Exponent),mpint_to_bin(Modulo), 4). - --spec mod_pow(binary()|integer(), binary()|integer(), binary()|integer()) -> binary() | error. -mod_pow(Base, Exponent, Prime) -> - case mod_exp_nif(ensure_int_as_bin(Base), ensure_int_as_bin(Exponent), ensure_int_as_bin(Prime), 0) of - <<0>> -> error; - R -> R - end. - +%% Returns the IVec to be used in the next iteration of +%% des_cbc_[encrypt|decrypt]. +%% +-spec des_cbc_ivec(iodata()) -> binary(). -mod_exp_nif(_Base,_Exp,_Mod,_bin_hdr) -> ?nif_stub. +des_cbc_ivec(Data) when is_binary(Data) -> + {_, IVec} = split_binary(Data, size(Data) - 8), + IVec; +des_cbc_ivec(Data) when is_list(Data) -> + des_cbc_ivec(list_to_binary(Data)). %% -%% DSS, RSA - verify +%% DES - in 8-bits cipher feedback mode (CFB) %% --spec dss_verify(data_or_digest(), binary(), [binary()]) -> boolean(). --spec dss_verify(dss_digest_type(), data_or_digest(), binary(), [binary()]) -> boolean(). --spec rsa_verify(data_or_digest(), binary(), [binary()]) -> boolean(). --spec rsa_verify(rsa_digest_type(), data_or_digest(), binary(), [binary()]) -> - boolean(). - -%% Key = [P,Q,G,Y] P,Q,G=DSSParams Y=PublicKey -dss_verify(Data,Signature,Key) -> - dss_verify(sha, Data, Signature, Key). - -dss_verify(Type,Data,Signature,Key) when is_binary(Data), Type=/=none -> - verify(dss,Type,mpint_to_bin(Data),mpint_to_bin(Signature),map_mpint_to_bin(Key)); -dss_verify(Type,Digest,Signature,Key) -> - verify(dss,Type,Digest,mpint_to_bin(Signature),map_mpint_to_bin(Key)). - -% Key = [E,N] E=PublicExponent N=PublicModulus -rsa_verify(Data,Signature,Key) -> - rsa_verify(sha, Data,Signature,Key). -rsa_verify(Type, Data, Signature, Key) when is_binary(Data) -> - verify(rsa, Type, mpint_to_bin(Data), mpint_to_bin(Signature), map_mpint_to_bin(Key)); -rsa_verify(Type, Digest, Signature, Key) -> - verify(rsa, Type, Digest, mpint_to_bin(Signature), map_mpint_to_bin(Key)). - - -verify(dss, Type, Data, Signature, Key) -> - dss_verify_nif(Type, Data, Signature, map_ensure_int_as_bin(Key)); - -verify(rsa, Type, DataOrDigest, Signature, Key) -> - case rsa_verify_nif(Type, DataOrDigest, Signature, map_ensure_int_as_bin(Key)) of - notsup -> erlang:error(notsup); - Bool -> Bool - end; -verify(ecdsa, Type, DataOrDigest, Signature, [Key, Curve]) -> - case ecdsa_verify_nif(Type, DataOrDigest, Signature, term_to_ec_key(Curve, undefined, Key)) of - notsup -> erlang:error(notsup); - Bool -> Bool - end. +-spec des_cfb_encrypt(iodata(), binary(), iodata()) -> binary(). +-spec des_cfb_decrypt(iodata(), binary(), iodata()) -> binary(). +des_cfb_encrypt(Key, IVec, Data) -> + des_cfb_crypt(Key, IVec, Data, true). -dss_verify_nif(_Type, _Data, _Signature, _Key) -> ?nif_stub. -rsa_verify_nif(_Type, _Data, _Signature, _Key) -> ?nif_stub. -ecdsa_verify_nif(_Type, _DataOrDigest, _Signature, _Key) -> ?nif_stub. +des_cfb_decrypt(Key, IVec, Data) -> + des_cfb_crypt(Key, IVec, Data, false). +des_cfb_crypt(_Key, _IVec, _Data, _IsEncrypt) -> ?nif_stub. %% -%% DSS, RSA - sign +%% dec_cfb_ivec(IVec, Data) -> binary() %% -%% Key = [P,Q,G,X] P,Q,G=DSSParams X=PrivateKey --spec dss_sign(data_or_digest(), [binary()]) -> binary(). --spec dss_sign(dss_digest_type(), data_or_digest(), [binary()]) -> binary(). --spec rsa_sign(data_or_digest(), [binary()]) -> binary(). --spec rsa_sign(rsa_digest_type(), data_or_digest(), [binary()]) -> binary(). - -dss_sign(DataOrDigest,Key) -> - dss_sign(sha,DataOrDigest,Key). -dss_sign(Type, Data, Key) when is_binary(Data), Type=/=none -> - sign(dss, Type, mpint_to_bin(Data), map_mpint_to_bin(Key)); -dss_sign(Type, Digest, Key) -> - sign(dss, Type, Digest, map_mpint_to_bin(Key)). - - -%% Key = [E,N,D] E=PublicExponent N=PublicModulus D=PrivateExponent -rsa_sign(DataOrDigest,Key) -> - rsa_sign(sha, DataOrDigest, Key). - -rsa_sign(Type, Data, Key) when is_binary(Data) -> - sign(rsa, Type, mpint_to_bin(Data), map_mpint_to_bin(Key)); -rsa_sign(Type, Digest, Key) -> - sign(rsa, Type, Digest, map_mpint_to_bin(Key)). - -map_mpint_to_bin(List) -> - lists:map(fun(E) -> mpint_to_bin(E) end, List ). - -map_ensure_int_as_bin([H|_]=List) when is_integer(H) -> - lists:map(fun(E) -> int_to_bin(E) end, List); -map_ensure_int_as_bin(List) -> - List. - -ensure_int_as_bin(Int) when is_integer(Int) -> - int_to_bin(Int); -ensure_int_as_bin(Bin) -> - Bin. - -map_to_norm_bin([H|_]=List) when is_integer(H) -> - lists:map(fun(E) -> int_to_bin(E) end, List); -map_to_norm_bin(List) -> - lists:map(fun(E) -> mpint_to_bin(E) end, List). - - -sign(rsa, Type, DataOrDigest, Key) -> - case rsa_sign_nif(Type, DataOrDigest, map_ensure_int_as_bin(Key)) of - error -> erlang:error(badkey, [Type,DataOrDigest,Key]); - Sign -> Sign - end; -sign(dss, Type, DataOrDigest, Key) -> - case dss_sign_nif(Type, DataOrDigest, map_ensure_int_as_bin(Key)) of - error -> erlang:error(badkey, [DataOrDigest, Key]); - Sign -> Sign - end; -sign(ecdsa, Type, DataOrDigest, [Key, Curve]) -> - case ecdsa_sign_nif(Type, DataOrDigest, term_to_ec_key(Curve, Key, undefined)) of - error -> erlang:error(badkey, [Type,DataOrDigest,Key]); - Sign -> Sign - end. - -rsa_sign_nif(_Type,_Data,_Key) -> ?nif_stub. -dss_sign_nif(_Type,_Data,_Key) -> ?nif_stub. -ecdsa_sign_nif(_Type, _DataOrDigest, _Key) -> ?nif_stub. - - - - --spec public_encrypt(rsa, binary(), [binary()], rsa_padding()) -> - binary(). --spec public_decrypt(rsa, binary(), [integer() | binary()], rsa_padding()) -> - binary(). --spec private_encrypt(rsa, binary(), [integer() | binary()], rsa_padding()) -> - binary(). --spec private_decrypt(rsa, binary(), [integer() | binary()], rsa_padding()) -> - binary(). - -public_encrypt(rsa, BinMesg, Key, Padding) -> - case rsa_public_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, true) of - error -> - erlang:error(encrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - -%% Binary, Key = [E,N,D] -private_decrypt(rsa, BinMesg, Key, Padding) -> - case rsa_private_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, false) of - error -> - erlang:error(decrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - - -%% Binary, Key = [E,N,D] -private_encrypt(rsa, BinMesg, Key, Padding) -> - case rsa_private_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, true) of - error -> - erlang:error(encrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - -%% Binary, Key = [E,N] -public_decrypt(rsa, BinMesg, Key, Padding) -> - case rsa_public_crypt(BinMesg, map_ensure_int_as_bin(Key), Padding, false) of - error -> - erlang:error(decrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - - +%% Returns the IVec to be used in the next iteration of +%% des_cfb_[encrypt|decrypt]. %% -%% rsa_public_encrypt -%% rsa_private_decrypt --type rsa_padding() :: 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding' | 'rsa_no_padding'. --spec rsa_public_encrypt(binary(), [binary()], rsa_padding()) -> - binary(). --spec rsa_public_decrypt(binary(), [integer() | mpint()], rsa_padding()) -> - binary(). --spec rsa_private_encrypt(binary(), [integer() | mpint()], rsa_padding()) -> - binary(). --spec rsa_private_decrypt(binary(), [integer() | mpint()], rsa_padding()) -> - binary(). - -%% Binary, Key = [E,N] -rsa_public_encrypt(BinMesg, Key, Padding) -> - case rsa_public_crypt(BinMesg, map_to_norm_bin(Key), Padding, true) of - error -> - erlang:error(encrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - -rsa_public_crypt(_BinMsg, _Key, _Padding, _IsEncrypt) -> ?nif_stub. +-spec des_cfb_ivec(iodata(), iodata()) -> binary(). -%% Binary, Key = [E,N,D] -rsa_private_decrypt(BinMesg, Key, Padding) -> - case rsa_private_crypt(BinMesg, map_to_norm_bin(Key), Padding, false) of - error -> - erlang:error(decrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. +des_cfb_ivec(IVec, Data) -> + IVecAndData = list_to_binary([IVec, Data]), + {_, NewIVec} = split_binary(IVecAndData, byte_size(IVecAndData) - 8), + NewIVec. -rsa_private_crypt(_BinMsg, _Key, _Padding, _IsEncrypt) -> ?nif_stub. - -%% Binary, Key = [E,N,D] -rsa_private_encrypt(BinMesg, Key, Padding) -> - case rsa_private_crypt(BinMesg, map_to_norm_bin(Key), Padding, true) of - error -> - erlang:error(encrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - -%% Binary, Key = [E,N] -rsa_public_decrypt(BinMesg, Key, Padding) -> - case rsa_public_crypt(BinMesg, map_to_norm_bin(Key), Padding, false) of - error -> - erlang:error(decrypt_failed, [BinMesg,Key, Padding]); - Sign -> Sign - end. - %% %% AES - with 128 or 256 bit key in cipher block chaining mode (CBC) %% @@ -1298,6 +1254,33 @@ aes_cbc_ivec(Data) when is_binary(Data) -> aes_cbc_ivec(Data) when is_list(Data) -> aes_cbc_ivec(list_to_binary(Data)). + +%% Stream ciphers -------------------------------------------------------------------- + +stream_crypt(Fun, State, Data, Size, MaxByts, []) when Size =< MaxByts -> + Fun(State, Data); +stream_crypt(Fun, State0, Data, Size, MaxByts, Acc) when Size =< MaxByts -> + {State, Cipher} = Fun(State0, Data), + {State, list_to_binary(lists:reverse([Cipher | Acc]))}; +stream_crypt(Fun, State0, Data, _, MaxByts, Acc) -> + <<Increment:MaxByts/binary, Rest/binary>> = Data, + {State, CipherText} = Fun(State0, Increment), + stream_crypt(Fun, State, Rest, erlang:byte_size(Rest), MaxByts, [CipherText | Acc]). + +do_stream_encrypt({aes_ctr, State0}, Data) -> + {State, Cipher} = aes_ctr_stream_encrypt(State0, Data), + {{aes_ctr, State}, Cipher}; +do_stream_encrypt({rc4, State0}, Data) -> + {State, Cipher} = rc4_encrypt_with_state(State0, Data), + {{rc4, State}, Cipher}. + +do_stream_decrypt({aes_ctr, State0}, Data) -> + {State, Text} = aes_ctr_stream_decrypt(State0, Data), + {{aes_ctr, State}, Text}; +do_stream_decrypt({rc4, State0}, Data) -> + {State, Text} = rc4_encrypt_with_state(State0, Data), + {{rc4, State}, Text}. + %% %% AES - in counter mode (CTR) %% @@ -1305,7 +1288,7 @@ aes_cbc_ivec(Data) when is_list(Data) -> binary(). -spec aes_ctr_decrypt(iodata(), binary(), iodata()) -> binary(). - + aes_ctr_encrypt(_Key, _IVec, _Data) -> ?nif_stub. aes_ctr_decrypt(_Key, _IVec, _Cipher) -> ?nif_stub. @@ -1326,15 +1309,6 @@ aes_ctr_stream_encrypt({_Key, _IVec, _ECount, _Num}=_State, _Data) -> ?nif_stub. aes_ctr_stream_decrypt({_Key, _IVec, _ECount, _Num}=_State, _Cipher) -> ?nif_stub. %% -%% XOR - xor to iolists and return a binary -%% NB doesn't check that they are the same size, just concatenates -%% them and sends them to the driver -%% --spec exor(iodata(), iodata()) -> binary(). - -exor(_A, _B) -> ?nif_stub. - -%% %% RC4 - symmetric stream cipher %% -spec rc4_encrypt(iodata(), iodata()) -> binary(). @@ -1363,7 +1337,76 @@ rc2_40_cbc_encrypt(Key, IVec, Data) when erlang:byte_size(Key) == 5 -> rc2_40_cbc_decrypt(Key, IVec, Data) when erlang:byte_size(Key) == 5 -> rc2_cbc_crypt(Key,IVec,Data,false). -%% + +%% Secure remote password ------------------------------------------------------------------- + +user_srp_gen_key(Private, Generator, Prime) -> + case mod_pow(Generator, Private, Prime) of + error -> + error; + Public -> + {Public, Private} + end. + +host_srp_gen_key(Private, Verifier, Generator, Prime, Version) -> + Multiplier = srp_multiplier(Version, Generator, Prime), + case srp_value_B_nif(Multiplier, Verifier, Generator, Private, Prime) of + error -> + error; + Public -> + {Public, Private} + end. + +srp_multiplier('6a', Generator, Prime) -> + %% k = SHA1(N | PAD(g)) from http://srp.stanford.edu/design.html + C0 = sha_init(), + C1 = sha_update(C0, Prime), + C2 = sha_update(C1, srp_pad_to(erlang:byte_size(Prime), Generator)), + sha_final(C2); +srp_multiplier('6', _, _) -> + <<3/integer>>; +srp_multiplier('3', _, _) -> + <<1/integer>>. + +srp_scrambler(Version, UserPublic, HostPublic, Prime) when Version == '6'; Version == '6a'-> + %% SHA1(PAD(A) | PAD(B)) from http://srp.stanford.edu/design.html + PadLength = erlang:byte_size(Prime), + C0 = sha_init(), + C1 = sha_update(C0, srp_pad_to(PadLength, UserPublic)), + C2 = sha_update(C1, srp_pad_to(PadLength, HostPublic)), + sha_final(C2); +srp_scrambler('3', _, HostPublic, _Prime) -> + %% The parameter u is a 32-bit unsigned integer which takes its value + %% from the first 32 bits of the SHA1 hash of B, MSB first. + <<U:32/bits, _/binary>> = sha(HostPublic), + U. + +srp_pad_length(Width, Length) -> + (Width - Length rem Width) rem Width. + +srp_pad_to(Width, Binary) -> + case srp_pad_length(Width, size(Binary)) of + 0 -> Binary; + N -> << 0:(N*8), Binary/binary>> + end. + +srp_host_secret_nif(_Verifier, _B, _U, _A, _Prime) -> ?nif_stub. + +srp_user_secret_nif(_A, _U, _B, _Multiplier, _Generator, _Exponent, _Prime) -> ?nif_stub. + +srp_value_B_nif(_Multiplier, _Verifier, _Generator, _Exponent, _Prime) -> ?nif_stub. + + +%% Digital signatures -------------------------------------------------------------------- +rsa_sign_nif(_Type,_Data,_Key) -> ?nif_stub. +dss_sign_nif(_Type,_Data,_Key) -> ?nif_stub. +ecdsa_sign_nif(_Type, _DataOrDigest, _Curve, _Key) -> ?nif_stub. + +dss_verify_nif(_Type, _Data, _Signature, _Key) -> ?nif_stub. +rsa_verify_nif(_Type, _Data, _Signature, _Key) -> ?nif_stub. +ecdsa_verify_nif(_Type, _DataOrDigest, _Signature, _Curve, _Key) -> ?nif_stub. + +%% Public Keys -------------------------------------------------------------------- %% DH Diffie-Hellman functions %% @@ -1412,84 +1455,13 @@ dh_compute_key(OthersPublicKey, MyPrivateKey, DHParameters) -> dh_compute_key_nif(_OthersPublicKey, _MyPrivateKey, _DHParameters) -> ?nif_stub. -generate_key(Type, Params) -> - generate_key(Type, Params, undefined). - -generate_key(dh, DHParameters, PrivateKey) -> - dh_generate_key_nif(ensure_int_as_bin(PrivateKey), - map_ensure_int_as_bin(DHParameters), 0); - -generate_key(srp, {host, [Verifier, Generator, Prime, Version]}, PrivArg) - when is_binary(Verifier), is_binary(Generator), is_binary(Prime), is_atom(Version) -> - Private = case PrivArg of - undefined -> random_bytes(32); - _ -> ensure_int_as_bin(PrivArg) - end, - host_srp_gen_key(Private, Verifier, Generator, Prime, Version); - -generate_key(srp, {user, [Generator, Prime, Version]}, PrivateArg) - when is_binary(Generator), is_binary(Prime), is_atom(Version) -> - Private = case PrivateArg of - undefined -> random_bytes(32); - _ -> PrivateArg - end, - user_srp_gen_key(Private, Generator, Prime); - -generate_key(ecdh, Curve, undefined) -> - ec_key_to_term_nif(ec_key_generate(Curve)). - - ec_key_generate(_Key) -> ?nif_stub. - -compute_key(dh, OthersPublicKey, MyPrivateKey, DHParameters) -> - case dh_compute_key_nif(ensure_int_as_bin(OthersPublicKey), - ensure_int_as_bin(MyPrivateKey), - map_ensure_int_as_bin(DHParameters)) of - error -> erlang:error(computation_failed, - [OthersPublicKey,MyPrivateKey,DHParameters]); - Ret -> Ret - end; - -compute_key(srp, HostPublic, {UserPublic, UserPrivate}, - {user, [DerivedKey, Prime, Generator, Version | ScramblerArg]}) when - is_binary(Prime), - is_binary(Generator), - is_atom(Version) -> - HostPubBin = ensure_int_as_bin(HostPublic), - Multiplier = srp_multiplier(Version, Generator, Prime), - Scrambler = case ScramblerArg of - [] -> srp_scrambler(Version, ensure_int_as_bin(UserPublic), - HostPubBin, Prime); - [S] -> S - end, - srp_user_secret_nif(ensure_int_as_bin(UserPrivate), Scrambler, HostPubBin, - Multiplier, Generator, DerivedKey, Prime); - -compute_key(srp, UserPublic, {HostPublic, HostPrivate}, - {host,[Verifier, Prime, Version | ScramblerArg]}) when - is_binary(Verifier), - is_binary(Prime), - is_atom(Version) -> - UserPubBin = ensure_int_as_bin(UserPublic), - Scrambler = case ScramblerArg of - [] -> srp_scrambler(Version, UserPubBin, ensure_int_as_bin(HostPublic), Prime); - [S] -> S - end, - srp_host_secret_nif(Verifier, ensure_int_as_bin(HostPrivate), Scrambler, - UserPubBin, Prime); - -compute_key(ecdh, Others, My, Curve) -> - ecdh_compute_key_nif(ensure_int_as_bin(Others), - term_to_ec_key(Curve,My,undefined)). - -ecdh_compute_key_nif(_Others, _My) -> ?nif_stub. - +ecdh_compute_key_nif(_Others, _Curve, _My) -> ?nif_stub. %% %% EC %% -ec_key_to_term_nif(_Key) -> ?nif_stub. term_to_nif_prime({prime_field, Prime}) -> {prime_field, int_to_bin(Prime)}; @@ -1497,79 +1469,188 @@ term_to_nif_prime(PrimeField) -> PrimeField. term_to_nif_curve({A, B, Seed}) -> {ensure_int_as_bin(A), ensure_int_as_bin(B), Seed}. -term_to_nif_curve_parameters({PrimeField, Curve, BasePoint, Order, CoFactor}) -> +nif_curve_params({PrimeField, Curve, BasePoint, Order, CoFactor}) -> {term_to_nif_prime(PrimeField), term_to_nif_curve(Curve), ensure_int_as_bin(BasePoint), int_to_bin(Order), int_to_bin(CoFactor)}; -term_to_nif_curve_parameters(Curve) when is_atom(Curve) -> +nif_curve_params(Curve) when is_atom(Curve) -> %% named curve Curve. -term_to_ec_key(Curve, PrivKey, PubKey) -> - term_to_ec_key_nif(term_to_nif_curve_parameters(Curve), - ensure_int_as_bin(PrivKey), - ensure_int_as_bin(PubKey)). -term_to_ec_key_nif(_Curve, _PrivKey, _PubKey) -> ?nif_stub. +%% MISC -------------------------------------------------------------------- + +exor(Data1, Data2, Size, MaxByts, []) when Size =< MaxByts -> + do_exor(Data1, Data2); +exor(Data1, Data2, Size, MaxByts, Acc) when Size =< MaxByts -> + Result = do_exor(Data1, Data2), + list_to_binary(lists:reverse([Result | Acc])); +exor(Data1, Data2, _Size, MaxByts, Acc) -> + <<Increment1:MaxByts/binary, Rest1/binary>> = Data1, + <<Increment2:MaxByts/binary, Rest2/binary>> = Data2, + Result = do_exor(Increment1, Increment2), + exor(Rest1, Rest2, erlang:byte_size(Rest1), MaxByts, [Result | Acc]). +do_exor(_A, _B) -> ?nif_stub. +algorithms() -> ?nif_stub. + +int_to_bin(X) when X < 0 -> int_to_bin_neg(X, []); +int_to_bin(X) -> int_to_bin_pos(X, []). + +int_to_bin_pos(0,Ds=[_|_]) -> + list_to_binary(Ds); +int_to_bin_pos(X,Ds) -> + int_to_bin_pos(X bsr 8, [(X band 255)|Ds]). + +int_to_bin_neg(-1, Ds=[MSB|_]) when MSB >= 16#80 -> + list_to_binary(Ds); +int_to_bin_neg(X,Ds) -> + int_to_bin_neg(X bsr 8, [(X band 255)|Ds]). + +bytes_to_integer(Bin) -> + bin_to_int(Bin). + +bin_to_int(Bin) when is_binary(Bin) -> + Bits = bit_size(Bin), + <<Integer:Bits/integer>> = Bin, + Integer; +bin_to_int(undefined) -> + undefined. -%% LOCAL FUNCTIONS +map_ensure_int_as_bin([H|_]=List) when is_integer(H) -> + lists:map(fun(E) -> int_to_bin(E) end, List); +map_ensure_int_as_bin(List) -> + List. + +ensure_int_as_bin(Int) when is_integer(Int) -> + int_to_bin(Int); +ensure_int_as_bin(Bin) -> + Bin. + +map_to_norm_bin([H|_]=List) when is_integer(H) -> + lists:map(fun(E) -> int_to_bin(E) end, List); +map_to_norm_bin(List) -> + lists:map(fun(E) -> mpint_to_bin(E) end, List). + +%%-------------------------------------------------------------------- +%%% Deprecated +%%-------------------------------------------------------------------- %% +%% rsa_public_encrypt +%% rsa_private_decrypt +-type rsa_padding() :: 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding' | 'rsa_no_padding'. -user_srp_gen_key(Private, Generator, Prime) -> - case mod_pow(Generator, Private, Prime) of +-spec rsa_public_encrypt(binary(), [binary()], rsa_padding()) -> + binary(). +-spec rsa_public_decrypt(binary(), [integer() | mpint()], rsa_padding()) -> + binary(). +-spec rsa_private_encrypt(binary(), [integer() | mpint()], rsa_padding()) -> + binary(). +-spec rsa_private_decrypt(binary(), [integer() | mpint()], rsa_padding()) -> + binary(). + +%% Binary, Key = [E,N] +rsa_public_encrypt(BinMesg, Key, Padding) -> + case rsa_public_crypt(BinMesg, map_to_norm_bin(Key), Padding, true) of error -> - error; - Public -> - {Public, Private} + erlang:error(encrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign end. -host_srp_gen_key(Private, Verifier, Generator, Prime, Version) -> - Multiplier = srp_multiplier(Version, Generator, Prime), - case srp_value_B_nif(Multiplier, Verifier, Generator, Private, Prime) of - error -> - error; - Public -> - {Public, Private} - end. +rsa_public_crypt(_BinMsg, _Key, _Padding, _IsEncrypt) -> ?nif_stub. -srp_multiplier('6a', Generator, Prime) -> - %% k = SHA1(N | PAD(g)) from http://srp.stanford.edu/design.html - C0 = sha_init(), - C1 = sha_update(C0, Prime), - C2 = sha_update(C1, srp_pad_to(erlang:byte_size(Prime), Generator)), - sha_final(C2); -srp_multiplier('6', _, _) -> - <<3/integer>>; -srp_multiplier('3', _, _) -> - <<1/integer>>. +%% Binary, Key = [E,N,D] +rsa_private_decrypt(BinMesg, Key, Padding) -> + case rsa_private_crypt(BinMesg, map_to_norm_bin(Key), Padding, false) of + error -> + erlang:error(decrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign + end. -srp_scrambler(Version, UserPublic, HostPublic, Prime) when Version == '6'; Version == '6a'-> - %% SHA1(PAD(A) | PAD(B)) from http://srp.stanford.edu/design.html - PadLength = erlang:byte_size(Prime), - C0 = sha_init(), - C1 = sha_update(C0, srp_pad_to(PadLength, UserPublic)), - C2 = sha_update(C1, srp_pad_to(PadLength, HostPublic)), - sha_final(C2); -srp_scrambler('3', _, HostPublic, _Prime) -> - %% The parameter u is a 32-bit unsigned integer which takes its value - %% from the first 32 bits of the SHA1 hash of B, MSB first. - <<U:32/bits, _/binary>> = sha(HostPublic), - U. +rsa_private_crypt(_BinMsg, _Key, _Padding, _IsEncrypt) -> ?nif_stub. -srp_pad_length(Width, Length) -> - (Width - Length rem Width) rem Width. -srp_pad_to(Width, Binary) -> - case srp_pad_length(Width, size(Binary)) of - 0 -> Binary; - N -> << 0:(N*8), Binary/binary>> +%% Binary, Key = [E,N,D] +rsa_private_encrypt(BinMesg, Key, Padding) -> + case rsa_private_crypt(BinMesg, map_to_norm_bin(Key), Padding, true) of + error -> + erlang:error(encrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign end. -srp_host_secret_nif(_Verifier, _B, _U, _A, _Prime) -> ?nif_stub. +%% Binary, Key = [E,N] +rsa_public_decrypt(BinMesg, Key, Padding) -> + case rsa_public_crypt(BinMesg, map_to_norm_bin(Key), Padding, false) of + error -> + erlang:error(decrypt_failed, [BinMesg,Key, Padding]); + Sign -> Sign + end. -srp_user_secret_nif(_A, _U, _B, _Multiplier, _Generator, _Exponent, _Prime) -> ?nif_stub. +map_mpint_to_bin(List) -> + lists:map(fun(E) -> mpint_to_bin(E) end, List ). + +%% +%% DSS, RSA - sign +%% +%% Key = [P,Q,G,X] P,Q,G=DSSParams X=PrivateKey +-spec dss_sign(data_or_digest(), [binary()]) -> binary(). +-spec dss_sign(dss_digest_type(), data_or_digest(), [binary()]) -> binary(). +-spec rsa_sign(data_or_digest(), [binary()]) -> binary(). +-spec rsa_sign(rsa_digest_type(), data_or_digest(), [binary()]) -> binary(). + +dss_sign(DataOrDigest,Key) -> + dss_sign(sha,DataOrDigest,Key). +dss_sign(Type, Data, Key) when is_binary(Data), Type=/=none -> + sign(dss, Type, mpint_to_bin(Data), map_mpint_to_bin(Key)); +dss_sign(Type, Digest, Key) -> + sign(dss, Type, Digest, map_mpint_to_bin(Key)). + + +%% Key = [E,N,D] E=PublicExponent N=PublicModulus D=PrivateExponent +rsa_sign(DataOrDigest,Key) -> + rsa_sign(sha, DataOrDigest, Key). + +rsa_sign(Type, Data, Key) when is_binary(Data) -> + sign(rsa, Type, mpint_to_bin(Data), map_mpint_to_bin(Key)); +rsa_sign(Type, Digest, Key) -> + sign(rsa, Type, Digest, map_mpint_to_bin(Key)). + +%% +%% DSS, RSA - verify +%% +-spec dss_verify(data_or_digest(), binary(), [binary()]) -> boolean(). +-spec dss_verify(dss_digest_type(), data_or_digest(), binary(), [binary()]) -> boolean(). +-spec rsa_verify(data_or_digest(), binary(), [binary()]) -> boolean(). +-spec rsa_verify(rsa_digest_type(), data_or_digest(), binary(), [binary()]) -> + boolean(). + +%% Key = [P,Q,G,Y] P,Q,G=DSSParams Y=PublicKey +dss_verify(Data,Signature,Key) -> + dss_verify(sha, Data, Signature, Key). + +dss_verify(Type,Data,Signature,Key) when is_binary(Data), Type=/=none -> + verify(dss,Type,mpint_to_bin(Data),mpint_to_bin(Signature),map_mpint_to_bin(Key)); +dss_verify(Type,Digest,Signature,Key) -> + verify(dss,Type,Digest,mpint_to_bin(Signature),map_mpint_to_bin(Key)). + +% Key = [E,N] E=PublicExponent N=PublicModulus +rsa_verify(Data,Signature,Key) -> + rsa_verify(sha, Data,Signature,Key). +rsa_verify(Type, Data, Signature, Key) when is_binary(Data) -> + verify(rsa, Type, mpint_to_bin(Data), mpint_to_bin(Signature), map_mpint_to_bin(Key)); +rsa_verify(Type, Digest, Signature, Key) -> + verify(rsa, Type, Digest, mpint_to_bin(Signature), map_mpint_to_bin(Key)). + +-spec strong_rand_mpint(Bits::non_neg_integer(), + Top::-1..1, + Bottom::0..1) -> binary(). + +strong_rand_mpint(Bits, Top, Bottom) -> + case strong_rand_mpint_nif(Bits,Top,Bottom) of + false -> erlang:error(low_entropy); + Bin -> Bin + end. +strong_rand_mpint_nif(_Bits, _Top, _Bottom) -> ?nif_stub. -srp_value_B_nif(_Multiplier, _Verifier, _Generator, _Exponent, _Prime) -> ?nif_stub. %% large integer in a binary with 32bit length %% MP representaion (SSH2) @@ -1594,32 +1675,6 @@ mpint_pos(X) -> <<?UINT32(Sz), Bin/binary>> end. -int_to_bin(X) when X < 0 -> int_to_bin_neg(X, []); -int_to_bin(X) -> int_to_bin_pos(X, []). - -%%int_to_bin_pos(X) when X >= 0 -> -%% int_to_bin_pos(X, []). - -int_to_bin_pos(0,Ds=[_|_]) -> - list_to_binary(Ds); -int_to_bin_pos(X,Ds) -> - int_to_bin_pos(X bsr 8, [(X band 255)|Ds]). - -int_to_bin_neg(-1, Ds=[MSB|_]) when MSB >= 16#80 -> - list_to_binary(Ds); -int_to_bin_neg(X,Ds) -> - int_to_bin_neg(X bsr 8, [(X band 255)|Ds]). - -bytes_to_integer(Bin) -> - bin_to_int(Bin). - -bin_to_int(Bin) when is_binary(Bin) -> - Bits = bit_size(Bin), - <<Integer:Bits/integer>> = Bin, - Integer; -bin_to_int(undefined) -> - undefined. - %% int from integer in a binary with 32bit length erlint(<<MPIntSize:32/integer,MPIntValue/binary>>) -> Bits= MPIntSize * 8, @@ -1629,11 +1684,71 @@ erlint(<<MPIntSize:32/integer,MPIntValue/binary>>) -> mpint_to_bin(<<Len:32, Bin:Len/binary>>) -> Bin. -random_bytes(N) -> - try strong_rand_bytes(N) of - RandBytes -> - RandBytes - catch - error:low_entropy -> - rand_bytes(N) - end. +%% +%% mod_exp - utility for rsa generation and SRP +%% +mod_exp(Base, Exponent, Modulo) + when is_integer(Base), is_integer(Exponent), is_integer(Modulo) -> + bin_to_int(mod_exp_nif(int_to_bin(Base), int_to_bin(Exponent), int_to_bin(Modulo), 0)); + +mod_exp(Base, Exponent, Modulo) -> + mod_exp_nif(mpint_to_bin(Base),mpint_to_bin(Exponent),mpint_to_bin(Modulo), 4). + +mod_exp_nif(_Base,_Exp,_Mod,_bin_hdr) -> ?nif_stub. + +-define(FUNC_LIST, [hash, hash_init, hash_update, hash_final, + hmac, hmac_init, hmac_update, hmac_final, hmac_final_n, + %% deprecated + md4, md4_init, md4_update, md4_final, + md5, md5_init, md5_update, md5_final, + sha, sha_init, sha_update, sha_final, + md5_mac, md5_mac_96, + sha_mac, sha_mac_96, + %% + block_encrypt, block_decrypt, + %% deprecated + des_cbc_encrypt, des_cbc_decrypt, + des_cfb_encrypt, des_cfb_decrypt, + des_ecb_encrypt, des_ecb_decrypt, + des3_cbc_encrypt, des3_cbc_decrypt, + des3_cfb_encrypt, des3_cfb_decrypt, + aes_cfb_128_encrypt, aes_cfb_128_decrypt, + rc2_cbc_encrypt, rc2_cbc_decrypt, + rc2_40_cbc_encrypt, rc2_40_cbc_decrypt, + aes_cbc_128_encrypt, aes_cbc_128_decrypt, + aes_cbc_256_encrypt, aes_cbc_256_decrypt, + blowfish_cbc_encrypt, blowfish_cbc_decrypt, + blowfish_cfb64_encrypt, blowfish_cfb64_decrypt, + blowfish_ecb_encrypt, blowfish_ecb_decrypt, blowfish_ofb64_encrypt, + %% + rand_bytes, + strong_rand_bytes, + rand_uniform, + mod_pow, + exor, + %% deprecated + mod_exp,strong_rand_mpint,erlint, mpint, + %% + sign, verify, generate_key, compute_key, + %% deprecated + dss_verify,dss_sign, + rsa_verify,rsa_sign, + rsa_public_encrypt,rsa_private_decrypt, + rsa_private_encrypt,rsa_public_decrypt, + dh_generate_key, dh_compute_key, + %% + stream_init, stream_encrypt, stream_decrypt, + %% deprecated + rc4_encrypt, rc4_set_key, rc4_encrypt_with_state, + aes_ctr_encrypt, aes_ctr_decrypt, + aes_ctr_stream_init, aes_ctr_stream_encrypt, aes_ctr_stream_decrypt, + %% + next_iv, + %% deprecated + aes_cbc_ivec, + des_cbc_ivec, des_cfb_ivec, + info, + %% + info_lib, supports]). +info() -> + ?FUNC_LIST. diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl index b3bb5dbd17..58aaa78d28 100644 --- a/lib/crypto/test/crypto_SUITE.erl +++ b/lib/crypto/test/crypto_SUITE.erl @@ -212,16 +212,8 @@ mod_pow(Config) when is_list(Config) -> exor() -> [{doc, "Test the exor function"}]. exor(Config) when is_list(Config) -> - B = <<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>>, - Z1 = zero_bin(B), - Z1 = crypto:exor(B, B), - B1 = crypto:rand_bytes(100), - B2 = crypto:rand_bytes(100), - Z2 = zero_bin(B1), - Z2 = crypto:exor(B1, B1), - Z2 = crypto:exor(B2, B2), - R = xor_bytes(B1, B2), - R = crypto:exor(B1, B2). + do_exor(<<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>>), + do_exor(term_to_binary(lists:seq(1, 1000000))). %%-------------------------------------------------------------------- rand_uniform() -> [{doc, "rand_uniform and random_bytes testing"}]. @@ -229,10 +221,10 @@ rand_uniform(Config) when is_list(Config) -> rand_uniform_aux_test(10), 10 = byte_size(crypto:rand_bytes(10)), 10 = byte_size(crypto:strong_rand_bytes(10)). + %%-------------------------------------------------------------------- %% Internal functions ------------------------------------------------ %%-------------------------------------------------------------------- - hash(_, [], []) -> ok; hash(Type, [Msg | RestMsg], [Digest| RestDigest]) -> @@ -491,7 +483,7 @@ do_block_iolistify({Type, Key, IV, PlainText}) -> iolistify(<<"Test With Truncation">>)-> %% Do not iolistify as it spoils this special case <<"Test With Truncation">>; -iolistify(Msg)-> +iolistify(Msg) when is_binary(Msg) -> Length = erlang:byte_size(Msg), Split = Length div 2, List0 = binary_to_list(Msg), @@ -500,7 +492,9 @@ iolistify(Msg)-> [[Element], List1, List2]; {List1, List2}-> [List1, List2] - end. + end; +iolistify(Msg) -> + iolistify(list_to_binary(Msg)). des_iolistify(Msg) -> des_iolist(erlang:byte_size(Msg) div 8, Msg, []). @@ -540,6 +534,17 @@ ipow(A, B, M, Prod) -> ipow(A1, B1, M, (A*Prod) rem M) end. +do_exor(B) -> + Z1 = zero_bin(B), + Z1 = crypto:exor(B, B), + B1 = crypto:rand_bytes(100), + B2 = crypto:rand_bytes(100), + Z2 = zero_bin(B1), + Z2 = crypto:exor(B1, B1), + Z2 = crypto:exor(B2, B2), + R = xor_bytes(B1, B2), + R = crypto:exor(B1, B2). + zero_bin(N) when is_integer(N) -> N8 = N * 8, <<0:N8/integer>>; @@ -586,20 +591,20 @@ group_config(md4 = Type, Config) -> group_config(md5 = Type, Config) -> Msgs = rfc_1321_msgs(), Digests = rfc_1321_md5_digests(), - Keys = rfc_2202_md5_keys(), - Data = rfc_2202_msgs(), - Hmac = rfc_2202_hmac_md5(), + Keys = rfc_2202_md5_keys() ++ [long_hmac_key(md5)], + Data = rfc_2202_msgs() ++ [long_msg()], + Hmac = rfc_2202_hmac_md5() ++ [long_hmac(md5)], [{hash, {Type, Msgs, Digests}}, {hmac, {Type, Keys, Data, Hmac}} | Config]; group_config(ripemd160 = Type, Config) -> Msgs = ripemd160_msgs(), Digests = ripemd160_digests(), [{hash, {Type, Msgs, Digests}} | Config]; group_config(sha = Type, Config) -> - Msgs = [rfc_4634_test1(), rfc_4634_test2_1()], - Digests = rfc_4634_sha_digests(), - Keys = rfc_2202_sha_keys(), - Data = rfc_2202_msgs(), - Hmac = rfc_2202_hmac_sha(), + Msgs = [rfc_4634_test1(), rfc_4634_test2_1(),long_msg()], + Digests = rfc_4634_sha_digests() ++ [long_sha_digest()], + Keys = rfc_2202_sha_keys() ++ [long_hmac_key(sha)], + Data = rfc_2202_msgs() ++ [long_msg()], + Hmac = rfc_2202_hmac_sha() ++ [long_hmac(sha)], [{hash, {Type, Msgs, Digests}}, {hmac, {Type, Keys, Data, Hmac}} | Config]; group_config(sha224 = Type, Config) -> Msgs = [rfc_4634_test1(), rfc_4634_test2_1()], @@ -609,25 +614,25 @@ group_config(sha224 = Type, Config) -> Hmac = rfc4231_hmac_sha224(), [{hash, {Type, Msgs, Digests}}, {hmac, {Type, Keys, Data, Hmac}} | Config]; group_config(sha256 = Type, Config) -> - Msgs = [rfc_4634_test1(), rfc_4634_test2_1()], - Digests = rfc_4634_sha256_digests(), - Keys = rfc_4231_keys(), - Data = rfc_4231_msgs(), - Hmac = rfc4231_hmac_sha256(), + Msgs = [rfc_4634_test1(), rfc_4634_test2_1(), long_msg()], + Digests = rfc_4634_sha256_digests() ++ [long_sha256_digest()], + Keys = rfc_4231_keys() ++ [long_hmac_key(sha256)], + Data = rfc_4231_msgs() ++ [long_msg()], + Hmac = rfc4231_hmac_sha256() ++ [long_hmac(sha256)], [{hash, {Type, Msgs, Digests}}, {hmac, {Type, Keys, Data, Hmac}} | Config]; group_config(sha384 = Type, Config) -> - Msgs = [rfc_4634_test1(), rfc_4634_test2()], - Digests = rfc_4634_sha384_digests(), - Keys = rfc_4231_keys(), - Data = rfc_4231_msgs(), - Hmac = rfc4231_hmac_sha384(), + Msgs = [rfc_4634_test1(), rfc_4634_test2(), long_msg()], + Digests = rfc_4634_sha384_digests() ++ [long_sha384_digest()], + Keys = rfc_4231_keys() ++ [long_hmac_key(sha384)], + Data = rfc_4231_msgs() ++ [long_msg()], + Hmac = rfc4231_hmac_sha384() ++ [long_hmac(sha384)], [{hash, {Type, Msgs, Digests}}, {hmac, {Type, Keys, Data, Hmac}} | Config]; group_config(sha512 = Type, Config) -> - Msgs = [rfc_4634_test1(), rfc_4634_test2()], - Digests = rfc_4634_sha512_digests(), - Keys = rfc_4231_keys(), - Data = rfc_4231_msgs(), - Hmac = rfc4231_hmac_sha512(), + Msgs = [rfc_4634_test1(), rfc_4634_test2(), long_msg()], + Digests = rfc_4634_sha512_digests() ++ [long_sha512_digest()], + Keys = rfc_4231_keys() ++ [long_hmac_key(sha512)], + Data = rfc_4231_msgs() ++ [long_msg()], + Hmac = rfc4231_hmac_sha512() ++ [long_hmac(sha512)], [{hash, {Type, Msgs, Digests}}, {hmac, {Type, Keys, Data, Hmac}} | Config]; group_config(rsa = Type, Config) -> Msg = rsa_plain(), @@ -789,6 +794,23 @@ rfc_4634_sha512_digests() -> "454D4423643CE80E2A9AC94FA54CA49F"), hexstr2bin("8E959B75DAE313DA8CF4F72814FC143F8F7779C6EB9F7FA17299AEADB6889018501D289E4900F7E4331B99DEC4B5433AC7D329EEB6DD26545E96E55B874BE909")]. +long_msg() -> + lists:duplicate(1000000, $a). + +long_sha_digest() -> + hexstr2bin("34aa973c" "d4c4daa4" "f61eeb2b" "dbad2731" "6534016f"). + +long_sha256_digest() -> + hexstr2bin("cdc76e5c" "9914fb92" "81a1c7e2" "84d73e67" "f1809a48" "a497200e" "046d39cc" "c7112cd0"). + +long_sha384_digest() -> + hexstr2bin("9d0e1809716474cb" "086e834e310a4a1c" "ed149e9c00f24852" "7972cec5704c2a5b" + "07b8b3dc38ecc4eb" "ae97ddd87f3d8985"). + +long_sha512_digest() -> + hexstr2bin("e718483d0ce76964" "4e2e42c7bc15b463" "8e1f98b13b204428" "5632a803afa973eb" + "de0ff244877ea60a" "4cb0432ce577c31b" "eb009c5c2c49aa2e" "4eadb217ad8cc09b"). + ripemd160_msgs() -> [<<"">>, <<"a">>, @@ -852,6 +874,35 @@ hmac_key(_) -> hmac_inc(_) -> [<<"Sampl">>, <<"e #1">>]. +%% https://www.cosic.esat.kuleuven.be/nessie/testvectors/ +long_hmac_key(Type) when Type == sha384; + Type == sha512 -> + hexstr2bin("00112233445566778899AABBCCDDEEFF" + "0123456789ABCDEF0011223344556677" + "8899AABBCCDDEEFF0123456789ABCDEF" + "00112233445566778899AABBCCDDEEFF"); +long_hmac_key(_) -> + hexstr2bin("0123456789ABCDEF0123456789ABCDEF" + "0123456789ABCDEF0123456789ABCDEF" + "0123456789ABCDEF0123456789ABCDEF" + "0123456789ABCDEF0123456789ABCDEF"). +long_hmac(md5) -> + hexstr2bin("82FDDA30202CB6ACC6F24D4F8A50EB7A"); +long_hmac(sha) -> + hexstr2bin("61D1D0B6459860755FDA892938C23DD401E54A7E"); +long_hmac(sha256) -> + hexstr2bin("50008B8DC7ED3926936347FDC1A01E9D" + "5220C6CC4B038B482C0F28A4CD88CA37"); +long_hmac(sha384) -> + hexstr2bin("C1EB08DAFA015833D3FC6B29A387558B" + "3F6FA1524AA1A8EB64798D5A76A39D6E" + "A1465525342E060EE996277B4FFCDDC9"); +long_hmac(sha512) -> + hexstr2bin("D116BF471AAE1264854F1906025E846A" + "61618A965FCA30B695220EA2D6E547E3" + "F3B5A4B54E6778928C26D5D3D810498E" + "8DF86CB3CC1E9F66A00419B13B6B0C9A"). + rfc_2202_hmac_md5() -> [ hexstr2bin("9294727a3638bb1c13f48ef8158bfc9d"), @@ -1193,7 +1244,8 @@ blowfish_ofb64() -> rc4() -> [{rc4, <<"apaapa">>, <<"Yo baby yo">>}, - {rc4, <<"apaapa">>, list_to_binary(lists:seq(0, 255))} + {rc4, <<"apaapa">>, list_to_binary(lists:seq(0, 255))}, + {rc4, <<"apaapa">>, lists:duplicate(1000000, $a)} ]. aes_ctr() -> @@ -1237,7 +1289,11 @@ aes_ctr() -> hexstr2bin("30c81c46a35ce411e5fbc1191a0a52ef")}, {aes_ctr, hexstr2bin("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"), hexstr2bin("f0f1f2f3f4f5f6f7f8f9fafbfcfdff02"), - hexstr2bin("f69f2445df4f9b17ad2b417be66c3710")} + hexstr2bin("f69f2445df4f9b17ad2b417be66c3710")}, + + {aes_ctr, hexstr2bin("603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4"), + hexstr2bin("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"), + lists:duplicate(1000000, $a)} ]. rsa_plain() -> diff --git a/lib/crypto/vsn.mk b/lib/crypto/vsn.mk index 2a0cb57aa9..d5d7c8a128 100644 --- a/lib/crypto/vsn.mk +++ b/lib/crypto/vsn.mk @@ -1 +1 @@ -CRYPTO_VSN = 2.3 +CRYPTO_VSN = 3.0 diff --git a/lib/debugger/doc/src/notes.xml b/lib/debugger/doc/src/notes.xml index d5eef5d6a2..aef7ef8619 100644 --- a/lib/debugger/doc/src/notes.xml +++ b/lib/debugger/doc/src/notes.xml @@ -32,6 +32,32 @@ <p>This document describes the changes made to the Debugger application.</p> +<section><title>Debugger 3.2.11</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> A new checkbox has been added. When it is checked, + the range set by the <c>erl</c> flag <c>+pc</c> is used + for determining when to print lists of integers as + strings. When it is unchecked, integer lists are never + printed as strings. </p> <p>A minor incompatibility: + settings saved by Erlang R16B01 or later cannot be read + by Erlang R16B or earlier.</p> + <p> + Own Id: OTP-10899</p> + </item> + <item> + <p>Erlang source files with non-ASCII characters are now + encoded in UTF-8 (instead of latin1).</p> + <p> + Own Id: OTP-11041 Aux Id: OTP-10907 </p> + </item> + </list> + </section> + +</section> + <section><title>Debugger 3.2.10</title> <section><title>Improvements and New Features</title> diff --git a/lib/debugger/src/dbg_istk.erl b/lib/debugger/src/dbg_istk.erl index ced42a5f9f..d8f83eef3d 100644 --- a/lib/debugger/src/dbg_istk.erl +++ b/lib/debugger/src/dbg_istk.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2011. All Rights Reserved. +%% Copyright Ericsson AB 2011-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/debugger/test/bs_construct_SUITE.erl b/lib/debugger/test/bs_construct_SUITE.erl index e0bda7eac8..4870c87d74 100644 --- a/lib/debugger/test/bs_construct_SUITE.erl +++ b/lib/debugger/test/bs_construct_SUITE.erl @@ -454,6 +454,8 @@ in_guard(Config) when is_list(Config) -> ?line 1 = in_guard(<<16#74ad:16>>, 16#e95, 5), ?line 2 = in_guard(<<16#3A,16#F7,"hello">>, 16#3AF7, <<"hello">>), ?line 3 = in_guard(<<16#FBCD:14,3.1415/float,3:2>>, 16#FBCD, 3.1415), + ?line 3 = in_guard(<<16#FBCD:14,3/float,3:2>>, 16#FBCD, 3), + ?line 3 = in_guard(<<16#FBCD:14,(2 bsl 226)/float,3:2>>, 16#FBCD, 2 bsl 226), nope = in_guard(<<1>>, 42, b), nope = in_guard(<<1>>, a, b), nope = in_guard(<<1,2>>, 1, 1), diff --git a/lib/debugger/test/bs_match_misc_SUITE.erl b/lib/debugger/test/bs_match_misc_SUITE.erl index 6b66c45448..54fa9a59df 100644 --- a/lib/debugger/test/bs_match_misc_SUITE.erl +++ b/lib/debugger/test/bs_match_misc_SUITE.erl @@ -26,7 +26,7 @@ kenneth/1,encode_binary/1,native/1,happi/1, size_var/1,wiger/1,x0_context/1,huge_float_field/1, writable_binary_matched/1,otp_7198/1, - unordered_bindings/1]). + unordered_bindings/1,float_middle_endian/1]). -include_lib("test_server/include/test_server.hrl"). @@ -36,7 +36,7 @@ all() -> [bound_var, bound_tail, t_float, little_float, sean, kenneth, encode_binary, native, happi, size_var, wiger, x0_context, huge_float_field, writable_binary_matched, - otp_7198, unordered_bindings]. + otp_7198, unordered_bindings, float_middle_endian]. groups() -> []. @@ -106,6 +106,13 @@ t_float(Config) when is_list(Config) -> ok. +float_middle_endian(Config) when is_list(Config) -> + F = 9007199254740990.0, % turns to -NaN when word-swapped + ?line fcmp(F, match_float(<<F:64/float>>, 64, 0)), + ?line fcmp(F, match_float(<<1:1,F:64/float,127:7>>, 64, 1)), + ?line fcmp(F, match_float(<<1:13,F:64/float,127:3>>, 64, 13)), + ok. + fcmp(F1, F2) when (F1 - F2) / F2 < 0.0000001 -> ok. diff --git a/lib/debugger/vsn.mk b/lib/debugger/vsn.mk index 58d462f409..c3e3579e2c 100644 --- a/lib/debugger/vsn.mk +++ b/lib/debugger/vsn.mk @@ -1 +1 @@ -DEBUGGER_VSN = 3.2.10 +DEBUGGER_VSN = 3.2.11 diff --git a/lib/dialyzer/doc/src/notes.xml b/lib/dialyzer/doc/src/notes.xml index cd809662f2..70ebee678c 100644 --- a/lib/dialyzer/doc/src/notes.xml +++ b/lib/dialyzer/doc/src/notes.xml @@ -31,6 +31,77 @@ <p>This document describes the changes made to the Dialyzer application.</p> +<section><title>Dialyzer 2.6.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> A bug that made it impossible to do any analyses from + the GUI has been fixed. </p> + <p> + Own Id: OTP-11057 Aux Id: seq12313 </p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Include module, function and arity in Dialyzer's + "overlapping domain" warnings. Thanks to Magnus Henoch.</p> + <p> + Own Id: OTP-10918</p> + </item> + <item> + <p> + Improve Dialyzer output for scan errors. Thanks to Magnus + Henoch.</p> + <p> + Own Id: OTP-10996</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + <item> + <p> + Bitstring type inference and duplicate module error + message fixes. Thanks to Stavros Aronis.</p> + <p> + Own Id: OTP-11027</p> + </item> + <item> + <p>Erlang source files with non-ASCII characters are now + encoded in UTF-8 (instead of latin1).</p> + <p> + Own Id: OTP-11041 Aux Id: OTP-10907 </p> + </item> + </list> + </section> + +</section> + <section><title>Dialyzer 2.6</title> <section><title>Improvements and New Features</title> diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl index be4b9b6e12..822aa0826a 100644 --- a/lib/dialyzer/src/dialyzer.erl +++ b/lib/dialyzer/src/dialyzer.erl @@ -2,7 +2,7 @@ %%----------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2012. All Rights Reserved. +%% Copyright Ericsson AB 2006-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl index affb89385e..0fbaf1d47c 100644 --- a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl +++ b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl @@ -2,7 +2,7 @@ %%-------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2012. All Rights Reserved. +%% Copyright Ericsson AB 2006-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl index 410be8586e..332a326b0d 100644 --- a/lib/dialyzer/src/dialyzer_contracts.erl +++ b/lib/dialyzer/src/dialyzer_contracts.erl @@ -2,7 +2,7 @@ %%----------------------------------------------------------------------- %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2012. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/dialyzer/vsn.mk b/lib/dialyzer/vsn.mk index bdb8692f8a..af32c5b901 100644 --- a/lib/dialyzer/vsn.mk +++ b/lib/dialyzer/vsn.mk @@ -1 +1 @@ -DIALYZER_VSN = 2.6 +DIALYZER_VSN = 2.6.1 diff --git a/lib/diameter/Makefile b/lib/diameter/Makefile index 9961d627cf..aa1c9f7f20 100644 --- a/lib/diameter/Makefile +++ b/lib/diameter/Makefile @@ -1,7 +1,7 @@ -# +# # %CopyrightBegin% # -# Copyright Ericsson AB 2010-2012. All Rights Reserved. +# Copyright Ericsson AB 2010-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in @@ -22,11 +22,11 @@ include vsn.mk include subdirs.mk SUB_DIRECTORIES = $(SUB_DIRS) doc/src -SPECIAL_TARGETS = +SPECIAL_TARGETS = include $(ERL_TOP)/make/otp_subdir.mk -info: +info: @echo "APP_VSN = $(APP_VSN)" .PHONY: info diff --git a/lib/diameter/doc/src/Makefile b/lib/diameter/doc/src/Makefile index 99a6680f12..bd2b6b103a 100644 --- a/lib/diameter/doc/src/Makefile +++ b/lib/diameter/doc/src/Makefile @@ -1,4 +1,4 @@ -# +# # %CopyrightBegin% # # Copyright Ericsson AB 2010-2013. All Rights Reserved. @@ -117,7 +117,7 @@ info: # ---------------------------------------------------- # Release Target -# ---------------------------------------------------- +# ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk diff --git a/lib/diameter/doc/src/diameter.xml b/lib/diameter/doc/src/diameter.xml index 318c98f786..db19fbb271 100644 --- a/lib/diameter/doc/src/diameter.xml +++ b/lib/diameter/doc/src/diameter.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="latin1" ?> <!DOCTYPE erlref SYSTEM "erlref.dtd" [ + <!ENTITY spawn_opt + '<seealso marker="erts:erlang#spawn_opt-2">erlang:spawn_opt/2</seealso>'> <!ENTITY nodes '<seealso marker="erts:erlang#nodes-0">erlang:nodes/0</seealso>'> <!ENTITY make_ref @@ -27,12 +29,12 @@ Version 1.1, (the "License"); you may not use this file except in compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>diameter(3)</title> @@ -871,6 +873,18 @@ of a single Diameter node across multiple Erlang nodes.</p> </note> </item> +<tag><c>{spawn_opt, [term()]}</c></tag> +<item> +<p> +An options list passed to &spawn_opt; when spawning a process for an +incoming Diameter request, unless the transport in question +specifies another value. +Options <c>monitor</c> and <c>link</c> are ignored.</p> + +<p> +Defaults to the empty list.</p> +</item> + <tag><c>{use_shared_peers, boolean() | [node()] | evaluable()}</c></tag> <item> <p> @@ -1161,6 +1175,18 @@ Defaults to 30000 for a connecting transport and 60000 for a listening transport.</p> </item> +<marker id="spawn_opt"/> +<tag><c>{spawn_opt, [term()]}</c></tag> +<item> +<p> +An options list passed to &spawn_opt; when spawning a process for an +incoming Diameter request. +Options <c>monitor</c> and <c>link</c> are ignored.</p> + +<p> +Defaults to the list configured on the service if not specified.</p> +</item> + <marker id="transport_config"/> <tag><c>{transport_config, term()}</c></tag> <tag><c>{transport_config, term(), &dict_Unsigned32; | infinity}</c></tag> @@ -1626,7 +1652,7 @@ The <c>caps</c> entry identifies the capabilities sent by the local node and received from the peer during capabilities exchange. The <c>port</c> entry displays socket-level information about the transport connection. -The <c>statistics</c> entry presents Diameter-level counters, +The <c>statistics</c> entry presents Diameter-level counters, an entry like <c>{{{0,280,1},recv},2}</c> saying that the client has received 2 DWR messages: <c>{0,280,1} = {Application_Id, Command_Code, R_Flag}</c>.</p> diff --git a/lib/diameter/doc/src/diameter_compile.xml b/lib/diameter/doc/src/diameter_compile.xml index fc81e4efed..6630019e5c 100644 --- a/lib/diameter/doc/src/diameter_compile.xml +++ b/lib/diameter/doc/src/diameter_compile.xml @@ -16,9 +16,9 @@ </copyright> <legalnotice> -The program may be used and/or copied only with the written permission -from Ericsson AB, or in accordance with the terms and conditions -stipulated in the agreement/contract under which the program has been +The program may be used and/or copied only with the written permission +from Ericsson AB, or in accordance with the terms and conditions +stipulated in the agreement/contract under which the program has been supplied. </legalnotice> diff --git a/lib/diameter/doc/src/diameter_dict.xml b/lib/diameter/doc/src/diameter_dict.xml index 419dc143af..4fcde495b3 100644 --- a/lib/diameter/doc/src/diameter_dict.xml +++ b/lib/diameter/doc/src/diameter_dict.xml @@ -25,12 +25,12 @@ Version 1.1, (the "License"); you may not use this file except in compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>diameter_dict(4)</title> diff --git a/lib/diameter/doc/src/diameter_intro.xml b/lib/diameter/doc/src/diameter_intro.xml index fd578ccf45..288ebc0c7c 100644 --- a/lib/diameter/doc/src/diameter_intro.xml +++ b/lib/diameter/doc/src/diameter_intro.xml @@ -7,7 +7,7 @@ <chapter> <header> <copyright> -<year>2011</year><year>2012</year> +<year>2011</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> @@ -17,12 +17,12 @@ Version 1.1, (the "License"); you may not use this file except in compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>Introduction</title> diff --git a/lib/diameter/doc/src/diameter_sctp.xml b/lib/diameter/doc/src/diameter_sctp.xml index df140b16b9..5fe14b1ef6 100644 --- a/lib/diameter/doc/src/diameter_sctp.xml +++ b/lib/diameter/doc/src/diameter_sctp.xml @@ -70,10 +70,15 @@ and implements the behaviour documented in <v>Type = connect | accept</v> <v>Ref = &mod_transport_ref;</v> <v>Svc = #diameter_service{}</v> -<v>Opt = {raddr, &ip_address;} | {rport, integer()} | term()</v> +<v>Opt = OwnOpt | SctpOpt</v> <v>Pid = pid()</v> <v>LAddr = &ip_address;</v> <v>Reason = term()</v> +<v>OwnOpt = {raddr, &ip_address;} + | {rport, integer()} + | {accept, Match}</v> +<v>SctpOpt = term()</v> +<v>Match = &ip_address; | string() | [Match]</v> </type> <desc> @@ -85,9 +90,20 @@ Options <c>raddr</c> and <c>rport</c> specify the remote address and port for a connecting transport and not valid for a listening transport: the former is required while latter defaults to 3868 if unspecified. -More than one <c>raddr</c> option can be specified, in which case the +Mupltiple <c>raddr</c> options can be specified, in which case the connecting transport in question attempts each in sequence until -an association is established. +an association is established.</p> + +<p> +Option <c>accept</c> specifies remote addresses for a listening +transport and is not valid for a connecting transport. +If specified, a remote address that does not match one of the +specified addresses causes the association to be aborted. +Multiple <c>accept</c> options can be specified. +A string-valued <c>Match</c> that does not parse as an address is +interpreted as a regular expression.</p> + +<p> Remaining options are any accepted by &gen_sctp_open1;, with the exception of options <c>mode</c>, <c>binary</c>, <c>list</c>, <c>active</c> and <c>sctp_events</c>. diff --git a/lib/diameter/doc/src/diameter_tcp.xml b/lib/diameter/doc/src/diameter_tcp.xml index 8e509aa829..ce4d6cfd0f 100644 --- a/lib/diameter/doc/src/diameter_tcp.xml +++ b/lib/diameter/doc/src/diameter_tcp.xml @@ -96,10 +96,12 @@ before configuring TLS capability on diameter transports.</p> <v>Reason = term()</v> <v>OwnOpt = {raddr, &ip_address;} | {rport, integer()} + | {accept, Match} | {port, integer()} | {fragment_timer, infinity | 0..16#FFFFFFFF}</v> <v>SslOpt = {ssl_options, true | list()}</v> <v>TcpOpt = term()</v> +<v>Match = &ip_address; | string() | [Match]</v> </type> <desc> @@ -109,7 +111,18 @@ The start function required by &man_transport;.</p> <p> Options <c>raddr</c> and <c>rport</c> specify the remote address and port for a connecting transport and are not valid for a listening -transport. +transport.</p> + +<p> +Option <c>accept</c> specifies remote addresses for a listening +transport and is not valid for a connecting transport. +If specified, a remote address that does not match one of the +specified addresses causes the connection to be aborted. +Multiple <c>accept</c> options can be specified. +A string-valued <c>Match</c> that does not parse as an address is +interpreted as a regular expression.</p> + +<p> Option <c>ssl_options</c> must be specified for a transport that should support TLS: a value of <c>true</c> results in a TLS handshake immediately upon connection establishment while diff --git a/lib/diameter/doc/src/diameter_using.xml b/lib/diameter/doc/src/diameter_using.xml index 7d9c0cd492..c487d94a16 100644 --- a/lib/diameter/doc/src/diameter_using.xml +++ b/lib/diameter/doc/src/diameter_using.xml @@ -5,7 +5,7 @@ <header> <copyright> -<year>2011</year><year>2012</year> +<year>2011</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> @@ -15,12 +15,12 @@ Version 1.1, (the "License"); you may not use this file except in compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>Usage</title> diff --git a/lib/diameter/doc/src/notes.xml b/lib/diameter/doc/src/notes.xml index ad61f12b5b..e750b56f1e 100644 --- a/lib/diameter/doc/src/notes.xml +++ b/lib/diameter/doc/src/notes.xml @@ -42,6 +42,229 @@ first.</p> <!-- ===================================================================== --> +<section><title>diameter 1.4.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fix handling of 5014 (INVALID_AVP_LENGTH) errors.</p> + <p> + This was in some cases reported as 3009 + (INVALID_AVP_BITS).</p> + <p> + Note that the correction is partially implemented in + modules generated by diameterc(1): a dictionary file must + be recompiled for the correction to apply to any messages + it defines.</p> + <p> + Own Id: OTP-11007</p> + </item> + <item> + <p> + Fix faulty capitalization in release notes.</p> + <p> + Diameter = the protocol.<br/> diameter = the Erlang + application.</p> + <p> + Own Id: OTP-11014</p> + </item> + <item> + <p> + Fix watchdog memory leak.</p> + <p> + Entries were not removed from a service-specific ets + table, causing them to be orphaned at connection + reestablishment for listening transports, and + diameter:remove_transport/2 for both listening and + connecting transports.</p> + <p> + The fault was introduced by OTP-10692 in diameter-1.4.1 + (R16B).</p> + <p> + Own Id: OTP-11019 Aux Id: OTP-10692 </p> + </item> + <item> + <p> + Fix decode failure on AVP Length < 8.</p> + <p> + The failure caused the message in question to be + discarded.</p> + <p> + Own Id: OTP-11026</p> + </item> + <item> + <p> + Respect Host-IP-Address configuration.</p> + <p> + Addresses returned from a transport module were always + used to populate Host-IP-Address AVP's in an outgoing + CER/CEA, which precluded the sending of a VIP address. + Transport addresses are now only used if Host-IP-Address + is unspecified.</p> + <p> + Own Id: OTP-11045</p> + </item> + <item> + <p> + Fix mkdir race.</p> + <p> + Install could fail if examples/code and examples/dict + were created in parallel. Noticed on FreeBSD.</p> + <p> + Own Id: OTP-11051</p> + </item> + <item> + <p> + Fix recognition of 5001 on mandatory AVP's.</p> + <p> + An AVP setting the M-bit was not regarded as erroneous if + it was defined in the dictionary in question and its + container (message or Grouped AVP) had an 'AVP' field. + It's now regarded as a 5001 error (AVP_UNSUPPORTED), as + in the case that the AVP is not defined.</p> + <p> + Note that the correction is partially implemented in + modules generated by diameterc(1): a dictionary file must + be recompiled for the correction to apply to any messages + it defines.</p> + <p> + Own Id: OTP-11087</p> + </item> + <item> + <p> + Fix setting of Failed-AVP on handle_request + {answer_message, 5xxx} return.</p> + <p> + Failed-AVP was never in the outgoing answer-message. It + is now set with the AVP from the first entry with the + specified Result-Code in the errors field of the incoming + diameter_packet, if found.</p> + <p> + Own Id: OTP-11092</p> + </item> + <item> + <p> + Fix watchdog function_clause</p> + <p> + A listening transport on a service that allowed multiple + connections to the same peer could result in a + function_clause error in module diameter_watchdog. The + resulting crash was harmless but unseemly.</p> + <p> + Thanks to Aleksander Nycz.</p> + <p> + Own Id: OTP-11115</p> + </item> + <item> + <p> + Fix population of Failed-AVP.</p> + <p> + In cases in which diameter populated this AVP, many + values were sent instead of one as suggested by RFC 6733. + This was partially corrected by OTP-11007.</p> + <p> + Own Id: OTP-11127 Aux Id: OTP-11007 </p> + </item> + <item> + <p> + Fix list-valued Vendor-Specific-Application-Id config</p> + <p> + R16B (specifically, OTP-10760) broke the handling of such + configuration, resulting in a function clause error if + the list was not of length 3, and faulty interpretation + of the list's contents otherwise. Only record-valued + configuration was properly interpreted.</p> + <p> + Own Id: OTP-11165</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Allow peer connections to be shared between Erlang nodes + for the purpose of sending outgoing requests.</p> + <p> + A diameter_app(3) pick_peer/4 callback gets a list of + remote candidates as argument, allowing a callback on one + node to select a transport connection established on + another node. The service_opt() share_peers controls the + extent to which local connections are shared with remote + nodes. The service_opt() use_shared_peers controls the + extent to which connections shared from remote nodes are + utilized on the local node.</p> + <p> + Own Id: OTP-9610</p> + </item> + <item> + <p> + Allow listening diameter_{tcp,sctp} transports to be + configured with remote addresses.</p> + <p> + Option 'accept' allows remote addresses to be configured + as tuples or regular expressions. Remote addresses are + matched against the configured values at connection + establishment, any non-matching address causing the + connection to be aborted.</p> + <p> + Own Id: OTP-10893</p> + </item> + <item> + <p> + Detect more transport_opt() configuration errors at + diameter:add_transport/2.</p> + <p> + Many errors would previously not be detected until + transport start, diameter:add_transport/2 returning 'ok' + but transport connections failing to be established. An + error tuple is now returned.</p> + <p> + Own Id: OTP-10972</p> + </item> + <item> + <p> + Make explicit local address configuration optional in + diameter_tcp:start/3.</p> + <p> + The default address (as determined by gen_tcp) is now + used when a local address is not explicitly configured.</p> + <p> + Own Id: OTP-10986</p> + </item> + <item> + <p> + Improve handling of unrecognized service options.</p> + <p> + Such options were silently ignored by + diameter:start_service/2. An error tuple is now returned.</p> + <p> + Own Id: OTP-11017</p> + </item> + <item> + <p> + Don't send default Inband-Security-Id in CER/CEA.</p> + <p> + RFC 6733 recommends against the use of + Inband-Security-Id. Only send a value that differs from + the default, NO_INBAND_SECURITY = 0.</p> + <p> + Own Id: OTP-11050</p> + </item> + <item> + <p> + Make spawn options for request processes configurable.</p> + <p> + Own Id: OTP-11060</p> + </item> + </list> + </section> + +</section> + <section><title>diameter 1.4.1.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/diameter/src/Makefile b/lib/diameter/src/Makefile index c0cf418f06..578bbaee2e 100644 --- a/lib/diameter/src/Makefile +++ b/lib/diameter/src/Makefile @@ -1,19 +1,19 @@ -# +# # %CopyrightBegin% -# +# # Copyright Ericsson AB 2010-2013. All Rights Reserved. -# +# # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be # retrieved online at http://www.erlang.org/. -# +# # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. -# +# # %CopyrightEnd% include $(ERL_TOP)/make/target.mk diff --git a/lib/diameter/src/base/diameter.erl b/lib/diameter/src/base/diameter.erl index 57730cad61..77200cc7d0 100644 --- a/lib/diameter/src/base/diameter.erl +++ b/lib/diameter/src/base/diameter.erl @@ -306,7 +306,8 @@ call(SvcName, App, Message) -> | {restrict_connections, restriction()} | {sequence, sequence() | evaluable()} | {share_peers, remotes()} - | {use_shared_peers, remotes()}. + | {use_shared_peers, remotes()} + | {spawn_opt, list()}. -type application_opt() :: {alias, app_alias()} @@ -345,6 +346,7 @@ call(SvcName, App, Message) -> | {reconnect_timer, 'Unsigned32'()} | {watchdog_timer, 'Unsigned32'() | {module(), atom(), list()}} | {watchdog_config, [{okay|suspect, non_neg_integer()}]} + | {spawn_opt, list()} | {private, any()}. %% Predicate passed to remove_transport/2 diff --git a/lib/diameter/src/base/diameter_capx.erl b/lib/diameter/src/base/diameter_capx.erl index 4b821f5139..1a931a9854 100644 --- a/lib/diameter/src/base/diameter_capx.erl +++ b/lib/diameter/src/base/diameter_capx.erl @@ -419,12 +419,13 @@ app_union(#diameter_caps{auth_application_id = U, vendor_specific_application_id = V}) -> set_list(U ++ C ++ lists:flatmap(fun vsa_apps/1, V)). -vsa_apps([_ | [_,_] = Ids]) -> - lists:append(Ids); +vsa_apps(Vals) + when is_list(Vals) -> + lists:flatmap(fun({'Vendor-Id', _}) -> []; ({_, Ids}) -> Ids end, Vals); vsa_apps(Rec) when is_tuple(Rec) -> - [_|T] = tuple_to_list(Rec), - vsa_apps(T). + [_Name, _VendorId | Idss] = tuple_to_list(Rec), + lists:append(Idss). %% It's a configuration error for a locally advertised application not %% to be represented in Apps. Don't just match on lists:keyfind/3 in diff --git a/lib/diameter/src/base/diameter_codec.erl b/lib/diameter/src/base/diameter_codec.erl index 6c0e73de36..1d647b8c87 100644 --- a/lib/diameter/src/base/diameter_codec.erl +++ b/lib/diameter/src/base/diameter_codec.erl @@ -204,7 +204,7 @@ msg_header(Mod, 'answer-message' = MsgName, Header) -> #diameter_header{application_id = Aid, cmd_code = Code} = Header, - {-1, Flags, ?DIAMETER_APP_ID_COMMON} = Mod:msg_header(MsgName), + {-1, Flags, ?APP_ID_COMMON} = Mod:msg_header(MsgName), {Code, Flags, Aid}; msg_header(Mod, MsgName, _) -> diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl index 2a145c874b..fc5c284bf2 100644 --- a/lib/diameter/src/base/diameter_config.erl +++ b/lib/diameter/src/base/diameter_config.erl @@ -549,6 +549,9 @@ opt({watchdog_timer, Tmo}) -> opt({watchdog_config, L}) -> is_list(L) andalso lists:all(fun wdopt/1, L); +opt({spawn_opt, Opts}) -> + is_list(Opts); + %% Options that we can't validate. opt({K, _}) when K == transport_config; @@ -632,7 +635,8 @@ make_config(SvcName, Opts) -> {false, use_shared_peers}, {false, monitor}, {?NOMASK, sequence}, - {nodes, restrict_connections}]), + {nodes, restrict_connections}, + {[], spawn_opt}]), #service{name = SvcName, rec = #diameter_service{applications = Apps, @@ -647,6 +651,9 @@ make_opts(Opts, Defs) -> [{K, opt(K,V)} || {K,V} <- Known]. +opt(spawn_opt, L) -> + is_list(L); + opt(K, false = B) when K /= sequence -> B; diff --git a/lib/diameter/src/base/diameter_peer.erl b/lib/diameter/src/base/diameter_peer.erl index 0d2efd4d1f..e5d4b28766 100644 --- a/lib/diameter/src/base/diameter_peer.erl +++ b/lib/diameter/src/base/diameter_peer.erl @@ -25,7 +25,8 @@ -export([recv/2, up/1, up/2, - up/3]). + up/3, + match/2]). %% ... and the stack. -export([start/1, @@ -63,16 +64,16 @@ -define(DEFAULT_TCFG, []). -define(DEFAULT_TTMO, infinity). -%%% --------------------------------------------------------------------------- -%%% # notify/3 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # notify/3 +%% --------------------------------------------------------------------------- notify(Nodes, SvcName, T) -> rpc:abcast(Nodes, ?SERVER, {notify, SvcName, T}). -%%% --------------------------------------------------------------------------- -%%% # start/1 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # start/1 +%% --------------------------------------------------------------------------- -spec start({T, [Opt], #diameter_service{}}) -> {TPid, [Addr], Tmo, Data} @@ -180,9 +181,34 @@ start(T, [M|Ms], Cfg, Svc, Tmo, Rest, Errs) -> start(Mod, Args) -> apply(Mod, start, Args). -%%% --------------------------------------------------------------------------- -%%% # up/1-3 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # match/2 +%% --------------------------------------------------------------------------- + +match(Addrs, Matches) + when is_list(Addrs) -> + lists:all(fun(A) -> match1(A, Matches) end, Addrs). + +match1(Addr, Matches) + when not is_integer(hd(Matches)) -> + lists:any(fun(M) -> match1(Addr, M) end, Matches); + +match1(Addr, Match) -> + match(Addr, addr(Match), Match). + +match(Addr, {ok, A}, _) -> + Addr == A; +match(Addr, {error, _}, RE) -> + match == re:run(inet_parse:ntoa(Addr), RE, [{capture, none}]). + +addr([_|_] = A) -> + inet_parse:address(A); +addr(A) -> + {ok, A}. + +%% --------------------------------------------------------------------------- +%% # up/1-3 +%% --------------------------------------------------------------------------- up(Pid) -> %% accepting transport ifc_send(Pid, {self(), connected}). @@ -193,16 +219,16 @@ up(Pid, Remote) -> %% connecting transport up(Pid, Remote, LAddrs) -> %% connecting transport ifc_send(Pid, {self(), connected, Remote, LAddrs}). -%%% --------------------------------------------------------------------------- -%%% # recv/2 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # recv/2 +%% --------------------------------------------------------------------------- recv(Pid, Pkt) -> ifc_send(Pid, {recv, Pkt}). -%%% --------------------------------------------------------------------------- -%%% # send/2 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # send/2 +%% --------------------------------------------------------------------------- send(Pid, #diameter_packet{transport_data = undefined, bin = Bin}) -> @@ -211,16 +237,16 @@ send(Pid, #diameter_packet{transport_data = undefined, send(Pid, Pkt) -> ifc_send(Pid, {send, Pkt}). -%%% --------------------------------------------------------------------------- -%%% # close/1 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # close/1 +%% --------------------------------------------------------------------------- close(Pid) -> ifc_send(Pid, {close, self()}). -%%% --------------------------------------------------------------------------- -%%% # abort/1 -%%% --------------------------------------------------------------------------- +%% --------------------------------------------------------------------------- +%% # abort/1 +%% --------------------------------------------------------------------------- abort(Pid) -> exit(Pid, shutdown). @@ -241,16 +267,16 @@ state() -> uptime() -> call(uptime). -%%% ---------------------------------------------------------- -%%% # init(Role) -%%% ---------------------------------------------------------- +%% ---------------------------------------------------------- +%% # init(Role) +%% ---------------------------------------------------------- init([]) -> {ok, #state{}}. -%%% ---------------------------------------------------------- -%%% # handle_call(Request, From, State) -%%% ---------------------------------------------------------- +%% ---------------------------------------------------------- +%% # handle_call(Request, From, State) +%% ---------------------------------------------------------- handle_call(state, _, State) -> {reply, State, State}; @@ -262,17 +288,17 @@ handle_call(Req, From, State) -> ?UNEXPECTED([Req, From]), {reply, nok, State}. -%%% ---------------------------------------------------------- -%%% # handle_cast(Request, State) -%%% ---------------------------------------------------------- +%% ---------------------------------------------------------- +%% # handle_cast(Request, State) +%% ---------------------------------------------------------- handle_cast(Msg, State) -> ?UNEXPECTED([Msg]), {noreply, State}. -%%% ---------------------------------------------------------- -%%% # handle_info(Request, State) -%%% ---------------------------------------------------------- +%% ---------------------------------------------------------- +%% # handle_info(Request, State) +%% ---------------------------------------------------------- %% Remote service is distributing a message. handle_info({notify, SvcName, T}, S) -> diff --git a/lib/diameter/src/base/diameter_peer_fsm.erl b/lib/diameter/src/base/diameter_peer_fsm.erl index 4e55864168..2b99ecc59c 100644 --- a/lib/diameter/src/base/diameter_peer_fsm.erl +++ b/lib/diameter/src/base/diameter_peer_fsm.erl @@ -28,7 +28,8 @@ -behaviour(gen_server). %% Interface towards diameter_watchdog. --export([start/3]). +-export([start/3, + result_code/2]). %% gen_server callbacks -export([init/1, @@ -62,7 +63,6 @@ %% Keys in process dictionary. -define(CB_KEY, cb). %% capabilities callback -define(DPR_KEY, dpr). %% disconnect callback --define(DWA_KEY, dwa). %% outgoing DWA -define(REF_KEY, ref). %% transport_ref() -define(Q_KEY, q). %% transport start queue -define(START_KEY, start). %% start of connected transport @@ -177,14 +177,9 @@ init(T) -> proc_lib:init_ack({ok, self()}), gen_server:enter_loop(?MODULE, [], i(T)). -i({Ack, WPid, {M, Ref} = T, Opts, {Mask, - Nodes, - Dict0, - #diameter_service{capabilities = LCaps} - = Svc}}) -> +i({Ack, WPid, {M, Ref} = T, Opts, {Mask, Nodes, Dict0, Svc}}) -> erlang:monitor(process, WPid), wait(Ack, WPid), - putr(?DWA_KEY, dwa(LCaps)), diameter_stats:reg(Ref), {[Cs,Ds], Rest} = proplists:split(Opts, [capabilities_cb, disconnect_cb]), putr(?CB_KEY, {Ref, [F || {_,F} <- Cs]}), @@ -612,9 +607,7 @@ rcv(Name, _, #state{state = PS}) Name == 'CEA' -> {stop, {Name, PS}}; -rcv(N, Pkt, S) - when N == 'DWR'; - N == 'DPR' -> +rcv('DPR' = N, Pkt, S) -> handle_request(N, Pkt, S); %% DPA in response to DPR and with the expected identifiers. @@ -717,8 +710,8 @@ build_answer(Type, errors = Es} = Pkt, S) -> - RC = rc(H, Es), - {answer(Type, RC, Es, S), post(Type, RC, Pkt, S)}. + {RC, FailedAVP} = result_code(H, Es), + {answer(Type, RC, FailedAVP, S), post(Type, RC, Pkt, S)}. inband_security([]) -> ?NO_INBAND_SECURITY; @@ -734,7 +727,7 @@ cea(CEA, RC, Dict0) -> post('CER' = T, RC, Pkt, S) -> {T, caps(S), {RC, Pkt}}; -post(_, _, _, _) -> +post('DPR', _, _, _) -> ok. rejected({capabilities_cb, _F, Reason}, T, S) -> @@ -743,13 +736,10 @@ rejected({capabilities_cb, _F, Reason}, T, S) -> rejected(discard, T, _) -> close(T); rejected({N, Es}, T, S) -> - {answer('CER', N, Es, S), T}; + {answer('CER', N, failed_avp(N, Es), S), T}; rejected(N, T, S) -> rejected({N, []}, T, S). -answer(Type, RC, Es, S) -> - set(answer(Type, RC, S), failed_avp(RC, Es)). - failed_avp(RC, [{RC, Avp} | _]) -> [{'Failed-AVP', [{'AVP', [Avp]}]}]; failed_avp(RC, [_ | Es]) -> @@ -757,6 +747,9 @@ failed_avp(RC, [_ | Es]) -> failed_avp(_, [] = No) -> No. +answer(Type, RC, FailedAVP, S) -> + set(answer(Type, RC, S), FailedAVP). + answer(Type, RC, S) -> answer_message(answer(Type, S), RC). @@ -784,29 +777,29 @@ set(['answer-message' | _] = Ans, FailedAvp) -> set([_|_] = Ans, FailedAvp) -> Ans ++ FailedAvp. -%% rc/2 +%% result_code/2 -rc(#diameter_header{is_error = true}, _) -> - 3008; %% DIAMETER_INVALID_HDR_BITS +result_code(#diameter_header{is_error = true}, _) -> + {3008, []}; %% DIAMETER_INVALID_HDR_BITS -rc(_, [Bs|_]) +result_code(_, [Bs|_]) when is_bitstring(Bs) -> %% from old code - 3009; %% DIAMETER_INVALID_HDR_BITS + {3009, []}; %% DIAMETER_INVALID_HDR_BITS -rc(#diameter_header{version = ?DIAMETER_VERSION}, Es) -> +result_code(#diameter_header{version = ?DIAMETER_VERSION}, Es) -> rc(Es); -rc(_, _) -> - 5011. %% DIAMETER_UNSUPPORTED_VERSION +result_code(_, _) -> + {5011, []}. %% DIAMETER_UNSUPPORTED_VERSION %% rc/1 rc([]) -> - 2001; %% DIAMETER_SUCCESS -rc([{RC,_}|_]) -> - RC; + {2001, []}; %% DIAMETER_SUCCESS +rc([{RC, _} | _] = Es) -> + {RC, failed_avp(RC, Es)}; rc([RC|_]) -> - RC. + {RC, []}. %% DIAMETER_INVALID_HDR_BITS 3008 %% A request was received whose bits in the Diameter header were @@ -832,9 +825,6 @@ rc([RC|_]) -> %% answer/2 -answer('DWR', _) -> - getr(?DWA_KEY); - answer(Name, #state{service = #diameter_service{capabilities = Caps}}) -> a(Name, Caps). @@ -1019,15 +1009,6 @@ report({M, _, _, _, _} = T) report(_) -> ok. -%% dwa/1 - -dwa(#diameter_caps{origin_host = OH, - origin_realm = OR, - origin_state_id = OSI}) -> - ['DWA', {'Origin-Host', OH}, - {'Origin-Realm', OR}, - {'Origin-State-Id', OSI}]. - %% dpr/2 %% %% The RFC isn't clear on whether DPR should be send in a non-Open diff --git a/lib/diameter/src/base/diameter_service.erl b/lib/diameter/src/base/diameter_service.erl index 112e83476d..9dd8aafc61 100644 --- a/lib/diameter/src/base/diameter_service.erl +++ b/lib/diameter/src/base/diameter_service.erl @@ -770,10 +770,8 @@ start(Ref, Type, Opts, #state{watchdogT = WatchdogT, = Svc = merge_service(Opts, Svc0), {_,_} = Mask = proplists:get_value(sequence, SvcOpts), - Pid = s(Type, Ref, {diameter_traffic:make_recvdata([SvcName, - PeerT, - Apps, - Mask]), + RecvData = diameter_traffic:make_recvdata([SvcName, PeerT, Apps, Mask]), + Pid = s(Type, Ref, {{spawn_opts([Opts, SvcOpts]), RecvData}, Opts, SvcOpts, Svc}), @@ -787,6 +785,12 @@ start(Ref, Type, Opts, #state{watchdogT = WatchdogT, %% record so that each watchdog may get a different record. This %% record is what is passed back into application callbacks. +spawn_opts(Optss) -> + SpawnOpts = get_value(spawn_opt, Optss, []), + [T || T <- SpawnOpts, + T /= link, + T /= monitor]. + s(Type, Ref, T) -> {_MRef, Pid} = diameter_watchdog:start({Type, Ref}, T), Pid. @@ -986,6 +990,18 @@ keyfind([Key | Rest], Pos, L) -> T end. +%% get_value/3 + +get_value(_, [], Def) -> + Def; +get_value(Key, [L | Rest], Def) -> + case lists:keyfind(Key, 1, L) of + {_,V} -> + V; + _ -> + get_value(Key, Rest, Def) + end. + %% find_outgoing_app/2 find_outgoing_app(Alias, Apps) -> diff --git a/lib/diameter/src/base/diameter_traffic.erl b/lib/diameter/src/base/diameter_traffic.erl index 0b15e68ec7..8b6f026b34 100644 --- a/lib/diameter/src/base/diameter_traffic.erl +++ b/lib/diameter/src/base/diameter_traffic.erl @@ -48,6 +48,7 @@ -define(BASE, ?DIAMETER_DICT_COMMON). %% Note: the RFC 3588 dictionary -define(DEFAULT_TIMEOUT, 5000). %% for outgoing requests +-define(DEFAULT_SPAWN_OPTS, []). %% Table containing outgoing requests for which a reply has yet to be %% received. @@ -153,13 +154,8 @@ receive_message(TPid, Pkt, Dict0, RecvData) RecvData). %% Incoming request ... -recv(true, false, TPid, Pkt, Dict0, RecvData) -> - try - spawn(fun() -> recv_request(TPid, Pkt, Dict0, RecvData) end) - catch - error: system_limit = E -> %% discard - ?LOG({error, E}, now()) - end; +recv(true, false, TPid, Pkt, Dict0, T) -> + spawn_request(TPid, Pkt, Dict0, T); %% ... answer to known request ... recv(false, #request{ref = Ref, handler = Pid} = Req, _, Pkt, Dict0, _) -> @@ -177,6 +173,21 @@ recv(false, #request{ref = Ref, handler = Pid} = Req, _, Pkt, Dict0, _) -> recv(false, false, _, _, _, _) -> ok. +%% spawn_request/4 + +spawn_request(TPid, Pkt, Dict0, {Opts, RecvData}) -> + spawn_request(TPid, Pkt, Dict0, Opts, RecvData); +spawn_request(TPid, Pkt, Dict0, RecvData) -> + spawn_request(TPid, Pkt, Dict0, ?DEFAULT_SPAWN_OPTS, RecvData). + +spawn_request(TPid, Pkt, Dict0, Opts, RecvData) -> + try + spawn_opt(fun() -> recv_request(TPid, Pkt, Dict0, RecvData) end, Opts) + catch + error: system_limit = E -> %% discard + ?LOG({error, E}, now()) + end. + %% --------------------------------------------------------------------------- %% recv_request/4 %% --------------------------------------------------------------------------- @@ -780,7 +791,7 @@ failed([MsgName | Values], FailedAvp, Dict) -> %% ... or record. failed(Rec, FailedAvp, Dict) -> try - RecName = element(1, Rec), + RecName = element(1, Rec), Dict:'#info-'(RecName, {index, 'Failed-AVP'}), {'Failed-AVP', [FailedAvp]} catch diff --git a/lib/diameter/src/base/diameter_watchdog.erl b/lib/diameter/src/base/diameter_watchdog.erl index 88ccf630e2..7e75801718 100644 --- a/lib/diameter/src/base/diameter_watchdog.erl +++ b/lib/diameter/src/base/diameter_watchdog.erl @@ -201,7 +201,7 @@ common_dictionary(Apps) -> %% means a user won't be able either send of receive %% messages in the common dictionary: incoming request %% will be answered with 3007 and outgoing requests cannot - %% be sent. The dictionary returned here is oly used for + %% be sent. The dictionary returned here is only used for %% messages diameter sends and receives: CER/CEA, DPR/DPA %% and DWR/DWA. ?BASE @@ -545,10 +545,15 @@ recv(Name, Pkt, S) -> %% rcv/3 +rcv('DWR', Pkt, #watchdog{transport = TPid, + dictionary = Dict0, + sequence = Mask}) -> + send(TPid, {send, encode(dwa(Pkt), Mask, Dict0)}), + ?LOG(send, 'DWA'); + rcv(N, _, _) when N == 'CER'; N == 'CEA'; - N == 'DWR'; N == 'DWA'; N == 'DPR'; N == 'DPA' -> @@ -642,6 +647,9 @@ rcv('DWA', #watchdog{status = reopen, %% REOPEN Receive non-DWA Throwaway() REOPEN +rcv('DWR', #watchdog{status = reopen} = S) -> + S; %% ensure DWA: the RFC isn't explicit about answering + rcv(_, #watchdog{status = reopen} = S) -> throwaway(S). @@ -782,6 +790,13 @@ dwr(#diameter_caps{origin_host = OH, {'Origin-Realm', OR}, {'Origin-State-Id', OSI}]. +%% dwa/1 + +dwa(#diameter_packet{header = H, errors = Es}) -> + {RC, FailedAVP} = diameter_peer_fsm:result_code(H, Es), + ['DWA', {'Result-Code', RC} + | tl(getr(dwr)) ++ FailedAVP]. + %% restrict_nodes/1 restrict_nodes(false) -> diff --git a/lib/diameter/src/base/diameter.app.src b/lib/diameter/src/diameter.app.src index ceefb9b398..ceefb9b398 100644 --- a/lib/diameter/src/base/diameter.app.src +++ b/lib/diameter/src/diameter.app.src diff --git a/lib/diameter/src/base/diameter.appup.src b/lib/diameter/src/diameter.appup.src index 359f434941..62ace16faa 100644 --- a/lib/diameter/src/base/diameter.appup.src +++ b/lib/diameter/src/diameter.appup.src @@ -31,10 +31,36 @@ {"1.4", [{restart_application, diameter}]}, %% R16A {"1.4.1", [{load_module, diameter_reg}, %% R16B {load_module, diameter_stats}, + {load_module, diameter_traffic}, {load_module, diameter_service}, + {load_module, diameter_config}, + {load_module, diameter_peer}, + {load_module, diameter_peer_fsm}, {load_module, diameter_watchdog}, {load_module, diameter_capx}, - {load_module, diameter}]} + {load_module, diameter_codec}, + {load_module, diameter_gen_base_rfc3588}, + {load_module, diameter_gen_base_accounting}, + {load_module, diameter_gen_base_rfc6733}, + {load_module, diameter_gen_base_acct6733}, + {load_module, diameter_tcp}, + {load_module, diameter_lib}, + {load_module, diameter}]}, + {"1.4.1.1", [{load_module, diameter_traffic}, + {load_module, diameter_service}, + {load_module, diameter_config}, + {load_module, diameter_peer}, + {load_module, diameter_peer_fsm}, + {load_module, diameter_watchdog}, + {load_module, diameter_capx}, + {load_module, diameter_codec}, + {load_module, diameter_gen_base_rfc3588}, + {load_module, diameter_gen_base_accounting}, + {load_module, diameter_gen_base_rfc6733}, + {load_module, diameter_gen_base_acct6733}, + {load_module, diameter_tcp}, + {load_module, diameter_lib}, + {load_module, diameter}]} ], [ {"0.9", [{restart_application, diameter}]}, @@ -46,6 +72,7 @@ {"1.3", [{restart_application, diameter}]}, {"1.3.1", [{restart_application, diameter}]}, {"1.4", [{restart_application, diameter}]}, - {"1.4.1", [{restart_application, diameter}]} + {"1.4.1", [{restart_application, diameter}]}, + {"1.4.1.1", [{restart_application, diameter}]} ] }. diff --git a/lib/diameter/src/dict/base_rfc3588.dia b/lib/diameter/src/dict/base_rfc3588.dia index acd7fffd00..43a417b8dc 100644 --- a/lib/diameter/src/dict/base_rfc3588.dia +++ b/lib/diameter/src/dict/base_rfc3588.dia @@ -1,7 +1,7 @@ ;; ;; %CopyrightBegin% ;; -;; Copyright Ericsson AB 2010-2011. All Rights Reserved. +;; Copyright Ericsson AB 2010-2013. All Rights Reserved. ;; ;; The contents of this file are subject to the Erlang Public License, ;; Version 1.1, (the "License"); you may not use this file except in @@ -421,7 +421,7 @@ DIAMETER_INVALID_AVP_BIT_COMBO 5016 DIAMETER_NO_COMMON_SECURITY 5017 -@grouped +@grouped Proxy-Info ::= < AVP Header: 284 > { Proxy-Host } @@ -440,7 +440,7 @@ [ Auth-Application-Id ] [ Acct-Application-Id ] -;; The E2E-Sequence AVP is defined in RFC 3588 as Grouped, but +;; The E2E-Sequence AVP is defined in RFC 3588 as Grouped, but ;; there is no definition of the group - only an informal text stating ;; that there should be a nonce (an OctetString) and a counter ;; (integer) diff --git a/lib/diameter/src/transport/diameter_sctp.erl b/lib/diameter/src/transport/diameter_sctp.erl index 8b8c2a6694..49a530b4eb 100644 --- a/lib/diameter/src/transport/diameter_sctp.erl +++ b/lib/diameter/src/transport/diameter_sctp.erl @@ -42,6 +42,9 @@ -export([ports/0, ports/1]). +-export_type([listen_option/0, + connect_option/0]). + -include_lib("kernel/include/inet_sctp.hrl"). -include_lib("diameter/include/diameter.hrl"). @@ -54,6 +57,9 @@ %% The default port for a listener. -define(DEFAULT_PORT, 3868). %% RFC 3588, ch 2.1 +%% Remote addresses to accept connections from. +-define(DEFAULT_ACCEPT, []). %% any + %% How long a listener with no associations lives before offing %% itself. -define(LISTENER_TIMEOUT, 30000). @@ -62,6 +68,17 @@ %% association establishment. -define(ACCEPT_TIMEOUT, 5000). +-type connect_option() :: {raddr, inet:ip_address()} + | {rport, inet:port_number()} + | gen_sctp:open_option(). + +-type match() :: inet:ip_address() + | string() + | [match()]. + +-type listen_option() :: {accept, match()} + | gen_sctp:open_option(). + -type uint() :: non_neg_integer(). %% Accepting/connecting transport process state. @@ -69,7 +86,7 @@ {parent :: pid(), mode :: {accept, pid()} | accept - | {connect, {list(inet:ip_address()), uint(), list()}} + | {connect, {[inet:ip_address()], uint(), list()}} %% {RAs, RP, Errors} | connect, socket :: gen_sctp:sctp_socket(), @@ -86,7 +103,8 @@ tmap = ets:new(?MODULE, []) :: ets:tid(), %% {MRef, Pid|AssocId}, {AssocId, Pid} pending = {0, ets:new(?MODULE, [ordered_set])}, - tref :: reference()}). + tref :: reference(), + accept :: [match()]}). %% Field tmap is used to map an incoming message or event to the %% relevent transport process. Field pending implements a queue of %% transport processes to which an association has been assigned (at @@ -102,6 +120,13 @@ %% # start/3 %% --------------------------------------------------------------------------- +-spec start({accept, Ref}, #diameter_service{}, [listen_option()]) + -> {ok, pid(), [inet:ip_address()]} + when Ref :: diameter:transport_ref(); + ({connect, Ref}, #diameter_service{}, [connect_option()]) + -> {ok, pid(), [inet:ip_address()]} + when Ref :: diameter:transport_ref(). + start(T, #diameter_service{capabilities = Caps}, Opts) when is_list(Opts) -> diameter_sctp_sup:start(), %% start supervisors on demand @@ -169,12 +194,14 @@ init(T) -> %% A process owning a listening socket. i({listen, Ref, {Opts, Addrs}}) -> - {LAs, Sock} = AS = open(Addrs, Opts, ?DEFAULT_PORT), + {[Matches], Rest} = proplists:split(Opts, [accept]), + {LAs, Sock} = AS = open(Addrs, Rest, ?DEFAULT_PORT), proc_lib:init_ack({ok, self(), LAs}), ok = gen_sctp:listen(Sock, true), true = diameter_reg:add_new({?MODULE, listener, {Ref, AS}}), start_timer(#listener{ref = Ref, - socket = Sock}); + socket = Sock, + accept = accept(Matches)}); %% A connecting transport. i({connect, Pid, Opts, Addrs, Ref}) -> @@ -311,6 +338,9 @@ handle_call({{accept, Ref}, Pid}, _, #listener{ref = Ref, {TPid, NewS} = accept(Ref, Pid, S), {reply, {ok, TPid}, NewS#listener{count = N+1}}; +handle_call(T, From, {listener,_,_,_,_,_,_} = S) -> % started in old code + handle_call(T, From, upgrade(S)); + handle_call(_, _, State) -> {reply, nok, State}. @@ -329,7 +359,10 @@ handle_info(T, #transport{} = S) -> {noreply, #transport{} = t(T,S)}; handle_info(T, #listener{} = S) -> - {noreply, #listener{} = l(T,S)}. + {noreply, #listener{} = l(T,S)}; + +handle_info(T, {listener,_,_,_,_,_,_} = S) -> % started in old code + handle_info(T, upgrade(S)). %% --------------------------------------------------------------------------- %% # code_change/3 @@ -363,6 +396,9 @@ terminate(_, #listener{socket = Sock}) -> %% --------------------------------------------------------------------------- +upgrade(S) -> + #listener{} = erlang:append_element(S, ?DEFAULT_ACCEPT). + putr(Key, Val) -> put({?MODULE, Key}, Val). @@ -386,7 +422,7 @@ l({sctp, Sock, _RA, _RP, Data} = Msg, #listener{socket = Sock} = S) -> try find(Id, Data, S) of {TPid, NewS} -> - TPid ! {peeloff, peeloff(Sock, Id, TPid), Msg}, + TPid ! {peeloff, peeloff(Sock, Id, TPid), Msg, S#listener.accept}, NewS; false -> S @@ -460,11 +496,14 @@ t(T,S) -> %% transition/2 %% Listening process is transfering ownership of an association. -transition({peeloff, Sock, {sctp, LSock, _RA, _RP, _Data} = Msg}, +transition({peeloff, Sock, {sctp, LSock, _RA, _RP, _Data} = Msg, Matches}, #transport{mode = {accept, _}, socket = LSock} = S) -> + ok = accept_peer(Sock, Matches), transition(Msg, S#transport{socket = Sock}); +transition({peeloff = T, _Sock, _Msg} = T, #transport{} = S) ->% from old code + transition(erlang:append_element(T, ?DEFAULT_ACCEPT), S); %% Incoming message. transition({sctp, _Sock, _RA, _RP, Data}, #transport{socket = Sock} = S) -> @@ -510,6 +549,27 @@ transition({resolve_port, Pid}, #transport{socket = Sock}) %% Crash on anything unexpected. +ok({ok, T}) -> + T; +ok(T) -> + x(T). + +%% accept_peer/2 + +accept_peer(_, []) -> + ok; + +accept_peer(Sock, Matches) -> + {RAddrs, _} = ok(inet:peername(Sock)), + diameter_peer:match(RAddrs, Matches) + orelse x({accept, RAddrs, Matches}), + ok. + +%% accept/1 + +accept(Opts) -> + [[M] || {accept, M} <- Opts]. + %% accept/3 %% %% Start a new transport process or use one that's already been diff --git a/lib/diameter/src/transport/diameter_tcp.erl b/lib/diameter/src/transport/diameter_tcp.erl index cbbba714ac..4d1b8bec51 100644 --- a/lib/diameter/src/transport/diameter_tcp.erl +++ b/lib/diameter/src/transport/diameter_tcp.erl @@ -42,6 +42,9 @@ -export([ports/0, ports/1]). +-export_type([connect_option/0, + listen_option/0]). + -include_lib("diameter/include/diameter.hrl"). %% Keys into process dictionary. @@ -80,6 +83,25 @@ -type frag() :: {length(), size(), binary(), list(binary())} | binary(). +-type connect_option() :: {raddr, inet:ip_address()} + | {rport, pos_integer()} + | {ssl_options, true | [ssl:connect_option()]} + | option() + | ssl:connect_option() + | gen_tcp:connect_option(). + +-type match() :: inet:ip_address() + | string() + | [match()]. + +-type listen_option() :: {accept, match()} + | {ssl_options, true | [ssl:listen_option()]} + | ssl:listen_option() + | gen_tcp:listen_option(). + +-type option() :: {port, non_neg_integer()} + | {fragment_timer, 0..16#FFFFFFFF}. + %% Accepting/connecting transport process state. -record(transport, {socket :: inet:socket() | ssl:sslsocket(), %% accept/connect socket @@ -100,18 +122,14 @@ %% # start/3 %% --------------------------------------------------------------------------- --spec start({accept, Ref}, Svc, [Opt]) +-spec start({accept, Ref}, #diameter_service{}, [listen_option()]) -> {ok, pid(), [inet:ip_address()]} - when Ref :: diameter:transport_ref(), - Svc :: #diameter_service{}, - Opt :: diameter:transport_opt(); - ({connect, Ref}, Svc, [Opt]) + when Ref :: diameter:transport_ref(); + ({connect, Ref}, #diameter_service{}, [connect_option()]) -> {ok, pid(), [inet:ip_address()]} | {ok, pid()} - when Ref :: diameter:transport_ref(), - Svc :: #diameter_service{}, - Opt :: diameter:transport_opt(). - + when Ref :: diameter:transport_ref(). + start({T, Ref}, #diameter_service{capabilities = Caps}, Opts) -> diameter_tcp_sup:start(), %% start tcp supervisors on demand {Mod, Rest} = split(Opts), @@ -225,10 +243,10 @@ laddr([], Mod, Sock) -> Addr; laddr([{ip, Addr}], _, _) -> Addr. - + own(Opts) -> - {Own, Rest} = proplists:split(Opts, [fragment_timer]), - {lists:append(Own), Rest}. + {[Own], Rest} = proplists:split(Opts, [fragment_timer]), + {Own, Rest}. ssl(Opts) -> {[SslOpts], Rest} = proplists:split(Opts, [ssl_options]), @@ -257,9 +275,11 @@ init(Type, Ref, Mod, Pid, _, Opts, Addrs) -> %% init/6 init(accept = T, Ref, Mod, Pid, Opts, Addrs) -> - {LAddr, LSock} = listener(Ref, {Mod, Opts, Addrs}), + {[Matches], Rest} = proplists:split(Opts, [accept]), + {LAddr, LSock} = listener(Ref, {Mod, Rest, Addrs}), proc_lib:init_ack({ok, self(), [LAddr]}), Sock = ok(accept(Mod, LSock)), + ok = accept_peer(Mod, Sock, accept(Matches)), publish(Mod, T, Ref, Sock), diameter_peer:up(Pid), Sock; @@ -282,7 +302,7 @@ init_rc([]) -> up(Pid, Remote, [{ip, _Addr}], _, _) -> diameter_peer:up(Pid, Remote); -up(Pid, Remote, [], Mod, Sock) -> +up(Pid, Remote, [], Mod, Sock) -> {Addr, _Port} = ok(sockname(Mod, Sock)), diameter_peer:up(Pid, Remote, [Addr]). @@ -298,6 +318,22 @@ ok(No) -> x(Reason) -> exit({shutdown, Reason}). +%% accept_peer/3 + +accept_peer(_Mod, _Sock, []) -> + ok; + +accept_peer(Mod, Sock, Matches) -> + {RAddr, _} = ok(peername(Mod, Sock)), + diameter_peer:match([RAddr], Matches) + orelse x({accept, RAddr, Matches}), + ok. + +%% accept/1 + +accept(Opts) -> + [[M] || {accept, M} <- Opts]. + %% listener/2 listener(LRef, T) -> diff --git a/lib/diameter/test/Makefile b/lib/diameter/test/Makefile index 9719c67b32..aff1b18cf8 100644 --- a/lib/diameter/test/Makefile +++ b/lib/diameter/test/Makefile @@ -1,4 +1,4 @@ -# +# # %CopyrightBegin% # # Copyright Ericsson AB 2010-2013. All Rights Reserved. @@ -76,7 +76,7 @@ any: opt $(MAKE) -i $(SUITES) clean: - rm -f $(TARGET_FILES) + rm -f $(TARGET_FILES) rm -f depend.mk coverspec realclean: clean @@ -159,7 +159,7 @@ log: # ---------------------------------------------------- # Release Targets -# ---------------------------------------------------- +# ---------------------------------------------------- /%: % force sed -f release.sed $< > "$(RELSYSDIR)$@" diff --git a/lib/diameter/test/diameter_capx_SUITE.erl b/lib/diameter/test/diameter_capx_SUITE.erl index 8c9bb67e61..deabdd720b 100644 --- a/lib/diameter/test/diameter_capx_SUITE.erl +++ b/lib/diameter/test/diameter_capx_SUITE.erl @@ -27,6 +27,8 @@ -export([suite/0, all/0, groups/0, + init_per_suite/1, + end_per_suite/1, init_per_group/2, end_per_group/2, init_per_testcase/2, @@ -56,6 +58,11 @@ peer_down/4]). -include("diameter.hrl"). +-include("diameter_gen_base_rfc3588.hrl"). +%% Use only the Vendor-Specific-Application-Id record from the base +%% include, to test the independence of capabilities configuration +%% from the different definitions of Vendor-Id in RFC's 3588 and RFC +%% 6733. %% =========================================================================== @@ -69,6 +76,11 @@ -define(REALM, "erlang.org"). -define(HOST(Name), Name ++ "." ++ ?REALM). +%% Application id's that are never agreed upon at capabilities +%% exchange. Testcase no_common_application references them in order +%% to exercise Vendor-Specific-Application-Id handling. +-define(NOAPPS, [1111, 2222, 3333, 4444]). + %% Config for diameter:start_service/2. -define(SERVICE, [{'Origin-Realm', ?REALM}, @@ -83,7 +95,10 @@ || {A,D} <- [{base3588, diameter_gen_base_rfc3588}, {acct3588, diameter_gen_base_accounting}, {base6733, diameter_gen_base_rfc6733}, - {acct6733, diameter_gen_acct_rfc6733}]]]). + {acct6733, diameter_gen_acct_rfc6733}]]] + ++ [{application, [{dictionary, dict(N)}, + {module, not_really}]} + || N <- ?NOAPPS]). -define(A, list_to_atom). -define(L, atom_to_list). @@ -116,6 +131,16 @@ groups() -> Tc = lists:flatmap(fun tc/1, tc()), [{D, [], Tc} || D <- ?DICTS]. +init_per_suite(Config) -> + lists:foreach(fun load_dict/1, ?NOAPPS), + Config. + +end_per_suite(_Config) -> + [] = [Mod || N <- ?NOAPPS, + Mod <- [dict(N)], + false <- [code:delete(Mod)]], + ok. + %% Generate a unique hostname for each testcase so that watchdogs %% don't prevent a connection from being brought up immediately. init_per_testcase(Name, Config) -> @@ -160,7 +185,7 @@ start(_Config) -> ok = diameter:start(). %% Ensure that both integer and list-valued vendor id's can be -%% configured in a 'Vendor-Specific-Application-Id, the arity having +%% configured in a Vendor-Specific-Application-Id, the arity having %% changed between RFC 3588 and RFC 6733. vendor_id(_Config) -> [] = ?util:run([[fun vid/1, V] || V <- [1, [1], [1,2], x]]). @@ -188,13 +213,13 @@ add_listeners(Config) -> Acct = [listen(?SERVER, [{capabilities, [{'Origin-Host', ?HOST(H)}, {'Auth-Application-Id', []}]}, - {applications, [A]}, + {applications, [A | noapps()]}, {capabilities_cb, [fun server_capx/3, acct]}]) || {A,H} <- [{acct3588, "acct3588-srv"}, {acct6733, "acct6733-srv"}]], Base = [listen(?SERVER, [{capabilities, [{'Origin-Host', ?HOST(H)}]}, - {applications, A}, + {applications, A ++ noapps()}, {capabilities_cb, [fun server_capx/3, base]}]) || {A,H} <- [{[base3588, acct3588], "base3588-srv"}, {[base6733, acct6733], "base6733-srv"}]], @@ -224,15 +249,33 @@ stop(_Config) -> %% DIAMETER_NO_COMMON_APPLICATION = 5010. s_no_common_application(Config) -> - server_closed(Config, fun no_common_application/1, 5010). + Vs = [[{'Vendor-Id', 111}, + {'Auth-Application-Id', [1111]}], + #'diameter_base_Vendor-Specific-Application-Id' + {'Vendor-Id' = [222], + 'Acct-Application-Id' = [2222]}], + server_closed(Config, + fun(C) -> no_common_application(C,Vs) end, + 5010). c_no_common_application(Config) -> - client_closed(Config, "acct-srv", fun no_common_application/1, 5010). - -no_common_application(Config) -> + Vs = [#'diameter_base_Vendor-Specific-Application-Id' + {'Vendor-Id' = 333, + 'Auth-Application-Id' = [3333]}, + [{'Vendor-Id', [444]}, + {'Acct-Application-Id', [4444]}]], + client_closed(Config, + "acct-srv", + fun(C) -> no_common_application(C,Vs) end, + 5010). + +no_common_application(Config, Vs) -> [Common, _Acct] = apps(Config), - connect(Config, acct, [{capabilities, [{'Acct-Application-Id', []}]}, - {applications, [Common]}]). + connect(Config, + acct, + [{capabilities, [{'Acct-Application-Id', []}, + {'Vendor-Specific-Application-Id', Vs}]}, + {applications, [Common | noapps()]}]). %% ==================== %% Ask the base server to speak accounting with an unknown security @@ -324,6 +367,25 @@ client_reject(Config) -> %% =========================================================================== +noapps() -> + lists:map(fun dict/1, ?NOAPPS). + +dict(N) -> + ?A(?L(?MODULE) ++ "_" ++ integer_to_list(N)). + +%% Compile and load minimal dictionary modules. These actually have to +%% exists since diameter will call their id/0 to extract application +%% id's, failing with app_not_configured if it can't. +load_dict(N) -> + Mod = dict(N), + Forms = [{attribute, 1, module, Mod}, + {attribute, 2, compile, [export_all]}, + {function, 3, id, 0, + [{clause, 4, [], [], [{integer, 4, N}]}]}], + {ok, Mod, Bin, []} = compile:forms(Forms, [return]), + {module, Mod} = code:load_binary(Mod, Mod, Bin), + N = Mod:id(). + %% server_closed/3 server_closed(Config, F, RC) -> diff --git a/lib/diameter/test/diameter_codec_SUITE.erl b/lib/diameter/test/diameter_codec_SUITE.erl index 2e219bbb10..cd8ca41f66 100644 --- a/lib/diameter/test/diameter_codec_SUITE.erl +++ b/lib/diameter/test/diameter_codec_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2010-2011. All Rights Reserved. +%% Copyright Ericsson AB 2010-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/diameter/test/diameter_codec_SUITE_data/diameter_test_unknown.erl b/lib/diameter/test/diameter_codec_SUITE_data/diameter_test_unknown.erl index 49f2158b1a..cdf0cf55e1 100644 --- a/lib/diameter/test/diameter_codec_SUITE_data/diameter_test_unknown.erl +++ b/lib/diameter/test/diameter_codec_SUITE_data/diameter_test_unknown.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2010-2011. All Rights Reserved. +%% Copyright Ericsson AB 2010-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/diameter/test/diameter_examples_SUITE.erl b/lib/diameter/test/diameter_examples_SUITE.erl index 1954bc319b..75b542b679 100644 --- a/lib/diameter/test/diameter_examples_SUITE.erl +++ b/lib/diameter/test/diameter_examples_SUITE.erl @@ -149,7 +149,7 @@ to_erl(File, Opts) -> No -> throw({make, No}) end. - + to_beam(Name) -> case compile:file(Name ++ ".erl", [return]) of {ok, _, _} -> diff --git a/lib/diameter/test/diameter_traffic_SUITE.erl b/lib/diameter/test/diameter_traffic_SUITE.erl index 38bdf55af8..a97c54fc04 100644 --- a/lib/diameter/test/diameter_traffic_SUITE.erl +++ b/lib/diameter/test/diameter_traffic_SUITE.erl @@ -171,7 +171,8 @@ {'Product-Name', "OTP/diameter"}, {'Auth-Application-Id', [?DIAMETER_APP_ID_COMMON]}, {'Acct-Application-Id', [?DIAMETER_APP_ID_ACCOUNTING]}, - {restrict_connections, false} + {restrict_connections, false}, + {spawn_opt, [{min_heap_size, 5000}]} | [{application, [{dictionary, D}, {module, ?MODULE}, {answer_errors, callback}]} @@ -321,6 +322,7 @@ add_transports(Config) -> LRef = ?util:listen(?SERVER, tcp, [{capabilities_cb, fun capx/2}, + {spawn_opt, [{min_heap_size, 8096}]}, {applications, apps(rfc3588)}]), Cs = [?util:connect(?CLIENT, tcp, diff --git a/lib/diameter/test/diameter_transport_SUITE.erl b/lib/diameter/test/diameter_transport_SUITE.erl index 97f4cec11f..9408fae62c 100644 --- a/lib/diameter/test/diameter_transport_SUITE.erl +++ b/lib/diameter/test/diameter_transport_SUITE.erl @@ -180,12 +180,13 @@ reconnect({listen, Ref}) -> [_] = diameter_reg:wait({diameter_tcp, listener, {LRef, '_'}}), true = diameter_reg:add_new({?MODULE, Ref, LRef}), - %% Wait for partner to request transport death: kill to force the - %% peer to reconnect. + %% Wait for partner to request transport death. TPid = abort(SvcName, LRef, Ref), + %% Kill transport to force the peer to reconnect. exit(TPid, kill), + %% Wait for the partner again. abort(SvcName, LRef, Ref); reconnect({connect, Ref}) -> @@ -200,7 +201,7 @@ reconnect({connect, Ref}) -> %% reconnection attempts. abort(SvcName, Pid, Ref), - %% Transport does down and is reestablished. + %% Transport goes down and is reestablished. ?RECV(#diameter_event{service = SvcName, info = {down, CRef, _, _}}), ?RECV(#diameter_event{service = SvcName, info = {reconnect, CRef, _}}), ?RECV(#diameter_event{service = SvcName, info = {up, CRef, _, _, _}}), diff --git a/lib/diameter/test/diameter_util.erl b/lib/diameter/test/diameter_util.erl index aa489fef5f..92c72c84e7 100644 --- a/lib/diameter/test/diameter_util.erl +++ b/lib/diameter/test/diameter_util.erl @@ -336,7 +336,7 @@ opts(Prot, T) -> {transport_config, [{ip, ?ADDR}, {port, 0} | opts(T)]}]. opts(listen) -> - []; + [{accept, M} || M <- [{256,0,0,1}, ["256.0.0.1", ["^.+$"]]]]; opts(PortNr) -> [{raddr, ?ADDR}, {rport, PortNr}]. diff --git a/lib/diameter/vsn.mk b/lib/diameter/vsn.mk index 757f29a32e..f7462c3916 100644 --- a/lib/diameter/vsn.mk +++ b/lib/diameter/vsn.mk @@ -18,5 +18,5 @@ # %CopyrightEnd% APPLICATION = diameter -DIAMETER_VSN = 1.4.1.1 +DIAMETER_VSN = 1.4.2 APP_VSN = $(APPLICATION)-$(DIAMETER_VSN)$(PRE_VSN) diff --git a/lib/erl_interface/aclocal.m4 b/lib/erl_interface/aclocal.m4 index 25f40944e7..46b30a16b3 100644 --- a/lib/erl_interface/aclocal.m4 +++ b/lib/erl_interface/aclocal.m4 @@ -954,6 +954,40 @@ dnl AC_DEFUN(ERL_FIND_ETHR_LIB, [ +AC_ARG_ENABLE(native-ethr-impls, + AS_HELP_STRING([--disable-native-ethr-impls], + [disable native ethread implementations]), +[ case "$enableval" in + no) disable_native_ethr_impls=yes ;; + *) disable_native_ethr_impls=no ;; + esac ], disable_native_ethr_impls=no) + +test "X$disable_native_ethr_impls" = "Xyes" && + AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) + +AC_ARG_ENABLE(x86-out-of-order, + AS_HELP_STRING([--enable-x86-out-of-order], + [enable x86/x84_64 out of order support (default disabled)])) + +AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, + AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], + [prefer gcc native ethread implementations]), +[ case "$enableval" in + yes) enable_prefer_gcc_native_ethr_impls=yes ;; + *) enable_prefer_gcc_native_ethr_impls=no ;; + esac ], enable_prefer_gcc_native_ethr_impls=no) + +test $enable_prefer_gcc_native_ethr_impls = yes && + AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) + +AC_ARG_WITH(libatomic_ops, + AS_HELP_STRING([--with-libatomic_ops=PATH], + [specify and prefer usage of libatomic_ops in the ethread library])) + +AC_ARG_WITH(with_sparc_memory_order, + AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], + [specify sparc memory order (defaults to RMO)])) + LM_CHECK_THR_LIB ERL_INTERNAL_LIBS @@ -1003,40 +1037,44 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads]) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) - + if test "X$disable_native_ethr_impls" = "Xyes"; then + have_interlocked_op=no + ethr_have_native_atomics=no + else + ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) + fi test "$ethr_have_native_atomics" = "yes" && ethr_have_native_spinlock=yes ;; @@ -1303,93 +1341,98 @@ case "$THR_LIB_NAME" in int128="__int128_t" fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + if test "X$disable_native_ethr_impls" = "Xyes"; then + ethr_have_native_atomics=no + else + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + + if test $int128 != no; then + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) + fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + AC_MSG_CHECKING([for a usable libatomic_ops implementation]) + case "x$with_libatomic_ops" in + xno | xyes | x) + libatomic_ops_include= + ;; + *) + if test -d "${with_libatomic_ops}/include"; then + libatomic_ops_include="-I$with_libatomic_ops/include" + CPPFLAGS="$CPPFLAGS $libatomic_ops_include" + else + AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) + fi;; + esac + ethr_have_libatomic_ops=no + AC_TRY_LINK([#include "atomic_ops.h"], + [ + volatile AO_t x; + AO_t y; + int z; + + AO_nop_full(); + AO_store(&x, (AO_t) 0); + z = AO_load(&x); + z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); + ], + [ethr_have_native_atomics=yes + ethr_have_libatomic_ops=yes]) + AC_MSG_RESULT([$ethr_have_libatomic_ops]) + if test $ethr_have_libatomic_ops = yes; then + AC_CHECK_SIZEOF(AO_t, , + [ + #include <stdio.h> + #include "atomic_ops.h" + ]) + AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) + + AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) + if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) + fi + ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" + elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_MSG_ERROR([No usable libatomic_ops implementation found]) + fi - if test $int128 != no; then - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) - fi + case "$host_cpu" in + sparc | sun4u | sparc64 | sun4v) + case "$with_sparc_memory_order" in + "TSO") + AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; + "PSO") + AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; + "RMO"|"") + AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; + *) + AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; + esac + ethr_have_native_atomics=yes;; + i86pc | i*86 | x86_64 | amd64) + if test "$enable_x86_out_of_order" = "yes"; then + AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) + fi + ethr_have_native_atomics=yes;; + macppc | ppc | powerpc | "Power Macintosh") + ethr_have_native_atomics=yes;; + tile) + ethr_have_native_atomics=yes;; + *) + ;; + esac - AC_MSG_CHECKING([for a usable libatomic_ops implementation]) - case "x$with_libatomic_ops" in - xno | xyes | x) - libatomic_ops_include= - ;; - *) - if test -d "${with_libatomic_ops}/include"; then - libatomic_ops_include="-I$with_libatomic_ops/include" - CPPFLAGS="$CPPFLAGS $libatomic_ops_include" - else - AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) - fi;; - esac - ethr_have_libatomic_ops=no - AC_TRY_LINK([#include "atomic_ops.h"], - [ - volatile AO_t x; - AO_t y; - int z; - - AO_nop_full(); - AO_store(&x, (AO_t) 0); - z = AO_load(&x); - z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); - ], - [ethr_have_native_atomics=yes - ethr_have_libatomic_ops=yes]) - AC_MSG_RESULT([$ethr_have_libatomic_ops]) - if test $ethr_have_libatomic_ops = yes; then - AC_CHECK_SIZEOF(AO_t, , - [ - #include <stdio.h> - #include "atomic_ops.h" - ]) - AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) - - AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) - if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) - fi - ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" - elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_MSG_ERROR([No usable libatomic_ops implementation found]) fi - case "$host_cpu" in - sparc | sun4u | sparc64 | sun4v) - case "$with_sparc_memory_order" in - "TSO") - AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; - "PSO") - AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; - "RMO"|"") - AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; - *) - AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; - esac - ethr_have_native_atomics=yes;; - i86pc | i*86 | x86_64 | amd64) - if test "$enable_x86_out_of_order" = "yes"; then - AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) - fi - ethr_have_native_atomics=yes;; - macppc | ppc | "Power Macintosh") - ethr_have_native_atomics=yes;; - tile) - ethr_have_native_atomics=yes;; - *) - ;; - esac - test ethr_have_native_atomics = "yes" && ethr_have_native_spinlock=yes dnl Restore LIBS @@ -1451,40 +1494,6 @@ esac AC_C_DOUBLE_MIDDLE_ENDIAN -AC_ARG_ENABLE(native-ethr-impls, - AS_HELP_STRING([--disable-native-ethr-impls], - [disable native ethread implementations]), -[ case "$enableval" in - no) disable_native_ethr_impls=yes ;; - *) disable_native_ethr_impls=no ;; - esac ], disable_native_ethr_impls=no) - -AC_ARG_ENABLE(x86-out-of-order, - AS_HELP_STRING([--enable-x86-out-of-order], - [enable x86/x84_64 out of order support (default disabled)])) - -test "X$disable_native_ethr_impls" = "Xyes" && - AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) - -AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, - AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], - [prefer gcc native ethread implementations]), -[ case "$enableval" in - yes) enable_prefer_gcc_native_ethr_impls=yes ;; - *) enable_prefer_gcc_native_ethr_impls=no ;; - esac ], enable_prefer_gcc_native_ethr_impls=no) - -test $enable_prefer_gcc_native_ethr_impls = yes && - AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) - -AC_ARG_WITH(libatomic_ops, - AS_HELP_STRING([--with-libatomic_ops=PATH], - [specify and prefer usage of libatomic_ops in the ethread library])) - -AC_ARG_WITH(with_sparc_memory_order, - AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], - [specify sparc memory order (defaults to RMO)])) - ETHR_X86_SSE2_ASM=no case "$GCC-$ac_cv_sizeof_void_p-$host_cpu" in yes-4-i86pc | yes-4-i*86 | yes-4-x86_64 | yes-4-amd64) diff --git a/lib/erl_interface/doc/src/notes.xml b/lib/erl_interface/doc/src/notes.xml index 4c0267c264..2fdc839c7b 100644 --- a/lib/erl_interface/doc/src/notes.xml +++ b/lib/erl_interface/doc/src/notes.xml @@ -30,6 +30,22 @@ </header> <p>This document describes the changes made to the Erl_interface application.</p> +<section><title>Erl_Interface 3.7.13</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + A guard was added to check if file descriptor is valid + before closing it.</p> + <p> + Own Id: OTP-11167</p> + </item> + </list> + </section> + +</section> + <section><title>Erl_Interface 3.7.12</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/erl_interface/vsn.mk b/lib/erl_interface/vsn.mk index 9287e105df..6f08d380ca 100644 --- a/lib/erl_interface/vsn.mk +++ b/lib/erl_interface/vsn.mk @@ -1 +1 @@ -EI_VSN = 3.7.12 +EI_VSN = 3.7.13 diff --git a/lib/et/doc/src/et_desc.xmlsrc b/lib/et/doc/src/et_desc.xmlsrc index 36274f6316..68017b972e 100644 --- a/lib/et/doc/src/et_desc.xmlsrc +++ b/lib/et/doc/src/et_desc.xmlsrc @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2002</year><year>2010</year> + <year>2002</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/et/doc/src/notes.xml b/lib/et/doc/src/notes.xml index 8d9675b801..d45d0a89bf 100644 --- a/lib/et/doc/src/notes.xml +++ b/lib/et/doc/src/notes.xml @@ -36,6 +36,29 @@ one section in this document. The title of each section is the version number of <c>Event Tracer (ET)</c>.</p> +<section><title>ET 1.4.4.4</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Use erlang:demonitor(Ref, [flush]) where applicable. + Thanks to Lo�c Hoguin.</p> + <p> + Own Id: OTP-11039</p> + </item> + <item> + <p> + Rename and document lists:zf/2 as lists:filtermap/2. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11078</p> + </item> + </list> + </section> + +</section> + <section><title>ET 1.4.4.3</title> <section><title>Improvements and New Features</title> diff --git a/lib/et/src/et_collector.erl b/lib/et/src/et_collector.erl index ce8cf6d4e0..a78b30c419 100644 --- a/lib/et/src/et_collector.erl +++ b/lib/et/src/et_collector.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2000-2010. All Rights Reserved. +%% Copyright Ericsson AB 2000-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/et/vsn.mk b/lib/et/vsn.mk index 99532ee3f3..40cdc2b298 100644 --- a/lib/et/vsn.mk +++ b/lib/et/vsn.mk @@ -1 +1 @@ -ET_VSN = 1.4.4.3 +ET_VSN = 1.4.4.4 diff --git a/lib/hipe/doc/src/hipe_app.xml b/lib/hipe/doc/src/hipe_app.xml index 9a1aa943d4..0612392c3f 100644 --- a/lib/hipe/doc/src/hipe_app.xml +++ b/lib/hipe/doc/src/hipe_app.xml @@ -4,7 +4,7 @@ <appref> <header> <copyright> - <year>1997</year><year>2010</year> + <year>1997</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/hipe/doc/src/notes.xml b/lib/hipe/doc/src/notes.xml index 73ab1dbfda..b3c41bd396 100644 --- a/lib/hipe/doc/src/notes.xml +++ b/lib/hipe/doc/src/notes.xml @@ -30,6 +30,36 @@ </header> <p>This document describes the changes made to HiPE.</p> +<section><title>Hipe 3.10.2</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Fix the title of hipe_app documentation page. Thanks to + Lo�c Hoguin.</p> + <p> + Own Id: OTP-10904</p> + </item> + <item> + <p> + Fix native code compiler crash involving bs_match_string. + Thanks to Kostis Sagonas.</p> + <p> + Own Id: OTP-10985</p> + </item> + <item> + <p> + Loosen the assumptions of code that handles escaping + functions. Thanks to Kostis Sagonas</p> + <p> + Own Id: OTP-11031</p> + </item> + </list> + </section> + +</section> + <section><title>Hipe 3.10.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/hipe/icode/Makefile b/lib/hipe/icode/Makefile index 238f70cf59..87015aa51c 100644 --- a/lib/hipe/icode/Makefile +++ b/lib/hipe/icode/Makefile @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2001-2012. All Rights Reserved. +# Copyright Ericsson AB 2001-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/icode/hipe_icode.erl b/lib/hipe/icode/hipe_icode.erl index dfea092af2..6d4758bbf1 100644 --- a/lib/hipe/icode/hipe_icode.erl +++ b/lib/hipe/icode/hipe_icode.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2010. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/icode/hipe_icode.hrl b/lib/hipe/icode/hipe_icode.hrl index 89d297ef01..060493e61e 100644 --- a/lib/hipe/icode/hipe_icode.hrl +++ b/lib/hipe/icode/hipe_icode.hrl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2004-2012. All Rights Reserved. +%% Copyright Ericsson AB 2004-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/icode/hipe_icode_callgraph.erl b/lib/hipe/icode/hipe_icode_callgraph.erl index 6d004823e2..5789328f47 100644 --- a/lib/hipe/icode/hipe_icode_callgraph.erl +++ b/lib/hipe/icode/hipe_icode_callgraph.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2004-2011. All Rights Reserved. +%% Copyright Ericsson AB 2004-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/icode/hipe_icode_range.erl b/lib/hipe/icode/hipe_icode_range.erl index 46c5a39f2c..1a2cbfae31 100644 --- a/lib/hipe/icode/hipe_icode_range.erl +++ b/lib/hipe/icode/hipe_icode_range.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2011. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl b/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl index 718d5d442b..2337ef9323 100644 --- a/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl +++ b/lib/hipe/icode/hipe_icode_ssa_struct_reuse.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/regalloc/hipe_ls_regalloc.erl b/lib/hipe/regalloc/hipe_ls_regalloc.erl index 7fb65be6a0..4276b8f968 100644 --- a/lib/hipe/regalloc/hipe_ls_regalloc.erl +++ b/lib/hipe/regalloc/hipe_ls_regalloc.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/rtl/Makefile b/lib/hipe/rtl/Makefile index 0312e67822..751e87636a 100644 --- a/lib/hipe/rtl/Makefile +++ b/lib/hipe/rtl/Makefile @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2001-2012. All Rights Reserved. +# Copyright Ericsson AB 2001-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/hipe/vsn.mk b/lib/hipe/vsn.mk index 6cd87708ef..deb16b02fd 100644 --- a/lib/hipe/vsn.mk +++ b/lib/hipe/vsn.mk @@ -1 +1 @@ -HIPE_VSN = 3.10.1 +HIPE_VSN = 3.10.2 diff --git a/lib/ic/doc/src/notes.xml b/lib/ic/doc/src/notes.xml index 92cc7cab7a..c93528ace4 100644 --- a/lib/ic/doc/src/notes.xml +++ b/lib/ic/doc/src/notes.xml @@ -30,7 +30,23 @@ <file>notes.xml</file> </header> - <section><title>IC 4.3.1</title> + <section><title>IC 4.3.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fixed some compilation warnings on miscellaneous + platforms. Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11086</p> + </item> + </list> + </section> + +</section> + +<section><title>IC 4.3.1</title> <section><title>Fixed Bugs and Malfunctions</title> <list> diff --git a/lib/ic/src/icparse.yrl b/lib/ic/src/icparse.yrl index b0286d57f4..420067fa09 100644 --- a/lib/ic/src/icparse.yrl +++ b/lib/ic/src/icparse.yrl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2010. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/ic/vsn.mk b/lib/ic/vsn.mk index 9fd8aedb63..53b81ad731 100644 --- a/lib/ic/vsn.mk +++ b/lib/ic/vsn.mk @@ -1 +1 @@ -IC_VSN = 4.3.1 +IC_VSN = 4.3.2 diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml index 525beecd31..d2e7ade5d6 100644 --- a/lib/inets/doc/src/notes.xml +++ b/lib/inets/doc/src/notes.xml @@ -32,9 +32,66 @@ <file>notes.xml</file> </header> - - <section><title>Inets 5.9.4</title> + <section><title>Inets 5.9.5</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Reverted incorrect commit that broke cookie handling when + using httpc-profiles.</p> + <p> + Own Id: OTP-10956</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Fix http_request:http_headers/1 to send content-length + when length is zero. Thanks to CA Meijer.</p> + <p> + Own Id: OTP-10934</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + <item> + <p> + Fix {stream, {self, once}} in httpc to work as expected. + Thanks to Masatake Daimon</p> + <p> + Own Id: OTP-11122</p> + </item> + </list> + </section> +</section> + +<section><title>Inets 5.9.4</title> <section><title>Improvements and New Features</title> <list> <item> @@ -102,6 +159,19 @@ </section> +<section><title>Inets 5.9.2.1</title> + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Fixed obsolete error report in inets.</p> + <p> + Own Id: OTP-11185 Aux Id: seq12357 </p> + </item> + </list> + </section> +</section> + <section><title>Inets 5.9.2</title> <section><title>Improvements and New Features</title> diff --git a/lib/inets/src/ftp/ftp.erl b/lib/inets/src/ftp/ftp.erl index 132a384a49..5d9887a9a4 100644 --- a/lib/inets/src/ftp/ftp.erl +++ b/lib/inets/src/ftp/ftp.erl @@ -1417,7 +1417,7 @@ handle_info({'DOWN', _Ref, _Type, Process, Reason}, State) -> handle_info({'EXIT', Pid, Reason}, #state{progress = Pid} = State) -> Report = io_lib:format("Progress reporting stopped for reason ~p~n", - Reason), + [Reason]), error_logger:info_report(Report), {noreply, State#state{progress = ignore}}; diff --git a/lib/inets/src/http_client/httpc.erl b/lib/inets/src/http_client/httpc.erl index 64a60b82aa..4d7023a8e9 100644 --- a/lib/inets/src/http_client/httpc.erl +++ b/lib/inets/src/http_client/httpc.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2009-2012. All Rights Reserved. +%% Copyright Ericsson AB 2009-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -175,7 +175,7 @@ request(Method, request(Method, {Url, Headers, ContentType, Body}, HTTPOptions, Options, Profile) - when ((Method =:= post) orelse (Method =:= put)) andalso + when ((Method =:= post) orelse (Method =:= put) orelse (Method =:= delete)) andalso (is_atom(Profile) orelse is_pid(Profile)) -> ?hcrt("request", [{method, Method}, {url, Url}, diff --git a/lib/inets/src/http_lib/http_chunk.erl b/lib/inets/src/http_lib/http_chunk.erl index 24c939e80c..d15d7ba49a 100644 --- a/lib/inets/src/http_lib/http_chunk.erl +++ b/lib/inets/src/http_lib/http_chunk.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2004-2011. All Rights Reserved. +%% Copyright Ericsson AB 2004-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/inets/src/http_lib/http_request.erl b/lib/inets/src/http_lib/http_request.erl index fbfbe7c632..aa9f9f6774 100644 --- a/lib/inets/src/http_lib/http_request.erl +++ b/lib/inets/src/http_lib/http_request.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% Copyright Ericsson AB 2005-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/inets/src/http_server/httpd_manager.erl b/lib/inets/src/http_server/httpd_manager.erl index c83d06a158..00384fa108 100644 --- a/lib/inets/src/http_server/httpd_manager.erl +++ b/lib/inets/src/http_server/httpd_manager.erl @@ -507,37 +507,8 @@ code_change(_FromVsn, State, _Extra) -> check_connections(#state{connections = []} = State, _Pid, _Reason) -> State; -check_connections(#state{admin_state = shutting_down, - connections = Connections} = State, Pid, Reason) -> - %% Could be a crashing request handler - case lists:delete(Pid, Connections) of - [] -> % Crashing request handler => block complete - String = - lists:flatten( - io_lib:format("request handler (~p) crashed:" - "~n ~p", [Pid, Reason])), - report_error(State, String), - demonitor_blocker(State#state.blocker_ref), - {Tmr,From,Ref} = State#state.blocking_tmr, - stop_block_tmr(Tmr), - From ! {block_reply,ok,Ref}, - State#state{admin_state = blocked, connections = [], - blocker_ref = undefined}; - Connections1 -> - State#state{connections = Connections1} - end; -check_connections(#state{connections = Connections} = State, Pid, Reason) -> - case lists:delete(Pid, Connections) of - Connections -> % Not a request handler, so ignore - State; - NewConnections -> - String = - lists:flatten( - io_lib:format("request handler (~p) crashed:" - "~n ~p", [Pid, Reason])), - report_error(State, String), - State#state{connections = NewConnections} - end. +check_connections(#state{connections = Connections} = State, Pid, _Reason) -> + State#state{connections = lists:delete(Pid, Connections)}. %% ------------------------------------------------------------------------- diff --git a/lib/inets/test/http_format_SUITE.erl b/lib/inets/test/http_format_SUITE.erl index c913964094..c5920a3968 100644 --- a/lib/inets/test/http_format_SUITE.erl +++ b/lib/inets/test/http_format_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2004-2011. All Rights Reserved. +%% Copyright Ericsson AB 2004-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/inets/test/httpc_proxy_SUITE.erl b/lib/inets/test/httpc_proxy_SUITE.erl index 84db39e76b..ddd23d0c65 100644 --- a/lib/inets/test/httpc_proxy_SUITE.erl +++ b/lib/inets/test/httpc_proxy_SUITE.erl @@ -69,6 +69,7 @@ local_proxy_cases() -> http_post, http_put, http_delete, + http_delete_body, http_headers, http_proxy_auth, http_doesnotexist, @@ -262,6 +263,22 @@ http_delete(Config) when is_list(Config) -> %%-------------------------------------------------------------------- +http_delete_body(doc) -> + ["Perform a DELETE request with a content body. The server will not allow it " + "but we only test sending the request."]; +http_delete_body(Config) when is_list(Config) -> + Method = delete, + URL = url("/delete.html", Config), + Content = "foo=bar", + Request = {URL,[],"application/x-www-form-urlencoded",Content}, + HttpOpts = [], + Opts = [], + {ok,{{_,405,_},[_|_],[_|_]}} = + httpc:request(Method, Request, HttpOpts, Opts), + ok. + +%%-------------------------------------------------------------------- + http_headers(doc) -> ["Use as many request headers as possible"]; http_headers(Config) when is_list(Config) -> diff --git a/lib/inets/vsn.mk b/lib/inets/vsn.mk index f5abaf9764..3f464c8684 100644 --- a/lib/inets/vsn.mk +++ b/lib/inets/vsn.mk @@ -18,7 +18,7 @@ # %CopyrightEnd% APPLICATION = inets -INETS_VSN = 5.9.4 +INETS_VSN = 5.9.5 PRE_VSN = APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)" diff --git a/lib/kernel/doc/src/notes.xml b/lib/kernel/doc/src/notes.xml index c18ae897b4..0175c38397 100644 --- a/lib/kernel/doc/src/notes.xml +++ b/lib/kernel/doc/src/notes.xml @@ -30,6 +30,91 @@ </header> <p>This document describes the changes made to the Kernel application.</p> +<section><title>Kernel 2.16.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + A bug in prim_inet has been corrected. If the port owner + was killed at a bad time while closing the socket port + the port could become orphaned hence causing port and + socket leaking. Reported by Fred Herbert, Dmitry Belyaev + and others.</p> + <p> + Own Id: OTP-10497 Aux Id: OTP-10562 </p> + </item> + <item> + <p> + A few bugs regarding case sensitivity for hostname + resolution while using e.g the internal lookup types + 'file' and 'dns' has been corrected. When looking up + hostnames ASCII letters a-z are to be regarded as the + same as A-Z according to RFC 4343 "Domain Name System + (DNS) Case Insensitivity Clarification", and this was not + always the case.</p> + <p> + Own Id: OTP-10689 Aux Id: seq12227 </p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Add <c>application:ensure_started/1,2</c>. It is + equivavlent to <c>application:start/1,2</c> except it + returns <c>ok</c> for already started applications.</p> + <p> + Own Id: OTP-10910</p> + </item> + <item> + <p> + Optimize communication with file io server. Thanks to + Anthony Ramine.</p> + <p> + Own Id: OTP-11040</p> + </item> + <item> + <p>Erlang source files with non-ASCII characters are now + encoded in UTF-8 (instead of latin1).</p> + <p> + Own Id: OTP-11041 Aux Id: OTP-10907 </p> + </item> + <item> + <p> + Optimization of simultaneous <c>inet_db</c> operations on + the same socket by using a lock free implementation.</p> + <p> + Impact on the characteristics of the system: Improved + performance.</p> + <p> + Own Id: OTP-11074</p> + </item> + <item> + <p> + The <c>high_msgq_watermark</c> and + <c>low_msgq_watermark</c> <c>inet</c> socket options + introduced in OTP-R16A could only be set on TCP sockets. + These options are now generic and can be set on all types + of sockets.</p> + <p> + Own Id: OTP-11075 Aux Id: OTP-10336 </p> + </item> + <item> + <p> + Fix deep list argument error under Windows in os:cmd/1. + Thanks to Aleksandr Vinokurov .</p> + <p> + Own Id: OTP-11104</p> + </item> + </list> + </section> + +</section> + <section><title>Kernel 2.16.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/kernel/src/application_master.erl b/lib/kernel/src/application_master.erl index 34a3efcaf2..3e636197bb 100644 --- a/lib/kernel/src/application_master.erl +++ b/lib/kernel/src/application_master.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2009. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/file_io_server.erl b/lib/kernel/src/file_io_server.erl index 07fb55f390..0bcb1a658b 100644 --- a/lib/kernel/src/file_io_server.erl +++ b/lib/kernel/src/file_io_server.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2000-2012. All Rights Reserved. +%% Copyright Ericsson AB 2000-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/gen_sctp.erl b/lib/kernel/src/gen_sctp.erl index acc116df84..58d84ae924 100644 --- a/lib/kernel/src/gen_sctp.erl +++ b/lib/kernel/src/gen_sctp.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2012. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/gen_udp.erl b/lib/kernel/src/gen_udp.erl index fb5737f82e..e82b11d2ef 100644 --- a/lib/kernel/src/gen_udp.erl +++ b/lib/kernel/src/gen_udp.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl index aada1252ad..3ea530a366 100644 --- a/lib/kernel/src/inet.erl +++ b/lib/kernel/src/inet.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -947,21 +947,34 @@ gethostbyname_self(Name, Type) when is_atom(Name) -> gethostbyname_self(Name, Type) when is_list(Name), Type =:= inet; is_list(Name), Type =:= inet6 -> - case inet_db:gethostname() of - Name -> - {ok,make_hostent(Name, - [translate_ip(loopback, Type)], - [], Type)}; - Self -> + N = inet_db:tolower(Name), + Self = inet_db:gethostname(), + %% + %% This is the final fallback that pretends /etc/hosts has got + %% a line for the hostname on the loopback address. + %% Lookups into /etc/hosts are case insensitive and return + %% what is in the file. Therefore the letter case may differ between + %% the returned hostent record and the hostname that was asked for. + %% + case inet_db:tolower(Self) of + N -> + {ok, + make_hostent( + Self, [translate_ip(loopback, Type)], [], Type)}; + _ -> case inet_db:res_option(domain) of - "" -> {error,nxdomain}; + "" -> + {error,nxdomain}; Domain -> - case lists:append([Self,".",Domain]) of - Name -> - {ok,make_hostent(Name, - [translate_ip(loopback, Type)], - [], Type)}; - _ -> {error,nxdomain} + FQDN = lists:append([Self,".",Domain]), + case inet_db:tolower(FQDN) of + N -> + {ok, + make_hostent( + FQDN, + [translate_ip(loopback, Type)], [], Type)}; + _ -> + {error,nxdomain} end end end; diff --git a/lib/kernel/src/inet_db.erl b/lib/kernel/src/inet_db.erl index d4749b9756..a7679c531b 100644 --- a/lib/kernel/src/inet_db.erl +++ b/lib/kernel/src/inet_db.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2010. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -845,7 +845,8 @@ init([]) -> process_flag(trap_exit, true), Db = ets:new(inet_db, [public, named_table]), reset_db(Db), - Cache = ets:new(inet_cache, [public, bag, {keypos,2}, named_table]), + CacheOpts = [public, bag, {keypos,#dns_rr.domain}, named_table], + Cache = ets:new(inet_cache, CacheOpts), BynameOpts = [protected, bag, named_table, {keypos,1}], ByaddrOpts = [protected, bag, named_table, {keypos,3}], HostsByname = ets:new(inet_hosts_byname, BynameOpts), @@ -901,15 +902,21 @@ reset_db(Db) -> handle_call(Request, From, #state{db=Db}=State) -> case Request of {load_hosts_file,IPNmAs} when is_list(IPNmAs) -> - NIPs = lists:flatten([ [{N,if tuple_size(IP) =:= 4 -> inet; - tuple_size(IP) =:= 8 -> inet6 - end,IP} || N <- [Nm|As]] - || {IP,Nm,As} <- IPNmAs]), + NIPs = + lists:flatten( + [ [{N, + if tuple_size(IP) =:= 4 -> inet; + tuple_size(IP) =:= 8 -> inet6 + end,IP} || N <- [Nm|As]] + || {IP,Nm,As} <- IPNmAs]), Byname = State#state.hosts_file_byname, Byaddr = State#state.hosts_file_byaddr, ets:delete_all_objects(Byname), ets:delete_all_objects(Byaddr), - ets:insert(Byname, NIPs), + %% Byname has lowercased names while Byaddr keep the name casing. + %% This is to be able to reconstruct the original + %% /etc/hosts entry. + ets:insert(Byname, [{tolower(N),Type,IP} || {N,Type,IP} <- NIPs]), ets:insert(Byaddr, NIPs), {reply, ok, State}; @@ -938,16 +945,14 @@ handle_call(Request, From, #state{db=Db}=State) -> {reply, ok, State}; {add_rr, RR} when is_record(RR, dns_rr) -> - RR1 = lower_rr(RR), - ?dbg("add_rr: ~p~n", [RR1]), - do_add_rr(RR1, Db, State), + ?dbg("add_rr: ~p~n", [RR]), + do_add_rr(RR, Db, State), {reply, ok, State}; {del_rr, RR} when is_record(RR, dns_rr) -> - RR1 = lower_rr(RR), %% note. del_rr will handle wildcards !!! Cache = State#state.cache, - ets:match_delete(Cache, RR1), + ets:match_delete(Cache, RR), {reply, ok, State}; {lookup_rr, Domain, Class, Type} -> @@ -1225,15 +1230,18 @@ handle_set_file(ParseFun, Bin, From, State) -> handle_rc_list(Opts, From, State) end. +%% Byname has lowercased names while Byaddr keep the name casing. +%% This is to be able to reconstruct the original /etc/hosts entry. + do_add_host(Byname, Byaddr, Names, Type, IP) -> do_del_host(Byname, Byaddr, IP), - NIPs = [{tolower(N),Type,IP} || N <- Names], - ets:insert(Byname, NIPs), - ets:insert(Byaddr, NIPs), + ets:insert(Byname, [{tolower(N),Type,IP} || N <- Names]), + ets:insert(Byaddr, [{N,Type,IP} || N <- Names]), ok. do_del_host(Byname, Byaddr, IP) -> - [ets:delete_object(Byname, NIP) || NIP <- ets:lookup(Byaddr, IP)], + [ets:delete_object(Byname, {tolower(Name),Type,Addr}) || + {Name,Type,Addr} <- ets:lookup(Byaddr, IP)], ets:delete(Byaddr, IP), ok. @@ -1369,7 +1377,7 @@ times() -> %% lookup and remove old entries do_lookup_rr(Domain, Class, Type) -> - match_rr(#dns_rr{domain = tolower(Domain), class = Class,type = Type, + match_rr(#dns_rr{domain = Domain, class = Class,type = Type, cnt = '_', tm = '_', ttl = '_', bm = '_', func = '_', data = '_'}). @@ -1393,23 +1401,20 @@ filter_rr([], _Time) -> []. %% -%% Lower case the domain name before storage -%% -lower_rr(RR) -> - Dn = RR#dns_rr.domain, - if is_list(Dn) -> - RR#dns_rr { domain = tolower(Dn) }; - true -> RR - end. - +%% Case fold upper-case to lower-case according to RFC 4343 +%% "Domain Name System (DNS) Case Insensitivity Clarification". %% -%% Map upper-case to lower-case %% NOTE: this code is in kernel and we don't want to relay -%% to much on stdlib +%% to much on stdlib. Furthermore string:to_lower/1 +%% does not follow RFC 4343. %% tolower([]) -> []; -tolower([C|Cs]) when C >= $A, C =< $Z -> [(C-$A)+$a|tolower(Cs)]; -tolower([C|Cs]) -> [C|tolower(Cs)]. +tolower([C|Cs]) when is_integer(C) -> + if C >= $A, C =< $Z -> + [(C-$A)+$a|tolower(Cs)]; + true -> + [C|tolower(Cs)] + end. dn_ip6_int(A,B,C,D,E,F,G,H) -> dnib(H) ++ dnib(G) ++ dnib(F) ++ dnib(E) ++ diff --git a/lib/kernel/src/inet_gethost_native.erl b/lib/kernel/src/inet_gethost_native.erl index df866660b4..65d4c84e3b 100644 --- a/lib/kernel/src/inet_gethost_native.erl +++ b/lib/kernel/src/inet_gethost_native.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1998-2010. All Rights Reserved. +%% Copyright Ericsson AB 1998-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/inet_hosts.erl b/lib/kernel/src/inet_hosts.erl index df1d4fc0be..6e9719b4aa 100644 --- a/lib/kernel/src/inet_hosts.erl +++ b/lib/kernel/src/inet_hosts.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -38,9 +38,12 @@ gethostbyname(_) -> {error, formerr}. gethostbyname(Name, Type) when is_list(Name), is_atom(Type) -> - case gethostbyname(Name, Type, inet_hosts_byname, inet_hosts_byaddr) of + %% Byname has lowercased names while Byaddr keep the name casing. + %% This is to be able to reconstruct the original /etc/hosts entry. + N = inet_db:tolower(Name), + case gethostbyname(N, Type, inet_hosts_byname, inet_hosts_byaddr) of false -> - case gethostbyname(Name, Type, + case gethostbyname(N, Type, inet_hosts_file_byname, inet_hosts_file_byaddr) of false -> {error,nxdomain}; diff --git a/lib/kernel/src/inet_int.hrl b/lib/kernel/src/inet_int.hrl index a01c733d81..67a99913a1 100644 --- a/lib/kernel/src/inet_int.hrl +++ b/lib/kernel/src/inet_int.hrl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl index 59ba408d7a..94a9f7c64d 100644 --- a/lib/kernel/src/inet_res.erl +++ b/lib/kernel/src/inet_res.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2011. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -181,8 +181,8 @@ lookup(Name, Class, Type, Opts, Timeout) -> lookup_filter({ok,#dns_rec{anlist=Answers}}, Class, Type) -> [A#dns_rr.data || A <- Answers, - A#dns_rr.class =:= Class, - A#dns_rr.type =:= Type]; + Class =:= any orelse A#dns_rr.class =:= Class, + Type =:= any orelse A#dns_rr.type =:= Type]; lookup_filter({error,_}, _, _) -> []. %% -------------------------------------------------------------------------- diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl index 83e0b59cc2..ced6f47bfe 100644 --- a/lib/kernel/src/rpc.erl +++ b/lib/kernel/src/rpc.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/src/user_drv.erl b/lib/kernel/src/user_drv.erl index bb654495d3..7b4ffb09ca 100644 --- a/lib/kernel/src/user_drv.erl +++ b/lib/kernel/src/user_drv.erl @@ -418,7 +418,7 @@ list_commands(Iport, Oport) -> true -> []; false -> - [{put_chars,unicode," q - quit erlang\n"}] + [{put_chars, unicode," q - quit erlang\n"}] end, io_requests([{put_chars, unicode," c [nn] - connect to job\n"}, {put_chars, unicode," i [nn] - interrupt job\n"}, diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl index fc17db2745..cd9359f2aa 100644 --- a/lib/kernel/test/code_SUITE.erl +++ b/lib/kernel/test/code_SUITE.erl @@ -35,7 +35,7 @@ on_load_embedded/1, on_load_errors/1, big_boot_embedded/1, native_early_modules/1, get_mode/1]). --export([init_per_testcase/2, end_per_testcase/2, +-export([init_per_testcase/2, end_per_testcase/2, init_per_suite/1, end_per_suite/1, sticky_compiler/1]). @@ -48,7 +48,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}]. -all() -> +all() -> [set_path, get_path, add_path, add_paths, del_path, replace_path, load_file, load_abs, ensure_loaded, delete, purge, soft_purge, is_loaded, all_loaded, @@ -62,7 +62,7 @@ all() -> on_load_binary, on_load_embedded, on_load_errors, big_boot_embedded, native_early_modules, get_mode]. -groups() -> +groups() -> []. init_per_group(_GroupName, Config) -> @@ -76,10 +76,10 @@ init_per_suite(Config) -> %% the module name does not match the filename, so %% we must compile to a binary and write the Beam file %% ourselves. - ?line Dir = filename:dirname(code:which(?MODULE)), - ?line File = filename:join(Dir, "code_a_test"), - ?line {ok,code_b_test,Code} = compile:file(File, [binary]), - ?line ok = file:write_file(File++".beam", Code), + Dir = filename:dirname(code:which(?MODULE)), + File = filename:join(Dir, "code_a_test"), + {ok,code_b_test,Code} = compile:file(File, [binary]), + ok = file:write_file(File++".beam", Code), Config. end_per_suite(Config) -> @@ -98,7 +98,7 @@ init_per_testcase(_Func, Config) -> P=code:get_path(), [{watchdog, Dog}, {code_path, P}|Config]. -end_per_testcase(TC, Config) when TC == mult_lib_roots; +end_per_testcase(TC, Config) when TC == mult_lib_roots; TC == big_boot_embedded -> {ok, HostName} = inet:gethostname(), NodeName = list_to_atom(atom_to_list(TC)++"@"++HostName), @@ -121,51 +121,49 @@ set_path(doc) -> []; set_path(Config) when is_list(Config) -> P = code:get_path(), NonExDir = filename:join(?config(priv_dir, Config), ?t:temp_name("hej")), - ?line {'EXIT',_} = (catch code:set_path({a})), - ?line {error, bad_directory} = (catch code:set_path([{a}])), - ?line {error, bad_directory} = code:set_path(NonExDir), - ?line P = code:get_path(), % still the same path. - ?line true = code:set_path(P), % set the same path again. - ?line P = code:get_path(), % still the same path. + {'EXIT',_} = (catch code:set_path({a})), + {error, bad_directory} = (catch code:set_path([{a}])), + {error, bad_directory} = code:set_path(NonExDir), + P = code:get_path(), % still the same path. + true = code:set_path(P), % set the same path again. + P = code:get_path(), % still the same path. LibDir = code:lib_dir(), - ?line true = code:set_path([LibDir | P]), - ?line [LibDir | P] = code:get_path(), - ?line true = code:set_path([LibDir]), - ?line [LibDir] = code:get_path(), + true = code:set_path([LibDir | P]), + [LibDir | P] = code:get_path(), + true = code:set_path([LibDir]), + [LibDir] = code:get_path(), ok. get_path(suite) -> []; get_path(doc) -> []; get_path(Config) when is_list(Config) -> - ?line P = code:get_path(), + P = code:get_path(), % test that all directories are strings (lists). - ?line [] = lists:filter(fun(Dir) when is_list(Dir) -> - false; - (_) -> - true - end, - P), + [] = lists:filter(fun + (Dir) when is_list(Dir) -> false; + (_) -> true + end, P), ok. add_path(suite) -> []; add_path(doc) -> []; add_path(Config) when is_list(Config) -> P = code:get_path(), - ?line {'EXIT',_} = (catch code:add_path({})), - ?line {'EXIT',_} = (catch code:add_patha({})), - ?line {'EXIT',_} = (catch code:add_pathz({})), - ?line {error, bad_directory} = code:add_path("xyz"), - ?line {error, bad_directory} = code:add_patha("xyz"), - ?line {error, bad_directory} = code:add_pathz("xyz"), + {'EXIT',_} = (catch code:add_path({})), + {'EXIT',_} = (catch code:add_patha({})), + {'EXIT',_} = (catch code:add_pathz({})), + {error, bad_directory} = code:add_path("xyz"), + {error, bad_directory} = code:add_patha("xyz"), + {error, bad_directory} = code:add_pathz("xyz"), LibDir = code:lib_dir(), - ?line true = code:add_path(LibDir), - ?line LibDir = lists:last(code:get_path()), + true = code:add_path(LibDir), + LibDir = lists:last(code:get_path()), code:set_path(P), - ?line true = code:add_pathz(LibDir), - ?line LibDir = lists:last(code:get_path()), + true = code:add_pathz(LibDir), + LibDir = lists:last(code:get_path()), code:set_path(P), - ?line true = code:add_patha(LibDir), - ?line [LibDir|_] = code:get_path(), + true = code:add_patha(LibDir), + [LibDir|_] = code:get_path(), code:set_path(P), ok. @@ -173,134 +171,134 @@ add_paths(suite) -> []; add_paths(doc) -> []; add_paths(Config) when is_list(Config) -> P = code:get_path(), - ?line ok = code:add_paths([{}]), - ?line ok = code:add_pathsa([{}]), - ?line ok = code:add_pathsz([{}]), - ?line ok = code:add_paths(["xyz"]), - ?line ok = code:add_pathsa(["xyz"]), - ?line ok = code:add_pathsz(["xyz"]), + ok = code:add_paths([{}]), + ok = code:add_pathsa([{}]), + ok = code:add_pathsz([{}]), + ok = code:add_paths(["xyz"]), + ok = code:add_pathsa(["xyz"]), + ok = code:add_pathsz(["xyz"]), P = code:get_path(), % check that no directory is added. LibDir = code:lib_dir(), - ?line ok = code:add_paths([LibDir]), - ?line LibDir = lists:last(code:get_path()), + ok = code:add_paths([LibDir]), + LibDir = lists:last(code:get_path()), code:set_path(P), - ?line ok = code:add_pathsz([LibDir]), - ?line LibDir = lists:last(code:get_path()), + ok = code:add_pathsz([LibDir]), + LibDir = lists:last(code:get_path()), code:set_path(P), - ?line ok = code:add_pathsa([LibDir]), - ?line [LibDir|P] = code:get_path(), + ok = code:add_pathsa([LibDir]), + [LibDir|P] = code:get_path(), code:set_path(P), RootDir = code:root_dir(), Res = P ++ [LibDir, RootDir], - ?line ok = code:add_paths([LibDir, RootDir]), - ?line Res = code:get_path(), + ok = code:add_paths([LibDir, RootDir]), + Res = code:get_path(), code:set_path(P), - ?line ok = code:add_pathsz([LibDir, RootDir]), - ?line Res = code:get_path(), + ok = code:add_pathsz([LibDir, RootDir]), + Res = code:get_path(), code:set_path(P), - ?line ok = code:add_pathsa([LibDir, RootDir]), - ?line [RootDir, LibDir|P] = code:get_path(), + ok = code:add_pathsa([LibDir, RootDir]), + [RootDir, LibDir|P] = code:get_path(), code:set_path(P), - ?line ok = code:add_paths([LibDir, "xyz"]), + ok = code:add_paths([LibDir, "xyz"]), Res1 = P ++ [LibDir], - ?line Res1 = code:get_path(), + Res1 = code:get_path(), code:set_path(P), - ?line ok = code:add_pathsz([LibDir, "xyz"]), - ?line Res1 = code:get_path(), + ok = code:add_pathsz([LibDir, "xyz"]), + Res1 = code:get_path(), code:set_path(P), - ?line ok = code:add_pathsa([LibDir, "xyz"]), - ?line [LibDir|P] = code:get_path(), + ok = code:add_pathsa([LibDir, "xyz"]), + [LibDir|P] = code:get_path(), code:set_path(P), ok. del_path(suite) -> []; del_path(doc) -> []; del_path(Config) when is_list(Config) -> - ?line P = code:get_path(), + P = code:get_path(), test_server:format("Initial code:get_path()=~p~n",[P]), - ?line {'EXIT',_} = (catch code:del_path(3)), - ?line false = code:del_path(my_dummy_name), - ?line false = code:del_path("/kdlk/my_dummy_dir"), + {'EXIT',_} = (catch code:del_path(3)), + false = code:del_path(my_dummy_name), + false = code:del_path("/kdlk/my_dummy_dir"), Dir = filename:join([code:lib_dir(kernel),"ebin"]), test_server:format("kernel dir: ~p~n",[Dir]), - ?line true = code:del_path(kernel), + true = code:del_path(kernel), NewP = code:get_path(), test_server:format("Path after removing 'kernel':~p~n",[NewP]), ReferenceP = lists:delete(Dir,P), test_server:format("Reference path:~p~n",[ReferenceP]), - ?line NewP = ReferenceP, % check that dir is deleted + NewP = ReferenceP, % check that dir is deleted code:set_path(P), - ?line true = code:del_path(Dir), + true = code:del_path(Dir), NewP1 = code:get_path(), - ?line NewP1 = lists:delete(Dir,P), % check that dir is deleted + NewP1 = lists:delete(Dir,P), % check that dir is deleted code:set_path(P), ok. replace_path(suite) -> []; replace_path(doc) -> []; replace_path(Config) when is_list(Config) -> - ?line PrivDir = ?config(priv_dir, Config), - ?line P = code:get_path(), - ?line {'EXIT',_} = (catch code:replace_path(3,"")), - ?line {error, bad_name} = code:replace_path(dummy_name,""), - ?line {error, bad_name} = code:replace_path(kernel, + PrivDir = ?config(priv_dir, Config), + P = code:get_path(), + {'EXIT',_} = (catch code:replace_path(3,"")), + {error, bad_name} = code:replace_path(dummy_name,""), + {error, bad_name} = code:replace_path(kernel, "/kdlk/my_dummy_dir"), - ?line {error, bad_directory} = code:replace_path(kernel, + {error, bad_directory} = code:replace_path(kernel, "/kdlk/kernel-1.2"), - ?line P = code:get_path(), % Check that path is not changed. + P = code:get_path(), % Check that path is not changed. - ?line ok = file:set_cwd(PrivDir), + ok = file:set_cwd(PrivDir), %% Replace an existing application. file:make_dir("./kernel-2.11"), {ok, Cwd} = file:get_cwd(), NewDir = Cwd ++ "/kernel-2.11", - ?line true = code:replace_path(kernel, NewDir), - ?line NewDir = code:lib_dir(kernel), - ?line true = code:set_path(P), %Reset path - ?line ok = file:del_dir("./kernel-2.11"), + true = code:replace_path(kernel, NewDir), + NewDir = code:lib_dir(kernel), + true = code:set_path(P), %Reset path + ok = file:del_dir("./kernel-2.11"), %% Add a completly new application. NewAppName = 'blurf_blarfer', - ?line NewAppDir = filename:join(Cwd, atom_to_list(NewAppName) ++ "-6.33.1"), - ?line ok = file:make_dir(NewAppDir), - ?line true = code:replace_path(NewAppName, NewAppDir), - ?line NewAppDir = code:lib_dir(NewAppName), - ?line NewAppDir = lists:last(code:get_path()), - ?line true = code:set_path(P), %Reset path - ?line ok = file:del_dir(NewAppDir), + NewAppDir = filename:join(Cwd, atom_to_list(NewAppName) ++ "-6.33.1"), + ok = file:make_dir(NewAppDir), + true = code:replace_path(NewAppName, NewAppDir), + NewAppDir = code:lib_dir(NewAppName), + NewAppDir = lists:last(code:get_path()), + true = code:set_path(P), %Reset path + ok = file:del_dir(NewAppDir), ok. dir_disappeared(suite) -> []; dir_disappeared(doc) -> ["OTP-3977"]; dir_disappeared(Config) when is_list(Config) -> - ?line PrivDir = ?config(priv_dir, Config), - ?line Dir = filename:join(PrivDir, "temp"), - ?line ok = file:make_dir(Dir), - ?line true = code:add_path(Dir), - ?line ok = file:del_dir(Dir), - ?line non_existing = code:which(bubbelskrammel), + PrivDir = ?config(priv_dir, Config), + Dir = filename:join(PrivDir, "temp"), + ok = file:make_dir(Dir), + true = code:add_path(Dir), + ok = file:del_dir(Dir), + non_existing = code:which(bubbelskrammel), ok. load_file(suite) -> []; load_file(doc) -> []; load_file(Config) when is_list(Config) -> - ?line {error, nofile} = code:load_file(duuuumy_mod), - ?line {error, badfile} = code:load_file(code_a_test), - ?line {'EXIT', _} = (catch code:load_file(123)), - ?line {module, code_b_test} = code:load_file(code_b_test), + {error, nofile} = code:load_file(duuuumy_mod), + {error, badfile} = code:load_file(code_a_test), + {'EXIT', _} = (catch code:load_file(123)), + {module, code_b_test} = code:load_file(code_b_test), TestDir = test_dir(), code:stick_dir(TestDir), - ?line {error, sticky_directory} = code:load_file(code_b_test), + {error, sticky_directory} = code:load_file(code_b_test), code:unstick_dir(TestDir), ok. @@ -311,30 +309,30 @@ load_abs(suite) -> []; load_abs(doc) -> []; load_abs(Config) when is_list(Config) -> TestDir = test_dir(), - ?line {error, nofile} = code:load_abs(TestDir ++ "/duuuumy_mod"), - ?line {error, badfile} = code:load_abs(TestDir ++ "/code_a_test"), - ?line {'EXIT', _} = (catch code:load_abs({})), - ?line {module, code_b_test} = code:load_abs(TestDir ++ "/code_b_test"), + {error, nofile} = code:load_abs(TestDir ++ "/duuuumy_mod"), + {error, badfile} = code:load_abs(TestDir ++ "/code_a_test"), + {'EXIT', _} = (catch code:load_abs({})), + {module, code_b_test} = code:load_abs(TestDir ++ "/code_b_test"), code:stick_dir(TestDir), - ?line {error, sticky_directory} = code:load_abs(TestDir ++ "/code_b_test"), + {error, sticky_directory} = code:load_abs(TestDir ++ "/code_b_test"), code:unstick_dir(TestDir), ok. ensure_loaded(suite) -> []; ensure_loaded(doc) -> []; ensure_loaded(Config) when is_list(Config) -> - ?line {module, lists} = code:ensure_loaded(lists), + {module, lists} = code:ensure_loaded(lists), case init:get_argument(mode) of {ok, [["embedded"]]} -> - ?line {error, embedded} = code:ensure_loaded(code_b_test), - ?line {error, badarg} = code:ensure_loaded(34), + {error, embedded} = code:ensure_loaded(code_b_test), + {error, badarg} = code:ensure_loaded(34), ok; _ -> - ?line {error, nofile} = code:ensure_loaded(duuuumy_mod), - ?line {error, badfile} = code:ensure_loaded(code_a_test), - ?line {'EXIT', _} = (catch code:ensure_loaded(34)), - ?line {module, code_b_test} = code:ensure_loaded(code_b_test), - ?line {module, code_b_test} = code:ensure_loaded(code_b_test), + {error, nofile} = code:ensure_loaded(duuuumy_mod), + {error, badfile} = code:ensure_loaded(code_a_test), + {'EXIT', _} = (catch code:ensure_loaded(34)), + {module, code_b_test} = code:ensure_loaded(code_b_test), + {module, code_b_test} = code:ensure_loaded(code_b_test), ok end. @@ -343,15 +341,15 @@ delete(doc) -> []; delete(Config) when is_list(Config) -> OldFlag = process_flag(trap_exit, true), code:purge(code_b_test), - ?line Pid = code_b_test:do_spawn(), - ?line true = code:delete(code_b_test), - ?line {'EXIT',_} = (catch code:delete(122)), - ?line false = code_b_test:check_exit(Pid), - ?line false = code:delete(code_b_test), - ?line false = code_b_test:check_exit(Pid), + Pid = code_b_test:do_spawn(), + true = code:delete(code_b_test), + {'EXIT',_} = (catch code:delete(122)), + false = code_b_test:check_exit(Pid), + false = code:delete(code_b_test), + false = code_b_test:check_exit(Pid), exit(Pid,kill), - ?line true = code_b_test:check_exit(Pid), - ?line false = code:delete(code_b_test), + true = code_b_test:check_exit(Pid), + false = code:delete(code_b_test), code:purge(code_b_test), process_flag(trap_exit, OldFlag), ok. @@ -361,13 +359,13 @@ purge(doc) -> []; purge(Config) when is_list(Config) -> OldFlag = process_flag(trap_exit, true), code:purge(code_b_test), - ?line {'EXIT',_} = (catch code:purge({})), - ?line false = code:purge(code_b_test), - ?line Pid = code_b_test:do_spawn(), - ?line true = code:delete(code_b_test), - ?line false = code_b_test:check_exit(Pid), - ?line true = code:purge(code_b_test), - ?line true = code_b_test:check_exit(Pid), + {'EXIT',_} = (catch code:purge({})), + false = code:purge(code_b_test), + Pid = code_b_test:do_spawn(), + true = code:delete(code_b_test), + false = code_b_test:check_exit(Pid), + true = code:purge(code_b_test), + true = code_b_test:check_exit(Pid), process_flag(trap_exit, OldFlag), ok. @@ -376,16 +374,16 @@ soft_purge(doc) -> []; soft_purge(Config) when is_list(Config) -> OldFlag = process_flag(trap_exit, true), code:purge(code_b_test), - ?line {'EXIT',_} = (catch code:soft_purge(23)), - ?line true = code:soft_purge(code_b_test), - ?line Pid = code_b_test:do_spawn(), - ?line true = code:delete(code_b_test), - ?line false = code_b_test:check_exit(Pid), - ?line false = code:soft_purge(code_b_test), - ?line false = code_b_test:check_exit(Pid), + {'EXIT',_} = (catch code:soft_purge(23)), + true = code:soft_purge(code_b_test), + Pid = code_b_test:do_spawn(), + true = code:delete(code_b_test), + false = code_b_test:check_exit(Pid), + false = code:soft_purge(code_b_test), + false = code_b_test:check_exit(Pid), exit(Pid,kill), - ?line true = code_b_test:check_exit(Pid), - ?line true = code:soft_purge(code_b_test), + true = code_b_test:check_exit(Pid), + true = code:soft_purge(code_b_test), process_flag(trap_exit, OldFlag), ok. @@ -394,12 +392,12 @@ is_loaded(doc) -> []; is_loaded(Config) when is_list(Config) -> code:purge(code_b_test), code:delete(code_b_test), - ?line false = code:is_loaded(duuuuuumy_mod), - ?line {'EXIT',_} = (catch code:is_loaded(23)), - ?line {file, preloaded} = code:is_loaded(init), + false = code:is_loaded(duuuuuumy_mod), + {'EXIT',_} = (catch code:is_loaded(23)), + {file, preloaded} = code:is_loaded(init), TestDir = test_dir(), - ?line {module, code_b_test} = code:load_abs(TestDir ++ "/code_b_test"), - ?line {file, _Loaded} = code:is_loaded(code_b_test), + {module, code_b_test} = code:load_abs(TestDir ++ "/code_b_test"), + {file, _Loaded} = code:is_loaded(code_b_test), code:purge(code_b_test), code:delete(code_b_test), ok. @@ -413,21 +411,19 @@ all_loaded(Config) when is_list(Config) -> end. all_loaded_1() -> - ?line Preloaded = [{M,preloaded} || M <- lists:sort(erlang:pre_loaded())], + Preloaded = [{M,preloaded} || M <- lists:sort(erlang:pre_loaded())], - ?line Loaded0 = lists:sort(code:all_loaded()), - ?line all_unique(Loaded0), - ?line Loaded1 = lists:keysort(2, Loaded0), - ?line Loaded2 = match_and_remove(Preloaded, Loaded1), + Loaded0 = lists:sort(code:all_loaded()), + all_unique(Loaded0), + Loaded1 = lists:keysort(2, Loaded0), + Loaded2 = match_and_remove(Preloaded, Loaded1), ObjExt = code:objfile_extension(), - ?line [] = lists:filter(fun({Mod,AbsName}) when is_atom(Mod), - is_list(AbsName) -> - Mod =/= list_to_atom(filename:basename(AbsName, - ObjExt)); - (_) -> true - end, - Loaded2), + [] = lists:filter(fun + ({Mod,AbsName}) when is_atom(Mod), is_list(AbsName) -> + Mod =/= list_to_atom(filename:basename(AbsName, ObjExt)); + (_) -> true + end, Loaded2), ok. match_and_remove([], List) -> List; @@ -442,19 +438,19 @@ load_binary(doc) -> []; load_binary(Config) when is_list(Config) -> TestDir = test_dir(), File = TestDir ++ "/code_b_test" ++ code:objfile_extension(), - ?line {ok,Bin} = file:read_file(File), - ?line {'EXIT',_} = (catch code:load_binary(12, File, Bin)), - ?line {'EXIT',_} = (catch code:load_binary(code_b_test, 12, Bin)), - ?line {'EXIT',_} = (catch code:load_binary(code_b_test, File, 12)), - ?line {module, code_b_test} = code:load_binary(code_b_test, File, Bin), + {ok,Bin} = file:read_file(File), + {'EXIT',_} = (catch code:load_binary(12, File, Bin)), + {'EXIT',_} = (catch code:load_binary(code_b_test, 12, Bin)), + {'EXIT',_} = (catch code:load_binary(code_b_test, File, 12)), + {module, code_b_test} = code:load_binary(code_b_test, File, Bin), code:stick_dir(TestDir), - ?line {error, sticky_directory} = code:load_binary(code_b_test, File, Bin), + {error, sticky_directory} = code:load_binary(code_b_test, File, Bin), code:unstick_dir(TestDir), code:purge(code_b_test), code:delete(code_b_test), ok. -upgrade(Config) -> +upgrade(Config) -> DataDir = ?config(data_dir, Config), %%T = [beam, hipe], @@ -462,28 +458,28 @@ upgrade(Config) -> [upgrade_do(DataDir, Client, U1, U2, O1, O2) || Client<-T, U1<-T, U2<-T, O1<-T, O2<-T], - + ok. upgrade_do(DataDir, Client, U1, U2, O1, O2) -> - compile_load(upgrade_client, DataDir, undefined, Client), + compile_load(upgrade_client, DataDir, undefined, Client), upgrade_client:run(DataDir, U1, U2, O1, O2), ok. compile_load(Mod, Dir, Ver, CodeType) -> Version = case Ver of - undefined -> - io:format("Compiling '~p' as ~p\n", [Mod, CodeType]), - []; - _ -> - io:format("Compiling version ~p of '~p' as ~p\n", - [Ver, Mod, CodeType]), - [{d,list_to_atom("VERSION_" ++ integer_to_list(Ver))}] - end, + undefined -> + io:format("Compiling '~p' as ~p\n", [Mod, CodeType]), + []; + _ -> + io:format("Compiling version ~p of '~p' as ~p\n", + [Ver, Mod, CodeType]), + [{d,list_to_atom("VERSION_" ++ integer_to_list(Ver))}] + end, Target = case CodeType of - beam -> []; - hipe -> [native] - end, + beam -> []; + hipe -> [native] + end, CompOpts = [binary, report] ++ Target ++ Version, Src = filename:join(Dir, atom_to_list(Mod) ++ ".erl"), @@ -497,17 +493,17 @@ compile_load(Mod, Dir, Ver, CodeType) -> dir_req(suite) -> []; dir_req(doc) -> []; dir_req(Config) when is_list(Config) -> - ?line {ok,[[Root0]]} = init:get_argument(root), - ?line Root = filename:join([Root0]), % Normalised form. - ?line Root = code:root_dir(), + {ok,[[Root0]]} = init:get_argument(root), + Root = filename:join([Root0]), % Normalised form. + Root = code:root_dir(), LibDir = Root ++ "/lib", - ?line LibDir = code:lib_dir(), - ?line code:compiler_dir(), - ?line {error, bad_name} = code:lib_dir(duuumy), - ?line KernLib = code:lib_dir(kernel), - ?line Priv = KernLib ++ "/priv", - ?line Priv = code:priv_dir(kernel), - ?line {error, bad_name} = code:priv_dir(duuumy), + LibDir = code:lib_dir(), + code:compiler_dir(), + {error, bad_name} = code:lib_dir(duuumy), + KernLib = code:lib_dir(kernel), + Priv = KernLib ++ "/priv", + Priv = code:priv_dir(kernel), + {error, bad_name} = code:priv_dir(duuumy), ok. object_code(suite) -> []; @@ -517,19 +513,19 @@ object_code(Config) when is_list(Config) -> P = code:get_path(), P = code:get_path(), code:add_path(TestDir), - ?line {module, code_b_test} = code:load_abs(TestDir ++ "/code_b_test"), + {module, code_b_test} = code:load_abs(TestDir ++ "/code_b_test"), LoadedFile = filename:absname(TestDir ++ "/code_b_test" ++ code:objfile_extension()), - ?line case code:get_object_code(code_b_test) of + case code:get_object_code(code_b_test) of {code_b_test,Bin,LoadedFile} when is_binary(Bin) -> ok end, code:purge(code_b_test), code:delete(code_b_test), - ?line error = code:get_object_code(dddddddduuuuuuumy), - ?line {'EXIT',_} = (catch code:get_object_code(23)), - ?line code:set_path(P), - ?line P=code:get_path(), + error = code:get_object_code(dddddddduuuuuuumy), + {'EXIT',_} = (catch code:get_object_code(23)), + code:set_path(P), + P=code:get_path(), ok. set_path_file(suite) -> []; @@ -537,17 +533,17 @@ set_path_file(doc) -> ["Test that set_path does not accept ", "files as pathnames (known previous bug)"]; set_path_file(Config) when is_list(Config) -> File=filename:join(?config(priv_dir, Config), "testfil"), - ?line ok=file:write_file(File, list_to_binary("lite data")), - ?line {error, bad_directory}=code:set_path([File]). + ok=file:write_file(File, list_to_binary("lite data")), + {error, bad_directory}=code:set_path([File]). sticky_dir(suite) -> []; sticky_dir(doc) -> ["Test that a module with the same name as a module in ", "a sticky directory cannot be loaded."]; sticky_dir(Config) when is_list(Config) -> MyDir=filename:dirname(code:which(?MODULE)), - ?line {ok, Node}=?t:start_node(sticky_dir, slave,[{args, "-pa \""++MyDir++"\""}]), + {ok, Node}=?t:start_node(sticky_dir, slave,[{args, "-pa \""++MyDir++"\""}]), File=filename:join([?config(data_dir, Config), "calendar"]), - ?line Ret=rpc:call(Node, ?MODULE, sticky_compiler, [File]), + Ret=rpc:call(Node, ?MODULE, sticky_compiler, [File]), case Ret of fail -> ?t:fail("c:c allowed a sticky module to be compiled and loaded."); @@ -607,70 +603,70 @@ add_del_path(Config) when is_list(Config) -> Dir1 = filename:join(DDir,"dummy_app-1.0/ebin"), Dir2 = filename:join(DDir,"dummy_app-2.0/ebin"), code:add_patha(Dir1), - ?line PrivDir1 = filename:join(DDir,"dummy_app-1.0/priv"), - ?line PrivDir1 = code:priv_dir(dummy_app), - ?line code:add_path(Dir2), % put last in path - ?line PrivDir1 = code:priv_dir(dummy_app), - ?line code:del_path(Dir2), - ?line PrivDir1 = code:priv_dir(dummy_app), + PrivDir1 = filename:join(DDir,"dummy_app-1.0/priv"), + PrivDir1 = code:priv_dir(dummy_app), + code:add_path(Dir2), % put last in path + PrivDir1 = code:priv_dir(dummy_app), + code:del_path(Dir2), + PrivDir1 = code:priv_dir(dummy_app), ok. clash(Config) when is_list(Config) -> DDir = ?config(data_dir,Config)++"clash/", P = code:get_path(), - [TestServerPath|_] = [Path || Path <- code:get_path(), + [TestServerPath|_] = [Path || Path <- code:get_path(), re:run(Path,"test_server/?$",[]) /= nomatch], %% test non-clashing entries %% remove TestServerPath to prevent clash with test-server path - ?line true = code:del_path(TestServerPath), - ?line true = code:add_path(DDir++"foobar-0.1/ebin"), - ?line true = code:add_path(DDir++"zork-0.8/ebin"), + true = code:del_path(TestServerPath), + true = code:add_path(DDir++"foobar-0.1/ebin"), + true = code:add_path(DDir++"zork-0.8/ebin"), test_server:capture_start(), - ?line ok = code:clash(), + ok = code:clash(), test_server:capture_stop(), - ?line [OKMsg|_] = test_server:capture_get(), - ?line true = lists:prefix("** Found 0 name clashes", OKMsg), - ?line true = code:set_path(P), + [OKMsg|_] = test_server:capture_get(), + true = lists:prefix("** Found 0 name clashes", OKMsg), + true = code:set_path(P), %% test clashing entries %% remove TestServerPath to prevent clash with test-server path - ?line true = code:del_path(TestServerPath), - ?line true = code:add_path(DDir++"foobar-0.1/ebin"), - ?line true = code:add_path(DDir++"foobar-0.1.ez/foobar-0.1/ebin"), + true = code:del_path(TestServerPath), + true = code:add_path(DDir++"foobar-0.1/ebin"), + true = code:add_path(DDir++"foobar-0.1.ez/foobar-0.1/ebin"), test_server:capture_start(), - ?line ok = code:clash(), + ok = code:clash(), test_server:capture_stop(), - ?line [ClashMsg|_] = test_server:capture_get(), - ?line {match, [" hides "]} = re:run(ClashMsg, "\\*\\* .*( hides ).*", + [ClashMsg|_] = test_server:capture_get(), + {match, [" hides "]} = re:run(ClashMsg, "\\*\\* .*( hides ).*", [{capture,all_but_first,list}]), - ?line true = code:set_path(P), + true = code:set_path(P), %% test "Bad path can't read" %% remove TestServerPath to prevent clash with test-server path Priv = ?config(priv_dir, Config), - ?line true = code:del_path(TestServerPath), + true = code:del_path(TestServerPath), TmpEzFile = Priv++"foobar-0.tmp.ez", - ?line {ok, _} = file:copy(DDir++"foobar-0.1.ez", TmpEzFile), - ?line true = code:add_path(TmpEzFile++"/foobar-0.1/ebin"), + {ok, _} = file:copy(DDir++"foobar-0.1.ez", TmpEzFile), + true = code:add_path(TmpEzFile++"/foobar-0.1/ebin"), case os:type() of {win32,_} -> - %% The file wont be deleted on windows until it's closed, why we + %% The file wont be deleted on windows until it's closed, why we %% need to rename instead. - ?line ok = file:rename(TmpEzFile,TmpEzFile++".moved"); + ok = file:rename(TmpEzFile,TmpEzFile++".moved"); _ -> - ?line ok = file:delete(TmpEzFile) + ok = file:delete(TmpEzFile) end, test_server:capture_start(), - ?line ok = code:clash(), + ok = code:clash(), test_server:capture_stop(), - ?line [BadPathMsg|_] = test_server:capture_get(), - ?line true = lists:prefix("** Bad path can't read", BadPathMsg), - ?line true = code:set_path(P), + [BadPathMsg|_] = test_server:capture_get(), + true = lists:prefix("** Bad path can't read", BadPathMsg), + true = code:set_path(P), file:delete(TmpEzFile++".moved"), %% Only effect on windows ok. @@ -687,7 +683,7 @@ ext_mod_dep(Config) when is_list(Config) -> xref:add_directory(s, filename:join(code:lib_dir(kernel),"ebin")), xref:add_directory(s, filename:join(code:lib_dir(stdlib),"ebin")), case catch ext_mod_dep2() of - {'EXIT', Reason} -> + {'EXIT', Reason} -> xref:stop(s), exit(Reason); Else -> @@ -699,7 +695,7 @@ ext_mod_dep(Config) when is_list(Config) -> end. ext_mod_dep2() -> - Exports0 = code_server:module_info(exports) -- + Exports0 = code_server:module_info(exports) -- [{module_info,0},{module_info,1}], Exports = [{code_server,M,A} || {M,A} <- Exports0], case analyse(Exports, [], [], 0) of @@ -709,17 +705,17 @@ ext_mod_dep2() -> {not_verified,ErrCnt} end. -analyse([], [], Visited, ErrCnt) -> +analyse([], [], Visited, ErrCnt) -> {Visited,ErrCnt}; analyse([], [This={M,F,A}|Path], Visited, ErrCnt0) -> %% The code_server has been granted to use the following modules, - %% These modules should be loaded by code.erl before + %% These modules should be loaded by code.erl before %% the code_server is started. OK = [erlang, os, prim_file, erl_prim_loader, init, ets, code_server, lists, lists_sort, unicode, binary, filename, gb_sets, gb_trees, hipe_unified_loader, hipe_bifs, prim_zip, zlib], - ErrCnt1 = + ErrCnt1 = case lists:member(M, OK) or erlang:is_builtin(M,F,A) of true -> 0; @@ -729,7 +725,7 @@ analyse([], [This={M,F,A}|Path], Visited, ErrCnt0) -> {Visited, ErrCnt1+ErrCnt0}; analyse([MFA|R], Path, Visited0, ErrCnt0) -> case lists:member(MFA,Visited0) of - false -> + false -> {Visited,ErrCnt1} = analyse2(MFA, Path, Visited0), analyse(R, Path, Visited, ErrCnt1+ErrCnt0); true -> @@ -814,7 +810,7 @@ check_funs({'$M_EXPR','$F_EXPR',_}, {code_server,start_link,1}]) -> 0; check_funs({'$M_EXPR','$F_EXPR',_}, [{erlang,spawn_link,1},{code_server,start_link,1}]) -> 0; -check_funs({'$M_EXPR',module_info,1}, +check_funs({'$M_EXPR',module_info,1}, [{hipe_unified_loader,patch_to_emu_step1,1} | _]) -> 0; check_funs({'$M_EXPR','$F_EXPR',2}, [{lists,foldl,3}, @@ -829,7 +825,7 @@ check_funs({'$M_EXPR','$F_EXPR',1}, check_funs({'$M_EXPR',warning_msg,2}, [{code_server,finish_on_load_report,2} | _]) -> 0; %% This is cheating! /raimo -%% +%% %% check_funs(This = {M,_,_}, Path) -> %% case catch atom_to_list(M) of %% [$h,$i,$p,$e | _] -> @@ -861,9 +857,9 @@ load_cached(suite) -> load_cached(doc) -> []; load_cached(Config) when is_list(Config) -> - ?line Priv = ?config(priv_dir, Config), - ?line WD = filename:dirname(code:which(?MODULE)), - ?line {ok,Node} = + Priv = ?config(priv_dir, Config), + WD = filename:dirname(code:which(?MODULE)), + {ok,Node} = ?t:start_node(code_cache_node, peer, [{args, "-pa \"" ++ WD ++ "\""}, {erl, [this]}]), @@ -873,7 +869,7 @@ load_cached(Config) when is_list(Config) -> _ -> false end end, - ?line Tabs = rpc:call(Node, ets, all, []), + Tabs = rpc:call(Node, ets, all, []), case rpc:call(Node, lists, any, [CCTabCreated,Tabs]) of true -> ?t:stop_node(Node), @@ -881,25 +877,25 @@ load_cached(Config) when is_list(Config) -> false -> ok end, - ?line rpc:call(Node, code, del_path, [Priv]), - ?line rpc:call(Node, code, add_pathz, [Priv]), + rpc:call(Node, code, del_path, [Priv]), + rpc:call(Node, code, add_pathz, [Priv]), FullModName = Priv ++ "/code_cache_test", - ?line {ok,Dev} = file:open(FullModName ++ ".erl", [write]), - ?line io:format(Dev, "-module(code_cache_test). -export([a/0]). a() -> ok.~n", []), - ?line ok = file:close(Dev), - ?line {ok,code_cache_test} = compile:file(FullModName, [{outdir,Priv}]), + {ok,Dev} = file:open(FullModName ++ ".erl", [write]), + io:format(Dev, "-module(code_cache_test). -export([a/0]). a() -> ok.~n", []), + ok = file:close(Dev), + {ok,code_cache_test} = compile:file(FullModName, [{outdir,Priv}]), F = fun load_loop/2, N = 1000, - ?line {T0,T1} = rpc:call(Node, erlang, apply, [F, [N,code_cache_test]]), + {T0,T1} = rpc:call(Node, erlang, apply, [F, [N,code_cache_test]]), TNoCache = now_diff(T1, T0), - ?line rpc:call(Node, code, rehash, []), - ?line {T2,T3} = rpc:call(Node, erlang, apply, [F, [N,code_cache_test]]), - ?line TCache = now_diff(T3, T2), + rpc:call(Node, code, rehash, []), + {T2,T3} = rpc:call(Node, erlang, apply, [F, [N,code_cache_test]]), + TCache = now_diff(T3, T2), AvgNoCache = TNoCache/N, AvgCache = TCache/N, - ?line io:format("Avg. load time (no_cache/cache): ~w/~w~n", [AvgNoCache,AvgCache]), + io:format("Avg. load time (no_cache/cache): ~w/~w~n", [AvgNoCache,AvgCache]), ?t:stop_node(Node), if AvgNoCache =< AvgCache -> ?t:fail("Cache not working properly."); @@ -916,7 +912,7 @@ load_loop(N, M, T0) -> code:delete(M), code:purge(M), load_loop(N-1, M, T0). - + now_diff({A2, B2, C2}, {A1, B1, C1}) -> ((A2-A1)*1000000 + B2-B1)*1000000 + C2-C1. @@ -925,30 +921,30 @@ start_node_with_cache(suite) -> start_node_with_cache(doc) -> []; start_node_with_cache(Config) when is_list(Config) -> - ?line {ok,Node} = - ?t:start_node(code_cache_node, peer, [{args, + {ok,Node} = + ?t:start_node(code_cache_node, peer, [{args, "-code_path_cache"}, {erl, [this]}]), - ?line Tabs = rpc:call(Node, ets, all, []), + Tabs = rpc:call(Node, ets, all, []), io:format("Tabs: ~w~n", [Tabs]), CCTabCreated = fun(Tab) -> case rpc:call(Node, ets, info, [Tab,name]) of code_cache -> true; _ -> false end - end, - ?line true = lists:any(CCTabCreated, Tabs), + end, + true = lists:any(CCTabCreated, Tabs), ?t:stop_node(Node), ok. - + add_and_rehash(suite) -> []; add_and_rehash(doc) -> []; add_and_rehash(Config) when is_list(Config) -> - ?line Priv = ?config(priv_dir, Config), - ?line WD = filename:dirname(code:which(?MODULE)), - ?line {ok,Node} = + Priv = ?config(priv_dir, Config), + WD = filename:dirname(code:which(?MODULE)), + {ok,Node} = ?t:start_node(code_cache_node, peer, [{args, "-pa \"" ++ WD ++ "\""}, {erl, [this]}]), @@ -958,7 +954,7 @@ add_and_rehash(Config) when is_list(Config) -> _ -> false end end, - ?line Tabs0 = rpc:call(Node, ets, all, []), + Tabs0 = rpc:call(Node, ets, all, []), case rpc:call(Node, lists, any, [CCTabCreated,Tabs0]) of true -> ?t:stop_node(Node), @@ -966,36 +962,36 @@ add_and_rehash(Config) when is_list(Config) -> false -> ok end, - ?line ok = rpc:call(Node, code, rehash, []), % create cache - ?line Tabs1 = rpc:call(Node, ets, all, []), - ?line true = rpc:call(Node, lists, any, [CCTabCreated,Tabs1]), % cache table created - ?line ok = rpc:call(Node, code, rehash, []), + ok = rpc:call(Node, code, rehash, []), % create cache + Tabs1 = rpc:call(Node, ets, all, []), + true = rpc:call(Node, lists, any, [CCTabCreated,Tabs1]), % cache table created + ok = rpc:call(Node, code, rehash, []), OkDir = filename:join(Priv, ""), BadDir = filename:join(Priv, "guggemuffsussiputt"), - ?line CP = [OkDir | rpc:call(Node, code, get_path, [])], - ?line true = rpc:call(Node, code, set_path, [CP]), + CP = [OkDir | rpc:call(Node, code, get_path, [])], + true = rpc:call(Node, code, set_path, [CP]), CP1 = [BadDir | CP], - ?line {error,_} = rpc:call(Node, code, set_path, [CP1]), - ?line true = rpc:call(Node, code, del_path, [OkDir]), - ?line true = rpc:call(Node, code, add_path, [OkDir]), - ?line true = rpc:call(Node, code, add_path, [OkDir]), - ?line {error,_} = rpc:call(Node, code, add_path, [BadDir]), - ?line ok = rpc:call(Node, code, rehash, []), + {error,_} = rpc:call(Node, code, set_path, [CP1]), + true = rpc:call(Node, code, del_path, [OkDir]), + true = rpc:call(Node, code, add_path, [OkDir]), + true = rpc:call(Node, code, add_path, [OkDir]), + {error,_} = rpc:call(Node, code, add_path, [BadDir]), + ok = rpc:call(Node, code, rehash, []), ?t:stop_node(Node), ok. - + where_is_file_no_cache(suite) -> []; where_is_file_no_cache(doc) -> []; where_is_file_no_cache(Config) when is_list(Config) -> - ?line {T,KernelBeamFile} = timer:tc(code, where_is_file, ["kernel.beam"]), + {T,KernelBeamFile} = timer:tc(code, where_is_file, ["kernel.beam"]), io:format("Load time: ~w ms~n", [T]), - ?line KernelEbinDir = filename:dirname(KernelBeamFile), - ?line AppFile = filename:join(KernelEbinDir, "kernel.app"), - ?line AppFile = code:where_is_file("kernel.app"), - ?line non_existing = code:where_is_file("kernel"), % no such file + KernelEbinDir = filename:dirname(KernelBeamFile), + AppFile = filename:join(KernelEbinDir, "kernel.app"), + AppFile = code:where_is_file("kernel.app"), + non_existing = code:where_is_file("kernel"), % no such file ok. where_is_file_cached(suite) -> @@ -1003,97 +999,97 @@ where_is_file_cached(suite) -> where_is_file_cached(doc) -> []; where_is_file_cached(Config) when is_list(Config) -> - ?line {ok,Node} = - ?t:start_node(code_cache_node, peer, [{args, + {ok,Node} = + ?t:start_node(code_cache_node, peer, [{args, "-code_path_cache"}, {erl, [this]}]), - ?line Tabs = rpc:call(Node, ets, all, []), + Tabs = rpc:call(Node, ets, all, []), io:format("Tabs: ~w~n", [Tabs]), CCTabCreated = fun(Tab) -> case rpc:call(Node, ets, info, [Tab,name]) of code_cache -> true; _ -> false end - end, - ?line true = lists:any(CCTabCreated, Tabs), - ?line KernelBeamFile = rpc:call(Node, code, where_is_file, ["kernel.beam"]), - ?line {T,KernelBeamFile} = rpc:call(Node, timer, tc, [code,where_is_file,["kernel.beam"]]), + end, + true = lists:any(CCTabCreated, Tabs), + KernelBeamFile = rpc:call(Node, code, where_is_file, ["kernel.beam"]), + {T,KernelBeamFile} = rpc:call(Node, timer, tc, [code,where_is_file,["kernel.beam"]]), io:format("Load time: ~w ms~n", [T]), - ?line KernelEbinDir = rpc:call(Node, filename, dirname, [KernelBeamFile]), - ?line AppFile = rpc:call(Node, filename, join, [KernelEbinDir,"kernel.app"]), - ?line AppFile = rpc:call(Node, code, where_is_file, ["kernel.app"]), - ?line non_existing = rpc:call(Node, code, where_is_file, ["kernel"]), % no such file + KernelEbinDir = rpc:call(Node, filename, dirname, [KernelBeamFile]), + AppFile = rpc:call(Node, filename, join, [KernelEbinDir,"kernel.app"]), + AppFile = rpc:call(Node, code, where_is_file, ["kernel.app"]), + non_existing = rpc:call(Node, code, where_is_file, ["kernel"]), % no such file ?t:stop_node(Node), ok. - + purge_stacktrace(suite) -> []; purge_stacktrace(doc) -> ["Test that stacktrace is deleted when purging a referred module"]; purge_stacktrace(Config) when is_list(Config) -> - ?line code:purge(code_b_test), + code:purge(code_b_test), try code_b_test:call(fun(b) -> ok end, a) catch error:function_clause -> - ?line code:load_file(code_b_test), - ?line case erlang:get_stacktrace() of + code:load_file(code_b_test), + case erlang:get_stacktrace() of [{?MODULE,_,[a],_}, {code_b_test,call,2,_}, {?MODULE,purge_stacktrace,1,_}|_] -> - ?line false = code:purge(code_b_test), - ?line [] = erlang:get_stacktrace() + false = code:purge(code_b_test), + [] = erlang:get_stacktrace() end end, try code_b_test:call(nofun, 2) catch error:function_clause -> - ?line code:load_file(code_b_test), - ?line case erlang:get_stacktrace() of + code:load_file(code_b_test), + case erlang:get_stacktrace() of [{code_b_test,call,[nofun,2],_}, {?MODULE,purge_stacktrace,1,_}|_] -> - ?line false = code:purge(code_b_test), - ?line [] = erlang:get_stacktrace() + false = code:purge(code_b_test), + [] = erlang:get_stacktrace() end end, Args = [erlang,error,[badarg]], try code_b_test:call(erlang, error, [badarg,Args]) catch error:badarg -> - ?line code:load_file(code_b_test), - ?line case erlang:get_stacktrace() of + code:load_file(code_b_test), + case erlang:get_stacktrace() of [{code_b_test,call,Args,_}, {?MODULE,purge_stacktrace,1,_}|_] -> - ?line false = code:purge(code_b_test), - ?line [] = erlang:get_stacktrace() + false = code:purge(code_b_test), + [] = erlang:get_stacktrace() end end, ok. mult_lib_roots(Config) when is_list(Config) -> - ?line DataDir = filename:join(?config(data_dir, Config), "mult_lib_roots"), - ?line mult_lib_compile(DataDir, "my_dummy_app-b/ebin/lists"), - ?line mult_lib_compile(DataDir, + DataDir = filename:join(?config(data_dir, Config), "mult_lib_roots"), + mult_lib_compile(DataDir, "my_dummy_app-b/ebin/lists"), + mult_lib_compile(DataDir, "my_dummy_app-c/ebin/code_SUITE_mult_root_module"), %% Set up ERL_LIBS and start a slave node. ErlLibs = filename:join(DataDir, "first_root") ++ mult_lib_sep() ++ filename:join(DataDir, "second_root"), - ?line {ok,Node} = + {ok,Node} = ?t:start_node(mult_lib_roots, slave, [{args,"-env ERL_LIBS "++ErlLibs}]), - ?line TSPath = filename:dirname(code:which(test_server)), - ?line Path0 = rpc:call(Node, code, get_path, []), - ?line [TSPath,"."|Path1] = Path0, - ?line [Kernel|Path2] = Path1, - ?line [Stdlib|Path3] = Path2, - ?line mult_lib_verify_lib(Kernel, "kernel"), - ?line mult_lib_verify_lib(Stdlib, "stdlib"), - ?line [Lib1,Lib2,Lib3,Lib4,Lib5|Path] = Path3, + TSPath = filename:dirname(code:which(test_server)), + Path0 = rpc:call(Node, code, get_path, []), + [TSPath,"."|Path1] = Path0, + [Kernel|Path2] = Path1, + [Stdlib|Path3] = Path2, + mult_lib_verify_lib(Kernel, "kernel"), + mult_lib_verify_lib(Stdlib, "stdlib"), + [Lib1,Lib2,Lib3,Lib4,Lib5|Path] = Path3, + - ["first_root/my_dummy_app-a/ebin", "first_root/my_dummy_app-b/ebin", "first_root/my_dummy_app-c/ebin", @@ -1103,7 +1099,7 @@ mult_lib_roots(Config) when is_list(Config) -> E <- lists:sort([Lib1,Lib2,Lib3,Lib4,Lib5])], io:format("~p\n", [Path]), - ?line true = rpc:call(Node, code_SUITE_mult_root_module, works_fine, []), + true = rpc:call(Node, code_SUITE_mult_root_module, works_fine, []), ok. @@ -1113,7 +1109,7 @@ mult_lib_compile(Root, Last) -> Dir = filename:dirname(Name), {ok,Mod} = compile:file(Name, [report,{outdir,Dir}]), ok. - + mult_lib_sep() -> case os:type() of {win32,_} -> ";"; @@ -1123,23 +1119,23 @@ mult_lib_sep() -> mult_lib_verify_lib(Path, Expected) -> Dir = filename:basename(filename:dirname(Path)), true = lists:prefix(Expected, Dir). - + mult_lib_remove_prefix([H|T1], [H|T2]) -> mult_lib_remove_prefix(T1, T2); mult_lib_remove_prefix([$/|T], []) -> T. bad_erl_libs(Config) when is_list(Config) -> - ?line {ok,Node} = + {ok,Node} = ?t:start_node(mult_lib_roots, slave, [{args,"-env ERL_LIBS "}]), - ?line ?t:stop_node(Node), + ?t:stop_node(Node), - ?line {ok,Node2} = + {ok,Node2} = ?t:start_node(mult_lib_roots, slave, [{args,"-env ERL_LIBS /no/such/dir"}]), - ?line ?t:stop_node(Node2), + ?t:stop_node(Node2), ok. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1158,55 +1154,55 @@ do_code_archive(Config, Root, StripVsn) when is_list(Config) -> PrivDir = ?config(priv_dir, Config), App = code_archive_dict, VsnBase = atom_to_list(App) ++ "-1.0", - Base = + Base = case StripVsn of true -> atom_to_list(App); false -> VsnBase end, Ext = init:archive_extension(), RootDir = filename:join([PrivDir, Root]), - ?line ok = file:make_dir(RootDir), + ok = file:make_dir(RootDir), Archive = filename:join([RootDir, VsnBase ++ Ext]), - ?line {ok, _} = zip:create(Archive, [VsnBase], + {ok, _} = zip:create(Archive, [VsnBase], [{compress, []}, {cwd, DataDir}]), - ?line {ok, _} = zip:extract(Archive, [{cwd, PrivDir}]), + {ok, _} = zip:extract(Archive, [{cwd, PrivDir}]), case StripVsn of true -> - ?line ok = file:rename(filename:join([PrivDir, VsnBase]), + ok = file:rename(filename:join([PrivDir, VsnBase]), filename:join([PrivDir, Base])); false -> ok end, - + io:format("DEBUG: ~p\n", [?LINE]), %% Compile the code - ?line ok = compile_app(PrivDir, Base), - + ok = compile_app(PrivDir, Base), + %% Create the archive - ?line ok = file:delete(Archive), - ?line {ok, _} = zip:create(Archive, [Base], + ok = file:delete(Archive), + {ok, _} = zip:create(Archive, [Base], [{compress, []}, {cwd, PrivDir}]), %% Set up ERL_LIBS and start a slave node. - ?line {ok, Node} = + {ok, Node} = ?t:start_node(code_archive, slave, [{args,"-env ERL_LIBS " ++ RootDir}]), - ?line CodePath = rpc:call(Node, code, get_path, []), + CodePath = rpc:call(Node, code, get_path, []), AppEbin = filename:join([Archive, Base, "ebin"]), io:format("AppEbin: ~p\n", [AppEbin]), io:format("CodePath: ~p\n", [CodePath]), io:format("Archive: ~p\n", [erl_prim_loader:read_file_info(Archive)]), - ?line true = lists:member(AppEbin, CodePath), + true = lists:member(AppEbin, CodePath), %% Start the app - ?line ok = rpc:call(Node, application, start, [App]), - + ok = rpc:call(Node, application, start, [App]), + %% Access the app priv dir AppPrivDir = rpc:call(Node, code, priv_dir, [App]), - ?line AppPrivFile = filename:join([AppPrivDir, "code_archive.txt"]), + AppPrivFile = filename:join([AppPrivDir, "code_archive.txt"]), io:format("AppPrivFile: ~p\n", [AppPrivFile]), - ?line {ok, _Bin, _Path} = + {ok, _Bin, _Path} = rpc:call(Node, erl_prim_loader, get_file, [AppPrivFile]), %% Use the app @@ -1221,14 +1217,14 @@ do_code_archive(Config, Root, StripVsn) when is_list(Config) -> error = rpc:call(Node, App, find, [Tab, Key]), ok = rpc:call(Node, App, erase, [Tab]), - ?line ?t:stop_node(Node), + ?t:stop_node(Node), ok. compile_app(TopDir, AppName) -> AppDir = filename:join([TopDir, AppName]), SrcDir = filename:join([AppDir, "src"]), OutDir = filename:join([AppDir, "ebin"]), - ?line {ok, Files} = file:list_dir(SrcDir), + {ok, Files} = file:list_dir(SrcDir), compile_files(Files, SrcDir, OutDir). compile_files([File | Files], SrcDir, OutDir) -> @@ -1253,27 +1249,27 @@ big_boot_embedded(doc) -> ["Test that a boot file with (almost) all of OTP can be used to start an" " embeddedd system."]; big_boot_embedded(Config) when is_list(Config) -> - ?line {BootArg,AppsInBoot} = create_big_boot(Config), - ?line {ok, Node} = + {BootArg,AppsInBoot} = create_big_boot(Config), + {ok, Node} = ?t:start_node(big_boot_embedded, slave, [{args,"-boot "++BootArg++" -mode embedded"}]), - ?line RemoteNodeApps = - [ {X,Y} || {X,_,Y} <- + RemoteNodeApps = + [ {X,Y} || {X,_,Y} <- rpc:call(Node,application,loaded_applications,[]) ], - ?line true = lists:sort(AppsInBoot) =:= lists:sort(RemoteNodeApps), + true = lists:sort(AppsInBoot) =:= lists:sort(RemoteNodeApps), ok. on_load(Config) when is_list(Config) -> Master = on_load_test_case_process, - ?line Data = filename:join([?config(data_dir, Config),"on_load"]), - ?line ok = file:set_cwd(Data), - ?line up_to_date = make:all([{d,'MASTER',Master}]), + Data = filename:join([?config(data_dir, Config),"on_load"]), + ok = file:set_cwd(Data), + up_to_date = make:all([{d,'MASTER',Master}]), %% Register a name for this process. - ?line register(Master, self()), - - ?line {_,Ref} = spawn_monitor(fun() -> + register(Master, self()), + + {_,Ref} = spawn_monitor(fun() -> exit(on_load_a:data()) end), receive @@ -1285,8 +1281,8 @@ on_load(Config) when is_list(Config) -> receive {on_load_c,PidC} -> ok end, - - ?line Refs = on_load_massive_spawn(lists:seq(1, 50)), + + Refs = on_load_massive_spawn(lists:seq(1, 50)), receive after 7 -> ok end, PidC ! go, @@ -1304,13 +1300,13 @@ on_load(Config) when is_list(Config) -> receive {'DOWN',Ref,process,_,Res} -> - ?line [a,b,c] = Res + [a,b,c] = Res end, on_load_wait_for_all(Refs), receive Any -> - ?line ?t:fail({unexpected,Any}) + ?t:fail({unexpected,Any}) after 10 -> ok end. @@ -1377,13 +1373,13 @@ on_load_embedded(Config) when is_list(Config) -> end. on_load_embedded_1(Config) -> - ?line DataDir = ?config(data_dir, Config), + DataDir = ?config(data_dir, Config), %% Link the on_load_app application into the lib directory. - ?line LibRoot = code:lib_dir(), - ?line LinkName = filename:join(LibRoot, "on_load_app-1.0"), - ?line OnLoadApp = filename:join(DataDir, "on_load_app-1.0"), - ?line del_link(LinkName), + LibRoot = code:lib_dir(), + LinkName = filename:join(LibRoot, "on_load_app-1.0"), + OnLoadApp = filename:join(DataDir, "on_load_app-1.0"), + del_link(LinkName), io:format("LinkName :~p, OnLoadApp: ~p~n",[LinkName,OnLoadApp]), case file:make_symlink(OnLoadApp, LinkName) of {error,enotsup} -> @@ -1392,28 +1388,28 @@ on_load_embedded_1(Config) -> end, %% Compile the code. - ?line OnLoadAppEbin = filename:join(LinkName, "ebin"), - ?line {ok,_ } = compile:file(filename:join([OnLoadApp,"src", + OnLoadAppEbin = filename:join(LinkName, "ebin"), + {ok,_ } = compile:file(filename:join([OnLoadApp,"src", "on_load_embedded"]), [{outdir,OnLoadAppEbin}]), %% Create and compile a boot file. - ?line true = code:add_pathz(OnLoadAppEbin), + true = code:add_pathz(OnLoadAppEbin), Options = case is_source_dir() of true -> [local]; false -> [] end, - ?line BootScript = create_boot(Config, Options), - ?line true = code:del_path(OnLoadAppEbin), + BootScript = create_boot(Config, Options), + true = code:del_path(OnLoadAppEbin), %% Start the node and check that the on_load function was run. - ?line {ok,Node} = start_node(on_load_embedded, + {ok,Node} = start_node(on_load_embedded, "-mode embedded -boot " ++ BootScript), ok = rpc:call(Node, on_load_embedded, status, []), %% Clean up. - ?line stop_node(Node), - ?line ok = del_link(LinkName). + stop_node(Node), + ok = del_link(LinkName). del_link(LinkName) -> case file:delete(LinkName) of @@ -1421,100 +1417,91 @@ del_link(LinkName) -> file:del_dir(LinkName); Other -> Other - end. + end. create_boot(Config, Options) -> - ?line {ok, OldDir} = file:get_cwd(), - ?line {LatestDir,LatestName} = create_script(Config), - ?line ok = file:set_cwd(LatestDir), - ?line ok = systools:make_script(LatestName, Options), - ?line ok = file:set_cwd(OldDir), + {ok, OldDir} = file:get_cwd(), + {LatestDir,LatestName} = create_script(Config), + ok = file:set_cwd(LatestDir), + ok = systools:make_script(LatestName, Options), + ok = file:set_cwd(OldDir), filename:join(LatestDir, LatestName). create_script(Config) -> - ?line PrivDir = ?config(priv_dir, Config), - ?line Name = PrivDir ++ "on_load_test", - ?line Apps = application_controller:which_applications(), - ?line {value,{_,_,KernelVer}} = lists:keysearch(kernel, 1, Apps), - ?line {value,{_,_,StdlibVer}} = lists:keysearch(stdlib, 1, Apps), - ?line {ok,Fd} = file:open(Name ++ ".rel", [write]), - ?line io:format(Fd, + PrivDir = ?config(priv_dir, Config), + Name = PrivDir ++ "on_load_test", + Apps = application_controller:which_applications(), + {value,{_,_,KernelVer}} = lists:keysearch(kernel, 1, Apps), + {value,{_,_,StdlibVer}} = lists:keysearch(stdlib, 1, Apps), + {ok,Fd} = file:open(Name ++ ".rel", [write]), + io:format(Fd, "{release, {\"Test release 3\", \"P2A\"}, \n" " {erts, \"9.42\"}, \n" " [{kernel, \"~s\"}, {stdlib, \"~s\"}," " {on_load_app, \"1.0\"}]}.\n", [KernelVer,StdlibVer]), - ?line file:close(Fd), + file:close(Fd), {filename:dirname(Name),filename:basename(Name)}. create_big_boot(Config) -> - ?line {ok, OldDir} = file:get_cwd(), - ?line {Options,Local} = case is_source_dir() of - true -> {[no_module_tests,local],true}; - _ -> {[no_module_tests],false} + {ok, OldDir} = file:get_cwd(), + {Options,Local} = case is_source_dir() of + true -> {[no_module_tests,local],true}; + _ -> {[no_module_tests],false} end, - ?line {LatestDir,LatestName,Apps} = create_big_script(Config,Local), - ?line ok = file:set_cwd(LatestDir), - ?line ok = systools:make_script(LatestName, Options), - ?line ok = file:set_cwd(OldDir), + {LatestDir,LatestName,Apps} = create_big_script(Config,Local), + ok = file:set_cwd(LatestDir), + ok = systools:make_script(LatestName, Options), + ok = file:set_cwd(OldDir), {filename:join(LatestDir, LatestName),Apps}. -% The following apps cannot be loaded +% The following apps cannot be loaded % hipe .app references (or can reference) files that have no % corresponding beam file (if hipe is not enabled) -filter_app("hipe",_) -> - false; +filter_app("hipe",_) -> false; % Dialyzer and typer depends on hipe -filter_app("dialyzer",_) -> - false; -filter_app("typer",_) -> - false; +filter_app("dialyzer",_) -> false; +filter_app("typer",_) -> false; % Orber requires explicit configuration -filter_app("orber",_) -> - false; +filter_app("orber",_) -> false; % cos* depends on orber -filter_app("cos"++_,_) -> - false; +filter_app("cos"++_,_) -> false; % ic has a mod instruction in the app file but no corresponding start function -filter_app("ic",_) -> - false; +filter_app("ic",_) -> false; % Netconf has some dependency that I really do not understand (maybe like orber) -filter_app("netconf",_) -> - false; +filter_app("netconf",_) -> false; % Safe has the same kind of error in the .app file as ic -filter_app("safe",_) -> - false; +filter_app("safe",_) -> false; % Comte cannot be started in the "usual" way -filter_app("comte",_) -> - false; +filter_app("comte",_) -> false; % OS_mon does not find it's port program when running cerl -filter_app("os_mon",true) -> - false; +filter_app("os_mon",true) -> false; +% erts is not a "real" app either =/ +filter_app("erts",_) -> false; % Other apps should be OK. -filter_app(_,_) -> - true. +filter_app(_,_) -> true. create_big_script(Config,Local) -> - ?line PrivDir = ?config(priv_dir, Config), - ?line Name = filename:join(PrivDir,"full_script_test"), - ?line InitialApplications=application:loaded_applications(), + PrivDir = ?config(priv_dir, Config), + Name = filename:join(PrivDir,"full_script_test"), + InitialApplications=application:loaded_applications(), %% Applications left loaded by the application suite, unload them! - ?line UnloadFix=[app0,app1,app2,group_leader,app_start_error], - ?line [application:unload(Leftover) || + UnloadFix=[app0,app1,app2,group_leader,app_start_error], + [application:unload(Leftover) || Leftover <- UnloadFix, lists:keymember(Leftover,1,InitialApplications) ], %% Now we should have only "real" applications... - ?line [application:load(list_to_atom(Y)) || {match,[Y]} <- [ re:run(X,code:lib_dir()++"/"++"([^/-]*).*/ebin",[{capture,[1],list}]) || X <- code:get_path()],filter_app(Y,Local)], - ?line Apps = [ {N,V} || {N,_,V} <- application:loaded_applications()], - ?line {ok,Fd} = file:open(Name ++ ".rel", [write]), - ?line io:format(Fd, + [application:load(list_to_atom(Y)) || {match,[Y]} <- [ re:run(X,code:lib_dir()++"/"++"([^/-]*).*/ebin",[{capture,[1],list}]) || X <- code:get_path()],filter_app(Y,Local)], + Apps = [ {N,V} || {N,_,V} <- application:loaded_applications()], + {ok,Fd} = file:open(Name ++ ".rel", [write]), + io:format(Fd, "{release, {\"Test release 3\", \"P2A\"}, \n" " {erts, \"9.42\"}, \n" " ~p}.\n", [Apps]), - ?line file:close(Fd), - ?line NewlyLoaded = + file:close(Fd), + NewlyLoaded = application:loaded_applications() -- InitialApplications, - ?line [ application:unload(N) || {N,_,_} <- NewlyLoaded], + [ application:unload(N) || {N,_,_} <- NewlyLoaded], {filename:dirname(Name),filename:basename(Name),Apps}. is_source_dir() -> @@ -1523,35 +1510,35 @@ is_source_dir() -> on_load_errors(Config) when is_list(Config) -> Master = on_load_error_test_case_process, - ?line register(Master, self()), + register(Master, self()), - ?line Data = filename:join([?config(data_dir, Config),"on_load_errors"]), - ?line ok = file:set_cwd(Data), - ?line up_to_date = make:all([{d,'MASTER',Master}]), + Data = filename:join([?config(data_dir, Config),"on_load_errors"]), + ok = file:set_cwd(Data), + up_to_date = make:all([{d,'MASTER',Master}]), - ?line do_on_load_error(an_atom), + do_on_load_error(an_atom), - ?line error_logger:add_report_handler(?MODULE, self()), + error_logger:add_report_handler(?MODULE, self()), - ?line do_on_load_error({something,terrible,is,wrong}), + do_on_load_error({something,terrible,is,wrong}), receive Any1 -> - ?line {_, "The on_load function"++_, + {_, "The on_load function"++_, [on_load_error, {something,terrible,is,wrong},_]} = Any1 end, - ?line do_on_load_error(fail), %Cause exception. + do_on_load_error(fail), %Cause exception. receive Any2 -> - ?line {_, "The on_load function"++_, + {_, "The on_load function"++_, [on_load_error,{failed,[_|_]},_]} = Any2 end, %% There should be no more messages. receive Unexpected -> - ?line ?t:fail({unexpected,Unexpected}) + ?t:fail({unexpected,Unexpected}) after 10 -> ok end, @@ -1559,14 +1546,14 @@ on_load_errors(Config) when is_list(Config) -> ok. do_on_load_error(ReturnValue) -> - ?line {_,Ref} = spawn_monitor(fun() -> + {_,Ref} = spawn_monitor(fun() -> exit(on_load_error:main()) end), receive {on_load_error,ErrorPid} -> ok end, - ?line ErrorPid ! ReturnValue, + ErrorPid ! ReturnValue, receive {'DOWN',Ref,process,_,Exit} -> - ?line {undef,[{on_load_error,main,[],_}|_]} = Exit + {undef,[{on_load_error,main,[],_}|_]} = Exit end. native_early_modules(suite) -> []; @@ -1580,10 +1567,10 @@ native_early_modules(Config) when is_list(Config) -> end. native_early_modules_1(Architecture) -> - ?line {lists, ListsBinary, _ListsFilename} = code:get_object_code(lists), - ?line ChunkName = hipe_unified_loader:chunk_name(Architecture), - ?line NativeChunk = beam_lib:chunks(ListsBinary, [ChunkName]), - ?line IsHipeCompiled = case NativeChunk of + {lists, ListsBinary, _ListsFilename} = code:get_object_code(lists), + ChunkName = hipe_unified_loader:chunk_name(Architecture), + NativeChunk = beam_lib:chunks(ListsBinary, [ChunkName]), + IsHipeCompiled = case NativeChunk of {ok,{_,[{_,Bin}]}} when is_binary(Bin) -> true; {error, beam_lib, _} -> false end, @@ -1591,10 +1578,10 @@ native_early_modules_1(Architecture) -> false -> {skip,"OTP apparently not configured with --enable-native-libs"}; true -> - ?line true = lists:all(fun code:is_module_native/1, - [ets,file,filename,gb_sets,gb_trees, - %%hipe_unified_loader, no_native as workaround - lists,os]), + true = lists:all(fun code:is_module_native/1, + [ets,file,filename,gb_sets,gb_trees, + %%hipe_unified_loader, no_native as workaround + lists,os]), ok end. diff --git a/lib/kernel/test/gen_sctp_SUITE.erl b/lib/kernel/test/gen_sctp_SUITE.erl index c5d8becfd3..e89cb44797 100644 --- a/lib/kernel/test/gen_sctp_SUITE.erl +++ b/lib/kernel/test/gen_sctp_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2012. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl index 2d5827282f..ee271fbdfa 100644 --- a/lib/kernel/test/gen_tcp_misc_SUITE.erl +++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1998-2012. All Rights Reserved. +%% Copyright Ericsson AB 1998-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/test/global_SUITE_data/global_trace.erl b/lib/kernel/test/global_SUITE_data/global_trace.erl index ddbe608c0a..00bacf8f54 100644 --- a/lib/kernel/test/global_SUITE_data/global_trace.erl +++ b/lib/kernel/test/global_SUITE_data/global_trace.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2009. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl index 1f7724d0dc..62ba95e1a3 100644 --- a/lib/kernel/test/inet_SUITE.erl +++ b/lib/kernel/test/inet_SUITE.erl @@ -183,80 +183,74 @@ t_gethostbyname(Config) when is_list(Config) -> h_addr_list = [IP]}, ?line HEntF_ = HEntF, ?line check_elems([{HEnt#hostent.h_aliases,[[],Aliases]}]), + %% + ?line FullNameU = toupper(FullName), + ?line {ok,HEntU} = inet:gethostbyname(FullNameU), + ?line FullNameU = toupper(HEntU#hostent.h_name), + ?line #hostent{ + h_addrtype = inet, + h_length = 4, + h_addr_list = [IP]} = HEntU, + ?line check_elems( + [{[toupper(H) || H <- HEntU#hostent.h_aliases], + [[],[toupper(A) || A <- Aliases]]}]), ?line {DName, _DFullName, _DIPStr, _DIP, _, _, _} = ct:get_config(test_dummy_host), ?line {error,nxdomain} = inet:gethostbyname(DName), - ?line {error,nxdomain} = inet:gethostbyname(IP_46_Str). + ?line {error,nxdomain} = inet:gethostbyname(IP_46_Str), + ok. t_gethostbyname_v6() -> required(v6). t_gethostbyname_v6(doc) -> "Test the inet:gethostbyname/1 inet6 function."; t_gethostbyname_v6(suite) -> []; t_gethostbyname_v6(Config) when is_list(Config) -> - ?line {Name, _, _, _,Aliases,IP_46_Str,IP_46} = - ct:get_config(test_host_ipv4_only), + {Name, FullName, IPStr, IP, Aliases} = + ct:get_config(test_host_ipv6_only), - case {inet:gethostbyname(IP_46_Str, inet6), - inet:gethostbyname(Name, inet6)} of - {{ok,HEnt46},{ok,_}} -> - ?line HEnt46_ = HEnt46#hostent{h_name = IP_46_Str, - h_addrtype = inet6, - h_length = 16, - h_addr_list = [IP_46]}, - ?line HEnt46_ = HEnt46, - ?line check_elems([{HEnt46#hostent.h_aliases,[[],Aliases]}]), - - ?line {Name6, FullName6, IPStr6, IP6, Aliases6} = - ct:get_config(test_host_ipv6_only), - ?line {ok,_} = inet:gethostbyname(IPStr6, inet6), - ?line {ok,HEnt6} = inet:gethostbyname(Name6, inet6), - ?line {ok,HEnt6} = inet:gethostbyname(list_to_atom(Name6), inet6), - ?line case HEnt6#hostent.h_addr_list of - [IP6] -> % ipv6 ok - ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6, - h_length = 16, - h_addr_list = [IP6]}, - ?line HEnt6_ = HEnt6, - ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]}, - {HEnt6#hostent.h_aliases,[[],Aliases6]}]); - _ -> % ipv4 compatible addr - ?line {ok,HEnt4} = inet:gethostbyname(Name6, inet), - ?line [IP4] = HEnt4#hostent.h_addr_list, - ?line {ok,IP46_2} = - inet_parse:ipv6_address("::ffff:"++inet_parse:ntoa(IP4)), - ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6, - h_length = 16, - h_addr_list = [IP46_2]}, - ?line HEnt6_ = HEnt6, - ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]}]) - end, - - ?line {ok,HEntF6} = inet:gethostbyname(FullName6, inet6), - ?line case HEntF6#hostent.h_addr_list of - [IP6] -> % ipv6 ok - ?line HEntF6_ = HEntF6#hostent{h_name = FullName6, - h_addrtype = inet6, - h_length = 16, - h_addr_list = [IP6]}, - ?line HEntF6_ = HEntF6, - ?line check_elems([{HEntF6#hostent.h_aliases,[[],Aliases6]}]); - _ -> % ipv4 compatible addr - ?line {ok,HEntF4} = inet:gethostbyname(FullName6, inet), - ?line [IPF4] = HEntF4#hostent.h_addr_list, - ?line {ok,IPF46_2} = - inet_parse:ipv6_address("::ffff:"++inet_parse:ntoa(IPF4)), - ?line HEntF6_ = HEntF6#hostent{h_addrtype = inet6, - h_length = 16, - h_addr_list = [IPF46_2]}, - ?line HEntF6_ = HEntF6, - ?line check_elems([{HEntF6#hostent.h_name,[Name6,FullName6]}]) - end, - - ?line {DName6, _DFullName6, _DIPStr6, _DIP6, _} = - ct:get_config(test_dummy_ipv6_host), - ?line {error,nxdomain} = inet:gethostbyname(DName6, inet6), - ok; - {_,_} -> + case inet:gethostbyname(Name, inet6) of + {ok,HEnt} -> + {ok,_} = inet:gethostbyname(IPStr, inet6), + {ok,HEnt} = inet:gethostbyname(list_to_atom(Name), inet6), + case HEnt#hostent.h_addr_list of + [IP] -> % IPv6 address + #hostent{h_addrtype = inet6, + h_length = 16} = HEnt, + check_elems( + [{HEnt#hostent.h_name,[Name,FullName]}, + {HEnt#hostent.h_aliases,[[],Aliases]}]); + [IP46] -> % IPv4 compatible address + {ok,HEnt4} = inet:gethostbyname(Name, inet), + #hostent{h_addrtype = inet, + h_length = 4, + h_addr_list = [IP4]} = HEnt4, + {ok,IP46} = + inet_parse:ipv6_address( + "::ffff:" ++ inet_parse:ntoa(IP4)), + check_elems( + [{HEnt#hostent.h_name,[Name,FullName]}]) + end, + + {ok,HEntF} = inet:gethostbyname(FullName, inet6), + case HEntF#hostent.h_addr_list of + [IP] -> % IPv6 address + #hostent{h_name = FullName, + h_addrtype = inet6, + h_length = 16} = HEntF, + check_elems( + [{HEnt#hostent.h_aliases,[[],Aliases]}]); + [IP46F] -> % IPv4 compatible address + {ok,HEnt4F} = inet:gethostbyname(FullName, inet), + #hostent{h_addrtype = inet, + h_length = 4, + h_addr_list = [IP4F]} = HEnt4F, + {ok,IP46F} = + inet_parse:ipv6_address( + "::ffff:" ++ inet_parse:ntoa(IP4F)), + check_elems( + [{HEntF#hostent.h_name,[Name,FullName]}]) + end; + _ -> {skip, "IPv6 is not supported on this host"} end. @@ -290,47 +284,35 @@ t_getaddr(Config) when is_list(Config) -> ?line {error,nxdomain} = inet:getaddr(DName, inet), ?line {error,nxdomain} = inet:getaddr(DFullName, inet), ?line {ok,DIP} = inet:getaddr(DIPStr, inet), - ?line {ok,DIP} = inet:getaddr(DIP, inet). + ?line {ok,DIP} = inet:getaddr(DIP, inet), + ok. t_getaddr_v6() -> required(v4) ++ required(v6). t_getaddr_v6(doc) -> "Test the inet:getaddr/2 function."; t_getaddr_v6(suite) -> []; t_getaddr_v6(Config) when is_list(Config) -> - ?line {Name,FullName,IPStr,_IP,_,IP_46_Str,IP46} = - ct:get_config(test_host_ipv4_only), - case {inet:getaddr(IP_46_Str, inet6),inet:getaddr(Name, inet6)} of - {{ok,IP46},{ok,V4Addr}} when V4Addr /= {0,0,0,0,0,0,0,1} -> - %% Since we suceeded in parsing an IPv6 address string and - %% look up the name, this computer fully supports IPv6. - ?line {ok,IP46} = inet:getaddr(IP46, inet6), - ?line {ok,IP46} = inet:getaddr(Name, inet6), - ?line {ok,IP46} = inet:getaddr(FullName, inet6), - ?line {ok,IP46} = inet:getaddr(IPStr, inet6), -%% ?line IP4toIP6 = inet:getaddr(IPStr, inet6), -%% ?line case IP4toIP6 of -%% {ok,IP46} -> -%% ?line ok; -%% {error,nxdomain} -> -%% ?line false = -%% lists:member(native, -%% inet_db:res_option(lookup)) -%% end, - ?line {Name6, FullName6, IPStr6, IP6, _} = - ct:get_config(test_host_ipv6_only), - ?line {ok,_} = inet:getaddr(list_to_atom(Name6), inet6), - ?line {ok,_} = inet:getaddr(Name6, inet6), - ?line {ok,_} = inet:getaddr(FullName6, inet6), - ?line {ok,IP6} = inet:getaddr(IP6, inet6), - ?line {ok,IP6} = inet:getaddr(IPStr6, inet6), - - ?line {DName6, DFullName6, DIPStr6, DIP6, _} = + {Name,FullName,IPStr,IP,_} = + ct:get_config(test_host_ipv6_only), + + case inet:getaddr(Name, inet6) of + {ok,Addr} -> + IP = Addr, + {ok,IP} = inet:getaddr(toupper(Name), inet6), + {ok,IP} = inet:getaddr(list_to_atom(Name), inet6), + {ok,IP} = inet:getaddr(list_to_atom(toupper(Name)), inet6), + {ok,IP} = inet:getaddr(FullName, inet6), + {ok,IP} = inet:getaddr(toupper(FullName), inet6), + {ok,IP} = inet:getaddr(IP, inet6), + {ok,IP} = inet:getaddr(IPStr, inet6), + %% + {DName,DFullName,DIPStr,DIP,_} = ct:get_config(test_dummy_ipv6_host), - ?line {error,nxdomain} = inet:getaddr(DName6, inet6), - ?line {error,nxdomain} = inet:getaddr(DFullName6, inet6), - ?line {ok,DIP6} = inet:getaddr(DIPStr6, inet6), - ?line {ok,DIP6} = inet:getaddr(DIP6, inet6), + {error,nxdomain} = inet:getaddr(DName, inet6), + {error,nxdomain} = inet:getaddr(DFullName, inet6), + {ok,DIP} = inet:getaddr(DIPStr, inet6), + {ok,DIP} = inet:getaddr(DIP, inet6), ok; - {_,_} -> + _ -> {skip, "IPv6 is not supported on this host"} end. @@ -608,8 +590,12 @@ t_parse_address(Func, [String|L]) -> t_parse_address(Func, L). parse_strict_address(Config) when is_list(Config) -> - {ok, Ipv4} = inet:parse_strict_address("127.0.0.1"), - {ok, Ipv6} = inet:parse_strict_address("c11:0c22:5c33:c440:55c0:c66c:77:0088"). + {ok, {127,0,0,1}} = + inet:parse_strict_address("127.0.0.1"), + {ok, {3089,3106,23603,50240,21952,50796,119,136}} = + inet:parse_strict_address("c11:0c22:5c33:c440:55c0:c66c:77:0088"), + {ok, {3089,3106,23603,50240,0,0,119,136}} = + inet:parse_strict_address("c11:0c22:5c33:c440::077:0088"). t_gethostnative(suite) ->[]; t_gethostnative(doc) ->[]; @@ -1102,3 +1088,14 @@ ip_member({127,_,_,_}, [{127,_,_,_}|_]) -> true; ip_member(K, [K|_]) -> true; ip_member(K, [_|T]) -> ip_member(K, T); ip_member(_, []) -> false. + +%% Case fold to upper case according to RFC 4343 +%% +toupper([C|Cs]) when is_integer(C) -> + if $a =< C, C =< $z -> + [(C - $a + $A)|toupper(Cs)]; + true -> + [C|toupper(Cs)] + end; +toupper([]) -> + []. diff --git a/lib/kernel/test/inet_res_SUITE.erl b/lib/kernel/test/inet_res_SUITE.erl index f3ba28e4f9..1bc93e3138 100644 --- a/lib/kernel/test/inet_res_SUITE.erl +++ b/lib/kernel/test/inet_res_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2009-2011. All Rights Reserved. +%% Copyright Ericsson AB 2009-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -282,6 +282,7 @@ basic(doc) -> basic(Config) when is_list(Config) -> NS = ns(Config), Name = "ns.otptest", + NameC = caseflip(Name), IP = {127,0,0,254}, %% %% nslookup @@ -292,6 +293,17 @@ basic(Config) when is_list(Config) -> Bin1 = inet_dns:encode(Msg1), %%io:format("Bin1 = ~w~n", [Bin1]), {ok,Msg1} = inet_dns:decode(Bin1), + %% Now with scrambled case + {ok,Msg1b} = inet_res:nslookup(NameC, in, a, [NS]), + io:format("~p~n", [Msg1b]), + [RR1b] = inet_dns:msg(Msg1b, anlist), + IP = inet_dns:rr(RR1b, data), + Bin1b = inet_dns:encode(Msg1b), + %%io:format("Bin1b = ~w~n", [Bin1b]), + {ok,Msg1b} = inet_dns:decode(Bin1b), + true = + (tolower(inet_dns:rr(RR1, domain)) + =:= tolower(inet_dns:rr(RR1b, domain))), %% %% resolve {ok,Msg2} = inet_res:resolve(Name, in, a, [{nameservers,[NS]},verbose]), @@ -301,15 +313,29 @@ basic(Config) when is_list(Config) -> Bin2 = inet_dns:encode(Msg2), %%io:format("Bin2 = ~w~n", [Bin2]), {ok,Msg2} = inet_dns:decode(Bin2), + %% Now with scrambled case + {ok,Msg2b} = inet_res:resolve(NameC, in, a, [{nameservers,[NS]},verbose]), + io:format("~p~n", [Msg2b]), + [RR2b] = inet_dns:msg(Msg2b, anlist), + IP = inet_dns:rr(RR2b, data), + Bin2b = inet_dns:encode(Msg2b), + %%io:format("Bin2b = ~w~n", [Bin2b]), + {ok,Msg2b} = inet_dns:decode(Bin2b), + true = + (tolower(inet_dns:rr(RR2, domain)) + =:= tolower(inet_dns:rr(RR2b, domain))), %% %% lookup [IP] = inet_res:lookup(Name, in, a, [{nameservers,[NS]},verbose]), + [IP] = inet_res:lookup(NameC, in, a, [{nameservers,[NS]},verbose]), %% %% gethostbyname {ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(Name), + {ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(NameC), %% %% getbyname {ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(Name, a), + {ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(NameC, a), ok. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -317,63 +343,115 @@ basic(Config) when is_list(Config) -> resolve(doc) -> ["Lookup different records using resolve/2..4"]; resolve(Config) when is_list(Config) -> + Class = in, NS = ns(Config), Domain = "otptest", RDomain4 = "0.0.127.in-addr.arpa", RDomain6 = "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa", Name = "resolve."++Domain, - L = [{in,a,Name,[{127,0,0,28}],undefined}, - {in,aaaa,Name,[{0,0,0,0,0,0,32512,28}],undefined}, - {in,cname,"cname."++Name,[Name],undefined}, - {in,a,"cname."++Name,[Name,{127,0,0,28}],undefined}, - {in,ns,"ns."++Name,[],[Name]}, - {in,soa,Domain,[],[{"ns.otptest","lsa.otptest",1,60,10,300,30}]}, + L = [{a,Name,[{a,{127,0,0,28}}],undefined}, + {aaaa,Name,[{aaaa,{0,0,0,0,0,0,32512,28}}],undefined}, + {cname,"cname."++Name,[{cname,Name}],undefined}, + {a,"cname."++Name,[{cname,Name},{a,{127,0,0,28}}],undefined}, + {ns,"ns."++Name,[],[{ns,Name}]}, + {soa,Domain,[],[{soa,{"ns.otptest","lsa.otptest",1,60,10,300,30}}]}, %% WKS: protocol TCP (6), services (bits) TELNET (23) and SMTP (25) - {in,wks,"wks."++Name,[{{127,0,0,28},6,<<0,0,1,64>>}],undefined}, - {in,ptr,"28."++RDomain4,[Name],undefined}, - {in,ptr,"c.1.0.0.0.0.f.7."++RDomain6,[Name],undefined}, - {in,hinfo,Name,[{"BEAM","Erlang/OTP"}],undefined}, - {in,mx,RDomain4,[{10,"mx."++Domain}],undefined}, - {in,srv,"_srv._tcp."++Name,[{10,3,4711,Name}],undefined}, - {in,naptr,"naptr."++Name, - [{10,5,"s","http","","_srv._tcp."++Name}],undefined}, - {in,txt,"txt."++Name, - [["Hej ","du ","glade "],["ta ","en ","spade!"]],undefined}, - {in,mb,"mb."++Name,["mx."++Name],undefined}, - {in,mg,"mg."++Name,["lsa."++Domain],undefined}, - {in,mr,"mr."++Name,["lsa."++Domain],undefined}, - {in,minfo,"minfo."++Name, - [{"minfo-owner."++Name,"minfo-bounce."++Name}],undefined}, - {in,any,"cname."++Name,[Name],undefined}, - {in,any,Name,[{127,0,0,28}, - {0,0,0,0,0,0,32512,28}, - {"BEAM","Erlang/OTP"}],undefined} + {wks,"wks."++Name,[{wks,{{127,0,0,28},6,<<0,0,1,64>>}}],undefined}, + {ptr,"28."++RDomain4,[{ptr,Name}],undefined}, + {ptr,"c.1.0.0.0.0.f.7."++RDomain6,[{ptr,Name}],undefined}, + {hinfo,Name,[{hinfo,{"BEAM","Erlang/OTP"}}],undefined}, + {mx,RDomain4,[{mx,{10,"mx."++Domain}}],undefined}, + {srv,"_srv._tcp."++Name,[{srv,{10,3,4711,Name}}],undefined}, + {naptr,"naptr."++Name, + [{naptr,{10,5,"s","http","","_srv._tcp."++Name}}], + undefined}, + {txt,"txt."++Name, + [{txt,["Hej ","du ","glade "]},{txt,["ta ","en ","spade!"]}], + undefined}, + {mb,"mb."++Name,[{mb,"mx."++Name}],undefined}, + {mg,"mg."++Name,[{mg,"Lsa."++Domain}],undefined}, + {mr,"mr."++Name,[{mr,"LSA."++Domain}],undefined}, + {minfo,"minfo."++Name, + [{minfo,{"minfo-OWNER."++Name,"MinfoBounce."++Name}}], + undefined}, + {any,"cname."++Name,[{cname,Name}],undefined}, + {any,Name, + [{a,{127,0,0,28}}, + {aaaa,{0,0,0,0,0,0,32512,28}}, + {hinfo,{"BEAM","Erlang/OTP"}}], + undefined} ], - resolve([{edns,false},{nameservers,[NS]}], L), - resolve([{edns,0},{nameservers,[NS]}], L). - -resolve(_Opts, []) -> ok; -resolve(Opts, [{Class,Type,Name,Answers,Authority}=Q|Qs]) -> + resolve(Class, [{edns,0},{nameservers,[NS]}], L), + resolve(Class, [{edns,false},{nameservers,[NS]}], L), + %% Again, to see ensure the cache does not mess things up + resolve(Class, [{edns,0},{nameservers,[NS]}], L), + resolve(Class, [{edns,false},{nameservers,[NS]}], L). + +resolve(_Class, _Opts, []) -> + ok; +resolve(Class, Opts, [{Type,Nm,Answers,Authority}=Q|Qs]) -> io:format("Query: ~p~nOptions: ~p~n", [Q,Opts]), - {ok,Msg} = inet_res:resolve(Name, Class, Type, Opts), + {Name,NameC} = + case erlang:phash2(Q) band 4 of + 0 -> + {Nm,caseflip(Nm)}; + _ -> + {caseflip(Nm),Nm} + end, AnList = if Answers =/= undefined -> - lists:sort(Answers); + normalize_answers(Answers); true -> undefined end, NsList = if Authority =/= undefined -> - lists:sort(Authority); + normalize_answers(Authority); true -> undefined end, - case {lists:sort - ([inet_dns:rr(RR, data) || RR <- inet_dns:msg(Msg, anlist)]), - lists:sort - ([inet_dns:rr(RR, data) || RR <- inet_dns:msg(Msg, nslist)])} of + {ok,Msg} = inet_res:resolve(Name, Class, Type, Opts), + check_msg(Class, Type, Msg, AnList, NsList), + {ok,MsgC} = inet_res:resolve(NameC, Class, Type, Opts), + check_msg(Class, Type, MsgC, AnList, NsList), + resolve(Class, Opts, Qs). + + + +normalize_answers(AnList) -> + lists:sort([normalize_answer(Answer) || Answer <- AnList]). + +normalize_answer({soa,{NS,HM,Ser,Ref,Ret,Exp,Min}}) -> + {tolower(NS),tolower_email(HM),Ser,Ref,Ret,Exp,Min}; +normalize_answer({mx,{Prio,DN}}) -> + {Prio,tolower(DN)}; +normalize_answer({srv,{Prio,Weight,Port,DN}}) -> + {Prio,Weight,Port,tolower(DN)}; +normalize_answer({naptr,{Order,Pref,Flags,Service,RE,Repl}}) -> + {Order,Pref,Flags,Service,RE,tolower(Repl)}; +normalize_answer({minfo,{RespM,ErrM}}) -> + {tolower_email(RespM),tolower_email(ErrM)}; +normalize_answer({T,MN}) when T =:= mg; T =:= mr -> + tolower_email(MN); +normalize_answer({T,DN}) when T =:= cname; T =:= ns; T =:= ptr; T =:= mb -> + tolower(DN); +normalize_answer(Answer) -> + Answer. + +check_msg(Class, Type, Msg, AnList, NsList) -> + io:format("check_msg Type: ~p, Msg: ~p~n.", [Type,Msg]), + case {normalize_answers( + [begin + Class = inet_dns:rr(RR, class), + {inet_dns:rr(RR, type),inet_dns:rr(RR, data)} + end || RR <- inet_dns:msg(Msg, anlist)]), + normalize_answers( + [begin + Class = inet_dns:rr(RR, class), + {inet_dns:rr(RR, type),inet_dns:rr(RR, data)} + end || RR <- inet_dns:msg(Msg, nslist)])} of {AnList,NsList} -> ok; {NsList,AnList} when Type =:= ns -> @@ -389,7 +467,7 @@ resolve(Opts, [{Class,Type,Name,Answers,Authority}=Q|Qs]) -> end, Buf = inet_dns:encode(Msg), {ok,Msg} = inet_dns:decode(Buf), - resolve(Opts, Qs). + ok. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -497,6 +575,7 @@ files_monitor(Config) when is_list(Config) -> do_files_monitor(Config) -> Dir = ?config(priv_dir, Config), {ok,Hostname} = inet:gethostname(), + io:format("Hostname = ~p.~n", [Hostname]), FQDN = case inet_db:res_option(domain) of "" -> @@ -504,11 +583,13 @@ do_files_monitor(Config) -> _ -> Hostname++"."++inet_db:res_option(domain) end, + io:format("FQDN = ~p.~n", [FQDN]), HostsFile = filename:join(Dir, "files_monitor_hosts"), ResolvConf = filename:join(Dir, "files_monitor_resolv.conf"), ok = inet_db:res_option(resolv_conf, ResolvConf), ok = inet_db:res_option(hosts_file, HostsFile), [] = inet_db:res_option(search), + %% The inet function will use its final fallback to find this host {ok,#hostent{h_name = Hostname, h_addrtype = inet, h_length = 4, @@ -521,6 +602,7 @@ do_files_monitor(Config) -> {error,nxdomain} = inet_res:gethostbyname(FQDN), {ok,{127,0,0,10}} = inet:getaddr("mx.otptest", inet), {ok,{0,0,0,0,0,0,32512,28}} = inet:getaddr("resolve.otptest", inet6), + %% The inet function will use its final fallback to find this host {ok,#hostent{h_name = Hostname, h_addrtype = inet6, h_length = 16, @@ -603,3 +685,41 @@ ipv4_to_ipv6() -> inet_SUITE:ipv4_to_ipv6(). ipv4_to_ipv6(Config) -> inet_SUITE:ipv4_to_ipv6(Config). host_and_addr() -> inet_SUITE:host_and_addr(). host_and_addr(Config) -> inet_SUITE:host_and_addr(Config). + + + +%% Case flip helper + +caseflip([C|Cs]) when is_integer(C), $a =< C, C =< $z -> + [(C - $a + $A)|caseflip_skip(Cs)]; +caseflip([C|Cs]) when is_integer(C), $A =< C, C =< $Z -> + [(C - $A + $a)|caseflip_skip(Cs)]; +caseflip([C|Cs]) -> + [C|caseflip(Cs)]; +caseflip([]) -> + []. + +caseflip_skip([C|Cs]) when is_integer(C), $a =< C, C =< $z -> + [C|caseflip(Cs)]; +caseflip_skip([C|Cs]) when is_integer(C), $A =< C, C =< $Z -> + [C|caseflip(Cs)]; +caseflip_skip([C|Cs]) -> + [C|caseflip_skip(Cs)]; +caseflip_skip([]) -> + []. + +tolower_email([$.|Cs]) -> + [$.|tolower(Cs)]; +tolower_email([C|Cs]) -> + [C|tolower_email(Cs)]. + +%% Case fold to lower case according to RFC 4343 +%% +tolower([C|Cs]) when is_integer(C) -> + if $A =< C, C =< $Z -> + [(C - $A + $a)|tolower(Cs)]; + true -> + [C|tolower(Cs)] + end; +tolower([]) -> + []. diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf b/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf index 0b01b25204..2d68f6e59c 100644 --- a/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf +++ b/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf @@ -2,11 +2,11 @@ zone "." in { type master; file "root.zone"; }; -zone "0.0.127.in-addr.arpa" in { +zone "0.0.127.in-addr.arpa." in { type master; file "0.0.127.in-addr.arpa.zone"; }; -zone "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" in { +zone "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa." in { type master; file "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone"; -};
\ No newline at end of file +}; diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone b/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone index 11cba18d45..5a56eac95c 100644 --- a/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone +++ b/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone @@ -43,8 +43,8 @@ naptr.resolve.otptest IN NAPTR 10 5 "S" "HTTP" "" _srv._tcp.resolve.otptest txt.resolve.otptest IN TXT "Hej " "du " "glade " txt.resolve.otptest IN TXT "ta " "en " "spade!" mb.resolve.otptest IN MB mx.resolve.otptest -mg.resolve.otptest IN MG lsa.otptest -mr.resolve.otptest IN MR lsa.otptest -minfo.resolve.otptest IN MINFO minfo-owner.resolve.otptest minfo-bounce.resolve.otptest +mg.resolve.otptest IN MG Lsa.otptest +mr.resolve.otptest IN MR LSA.otptest +minfo.resolve.otptest IN MINFO minfo-OWNER.resolve.otptest MinfoBounce.resolve.otptest ns.otptest IN A 127.0.0.254 diff --git a/lib/kernel/test/inet_sockopt_SUITE.erl b/lib/kernel/test/inet_sockopt_SUITE.erl index 185751fead..9d236a8a0a 100644 --- a/lib/kernel/test/inet_sockopt_SUITE.erl +++ b/lib/kernel/test/inet_sockopt_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2012. All Rights Reserved. +%% Copyright Ericsson AB 2007-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/kernel/vsn.mk b/lib/kernel/vsn.mk index 49404196dd..96c1e3d83d 100644 --- a/lib/kernel/vsn.mk +++ b/lib/kernel/vsn.mk @@ -1 +1 @@ -KERNEL_VSN = 2.16.2 +KERNEL_VSN = 2.16.3 diff --git a/lib/megaco/aclocal.m4 b/lib/megaco/aclocal.m4 index 25f40944e7..46b30a16b3 100644 --- a/lib/megaco/aclocal.m4 +++ b/lib/megaco/aclocal.m4 @@ -954,6 +954,40 @@ dnl AC_DEFUN(ERL_FIND_ETHR_LIB, [ +AC_ARG_ENABLE(native-ethr-impls, + AS_HELP_STRING([--disable-native-ethr-impls], + [disable native ethread implementations]), +[ case "$enableval" in + no) disable_native_ethr_impls=yes ;; + *) disable_native_ethr_impls=no ;; + esac ], disable_native_ethr_impls=no) + +test "X$disable_native_ethr_impls" = "Xyes" && + AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) + +AC_ARG_ENABLE(x86-out-of-order, + AS_HELP_STRING([--enable-x86-out-of-order], + [enable x86/x84_64 out of order support (default disabled)])) + +AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, + AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], + [prefer gcc native ethread implementations]), +[ case "$enableval" in + yes) enable_prefer_gcc_native_ethr_impls=yes ;; + *) enable_prefer_gcc_native_ethr_impls=no ;; + esac ], enable_prefer_gcc_native_ethr_impls=no) + +test $enable_prefer_gcc_native_ethr_impls = yes && + AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) + +AC_ARG_WITH(libatomic_ops, + AS_HELP_STRING([--with-libatomic_ops=PATH], + [specify and prefer usage of libatomic_ops in the ethread library])) + +AC_ARG_WITH(with_sparc_memory_order, + AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], + [specify sparc memory order (defaults to RMO)])) + LM_CHECK_THR_LIB ERL_INTERNAL_LIBS @@ -1003,40 +1037,44 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads]) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) - + if test "X$disable_native_ethr_impls" = "Xyes"; then + have_interlocked_op=no + ethr_have_native_atomics=no + else + ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) + fi test "$ethr_have_native_atomics" = "yes" && ethr_have_native_spinlock=yes ;; @@ -1303,93 +1341,98 @@ case "$THR_LIB_NAME" in int128="__int128_t" fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + if test "X$disable_native_ethr_impls" = "Xyes"; then + ethr_have_native_atomics=no + else + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + + if test $int128 != no; then + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) + fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + AC_MSG_CHECKING([for a usable libatomic_ops implementation]) + case "x$with_libatomic_ops" in + xno | xyes | x) + libatomic_ops_include= + ;; + *) + if test -d "${with_libatomic_ops}/include"; then + libatomic_ops_include="-I$with_libatomic_ops/include" + CPPFLAGS="$CPPFLAGS $libatomic_ops_include" + else + AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) + fi;; + esac + ethr_have_libatomic_ops=no + AC_TRY_LINK([#include "atomic_ops.h"], + [ + volatile AO_t x; + AO_t y; + int z; + + AO_nop_full(); + AO_store(&x, (AO_t) 0); + z = AO_load(&x); + z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); + ], + [ethr_have_native_atomics=yes + ethr_have_libatomic_ops=yes]) + AC_MSG_RESULT([$ethr_have_libatomic_ops]) + if test $ethr_have_libatomic_ops = yes; then + AC_CHECK_SIZEOF(AO_t, , + [ + #include <stdio.h> + #include "atomic_ops.h" + ]) + AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) + + AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) + if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) + fi + ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" + elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_MSG_ERROR([No usable libatomic_ops implementation found]) + fi - if test $int128 != no; then - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) - fi + case "$host_cpu" in + sparc | sun4u | sparc64 | sun4v) + case "$with_sparc_memory_order" in + "TSO") + AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; + "PSO") + AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; + "RMO"|"") + AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; + *) + AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; + esac + ethr_have_native_atomics=yes;; + i86pc | i*86 | x86_64 | amd64) + if test "$enable_x86_out_of_order" = "yes"; then + AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) + fi + ethr_have_native_atomics=yes;; + macppc | ppc | powerpc | "Power Macintosh") + ethr_have_native_atomics=yes;; + tile) + ethr_have_native_atomics=yes;; + *) + ;; + esac - AC_MSG_CHECKING([for a usable libatomic_ops implementation]) - case "x$with_libatomic_ops" in - xno | xyes | x) - libatomic_ops_include= - ;; - *) - if test -d "${with_libatomic_ops}/include"; then - libatomic_ops_include="-I$with_libatomic_ops/include" - CPPFLAGS="$CPPFLAGS $libatomic_ops_include" - else - AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) - fi;; - esac - ethr_have_libatomic_ops=no - AC_TRY_LINK([#include "atomic_ops.h"], - [ - volatile AO_t x; - AO_t y; - int z; - - AO_nop_full(); - AO_store(&x, (AO_t) 0); - z = AO_load(&x); - z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); - ], - [ethr_have_native_atomics=yes - ethr_have_libatomic_ops=yes]) - AC_MSG_RESULT([$ethr_have_libatomic_ops]) - if test $ethr_have_libatomic_ops = yes; then - AC_CHECK_SIZEOF(AO_t, , - [ - #include <stdio.h> - #include "atomic_ops.h" - ]) - AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) - - AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) - if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) - fi - ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" - elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_MSG_ERROR([No usable libatomic_ops implementation found]) fi - case "$host_cpu" in - sparc | sun4u | sparc64 | sun4v) - case "$with_sparc_memory_order" in - "TSO") - AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; - "PSO") - AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; - "RMO"|"") - AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; - *) - AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; - esac - ethr_have_native_atomics=yes;; - i86pc | i*86 | x86_64 | amd64) - if test "$enable_x86_out_of_order" = "yes"; then - AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) - fi - ethr_have_native_atomics=yes;; - macppc | ppc | "Power Macintosh") - ethr_have_native_atomics=yes;; - tile) - ethr_have_native_atomics=yes;; - *) - ;; - esac - test ethr_have_native_atomics = "yes" && ethr_have_native_spinlock=yes dnl Restore LIBS @@ -1451,40 +1494,6 @@ esac AC_C_DOUBLE_MIDDLE_ENDIAN -AC_ARG_ENABLE(native-ethr-impls, - AS_HELP_STRING([--disable-native-ethr-impls], - [disable native ethread implementations]), -[ case "$enableval" in - no) disable_native_ethr_impls=yes ;; - *) disable_native_ethr_impls=no ;; - esac ], disable_native_ethr_impls=no) - -AC_ARG_ENABLE(x86-out-of-order, - AS_HELP_STRING([--enable-x86-out-of-order], - [enable x86/x84_64 out of order support (default disabled)])) - -test "X$disable_native_ethr_impls" = "Xyes" && - AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) - -AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, - AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], - [prefer gcc native ethread implementations]), -[ case "$enableval" in - yes) enable_prefer_gcc_native_ethr_impls=yes ;; - *) enable_prefer_gcc_native_ethr_impls=no ;; - esac ], enable_prefer_gcc_native_ethr_impls=no) - -test $enable_prefer_gcc_native_ethr_impls = yes && - AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) - -AC_ARG_WITH(libatomic_ops, - AS_HELP_STRING([--with-libatomic_ops=PATH], - [specify and prefer usage of libatomic_ops in the ethread library])) - -AC_ARG_WITH(with_sparc_memory_order, - AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], - [specify sparc memory order (defaults to RMO)])) - ETHR_X86_SSE2_ASM=no case "$GCC-$ac_cv_sizeof_void_p-$host_cpu" in yes-4-i86pc | yes-4-i*86 | yes-4-x86_64 | yes-4-amd64) diff --git a/lib/megaco/doc/src/notes.xml b/lib/megaco/doc/src/notes.xml index 91905b76f7..25edf8bb7d 100644 --- a/lib/megaco/doc/src/notes.xml +++ b/lib/megaco/doc/src/notes.xml @@ -36,7 +36,22 @@ section is the version number of Megaco.</p> - <section><title>Megaco 3.17</title> + <section><title>Megaco 3.17.0.1</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + +<section><title>Megaco 3.17</title> <p>Version 3.17 supports code replacement in runtime from/to version 3.16.0.3 and and 3.16.0.2. </p> diff --git a/lib/megaco/vsn.mk b/lib/megaco/vsn.mk index 68b12c0286..db956102a6 100644 --- a/lib/megaco/vsn.mk +++ b/lib/megaco/vsn.mk @@ -18,6 +18,6 @@ # %CopyrightEnd% APPLICATION = megaco -MEGACO_VSN = 3.17 +MEGACO_VSN = 3.17.0.1 PRE_VSN = APP_VSN = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)" diff --git a/lib/mnesia/doc/src/notes.xml b/lib/mnesia/doc/src/notes.xml index 5942a40a87..790f5d92b5 100644 --- a/lib/mnesia/doc/src/notes.xml +++ b/lib/mnesia/doc/src/notes.xml @@ -38,7 +38,37 @@ thus constitutes one section in this document. The title of each section is the version number of Mnesia.</p> - <section><title>Mnesia 4.8</title> + <section><title>Mnesia 4.9</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + If mnesia:clear_table/2 was called during a table load on + that table, the schema record was written to the table + instead of clearing table.</p> + <p> + Own Id: OTP-11030 Aux Id: seq12267 </p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Optimize index creation for Mnesia set tables. Thanks to + Nick Marino.</p> + <p> + Own Id: OTP-11103</p> + </item> + </list> + </section> + +</section> + +<section><title>Mnesia 4.8</title> <section><title>Fixed Bugs and Malfunctions</title> <list> diff --git a/lib/mnesia/src/mnesia_index.erl b/lib/mnesia/src/mnesia_index.erl index 6f9f575d93..54db45e3ba 100644 --- a/lib/mnesia/src/mnesia_index.erl +++ b/lib/mnesia/src/mnesia_index.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/mnesia/src/mnesia_subscr.erl b/lib/mnesia/src/mnesia_subscr.erl index 415c69d508..8f78dc55e8 100644 --- a/lib/mnesia/src/mnesia_subscr.erl +++ b/lib/mnesia/src/mnesia_subscr.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2010. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -447,8 +447,12 @@ deactivate(ClientPid, What, Var, SubscrTab) -> {'EXIT', _} -> unlink(ClientPid) end, - del_subscr(Var, What, ClientPid), - {ok, node()}. + try + del_subscr(Var, What, ClientPid), + {ok, node()} + catch _:_ -> + {error, badarg} + end. del_subscr(subscribers, _What, Pid) -> mnesia_lib:del(subscribers, Pid); diff --git a/lib/mnesia/test/mnesia_durability_test.erl b/lib/mnesia/test/mnesia_durability_test.erl index 1de62a7d25..4434abaa1e 100644 --- a/lib/mnesia/test/mnesia_durability_test.erl +++ b/lib/mnesia/test/mnesia_durability_test.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2011. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/mnesia/test/mnesia_evil_coverage_test.erl b/lib/mnesia/test/mnesia_evil_coverage_test.erl index 0df245b75d..db23a39943 100644 --- a/lib/mnesia/test/mnesia_evil_coverage_test.erl +++ b/lib/mnesia/test/mnesia_evil_coverage_test.erl @@ -1985,6 +1985,10 @@ subscribe_standard(Config) when is_list(Config)-> ?match({atomic, ok}, mnesia:create_table(Tab, Def)), %% Check system events + ?match({error, {badarg, foo}}, mnesia:unsubscribe(foo)), + ?match({error, badarg}, mnesia:unsubscribe({table, foo})), + ?match(_, mnesia:unsubscribe(activity)), + ?match({ok, N1}, mnesia:subscribe(system)), ?match({ok, N1}, mnesia:subscribe(activity)), diff --git a/lib/mnesia/test/mnesia_isolation_test.erl b/lib/mnesia/test/mnesia_isolation_test.erl index 3273bc4d40..d57f976d1f 100644 --- a/lib/mnesia/test/mnesia_isolation_test.erl +++ b/lib/mnesia/test/mnesia_isolation_test.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2010. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -613,11 +613,11 @@ unbound2(Config) when is_list(Config) -> ?match_receive({B, continuing}), %% B should now be in lock queue. - A ! continue, - ?match_receive({A, {atomic, ok}}), - ?match_receive({B, {atomic, [{ul,{key,{17,42}},val}]}}), + A ! continue, + ?match_multi_receive([{A, {atomic, ok}}, + {B, {atomic, [{ul,{key,{17,42}},val}]}}]), ok. - + receiver() -> receive {_Pid, begin_trans} -> diff --git a/lib/mnesia/vsn.mk b/lib/mnesia/vsn.mk index 8cd97342af..d7a132bc1a 100644 --- a/lib/mnesia/vsn.mk +++ b/lib/mnesia/vsn.mk @@ -1 +1 @@ -MNESIA_VSN = 4.8 +MNESIA_VSN = 4.9 diff --git a/lib/observer/doc/src/crashdump_ug.xml b/lib/observer/doc/src/crashdump_ug.xml index 8b60f6ee98..8aef1ffdf0 100644 --- a/lib/observer/doc/src/crashdump_ug.xml +++ b/lib/observer/doc/src/crashdump_ug.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2003</year><year>2011</year> + <year>2003</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/observer/doc/src/notes.xml b/lib/observer/doc/src/notes.xml index ddf3b3fe37..34e87374a2 100644 --- a/lib/observer/doc/src/notes.xml +++ b/lib/observer/doc/src/notes.xml @@ -31,6 +31,69 @@ <p>This document describes the changes made to the Observer application.</p> +<section><title>Observer 1.3.1</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Some bugs related to calculation of CPU/scheduler + utilization in observer are corrected.</p> + <p> + Current function for a process is accepted to be + 'undefined' when running hipe.</p> + <p> + Own Id: OTP-10894</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + <list> <item> The new Memory field from a crash dump is + now presented by crashdump viewer, both in the process + overview and in the process detail page. </item> <item> A + summary of blocks- and carriers sizes is added to the + allocator information page in the crashdump viewer. + </item> </list></p> + <p> + Own Id: OTP-10604 Aux Id: kunagi-336 [247] </p> + </item> + <item> + <p> + Use "open" as default browser for crashdump viewer on Mac + OS X. Thanks to Magnus Henoch.</p> + <p> + Own Id: OTP-10929</p> + </item> + <item> + <p> + Fix observer table viewer crash on formatting improper + lists. Thanks to Andrey Tsirulev</p> + <p> + Own Id: OTP-10931</p> + </item> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + <item> + <p> + Add processes state view in observer. Thanks to Eric + Pailleau.</p> + <p> + Own Id: OTP-11136</p> + </item> + </list> + </section> + +</section> + <section><title>Observer 1.3</title> <section><title>Improvements and New Features</title> diff --git a/lib/observer/src/observer_procinfo.erl b/lib/observer/src/observer_procinfo.erl index f234218017..98d0403139 100644 --- a/lib/observer/src/observer_procinfo.erl +++ b/lib/observer/src/observer_procinfo.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2011-2012. All Rights Reserved. +%% Copyright Ericsson AB 2011-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/observer/src/observer_tv_table.erl b/lib/observer/src/observer_tv_table.erl index 83619414ad..b4832d9599 100644 --- a/lib/observer/src/observer_tv_table.erl +++ b/lib/observer/src/observer_tv_table.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2011-2012. All Rights Reserved. +%% Copyright Ericsson AB 2011-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/observer/vsn.mk b/lib/observer/vsn.mk index 1ff1b3ec52..96d9d885da 100644 --- a/lib/observer/vsn.mk +++ b/lib/observer/vsn.mk @@ -1 +1 @@ -OBSERVER_VSN = 1.3 +OBSERVER_VSN = 1.3.1 diff --git a/lib/odbc/aclocal.m4 b/lib/odbc/aclocal.m4 index 25f40944e7..46b30a16b3 100644 --- a/lib/odbc/aclocal.m4 +++ b/lib/odbc/aclocal.m4 @@ -954,6 +954,40 @@ dnl AC_DEFUN(ERL_FIND_ETHR_LIB, [ +AC_ARG_ENABLE(native-ethr-impls, + AS_HELP_STRING([--disable-native-ethr-impls], + [disable native ethread implementations]), +[ case "$enableval" in + no) disable_native_ethr_impls=yes ;; + *) disable_native_ethr_impls=no ;; + esac ], disable_native_ethr_impls=no) + +test "X$disable_native_ethr_impls" = "Xyes" && + AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) + +AC_ARG_ENABLE(x86-out-of-order, + AS_HELP_STRING([--enable-x86-out-of-order], + [enable x86/x84_64 out of order support (default disabled)])) + +AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, + AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], + [prefer gcc native ethread implementations]), +[ case "$enableval" in + yes) enable_prefer_gcc_native_ethr_impls=yes ;; + *) enable_prefer_gcc_native_ethr_impls=no ;; + esac ], enable_prefer_gcc_native_ethr_impls=no) + +test $enable_prefer_gcc_native_ethr_impls = yes && + AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) + +AC_ARG_WITH(libatomic_ops, + AS_HELP_STRING([--with-libatomic_ops=PATH], + [specify and prefer usage of libatomic_ops in the ethread library])) + +AC_ARG_WITH(with_sparc_memory_order, + AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], + [specify sparc memory order (defaults to RMO)])) + LM_CHECK_THR_LIB ERL_INTERNAL_LIBS @@ -1003,40 +1037,44 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads]) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) - + if test "X$disable_native_ethr_impls" = "Xyes"; then + have_interlocked_op=no + ethr_have_native_atomics=no + else + ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) + fi test "$ethr_have_native_atomics" = "yes" && ethr_have_native_spinlock=yes ;; @@ -1303,93 +1341,98 @@ case "$THR_LIB_NAME" in int128="__int128_t" fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + if test "X$disable_native_ethr_impls" = "Xyes"; then + ethr_have_native_atomics=no + else + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + + if test $int128 != no; then + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) + fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + AC_MSG_CHECKING([for a usable libatomic_ops implementation]) + case "x$with_libatomic_ops" in + xno | xyes | x) + libatomic_ops_include= + ;; + *) + if test -d "${with_libatomic_ops}/include"; then + libatomic_ops_include="-I$with_libatomic_ops/include" + CPPFLAGS="$CPPFLAGS $libatomic_ops_include" + else + AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) + fi;; + esac + ethr_have_libatomic_ops=no + AC_TRY_LINK([#include "atomic_ops.h"], + [ + volatile AO_t x; + AO_t y; + int z; + + AO_nop_full(); + AO_store(&x, (AO_t) 0); + z = AO_load(&x); + z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); + ], + [ethr_have_native_atomics=yes + ethr_have_libatomic_ops=yes]) + AC_MSG_RESULT([$ethr_have_libatomic_ops]) + if test $ethr_have_libatomic_ops = yes; then + AC_CHECK_SIZEOF(AO_t, , + [ + #include <stdio.h> + #include "atomic_ops.h" + ]) + AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) + + AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) + if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) + fi + ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" + elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_MSG_ERROR([No usable libatomic_ops implementation found]) + fi - if test $int128 != no; then - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) - fi + case "$host_cpu" in + sparc | sun4u | sparc64 | sun4v) + case "$with_sparc_memory_order" in + "TSO") + AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; + "PSO") + AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; + "RMO"|"") + AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; + *) + AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; + esac + ethr_have_native_atomics=yes;; + i86pc | i*86 | x86_64 | amd64) + if test "$enable_x86_out_of_order" = "yes"; then + AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) + fi + ethr_have_native_atomics=yes;; + macppc | ppc | powerpc | "Power Macintosh") + ethr_have_native_atomics=yes;; + tile) + ethr_have_native_atomics=yes;; + *) + ;; + esac - AC_MSG_CHECKING([for a usable libatomic_ops implementation]) - case "x$with_libatomic_ops" in - xno | xyes | x) - libatomic_ops_include= - ;; - *) - if test -d "${with_libatomic_ops}/include"; then - libatomic_ops_include="-I$with_libatomic_ops/include" - CPPFLAGS="$CPPFLAGS $libatomic_ops_include" - else - AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) - fi;; - esac - ethr_have_libatomic_ops=no - AC_TRY_LINK([#include "atomic_ops.h"], - [ - volatile AO_t x; - AO_t y; - int z; - - AO_nop_full(); - AO_store(&x, (AO_t) 0); - z = AO_load(&x); - z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); - ], - [ethr_have_native_atomics=yes - ethr_have_libatomic_ops=yes]) - AC_MSG_RESULT([$ethr_have_libatomic_ops]) - if test $ethr_have_libatomic_ops = yes; then - AC_CHECK_SIZEOF(AO_t, , - [ - #include <stdio.h> - #include "atomic_ops.h" - ]) - AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) - - AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) - if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) - fi - ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" - elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_MSG_ERROR([No usable libatomic_ops implementation found]) fi - case "$host_cpu" in - sparc | sun4u | sparc64 | sun4v) - case "$with_sparc_memory_order" in - "TSO") - AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; - "PSO") - AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; - "RMO"|"") - AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; - *) - AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; - esac - ethr_have_native_atomics=yes;; - i86pc | i*86 | x86_64 | amd64) - if test "$enable_x86_out_of_order" = "yes"; then - AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) - fi - ethr_have_native_atomics=yes;; - macppc | ppc | "Power Macintosh") - ethr_have_native_atomics=yes;; - tile) - ethr_have_native_atomics=yes;; - *) - ;; - esac - test ethr_have_native_atomics = "yes" && ethr_have_native_spinlock=yes dnl Restore LIBS @@ -1451,40 +1494,6 @@ esac AC_C_DOUBLE_MIDDLE_ENDIAN -AC_ARG_ENABLE(native-ethr-impls, - AS_HELP_STRING([--disable-native-ethr-impls], - [disable native ethread implementations]), -[ case "$enableval" in - no) disable_native_ethr_impls=yes ;; - *) disable_native_ethr_impls=no ;; - esac ], disable_native_ethr_impls=no) - -AC_ARG_ENABLE(x86-out-of-order, - AS_HELP_STRING([--enable-x86-out-of-order], - [enable x86/x84_64 out of order support (default disabled)])) - -test "X$disable_native_ethr_impls" = "Xyes" && - AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) - -AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, - AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], - [prefer gcc native ethread implementations]), -[ case "$enableval" in - yes) enable_prefer_gcc_native_ethr_impls=yes ;; - *) enable_prefer_gcc_native_ethr_impls=no ;; - esac ], enable_prefer_gcc_native_ethr_impls=no) - -test $enable_prefer_gcc_native_ethr_impls = yes && - AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) - -AC_ARG_WITH(libatomic_ops, - AS_HELP_STRING([--with-libatomic_ops=PATH], - [specify and prefer usage of libatomic_ops in the ethread library])) - -AC_ARG_WITH(with_sparc_memory_order, - AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], - [specify sparc memory order (defaults to RMO)])) - ETHR_X86_SSE2_ASM=no case "$GCC-$ac_cv_sizeof_void_p-$host_cpu" in yes-4-i86pc | yes-4-i*86 | yes-4-x86_64 | yes-4-amd64) diff --git a/lib/odbc/doc/src/notes.xml b/lib/odbc/doc/src/notes.xml index 792dc3fddd..ebbacb2327 100644 --- a/lib/odbc/doc/src/notes.xml +++ b/lib/odbc/doc/src/notes.xml @@ -31,7 +31,36 @@ <p>This document describes the changes made to the odbc application. </p> - <section><title>ODBC 2.10.15</title> + <section><title>ODBC 2.10.16</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Fix a 64bit related bug in odbcserver. Thanks to Satoshi + Kinoshita.</p> + <p> + Own Id: OTP-10993</p> + </item> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + <item> + <p> + Fix checking for odbc in standard locations when + "with-odbc" flag present. Thanks to Alexey Saltanov.</p> + <p> + Own Id: OTP-11126</p> + </item> + </list> + </section> + +</section> + +<section><title>ODBC 2.10.15</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/odbc/test/oracle.erl b/lib/odbc/test/oracle.erl index 95cf7155dc..3e49a1b64d 100644 --- a/lib/odbc/test/oracle.erl +++ b/lib/odbc/test/oracle.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2002-2011. All Rights Reserved. +%% Copyright Ericsson AB 2002-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/odbc/test/postgres.erl b/lib/odbc/test/postgres.erl index 0c1761b835..99a191c46a 100644 --- a/lib/odbc/test/postgres.erl +++ b/lib/odbc/test/postgres.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2011. All Rights Reserved. +%% Copyright Ericsson AB 2006-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/odbc/vsn.mk b/lib/odbc/vsn.mk index b3ffff2cf8..98a9f4ab4a 100644 --- a/lib/odbc/vsn.mk +++ b/lib/odbc/vsn.mk @@ -1 +1 @@ -ODBC_VSN = 2.10.15 +ODBC_VSN = 2.10.16 diff --git a/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl b/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl index aa582d1d4e..5ec0c084e3 100644 --- a/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl +++ b/lib/orber/COSS/CosNaming/orber_cosnaming_utils.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2010. All Rights Reserved. +%% Copyright Ericsson AB 1999-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/orber/doc/src/notes.xml b/lib/orber/doc/src/notes.xml index 9e896f03c8..04507d8078 100644 --- a/lib/orber/doc/src/notes.xml +++ b/lib/orber/doc/src/notes.xml @@ -33,7 +33,22 @@ </header> - <section><title>Orber 3.6.26</title> + <section><title>Orber 3.6.26.1</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + +<section><title>Orber 3.6.26</title> <section><title>Fixed Bugs and Malfunctions</title> <list> diff --git a/lib/orber/src/orber_env.erl b/lib/orber/src/orber_env.erl index 67d31018ff..1c8a90bc81 100644 --- a/lib/orber/src/orber_env.erl +++ b/lib/orber/src/orber_env.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2004-2011. All Rights Reserved. +%% Copyright Ericsson AB 2004-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/orber/src/orber_iiop_outproxy.erl b/lib/orber/src/orber_iiop_outproxy.erl index 9c4e603753..8319d89088 100644 --- a/lib/orber/src/orber_iiop_outproxy.erl +++ b/lib/orber/src/orber_iiop_outproxy.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% Copyright Ericsson AB 1999-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/orber/vsn.mk b/lib/orber/vsn.mk index 4e09532f88..7bbebc65dc 100644 --- a/lib/orber/vsn.mk +++ b/lib/orber/vsn.mk @@ -1,2 +1,2 @@ -ORBER_VSN = 3.6.26 +ORBER_VSN = 3.6.26.1 diff --git a/lib/os_mon/c_src/memsup.c b/lib/os_mon/c_src/memsup.c index 8e610f951b..b5114d10ed 100644 --- a/lib/os_mon/c_src/memsup.c +++ b/lib/os_mon/c_src/memsup.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2012. All Rights Reserved. + * Copyright Ericsson AB 1996-2013. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/os_mon/doc/src/notes.xml b/lib/os_mon/doc/src/notes.xml index 61eac937e1..2206f93d34 100644 --- a/lib/os_mon/doc/src/notes.xml +++ b/lib/os_mon/doc/src/notes.xml @@ -30,6 +30,34 @@ </header> <p>This document describes the changes made to the OS_Mon application.</p> +<section><title>Os_Mon 2.2.12</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Compilation fixes for NetBSD. Thanks to YAMAMOTO Takashi.</p> + <p> + Own Id: OTP-10941</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Fixed disksup:get_disk_data for SUSv3, specifically OS X + ML. Thanks to Sriram Melkote.</p> + <p> + Own Id: OTP-10945</p> + </item> + </list> + </section> + +</section> + <section><title>Os_Mon 2.2.11</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl index f906f33d32..278da26a20 100644 --- a/lib/os_mon/src/disksup.erl +++ b/lib/os_mon/src/disksup.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -263,10 +263,10 @@ check_disk_space({unix, dragonfly}, Port, Threshold) -> Result = my_cmd("/bin/df -k -t ufs,hammer", Port), check_disks_solaris(skip_to_eol(Result), Threshold); check_disk_space({unix, freebsd}, Port, Threshold) -> - Result = my_cmd("/bin/df -k -t ufs", Port), + Result = my_cmd("/bin/df -k -l", Port), check_disks_solaris(skip_to_eol(Result), Threshold); check_disk_space({unix, openbsd}, Port, Threshold) -> - Result = my_cmd("/bin/df -k -t ffs", Port), + Result = my_cmd("/bin/df -k -l", Port), check_disks_solaris(skip_to_eol(Result), Threshold); check_disk_space({unix, netbsd}, Port, Threshold) -> Result = my_cmd("/bin/df -k -t ffs", Port), diff --git a/lib/os_mon/test/disksup_SUITE.erl b/lib/os_mon/test/disksup_SUITE.erl index c1ff2c6afc..9c65d8b692 100644 --- a/lib/os_mon/test/disksup_SUITE.erl +++ b/lib/os_mon/test/disksup_SUITE.erl @@ -34,11 +34,11 @@ -define(default_timeout, ?t:minutes(1)). init_per_suite(Config) when is_list(Config) -> - ?line ok = application:start(os_mon), + ok = application:start(os_mon), Config. end_per_suite(Config) when is_list(Config) -> - ?line ok = application:stop(os_mon), + ok = application:stop(os_mon), Config. init_per_testcase(unavailable, Config) -> @@ -78,80 +78,71 @@ end_per_group(_GroupName, Config) -> Config. -api(suite) -> - []; -api(doc) -> - ["Test of API functions"]; +api(suite) -> []; +api(doc) -> ["Test of API functions"]; api(Config) when is_list(Config) -> %% get_disk_data() - ?line [{Id, KByte, Capacity}|_] = disksup:get_disk_data(), - ?line true = io_lib:printable_list(Id), - ?line true = is_integer(KByte), - ?line true = is_integer(Capacity), - ?line true = KByte>0, - ?line true = Capacity>0, + [{Id,KByte,Capacity}|_] = get_disk_data(), + true = io_lib:printable_list(Id), + true = is_integer(KByte), + true = is_integer(Capacity), + true = Capacity>0, + true = KByte>0, %% get_check_interval() - ?line 1800000 = disksup:get_check_interval(), + 1800000 = disksup:get_check_interval(), %% set_check_interval(Minutes) - ?line ok = disksup:set_check_interval(20), - ?line 1200000 = disksup:get_check_interval(), - ?line {'EXIT',{badarg,_}} = (catch disksup:set_check_interval(0.5)), - ?line 1200000 = disksup:get_check_interval(), - ?line ok = disksup:set_check_interval(30), + ok = disksup:set_check_interval(20), + 1200000 = disksup:get_check_interval(), + {'EXIT',{badarg,_}} = (catch disksup:set_check_interval(0.5)), + 1200000 = disksup:get_check_interval(), + ok = disksup:set_check_interval(30), %% get_almost_full_threshold() - ?line 80 = disksup:get_almost_full_threshold(), + 80 = disksup:get_almost_full_threshold(), %% set_almost_full_threshold(Float) - ?line ok = disksup:set_almost_full_threshold(0.90), - ?line 90 = disksup:get_almost_full_threshold(), - ?line {'EXIT',{badarg,_}} = + ok = disksup:set_almost_full_threshold(0.90), + 90 = disksup:get_almost_full_threshold(), + {'EXIT',{badarg,_}} = (catch disksup:set_almost_full_threshold(-0.5)), - ?line 90 = disksup:get_almost_full_threshold(), - ?line ok = disksup:set_almost_full_threshold(0.80), + 90 = disksup:get_almost_full_threshold(), + ok = disksup:set_almost_full_threshold(0.80), ok. -config(suite) -> - []; -config(doc) -> - ["Test configuration"]; +config(suite) -> []; +config(doc) -> ["Test configuration"]; config(Config) when is_list(Config) -> %% Change configuration parameters and make sure change is reflected %% when disksup is restarted - ?line ok = - application:set_env(os_mon, disk_space_check_interval, 29), - ?line ok = - application:set_env(os_mon, disk_almost_full_threshold, 0.81), + ok = application:set_env(os_mon, disk_space_check_interval, 29), + ok = application:set_env(os_mon, disk_almost_full_threshold, 0.81), - ?line ok = supervisor:terminate_child(os_mon_sup, disksup), - ?line {ok, _Child1} = supervisor:restart_child(os_mon_sup, disksup), + ok = supervisor:terminate_child(os_mon_sup, disksup), + {ok, _Child1} = supervisor:restart_child(os_mon_sup, disksup), - ?line 1740000 = disksup:get_check_interval(), - ?line 81 = disksup:get_almost_full_threshold(), + 1740000 = disksup:get_check_interval(), + 81 = disksup:get_almost_full_threshold(), %% Also try this with bad parameter values, should be ignored - ?line ok = + ok = application:set_env(os_mon, disk_space_check_interval, 0.5), - ?line ok = + ok = application:set_env(os_mon, disk_almost_full_threshold, -0.81), - ?line ok = supervisor:terminate_child(os_mon_sup, disksup), - ?line {ok, _Child2} = supervisor:restart_child(os_mon_sup, disksup), + ok = supervisor:terminate_child(os_mon_sup, disksup), + {ok, _Child2} = supervisor:restart_child(os_mon_sup, disksup), - ?line 1800000 = disksup:get_check_interval(), - ?line 80 = disksup:get_almost_full_threshold(), + 1800000 = disksup:get_check_interval(), + 80 = disksup:get_almost_full_threshold(), %% Reset configuration parameters - ?line ok = - application:set_env(os_mon, disk_space_check_interval, 30), - ?line ok = - application:set_env(os_mon, disk_almost_full_threshold, 0.80), - + ok = application:set_env(os_mon, disk_space_check_interval, 30), + ok = application:set_env(os_mon, disk_almost_full_threshold, 0.80), ok. %%---------------------------------------------------------------------- @@ -159,24 +150,22 @@ config(Config) when is_list(Config) -> %% changes too much during its course, or if there are timing problems %% with the alarm_handler receiving the alarms too late %%---------------------------------------------------------------------- -alarm(suite) -> - []; -alarm(doc) -> - ["Test that alarms are set and cleared"]; +alarm(suite) -> []; +alarm(doc) -> ["Test that alarms are set and cleared"]; alarm(Config) when is_list(Config) -> %% Find out how many disks exceed the threshold %% and make sure the corresponding number of alarms is set - ?line Threshold1 = disksup:get_almost_full_threshold(), % 80 - ?line Data1 = disksup:get_disk_data(), - ?line Over1 = over_threshold(Data1, Threshold1), - ?line Alarms1 = get_alarms(), + Threshold1 = disksup:get_almost_full_threshold(), % 80 + Data1 = disksup:get_disk_data(), + Over1 = over_threshold(Data1, Threshold1), + Alarms1 = get_alarms(), if Over1==length(Alarms1) -> - ?line true; + true; true -> dump_info(), - ?line ?t:fail({bad_alarms, Threshold1, Data1, Alarms1}) + ?t:fail({bad_alarms, Threshold1, Data1, Alarms1}) end, %% Try to find a disk with space usage below Threshold1, @@ -187,24 +176,24 @@ alarm(Config) when is_list(Config) -> true -> false end end, - ?line case until(Fun1, Data1) of + case until(Fun1, Data1) of {_, _, Cap1} -> Threshold2 = Cap1-1, - ?line ok = + ok = disksup:set_almost_full_threshold(Threshold2/100), - ?line disksup ! timeout, % force a disk check - ?line Data2 = disksup:get_disk_data(), - ?line Over2 = over_threshold(Data2, Threshold2), - ?line Alarms2 = get_alarms(), + disksup ! timeout, % force a disk check + Data2 = disksup:get_disk_data(), + Over2 = over_threshold(Data2, Threshold2), + Alarms2 = get_alarms(), if Over2==length(Alarms2), Over2>Over1 -> - ?line true; + true; true -> dump_info(), - ?line ?t:fail({bad_alarms, Threshold2, Data2, Alarms2}) + ?t:fail({bad_alarms, Threshold2, Data2, Alarms2}) end; false -> - ?line ignore + ignore end, %% Find out the highest space usage among all disks @@ -216,40 +205,35 @@ alarm(Config) when is_list(Config) -> true -> MaxAcc end end, - ?line case lists:foldl(Fun2, 0, Data1) of + case lists:foldl(Fun2, 0, Data1) of Max when Max<100 -> Threshold3 = Max+1, - ?line ok = - disksup:set_almost_full_threshold(Threshold3/100), - ?line disksup ! timeout, % force a disk check - ?line Data3 = disksup:get_disk_data(), - ?line Over3 = over_threshold(Data3, Threshold3), - ?line Alarms3 = get_alarms(), + ok = disksup:set_almost_full_threshold(Threshold3/100), + disksup ! timeout, % force a disk check + Data3 = disksup:get_disk_data(), + Over3 = over_threshold(Data3, Threshold3), + Alarms3 = get_alarms(), if Over3==0, length(Alarms3)==0 -> - ?line ok; + ok; true -> dump_info(), - ?line ?t:fail({bad_alarms, Threshold3, Data3, Alarms3}) + ?t:fail({bad_alarms, Threshold3, Data3, Alarms3}) end; 100 -> - ?line ignore + ignore end, %% Reset threshold - ?line ok = disksup:set_almost_full_threshold(Threshold1/100), - + ok = disksup:set_almost_full_threshold(Threshold1/100), ok. over_threshold(Data, Threshold) -> Data2 = remove_duplicated_disks(lists:keysort(1, Data)), - lists:foldl(fun({_Id, _Kbyte, Cap}, N) when Cap>=Threshold -> - N+1; - (_DiskData, N) -> - N - end, - 0, - Data2). + lists:foldl(fun + ({_Id, _Kbyte, Cap}, N) when Cap>=Threshold -> N+1; + (_DiskData, N) -> N + end, 0, Data2). %% On some platforms (for example MontaVista) data for one disk can be %% "duplicated": @@ -278,33 +262,30 @@ remove_duplicated_disks([]) -> []. get_alarms() -> - lists:filter(fun({{disk_almost_full, _Disk},_}) -> true; - (_) -> false - end, - alarm_handler:get_alarms()). + lists:filter(fun + ({{disk_almost_full, _Disk},_}) -> true; + (_) -> false + end, alarm_handler:get_alarms()). until(Fun, [H|T]) -> case Fun(H) of true -> H; - false -> - until(Fun, T) + false -> until(Fun, T) end; -until(_Fun, []) -> - false. +until(_Fun, []) -> false. -port(suite) -> - []; +port(suite) -> []; port(doc) -> ["Test that disksup handles a terminating port program"]; port(Config) when is_list(Config) -> - ?line Str = os:cmd("ps -ef | grep '[d]isksup'"), + Str = os:cmd("ps -ef | grep '[d]isksup'"), case io_lib:fread("~s ~s", Str) of - {ok, [_Uid,Pid], _Rest} -> + {ok, [_Uid,Pid], _Rest} -> %% Monitor disksup - ?line MonRef = erlang:monitor(process, disksup), - ?line [{_Disk1,Kbyte1,_Cap1}|_] = disksup:get_disk_data(), - ?line true = Kbyte1>0, + MonRef = erlang:monitor(process, disksup), + [{_Disk1,Kbyte1,_Cap1}|_] = disksup:get_disk_data(), + true = Kbyte1>0, %% Kill the port program case os:cmd("kill -9 " ++ Pid) of @@ -315,17 +296,16 @@ port(Config) when is_list(Config) -> {'DOWN', MonRef, _, _, {port_died, _Reason}} -> ok; {'DOWN', MonRef, _, _, Reason} -> - ?line ?t:fail({unexpected_exit_reason, Reason}) + ?t:fail({unexpected_exit_reason, Reason}) after 3000 -> - ?line ?t:fail({still_alive, Str}) + ?t:fail({still_alive, Str}) end, %% Give os_mon_sup time to restart disksup ?t:sleep(?t:seconds(3)), - ?line [{_Disk2,Kbyte2,_Cap2}|_] = - disksup:get_disk_data(), - ?line true = Kbyte2>0, + [{_Disk2,Kbyte2,_Cap2}|_] = disksup:get_disk_data(), + true = Kbyte2>0, ok; @@ -337,68 +317,61 @@ port(Config) when is_list(Config) -> {skip, {os_pid_not_found, Str}} end. -terminate(suite) -> - []; +terminate(suite) -> []; terminate(Config) when is_list(Config) -> - ?line ok = application:set_env(os_mon, start_disksup, false), - ?line ok = supervisor:terminate_child(os_mon_sup, disksup), + ok = application:set_env(os_mon, start_disksup, false), + ok = supervisor:terminate_child(os_mon_sup, disksup), ok. -unavailable(suite) -> - []; +unavailable(suite) -> []; unavailable(doc) -> ["Test correct behaviour when service is unavailable"]; unavailable(Config) when is_list(Config) -> %% Make sure all API functions return their dummy values - ?line [{"none",0,0}] = disksup:get_disk_data(), - ?line 1800000 = disksup:get_check_interval(), - ?line ok = disksup:set_check_interval(5), - ?line 80 = disksup:get_almost_full_threshold(), - ?line ok = disksup:set_almost_full_threshold(0.9), - + [{"none",0,0}] = disksup:get_disk_data(), + 1800000 = disksup:get_check_interval(), + ok = disksup:set_check_interval(5), + 80 = disksup:get_almost_full_threshold(), + ok = disksup:set_almost_full_threshold(0.9), ok. restart(suite) -> []; restart(Config) when is_list(Config) -> - ?line ok = application:set_env(os_mon, start_disksup, true), - ?line {ok, _Pid} = supervisor:restart_child(os_mon_sup, disksup), + ok = application:set_env(os_mon, start_disksup, true), + {ok, _Pid} = supervisor:restart_child(os_mon_sup, disksup), ok. -otp_5910(suite) -> - []; +otp_5910(suite) -> []; otp_5910(doc) -> ["Test that alarms are cleared if disksup crashes or " "if OS_Mon is stopped"]; otp_5910(Config) when is_list(Config) -> %% Make sure disksup sets at least one alarm - ?line Data = disksup:get_disk_data(), - ?line Threshold0 = disksup:get_almost_full_threshold(), - ?line Threshold = case over_threshold(Data, Threshold0) of - 0 -> - [{_Id,_Kbyte,Cap}|_] = Data, - ?line ok = disksup:set_almost_full_threshold((Cap-1)/100), - Cap-1; - _N -> - Threshold0 - end, - ?line ok = application:set_env(os_mon, - disk_almost_full_threshold, - Threshold/100), - ?line disksup ! timeout, % force a disk check - ?line Data2 = disksup:get_disk_data(), - ?line Over = over_threshold(Data2, Threshold), - ?line Alarms = get_alarms(), + Data = disksup:get_disk_data(), + Threshold0 = disksup:get_almost_full_threshold(), + Threshold = case over_threshold(Data, Threshold0) of + 0 -> + [{_Id,_Kbyte,Cap}|_] = Data, + ok = disksup:set_almost_full_threshold((Cap-1)/100), + Cap-1; + _N -> Threshold0 + end, + ok = application:set_env(os_mon, disk_almost_full_threshold, Threshold/100), + disksup ! timeout, % force a disk check + Data2 = disksup:get_disk_data(), + Over = over_threshold(Data2, Threshold), + Alarms = get_alarms(), if Over==0 -> - ?line ?t:fail({threshold_too_low, Data2, Threshold}); + ?t:fail({threshold_too_low, Data2, Threshold}); Over==length(Alarms) -> ok; true -> dump_info(), - ?line ?t:fail({bad_alarms, Threshold, Data2, Alarms}) + ?t:fail({bad_alarms, Threshold, Data2, Alarms}) end, %% Kill disksup @@ -407,34 +380,42 @@ otp_5910(Config) when is_list(Config) -> %% Wait a little to make sure disksup has been restarted, %% then make sure the alarms are set once, but not twice ?t:sleep(?t:seconds(1)), - ?line Data3 = disksup:get_disk_data(), - ?line Alarms2 = get_alarms(), + Data3 = disksup:get_disk_data(), + Alarms2 = get_alarms(), if - length(Alarms2)==length(Alarms) -> - ok; + length(Alarms2)==length(Alarms) -> ok; true -> dump_info(), - ?line ?t:fail({bad_alarms, Threshold, Data3, Alarms,Alarms2}) + ?t:fail({bad_alarms,Threshold,Data3,Alarms,Alarms2}) end, %% Stop OS_Mon and make sure all disksup alarms are cleared - ?line ok = application:stop(os_mon), + ok = application:stop(os_mon), ?t:sleep(?t:seconds(1)), - ?line Alarms3 = get_alarms(), - if - length(Alarms3)==0 -> - ok; - true -> - ?line ?t:fail({alarms_not_cleared, Alarms3}) + Alarms3 = get_alarms(), + case get_alarms() of + [] -> ok; + _ -> ?t:fail({alarms_not_cleared, Alarms3}) end, %% Reset threshold and restart OS_Mon - ?line ok = application:set_env(os_mon, - disksup_almost_full_threshold, 0.8), - ?line ok = disksup:set_almost_full_threshold(0.8), - ?line ok = application:start(os_mon), - + ok = application:set_env(os_mon, disksup_almost_full_threshold, 0.8), + ok = disksup:set_almost_full_threshold(0.8), + ok = application:start(os_mon), ok. dump_info() -> io:format("Status: ~p~n", [sys:get_status(disksup)]). + +% filter get_disk_data and remove entriew with zero capacity +% "non-normal" filesystems report zero capacity +% - Perhaps errorneous 'df -k -l'? +% - Always list filesystems by type '-t ufs,zfs,..' instead? +% It is unclear what the intention was from the beginning. +get_disk_data() -> + get_disk_data(disksup:get_disk_data()). + +get_disk_data([{"none",0,0}=E]) -> [E]; +get_disk_data([{_,_,0}|Es]) -> get_disk_data(Es); +get_disk_data([E|Es]) -> [E|get_disk_data(Es)]; +get_disk_data([]) -> []. diff --git a/lib/os_mon/vsn.mk b/lib/os_mon/vsn.mk index 7d6c5484a7..e3acea0258 100644 --- a/lib/os_mon/vsn.mk +++ b/lib/os_mon/vsn.mk @@ -1 +1 @@ -OS_MON_VSN = 2.2.11 +OS_MON_VSN = 2.2.12 diff --git a/lib/percept/doc/src/notes.xml b/lib/percept/doc/src/notes.xml index 82ce47c0ef..795dd98545 100644 --- a/lib/percept/doc/src/notes.xml +++ b/lib/percept/doc/src/notes.xml @@ -32,6 +32,21 @@ </header> <p>This document describes the changes made to the Percept application.</p> +<section><title>Percept 0.8.8.1</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + </list> + </section> + +</section> + <section><title>Percept 0.8.8</title> <section><title>Improvements and New Features</title> diff --git a/lib/percept/vsn.mk b/lib/percept/vsn.mk index 07e9ac5085..2ea0341ddf 100644 --- a/lib/percept/vsn.mk +++ b/lib/percept/vsn.mk @@ -1 +1 @@ -PERCEPT_VSN = 0.8.8 +PERCEPT_VSN = 0.8.8.1 diff --git a/lib/public_key/doc/src/notes.xml b/lib/public_key/doc/src/notes.xml index 3a7ccbe568..47b3e60afd 100644 --- a/lib/public_key/doc/src/notes.xml +++ b/lib/public_key/doc/src/notes.xml @@ -34,6 +34,50 @@ <file>notes.xml</file> </header> +<section><title>Public_Key 0.19</title> + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Add support for ISO oids 1.3.14.3.2.29 and 1.3.14.3.2.27 + that are somtimes used instead of the PKCS defined oids + 1.2.840.113549.1.1.5 and 1.2.840.10040.4.3. Add function + pkix_sign_types:/1 that translates oids to to algorithm + atoms ex:</p> + <p> + > public_key:pkix_sign_types({1,3,14,3,2,29}). {sha,rsa}</p> + <p> + Own Id: OTP-10873</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + </list> + </section> + +</section> + <section><title>Public_Key 0.18</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/public_key/doc/src/public_key.xml b/lib/public_key/doc/src/public_key.xml index 10c95a39ac..bce6d58682 100644 --- a/lib/public_key/doc/src/public_key.xml +++ b/lib/public_key/doc/src/public_key.xml @@ -43,7 +43,8 @@ <title>public_key</title> <list type="bulleted"> - <item>public_key requires the crypto application.</item> + <item>public_key requires the crypto and asn1 applications, the latter since R16 (hopefully the runtime dependency on asn1 will + be removed again in the future).</item> <item>Supports <url href="http://www.ietf.org/rfc/rfc5280.txt">RFC 5280 </url> - Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile </item> @@ -154,8 +155,8 @@ <funcs> <func> - <name> compute_key(OthersKey, MyKey)-></name> - <name> compute_key(OthersKey, MyKey, Params)-></name> + <name>compute_key(OthersKey, MyKey)-></name> + <name>compute_key(OthersKey, MyKey, Params)-></name> <fsummary> Compute shared secret</fsummary> <type> <v>OthersKey = #'ECPoint'{} | binary(), MyKey = #'ECPrivateKey'{} | binary()</v> @@ -176,7 +177,8 @@ <v>Options = public_crypt_options()</v> </type> <desc> - <p>Public key decryption using the private key.</p> + <p>Public key decryption using the private key. See also <seealso + marker="crypto:crypto#private_decrypt/4">crypto:private_decrypt/4</seealso></p> </desc> </func> @@ -190,7 +192,8 @@ <v>Options = public_crypt_options()</v> </type> <desc> - <p> Public key decryption using the public key.</p> + <p> Public key decryption using the public key. See also <seealso + marker="crypto:crypto#public_decrypt/4">crypto:public_decrypt/4</seealso></p> </desc> </func> @@ -304,7 +307,9 @@ <v>Key = rsa_private_key()</v> </type> <desc> - <p> Public key encryption using the private key.</p> + <p> Public key encryption using the private key. + See also <seealso + marker="crypto:crypto#private_encrypt/4">crypto:private_encrypt/4</seealso></p> </desc> </func> @@ -316,7 +321,8 @@ <v>Key = rsa_public_key()</v> </type> <desc> - <p> Public key encryption using the public key.</p> + <p> Public key encryption using the public key. See also <seealso + marker="crypto:crypto#public_encrypt/4">crypto:public_encrypt/4</seealso></p> </desc> </func> diff --git a/lib/public_key/src/pubkey_ssh.erl b/lib/public_key/src/pubkey_ssh.erl index aed1f57bbc..41280b9e14 100644 --- a/lib/public_key/src/pubkey_ssh.erl +++ b/lib/public_key/src/pubkey_ssh.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2011-2012. All Rights Reserved. +%% Copyright Ericsson AB 2011-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/public_key/src/public_key.app.src b/lib/public_key/src/public_key.app.src index 9f0677606d..736a778a4b 100644 --- a/lib/public_key/src/public_key.app.src +++ b/lib/public_key/src/public_key.app.src @@ -11,7 +11,7 @@ 'OTP-PUB-KEY', 'PKCS-FRAME' ]}, - {applications, [crypto, kernel, stdlib]}, + {applications, [asn1, crypto, kernel, stdlib]}, {registered, []}, {env, []} ] diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl index 3eea6f6ec4..cdbfe6e07c 100644 --- a/lib/public_key/src/public_key.erl +++ b/lib/public_key/src/public_key.erl @@ -252,8 +252,7 @@ decrypt_private(CipherText, Key) -> decrypt_private(CipherText, Key, []). decrypt_private(CipherText, - #'RSAPrivateKey'{modulus = N, publicExponent = E, - privateExponent = D} = Key, + #'RSAPrivateKey'{} = Key, Options) when is_binary(CipherText), is_list(Options) -> diff --git a/lib/public_key/test/pbe_SUITE.erl b/lib/public_key/test/pbe_SUITE.erl index 254601b107..2c9b17478d 100644 --- a/lib/public_key/test/pbe_SUITE.erl +++ b/lib/public_key/test/pbe_SUITE.erl @@ -42,6 +42,7 @@ groups() -> %%-------------------------------------------------------------------- init_per_suite(Config) -> + application:stop(crypto), try crypto:start() of ok -> Config diff --git a/lib/public_key/test/pkits_SUITE.erl b/lib/public_key/test/pkits_SUITE.erl index c490493e13..699481b20f 100644 --- a/lib/public_key/test/pkits_SUITE.erl +++ b/lib/public_key/test/pkits_SUITE.erl @@ -111,14 +111,17 @@ groups() -> %%-------------------------------------------------------------------- init_per_suite(Config) -> + application:stop(crypto), try crypto:start() of ok -> + application:start(asn1), crypto_support_check(Config) catch _:_ -> {skip, "Crypto did not start"} end. end_per_suite(_Config) -> + application:stop(asn1), application:stop(crypto). %%-------------------------------------------------------------------- diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl index 5a64140c67..c3aa2e2366 100644 --- a/lib/public_key/test/public_key_SUITE.erl +++ b/lib/public_key/test/public_key_SUITE.erl @@ -56,14 +56,17 @@ groups() -> ]. %%------------------------------------------------------------------- init_per_suite(Config) -> + application:stop(crypto), try crypto:start() of ok -> + application:start(asn1), Config catch _:_ -> {skip, "Crypto did not start"} end. end_per_suite(_Config) -> + application:stop(asn1), application:stop(crypto). %%------------------------------------------------------------------- diff --git a/lib/public_key/vsn.mk b/lib/public_key/vsn.mk index bd20a5546b..b820f24d2a 100644 --- a/lib/public_key/vsn.mk +++ b/lib/public_key/vsn.mk @@ -1 +1 @@ -PUBLIC_KEY_VSN = 0.18 +PUBLIC_KEY_VSN = 0.19 diff --git a/lib/reltool/doc/src/notes.xml b/lib/reltool/doc/src/notes.xml index a9aed2b0a3..598d3333f8 100644 --- a/lib/reltool/doc/src/notes.xml +++ b/lib/reltool/doc/src/notes.xml @@ -37,7 +37,48 @@ thus constitutes one section in this document. The title of each section is the version number of Reltool.</p> - <section><title>Reltool 0.6.3</title> + <section><title>Reltool 0.6.4</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fix receive support in erl_eval with a BEAM module. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11137</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Reltool used to fail if an application was mentioned in + the config file which was not found in the file system, + even if the application was explicitly excluded in the + config. This has been changed and will only produce a + warning. If the application is not explicitly excluded it + will still cause reltool to fail. Thanks to H�kan + Mattsson!</p> + <p> + Own Id: OTP-10988</p> + </item> + <item> + <p> + Fix possibly "not owner" error while file copy with + reltool. Thanks to Alexey Saltanov.</p> + <p> + Own Id: OTP-11099</p> + </item> + </list> + </section> + +</section> + +<section><title>Reltool 0.6.3</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/reltool/doc/src/reltool_examples.xml b/lib/reltool/doc/src/reltool_examples.xml index de243343ff..7dfe0cbff5 100644 --- a/lib/reltool/doc/src/reltool_examples.xml +++ b/lib/reltool/doc/src/reltool_examples.xml @@ -5,7 +5,7 @@ <header> <copyright> <year>2009</year> - <year>2011</year> + <year>2013</year> <holder>Ericsson AB, All Rights Reserved</holder> </copyright> <legalnotice> diff --git a/lib/reltool/vsn.mk b/lib/reltool/vsn.mk index 9df2fc8406..412e78f49f 100644 --- a/lib/reltool/vsn.mk +++ b/lib/reltool/vsn.mk @@ -1 +1 @@ -RELTOOL_VSN = 0.6.3 +RELTOOL_VSN = 0.6.4 diff --git a/lib/runtime_tools/doc/src/notes.xml b/lib/runtime_tools/doc/src/notes.xml index cd59be1e63..2281ac4a49 100644 --- a/lib/runtime_tools/doc/src/notes.xml +++ b/lib/runtime_tools/doc/src/notes.xml @@ -31,6 +31,37 @@ <p>This document describes the changes made to the Runtime_Tools application.</p> +<section><title>Runtime_Tools 1.8.11</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Some bugs related to calculation of CPU/scheduler + utilization in observer are corrected.</p> + <p> + Current function for a process is accepted to be + 'undefined' when running hipe.</p> + <p> + Own Id: OTP-10894</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p>Erlang source files with non-ASCII characters are now + encoded in UTF-8 (instead of latin1).</p> + <p> + Own Id: OTP-11041 Aux Id: OTP-10907 </p> + </item> + </list> + </section> + +</section> + <section><title>Runtime_Tools 1.8.10</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/runtime_tools/src/Makefile b/lib/runtime_tools/src/Makefile index 2347986c53..8d2bcfe3d1 100644 --- a/lib/runtime_tools/src/Makefile +++ b/lib/runtime_tools/src/Makefile @@ -42,6 +42,7 @@ MODULES= \ dbg \ dyntrace \ percept_profile \ + system_information \ observer_backend \ ttb_autostart HRL_FILES= ../include/observer_backend.hrl diff --git a/lib/runtime_tools/src/runtime_tools.app.src b/lib/runtime_tools/src/runtime_tools.app.src index 602048dc21..d46cfe1f32 100644 --- a/lib/runtime_tools/src/runtime_tools.app.src +++ b/lib/runtime_tools/src/runtime_tools.app.src @@ -21,7 +21,7 @@ {vsn, "%VSN%"}, {modules, [appmon_info, dbg,observer_backend,percept_profile, runtime_tools,runtime_tools_sup,erts_alloc_config, - ttb_autostart,dyntrace]}, + ttb_autostart,dyntrace,system_information]}, {registered, [runtime_tools_sup]}, {applications, [kernel, stdlib]}, {env, []}, diff --git a/lib/runtime_tools/src/system_information.erl b/lib/runtime_tools/src/system_information.erl new file mode 100644 index 0000000000..1d4b878d79 --- /dev/null +++ b/lib/runtime_tools/src/system_information.erl @@ -0,0 +1,554 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2013. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +%% The main purpose of system_information is to aggregate all information +%% deemed useful for investigation, i.e. system_information:report/0. + +%% The server and all other utilities surrounding this is for inspecting +%% reported values. Functions will be added to this as time goes by. + +-module(system_information). +-behaviour(gen_server). + +%% API +-export([ + report/0, + from_file/1, + to_file/1 + ]). +-export([ + start/0, stop/0, + load_report/0, load_report/2, + applications/0, applications/1, + application/1, application/2, + environment/0, environment/1, + module/1, module/2, + modules/1 + ]). + +%% gen_server callbacks +-export([ + init/1, + handle_call/3, + handle_cast/2, + handle_info/2, + terminate/2, + code_change/3 + ]). + +-define(SERVER, ?MODULE). + +%% change version if parsing of file changes +-define(REPORT_FILE_VSN, "1.0"). + +-record(state, { + report + }). + +%%=================================================================== +%% API +%%=================================================================== + +start() -> + gen_server:start({local, ?SERVER}, ?MODULE, [], []). + +stop() -> + gen_server:call(?SERVER, stop). + +load_report() -> load_report(data, report()). + +load_report(file, File) -> load_report(data, from_file(File)); +load_report(data, Report) -> + start(), gen_server:call(?SERVER, {load_report, Report}). + +report() -> [ + {init_arguments, init:get_arguments()}, + {code_paths, code:get_path()}, + {code, code()}, + {system_info, erlang_system_info()}, + {erts_compile_info, erlang:system_info(compile_info)}, + {beam_dynamic_libraries, get_dynamic_libraries()}, + {environment_erts, os_getenv_erts_specific()}, + {environment, [split_env(Env) || Env <- os:getenv()]} + ]. + +to_file(File) -> + file:write_file(File, iolist_to_binary([ + io_lib:format("{system_information_version, ~p}.~n", [ + ?REPORT_FILE_VSN + ]), + io_lib:format("{system_information, ~p}.~n", [ + report() + ]) + ])). + +from_file(File) -> + case file:consult(File) of + {ok, Data} -> + case get_value([system_information_version], Data) of + ?REPORT_FILE_VSN -> + get_value([system_information], Data); + Vsn -> + erlang:error({unknown_version, Vsn}) + end; + _ -> + erlang:error(bad_report_file) + end. + +applications() -> applications([]). +applications(Opts) when is_list(Opts) -> + gen_server:call(?SERVER, {applications, Opts}). + +application(App) when is_atom(App) -> application(App, []). +application(App, Opts) when is_atom(App), is_list(Opts) -> + gen_server:call(?SERVER, {application, App, Opts}). + +environment() -> environment([]). +environment(Opts) when is_list(Opts) -> + gen_server:call(?SERVER, {environment, Opts}). + +module(M) when is_atom(M) -> module(M, []). +module(M, Opts) when is_atom(M), is_list(Opts) -> + gen_server:call(?SERVER, {module, M, Opts}). + +modules(Opt) when is_atom(Opt) -> + gen_server:call(?SERVER, {modules, Opt}). + +%%=================================================================== +%% gen_server callbacks +%%=================================================================== + +init([]) -> + {ok, #state{}}. + +handle_call(stop, _From, S) -> + {stop, normal, ok, S}; + +handle_call({load_report, Report}, _From, S) -> + Version = get_value([system_info, system_version], Report), + io:format("Loaded report from system version: ~s~n", [Version]), + {reply, ok, S#state{ report = Report }}; + +handle_call(_Req, _From, #state{ report = undefined } = S) -> + {reply, {error, report_not_loaded}, S}; + +handle_call({applications, Opts}, _From, #state{ report = Report } = S) -> + ok = print_applications(get_value([code], Report), Opts), + {reply, ok, S}; + +handle_call({application, App, Opts}, _From, #state{ report = Report } = S) -> + Data = get_value([App], [AppInfo||{application, AppInfo}<-get_value([code], Report)]), + ok = print_application({App, Data}, Opts), + {reply, ok, S}; + + +handle_call({environment, Opts}, _From, #state{ report = Report } = S) -> + Choices = case proplists:get_bool(full, Opts) of + true -> [environment]; + false -> [environment_erts] + end, + ok = print_environments(get_value(Choices, Report), Opts), + {reply, ok, S}; + + +handle_call({module, M, Opts}, _From, #state{ report = Report } = S) -> + Mods = find_modules_from_code(M, get_value([code], Report)), + print_modules_from_code(M, Mods, Opts), + {reply, ok, S}; + +handle_call({modules, native}, _From, #state{ report = Report } = S) -> + Codes = get_native_modules_from_code(get_value([code],Report)), + io:format("~p~n", [Codes]), + {reply, ok, S}; + + +handle_call(_Request, _From, State) -> + {reply, ok, State}. + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%%=================================================================== +%% Internal functions +%%=================================================================== + +%% handle report values + +get_value([], Data) -> Data; +get_value([K|Ks], Data) -> + get_value(Ks, proplists:get_value(K, Data, [])). + +find_modules_from_code(M, [{code, Info}|Codes]) -> + case find_modules(M, get_value([modules], Info)) of + [] -> find_modules_from_code(M, Codes); + Mods -> + Path = get_value([path], Info), + [{Path, Mods}|find_modules_from_code(M, Codes)] + end; +find_modules_from_code(M, [{application, {App, Info}}|Codes]) -> + case find_modules(M, get_value([modules], Info)) of + [] -> find_modules_from_code(M, Codes); + Mods -> + Path = get_value([path], Info), + Vsn = get_value([vsn], Info), + [{App, Vsn, Path, Mods}|find_modules_from_code(M, Codes)] + end; +find_modules_from_code(_, []) -> []. + +find_modules(M, [{M, _}=Info|Ms]) -> [Info|find_modules(M,Ms)]; +find_modules(M, [_|Ms]) -> find_modules(M, Ms); +find_modules(_, []) -> []. + +get_native_modules_from_code([{application, {App, Info}}|Cs]) -> + case get_native_modules(get_value([modules], Info)) of + [] -> get_native_modules_from_code(Cs); + Mods -> + Path = get_value([path], Info), + Vsn = get_value([vsn], Info), + [{App, Vsn, Path, Mods}|get_native_modules_from_code(Cs)] + end; +get_native_modules_from_code([{code, Info}|Cs]) -> + case get_native_modules(get_value([modules], Info)) of + [] -> get_native_modules_from_code(Cs); + Mods -> + Path = get_value([path], Info), + [{Path, Mods}|get_native_modules_from_code(Cs)] + end; +get_native_modules_from_code([]) -> []. + +get_native_modules([]) -> []; +get_native_modules([{Mod, Info}|Ms]) -> + case proplists:get_value(native, Info) of + false -> get_native_modules(Ms); + _ -> [Mod|get_native_modules(Ms)] + end. + + +%% print information + +print_applications([{application, App}|Apps], Opts) -> + print_application(App, Opts), + print_applications(Apps, Opts); +print_applications([{code,_}|Apps], Opts) -> + print_applications(Apps, Opts); +print_applications([], _) -> + ok. + +print_application({App, Info}, Opts) -> + Vsn = get_value([vsn], Info), + io:format(" * ~w-~s~n", [App, Vsn]), + case proplists:get_bool(full, Opts) of + true -> + _ = [ begin + print_module(Minfo) + end || Minfo <- get_value([modules], Info) ], + ok; + false -> + ok + end. + +print_environments([Env|Envs],Opts) -> + print_environment(Env,Opts), + print_environments(Envs,Opts); +print_environments([],_) -> + ok. + +print_environment({_Key, false},_) -> ok; +print_environment({Key, Value},_) -> + io:format(" - ~s = ~s~n", [Key, Value]). + +print_modules_from_code(M, [Info|Ms], Opts) -> + print_module_from_code(M, Info), + case proplists:get_bool(full, Opts) of + true -> print_modules_from_code(M, Ms, Opts); + false -> ok + end; +print_modules_from_code(_, [], _) -> + ok. + +print_module_from_code(M, {Path, [{M,ModInfo}]}) -> + io:format(" from path \"~s\" (no application):~n", [Path]), + io:format(" - compiler: ~s~n", [get_value([compiler], ModInfo)]), + io:format(" - md5: ~s~n", [get_value([md5], ModInfo)]), + io:format(" - native: ~w~n", [get_value([native], ModInfo)]), + io:format(" - loaded: ~w~n", [get_value([loaded], ModInfo)]), + ok; +print_module_from_code(M, {App,Vsn,Path,[{M,ModInfo}]}) -> + io:format(" from path \"~s\" (~w-~s):~n", [Path,App,Vsn]), + io:format(" - compiler: ~s~n", [get_value([compiler], ModInfo)]), + io:format(" - md5: ~s~n", [get_value([md5], ModInfo)]), + io:format(" - native: ~w~n", [get_value([native], ModInfo)]), + io:format(" - loaded: ~w~n", [get_value([loaded], ModInfo)]), + ok. + +print_module({Mod, ModInfo}) -> + io:format(" - ~w:~n", [Mod]), + io:format(" - compiler: ~s~n", [get_value([compiler], ModInfo)]), + io:format(" - md5: ~s~n", [get_value([md5], ModInfo)]), + io:format(" - native: ~w~n", [get_value([native], ModInfo)]), + io:format(" - loaded: ~w~n", [get_value([loaded], ModInfo)]), + ok. + + + +%% get useful information from erlang:system_info/1 + +erlang_system_info() -> + erlang_system_info([ + allocator, + check_io, + otp_release, + port_limit, + process_limit, + % procs, % not needed + smp_support, + system_version, + system_architecture, + threads, + thread_pool_size, + {wordsize,internal}, + {wordsize,external}, + {cpu_topology, defined}, + {cpu_topology, detected}, + scheduler_bind_type, + scheduler_bindings, + compat_rel, + schedulers_state, + build_type, + logical_processors, + logical_processors_online, + logical_processors_available, + driver_version, + emu_args, + ethread_info, + beam_jump_table, + taints + ]). + +erlang_system_info([]) -> []; +erlang_system_info([Type|Types]) -> + [{Type, erlang:system_info(Type)}|erlang_system_info(Types)]. + + +%% get known useful erts environment + +os_getenv_erts_specific() -> + os_getenv_erts_specific([ + "BINDIR", + "DIALYZER_EMULATOR", + "CERL_DETACHED_PROG", + "EMU", + "ERL_CONSOLE_MODE", + "ERL_CRASH_DUMP", + "ERL_CRASH_DUMP_NICE", + "ERL_CRASH_DUMP_SECONDS", + "ERL_EPMD_PORT", + "ERL_EMULATOR_DLL", + "ERL_FULLSWEEP_AFTER", + "ERL_LIBS", + "ERL_MALLOC_LIB", + "ERL_MAX_PORTS", + "ERL_MAX_ETS_TABLES", + "ERL_NO_VFORK", + "ERL_NO_KERNEL_POLL", + "ERL_THREAD_POOL_SIZE", + "ERLC_EMULATOR", + "ESCRIPT_EMULATOR", + "HOME", + "HOMEDRIVE", + "HOMEPATH", + "LANG", + "LC_ALL", + "LC_CTYPE", + "PATH", + "PROGNAME", + "RELDIR", + "ROOTDIR", + "TERM", + %"VALGRIND_LOG_XML", + + %% heart + "COMSPEC", + "HEART_COMMAND", + + %% run_erl + "RUN_ERL_LOG_ALIVE_MINUTES", + "RUN_ERL_LOG_ACTIVITY_MINUTES", + "RUN_ERL_LOG_ALIVE_FORMAT", + "RUN_ERL_LOG_ALIVE_IN_UTC", + "RUN_ERL_LOG_GENERATIONS", + "RUN_ERL_LOG_MAXSIZE", + "RUN_ERL_DISABLE_FLOWCNTRL", + + %% driver getenv + "CALLER_DRV_USE_OUTPUTV", + "ERL_INET_GETHOST_DEBUG", + "ERL_EFILE_THREAD_SHORT_CIRCUIT", + "ERL_WINDOW_TITLE", + "ERL_ABORT_ON_FAILURE", + "TTYSL_DEBUG_LOG" + ]). + +os_getenv_erts_specific([]) -> []; +os_getenv_erts_specific([Key|Keys]) -> + [{Key, os:getenv(Key)}|os_getenv_erts_specific(Keys)]. + +split_env(Env) -> + split_env(Env, []). + +split_env([$=|Vs], Key) -> {lists:reverse(Key), Vs}; +split_env([I|Vs], Key) -> split_env(Vs, [I|Key]); +split_env([], KV) -> lists:reverse(KV). % should not happen. + +%% get applications + +code() -> + % order is important + get_code_from_paths(code:get_path()). + +get_code_from_paths([]) -> []; +get_code_from_paths([Path|Paths]) -> + case is_application_path(Path) of + true -> + [{application, get_application_from_path(Path)}|get_code_from_paths(Paths)]; + false -> + [{code, [ + {path, Path}, + {modules, get_modules_from_path(Path)} + ]}|get_code_from_paths(Paths)] + end. + +is_application_path(Path) -> + case filelib:wildcard(filename:join(Path, "*.app")) of + [] -> false; + _ -> true + end. + +get_application_from_path(Path) -> + [Appfile|_] = filelib:wildcard(filename:join(Path, "*.app")), + case file:consult(Appfile) of + {ok, [{application, App, Info}]} -> + {App, [ + {description, proplists:get_value(description, Info, [])}, + {vsn, proplists:get_value(vsn, Info, [])}, + {path, Path}, + {modules, get_modules_from_path(Path)} + ]} + end. + +get_modules_from_path(Path) -> + [ + begin + {ok,{Mod, Md5}} = beam_lib:md5(Beam), + Loaded = case code:is_loaded(Mod) of + false -> false; + _ -> true + end, + {Mod, [ + {loaded, Loaded}, + {native, beam_is_native_compiled(Beam)}, + {compiler, get_compiler_version(Beam)}, + {md5, hexstring(Md5)} + ]} + end || Beam <- filelib:wildcard(filename:join(Path, "*.beam")) + ]. + +hexstring(Bin) when is_binary(Bin) -> + lists:flatten([io_lib:format("~2.16.0b", [V]) || <<V>> <= Bin]). + +%% inspect beam files for information + +get_compiler_version(Beam) -> + case beam_lib:chunks(Beam, [compile_info]) of + {ok,{_,[{compile_info, Info}]}} -> + proplists:get_value(version, Info); + _ -> undefined + end. + +%% we don't know the specific chunk names of native code +%% we don't want to load the code to check it +beam_is_native_compiled(Beam) -> + Chunks = get_value([chunks], beam_lib:info(Beam)), + case check_known_hipe_chunks(Chunks) of + [] -> false; + [Arch] -> {true, Arch}; + Archs -> {true, Archs} + end. + + +check_known_hipe_chunks([{Tag,_,_}|Cs]) -> + case is_chunk_tag_hipe_arch(Tag) of + false -> check_known_hipe_chunks(Cs); + {true, Arch} -> [Arch|check_known_hipe_chunks(Cs)] + end; +check_known_hipe_chunks([]) -> []. + +%% these values are taken from hipe_unified_loader +%% perhaps these should be exported in that module? + +-define(HS8P_TAG,"HS8P"). +-define(HPPC_TAG,"HPPC"). +-define(HP64_TAG,"HP64"). +-define(HARM_TAG,"HARM"). +-define(HX86_TAG,"HX86"). +-define(HA64_TAG,"HA64"). + +is_chunk_tag_hipe_arch(Tag) -> + case Tag of + ?HA64_TAG -> {true, amd64}; %% HiPE, x86_64, (implicit: 64-bit, Unix) + ?HARM_TAG -> {true, arm}; %% HiPE, arm, v5 (implicit: 32-bit, Linux) + ?HPPC_TAG -> {true, powerpc}; %% HiPE, PowerPC (implicit: 32-bit, Linux) + ?HP64_TAG -> {true, ppc64}; %% HiPE, ppc64 (implicit: 64-bit, Linux) + ?HS8P_TAG -> {true, ultrasparc}; %% HiPE, SPARC, V8+ (implicit: 32-bit) + %% Future: HSV9 %% HiPE, SPARC, V9 (implicit: 64-bit) + %% HW32 %% HiPE, x86, Win32 + _ -> false + end. + + +get_dynamic_libraries() -> + Beam = filename:join([os:getenv("BINDIR"),get_beam_name()]), + case os:type() of + {unix, darwin} -> os:cmd("otool -L " ++ Beam); + _ -> os:cmd("ldd " ++ Beam) + end. + +get_beam_name() -> + Type = case erlang:system_info(build_type) of + opt -> ""; + TypeName -> "." ++ atom_to_list(TypeName) + end, + Flavor = case erlang:system_info(smp_support) of + false -> ""; + true -> ".smp" + end, + Beam = case os:getenv("EMU") of + false -> "beam"; + Value -> Value + end, + Beam ++ Type ++ Flavor. diff --git a/lib/runtime_tools/test/Makefile b/lib/runtime_tools/test/Makefile index bcabdf13ed..dcb9082231 100644 --- a/lib/runtime_tools/test/Makefile +++ b/lib/runtime_tools/test/Makefile @@ -5,6 +5,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk MODULES = \ dyntrace_SUITE \ runtime_tools_SUITE \ + system_information_SUITE \ dbg_SUITE \ erts_alloc_config_SUITE diff --git a/lib/runtime_tools/test/system_information_SUITE.erl b/lib/runtime_tools/test/system_information_SUITE.erl new file mode 100644 index 0000000000..fb9455a30f --- /dev/null +++ b/lib/runtime_tools/test/system_information_SUITE.erl @@ -0,0 +1,300 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2013. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% + +-module(system_information_SUITE). + +-include_lib("common_test/include/ct.hrl"). + +%% Test server callbacks +-export([suite/0, all/0, groups/0, + init_per_suite/1, end_per_suite/1, + init_per_group/2, end_per_group/2, + init_per_testcase/2, end_per_testcase/2]). + +%% Test cases +-export([ + %% API-test + api_report/1, + api_to_file/1, + api_from_file/1, + %% server + api_start_stop/1, + validate_server_interface/1 + ]). + +%%-------------------------------------------------------------------- +%% COMMON TEST CALLBACK FUNCTIONS +%%-------------------------------------------------------------------- +%%-------------------------------------------------------------------- +%% Function: groups() -> [Group] +%% +%% Group = {GroupName,Properties,GroupsAndTestCases} +%% GroupName = atom() +%% The name of the group. +%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}] +%% Group properties that may be combined. +%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase] +%% TestCase = atom() +%% The name of a test case. +%% Shuffle = shuffle | {shuffle,Seed} +%% To get cases executed in random order. +%% Seed = {integer(),integer(),integer()} +%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail | +%% repeat_until_any_ok | repeat_until_any_fail +%% To get execution of cases repeated. +%% N = integer() | forever +%% +%% Description: Returns a list of test case group definitions. +%%-------------------------------------------------------------------- +groups() -> + []. + +%%-------------------------------------------------------------------- +%% Function: all() -> GroupsAndTestCases | {skip,Reason} +%% +%% GroupsAndTestCases = [{group,GroupName} | TestCase] +%% GroupName = atom() +%% Name of a test case group. +%% TestCase = atom() +%% Name of a test case. +%% Reason = term() +%% The reason for skipping all groups and test cases. +%% +%% Description: Returns the list of groups and test cases that +%% are to be executed. +%%-------------------------------------------------------------------- +all() -> [ + api_report, + api_to_file, + api_from_file, + api_start_stop, + validate_server_interface + ]. + + +%%-------------------------------------------------------------------- +%% Function: suite() -> Info +%% +%% Info = [tuple()] +%% List of key/value pairs. +%% +%% Description: Returns list of tuples to set default properties +%% for the suite. +%% +%% Note: The suite/0 function is only meant to be used to return +%% default data values, not perform any other operations. +%%-------------------------------------------------------------------- +suite() -> [ + {timetrap,{minutes,1}}, + {ct_hooks,[ts_install_cth]} + ]. + +%%-------------------------------------------------------------------- +%% Function: init_per_suite(Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for skipping the suite. +%% +%% Description: Initialization before the suite. +%% +%% Note: This function is free to add any key/value pairs to the Config +%% variable, but should NOT alter/remove any existing entries. +%%-------------------------------------------------------------------- +init_per_suite(Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_suite(Config0) -> void() | {save_config,Config1} +%% +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% +%% Description: Cleanup after the suite. +%%-------------------------------------------------------------------- +end_per_suite(_Config) -> + ok. + +%%-------------------------------------------------------------------- +%% Function: init_per_group(GroupName, Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% +%% GroupName = atom() +%% Name of the test case group that is about to run. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding configuration data for the group. +%% Reason = term() +%% The reason for skipping all test cases and subgroups in the group. +%% +%% Description: Initialization before each test case group. +%%-------------------------------------------------------------------- +init_per_group(_GroupName, Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_group(GroupName, Config0) -> +%% void() | {save_config,Config1} +%% +%% GroupName = atom() +%% Name of the test case group that is finished. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding configuration data for the group. +%% +%% Description: Cleanup after each test case group. +%%-------------------------------------------------------------------- +end_per_group(_GroupName, _Config) -> + ok. + +%%-------------------------------------------------------------------- +%% Function: init_per_testcase(TestCase, Config0) -> +%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1} +%% +%% TestCase = atom() +%% Name of the test case that is about to run. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for skipping the test case. +%% +%% Description: Initialization before each test case. +%% +%% Note: This function is free to add any key/value pairs to the Config +%% variable, but should NOT alter/remove any existing entries. +%%-------------------------------------------------------------------- +init_per_testcase(_TestCase, Config) -> + Config. + +%%-------------------------------------------------------------------- +%% Function: end_per_testcase(TestCase, Config0) -> +%% void() | {save_config,Config1} | {fail,Reason} +%% +%% TestCase = atom() +%% Name of the test case that is finished. +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for failing the test case. +%% +%% Description: Cleanup after each test case. +%%-------------------------------------------------------------------- +end_per_testcase(_TestCase, _Config) -> + ok. + + +%%-------------------------------------------------------------------- +%% TEST CASES +%%-------------------------------------------------------------------- + +%%-------------------------------------------------------------------- +%% Function: TestCase(Config0) -> +%% ok | exit() | {skip,Reason} | {comment,Comment} | +%% {save_config,Config1} | {skip_and_save,Reason,Config1} +%% +%% Config0 = Config1 = [tuple()] +%% A list of key/value pairs, holding the test case configuration. +%% Reason = term() +%% The reason for skipping the test case. +%% Comment = term() +%% A comment about the test case that will be printed in the html log. +%% +%% Description: Test case function. (The name of it must be specified in +%% the all/0 list or in a test case group for the test case +%% to be executed). +%%-------------------------------------------------------------------- + + +api_report(_Config) -> + Report = system_information:report(), + ok = validate_report(Report), + ok. + +api_to_file(Config) -> + DataDir = ?config(data_dir, Config), + Filename = filename:join([DataDir, "system_information_report_1.dat"]), + ok = system_information:to_file(Filename), + {ok, _} = file:consult(Filename), + {save_config, [{report_name, Filename}]}. + +api_from_file(Config) -> + {api_to_file, Saved} = ?config(saved_config, Config), + DataDir = ?config(data_dir, Config), + Fname1 = filename:join([DataDir, "information_test_report.dat"]), + Report1 = system_information:from_file(Fname1), + ok = validate_report(Report1), + Fname2 = ?config(report_name, Saved), + Report2 = system_information:from_file(Fname2), + ok = validate_report(Report2), + ok. + +api_start_stop(_Config) -> + {ok, _} = system_information:start(), + ok = system_information:stop(), + ok. + +validate_server_interface(Config) -> + DataDir = ?config(data_dir, Config), + Fname1 = filename:join([DataDir, "information_test_report.dat"]), + %% load old report + ok = system_information:load_report(file, Fname1), + ok = validate_loaded_report(), + ok = system_information:stop(), + %% load local + ok = system_information:load_report(), + ok = validate_loaded_report(), + ok = system_information:stop(), + ok. + + +%% aux + +validate_loaded_report() -> + ok = system_information:applications(), + ok = system_information:applications([full]), + ok = system_information:environment(), + ok = system_information:environment([full]), + ok = system_information:application(kernel), + ok = system_information:application(kernel,[full]), + ok = system_information:module(gen_server), + ok = system_information:module(gen_server,[full]), + ok = system_information:modules(native), + ok. + + +validate_report([]) -> {error, no_entries}; +validate_report(Report) -> + ensure_report_keys([ + init_arguments, + code_paths, + code, + system_info, + erts_compile_info, + beam_dynamic_libraries, + environment_erts, + environment + ], Report). + +ensure_report_keys([], _) -> ok; +ensure_report_keys([K|Ks], Report) -> + case lists:keysearch(K, 1, Report) of + false -> {error, key_not_found, K}; + _ -> ensure_report_keys(Ks, Report) + end. + diff --git a/lib/runtime_tools/test/system_information_SUITE_data/information_test_report.dat b/lib/runtime_tools/test/system_information_SUITE_data/information_test_report.dat new file mode 100644 index 0000000000..0900eadd4a --- /dev/null +++ b/lib/runtime_tools/test/system_information_SUITE_data/information_test_report.dat @@ -0,0 +1,9873 @@ +{system_information_version, "1.0"}. +{system_information, [{init_arguments, + [{root, + ["/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp"]}, + {progname,["erl"]}, + {home,["/home/otptest"]}]}, + {code_paths, + [".", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/kernel-2.16.3/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/stdlib-1.19.3/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/xmerl-1.3.3/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/wx-1.0/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/webtool-0.8.9.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/typer-0.9.5/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/tv-2.1.4.10/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/tools-2.6.11/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/toolbar-1.4.2.3/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/test_server-3.6.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/syntax_tools-1.6.11/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/ssl-5.3/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/ssh-2.1.7/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/snmp-4.24/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/sasl-2.3.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/runtime_tools-1.8.11/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/reltool-0.6.4/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/public_key-0.19/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/pman-2.7.1.4/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/percept-0.8.8.1/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/parsetools-2.0.9/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/otp_mibs-1.0.8/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/os_mon-2.2.12/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/orber-3.6.26.1/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/odbc-2.10.16/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/observer-1.3.1/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/mnesia-4.9/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/megaco-3.17.0.1/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/jinterface-1.5.8", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/inets-5.9.5/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/ic-4.3.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/hipe-3.10.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/gs-1.5.15.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/eunit-2.2.4/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/et-1.4.4.4/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/erts-5.10.3/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/erl_interface-3.7.13", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/erl_docgen-0.3.4/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/eldap-1.0.1/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/edoc-0.7.12/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/diameter-1.4.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/dialyzer-2.6.1/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/debugger-3.2.11/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/crypto-3.0/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosTransactions-1.2.13/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosTime-1.1.13/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosProperty-1.1.16/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosNotification-1.1.20/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosFileTransfer-1.1.15/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosEventDomain-1.1.13/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosEvent-2.1.14/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/compiler-4.9.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/common_test-1.7.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/asn1-2.0.2/ebin", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/appmon-2.1.14.2/ebin"]}, + {code, + [{code,[{path,"."},{modules,[]}]}, + {application, + {kernel, + [{description,"ERTS CXC 138 10"}, + {vsn,"2.16.3"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/kernel-2.16.3/ebin"}, + {modules, + [{application, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"69c3102d717e7258701a536ddae1eb89"}]}, + {application_controller, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1bbfd81a8486ac040562ce0fd40c32aa"}]}, + {application_master, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d8eee82bfd661e8f0d862f3aad5b85ca"}]}, + {application_starter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d505f3189443053e586fdf270446ce2f"}]}, + {auth, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"800c93bf9ba03b6e4951de0d5db28328"}]}, + {code, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"84f37378526c5e82c5d0d967c1ca8f82"}]}, + {code_server, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"09ce0ef7103f3151553c6badc7e96fc1"}]}, + {disk_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a5ab0573095f258c87f6166af8f8425c"}]}, + {disk_log_1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"287f2521436a30a0567d54e2596c1034"}]}, + {disk_log_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4c7972e5f3dedce5c87cf8ef88c59bb2"}]}, + {disk_log_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c6012237e70b570585bfb58f60537d9c"}]}, + {dist_ac, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4dfa17c94d63da8f6b9edb1532a3e537"}]}, + {dist_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8fa19e7b4bca4b5aac847d138c85c553"}]}, + {erl_boot_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"86ecca01e41b2321c01b7181cb826766"}]}, + {erl_ddll, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"90f1c7a6fd3cf6595d95b9f57abd87ce"}]}, + {erl_distribution, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"16a49a506b48567bd32b2021dac425ff"}]}, + {erl_epmd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eee4870e061790054c43ff70bbccbe25"}]}, + {erl_reply, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0e0a4f09b0877938b4d79b41122dad38"}]}, + {error_handler, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1af2b51d167b017b3e1fae0beb408181"}]}, + {error_logger, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"941136b080021af90dc32f23774b0def"}]}, + {erts_debug, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e2a7b675323db5946605344ffccca170"}]}, + {file, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5eccb55276e7162ab5bec77b46562332"}]}, + {file_io_server, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"032292fd7d9e2bf08ff23de192710f97"}]}, + {file_server, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"58bd1e532dee0fccff9e1fba1e429a5e"}]}, + {gen_sctp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1e5e5a8c7708c9a81f26d2a89e3987c"}]}, + {gen_tcp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4cf58918602a7242ca4060bc1d6b5652"}]}, + {gen_udp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"361b9b25604b9053a8a4c98b8df47408"}]}, + {global, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e553137965978f64ffb9ef274c79e9c2"}]}, + {global_group, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8ce6b230fef9340aeb41205a6ef4b4f3"}]}, + {global_search, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0a82f2701d71d2a1576074dd69414e1b"}]}, + {group, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6b3164d5d61625f0651c13107459627c"}]}, + {heart, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b808d9003cf50d73ebf888da50d73e12"}]}, + {hipe_unified_loader, + [{loaded,true}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"879423975936fcf88729034f7d4a93b6"}]}, + {inet, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bd325ceedcab3ca885eeaf4c982561e0"}]}, + {inet6_sctp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d8b6d95ec571f5e669047b5f40455d21"}]}, + {inet6_tcp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"93a9204ef927b17957c61a18f3ba47e2"}]}, + {inet6_tcp_dist, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9a94acd2c5dc0e625d2c2b4292e9a27a"}]}, + {inet6_udp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17a90b344977dd2c657309507c99b516"}]}, + {inet_config, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"741587fa47d6b66b96ef125b3d5ba61a"}]}, + {inet_db, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f65160805d30ff194618a5ae4038ae9f"}]}, + {inet_dns, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7f0c31b6cecf31d641bf46840f85ebee"}]}, + {inet_gethost_native, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"09867d1d19f3c30b73fb47a48d0d843a"}]}, + {inet_hosts, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a0f48322bd3a1bd0e75f248e39b41f69"}]}, + {inet_parse, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"29aee7378a4d1f814e1fd311d0eaab3a"}]}, + {inet_res, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c1018a662254323cfa45309afb3b3397"}]}, + {inet_sctp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cbce09a1ffa13cb124d87eaecd25dfbf"}]}, + {inet_tcp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0da6499cb44db53be6145a5dc3449d93"}]}, + {inet_tcp_dist, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"797e28cd89efe3a1a9d83244afd0b880"}]}, + {inet_udp, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"70908d7165a2b298a85d9a4c1f8f9fa2"}]}, + {kernel, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cf5c248b778654e664e6d2368ec285df"}]}, + {kernel_config, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"39fbe27956eeb0cca9d7871f7de40a2e"}]}, + {net, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cb8595f084959a2b5e329ab32047dbc4"}]}, + {net_adm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"628c961d8dbbab4c5b2b180e527530be"}]}, + {net_kernel, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"049f43826000bfefbbc2376bd21c9919"}]}, + {os, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"464c6c09afb87824ecf12bfa6065b3dc"}]}, + {pg2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"34858fa3619c1dc17d01536593359ed2"}]}, + {ram_file, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"28bf8253c5f8357ab68b4d505e170856"}]}, + {rpc, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"895e080302ac8a39197dfac0cc53adc6"}]}, + {seq_trace, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"845af954b395a80e5cf3d0c2ea0a3b99"}]}, + {standard_error, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c0ac4192fd9f73885581481638c1648a"}]}, + {user, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"93ad1841fa2dee776bff76f8989f5021"}]}, + {user_drv, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"161f1a45735f77129c80bacd778e5632"}]}, + {user_sup, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"baab537a62725bcbe4510c9f0b2d99eb"}]}, + {wrap_log_reader, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5dceb6e671d0c51d181f51ec4e031798"}]}]}]}}, + {application, + {stdlib, + [{description,"ERTS CXC 138 10"}, + {vsn,"1.19.3"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/stdlib-1.19.3/ebin"}, + {modules, + [{array, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c7c98b180715bd79794eef21a2930fff"}]}, + {base64, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e45b571f2414c6131fbf62b1da3560e5"}]}, + {beam_lib, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9e13b050aff529ecac6569f7101237ba"}]}, + {binary, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e77ffd0688b3f1ace1ac70936969da3"}]}, + {c, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"402465a98ccec8e9314139daacf6203e"}]}, + {calendar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c09413575ac7f80ea3d9217b1f7e1bc"}]}, + {dets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5154c82c2ffefa19096cf87ffb394a6c"}]}, + {dets_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c810e731ba4101aba5f6b6c08481ea85"}]}, + {dets_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9b4a9ef0f616b7c5464cf6813384e220"}]}, + {dets_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a64e0220f855e6e97d53a9bc4f0a111b"}]}, + {dets_v8, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ebf2c94f62d180c3159b663ba2094189"}]}, + {dets_v9, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9098391234b6304ff3d106dc56d467b6"}]}, + {dict, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0bc1d74a65bd392960cd7e1b230f07bf"}]}, + {digraph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ac9049d6d7454a87c40c2f03f4223849"}]}, + {digraph_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17bbe67d3314e9024825512c1ccc7be8"}]}, + {edlin, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"518247b4963c998e742c0794091c9864"}]}, + {edlin_expand, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"06c4ff7cf326df872bec9feed7f5984d"}]}, + {epp, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"493760bc942ddd16df2a8e55f8b59774"}]}, + {erl_bits, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bba2a00b28557c9678356247c36b0474"}]}, + {erl_compile, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"291c9ddceeb66c7a7c36ab3505799513"}]}, + {erl_eval, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9982f2bca01a352a45932a6db95a1336"}]}, + {erl_expand_records, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"047c93973c9fbf83724cdf688e258cff"}]}, + {erl_internal, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3225aadc9ec4f84cc9451f30833cdefb"}]}, + {erl_lint, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"98ffb79824edc0f2a8ad49ff447e121c"}]}, + {erl_parse, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f9a3d97b028bafa2bba7037bc1987d87"}]}, + {erl_posix_msg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ecb0903ecde21b7cc58277424d8bac3d"}]}, + {erl_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1b7945b193daf989e3f62c4a452f773e"}]}, + {erl_scan, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1dd9fb779b35d1925a0ad68c092af1f0"}]}, + {erl_tar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c6161b31a69bd3566a910d369baae00"}]}, + {error_logger_file_h, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"218156df9bdedd04e37eecc76863940c"}]}, + {error_logger_tty_h, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a2cac9386113d6879a4111be3e2d191b"}]}, + {escript, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b77d5172cf00acd06fd6e42f03dc9b06"}]}, + {ets, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"13c77916ba3c85e6e076aa0664f5674f"}]}, + {eval_bits, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7bf8829d056519787fd0f7900bd04b73"}]}, + {file_sorter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4e31c9ca53e59010980dfc4e46e8aaf1"}]}, + {filelib, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"641651ced98857991b064b22c85cf90f"}]}, + {filename, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9a007021a1e9de6af67e99cc48be13c5"}]}, + {gb_sets, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4891f6d98f4bb81bc64415434d08ff9d"}]}, + {gb_trees, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4e9a8ae86761c41dc0e9d32f57df63c3"}]}, + {gen, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5beaa9b295439aa39187eeef56b8527b"}]}, + {gen_event, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79bc1c9f72e633331d4518d982221af0"}]}, + {gen_fsm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fb95e4cf29f5cf640e486c789fe9f1f7"}]}, + {gen_server, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"14f189569fb6420c633a5dab81f7b897"}]}, + {io, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"75fd9a0dc5823e95b4543a09be83c6ce"}]}, + {io_lib, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"34c18dd02ec6458cae20ddc323542eed"}]}, + {io_lib_format, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1f8f2a4d12d79d82420335d0e84107a"}]}, + {io_lib_fread, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"27699e322a2de2004b057465f549fa3f"}]}, + {io_lib_pretty, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"32d7bae40549bdd60298c0d17efe057b"}]}, + {lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"394b1b967c909d1830939846963ac4f0"}]}, + {lists, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f840b76db5f9e5d37dcc9dc39a436b90"}]}, + {log_mf_h, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6f972dea76e360d99074b659327db69f"}]}, + {math, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fe02e030a198ec343f3c4a62f60ebf8a"}]}, + {ms_transform, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dba72a603f0a9382274671842d6aaf55"}]}, + {orddict, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bedb6cdaf10530b2486b46f79853fbea"}]}, + {ordsets, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f5dfe0e73da077c2f86dbbe846e0dab7"}]}, + {otp_internal, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff3edabfa0633b9553b6fed1e47e41fc"}]}, + {pg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c3975b993694a2a465d331278b503f81"}]}, + {pool, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d0398428064137474f5acbb4122a70d"}]}, + {proc_lib, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5542f4add07ef7bb54a76b0cdfa542ba"}]}, + {proplists, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5723876c3ed585a5a4b10dc3aefaf170"}]}, + {qlc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"75df6efc99d9a75bb4c989985125d3da"}]}, + {qlc_pt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e84b6da8fb84f811f2c58365e59dd47f"}]}, + {queue, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"221ed57d299c2281992706fd6e2c6584"}]}, + {random, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e703cb7ee27e2e23baf924c2f6b29f50"}]}, + {re, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6eef786ed4f4dfec57a568e488e3596d"}]}, + {sets, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c4fbf3b29bf971465a8dc4077fc3e7c8"}]}, + {shell, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c4fdd7e1d18047b5f086b6fe8730c896"}]}, + {shell_default, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5a94fd884c9594ff9056228503cd2731"}]}, + {slave, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f5536e71d137302d699982fc65b9d025"}]}, + {sofs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"10f13cd4626d429897246538c02c2cb4"}]}, + {string, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d7440fe2e1838223f877286bf7d8f2a4"}]}, + {supervisor, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"29c98bf9e58cc955d4c29d881d98e84f"}]}, + {supervisor_bridge, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f58b58a1fefecc46a476490ef5231d7e"}]}, + {sys, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7afd9c746450e5189048ff3635b37926"}]}, + {timer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fa3e2b017848accc808f92910abf87b8"}]}, + {unicode, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be45160097c37c9144169f4ba54e0128"}]}, + {win32reg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9f59ec1a4af1e6381d8770fc2c5915e4"}]}, + {zip, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bc9aab95b5fc9ee7e534e890d8e5516c"}]}]}]}}, + {application, + {xmerl, + [{description,"XML parser"}, + {vsn,"1.3.3"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/xmerl-1.3.3/ebin"}, + {modules, + [{xmerl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1eabeb9846b832059537e2bdf6fed2d2"}]}, + {xmerl_b64Bin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62075ae2d95f3188143a41f582542bf9"}]}, + {xmerl_b64Bin_scan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bd99982371c4db3baf4883c96e146c96"}]}, + {xmerl_eventp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"99aad15d2ad4be80d580fe7e3ba4178f"}]}, + {xmerl_html, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f79915eaadae7d92946f1182110e6f81"}]}, + {xmerl_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91fe55408e50bf92a9f8ef8b402a3e51"}]}, + {xmerl_otpsgml, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f2e027e7204405c168eaa598a6a4d476"}]}, + {xmerl_regexp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"408f3ffbd843e09ed0326f5e6a72356e"}]}, + {xmerl_sax_old_dom, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"66b229f3eec3dce1f8754de256ba8d1d"}]}, + {xmerl_sax_parser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"66e80c0d03a583d22abc40a54096777c"}]}, + {xmerl_sax_parser_latin1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e2a462359d6765811f41b1ac1260c81a"}]}, + {xmerl_sax_parser_list, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"db56224dbccdf302e42479027c3f961b"}]}, + {xmerl_sax_parser_utf16be, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aaa379b8f1008944bd486f29a85ab1c2"}]}, + {xmerl_sax_parser_utf16le, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"027d5c2218de2a7dd6f5db3b1c433a74"}]}, + {xmerl_sax_parser_utf8, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"40f970e9b4eb4122589c0afec6b8907d"}]}, + {xmerl_sax_simple_dom, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2c08dc40f819e4972a58a2fb2fcf6239"}]}, + {xmerl_scan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0afb5a6c37db1b5dd100297a149d9f8a"}]}, + {xmerl_sgml, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"22933821d58054ab2941678ce2f8a298"}]}, + {xmerl_simple, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8c83463864e0c2117c7659aae4e6ae50"}]}, + {xmerl_text, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"661d77ea6d07fe6281f04e8e553528d4"}]}, + {xmerl_ucs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8ace187d193a5314fbe329eba939dcf0"}]}, + {xmerl_uri, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1121ced96856184d51daecddbb4b562f"}]}, + {xmerl_validate, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fe1eb20e24d92db08eb03a7a3fbbd73a"}]}, + {xmerl_xlate, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2515e06ee34909465fb4520f199f5a46"}]}, + {xmerl_xml, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e04d0e513bb48336b9e69de89208e97c"}]}, + {xmerl_xpath, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02a4e2d946ffe93e960c66ce0d391628"}]}, + {xmerl_xpath_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d6531ac82f1524946a0a31f40a90546d"}]}, + {xmerl_xpath_parse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7b3bd078c12f46cf5154d05c49880058"}]}, + {xmerl_xpath_pred, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e2a7d97114507d23ad8cfdf967fd656f"}]}, + {xmerl_xpath_scan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1d43883f65aa0006900fc053453d1bd2"}]}, + {xmerl_xs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6963383b4148fd4a7d51bf8e54b79640"}]}, + {xmerl_xsd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4660a75a540225ba8a88c00914923507"}]}, + {xmerl_xsd_type, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be422d840d07c53b8ba210889dd5d308"}]}]}]}}, + {application, + {wx, + [{description,"Yet another graphics system"}, + {vsn,"1.0"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/wx-1.0/ebin"}, + {modules, + [{gl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2b2c807a7fbd4012871027dd4292448b"}]}, + {glu, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"28a23cf86e317c54ebd1b609b38f2fe3"}]}, + {wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"854481fd306d90c1fe6ad683045a1d98"}]}, + {wxAcceleratorEntry, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d7572b3e8662e26666964cc64ff7b90"}]}, + {wxAcceleratorTable, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a261f6c3e0d571493a46fcd40b0361f7"}]}, + {wxArtProvider, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"22bc145a24e52e15d6e0f66e3f057df7"}]}, + {wxAuiDockArt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"22fca5ae251c6592dda5b08c0688138a"}]}, + {wxAuiManager, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6f87b4fc280d820edca4655bfc0388bd"}]}, + {wxAuiManagerEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d08f2847271aae031ed49a0cab96e8f1"}]}, + {wxAuiNotebook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4b055991aa4efef19c59653db60d611e"}]}, + {wxAuiNotebookEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f9fc2a85bda82dc6406833d3746a1313"}]}, + {wxAuiPaneInfo, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"96dc39e65e2d04e597a76663651cbe45"}]}, + {wxAuiTabArt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0641080a257e4c0ce7030d7a404ea965"}]}, + {wxBitmap, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62ddedace917fe7d65ebfdd968e2b442"}]}, + {wxBitmapButton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"676cbd0f421681f3cdb110b08b89cdf4"}]}, + {wxBitmapDataObject, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9ab868e8a18350bb427d08abd31d805c"}]}, + {wxBoxSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8f30f0ad197cd2fe6bb6956ecf55009e"}]}, + {wxBrush, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f41534b5b14c0528729f3faba6d97e1d"}]}, + {wxBufferedDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"14bd8d1184f57ca3b71ae50c396b8fb6"}]}, + {wxBufferedPaintDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b617bb74c090fd1bedd78a44e87620df"}]}, + {wxButton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cee0c2cf94d454426067a18f222b5175"}]}, + {wxCalendarCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"684d559165e957aac543b2f75db8821a"}]}, + {wxCalendarDateAttr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d3406fdefafb1e56b3b4b0c049e8f306"}]}, + {wxCalendarEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"deb02e8741160ee9f1a44853db16a6d3"}]}, + {wxCaret, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"543d4a99c593ac822143cc4c680fbe10"}]}, + {wxCheckBox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ae5b445190e6d0811bc3bf41c269ad7a"}]}, + {wxCheckListBox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"094de5ba936cca4c26ffc0b765d371be"}]}, + {wxChildFocusEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d4d29ee311555ab76419724546859432"}]}, + {wxChoice, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b7e31246a035375896498e17c366beaa"}]}, + {wxChoicebook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"32665c0637a00816a2fff4d4f5f418c1"}]}, + {wxClientDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"400fdcc0f51e0e5043be4ca4da99a8a7"}]}, + {wxClipboard, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4ddbb8e1f11321204d48d247e9f7548b"}]}, + {wxCloseEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"815ac954da8b6cb7b694ca4cb28ccd50"}]}, + {wxColourData, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"84cf04d6327af73aabd2f775d16bac5d"}]}, + {wxColourDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d8e90d5109efec91ee6417d01b929951"}]}, + {wxColourPickerCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e7fb673975f4cfa9946c34e30109d036"}]}, + {wxColourPickerEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2cfa29b0fce7f98058c3d5ad016c1f2f"}]}, + {wxComboBox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b2aa520b9051f42a5e0f1ce1c6408101"}]}, + {wxCommandEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e5fed22a39c6c80dcc029ebe5444b0c0"}]}, + {wxContextMenuEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0a1739b84b365833c87232bfb298f681"}]}, + {wxControl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aed7a496290caa0b53740c681de998ec"}]}, + {wxControlWithItems, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a14351fadd0f776a4deeaf5ec518a689"}]}, + {wxCursor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79eadaef3d9df7bae0a2146634d43e72"}]}, + {wxDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3f88cfd62f368172c3ed90684df53ba3"}]}, + {wxDataObject, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"065ea6f1e76ca8b6558ca3dd7ff42077"}]}, + {wxDateEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"56c06074946764fbc74b7070f5759e19"}]}, + {wxDatePickerCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c716525fffbc864c85159fb43b2a8d64"}]}, + {wxDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1a480a0c1690092014cf8198ba52d2a3"}]}, + {wxDirDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"43565cc473a21632555cb3151138b7c0"}]}, + {wxDirPickerCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6463e54c6564a1f7f5d6bec082f9ea63"}]}, + {wxDisplayChangedEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1dbd9061f370f3db0343c4f88f57cfa3"}]}, + {wxEraseEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff780a85a34cb23667b7e4072db17a2b"}]}, + {wxEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8644675e2fd7bbc6965d4babd0d14d7a"}]}, + {wxEvtHandler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c0991f5d86247ce757145c326adea516"}]}, + {wxFileDataObject, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cd9b5735e3994492c32ca099a70093d0"}]}, + {wxFileDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b9cb446535683e7a9258953f53cd77de"}]}, + {wxFileDirPickerEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6153d339ac822da8c4a9d766d0af22f9"}]}, + {wxFilePickerCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c9ff43ff739e3ee37aae637a494d7d3"}]}, + {wxFindReplaceData, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bccc5beebb4aa0bfd424d26f472745a6"}]}, + {wxFindReplaceDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c40b557d35e4bc527a715996daad0e0c"}]}, + {wxFlexGridSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed3da3c3822f59a6b2737f273397367d"}]}, + {wxFocusEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1c04cb018d6c94d24a44ae365dae46c1"}]}, + {wxFont, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64303b1a35432898649e40e9c3f5bdd2"}]}, + {wxFontData, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0135398ad369de2fd9beda1553f7d309"}]}, + {wxFontDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a872a3b88df4faa051e4b1f8cb0397a0"}]}, + {wxFontPickerCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5e5b363ea487a4284714346d43d6c418"}]}, + {wxFontPickerEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a22e0effda4c521ce1b35bd5b2259758"}]}, + {wxFrame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"168aac11a6c3835b122ee653ce2e50a0"}]}, + {wxGBSizerItem, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"857c0be340c9c324d39cd525749a7cf7"}]}, + {wxGLCanvas, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"88461209c2234e4e166923d760a42164"}]}, + {wxGauge, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4d998a1ffcf56ccf2ea3a12eabe375d9"}]}, + {wxGenericDirCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c5f8f19f7fdf9545c1a08318a12782b8"}]}, + {wxGraphicsBrush, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9eeb08fd93c17259400e13b1586ef6ee"}]}, + {wxGraphicsContext, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bee681fb85f534a63c2747e704d9001d"}]}, + {wxGraphicsFont, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be1d636aa381e330db93a1deb9ff4b13"}]}, + {wxGraphicsMatrix, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b452f9e3d87800b00e063b39d71583aa"}]}, + {wxGraphicsObject, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64dba881c5b70355d45323363715ba69"}]}, + {wxGraphicsPath, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e93e67098fd350e7eb20ccc5f7287b30"}]}, + {wxGraphicsPen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9c8c8c3cf5277cdc526dca9e591a10b0"}]}, + {wxGraphicsRenderer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4aeb3961b9b1a22263c8abf2473cc53f"}]}, + {wxGrid, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e1195ea11e71c0534fffa76535efefbf"}]}, + {wxGridBagSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"60ee2c7022f1feef9c169a191945d637"}]}, + {wxGridCellAttr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02222543db113d41d409cd4080764d49"}]}, + {wxGridCellBoolEditor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"297c5d3648d99bef9bc294d52d28b619"}]}, + {wxGridCellBoolRenderer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5cf8954049f0443ea2f9003deae7960d"}]}, + {wxGridCellChoiceEditor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b77d6b8cb344c4512cef8adaf23ef93b"}]}, + {wxGridCellEditor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a5cf6065e8754f96612cff48a1fdcd20"}]}, + {wxGridCellFloatEditor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"723baea27c999730afcacb3280f611c4"}]}, + {wxGridCellFloatRenderer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ab56332ebccd1245fff7cb86abfd670b"}]}, + {wxGridCellNumberEditor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f0d86be445b03945610d9154c8905258"}]}, + {wxGridCellNumberRenderer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"28ae774386962927dd552da4e9a28ca1"}]}, + {wxGridCellRenderer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a6da61c7ff2464f3b007626b1f813dcb"}]}, + {wxGridCellStringRenderer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aefd3b8019cc4321037c8bd8e4faeba2"}]}, + {wxGridCellTextEditor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dbce8b54a66e9a9869d84655ef26d908"}]}, + {wxGridEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7b41f04ffe42c4602fe2911b5ca44dbe"}]}, + {wxGridSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"37bfde707aa6f2a1f68f8377dcbd7580"}]}, + {wxHelpEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"714f8b000f3d09fe7eae13b1a5daa0c7"}]}, + {wxHtmlEasyPrinting, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eaa59118b8408b91d16df3b600494e5e"}]}, + {wxHtmlLinkEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6f527856d02011b9f480494b2f3118f0"}]}, + {wxHtmlWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"61e947b44d4ae81b9bb0faf9a443cbd3"}]}, + {wxIcon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1b4d9209343a029641204f334bd07dc5"}]}, + {wxIconBundle, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3281d9d364552b38009405e79467d5c5"}]}, + {wxIconizeEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d66e4289534961f6868d91e1d1399b53"}]}, + {wxIdleEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc82957c3a0181ef84ca78ace7a9271e"}]}, + {wxImage, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"25de92b502b3a920e1247d2d1433aa32"}]}, + {wxImageList, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3445492f371fe7d2a6f7534d61ad66a9"}]}, + {wxJoystickEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"15c7352ac168dc5adc0de4a872b9740c"}]}, + {wxKeyEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b2e23f50406c65d5f2269910467a9721"}]}, + {wxLayoutAlgorithm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2f93e6eac8570144faabaea83388129a"}]}, + {wxListBox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"87aade14ade89a7021b6908143d339f1"}]}, + {wxListCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e35643c3218ee7db6bf18dbd72bc470"}]}, + {wxListEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"90354ad1e09b594dd321bca68d8d3f02"}]}, + {wxListItem, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be95e4c22e265fbcfb14ab7c9c798684"}]}, + {wxListItemAttr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0137573b7a2b2569b481548c26bb91a9"}]}, + {wxListView, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c0022979dbcc2ac873adb72ea26c16aa"}]}, + {wxListbook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0e4b01ad81bf68f1784ba30772502e0b"}]}, + {wxLogNull, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17f8273288c6e880ec0c7a21842b022f"}]}, + {wxMDIChildFrame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5894b4a01bb643f208995257a0f9a00f"}]}, + {wxMDIClientWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fa7017cfb2e70f0492550a2ecd01d1c7"}]}, + {wxMDIParentFrame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"251cf2044002bbb5afc2acddf442f14a"}]}, + {wxMask, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8b4ce241e6edd84d32df4b40a2f17a15"}]}, + {wxMaximizeEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e8a766afd7de5050ced825a275c6cdba"}]}, + {wxMemoryDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b4c1bb9fed0edf70b44f24ea3fb54f39"}]}, + {wxMenu, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d2e48cd879d0ece5ee24260bc70e2f9b"}]}, + {wxMenuBar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"562e9979f8ce58c85032ae3e02307d7b"}]}, + {wxMenuEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0571277ab11e756d18d34c6cb4f8f1c0"}]}, + {wxMenuItem, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"900c9de70ac02a326bce22eec1c64d48"}]}, + {wxMessageDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a15267b44d3cbeae16c294c4c0b96324"}]}, + {wxMiniFrame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ca0204b8a167fd472a555695e58927b"}]}, + {wxMirrorDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d521a1f1e4d37132a7a0de0eccc332f0"}]}, + {wxMouseCaptureChangedEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f85672fbf15ee0b8306de4aaf4eb4719"}]}, + {wxMouseEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"802c21f46105f957d8cd8c84ff36d986"}]}, + {wxMoveEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4231fd181e0b305a82c595f66eb99b96"}]}, + {wxMultiChoiceDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4eb40bfa965a25034ebe4b8fca335863"}]}, + {wxNavigationKeyEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"04b113c9dcf181af633d0eae1f18c36f"}]}, + {wxNotebook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fef44c082d799a4d86e0cd8db58609df"}]}, + {wxNotebookEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0ccae052bfd1cf87236add4c0b26143d"}]}, + {wxNotifyEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d3d22b2b86ce1a94c57ccd9842211f05"}]}, + {wxPageSetupDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"755792c8d70118493f5147ef26f40d00"}]}, + {wxPageSetupDialogData, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"942f2c8bd296e971ea1d0f74ec700be5"}]}, + {wxPaintDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c23afeac816efecc5417b0687437d8cf"}]}, + {wxPaintEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a18ce83af679d334ce979df65607226c"}]}, + {wxPalette, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a5b3e165b8ac3e3cb2d5ba6e149bb0ca"}]}, + {wxPaletteChangedEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"785c765df0a50eac4b2c5c054453c0d9"}]}, + {wxPanel, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"08c772b8c30e7441366bcfcd5005f21d"}]}, + {wxPasswordEntryDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62b860fd64e74f7d67c51a5d8a0fb157"}]}, + {wxPen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"51b981a9e2313e58123888c6b67192ed"}]}, + {wxPickerBase, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ab9e2f2d6c3b5f8184d5b1d806b0dce"}]}, + {wxPostScriptDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8a820bdc1354c448a8b442016951a6b2"}]}, + {wxPreviewCanvas, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e7b48321129f0e14c2006272c8926544"}]}, + {wxPreviewControlBar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62393081a6ffcb6bf092b47703e31b4d"}]}, + {wxPreviewFrame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"78f39bbfead1330839955a50281a2329"}]}, + {wxPrintData, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"928a6a97c5c4b664687015c40d660cdf"}]}, + {wxPrintDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"acc4c816bf0a64c8ce31af3c001f1688"}]}, + {wxPrintDialogData, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc97f97b620110928f4093806b1b8ce4"}]}, + {wxPrintPreview, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"92f04b064e7b041ee27bb202e5a60b80"}]}, + {wxPrinter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"05626841c780ceaf3c5af0212f53fbaf"}]}, + {wxPrintout, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"feea26109fa63e4d98c2924189762a43"}]}, + {wxProgressDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eb45280951aef0038b8130c91a333833"}]}, + {wxQueryNewPaletteEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be6c85603e81f7c90d4a949d42c0b32d"}]}, + {wxRadioBox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"33684d6ce3f3c5388e6faf4f06d90463"}]}, + {wxRadioButton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"92bebfd9b33658dcff2e592b5fcaeb7a"}]}, + {wxRegion, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"18cb5a2a1dcb63a646135f2a6cb1b21c"}]}, + {wxSashEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d4c51c14137513da9841890751deafd2"}]}, + {wxSashLayoutWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f6f5167ff888b73c603b2f641e96a49f"}]}, + {wxSashWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91c5be41fbe95f5ad4504fae2f56f91f"}]}, + {wxScreenDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc9411f49fe7324bcbace2c05d31d39a"}]}, + {wxScrollBar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e60ffb44799a3684f74d783addbf42c9"}]}, + {wxScrollEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4fbd1eb49f69e56894aa4a7fb26e1b4b"}]}, + {wxScrollWinEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be44e413061c515cb83a103a46572065"}]}, + {wxScrolledWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ccef65f1430df907d9bd34c27408f9cb"}]}, + {wxSetCursorEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1aad98a9e1d08f792da0d73f23ceb7e5"}]}, + {wxShowEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"89a775b3e6579b8e55e35bc6a46649ef"}]}, + {wxSingleChoiceDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f0df9c7367cbb88a21c8dbfcff668fed"}]}, + {wxSizeEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"78d4dff8fa58b02bd49c31b6de28b935"}]}, + {wxSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"581f4ba6c9b3befca1efbcd221455b49"}]}, + {wxSizerFlags, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"54ae0bf1305ef85943158c8f4bc58669"}]}, + {wxSizerItem, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff2680fb6f057abf757516aa98e26281"}]}, + {wxSlider, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1e0578ebbde06a5308c00e98e0fbb6b"}]}, + {wxSpinButton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d27cc12c048bf0b160f53ca416add6ab"}]}, + {wxSpinCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6ce2382ed84ceb1585afea719fcddf73"}]}, + {wxSpinEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"158d1777d9e8d840b6d8fa93982b876a"}]}, + {wxSplashScreen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2719e687a6f08135c305b0b0692b8f40"}]}, + {wxSplitterEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a71231c8d2c06f12ee862be00ac91fb3"}]}, + {wxSplitterWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d7cf57a832b89c0e8574b09e632c7f1d"}]}, + {wxStaticBitmap, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"709ad1816bd35aa84a5b1eca1a6571f2"}]}, + {wxStaticBox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"84480d00723cfae07f5c67ad463bec22"}]}, + {wxStaticBoxSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b32933189486b806c14a04452a3a5887"}]}, + {wxStaticLine, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"569ff89c23e697fc73de1f13d51b17d3"}]}, + {wxStaticText, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6baa91538f6f4d374f0c8c4a2cb5f25c"}]}, + {wxStatusBar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1cbef8443710f5270baade15b9312c4e"}]}, + {wxStdDialogButtonSizer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2325bcbc06870de4093489cae45bc2ee"}]}, + {wxStyledTextCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"94cc5d191271e6c87926850e0ea8615d"}]}, + {wxStyledTextEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"451ad9ce6872ea2035c3828713fe09c1"}]}, + {wxSysColourChangedEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c6f80dd65e0c9731e4a6dfcb10c71059"}]}, + {wxSystemOptions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3f3db4310f5e978392d4c6ec83347dae"}]}, + {wxSystemSettings, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3bb2753eb2dde96fd7f4aac7f944f69e"}]}, + {wxTaskBarIcon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d221781abd0a15270e591e77e279a840"}]}, + {wxTaskBarIconEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a3d865d9706104b122cab70b07fcc3a1"}]}, + {wxTextAttr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3a6de5eb0c71625ca14606d4e3919e53"}]}, + {wxTextCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"924adbbbade1b95c226a18484c6bba33"}]}, + {wxTextDataObject, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4a3694d548ae60c8261f55b671ac834a"}]}, + {wxTextEntryDialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6c3038c65992b9a6eef33dd1aff7ce1d"}]}, + {wxToggleButton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4471e21c4fb39eece7418adbcd0f0fd1"}]}, + {wxToolBar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"163743b59b5ec0b6af08d7a66f1f36a0"}]}, + {wxToolTip, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"71dde961902117baba2d2b70f18ebad5"}]}, + {wxToolbook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"053b84811ff7ef240d44fa454f966e71"}]}, + {wxTopLevelWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c7dc3f9260823e5ebb2f99855f8d498f"}]}, + {wxTreeCtrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"72e339bd396c87edd28d5a7cc6954e6d"}]}, + {wxTreeEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17bf2e16e1f41f451fde53d1b72f8b01"}]}, + {wxTreebook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b4889ab8905fd0fd8df5d06c900edf44"}]}, + {wxUpdateUIEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b7e61e2de35af5257f49919be1304381"}]}, + {wxWindow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c5337193a39eb848cbcd1afc79f19c8f"}]}, + {wxWindowCreateEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c898ff077b90017671180089c5b37048"}]}, + {wxWindowDC, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dcdf0f184f2b85f0915bb8d89ae8be27"}]}, + {wxWindowDestroyEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6c443d15978d3a61549f9817ff75fb48"}]}, + {wxXmlResource, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7240754b5985cf7af7c3ff2a3aba3548"}]}, + {wx_misc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1c24e9903d1b499f26e385d7aae15108"}]}, + {wx_object, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b17d673c7c4f59b27e9625b62077ef41"}]}, + {wxe_master, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cbafeb9aba24bb5e831dede889b317c1"}]}, + {wxe_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d6fabc67e68c6a41d8fa0ae642f6b272"}]}, + {wxe_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5d6e77598d0db8185bb1cb3bad9c5d14"}]}]}]}}, + {application, + {webtool, + [{description,"Toolbar lookalike for the web"}, + {vsn,"0.8.9.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/webtool-0.8.9.2/ebin"}, + {modules, + [{webtool, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"29344486df5f854ae8fd3bd674c80e99"}]}, + {webtool_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0130c653986734ecbcc9eb173c28c60a"}]}]}]}}, + {application, + {typer, + [{description, + "TYPe annotator for ERlang programs, version 0.9.5"}, + {vsn,"0.9.5"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/typer-0.9.5/ebin"}, + {modules, + [{typer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bfd9dd08af18a1e70eacb4048fb641d9"}]}]}]}}, + {application, + {tv, + [{description,"tv Table Visualizer"}, + {vsn,"2.1.4.10"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/tv-2.1.4.10/ebin"}, + {modules, + [{tv, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be7275d94eee00787500a1a2116f2f42"}]}, + {tv_comm_func, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ac45aad5047bb8c9fd5567c83f513db4"}]}, + {tv_db, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"97de27d10499042aaf10e26289e1e92b"}]}, + {tv_db_search, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"41a489c86d92bc1de3d2b1eba6884c6f"}]}, + {tv_db_sort, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e8f3679aece6310ac4b2d574bb4e7180"}]}, + {tv_ets_rpc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"71f7fcd2da96e0166340d5fecd7b3878"}]}, + {tv_etsread, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"45a731d225555df8f910b7960330f095"}]}, + {tv_info, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1c776d3c4a16bc432fed801d2e3c8d70"}]}, + {tv_io_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6c34cbecb007f6b330646a192aac6163"}]}, + {tv_io_lib_format, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"843ef9fc1762e75675f7a27b7ba99eb4"}]}, + {tv_io_lib_pretty, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e749f6a7879008513c7194c145e0faf2"}]}, + {tv_ip, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2d54724ccb30cfd4eaca323d38ef7861"}]}, + {tv_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"de096a5d9d31dd3443e6bbbd4207ecd8"}]}, + {tv_mnesia_rpc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"947c40384ab9d95074ee626b399d893d"}]}, + {tv_new_table, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c3105970c5d4e109104492bf286bfb4b"}]}, + {tv_nodewin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bfd57496a2e56d57558891338db3e79e"}]}, + {tv_pb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fecb58bfc084d7d6dd979f14ea8c2796"}]}, + {tv_pb_funcs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bcfb711f62ae07c91da02c5b145f3099"}]}, + {tv_pc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"61f6f61fcc34826ca8bc3b450e94f92f"}]}, + {tv_pc_graph_ctrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e8c763ad45fac44f4356a4739baa30b0"}]}, + {tv_pc_menu_handling, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc155c0472d92d089e6d74a1987d2223"}]}, + {tv_pd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"20b8ec33209b59d6775702be748d2da1"}]}, + {tv_pd_display, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"73d810061bb4e923468e82e414f6c962"}]}, + {tv_pd_frames, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8fd381887281403263da14b070a35ca1"}]}, + {tv_pd_scale, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"daff409824df94f43198e08c00c8aadc"}]}, + {tv_pg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"de42de073fbf5bd3ae58bef45ee05858"}]}, + {tv_pg_gridfcns, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"663f41dd11d7fbca1f8eb58529e63e53"}]}, + {tv_poll_dialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ef887432416a9931b8051963d9a97fdc"}]}, + {tv_pw, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c4443616d58cadb7e473ff9ad95c473c"}]}, + {tv_pw_window, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ef96313278caafa5e4cb0c1f5da9d165"}]}, + {tv_rec_edit, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6cbd579d5ccd73e575e67d00fe9983d2"}]}, + {tv_table_owner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"af79fe7c2092cd90cd1cd360def69fec"}]}, + {tv_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d6967a2d5f7e03b34c4e26f47355ba43"}]}]}]}}, + {application, + {tools, + [{description,"DEVTOOLS CXC 138 16"}, + {vsn,"2.6.11"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/tools-2.6.11/ebin"}, + {modules, + [{cover, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e7856ff33e1e956b68c9f6527b5700b5"}]}, + {cover_web, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ead2c2bfdef49be858d1caee2d8878a0"}]}, + {cprof, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0d6cd8fb042b31641c7869b4e148e7c5"}]}, + {eprof, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c8fd5ee11ba9f1cdae8af5c8f1b367a1"}]}, + {fprof, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c549341f79f954416e826f591645f676"}]}, + {instrument, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cf9b95c95942f0ca0ca65db707873a74"}]}, + {lcnt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"04b27f3e814feb4f8d4f95705115ce98"}]}, + {make, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9a69d24258713596763ad87c247cef15"}]}, + {tags, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"450d10b82d488d74ab49eeef1d7277b7"}]}, + {xref, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5f07cbb4541ab47dd30a29a9ad6df8c2"}]}, + {xref_base, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cdb2414576f192e4f5df0f8b0d565598"}]}, + {xref_compiler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c1bba5a52fff82650e201bd08241277e"}]}, + {xref_parser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3ee075a14d4a9caf00fd422a5b8a4941"}]}, + {xref_reader, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d257c5126f9d0cc4e9050fbbae796366"}]}, + {xref_scanner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c7e53f28338fe627ac6fd0821ae6c551"}]}, + {xref_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"66929f66fc0606d320c6e5d216cb3b29"}]}]}]}}, + {application, + {toolbar, + [{description,"Toolbar"}, + {vsn,"1.4.2.3"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/toolbar-1.4.2.3/ebin"}, + {modules, + [{canvasbutton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2432b0ceaf3b3cd6ab059067bb1b904c"}]}, + {toolbar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0264f53a2881d926b34401d0583b07fe"}]}, + {toolbar_graphics, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"327c7483e8b5cd55e8478a2cea9f0c1f"}]}, + {toolbar_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64977a22d445c231a98bc12926186e0d"}]}, + {toolbar_toolconfig, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"037bc3e6d48012cb0c18796d7870c33a"}]}]}]}}, + {application, + {test_server, + [{description,"The OTP Test Server application"}, + {vsn,"3.6.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/test_server-3.6.2/ebin"}, + {modules, + [{erl2html2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"28fc702edc8365854f9f66fc2fe01793"}]}, + {test_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"09cd3b380d55881b18f4020709ad1ef4"}]}, + {test_server_ctrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"14f716cc55a7cb00e3db6f747c72bfa7"}]}, + {test_server_gl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91fa2c7419209a51361800e1a28f3891"}]}, + {test_server_h, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"90c3fbf1bdd3260d8be29c0ab04279bf"}]}, + {test_server_io, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"accd333c058e9b4da064190ef7cf48cc"}]}, + {test_server_node, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"091d5d7aadb062a6e3812afbb130402a"}]}, + {test_server_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9aad63f121b569e197e38735d5f3bf2a"}]}]}]}}, + {application, + {syntax_tools, + [{description,"Syntax tools"}, + {vsn,"1.6.11"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/syntax_tools-1.6.11/ebin"}, + {modules, + [{epp_dodger, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec04cd4dd5985f232fc3116ba222bfd6"}]}, + {erl_comment_scan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0b8dce1126af7468c5b30f73044c44db"}]}, + {erl_prettypr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"020fefd3937417a2029a5278dfe6a6c3"}]}, + {erl_recomment, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f9ef1a5c9ce3c6ce6b88966b1c766452"}]}, + {erl_syntax, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1ee5f2f422313742a2d321fcd901909b"}]}, + {erl_syntax_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f27de1f2cf65260fe863025c358c9c86"}]}, + {erl_tidy, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f92471b03263f0cd77f35fd59686258a"}]}, + {igor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eabc7b07e7b92b8d34fa8eb20a507cff"}]}, + {prettypr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c1e07ce1f5edda823216364302796ac1"}]}]}]}}, + {application, + {ssl, + [{description,"Erlang/OTP SSL application"}, + {vsn,"5.3"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/ssl-5.3/ebin"}, + {modules, + [{dtls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d3942c7ba7ffaf15f739485a0294f256"}]}, + {dtls_connection, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0d3d571363ba45d10d8d772f107cd24f"}]}, + {dtls_handshake, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"92217b2b0b6d3b16913521e333533ca6"}]}, + {dtls_record, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4aa88c3ec82a97c9aef5efb0773c153c"}]}, + {inet_tls_dist, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7c9e1c10262b46fce60dcd0127455cb0"}]}, + {ssl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7c0cf688a767412c4de5ab3be9cb2e55"}]}, + {ssl_alert, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff069c184808a482f096e6cf5aeda43b"}]}, + {ssl_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"08781acbe7e677b43923f943d54e17f5"}]}, + {ssl_certificate, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"292c330ca048353298a264de596e2ee2"}]}, + {ssl_cipher, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c7da7124e32552cf9438259bf544389c"}]}, + {ssl_connection_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b46886f7e29fdc628a965ee9e2314e1f"}]}, + {ssl_dist_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1db0e97b9d77cbb26348e98cf386210b"}]}, + {ssl_manager, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e170a0ac2f663c4396f5a3b00e36239"}]}, + {ssl_pkix_db, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c1b5a81345dcd39060c2fb177b29898"}]}, + {ssl_session, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f9103614974d7d39d0f1ccb0a9e5b6f8"}]}, + {ssl_session_cache, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"09b0d541e61e1ed9dbcb169b1d5b945a"}]}, + {ssl_session_cache_api, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ffafcdc2ff0342c4c698df0dec3cdc96"}]}, + {ssl_socket, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4e9d62b4943dddf16fbe39f781699260"}]}, + {ssl_srp_primes, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8c2df3c9a38a3ceb9cb273a030bd423a"}]}, + {ssl_ssl2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6822bde894695368a294a0e890183b67"}]}, + {ssl_ssl3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c5cd3fbdb5a3f1fdb4c78a2acf9735fa"}]}, + {ssl_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a69f0e3bb4639f90a310b2b938cb9235"}]}, + {ssl_tls1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"14b5f8a146f51df359e9c1265e949564"}]}, + {ssl_tls_dist_proxy, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1bbb1df174c32c1f424cfa64547d075f"}]}, + {tls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7ff734327614ac4d6e4d9acf49998c2d"}]}, + {tls_connection, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ad4d62a6b8101cc5b928498752714ed7"}]}, + {tls_handshake, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c2c5513a959ecbe56166df52dff06e6e"}]}, + {tls_record, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"94501e4bda011f01fba860eebdff5a44"}]}]}]}}, + {application, + {ssh, + [{description,"SSH-2 for Erlang/OTP"}, + {vsn,"2.1.7"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/ssh-2.1.7/ebin"}, + {modules, + [{ssh, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8b91a0a4f8271ff77d0efceb75ba5e8f"}]}, + {ssh_acceptor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7c39ef119dbfcec7618d1cf223d445d6"}]}, + {ssh_acceptor_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d79d965ce6a8121cfbcc1a57029fa06c"}]}, + {ssh_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"11089687f3d5ff2e2ff4527efdb86920"}]}, + {ssh_auth, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0ff2e66febd08d64ffbebed7e7880ca3"}]}, + {ssh_bits, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5ab1a9f964ccce1e001d7484b37c561c"}]}, + {ssh_channel, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e4259284ff9d7671940cfde40b8615fe"}]}, + {ssh_channel_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2594f48f478040f5e861f92c63f78eb3"}]}, + {ssh_cli, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6eb0733483419dc0a920452bb42b7344"}]}, + {ssh_client_key_api, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1a1ce3edce20525a435533b3f37fcfc"}]}, + {ssh_connection, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b551f86d866df22232a147fca4ac7c04"}]}, + {ssh_connection_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9bec5a32b6f6199b3f52e1fbfbbceba3"}]}, + {ssh_connection_manager, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"399ad1481f99b9d43c874c162742c91c"}]}, + {ssh_connection_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cd1150bc1fe3673d2446811f54dc23de"}]}, + {ssh_daemon_channel, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17ceee1d84a542cf54dd487808e00a1e"}]}, + {ssh_file, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d014774c5b5dbd368fad2bc809515e48"}]}, + {ssh_io, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c1045e82cd74643c823a1bda96d24b47"}]}, + {ssh_math, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9a4b44ed70c1938a7277f37d56f9de8f"}]}, + {ssh_no_io, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c9bf450746c1bcc1fd90c463299fdaf5"}]}, + {ssh_server_key_api, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"debb7d5dcdf2eb88d30ed95a56652366"}]}, + {ssh_sftp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"74ed0ad4eaf38e4233ea40f4b4769b7d"}]}, + {ssh_sftpd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"472a422310ca8f6f289334ef64550afd"}]}, + {ssh_sftpd_file, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5269b3e25dd16faeb466f76ba993ba50"}]}, + {ssh_sftpd_file_api, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"627f97d4fb4abd5bee4b509d9225edaa"}]}, + {ssh_shell, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c7831c144031be28ec9dc12b4da3b94"}]}, + {ssh_subsystem_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"755716a08c990d1f606e90420006a77e"}]}, + {ssh_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"408837d884dc9e1f0a969ef64558d733"}]}, + {ssh_system_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f384bcadd7cdca24ec6e40cbe04d71a0"}]}, + {ssh_transport, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0b1c9ed65701948f63ddb181cfaf2744"}]}, + {ssh_userreg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a4f27505cb543991360e10ddb88870cc"}]}, + {ssh_xfer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0220668d75e0c89e7823990a0c968eaf"}]}, + {sshc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"483104e1f9410dfc4e1e29c61d8827ee"}]}, + {sshd_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aba8a2861b6f773e9016ff2859e8de24"}]}]}]}}, + {application, + {snmp, + [{description,"SNMP CXC 138 13"}, + {vsn,"4.24"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/snmp-4.24/ebin"}, + {modules, + [{snmp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9ab098c46c4c009b5ab8a4a37673cf82"}]}, + {snmp_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a2ab3974db30a5b20ba308e1ef0c1d3"}]}, + {snmp_app_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b81a8361da32fd1da51e85f36b678347"}]}, + {snmp_community_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"14e553d78094cb09e2e2a1a3476fa9de"}]}, + {snmp_conf, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5e5c6bc754f1fdf1dfaf7f9815163cc5"}]}, + {snmp_config, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d9ec2fef69fed3fddbb122a5fd31853b"}]}, + {snmp_framework_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0886188c6a8c18a6ff8a3b08172a0773"}]}, + {snmp_generic, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b23bcb8a031ccd450999f71b41f1f0dc"}]}, + {snmp_generic_mnesia, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"74806ef6c5e3a1af2cb14a4121f4442a"}]}, + {snmp_index, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8a0358730d6b279e4056b9e78fdabbe2"}]}, + {snmp_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f93d36dbfdfef30de3f4807efcec170e"}]}, + {snmp_mini_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4bb79af4e373cdc2ec4e6f5fe71d0e01"}]}, + {snmp_misc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ccd6ba3cc7e504e0c163f8c0f7ff575"}]}, + {snmp_note_store, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a3b5f37d8fc6663a63d177cb72a1c498"}]}, + {snmp_notification_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c283ef6cba1ffb08a38c4228f119c1f2"}]}, + {snmp_pdus, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"48138570bb1ff76dabe8f1fa5a6e662c"}]}, + {snmp_shadow_table, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ba004cbc14fe13ad6b29515d6b3b84af"}]}, + {snmp_standard_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"75c1099b71f4cde7703c1b651168196a"}]}, + {snmp_target_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"52cfb682cf25e4c6ad7c6a31ea71bc41"}]}, + {snmp_user_based_sm_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b3b454fe409f6cd24463bfca9369adf5"}]}, + {snmp_usm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"667650cc1c2f535f771132907bf12342"}]}, + {snmp_verbosity, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c8e3d33775ee83cca4d47f64df1dd5ca"}]}, + {snmp_view_based_acm_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1dcc969b6786ab84f450e9f0875eab3e"}]}, + {snmpa, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2057219be785ea520f5a3f1886d51360"}]}, + {snmpa_acm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f21fee89e88dccc36afbae59e8ccd85f"}]}, + {snmpa_agent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a1fcbbb2b5328095d05622eb5da5b1fa"}]}, + {snmpa_agent_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"668a5398f181b8abce6b0c68716e175e"}]}, + {snmpa_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"16cc3053b5568e50b5fa384baca6a40f"}]}, + {snmpa_authentication_service, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc05c3f08dbdec4878aae7816eb5033e"}]}, + {snmpa_conf, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"826ab227f8829b50aabc3072cf2a8537"}]}, + {snmpa_discovery_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"50040fb1565d5888507dcffe6109cc16"}]}, + {snmpa_discovery_handler_default, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62413e2497c617d1dabf1ab269610eb3"}]}, + {snmpa_error, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fb436bf4d7bf0615c02c649c0e04541e"}]}, + {snmpa_error_io, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"98147b5cfad093916c0756b37f763e86"}]}, + {snmpa_error_logger, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b0431d9de22543e6608515bc4afc07c2"}]}, + {snmpa_error_report, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"214d6585224898ce39f6eef6554593c4"}]}, + {snmpa_local_db, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eb82eaa9a8486d087a27e834b58a2f6c"}]}, + {snmpa_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e68b813ac1df34912af16ef01738f185"}]}, + {snmpa_mib_data, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed334445e6e025059b2c9b618109cb9c"}]}, + {snmpa_mib_data_tttn, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2f39357a667d3cb530b431fed0dfa674"}]}, + {snmpa_mib_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79d8aff9ea8d71bce6eac0a6f01f53b8"}]}, + {snmpa_mib_storage, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"22e11676e0303ea2f292534da8ae66f5"}]}, + {snmpa_mib_storage_dets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f8c4649828d764370112243ccdbd2da3"}]}, + {snmpa_mib_storage_ets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4410e4e89e46b6e2b818d3b002a98579"}]}, + {snmpa_mib_storage_mnesia, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e3d387a72c28b5bf76d7a55ac39071a"}]}, + {snmpa_misc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6c4244cad7870e2ec012bdd05281b182"}]}, + {snmpa_mpd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8475e9d61092213166efe3667bcf0c06"}]}, + {snmpa_net_if, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"258227a8467ed99df2f9e55cc7b5e9ad"}]}, + {snmpa_net_if_filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f57faf094fd82ceadc8527983194b2cd"}]}, + {snmpa_network_interface, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"247221ee7ec97ee189ef5a8b5eb2d18a"}]}, + {snmpa_network_interface_filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec6d7d452145362e9dcc0a8be42b3280"}]}, + {snmpa_notification_delivery_info_receiver, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"de84fce31ef758fbb04722b66e1b22d3"}]}, + {snmpa_notification_filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e0b2e493bbbe13f1f17f3fd0be7ce1f7"}]}, + {snmpa_set, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7152d8c4f238062a801fb9b46115b1ee"}]}, + {snmpa_set_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c1739e0cf36ad6a9249a8a200409813b"}]}, + {snmpa_set_mechanism, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c3bef6423ec85b3b9a144f17c3e3f6c2"}]}, + {snmpa_supervisor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"19aa2eef0602df46711bdc98c67d105c"}]}, + {snmpa_svbl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e4079d7e9812ac1c42274316b0f883c0"}]}, + {snmpa_symbolic_store, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e0fe1dda713ed3048f51155e47932e06"}]}, + {snmpa_target_cache, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02394ee2b706d7c26f027c960c659f39"}]}, + {snmpa_trap, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6ffd78574b7c33a0a96bee64d310531e"}]}, + {snmpa_usm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b121f7bf87a2d44a14aa42988c2072f3"}]}, + {snmpa_vacm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d7c7855fb65468a2355c889aa26badb6"}]}, + {snmpc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a474261cc18e1f80f0f742774e3b1417"}]}, + {snmpc_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ce88a5b16fdc8fa367c8559a81eabcb8"}]}, + {snmpc_mib_gram, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c8b4a0280a0bd9b0e89fd47361381583"}]}, + {snmpc_mib_to_hrl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"88a2a7964f0b3501263eaf513a72e876"}]}, + {snmpc_misc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"feadc3549879e928bcc4941ff25c1756"}]}, + {snmpc_tok, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"37784c9fb162c53b0fae3cd77566bdb2"}]}, + {snmpm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cfcde2ccea1b2dbfe7d6f3bead4df7d4"}]}, + {snmpm_conf, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2d6eef427d28f7a96b5be06a0509ed8d"}]}, + {snmpm_config, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5a026c01e17b82bd2fdcb31fb69ae51a"}]}, + {snmpm_misc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02dd27ee95e3bbe3aab099b11120b826"}]}, + {snmpm_mpd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1b593b66256ce780231c57b31298fd29"}]}, + {snmpm_net_if, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"68d325a69b69e7de7106965a049522d2"}]}, + {snmpm_net_if_filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a83bf186eec6c82fd6c9b164fc337edb"}]}, + {snmpm_net_if_mt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e44169e0549ab840243a2e4e0fa3d5fa"}]}, + {snmpm_network_interface, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"47b0e15cd1537e1a3a1b41b8be44998e"}]}, + {snmpm_network_interface_filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"93b503aeb95e30d2fcf28c2b7d2e017e"}]}, + {snmpm_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fdf5855cd385c8d4589d43f2aaddee8c"}]}, + {snmpm_server_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1fc16c37e8db23a8b3e40d3696488a0d"}]}, + {snmpm_supervisor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"289642b05307317c1684b5ba76cb81c5"}]}, + {snmpm_user, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9c6e66b34460082bbcb99ccaf1cedbf3"}]}, + {snmpm_user_default, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c8c7e1b66076bcbde4678471ee9066f0"}]}, + {snmpm_user_old, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ae32fe52a746f3be59c94bac2b679fcb"}]}, + {snmpm_usm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"59bb20fedd0aca2f57ce3b5dad4e50aa"}]}]}]}}, + {application, + {sasl, + [{description,"SASL CXC 138 11"}, + {vsn,"2.3.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/sasl-2.3.2/ebin"}, + {modules, + [{alarm_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"250185bf9caa8aafeefc21d2dc85671d"}]}, + {erlsrv, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"656c183c67d6d7556d846752ac2e0168"}]}, + {format_lib_supp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be7d1b5e03f626bc3a081680842f3c69"}]}, + {misc_supp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"57e2232dbb711535686b684350c6412a"}]}, + {overload, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ce834faf427a10bffb528420385e75fc"}]}, + {rb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c791582aa44b9701a38bea7b12a737c9"}]}, + {rb_format_supp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f6df90c6b446bfd31471022bae098995"}]}, + {release_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bc289c9b3ed6443f9e88a7a40b1bbd78"}]}, + {release_handler_1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0b7cbb150cbc1ad629936632bcf8700a"}]}, + {sasl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8a39ff904fad2fb7b62b8745b34e29b9"}]}, + {sasl_report, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"651a20fbd6df5b1c785152aecf691f13"}]}, + {sasl_report_file_h, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d21420c495fb60e6be13677a923ff7b"}]}, + {sasl_report_tty_h, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"165b304307e62adee19805a95d9b6ccb"}]}, + {si, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ecfe8c3c35aba098dd3530398086bcc1"}]}, + {si_sasl_supp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"77c86cc1c9667be73a48dbcb3c480d36"}]}, + {systools, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5514e0264308050ac1cc5cecaf74c950"}]}, + {systools_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1aa9e6a22dccb94499d5609ce1cf66b"}]}, + {systools_make, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d2c4d3e4b7b322b6629575a64e553f90"}]}, + {systools_rc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4337b68dc98fbbed9e93f2bde9ef4d0d"}]}, + {systools_relup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dd4bb2c6c8422b979b5a75e6f545baab"}]}]}]}}, + {application, + {runtime_tools, + [{description,"RUNTIME_TOOLS"}, + {vsn,"1.8.11"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/runtime_tools-1.8.11/ebin"}, + {modules, + [{appmon_info, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62c6dd94499d20f1776df7cd3267c100"}]}, + {dbg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5a7b449f37506a70985c5b3f69ec579c"}]}, + {dyntrace, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"746609b1554ac41985637b5bba780905"}]}, + {erts_alloc_config, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1a489439d8dded5734eab5eb575ce454"}]}, + {observer_backend, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d9af82e565eecf62c161023fce415c58"}]}, + {percept_profile, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"32909b64d30ade082680e9491a3ddbc8"}]}, + {runtime_tools, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c569a23a42bf744f56abbf4215ca2a9d"}]}, + {runtime_tools_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f52650d88ee6f6754ed9d109accb7eac"}]}, + {system_information, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9ed879d33f6159b48fb25bc472369285"}]}, + {ttb_autostart, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6838c97b9564b06d26e5f599adcee4a6"}]}]}]}}, + {application, + {reltool, + [{description,"Reltool the release management tool"}, + {vsn,"0.6.4"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/reltool-0.6.4/ebin"}, + {modules, + [{reltool, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b15d15af1453d274df701f6c4b39da09"}]}, + {reltool_app_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e15041fae657a7abcce63e7e775af842"}]}, + {reltool_fgraph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c07b7a13c2ae36b59f5d1f0daf8a567"}]}, + {reltool_fgraph_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"230041769919290efa2a3419cf70c8cb"}]}, + {reltool_mod_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"752d8f1d674a79955de7afd3ba6b561b"}]}, + {reltool_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"135d9bb6ea57344472c185d61c97573c"}]}, + {reltool_sys_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f02ff065d17fa8203d711b9cc698ebf4"}]}, + {reltool_target, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"036440a327b1c9cbe5e404ffaf02b9a4"}]}, + {reltool_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c623f90e0c5da5db65d4ca56d9088d7a"}]}]}]}}, + {application, + {public_key, + [{description,"Public key infrastructure"}, + {vsn,"0.19"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/public_key-0.19/ebin"}, + {modules, + [{'OTP-PUB-KEY', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d6f796b3667abf21828ee3daf8df487c"}]}, + {'PKCS-FRAME', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4419b1988012d2d620ac3cc7dec13d65"}]}, + {pubkey_cert, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7a4ac659e84ddfb1dc14f0608460fbfb"}]}, + {pubkey_cert_records, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d5b1f48543bb6b0e62b343c2b965615f"}]}, + {pubkey_crl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"680633b53ae9815138f804c999e78bbd"}]}, + {pubkey_pbe, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"517156230695474828dc4d30af59f656"}]}, + {pubkey_pem, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eef5632fcf01194dd6c98f116de8f923"}]}, + {pubkey_ssh, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5acc6568d3caea9be2d2b93904f6bda9"}]}, + {public_key, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7b054e72c6e34943c0143ac34edcc37e"}]}]}]}}, + {application, + {pman, + [{description,"pman The Process Manager"}, + {vsn,"2.7.1.4"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/pman-2.7.1.4/ebin"}, + {modules, + [{pman, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d0ea0aa857d089d112f46bed16fb83c"}]}, + {pman_buf, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"efdccd7cb884a2a9c50cc70719d53575"}]}, + {pman_buf_buffer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bfdd78d8905bd1bb7e07ee22414a0eae"}]}, + {pman_buf_converter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"afd7e3173377b46ec7374c0e1118a158"}]}, + {pman_buf_printer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7c592081860a9b92b08b557c46b11307"}]}, + {pman_buf_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"77e551e0bc43c59bf5a76f0e32daf822"}]}, + {pman_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b4371d24cd7312794afb137de259b8e0"}]}, + {pman_module_info, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0336677781cb813897e9306415f85b38"}]}, + {pman_options, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"016b8cac7c507593a118b25ab3d642d2"}]}, + {pman_process, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"faab007fad0f14fc692df152d60a8abd"}]}, + {pman_relay, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b12bbe3e253211fac5006414f6f6162b"}]}, + {pman_relay_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3b7eb65c7c1507892ed8f01a1b5e027d"}]}, + {pman_shell, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3b9e7634fb49f1e84a57ed8cee5e3909"}]}, + {pman_tool, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"58ab631eed4b29ddebd390b4cd30c82f"}]}, + {pman_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"697f4a56a374bcacf06e8329356f7b9d"}]}]}]}}, + {application, + {percept, + [{description,"PERCEPT Erlang Concurrency Profiling Tool"}, + {vsn,"0.8.8.1"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/percept-0.8.8.1/ebin"}, + {modules, + [{egd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"810926c65926827a80dc5de6e9cace80"}]}, + {egd_font, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3f41911d6aa5ada509332aca159c905e"}]}, + {egd_png, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"201db7435f6981d1d5b738c5431d4a39"}]}, + {egd_primitives, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cba1711d459930f92725953bca582106"}]}, + {egd_render, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b86b9269dfad8feb8753abfa8e9be68e"}]}, + {percept, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"af81f6c6164ac09eafdfbe02a985976b"}]}, + {percept_analyzer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"efe67a4369a96144def43df906f2ac94"}]}, + {percept_db, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9bff80fb7515c9c23977cceb2fba5e0f"}]}, + {percept_graph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1444b51fa93b12bb98f6bf5246e079f9"}]}, + {percept_html, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b84fd915479ddaa158366217f7fb2ff7"}]}, + {percept_image, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec8d1dae1d54b90ccd7cce76d83573b6"}]}]}]}}, + {application, + {parsetools, + [{description,"XLATETOOLS CXC 138 xx"}, + {vsn,"2.0.9"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/parsetools-2.0.9/ebin"}, + {modules, + [{leex, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c82fd5f503469e40008fb18b393b5421"}]}, + {yecc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e644a07828dcb46e440058ec4e3ea83b"}]}, + {yeccparser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"43c2c84fbd4caf3c3eacfe0e25874f3a"}]}, + {yeccscan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cc55537c97f45738825ae56628fd4c71"}]}]}]}}, + {application, + {otp_mibs, + [{description, + "SNMP managment information base for Erlang/OTP nodes."}, + {vsn,"1.0.8"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/otp_mibs-1.0.8/ebin"}, + {modules, + [{otp_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b92358a169666b58abe47dc98b1ea1f8"}]}]}]}}, + {application, + {os_mon, + [{description,"CPO CXC 138 46"}, + {vsn,"2.2.12"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/os_mon-2.2.12/ebin"}, + {modules, + [{cpu_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"071d377ab6c706f3c4404dfddf95316c"}]}, + {disksup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"53255f9176fdf57c6d2c62a1e3ca8ce2"}]}, + {memsup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d5aa81b4c0017f97827b13d588e907cc"}]}, + {nteventlog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d593ff9832f59a682cb9a7217eb1dc55"}]}, + {os_mon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f8fcf26c77f01a1542d007513e49c214"}]}, + {os_mon_mib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"15ff2fbfd1c88ff31ff9c8e85bf10cb9"}]}, + {os_mon_sysinfo, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2bed5dda663ec63a320198f44c90f388"}]}, + {os_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"52837f657faabaab44288ba2d29ba473"}]}]}]}}, + {application, + {orber, + [{description,"The Erlang ORB application"}, + {vsn,"3.6.26.1"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/orber-3.6.26.1/ebin"}, + {modules, + [{'CosNaming_Binding', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f894f1ca2a53e8c68579c9e786884b64"}]}, + {'CosNaming_BindingIterator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"938a503dbdbe3f091ce900dbe1efeeaa"}]}, + {'CosNaming_BindingIterator_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"07513574b340d64ec6d50ebf98a772c7"}]}, + {'CosNaming_BindingList', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"37aaba8fc8623355426055d3b9c2e2b8"}]}, + {'CosNaming_Name', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7053bbff4a4dd27357c7ae2b7a1bd158"}]}, + {'CosNaming_NameComponent', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4ef942efe3f30c93b89cbb79f0b0e372"}]}, + {'CosNaming_NamingContext', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9e73232824e400a4b6f9a295922420a5"}]}, + {'CosNaming_NamingContextExt', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fb072ace0d3d1445fa884fbb59d19ff6"}]}, + {'CosNaming_NamingContextExt_InvalidAddress', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ba29a989c4d5c961c62bec9162bedd71"}]}, + {'CosNaming_NamingContextExt_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ece2da1a74559421fd8c5a0fcce5a984"}]}, + {'CosNaming_NamingContext_AlreadyBound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ba2061d5ba1cd24262351fa0b92b8850"}]}, + {'CosNaming_NamingContext_CannotProceed', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"175c9f998a255ce625568ff7d7258988"}]}, + {'CosNaming_NamingContext_InvalidName', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4b5bb3702b8105f78101d3deeb4c3717"}]}, + {'CosNaming_NamingContext_NotEmpty', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0dbdfc178f40394391977946fdbf331d"}]}, + {'CosNaming_NamingContext_NotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f2f4d6cf9150fcc92bd9568ff89d2774"}]}, + {'OrberApp_IFR', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"67d245498b4abcae1f6acd51c4edc47e"}]}, + {'OrberApp_IFR_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ab7e63e7a7e47bac6d2cc7e703f2915"}]}, + {any, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1339baf3e573eee6bb558d0097bce4c2"}]}, + {cdr_decode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dda23b10f13bec369113cf3ae72b9448"}]}, + {cdr_encode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4d36c6b8ee3a9fddfdc76246030287ba"}]}, + {cdrlib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d97ec0db3640dda02a25e6ecc9d5fa5e"}]}, + {corba, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3794dffcd3c921332af2b343bb9e8e40"}]}, + {corba_boa, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3dfd1417d677ca18f73c4efe65b37bad"}]}, + {corba_object, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"569d7993c599bd7c2f68bf7a2d11fdbd"}]}, + {erlang_binary, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0ec91157e3e220cc5163b552f3a4050d"}]}, + {erlang_pid, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"49b95cc1773eeed11661fc4cb36b7921"}]}, + {erlang_port, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2b0dd3969488714fc2e2dce30b297b14"}]}, + {erlang_ref, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"98b38f4a590a67a1fa34b2c6d60e8992"}]}, + {fixed, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"469aed745e70550ecb4ee6b382a0c919"}]}, + {iop_ior, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1d3eeb1d5401ad27f97b75926cbf8387"}]}, + {lname, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"945467530d2858f1dfb87b970a3862bc"}]}, + {lname_component, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c2cb0fe6e60c6d07d711cd8c3b28c8f7"}]}, + {oe_CORBA, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02e20118e9fd5c3f5d2f398851cbdcf1"}]}, + {oe_OrberIFR, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ebc39f59cbd7848e61193c82ab0ee2b9"}]}, + {oe_cos_naming, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"18745eadd8db295fc1e8e656a5c8d4d6"}]}, + {oe_cos_naming_ext, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"56520dda2639eaadae720ac4974080d5"}]}, + {oe_erlang, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"963486a48402a80366275f8dace2a80f"}]}, + {orber, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0b4c2a1e44684d8f314230f21def86f2"}]}, + {orber_acl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"76577170937f03fa23e69e4df6cfc424"}]}, + {orber_cosnaming_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f856cbb99314e9eb7d0d7bfcdb30994e"}]}, + {orber_diagnostics, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"656103538d0ee20b1433c6b2909b26c0"}]}, + {orber_env, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"75b0fa232da40432e3009ead263f3749"}]}, + {orber_exceptions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ef09c1b3026ef3aaae5e9c6a5dd2918"}]}, + {orber_ifr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0fed5973a29d60ab161580bf07f3b185"}]}, + {orber_ifr_aliasdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"941404668a378948bbef59da18973eea"}]}, + {orber_ifr_arraydef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4a1ebba0a7f7a26d5205972ac2bc6fc6"}]}, + {orber_ifr_attributedef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"141fa0d0127d292e0bfc3f0e654059df"}]}, + {orber_ifr_constantdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"337388d13414ab58cdafcbd70a150741"}]}, + {orber_ifr_contained, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a825abb903208287bc2dfb7323342fe6"}]}, + {orber_ifr_container, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3027632d783e5db3440bead382fbc787"}]}, + {orber_ifr_enumdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f031b9d117143554a1db00a0f7f9d4af"}]}, + {orber_ifr_exceptiondef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6e152b750cbb286b90ec49855c9f8115"}]}, + {orber_ifr_fixeddef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c0f66c8a6999241daec6815a1eaf7112"}]}, + {orber_ifr_idltype, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7f5b0c9c79289e56f5cfe24c5de10c26"}]}, + {orber_ifr_interfacedef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"985cc443e424939f7f067e9d577c0044"}]}, + {orber_ifr_irobject, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"441a6a89092f9059eddaafb3a19fddac"}]}, + {orber_ifr_moduledef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"571791fe8c191478f9d99008066db451"}]}, + {orber_ifr_operationdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"26ff4727920661a5777fdfeb9542447d"}]}, + {orber_ifr_orb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9f82245f4568a7ad57b93005504b22f3"}]}, + {orber_ifr_primitivedef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cad06f8ddc116042d7dd2f54f189dc9e"}]}, + {orber_ifr_repository, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"88fc8f59fe5a883e6a5cc76c9db0a8f0"}]}, + {orber_ifr_sequencedef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"55db89bec3e336bf1a1087b8b24ec0c9"}]}, + {orber_ifr_stringdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7119d2c1827fbfe04397a23e0c9b7bea"}]}, + {orber_ifr_structdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2e0643a9e51eb2fe1bb3268623005b9c"}]}, + {orber_ifr_typecode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"52a2bebb663486dfde545175b24f1db9"}]}, + {orber_ifr_typedef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1440f73d398af50ec1f1854b68a7ba14"}]}, + {orber_ifr_uniondef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1a767805d679f87ec96f566ea535b0ae"}]}, + {orber_ifr_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a7a7127b079023e8507c1963bb70c6a8"}]}, + {orber_ifr_wstringdef, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5d9705c3d0a8e75958cfc92c0e065688"}]}, + {orber_iiop, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"08e63cf45c6b87ef390f1ba44908df62"}]}, + {orber_iiop_inproxy, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7d958ccebf1795810daf42c284df0b0e"}]}, + {orber_iiop_inrequest, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"01cf6a0b86d8575aad71a64d1ead078f"}]}, + {orber_iiop_insup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3f3e97ae477f58ab983bbf78c5691a6b"}]}, + {orber_iiop_net, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cf48384275f94de84a88f985e69db8c5"}]}, + {orber_iiop_net_accept, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"311c1717af0f83c768a7904bd4f35d87"}]}, + {orber_iiop_outproxy, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aadcfde8449aad07dda946c4fe8ae73f"}]}, + {orber_iiop_outsup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4bb6aa4ab42569ea07e6410eec054d96"}]}, + {orber_iiop_pm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3c23eac6eed61ab8f4b0376bada6a96c"}]}, + {orber_iiop_socketsup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"41cb70052711397c5ff4346c78bad0bc"}]}, + {orber_iiop_tracer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3db9add6a744c5d57f2f88593010189c"}]}, + {orber_iiop_tracer_silent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ddc6f4254d9d55920c182bfc82174cd5"}]}, + {orber_iiop_tracer_stealth, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b5c2faed84597fcc65a1f79f126d38ed"}]}, + {orber_initial_references, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"52d7435fcf9d9b18c41cd15112211641"}]}, + {orber_objectkeys, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"77601464765a034f2157e184b66b27bf"}]}, + {orber_pi, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7772668cb95512b5068384cffb15f5ec"}]}, + {orber_request_number, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ce4912e1c1726a3edd4d2709171895ad"}]}, + {orber_socket, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ea78f1c75c253c070f2b3423b896667a"}]}, + {orber_tb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d9b508906d187e6448fd06b88923aea"}]}, + {orber_tc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f43cb767b9c01d13d190a56574aa504c"}]}, + {orber_typedefs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"82369e4a3e862ef248d19c460b2df8ea"}]}, + {orber_web, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"23cc5e9ac5ffe3b7ac2315ae0759243c"}]}, + {orber_web_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c95b45e743c0a1f7a2e88e350075f78c"}]}]}]}}, + {application, + {odbc, + [{description,"Erlang ODBC application"}, + {vsn,"2.10.16"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/odbc-2.10.16/ebin"}, + {modules, + [{odbc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2763e2d38d62e1fbe7c8ed231cce1905"}]}, + {odbc_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"83f4d02ba9fd29ff84576abe0fde901e"}]}, + {odbc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3c39c9a6e602d66a2d12b662bf0a9b20"}]}]}]}}, + {application, + {observer, + [{description,"OBSERVER version 1"}, + {vsn,"1.3.1"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/observer-1.3.1/ebin"}, + {modules, + [{crashdump_viewer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"77bff2805dfd88de4320b9f8c1469fe3"}]}, + {crashdump_viewer_html, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d22f72c96ed77a6e4cabe125db6c8419"}]}, + {etop, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"377b59a76eeb5edb5b8531b5f0267399"}]}, + {etop_gui, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f0421b554807cd47031f0873f649d5e1"}]}, + {etop_tr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d152946c82611d5f39b1ed3c720cb570"}]}, + {etop_txt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a02a670a9ee8ea7c3cea6de5bdcfa356"}]}, + {observer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0e7d30dfe8122c8736eeac0582abb076"}]}, + {observer_app_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e6130cbc700be448c7f64c7f8bcefcc6"}]}, + {observer_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0973e064b3b2ff3b79f2f1eed47a8539"}]}, + {observer_perf_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b5753467f635c1a98ad5e3f2e50f75f4"}]}, + {observer_pro_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1e68919849e91012fd156d3ac6228af"}]}, + {observer_procinfo, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"175c07cc3510655fbdfe95a35012a84a"}]}, + {observer_sys_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7637a94c99800b8b1c47467f7411fce6"}]}, + {observer_trace_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a836a58f29e21107efbf7fa3276c0ff6"}]}, + {observer_traceoptions_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e070e083bc809e6bd67284d46876292e"}]}, + {observer_tv_table, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3dfa1b811025f5313ba91c620bdafa62"}]}, + {observer_tv_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c8661053d6b3b563582c335e6e18bc2"}]}, + {observer_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"72d4b855d618e72367b3b26a9c9fe22e"}]}, + {ttb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"08eec178cb05729190be64adbfc06fd4"}]}, + {ttb_et, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"18006f41b1483c5378d0d803bb73428f"}]}]}]}}, + {application, + {mnesia, + [{description,"MNESIA CXC 138 12"}, + {vsn,"4.9"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/mnesia-4.9/ebin"}, + {modules, + [{mnesia, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7ef269bdcc2f2ebecc93eed4a7d97e43"}]}, + {mnesia_backup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"50581e2e99465b9ab9adb11193ccbcb8"}]}, + {mnesia_bup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"63c4dc59c47dedf48fb8a67b3aee3a5a"}]}, + {mnesia_checkpoint, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"57fca37f2b0e856bb728f0660f6ad017"}]}, + {mnesia_checkpoint_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"211e3b158a5869145c472cc12080a148"}]}, + {mnesia_controller, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a4d98077e647433bbd4dfe9215bf45c0"}]}, + {mnesia_dumper, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"32b0759359dcf8f05af72e914720ceaf"}]}, + {mnesia_event, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bb423661483d17e8aaa683a22600aee7"}]}, + {mnesia_frag, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"279eb6b4f1f713c9960f1697856030e7"}]}, + {mnesia_frag_hash, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7ca1e314bdfa381005e047965e7fe435"}]}, + {mnesia_frag_old_hash, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"70dd3592f65741eefd724448e56427a3"}]}, + {mnesia_index, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79261cc27d922d6eeecac20a90920cd0"}]}, + {mnesia_kernel_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8f6da4fd3cf0ce074bf7b04e44e86470"}]}, + {mnesia_late_loader, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02a44f59cd50a3b6fcb78198781e8e7b"}]}, + {mnesia_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"08abcd0826ef6dce6929ca1741c156d7"}]}, + {mnesia_loader, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b316a61b4f5ce23b5c7e4bcfdaf6367f"}]}, + {mnesia_locker, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"847d79bf891a9bcffda9e12458490e7e"}]}, + {mnesia_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8ae50e4995027fe6229091521e842b1e"}]}, + {mnesia_monitor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"105c199cb846668f52e583faee684690"}]}, + {mnesia_recover, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91044c669bf165c1d9bb72d76da7135c"}]}, + {mnesia_registry, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aa46aa5634381be997d54dbbf8da99d1"}]}, + {mnesia_schema, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"19676af000bf38b666e545b3c6f22937"}]}, + {mnesia_snmp_hook, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f994954a18270025bf505af1a1dd1244"}]}, + {mnesia_snmp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bb3f27cfb0a3fa51e062ca6e86973a3f"}]}, + {mnesia_sp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"86565dac38aae327be11f08e8d2e05e8"}]}, + {mnesia_subscr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a02b0b2458f5900927d72010d097ea94"}]}, + {mnesia_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"309a5b00197c57437131eec4ce49c560"}]}, + {mnesia_text, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3008beca178112720e4dc18ec6325583"}]}, + {mnesia_tm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7be29c00407f6162375a0d855b36c68d"}]}]}]}}, + {application, + {megaco, + [{description,"Megaco/H.248 protocol"}, + {vsn,"3.17.0.1"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/megaco-3.17.0.1/ebin"}, + {modules, + [{megaco, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1621bcd17d72f8165b568b33e80badff"}]}, + {megaco_ber_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"12ccb5c139d29b2066d3317a2f6c166f"}]}, + {megaco_ber_media_gateway_control_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c13becbea3de6bd37af08cd022c5b5a1"}]}, + {megaco_ber_media_gateway_control_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"721176c1221d7ea112757ebe621508fb"}]}, + {megaco_ber_media_gateway_control_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c4546f9416ae2b969c41f114c777b994"}]}, + {megaco_ber_media_gateway_control_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0f352af0a5bfe76b5ca6a6393ef0782a"}]}, + {megaco_ber_media_gateway_control_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2321767a4aeeadca11a92a77da4bb488"}]}, + {megaco_ber_media_gateway_control_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"851782cffe570769b46773bc55073bc5"}]}, + {megaco_binary_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5e378f272d26a606b7d8b99accc472ff"}]}, + {megaco_binary_encoder_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1eaa0f4ac077056d2753b4945acac2af"}]}, + {megaco_binary_name_resolver_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"afc05954d77f1580e3e3119b28b2ee18"}]}, + {megaco_binary_name_resolver_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64eca1a5ca4891ec6cb56e5b3b747cb1"}]}, + {megaco_binary_name_resolver_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7ab8daa26dfc1ecd8593ea03f037e0b1"}]}, + {megaco_binary_name_resolver_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8a28e0729df9ed41a27d38e76d2b1efc"}]}, + {megaco_binary_name_resolver_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6e831098553576721cfa3187f3246577"}]}, + {megaco_binary_name_resolver_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"adc24901b71b89a59191caa575777136"}]}, + {megaco_binary_term_id, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"82f36dc610c932eb0e6ca2e9002d6c5b"}]}, + {megaco_binary_term_id_gen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0b1f0904c943c78f55b67da76203955d"}]}, + {megaco_binary_transformer_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fff3d874f36cfbc32dbbbc5078dcd380"}]}, + {megaco_binary_transformer_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"33cc44d1bf46cd3bfb5aea29887bcd57"}]}, + {megaco_binary_transformer_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ef3fe41f1f88c54aa4fb1caac2724337"}]}, + {megaco_binary_transformer_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f916e19a7725a6887c4f88395c9af607"}]}, + {megaco_binary_transformer_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d4c8f6b31357bc55c13c7b7881a9a775"}]}, + {megaco_binary_transformer_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ab88024bec5e1fd3c03923d1d0e5119a"}]}, + {megaco_compact_text_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bf7e1fe374598225fd46f38b81e07d9f"}]}, + {megaco_compact_text_encoder_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"23e6620407ec5197028fa798bf01e51a"}]}, + {megaco_compact_text_encoder_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a475f5b036fb0aa3dd35f86ff1d3c3fd"}]}, + {megaco_compact_text_encoder_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2cbd43381f15e24a25a85797028851d5"}]}, + {megaco_compact_text_encoder_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b193fe2860d7e926e73b71c501412b07"}]}, + {megaco_compact_text_encoder_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"777b3a6ecc8b41b8bbab1ad70c7bf6ae"}]}, + {megaco_compact_text_encoder_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e481d7fc5b319d95e6b6d7301837211c"}]}, + {megaco_config, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"895d349eeee863ee722653edb146eec3"}]}, + {megaco_config_misc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"275e3e57bae4ae030b1e8f2be4a4ece2"}]}, + {megaco_digit_map, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e82b7b9950adc2a9b92418b741056198"}]}, + {megaco_edist_compress, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"de4bb8d979b71e2a77bc6480c755f0e0"}]}, + {megaco_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"323b5d062600331842c9a23dd847ce29"}]}, + {megaco_erl_dist_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6523fa00adc2e065d8418983cb9caa83"}]}, + {megaco_erl_dist_encoder_mc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"41066ab829e0f8ebc457c8e087e029db"}]}, + {megaco_filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"778b451ec26564a06b01bb6449e62004"}]}, + {megaco_flex_scanner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"76674c634aab23d50f8746016a4a0be5"}]}, + {megaco_flex_scanner_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"eeafd9d64269893a5e719f9791e846ec"}]}, + {megaco_messenger, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7fc902eabe8adb5b0fe33e79b000ddbd"}]}, + {megaco_messenger_misc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3bee9043dce0a684cdd1cd8134a370a4"}]}, + {megaco_misc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"441b7ad486bf4eef899e02f97ba14768"}]}, + {megaco_monitor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6da74b6f55cbbbacdea077af0a845ef1"}]}, + {megaco_per_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"58c49d0f60e2132cef575414c82a917b"}]}, + {megaco_per_media_gateway_control_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b84247f3fbcda78fd09755f5368ade94"}]}, + {megaco_per_media_gateway_control_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a981605bd179636baebaef5ff6ebc806"}]}, + {megaco_per_media_gateway_control_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f30445cfec10f8cbd55fe17c6724b53c"}]}, + {megaco_per_media_gateway_control_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0fe217237913122558c928dd10ef79f5"}]}, + {megaco_per_media_gateway_control_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d1a9dfc04639677dfb27b24b2829f7ad"}]}, + {megaco_per_media_gateway_control_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e967677da6dc54388db01f5c1545c77e"}]}, + {megaco_pretty_text_encoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b9dce15ad90abfcf6a7cc93391dbdc64"}]}, + {megaco_pretty_text_encoder_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1b00d8cfa3efaae8d225da7007dada64"}]}, + {megaco_pretty_text_encoder_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aa844b22554dca495b913fc57cfa3013"}]}, + {megaco_pretty_text_encoder_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91b54a6e884a8afa32ffaa8352893baa"}]}, + {megaco_pretty_text_encoder_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c6db8e013212168a6df39fca101e3aa"}]}, + {megaco_pretty_text_encoder_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"079587bd6b00f80224aaeec199380224"}]}, + {megaco_pretty_text_encoder_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d3a6f2cc1885299f91fb769fd4a1cb01"}]}, + {megaco_sdp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7e2d41d949f9ab2404116f809237301a"}]}, + {megaco_stats, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"03152bbddea7c1e557224711c4b97892"}]}, + {megaco_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cb7802016626e692d5a8519f536cf3d2"}]}, + {megaco_tcp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"15cec9b1865d957412d0945e11bd5630"}]}, + {megaco_tcp_accept, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4999b86506c5da0b256de8fdf1423c20"}]}, + {megaco_tcp_accept_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91e916f8b5d3aec78b129abb2064f229"}]}, + {megaco_tcp_connection, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"53c5b634698b54c66de0676289c52222"}]}, + {megaco_tcp_connection_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"48ff5ffa59eb95858702320eed91bf59"}]}, + {megaco_tcp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"597fe1780a9081757e42b57e5ebef1b2"}]}, + {megaco_text_mini_decoder, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4675bc758b6dfade5a21f345c13fd523"}]}, + {megaco_text_mini_parser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dbc886fe01447c012941de8bbcb8b1e7"}]}, + {megaco_text_parser_prev3a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc946659afb87b8bcd032cd513206016"}]}, + {megaco_text_parser_prev3b, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d0158fa2aa0880bfcfcea1249e90a259"}]}, + {megaco_text_parser_prev3c, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9acb9c582674145c94ada5f3bc58567f"}]}, + {megaco_text_parser_v1, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cfc2972ed82568f1212b10aa5f54a5bf"}]}, + {megaco_text_parser_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"38f90460cdfcaf135be0f96917b2f7fa"}]}, + {megaco_text_parser_v3, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4e9afc2c639e48188d332c8bccf39588"}]}, + {megaco_text_scanner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d050061e3c87e8f1964b063624202b3"}]}, + {megaco_timer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1252b5457aeb62266567e5905d4fa76f"}]}, + {megaco_trans_sender, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3be0e627b81fb19dc7a3e27885f0958d"}]}, + {megaco_trans_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c89becbc7e0e3b62c0ee8fac09f5adef"}]}, + {megaco_transport, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8ad32251f0bd50e9289ae09286daf84e"}]}, + {megaco_udp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4274133166af4f35b78505125ca3280a"}]}, + {megaco_udp_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"84b71d1f62b9e3958dc6bc55ea87dd5d"}]}, + {megaco_udp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e05c1a2e530417dee164ad41e4fa8888"}]}, + {megaco_user_default, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"604d252f88e8e7de2e8b2941d6f2fc2f"}]}]}]}}, + {code, + [{path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/jinterface-1.5.8"}, + {modules,[]}]}, + {application, + {inets, + [{description,"INETS CXC 138 49"}, + {vsn,"5.9.5"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/inets-5.9.5/ebin"}, + {modules, + [{ftp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f75e6a1763c0f8ad63c48fee7762bd08"}]}, + {ftp_progress, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a9f1247decddc2091349cc0c561740ba"}]}, + {ftp_response, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8184ca2df27024d938c1745b9b46b21b"}]}, + {ftp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"23491501dc6175d1a49c2bbb888642a9"}]}, + {http_chunk, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2d127d36200e815d589b358178ae3d98"}]}, + {http_request, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c9d27256b8abc0a4752a98c5fab193d9"}]}, + {http_response, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a327d5e08590cae728288f395b5880ea"}]}, + {http_transport, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fefac9e86284528e5883735ff02f9635"}]}, + {http_uri, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d8dafbcdb6a18c64161cda56b762aea"}]}, + {http_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"948c60f737d5c6d13e9e19b518eb5dcc"}]}, + {httpc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"12f827ea3b4a60e6abe352016df83794"}]}, + {httpc_cookie, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"55dbb04357dcd95196eb831ae6c88924"}]}, + {httpc_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"13538972414b85062867ba8f72b63a6a"}]}, + {httpc_handler_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d291f5169c3ee61ab92b272e5612628"}]}, + {httpc_manager, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fbc2349ce89229b7aab1397e920c4a23"}]}, + {httpc_profile_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"71f19372131a26ce3fec7fe59cae62a6"}]}, + {httpc_request, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0f9b151b009d24a06987f46db7a7ab32"}]}, + {httpc_response, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"df4086639fe81d9d6b0b0f1c27d783c8"}]}, + {httpc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cac51bc379bec99f8e2fe737e6701177"}]}, + {httpd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"965f24797bd0ecb2662f8cccbf5a114f"}]}, + {httpd_acceptor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"60c4ec255f9d3e71ca247d690fc050e3"}]}, + {httpd_acceptor_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"146196f8aa54e2872ea09789bf43167e"}]}, + {httpd_cgi, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"493bef6896bc09b2a84424756e6aa2d6"}]}, + {httpd_conf, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"122f251eb11290e92a55da1a97647ff7"}]}, + {httpd_esi, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f0a20e7f4efd148111074d6c027a749d"}]}, + {httpd_example, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4e8699c78100cc50e49ac578b154e491"}]}, + {httpd_file, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"30702eec4e62275db10ea6e81cd67866"}]}, + {httpd_instance_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5d7ab2c856e6d5438dd3144b284ee396"}]}, + {httpd_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"12fc1dfa3734ae50f2b5912d1245d63d"}]}, + {httpd_manager, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ae9176839ab029c3685eaa1e9b2b90d9"}]}, + {httpd_misc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4c61eb0828079a16033e6b33e8095104"}]}, + {httpd_request, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a91f7e3de28a17002b2923df84f4b01e"}]}, + {httpd_request_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2b44228586d6ef9df1fb9bbcdf8e395a"}]}, + {httpd_response, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"73a06662a9f1ea7bb68ea6e0487ff3c0"}]}, + {httpd_script_env, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"348c3920cf5e3c2137127c4a1e1345b4"}]}, + {httpd_socket, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2f021c0b5923e108fd344cee27e360a2"}]}, + {httpd_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7814cf6981a80379606be6a64d684e24"}]}, + {httpd_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4b6d1e4e24096bf68e395c2105f9ddce"}]}, + {inets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5dea85fffabe81e273c12c78d57d3ea7"}]}, + {inets_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0cc5b16bf76fdd61cc3fcc189509b4cb"}]}, + {inets_regexp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d90aa0458fda8b4878dc77b59f3a996"}]}, + {inets_service, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fda2c34b97323c1cc7756e681f50073f"}]}, + {inets_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c8287946a050dad1ffd422678150174"}]}, + {inets_trace, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"38930cb6dedec461e1cb409ee6902dc4"}]}, + {mod_actions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cd04b142450e4b2a6681a67ff53fe983"}]}, + {mod_alias, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"488cd71dcfc552f96603b8ae70cffbc8"}]}, + {mod_auth, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e4c582f449cb199ea9cc8d5a7004a9da"}]}, + {mod_auth_dets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"43a467ba929f04d907a1a6ba11bb1893"}]}, + {mod_auth_mnesia, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a3d3fe40e66d1a310a5814ead817db4f"}]}, + {mod_auth_plain, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1692c15dbed5d5a680dbac4354569ec8"}]}, + {mod_auth_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ee144579a7fd9a4a761307385f6ef449"}]}, + {mod_browser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b4187d14f39e293330958d7ed7f61ce5"}]}, + {mod_cgi, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4e72a465306011f4ac2a88f03cd6c9dc"}]}, + {mod_dir, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec5cbec9126f452057ed437dba2051b2"}]}, + {mod_disk_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"702d6f87d24465d11d91f561fd11f7b6"}]}, + {mod_esi, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e83eabd7527ed663b93fd5a58a587be4"}]}, + {mod_get, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8dd5d81c6a7cc426524180332edb7a14"}]}, + {mod_head, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3a62a5beb75a1b60206669499f77130e"}]}, + {mod_htaccess, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1bf3f03a28de0bf786813fc181fdb85f"}]}, + {mod_include, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"145c3dccff68b053b1db14d5f92488a2"}]}, + {mod_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5417983275ff4ded18c546c70b8cc7e5"}]}, + {mod_range, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"03a0b6a05ae0fd306c5b3f20bb6e05b8"}]}, + {mod_responsecontrol, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0ebe00aaf53af7508dabc9d09b949a0b"}]}, + {mod_security, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"423eb8f57b9a8bde28e3da13db3de59d"}]}, + {mod_security_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cca3960b3899a1a7a4581afc69d7a5cc"}]}, + {mod_trace, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62fba170a84e8fdb39c8744f64b37a64"}]}, + {tftp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ade4b7390488800507debf97307bd963"}]}, + {tftp_binary, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"67a1747702ba0bff57a6f8aaa883b9d2"}]}, + {tftp_engine, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fb9e0ee93bfa57bd7ef5a038c23edecd"}]}, + {tftp_file, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"48fd419a1467c45c1e7057cdbb59a0a7"}]}, + {tftp_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f666dd774c5c60c7ff175b19ade12b2d"}]}, + {tftp_logger, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"151ed197576a35d060b7bbf3c74bdf7f"}]}, + {tftp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7fc8de866dbc9c30b3d91a8adf8ebf0c"}]}]}]}}, + {application, + {ic, + [{description,"The IDL Compiler"}, + {vsn,"4.3.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/ic-4.3.2/ebin"}, + {modules, + [{ic, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fe764abce09fdd454d880128d9ddda2c"}]}, + {ic_array_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"227ce84fee6671f9cdf93fb8048f596c"}]}, + {ic_attribute_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"975e0b45c8a9ce1cb4551fdfb76cbd11"}]}, + {ic_cbe, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"43ac10b9d3c5142c747d99c3b9dad4d7"}]}, + {ic_cclient, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"73ec31c28859c6c5d6e5dc91b6ce5411"}]}, + {ic_code, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02d51ffcaef78b26a0bc8c680938fb53"}]}, + {ic_codegen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"41159947a7c4259a58fec12f96d02d69"}]}, + {ic_constant_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ca029a6c4023f792cdd8fb9052241416"}]}, + {ic_cserver, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bf63d17869ccb762e0edab496be39e09"}]}, + {ic_enum_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ab555fa7842eec8c99e22d11060e6430"}]}, + {ic_erl_template, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"04c3d10872a5ab6edd781ae24512b6aa"}]}, + {ic_erlbe, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"add3f7151efb782e2437bb626a7d51fd"}]}, + {ic_error, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6379a791ac55b3542b5db5a1e329439d"}]}, + {ic_fetch, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bdc5454c6fe20b3a28d3a10ea4a7b3ed"}]}, + {ic_file, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6597963c839cab5b5591eb1dcaa6a9a1"}]}, + {ic_forms, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9bcfeec18c0f2bc54dd64694b0f6d82e"}]}, + {ic_genobj, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"97c379af6629a74a7b70c60e6338a245"}]}, + {ic_java_type, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"40d0d5d7707b0d63119fdc658f7f3084"}]}, + {ic_jbe, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7e2429e630ce4f7dad22af0d4ab242b7"}]}, + {ic_noc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c8e61ad2dbb06818f812f1a3dcf0f16c"}]}, + {ic_options, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f9f64ecd00b68edfcf38b61e79bd0b80"}]}, + {ic_plainbe, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"44ee00595baf6554efbdb45d3ee28937"}]}, + {ic_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"857d2fb9fea30b14657b1c4a86d08386"}]}, + {ic_pragma, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4f69abbe96dd3cbebbff573664fe0997"}]}, + {ic_sequence_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fdf12c1c5c020249ba9966ed529e5062"}]}, + {ic_struct_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4120b045ef93f4db9bea6c9f14180ca6"}]}, + {ic_symtab, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9c8ba1bfdd061a5e6864f86c957d6408"}]}, + {ic_union_java, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b9b140a193c08210aa09a4484d9a54f3"}]}, + {ic_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c6ce2a93793c15e09c8e18ccca534772"}]}, + {icenum, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a53766074b7015a3bae4631d87f017e7"}]}, + {iceval, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d60924eb402c253265ef229824856baa"}]}, + {icparse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f2a14e584b40aa5b9e79c5f3101dfb3e"}]}, + {icpreproc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"14b63dc40d8160ee25e0f829a0d088c6"}]}, + {icscan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8c8e2841047e577935f05c0b5cb10b02"}]}, + {icstruct, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3fc6b7d763b490773a0c893a541b3d3a"}]}, + {ictk, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"00ad73c637ec333d51a0905c46381eb0"}]}, + {ictype, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8cfb0ed8d61bdff82302c4b52716ebf0"}]}, + {icunion, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"db222ee3335d7b431061d104f6ecf9b2"}]}]}]}}, + {application, + {hipe, + [{description,"HiPE Native Code Compiler, version 3.10.2"}, + {vsn,"3.10.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/hipe-3.10.2/ebin"}, + {modules, + [{cerl_cconv, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3f8e5afb7f644e20ecc93eff288091d3"}]}, + {cerl_closurean, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"598014277bdc97eb3e42db827964786c"}]}, + {cerl_hipeify, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c67cb3c827232c389de98edcb669a6f2"}]}, + {cerl_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"81c8c4cc2fddba367e557bb8fa3e46b1"}]}, + {cerl_messagean, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d45d1cf2112a30de90c6e02674b471f5"}]}, + {cerl_pmatch, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"592ae9106c429413eef5bca3404a312a"}]}, + {cerl_prettypr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c10b7a51c482eaae5d5bb5156072faed"}]}, + {cerl_to_icode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"975ca9009d46f139766227e24f00167b"}]}, + {cerl_typean, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2407a7ab5367d3d2112283c1ddfc53a2"}]}, + {erl_bif_types, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"0a6c9083ace0be207cc54681c6cbf565"}]}, + {erl_types, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"42d756bf4eaf470785a1b81838979af7"}]}, + {hipe, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"32e6ef5c8585a438373c41e5a5d75d91"}]}, + {hipe_adj_list, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"e5bc155da44d7631411dfc1a02fec2ef"}]}, + {hipe_amd64_assemble, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1647b309190377cb226db1314fcac5cd"}]}, + {hipe_amd64_defuse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d3829c95a7eed25abc393e29da9bbf19"}]}, + {hipe_amd64_encode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"49079178cae281b4645ae6f25ce18838"}]}, + {hipe_amd64_frame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4476b9c0703b2a8473aa502dc6bdada8"}]}, + {hipe_amd64_liveness, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"9fab826ab4bd5d716173c1f3b3b4d347"}]}, + {hipe_amd64_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"52b41c777e65aeea7e35a9321585d34a"}]}, + {hipe_amd64_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4eb339172dae5c27d67b4410de84f51f"}]}, + {hipe_amd64_ra, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"73bf464fdfd7cf668efdffc3fc78c352"}]}, + {hipe_amd64_ra_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"7bc4f317d89794f58a1a0bda3b599879"}]}, + {hipe_amd64_ra_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"5c0509cfd228b140247a46214243a415"}]}, + {hipe_amd64_ra_naive, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6a50f0f7d1c454c50975d6d0b3eb3c4e"}]}, + {hipe_amd64_ra_postconditions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1ed593df4c9da2fe96da00274117f1b4"}]}, + {hipe_amd64_ra_sse2_postconditions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"277417561a1fed88867bfdafe9e1c580"}]}, + {hipe_amd64_ra_x87_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"8684b37d2d952516b2f8e77426decaf2"}]}, + {hipe_amd64_registers, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"02db134b8e57405134b8e68a9f0588d3"}]}, + {hipe_amd64_specific, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c66c33708abe9f32d36337c358a73530"}]}, + {hipe_amd64_specific_sse2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"f0e4d5df03612b82d8cffecd5f9d4a84"}]}, + {hipe_amd64_specific_x87, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3a28b90d577a9db6ef4b70d9defbd863"}]}, + {hipe_amd64_spill_restore, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"81a80af9658effa33fdfe85f6161a35a"}]}, + {hipe_amd64_x87, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b55ded15ce4283908342b2824226406b"}]}, + {hipe_arm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"160cf412bbc01adfb4229f8b73a45ba5"}]}, + {hipe_arm_assemble, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"62390a02348b3abffcb4502ff1b2b9f3"}]}, + {hipe_arm_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"30d169daa65fe2104260b4621d500e17"}]}, + {hipe_arm_defuse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c464aa34b089a594edfc1cdb7012f39c"}]}, + {hipe_arm_encode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ee3833e47107f465b35e3d9a255d0447"}]}, + {hipe_arm_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"74ce09dca62bfdfdbe0f667075f78c35"}]}, + {hipe_arm_frame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"e46614b822aafd6233af080377bc8729"}]}, + {hipe_arm_liveness_gpr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"19888211ce56a0eb039578ea485a7776"}]}, + {hipe_arm_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b745515f7f9a5b4dc2e3f03f8dba82c3"}]}, + {hipe_arm_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3b5de0ec46bf573c64151697e03dcbeb"}]}, + {hipe_arm_ra, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d129dfc23327601b4615e91f849c214f"}]}, + {hipe_arm_ra_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"cdeccd5062db370b87cb350b317c041a"}]}, + {hipe_arm_ra_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"fd59b7eba19bd0985bfc527377e815ea"}]}, + {hipe_arm_ra_naive, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"cbbdef9b7829ce07fc482451a8f7c7a8"}]}, + {hipe_arm_ra_postconditions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2a3a8e58a6ba75ca3902348a5b43ec79"}]}, + {hipe_arm_registers, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"7bd890ef97657715f12f031658d4c9c4"}]}, + {hipe_arm_specific, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"611f5b731b1c7fa6f589010db3443a81"}]}, + {hipe_bb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"66afe906c353f43505649b33dfed45a9"}]}, + {hipe_beam_to_icode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"826bf8aa6513c06c61e08faa9383b4fc"}]}, + {hipe_coalescing_regalloc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"cf5f22f7e27c8ba6a1e73e29900fb096"}]}, + {hipe_consttab, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4a430042156f62e55b404d38b82ef6c1"}]}, + {hipe_data_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"7843ffb243b1c8d66351c1452fec1cf5"}]}, + {hipe_digraph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3caa6181724dc59e70a3c5ee5b886233"}]}, + {hipe_dominators, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4f7038336d002e637edb3b57cc6b7293"}]}, + {hipe_dot, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"0218e226a92b4a444c90b4c18be48c76"}]}, + {hipe_gen_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"75a06ae623c2dd5a78903d11ba61cfd6"}]}, + {hipe_gensym, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1b5a357fb4e6833e55b574343d116217"}]}, + {hipe_graph_coloring_regalloc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"e25c88384aaa7b7a16c5849b31db4fcf"}]}, + {hipe_icode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"899c47579553070995c5701f16f2c1ca"}]}, + {hipe_icode2rtl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"cba4203ea542c9abfac6eaa92cb269e9"}]}, + {hipe_icode_bincomp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4e211977eb23242d6a2bf0b099eff090"}]}, + {hipe_icode_callgraph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"f79f8f10f1aaaf4280abf06cfa40d56d"}]}, + {hipe_icode_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ca9529e58b378b731ac6aac84218e2da"}]}, + {hipe_icode_coordinator, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3a1caa6d31d48a3fb311a2ea97f0c30c"}]}, + {hipe_icode_ebb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b6b088a13c02a03e5a28247be6d45b94"}]}, + {hipe_icode_exceptions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"40dfad7ac3602fece6bb4b5a8c9ab98b"}]}, + {hipe_icode_fp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"f3fcc6b3d555dfa882e7483eb64a6571"}]}, + {hipe_icode_heap_test, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"fed11d612f8f3da9ea1e4cc67389eff5"}]}, + {hipe_icode_inline_bifs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3027c916d2ecc9762123585e1d91f467"}]}, + {hipe_icode_instruction_counter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"cf488cc5eb29636045d2880b33254711"}]}, + {hipe_icode_liveness, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"bb99ee17bd466d1b802a42b0583e26d7"}]}, + {hipe_icode_mulret, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"323e6103d2511e5bd4a87ad2b4dcf3c3"}]}, + {hipe_icode_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"56edb2552a5c36757005cebd6196f7ce"}]}, + {hipe_icode_primops, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3f14ad0079bdc8cf1feb08c6c2da287a"}]}, + {hipe_icode_range, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"0040719dd6effa173e861e4eb0e3cff6"}]}, + {hipe_icode_split_arith, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"5575b7299b149e93d358fdeccc999652"}]}, + {hipe_icode_ssa, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"090ca01ba76f97f346c6fb260751cad3"}]}, + {hipe_icode_ssa_const_prop, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"5944b123b3fcd4b0839b316ee68ee36d"}]}, + {hipe_icode_ssa_copy_prop, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"997be266f8aa90058e1cc47807628ab4"}]}, + {hipe_icode_ssa_struct_reuse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"8fbe27064d4bb5a27507564d4ace240b"}]}, + {hipe_icode_type, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"cd5755e095fcdc667aa925440a072104"}]}, + {hipe_ig, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"023433ebf566fdd844f091a0d35af764"}]}, + {hipe_ig_moves, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b1d86094e8232686f4e234cca76178c6"}]}, + {hipe_jit, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d52c6fa1354f23d6c3234f2ba0adb467"}]}, + {hipe_ls_regalloc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"af8f6022eafbf853ada08fe69e9509ca"}]}, + {hipe_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c5c32cf830833284942651c29d48e796"}]}, + {hipe_moves, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c4b6be3fb7b1fd8acaa60cf09a34ab92"}]}, + {hipe_node_sets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"8f506e9e71db4336c1ec699b1335dc17"}]}, + {hipe_optimistic_regalloc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"43cd34d83f3c513ee455a446628c39eb"}]}, + {hipe_pack_constants, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"09e240bfc2522acbaa543f356a28f9af"}]}, + {hipe_ppc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b4a1ef1f5d56e249be91954a55b35b5c"}]}, + {hipe_ppc_assemble, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"be62cec21a026c5385d2482369ac59a0"}]}, + {hipe_ppc_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"7d0362cb062e78fb25852d9fcf943371"}]}, + {hipe_ppc_defuse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"45a4ac6be649d5ebd584abd44704addc"}]}, + {hipe_ppc_encode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"fb5b41996c46e440e0292565c786d9a2"}]}, + {hipe_ppc_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1475ac44aff754105fdd4e85687346ab"}]}, + {hipe_ppc_frame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1fd18b642e945b3f6b384549c810f5c6"}]}, + {hipe_ppc_liveness_all, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"5194b99327e725de7a0c94abb4d35974"}]}, + {hipe_ppc_liveness_fpr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b3958a1138f1f112f5ff4b357520fa4d"}]}, + {hipe_ppc_liveness_gpr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"fc4585d446b47d4151671b7bc83f86eb"}]}, + {hipe_ppc_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ec4dd9d536fb6aa5cdb418dded96184b"}]}, + {hipe_ppc_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c37b9de73810ceeaca37bc0520a76884"}]}, + {hipe_ppc_ra, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"db4deb5ea2a237ff1e0984f7979e5d3f"}]}, + {hipe_ppc_ra_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c4376f33857d9cb0cea29ff783ea82cf"}]}, + {hipe_ppc_ra_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6ba2df5f54c48dc90c42547e8bd2ca48"}]}, + {hipe_ppc_ra_naive, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ba3d03b4267f315b10ed939a37d4597c"}]}, + {hipe_ppc_ra_postconditions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"a9d4ca393bff97c1931d0eb18d38a811"}]}, + {hipe_ppc_ra_postconditions_fp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"742e3f111a16eb5ca003f1a97804e5a9"}]}, + {hipe_ppc_registers, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"40dd287c6853767e7083a8c5549681ce"}]}, + {hipe_ppc_specific, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d5e2330aa55edd677ecf3e77bf659781"}]}, + {hipe_ppc_specific_fp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"34a6f358c60c47ebec7956b66205062f"}]}, + {hipe_profile, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"210939fd9ea20991d7fae07b12348d35"}]}, + {hipe_reg_worklists, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ee79fa6eb3bca9a4f0025d9e4ce02a72"}]}, + {hipe_regalloc_loop, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"19fc9f539fd5abb2ecc5aeaf6c2526db"}]}, + {hipe_rtl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2ab93246a0c75f83327de3e0234dbe08"}]}, + {hipe_rtl_arch, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3481cc7240b928da18df9e61214ceb25"}]}, + {hipe_rtl_arith_32, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"328deb7987296b869279c7c0d588f337"}]}, + {hipe_rtl_arith_64, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"64cc932e691e7743d06642103170de55"}]}, + {hipe_rtl_binary, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"198df75c4eefcd2b7a7f769922d4ce60"}]}, + {hipe_rtl_binary_construct, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"7a1b57215669ed36c40b335e6826be2c"}]}, + {hipe_rtl_binary_match, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1c22996f5b79a3818503a19059bdaf8e"}]}, + {hipe_rtl_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"60570bb8a1cbde7c72ad1c37e2b8e17d"}]}, + {hipe_rtl_cleanup_const, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"a555a1c325dd9b3ae1775881af8abfad"}]}, + {hipe_rtl_exceptions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6c7f64efbed1c8e51f2323fa693d3b89"}]}, + {hipe_rtl_lcm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"bd3735cbd4bc9eb9254b0c2ee67cd1ad"}]}, + {hipe_rtl_liveness, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"0dcceb8fd82c12480e42399dd2869c41"}]}, + {hipe_rtl_mk_switch, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"8890cf7e39302f57f3adf8987755b34c"}]}, + {hipe_rtl_primops, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c734e269cbc4be78cb3fe47fa55053a5"}]}, + {hipe_rtl_ssa, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4d9ce36d8dc1168eecf173bde8a0871a"}]}, + {hipe_rtl_ssa_avail_expr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ef5653db422ed4115c734d9676f3b030"}]}, + {hipe_rtl_ssa_const_prop, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"598dee97d9fd44735a534b250bf60e2a"}]}, + {hipe_rtl_ssapre, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"93b3ea7957d2008d763bd4416ef98277"}]}, + {hipe_rtl_symbolic, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4e6b19de45d978326014a378368a6f8e"}]}, + {hipe_rtl_to_amd64, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6afb4d232649b0a0ee54e5a4859e85ce"}]}, + {hipe_rtl_to_arm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"a12eb244baec0e0bcd2d39353ac69b90"}]}, + {hipe_rtl_to_ppc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"521f595296e6c1bf0b7d1caf59bbfb77"}]}, + {hipe_rtl_to_sparc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"66783d3f670bd939159b0abf3548dddc"}]}, + {hipe_rtl_to_x86, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2b4ebecd4e2fa29e952c650809ec89b6"}]}, + {hipe_rtl_varmap, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2b1e6ba5714a0764c0897a780fb38c8e"}]}, + {hipe_sdi, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c305600fbb8905b9b0cf792f2f85ed72"}]}, + {hipe_sparc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6a5cf680abe539d1dfa669cb52ce1f80"}]}, + {hipe_sparc_assemble, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"330f4c7130dc215c911ecfd48d9dedde"}]}, + {hipe_sparc_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d8278464e9d1d65437625517255ae2ab"}]}, + {hipe_sparc_defuse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"a7f131d52962288326e844f28d13d4cc"}]}, + {hipe_sparc_encode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c1b5971e5e6f3304bcc00f1abeb268f7"}]}, + {hipe_sparc_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"22d88316138d80c3ecf41ced21ec25cf"}]}, + {hipe_sparc_frame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"623fdaf78bfaff2b07733eb4a211f79b"}]}, + {hipe_sparc_liveness_all, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2bd5c26371c946fdbf9c1530c1478ca1"}]}, + {hipe_sparc_liveness_fpr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"7dc401039841503524934a1b97990c2a"}]}, + {hipe_sparc_liveness_gpr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4c5e32e6adbbc37b4f793e8bde52ab2f"}]}, + {hipe_sparc_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"3c063c4c5b1bd8ec02c6ffe60c561056"}]}, + {hipe_sparc_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"f89846e24afb3795d259291e4613c155"}]}, + {hipe_sparc_ra, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6925c18182b17ee978041e26fbf490b3"}]}, + {hipe_sparc_ra_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"45cef8c32ae3b2f6f01911592016924b"}]}, + {hipe_sparc_ra_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"2eedc8b13aac2efcd2e3649afd845d02"}]}, + {hipe_sparc_ra_naive, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"81f0a231c4bde04b132bdb6748774c10"}]}, + {hipe_sparc_ra_postconditions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"549d7dfb54dce00bb7f5317306694308"}]}, + {hipe_sparc_ra_postconditions_fp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"9de491abdbbc1c156a20a692d463965b"}]}, + {hipe_sparc_registers, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1a4dd5b6dc938d539fead6b1ad9e2ba0"}]}, + {hipe_sparc_specific, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"809b836428fcb194565eeee86ecf138b"}]}, + {hipe_sparc_specific_fp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4bf2be9b351b82024e81eabfd68806f9"}]}, + {hipe_spillcost, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b9ef65406aa671e28d1bd8428f102fe9"}]}, + {hipe_spillmin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"bde0ad7813cb8f86fc4ff110090af2da"}]}, + {hipe_spillmin_color, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"e277f11303f44d6ea07be695c1057d7f"}]}, + {hipe_spillmin_scan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b007825bb206e086b9ffc943213aa625"}]}, + {hipe_tagscheme, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"568fc377e498aec5a73e1b2c9cd29432"}]}, + {hipe_temp_map, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"56dff1fb8175d1d7c32f7e8d95e10488"}]}, + {hipe_timing, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c3238c3b4adc08c290c37ba1ea7d3a31"}]}, + {hipe_tool, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"f93194221b0e3756c9f0f70127b205bd"}]}, + {hipe_vectors, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c4e6ef55b233f27c27bd2f781baf9c94"}]}, + {hipe_x86, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"051e4ee3dd5298e2cee05b1fca82e64d"}]}, + {hipe_x86_assemble, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"d1829f13a89049280e7cb22cd394af0d"}]}, + {hipe_x86_cfg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"b9d6a090c32c03e6e91deac9bbb167ae"}]}, + {hipe_x86_defuse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"c81bb7a0dd72b256c57fb37042de68ff"}]}, + {hipe_x86_encode, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"386d1abc98765c09c6bc6fe44cf2748d"}]}, + {hipe_x86_frame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"db2a440f5975688c7bf9a88c47aaf627"}]}, + {hipe_x86_liveness, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"8783c19717dda46b566c465ba85b2588"}]}, + {hipe_x86_main, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"236cd462abe386223cefe606b4f48928"}]}, + {hipe_x86_postpass, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"57e5cb6ad12dceef612122c8f759ac15"}]}, + {hipe_x86_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6efd3b5cd8c70edbd326ffe9457a3192"}]}, + {hipe_x86_ra, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"1e8b7f27a05e1e7fac9ea95cdd394909"}]}, + {hipe_x86_ra_finalise, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"4a3c30788866a5e997e0a1687279732e"}]}, + {hipe_x86_ra_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"bb13a4d08391fe3f212fa4eba816029b"}]}, + {hipe_x86_ra_naive, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"e26c0711db5e891c86b64da12fe064ff"}]}, + {hipe_x86_ra_postconditions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"e3d6ad622a3017744106b653324c0edb"}]}, + {hipe_x86_ra_x87_ls, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"a6092f1853a7a04f8d16228f6183dcc0"}]}, + {hipe_x86_registers, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ce77b4ffff06c9532943ad5f6907b18e"}]}, + {hipe_x86_specific, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"ad074b1e645c06c2137a46cd19f88b72"}]}, + {hipe_x86_specific_x87, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"a20c2c2b1742aa084dbb7395a92b650d"}]}, + {hipe_x86_spill_restore, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"88e191ef5057ea6a50c75af85c814013"}]}, + {hipe_x86_x87, + [{loaded,false}, + {native,false}, + {compiler,"4.9.2"}, + {md5,"6edcc888c87ffc96414a8dce57d691da"}]}]}]}}, + {application, + {gs, + [{description,"GS The Graphics System"}, + {vsn,"1.5.15.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/gs-1.5.15.2/ebin"}, + {modules, + [{gs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9d416ae60d6cda2ea55a05dbde8a53f7"}]}, + {gs_frontend, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eb02484f42ac799bdd086f6832b72330"}]}, + {gs_make, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ea7a1edc4bd5b9867ce924130851f295"}]}, + {gs_packer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4c5d911152526836f3487cd3de6b0bf9"}]}, + {gs_widgets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2efa721783d863bca4ff2e116c9593fd"}]}, + {gse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9355057cfe2b70da376f208739bd7c06"}]}, + {gstk, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"684b9d8f370368e25ea2ca2ac708c1ee"}]}, + {gstk_arc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1cd1114560c3839fb84380975d61d68b"}]}, + {gstk_button, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"29ce4f10fe8dc2bb85649018aa64d71a"}]}, + {gstk_canvas, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a637d6932415873666ed040817ed2a72"}]}, + {gstk_checkbutton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3cad265e62fb4cbeda02c089b5b309bb"}]}, + {gstk_db, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dd236aeb7ff4658fd1a9d1302602a7af"}]}, + {gstk_editor, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17dd7595545d33bb3143ac3995711b39"}]}, + {gstk_entry, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2740de840e6b8871909dfedd96d4b5b4"}]}, + {gstk_font, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bc2fef06167d48c71cc434fa7411ca95"}]}, + {gstk_frame, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5113cb91ebb88a4cb1a0b4cb7665607d"}]}, + {gstk_generic, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d392d9f2e6c6220245cff065e99a3f5"}]}, + {gstk_grid, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"61def27e9610041778245948e5f82be1"}]}, + {gstk_gridline, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"40c7173521b57e4c9243ec5258f65d6d"}]}, + {gstk_gs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9c9ab7ac782c3e36e201d4760f37e478"}]}, + {gstk_image, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"50a6a6b41de78e4f06b0c98cba97992a"}]}, + {gstk_label, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"00b5826ce30fc11e417a7a43f0c7e563"}]}, + {gstk_line, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b7785bc56e2f32b575a4240a60994d62"}]}, + {gstk_listbox, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"053218bec49478a8334df6b0818e981f"}]}, + {gstk_menu, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ccf11b45fdd908fafb781c897d379370"}]}, + {gstk_menubar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e801f2c6eccc8258d719028b706ec624"}]}, + {gstk_menubutton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1fc2d88da997bdc39a24f3f0db9963b3"}]}, + {gstk_menuitem, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a4442a7307d34c544783c9d22433135"}]}, + {gstk_oval, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f4775c1b7522750f395f28a94eefe453"}]}, + {gstk_polygon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fdc96f316574995486c842b612722e25"}]}, + {gstk_port_handler, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"95ec5d20c905e8cc7fef2df5f99ceb88"}]}, + {gstk_radiobutton, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b67bb9cafd3bf67b210d7b0e0b1bd992"}]}, + {gstk_rectangle, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6bf1f8e7953532468393090fe8d56ba2"}]}, + {gstk_scale, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"848c7ee845d1a59a0a7c4775f64f220e"}]}, + {gstk_text, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"719252f8d069544886ec473e16688530"}]}, + {gstk_widgets, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"29b540f4612eb1f1e65123f08809bee4"}]}, + {gstk_window, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"746a06674df1cd96678689e6ab92a95a"}]}, + {tcl2erl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f67bcc59683d0c578cba1c0062ff6b3e"}]}, + {tool_file_dialog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3763cc96ed8e2a6136a4c15e54a9adee"}]}, + {tool_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"96edfeab61de9b40618e7808d62225b2"}]}]}]}}, + {application, + {eunit, + [{description,"EUnit"}, + {vsn,"2.2.4"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/eunit-2.2.4/ebin"}, + {modules, + [{eunit, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"800601aeceaf1de519df273ca25741b5"}]}, + {eunit_autoexport, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"48f889ffaa560238fa2269614f93bbce"}]}, + {eunit_data, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed89782dac4c2b21da64d92bf74f1e22"}]}, + {eunit_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"949ed8c5f494a8678c6f29775a7b5154"}]}, + {eunit_listener, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6f107b19b4ecf45031a93afa5ace611f"}]}, + {eunit_proc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cfc2da427b2bf7ba843f6b8d8121e2c9"}]}, + {eunit_serial, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f07a040ebbba4af90fa9668c410befba"}]}, + {eunit_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0842dedb36c3b1cd91229a7e4abfe328"}]}, + {eunit_striptests, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"473b48509d28519ba18cfa83a8dea8b4"}]}, + {eunit_surefire, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1e6a5cebf210cdd8a558cd32b96ac13"}]}, + {eunit_test, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cc3897e05a5146b24c109fbc5da83e86"}]}, + {eunit_tests, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5d2b6b165201e0aad13a8d8f4d542f59"}]}, + {eunit_tty, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a4faaab287e1fa52837cdfd1b58c7faf"}]}]}]}}, + {application, + {et, + [{description,"Event Tracer"}, + {vsn,"1.4.4.4"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/et-1.4.4.4/ebin"}, + {modules, + [{et, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"82db3e8683420a2adb933306c8c822e8"}]}, + {et_collector, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dd43f7a22b3c3e6a1799a88163c3d441"}]}, + {et_gs_contents_viewer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"44e7ea855be084e48cd364735d79f5f7"}]}, + {et_gs_viewer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d4ef2a5673c20444b198bdc185cc637a"}]}, + {et_selector, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"267f60d2ecdad671eae269cdd2ff30f6"}]}, + {et_viewer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3ae9af3449c17f045d25ca424e9873ae"}]}, + {et_wx_contents_viewer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d14826378988286a32fc85ca4246325"}]}, + {et_wx_viewer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"87f45e31d50a82d9db2443ddff14ad22"}]}]}]}}, + {application, + {erts, + [{description,"ERTS CXC 138 10"}, + {vsn,"5.10.3"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/erts-5.10.3/ebin"}, + {modules, + [{erl_prim_loader, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"719e5362c7c1f0d1fd96601b7f814981"}]}, + {erlang, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"04b2444affe04bb9287d86e0e0c80578"}]}, + {erts_internal, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a95c0409fe7b4ccf6e2fe509bfd23da8"}]}, + {init, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"55bb9fddcdf820938be2efee15eccd82"}]}, + {otp_ring0, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"47fe4e7e2d2a5f20cd3a9393e0743e57"}]}, + {prim_eval, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"16d4fc3a8e5e2ef7200bd866fe8b1abb"}]}, + {prim_file, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"da0745178ab8aa8fb8d3a373970ebfdd"}]}, + {prim_inet, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4993598825a1083526cbc23cf027f494"}]}, + {prim_zip, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9280fc2398f9eb3bd09f74cfa1d6d267"}]}, + {zlib, + [{loaded,true}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"811834d04ac37676048717e1c51f63ac"}]}]}]}}, + {code, + [{path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/erl_interface-3.7.13"}, + {modules,[]}]}, + {application, + {erl_docgen, + [{description,"Misc tools for building documentation"}, + {vsn,"0.3.4"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/erl_docgen-0.3.4/ebin"}, + {modules, + [{docgen_edoc_xml_cb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"29c8b94e559528ca0aeacee089f52bcf"}]}, + {docgen_otp_specs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c6d53404b1059d2da87ce44bee49d2dd"}]}, + {docgen_xmerl_xml_cb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"274ef03ec5cb146346fea794e77febcf"}]}]}]}}, + {application, + {eldap, + [{description,"Ldap api"}, + {vsn,"1.0.1"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/eldap-1.0.1/ebin"}, + {modules, + [{'ELDAPv3', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"655b60d1b5b0629024e2a78708c64518"}]}, + {eldap, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"df60096d034768188e0fd6eaa0fd571c"}]}]}]}}, + {application, + {edoc, + [{description,"EDoc"}, + {vsn,"0.7.12"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/edoc-0.7.12/ebin"}, + {modules, + [{edoc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f2749685cb80a536ad42426933220065"}]}, + {edoc_data, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3a444b7ae3acc249aac7fe40b38355af"}]}, + {edoc_doclet, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"77b3ccaf177983dab1991425fd3d714b"}]}, + {edoc_extract, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9effef62cfe9939a4c80b43b86041c6c"}]}, + {edoc_layout, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f2b79a133f490b4de09b13f7519d37dd"}]}, + {edoc_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4f421fb61a9b2c711d5fc28387b0ffd0"}]}, + {edoc_macros, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ddb1e78cf2ddd20aadc87329067286f3"}]}, + {edoc_parser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"02fe39575dfda2cffd6031f6c8f470eb"}]}, + {edoc_refs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5a3ba4e7f5211445d74a4d19bc4c5963"}]}, + {edoc_report, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bfef03c1f2c7de294972d0ad185a3a11"}]}, + {edoc_run, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0db629008caa57ebafde1dda9672306c"}]}, + {edoc_scanner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"165a8e826f458ac6de7c50c395d012df"}]}, + {edoc_specs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"21a5746822e2ae01421fb064d9c8ccfd"}]}, + {edoc_tags, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c9ad335a1ce6b99189cfbfaef2ca2038"}]}, + {edoc_types, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"84530d798ce334278df4dea8a69098f4"}]}, + {edoc_wiki, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eabda8c28daf0cdc040eef58f31cc6a8"}]}, + {otpsgml_layout, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a511240c5864dd31d4df687465e355f6"}]}]}]}}, + {application, + {diameter, + [{description,"Diameter protocol"}, + {vsn,"1.4.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/diameter-1.4.2/ebin"}, + {modules, + [{diameter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b2fdb2feddc71bda9175711150823325"}]}, + {diameter_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6dcc769947f323a9ff306c9bcab4dd2c"}]}, + {diameter_callback, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d8c76e1ccf47e3c781cbdf3c8d3e293f"}]}, + {diameter_capx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"65e483a5f121d99db830329f3dc050cb"}]}, + {diameter_codec, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9bd2e1ef215e88519ca3865601e479dc"}]}, + {diameter_codegen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"33696e30585762fe29ca103d67ffbb04"}]}, + {diameter_config, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"76e885acd24a697d19b07ce5446f5c2b"}]}, + {diameter_dbg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0954c1f71a204a0f2c8b3682d520c704"}]}, + {diameter_dict, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1ed21a8d2eea031aa736e95870a7a165"}]}, + {diameter_dict_parser, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c90e506d7eba4f18547238b8f025ce5e"}]}, + {diameter_dict_scanner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b3fc9ee26b660a97ad67b4c8728a0b75"}]}, + {diameter_dict_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"70475203e0968747889eecc533af3f0f"}]}, + {diameter_etcp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dde08c8d8311e2700c59b741274923fb"}]}, + {diameter_etcp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"85fc8320ca9eb8daceb03727bdadb6f8"}]}, + {diameter_exprecs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"728aa8871c778eacc02313d922dde7ae"}]}, + {diameter_gen_acct_rfc6733, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"53fb49bb8c354f36d6e1ad6366fe02a2"}]}, + {diameter_gen_base_accounting, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"845f38b99248c11778453b628ddb4fed"}]}, + {diameter_gen_base_rfc3588, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f6cd02c8318f4ccc198bd08d1ac789fb"}]}, + {diameter_gen_base_rfc6733, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"49edd3b9955c82c872169f769c833482"}]}, + {diameter_gen_relay, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c970d47476d2832f510b6b03699c95c6"}]}, + {diameter_info, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"472b763fc9554c0c92992a3b36177667"}]}, + {diameter_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8d49799607d7c7792a79dbc434b4d53e"}]}, + {diameter_make, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"249d7f673e7f192ddff7c66b578e886e"}]}, + {diameter_misc_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3996fa63b0e083301d35fc6d88b75ce4"}]}, + {diameter_peer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"89f28d8d35bdeb8b05995daffb8d868c"}]}, + {diameter_peer_fsm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"df03404577882e8cfba57087c91fe3ef"}]}, + {diameter_peer_fsm_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b25500795639e63d9a591e33df6e4af7"}]}, + {diameter_reg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e7d427dafe432249d3535bc9e6ec538"}]}, + {diameter_sctp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cb7487b2c41e3520b1a46738699a88c8"}]}, + {diameter_sctp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a02584b6b31789dd38493fd1a8d7d3e3"}]}, + {diameter_service, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e990f54abf1c8706cd7717cba717594c"}]}, + {diameter_service_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a66f4714fa96fd7d289260002851cbf9"}]}, + {diameter_session, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d348e0ca8d3c827d647c3bea8f9c7691"}]}, + {diameter_stats, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f12a18f52de33ca77dacd1bba99680c8"}]}, + {diameter_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c910b68b3d0760f595a81ca58b1337f8"}]}, + {diameter_sync, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff62cfc82b044d2300345ac7912fe320"}]}, + {diameter_tcp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e4dae7482d9a79d4ead66ef14d1c3a48"}]}, + {diameter_tcp_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c1b03a96691e03eb93144bc50022a007"}]}, + {diameter_traffic, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d351fdbef0536bba235fe102fe8e697"}]}, + {diameter_transport, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"386e129e240e91794ff79e1da6c6966a"}]}, + {diameter_transport_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c9f8da23c3c870b8a6ed8648d7aac2d5"}]}, + {diameter_types, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d2ecf24e368d30dbef34527e2971caf8"}]}, + {diameter_watchdog, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a0ab7bd910bc959c0d1b64f0a2ae4bda"}]}, + {diameter_watchdog_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e4b16aeb2713fd42bf5e9da7cbe43bcf"}]}]}]}}, + {application, + {dialyzer, + [{description, + "DIscrepancy AnaLYZer of ERlang programs, version 2.6.1"}, + {vsn,"2.6.1"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/dialyzer-2.6.1/ebin"}, + {modules, + [{dialyzer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"929cdc37a18725b9710b9c4345c3aca0"}]}, + {dialyzer_analysis_callgraph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b679e22bb1edb9f0225b79d995342dc5"}]}, + {dialyzer_behaviours, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5fb71e7e5129b4c2f74cb529d8a745c4"}]}, + {dialyzer_callgraph, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5b03b559fdab4c77a8c955cdfe7a2036"}]}, + {dialyzer_cl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79a2208b0cc03af530473d2d2f49587f"}]}, + {dialyzer_cl_parse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b4fcced00882cfef0262398a14319c2a"}]}, + {dialyzer_codeserver, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f5c8a1600210988f627559bc16a49a65"}]}, + {dialyzer_contracts, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c002e8bcddf711ae9feef14b88f28873"}]}, + {dialyzer_coordinator, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"51efdc15e07eaa495060e420585bb74f"}]}, + {dialyzer_dataflow, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ddb43241a51460b67c67780ca6174bef"}]}, + {dialyzer_dep, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ffffdcfd7edb9901be2e92b6d3a5f082"}]}, + {dialyzer_explanation, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79c9bc71edcc115a03c1bb00a4133627"}]}, + {dialyzer_gui, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec41553832cb5f49cce3b123ec763448"}]}, + {dialyzer_gui_wx, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"00f5ef9bd8202d5bc303fca27c740b00"}]}, + {dialyzer_options, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"713bf0249b3bb22c7461498b908db812"}]}, + {dialyzer_plt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e5b1ecae532cb2887c942c6bda2c7dc7"}]}, + {dialyzer_races, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec1b2f026e1dfd438fbb48dcf16a19de"}]}, + {dialyzer_succ_typings, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"12a59523b727169f2f415b6e57768910"}]}, + {dialyzer_timing, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b170424f433845fb9aab3e554ea61044"}]}, + {dialyzer_typesig, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b6670ae353fa06c5c8a5f301a7079ca6"}]}, + {dialyzer_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cac59b9f59802633948d271fcf8ff92d"}]}, + {dialyzer_worker, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e9ff1cc342b308c73bab8c607a8437e"}]}]}]}}, + {application, + {debugger, + [{description,"Debugger"}, + {vsn,"3.2.11"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/debugger-3.2.11/ebin"}, + {modules, + [{dbg_debugged, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"78bf1d9b43c718da5e198af36cabb1ce"}]}, + {dbg_icmd, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"615470a6677e03a603c24cf821ba3471"}]}, + {dbg_idb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0e78e73c63bfe9149a11122857355f29"}]}, + {dbg_ieval, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0e49ed51a1a1e7581334308cd3c9195e"}]}, + {dbg_iload, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f249c44fee09e35262d2cafbfa22ce49"}]}, + {dbg_iserver, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a2911ffbd531888ac6e1b96a5475436"}]}, + {dbg_istk, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ae44e86b7893633859292861275bdb7f"}]}, + {dbg_ui_break, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e5397708044bd37bac2a6f4e24edbd30"}]}, + {dbg_ui_break_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c974a8a9b180cfd4ccbcfd31a7bb88e5"}]}, + {dbg_ui_edit, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7faadd987bb74826e5f5865d725ca177"}]}, + {dbg_ui_edit_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0e912e444704ad322b3e25fc6393c068"}]}, + {dbg_ui_filedialog_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"06a6b13cd9bcfe7d7d203a981352cfaa"}]}, + {dbg_ui_interpret, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dcf7a340530f4807d774d4c719a1dbbf"}]}, + {dbg_ui_mon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c79f2debfab06b86990ef7e390a61b7"}]}, + {dbg_ui_mon_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8c43cdde20d4e66b6f51ef903af75250"}]}, + {dbg_ui_settings, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8deedced7307e14f36cca3d9fe7e367f"}]}, + {dbg_ui_trace, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c817c2cc2f62354d4f59be8b6e6fac96"}]}, + {dbg_ui_trace_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"db1abdd3b7a7b45d3c74dbd9c48f07e8"}]}, + {dbg_ui_view, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b10a46e072053a225a894ed76dceebca"}]}, + {dbg_ui_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e51ec8a33c335245583f7a9ba8728f66"}]}, + {dbg_ui_winman, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2056472842990c08dfdb81e56df2caa8"}]}, + {dbg_wx_break, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"55c7dc041c4cd1b1da98d49def9c2b15"}]}, + {dbg_wx_break_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ad9cde7d28f7de18dda8da80d97a8f00"}]}, + {dbg_wx_code, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"27abac65970e6f7c6bbaca07e9ead6a4"}]}, + {dbg_wx_filedialog_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"da924842b25d80b7b258100a4e597810"}]}, + {dbg_wx_interpret, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8549ef4a5bad09472dccd1cb3ab2c764"}]}, + {dbg_wx_mon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"09140d34a402d7183cf9dfecb0b2b6e8"}]}, + {dbg_wx_mon_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1fefe3be53da62cf504daf354579d910"}]}, + {dbg_wx_settings, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"350aed0cb189f0b91979fc38752fd4c4"}]}, + {dbg_wx_src_view, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"644bfb2c2d8fc6e9296722fef5f05b57"}]}, + {dbg_wx_trace, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"024358a893f9b37296fc0c416074a4b1"}]}, + {dbg_wx_trace_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b2348218e83d1704bcf894e71c2f3e82"}]}, + {dbg_wx_view, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d37489d27927cff9f19f76bc0c816c9"}]}, + {dbg_wx_win, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d94add4e9adade091198438a278501a8"}]}, + {dbg_wx_winman, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"caa1febd36494a9088fddbd5557c503f"}]}, + {debugger, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2e242b76bc941785f65d1cf819fd98a5"}]}, + {i, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2bebfb4e91c343a1ad89f1124b06e190"}]}, + {int, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e1d4c0b2e30129359db05d3bc4df646c"}]}]}]}}, + {application, + {crypto, + [{description,"CRYPTO version 2"}, + {vsn,"3.0"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/crypto-3.0/ebin"}, + {modules, + [{crypto, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"858d0e1779f13a6bfde511898916ae94"}]}, + {crypto_app, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d2de1cd4927d57e8eaa4467404c8c02"}]}, + {crypto_server, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"17e05e4b0d772036706b76ba8f68de2e"}]}, + {crypto_sup, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1342a18fe8d994974e41aa3e351d8500"}]}]}]}}, + {application, + {cosTransactions, + [{description,"The Erlang CosTransactions application"}, + {vsn,"1.2.13"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosTransactions-1.2.13/ebin"}, + {modules, + [{'CosTransactions_Control', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9ee94b22194357e2374fe2c026d2a9fb"}]}, + {'CosTransactions_Coordinator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bca2be777e58bf130a3bf48252c0c0cb"}]}, + {'CosTransactions_HeuristicCommit', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d12c1a0988d03c64a606ba471794e3cc"}]}, + {'CosTransactions_HeuristicHazard', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"79d0dc47e6759987e5b45281bc4c39f2"}]}, + {'CosTransactions_HeuristicMixed', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a77cb11ccf269fa85f2194ab16ec5ebb"}]}, + {'CosTransactions_HeuristicRollback', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"67a56bf7b8084c29dd10db9daa8e08f7"}]}, + {'CosTransactions_Inactive', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8f94debdaa1912d18bbea77492e6fc88"}]}, + {'CosTransactions_InvalidControl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b14b9b82b831e56235c1bca1f6e02e16"}]}, + {'CosTransactions_NoTransaction', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"24252bfbc89f79dac5c90b35e35a66ad"}]}, + {'CosTransactions_NotPrepared', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ddbcd30a479a50fa2fed4b0cb019c0bd"}]}, + {'CosTransactions_NotSubtransaction', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3904cf57a879720704d8b725802cc530"}]}, + {'CosTransactions_PropagationContext', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4d0dd57873deb42ef62f2e9e8620e111"}]}, + {'CosTransactions_RecoveryCoordinator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2a670d242e21803d3a559b812b3f3bfd"}]}, + {'CosTransactions_Resource', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"78bdc7f9989a5277bde7e066804fa1c0"}]}, + {'CosTransactions_SubtransactionAwareResource', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e1194d19b4db72b1c571aec1847fa65f"}]}, + {'CosTransactions_SubtransactionsUnavailable', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d6ffc90a293248735f58984f7a9f4fa9"}]}, + {'CosTransactions_SynchronizationUnavailable', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9858316a8256791e5fe66729fcd364ef"}]}, + {'CosTransactions_Terminator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dbbba1c622d817538fba982cbefd4a15"}]}, + {'CosTransactions_Terminator_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2db2696226a90215edb559cdae7ad928"}]}, + {'CosTransactions_TransIdentity', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d38592cd26cbbbe3a963ca77b5264ea8"}]}, + {'CosTransactions_TransactionFactory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"04db55c2ba8df7975e98e1c7b7582bb6"}]}, + {'CosTransactions_TransactionFactory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1d8ff8a2434c10c4716b1b59aebbcb9e"}]}, + {'CosTransactions_Unavailable', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a77c05d98c0c72e2f1d52a1f781a1b98"}]}, + {'CosTransactions_WrongTransaction', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c836d95954f2374d89bfc9ff2bd86793"}]}, + {'CosTransactions_otid_t', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1e903c81e783cb34153bbca99e047870"}]}, + {'ETraP_Common', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ea5d3e59af9cadcb5587cc42fc750470"}]}, + {'ETraP_Server', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8592fd689bdae07056a29bd258293371"}]}, + {'ETraP_Server_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7f192b40f501fd2f5fb3f92b21c5e9d3"}]}, + {cosTransactions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6d83a1fd7da7dc0b87658efe3039f484"}]}, + {etrap_logmgr, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91577f644192b682cb8739b9ce7ac7ad"}]}, + {oe_CosTransactions, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6f6c79ffe50eac0c3ced0fba1a8c08a0"}]}]}]}}, + {application, + {cosTime, + [{description,"The Erlang CosTime application"}, + {vsn,"1.1.13"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosTime-1.1.13/ebin"}, + {modules, + [{'CosTime_TIO', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"77717ab85418c3c1599b3238c879b770"}]}, + {'CosTime_TIO_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3ce85958b051f2f97925e980f56115e2"}]}, + {'CosTime_TimeService', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a92a3fc07bfeeae58a57075ecddb5ac6"}]}, + {'CosTime_TimeService_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0885fbeef5bd4f72920ae716f0c73d54"}]}, + {'CosTime_TimeUnavailable', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9ee0570f9b91eece7560cc1b6146f784"}]}, + {'CosTime_UTO', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"799ddc99175222b61965c6c8e66e5cb3"}]}, + {'CosTime_UTO_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"552c29f5ece131368c121b5a14c3ae06"}]}, + {'CosTimerEvent_TimerEventHandler', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"76961fc9eaae9e46950b5eb52fe62ae3"}]}, + {'CosTimerEvent_TimerEventHandler_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a69e243a494b80eb34b37456f2b1f855"}]}, + {'CosTimerEvent_TimerEventService', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"62c54aabe64cb28b1245eb80f6b9190d"}]}, + {'CosTimerEvent_TimerEventService_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c6926dd7faed0366772908c8593691e"}]}, + {'CosTimerEvent_TimerEventT', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"74b7db88a5dd4f17c263683a80bcfe3b"}]}, + {'TimeBase_IntervalT', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c8f966d02c9520f2d3a4f024892ded3"}]}, + {'TimeBase_UtcT', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"15f72a9538e725e68e375f3d638c1b6d"}]}, + {cosTime, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8c96cfbcafba8c9df1a9b57b7e09c4d8"}]}, + {oe_CosTime, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e607ddba4a35690c39bfcbb1fa3e044e"}]}, + {oe_CosTimerEvent, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"39f960f5b9c079eaecb87e75d9f90f2b"}]}, + {oe_TimeBase, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"764d088e21dd985285d4ccfd723959fe"}]}]}]}}, + {application, + {cosProperty, + [{description,"The Erlang CosProperty application"}, + {vsn,"1.1.16"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosProperty-1.1.16/ebin"}, + {modules, + [{'CosPropertyService_ConflictingProperty', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"67353514e217df9f5a5c5e0d3e97d9bd"}]}, + {'CosPropertyService_ConstraintNotSupported', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ce577ca5520194130903c063d8f2211a"}]}, + {'CosPropertyService_FixedProperty', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0ef0b79fd5dbcb18f7b9c94f941678e2"}]}, + {'CosPropertyService_InvalidPropertyName', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bd173257499295fbdc728d60fd14af92"}]}, + {'CosPropertyService_MultipleExceptions', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a3004385ac63dc6aa52bcb2aa46818f0"}]}, + {'CosPropertyService_Properties', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"172b757c8a881b79146f50d9f3da1ea9"}]}, + {'CosPropertyService_PropertiesIterator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"37fa8c7f1e5ab4798845a1b101835900"}]}, + {'CosPropertyService_PropertiesIterator_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"728fabf6239161186aa9f574ad27fbd6"}]}, + {'CosPropertyService_Property', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a912eb5a31517a6f94ee3f8e3b898ece"}]}, + {'CosPropertyService_PropertyDef', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d8ea474f53418bda870c1f98c522d15b"}]}, + {'CosPropertyService_PropertyDefs', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3c997a6a4db17765d72f52953679fc7d"}]}, + {'CosPropertyService_PropertyException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3600a7d77fe924d3883a003b68ab8902"}]}, + {'CosPropertyService_PropertyExceptions', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a516b05a720966d4a3568f7f087f22cf"}]}, + {'CosPropertyService_PropertyMode', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b1e1e285b3a2b01a12e328ed94a65225"}]}, + {'CosPropertyService_PropertyModes', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed697876aa56c111eee5733379303ef3"}]}, + {'CosPropertyService_PropertyNames', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"39684cd186c7d8da459f9d17637606a2"}]}, + {'CosPropertyService_PropertyNamesIterator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"97b170d84779dcb7b98460588de428e3"}]}, + {'CosPropertyService_PropertyNamesIterator_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e06e012106df3651db1e9d52472bebd3"}]}, + {'CosPropertyService_PropertyNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"86c83ceacb0b80d4ffa6042cfaec025f"}]}, + {'CosPropertyService_PropertySet', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ffbb0b6b88d4a35cd836322dcc2b4603"}]}, + {'CosPropertyService_PropertySetDef', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"429c3ed48018cc6eef3d28c2407fa42e"}]}, + {'CosPropertyService_PropertySetDefFactory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"86da518b687db630cd85921ebe96d07a"}]}, + {'CosPropertyService_PropertySetDefFactory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2f52585d44dd9d6863bd2b0e0359a24e"}]}, + {'CosPropertyService_PropertySetDef_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a02a747cf3856996416253a5cbccfbd7"}]}, + {'CosPropertyService_PropertySetFactory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"faef66b15f43dc81cbf7dd9bde81c8a2"}]}, + {'CosPropertyService_PropertySetFactory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b538bc6740ae2b6934e08d831d5b0960"}]}, + {'CosPropertyService_PropertyTypes', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec088d6b4028f6a9dc2917e6722f1c32"}]}, + {'CosPropertyService_ReadOnlyProperty', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3f4d338a44a7ab32daf202f4d2aa7cbb"}]}, + {'CosPropertyService_UnsupportedMode', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"203ca7e42a209758ceea013cbff109bd"}]}, + {'CosPropertyService_UnsupportedProperty', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"28e9e73be7eb82646e3713135d695a6d"}]}, + {'CosPropertyService_UnsupportedTypeCode', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"da862aea1e36f6fb797bee192a2f3e08"}]}, + {cosProperty, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e5c17adcc4dc9f93a8cf92c91a12c81e"}]}, + {oe_CosProperty, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4c9d35f1b883b805a44e9864136958b1"}]}]}]}}, + {application, + {cosNotification, + [{description,"The Erlang CosNotification application"}, + {vsn,"1.1.20"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosNotification-1.1.20/ebin"}, + {modules, + [{'CosNotification', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5a52684ebceaceebe3d7c971fd5e45e6"}]}, + {'CosNotification_AdminPropertiesAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aa2af8e932319a2ab715d799c31678b0"}]}, + {'CosNotification_Common', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e908fdcf47fa3d9d234d4061db9760ab"}]}, + {'CosNotification_EventBatch', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8c79e194e19df338bec34cee83d5c999"}]}, + {'CosNotification_EventHeader', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9e08e276e855cfa3dd60bdc9b563b8e9"}]}, + {'CosNotification_EventType', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"be0b154ef34f6279604f04d0be386d64"}]}, + {'CosNotification_EventTypeSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3719ad475d47fd73c1a70891586f0b17"}]}, + {'CosNotification_FixedEventHeader', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e512d2bce68fcb3de1336060be225cad"}]}, + {'CosNotification_NamedPropertyRange', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e42690af83d192433daaadb6cbfc7e02"}]}, + {'CosNotification_NamedPropertyRangeSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5eac2fb6027077046d918d30b36fb45a"}]}, + {'CosNotification_Property', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d89e479fd34c1e6c46447dcb4aaa44e0"}]}, + {'CosNotification_PropertyError', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c2b5a17b0ff2dd997013daf5a4d73a83"}]}, + {'CosNotification_PropertyErrorSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2437aa1bdbeeb5f45213bc7e7922351a"}]}, + {'CosNotification_PropertyRange', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b2392c8040a976dc8db3ba147f7911f2"}]}, + {'CosNotification_PropertySeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6950965079eb678d5b2e010c8266cf13"}]}, + {'CosNotification_QoSAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fafc8842d8f8e11febab4d341a2ce879"}]}, + {'CosNotification_StructuredEvent', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"22a1eae09f5d8cf0d223d06cebf9d85b"}]}, + {'CosNotification_UnsupportedAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0b1d7ff2796dd090e244cecdbfa4d2ce"}]}, + {'CosNotification_UnsupportedQoS', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d0968f6f188653b1e292c34f3b18c51a"}]}, + {'CosNotifyChannelAdmin_AdminIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"42791a7a0d5ca5fef186c441a81cf50b"}]}, + {'CosNotifyChannelAdmin_AdminLimit', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5355d6a703102439e59b070eb6e61b45"}]}, + {'CosNotifyChannelAdmin_AdminLimitExceeded', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"18b11c68d839f9aa90bfe6da07b15cd8"}]}, + {'CosNotifyChannelAdmin_AdminNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c853cd178ef80d6a46a334d3cb5371d4"}]}, + {'CosNotifyChannelAdmin_ChannelIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"992ab8f1ac2f4cc15edd6068c8dc1948"}]}, + {'CosNotifyChannelAdmin_ChannelNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"475e742fdf1dd2ec932704ccb941f3c1"}]}, + {'CosNotifyChannelAdmin_ConnectionAlreadyActive', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d8b95c202b2ebc28a7208928563b5382"}]}, + {'CosNotifyChannelAdmin_ConnectionAlreadyInactive', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8b106140de30c6cd638b328efe453cb3"}]}, + {'CosNotifyChannelAdmin_ConsumerAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4c8c31c812099afa148ed0662dc67ea0"}]}, + {'CosNotifyChannelAdmin_ConsumerAdmin_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"172767d1c29ca64e810d8853c61a01e9"}]}, + {'CosNotifyChannelAdmin_EventChannel', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e362f0dc4dc40c98e66b91632554ddb7"}]}, + {'CosNotifyChannelAdmin_EventChannelFactory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4798a326d18d53e9a7870454fb33ef4c"}]}, + {'CosNotifyChannelAdmin_EventChannelFactory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4bc146f5b9cc168505d2249e7f04a618"}]}, + {'CosNotifyChannelAdmin_EventChannel_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"db6e5631fc1e5ff158dfc77123c7e752"}]}, + {'CosNotifyChannelAdmin_NotConnected', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b7f5e3229c7849f94b0744a78e38012c"}]}, + {'CosNotifyChannelAdmin_ProxyConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b1aa19779800f6e97852f5a2e8042641"}]}, + {'CosNotifyChannelAdmin_ProxyIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bf0a62dd47773a5a4df90f70644c4e24"}]}, + {'CosNotifyChannelAdmin_ProxyNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"735c610478319545c1a68c1c8b75609d"}]}, + {'CosNotifyChannelAdmin_ProxyPullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6cc803a524bd58d1c33bee3fb8f92ac7"}]}, + {'CosNotifyChannelAdmin_ProxyPullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1683d6e08309fb3fc51d127c407348a"}]}, + {'CosNotifyChannelAdmin_ProxyPushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"94416e046b1c566bfa8df9bc1884bea5"}]}, + {'CosNotifyChannelAdmin_ProxyPushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"61c57643509be14cbb5e82090fb5bf6d"}]}, + {'CosNotifyChannelAdmin_ProxySupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4c1c83635cd4d1e4a50577e68f084a39"}]}, + {'CosNotifyChannelAdmin_SequenceProxyPullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"af562a179799a5ae781278e980912710"}]}, + {'CosNotifyChannelAdmin_SequenceProxyPullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"da43e615a23f2485758bec039617792c"}]}, + {'CosNotifyChannelAdmin_SequenceProxyPushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a876b3b2c655fa98e23510ca72be236"}]}, + {'CosNotifyChannelAdmin_SequenceProxyPushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"55954cf819fb29c74e8c7fa7dcb17eb8"}]}, + {'CosNotifyChannelAdmin_StructuredProxyPullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"aeb95ea3a9deb7c129dccfd77df7976c"}]}, + {'CosNotifyChannelAdmin_StructuredProxyPullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e72e1de7fb0ea440aae9ca791fbdd403"}]}, + {'CosNotifyChannelAdmin_StructuredProxyPushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d277b85ea15126c7645eccc585325ee2"}]}, + {'CosNotifyChannelAdmin_StructuredProxyPushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7339f8c2876066369e6afa27267bfd81"}]}, + {'CosNotifyChannelAdmin_SupplierAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"043d43346f3ff5c2775bf7030a13e1d9"}]}, + {'CosNotifyChannelAdmin_SupplierAdmin_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"efe73dc58fd1b27c2adc184018e4091a"}]}, + {'CosNotifyComm_InvalidEventType', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"516a9a10d779d7b47a5752d0b4278017"}]}, + {'CosNotifyComm_NotifyPublish', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c50da2c5c4d79c4cd3974c37b6165fbd"}]}, + {'CosNotifyComm_NotifySubscribe', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"180ce40d1660bec349bb7ddf1275c985"}]}, + {'CosNotifyComm_PullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dd7be30cd0685dbb3e0f22b4de8ffb91"}]}, + {'CosNotifyComm_PullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e76b3f6be347a5d08350ae25cddc77c1"}]}, + {'CosNotifyComm_PushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c2c972f2affe7f936ec38997084045b1"}]}, + {'CosNotifyComm_PushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"416e6887077de70bf3aa7cf6c6b35a9c"}]}, + {'CosNotifyComm_SequencePullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1322fb2dadb5669a36391f12455c6969"}]}, + {'CosNotifyComm_SequencePullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"281779a70fdae7a1de3e569ae707d21a"}]}, + {'CosNotifyComm_SequencePushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"701eb7ecaef2fb7f13b5adf2ff8a97aa"}]}, + {'CosNotifyComm_SequencePushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ceb164baf53b3df5f90fdbef4c800d8d"}]}, + {'CosNotifyComm_StructuredPullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"70d2e255c8613a9d58a4f1f69b1adf51"}]}, + {'CosNotifyComm_StructuredPullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fa8164033103e1c40f7721471fa6b8fd"}]}, + {'CosNotifyComm_StructuredPushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"684f225a8d760e970a4380c303f82662"}]}, + {'CosNotifyComm_StructuredPushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"de1b05e00095ac428839c165db9f92fc"}]}, + {'CosNotifyFilter_CallbackIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ab4cfad0073e21b629ebd16f8973912"}]}, + {'CosNotifyFilter_CallbackNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5ae7cd265c665a4cd4a969c75388b1fc"}]}, + {'CosNotifyFilter_ConstraintExp', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"421355667259ba4906ed0b0ba89ae1ba"}]}, + {'CosNotifyFilter_ConstraintExpSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ef901d08223839966e5d67b55731e63"}]}, + {'CosNotifyFilter_ConstraintIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"50d0d1e84309217b5a2864eb2df3653b"}]}, + {'CosNotifyFilter_ConstraintInfo', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e988281d1a6d6d2ba412a86cb1b89e0b"}]}, + {'CosNotifyFilter_ConstraintInfoSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff21820130cfa051a6781e79f53171af"}]}, + {'CosNotifyFilter_ConstraintNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1611f041bd2826435c850dc36b2a6953"}]}, + {'CosNotifyFilter_DuplicateConstraintID', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"40c6d62f59e44a14649e3de2e78deafd"}]}, + {'CosNotifyFilter_Filter', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"864d9d277d782fca9a15809c5c195c1c"}]}, + {'CosNotifyFilter_FilterAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ee1e90ea0fbde4a0c53036e0efa4b89a"}]}, + {'CosNotifyFilter_FilterFactory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b59a3c5c5e24a9a389792ea9ff254312"}]}, + {'CosNotifyFilter_FilterFactory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"40bc158ddcbb31abff87fe4da270b55a"}]}, + {'CosNotifyFilter_FilterIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3dd80855340f372c0682a53a6d3bc216"}]}, + {'CosNotifyFilter_FilterNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fbdd34c6e28fb4c907410c2f7bc82f92"}]}, + {'CosNotifyFilter_Filter_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a6911bf97e4ebe2333e7e19914d821ea"}]}, + {'CosNotifyFilter_InvalidConstraint', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"beaedbe7bcec40b0d90a0404dde063a9"}]}, + {'CosNotifyFilter_InvalidGrammar', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0055f6477430cf9c38cce84d93393a12"}]}, + {'CosNotifyFilter_InvalidValue', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"041b66a4b7933005a983848254dec48c"}]}, + {'CosNotifyFilter_MappingConstraintInfo', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ab3093c4688953509866f4128d0747d2"}]}, + {'CosNotifyFilter_MappingConstraintInfoSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9f81b4c571998ef9f1cefa77c45be6e5"}]}, + {'CosNotifyFilter_MappingConstraintPair', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"305991c110aca04df1398bd3b640e284"}]}, + {'CosNotifyFilter_MappingConstraintPairSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7bd7692f2d9ad411d3d4323ff4ef9a2d"}]}, + {'CosNotifyFilter_MappingFilter', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fbd3cd1cce0f195048025a19666e4bb8"}]}, + {'CosNotifyFilter_MappingFilter_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c337925555dac8714bcde4ff0ac3682"}]}, + {'CosNotifyFilter_UnsupportedFilterableData', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64044f951a82b03309ab90082ed6d354"}]}, + {'PullerConsumer_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a96588beb8db62195c499ba6a61cc53f"}]}, + {'PullerSupplier_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"90058bd6464dc08f79814185696ce1fb"}]}, + {'PusherConsumer_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"72a8f62fb563174cf54b97aa1206b293"}]}, + {'PusherSupplier_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1d03a842669765bf9907b644957fa7cb"}]}, + {cosNotificationApp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0a6dabb21a8926c7f733904336b3375b"}]}, + {cosNotification_Filter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"63cb134b80f03d8399abe10908055e40"}]}, + {cosNotification_Grammar, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c5636b97c6e449aeafada1b5df5b6e91"}]}, + {cosNotification_Scanner, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9c6334416492eb7be457c13d39b92222"}]}, + {cosNotification_eventDB, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d52b15cf6eaba713bb979684b54fb8df"}]}, + {oe_CosNotification, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"961cde96216694db976f1f714b0f4d6c"}]}, + {oe_CosNotificationComm_Event, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"affa53e3f3dfcb411ff317d98a5ce64a"}]}, + {oe_CosNotifyChannelAdmin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4ed58499950adf48241f1701c2116857"}]}, + {oe_CosNotifyComm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a944c5aa4379e8f3b07acc9c5fd56f9a"}]}, + {oe_CosNotifyFilter, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c51f3aaa451621c060bdb0d707324fbd"}]}, + {oe_cosNotificationAppComm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed879b4fb4e5e3438e523069a29ce1aa"}]}]}]}}, + {application, + {cosFileTransfer, + [{description,"The Erlang CosFileTransfer application"}, + {vsn,"1.1.15"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosFileTransfer-1.1.15/ebin"}, + {modules, + [{'CosFileTransfer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"537730bb6ac118a9f672ea5c5616502c"}]}, + {'CosFileTransfer_AccessLevel', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"538517d444956f350c54176200fa9c2d"}]}, + {'CosFileTransfer_CommandNotImplementedException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"06bb7e58f28ad101e4cb2cd2336d3698"}]}, + {'CosFileTransfer_Directory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a3504d2207476a6439367e5e20b442bc"}]}, + {'CosFileTransfer_Directory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ca00e96f4f13619cbcaf663edf819405"}]}, + {'CosFileTransfer_File', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"082fb7de49fb7a94ad34873e876fbdd8"}]}, + {'CosFileTransfer_FileIterator', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d7fce306a50dbb7edaea5f9eeec1d5ce"}]}, + {'CosFileTransfer_FileIterator_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bb5946f486a03df082e02ec55308e270"}]}, + {'CosFileTransfer_FileList', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5f508ab863f8cf90e46fda1e2bc6a01b"}]}, + {'CosFileTransfer_FileNameList', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2044a2695019499e1294315eea9f3092"}]}, + {'CosFileTransfer_FileNotFoundException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b00961e88651b5ab62c9d20b2d60c6e0"}]}, + {'CosFileTransfer_FileTransferSession', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"102d05bd8c1fda9dfa1ba3769ef283fd"}]}, + {'CosFileTransfer_FileTransferSession_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a6774a931a16efaa7bcbf342ef660b49"}]}, + {'CosFileTransfer_FileWrapper', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4d19e7d1eeb8b381847003f8837be28d"}]}, + {'CosFileTransfer_File_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64eda7b0b054da3e646bba7fbe6be70d"}]}, + {'CosFileTransfer_IllegalOperationException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"25a05f47c3c2fc5d14d135acb6d72a5f"}]}, + {'CosFileTransfer_ProtocolAddressList', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4587002261d4308181fc93122a15cea9"}]}, + {'CosFileTransfer_ProtocolSupport', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c7937786969ccbba0967581d3c25ad54"}]}, + {'CosFileTransfer_RequestFailureException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"384095c7be94a7544378f029e966cf2e"}]}, + {'CosFileTransfer_SessionException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7ef101cef5808b9d7c08037e15ee66fa"}]}, + {'CosFileTransfer_SupportedProtocolAddresses', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d145c64e85be77403b797ad505564018"}]}, + {'CosFileTransfer_TransferException', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a4b8f0ca1710b11ed6d723ee1692c46c"}]}, + {'CosFileTransfer_VirtualFileSystem', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"37e0d0057b23e3e1563b19539bc0a76d"}]}, + {'CosFileTransfer_VirtualFileSystem_ContentList', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"165e5f4d21952fc5eb1f0a289c571fbc"}]}, + {'CosFileTransfer_VirtualFileSystem_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"81b6bf0f44b0eab55cebc3d408671e0a"}]}, + {cosFileTransferApp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed8d595027fd9c5f7dd1e9398a4351bf"}]}, + {cosFileTransferNATIVE_file, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"91cd6a5ac4ba42b3d2ef0c0cf4c48270"}]}, + {oe_CosFileTransfer, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"683aa469ec95c19f32d0f62f5f7ef6e7"}]}]}]}}, + {application, + {cosEventDomain, + [{description,"The Erlang CosEventDomain application"}, + {vsn,"1.1.13"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosEventDomain-1.1.13/ebin"}, + {modules, + [{'CosEventDomainAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2e2d9e538ddd0f2a2fa74f499e042db1"}]}, + {'CosEventDomainAdmin_AlreadyExists', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a1ce2f0d94e633823bedf296aa1527e5"}]}, + {'CosEventDomainAdmin_Connection', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a3d8e1bead63a2d7644f36edd4a66772"}]}, + {'CosEventDomainAdmin_ConnectionIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"56929f00f5dcec6d75408d85921c693f"}]}, + {'CosEventDomainAdmin_ConnectionNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4de106e024e8f9f45783dd7b45af2cc1"}]}, + {'CosEventDomainAdmin_CycleCreationForbidden', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a28090bafe2078be88ee5cb996f9d23"}]}, + {'CosEventDomainAdmin_CycleSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3232a8bb21e31c81f7791fdf0359d945"}]}, + {'CosEventDomainAdmin_DiamondCreationForbidden', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8b9e307237ee3408e348d4593c0de997"}]}, + {'CosEventDomainAdmin_DiamondSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"65478f4d3f155d7547b52ea7d04f6628"}]}, + {'CosEventDomainAdmin_DomainIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4f44a097ccf00511ed397775b33991a8"}]}, + {'CosEventDomainAdmin_DomainNotFound', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e17639bb3b5f18e80cd8f505191dbc7c"}]}, + {'CosEventDomainAdmin_EventDomain', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b21b34fcceae9698702dadc469ef2cd1"}]}, + {'CosEventDomainAdmin_EventDomainFactory', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bcf4395bcda2d977235b24ec4416ddec"}]}, + {'CosEventDomainAdmin_EventDomainFactory_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a7d21747fe63505e98037202798cca90"}]}, + {'CosEventDomainAdmin_EventDomain_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2801240b7c96984648d565b9b210b8fb"}]}, + {'CosEventDomainAdmin_MemberIDSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"889c0e92b864877d5c2bbbd2ed185575"}]}, + {'CosEventDomainAdmin_RouteSeq', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f77038e040e610031d35f876dfa2925e"}]}, + {cosEventDomainApp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ea692728e2b3d71f1f486a7aece4df48"}]}, + {oe_CosEventDomainAdmin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"939160a9e6adced7edf36e0a18927785"}]}]}]}}, + {application, + {cosEvent, + [{description,"The Erlang CosEvent application"}, + {vsn,"2.1.14"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/cosEvent-2.1.14/ebin"}, + {modules, + [{'CosEventChannelAdmin_AlreadyConnected', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"64cb912070ade0d3254585904ba4c509"}]}, + {'CosEventChannelAdmin_ConsumerAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e027fd366965c17a0b51c3cfd80dcd4f"}]}, + {'CosEventChannelAdmin_EventChannel', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f8d2e64b53114282c8c353dd5110ea9e"}]}, + {'CosEventChannelAdmin_ProxyPullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9aef474c8cb0c5e9e2cb5d4cc43fe52d"}]}, + {'CosEventChannelAdmin_ProxyPullConsumer_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9057fc161db130ea1ee3bd656b083ad0"}]}, + {'CosEventChannelAdmin_ProxyPullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"11cc90a016f1b493838f6f79caa959fa"}]}, + {'CosEventChannelAdmin_ProxyPushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"21b14ec7e74c8632349f31cb70324ca6"}]}, + {'CosEventChannelAdmin_ProxyPushConsumer_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dabc851d850f372affa761150136640d"}]}, + {'CosEventChannelAdmin_ProxyPushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d32c6d87385b474519aa936d9bd79256"}]}, + {'CosEventChannelAdmin_SupplierAdmin', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b26b61665649ea2af6fc2b7174d7c4f7"}]}, + {'CosEventChannelAdmin_SupplierAdmin_impl', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8606a32b7269881c1f455edce89344db"}]}, + {'CosEventChannelAdmin_TypeError', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"20bb7e990eb8d6b0e854919c0dff94cc"}]}, + {'CosEventComm_Disconnected', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"c2ec0e6b1fa849a2ab22fdd1ce14ecb7"}]}, + {'CosEventComm_PullConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"43972738bc29806b38419aaf76d8c393"}]}, + {'CosEventComm_PullSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5206247fdf5b00621d3732805fe1854a"}]}, + {'CosEventComm_PushConsumer', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"72937626c2c3f3689fb6dafed66bad17"}]}, + {'CosEventComm_PushSupplier', + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"54875107d8748bac2b96a3037669a477"}]}, + {cosEventApp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dab9a7b6c3106899fe7d2c9e74fcb021"}]}, + {oe_CosEventChannelAdmin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b192666923744044b3a0e652ec9e9948"}]}, + {oe_CosEventComm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"884bef0af9742bfe5f3f7e345d24cd18"}]}, + {oe_CosEventComm_CAdmin, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f344012f72ef7bfbdef3d29d525e2896"}]}, + {oe_CosEventComm_CAdmin_impl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"935565447529d9e97da7b98c3631cc92"}]}, + {oe_CosEventComm_Channel, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fe816f373688feb5c63c10543eedd3c2"}]}, + {oe_CosEventComm_Channel_impl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5c3c48bf48ac0b63f62d82064f9ce32f"}]}, + {oe_CosEventComm_Event, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7f5146f9630ff6e60665cf32fc7e6641"}]}, + {oe_CosEventComm_PullerS, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dbd58f368f06b16fa0a7628594f84c44"}]}, + {oe_CosEventComm_PullerS_impl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2bd0c1df9074f1a792985b4ff1b0ec98"}]}, + {oe_CosEventComm_PusherS, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"36dc7eaaa1b298b7875dd41b3e6b5b85"}]}, + {oe_CosEventComm_PusherS_impl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"63c64664227a2772b5ad3d0c6519f8c4"}]}, + {oe_cosEventApp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cc2ca7e6febb762f39f337c5303390e6"}]}]}]}}, + {application, + {compiler, + [{description,"ERTS CXC 138 10"}, + {vsn,"4.9.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/compiler-4.9.2/ebin"}, + {modules, + [{beam_a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a338f3a7878d0c9a407950fcb5a2e7ed"}]}, + {beam_asm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cef85f8577595b73910fa77803c58cdb"}]}, + {beam_block, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7e7610e6f816e2c8d869e7ce1c44cba8"}]}, + {beam_bool, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3fcb1cec9f4370800203e1189c01a10c"}]}, + {beam_bsm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"973abf79efd649a3f0eb1b3351b4fe92"}]}, + {beam_clean, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a0c6b67b764da86372deb11b4c5154f4"}]}, + {beam_dead, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ff4f53d218b932103fcf093dbd366584"}]}, + {beam_dict, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f1e8c36a21a5287a84844e7ffa0a9bbb"}]}, + {beam_disasm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"63dd1f997343124a900e2fe982fe4cad"}]}, + {beam_except, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"89dd12d9c4781f83554a9d2101d623d8"}]}, + {beam_flatten, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a1e49fa674cc580042459878a27403e9"}]}, + {beam_jump, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1a9f1ce9787205a57d137424b5ab022b"}]}, + {beam_listing, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e9a84340142cd7c90e95851ab1260a0f"}]}, + {beam_opcodes, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d5d21bc2584bf078639eba76a18d221"}]}, + {beam_peep, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5d81c38cab19af16ff472ce5838c63b1"}]}, + {beam_receive, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"7d22ec74972c53f3f93bd01dbe369370"}]}, + {beam_split, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"03b0416d0fee9081f68cf6468d036170"}]}, + {beam_trim, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9a6a01870ff8f8bda3ea36184da7348a"}]}, + {beam_type, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"cc4a9521730959ffc10d3ccebd20861d"}]}, + {beam_utils, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d7d2b1d7cc0722d47c7fd72fa6487d27"}]}, + {beam_validator, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ed5a82e40ba511c22291f87c1e2b705b"}]}, + {beam_z, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ffafc7070cf14ec69d569b0f8106f9a"}]}, + {cerl, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"38c2ac91b52a3141d74df2f219b45eb5"}]}, + {cerl_clauses, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"75da88dc5ced060fe52f177dae449ac0"}]}, + {cerl_inline, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"976487fce255a37192ac2a9258cdacf9"}]}, + {cerl_trees, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a240a6560f194a05956f572e436a6861"}]}, + {compile, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"98a40d5fc6bcd14ac5e516a506b6161f"}]}, + {core_lib, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9bdda978e16a885a17587e575cb2b369"}]}, + {core_lint, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"633c18d069ada94f1f1dfec526de2a2a"}]}, + {core_parse, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"21b745083d46bbe9725eb423f0c73c7a"}]}, + {core_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9940bb6f480fe3438bf97863ad0a5755"}]}, + {core_scan, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1f3ff89deb03f34714390b93e678989c"}]}, + {erl_bifs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"74c0a1563ea88b196dc2a18b1a34ffed"}]}, + {rec_env, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9a6fdcf8ffe126bb2838f86949ced210"}]}, + {sys_core_dsetel, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2c45d53e09f1b3f4e92b8f2ff8adf258"}]}, + {sys_core_fold, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ac092bdc7362a76cda76e27ad5610ec7"}]}, + {sys_core_inline, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4f439077cdab9795b782412d556828fa"}]}, + {sys_pre_attributes, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fc95feafdeca105f38589c4ca7b43532"}]}, + {sys_pre_expand, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4b1c1e3bf39af00ca2988295aa2fbdbb"}]}, + {v3_codegen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"590be66e39ccc3e6260a412ccbc8becd"}]}, + {v3_core, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5997d0774f74e0bad9b8887d24a8bfa3"}]}, + {v3_kernel, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"21a4b3edd53de6b910df1b99219824fc"}]}, + {v3_kernel_pp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1ec5b0e503bcf660d6da8aca9cba9682"}]}, + {v3_life, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"eb4ae7606e9409846d17c5c60751b08f"}]}]}]}}, + {application, + {common_test, + [{description,"The OTP Common Test application"}, + {vsn,"1.7.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/common_test-1.7.2/ebin"}, + {modules, + [{ct, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"1f3d139ac677184b601722b92977b971"}]}, + {ct_config, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0257a2b9a5ed7e176df35b2c39a03a5a"}]}, + {ct_config_plain, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8330eca3a0e4401b3a8f9508343df5cc"}]}, + {ct_config_xml, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3502006ebdcc975febe9d750b28fd2b0"}]}, + {ct_conn_log_h, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5f2e020e7c92f8a7c2c148faf855c9b0"}]}, + {ct_cover, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"76b9cecb99d35c0bf38daa0a7107ddeb"}]}, + {ct_event, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2dfbb0a114e64e69b012a83a29312fe8"}]}, + {ct_framework, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d65dc75bd25fe8c45b3e574d18b0be87"}]}, + {ct_ftp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f60d1979bd240e45fb63deb00c6dae6e"}]}, + {ct_gen_conn, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"abb8aa2681d03230890eb5f3fcaffc6b"}]}, + {ct_groups, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0f3c50d44938374c7e364cef4c905079"}]}, + {ct_hooks, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5fbdbe96e81a1abe94ff6ce0c20c9574"}]}, + {ct_hooks_lock, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6e94b9611b2abb9a665606264fb96c2c"}]}, + {ct_logs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ec22f1709750c55acff646a44502c2db"}]}, + {ct_make, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a2f7f755c88a136bbe56c5415901e217"}]}, + {ct_master, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3d8a8fd7184fd07d8caec68f3653b7f8"}]}, + {ct_master_event, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c497dbbef03d74f085ee633998aecba"}]}, + {ct_master_logs, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a2180f96ad17256256d5ef731ac4d04"}]}, + {ct_master_status, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5d63adbf76f9afa47c576284d77d75a9"}]}, + {ct_netconfc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9bff4907efdc764c267f373d12956eca"}]}, + {ct_repeat, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"b18f0f016143922207ef2dd5577d60dc"}]}, + {ct_rpc, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"51957dfa13552f236dad5ad5ab1f83a0"}]}, + {ct_run, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"bcaaaf893ba391b4ce961c33d48b3b5f"}]}, + {ct_slave, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6b03499c65f734a1ad97e2fce458be92"}]}, + {ct_snmp, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"8a6826b2fdf26d9e775f8352ab15b454"}]}, + {ct_ssh, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"657b8f076669c2db4245acd4bc8254d7"}]}, + {ct_telnet, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"47a92efe0ab4b30fe83d83d8d429a8fe"}]}, + {ct_telnet_client, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"53f220488e09886c1933a060c000dddf"}]}, + {ct_testspec, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"fb607ba1ef1abdab4ba76e654cbd1ce1"}]}, + {ct_util, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e6178d700637198b47134c927348b72b"}]}, + {cth_conn_log, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"113d8b745a6d162d678b03dba49ea048"}]}, + {cth_log_redirect, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e7da913515a3b5841c7da153ce0883cb"}]}, + {cth_surefire, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"3c7c9d2147289740b913895898126f1a"}]}, + {unix_telnet, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d38cf476a56523e6222de857b16e89d0"}]}, + {vts, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a31c45897c8d9fe60fbc9115599edcf7"}]}]}]}}, + {application, + {asn1, + [{description,"The Erlang ASN1 compiler version 2.0.2"}, + {vsn,"2.0.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/asn1-2.0.2/ebin"}, + {modules, + [{asn1_db, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d9af64def8344330927cefe9a2bf9a8a"}]}, + {asn1ct, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"352b6c8edb6cf7dfc39b3b6b6b0a7b35"}]}, + {asn1ct_check, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"5ef3333d2a492df6b90deff919f28b58"}]}, + {asn1ct_constructed_ber_bin_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"41e917757a2c1195b8f86749a5905d64"}]}, + {asn1ct_constructed_per, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"63d5e7bf85a641a2529c81c7888bfb52"}]}, + {asn1ct_eval_ext, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4f5e38c39875f699ad76e07de7b073b7"}]}, + {asn1ct_func, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"ea7118ee0d45ac6641313e378a1733db"}]}, + {asn1ct_gen, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e5b2688ada58f6ed45c2e7e841088e3e"}]}, + {asn1ct_gen_ber_bin_v2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"26db838a5c213d6ec1fe2fdf997a06d1"}]}, + {asn1ct_gen_per, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"a67d91fec991b9f08680c35e95f907f0"}]}, + {asn1ct_imm, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"9288c73c656cf6d60fd74bd7946581b2"}]}, + {asn1ct_name, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"2ea14b79e5eb0ae2c3f08f92241f9c4f"}]}, + {asn1ct_parser2, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"6a7951b400104d9f72bcfbb7405e4404"}]}, + {asn1ct_pretty_format, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"dc1240d0e121f12732f8469cbd23051a"}]}, + {asn1ct_rtt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"f24866e9e2295b4f6c5553ae44d53270"}]}, + {asn1ct_table, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"4d4ec9835f20bc046769547da299363c"}]}, + {asn1ct_tok, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"19908cc77297850954d101491e5eb97d"}]}, + {asn1ct_value, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"388ba3507e46869822607142eef38d70"}]}, + {asn1rt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0160799421ccb619fc6b08099bfaf37b"}]}, + {asn1rt_nif, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"0c579098c3d97270d004e54a94e42daa"}]}]}]}}, + {application, + {appmon, + [{description,"DEVTOOLS CXC 138 16"}, + {vsn,"2.1.14.2"}, + {path, + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/lib/appmon-2.1.14.2/ebin"}, + {modules, + [{appmon, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"97b8d88aecbd66963563a5aa5df0d0bc"}]}, + {appmon_a, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"adb9049e71eb9e2131b6952974302b4c"}]}, + {appmon_dg, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"438c40af3e96404e73904864597dcca0"}]}, + {appmon_lb, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"d851ee67b54dbf0da46cb21a8c1f7bd9"}]}, + {appmon_place, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"192140bb8bc7e74fd7121d8da2019c56"}]}, + {appmon_txt, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"34c7f9da76880b4f7fcfeb0856fcc097"}]}, + {appmon_web, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"449317a9770ff1aa4cf001604bd2261c"}]}, + {process_info, + [{loaded,false}, + {native,false}, + {compiler,"4.9.1"}, + {md5,"e6d86fad6d0d208318c48af00853ec5b"}]}]}]}}]}, + {system_info, + [{allocator, + {glibc, + [2,4], + [sys_alloc,temp_alloc,sl_alloc,std_alloc,ll_alloc, + eheap_alloc,ets_alloc,fix_alloc,binary_alloc,driver_alloc, + mseg_alloc], + [{sys_alloc,[{e,true},{m,libc},{tt,131072},{tp,0}]}, + {temp_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,90}, + {rsbcmt,80}, + {rmbcmt,100}, + {mmbcs,131072}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,10485760}, + {smbcs,1048576}, + {mbcgs,10}, + {acul,0}, + {mbsd,3}, + {as,gf}]}, + {sl_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,80}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,32768}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {mbsd,3}, + {as,gf}]}, + {std_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,20}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,32768}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {as,bf}]}, + {ll_alloc, + [{e,true}, + {t,false}, + {ramv,false}, + {sbct,18446744073709551615}, + {asbcst,0}, + {rsbcst,0}, + {rsbcmt,0}, + {rmbcmt,0}, + {mmbcs,2097112}, + {mmmbc,18446744073709551615}, + {mmsbc,0}, + {lmbcs,10485760}, + {smbcs,1048576}, + {mbcgs,10}, + {acul,0}, + {as,aobf}]}, + {eheap_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,50}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,131072}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {mbsd,3}, + {as,gf}]}, + {ets_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,20}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,32768}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {as,bf}]}, + {fix_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,20}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,32768}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {as,aobf}]}, + {binary_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,20}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,32768}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {as,bf}]}, + {driver_alloc, + [{e,true}, + {t,true}, + {ramv,false}, + {sbct,524288}, + {asbcst,4145152}, + {rsbcst,20}, + {rsbcmt,80}, + {rmbcmt,50}, + {mmbcs,32768}, + {mmmbc,18446744073709551615}, + {mmsbc,256}, + {lmbcs,5242880}, + {smbcs,262144}, + {mbcgs,10}, + {acul,0}, + {as,bf}]}, + {mseg_alloc,[{amcbf,4194304},{rmcbf,20},{mcs,10}]}, + {alloc_util,[{mmc,1024},{ycs,1048576}]}, + {instr,[{m,false},{s,false},{t,false}]}]}}, + {check_io, + [{name,erts_poll}, + {primary,poll}, + {fallback,false}, + {kernel_poll,false}, + {memory_size,49808}, + {total_poll_set_size,2}, + {lazy_updates,true}, + {pending_updates,0}, + {batch_updates,false}, + {concurrent_updates,false}, + {max_fds,1024}]}, + {otp_release,"R16B02"}, + {port_limit,65536}, + {process_limit,262144}, + {smp_support,true}, + {system_version, + "Erlang R16B02 (erts-5.10.3) [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]\n"}, + {system_architecture,"x86_64-unknown-linux-gnu"}, + {threads,true}, + {thread_pool_size,10}, + {{wordsize,internal},8}, + {{wordsize,external},8}, + {{cpu_topology,defined},undefined}, + {{cpu_topology,detected}, + [{node, + [{processor,[{core,{logical,0}},{core,{logical,1}}]}]}, + {node, + [{processor,[{core,{logical,2}},{core,{logical,3}}]}]}]}, + {scheduler_bind_type,unbound}, + {scheduler_bindings,{unbound,unbound,unbound,unbound}}, + {compat_rel,16}, + {schedulers_state,{4,4,4}}, + {build_type,opt}, + {logical_processors,4}, + {logical_processors_online,4}, + {logical_processors_available,4}, + {driver_version,"2.1"}, + {taints,[]}]}, + {erts_compile_info, + [{ldflags,[]}, + {cflags, + "-g -O2 -I/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp_src_R16B02/erts/x86_64-unknown-linux-gnu -DOTP_RELEASE -D_GNU_SOURCE -DERTS_SMP -DHAVE_CONFIG_H -Wall -Wstrict-prototypes -Wmissing-prototypes -Wdeclaration-after-statement -DUSE_THREADS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS "}, + {config_h, + "/* x86_64-unknown-linux-gnu/config.h. Generated by configure. */\n/* config.h.in. Generated from configure.in by autoheader. */\n\n\n#define GHBN_R_SOLARIS 2\n#define GHBN_R_AIX 3\n#define GHBN_R_GLIBC 4\n\n\n/* Define the brk() argument type. */\n#define BRK_ARG_TYPE void *\n\n/* Define the brk() return type. */\n#define BRK_RET_TYPE int\n\n/* Define if you do not have a high-res. timer & want to use times() instead\n */\n/* #undef CORRECT_USING_TIMES */\n\n/* Modern style mcontext_t in MacOSX */\n/* #undef DARWIN_MODERN_MCONTEXT */\n\n/* Define if you need to include rpc/types.h to get INADDR_LOOPBACK defined */\n/* #undef DEF_INADDR_LOOPBACK_IN_RPC_TYPES_H */\n\n/* Define if you need to include winsock2.h to get INADDR_LOOPBACK defined */\n/* #undef DEF_INADDR_LOOPBACK_IN_WINSOCK2_H */\n\n/* Define if you want to disable child waiter thread */\n/* #undef DISABLE_CHILD_WAITER_THREAD */\n\n/* Define if you want to disable vfork. */\n/* #undef DISABLE_VFORK */\n\n/* Define to 1 if your processor stores the words in a double in middle-endian\n format (like some ARMs). */\n/* #undef DOUBLE_MIDDLE_ENDIAN */\n\n/* Define if you want to enable child waiter thread */\n/* #undef ENABLE_CHILD_WAITER_THREAD */\n\n/* Define if sbrk()/brk() wrappers can track malloc()s core memory use */\n/* #undef ERTS_BRK_WRAPPERS_CAN_TRACK_MALLOC */\n\n/* The only reason ERTS_EMU_CMDLINE_FLAGS exists is to force modification of\n config.h when the emulator command line flags are modified by configure */\n#define ERTS_EMU_CMDLINE_FLAGS \" -g -O2 -I/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp_src_R16B02/erts/x86_64-unknown-linux-gnu -DOTP_RELEASE -D_GNU_SOURCE -g -D_GNU_SOURCE -I/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp_src_R16B02/erts/x86_64-unknown-linux-gnu -DOTP_RELEASE -DUSE_THREADS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS -D_POSIX_THREAD_SAFE_FUNCTIONS -Wall -Wstrict-prototypes -Wmissing-prototypes -Wdeclaration-after-statement\"\n\n/* Define if you have kernel poll and want to use it */\n#define ERTS_ENABLE_KERNEL_POLL 1\n\n/* Define if the smp emulator is built */\n#define ERTS_HAVE_SMP_EMU 1\n\n/* Define if dlopen() needs to be called before first call to dlerror() */\n/* #undef ERTS_NEED_DLOPEN_BEFORE_DLERROR */\n\n/* Define if poll() should be used instead of select() */\n#define ERTS_USE_POLL 1\n\n/* Define if __after_morecore_hook can track malloc()s core memory use. */\n#define ERTS___AFTER_MORECORE_HOOK_CAN_TRACK_MALLOC 1\n\n/* Define if bigendian */\n/* #undef ETHR_BIGENDIAN */\n\n/* Define if you get a register shortage with cmpxchg8b and position\n independent code */\n/* #undef ETHR_CMPXCHG8B_REGISTER_SHORTAGE */\n\n/* Define if you want to disable native ethread implementations */\n/* #undef ETHR_DISABLE_NATIVE_IMPLS */\n\n/* Define if you want to force usage of pthread rwlocks */\n/* #undef ETHR_FORCE_PTHREAD_RWLOCK */\n\n/* Define if you use a gcc that supports the double word cmpxchg instruction\n */\n#define ETHR_GCC_HAVE_DW_CMPXCHG_ASM_SUPPORT 1\n\n/* Define if you use a gcc that supports -msse2 and understand sse2 specific\n asm statements */\n/* #undef ETHR_GCC_HAVE_SSE2_ASM_SUPPORT */\n\n/* Define if you have all ethread defines */\n#define ETHR_HAVE_ETHREAD_DEFINES 1\n\n/* Define if you have libatomic_ops atomic operations */\n/* #undef ETHR_HAVE_LIBATOMIC_OPS */\n\n/* Define if you have a linux futex implementation. */\n#define ETHR_HAVE_LINUX_FUTEX 1\n\n/* Define if the pthread.h header file is in pthread/mit directory. */\n/* #undef ETHR_HAVE_MIT_PTHREAD_H */\n\n/* Define if you have the pthread_attr_setguardsize function. */\n#define ETHR_HAVE_PTHREAD_ATTR_SETGUARDSIZE 1\n\n/* Define if you have the <pthread.h> header file. */\n#define ETHR_HAVE_PTHREAD_H 1\n\n/* Define if you have the pthread_rwlockattr_setkind_np() function. */\n#define ETHR_HAVE_PTHREAD_RWLOCKATTR_SETKIND_NP 1\n\n/* Define if you have the PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP rwlock\n attribute. */\n#define ETHR_HAVE_PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 1\n\n/* Define if you have the pthread_spin_lock function. */\n#define ETHR_HAVE_PTHREAD_SPIN_LOCK 1\n\n/* Define if you have the pthread_yield() function. */\n#define ETHR_HAVE_PTHREAD_YIELD 1\n\n/* Define if you have the <sched.h> header file. */\n#define ETHR_HAVE_SCHED_H 1\n\n/* Define if you have the sched_yield() function. */\n#define ETHR_HAVE_SCHED_YIELD 1\n\n/* Define if you have the <sys/time.h> header file. */\n#define ETHR_HAVE_SYS_TIME_H 1\n\n/* Define if you have _InterlockedAnd() */\n/* #undef ETHR_HAVE__INTERLOCKEDAND */\n\n/* Define if you have _InterlockedAnd64() */\n/* #undef ETHR_HAVE__INTERLOCKEDAND64 */\n\n/* Define if you have _InterlockedCompareExchange() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE */\n\n/* Define if you have _InterlockedCompareExchange128() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128 */\n\n/* Define if you have _InterlockedCompareExchange64() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64 */\n\n/* Define if you have _InterlockedCompareExchange64_acq() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ */\n\n/* Define if you have _InterlockedCompareExchange64_rel() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL */\n\n/* Define if you have _InterlockedCompareExchange_acq() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ */\n\n/* Define if you have _InterlockedCompareExchange_rel() */\n/* #undef ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL */\n\n/* Define if you have _InterlockedDecrement() */\n/* #undef ETHR_HAVE__INTERLOCKEDDECREMENT */\n\n/* Define if you have _InterlockedDecrement64() */\n/* #undef ETHR_HAVE__INTERLOCKEDDECREMENT64 */\n\n/* Define if you have _InterlockedDecrement64_rel() */\n/* #undef ETHR_HAVE__INTERLOCKEDDECREMENT64_REL */\n\n/* Define if you have _InterlockedDecrement_rel() */\n/* #undef ETHR_HAVE__INTERLOCKEDDECREMENT_REL */\n\n/* Define if you have _InterlockedExchange() */\n/* #undef ETHR_HAVE__INTERLOCKEDEXCHANGE */\n\n/* Define if you have _InterlockedExchange64() */\n/* #undef ETHR_HAVE__INTERLOCKEDEXCHANGE64 */\n\n/* Define if you have _InterlockedExchangeAdd() */\n/* #undef ETHR_HAVE__INTERLOCKEDEXCHANGEADD */\n\n/* Define if you have _InterlockedExchangeAdd64() */\n/* #undef ETHR_HAVE__INTERLOCKEDEXCHANGEADD64 */\n\n/* Define if you have _InterlockedExchangeAdd64_acq() */\n/* #undef ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ */\n\n/* Define if you have _InterlockedExchangeAdd_acq() */\n/* #undef ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ */\n\n/* Define if you have _InterlockedIncrement() */\n/* #undef ETHR_HAVE__INTERLOCKEDINCREMENT */\n\n/* Define if you have _InterlockedIncrement64() */\n/* #undef ETHR_HAVE__INTERLOCKEDINCREMENT64 */\n\n/* Define if you have _InterlockedIncrement64_acq() */\n/* #undef ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ */\n\n/* Define if you have _InterlockedIncrement_acq() */\n/* #undef ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ */\n\n/* Define if you have _InterlockedOr() */\n/* #undef ETHR_HAVE__INTERLOCKEDOR */\n\n/* Define if you have _InterlockedOr64() */\n/* #undef ETHR_HAVE__INTERLOCKEDOR64 */\n\n/* Define if you have __sync_add_and_fetch() for 32-bit integers */\n#define ETHR_HAVE___SYNC_ADD_AND_FETCH32 1\n\n/* Define if you have __sync_add_and_fetch() for 64-bit integers */\n#define ETHR_HAVE___SYNC_ADD_AND_FETCH64 1\n\n/* Define if you have __sync_fetch_and_and() for 32-bit integers */\n#define ETHR_HAVE___SYNC_FETCH_AND_AND32 1\n\n/* Define if you have __sync_fetch_and_and() for 64-bit integers */\n#define ETHR_HAVE___SYNC_FETCH_AND_AND64 1\n\n/* Define if you have __sync_fetch_and_or() for 32-bit integers */\n#define ETHR_HAVE___SYNC_FETCH_AND_OR32 1\n\n/* Define if you have __sync_fetch_and_or() for 64-bit integers */\n#define ETHR_HAVE___SYNC_FETCH_AND_OR64 1\n\n/* Define if you have __sync_val_compare_and_swap() for 128-bit integers */\n/* #undef ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128 */\n\n/* Define if you have __sync_val_compare_and_swap() for 32-bit integers */\n#define ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32 1\n\n/* Define if you have __sync_val_compare_and_swap() for 64-bit integers */\n#define ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64 1\n\n/* Define if you want to modify the default stack size */\n/* #undef ETHR_MODIFIED_DEFAULT_STACK_SIZE */\n\n/* Define if you need the <nptl/pthread.h> header file. */\n/* #undef ETHR_NEED_NPTL_PTHREAD_H */\n\n/* Define if you prefer gcc native ethread implementations */\n/* #undef ETHR_PREFER_GCC_NATIVE_IMPLS */\n\n/* Define if you prefer libatomic_ops native ethread implementations */\n/* #undef ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS */\n\n/* Define if you have pthreads */\n#define ETHR_PTHREADS 1\n\n/* Define if pthread_yield() returns an int. */\n#define ETHR_PTHREAD_YIELD_RET_INT 1\n\n/* Define if sched_yield() returns an int. */\n#define ETHR_SCHED_YIELD_RET_INT 1\n\n/* Define to the size of AO_t if libatomic_ops is used */\n/* #undef ETHR_SIZEOF_AO_T */\n\n/* Define to the size of int */\n#define ETHR_SIZEOF_INT 4\n\n/* Define to the size of long */\n#define ETHR_SIZEOF_LONG 8\n\n/* Define to the size of long long */\n#define ETHR_SIZEOF_LONG_LONG 8\n\n/* Define to the size of pointers */\n#define ETHR_SIZEOF_PTR 8\n\n/* Define to the size of __int128_t */\n#define ETHR_SIZEOF___INT128_T 16\n\n/* Define to the size of __int64 */\n#define ETHR_SIZEOF___INT64 0\n\n/* Define if only run in Sparc PSO, or TSO mode */\n/* #undef ETHR_SPARC_PSO */\n\n/* Define if run in Sparc RMO, PSO, or TSO mode */\n/* #undef ETHR_SPARC_RMO */\n\n/* Define if only run in Sparc TSO mode */\n/* #undef ETHR_SPARC_TSO */\n\n/* Define if you can safely include both <sys/time.h> and <time.h>. */\n#define ETHR_TIME_WITH_SYS_TIME 1\n\n/* Define if you have win32 threads */\n/* #undef ETHR_WIN32_THREADS */\n\n/* Define if x86/x86_64 out of order instructions should be synchronized */\n/* #undef ETHR_X86_OUT_OF_ORDER */\n\n/* Define if you want to use clock_gettime to simulate gethrtime */\n#define GETHRTIME_WITH_CLOCK_GETTIME 1\n\n/* Define if building a halfword-heap 64bit emulator */\n/* #undef HALFWORD_HEAP_EMULATOR */\n\n/* Define to 1 if you have the <arpa/nameser.h> header file. */\n#define HAVE_ARPA_NAMESER_H 1\n\n/* Define to 1 if you have the `brk' function. */\n#define HAVE_BRK 1\n\n/* define if clock_gettime() works for getting process time */\n/* #undef HAVE_CLOCK_GETTIME */\n\n/* Define if you have a decl of fread that conflicts with int fread */\n#define HAVE_CONFLICTING_FREAD_DECLARATION 1\n\n/* Define if you have a putenv() that stores a copy of the key-value pair */\n/* #undef HAVE_COPYING_PUTENV */\n\n/* Define if you have cpuset_getaffinity/cpuset_setaffinity */\n/* #undef HAVE_CPUSET_xETAFFINITY */\n\n/* Define to 1 if you have the declaration of `getrlimit', and to 0 if you\n don't. */\n#define HAVE_DECL_GETRLIMIT 1\n\n/* Define to 1 if you have the declaration of `IN6ADDR_ANY_INIT', and to 0 if\n you don't. */\n#define HAVE_DECL_IN6ADDR_ANY_INIT 1\n\n/* Define to 1 if you have the declaration of `IN6ADDR_LOOPBACK_INIT', and to\n 0 if you don't. */\n#define HAVE_DECL_IN6ADDR_LOOPBACK_INIT 1\n\n/* Define to 1 if you have the declaration of `IPV6_V6ONLY', and to 0 if you\n don't. */\n#define HAVE_DECL_IPV6_V6ONLY 1\n\n/* Define to 1 if you have the declaration of `posix2time', and to 0 if you\n don't. */\n#define HAVE_DECL_POSIX2TIME 0\n\n/* Define to 1 if you have the declaration of `RLIMIT_STACK', and to 0 if you\n don't. */\n#define HAVE_DECL_RLIMIT_STACK 1\n\n/* Define to 1 if you have the declaration of `SCTPS_BOUND', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTPS_BOUND 0\n\n/* Define to 1 if you have the declaration of `SCTPS_COOKIE_ECHOED', and to 0\n if you don't. */\n#define HAVE_DECL_SCTPS_COOKIE_ECHOED 0\n\n/* Define to 1 if you have the declaration of `SCTPS_COOKIE_WAIT', and to 0 if\n you don't. */\n#define HAVE_DECL_SCTPS_COOKIE_WAIT 0\n\n/* Define to 1 if you have the declaration of `SCTPS_ESTABLISHED', and to 0 if\n you don't. */\n#define HAVE_DECL_SCTPS_ESTABLISHED 0\n\n/* Define to 1 if you have the declaration of `SCTPS_IDLE', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTPS_IDLE 0\n\n/* Define to 1 if you have the declaration of `SCTPS_LISTEN', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTPS_LISTEN 0\n\n/* Define to 1 if you have the declaration of `SCTPS_SHUTDOWN_ACK_SENT', and\n to 0 if you don't. */\n#define HAVE_DECL_SCTPS_SHUTDOWN_ACK_SENT 0\n\n/* Define to 1 if you have the declaration of `SCTPS_SHUTDOWN_PENDING', and to\n 0 if you don't. */\n#define HAVE_DECL_SCTPS_SHUTDOWN_PENDING 0\n\n/* Define to 1 if you have the declaration of `SCTPS_SHUTDOWN_RECEIVED', and\n to 0 if you don't. */\n#define HAVE_DECL_SCTPS_SHUTDOWN_RECEIVED 0\n\n/* Define to 1 if you have the declaration of `SCTPS_SHUTDOWN_SENT', and to 0\n if you don't. */\n#define HAVE_DECL_SCTPS_SHUTDOWN_SENT 0\n\n/* Define to 1 if you have the declaration of `SCTP_ABORT', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_ABORT 1\n\n/* Define to 1 if you have the declaration of `SCTP_ADDR_CONFIRMED', and to 0\n if you don't. */\n#define HAVE_DECL_SCTP_ADDR_CONFIRMED 0\n\n/* Define to 1 if you have the declaration of `SCTP_ADDR_OVER', and to 0 if\n you don't. */\n#define HAVE_DECL_SCTP_ADDR_OVER 1\n\n/* Define to 1 if you have the declaration of `SCTP_BOUND', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_BOUND 0\n\n/* Define to 1 if you have the declaration of `SCTP_CLOSED', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_CLOSED 1\n\n/* Define to 1 if you have the declaration of `SCTP_COOKIE_ECHOED', and to 0\n if you don't. */\n#define HAVE_DECL_SCTP_COOKIE_ECHOED 1\n\n/* Define to 1 if you have the declaration of `SCTP_COOKIE_WAIT', and to 0 if\n you don't. */\n#define HAVE_DECL_SCTP_COOKIE_WAIT 1\n\n/* Define to 1 if you have the declaration of `SCTP_DELAYED_ACK_TIME', and to\n 0 if you don't. */\n#define HAVE_DECL_SCTP_DELAYED_ACK_TIME 1\n\n/* Define to 1 if you have the declaration of `SCTP_EMPTY', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_EMPTY 1\n\n/* Define to 1 if you have the declaration of `SCTP_EOF', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_EOF 1\n\n/* Define to 1 if you have the declaration of `SCTP_ESTABLISHED', and to 0 if\n you don't. */\n#define HAVE_DECL_SCTP_ESTABLISHED 1\n\n/* Define to 1 if you have the declaration of `SCTP_LISTEN', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_LISTEN 0\n\n/* Define to 1 if you have the declaration of `SCTP_SENDALL', and to 0 if you\n don't. */\n#define HAVE_DECL_SCTP_SENDALL 0\n\n/* Define to 1 if you have the declaration of `SCTP_SHUTDOWN_ACK_SENT', and to\n 0 if you don't. */\n#define HAVE_DECL_SCTP_SHUTDOWN_ACK_SENT 1\n\n/* Define to 1 if you have the declaration of `SCTP_SHUTDOWN_PENDING', and to\n 0 if you don't. */\n#define HAVE_DECL_SCTP_SHUTDOWN_PENDING 1\n\n/* Define to 1 if you have the declaration of `SCTP_SHUTDOWN_RECEIVED', and to\n 0 if you don't. */\n#define HAVE_DECL_SCTP_SHUTDOWN_RECEIVED 1\n\n/* Define to 1 if you have the declaration of `SCTP_SHUTDOWN_SENT', and to 0\n if you don't. */\n#define HAVE_DECL_SCTP_SHUTDOWN_SENT 1\n\n/* Define to 1 if you have the declaration of `SCTP_UNORDERED', and to 0 if\n you don't. */\n#define HAVE_DECL_SCTP_UNORDERED 1\n\n/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you\n don't. */\n#define HAVE_DECL_SETRLIMIT 1\n\n/* Define to 1 if you have the declaration of `time2posix', and to 0 if you\n don't. */\n#define HAVE_DECL_TIME2POSIX 0\n\n/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.\n */\n#define HAVE_DIRENT_H 1\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#define HAVE_DLFCN_H 1\n\n/* Define to 1 if you have the `dlopen' function. */\n#define HAVE_DLOPEN 1\n\n/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */\n/* #undef HAVE_DOPRNT */\n\n/* Define if you have the 'end' symbol */\n#define HAVE_END_SYMBOL 1\n\n/* Define if you have a working fallocate() */\n/* #undef HAVE_FALLOCATE */\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#define HAVE_FCNTL_H 1\n\n/* Define to 1 if you have the `fdatasync' function. */\n#define HAVE_FDATASYNC 1\n\n/* Define to 1 if you have the `finite' function. */\n#define HAVE_FINITE 1\n\n/* Define to 1 if you have the `flockfile' function. */\n#define HAVE_FLOCKFILE 1\n\n/* Define to 1 if you have the `fork' function. */\n#define HAVE_FORK 1\n\n/* Define to 1 if you have the `fpsetmask' function. */\n/* #undef HAVE_FPSETMASK */\n\n/* Define to 1 if you have the `fstat' function. */\n#define HAVE_FSTAT 1\n\n/* Define if you have fwrite_unlocked */\n#define HAVE_FWRITE_UNLOCKED 1\n\n/* Define to 1 if you have a good `getaddrinfo' function. */\n#define HAVE_GETADDRINFO 1\n\n/* Define to 1 if you have the `gethostbyname2' function. */\n#define HAVE_GETHOSTBYNAME2 1\n\n/* Define to flavour of gethostbyname_r */\n#define HAVE_GETHOSTBYNAME_R GHBN_R_GLIBC\n\n/* Define to 1 if you have the `gethrtime' function. */\n/* #undef HAVE_GETHRTIME */\n\n/* define if gethrvtime() works and uses ioctl() to /proc/self */\n/* #undef HAVE_GETHRVTIME_PROCFS_IOCTL */\n\n/* Define to 1 if you have the `getifaddrs' function. */\n#define HAVE_GETIFADDRS 1\n\n/* Define to 1 if you have the `getipnodebyaddr' function. */\n/* #undef HAVE_GETIPNODEBYADDR */\n\n/* Define to 1 if you have the `getipnodebyname' function. */\n/* #undef HAVE_GETIPNODEBYNAME */\n\n/* Define to 1 if you have a good `getnameinfo' function. */\n#define HAVE_GETNAMEINFO 1\n\n/* Define to 1 if you have the `gmtime_r' function. */\n#define HAVE_GMTIME_R 1\n\n/* Define to 1 if you have the <ieeefp.h> header file. */\n/* #undef HAVE_IEEEFP_H */\n\n/* Define to 1 if you have the `ieee_handler' function. */\n/* #undef HAVE_IEEE_HANDLER */\n\n/* Define to 1 if you have the <ifaddrs.h> header file. */\n#define HAVE_IFADDRS_H 1\n\n/* Define if ipv6 is present */\n#define HAVE_IN6 1\n\n/* Define to 1 if you have the variable in6addr_any declared. */\n#define HAVE_IN6ADDR_ANY 1\n\n/* Define to 1 if you have the variable in6addr_loopback declared. */\n#define HAVE_IN6ADDR_LOOPBACK 1\n\n/* Define to 1 if you have the `inet_pton' function. */\n#define HAVE_INET_PTON 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#define HAVE_INTTYPES_H 1\n\n/* Early linux used in_addr6 instead of in6_addr, define if you have this */\n/* #undef HAVE_IN_ADDR6_STRUCT */\n\n/* Define to 1 if you have the `isinf' function. */\n#define HAVE_ISINF 1\n\n/* Define to 1 if you have the `isnan' function. */\n#define HAVE_ISNAN 1\n\n/* Define if you have kstat */\n/* #undef HAVE_KSTAT */\n\n/* Define to 1 if you have the <langinfo.h> header file. */\n#define HAVE_LANGINFO_H 1\n\n/* Define to 1 if you have the `dl' library (-ldl). */\n#define HAVE_LIBDL 1\n\n/* Define to 1 if you have the `dlpi' library (-ldlpi). */\n/* #undef HAVE_LIBDLPI */\n\n/* Define to 1 if you have the <libdlpi.h> header file. */\n/* #undef HAVE_LIBDLPI_H */\n\n/* Define to 1 if you have the `inet' library (-linet). */\n/* #undef HAVE_LIBINET */\n\n/* Define to 1 if you have the `m' library (-lm). */\n#define HAVE_LIBM 1\n\n/* Define to 1 if you have the `util' library (-lutil). */\n#define HAVE_LIBUTIL 1\n\n/* Define to 1 if you have the `z' library (-lz). */\n/* #undef HAVE_LIBZ */\n\n/* Define to 1 if you have the <limits.h> header file. */\n#define HAVE_LIMITS_H 1\n\n/* Define to 1 if you have the <linux/falloc.h> header file. */\n/* #undef HAVE_LINUX_FALLOC_H */\n\n/* Define to 1 if you have the `localtime_r' function. */\n#define HAVE_LOCALTIME_R 1\n\n/* Define to 1 if you have the <malloc.h> header file. */\n#define HAVE_MALLOC_H 1\n\n/* Define to 1 if you have the `mallopt' function. */\n#define HAVE_MALLOPT 1\n\n/* Define to 1 if you have the `memcpy' function. */\n#define HAVE_MEMCPY 1\n\n/* Define to 1 if you have the `memmove' function. */\n#define HAVE_MEMMOVE 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#define HAVE_MEMORY_H 1\n\n/* Define if the pthread.h header file is in pthread/mit directory. */\n/* #undef HAVE_MIT_PTHREAD_H */\n\n/* Define to 1 if you have the `mmap' function. */\n#define HAVE_MMAP 1\n\n/* Define to 1 if you have the `mremap' function. */\n#define HAVE_MREMAP 1\n\n/* Define if setsockopt() accepts multicast options */\n#define HAVE_MULTICAST_SUPPORT 1\n\n/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */\n/* #undef HAVE_NDIR_H */\n\n/* Define to 1 if you have the <netpacket/packet.h> header file. */\n#define HAVE_NETPACKET_PACKET_H 1\n\n/* Define to 1 if you have the <net/errno.h> header file. */\n/* #undef HAVE_NET_ERRNO_H */\n\n/* Define to 1 if you have the <net/if_dl.h> header file. */\n/* #undef HAVE_NET_IF_DL_H */\n\n/* Define to 1 if you have the `nl_langinfo' function. */\n#define HAVE_NL_LANGINFO 1\n\n/* Define if you don't have a definition of INADDR_LOOPBACK */\n/* #undef HAVE_NO_INADDR_LOOPBACK */\n\n/* Define to 1 if you have the `openpty' function. */\n#define HAVE_OPENPTY 1\n\n/* Define to 1 if you have the `poll' function. */\n#define HAVE_POLL 1\n\n/* Define to 1 if you have the <poll.h> header file. */\n#define HAVE_POLL_H 1\n\n/* Define to 1 if you have the `posix2time' function. */\n/* #undef HAVE_POSIX2TIME */\n\n/* Define to 1 if you have the `posix_fadvise' function. */\n#define HAVE_POSIX_FADVISE 1\n\n/* Define if you have a working posix_fallocate() */\n/* #undef HAVE_POSIX_FALLOCATE */\n\n/* Define to 1 if you have the `pread' function. */\n#define HAVE_PREAD 1\n\n/* Define if you have processor_bind functionality */\n/* #undef HAVE_PROCESSOR_BIND */\n\n/* Define if you have pset functionality */\n/* #undef HAVE_PSET */\n\n/* Define if you have the <pthread.h> header file. */\n#define HAVE_PTHREAD_H 1\n\n/* Define to 1 if you have the <pty.h> header file. */\n#define HAVE_PTY_H 1\n\n/* Define if you have putc_unlocked */\n#define HAVE_PUTC_UNLOCKED 1\n\n/* Define to 1 if you have the `pwrite' function. */\n#define HAVE_PWRITE 1\n\n/* Define to 1 if you have the `res_gethostbyname' function. */\n/* #undef HAVE_RES_GETHOSTBYNAME */\n\n/* Define to 1 if you have the `sbrk' function. */\n#define HAVE_SBRK 1\n\n/* Define if you have sched_getaffinity/sched_setaffinity */\n#define HAVE_SCHED_xETAFFINITY 1\n\n/* Define to 1 if you have the `sctp_bindx' function. */\n/* #undef HAVE_SCTP_BINDX */\n\n/* Define to 1 if you have the <netinet/sctp.h> header file */\n#define HAVE_SCTP_H 1\n\n/* Define to 1 if you have the `sctp_peeloff' function. */\n/* #undef HAVE_SCTP_PEELOFF */\n\n/* Define to 1 if you have the <sdkddkver.h> header file. */\n/* #undef HAVE_SDKDDKVER_H */\n\n/* Define to 1 if you have the `sendfile' function. */\n#define HAVE_SENDFILE 1\n\n/* Define to 1 if you have the `sendfilev' function. */\n/* #undef HAVE_SENDFILEV */\n\n/* Define to 1 if you have the `setlocale' function. */\n#define HAVE_SETLOCALE 1\n\n/* Define to 1 if you have the `setsid' function. */\n#define HAVE_SETSID 1\n\n/* Define if we have socklen_t */\n#define HAVE_SOCKLEN_T 1\n\n/* define if you have the Solaris/ultrasparc /dev/perfmon interface */\n/* #undef HAVE_SOLARIS_SPARC_PERFMON */\n\n/* Define if you have SO_BSDCOMPAT flag on sockets */\n/* #undef HAVE_SO_BSDCOMPAT */\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#define HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the `strerror' function. */\n#define HAVE_STRERROR 1\n\n/* Define to 1 if you have the `strerror_r' function. */\n#define HAVE_STRERROR_R 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#define HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if you have the `strlcat' function. */\n/* #undef HAVE_STRLCAT */\n\n/* Define to 1 if you have the `strlcpy' function. */\n/* #undef HAVE_STRLCPY */\n\n/* Define to 1 if you have the `strncasecmp' function. */\n#define HAVE_STRNCASECMP 1\n\n/* Define to 1 if `ifr_enaddr' is member of `struct ifreq'. */\n/* #undef HAVE_STRUCT_IFREQ_IFR_ENADDR */\n\n/* Define to 1 if `ifr_hwaddr' is member of `struct ifreq'. */\n#define HAVE_STRUCT_IFREQ_IFR_HWADDR 1\n\n/* Define to 1 if `spp_flags' is member of `struct sctp_paddrparams'. */\n#define HAVE_STRUCT_SCTP_PADDRPARAMS_SPP_FLAGS 1\n\n/* Define to 1 if `spp_pathmtu' is member of `struct sctp_paddrparams'. */\n#define HAVE_STRUCT_SCTP_PADDRPARAMS_SPP_PATHMTU 1\n\n/* Define to 1 if `spp_sackdelay' is member of `struct sctp_paddrparams'. */\n#define HAVE_STRUCT_SCTP_PADDRPARAMS_SPP_SACKDELAY 1\n\n/* Define to 1 if `sre_data' is member of `struct sctp_remote_error'. */\n#define HAVE_STRUCT_SCTP_REMOTE_ERROR_SRE_DATA 1\n\n/* Define to 1 if `ssf_data' is member of `struct sctp_send_failed'. */\n#define HAVE_STRUCT_SCTP_SEND_FAILED_SSF_DATA 1\n\n/* Define to 1 if you have the <syslog.h> header file. */\n#define HAVE_SYSLOG_H 1\n\n/* Define if you have <sys/devpoll.h> header file. */\n/* #undef HAVE_SYS_DEVPOLL_H */\n\n/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.\n */\n/* #undef HAVE_SYS_DIR_H */\n\n/* Define if you have the <sys/epoll.h> header file. */\n#define HAVE_SYS_EPOLL_H 1\n\n/* Define if you have <sys/event.h> header file. */\n/* #undef HAVE_SYS_EVENT_H */\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#define HAVE_SYS_IOCTL_H 1\n\n/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.\n */\n/* #undef HAVE_SYS_NDIR_H */\n\n/* Define to 1 if you have the <sys/resource.h> header file */\n#define HAVE_SYS_RESOURCE_H 1\n\n/* Define to 1 if you have the <sys/sdt.h> header file. */\n/* #undef HAVE_SYS_SDT_H */\n\n/* Define to 1 if you have the <sys/socketio.h> header file. */\n/* #undef HAVE_SYS_SOCKETIO_H */\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#define HAVE_SYS_SOCKET_H 1\n\n/* Define to 1 if you have the <sys/sockio.h> header file. */\n/* #undef HAVE_SYS_SOCKIO_H */\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#define HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/stropts.h> header file. */\n#define HAVE_SYS_STROPTS_H 1\n\n/* Define to 1 if you have the <sys/sysctl.h> header file. */\n#define HAVE_SYS_SYSCTL_H 1\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#define HAVE_SYS_TIME_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#define HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <sys/uio.h> header file. */\n#define HAVE_SYS_UIO_H 1\n\n/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */\n#define HAVE_SYS_WAIT_H 1\n\n/* Define if termcap functions exists */\n#define HAVE_TERMCAP 1\n\n/* Define to 1 if you have the `time2posix' function. */\n/* #undef HAVE_TIME2POSIX */\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#define HAVE_UNISTD_H 1\n\n/* Define to 1 if you have the <util.h> header file. */\n/* #undef HAVE_UTIL_H */\n\n/* Define to 1 if you have the <utmp.h> header file. */\n#define HAVE_UTMP_H 1\n\n/* Define to 1 if you have the `vfork' function. */\n#define HAVE_VFORK 1\n\n/* Define to 1 if you have the <vfork.h> header file. */\n/* #undef HAVE_VFORK_H */\n\n/* Define to 1 if you have the `vprintf' function. */\n#define HAVE_VPRINTF 1\n\n/* Define to 1 if you have a `wcwidth' function. */\n#define HAVE_WCWIDTH 1\n\n/* Define to 1 if you have the <windows.h> header file. */\n/* #undef HAVE_WINDOWS_H */\n\n/* Define to 1 if you have the <winsock2.h> header file. */\n/* #undef HAVE_WINSOCK2_H */\n\n/* Define to 1 if `fork' works. */\n#define HAVE_WORKING_FORK 1\n\n/* Define if you have a working posix_openpt implementation */\n#define HAVE_WORKING_POSIX_OPENPT 1\n\n/* Define to 1 if `vfork' works. */\n#define HAVE_WORKING_VFORK 1\n\n/* Define to 1 if you have the `writev' function. */\n#define HAVE_WRITEV 1\n\n/* Define to 1 if you have the <ws2tcpip.h> header file. */\n/* #undef HAVE_WS2TCPIP_H */\n\n/* Define to 1 if you have the `_brk' function. */\n/* #undef HAVE__BRK */\n\n/* Define if you have the '_end' symbol */\n#define HAVE__END_SYMBOL 1\n\n/* Define to 1 if you have the `_sbrk' function. */\n/* #undef HAVE__SBRK */\n\n/* Define to 1 if you have the `__brk' function. */\n/* #undef HAVE___BRK */\n\n/* Define to 1 if you have the `__sbrk' function. */\n#define HAVE___SBRK 1\n\n/* Define to enable HiPE */\n#define HIPE 1\n\n/* define if h_errno is declared (in some way) in a system header file */\n#define H_ERRNO_DECLARED 1\n\n/* Define if netdb.h needs struct sockaddr_in ans in.h CAN be included before\n */\n#define NETDB_H_NEEDS_IN_H 1\n\n/* Define if floating points exceptions are non-existing/not reliable */\n#define NO_FPE_SIGNALS \n\n/* Defined if no found C compiler can handle jump tables */\n/* #undef NO_JUMP_TABLE */\n\n/* Define if you dont have salen */\n#define NO_SA_LEN 1\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"\"\n\n/* Define if you wish to redefine FD_SETSIZE to be able to select on more fd\n */\n/* #undef REDEFINE_FD_SETSIZE */\n\n/* Define as the return type of signal handlers (`int' or `void'). */\n#define RETSIGTYPE void\n\n/* Define the sbrk() argument type. */\n#define SBRK_ARG_TYPE intptr_t\n\n/* Define the sbrk() return type. */\n#define SBRK_RET_TYPE void *\n\n/* The size of a `AO_t', as computed by sizeof. */\n/* #undef SIZEOF_AO_T */\n\n/* The size of a `char', as computed by sizeof. */\n#define SIZEOF_CHAR 1\n\n/* The size of a `int', as computed by sizeof. */\n#define SIZEOF_INT 4\n\n/* The size of a `long', as computed by sizeof. */\n#define SIZEOF_LONG 8\n\n/* The size of a `long long', as computed by sizeof. */\n#define SIZEOF_LONG_LONG 8\n\n/* The size of a `off_t', as computed by sizeof. */\n#define SIZEOF_OFF_T 8\n\n/* The size of a `short', as computed by sizeof. */\n#define SIZEOF_SHORT 2\n\n/* The size of a `size_t', as computed by sizeof. */\n#define SIZEOF_SIZE_T 8\n\n/* The size of a `time_t', as computed by sizeof. */\n#define SIZEOF_TIME_T 8\n\n/* The size of a `void *', as computed by sizeof. */\n#define SIZEOF_VOID_P 8\n\n/* The size of a `__int128_t', as computed by sizeof. */\n#define SIZEOF___INT128_T 16\n\n/* The size of a `__int64', as computed by sizeof. */\n#define SIZEOF___INT64 0\n\n/* Define to 1 if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* define if the variable sys_errlist is declared in a system header file */\n#define SYS_ERRLIST_DECLARED \n\n/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */\n#define TIME_WITH_SYS_TIME 1\n\n/* Define to 1 if your <sys/time.h> declares `struct tm'. */\n/* #undef TM_IN_SYS_TIME */\n\n/* Define if you want to use dtrace for dynamic tracing */\n/* #undef USE_DTRACE */\n\n/* Define if you want to use dynamic tracing */\n/* #undef USE_DYNAMIC_TRACE */\n\n/* Define if you have matherr() function and struct exception type */\n#define USE_MATHERR 1\n\n/* Define to enable hrvtime() on Linux systems with perfctr extension */\n/* #undef USE_PERFCTR */\n\n/* Define if select() should be used instead of poll() */\n/* #undef USE_SELECT */\n\n/* Define if you want to use systemtap for dynamic tracing */\n/* #undef USE_SYSTEMTAP */\n\n/* Define to enable VM dynamic trace probes */\n/* #undef USE_VM_PROBES */\n\n/* Define if windows.h includes winsock2.h */\n/* #undef WINDOWS_H_INCLUDES_WINSOCK2_H */\n\n/* Define to 1 if your processor stores words with the most significant byte\n first (like Motorola and SPARC, unlike Intel and VAX). */\n/* #undef WORDS_BIGENDIAN */\n\n/* Define to empty if `const' does not conform to ANSI C. */\n/* #undef const */\n\n/* Define to `long' if <sys/types.h> does not define. */\n/* #undef off_t */\n\n/* Define to `int' if <sys/types.h> does not define. */\n/* #undef pid_t */\n\n/* Define to `unsigned' if <sys/types.h> does not define. */\n/* #undef size_t */\n\n/* Define as `fork' if `vfork' does not work. */\n/* #undef vfork */\n\n\n/* Redefine in6_addr. XXX this should be moved to the files where it's used? */\n#ifdef HAVE_IN_ADDR6_STRUCT\n#define in6_addr in_addr6\n#endif\n\n/* Define a reasonable default for INADDR_LOOPBACK */\n/* XXX this should be moved to the files where it's used? */\n#ifdef HAVE_NO_INADDR_LOOPBACK\n#define INADDR_LOOPBACK (u_long)0x7F000001\n#endif\n\n#ifdef REDEFINE_FD_SETSIZE\n#define FD_SETSIZE 1024\n#endif\n\n#ifdef HAVE_GETHRVTIME_PROCFS_IOCTL\n#define HAVE_GETHRVTIME\n#endif\n\n#ifndef HAVE_FINITE\n# if defined(HAVE_ISINF) && defined(HAVE_ISNAN)\n# define USE_ISINF_ISNAN\n# endif\n#endif\n\n#if defined(DEBUG) && defined(USE_THREADS) && !defined(ERTS_ENABLE_LOCK_CHECK)\n#define ERTS_ENABLE_LOCK_CHECK 1\n#endif\n\n"}]}, + {beam_dynamic_libraries, + "\tlibutil.so.1 => /lib64/libutil.so.1 (0x00002b3e06a05000)\n\tlibdl.so.2 => /lib64/libdl.so.2 (0x00002b3e06b08000)\n\tlibm.so.6 => /lib64/libm.so.6 (0x00002b3e06c0c000)\n\tlibncurses.so.5 => /lib64/libncurses.so.5 (0x00002b3e06d62000)\n\tlibpthread.so.0 => /lib64/libpthread.so.0 (0x00002b3e06ec5000)\n\tlibrt.so.1 => /lib64/librt.so.1 (0x00002b3e06fdc000)\n\tlibc.so.6 => /lib64/libc.so.6 (0x00002b3e070e6000)\n\t/lib64/ld-linux-x86-64.so.2 (0x00002b3e068e9000)\n"}, + {environment_erts, + [{"BINDIR", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/erts-5.10.3/bin"}, + {"DIALYZER_EMULATOR",false}, + {"CERL_DETACHED_PROG",false}, + {"EMU","beam"}, + {"ERL_CONSOLE_MODE",false}, + {"ERL_CRASH_DUMP",false}, + {"ERL_CRASH_DUMP_NICE",false}, + {"ERL_CRASH_DUMP_SECONDS",false}, + {"ERL_EPMD_PORT",false}, + {"ERL_EMULATOR_DLL",false}, + {"ERL_FULLSWEEP_AFTER",false}, + {"ERL_LIBS",false}, + {"ERL_MALLOC_LIB",false}, + {"ERL_MAX_PORTS",false}, + {"ERL_MAX_ETS_TABLES",false}, + {"ERL_NO_VFORK",false}, + {"ERL_NO_KERNEL_POLL",false}, + {"ERL_THREAD_POOL_SIZE",false}, + {"ERLC_EMULATOR",false}, + {"ESCRIPT_EMULATOR",false}, + {"HOME","/home/otptest"}, + {"HOMEDRIVE",false}, + {"HOMEPATH",false}, + {"LANG","sv_SE.UTF-8"}, + {"LC_ALL",false}, + {"LC_CTYPE",false}, + {"PATH", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/erts-5.10.3/bin:/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/bin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/otp/patch/bin:/home/otp/obe/bin"}, + {"PROGNAME","erl"}, + {"RELDIR",false}, + {"ROOTDIR", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp"}, + {"TERM","xterm-256color"}, + {"COMSPEC",false}, + {"HEART_COMMAND",false}, + {"RUN_ERL_LOG_ALIVE_MINUTES",false}, + {"RUN_ERL_LOG_ACTIVITY_MINUTES",false}, + {"RUN_ERL_LOG_ALIVE_FORMAT",false}, + {"RUN_ERL_LOG_ALIVE_IN_UTC",false}, + {"RUN_ERL_LOG_GENERATIONS",false}, + {"RUN_ERL_LOG_MAXSIZE",false}, + {"RUN_ERL_DISABLE_FLOWCNTRL",false}, + {"CALLER_DRV_USE_OUTPUTV",false}, + {"ERL_INET_GETHOST_DEBUG",false}, + {"ERL_EFILE_THREAD_SHORT_CIRCUIT",false}, + {"ERL_WINDOW_TITLE",false}, + {"ERL_ABORT_ON_FAILURE",false}, + {"TTYSL_DEBUG_LOG",false}]}, + {environment, + [{"JAVA_ROOT","/usr/lib64/jvm/java"}, + {"COLORTERM","1"}, + {"LC_NAME","sv_SE.UTF-8"}, + {"G_BROKEN_FILENAMES","1"}, + {"LESSCLOSE","lessclose.sh %s %s"}, + {"LC_TIME","sv_SE.UTF-8"}, + {"DISPLAY","localhost:11.0"}, + {"INFOPATH", + "/usr/local/info:/usr/share/info:/usr/info:/opt/gnome/share/info"}, + {"LPDEST","lw5"}, + {"PKG_CONFIG_PATH", + "/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib64/pkgconfig:/usr/share/pkgconfig:/opt/kde3/lib64/pkgconfig:/opt/gnome/lib64/pkgconfig:/opt/gnome/lib64/pkgconfig:/opt/gnome/share/pkgconfig"}, + {"LESSOPEN","lessopen.sh %s"}, + {"XDG_DATA_DIRS", + "/usr/local/share/:/usr/share/:/etc/opt/kde3/share/:/opt/kde3/share/:/opt/gnome/share/"}, + {"ACLOCAL_FLAGS","-I /opt/gnome/share/aclocal"}, + {"PRINTER","lw5"}, + {"VISUAL","vim"}, + {"GTK_PATH64", + "/usr/local/lib64/gtk-2.0:/opt/gnome/lib64/gtk-2.0:/usr/lib64/gtk-2.0"}, + {"CVS_RSH","ssh"}, + {"LOGIN_PROFILE_RUN","true"}, + {"G_FILENAME_ENCODING","@locale,UTF-8,ISO-8859-15,CP1252"}, + {"LESS","-M -I"}, + {"MACHTYPE","x86_64-suse-linux"}, + {"LOGNAME","otptest"}, + {"GTK_PATH", + "/usr/local/lib/gtk-2.0:/opt/gnome/lib/gtk-2.0:/usr/lib/gtk-2.0"}, + {"WINDOWMANAGER","/usr/X11R6/bin/gnome"}, + {"LS_OPTIONS","-N --color=none -T 0"}, + {"LESS_ADVANCED_PREPROCESSOR","no"}, + {"OSTYPE","linux"}, + {"QT_SYSTEM_DIR","/usr/share/desktop-data"}, + {"JDK_HOME","/usr/lib64/jvm/java"}, + {"SHLVL","1"}, + {"HOME","/home/otptest"}, + {"https_proxy","http://www-proxy.ericsson.se:8080"}, + {"SDK_HOME","/usr/lib64/jvm/java"}, + {"LC_MEASUREMENT","sv_SE.UTF-8"}, + {"PYTHONSTARTUP","/etc/pythonstart"}, + {"PROGNAME","erl"}, + {"LANG","sv_SE.UTF-8"}, + {"EDITOR","vim"}, + {"JAVA_HOME","/usr/lib64/jvm/java"}, + {"INPUTRC","/etc/inputrc"}, + {"PWD", "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20"}, + {"LC_IDENTIFICATION","sv_SE.UTF-8"}, + {"JAVA_BINDIR","/usr/lib64/jvm/java/bin"}, + {"SSH_SENDS_LOCALE","yes"}, + {"CPU","x86_64"}, + {"LC_MESSAGES","POSIX"}, + {"MAIL","/var/mail/otptest"}, + {"PATH", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/erts-5.10.3/bin:/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/bin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/otp/patch/bin:/home/otp/obe/bin"}, + {"MINICOM","-c on"}, + {"XDG_CONFIG_DIRS", + "/usr/local/etc/xdg/:/etc/xdg/:/etc/opt/gnome/xdg/"}, + {"CSHEDIT","emacs"}, + {"PAGER","less"}, + {"HOSTTYPE","x86_64"}, + {"ENV","/home/otptest/.bashrc"}, + {"ROOTDIR", "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp"}, + {"XNLSPATH","/usr/X11R6/lib/X11/nls"}, + {"LS_COLORS",[]}, + {"LC_TELEPHONE","sv_SE.UTF-8"}, + {"GROFF_NO_SGR","yes"}, + {"JRE_HOME","/usr/lib64/jvm/java/jre"}, + {"USER","otptest"}, + {"SSH_TTY","/dev/pts/3"}, + {"MORE","-sl"}, + {"LC_NUMERIC","sv_SE.UTF-8"}, + {"BINDIR", + "/ldisk/daily_build/r16b02_opu_c_Muacul100.2013-07-10_20/otp/erts-5.10.3/bin"}, + {"PROFILEREAD","true"}, + {"HISTSIZE","1000"}, + {"HOST","duilin"}, + {"TERM","xterm-256color"}, + {"SHELL","/bin/sh"}, + {"GNOME2_PATH","/usr/local:/opt/gnome:/usr"}, + {"XKEYSYMDB","/usr/X11R6/lib/X11/XKeysymDB"}, + {"HOSTNAME","duilin"}, + {"LC_MONETARY","sv_SE.UTF-8"}, + {"EMU","beam"}, + {"LC_ADDRESS","sv_SE.UTF-8"}, + {"LASER","lw5"}, + {"NNTPSERVER","news"}, + {"INFODIR","/usr/local/info:/usr/share/info:/usr/info"}, + {"MANPATH", + "/usr/local/man:/usr/share/man:/usr/X11R6/man:/opt/gnome/share/man"}, + {"LESSKEY","/etc/lesskey.bin"}, + {"LC_PAPER","sv_SE.UTF-8"}]}]}. diff --git a/lib/runtime_tools/vsn.mk b/lib/runtime_tools/vsn.mk index d9c03b7e25..5faae06b53 100644 --- a/lib/runtime_tools/vsn.mk +++ b/lib/runtime_tools/vsn.mk @@ -1 +1 @@ -RUNTIME_TOOLS_VSN = 1.8.10 +RUNTIME_TOOLS_VSN = 1.8.11 diff --git a/lib/sasl/doc/src/notes.xml b/lib/sasl/doc/src/notes.xml index f54b04c223..a3260a5b93 100644 --- a/lib/sasl/doc/src/notes.xml +++ b/lib/sasl/doc/src/notes.xml @@ -30,6 +30,22 @@ </header> <p>This document describes the changes made to the SASL application.</p> +<section><title>SASL 2.3.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Fix receive support in erl_eval with a BEAM module. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11137</p> + </item> + </list> + </section> + +</section> + <section><title>SASL 2.3.1</title> <section><title>Improvements and New Features</title> diff --git a/lib/sasl/test/systools_SUITE.erl b/lib/sasl/test/systools_SUITE.erl index 367cab1d77..3921b2d3bb 100644 --- a/lib/sasl/test/systools_SUITE.erl +++ b/lib/sasl/test/systools_SUITE.erl @@ -59,6 +59,7 @@ -export([otp_6226_outdir/1]). -export([init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2]). +-export([delete_tree/1]). -import(lists, [foldl/3]). @@ -299,6 +300,11 @@ unicode_script(Config) when is_list(Config) -> %% 3. path (directory name where unicode_app.tgz is extracted) true = lists:member({path,[P1]},Instr), + %% If all is good, delete the unicode dir to avoid lingering files + %% on windows. + rpc:call(Node,code,add_pathz,[filename:dirname(code:which(?MODULE))]), + rpc:call(Node,?MODULE,delete_tree,[UnicodeLibDir]), + ok. unicode_script(cleanup,Config) -> diff --git a/lib/sasl/vsn.mk b/lib/sasl/vsn.mk index 0e52133166..551c833446 100644 --- a/lib/sasl/vsn.mk +++ b/lib/sasl/vsn.mk @@ -1 +1 @@ -SASL_VSN = 2.3.1 +SASL_VSN = 2.3.2 diff --git a/lib/snmp/doc/src/files.mk b/lib/snmp/doc/src/files.mk index 494c550fff..91fd18ca85 100644 --- a/lib/snmp/doc/src/files.mk +++ b/lib/snmp/doc/src/files.mk @@ -2,7 +2,7 @@ # %CopyrightBegin% # -# Copyright Ericsson AB 2001-2011. All Rights Reserved. +# Copyright Ericsson AB 2001-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml index 80de9738f1..21c417f0c1 100644 --- a/lib/snmp/doc/src/notes.xml +++ b/lib/snmp/doc/src/notes.xml @@ -34,6 +34,86 @@ <section> + <title>SNMP Development Toolkit 4.24.1</title> + <p>Version 4.24.1 supports code replacement in runtime from/to + version 4.24, 4.23.1 and 4.23. </p> + + <section> + <title>Improvements and new features</title> + <p>-</p> + +<!-- + <list type="bulleted"> + <item> + <p>[agent,manager] Updated to support the new crypto interface. </p> + <p>Own Id: OTP-11009</p> + </item> + + </list> +--> + + </section> + + <section> + <title>Fixed Bugs and Malfunctions</title> +<!-- + <p>-</p> +--> + + <list type="bulleted"> + <item> + <p>[agent] Reading the value of the vacmViewTreeFamilyMask returns + it in the wrong (internal bitlist) format. </p> + <p>The vacmViewTreeFamilyMask is defined as a bit string in the MIB + (OCTET STRING). Internally a bitlist (list of 1's and 0's, + see <seealso marker="snmp_agent_config_files#vacm">vacm config file</seealso> + for more info) is used. + However, the MIB implementation assumed the latter, effectively + rendering all attempts to read/set masks via SNMP unsuccessful. </p> + <p>Since the mask is used in hot paths (e.g. access permission checks + for each SNMP operation, the bitlist representation of the mask has + benefits (e.g. faster processing). Reading/writing the view mask + objects is less time-critical. Therefore, to fix the issue, convert + between the bitlist (internal) representation and bitstring + (external) when the vacmViewTreeFamilyMask objects are accessed. </p> + <p>Also, the check of the vacm config file was invalid with + regard to the mask value. It was assumed to be a proper oid, which + is not strictly the case (see bitlist above). </p> + <p>Own Id: OTP-11177</p> + <p>Stefan Zegenhagen</p> + </item> + + <item> + <p>[agent] The counter increment function in the local-db was + incorrect. It did not handle counter wrap correctly. </p> + <p>Own Id: OTP-11192</p> + </item> + + </list> + + </section> + + <section> + <title>Incompatibilities</title> + <p>-</p> + +<!-- + <list type="bulleted"> + <item> + <p>[manager] The old Addr-and-Port based API functions, previously + long deprecated and marked for deletion in R16B, has now been + removed. </p> + <p>Own Id: OTP-10027</p> + </item> + + </list> +--> + </section> + + </section> <!-- 4.24.1 --> + + + <section> <title>SNMP Development Toolkit 4.24</title> <p>Version 4.24 supports code replacement in runtime from/to version 4.23.1 and 4.23. </p> diff --git a/lib/snmp/doc/src/ref_man.xml b/lib/snmp/doc/src/ref_man.xml index 628b30b11a..9495486c39 100644 --- a/lib/snmp/doc/src/ref_man.xml +++ b/lib/snmp/doc/src/ref_man.xml @@ -4,7 +4,7 @@ <application xmlns:xi="http://www.w3.org/2001/XInclude"> <header> <copyright> - <year>1996</year><year>2011</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/snmp/doc/src/snmp_agent_config_files.xml b/lib/snmp/doc/src/snmp_agent_config_files.xml index bd5c537522..866b00b77b 100644 --- a/lib/snmp/doc/src/snmp_agent_config_files.xml +++ b/lib/snmp/doc/src/snmp_agent_config_files.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>1997</year><year>2011</year> + <year>1997</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -32,13 +32,15 @@ <file>snmp_agent_config_files.xml</file> </header> <p>All configuration data must be included in configuration files - that are located in the configuration directory. The name of this - directory is given in the <c>config_dir</c> configuration - parameter. These files are read at start-up, and are used to - initialize the SNMPv2-MIB or STANDARD-MIB, SNMP-FRAMEWORK-MIB, - SNMP-MPD-MIB, SNMP-VIEW-BASED-ACM-MIB, SNMP-COMMUNITY-MIB, - SNMP-USER-BASED-SM-MIB, SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB - (refer to the <seealso marker="snmp_agent_funct_descr#management">Management of the Agent</seealso> for a description of the MIBs). </p> + that are located in the configuration directory. The name of this + directory is given in the <c>config_dir</c> configuration + parameter. These files are read at start-up, and are used to + initialize the SNMPv2-MIB or STANDARD-MIB, SNMP-FRAMEWORK-MIB, + SNMP-MPD-MIB, SNMP-VIEW-BASED-ACM-MIB, SNMP-COMMUNITY-MIB, + SNMP-USER-BASED-SM-MIB, SNMP-TARGET-MIB and SNMP-NOTIFICATION-MIB + (refer to the + <seealso marker="snmp_agent_funct_descr#management">Management of the Agent</seealso> + for a description of the MIBs). </p> <p>The files are: </p> <list type="bulleted"> <item> @@ -79,35 +81,35 @@ </item> </list> <p>The directory where the configuration files are found is given as - a parameter to the agent. </p> + a parameter to the agent. </p> <p>The entry format in all files are Erlang terms, separated by a - '<em>.</em>' and a <em>newline</em>. In the following sections, the - formats of these terms are described. Comments may be specified as - ordinary Erlang comments. </p> + '<em>.</em>' and a <em>newline</em>. In the following sections, the + formats of these terms are described. Comments may be specified as + ordinary Erlang comments. </p> <p>Syntax errors in these files are discovered and reported with the - function <c>config_err/2</c> of the error report module at start-up. </p> - + function <c>config_err/2</c> of the error report module at start-up. </p> + + <marker id="agent_information"></marker> + <section> - <marker id="agent_information"></marker> <title>Agent Information</title> <p>The agent information should be stored in a file called - <c>agent.conf</c>. - </p> - <p>Each entry is a tuple of size two: - </p> + <c>agent.conf</c>. </p> + <p>Each entry is a tuple of size two:</p> <p><c>{AgentVariable, Value}.</c></p> <list type="bulleted"> - <item><c>AgentVariable</c> is one of the variables is - SNMP-FRAMEWORK-MIB or one of the internal variables - <c>intAgentUDPPort</c>, which defines which UDP port the agent - listens to, or <c>intAgentIpAddress</c>, which defines the IP - address of the agent. + <item> + <p><c>AgentVariable</c> is one of the variables is + SNMP-FRAMEWORK-MIB or one of the internal variables + <c>intAgentUDPPort</c>, which defines which UDP port the agent + listens to, or <c>intAgentIpAddress</c>, which defines the IP + address of the agent. </p> </item> - <item><c>Value</c> is the value for the variable. + <item> + <p><c>Value</c> is the value for the variable.</p> </item> </list> - <p>The following example shows a <c>agent.conf</c> file: - </p> + <p>The following example shows a <c>agent.conf</c> file: </p> <pre> {intAgentUDPPort, 4000}. {intAgentIpAddress,[141,213,11,24]}. @@ -115,49 +117,47 @@ {snmpEngineMaxPacketSize, 484}. </pre> <p>The value of <c>snmpEngineID</c> is a string, which for a - deployed agent should have a very specific structure. See - RFC 2271/2571 for details. - </p> + deployed agent should have a very specific structure. See + RFC 2271/2571 for details.</p> + + <marker id="context"></marker> </section> <section> - <marker id="context"></marker> <title>Contexts</title> <p>The context information should be stored in a file called - <c>context.conf</c>. The default context <c>""</c> - need not be present. - </p> + <c>context.conf</c>. The default context <c>""</c> + need not be present.</p> <p>Each row defines a context in the agent. This information is - used in the table <c>vacmContextTable</c> in the - SNMP-VIEW-BASED-ACM-MIB. - </p> - <p>Each entry is a term: - </p> + used in the table <c>vacmContextTable</c> in the + SNMP-VIEW-BASED-ACM-MIB.</p> + <p>Each entry is a term:</p> <p><c>ContextName.</c></p> <list type="bulleted"> - <item><c>ContextName</c> is a string. + <item> + <p><c>ContextName</c> is a string.</p> </item> </list> + + <marker id="system_information"></marker> </section> <section> - <marker id="system_information"></marker> <title>System Information</title> <p>The system information should be stored in a file called - <c>standard.conf</c>. - </p> - <p>Each entry is a tuple of size two: - </p> + <c>standard.conf</c>.</p> + <p>Each entry is a tuple of size two:</p> <p><c>{SystemVariable, Value}.</c></p> <list type="bulleted"> - <item><c>SystemVariable</c> is one of the variables in the - system group, or <c>snmpEnableAuthenTraps</c>. + <item> + <p><c>SystemVariable</c> is one of the variables in the + system group, or <c>snmpEnableAuthenTraps</c>. </p> </item> - <item><c>Value</c> is the value for the variable. + <item> + <p><c>Value</c> is the value for the variable. </p> </item> </list> - <p>The following example shows a valid <c>standard.conf</c> file: - </p> + <p>The following example shows a valid <c>standard.conf</c> file: </p> <pre> {sysDescr, "Erlang SNMP agent"}. {sysObjectID, [1,2,3]}. @@ -167,59 +167,60 @@ {snmpEnableAuthenTraps, enabled}. </pre> <p>A value must be provided for all variables, which lack default - values in the MIB. - </p> + values in the MIB. </p> + + <marker id="community"></marker> </section> <section> - <marker id="community"></marker> <title>Communities</title> <p>The community information should be stored in a file called - <c>community.conf</c>. It must be present if the agent is - configured for SNMPv1 or SNMPv2c. - </p> + <c>community.conf</c>. It must be present if the agent is + configured for SNMPv1 or SNMPv2c. </p> <p>An SNMP <em>community</em> is a relationship between an SNMP agent and a set of SNMP managers that defines authentication, access control and proxy characteristics. </p> <p>The corresponding table is <c>snmpCommunityTable</c> in the - SNMP-COMMUNITY-MIB. </p> + SNMP-COMMUNITY-MIB. </p> <p>Each entry is a term: </p> - <p><c>{CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.</c></p> + <p><c>{CommunityIndex, CommunityName, SecurityName, ContextName, TransportTag}.</c> </p> <list type="bulleted"> - <item><c>CommunityIndex</c> is a non-empty string. + <item> + <p><c>CommunityIndex</c> is a non-empty string.</p> </item> - <item><c>CommunityName</c> is a string. + <item> + <p><c>CommunityName</c> is a string.</p> </item> - <item><c>SecurityName</c> is a string. + <item> + <p><c>SecurityName</c> is a string.</p> </item> - <item><c>ContextName</c> is a string. + <item> + <p><c>ContextName</c> is a string.</p> </item> - <item><c>TransportTag</c> is a string. + <item> + <p><c>TransportTag</c> is a string.</p> </item> </list> + + <marker id="vacm"></marker> </section> <section> - <marker id="vacm"></marker> <title>MIB Views for VACM</title> <p>The information about MIB Views for VACM should be stored in a - file called - <c>vacm.conf</c>. - </p> + file called <c>vacm.conf</c>.</p> <p>The corresponding tables are <c>vacmSecurityToGroupTable</c>, - <c>vacmAccessTable</c> and <c>vacmViewTreeFamilyTable</c> in the - SNMP-VIEW-BASED-ACM-MIB. - </p> + <c>vacmAccessTable</c> and <c>vacmViewTreeFamilyTable</c> in the + SNMP-VIEW-BASED-ACM-MIB.</p> <p>Each entry is one of the terms, one entry corresponds to one - row in one of the tables. - </p> + row in one of the tables.</p> <p><c>{vacmSecurityToGroup, SecModel, SecName, GroupName}.</c></p> <p><c>{vacmAccess, GroupName, Prefix, SecModel, SecLevel, Match, ReadView, WriteView, NotifyView}.</c></p> <p><c>{vacmViewTreeFamily, ViewIndex, ViewSubtree, ViewStatus, ViewMask}.</c></p> <list type="bulleted"> <item> <p><c>SecModel</c> is <c>any</c>, <c>v1</c>, <c>v2c</c>, or - <c>usm</c>.</p> + <c>usm</c>.</p> </item> <item> <p><c>SecName</c> is a string.</p> @@ -232,7 +233,7 @@ </item> <item> <p><c>SecLevel</c> is <c>noAuthNoPriv</c>, <c>authNoPriv</c>, - or <c>authPriv</c></p> + or <c>authPriv</c></p> </item> <item> <p><c>Match</c> is <c>prefix</c> or <c>exact</c>.</p> @@ -244,8 +245,7 @@ <p><c>WriteView</c> is a string.</p> </item> <item> - <p><c>NotifyView</c> is a string. - </p> + <p><c>NotifyView</c> is a string.</p> </item> <item> <p><c>ViewIndex</c> is an integer.</p> @@ -258,33 +258,29 @@ </item> <item> <p><c>ViewMask</c> is either <c>null</c> or a list of ones and - zeros. Ones nominate that an exact match is used for this - sub-identifier. Zeros are wild-cards which match any - sub-identifier. If the mask is shorter than the sub-tree, the - tail is regarded as all ones. <c>null</c> is shorthand for a - mask with all ones.</p> + zeros. Ones nominate that an exact match is used for this + sub-identifier. Zeros are wild-cards which match any + sub-identifier. If the mask is shorter than the sub-tree, the + tail is regarded as all ones. <c>null</c> is shorthand for a + mask with all ones. </p> </item> </list> + + <marker id="usm"></marker> </section> <section> - <marker id="usm"></marker> <title>Security data for USM</title> <p>The information about Security data for USM should be stored in a - file called - <c>usm.conf</c>, which must be present if the agent is configured - for SNMPv3. - </p> + file called <c>usm.conf</c>, which must be present if the agent is + configured for SNMPv3. </p> <p>The corresponding table is <c>usmUserTable</c> in the - SNMP-USER-BASED-SM-MIB. - </p> - <p>Each entry is a term: - </p> + SNMP-USER-BASED-SM-MIB.</p> + <p>Each entry is a term:</p> <p><c>{EngineID, UserName, SecName, Clone, AuthP, AuthKeyC, OwnAuthKeyC, PrivP, PrivKeyC, OwnPrivKeyC, Public, AuthKey, PrivKey}.</c></p> <list type="bulleted"> <item> - <p><c>EngineID</c> is a string. - </p> + <p><c>EngineID</c> is a string.</p> </item> <item> <p><c>UserName</c> is a string.</p> @@ -297,7 +293,7 @@ </item> <item> <p><c>AuthP</c> is a <c>usmNoAuthProtocol</c>, - <c>usmHMACMD5AuthProtocol</c>, or <c>usmHMACSHAAuthProtocol</c>.</p> + <c>usmHMACMD5AuthProtocol</c>, or <c>usmHMACSHAAuthProtocol</c>.</p> </item> <item> <p><c>AuthKeyC</c> is a string.</p> @@ -307,7 +303,7 @@ </item> <item> <p><c>PrivP</c> is a <c>usmNoPrivProtocol</c>, - <c>usmDESPrivProtocol</c> or <c>usmAesCfb128Protocol</c>.</p> + <c>usmDESPrivProtocol</c> or <c>usmAesCfb128Protocol</c>.</p> </item> <item> <p><c>PrivKeyC</c> is a string.</p> @@ -319,66 +315,59 @@ <p><c>Public</c> is a string.</p> </item> <item> - <p><c>AuthKey</c> is a list (of integer). This is the User's secret - localized authentication key. It is not visible in the MIB. The length - of this key needs to be 16 if <c>usmHMACMD5AuthProtocol</c> is used, and - 20 if <c>usmHMACSHAAuthProtocol</c> is used.</p> + <p><c>AuthKey</c> is a list (of integer). This is the User's secret + localized authentication key. It is not visible in the MIB. The length + of this key needs to be 16 if <c>usmHMACMD5AuthProtocol</c> is used, + and 20 if <c>usmHMACSHAAuthProtocol</c> is used.</p> </item> <item> <p><c>PrivKey</c> is a list (of integer). This is the User's secret - localized encryption key. It is not visible in the MIB. The length - of this key needs to be 16 if <c>usmDESPrivProtocol</c> or - <c>usmAesCfb128Protocol</c> is used. - </p> + localized encryption key. It is not visible in the MIB. The length + of this key needs to be 16 if <c>usmDESPrivProtocol</c> or + <c>usmAesCfb128Protocol</c> is used. </p> </item> </list> + + <marker id="notify"></marker> </section> <section> - <marker id="notify"></marker> <title>Notify Definitions</title> <p>The information about Notify Definitions should be stored in a - file called - <c>notify.conf</c>. - </p> + file called <c>notify.conf</c>. </p> <p>The corresponding table is <c>snmpNotifyTable</c> in the - SNMP-NOTIFICATION-MIB. - </p> - <p>Each entry is a term: - </p> + SNMP-NOTIFICATION-MIB.</p> + <p>Each entry is a term:</p> <p><c>{NotifyName, Tag, Type}.</c></p> <list type="bulleted"> <item> - <p><c>NotifyName</c> is a unique non-empty string. - </p> + <p><c>NotifyName</c> is a unique non-empty string.</p> </item> <item> - <p><c>Tag</c> is a string. - </p> + <p><c>Tag</c> is a string.</p> </item> <item> - <p><c>Type</c> is <c>trap</c> or <c>inform</c>. - </p> + <p><c>Type</c> is <c>trap</c> or <c>inform</c>.</p> </item> </list> + + <marker id="target_addr"></marker> </section> <section> - <marker id="target_addr"></marker> <title>Target Address Definitions</title> <p>The information about Target Address Definitions should be - stored in a file called <c>target_addr.conf</c>. </p> + stored in a file called <c>target_addr.conf</c>. </p> <p>The corresponding tables are <c>snmpTargetAddrTable</c> in the - SNMP-TARGET-MIB and <c>snmpTargetAddrExtTable</c> in the - SNMP-COMMUNITY-MIB. </p> + SNMP-TARGET-MIB and <c>snmpTargetAddrExtTable</c> in the + SNMP-COMMUNITY-MIB. </p> <p>Each entry is a term: </p> <p><c>{TargetName, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId}.</c> <br></br> or <br></br> <c>{TargetName, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.</c> <br></br> or <br></br> -<c>{TargetName, Domain, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.</c></p> +<c>{TargetName, Domain, Ip, Udp, Timeout, RetryCount, TagList, ParamsName, EngineId, TMask, MaxMessageSize}.</c> </p> <list type="bulleted"> <item> - <p><c>TargetName</c> is a unique non-empty string. - </p> + <p><c>TargetName</c> is a unique non-empty string. </p> </item> <item> <p><c>Domain</c> is one of the atoms: @@ -414,40 +403,37 @@ </item> </list> <p>Note that if <c>EngineId</c> has the value <c>discovery</c>, - the agent cannot send - <c>inform</c> messages to that manager until it has performed the - <em>discovery</em> process with that manager. </p> + the agent cannot send + <c>inform</c> messages to that manager until it has performed the + <em>discovery</em> process with that manager. </p> + + <marker id="target_params"></marker> </section> <section> - <marker id="target_params"></marker> <title>Target Parameters Definitions</title> <p>The information about Target Parameters Definitions should be - stored in a file called <c>target_params.conf</c>. </p> + stored in a file called <c>target_params.conf</c>. </p> <p>The corresponding table is <c>snmpTargetParamsTable</c> in the - SNMP-TARGET-MIB. </p> + SNMP-TARGET-MIB. </p> <p>Each entry is a term: </p> <p><c>{ParamsName, MPModel, SecurityModel, SecurityName, SecurityLevel}.</c></p> <list type="bulleted"> <item> - <p><c>ParamsName</c> is a unique non-empty string. - </p> + <p><c>ParamsName</c> is a unique non-empty string. </p> </item> <item> <p><c>MPModel</c> is <c>v1</c>, <c>v2c</c> or <c>v3</c></p> </item> <item> - <p><c>SecurityModel</c> is <c>v1</c>, <c>v2c</c>, or <c>usm</c>. - </p> + <p><c>SecurityModel</c> is <c>v1</c>, <c>v2c</c>, or <c>usm</c>.</p> </item> <item> - <p><c>SecurityName</c> is a string. - </p> + <p><c>SecurityName</c> is a string.</p> </item> <item> <p><c>SecurityLevel</c> is <c>noAuthNoPriv</c>, <c>authNoPriv</c> - or <c>authPriv</c>. - </p> + or <c>authPriv</c>. </p> </item> </list> </section> diff --git a/lib/snmp/src/agent/depend.mk b/lib/snmp/src/agent/depend.mk index 4b12b66e3b..b4ca8a2d9f 100644 --- a/lib/snmp/src/agent/depend.mk +++ b/lib/snmp/src/agent/depend.mk @@ -2,7 +2,7 @@ # %CopyrightBegin% # -# Copyright Ericsson AB 2004-2012. All Rights Reserved. +# Copyright Ericsson AB 2004-2013. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl index ad9540e886..c0177b1cea 100644 --- a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl +++ b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2012. All Rights Reserved. +%% Copyright Ericsson AB 1999-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -49,6 +49,14 @@ -endif. +-type internal_view_mask() :: null | [internal_view_mask_element()]. +-type internal_view_mask_element() :: 0 | 1. + +-type external_view_mask() :: octet_string(). % At most length of 16 octet +-type octet_string() :: [octet()]. +-type octet() :: byte(). + + %%----------------------------------------------------------------- %% Func: configure/1 %% Args: Dir is the directory where the configuration files are found. @@ -160,14 +168,7 @@ check_vacm({vacmViewTreeFamily, ViewName, Tree, Type, Mask}) -> {ok, TypeVal} = snmp_conf:check_atom(Type, [{included, ?view_included}, {excluded, ?view_excluded}]), - MaskVal = - case (catch snmp_conf:check_atom(Mask, [{null, []}])) of - {error, _} -> - snmp_conf:check_oid(Mask), - Mask; - {ok, X} -> - X - end, + {ok, MaskVal} = snmp_conf:check_imask(Mask), Vacm = {ViewName, Tree, MaskVal, TypeVal, ?'StorageType_nonVolatile', ?'RowStatus_active'}, {ok, {vacmViewTreeFamily, Vacm}}; @@ -194,8 +195,8 @@ init_tabs(Sec2Group, Access, View) -> ok. init_sec2group_table([Row | T]) -> -%% ?vtrace("init security-to-group table: " -%% "~n Row: ~p",[Row]), + %% ?vtrace("init security-to-group table: " + %% "~n Row: ~p",[Row]), Key1 = element(1, Row), Key2 = element(2, Row), Key = [Key1, length(Key2) | Key2], @@ -953,13 +954,23 @@ verify_vacmViewTreeFamilyTable_col(?vacmViewTreeFamilySubtree, Tree) -> wrongValue(?vacmViewTreeFamilySubtree) end; verify_vacmViewTreeFamilyTable_col(?vacmViewTreeFamilyMask, Mask) -> + %% Mask here is in the "external" format. That is, according + %% to the MIB, which means that its an OCTET STRING of max 16 + %% octets. + %% We however store the mask as a list of 1's (exact) and + %% 0's (wildcard), which means we have to convert the mask. case Mask of - null -> []; - [] -> []; + %% The Mask can only have this value if the vacmViewTreeFamilyTable + %% is called locally! + null -> + []; + [] -> + []; _ -> - case (catch snmp_conf:check_oid(Mask)) of - ok -> - Mask; + %% Check and convert to our internal format + case check_mask(Mask) of + {ok, IMask} -> + IMask; _ -> wrongValue(?vacmViewTreeFamilyMask) end @@ -977,6 +988,60 @@ verify_vacmViewTreeFamilyTable_col(_, Val) -> Val. +check_mask(Mask) when is_list(Mask) andalso (length(Mask) =< 16) -> + try + begin + {ok, emask2imask(Mask)} + end + catch + throw:{error, _} -> + {error, {bad_mask, Mask}}; + T:E -> + {error, {bad_mask, Mask, T, E}} + end; +check_mask(BadMask) -> + {error, {bad_mask, BadMask}}. + +-spec emask2imask(EMask :: external_view_mask()) -> + IMask :: internal_view_mask(). + +%% Convert an External Mask (OCTET STRING) to Internal Mask (list of 0 or 1) +emask2imask(EMask) -> + lists:flatten([octet2bits(Octet) || Octet <- EMask]). + +octet2bits(Octet) + when is_integer(Octet) andalso (Octet >= 16#00) andalso (16#FF >= Octet) -> + <<A:1, B:1, C:1, D:1, E:1, F:1, G:1, H:1>> = <<Octet>>, + [A, B, C, D, E, F, G, H]; +octet2bits(BadOctet) -> + throw({error, {bad_octet, BadOctet}}). + +-spec imask2emask(IMask :: internal_view_mask()) -> + EMask :: external_view_mask(). + +%% Convert an Internal Mask (list of 0 or 1) to External Mask (OCTET STRING) +imask2emask(IMask) -> + imask2emask(IMask, []). + +imask2emask([], EMask) -> + lists:reverse(EMask); +imask2emask(IMask, EMask) -> + %% Make sure we have atleast 8 bits + %% (maybe extend with 1's) + IMask2 = + case length(IMask) of + Small when Small < 8 -> + IMask ++ lists:duplicate(8-Small, 1); + _ -> + IMask + end, + %% Extract 8 bits + [A, B, C, D, E, F, G, H | IMaskRest] = IMask2, + <<Octet:8>> = <<A:1, B:1, C:1, D:1, E:1, F:1, G:1, H:1>>, + imask2emask(IMaskRest, [Octet | EMask]). + + + table_next(Name, RestOid) -> snmp_generic:table_next(db(Name), RestOid). @@ -1014,11 +1079,41 @@ stc(vacmSecurityToGroupTable) -> ?vacmSecurityToGroupStorageType; stc(vacmViewTreeFamilyTable) -> ?vacmViewTreeFamilyStorageType. next(Name, RowIndex, Cols) -> - snmp_generic:handle_table_next(db(Name), RowIndex, Cols, - fa(Name), foi(Name), noc(Name)). + Result = snmp_generic:handle_table_next(db(Name), RowIndex, Cols, + fa(Name), foi(Name), noc(Name)), + externalize_next(Name, Result). get(Name, RowIndex, Cols) -> - snmp_generic:handle_table_get(db(Name), RowIndex, Cols, foi(Name)). + Result = snmp_generic:handle_table_get(db(Name), RowIndex, Cols, + foi(Name)), + externalize_get(Name, Cols, Result). + + +externalize_next(Name, Result) when is_list(Result) -> + F = fun({[Col | _] = Idx, Val}) -> {Idx, externalize(Name, Col, Val)}; + (Other) -> Other + end, + [F(R) || R <- Result]; +externalize_next(_, Result) -> + Result. + + +externalize_get(Name, Cols, Result) when is_list(Result) -> + %% Patch returned values + F = fun({Col, {value, Val}}) -> {value, externalize(Name, Col, Val)}; + ({_, Other}) -> Other + end, + %% Merge column numbers and return values. there must be as much + %% return values as there are columns requested. And then patch all values + [F(R) || R <- lists:zip(Cols, Result)]; +externalize_get(_, _, Result) -> + Result. + +externalize(vacmViewTreeFamilyTable, ?vacmViewTreeFamilyMask, Val) -> + imask2emask(Val); +externalize(_, _, Val) -> + Val. + wrongValue(V) -> throw({wrongValue, V}). diff --git a/lib/snmp/src/agent/snmpa_agent_sup.erl b/lib/snmp/src/agent/snmpa_agent_sup.erl index 2805e2dc0d..1c6632e065 100644 --- a/lib/snmp/src/agent/snmpa_agent_sup.erl +++ b/lib/snmp/src/agent/snmpa_agent_sup.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/src/agent/snmpa_local_db.erl b/lib/snmp/src/agent/snmpa_local_db.erl index 2c0cad807a..5198c6ec4e 100644 --- a/lib/snmp/src/agent/snmpa_local_db.erl +++ b/lib/snmp/src/agent/snmpa_local_db.erl @@ -583,7 +583,7 @@ handle_cast({variable_inc, Name, Db, N}, State) -> {value, Val} -> Val; _ -> 0 end, - insert(Db, Name, M+N rem 4294967296, State), + insert(Db, Name, (M+N) rem 4294967296, State), {noreply, State}; handle_cast({verbosity,Verbosity}, State) -> diff --git a/lib/snmp/src/agent/snmpa_target_cache.erl b/lib/snmp/src/agent/snmpa_target_cache.erl index 1fcaf82373..391d711dc5 100644 --- a/lib/snmp/src/agent/snmpa_target_cache.erl +++ b/lib/snmp/src/agent/snmpa_target_cache.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2006-2010. All Rights Reserved. +%% Copyright Ericsson AB 2006-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/src/app/snmp.appup.src b/lib/snmp/src/app/snmp.appup.src index 7ffa4a725d..16b626111b 100644 --- a/lib/snmp/src/app/snmp.appup.src +++ b/lib/snmp/src/app/snmp.appup.src @@ -17,18 +17,44 @@ %% %CopyrightEnd% %% + {"%VSN%", %% ----- U p g r a d e ------------------------------------------------------- +%% Instruction examples: +%% {restart_application, snmp} +%% {load_module, snmp_pdus, soft_purge, soft_purge, []} +%% {update, snmpa_local_db, soft, soft_purge, soft_purge, []} +%% {add_module, snmpm_net_if_mt} + [ + {"4.24", + [ + {load_module, snmp_conf, soft_purge, soft_purge, []}, + {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge, + [snmp_conf]}, + {update, snmpa_local_db, soft, soft_purge, soft_purge, []} + ] + }, {"4.23.1", [{restart_application, snmp}]}, {"4.23", [{restart_application, snmp}]} ], %% ------D o w n g r a d e --------------------------------------------------- +%% Instruction examples: +%% {remove, {snmpm_net_if_mt, soft_purge, soft_purge}} + [ + {"4.24", + [ + {load_module, snmp_conf, soft_purge, soft_purge, []}, + {load_module, snmp_view_based_acm_mib, soft_purge, soft_purge, + [snmp_conf]}, + {update, snmpa_local_db, soft, soft_purge, soft_purge, []} + ] + }, {"4.23.1", [{restart_application, snmp}]}, {"4.23", [{restart_application, snmp}]} ] diff --git a/lib/snmp/src/app/snmp_app.erl b/lib/snmp/src/app/snmp_app.erl index 0cfbb22a5a..28a6fef7e9 100644 --- a/lib/snmp/src/app/snmp_app.erl +++ b/lib/snmp/src/app/snmp_app.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% Copyright Ericsson AB 2003-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/src/manager/snmpm_config.erl b/lib/snmp/src/manager/snmpm_config.erl index 9d687f1d31..736debe544 100644 --- a/lib/snmp/src/manager/snmpm_config.erl +++ b/lib/snmp/src/manager/snmpm_config.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2004-2012. All Rights Reserved. +%% Copyright Ericsson AB 2004-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/src/misc/snmp_conf.erl b/lib/snmp/src/misc/snmp_conf.erl index e1e7fab57b..46625989d5 100644 --- a/lib/snmp/src/misc/snmp_conf.erl +++ b/lib/snmp/src/misc/snmp_conf.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -50,6 +50,7 @@ check_packet_size/1, check_oid/1, + check_imask/1, check_emask/1, check_mp_model/1, check_sec_model/1, check_sec_model/2, check_sec_model/3, @@ -488,6 +489,7 @@ do_check_timer(WaitFor, Factor, Incr, Retry) -> check_integer(Retry, {gte, 0}), ok. + %% --------- all_domains() -> @@ -618,6 +620,37 @@ check_oid(X) -> %% --------- +%% Check a (view) mask in the internal form (all 0 and 1): +check_imask(null) -> + {ok, []}; +check_imask(IMask) when is_list(IMask) -> + do_check_imask(IMask), + {ok, IMask}. + +do_check_imask([0|IMask]) -> + do_check_imask(IMask); +do_check_imask([1|IMask]) -> + do_check_imask(IMask); +do_check_imask([X|_]) -> + error({invalid_internal_mask_element, X}). + + +%% Check a (view) mask in the external form (according to MIB, +%% an OCTET STRING of at most length 16). +check_emask(EMask) when is_list(EMask) andalso (length(EMask) =< 16) -> + do_check_emask(EMask). + +do_check_emask([]) -> + ok; +do_check_emask([X|EMask]) + when is_integer(X) andalso (X >= 16#00) andalso (X =< 16#FF) -> + do_check_emask(EMask); +do_check_emask([X|_]) -> + error({invalid_external_mask_element, X}). + + +%% --------- + all_integer([H|T]) when is_integer(H) -> all_integer(T); all_integer([_H|_T]) -> false; all_integer([]) -> true. diff --git a/lib/snmp/src/misc/snmp_config.erl b/lib/snmp/src/misc/snmp_config.erl index 22fe25941c..945b8719fc 100644 --- a/lib/snmp/src/misc/snmp_config.erl +++ b/lib/snmp/src/misc/snmp_config.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/src/misc/snmp_misc.erl b/lib/snmp/src/misc/snmp_misc.erl index 293b22991b..c36cee2a53 100644 --- a/lib/snmp/src/misc/snmp_misc.erl +++ b/lib/snmp/src/misc/snmp_misc.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/test/Makefile b/lib/snmp/test/Makefile index 546d46a002..f22b7ea8ee 100644 --- a/lib/snmp/test/Makefile +++ b/lib/snmp/test/Makefile @@ -86,7 +86,7 @@ RELSYSDIR = $(RELEASE_PATH)/snmp_test # SNMP FLAGS # ---------------------------------------------------- ifeq ($(SNMP_DEBUG),) - SNMP_DEBUG = d + # SNMP_DEBUG = d endif ifeq ($(SNMP_DEBUG),e) diff --git a/lib/snmp/test/snmp_agent_test_lib.erl b/lib/snmp/test/snmp_agent_test_lib.erl index 11c05fc1db..7e4b713e56 100644 --- a/lib/snmp/test/snmp_agent_test_lib.erl +++ b/lib/snmp/test/snmp_agent_test_lib.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2005-2012. All Rights Reserved. +%% Copyright Ericsson AB 2005-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl index 505332b586..fbb891e40d 100644 --- a/lib/snmp/test/snmp_test_lib.erl +++ b/lib/snmp/test/snmp_test_lib.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2002-2012. All Rights Reserved. +%% Copyright Ericsson AB 2002-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/snmp/vsn.mk b/lib/snmp/vsn.mk index 0e48e7ea56..e987649e11 100644 --- a/lib/snmp/vsn.mk +++ b/lib/snmp/vsn.mk @@ -18,6 +18,6 @@ # %CopyrightEnd% APPLICATION = snmp -SNMP_VSN = 4.24 +SNMP_VSN = 4.24.1 PRE_VSN = APP_VSN = "$(APPLICATION)-$(SNMP_VSN)$(PRE_VSN)" diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml index f65b66a7c5..299dd5058a 100644 --- a/lib/ssh/doc/src/notes.xml +++ b/lib/ssh/doc/src/notes.xml @@ -29,6 +29,58 @@ <file>notes.xml</file> </header> +<section><title>Ssh 2.1.7</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + ssh:daemon will get feeded with an argument even if it is + not a valid expression.</p> + <p> + Own Id: OTP-10975</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Properly ignore everything in lib/ssh/doc/html/. Thanks + to Anthony Ramine.</p> + <p> + Own Id: OTP-10983</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + </list> + </section> + +</section> + <section><title>Ssh 2.1.6</title> <section><title>Fixed Bugs and Malfunctions</title> @@ -143,8 +195,6 @@ </item> </list> </section> - - <section><title>Improvements and New Features</title> <list> <item> @@ -199,7 +249,20 @@ </section> </section> +<section><title>Ssh 2.1.2.1</title> +<section><title>Improvements and New Features</title> + <list> + <item> + <p> + Removed error report in ssh_connection_handler triggered + by badmatch failure.</p> + <p> + Own Id: OTP-11188</p> + </item> + </list> + </section> +</section> <section><title>Ssh 2.1.2</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/ssh/src/ssh.appup.src b/lib/ssh/src/ssh.appup.src index b25e0c9e37..32f7cc470b 100644 --- a/lib/ssh/src/ssh.appup.src +++ b/lib/ssh/src/ssh.appup.src @@ -19,22 +19,12 @@ {"%VSN%", [ - {<<"2.1.4">>, [{load_module, ssh_sftp, soft_purge, soft_purge, []}, - {load_module, ssh_connection_handler, soft_purge, soft_purge, []}]}, - {<<"2.1.3">>, [{restart_application, ssh}]}, - {<<"2.1.2">>, [{restart_application, ssh}]}, - {<<"2.1.1">>, [{restart_application, ssh}]}, - {<<"2.1">>, [{restart_application, ssh}]}, + {<<"2.1\\.*">>, [{restart_application, ssh}]}, {<<"2.0\\.*">>, [{restart_application, ssh}]}, {<<"1\\.*">>, [{restart_application, ssh}]} ], [ - {<<"2.1.4">>, [{load_module, ssh_sftp, soft_purge, soft_purge, []}, - {load_module, ssh_connection_handler, soft_purge, soft_purge, []}]}, - {<<"2.1.3">>, [{restart_application, ssh}]}, - {<<"2.1.2">>, [{restart_application, ssh}]}, - {<<"2.1.1">>, [{restart_application, ssh}]}, - {<<"2.1">>,[{restart_application, ssh}]}, + {<<"2.1\\.*">>,[{restart_application, ssh}]}, {<<"2.0\\.*">>, [{restart_application, ssh}]}, {<<"1\\.*">>, [{restart_application, ssh}]} ] diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl index 3a7aa79d16..7d5478c3f6 100644 --- a/lib/ssh/src/ssh.erl +++ b/lib/ssh/src/ssh.erl @@ -41,11 +41,13 @@ %%-------------------------------------------------------------------- start() -> application:start(crypto), + application:start(asn1), application:start(public_key), application:start(ssh). start(Type) -> application:start(crypto, Type), + application:start(asn1), application:start(public_key, Type), application:start(ssh, Type). diff --git a/lib/ssh/src/ssh_cli.erl b/lib/ssh/src/ssh_cli.erl index 69b1ab186f..54911e757c 100644 --- a/lib/ssh/src/ssh_cli.erl +++ b/lib/ssh/src/ssh_cli.erl @@ -68,7 +68,8 @@ init([Shell]) -> handle_ssh_msg({ssh_cm, _ConnectionManager, {data, _ChannelId, _Type, Data}}, #state{group = Group} = State) -> - Group ! {self(), {data, binary_to_list(Data)}}, + List = binary_to_list(Data), + to_group(List, Group), {ok, State}; handle_ssh_msg({ssh_cm, ConnectionManager, @@ -188,6 +189,22 @@ terminate(_Reason, _State) -> %%% Internal functions %%-------------------------------------------------------------------- +to_group([], _Group) -> + ok; +to_group([$\^C | Tail], Group) -> + exit(Group, interrupt), + to_group(Tail, Group); +to_group(Data, Group) -> + Func = fun(C) -> C /= $\^C end, + Tail = case lists:splitwith(Func, Data) of + {[], Right} -> + Right; + {Left, Right} -> + Group ! {self(), {data, Left}}, + Right + end, + to_group(Tail, Group). + exec(Cmd) -> case eval(parse(scan(Cmd))) of {error, _} -> diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 1c4477aeb3..df6175e27c 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -451,11 +451,12 @@ userauth(#ssh_msg_userauth_failure{authentications = Methodes}, case ssh_auth:userauth_request_msg(Ssh1) of {disconnect, DisconnectMsg, {Msg, Ssh}} -> send_msg(Msg, State), - handle_disconnect(DisconnectMsg, State#state{ssh_params = Ssh}); + handle_disconnect(DisconnectMsg, State#state{ssh_params = Ssh}); {Msg, Ssh} -> send_msg(Msg, State), {next_state, userauth, next_packet(State#state{ssh_params = Ssh})} end; + %% The prefered authentication method failed try next method userauth(#ssh_msg_userauth_failure{}, #state{ssh_params = #ssh{role = client} = Ssh0} = State) -> diff --git a/lib/ssh/src/ssh_file.erl b/lib/ssh/src/ssh_file.erl index f115a32710..21cdedc156 100644 --- a/lib/ssh/src/ssh_file.erl +++ b/lib/ssh/src/ssh_file.erl @@ -315,5 +315,12 @@ default_user_dir()-> {ok,[[Home|_]]} = init:get_argument(home), UserDir = filename:join(Home, ".ssh"), ok = filelib:ensure_dir(filename:join(UserDir, "dummy")), - ok = file:change_mode(UserDir, ?PERM_700), + {ok,Info} = file:read_file_info(UserDir), + #file_info{mode=Mode} = Info, + case (Mode band 8#777) of + ?PERM_700 -> + ok; + _Other -> + ok = file:change_mode(UserDir, ?PERM_700) + end, UserDir. diff --git a/lib/ssh/src/ssh_xfer.erl b/lib/ssh/src/ssh_xfer.erl index 93f9e20663..b299868d41 100644 --- a/lib/ssh/src/ssh_xfer.erl +++ b/lib/ssh/src/ssh_xfer.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2005-2012. All Rights Reserved. +%% Copyright Ericsson AB 2005-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/ssh/vsn.mk b/lib/ssh/vsn.mk index d5ca1cb3fe..231779b75a 100644 --- a/lib/ssh/vsn.mk +++ b/lib/ssh/vsn.mk @@ -1,5 +1,5 @@ #-*-makefile-*- ; force emacs to enter makefile-mode -SSH_VSN = 2.1.6 +SSH_VSN = 2.1.7 APP_VSN = "ssh-$(SSH_VSN)" diff --git a/lib/ssl/doc/src/notes.xml b/lib/ssl/doc/src/notes.xml index a61f52b809..8875d07535 100644 --- a/lib/ssl/doc/src/notes.xml +++ b/lib/ssl/doc/src/notes.xml @@ -26,7 +26,80 @@ </header> <p>This document describes the changes made to the SSL application.</p> - <section><title>SSL 5.2.1</title> + <section><title>SSL 5.3</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Honor the versions option to ssl:connect and ssl:listen.</p> + <p> + Own Id: OTP-10905</p> + </item> + <item> + <p> + Next protocol negotiation with reused sessions will now + succeed</p> + <p> + Own Id: OTP-10909</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Add support for PSK (Pre Shared Key) and SRP (Secure + Remote Password) chipher suits, thanks to Andreas + Schultz.</p> + <p> + Own Id: OTP-10450 Aux Id: kunagi-269 [180] </p> + </item> + <item> + <p> + Fix SSL Next Protocol Negotiation documentation. Thanks + to Julien Barbot.</p> + <p> + Own Id: OTP-10955</p> + </item> + <item> + <p> + Fix ssl_connection to support reading proxy/chain + certificates. Thanks to Valentin Kuznetsov.</p> + <p> + Own Id: OTP-10980</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + </list> + </section> + +</section> + +<section><title>SSL 5.2.1</title> <section><title>Improvements and New Features</title> <list> diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl index 75c17b14db..0c1e47311d 100644 --- a/lib/ssl/src/ssl.erl +++ b/lib/ssl/src/ssl.erl @@ -214,8 +214,8 @@ prf(Socket, Secret, Label, Seed, WantedLength) -> clear_pem_cache() -> tls:clear_pem_cache(). -format_error(Reason) when is_list(Reason) -> - tls:format_error(Reason). +format_error(Error) -> + tls:format_error(Error). random_bytes(N) -> tls:random_bytes(N). diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl index 898b421dff..ec5d793d65 100644 --- a/lib/ssl/src/ssl_cipher.erl +++ b/lib/ssl/src/ssl_cipher.erl @@ -1190,14 +1190,16 @@ hash_size(md5) -> 16; hash_size(sha) -> 20; -hash_size(sha224) -> - 28; +%% Uncomment when adding cipher suite that needs it +%% hash_size(sha224) -> +%% 28; hash_size(sha256) -> 32; hash_size(sha384) -> - 48; -hash_size(sha512) -> - 64. + 48. +%% Uncomment when adding cipher suite that needs it +%% hash_size(sha512) -> +%% 64. %% RFC 5246: 6.2.3.2. CBC Block Cipher %% diff --git a/lib/ssl/src/ssl_manager.erl b/lib/ssl/src/ssl_manager.erl index 1b06e351cf..7af4a68461 100644 --- a/lib/ssl/src/ssl_manager.erl +++ b/lib/ssl/src/ssl_manager.erl @@ -104,7 +104,6 @@ connection_init(Trustedcerts, Role) -> %%-------------------------------------------------------------------- cache_pem_file(File, DbHandle) -> MD5 = crypto:hash(md5, File), - MD5 = crypto:md5(File), case ssl_pkix_db:lookup_cached_pem(DbHandle, MD5) of [{Content,_}] -> {ok, Content}; diff --git a/lib/ssl/src/tls.erl b/lib/ssl/src/tls.erl index fcecf8196f..bb02695c12 100644 --- a/lib/ssl/src/tls.erl +++ b/lib/ssl/src/tls.erl @@ -94,11 +94,13 @@ %%-------------------------------------------------------------------- start() -> application:start(crypto), + application:start(asn1), application:start(public_key), application:start(ssl). start(Type) -> application:start(crypto, Type), + application:start(asn1), application:start(public_key, Type), application:start(ssl, Type). diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl index 6a0461e805..246fecf34a 100644 --- a/lib/ssl/src/tls_connection.erl +++ b/lib/ssl/src/tls_connection.erl @@ -673,8 +673,7 @@ certify_client_key_exchange(#encrypted_premaster_secret{premaster_secret= EncPMS certify_client_key_exchange(#client_diffie_hellman_public{dh_public = ClientPublicDhKey}, #state{negotiated_version = Version, - diffie_hellman_params = #'DHParameter'{prime = P, - base = G} = Params, + diffie_hellman_params = #'DHParameter'{} = Params, diffie_hellman_keys = {_, ServerDhPrivateKey}} = State0) -> case dh_master_secret(Params, ClientPublicDhKey, ServerDhPrivateKey, State0) of #state{} = State1 -> diff --git a/lib/ssl/src/tls_handshake.erl b/lib/ssl/src/tls_handshake.erl index fea75736f7..51fd2e1dc9 100644 --- a/lib/ssl/src/tls_handshake.erl +++ b/lib/ssl/src/tls_handshake.erl @@ -866,7 +866,7 @@ handle_ecc_point_fmt_extension(undefined) -> handle_ecc_point_fmt_extension(_) -> #ec_point_formats{ec_point_format_list = [?ECPOINT_UNCOMPRESSED]}. -handle_ecc_curves_extension(Version, undefined) -> +handle_ecc_curves_extension(_Version, undefined) -> undefined; handle_ecc_curves_extension(Version, _) -> #elliptic_curves{elliptic_curve_list = ssl_tls1:ecc_curves(Version)}. diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl index fed590f0ef..b5cf6d1212 100644 --- a/lib/ssl/test/ssl_basic_SUITE.erl +++ b/lib/ssl/test/ssl_basic_SUITE.erl @@ -190,8 +190,7 @@ init_per_suite(Config0) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), - + ssl:start(), %% make rsa certs using oppenssl Result = (catch make_certs:all(?config(data_dir, Config0), diff --git a/lib/ssl/test/ssl_certificate_verify_SUITE.erl b/lib/ssl/test/ssl_certificate_verify_SUITE.erl index 4e095dc184..f76c55f670 100644 --- a/lib/ssl/test/ssl_certificate_verify_SUITE.erl +++ b/lib/ssl/test/ssl_certificate_verify_SUITE.erl @@ -80,8 +80,7 @@ init_per_suite(Config0) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), - application:start(ssl), + ssl:start(), %% make rsa certs using oppenssl Result = (catch make_certs:all(?config(data_dir, Config0), diff --git a/lib/ssl/test/ssl_npn_handshake_SUITE.erl b/lib/ssl/test/ssl_npn_handshake_SUITE.erl index 7b271c4d5d..30c0a67a36 100644 --- a/lib/ssl/test/ssl_npn_handshake_SUITE.erl +++ b/lib/ssl/test/ssl_npn_handshake_SUITE.erl @@ -69,7 +69,6 @@ init_per_suite(Config) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), ssl:start(), Result = (catch make_certs:all(?config(data_dir, Config), diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl index 5a374e234d..36f7af784d 100644 --- a/lib/ssl/test/ssl_packet_SUITE.erl +++ b/lib/ssl/test/ssl_packet_SUITE.erl @@ -139,7 +139,7 @@ init_per_suite(Config) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), + ssl:start(), Result = (catch make_certs:all(?config(data_dir, Config), ?config(priv_dir, Config))), diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl index 5f5166391f..f95eae51b7 100644 --- a/lib/ssl/test/ssl_payload_SUITE.erl +++ b/lib/ssl/test/ssl_payload_SUITE.erl @@ -71,7 +71,6 @@ init_per_suite(Config) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), ssl:start(), make_certs:all(?config(data_dir, Config), ?config(priv_dir, Config)), ssl_test_lib:cert_options(Config) diff --git a/lib/ssl/test/ssl_session_cache_SUITE.erl b/lib/ssl/test/ssl_session_cache_SUITE.erl index 6cc6c4bdb2..c31f6c2d7d 100644 --- a/lib/ssl/test/ssl_session_cache_SUITE.erl +++ b/lib/ssl/test/ssl_session_cache_SUITE.erl @@ -56,9 +56,7 @@ init_per_suite(Config0) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), ssl:start(), - %% make rsa certs using oppenssl Result = (catch make_certs:all(?config(data_dir, Config0), diff --git a/lib/ssl/test/ssl_to_openssl_SUITE.erl b/lib/ssl/test/ssl_to_openssl_SUITE.erl index 0564b37f1c..019ed58b1b 100644 --- a/lib/ssl/test/ssl_to_openssl_SUITE.erl +++ b/lib/ssl/test/ssl_to_openssl_SUITE.erl @@ -99,7 +99,6 @@ init_per_suite(Config0) -> catch crypto:stop(), try crypto:start() of ok -> - application:start(public_key), ssl:start(), Result = (catch make_certs:all(?config(data_dir, Config0), diff --git a/lib/stdlib/doc/src/c.xml b/lib/stdlib/doc/src/c.xml index 9cd4581a89..f2e3d8fb44 100644 --- a/lib/stdlib/doc/src/c.xml +++ b/lib/stdlib/doc/src/c.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>1996</year><year>2011</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/stdlib/doc/src/erl_eval.xml b/lib/stdlib/doc/src/erl_eval.xml index 24940f8396..fd78788a45 100644 --- a/lib/stdlib/doc/src/erl_eval.xml +++ b/lib/stdlib/doc/src/erl_eval.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>1996</year><year>2011</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/stdlib/doc/src/lists.xml b/lib/stdlib/doc/src/lists.xml index 1aff78f4fc..16f81bdba1 100644 --- a/lib/stdlib/doc/src/lists.xml +++ b/lib/stdlib/doc/src/lists.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>1996</year><year>2012</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/stdlib/doc/src/notes.xml b/lib/stdlib/doc/src/notes.xml index 2ec0d6a60f..38cd44def6 100644 --- a/lib/stdlib/doc/src/notes.xml +++ b/lib/stdlib/doc/src/notes.xml @@ -30,6 +30,179 @@ </header> <p>This document describes the changes made to the STDLIB application.</p> +<section><title>STDLIB 1.19.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> The Erlang scanner no longer accepts floating point + numbers in the input string. </p> + <p> + Own Id: OTP-10990</p> + </item> + <item> + <p> + When converting a faulty binary to a list with + unicode:characters_to_list, the error return value could + contain a faulty "rest", i.e. the io_list of characters + that could not be converted was wrong. This happened only + if input was a sub binary and conversion was from utf8. + This is now corrected.</p> + <p> + Own Id: OTP-11080</p> + </item> + <item> + <p>The type <c>hook_function()</c> has been corrected in + <c>erl_pp</c>, the Erlang Pretty Printer. </p> + <p>The printing of invalid forms, e.g. record field + types, has also been fixed. It has been broken since + R16B. </p> + <p> (Thanks to Tomáš Janoušek.) </p> + <p> + Own Id: OTP-11100</p> + </item> + <item> + <p> + Fix receive support in erl_eval with a BEAM module. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11137</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Delete obsolete note about simple-one-for-one supervisor. + Thanks to Magnus Henoch.</p> + <p> + Own Id: OTP-10938</p> + </item> + <item> + <p> When selecting encoding of a script written in Erlang + (<c>escript</c>) the optional directive on the second + line is now recognized. </p> + <p> + Own Id: OTP-10951</p> + </item> + <item> + <p> The function <c>erl_parse:abstract/2</c> has been + documented. </p> + <p> + Own Id: OTP-10992</p> + </item> + <item> + <p> + Integrate elliptic curve contribution from Andreas + Schultz </p> + <p> + In order to be able to support elliptic curve cipher + suites in SSL/TLS, additions to handle elliptic curve + infrastructure has been added to public_key and crypto.</p> + <p> + This also has resulted in a rewrite of the crypto API to + gain consistency and remove unnecessary overhead. All OTP + applications using crypto has been updated to use the new + API.</p> + <p> + Impact: Elliptic curve cryptography (ECC) offers + equivalent security with smaller key sizes than other + public key algorithms. Smaller key sizes result in + savings for power, memory, bandwidth, and computational + cost that make ECC especially attractive for constrained + environments.</p> + <p> + Own Id: OTP-11009</p> + </item> + <item> + <p> + Added sys:get_state/1,2 and sys:replace_state/2,3. Thanks + to Steve Vinoski.</p> + <p> + Own Id: OTP-11013</p> + </item> + <item> + <p> + Optimizations to gen mechanism. Thanks to Lo�c Hoguin.</p> + <p> + Own Id: OTP-11025</p> + </item> + <item> + <p> + Optimizations to gen.erl. Thanks to Lo�c Hoguin.</p> + <p> + Own Id: OTP-11035</p> + </item> + <item> + <p> + Use erlang:demonitor(Ref, [flush]) where applicable. + Thanks to Lo�c Hoguin.</p> + <p> + Own Id: OTP-11039</p> + </item> + <item> + <p>Erlang source files with non-ASCII characters are now + encoded in UTF-8 (instead of latin1).</p> + <p> + Own Id: OTP-11041 Aux Id: OTP-10907 </p> + </item> + <item> + <p> + Fix rest_for_one and one_for_all restarting a child not + terminated. Thanks to James Fish.</p> + <p> + Own Id: OTP-11042</p> + </item> + <item> + <p> + Fix excessive CPU consumption of timer_server. Thanks to + Aliaksey Kandratsenka.</p> + <p> + Own Id: OTP-11053</p> + </item> + <item> + <p> + Rename and document lists:zf/2 as lists:filtermap/2. + Thanks to Anthony Ramine.</p> + <p> + Own Id: OTP-11078</p> + </item> + <item> + <p> + Fixed an inconsistent state in epp. Thanks to Anthony + Ramine</p> + <p> + Own Id: OTP-11079</p> + </item> + <item> + <p> + c:ls(File) will now print File, similar to ls(1) in Unix. + The error messages have also been improved. (Thanks to + Bengt Kleberg.)</p> + <p> + Own Id: OTP-11108</p> + </item> + <item> + <p> + Support callback attributes in erl_pp. Thanks to Anthony + Ramine.</p> + <p> + Own Id: OTP-11140</p> + </item> + <item> + <p> + Improve erl_lint performance. Thanks to Jos� Valim.</p> + <p> + Own Id: OTP-11143</p> + </item> + </list> + </section> + +</section> + <section><title>STDLIB 1.19.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/stdlib/doc/src/supervisor.xml b/lib/stdlib/doc/src/supervisor.xml index 3f36c58d24..e2c9c14e6a 100644 --- a/lib/stdlib/doc/src/supervisor.xml +++ b/lib/stdlib/doc/src/supervisor.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>1996</year><year>2012</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -371,7 +371,7 @@ child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules} children.</p> <p>If the supervisor is <c>simple_one_for_one</c>, <c><anno>Id</anno></c> - must be the child process' <c>pid()</c>. I the specified + must be the child process' <c>pid()</c>. If the specified process is alive, but is not a child of the given supervisor, the function will return <c>{error,not_found}</c>. If the child specification diff --git a/lib/stdlib/doc/src/sys.xml b/lib/stdlib/doc/src/sys.xml index 0ffc5bc433..b66a6b17bd 100644 --- a/lib/stdlib/doc/src/sys.xml +++ b/lib/stdlib/doc/src/sys.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>1996</year><year>2011</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/stdlib/src/filelib.erl b/lib/stdlib/src/filelib.erl index 42ef3679a2..9ef4954194 100644 --- a/lib/stdlib/src/filelib.erl +++ b/lib/stdlib/src/filelib.erl @@ -41,6 +41,9 @@ -type filename() :: file:name(). -type dirname() :: filename(). +-type filename_all() :: file:name_all(). +-type dirname_all() :: filename_all(). + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec wildcard(Wildcard) -> [file:filename()] when @@ -62,29 +65,29 @@ wildcard(Pattern, Cwd, Mod) ?HANDLE_ERROR(do_wildcard(Pattern, Cwd, Mod)). -spec is_dir(Name) -> boolean() when - Name :: filename() | dirname(). + Name :: filename_all() | dirname_all(). is_dir(Dir) -> do_is_dir(Dir, file). --spec is_dir(file:name(), atom()) -> boolean(). +-spec is_dir(file:name_all(), atom()) -> boolean(). is_dir(Dir, Mod) when is_atom(Mod) -> do_is_dir(Dir, Mod). -spec is_file(Name) -> boolean() when - Name :: filename() | dirname(). + Name :: filename_all() | dirname_all(). is_file(File) -> do_is_file(File, file). --spec is_file(file:name(), atom()) -> boolean(). +-spec is_file(file:name_all(), atom()) -> boolean(). is_file(File, Mod) when is_atom(Mod) -> do_is_file(File, Mod). -spec is_regular(Name) -> boolean() when - Name :: filename(). + Name :: filename_all(). is_regular(File) -> do_is_regular(File, file). --spec is_regular(file:name(), atom()) -> boolean(). +-spec is_regular(file:name_all(), atom()) -> boolean(). is_regular(File, Mod) when is_atom(Mod) -> do_is_regular(File, Mod). @@ -103,16 +106,16 @@ fold_files(Dir, RegExp, Recursive, Fun, Acc, Mod) when is_atom(Mod) -> do_fold_files(Dir, RegExp, Recursive, Fun, Acc, Mod). -spec last_modified(Name) -> file:date_time() | 0 when - Name :: filename() | dirname(). + Name :: filename_all() | dirname_all(). last_modified(File) -> do_last_modified(File, file). --spec last_modified(file:name(), atom()) -> file:date_time() | 0. +-spec last_modified(file:name_all(), atom()) -> file:date_time() | 0. last_modified(File, Mod) when is_atom(Mod) -> do_last_modified(File, Mod). -spec file_size(Filename) -> non_neg_integer() when - Filename :: filename(). + Filename :: filename_all(). file_size(File) -> do_file_size(File, file). @@ -218,7 +221,7 @@ do_file_size(File, Mod) -> %% ensures that the directory name required to create D exists -spec ensure_dir(Name) -> 'ok' | {'error', Reason} when - Name :: filename() | dirname(), + Name :: filename_all() | dirname_all(), Reason :: file:posix(). ensure_dir("/") -> ok; diff --git a/lib/stdlib/src/gen.erl b/lib/stdlib/src/gen.erl index 5df5530ba1..7281549ea7 100644 --- a/lib/stdlib/src/gen.erl +++ b/lib/stdlib/src/gen.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/src/gen_event.erl b/lib/stdlib/src/gen_event.erl index bfebf29080..7629e88fbf 100644 --- a/lib/stdlib/src/gen_event.erl +++ b/lib/stdlib/src/gen_event.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/src/gen_fsm.erl b/lib/stdlib/src/gen_fsm.erl index d9411e58cf..9e9d4ee4bb 100644 --- a/lib/stdlib/src/gen_fsm.erl +++ b/lib/stdlib/src/gen_fsm.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/src/gen_server.erl b/lib/stdlib/src/gen_server.erl index 30a81ade49..b18d3dc0c0 100644 --- a/lib/stdlib/src/gen_server.erl +++ b/lib/stdlib/src/gen_server.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -124,7 +124,7 @@ {noreply, NewState :: term()} | {noreply, NewState :: term(), timeout() | hibernate} | {stop, Reason :: term(), NewState :: term()}. --callback handle_info(Info :: timeout() | term(), State :: term()) -> +-callback handle_info(Info :: timeout | term(), State :: term()) -> {noreply, NewState :: term()} | {noreply, NewState :: term(), timeout() | hibernate} | {stop, Reason :: term(), NewState :: term()}. diff --git a/lib/stdlib/src/io.erl b/lib/stdlib/src/io.erl index 53728237ca..b11d41e2eb 100644 --- a/lib/stdlib/src/io.erl +++ b/lib/stdlib/src/io.erl @@ -40,7 +40,7 @@ %%------------------------------------------------------------------------- -type device() :: atom() | pid(). --type prompt() :: atom() | string(). +-type prompt() :: atom() | unicode:chardata(). %% ErrorDescription is whatever the I/O-server sends. -type server_no_data() :: {'error', ErrorDescription :: term()} | 'eof'. diff --git a/lib/stdlib/src/lists.erl b/lib/stdlib/src/lists.erl index 0c033acd88..b5577165f4 100644 --- a/lib/stdlib/src/lists.erl +++ b/lib/stdlib/src/lists.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl index 54328cd9ff..6d8e25b1de 100644 --- a/lib/stdlib/src/supervisor.erl +++ b/lib/stdlib/src/supervisor.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/src/sys.erl b/lib/stdlib/src/sys.erl index bffeb44179..c186eab940 100644 --- a/lib/stdlib/src/sys.erl +++ b/lib/stdlib/src/sys.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/src/timer.erl b/lib/stdlib/src/timer.erl index e11fb046e9..3cf358630f 100644 --- a/lib/stdlib/src/timer.erl +++ b/lib/stdlib/src/timer.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/c_SUITE.erl b/lib/stdlib/test/c_SUITE.erl index 8c55b616b9..a018db9c91 100644 --- a/lib/stdlib/test/c_SUITE.erl +++ b/lib/stdlib/test/c_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1998-2011. All Rights Reserved. +%% Copyright Ericsson AB 1998-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/gen_event_SUITE.erl b/lib/stdlib/test/gen_event_SUITE.erl index 6be5a299b6..5819ef3890 100644 --- a/lib/stdlib/test/gen_event_SUITE.erl +++ b/lib/stdlib/test/gen_event_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/lists_SUITE.erl b/lib/stdlib/test/lists_SUITE.erl index cd7210f8ec..92253ef5b9 100644 --- a/lib/stdlib/test/lists_SUITE.erl +++ b/lib/stdlib/test/lists_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2011. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/qlc_SUITE_data/join_info_compat.erl b/lib/stdlib/test/qlc_SUITE_data/join_info_compat.erl index b93b907392..a631b9dbcf 100644 --- a/lib/stdlib/test/qlc_SUITE_data/join_info_compat.erl +++ b/lib/stdlib/test/qlc_SUITE_data/join_info_compat.erl @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2011. All Rights Reserved. +%% Copyright Ericsson AB 2008-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/supervisor_3.erl b/lib/stdlib/test/supervisor_3.erl index 31b3037d6f..0023219ff3 100644 --- a/lib/stdlib/test/supervisor_3.erl +++ b/lib/stdlib/test/supervisor_3.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/supervisor_SUITE.erl b/lib/stdlib/test/supervisor_SUITE.erl index ff5be6bb95..ac5a34c3bc 100644 --- a/lib/stdlib/test/supervisor_SUITE.erl +++ b/lib/stdlib/test/supervisor_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2012. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/test/unicode_SUITE.erl b/lib/stdlib/test/unicode_SUITE.erl index 6106a8c444..e2d789bbe6 100644 --- a/lib/stdlib/test/unicode_SUITE.erl +++ b/lib/stdlib/test/unicode_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2011. All Rights Reserved. +%% Copyright Ericsson AB 2008-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/stdlib/vsn.mk b/lib/stdlib/vsn.mk index fbb838c686..ba6f7cdb8a 100644 --- a/lib/stdlib/vsn.mk +++ b/lib/stdlib/vsn.mk @@ -1 +1 @@ -STDLIB_VSN = 1.19.2 +STDLIB_VSN = 1.19.3 diff --git a/lib/test_server/doc/src/notes.xml b/lib/test_server/doc/src/notes.xml index 0eab939a46..c6c166c796 100644 --- a/lib/test_server/doc/src/notes.xml +++ b/lib/test_server/doc/src/notes.xml @@ -32,6 +32,56 @@ <file>notes.xml</file> </header> +<section><title>Test_Server 3.6.2</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + Some unused code related to remote targets is removed, + and documentation is updated.</p> + <p> + Own Id: OTP-10607 Aux Id: kunagi-338 [249] </p> + </item> + <item> + <p> + A bug in test_server_gl caused io requests containing + invalid data (i.e. not unicode:chardata()) to hang, since + no io reply was sent. This has been corrected.</p> + <p> + Own Id: OTP-10991</p> + </item> + <item> + <p> + Common Test would, in case of timetrap error, print a + warning in the log if end_per_testcase wasn't implemented + in the suite, even though it's an optional function. This + printout has been removed.</p> + <p> + Own Id: OTP-11052</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + The '-force_stop' flag to use with time-limited repeats + of test runs can now be used with a new 'skip_rest' + option which causes the rest of the test cases in the + ongoing test job to be skipped when the time limit is + reached. E.g. 'ct_run -spec xxx -duration 010000 + -force_stop skip_rest'</p> + <p> + Own Id: OTP-10856 Aux Id: OTP-10832 </p> + </item> + </list> + </section> + +</section> + <section><title>Test_Server 3.6.1</title> <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/test_server/src/configure.in b/lib/test_server/src/configure.in index b8fddf1481..3815027721 100644 --- a/lib/test_server/src/configure.in +++ b/lib/test_server/src/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script for Erlang. dnl dnl %CopyrightBegin% dnl -dnl Copyright Ericsson AB 1997-2012. All Rights Reserved. +dnl Copyright Ericsson AB 1997-2013. All Rights Reserved. dnl dnl The contents of this file are subject to the Erlang Public License, dnl Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/test_server/src/ts_erl_config.erl b/lib/test_server/src/ts_erl_config.erl index a0fab4e2d2..8cd6a333d8 100644 --- a/lib/test_server/src/ts_erl_config.erl +++ b/lib/test_server/src/ts_erl_config.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1997-2012. All Rights Reserved. +%% Copyright Ericsson AB 1997-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/test_server/src/ts_install_cth.erl b/lib/test_server/src/ts_install_cth.erl index a75cae3c9d..7746bbed6f 100644 --- a/lib/test_server/src/ts_install_cth.erl +++ b/lib/test_server/src/ts_install_cth.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2010-2012. All Rights Reserved. +%% Copyright Ericsson AB 2010-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/test_server/vsn.mk b/lib/test_server/vsn.mk index 0a5c4246f1..1753bbb913 100644 --- a/lib/test_server/vsn.mk +++ b/lib/test_server/vsn.mk @@ -1 +1 @@ -TEST_SERVER_VSN = 3.6.1 +TEST_SERVER_VSN = 3.6.2 diff --git a/lib/tools/doc/src/eprof.xml b/lib/tools/doc/src/eprof.xml index 8397204a43..8b4986297a 100644 --- a/lib/tools/doc/src/eprof.xml +++ b/lib/tools/doc/src/eprof.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>1996</year><year>2012</year> + <year>1996</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/lib/tools/doc/src/notes.xml b/lib/tools/doc/src/notes.xml index 20dc9679f1..05049d7107 100644 --- a/lib/tools/doc/src/notes.xml +++ b/lib/tools/doc/src/notes.xml @@ -30,6 +30,72 @@ </header> <p>This document describes the changes made to the Tools application.</p> +<section><title>Tools 2.6.11</title> + + <section><title>Fixed Bugs and Malfunctions</title> + <list> + <item> + <p> + When cover:stop(Node) was called on a non-existing node, + a process waiting for cover data from the node would hang + forever. This has been corrected.</p> + <p> + Own Id: OTP-10979</p> + </item> + </list> + </section> + + + <section><title>Improvements and New Features</title> + <list> + <item> + <p> + Make cover smarter about finding source from beam.</p> + <p> + In particular, search using the source path in + module_info if the current heuristic fails.</p> + <p> + Own Id: OTP-10902</p> + </item> + <item> + <p> + Remove Flymake dependency in erlang-pkg.el. Thanks to + Magnus Henoch.</p> + <p> + Own Id: OTP-10930</p> + </item> + <item> + <p> + Erlang-mode: Add autoload cookies for file extension + associations. Thanks to Magnus Henoch.</p> + <p> + Own Id: OTP-10999</p> + </item> + <item> + <p> Postscript files no longer needed for the generation + of PDF files have been removed. </p> + <p> + Own Id: OTP-11016</p> + </item> + <item> + <p> + Fix a race condition when there're several applications + in apps directory. Thanks to Manuel Rubio.</p> + <p> + Own Id: OTP-11028</p> + </item> + <item> + <p> + New option for eprof, 'set_on_spawn'. This option was + previously always on and is also the default.</p> + <p> + Own Id: OTP-11144</p> + </item> + </list> + </section> + +</section> + <section><title>Tools 2.6.10</title> <section><title>Improvements and New Features</title> diff --git a/lib/tools/emacs/erlang-skels.el b/lib/tools/emacs/erlang-skels.el index 355b223822..527e812444 100644 --- a/lib/tools/emacs/erlang-skels.el +++ b/lib/tools/emacs/erlang-skels.el @@ -457,7 +457,7 @@ Please see the function `tempo-define-template'.") "handle_info/2," n> "terminate/2, code_change/3])." n n - "-define(SERVER, ?MODULE). " n n + "-define(SERVER, ?MODULE)." n n "-record(state, {})." n n @@ -572,7 +572,7 @@ Please see the function `tempo-define-template'.") "-export([init/1, handle_event/2, handle_call/2, " n> "handle_info/2, terminate/2, code_change/3])." n n - "-define(SERVER, ?MODULE). " n n + "-define(SERVER, ?MODULE)." n n "-record(state, {})." n n diff --git a/lib/tools/src/eprof.erl b/lib/tools/src/eprof.erl index bc9345fa62..bfbbefb473 100644 --- a/lib/tools/src/eprof.erl +++ b/lib/tools/src/eprof.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2010. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/tools/src/fprof.erl b/lib/tools/src/fprof.erl index 877218bda0..75840e54ff 100644 --- a/lib/tools/src/fprof.erl +++ b/lib/tools/src/fprof.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2001-2012. All Rights Reserved. +%% Copyright Ericsson AB 2001-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/tools/test/eprof_SUITE.erl b/lib/tools/test/eprof_SUITE.erl index 148622cf07..26685a6a84 100644 --- a/lib/tools/test/eprof_SUITE.erl +++ b/lib/tools/test/eprof_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2013. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in diff --git a/lib/tools/vsn.mk b/lib/tools/vsn.mk index 4fb2f30e4f..a30b16fc49 100644 --- a/lib/tools/vsn.mk +++ b/lib/tools/vsn.mk @@ -1 +1 @@ -TOOLS_VSN = 2.6.10 +TOOLS_VSN = 2.6.11 diff --git a/lib/wx/aclocal.m4 b/lib/wx/aclocal.m4 index 25f40944e7..46b30a16b3 100644 --- a/lib/wx/aclocal.m4 +++ b/lib/wx/aclocal.m4 @@ -954,6 +954,40 @@ dnl AC_DEFUN(ERL_FIND_ETHR_LIB, [ +AC_ARG_ENABLE(native-ethr-impls, + AS_HELP_STRING([--disable-native-ethr-impls], + [disable native ethread implementations]), +[ case "$enableval" in + no) disable_native_ethr_impls=yes ;; + *) disable_native_ethr_impls=no ;; + esac ], disable_native_ethr_impls=no) + +test "X$disable_native_ethr_impls" = "Xyes" && + AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) + +AC_ARG_ENABLE(x86-out-of-order, + AS_HELP_STRING([--enable-x86-out-of-order], + [enable x86/x84_64 out of order support (default disabled)])) + +AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, + AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], + [prefer gcc native ethread implementations]), +[ case "$enableval" in + yes) enable_prefer_gcc_native_ethr_impls=yes ;; + *) enable_prefer_gcc_native_ethr_impls=no ;; + esac ], enable_prefer_gcc_native_ethr_impls=no) + +test $enable_prefer_gcc_native_ethr_impls = yes && + AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) + +AC_ARG_WITH(libatomic_ops, + AS_HELP_STRING([--with-libatomic_ops=PATH], + [specify and prefer usage of libatomic_ops in the ethread library])) + +AC_ARG_WITH(with_sparc_memory_order, + AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], + [specify sparc memory order (defaults to RMO)])) + LM_CHECK_THR_LIB ERL_INTERNAL_LIBS @@ -1003,40 +1037,44 @@ case "$THR_LIB_NAME" in AC_DEFINE(ETHR_WIN32_THREADS, 1, [Define if you have win32 threads]) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) - ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) - ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) - ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) - ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) - test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes - - ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) - + if test "X$disable_native_ethr_impls" = "Xyes"; then + have_interlocked_op=no + ethr_have_native_atomics=no + else + ETHR_CHK_INTERLOCKED([_InterlockedDecrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT, 1, [Define if you have _InterlockedDecrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement_rel], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT_REL, 1, [Define if you have _InterlockedDecrement_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT, 1, [Define if you have _InterlockedIncrement()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement_acq], [1], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT_ACQ, 1, [Define if you have _InterlockedIncrement_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD, 1, [Define if you have _InterlockedExchangeAdd()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd_acq], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD_ACQ, 1, [Define if you have _InterlockedExchangeAdd_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND, 1, [Define if you have _InterlockedAnd()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR, 1, [Define if you have _InterlockedOr()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange], [2], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE, 1, [Define if you have _InterlockedExchange()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE, 1, [Define if you have _InterlockedCompareExchange()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_acq], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_ACQ, 1, [Define if you have _InterlockedCompareExchange_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange_rel], [3], [long], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE_REL, 1, [Define if you have _InterlockedCompareExchange_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64, 1, [Define if you have _InterlockedDecrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedDecrement64_rel], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDDECREMENT64_REL, 1, [Define if you have _InterlockedDecrement64_rel()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64, 1, [Define if you have _InterlockedIncrement64()])) + ETHR_CHK_INTERLOCKED([_InterlockedIncrement64_acq], [1], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDINCREMENT64_ACQ, 1, [Define if you have _InterlockedIncrement64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64, 1, [Define if you have _InterlockedExchangeAdd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchangeAdd64_acq], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGEADD64_ACQ, 1, [Define if you have _InterlockedExchangeAdd64_acq()])) + ETHR_CHK_INTERLOCKED([_InterlockedAnd64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDAND64, 1, [Define if you have _InterlockedAnd64()])) + ETHR_CHK_INTERLOCKED([_InterlockedOr64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDOR64, 1, [Define if you have _InterlockedOr64()])) + ETHR_CHK_INTERLOCKED([_InterlockedExchange64], [2], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDEXCHANGE64, 1, [Define if you have _InterlockedExchange64()])) + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64, 1, [Define if you have _InterlockedCompareExchange64()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_acq], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_ACQ, 1, [Define if you have _InterlockedCompareExchange64_acq()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange64_rel], [3], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE64_REL, 1, [Define if you have _InterlockedCompareExchange64_rel()])) + test "$have_interlocked_op" = "yes" && ethr_have_native_atomics=yes + + ETHR_CHK_INTERLOCKED([_InterlockedCompareExchange128], [4], [__int64], AC_DEFINE_UNQUOTED(ETHR_HAVE__INTERLOCKEDCOMPAREEXCHANGE128, 1, [Define if you have _InterlockedCompareExchange128()])) + fi test "$ethr_have_native_atomics" = "yes" && ethr_have_native_spinlock=yes ;; @@ -1303,93 +1341,98 @@ case "$THR_LIB_NAME" in int128="__int128_t" fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + if test "X$disable_native_ethr_impls" = "Xyes"; then + ethr_have_native_atomics=no + else + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32, 1, [Define if you have __sync_val_compare_and_swap() for 32-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH32, 1, [Define if you have __sync_add_and_fetch() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND32, 1, [Define if you have __sync_fetch_and_and() for 32-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [32], [$int32], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR32, 1, [Define if you have __sync_fetch_and_or() for 32-bit integers])) + + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) + test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes + ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) + ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + + if test $int128 != no; then + ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) + fi - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64, 1, [Define if you have __sync_val_compare_and_swap() for 64-bit integers])) - test "$have_sync_op" = "yes" && ethr_have_native_atomics=yes - ETHR_CHK_SYNC_OP([__sync_add_and_fetch], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_ADD_AND_FETCH64, 1, [Define if you have __sync_add_and_fetch() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_and], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_AND64, 1, [Define if you have __sync_fetch_and_and() for 64-bit integers])) - ETHR_CHK_SYNC_OP([__sync_fetch_and_or], [2], [64], [$int64], AC_DEFINE(ETHR_HAVE___SYNC_FETCH_AND_OR64, 1, [Define if you have __sync_fetch_and_or() for 64-bit integers])) + AC_MSG_CHECKING([for a usable libatomic_ops implementation]) + case "x$with_libatomic_ops" in + xno | xyes | x) + libatomic_ops_include= + ;; + *) + if test -d "${with_libatomic_ops}/include"; then + libatomic_ops_include="-I$with_libatomic_ops/include" + CPPFLAGS="$CPPFLAGS $libatomic_ops_include" + else + AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) + fi;; + esac + ethr_have_libatomic_ops=no + AC_TRY_LINK([#include "atomic_ops.h"], + [ + volatile AO_t x; + AO_t y; + int z; + + AO_nop_full(); + AO_store(&x, (AO_t) 0); + z = AO_load(&x); + z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); + ], + [ethr_have_native_atomics=yes + ethr_have_libatomic_ops=yes]) + AC_MSG_RESULT([$ethr_have_libatomic_ops]) + if test $ethr_have_libatomic_ops = yes; then + AC_CHECK_SIZEOF(AO_t, , + [ + #include <stdio.h> + #include "atomic_ops.h" + ]) + AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) + + AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) + if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) + fi + ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" + elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then + AC_MSG_ERROR([No usable libatomic_ops implementation found]) + fi - if test $int128 != no; then - ETHR_CHK_SYNC_OP([__sync_val_compare_and_swap], [3], [128], [$int128], AC_DEFINE(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP128, 1, [Define if you have __sync_val_compare_and_swap() for 128-bit integers])) - fi + case "$host_cpu" in + sparc | sun4u | sparc64 | sun4v) + case "$with_sparc_memory_order" in + "TSO") + AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; + "PSO") + AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; + "RMO"|"") + AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; + *) + AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; + esac + ethr_have_native_atomics=yes;; + i86pc | i*86 | x86_64 | amd64) + if test "$enable_x86_out_of_order" = "yes"; then + AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) + fi + ethr_have_native_atomics=yes;; + macppc | ppc | powerpc | "Power Macintosh") + ethr_have_native_atomics=yes;; + tile) + ethr_have_native_atomics=yes;; + *) + ;; + esac - AC_MSG_CHECKING([for a usable libatomic_ops implementation]) - case "x$with_libatomic_ops" in - xno | xyes | x) - libatomic_ops_include= - ;; - *) - if test -d "${with_libatomic_ops}/include"; then - libatomic_ops_include="-I$with_libatomic_ops/include" - CPPFLAGS="$CPPFLAGS $libatomic_ops_include" - else - AC_MSG_ERROR([libatomic_ops include directory $with_libatomic_ops/include not found]) - fi;; - esac - ethr_have_libatomic_ops=no - AC_TRY_LINK([#include "atomic_ops.h"], - [ - volatile AO_t x; - AO_t y; - int z; - - AO_nop_full(); - AO_store(&x, (AO_t) 0); - z = AO_load(&x); - z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1); - ], - [ethr_have_native_atomics=yes - ethr_have_libatomic_ops=yes]) - AC_MSG_RESULT([$ethr_have_libatomic_ops]) - if test $ethr_have_libatomic_ops = yes; then - AC_CHECK_SIZEOF(AO_t, , - [ - #include <stdio.h> - #include "atomic_ops.h" - ]) - AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used]) - - AC_DEFINE(ETHR_HAVE_LIBATOMIC_OPS, 1, [Define if you have libatomic_ops atomic operations]) - if test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_DEFINE(ETHR_PREFER_LIBATOMIC_OPS_NATIVE_IMPLS, 1, [Define if you prefer libatomic_ops native ethread implementations]) - fi - ETHR_DEFS="$ETHR_DEFS $libatomic_ops_include" - elif test "x$with_libatomic_ops" != "xno" && test "x$with_libatomic_ops" != "x"; then - AC_MSG_ERROR([No usable libatomic_ops implementation found]) fi - case "$host_cpu" in - sparc | sun4u | sparc64 | sun4v) - case "$with_sparc_memory_order" in - "TSO") - AC_DEFINE(ETHR_SPARC_TSO, 1, [Define if only run in Sparc TSO mode]);; - "PSO") - AC_DEFINE(ETHR_SPARC_PSO, 1, [Define if only run in Sparc PSO, or TSO mode]);; - "RMO"|"") - AC_DEFINE(ETHR_SPARC_RMO, 1, [Define if run in Sparc RMO, PSO, or TSO mode]);; - *) - AC_MSG_ERROR([Unsupported Sparc memory order: $with_sparc_memory_order]);; - esac - ethr_have_native_atomics=yes;; - i86pc | i*86 | x86_64 | amd64) - if test "$enable_x86_out_of_order" = "yes"; then - AC_DEFINE(ETHR_X86_OUT_OF_ORDER, 1, [Define if x86/x86_64 out of order instructions should be synchronized]) - fi - ethr_have_native_atomics=yes;; - macppc | ppc | "Power Macintosh") - ethr_have_native_atomics=yes;; - tile) - ethr_have_native_atomics=yes;; - *) - ;; - esac - test ethr_have_native_atomics = "yes" && ethr_have_native_spinlock=yes dnl Restore LIBS @@ -1451,40 +1494,6 @@ esac AC_C_DOUBLE_MIDDLE_ENDIAN -AC_ARG_ENABLE(native-ethr-impls, - AS_HELP_STRING([--disable-native-ethr-impls], - [disable native ethread implementations]), -[ case "$enableval" in - no) disable_native_ethr_impls=yes ;; - *) disable_native_ethr_impls=no ;; - esac ], disable_native_ethr_impls=no) - -AC_ARG_ENABLE(x86-out-of-order, - AS_HELP_STRING([--enable-x86-out-of-order], - [enable x86/x84_64 out of order support (default disabled)])) - -test "X$disable_native_ethr_impls" = "Xyes" && - AC_DEFINE(ETHR_DISABLE_NATIVE_IMPLS, 1, [Define if you want to disable native ethread implementations]) - -AC_ARG_ENABLE(prefer-gcc-native-ethr-impls, - AS_HELP_STRING([--enable-prefer-gcc-native-ethr-impls], - [prefer gcc native ethread implementations]), -[ case "$enableval" in - yes) enable_prefer_gcc_native_ethr_impls=yes ;; - *) enable_prefer_gcc_native_ethr_impls=no ;; - esac ], enable_prefer_gcc_native_ethr_impls=no) - -test $enable_prefer_gcc_native_ethr_impls = yes && - AC_DEFINE(ETHR_PREFER_GCC_NATIVE_IMPLS, 1, [Define if you prefer gcc native ethread implementations]) - -AC_ARG_WITH(libatomic_ops, - AS_HELP_STRING([--with-libatomic_ops=PATH], - [specify and prefer usage of libatomic_ops in the ethread library])) - -AC_ARG_WITH(with_sparc_memory_order, - AS_HELP_STRING([--with-sparc-memory-order=TSO|PSO|RMO], - [specify sparc memory order (defaults to RMO)])) - ETHR_X86_SSE2_ASM=no case "$GCC-$ac_cv_sizeof_void_p-$host_cpu" in yes-4-i86pc | yes-4-i*86 | yes-4-x86_64 | yes-4-amd64) diff --git a/system/doc/design_principles/fsm.xml b/system/doc/design_principles/fsm.xml index 7decbb48cd..803283b37a 100644 --- a/system/doc/design_principles/fsm.xml +++ b/system/doc/design_principles/fsm.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>1997</year><year>2011</year> + <year>1997</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> diff --git a/system/doc/reference_manual/introduction.xml b/system/doc/reference_manual/introduction.xml index 7737c34469..d143a154b6 100644 --- a/system/doc/reference_manual/introduction.xml +++ b/system/doc/reference_manual/introduction.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2003</year><year>2012</year> + <year>2003</year><year>2013</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -75,7 +75,7 @@ <title>Reserved Words</title> <p>The following are reserved words in Erlang:</p> <p>after and andalso band begin bnot bor bsl bsr bxor case catch - cond div end fun if let not of or orelse query receive rem try + cond div end fun if let not of or orelse receive rem try when xor</p> </section> diff --git a/system/doc/top/templates/index.html.src b/system/doc/top/templates/index.html.src index 180dd73b6f..a176bc9a14 100644 --- a/system/doc/top/templates/index.html.src +++ b/system/doc/top/templates/index.html.src @@ -2,7 +2,7 @@ <!-- %CopyrightBegin% -Copyright Ericsson AB 2009-2012. All Rights Reserved. +Copyright Ericsson AB 2009-2013. All Rights Reserved. The contents of this file are subject to the Erlang Public License, Version 1.1, (the "License"); you may not use this file except in diff --git a/system/doc/tutorial/nif.xmlsrc b/system/doc/tutorial/nif.xmlsrc index 6cb54ff7ff..79cef31160 100644 --- a/system/doc/tutorial/nif.xmlsrc +++ b/system/doc/tutorial/nif.xmlsrc @@ -29,7 +29,7 @@ <file>nif.xml</file> </header> <p>This is an example of how to solve the <seealso marker="example">example problem</seealso> - by using NIFs. NIFs where introduced in R13B03 as an experimental + by using NIFs. NIFs were introduced in R13B03 as an experimental feature. It is a simpler and more efficient way of calling C-code than using port drivers. NIFs are most suitable for synchronous functions like <c>foo</c> and <c>bar</c> in the example, that does some @@ -85,7 +85,7 @@ <p>The function arguments passed to a NIF appears in an array <c>argv</c>, with <c>argc</c> as the length of the array and thus the arity of the function. The Nth argument of the function can be accessed as - <c>argv[N-1]</c>. NIFs also takes an environment argument that + <c>argv[N-1]</c>. NIFs also take an environment argument that serves as an opaque handle that is needed to be passed on to most API functions. The environment contains information about the calling Erlang process.</p> @@ -98,7 +98,7 @@ structures containing name, arity and function pointer of each NIF. The other arguments are pointers to callback functions that can be used to initialize the library. We do not use them - is this simple example so we set them all to <c>NULL</c>.</p> + in this simple example so we set them all to <c>NULL</c>.</p> <p>Function arguments and return values are represented as values of type <c>ERL_NIF_TERM</c>. We use functions like <c>enif_get_int</c> and <c>enif_make_int</c> to convert between Erlang term and C-type. |