aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--HOWTO/INSTALL.md8
-rw-r--r--README.md11
-rw-r--r--aclocal.m4309
-rw-r--r--bootstrap/lib/compiler/ebin/cerl_inline.beambin37568 -> 37776 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_core.beambin51440 -> 51552 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/application.beambin4020 -> 4572 bytes
-rw-r--r--configure.in1
-rw-r--r--erts/.gitignore1
-rw-r--r--erts/aclocal.m4309
-rw-r--r--erts/configure.in26
-rw-r--r--erts/doc/src/erl_driver.xml37
-rw-r--r--erts/doc/src/erlang.xml2
-rw-r--r--erts/doc/src/erts_alloc.xml16
-rw-r--r--erts/emulator/Makefile.in10
-rw-r--r--erts/emulator/beam/atom.names3
-rw-r--r--erts/emulator/beam/beam_emu.c9
-rw-r--r--erts/emulator/beam/bif.c2
-rw-r--r--erts/emulator/beam/erl_alloc.c16
-rw-r--r--erts/emulator/beam/erl_ao_firstfit_alloc.c190
-rw-r--r--erts/emulator/beam/erl_ao_firstfit_alloc.h11
-rw-r--r--erts/emulator/beam/erl_bestfit_alloc.c6
-rwxr-xr-xerts/emulator/beam/erl_bif_info.c102
-rw-r--r--erts/emulator/beam/erl_bits.c34
-rw-r--r--erts/emulator/beam/erl_db_util.c5
-rw-r--r--erts/emulator/beam/erl_init.c2
-rw-r--r--erts/emulator/beam/erl_nif.c7
-rw-r--r--erts/emulator/beam/erl_ptab.c139
-rw-r--r--erts/emulator/beam/erl_ptab.h2
-rw-r--r--erts/emulator/beam/erl_utils.h5
-rw-r--r--erts/emulator/beam/external.c4
-rwxr-xr-xerts/emulator/beam/global.h18
-rw-r--r--erts/emulator/beam/utils.c289
-rw-r--r--erts/emulator/drivers/common/efile_drv.c100
-rw-r--r--erts/emulator/test/Makefile3
-rw-r--r--erts/emulator/test/a_SUITE.erl3
-rw-r--r--erts/emulator/test/alloc_SUITE_data/allocator_test.h3
-rw-r--r--erts/emulator/test/alloc_SUITE_data/coalesce.c2
-rw-r--r--erts/emulator/test/alloc_SUITE_data/rbtree.c90
-rw-r--r--erts/emulator/test/binary_SUITE.erl10
-rw-r--r--erts/emulator/test/bs_construct_SUITE.erl2
-rw-r--r--erts/emulator/test/bs_match_misc_SUITE.erl12
-rw-r--r--erts/emulator/test/emulator_smoke.spec3
-rw-r--r--erts/emulator/test/match_spec_SUITE.erl12
-rw-r--r--erts/emulator/test/process_SUITE.erl52
-rw-r--r--erts/emulator/test/receive_SUITE.erl23
-rw-r--r--erts/emulator/test/smoke_test_SUITE.erl39
-rw-r--r--erts/emulator/test/system_profile_SUITE.erl3
-rwxr-xr-xerts/emulator/utils/make_compiler_flags87
-rw-r--r--erts/emulator/valgrind/suppress.standard2
-rw-r--r--erts/etc/Makefile3
-rw-r--r--erts/etc/unix/Makefile46
-rw-r--r--erts/etc/unix/etp-commands.in (renamed from erts/etc/unix/etp-commands)31
-rw-r--r--erts/etc/unix/etp-thr.py55
-rw-r--r--erts/etc/unix/run_erl.c8
-rw-r--r--erts/etc/unix/to_erl.c4
-rw-r--r--erts/include/internal/ethread.h7
-rw-r--r--erts/include/internal/gcc/ethread.h5
-rw-r--r--erts/preloaded/.gitignore2
-rw-r--r--erts/preloaded/Makefile1
-rw-r--r--erts/preloaded/src/Makefile15
-rw-r--r--erts/preloaded/src/erts.app.src41
-rw-r--r--erts/test/Makefile2
-rw-r--r--erts/test/erlc_SUITE.erl83
-rw-r--r--erts/test/erlc_SUITE_data/src/erl_test_missing_header.erl22
-rw-r--r--erts/test/system_smoke.spec3
-rw-r--r--lib/common_test/src/ct_logs.erl30
-rw-r--r--lib/common_test/src/ct_netconfc.erl94
-rw-r--r--lib/common_test/src/ct_util.erl15
-rw-r--r--lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl13
-rw-r--r--lib/common_test/test/ct_test_support.erl14
-rw-r--r--lib/common_test/test/ct_verbosity_SUITE.erl26
-rw-r--r--lib/compiler/src/beam_bool.erl3
-rw-r--r--lib/compiler/src/cerl_inline.erl39
-rw-r--r--lib/compiler/src/v3_core.erl6
-rw-r--r--lib/compiler/test/bs_construct_SUITE.erl2
-rw-r--r--lib/compiler/test/guard_SUITE.erl8
-rw-r--r--lib/compiler/test/inline_SUITE.erl3
-rw-r--r--lib/compiler/test/inline_SUITE_data/fname.erl29
-rw-r--r--lib/compiler/test/warnings_SUITE.erl14
-rw-r--r--lib/crypto/c_src/crypto.c194
-rw-r--r--lib/crypto/src/crypto.erl27
-rw-r--r--lib/debugger/test/bs_construct_SUITE.erl2
-rw-r--r--lib/debugger/test/bs_match_misc_SUITE.erl11
-rw-r--r--lib/diameter/doc/src/diameter_dict.xml4
-rw-r--r--lib/diameter/src/base/diameter_peer_fsm.erl65
-rw-r--r--lib/diameter/src/base/diameter_types.erl68
-rw-r--r--lib/diameter/src/base/diameter_watchdog.erl19
-rw-r--r--lib/diameter/test/diameter_codec_test.erl167
-rw-r--r--lib/diameter/test/diameter_transport_SUITE.erl7
-rw-r--r--lib/erl_interface/aclocal.m4309
-rw-r--r--lib/erl_interface/test/Makefile2
-rw-r--r--lib/erl_interface/test/erl_interface_smoke.spec1
-rw-r--r--lib/eunit/include/eunit.hrl64
-rw-r--r--lib/ic/test/Makefile2
-rw-r--r--lib/ic/test/ic_smoke.spec1
-rw-r--r--lib/inets/doc/src/httpc.xml6
-rw-r--r--lib/inets/doc/src/httpd.xml28
-rw-r--r--lib/inets/doc/src/httpd_util.xml4
-rw-r--r--lib/inets/doc/src/mod_alias.xml4
-rw-r--r--lib/inets/doc/src/notes.xml15
-rw-r--r--lib/inets/doc/src/notes_history.xml2
-rw-r--r--lib/inets/src/ftp/ftp.erl2
-rw-r--r--lib/inets/src/http_client/httpc.erl2
-rw-r--r--lib/inets/src/http_server/httpd_manager.erl33
-rw-r--r--lib/inets/test/httpc_proxy_SUITE.erl17
-rw-r--r--lib/jinterface/test/Makefile2
-rw-r--r--lib/jinterface/test/jinterface_smoke.spec1
-rw-r--r--lib/kernel/doc/src/application.xml27
-rw-r--r--lib/kernel/doc/src/inet.xml13
-rw-r--r--lib/kernel/src/application.erl43
-rw-r--r--lib/kernel/src/inet.erl9
-rw-r--r--lib/kernel/src/inet_parse.erl4
-rw-r--r--lib/kernel/src/rpc.erl2
-rw-r--r--lib/kernel/src/user_drv.erl2
-rw-r--r--lib/kernel/test/Makefile2
-rw-r--r--lib/kernel/test/application_SUITE.erl107
-rw-r--r--lib/kernel/test/code_SUITE.erl881
-rw-r--r--lib/kernel/test/inet_SUITE.erl4
-rw-r--r--lib/kernel/test/kernel_smoke.spec9
-rw-r--r--lib/megaco/aclocal.m4309
-rw-r--r--lib/mnesia/src/mnesia_bup.erl6
-rw-r--r--lib/odbc/aclocal.m4309
-rw-r--r--lib/odbc/c_src/odbcserver.c12
-rw-r--r--lib/os_mon/c_src/ferrule.c2
-rw-r--r--lib/os_mon/c_src/mod_syslog.c3
-rw-r--r--lib/os_mon/src/disksup.erl4
-rw-r--r--lib/os_mon/test/Makefile3
-rw-r--r--lib/os_mon/test/disksup_SUITE.erl295
-rw-r--r--lib/os_mon/test/os_mon_smoke.spec3
-rw-r--r--lib/public_key/test/pbe_SUITE.erl1
-rw-r--r--lib/public_key/test/pkits_SUITE.erl1
-rw-r--r--lib/public_key/test/public_key_SUITE.erl1
-rw-r--r--lib/runtime_tools/doc/src/dbg.xml2
-rw-r--r--lib/runtime_tools/src/Makefile1
-rw-r--r--lib/runtime_tools/src/dbg.erl4
-rw-r--r--lib/runtime_tools/src/runtime_tools.app.src2
-rw-r--r--lib/runtime_tools/src/system_information.erl554
-rw-r--r--lib/runtime_tools/test/Makefile1
-rw-r--r--lib/runtime_tools/test/system_information_SUITE.erl300
-rw-r--r--lib/runtime_tools/test/system_information_SUITE_data/information_test_report.dat9873
-rw-r--r--lib/sasl/test/systools_SUITE.erl6
-rw-r--r--lib/snmp/doc/src/notes.xml80
-rw-r--r--lib/snmp/doc/src/snmp_agent_config_files.xml260
-rw-r--r--lib/snmp/src/agent/snmp_view_based_acm_mib.erl133
-rw-r--r--lib/snmp/src/agent/snmpa_local_db.erl2
-rw-r--r--lib/snmp/src/app/snmp.appup.src26
-rw-r--r--lib/snmp/src/misc/snmp_conf.erl35
-rw-r--r--lib/snmp/test/Makefile2
-rw-r--r--lib/snmp/vsn.mk2
-rw-r--r--lib/ssh/doc/src/notes.xml15
-rw-r--r--lib/ssh/doc/src/ssh.xml1
-rw-r--r--lib/ssh/src/ssh.hrl3
-rw-r--r--lib/ssh/src/ssh_cli.erl19
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl7
-rw-r--r--lib/ssh/src/ssh_file.erl9
-rw-r--r--lib/ssh/src/ssh_transport.erl37
-rw-r--r--lib/ssh/test/ssh_basic_SUITE.erl23
-rw-r--r--lib/ssl/src/tls_connection.erl14
-rw-r--r--lib/ssl/test/ssl_packet_SUITE.erl24
-rw-r--r--lib/stdlib/doc/src/filelib.xml6
-rw-r--r--lib/stdlib/doc/src/io_lib.xml3
-rw-r--r--lib/stdlib/doc/src/supervisor.xml2
-rw-r--r--lib/stdlib/src/dets.erl4
-rw-r--r--lib/stdlib/src/erl_lint.erl3
-rw-r--r--lib/stdlib/src/filelib.erl23
-rw-r--r--lib/stdlib/src/gen_server.erl4
-rw-r--r--lib/stdlib/src/io.erl2
-rw-r--r--lib/stdlib/src/io_lib.erl9
-rw-r--r--lib/stdlib/src/io_lib_fread.erl9
-rw-r--r--lib/stdlib/test/dets_SUITE.erl26
-rw-r--r--lib/stdlib/test/erl_lint_SUITE.erl18
-rw-r--r--lib/test_server/src/ts.erl26
-rw-r--r--lib/test_server/src/ts_benchmark.erl7
-rw-r--r--lib/test_server/src/ts_lib.erl12
-rw-r--r--lib/tools/emacs/erlang-skels.el4
-rw-r--r--lib/tools/emacs/erlang.el3
-rw-r--r--lib/tools/emacs/test.erl.indented31
-rw-r--r--lib/tools/emacs/test.erl.orig31
-rw-r--r--lib/wx/aclocal.m4309
-rw-r--r--lib/xmerl/doc/src/xmerl_ug.xmlsrc4
-rw-r--r--system/doc/tutorial/nif.xmlsrc6
181 files changed, 15158 insertions, 2574 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.
diff --git a/README.md b/README.md
index 1bcf14e760..a6a4f11be8 100644
--- a/README.md
+++ b/README.md
@@ -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/cerl_inline.beam b/bootstrap/lib/compiler/ebin/cerl_inline.beam
index 0d7a4c0e87..3fa8c7d69f 100644
--- a/bootstrap/lib/compiler/ebin/cerl_inline.beam
+++ b/bootstrap/lib/compiler/ebin/cerl_inline.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_core.beam b/bootstrap/lib/compiler/ebin/v3_core.beam
index 7e2960fda2..7410397300 100644
--- a/bootstrap/lib/compiler/ebin/v3_core.beam
+++ b/bootstrap/lib/compiler/ebin/v3_core.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/application.beam b/bootstrap/lib/kernel/ebin/application.beam
index c0a615f5a3..e39352117f 100644
--- a/bootstrap/lib/kernel/ebin/application.beam
+++ b/bootstrap/lib/kernel/ebin/application.beam
Binary files differ
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/.gitignore b/erts/.gitignore
index 526d5da0b9..e515dc8811 100644
--- a/erts/.gitignore
+++ b/erts/.gitignore
@@ -11,6 +11,7 @@
/etc/common/Install
/etc/common/erl.src
+/etc/unix/etp-commands
/test/Emakefile
/test/*.beam
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/configure.in b/erts/configure.in
index b056ba44e2..64436e933c 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,18 @@ 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
+ test "X$smp_require_native_atomics" = "Xyes" &&
+ AC_DEFINE(ETHR_SMP_REQUIRE_NATIVE_IMPLS, 1, [Define if you want to enable check for native ethread implementations])
+
+ 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 Configuring section in INSTALL.md for more information.])
+ ;;
+
+ no-no-yes)
test -f "$ERL_TOP/erts/CONF_INFO" ||
echo "" > "$ERL_TOP/erts/CONF_INFO"
@@ -1056,12 +1071,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 +1087,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/erl_driver.xml b/erts/doc/src/erl_driver.xml
index efe0483b31..f52d973709 100644
--- a/erts/doc/src/erl_driver.xml
+++ b/erts/doc/src/erl_driver.xml
@@ -666,7 +666,7 @@ typedef struct ErlDrvBinary {
<item>
<p>The <c>ErlDrvData</c> is a handle to driver-specific data,
passed to the driver call-backs. It is a pointer, and is
- most often type casted to a specific pointer in the driver.</p>
+ most often type cast to a specific pointer in the driver.</p>
</item>
<tag>SysIOVec</tag>
<item>
@@ -1014,7 +1014,7 @@ typedef struct ErlIOVec {
<fsummary>Read a system timestamp</fsummary>
<desc>
<marker id="driver_get_now"></marker>
- <p>This function reads a timestamp into the memory pointed to by
+ <p>This function reads a timestamp into the memory pointed to by
the parameter <c>now</c>. See the description of <seealso marker="#ErlDrvNowData">ErlDrvNowData</seealso> for
specification of its fields. </p>
<p>The return value is 0 unless the <c>now</c> pointer is not
@@ -1056,7 +1056,7 @@ typedef struct ErlIOVec {
returned. Another thread may still be using the event object
internally. To safely close an event object call
<c>driver_select</c> with <c>ERL_DRV_USE</c> and <c>on==0</c>. That
- will clear all events and then call
+ will clear all events and then call
<seealso marker="driver_entry#stop_select">stop_select</seealso>
when it is safe to close the event object.
<c>ERL_DRV_USE</c> should be set together with the first event
@@ -1068,7 +1068,7 @@ typedef struct ErlIOVec {
<p>ERL_DRV_USE was added in OTP release R13. Old drivers will still work
as before. But it is recommended to update them to use <c>ERL_DRV_USE</c> and
<c>stop_select</c> to make sure that event objects are closed in a safe way.</p>
- </note>
+ </note>
<p>The return value is 0 (failure, -1, only if the
<c>ready_input</c>/<c>ready_output</c> is
<c>NULL</c>).</p>
@@ -1524,7 +1524,7 @@ typedef struct ErlIOVec {
<marker id="remove_driver_entry"></marker>
<p>This function removes a driver entry <c>de</c> previously
added with <c>add_driver_entry</c>.</p>
- <p>Driver entries added by the <c>erl_ddll</c> erlang interface can
+ <p>Driver entries added by the <c>erl_ddll</c> erlang interface can
not be removed by using this interface.</p>
</desc>
</func>
@@ -1758,7 +1758,7 @@ typedef struct ErlIOVec {
<pre>
Term type Argument(s)
===========================================
-ERL_DRV_NIL
+ERL_DRV_NIL
ERL_DRV_ATOM ErlDrvTermData atom (from driver_mk_atom(char *string))
ERL_DRV_INT ErlDrvSInt integer
ERL_DRV_UINT ErlDrvUInt integer
@@ -1779,11 +1779,11 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
signed integer data type <c>ErlDrvSInt</c> are 64 bits wide
on a 64 bit runtime system and 32 bits wide on a 32 bit
runtime system. They were introduced in erts version 5.6,
- and replaced some of the <c>int</c> arguments in the list above.
+ and replaced some of the <c>int</c> arguments in the list above.
</p>
<p>The unsigned integer data type <c>ErlDrvUInt64</c> and the
signed integer data type <c>ErlDrvSInt64</c> are always 64 bits
- wide. They were introduced in erts version 5.7.4.
+ wide. They were introduced in erts version 5.7.4.
</p>
<p>To build the tuple <c>{tcp, Port, [100 | Binary]}</c>, the
@@ -1879,7 +1879,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<fsummary>Send term data from driver to port owner</fsummary>
<desc>
<marker id="driver_output_term"></marker>
- <warning><p><c>driver_output_term()</c> is deferred and will
+ <warning><p><c>driver_output_term()</c> is deprecated and will
be removed in the OTP-R17 release. Use
<seealso marker="#erl_drv_send_term">erl_drv_output_term()</seealso>
instead.</p>
@@ -1937,7 +1937,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<fsummary>Send term data to other process than port owner process</fsummary>
<desc>
<marker id="driver_send_term"></marker>
- <warning><p><c>driver_send_term()</c> is deferred and will
+ <warning><p><c>driver_send_term()</c> is deprecated and will
be removed in the OTP-R17 release. Use
<seealso marker="#erl_drv_send_term">erl_drv_send_term()</seealso>
instead.</p>
@@ -1998,7 +1998,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
The data should be freed in <c>async_free</c>, because it's
called if <c>driver_async_cancel</c> is called.</p>
<p>When the async operation is done, <seealso marker="driver_entry#ready_async">ready_async</seealso> driver
- entry function is called. If <c>async_ready</c> is null in
+ entry function is called. If <c>ready_async</c> is null in
the driver entry, the <c>async_free</c> function is called
instead.</p>
<p>The return value is a handle to the asynchronous task, which
@@ -2035,7 +2035,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
as of OTP-R15B <c>driver_async_cancel()</c> is deprecated, and
scheduled for removal in OTP-R16. It will currently always fail,
and return 0.</p>
- <warning><p><c>driver_async_cancel()</c> is deferred and will
+ <warning><p><c>driver_async_cancel()</c> is deprecated and will
be removed in the OTP-R16 release.</p>
</warning>
@@ -2048,7 +2048,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<marker id="driver_lock_driver"></marker>
<p>This function locks the driver used by the port <c>port</c>
in memory for the rest of the emulator process'
- lifetime. After this call, the driver behaves as one of Erlang's
+ lifetime. After this call, the driver behaves as one of Erlang's
statically linked in drivers.</p>
</desc>
</func>
@@ -2076,7 +2076,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<seealso marker="driver_entry">driver_entry</seealso>).</item>
<tag><c>drv_data</c></tag>
<item>The driver defined handle that will be passed in subsequent
- calls to driver call-backs. Note, that the
+ calls to driver call-backs. Note, that the
<seealso marker="driver_entry#start">driver start call-back</seealso>
will not be called for this new driver instance.
The driver defined handle is normally created in the
@@ -2284,7 +2284,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<item>A thread identifier.</item>
</taglist>
<p>This function compares two thread identifiers for equality,
- and returns <c>0</c> it they aren't equal, and
+ and returns <c>0</c> it they aren't equal, and
a value not equal to <c>0</c> if they are equal.</p>
<note><p>A Thread identifier may be reused very quickly after
a thread has terminated. Therefore, if a thread
@@ -2469,7 +2469,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
</taglist>
<p>This function broadcasts on a condition variable. That is, if
other threads are waiting on the condition variable being
- broadcasted on, <em>all</em> of them will be woken.
+ broadcast on, <em>all</em> of them will be woken.
</p>
<p>This function is thread-safe.</p>
</desc>
@@ -2498,7 +2498,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
the calling thread when calling this function.
</p>
<note><p><c>erl_drv_cond_wait()</c> might return even though
- no-one has signaled or broadcasted on the condition
+ no-one has signaled or broadcast on the condition
variable. Code calling <c>erl_drv_cond_wait()</c> should
always be prepared for <c>erl_drv_cond_wait()</c>
returning even though the condition that the thread was
@@ -2822,7 +2822,7 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<item>A pointer to an output buffer.</item>
<tag><c>value_size</c></tag>
<item>A pointer to an integer. The integer is both used for
- passing input and output sizes (see below).
+ passing input and output sizes (see below).
</item>
</taglist>
<p>This function retrieves the value of an environment variable.
@@ -2900,4 +2900,3 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
Guide Ch. 3)</p>
</section>
</cref>
-
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 767edc1cc0..5ee40823bc 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -235,7 +235,7 @@
<code>
1> Bin = &lt;&lt;1,2,3,4,5,6,7,8,9,10&gt;&gt;.
-2> binary_part(Bin,{byte_size(Bin), -5)).
+2> binary_part(Bin,{byte_size(Bin), -5}).
&lt;&lt;6,7,8,9,10&gt;&gt;
</code>
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/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 eba1d0fa23..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
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/bif.c b/erts/emulator/beam/bif.c
index ff237b6a78..755c5e6882 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -3934,7 +3934,7 @@ BIF_RETTYPE halt_2(BIF_ALIST_2)
{
Sint code;
Eterm optlist = BIF_ARG_2;
- int flush = 0;
+ int flush = 1;
for (optlist = BIF_ARG_2;
is_list(optlist);
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c
index 86575ccb9b..5eacff8829 100644
--- a/erts/emulator/beam/erl_alloc.c
+++ b/erts/emulator/beam/erl_alloc.c
@@ -249,7 +249,7 @@ 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;
}
@@ -564,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;
@@ -587,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;
}
}
@@ -1290,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_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 e92cb5abb6..25b344c6a8 100644
--- a/erts/emulator/beam/erl_ao_firstfit_alloc.h
+++ b/erts/emulator/beam/erl_ao_firstfit_alloc.h
@@ -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_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_db_util.c b/erts/emulator/beam/erl_db_util.c
index 713ac0ba18..ef3749a2c4 100644
--- a/erts/emulator/beam/erl_db_util.c
+++ b/erts/emulator/beam/erl_db_util.c
@@ -2319,6 +2319,8 @@ restart:
break;
case matchSilent:
--esp;
+ if (in_flags & ERTS_PAM_IGNORE_TRACE_SILENT)
+ break;
if (*esp == am_true) {
erts_smp_proc_lock(c_p, ERTS_PROC_LOCKS_ALL_MINOR);
ERTS_TRACE_FLAGS(c_p) |= F_TRACE_SILENT;
@@ -4971,7 +4973,8 @@ static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, int trace)
save_cp = p->cp;
p->cp = NULL;
res = erts_match_set_run(p, mps, arr, n,
- ERTS_PAM_COPY_RESULT, &ret_flags);
+ ERTS_PAM_COPY_RESULT|ERTS_PAM_IGNORE_TRACE_SILENT,
+ &ret_flags);
p->cp = save_cp;
} else {
n = 0;
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c
index 4bae3dfeb4..8d137df7ae 100644
--- a/erts/emulator/beam/erl_init.c
+++ b/erts/emulator/beam/erl_init.c
@@ -637,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;
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_ptab.c b/erts/emulator/beam/erl_ptab.c
index d69619dd44..fa5482b841 100644
--- a/erts/emulator/beam/erl_ptab.c
+++ b/erts/emulator/beam/erl_ptab.c
@@ -433,7 +433,7 @@ erts_ptab_mem_size(ErtsPTab *ptab)
{
UWord size = ptab->r.o.max*sizeof(erts_smp_atomic_t);
if (ptab->r.o.free_id_data)
- size += ptab->r.o.max*sizeof(Uint32);
+ size += ptab->r.o.max*sizeof(erts_smp_atomic32_t);
return size;
}
@@ -474,7 +474,7 @@ erts_ptab_init_table(ErtsPTab *ptab,
tab_sz = ERTS_ALC_CACHE_LINE_ALIGN_SIZE(size*sizeof(erts_smp_atomic_t));
alloc_sz = tab_sz;
if (!legacy)
- alloc_sz += ERTS_ALC_CACHE_LINE_ALIGN_SIZE(size*sizeof(Uint32));
+ alloc_sz += ERTS_ALC_CACHE_LINE_ALIGN_SIZE(size*sizeof(erts_smp_atomic32_t));
ptab->r.o.tab = erts_alloc_permanent_cache_aligned(atype, alloc_sz);
tab_end = ((char *) ptab->r.o.tab) + tab_sz;
tab_entry = ptab->r.o.tab;
@@ -497,6 +497,10 @@ erts_ptab_init_table(ErtsPTab *ptab,
ASSERT(ptab->r.o.pix_cl_shift + ptab->r.o.pix_cli_shift == bits);
+ ptab->r.o.invalid_element = invalid_element;
+ ptab->r.o.invalid_data = erts_ptab_id2data(ptab, invalid_element->id);
+ ptab->r.o.release_element = release_element;
+
if (legacy) {
ptab->r.o.free_id_data = NULL;
ptab->r.o.dix_cl_mask = 0;
@@ -506,11 +510,11 @@ erts_ptab_init_table(ErtsPTab *ptab,
}
else {
- tab_sz = ERTS_ALC_CACHE_LINE_ALIGN_SIZE(size*sizeof(Uint32));
- ptab->r.o.free_id_data = (Uint32 *) tab_end;
+ tab_sz = ERTS_ALC_CACHE_LINE_ALIGN_SIZE(size*sizeof(erts_smp_atomic32_t));
+ ptab->r.o.free_id_data = (erts_smp_atomic32_t *) tab_end;
tab_cache_lines = tab_sz/ERTS_CACHE_LINE_SIZE;
- ix_per_cache_line = (ERTS_CACHE_LINE_SIZE/sizeof(Uint32));
+ ix_per_cache_line = (ERTS_CACHE_LINE_SIZE/sizeof(erts_smp_atomic32_t));
ptab->r.o.dix_cl_mask = tab_cache_lines-1;
ptab->r.o.dix_cl_shift = erts_fit_in_bits_int32(ix_per_cache_line-1);
@@ -525,7 +529,9 @@ erts_ptab_init_table(ErtsPTab *ptab,
ix = 0;
for (cl = 0; cl < tab_cache_lines; cl++) {
for (cli = 0; cli < ix_per_cache_line; cli++) {
- ptab->r.o.free_id_data[ix] = cli*tab_cache_lines+cl;
+ erts_smp_atomic32_init_nob(&ptab->r.o.free_id_data[ix],
+ cli*tab_cache_lines+cl);
+ ASSERT(erts_smp_atomic32_read_nob(&ptab->r.o.free_id_data[ix]) != ptab->r.o.invalid_data);
ix++;
}
}
@@ -534,9 +540,6 @@ erts_ptab_init_table(ErtsPTab *ptab,
erts_smp_atomic32_init_nob(&ptab->vola.tile.fid_ix, -1);
}
- ptab->r.o.invalid_element = invalid_element;
- ptab->r.o.invalid_data = erts_ptab_id2data(ptab, invalid_element->id);
- ptab->r.o.release_element = release_element;
erts_smp_interval_init(&ptab->list.data.interval);
ptab->list.data.deleted.start = NULL;
@@ -606,11 +609,13 @@ erts_ptab_new_element(ErtsPTab *ptab,
= erts_smp_current_interval_nob(erts_ptab_interval(ptab));
if (ptab->r.o.free_id_data) {
+ do {
+ ix = (Uint32) erts_smp_atomic32_inc_read_acqb(&ptab->vola.tile.aid_ix);
+ ix = ix_to_free_id_data_ix(ptab, ix);
- ix = (Uint32) erts_smp_atomic32_inc_read_acqb(&ptab->vola.tile.aid_ix);
- ix = ix_to_free_id_data_ix(ptab, ix);
-
- data = ptab->r.o.free_id_data[ix];
+ data = erts_smp_atomic32_xchg_nob(&ptab->r.o.free_id_data[ix],
+ (erts_aint32_t)ptab->r.o.invalid_data);
+ }while ((Eterm)data == ptab->r.o.invalid_data);
init_ptab_el(init_arg, (Eterm) data);
@@ -763,7 +768,7 @@ erts_ptab_delete_element(ErtsPTab *ptab,
erts_smp_atomic_set_relb(&ptab->r.o.tab[pix], ERTS_AINT_NULL);
if (ptab->r.o.free_id_data) {
-
+ Uint32 prev_data;
/* Next data for this slot... */
data = (Uint32) erts_ptab_id2data(ptab, ptab_el->id);
data += ptab->r.o.max;
@@ -772,14 +777,17 @@ erts_ptab_delete_element(ErtsPTab *ptab,
data += ptab->r.o.max;
data &= ~(~((Uint32) 0) << ERTS_PTAB_ID_DATA_SIZE);
}
-
ASSERT(data != ptab->r.o.invalid_data);
ASSERT(pix == erts_ptab_data2pix(ptab, data));
- ix = (Uint32) erts_smp_atomic32_inc_read_relb(&ptab->vola.tile.fid_ix);
- ix = ix_to_free_id_data_ix(ptab, ix);
-
- ptab->r.o.free_id_data[ix] = data;
+ do {
+ ix = (Uint32) erts_smp_atomic32_inc_read_relb(&ptab->vola.tile.fid_ix);
+ ix = ix_to_free_id_data_ix(ptab, ix);
+
+ prev_data = erts_smp_atomic32_cmpxchg_nob(&ptab->r.o.free_id_data[ix],
+ data,
+ ptab->r.o.invalid_data);
+ }while ((Eterm)prev_data != ptab->r.o.invalid_data);
}
ASSERT(erts_smp_atomic32_read_nob(&ptab->vola.tile.count) > 0);
@@ -1392,6 +1400,31 @@ erts_ptab_init(void)
* Debug stuff
*/
+static void assert_ptab_consistency(ErtsPTab *ptab)
+{
+#ifdef DEBUG
+ if (ptab->r.o.free_id_data) {
+ Uint32 ix, pix, data;
+ int free_pids = 0;
+ int null_slots = 0;
+
+ for (ix=0; ix < ptab->r.o.max; ix++) {
+ if (erts_smp_atomic32_read_nob(&ptab->r.o.free_id_data[ix]) != ptab->r.o.invalid_data) {
+ ++free_pids;
+ data = erts_smp_atomic32_read_nob(&ptab->r.o.free_id_data[ix]);
+ pix = erts_ptab_data2pix(ptab, (Eterm) data);
+ ASSERT(erts_ptab_pix2intptr_nob(ptab, pix) == ERTS_AINT_NULL);
+ }
+ if (erts_smp_atomic_read_nob(&ptab->r.o.tab[ix]) == ERTS_AINT_NULL) {
+ ++null_slots;
+ }
+ }
+ ASSERT(free_pids == null_slots);
+ ASSERT(free_pids == ptab->r.o.max - erts_smp_atomic32_read_nob(&ptab->vola.tile.count));
+ }
+#endif
+}
+
Sint
erts_ptab_test_next_id(ErtsPTab *ptab, int set, Uint next)
{
@@ -1402,46 +1435,49 @@ erts_ptab_test_next_id(ErtsPTab *ptab, int set, Uint next)
erts_ptab_rwlock(ptab);
+ assert_ptab_consistency(ptab);
+
if (ptab->r.o.free_id_data) {
- Uint32 aid_ix, dix;
+ Uint32 id_ix, dix;
if (set) {
- Uint32 max_ix, ser, num, start;
+ Uint32 i, max_ix, num, stop_id_ix;
max_ix = ptab->r.o.max - 1;
- ser = next & ~max_ix;
- start = num = next & max_ix;
-
- aid_ix = (Uint32) erts_smp_atomic32_read_nob(&ptab->vola.tile.aid_ix) + 1;
-
- do {
- Uint32 pix = erts_ptab_data2pix(ptab, num);
+ num = next;
+ id_ix = (Uint32) erts_smp_atomic32_read_nob(&ptab->vola.tile.aid_ix);
+
+ for (i=0; i <= max_ix; ++i) {
+ Uint32 pix;
+ ++num;
+ num &= ~(~((Uint32) 0) << ERTS_PTAB_ID_DATA_SIZE);
+ if (num == ptab->r.o.invalid_data) {
+ num += ptab->r.o.max;
+ num &= ~(~((Uint32) 0) << ERTS_PTAB_ID_DATA_SIZE);
+ }
+ pix = erts_ptab_data2pix(ptab, num);
if (ERTS_AINT_NULL == erts_ptab_pix2intptr_nob(ptab, pix)) {
- dix = ix_to_free_id_data_ix(ptab, aid_ix);
- ptab->r.o.free_id_data[dix] = ser + num;
- ASSERT(pix == erts_ptab_data2pix(ptab, ser+num));
- if (aid_ix == max_ix)
- aid_ix = 0;
- else
- aid_ix++;
+ ++id_ix;
+ dix = ix_to_free_id_data_ix(ptab, id_ix);
+ erts_smp_atomic32_set_nob(&ptab->r.o.free_id_data[dix], num);
+ ASSERT(pix == erts_ptab_data2pix(ptab, num));
}
- if (num == max_ix)
- num = 0;
- else
- num++;
- } while (num != start);
+ }
+ erts_smp_atomic32_set_nob(&ptab->vola.tile.fid_ix, id_ix);
-#ifdef DEBUG
- if (aid_ix == 0)
- aid_ix = max_ix;
- else
- aid_ix--;
- ASSERT((aid_ix & max_ix) == (((Uint32) erts_smp_atomic32_read_nob(&ptab->vola.tile.fid_ix)) & max_ix));
-#endif
+ /* Write invalid_data in rest of free_id_data[]: */
+ stop_id_ix = (1 + erts_smp_atomic32_read_nob(&ptab->vola.tile.aid_ix)) & max_ix;
+ while (1) {
+ id_ix = (id_ix+1) & max_ix;
+ if (id_ix == stop_id_ix)
+ break;
+ dix = ix_to_free_id_data_ix(ptab, id_ix);
+ erts_smp_atomic32_set_nob(&ptab->r.o.free_id_data[dix],
+ ptab->r.o.invalid_data);
+ }
}
-
- aid_ix = (Uint32) erts_smp_atomic32_read_nob(&ptab->vola.tile.aid_ix) + 1;
- dix = ix_to_free_id_data_ix(ptab, aid_ix);
- res = (Sint) ptab->r.o.free_id_data[dix];
+ id_ix = (Uint32) erts_smp_atomic32_read_nob(&ptab->vola.tile.aid_ix) + 1;
+ dix = ix_to_free_id_data_ix(ptab, id_ix);
+ res = (Sint) erts_smp_atomic32_read_nob(&ptab->r.o.free_id_data[dix]);
}
else {
/* Deprecated legacy algorithm... */
@@ -1485,6 +1521,7 @@ erts_ptab_test_next_id(ErtsPTab *ptab, int set, Uint next)
}
}
+ assert_ptab_consistency(ptab);
erts_ptab_rwunlock(ptab);
return res;
diff --git a/erts/emulator/beam/erl_ptab.h b/erts/emulator/beam/erl_ptab.h
index c2d8bd9cad..e3e05f14af 100644
--- a/erts/emulator/beam/erl_ptab.h
+++ b/erts/emulator/beam/erl_ptab.h
@@ -100,7 +100,7 @@ typedef struct {
typedef struct {
erts_smp_atomic_t *tab;
- Uint32 *free_id_data;
+ erts_smp_atomic32_t *free_id_data;
Uint32 max;
Uint32 pix_mask;
Uint32 pix_cl_mask;
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/external.c b/erts/emulator/beam/external.c
index 249b1e0923..1c88765381 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -2325,7 +2325,7 @@ enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dfla
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);
@@ -2804,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);
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 25aedc91c6..bacd5a5752 100755
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -937,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))
@@ -1018,9 +1018,10 @@ Eterm erts_match_set_lint(Process *p, Eterm matchexpr);
extern void erts_match_set_release_result(Process* p);
enum erts_pam_run_flags {
- ERTS_PAM_TMP_RESULT=0,
- ERTS_PAM_COPY_RESULT=1,
- ERTS_PAM_CONTIGUOUS_TUPLE=2
+ ERTS_PAM_TMP_RESULT=1,
+ ERTS_PAM_COPY_RESULT=2,
+ ERTS_PAM_CONTIGUOUS_TUPLE=4,
+ ERTS_PAM_IGNORE_TRACE_SILENT=8
};
extern Eterm erts_match_set_run(Process *p, Binary *mpsp,
Eterm *args, int num_args,
@@ -1042,6 +1043,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,
@@ -1217,6 +1220,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/utils.c b/erts/emulator/beam/utils.c
index 62caa67ce1..bd2be7afca 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -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/efile_drv.c b/erts/emulator/drivers/common/efile_drv.c
index 595b0488a8..edcb56de1d 100644
--- a/erts/emulator/drivers/common/efile_drv.c
+++ b/erts/emulator/drivers/common/efile_drv.c
@@ -546,53 +546,75 @@ static void *ef_safe_realloc(void *op, Uint s)
(((char *)(ev)->iov[(q)].iov_base) + (p))
/* int EV_GET_CHAR(ErlIOVec *ev, char *p, int *pp, int *qp) */
-#define EV_GET_CHAR(ev, p, pp, qp) \
- (*(pp)+1 <= (ev)->iov[*(qp)].iov_len \
- ? (*(p) = *EV_CHAR_P(ev, *(pp), *(qp)), \
- *(pp) = ( *(pp)+1 < (ev)->iov[*(qp)].iov_len \
- ? *(pp)+1 \
- : ((*(qp))++, 0)), \
- !0) \
- : 0)
+#define EV_GET_CHAR(ev, p, pp, qp) efile_ev_get_char(ev, p ,pp, qp)
+static int
+efile_ev_get_char(ErlIOVec *ev, char *p, int *pp, int *qp) {
+ if (*(pp)+1 <= (ev)->iov[*(qp)].iov_len) {
+ *(p) = *EV_CHAR_P(ev, *(pp), *(qp));
+ if (*(pp)+1 < (ev)->iov[*(qp)].iov_len)
+ *(pp) = *(pp)+1;
+ else
+ (*(qp))++;
+ return !0;
+ }
+ return 0;
+}
/* Uint32 EV_UINT32(ErlIOVec *ev, int p, int q)*/
#define EV_UINT32(ev, p, q) \
((Uint32) *(((unsigned char *)(ev)->iov[(q)].iov_base) + (p)))
/* int EV_GET_UINT32(ErlIOVec *ev, Uint32 *p, int *pp, int *qp) */
-#define EV_GET_UINT32(ev, p, pp, qp) \
- (*(pp)+4 <= (ev)->iov[*(qp)].iov_len \
- ? (*(p) = (EV_UINT32(ev, *(pp), *(qp)) << 24) \
- | (EV_UINT32(ev, *(pp)+1, *(qp)) << 16) \
- | (EV_UINT32(ev, *(pp)+2, *(qp)) << 8) \
- | (EV_UINT32(ev, *(pp)+3, *(qp))), \
- *(pp) = ( *(pp)+4 < (ev)->iov[*(qp)].iov_len \
- ? *(pp)+4 \
- : ((*(qp))++, 0)), \
- !0) \
- : 0)
+#define EV_GET_UINT32(ev, p, pp, qp) efile_ev_get_uint32(ev,p,pp,qp)
+static int
+efile_ev_get_uint32(ErlIOVec *ev, Uint32 *p, int *pp, int *qp) {
+ if (*(pp)+4 <= (ev)->iov[*(qp)].iov_len) {
+ *(p) = (EV_UINT32(ev, *(pp), *(qp)) << 24)
+ | (EV_UINT32(ev, *(pp)+1, *(qp)) << 16)
+ | (EV_UINT32(ev, *(pp)+2, *(qp)) << 8)
+ | (EV_UINT32(ev, *(pp)+3, *(qp)));
+ if (*(pp)+4 < (ev)->iov[*(qp)].iov_len)
+ *(pp) = *(pp)+4;
+ else
+ (*(qp))++;
+ return !0;
+ }
+ return 0;
+}
/* Uint64 EV_UINT64(ErlIOVec *ev, int p, int q)*/
#define EV_UINT64(ev, p, q) \
((Uint64) *(((unsigned char *)(ev)->iov[(q)].iov_base) + (p)))
-/* int EV_GET_UINT64(ErlIOVec *ev, Uint32 *p, int *pp, int *qp) */
-#define EV_GET_UINT64(ev, p, pp, qp) \
- (*(pp)+8 <= (ev)->iov[*(qp)].iov_len \
- ? (*(p) = (EV_UINT64(ev, *(pp), *(qp)) << 56) \
- | (EV_UINT64(ev, *(pp)+1, *(qp)) << 48) \
- | (EV_UINT64(ev, *(pp)+2, *(qp)) << 40) \
- | (EV_UINT64(ev, *(pp)+3, *(qp)) << 32) \
- | (EV_UINT64(ev, *(pp)+4, *(qp)) << 24) \
- | (EV_UINT64(ev, *(pp)+5, *(qp)) << 16) \
- | (EV_UINT64(ev, *(pp)+6, *(qp)) << 8) \
- | (EV_UINT64(ev, *(pp)+7, *(qp))), \
- *(pp) = ( *(pp)+8 < (ev)->iov[*(qp)].iov_len \
- ? *(pp)+8 \
- : ((*(qp))++, 0)), \
- !0) \
- : 0)
+/* int EV_GET_UINT64(ErlIOVec *ev, Uint64 *p, int *pp, int *qp) */
+#define EV_GET_UINT64(ev, p, pp, qp) efile_ev_get_uint64(ev,p,pp,qp)
+static int
+efile_ev_get_uint64(ErlIOVec *ev, Uint64 *p, int *pp, int *qp) {
+ if (*(pp)+8 <= (ev)->iov[*(qp)].iov_len) {
+ *(p) = (EV_UINT64(ev, *(pp), *(qp)) << 56)
+ | (EV_UINT64(ev, *(pp)+1, *(qp)) << 48)
+ | (EV_UINT64(ev, *(pp)+2, *(qp)) << 40)
+ | (EV_UINT64(ev, *(pp)+3, *(qp)) << 32)
+ | (EV_UINT64(ev, *(pp)+4, *(qp)) << 24)
+ | (EV_UINT64(ev, *(pp)+5, *(qp)) << 16)
+ | (EV_UINT64(ev, *(pp)+6, *(qp)) << 8)
+ | (EV_UINT64(ev, *(pp)+7, *(qp)));
+ if (*(pp)+8 < (ev)->iov[*(qp)].iov_len)
+ *(pp) = *(pp)+8;
+ else
+ (*(qp))++;
+ return !0;
+ }
+ return 0;
+}
+/* int EV_GET_SINT64(ErlIOVec *ev, Uint64 *p, int *pp, int *qp) */
+#define EV_GET_SINT64(ev, p, pp, qp) efile_ev_get_sint64(ev,p,pp,qp)
+static int
+efile_ev_get_sint64(ErlIOVec *ev, Sint64 *p, int *pp, int *qp) {
+ Uint64 *tmp = (Uint64*)p;
+ return EV_GET_UINT64(ev,tmp,pp,qp);
+}
#if 0
@@ -3604,7 +3626,7 @@ file_outputv(ErlDrvData e, ErlIOVec *ev) {
for(i = 0; i < n; i++) {
Uint32 sizeH, sizeL;
size_t size;
- if ( !EV_GET_UINT64(ev, &d->c.pwritev.specs[i].offset, &p, &q)
+ if ( !EV_GET_SINT64(ev, &d->c.pwritev.specs[i].offset, &p, &q)
|| !EV_GET_UINT32(ev, &sizeH, &p, &q)
|| !EV_GET_UINT32(ev, &sizeL, &p, &q)) {
/* Misalignment in buffer */
@@ -3746,7 +3768,7 @@ file_outputv(ErlDrvData e, ErlIOVec *ev) {
for (i = 1; i < 1+n; i++) {
Uint32 sizeH, sizeL;
size_t size;
- if ( !EV_GET_UINT64(ev, &d->c.preadv.offsets[i-1], &p, &q)
+ if ( !EV_GET_SINT64(ev, &d->c.preadv.offsets[i-1], &p, &q)
|| !EV_GET_UINT32(ev, &sizeH, &p, &q)
|| !EV_GET_UINT32(ev, &sizeL, &p, &q)) {
reply_posix_error(desc, EINVAL);
@@ -3814,7 +3836,7 @@ file_outputv(ErlDrvData e, ErlIOVec *ev) {
Uint32 origin; /* Origin of seek. */
if (ev->size < 1+8+4
- || !EV_GET_UINT64(ev, &offset, &p, &q)
+ || !EV_GET_SINT64(ev, &offset, &p, &q)
|| !EV_GET_UINT32(ev, &origin, &p, &q)) {
/* Wrong length of buffer to contain offset and origin */
reply_posix_error(desc, EINVAL);
@@ -3927,7 +3949,7 @@ file_outputv(ErlDrvData e, ErlIOVec *ev) {
goto done;
}
if (ev->size < 1+1+8+4
- || !EV_GET_UINT64(ev, &hdr_offset, &p, &q)
+ || !EV_GET_SINT64(ev, &hdr_offset, &p, &q)
|| !EV_GET_UINT32(ev, &max_size, &p, &q)) {
/* Buffer too short to contain
* the header offset and max size spec */
diff --git a/erts/emulator/test/Makefile b/erts/emulator/test/Makefile
index 9594ab48b1..f02ca3cb98 100644
--- a/erts/emulator/test/Makefile
+++ b/erts/emulator/test/Makefile
@@ -140,7 +140,8 @@ EMAKEFILE=Emakefile
TEST_SPEC_FILES= emulator.spec \
emulator.spec.win \
- emulator_bench.spec
+ emulator_bench.spec \
+ emulator_smoke.spec
# ----------------------------------------------------
# Release directory specification
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_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 fe0a745db8..08ab094019 100644
--- a/erts/emulator/test/binary_SUITE.erl
+++ b/erts/emulator/test/binary_SUITE.erl
@@ -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,
@@ -69,7 +70,7 @@ 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,
@@ -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),
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/emulator_smoke.spec b/erts/emulator/test/emulator_smoke.spec
new file mode 100644
index 0000000000..3219aeb823
--- /dev/null
+++ b/erts/emulator/test/emulator_smoke.spec
@@ -0,0 +1,3 @@
+{suites,"../emulator_test",[smoke_test_SUITE,time_SUITE]}.
+{cases,"../emulator_test",crypto_SUITE,[t_md5]}.
+{cases,"../emulator_test",float_SUITE,[fpe,cmp_integer]}. \ No newline at end of file
diff --git a/erts/emulator/test/match_spec_SUITE.erl b/erts/emulator/test/match_spec_SUITE.erl
index 8dbc6b6538..b56b7ce525 100644
--- a/erts/emulator/test/match_spec_SUITE.erl
+++ b/erts/emulator/test/match_spec_SUITE.erl
@@ -22,7 +22,7 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2, not_run/1]).
-export([test_1/1, test_2/1, test_3/1, bad_match_spec_bin/1,
- trace_control_word/1, silent/1, silent_no_ms/1,
+ trace_control_word/1, silent/1, silent_no_ms/1, silent_test/1,
ms_trace2/1, ms_trace3/1, boxed_and_small/1,
destructive_in_test_bif/1, guard_exceptions/1,
unary_plus/1, unary_minus/1, moving_labels/1]).
@@ -55,7 +55,7 @@ all() ->
case test_server:is_native(match_spec_SUITE) of
false ->
[test_1, test_2, test_3, bad_match_spec_bin,
- trace_control_word, silent, silent_no_ms, ms_trace2,
+ trace_control_word, silent, silent_no_ms, silent_test, ms_trace2,
ms_trace3, boxed_and_small, destructive_in_test_bif,
guard_exceptions, unary_plus, unary_minus, fpe,
moving_labels,
@@ -501,6 +501,14 @@ silent_no_ms(Config) when is_list(Config) ->
{trace,Tracee,return_to,{?MODULE,f3,2}}]
end).
+silent_test(doc) ->
+ ["Test that match_spec_test does not activate silent"];
+silent_test(_Config) ->
+ {flags,[]} = erlang:trace_info(self(),flags),
+ erlang:match_spec_test([],[{'_',[],[{silent,true}]}],trace),
+ {flags,[]} = erlang:trace_info(self(),flags).
+
+
ms_trace2(doc) ->
["Test the match spec functions {trace/2}"];
ms_trace2(suite) -> [];
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/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/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/Makefile b/erts/etc/Makefile
index 2b32b8ae50..5b54ef9c3e 100644
--- a/erts/etc/Makefile
+++ b/erts/etc/Makefile
@@ -18,10 +18,11 @@
#
include $(ERL_TOP)/make/target.mk
-
SUB_DIRECTORIES = common
ifeq ($(TARGET),win32)
SUB_DIRECTORIES += win32
+else
+SUB_DIRECTORIES += unix
endif
include $(ERL_TOP)/make/otp_subdir.mk
diff --git a/erts/etc/unix/Makefile b/erts/etc/unix/Makefile
new file mode 100644
index 0000000000..e85d2fab0c
--- /dev/null
+++ b/erts/etc/unix/Makefile
@@ -0,0 +1,46 @@
+#
+# %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%
+#
+
+include $(ERL_TOP)/make/output.mk
+include $(ERL_TOP)/make/target.mk
+
+include $(ERL_TOP)/make/$(TARGET)/otp.mk
+include ../../vsn.mk
+
+opt debug: etc
+
+.PHONY: etc
+etc: etp-commands
+
+etp-commands: etp-commands.in
+ sed 's:@ERL_TOP@:${ERL_TOP}:g' etp-commands.in > etp-commands
+
+.PHONY: docs
+docs:
+
+.PHONY: clean
+clean:
+
+# ----------------------------------------------------
+# Release Target
+# ----------------------------------------------------
+include $(ERL_TOP)/make/otp_release_targets.mk
+
+.PHONY: release_spec
+release_spec: etc \ No newline at end of file
diff --git a/erts/etc/unix/etp-commands b/erts/etc/unix/etp-commands.in
index f059662271..54ff7b3e3a 100644
--- a/erts/etc/unix/etp-commands
+++ b/erts/etc/unix/etp-commands.in
@@ -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*
#
@@ -2730,6 +2757,10 @@ document etp-run
%---------------------------------------------------------------------------
end
+define etp-thr
+ source @ERL_TOP@/erts/etc/unix/etp-thr.py
+end
+
############################################################################
# Toolbox parameter handling
#
diff --git a/erts/etc/unix/etp-thr.py b/erts/etc/unix/etp-thr.py
new file mode 100644
index 0000000000..64fb858d20
--- /dev/null
+++ b/erts/etc/unix/etp-thr.py
@@ -0,0 +1,55 @@
+#
+# %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%
+#
+
+def get_thread_name(t):
+ f = gdb.newest_frame();
+ while f:
+ if f.name() == "async_main":
+ return "async";
+ elif f.name() == "erts_sys_main_thread":
+ return "main";
+ elif f.name() == "signal_dispatcher_thread_func":
+ return "signal_dispatcher";
+ elif f.name() == "sys_msg_dispatcher_func":
+ return "sys_msg_dispatcher";
+ elif f.name() == "child_waiter":
+ return "child_waiter";
+ elif f.name() == "sched_thread_func":
+ return "scheduler";
+ elif f.name() == "aux_thread":
+ return "aux";
+ f = f.older();
+ return "unknown";
+
+
+curr_thread = gdb.selected_thread();
+
+for i in gdb.inferiors():
+ gdb.write(" Id Thread Name Frame\n");
+ for t in i.threads():
+ t.switch();
+ if curr_thread == t:
+ gdb.write("*");
+ else:
+ gdb.write(" ");
+ gdb.write("{0:<3} {1:20} {2}\n".format(
+ t.num,get_thread_name(t),
+ gdb.newest_frame().name()));
+
+curr_thread.switch();
diff --git a/erts/etc/unix/run_erl.c b/erts/etc/unix/run_erl.c
index 53c779b1be..b69e31f784 100644
--- a/erts/etc/unix/run_erl.c
+++ b/erts/etc/unix/run_erl.c
@@ -1142,6 +1142,14 @@ static void daemon_init(void)
sf_close(i);
}
+ /* Necessary on some platforms */
+
+ open("/dev/null", O_RDONLY); /* Order is important! */
+ open("/dev/null", O_WRONLY);
+ open("/dev/null", O_WRONLY);
+
+ errno = 0; /* if set by open */
+
OPEN_SYSLOG();
run_daemon = 1;
}
diff --git a/erts/etc/unix/to_erl.c b/erts/etc/unix/to_erl.c
index 0f27b64811..b9e397cbf2 100644
--- a/erts/etc/unix/to_erl.c
+++ b/erts/etc/unix/to_erl.c
@@ -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/include/internal/ethread.h b/erts/include/internal/ethread.h
index ab728c65fa..38b8e9e9b6 100644
--- a/erts/include/internal/ethread.h
+++ b/erts/include/internal/ethread.h
@@ -361,6 +361,10 @@ extern ethr_runtime_t ethr_runtime__;
# endif
#endif /* !ETHR_DISABLE_NATIVE_IMPLS */
+#if !defined(ETHR_HAVE_NATIVE_ATOMIC32) && !defined(ETHR_HAVE_NATIVE_ATOMIC64) && !defined(ETHR_DISABLE_NATIVE_IMPLS) && defined(ETHR_SMP_REQUIRE_NATIVE_IMPLS)
+#error "No native ethread implementation found. If you want to use fallbacks you have to disable native ethread support with configure."
+#endif
+
#include "ethr_atomics.h" /* The atomics API */
#if defined(__GNUC__)
@@ -411,6 +415,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 +698,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/include/internal/gcc/ethread.h b/erts/include/internal/gcc/ethread.h
index fcfdc39441..365a3535cf 100644
--- a/erts/include/internal/gcc/ethread.h
+++ b/erts/include/internal/gcc/ethread.h
@@ -25,6 +25,9 @@
#ifndef ETHREAD_GCC_H__
#define ETHREAD_GCC_H__
+#if defined(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP32) \
+ || defined(ETHR_HAVE___SYNC_VAL_COMPARE_AND_SWAP64)
+
#ifndef ETHR_MEMBAR
# include "ethr_membar.h"
#endif
@@ -46,3 +49,5 @@
#endif
#endif
+
+#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/src/Makefile b/erts/preloaded/src/Makefile
index 7a7b7fb644..c1580b1495 100644
--- a/erts/preloaded/src/Makefile
+++ b/erts/preloaded/src/Makefile
@@ -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/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/test/Makefile b/erts/test/Makefile
index 6b409e2f1b..74a5bb1ccc 100644
--- a/erts/test/Makefile
+++ b/erts/test/Makefile
@@ -79,7 +79,7 @@ release_spec:
release_tests_spec: opt
$(INSTALL_DIR) "$(RELSYSDIR)"
- $(INSTALL_DATA) system.spec system.dynspec \
+ $(INSTALL_DATA) system.spec system.dynspec system_smoke.spec \
$(ERL_FILES) $(TARGET_FILES) "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
tar cf - *_SUITE_data utils | (cd "$(RELSYSDIR)"; tar xf -)
diff --git a/erts/test/erlc_SUITE.erl b/erts/test/erlc_SUITE.erl
index ab774dbc4f..ed7a43c7e7 100644
--- a/erts/test/erlc_SUITE.erl
+++ b/erts/test/erlc_SUITE.erl
@@ -23,7 +23,8 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2, compile_erl/1,
compile_yecc/1, compile_script/1,
- compile_mib/1, good_citizen/1, deep_cwd/1, arg_overflow/1]).
+ compile_mib/1, good_citizen/1, deep_cwd/1, arg_overflow/1,
+ make_dep_options/1]).
-include_lib("test_server/include/test_server.hrl").
@@ -31,7 +32,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
[compile_erl, compile_yecc, compile_script, compile_mib,
- good_citizen, deep_cwd, arg_overflow].
+ good_citizen, deep_cwd, arg_overflow, make_dep_options].
groups() ->
[].
@@ -255,13 +256,89 @@ erlc() ->
Erlc ->
"\"" ++ Erlc ++ "\""
end.
-
+
+make_dep_options(Config) ->
+ {SrcDir,OutDir,Cmd} = get_cmd(Config),
+ FileName = filename:join(SrcDir, "erl_test_ok.erl"),
+
+
+ DepRE = ["/erl_test_ok[.]beam: \\\\$",
+ "/system_test/erlc_SUITE_data/src/erl_test_ok[.]erl \\\\$",
+ "/system_test/erlc_SUITE_data/include/erl_test[.]hrl$",
+ "_OK_"],
+
+ DepRETarget =
+ ["^target: \\\\$",
+ "/system_test/erlc_SUITE_data/src/erl_test_ok[.]erl \\\\$",
+ "/system_test/erlc_SUITE_data/include/erl_test[.]hrl$",
+ "_OK_"],
+
+ DepREMP =
+ ["/erl_test_ok[.]beam: \\\\$",
+ "/system_test/erlc_SUITE_data/src/erl_test_ok[.]erl \\\\$",
+ "/system_test/erlc_SUITE_data/include/erl_test[.]hrl$",
+ [],
+ "/system_test/erlc_SUITE_data/include/erl_test.hrl:$",
+ "_OK_"],
+
+ DepREMissing =
+ ["/erl_test_missing_header[.]beam: \\\\$",
+ "/system_test/erlc_SUITE_data/src/erl_test_missing_header[.]erl \\\\$",
+ "/system_test/erlc_SUITE_data/include/erl_test[.]hrl \\\\$",
+ "missing.hrl$",
+ "_OK_"],
+
+ %% Test plain -M
+ run(Config, Cmd, FileName, "-M", DepRE),
+
+ %% Test -MF File
+ DepFile = filename:join(OutDir, "my.deps"),
+ run(Config, Cmd, FileName, "-MF "++DepFile, ["_OK_"]),
+ {ok,MFBin} = file:read_file(DepFile),
+ verify_result(binary_to_list(MFBin)++["_OK_"], DepRE),
+
+ %% Test -MD
+ run(Config, Cmd, FileName, "-MD", ["_OK_"]),
+ MDFile = filename:join(OutDir, "erl_test_ok.Pbeam"),
+ {ok,MFBin} = file:read_file(MDFile),
+
+ %% Test -M -MT Target
+ run(Config, Cmd, FileName, "-M -MT target", DepRETarget),
+
+ %% Test -MF File -MT Target
+ TargetDepFile = filename:join(OutDir, "target.deps"),
+ run(Config, Cmd, FileName, "-MF "++TargetDepFile++" -MT target",
+ ["_OK_"]),
+ {ok,TargetBin} = file:read_file(TargetDepFile),
+ verify_result(binary_to_list(TargetBin)++["_OK_"], DepRETarget),
+
+ %% Test -MD -MT Target
+ run(Config, Cmd, FileName, "-MD -MT target", ["_OK_"]),
+ TargetMDFile = filename:join(OutDir, "erl_test_ok.Pbeam"),
+ {ok,TargetBin} = file:read_file(TargetMDFile),
+
+ %% Test -M -MQ Target. (Note: Passing a $ on the command line
+ %% portably for Unix and Windows is tricky, so we will just test
+ %% that MQ works at all.)
+ run(Config, Cmd, FileName, "-M -MQ target", DepRETarget),
+
+ %% Test -M -MP
+ run(Config, Cmd, FileName, "-M -MP", DepREMP),
+
+ %% Test -M -MG
+ MissingHeader = filename:join(SrcDir, "erl_test_missing_header.erl"),
+ run(Config, Cmd, MissingHeader, "-M -MG", DepREMissing),
+ ok.
+
%% Runs a command.
run(Config, Cmd0, Name, Options, Expect) ->
Cmd = Cmd0 ++ " " ++ Options ++ " " ++ Name,
io:format("~s", [Cmd]),
Result = run_command(Config, Cmd),
+ verify_result(Result, Expect).
+
+verify_result(Result, Expect) ->
Messages = split(Result, [], []),
io:format("Result: ~p", [Messages]),
io:format("Expected: ~p", [Expect]),
diff --git a/erts/test/erlc_SUITE_data/src/erl_test_missing_header.erl b/erts/test/erlc_SUITE_data/src/erl_test_missing_header.erl
new file mode 100644
index 0000000000..4d6c42c803
--- /dev/null
+++ b/erts/test/erlc_SUITE_data/src/erl_test_missing_header.erl
@@ -0,0 +1,22 @@
+%%
+%% %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(erl_test_missing_header).
+-include("erl_test.hrl").
+-include("missing.hrl").
diff --git a/erts/test/system_smoke.spec b/erts/test/system_smoke.spec
new file mode 100644
index 0000000000..933d1ba22d
--- /dev/null
+++ b/erts/test/system_smoke.spec
@@ -0,0 +1,3 @@
+{suites,"../system_test",[ethread_SUITE]}.
+{cases,"../system_test",otp_SUITE,[undefined_functions]}.
+{skip_cases,"../system_test",ethread_SUITE,[max_threads],"Skip"}.
diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl
index f5355bfefe..bd37b690b6 100644
--- a/lib/common_test/src/ct_logs.erl
+++ b/lib/common_test/src/ct_logs.erl
@@ -446,6 +446,8 @@ tc_print(Category,Importance,Format,Args) ->
ct_util:get_verbosity('$unspecified');
{error,bad_invocation} ->
?MAX_VERBOSITY;
+ {error,_Failure} ->
+ ?MAX_VERBOSITY;
Val ->
Val
end,
@@ -690,14 +692,15 @@ logger_loop(State) ->
false ->
%% Group leader is dead, so write to the
%% CtLog or unexpected_io log instead
- unexpected_io(Pid,Category,List,State),
+ unexpected_io(Pid,Category,Importance,
+ List,State),
logger_loop(State)
end;
{ct_log,_Fd,TCGLs} ->
%% If category is ct_internal then write
%% to ct_log, else write to unexpected_io
%% log
- unexpected_io(Pid,Category,List,State),
+ unexpected_io(Pid,Category,Importance,List,State),
logger_loop(State#logger_state{
tc_groupleaders = TCGLs})
end;
@@ -798,7 +801,7 @@ print_to_log(sync, FromPid, Category, TCGL, List, State) ->
IoFun = create_io_fun(FromPid, State),
io:format(TCGL,"~ts", [lists:foldl(IoFun, [], List)]);
true ->
- unexpected_io(FromPid,Category,List,State)
+ unexpected_io(FromPid,Category,?MAX_IMPORTANCE,List,State)
end,
State;
@@ -814,7 +817,8 @@ print_to_log(async, FromPid, Category, TCGL, List, State) ->
end;
true ->
fun() ->
- unexpected_io(FromPid,Category,List,State)
+ unexpected_io(FromPid,Category,?MAX_IMPORTANCE,
+ List,State)
end
end,
case State#logger_state.async_print_jobs of
@@ -3066,10 +3070,20 @@ html_encoding(latin1) ->
html_encoding(utf8) ->
"utf-8".
-unexpected_io(Pid,ct_internal,List,#logger_state{ct_log_fd=Fd}=State) ->
+unexpected_io(Pid,ct_internal,_Importance,List,State) ->
IoFun = create_io_fun(Pid,State),
- io:format(Fd, "~ts", [lists:foldl(IoFun, [], List)]);
-unexpected_io(Pid,_Category,List,State) ->
+ io:format(State#logger_state.ct_log_fd, "~ts",
+ [lists:foldl(IoFun, [], List)]);
+unexpected_io(Pid,Category,Importance,List,State) ->
IoFun = create_io_fun(Pid,State),
Data = io_lib:format("~ts", [lists:foldl(IoFun, [], List)]),
- test_server_io:print_unexpected(Data).
+ %% if unexpected io comes in during startup or shutdown, test_server
+ %% might not be running - if so (noproc exit), simply print to
+ %% stdout instead (will result in double printouts when pal is used)
+ try test_server_io:print_unexpected(Data) of
+ _ ->
+ ok
+ catch
+ _:{noproc,_} -> tc_print(Category,Importance,Data,[]);
+ _:Reason -> exit(Reason)
+ end.
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_util.erl b/lib/common_test/src/ct_util.erl
index 68e76c2396..abda87c2cd 100644
--- a/lib/common_test/src/ct_util.erl
+++ b/lib/common_test/src/ct_util.erl
@@ -286,14 +286,23 @@ get_start_dir() ->
%% handle verbosity outside ct_util_server (let the client read
%% the verbosity table) to avoid possible deadlock situations
set_verbosity(Elem = {_Category,_Level}) ->
- ets:insert(?verbosity_table, Elem),
- ok.
+ try ets:insert(?verbosity_table, Elem) of
+ _ ->
+ ok
+ catch
+ _:Reason ->
+ {error,Reason}
+ end.
+
get_verbosity(Category) ->
- case ets:lookup(?verbosity_table, Category) of
+ try ets:lookup(?verbosity_table, Category) of
[{Category,Level}] ->
Level;
_ ->
undefined
+ catch
+ _:Reason ->
+ {error,Reason}
end.
loop(Mode,TestData,StartDir) ->
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/test/ct_test_support.erl b/lib/common_test/test/ct_test_support.erl
index 6bcac12326..4132995bf6 100644
--- a/lib/common_test/test/ct_test_support.erl
+++ b/lib/common_test/test/ct_test_support.erl
@@ -36,6 +36,8 @@
verify_events/3, verify_events/4, reformat/2, log_events/4,
join_abs_dirs/2]).
+-export([start_slave/3, slave_stop/1]).
+
-export([ct_test_halt/1]).
-include_lib("kernel/include/file.hrl").
@@ -66,10 +68,14 @@ init_per_suite(Config, Level) ->
start_slave(Config, Level).
-start_slave(Config,Level) ->
+start_slave(Config, Level) ->
+ start_slave(ct, Config, Level).
+
+start_slave(NodeName, Config, Level) ->
[_,Host] = string:tokens(atom_to_list(node()), "@"),
- test_server:format(0, "Trying to start ~s~n", ["ct@"++Host]),
- case slave:start(Host, ct, []) of
+ test_server:format(0, "Trying to start ~s~n",
+ [atom_to_list(NodeName)++"@"++Host]),
+ case slave:start(Host, NodeName, []) of
{error,Reason} ->
test_server:fail(Reason);
{ok,CTNode} ->
@@ -77,7 +83,7 @@ start_slave(Config,Level) ->
IsCover = test_server:is_cover(),
if IsCover ->
cover:start(CTNode);
- true->
+ true ->
ok
end,
diff --git a/lib/common_test/test/ct_verbosity_SUITE.erl b/lib/common_test/test/ct_verbosity_SUITE.erl
index 32488b1db9..1aa71953ec 100644
--- a/lib/common_test/test/ct_verbosity_SUITE.erl
+++ b/lib/common_test/test/ct_verbosity_SUITE.erl
@@ -53,9 +53,19 @@ init_per_suite(Config) ->
end_per_suite(Config) ->
ct_test_support:end_per_suite(Config).
+init_per_testcase(no_crashing, Config) ->
+ Opts = ct_test_support:start_slave(ctX, Config, 50),
+ XNode = proplists:get_value(ct_node, Opts),
+ ct:pal("Node ~p started!", [XNode]),
+ [{xnode,XNode} | Config];
init_per_testcase(TestCase, Config) ->
ct_test_support:init_per_testcase(TestCase, Config).
+end_per_testcase(no_crashing, Config) ->
+ XNode = proplists:get_value(xnode, Config),
+ ct_test_support:slave_stop(XNode),
+ ct:pal("Node ~p stopped!", [XNode]),
+ ok;
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
@@ -72,7 +82,8 @@ all() ->
combine_categories,
testspec_only,
merge_with_testspec,
- possible_deadlock
+ possible_deadlock,
+ no_crashing
].
%%--------------------------------------------------------------------
@@ -189,6 +200,19 @@ possible_deadlock(Config) ->
%%%-----------------------------------------------------------------
+%%%
+no_crashing(Config) ->
+ XNode = proplists:get_value(xnode, Config),
+ ok = rpc:call(XNode, ct, print, ["hello",[]]),
+ ok = rpc:call(XNode, ct, pal, ["hello",[]]),
+ ok = rpc:call(XNode, ct, log, ["hello",[]]),
+ Data = io_lib:format("hello", []),
+ {badrpc,{'EXIT',{noproc,_}}} =
+ (catch rpc:call(XNode, test_server_io, print_unexpected, [Data])),
+ ok.
+
+
+%%%-----------------------------------------------------------------
%%% HELP FUNCTIONS
%%%-----------------------------------------------------------------
diff --git a/lib/compiler/src/beam_bool.erl b/lib/compiler/src/beam_bool.erl
index cf5455dfde..124abd13c1 100644
--- a/lib/compiler/src/beam_bool.erl
+++ b/lib/compiler/src/beam_bool.erl
@@ -425,6 +425,9 @@ bopt_tree([], Forest, Pre) ->
safe_bool_op(N, Ar) ->
erl_internal:new_type_test(N, Ar) orelse erl_internal:comp_op(N, Ar).
+bopt_bool_args([V0,V0], Forest0) ->
+ {V,Forest} = bopt_bool_arg(V0, Forest0),
+ {[V,V],Forest};
bopt_bool_args(As, Forest) ->
mapfoldl(fun bopt_bool_arg/2, Forest, As).
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 d6fdcb2b21..1195937d91 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -956,7 +956,8 @@ lc_tq(Line, E, [Fil0|Qs0], Mc, St0) ->
args=[],
clauses=[#iclause{anno=LAnno,pats=[],
guard=Gs,body=Lps ++ [Lc]}],
- fc=#iclause{anno=LAnno,pats=[],guard=[],body=[Mc]}},
+ fc=#iclause{anno=LAnno#a{anno=[compiler_generated|LA]},
+ pats=[],guard=[],body=[Mc]}},
[],St2};
false ->
{Lc,Lps,St1} = lc_tq(Line, E, Qs0, Mc, St0),
@@ -1101,7 +1102,8 @@ bc_tq1(Line, E, [Fil0|Qs0], AccVar, St0) ->
clauses=[#iclause{anno=LAnno,
pats=[],
guard=Gs,body=Bps ++ [Bc]}],
- fc=#iclause{anno=LAnno,pats=[],guard=[],body=[AccVar]}},
+ fc=#iclause{anno=LAnno#a{anno=[compiler_generated|LA]},
+ pats=[],guard=[],body=[AccVar]}},
[],St};
false ->
{Bc,Bps,St1} = bc_tq1(Line, E, Qs0, AccVar, St0),
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/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl
index 5656d23090..a0a9bb7ddd 100644
--- a/lib/compiler/test/guard_SUITE.erl
+++ b/lib/compiler/test/guard_SUITE.erl
@@ -813,8 +813,16 @@ and_guard(Config) when is_list(Config) ->
?line ok = relprod({'Set',a,b}, {'Set',a,b}),
+ ok = and_same_var(42),
+ {'EXIT',{if_clause,_}} = (catch and_same_var(x)),
ok.
+and_same_var(V) ->
+ B = is_integer(V),
+ if
+ B or B -> ok
+ end.
+
relprod(R1, R2) when (erlang:size(R1) =:= 3) and (erlang:element(1,R1) =:= 'Set'), (erlang:size(R2) =:= 3) and (erlang:element(1,R2) =:= 'Set') ->
ok.
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/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl
index f00bfe663b..810b2b48c9 100644
--- a/lib/compiler/test/warnings_SUITE.erl
+++ b/lib/compiler/test/warnings_SUITE.erl
@@ -37,7 +37,7 @@
-export([pattern/1,pattern2/1,pattern3/1,pattern4/1,
guard/1,bad_arith/1,bool_cases/1,bad_apply/1,
- files/1,effect/1,bin_opt_info/1,bin_construction/1]).
+ files/1,effect/1,bin_opt_info/1,bin_construction/1, comprehensions/1]).
% Default timetrap timeout (set in init_per_testcase).
-define(default_timeout, ?t:minutes(2)).
@@ -61,7 +61,7 @@ groups() ->
[{p,test_lib:parallel(),
[pattern,pattern2,pattern3,pattern4,guard,
bad_arith,bool_cases,bad_apply,files,effect,
- bin_opt_info,bin_construction]}].
+ bin_opt_info,bin_construction,comprehensions]}].
init_per_suite(Config) ->
Config.
@@ -536,6 +536,16 @@ bin_construction(Config) when is_list(Config) ->
ok.
+comprehensions(Config) when is_list(Config) ->
+ Ts = [{tautologic_guards,
+ <<"
+ f() -> [ true || true ].
+ g() -> << <<1>> || true >>.
+ ">>,
+ [], []}],
+ run(Config, Ts),
+ ok.
+
%%%
%%% End of test cases.
%%%
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index 35de3dbf0c..c28ff8136c 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -242,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[]);
@@ -372,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)
@@ -472,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)
@@ -528,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
/*
@@ -570,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;
@@ -591,13 +579,6 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info)
return 0;
}
-#if defined(HAVE_EC)
- 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
-
if (library_refc > 0) {
/* Repeated loading of this library (module upgrade).
* Atoms and callbacks are already set, we are done.
@@ -639,8 +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);
+ }
#endif
init_digest_types(env);
@@ -1440,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);
@@ -2939,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;
@@ -3093,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;
}
@@ -3116,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)
{
@@ -3176,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;
@@ -3202,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;
@@ -3226,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,
@@ -3246,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[])
{
@@ -3258,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);
@@ -3274,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;
@@ -3303,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);
@@ -3337,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;
@@ -3364,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;
}
@@ -3381,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
@@ -3398,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;
@@ -3439,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/src/crypto.erl b/lib/crypto/src/crypto.erl
index a093b45410..8e8370f3b0 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -455,7 +455,7 @@ verify(rsa, Type, DataOrDigest, Signature, Key) ->
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
+ case ecdsa_verify_nif(Type, DataOrDigest, Signature, nif_curve_params(Curve), ensure_int_as_bin(Key)) of
notsup -> erlang:error(notsup);
Bool -> Bool
end.
@@ -474,7 +474,7 @@ sign(dss, Type, 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
+ 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.
@@ -557,7 +557,7 @@ generate_key(srp, {user, [Generator, Prime, Version]}, PrivateArg)
user_srp_gen_key(Private, Generator, Prime);
generate_key(ecdh, Curve, undefined) ->
- ec_key_to_term_nif(ec_key_generate(Curve)).
+ ec_key_generate(Curve).
compute_key(dh, OthersPublicKey, MyPrivateKey, DHParameters) ->
@@ -599,7 +599,8 @@ compute_key(srp, UserPublic, {HostPublic, HostPrivate},
compute_key(ecdh, Others, My, Curve) ->
ecdh_compute_key_nif(ensure_int_as_bin(Others),
- term_to_ec_key(Curve,My,undefined)).
+ nif_curve_params(Curve),
+ ensure_int_as_bin(My)).
random_bytes(N) ->
@@ -1399,11 +1400,11 @@ srp_value_B_nif(_Multiplier, _Verifier, _Generator, _Exponent, _Prime) -> ?nif_s
%% Digital signatures --------------------------------------------------------------------
rsa_sign_nif(_Type,_Data,_Key) -> ?nif_stub.
dss_sign_nif(_Type,_Data,_Key) -> ?nif_stub.
-ecdsa_sign_nif(_Type, _DataOrDigest, _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, _Key) -> ?nif_stub.
+ecdsa_verify_nif(_Type, _DataOrDigest, _Signature, _Curve, _Key) -> ?nif_stub.
%% Public Keys --------------------------------------------------------------------
%% DH Diffie-Hellman functions
@@ -1456,12 +1457,11 @@ dh_compute_key_nif(_OthersPublicKey, _MyPrivateKey, _DHParameters) -> ?nif_stub.
ec_key_generate(_Key) -> ?nif_stub.
-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)};
@@ -1469,19 +1469,12 @@ 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 --------------------------------------------------------------------
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/diameter/doc/src/diameter_dict.xml b/lib/diameter/doc/src/diameter_dict.xml
index 4fcde495b3..8bf4a14240 100644
--- a/lib/diameter/doc/src/diameter_dict.xml
+++ b/lib/diameter/doc/src/diameter_dict.xml
@@ -609,7 +609,9 @@ UTF8String() = [integer()]
<p>
List elements are the UTF-8 encodings of the individual characters
in the string.
-Invalid codepoints will result in encode/decode failure.</p>
+Invalid codepoints will result in encode/decode failure.
+On encode, a UTF8String() can be specified as a binary, or as a nested
+list of binaries and codepoints.</p>
<marker id="DiameterIdentity"/>
<pre>
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_types.erl b/lib/diameter/src/base/diameter_types.erl
index 9ae289034c..8c07e84777 100644
--- a/lib/diameter/src/base/diameter_types.erl
+++ b/lib/diameter/src/base/diameter_types.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
@@ -250,13 +250,10 @@
'Address'(encode, zero) ->
<<0:48>>;
-'Address'(decode, <<1:16, B/binary>>)
- when size(B) == 4 ->
- list_to_tuple(binary_to_list(B));
-
-'Address'(decode, <<2:16, B/binary>>)
- when size(B) == 16 ->
- list_to_tuple(v6dec(B, []));
+'Address'(decode, <<A:16, B/binary>>)
+ when 1 == A, 4 == size(B);
+ 2 == A, 16 == size(B) ->
+ list_to_tuple([N || <<N:A/unit:8>> <= B]);
'Address'(decode, <<A:16, _/binary>> = B)
when 1 == A;
@@ -264,30 +261,10 @@
?INVALID_LENGTH(B);
'Address'(encode, T) ->
- ipenc(diameter_lib:ipaddr(T)).
-
-ipenc(T)
- when is_tuple(T), size(T) == 4 ->
- B = list_to_binary(tuple_to_list(T)),
- <<1:16, B/binary>>;
-
-ipenc(T)
- when is_tuple(T), size(T) == 8 ->
- B = v6enc(lists:reverse(tuple_to_list(T)), <<>>),
- <<2:16, B/binary>>.
-
-v6dec(<<N:16, B/binary>>, Acc) ->
- v6dec(B, [N | Acc]);
-
-v6dec(<<>>, Acc) ->
- lists:reverse(Acc).
-
-v6enc([N | Rest], B)
- when ?UINT(16,N) ->
- v6enc(Rest, <<N:16, B/binary>>);
-
-v6enc([], B) ->
- B.
+ Ns = tuple_to_list(diameter_lib:ipaddr(T)), %% length 4 or 8
+ A = length(Ns) div 4, %% 1 or 2
+ B = << <<N:A/unit:8>> || N <- Ns >>,
+ <<A:16, B/binary>>.
%% --------------------
@@ -354,36 +331,13 @@ v6enc([], B) ->
%% --------------------
'UTF8String'(decode, Bin) ->
- udec(Bin, []);
+ tl([0|_] = unicode:characters_to_list([0, Bin])); %% assert list return
'UTF8String'(encode = M, zero) ->
'UTF8String'(M, []);
'UTF8String'(encode, S) ->
- uenc(S, []).
-
-udec(<<>>, Acc) ->
- lists:reverse(Acc);
-
-udec(<<C/utf8, Rest/binary>>, Acc) ->
- udec(Rest, [C | Acc]).
-
-uenc(E, Acc)
- when E == [];
- E == <<>> ->
- list_to_binary(lists:reverse(Acc));
-
-uenc(<<C/utf8, Rest/binary>>, Acc) ->
- uenc(Rest, [<<C/utf8>> | Acc]);
-
-uenc([[] | Rest], Acc) ->
- uenc(Rest, Acc);
-
-uenc([[H|T] | Rest], Acc) ->
- uenc([H, T | Rest], Acc);
-
-uenc([C | Rest], Acc) ->
- uenc(Rest, [<<C/utf8>> | Acc]).
+ <<_/binary>> = unicode:characters_to_binary(S). %% assert binary return
%% --------------------
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/test/diameter_codec_test.erl b/lib/diameter/test/diameter_codec_test.erl
index 24d4c7665e..295d23912b 100644
--- a/lib/diameter/test/diameter_codec_test.erl
+++ b/lib/diameter/test/diameter_codec_test.erl
@@ -1,3 +1,4 @@
+%% coding: utf-8
%%
%% %CopyrightBegin%
%%
@@ -19,7 +20,9 @@
-module(diameter_codec_test).
--compile(export_all).
+-export([base/0,
+ gen/1,
+ lib/0]).
%%
%% Test encode/decode of dictionary-related modules.
@@ -38,37 +41,34 @@
%% Interface.
base() ->
- [] = run([{?MODULE, [base, T]} || T <- [zero, decode]]).
+ [] = run([[fun base/1, T] || T <- [zero, decode]]).
gen(Mod) ->
Fs = [{Mod, F, []} || F <- [name, id, vendor_id, vendor_name]],
- [] = run(Fs ++ [{?MODULE, [gen, Mod, T]} || T <- [messages,
- command_codes,
- avp_types,
- grouped,
- enum,
- import_avps,
- import_groups,
- import_enums]]).
+ [] = run(Fs ++ [[fun gen/2, Mod, T] || T <- [messages,
+ command_codes,
+ avp_types,
+ grouped,
+ enum,
+ import_avps,
+ import_groups,
+ import_enums]]).
lib() ->
- Vs = {_,_} = values('Address'),
- [] = run([[fun lib/2, N, Vs] || N <- [1,2]]).
+ Vs = {_,_,_} = values('Address'),
+ [] = run([[fun lib/2, N, Vs] || N <- [{1, true}, {3, false}]]).
%% ===========================================================================
%% Internal functions.
-lib(N, {_,_} = T) ->
- B = 1 == N rem 2,
- [] = run([[fun lib/2, A, B] || A <- element(N,T)]);
+lib({N,B}, {_,_,_} = T) ->
+ [] = run([[fun lib/2, A, B] || A <- element(N,T), is_tuple(A)]);
lib(IP, B) ->
- LA = tuple_to_list(IP),
- {SA,Fun} = ip(LA),
- [] = run([[fun lib/4, IP, B, Fun, A] || A <- [IP, SA]]).
+ [] = run([[fun lib/3, IP, B, A] || A <- [IP, ntoa(tuple_to_list(IP))]]).
-lib(IP, B, Fun, A) ->
- try Fun(A) of
+lib(IP, B, A) ->
+ try diameter_lib:ipaddr(A) of
IP when B ->
ok
catch
@@ -76,12 +76,12 @@ lib(IP, B, Fun, A) ->
ok
end.
-ip([_,_,_,_] = A) ->
+ntoa([_,_,_,_] = A) ->
[$.|S] = lists:append(["." ++ integer_to_list(N) || N <- A]),
- {S, fun diameter_lib:ipaddr/1};
-ip([_,_,_,_,_,_,_,_] = A) ->
+ S;
+ntoa([_,_,_,_,_,_,_,_] = A) ->
[$:|S] = lists:flatten([":" ++ io_lib:format("~.16B", [N]) || N <- A]),
- {S, fun diameter_lib:ipaddr/1}.
+ S.
%% ------------------------------------------------------------------------
%% base/1
@@ -90,7 +90,7 @@ ip([_,_,_,_,_,_,_,_] = A) ->
%% ------------------------------------------------------------------------
base(T) ->
- [] = run([{?MODULE, [base, T, F]} || F <- types()]).
+ [] = run([[fun base/2, T, F] || F <- types()]).
%% Ensure that 'zero' values encode only zeros.
base(zero = T, F) ->
@@ -100,32 +100,23 @@ base(zero = T, F) ->
%% Ensure that we can decode what we encode and vice-versa, and that
%% we can't decode invalid values.
base(decode, F) ->
- {Eq, Vs, Ns} = b(values(F)),
- [] = run([{?MODULE, [base_decode, F, Eq, V]} || V <- Vs]),
- [] = run([{?MODULE, [base_invalid, F, Eq, V]} || V <- Ns]).
+ {Ts, Fs, Is} = values(F),
+ [] = run([[fun base_decode/3, F, true, V] || V <- Ts]),
+ [] = run([[fun base_decode/3, F, false, V] || V <- Fs]),
+ [] = run([[fun base_invalid/2, F, V] || V <- Is]).
base_decode(F, Eq, Value) ->
d(fun(X,V) -> diameter_types:F(X,V) end, Eq, Value).
-base_invalid(F, Eq, Value) ->
+base_invalid(F, Value) ->
try
- base_decode(F, Eq, Value),
+ base_decode(F, false, Value),
exit(nok)
catch
error: _ ->
ok
end.
-b({_,_,_} = T) ->
- T;
-b({B,Vs})
- when is_atom(B) ->
- {B,Vs,[]};
-b({Vs,Ns}) ->
- {true, Vs, Ns};
-b(Vs) ->
- {true, Vs, []}.
-
types() ->
[F || {F,2} <- diameter_types:module_info(exports)].
@@ -136,7 +127,7 @@ types() ->
%% ------------------------------------------------------------------------
gen(M, T) ->
- [] = run(lists:map(fun(X) -> {?MODULE, [gen, M, T, X]} end,
+ [] = run(lists:map(fun(X) -> [fun gen/3, M, T, X] end,
fetch(T, dict(M)))).
fetch(T, Spec) ->
@@ -197,18 +188,20 @@ gen(M, enum = T, {Name, ED})
gen(M, T, {?A(Name), lists:map(fun({E,D}) -> {?A(E), D} end, ED)});
gen(M, enum, {Name, ED}) ->
- [] = run([{?MODULE, [enum, M, Name, T]} || T <- ED]);
+ [] = run([[fun enum/3, M, Name, T] || T <- ED]);
gen(M, Tag, {_Mod, L}) ->
T = retag(Tag),
- [] = run([{?MODULE, [gen, M, T, I]} || I <- L]).
+ [] = run([[fun gen/3, M, T, I] || I <- L]).
%% avp_decode/3
avp_decode(Mod, Type, Name) ->
- {Eq, Vs, _} = b(values(Type, Name, Mod)),
- [] = run([{?MODULE, [avp_decode, Mod, Name, Type, Eq, V]}
- || V <- v(Vs)]).
+ {Ts, Fs, _} = values(Type, Name, Mod),
+ [] = run([[fun avp_decode/5, Mod, Name, Type, true, V]
+ || V <- v(Ts)]),
+ [] = run([[fun avp_decode/5, Mod, Name, Type, false, V]
+ || V <- v(Fs)]).
avp_decode(Mod, Name, Type, Eq, Value) ->
d(fun(X,V) -> avp(Mod, X, V, Name, Type) end, Eq, Value).
@@ -250,7 +243,7 @@ v(N, Ord, E, Acc) ->
arity(M, Name, Rname) ->
Rec = M:'#new-'(Rname),
- [] = run([{?MODULE, [arity, M, Name, F, Rec]}
+ [] = run([[fun arity/4, M, Name, F, Rec]
|| F <- M:'#info-'(Rname, fields)]).
arity(M, Name, AvpName, Rec) ->
@@ -299,68 +292,93 @@ z(B) ->
%% tested.)
values('OctetString' = T) ->
- {["", atom_to_list(T)], [-1, 256]};
+ {["", atom_to_list(T)],
+ [],
+ [-1, 256]};
values('Integer32') ->
Mx = (1 bsl 31) - 1,
Mn = -1*Mx,
- {[Mn, 0, random(Mn,Mx), Mx], [Mn - 1, Mx + 1]};
+ {[Mn, 0, random(Mn,Mx), Mx],
+ [],
+ [Mn - 1, Mx + 1]};
values('Integer64') ->
Mx = (1 bsl 63) - 1,
Mn = -1*Mx,
- {[Mn, 0, random(Mn,Mx), Mx], [Mn - 1, Mx + 1]};
+ {[Mn, 0, random(Mn,Mx), Mx],
+ [],
+ [Mn - 1, Mx + 1]};
values('Unsigned32') ->
M = (1 bsl 32) - 1,
- {[0, random(M), M], [-1, M + 1]};
+ {[0, random(M), M],
+ [],
+ [-1, M + 1]};
values('Unsigned64') ->
M = (1 bsl 64) - 1,
- {[0, random(M), M], [-1, M + 1]};
+ {[0, random(M), M],
+ [],
+ [-1, M + 1]};
values('Float32') ->
E = (1 bsl 8) - 2,
F = (1 bsl 23) - 1,
<<Mx:32/float>> = <<0:1, E:8, F:23>>,
<<Mn:32/float>> = <<1:1, E:8, F:23>>,
- {[0.0, infinity, '-infinity', Mx, Mn], [0]};
+ {[0.0, infinity, '-infinity', Mx, Mn],
+ [],
+ [0]};
values('Float64') ->
E = (1 bsl 11) - 2,
F = (1 bsl 52) - 1,
<<Mx:64/float>> = <<0:1, E:11, F:52>>,
<<Mn:64/float>> = <<1:1, E:11, F:52>>,
- {[0.0, infinity, '-infinity', Mx, Mn], [0]};
+ {[0.0, infinity, '-infinity', Mx, Mn],
+ [],
+ [0]};
values('Address') ->
{[{255,0,random(16#FF),1}, {65535,0,0,random(16#FFFF),0,0,0,1}],
- [{256,0,0,1}, {65536,0,0,0,0,0,0,1}]};
+ ["127.0.0.1", "FFFF:FF::1.2.3.4"],
+ [{256,0,0,1}, {65536,0,0,0,0,0,0,1}, "256.0.0.1", "10000::1"]};
values('DiameterIdentity') ->
- {["x", "diameter.com"], [""]};
+ {["x", "diameter.com"],
+ [],
+ [""]};
values('DiameterURI') ->
- {false, ["aaa" ++ S ++ "://diameter.se" ++ P ++ Tr ++ Pr
- || S <- ["", "s"],
- P <- ["", ":1234"],
- Tr <- ["" | [";transport=" ++ X
- || X <- ["tcp", "sctp", "udp"]]],
- Pr <- ["" | [";protocol=" ++ X
- || X <- ["diameter","radius","tacacs+"]]]]};
+ {[],
+ ["aaa" ++ S ++ "://diameter.se" ++ P ++ Tr ++ Pr
+ || S <- ["", "s"],
+ P <- ["", ":1234"],
+ Tr <- ["" | [";transport=" ++ X
+ || X <- ["tcp", "sctp", "udp"]]],
+ Pr <- ["" | [";protocol=" ++ X
+ || X <- ["diameter","radius","tacacs+"]]]],
+ []};
values(T)
when T == 'IPFilterRule';
T == 'QoSFilterRule' ->
- ["deny in 0 from 127.0.0.1 to 10.0.0.1"];
+ {["deny in 0 from 127.0.0.1 to 10.0.0.1"],
+ [],
+ []};
%% RFC 3629 defines the UTF-8 encoding of U+0000 through U+10FFFF with the
%% exception of U+D800 through U+DFFF.
values('UTF8String') ->
+ S = "ᚠᚢᚦᚨᚱᚲ",
+ B = unicode:characters_to_binary(S),
{[[],
+ S,
lists:seq(0,16#1FF),
[0,16#D7FF,16#E000,16#10FFFF],
[random(16#D7FF), random(16#E000,16#10FFFF)]],
+ [B, [B, S, hd(S)], [S, B]],
[[-1],
[16#D800],
[16#DFFF],
@@ -372,6 +390,7 @@ values('Time') ->
{{2036,2,7},{6,28,15}},
{{2036,2,7},{6,28,16}}, %% 19000101T000000 + 2 bsl 31
{{2104,2,26},{9,42,23}}],
+ [],
[{{1968,1,20},{3,14,7}},
{{2104,2,26},{9,42,24}}]}. %% 19000101T000000 + 3 bsl 31
@@ -382,18 +401,24 @@ values('Time') ->
values('Enumerated', Name, Mod) ->
{_Name, Vals} = lists:keyfind(?S(Name), 1, types(enum, Mod)),
- lists:map(fun({_,N}) -> N end, Vals);
+ {lists:map(fun({_,N}) -> N end, Vals),
+ [],
+ []};
values('Grouped', Name, Mod) ->
Rname = Mod:name2rec(Name),
Rec = Mod:'#new-'(Rname),
Avps = Mod:'#info-'(Rname, fields),
- Enum = diameter_enum:combine(lists:map(fun({_,Vs,_}) -> to_enum(Vs) end,
+ Enum = diameter_enum:combine(lists:map(fun({Vs,_,_}) -> to_enum(Vs) end,
[values(F, Mod) || F <- Avps])),
- {false, diameter_enum:append(group(Mod, Name, Rec, Avps, Enum))};
+ {[],
+ diameter_enum:append(group(Mod, Name, Rec, Avps, Enum)),
+ []};
values(_, 'Framed-IP-Address', _) ->
- [{127,0,0,1}];
+ {[{127,0,0,1}],
+ [],
+ []};
values(Type, _, _) ->
values(Type).
@@ -407,12 +432,14 @@ to_enum(E) ->
%% values/2
values('AVP', _) ->
- {true, [#diameter_avp{code = 0, data = <<0>>}], []};
+ {[#diameter_avp{code = 0, data = <<0>>}],
+ [],
+ []};
values(Name, Mod) ->
Avps = types(avp_types, Mod),
{_Name, _Code, Type, _Flags} = lists:keyfind(?S(Name), 1, Avps),
- b(values(?A(Type), Name, Mod)).
+ values(?A(Type), Name, Mod).
%% group/5
%%
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/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/test/Makefile b/lib/erl_interface/test/Makefile
index 2b85dfc571..1ed34c74a0 100644
--- a/lib/erl_interface/test/Makefile
+++ b/lib/erl_interface/test/Makefile
@@ -42,7 +42,7 @@ MODULES= \
runner
SPEC_FILES = \
- erl_interface.spec
+ erl_interface.spec erl_interface_smoke.spec
COVER_FILE = erl_interface.cover
diff --git a/lib/erl_interface/test/erl_interface_smoke.spec b/lib/erl_interface/test/erl_interface_smoke.spec
new file mode 100644
index 0000000000..bfaea2b279
--- /dev/null
+++ b/lib/erl_interface/test/erl_interface_smoke.spec
@@ -0,0 +1 @@
+{suites,"../erl_interface_test",[ei_decode_encode_SUITE]}.
diff --git a/lib/eunit/include/eunit.hrl b/lib/eunit/include/eunit.hrl
index 8ebdb6ba16..84242a09aa 100644
--- a/lib/eunit/include/eunit.hrl
+++ b/lib/eunit/include/eunit.hrl
@@ -102,7 +102,7 @@
%% X gets a new, local binding.
%% (Note that lowercase 'let' is a reserved word.)
-ifndef(LET).
--define(LET(X,Y,Z), ((fun(X)->(Z)end)(Y))).
+-define(LET(X,Y,Z), begin ((fun(X)->(Z)end)(Y)) end).
-endif.
%% It is important that testing code is short and readable.
@@ -110,13 +110,13 @@
%% Compare: case f(X) of true->g(X); false->h(X) end
%% and: ?IF(f(X), g(Y), h(Z))
-ifndef(IF).
--define(IF(B,T,F), (case (B) of true->(T); false->(F) end)).
+-define(IF(B,T,F), begin (case (B) of true->(T); false->(F) end) end).
-endif.
%% This macro yields 'true' if the value of E matches the guarded
%% pattern G, otherwise 'false'.
-ifndef(MATCHES).
--define(MATCHES(G,E), (case (E) of G -> true; _ -> false end)).
+-define(MATCHES(G,E), begin (case (E) of G -> true; _ -> false end) end).
-endif.
%% This macro can be used at any time to check whether or not the code
@@ -140,6 +140,7 @@
%% for clauses that cannot match, even if the expression is a constant.
-undef(assert).
-define(assert(BoolExpr),
+ begin
((fun () ->
case (BoolExpr) of
true -> ok;
@@ -152,7 +153,8 @@
_ -> {not_a_boolean,__V}
end}]})
end
- end)())).
+ end)())
+ end).
-endif.
-define(assertNot(BoolExpr), ?assert(not (BoolExpr))).
@@ -168,6 +170,7 @@
-define(assertMatch(Guard, Expr), ok).
-else.
-define(assertMatch(Guard, Expr),
+ begin
((fun () ->
case (Expr) of
Guard -> ok;
@@ -178,7 +181,8 @@
{pattern, (??Guard)},
{value, __V}]})
end
- end)())).
+ end)())
+ end).
-endif.
-define(_assertMatch(Guard, Expr), ?_test(?assertMatch(Guard, Expr))).
@@ -187,6 +191,7 @@
-define(assertNotMatch(Guard, Expr), ok).
-else.
-define(assertNotMatch(Guard, Expr),
+ begin
((fun () ->
__V = (Expr),
case __V of
@@ -198,7 +203,8 @@
{value, __V}]});
_ -> ok
end
- end)())).
+ end)())
+ end).
-endif.
-define(_assertNotMatch(Guard, Expr), ?_test(?assertNotMatch(Guard, Expr))).
@@ -208,6 +214,7 @@
-define(assertEqual(Expect, Expr), ok).
-else.
-define(assertEqual(Expect, Expr),
+ begin
((fun (__X) ->
case (Expr) of
__X -> ok;
@@ -218,7 +225,8 @@
{expected, __X},
{value, __V}]})
end
- end)(Expect))).
+ end)(Expect))
+ end).
-endif.
-define(_assertEqual(Expect, Expr), ?_test(?assertEqual(Expect, Expr))).
@@ -227,6 +235,7 @@
-define(assertNotEqual(Unexpected, Expr), ok).
-else.
-define(assertNotEqual(Unexpected, Expr),
+ begin
((fun (__X) ->
case (Expr) of
__X -> erlang:error({assertNotEqual_failed,
@@ -236,7 +245,8 @@
{value, __X}]});
_ -> ok
end
- end)(Unexpected))).
+ end)(Unexpected))
+ end).
-endif.
-define(_assertNotEqual(Unexpected, Expr),
?_test(?assertNotEqual(Unexpected, Expr))).
@@ -247,6 +257,7 @@
-define(assertException(Class, Term, Expr), ok).
-else.
-define(assertException(Class, Term, Expr),
+ begin
((fun () ->
try (Expr) of
__V -> erlang:error({assertException_failed,
@@ -271,7 +282,8 @@
{__C, __T,
erlang:get_stacktrace()}}]})
end
- end)())).
+ end)())
+ end).
-endif.
-define(assertError(Term, Expr), ?assertException(error, Term, Expr)).
@@ -291,6 +303,7 @@
-define(assertNotException(Class, Term, Expr), ok).
-else.
-define(assertNotException(Class, Term, Expr),
+ begin
((fun () ->
try (Expr) of
_ -> ok
@@ -316,7 +329,8 @@
_ -> ok
end
end
- end)())).
+ end)())
+ end).
-endif.
-define(_assertNotException(Class, Term, Expr),
?_test(?assertNotException(Class, Term, Expr))).
@@ -327,6 +341,7 @@
%% these can be used for simply running commands in a controlled way
-define(_cmd_(Cmd), (eunit_lib:command(Cmd))).
-define(cmdStatus(N, Cmd),
+ begin
((fun () ->
case ?_cmd_(Cmd) of
{(N), __Out} -> __Out;
@@ -337,7 +352,8 @@
{expected_status,(N)},
{status,__N}]})
end
- end)())).
+ end)())
+ end).
-define(_cmdStatus(N, Cmd), ?_test(?cmdStatus(N, Cmd))).
-define(cmd(Cmd), ?cmdStatus(0, Cmd)).
-define(_cmd(Cmd), ?_test(?cmd(Cmd))).
@@ -348,6 +364,7 @@
-define(assertCmdStatus(N, Cmd), ok).
-else.
-define(assertCmdStatus(N, Cmd),
+ begin
((fun () ->
case ?_cmd_(Cmd) of
{(N), _} -> ok;
@@ -358,7 +375,8 @@
{expected_status,(N)},
{status,__N}]})
end
- end)())).
+ end)())
+ end).
-endif.
-define(assertCmd(Cmd), ?assertCmdStatus(0, Cmd)).
@@ -366,6 +384,7 @@
-define(assertCmdOutput(T, Cmd), ok).
-else.
-define(assertCmdOutput(T, Cmd),
+ begin
((fun () ->
case ?_cmd_(Cmd) of
{_, (T)} -> ok;
@@ -376,7 +395,8 @@
{expected_output,(T)},
{output,__T}]})
end
- end)())).
+ end)())
+ end).
-endif.
-define(_assertCmdStatus(N, Cmd), ?_test(?assertCmdStatus(N, Cmd))).
@@ -394,26 +414,30 @@
-define(debugTime(S, E), (E)).
-else.
-define(debugMsg(S),
- (begin
- io:fwrite(user, <<"~s:~w:~w: ~s\n">>,
- [?FILE, ?LINE, self(), S]),
- ok
- end)).
+ begin
+ io:fwrite(user, <<"~s:~w:~w: ~s\n">>,
+ [?FILE, ?LINE, self(), S]),
+ ok
+ end).
-define(debugHere, (?debugMsg("<-"))).
-define(debugFmt(S, As), (?debugMsg(io_lib:format((S), (As))))).
-define(debugVal(E),
+ begin
((fun (__V) ->
?debugFmt(<<"~s = ~P">>, [(??E), __V, 15]),
__V
- end)(E))).
+ end)(E))
+ end).
-define(debugTime(S, E),
+ begin
((fun () ->
{__T0, _} = statistics(wall_clock),
__V = (E),
{__T1, _} = statistics(wall_clock),
?debugFmt(<<"~s: ~.3f s">>, [(S), (__T1-__T0)/1000]),
__V
- end)())).
+ end)())
+ end).
-endif.
diff --git a/lib/ic/test/Makefile b/lib/ic/test/Makefile
index 54ac186c16..63af6ed9f1 100644
--- a/lib/ic/test/Makefile
+++ b/lib/ic/test/Makefile
@@ -33,7 +33,7 @@ RELSYSDIR = $(RELEASE_PATH)/ic_test
# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
-TEST_SPEC_FILE = ic.spec
+TEST_SPEC_FILE = ic.spec ic_smoke.spec
IDL_FILES =
diff --git a/lib/ic/test/ic_smoke.spec b/lib/ic/test/ic_smoke.spec
new file mode 100644
index 0000000000..ec3b5758b1
--- /dev/null
+++ b/lib/ic/test/ic_smoke.spec
@@ -0,0 +1 @@
+{suites,"../ic_test",[ic_SUITE]}.
diff --git a/lib/inets/doc/src/httpc.xml b/lib/inets/doc/src/httpc.xml
index 741f2abaef..d9a27e7d1e 100644
--- a/lib/inets/doc/src/httpc.xml
+++ b/lib/inets/doc/src/httpc.xml
@@ -300,11 +300,11 @@ filename() = string()
process or to a file. When streaming to the calling process
using the option <c>self</c> the following stream messages
will be sent to that process: <c>{http, {RequestId,
- stream_start, Headers}, {http, {RequestId, stream,
- BinBodyPart}, {http, {RequestId, stream_end, Headers}</c>. When
+ stream_start, Headers}}, {http, {RequestId, stream,
+ BinBodyPart}}, {http, {RequestId, stream_end, Headers}}</c>. When
streaming to to the calling processes using the option
<c>{self, once}</c> the first message will have an additional
- element e.i. <c>{http, {RequestId, stream_start, Headers, Pid}</c>,
+ element e.i. <c>{http, {RequestId, stream_start, Headers, Pid}}</c>,
this is the process id that should be used as an argument to
<c>http:stream_next/1</c> to trigger the next message to be sent to
the calling process. </p>
diff --git a/lib/inets/doc/src/httpd.xml b/lib/inets/doc/src/httpd.xml
index 8438961511..4210aea3ec 100644
--- a/lib/inets/doc/src/httpd.xml
+++ b/lib/inets/doc/src/httpd.xml
@@ -251,14 +251,14 @@
</item>
<marker id="prop_max_uri"></marker>
- <tag>{max_uri, integer()}</tag>
+ <tag>{max_uri_size, integer()}</tag>
<item>
<p>Limits the size of the HTTP request URI. By
default there is no limit. </p>
</item>
<marker id="prop_max_keep_alive_req"></marker>
- <tag>{max_keep_alive_requests, integer()}</tag>
+ <tag>{max_keep_alive_request, integer()}</tag>
<item>
<p>The number of request that a client can do on one
connection. When the server has responded to the number of
@@ -406,7 +406,7 @@ bytes
begins with url-path is mapped to local files that begins with
directory-filename, for example:
- <code>{alias, {"/image", "/ftp/pub/image"}</code>
+ <code>{alias, {"/image", "/ftp/pub/image"}}</code>
and an access to http://your.server.org/image/foo.gif would refer to
the file /ftp/pub/image/foo.gif. </p>
@@ -421,7 +421,7 @@ bytes
by re:replace/3 to produce a path in the local filesystem.
For example:
- <code>{re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}</code>
+ <code>{re_write, {"^/[~]([^/]+)(.*)$", "/home/\\1/public\\2"}}</code>
and an access to http://your.server.org/~bob/foo.gif would refer to
the file /home/bob/public/foo.gif.
@@ -468,7 +468,7 @@ bytes
scripts. URLs with a path beginning with url-path are mapped to
scripts beginning with directory-filename, for example:
- <code>{script_alias, {"/cgi-bin/", "/web/cgi-bin/"}</code>
+ <code>{script_alias, {"/cgi-bin/", "/web/cgi-bin/"}}</code>
and an access to http://your.server.org/cgi-bin/foo would cause
the server to run the script /web/cgi-bin/foo. </p>
@@ -483,7 +483,7 @@ bytes
scripts. URLs with a path beginning with url-path are mapped to
scripts beginning with directory-filename, for example:
- <code>{script_re_write, {"^/cgi-bin/(\\d+)/", "/web/\\1/cgi-bin/"}</code>
+ <code>{script_re_write, {"^/cgi-bin/(\\d+)/", "/web/\\1/cgi-bin/"}}</code>
and an access to http://your.server.org/cgi-bin/17/foo would cause
the server to run the script /web/17/cgi-bin/foo. </p>
@@ -517,7 +517,7 @@ bytes
the standard CGI PATH_INFO and PATH_TRANSLATED environment
variables.
- <code>{action, {"text/plain", "/cgi-bin/log_and_deliver_text"}</code>
+ <code>{action, {"text/plain", "/cgi-bin/log_and_deliver_text"}}</code>
</p>
</item>
@@ -532,7 +532,7 @@ bytes
the standard CGI PATH_INFO and PATH_TRANSLATED environment
variables.
- <code>{script, {"PUT", "/cgi-bin/put"}</code>
+ <code>{script, {"PUT", "/cgi-bin/put"}}</code>
</p>
</item>
@@ -549,7 +549,7 @@ bytes
scheme scripts. A matching URL is mapped into a specific module
and function. For example:
- <code>{erl_script_alias, {"/cgi-bin/example", [httpd_example]}
+ <code>{erl_script_alias, {"/cgi-bin/example", [httpd_example]}}
</code>
and a request to
@@ -632,7 +632,7 @@ bytes
</item>
<marker id="prop_edlog"></marker>
- <tag>{error_disk_log, internal | external}</tag>
+ <tag>{error_disk_log, path()}</tag>
<item>
<p>Defines the filename of the (disk_log(3)) error log file
to be used to log server errors. If the filename does not begin
@@ -706,7 +706,7 @@ bytes
For example:
- <code>{allow_from, ["123.34.56.11", "150.100.23"] </code>
+ <code>{allow_from, ["123.34.56.11", "150.100.23"]}</code>
The host 123.34.56.11 and all machines on the 150.100.23
subnet are allowed access. </p>
@@ -719,7 +719,7 @@ bytes
which should be denied access to a given directory.
For example:
- <code>{deny_from, ["123.34.56.11", "150.100.23"] </code>
+ <code>{deny_from, ["123.34.56.11", "150.100.23"]}</code>
The host 123.34.56.11 and all machines on the 150.100.23
subnet are not allowed access. </p>
@@ -835,7 +835,7 @@ bytes
<p><em>Security properties - requires mod_security </em></p>
<marker id="prop_sec_dir"></marker>
- <p><em>{security_directory, {path(), [{property(), term()}]}</em></p>
+ <p><em>{security_directory, {path(), [{property(), term()}]}}</em></p>
<marker id="props_sdir"></marker>
<p>Here follows the valid properties for security directories</p>
@@ -1067,7 +1067,7 @@ bytes
<fsummary>Called for each request to the Web server.</fsummary>
<type>
<v>OldData = list()</v>
- <v>NewData = [{response,{StatusCode,Body}}] | [{response,{response,Head,Body}}] | [{response,{already_sent,Statuscode,Size}] </v>
+ <v>NewData = [{response,{StatusCode,Body}}] | [{response,{response,Head,Body}}] | [{response,{already_sent,Statuscode,Size}}] </v>
<v>StausCode = integer()</v>
<v>Body = io_list() | nobody | {Fun, Arg}</v>
<v>Head = [HeaderOption]</v>
diff --git a/lib/inets/doc/src/httpd_util.xml b/lib/inets/doc/src/httpd_util.xml
index 9f290084d2..9218ee91e2 100644
--- a/lib/inets/doc/src/httpd_util.xml
+++ b/lib/inets/doc/src/httpd_util.xml
@@ -337,10 +337,10 @@
<func>
<name>rfc1123_date() -> RFC1123Date</name>
- <name>rfc1123_date({{YYYY,MM,DD},{Hour,Min,Sec}}}) -> RFC1123Date</name>
+ <name>rfc1123_date({{YYYY,MM,DD},{Hour,Min,Sec}}) -> RFC1123Date</name>
<fsummary>Return the current date in RFC 1123 format.</fsummary>
<type>
- <v>YYYY = MM = DD = Hour = Min =Sec = integer()</v>
+ <v>YYYY = MM = DD = Hour = Min = Sec = integer()</v>
<v>RFC1123Date = string()</v>
</type>
<desc>
diff --git a/lib/inets/doc/src/mod_alias.xml b/lib/inets/doc/src/mod_alias.xml
index 265a1b8e76..b38be5db28 100644
--- a/lib/inets/doc/src/mod_alias.xml
+++ b/lib/inets/doc/src/mod_alias.xml
@@ -118,7 +118,7 @@
</func>
<func>
- <name>real_script_name(ConfigDB,RequestURI,ScriptAliases) -> Ret</name>
+ <name>real_script_name(ConfigDB, RequestURI, ScriptAliases) -> Ret</name>
<fsummary>Expand a request uri using ScriptAlias config directives.</fsummary>
<type>
<v>ConfigDB = config_db()</v>
@@ -129,7 +129,7 @@
</type>
<desc>
<marker id="real_script_name"></marker>
- <p><c>real_name/3</c> traverses <c>ScriptAliases</c>,
+ <p><c>real_script_name/3</c> traverses <c>ScriptAliases</c>,
typically extracted from <c>ConfigDB</c>, and matches each
<c>FakeName</c> with <c>RequestURI</c>. If a match is found
<c>FakeName</c> is replaced with <c>RealName</c> in the
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index 72d67ddb4a..d2e7ade5d6 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -32,7 +32,6 @@
<file>notes.xml</file>
</header>
-
<section><title>Inets 5.9.5</title>
<section><title>Fixed Bugs and Malfunctions</title>
@@ -93,7 +92,6 @@
</section>
<section><title>Inets 5.9.4</title>
-
<section><title>Improvements and New Features</title>
<list>
<item>
@@ -161,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/doc/src/notes_history.xml b/lib/inets/doc/src/notes_history.xml
index bd59c1ba47..4162ab97bb 100644
--- a/lib/inets/doc/src/notes_history.xml
+++ b/lib/inets/doc/src/notes_history.xml
@@ -834,7 +834,7 @@
<list type="bulleted">
<item>
<p>[ftp, client] - A new option {progress, {CBmodule,
- CBFunction, InitProgressTerm} has been added to allow
+ CBFunction, InitProgressTerm}} has been added to allow
users to create things such as progress bars in there
GUI's. The option affects ftp:send/[3,4] and
ftp:recv/[3,4].</p>
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 41bba7995e..4d7023a8e9 100644
--- a/lib/inets/src/http_client/httpc.erl
+++ b/lib/inets/src/http_client/httpc.erl
@@ -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_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/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/jinterface/test/Makefile b/lib/jinterface/test/Makefile
index d9ff406994..90d4e01035 100644
--- a/lib/jinterface/test/Makefile
+++ b/lib/jinterface/test/Makefile
@@ -32,7 +32,7 @@ RELSYSDIR = $(RELEASE_PATH)/jinterface_test
# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
-TEST_SPEC_FILE = jinterface.spec
+TEST_SPEC_FILE = jinterface.spec jinterface_smoke.spec
COVER_FILE = jinterface.cover
MODULES = nc_SUITE \
diff --git a/lib/jinterface/test/jinterface_smoke.spec b/lib/jinterface/test/jinterface_smoke.spec
new file mode 100644
index 0000000000..4a76cce4cd
--- /dev/null
+++ b/lib/jinterface/test/jinterface_smoke.spec
@@ -0,0 +1 @@
+{cases,"../jinterface_test",jinterface_SUITE,[java_erlang_send_receive]}.
diff --git a/lib/kernel/doc/src/application.xml b/lib/kernel/doc/src/application.xml
index 362c373c6c..3909b11e59 100644
--- a/lib/kernel/doc/src/application.xml
+++ b/lib/kernel/doc/src/application.xml
@@ -253,15 +253,30 @@ Nodes = [cp1@cave, {cp2@cave, cp3@cave}]</code>
</warning>
</desc>
</func>
- <func>
+ <func>
<name name="ensure_started" arity="1"/>
<name name="ensure_started" arity="2"/>
<fsummary>Load and start an application</fsummary>
- <desc>
- <p>Equivalent to <seealso marker="#start/2"><c>application:start/1,2</c></seealso> except
- it returns <c>ok</c> for already started applications.</p>
- </desc>
- </func>
+ <desc>
+ <p>Equivalent to <seealso marker="#start/2"><c>application:start/1,2</c></seealso> except
+ it returns <c>ok</c> for already started applications.</p>
+ </desc>
+ </func>
+ <func>
+ <name name="ensure_all_started" arity="1"/>
+ <name name="ensure_all_started" arity="2"/>
+ <fsummary>Load and start an application and its dependencies, recursively</fsummary>
+ <desc>
+ <p>Equivalent to calling <seealso marker="#start/2"><c>application:start/1,2</c></seealso>
+ repeatedly on all dependencies that have not yet been started for an application.
+ The function returns <c>{ok, AppNames}</c> for a successful start or for an already started
+ application (which are however omitted from the <c>AppNames</c> list), and reports
+ <c>{error, {AppName,Reason}}</c> for errors, where <c>Reason</c> is any possible reason
+ returned by <seealso marker="#start/2"><c>application:start/1,2</c></seealso> when starting a
+ specific dependency. In case of an error, the applications that were started by the
+ function are stopped to bring the set of running applications back to its initial state.</p>
+ </desc>
+ </func>
<func>
<name name="start" arity="1"/>
<name name="start" arity="2"/>
diff --git a/lib/kernel/doc/src/inet.xml b/lib/kernel/doc/src/inet.xml
index 7cd98914d1..254dfbf034 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -76,11 +76,11 @@ FFFF::192.168.42.2
{16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}
fe80::204:acff:fe17:bf38
{16#fe80,0,0,0,0,16#204,16#acff,16#fe17,16#bf38}</code>
- <p>A function that may be useful is <c>inet_parse:address/1</c>:</p>
+ <p>A function that may be useful is <seealso marker="#parse_address/1">parse_address/1</seealso>:</p>
<pre>
-1> <input>inet_parse:address("192.168.42.2").</input>
+1> <input>inet:parse_address("192.168.42.2").</input>
{ok,{192,168,42,2}}
-2> <input>inet_parse:address("FFFF::192.168.42.2").</input>
+2> <input>inet:parse_address("FFFF::192.168.42.2").</input>
{ok,{65535,0,0,0,0,0,49320,10754}}</pre>
</description>
@@ -375,6 +375,13 @@ fe80::204:acff:fe17:bf38
</desc>
</func>
<func>
+ <name name="ntoa" arity="1" />
+ <fsummary>Convert IPv6 / IPV4 adress to ascii</fsummary>
+ <desc>
+ <p>Parses an <a href="#type-ip_address">ip_address()</a> and returns an IPv4 or IPv6 address string.</p>
+ </desc>
+ </func>
+ <func>
<name name="parse_ipv4_address" arity="1" />
<fsummary>Parse an IPv4 address</fsummary>
<desc>
diff --git a/lib/kernel/src/application.erl b/lib/kernel/src/application.erl
index 5dd6b73857..4e8ba1b78a 100644
--- a/lib/kernel/src/application.erl
+++ b/lib/kernel/src/application.erl
@@ -18,7 +18,8 @@
%%
-module(application).
--export([start/1, start/2, start_boot/1, start_boot/2, stop/1,
+-export([ensure_all_started/1, ensure_all_started/2, start/1, start/2,
+ start_boot/1, start_boot/2, stop/1,
load/1, load/2, unload/1, takeover/2,
which_applications/0, which_applications/1,
loaded_applications/0, permit/2]).
@@ -113,6 +114,46 @@ load1(Application, DistNodes) ->
unload(Application) ->
application_controller:unload_application(Application).
+
+-spec ensure_all_started(Application) -> {'ok', Started} | {'error', Reason} when
+ Application :: atom(),
+ Started :: [atom()],
+ Reason :: term().
+ensure_all_started(Application) ->
+ ensure_all_started(Application, temporary).
+
+-spec ensure_all_started(Application, Type) -> {'ok', Started} | {'error', Reason} when
+ Application :: atom(),
+ Type :: restart_type(),
+ Started :: [atom()],
+ Reason :: term().
+ensure_all_started(Application, Type) ->
+ case ensure_all_started(Application, Type, []) of
+ {ok, Started} ->
+ {ok, lists:reverse(Started)};
+ {error, Reason, Started} ->
+ [stop(App) || App <- Started],
+ {error, Reason}
+ end.
+
+ensure_all_started(Application, Type, Started) ->
+ case start(Application, Type) of
+ ok ->
+ {ok, [Application | Started]};
+ {error, {already_started, Application}} ->
+ {ok, Started};
+ {error, {not_started, Dependency}} ->
+ case ensure_all_started(Dependency, Type, Started) of
+ {ok, NewStarted} ->
+ ensure_all_started(Application, Type, NewStarted);
+ Error ->
+ Error
+ end;
+ {error, Reason} ->
+ {error, {Application, Reason}, Started}
+ end.
+
+
-spec start(Application) -> 'ok' | {'error', Reason} when
Application :: atom(),
Reason :: term().
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 3ea530a366..5749027acd 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -32,7 +32,7 @@
ip/1, stats/0, options/0,
pushf/3, popf/1, close/1, gethostname/0, gethostname/1,
parse_ipv4_address/1, parse_ipv6_address/1, parse_ipv4strict_address/1,
- parse_ipv6strict_address/1, parse_address/1, parse_strict_address/1]).
+ parse_ipv6strict_address/1, parse_address/1, parse_strict_address/1, ntoa/1]).
-export([connect_options/2, listen_options/2, udp_options/2, sctp_options/2]).
@@ -529,6 +529,13 @@ getservbyname(Name, Protocol) when is_atom(Name) ->
Error -> Error
end.
+-spec ntoa(IpAddress) ->
+ {ok, Address} | {error, einval} when
+ Address :: string(),
+ IpAddress :: ip_address().
+ntoa(Addr) ->
+ inet_parse:ntoa(Addr).
+
-spec parse_ipv4_address(Address) ->
{ok, IPv4Address} | {error, einval} when
Address :: string(),
diff --git a/lib/kernel/src/inet_parse.erl b/lib/kernel/src/inet_parse.erl
index 619c78a6ca..98bd8d386c 100644
--- a/lib/kernel/src/inet_parse.erl
+++ b/lib/kernel/src/inet_parse.erl
@@ -722,7 +722,9 @@ ntoa({0,0,0,0,0,16#ffff,A,B}) ->
"::FFFF:" ++ dig_to_dec(A) ++ "." ++ dig_to_dec(B);
ntoa({_,_,_,_,_,_,_,_}=T) ->
%% Find longest sequence of zeros, at least 2, to replace with "::"
- ntoa(tuple_to_list(T), []).
+ ntoa(tuple_to_list(T), []);
+ntoa(_) ->
+ {error, einval}.
%% Find first double zero
ntoa([], R) ->
diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl
index ced6f47bfe..0e7e7d2031 100644
--- a/lib/kernel/src/rpc.erl
+++ b/lib/kernel/src/rpc.erl
@@ -407,7 +407,7 @@ cast(Node, Mod, Fun, Args) ->
true.
-%% Asynchronous broadcast, returns nothing, it's just send'n prey
+%% Asynchronous broadcast, returns nothing, it's just send 'n' pray
-spec abcast(Name, Msg) -> abcast when
Name :: atom(),
Msg :: term().
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/Makefile b/lib/kernel/test/Makefile
index cb11d4e899..f1b8a105ed 100644
--- a/lib/kernel/test/Makefile
+++ b/lib/kernel/test/Makefile
@@ -145,7 +145,7 @@ release_tests_spec: make_emakefile
$(INSTALL_DIR) "$(RELSYSDIR)"
$(INSTALL_DATA) $(ERL_FILES) "$(RELSYSDIR)"
$(INSTALL_DATA) $(APP_FILES) "$(RELSYSDIR)"
- $(INSTALL_DATA) kernel.spec $(EMAKEFILE)\
+ $(INSTALL_DATA) kernel.spec kernel_smoke.spec $(EMAKEFILE)\
$(COVERFILE) "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
@tar cf - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
diff --git a/lib/kernel/test/application_SUITE.erl b/lib/kernel/test/application_SUITE.erl
index 1ff291be54..9ec8a15861 100644
--- a/lib/kernel/test/application_SUITE.erl
+++ b/lib/kernel/test/application_SUITE.erl
@@ -35,7 +35,7 @@
-export([config_change/1,
distr_changed_tc1/1, distr_changed_tc2/1,
- ensure_started/1,
+ ensure_started/1, ensure_all_started/1,
shutdown_func/1, do_shutdown/1, shutdown_timeout/1]).
-define(TESTCASE, testcase_name).
@@ -52,7 +52,7 @@ all() ->
[failover, failover_comp, permissions, load,
load_use_cache, ensure_started, {group, reported_bugs}, start_phases,
script_start, nodedown_start, permit_false_start_local,
- permit_false_start_dist, get_key, get_env,
+ permit_false_start_dist, get_key, get_env, ensure_all_started,
{group, distr_changed}, config_change, shutdown_func, shutdown_timeout].
groups() ->
@@ -978,6 +978,85 @@ ensure_started(Conf) ->
ok = application:unload(app1),
ok.
+ensure_all_started(suite) -> [];
+ensure_all_started(doc) -> ["Test application:ensure_all_started/1-2."];
+ensure_all_started(Conf) ->
+
+ {ok, Fd1} = file:open("app1.app", [write]),
+ w_app1(Fd1),
+ file:close(Fd1),
+ {ok, Fd9} = file:open("app9.app", [write]),
+ w_app9(Fd9),
+ file:close(Fd9),
+ {ok, Fd10} = file:open("app10.app", [write]),
+ w_app10_dep9(Fd10),
+ file:close(Fd10),
+ {ok, FdErr} = file:open("app_chain_error.app", [write]),
+ w_app(FdErr, app_chain_error()),
+ file:close(FdErr),
+ {ok, FdErr2} = file:open("app_chain_error2.app", [write]),
+ w_app(FdErr2, app_chain_error2()),
+ file:close(FdErr2),
+
+ %% Single app start/stop
+ false = lists:keyfind(app1, 1, application:which_applications()),
+ {ok, [app1]} = application:ensure_all_started(app1), % app1 started
+ {app1, _, _} = lists:keyfind(app1, 1, application:which_applications()),
+ {ok, []} = application:ensure_all_started(app1), % no start needed
+ ok = application:stop(app1),
+ false = lists:keyfind(app1, 1, application:which_applications()),
+ ok = application:unload(app1),
+
+ %% App or dependency not found.
+ Name = hopefully_not_an_existing_app_file,
+ {error,{Name, {"no such file or directory", _ }}} =
+ application:ensure_all_started(Name),
+
+ %% Start dependencies.
+ {error, {not_started, app9}} = application:start(app10),
+ {ok, [app9,app10]} = application:ensure_all_started(app10, temporary),
+ {app9, _, _} = lists:keyfind(app9, 1, application:which_applications()),
+ {app10, _, _} = lists:keyfind(app10, 1, application:which_applications()),
+ %% Only report apps/dependencies that actually needed to start
+ ok = application:stop(app10),
+ ok = application:unload(app10),
+ {ok, [app10]} = application:ensure_all_started(app10, temporary),
+ ok = application:stop(app9),
+ ok = application:unload(app9),
+ ok = application:stop(app10),
+ ok = application:unload(app10),
+
+ %% Deeper failure chain. We have the following dependencies:
+ %% app_chain_error -> app_chain_error2
+ %% app_chain_error2 -> app10
+ %% app_chain_error2 -> hopefully_not_an_existing_app
+ %% app10 -> app 9
+ %% First we have none running and we expect to have neither app9
+ %% nor app10 running after failing to start
+ %% hopefully_not_an_existing_app
+ {error, {hopefully_not_an_existing_app, {"no such file or directory", _}}}=
+ application:ensure_all_started(app_chain_error),
+ false = lists:keyfind(app9, 1, application:which_applications()),
+ false = lists:keyfind(app10, 1, application:which_applications()),
+ false = lists:keyfind(app_chain_error2,1,application:which_applications()),
+ false = lists:keyfind(app_chain_error, 1, application:which_applications()),
+ %% Here we will have app9 already running, and app10 should be
+ %% able to boot fine.
+ %% In this dependency failing, we expect app9 to still be running, but
+ %% not app10 after failing to start hopefully_not_an_existing_app
+ {ok, [app9]} = application:ensure_all_started(app9, temporary),
+ {error, {hopefully_not_an_existing_app, {"no such file or directory", _}}}=
+ application:ensure_all_started(app_chain_error),
+ {app9, _, _} = lists:keyfind(app9, 1, application:which_applications()),
+ false = lists:keyfind(app10, 1, application:which_applications()),
+ false = lists:keyfind(app_chain_error2,1,application:which_applications()),
+ false = lists:keyfind(app_chain_error, 1, application:which_applications()),
+ ok = application:stop(app9),
+ ok = application:unload(app9),
+ ok = application:unload(app10),
+ ok = application:unload(app_chain_error2),
+ ok = application:unload(app_chain_error),
+ ok.
%%%-----------------------------------------------------------------
%%% Testing of reported bugs and other tickets.
@@ -2125,6 +2204,24 @@ app_start_error() ->
{applications, [kernel]},
{mod, {app_start_error, []}}]}.
+app_chain_error() ->
+ {application, app_chain_error,
+ [{description, "ERTS CXC 138 ce"},
+ {vsn, "2.0"},
+ {modules, []},
+ {registered, []},
+ {applications, [kernel, app_chain_error2]},
+ {mod, {ch_sup, {app_chain_error, 20,20}}}]}.
+
+app_chain_error2() ->
+ {application, app_chain_error2,
+ [{description, "ERTS CXC 138 ce2"},
+ {vsn, "2.0"},
+ {modules, []},
+ {registered, []},
+ {applications, [kernel, app10, hopefully_not_an_existing_app]},
+ {mod, {ch_sup, {app_chain_error2, 21,21}}}]}.
+
app_group_leader() ->
{application, group_leader,
[{description, "GROUP_LEADER CXC 138 11"},
@@ -2374,6 +2471,12 @@ w_app7(Fd) ->
w_app8(Fd) ->
io:format(Fd, "~p.\n", [app8()]).
+w_app9(Fd) ->
+ io:format(Fd, "~p.\n", [app9()]).
+
+w_app10_dep9(Fd) ->
+ io:format(Fd, "~p.\n", [app10_dep9()]).
+
w_app_start_error(Fd) ->
io:format(Fd, "~p.\n", [app_start_error()]).
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/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index 62ba95e1a3..46c8c0b88b 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -226,7 +226,7 @@ t_gethostbyname_v6(Config) when is_list(Config) ->
h_addr_list = [IP4]} = HEnt4,
{ok,IP46} =
inet_parse:ipv6_address(
- "::ffff:" ++ inet_parse:ntoa(IP4)),
+ "::ffff:" ++ inet:ntoa(IP4)),
check_elems(
[{HEnt#hostent.h_name,[Name,FullName]}])
end,
@@ -246,7 +246,7 @@ t_gethostbyname_v6(Config) when is_list(Config) ->
h_addr_list = [IP4F]} = HEnt4F,
{ok,IP46F} =
inet_parse:ipv6_address(
- "::ffff:" ++ inet_parse:ntoa(IP4F)),
+ "::ffff:" ++ inet:ntoa(IP4F)),
check_elems(
[{HEntF#hostent.h_name,[Name,FullName]}])
end;
diff --git a/lib/kernel/test/kernel_smoke.spec b/lib/kernel/test/kernel_smoke.spec
new file mode 100644
index 0000000000..e5d8273c56
--- /dev/null
+++ b/lib/kernel/test/kernel_smoke.spec
@@ -0,0 +1,9 @@
+{config, "../test_server/ts.config"}.
+{config, "../test_server/ts.unix.config"}.
+
+{cases,"../kernel_test", inet_SUITE,[t_gethostbyaddr,t_gethostbyname,
+ t_gethostbyaddr_v6,t_gethostbyname_v6,t_gethostnative,getifaddrs]}.
+{cases,"../kernel_test", inet_res_SUITE,[gethostbyaddr,gethostbyname,
+ gethostbyaddr_v6,gethostbyname_v6,basic]}.
+{cases,"../kernel_test", gen_tcp_echo_SUITE,[active_echo]}.
+{cases,"../kernel_test", heart_SUITE,[reboot]}.
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/mnesia/src/mnesia_bup.erl b/lib/mnesia/src/mnesia_bup.erl
index fd87be1759..3b084e7371 100644
--- a/lib/mnesia/src/mnesia_bup.erl
+++ b/lib/mnesia/src/mnesia_bup.erl
@@ -1052,11 +1052,7 @@ local_uninstall_fallback(Master, FA) ->
Tmp = FA2#fallback_args.fallback_tmp,
Bup = FA2#fallback_args.fallback_bup,
file:delete(Tmp),
- Res =
- case fallback_exists(Bup) of
- true -> file:delete(Bup);
- false -> ok
- end,
+ Res = file:delete(Bup),
?eval_debug_fun({?MODULE, uninstall_fallback2, post_delete}, []),
Master ! {self(), Res},
unlink(Master),
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/c_src/odbcserver.c b/lib/odbc/c_src/odbcserver.c
index 5730e20774..8de81a30ae 100644
--- a/lib/odbc/c_src/odbcserver.c
+++ b/lib/odbc/c_src/odbcserver.c
@@ -277,11 +277,15 @@ int main(void)
msg = receive_erlang_port_msg();
temp = strtok(msg, ";");
+ if (temp == NULL)
+ DO_EXIT(EXIT_STDIN_BODY);
length = strlen(temp);
supervisor_port = safe_malloc(length + 1);
strcpy(supervisor_port, temp);
temp = strtok(NULL, ";");
+ if (temp == NULL)
+ DO_EXIT(EXIT_STDIN_BODY);
length = strlen(temp);
odbc_port = safe_malloc(length + 1);
strcpy(odbc_port, temp);
@@ -1819,12 +1823,20 @@ static byte * receive_erlang_port_msg(void)
len |= lengthstr[i];
}
+ if (len <= 0 || len > 1024) {
+ DO_EXIT(EXIT_STDIN_HEADER);
+ }
+
buffer = (byte *)safe_malloc(len);
if (read_exact(buffer, len) <= 0) {
DO_EXIT(EXIT_STDIN_BODY);
}
+ if (buffer[len-1] != '\0') {
+ DO_EXIT(EXIT_STDIN_BODY);
+ }
+
return buffer;
}
diff --git a/lib/os_mon/c_src/ferrule.c b/lib/os_mon/c_src/ferrule.c
index 744f302b2d..c55f594f34 100644
--- a/lib/os_mon/c_src/ferrule.c
+++ b/lib/os_mon/c_src/ferrule.c
@@ -50,7 +50,7 @@
#define FDS_STDIN 0
#define FDS_PIPE 1
-main(int argc, char *argv[])
+int main(int argc, char *argv[])
/* usage: ferrule ownpath */
{
int i, pipe_fd;
diff --git a/lib/os_mon/c_src/mod_syslog.c b/lib/os_mon/c_src/mod_syslog.c
index 87fbfbac22..b1bbf80b2a 100644
--- a/lib/os_mon/c_src/mod_syslog.c
+++ b/lib/os_mon/c_src/mod_syslog.c
@@ -47,7 +47,7 @@
#define TRUE 1
#define WAIT 1
-main(int argc, char *argv[])
+int main(int argc, char *argv[])
/* usage: mod_syslog mode ownpath syslogconf */
{
int syslogd_pid, n_lines_copied=0;
@@ -128,6 +128,7 @@ main(int argc, char *argv[])
make_exit(PIPE_NOT_FOUND);
else */
make_exit(OK);
+ return 0;
}
void make_exit(int exit_code)
diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
index 8c8bbe843a..278da26a20 100644
--- a/lib/os_mon/src/disksup.erl
+++ b/lib/os_mon/src/disksup.erl
@@ -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/Makefile b/lib/os_mon/test/Makefile
index 461bebc102..cbb014324d 100644
--- a/lib/os_mon/test/Makefile
+++ b/lib/os_mon/test/Makefile
@@ -85,7 +85,8 @@ release_spec:
release_tests_spec: make_emakefile
$(INSTALL_DIR) "$(RELSYSDIR)"
- $(INSTALL_DATA) os_mon.spec os_mon.cover $(EMAKEFILE) $(SOURCE) "$(RELSYSDIR)"
+ $(INSTALL_DATA) os_mon.spec os_mon.cover os_mon_smoke.spec \
+ $(EMAKEFILE) $(SOURCE) "$(RELSYSDIR)"
$(INSTALL_DATA) os_mon_mib_SUITE.cfg "$(RELSYSDIR)"
## tar chf - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
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/test/os_mon_smoke.spec b/lib/os_mon/test/os_mon_smoke.spec
new file mode 100644
index 0000000000..6f0d02494b
--- /dev/null
+++ b/lib/os_mon/test/os_mon_smoke.spec
@@ -0,0 +1,3 @@
+{cases,"../os_mon_test",disksup_SUITE,[api]}.
+{cases,"../os_mon_test",cpu_sup_SUITE,[load_api,util_api]}.
+{cases,"../os_mon_test",memsup_SUITE,[api]}. \ No newline at end of file
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 9180fa968b..699481b20f 100644
--- a/lib/public_key/test/pkits_SUITE.erl
+++ b/lib/public_key/test/pkits_SUITE.erl
@@ -111,6 +111,7 @@ groups() ->
%%--------------------------------------------------------------------
init_per_suite(Config) ->
+ application:stop(crypto),
try crypto:start() of
ok ->
application:start(asn1),
diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl
index f2596e3d85..c3aa2e2366 100644
--- a/lib/public_key/test/public_key_SUITE.erl
+++ b/lib/public_key/test/public_key_SUITE.erl
@@ -56,6 +56,7 @@ groups() ->
].
%%-------------------------------------------------------------------
init_per_suite(Config) ->
+ application:stop(crypto),
try crypto:start() of
ok ->
application:start(asn1),
diff --git a/lib/runtime_tools/doc/src/dbg.xml b/lib/runtime_tools/doc/src/dbg.xml
index d8c82b2459..36b3b51a99 100644
--- a/lib/runtime_tools/doc/src/dbg.xml
+++ b/lib/runtime_tools/doc/src/dbg.xml
@@ -244,7 +244,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
</item>
<tag><c>all</c></tag>
<item>
- <p>Sets all flags.</p>
+ <p>Sets all flags except <c>silent</c>.</p>
</item>
<tag><c>clear</c></tag>
<item>
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/dbg.erl b/lib/runtime_tools/src/dbg.erl
index 6b2fb0460f..f0086e8cc7 100644
--- a/lib/runtime_tools/src/dbg.erl
+++ b/lib/runtime_tools/src/dbg.erl
@@ -1113,7 +1113,7 @@ transform_flags([sos|Tail],Acc) -> transform_flags(Tail,[set_on_spawn|Acc]);
transform_flags([sol|Tail],Acc) -> transform_flags(Tail,[set_on_link|Acc]);
transform_flags([sofs|Tail],Acc) -> transform_flags(Tail,[set_on_first_spawn|Acc]);
transform_flags([sofl|Tail],Acc) -> transform_flags(Tail,[set_on_first_link|Acc]);
-transform_flags([all|_],_Acc) -> all();
+transform_flags([all|_],_Acc) -> all()--[silent];
transform_flags([F|Tail]=List,Acc) when is_atom(F) ->
case lists:member(F, all()) of
true -> transform_flags(Tail,[F|Acc]);
@@ -1124,7 +1124,7 @@ transform_flags(Bad,_Acc) -> {error,{bad_flags,Bad}}.
all() ->
[send,'receive',call,procs,garbage_collection,running,
set_on_spawn,set_on_first_spawn,set_on_link,set_on_first_link,
- timestamp,arity,return_to].
+ timestamp,arity,return_to,silent].
display_info([Node|Nodes]) ->
io:format("~nNode ~w:~n",[Node]),
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/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/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/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/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_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/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/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/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/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 8e112433c1..299dd5058a 100644
--- a/lib/ssh/doc/src/notes.xml
+++ b/lib/ssh/doc/src/notes.xml
@@ -195,8 +195,6 @@
</item>
</list>
</section>
-
-
<section><title>Improvements and New Features</title>
<list>
<item>
@@ -251,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/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index bd0d3d49dd..141d3df38e 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -88,6 +88,7 @@
number for SSH.</d>
<v>Options = [{Option, Value}]</v>
<v>Timeout = infinity | integer(milliseconds)</v>
+ <d>Negotiation timeout, for connection timeout use the option <c>{connect_timeout, timeout()}</c>.</d>
</type>
<desc>
<p>Connects to an SSH server. No channel is started. This is done
diff --git a/lib/ssh/src/ssh.hrl b/lib/ssh/src/ssh.hrl
index da5750b6c3..4fd347ba8f 100644
--- a/lib/ssh/src/ssh.hrl
+++ b/lib/ssh/src/ssh.hrl
@@ -127,7 +127,8 @@
userauth_supported_methods , %
userauth_methods,
userauth_preference,
- available_host_keys
+ available_host_keys,
+ authenticated = false
}).
-record(alg,
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..9de4dd5967 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -426,10 +426,10 @@ userauth(#ssh_msg_userauth_info_response{} = Msg,
language = "en"}, State)
end;
-userauth(#ssh_msg_userauth_success{}, #state{ssh_params = #ssh{role = client},
+userauth(#ssh_msg_userauth_success{}, #state{ssh_params = #ssh{role = client} = Ssh,
manager = Pid} = State) ->
Pid ! ssh_connected,
- {next_state, connected, next_packet(State)};
+ {next_state, connected, next_packet(State#state{ssh_params = Ssh#ssh{authenticated = true}})};
userauth(#ssh_msg_userauth_failure{},
#state{ssh_params = #ssh{role = client,
@@ -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_transport.erl b/lib/ssh/src/ssh_transport.erl
index beaffdc025..682d766d99 100644
--- a/lib/ssh/src/ssh_transport.erl
+++ b/lib/ssh/src/ssh_transport.erl
@@ -206,6 +206,7 @@ key_exchange_init_msg(Ssh0) ->
kex_init(#ssh{role = Role, opts = Opts, available_host_keys = HostKeyAlgs}) ->
Random = ssh_bits:random(16),
Compression = case proplists:get_value(compression, Opts, none) of
+ openssh_zlib -> ["[email protected]", "none"];
zlib -> ["zlib", "none"];
none -> ["none", "zlib"]
end,
@@ -855,13 +856,14 @@ decrypt(#ssh{decrypt = 'aes128-cbc', decrypt_keys = Key,
IV = crypto:next_iv(aes_cbc, Data),
{Ssh#ssh{decrypt_ctx = IV}, Dec}.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Compression
%%
-%% none REQUIRED no compression
-%% zlib OPTIONAL ZLIB (LZ77) compression
+%% none REQUIRED no compression
+%% zlib OPTIONAL ZLIB (LZ77) compression
+%% openssh_zlib OPTIONAL ZLIB (LZ77) compression
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
compress_init(SSH) ->
compress_init(SSH, 1).
@@ -870,19 +872,32 @@ compress_init(#ssh{compress = none} = Ssh, _) ->
compress_init(#ssh{compress = zlib} = Ssh, Level) ->
Zlib = zlib:open(),
ok = zlib:deflateInit(Zlib, Level),
+ {ok, Ssh#ssh{compress_ctx = Zlib}};
+compress_init(#ssh{compress = '[email protected]'} = Ssh, Level) ->
+ Zlib = zlib:open(),
+ ok = zlib:deflateInit(Zlib, Level),
{ok, Ssh#ssh{compress_ctx = Zlib}}.
-
compress_final(#ssh{compress = none} = Ssh) ->
{ok, Ssh};
compress_final(#ssh{compress = zlib, compress_ctx = Context} = Ssh) ->
zlib:close(Context),
+ {ok, Ssh#ssh{compress = none, compress_ctx = undefined}};
+compress_final(#ssh{compress = '[email protected]', authenticated = false} = Ssh) ->
+ {ok, Ssh};
+compress_final(#ssh{compress = '[email protected]', compress_ctx = Context, authenticated = true} = Ssh) ->
+ zlib:close(Context),
{ok, Ssh#ssh{compress = none, compress_ctx = undefined}}.
compress(#ssh{compress = none} = Ssh, Data) ->
{Ssh, Data};
compress(#ssh{compress = zlib, compress_ctx = Context} = Ssh, Data) ->
Compressed = zlib:deflate(Context, Data, sync),
+ {Ssh, list_to_binary(Compressed)};
+compress(#ssh{compress = '[email protected]', authenticated = false} = Ssh, Data) ->
+ {Ssh, Data};
+compress(#ssh{compress = '[email protected]', compress_ctx = Context, authenticated = true} = Ssh, Data) ->
+ Compressed = zlib:deflate(Context, Data, sync),
{Ssh, list_to_binary(Compressed)}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -894,18 +909,32 @@ decompress_init(#ssh{decompress = none} = Ssh) ->
decompress_init(#ssh{decompress = zlib} = Ssh) ->
Zlib = zlib:open(),
ok = zlib:inflateInit(Zlib),
+ {ok, Ssh#ssh{decompress_ctx = Zlib}};
+decompress_init(#ssh{decompress = '[email protected]'} = Ssh) ->
+ Zlib = zlib:open(),
+ ok = zlib:inflateInit(Zlib),
{ok, Ssh#ssh{decompress_ctx = Zlib}}.
decompress_final(#ssh{decompress = none} = Ssh) ->
{ok, Ssh};
decompress_final(#ssh{decompress = zlib, decompress_ctx = Context} = Ssh) ->
zlib:close(Context),
+ {ok, Ssh#ssh{decompress = none, decompress_ctx = undefined}};
+decompress_final(#ssh{decompress = '[email protected]', authenticated = false} = Ssh) ->
+ {ok, Ssh};
+decompress_final(#ssh{decompress = '[email protected]', decompress_ctx = Context, authenticated = true} = Ssh) ->
+ zlib:close(Context),
{ok, Ssh#ssh{decompress = none, decompress_ctx = undefined}}.
decompress(#ssh{decompress = none} = Ssh, Data) ->
{Ssh, Data};
decompress(#ssh{decompress = zlib, decompress_ctx = Context} = Ssh, Data) ->
Decompressed = zlib:inflate(Context, Data),
+ {Ssh, list_to_binary(Decompressed)};
+decompress(#ssh{decompress = '[email protected]', authenticated = false} = Ssh, Data) ->
+ {Ssh, Data};
+decompress(#ssh{decompress = '[email protected]', decompress_ctx = Context, authenticated = true} = Ssh, Data) ->
+ Decompressed = zlib:inflate(Context, Data),
{Ssh, list_to_binary(Decompressed)}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl
index 93029c5038..0aa60624bf 100644
--- a/lib/ssh/test/ssh_basic_SUITE.erl
+++ b/lib/ssh/test/ssh_basic_SUITE.erl
@@ -48,8 +48,8 @@ all() ->
close].
groups() ->
- [{dsa_key, [], [send, exec, exec_compressed, shell, known_hosts, idle_time, rekey]},
- {rsa_key, [], [send, exec, exec_compressed, shell, known_hosts, idle_time, rekey]},
+ [{dsa_key, [], [send, exec, exec_compressed, shell, known_hosts, idle_time, rekey, openssh_zlib_basic_test]},
+ {rsa_key, [], [send, exec, exec_compressed, shell, known_hosts, idle_time, rekey, openssh_zlib_basic_test]},
{dsa_pass_key, [], [pass_phrase]},
{rsa_pass_key, [], [pass_phrase]},
{internal_error, [], [internal_error]}
@@ -493,7 +493,24 @@ close(Config) when is_list(Config) ->
exit(CM, {shutdown, normal}),
ok = ssh:close(CM).
-
+
+openssh_zlib_basic_test() ->
+ [{doc, "Test basic connection with openssh_zlib"}].
+openssh_zlib_basic_test(Config) ->
+ SystemDir = filename:join(?config(priv_dir, Config), system),
+ UserDir = ?config(priv_dir, Config),
+
+ {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir},
+ {user_dir, UserDir},
+ {failfun, fun ssh_test_lib:failfun/2}]),
+ ConnectionRef =
+ ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+ {user_dir, UserDir},
+ {user_interaction, false},
+ {compression, openssh_zlib}]),
+ ok = ssh:close(ConnectionRef),
+ ssh:stop_daemon(Pid).
+
%%--------------------------------------------------------------------
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl
index 246fecf34a..51551eab11 100644
--- a/lib/ssl/src/tls_connection.erl
+++ b/lib/ssl/src/tls_connection.erl
@@ -978,7 +978,7 @@ handle_sync_event(negotiated_next_protocol, _From, StateName, #state{next_protoc
handle_sync_event(negotiated_next_protocol, _From, StateName, #state{next_protocol = NextProtocol} = State) ->
{reply, {ok, NextProtocol}, StateName, State, get_timeout(State)};
-handle_sync_event({set_opts, Opts0}, _From, StateName,
+handle_sync_event({set_opts, Opts0}, _From, StateName0,
#state{socket_options = Opts1,
socket = Socket,
transport_cb = Transport,
@@ -987,11 +987,12 @@ handle_sync_event({set_opts, Opts0}, _From, StateName,
State1 = State0#state{socket_options = Opts},
if
Opts#socket_options.active =:= false ->
- {reply, Reply, StateName, State1, get_timeout(State1)};
+ {reply, Reply, StateName0, State1, get_timeout(State1)};
Buffer =:= <<>>, Opts1#socket_options.active =:= false ->
%% Need data, set active once
{Record, State2} = next_record_if_active(State1),
- case next_state(StateName, StateName, Record, State2) of
+ %% Note: Renogotiation may cause StateName0 =/= StateName
+ case next_state(StateName0, StateName0, Record, State2) of
{next_state, StateName, State, Timeout} ->
{reply, Reply, StateName, State, Timeout};
{stop, Reason, State} ->
@@ -999,13 +1000,14 @@ handle_sync_event({set_opts, Opts0}, _From, StateName,
end;
Buffer =:= <<>> ->
%% Active once already set
- {reply, Reply, StateName, State1, get_timeout(State1)};
+ {reply, Reply, StateName0, State1, get_timeout(State1)};
true ->
case read_application_data(<<>>, State1) of
Stop = {stop,_,_} ->
Stop;
{Record, State2} ->
- case next_state(StateName, StateName, Record, State2) of
+ %% Note: Renogotiation may cause StateName0 =/= StateName
+ case next_state(StateName0, StateName0, Record, State2) of
{next_state, StateName, State, Timeout} ->
{reply, Reply, StateName, State, Timeout};
{stop, Reason, State} ->
@@ -2458,7 +2460,7 @@ do_format_reply(list, _,_, Data) ->
binary_to_list(Data).
header(0, <<>>) ->
- [];
+ <<>>;
header(_, <<>>) ->
[];
header(0, Binary) ->
diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl
index 36f7af784d..d50498f547 100644
--- a/lib/ssl/test/ssl_packet_SUITE.erl
+++ b/lib/ssl/test/ssl_packet_SUITE.erl
@@ -1631,8 +1631,8 @@ header_decode_one_byte_active(Config) when is_list(Config) ->
{from, self()},
{mfa, {?MODULE, client_header_decode_active,
[Data, [11 | <<"Hello world">> ]]}},
- {options, [{active, true}, {header, 1},
- binary | ClientOpts]}]),
+ {options, [{active, true}, binary, {header, 1}
+ | ClientOpts]}]),
ssl_test_lib:check_result(Server, ok, Client, ok),
@@ -1688,7 +1688,7 @@ header_decode_two_bytes_two_sent_active(Config) when is_list(Config) ->
Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},
{from, self()},
{mfa, {?MODULE, server_header_decode_active,
- [Data, [$H, $e]]}},
+ [Data, [$H, $e | <<>>]]}},
{options, [{active, true}, binary,
{header,2}|ServerOpts]}]),
@@ -1697,7 +1697,7 @@ header_decode_two_bytes_two_sent_active(Config) when is_list(Config) ->
{host, Hostname},
{from, self()},
{mfa, {?MODULE, client_header_decode_active,
- [Data, [$H, $e]]}},
+ [Data, [$H, $e | <<>>]]}},
{options, [{active, true}, {header, 2},
binary | ClientOpts]}]),
@@ -1765,8 +1765,8 @@ header_decode_one_byte_passive(Config) when is_list(Config) ->
{from, self()},
{mfa, {?MODULE, client_header_decode_passive,
[Data, [11 | <<"Hello world">> ]]}},
- {options, [{active, false}, {header, 1},
- binary | ClientOpts]}]),
+ {options, [{active, false}, binary, {header, 1}
+ | ClientOpts]}]),
ssl_test_lib:check_result(Server, ok, Client, ok),
@@ -1822,7 +1822,7 @@ header_decode_two_bytes_two_sent_passive(Config) when is_list(Config) ->
Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},
{from, self()},
{mfa, {?MODULE, server_header_decode_passive,
- [Data, [$H, $e]]}},
+ [Data, [$H, $e | <<>>]]}},
{options, [{active, false}, binary,
{header,2}|ServerOpts]}]),
@@ -1831,7 +1831,7 @@ header_decode_two_bytes_two_sent_passive(Config) when is_list(Config) ->
{host, Hostname},
{from, self()},
{mfa, {?MODULE, client_header_decode_passive,
- [Data, [$H, $e]]}},
+ [Data, [$H, $e | <<>>]]}},
{options, [{active, false}, {header, 2},
binary | ClientOpts]}]),
@@ -2124,10 +2124,14 @@ client_header_decode_passive(Socket, Packet, Result) ->
%% option and the bitsynax makes it obsolete!
check_header_result([Byte1 | _], [Byte1]) ->
ok;
+check_header_result([Byte1 | _], [Byte1| <<>>]) ->
+ ok;
check_header_result([Byte1, Byte2 | _], [Byte1, Byte2]) ->
ok;
-check_header_result(_,Got) ->
- exit({?LINE, Got}).
+check_header_result([Byte1, Byte2 | _], [Byte1, Byte2 | <<>>]) ->
+ ok;
+check_header_result(Expected,Got) ->
+ exit({?LINE, {Expected, Got}}).
server_line_packet_decode(Socket, Packet) when is_binary(Packet) ->
[L1, L2] = string:tokens(binary_to_list(Packet), "\n"),
diff --git a/lib/stdlib/doc/src/filelib.xml b/lib/stdlib/doc/src/filelib.xml
index bd780b2b2f..d24d17be80 100644
--- a/lib/stdlib/doc/src/filelib.xml
+++ b/lib/stdlib/doc/src/filelib.xml
@@ -49,6 +49,12 @@
<datatype>
<name name="dirname"/>
</datatype>
+ <datatype>
+ <name name="dirname_all"/>
+ </datatype>
+ <datatype>
+ <name name="filename_all"/>
+ </datatype>
</datatypes>
<funcs>
diff --git a/lib/stdlib/doc/src/io_lib.xml b/lib/stdlib/doc/src/io_lib.xml
index 3dac259477..68352ffeb1 100644
--- a/lib/stdlib/doc/src/io_lib.xml
+++ b/lib/stdlib/doc/src/io_lib.xml
@@ -54,6 +54,9 @@
<name name="fread_error"/>
</datatype>
<datatype>
+ <name name="fread_item"/>
+ </datatype>
+ <datatype>
<name name="latin1_string"/>
</datatype>
</datatypes>
diff --git a/lib/stdlib/doc/src/supervisor.xml b/lib/stdlib/doc/src/supervisor.xml
index ed09f6e1f2..e2c9c14e6a 100644
--- a/lib/stdlib/doc/src/supervisor.xml
+++ b/lib/stdlib/doc/src/supervisor.xml
@@ -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/src/dets.erl b/lib/stdlib/src/dets.erl
index 50812cc532..68b157c13c 100644
--- a/lib/stdlib/src/dets.erl
+++ b/lib/stdlib/src/dets.erl
@@ -951,10 +951,10 @@ do_trav(Proc, Acc, Fun) ->
Error
end.
-do_trav(#dets_cont{bin = eof}, _Proc, Acc, _Fun) ->
- Acc;
do_trav(State, Proc, Acc, Fun) ->
case req(Proc, {match_init, State, safe}) of
+ '$end_of_table'->
+ Acc;
{cont, {Bins, NewState}} ->
do_trav_bins(NewState, Proc, Acc, Fun, lists:reverse(Bins));
Error ->
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index 08b8541014..8f07750b9b 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -3219,7 +3219,8 @@ modify_line(T, F0) ->
%% Forms.
modify_line1({function,F,A}, _Mf) -> {function,F,A};
-modify_line1({function,M,F,A}, _Mf) -> {function,M,F,A};
+modify_line1({function,M,F,A}, Mf) ->
+ {function,modify_line1(M, Mf),modify_line1(F, Mf),modify_line1(A, Mf)};
modify_line1({attribute,L,record,{Name,Fields}}, Mf) ->
{attribute,Mf(L),record,{Name,modify_line1(Fields, Mf)}};
modify_line1({attribute,L,spec,{Fun,Types}}, Mf) ->
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_server.erl b/lib/stdlib/src/gen_server.erl
index bc76c9fd10..7f65131f67 100644
--- a/lib/stdlib/src/gen_server.erl
+++ b/lib/stdlib/src/gen_server.erl
@@ -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()}.
@@ -217,7 +217,7 @@ reply({To, Tag}, Reply) ->
catch To ! {Tag, Reply}.
%% -----------------------------------------------------------------
-%% Asyncronous broadcast, returns nothing, it's just send'n prey
+%% Asynchronous broadcast, returns nothing, it's just send 'n' pray
%%-----------------------------------------------------------------
abcast(Name, Request) when is_atom(Name) ->
do_abcast([node() | nodes()], Name, cast_msg(Request)).
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/io_lib.erl b/lib/stdlib/src/io_lib.erl
index a9b6d4131e..92a086b077 100644
--- a/lib/stdlib/src/io_lib.erl
+++ b/lib/stdlib/src/io_lib.erl
@@ -83,7 +83,8 @@
-export([write_unicode_string/1, write_unicode_char/1,
deep_unicode_char_list/1]).
--export_type([chars/0, latin1_string/0, continuation/0, fread_error/0]).
+-export_type([chars/0, latin1_string/0, continuation/0,
+ fread_error/0, fread_item/0]).
%%----------------------------------------------------------------------
@@ -106,6 +107,8 @@
| 'string'
| 'unsigned'.
+-type fread_item() :: string() | atom() | integer() | float().
+
%%----------------------------------------------------------------------
%% Interface calls to sub-modules.
@@ -120,7 +123,7 @@ fwrite(Format, Args) ->
-spec fread(Format, String) -> Result when
Format :: string(),
String :: string(),
- Result :: {'ok', InputList :: [term()], LeftOverChars :: string()}
+ Result :: {'ok', InputList :: [fread_item()], LeftOverChars :: string()}
| {'more', RestFormat :: string(),
Nchars :: non_neg_integer(),
InputStack :: chars()}
@@ -135,7 +138,7 @@ fread(Chars, Format) ->
Format :: string(),
Return :: {'more', Continuation1 :: continuation()}
| {'done', Result, LeftOverChars :: string()},
- Result :: {'ok', InputList :: [term()]}
+ Result :: {'ok', InputList :: [fread_item()]}
| 'eof'
| {'error', {'fread', What :: fread_error()}}.
diff --git a/lib/stdlib/src/io_lib_fread.erl b/lib/stdlib/src/io_lib_fread.erl
index 92a34995b8..491e1f40d7 100644
--- a/lib/stdlib/src/io_lib_fread.erl
+++ b/lib/stdlib/src/io_lib_fread.erl
@@ -41,9 +41,9 @@
Format :: string(),
Return :: {'more', Continuation1 :: io_lib:continuation()}
| {'done', Result, LeftOverChars :: string()},
- Result :: {'ok', InputList :: io_lib:chars()}
+ Result :: {'ok', InputList :: [io_lib:fread_item()]}
| 'eof'
- | {'error', {'read', What :: io_lib:fread_error()}}.
+ | {'error', {'fread', What :: io_lib:fread_error()}}.
fread([], Chars, Format) ->
%%io:format("FREAD: ~w `~s'~n", [Format,Chars]),
@@ -101,11 +101,12 @@ fread_line(Format0, Line, N0, Results0, More, Newline) ->
-spec fread(Format, String) -> Result when
Format :: string(),
String :: string(),
- Result :: {'ok', InputList :: io_lib:chars(), LeftOverChars :: string()}
+ Result :: {'ok', InputList :: [io_lib:fread_item()],
+ LeftOverChars :: string()}
| {'more', RestFormat :: string(),
Nchars :: non_neg_integer(),
InputStack :: io_lib:chars()}
- | {'error', What :: term()}.
+ | {'error', {'fread', What :: io_lib:fread_error()}}.
fread(Format, Line) ->
fread(Format, Line, 0, []).
diff --git a/lib/stdlib/test/dets_SUITE.erl b/lib/stdlib/test/dets_SUITE.erl
index 8ff7c3ccc9..059d553b00 100644
--- a/lib/stdlib/test/dets_SUITE.erl
+++ b/lib/stdlib/test/dets_SUITE.erl
@@ -52,7 +52,7 @@
simultaneous_open/1, insert_new/1, repair_continuation/1,
otp_5487/1, otp_6206/1, otp_6359/1, otp_4738/1, otp_7146/1,
otp_8070/1, otp_8856/1, otp_8898/1, otp_8899/1, otp_8903/1,
- otp_8923/1, otp_9282/1]).
+ otp_8923/1, otp_9282/1, otp_11245/1]).
-export([dets_dirty_loop/0]).
@@ -109,7 +109,7 @@ all() ->
many_clients, otp_4906, otp_5402, simultaneous_open,
insert_new, repair_continuation, otp_5487, otp_6206,
otp_6359, otp_4738, otp_7146, otp_8070, otp_8856, otp_8898,
- otp_8899, otp_8903, otp_8923, otp_9282
+ otp_8899, otp_8903, otp_8923, otp_9282, otp_11245
].
groups() ->
@@ -3898,6 +3898,28 @@ some_calls(Tab, Config) ->
file:delete(File).
+otp_11245(doc) ->
+ ["OTP-11245. Tables remained fixed after traversal"];
+otp_11245(suite) ->
+ [];
+otp_11245(Config) when is_list(Config) ->
+ Tab = otp_11245,
+ File = filename(Tab, Config),
+ {ok, Tab} = dets:open_file(Tab, [{file,File}]),
+ N = 1024,
+ ins(Tab, N),
+ N = length(dets:match(Tab, '_')),
+ false = dets:info(Tab, safe_fixed),
+ dets:traverse(Tab, fun(_) -> continue end),
+ false = dets:info(Tab, safe_fixed),
+ N = dets:foldl(fun(_, N2) -> N2+1 end, 0, Tab),
+ false = dets:info(Tab, safe_fixed),
+ N = dets:foldr(fun(_, N2) -> N2+1 end, 0, Tab),
+ false = dets:info(Tab, safe_fixed),
+ ok = dets:close(Tab),
+ file:delete(File),
+ ok.
+
%%
%% Parts common to several test cases
%%
diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl
index f8345559c4..4dc7a44064 100644
--- a/lib/stdlib/test/erl_lint_SUITE.erl
+++ b/lib/stdlib/test/erl_lint_SUITE.erl
@@ -50,7 +50,7 @@
unsafe_vars_try/1,
guard/1, otp_4886/1, otp_4988/1, otp_5091/1, otp_5276/1, otp_5338/1,
otp_5362/1, otp_5371/1, otp_7227/1, otp_5494/1, otp_5644/1, otp_5878/1,
- otp_5917/1, otp_6585/1, otp_6885/1, otp_10436/1,
+ otp_5917/1, otp_6585/1, otp_6885/1, otp_10436/1, otp_11254/1,
export_all/1,
bif_clash/1,
behaviour_basic/1, behaviour_multiple/1,
@@ -82,7 +82,7 @@ all() ->
unsafe_vars, unsafe_vars2, unsafe_vars_try, guard,
otp_4886, otp_4988, otp_5091, otp_5276, otp_5338,
otp_5362, otp_5371, otp_7227, otp_5494, otp_5644,
- otp_5878, otp_5917, otp_6585, otp_6885, otp_10436, export_all,
+ otp_5878, otp_5917, otp_6585, otp_6885, otp_10436, otp_11254,export_all,
bif_clash, behaviour_basic, behaviour_multiple,
otp_7550, otp_8051, format_warn, {group, on_load},
too_many_arguments, basic_errors, bin_syntax_errors].
@@ -2418,6 +2418,20 @@ otp_10436(Config) when is_list(Config) ->
run_test2(Config, Ts2, []),
ok.
+otp_11254(doc) ->
+ "OTP-11254. Warnings for opaque types.";
+otp_11254(suite) -> [];
+otp_11254(Config) when is_list(Config) ->
+ Ts = <<"-module(p2).
+ -export([manifest/2]).
+ manifest(Module, Name) ->
+ fun Module:Nine/1.
+ ">>,
+ {error,[{4,erl_lint,{unbound_var,'Nine'}}],
+ [{3,erl_lint,{unused_var,'Name'}}]} =
+ run_test2(Config, Ts, []),
+ ok.
+
export_all(doc) ->
"OTP-7392. Warning for export_all.";
export_all(Config) when is_list(Config) ->
diff --git a/lib/test_server/src/ts.erl b/lib/test_server/src/ts.erl
index 4e5dc1b759..8e71c69d35 100644
--- a/lib/test_server/src/ts.erl
+++ b/lib/test_server/src/ts.erl
@@ -28,6 +28,7 @@
tests/0, tests/1,
install/0, install/1,
bench/0, bench/1, bench/2, benchmarks/0,
+ smoke_test/0, smoke_test/1,smoke_test/2, smoke_tests/0,
estone/0, estone/1,
cross_cover_analyse/1,
compile_testcases/0, compile_testcases/1,
@@ -174,6 +175,13 @@ help(installed) ->
" ts:bench(Spec) - Runs all benchmarks in the given spec file.\n"
" The spec file is actually ../*_test/Spec_bench.spec\n\n"
" ts:bench can take the same Options argument as ts:run.\n"
+ "Smoke test functions:\n"
+ " ts:smoke_tests() - Get all available families of smoke tests\n"
+ " ts:smoke_test() - Runs all smoke tests\n"
+ " ts:smoke_test(Spec)\n"
+ " - Runs all smoke tests in the given spec file.\n"
+ " The spec file is actually ../*_test/Spec_smoke.spec\n\n"
+ " ts:smoke_test can take the same Options argument as ts:run.\n"
"\n"
"Installation (already done):\n"
],
@@ -258,6 +266,7 @@ run(List, Opts) when is_list(List), is_list(Opts) ->
%% Runs one test spec with Options
run(Testspec, Config) when is_atom(Testspec), is_list(Config) ->
Options=check_test_get_opts(Testspec, Config),
+ IsSmoke=proplists:get_value(smoke,Config),
File=atom_to_list(Testspec),
WhatToDo =
case Testspec of
@@ -293,6 +302,8 @@ run(Testspec, Config) when is_atom(Testspec), is_list(Config) ->
case WhatToDo of
skip ->
create_skip_spec(Testspec, tests(Testspec));
+ test when IsSmoke ->
+ File++"_smoke.spec";
test ->
File++".spec"
end,
@@ -507,7 +518,22 @@ bench(Specs, Opts) ->
benchmarks() ->
ts_benchmark:benchmarks().
+smoke_test() ->
+ smoke_test([]).
+smoke_test(Opts) when is_list(Opts) ->
+ smoke_test(smoke_tests(),Opts);
+smoke_test(Spec) ->
+ smoke_test([Spec],[]).
+
+smoke_test(Spec, Opts) when is_atom(Spec) ->
+ smoke_test([Spec],Opts);
+smoke_test(Specs, Opts) ->
+ run(Specs, [{smoke,true}|Opts]).
+
+smoke_tests() ->
+ {ok, Cwd} = file:get_cwd(),
+ ts_lib:specialized_specs(Cwd,"smoke").
%%
%% estone/0, estone/1
diff --git a/lib/test_server/src/ts_benchmark.erl b/lib/test_server/src/ts_benchmark.erl
index 516d22fd2d..bd6abc3372 100644
--- a/lib/test_server/src/ts_benchmark.erl
+++ b/lib/test_server/src/ts_benchmark.erl
@@ -30,12 +30,7 @@
benchmarks() ->
{ok, Cwd} = file:get_cwd(),
- Benches = filelib:wildcard(
- filename:join([Cwd,"..","*_test","*_bench.spec"])),
- [begin
- Base = filename:basename(N),
- list_to_atom(string:substr(Base,1,string:rstr(Base,"_")-1))
- end || N <- Benches].
+ ts_lib:specialized_specs(Cwd,"bench").
run(Specs, Opts, Vars) ->
{ok, Cwd} = file:get_cwd(),
diff --git a/lib/test_server/src/ts_lib.erl b/lib/test_server/src/ts_lib.erl
index a00f607fc1..52bb346043 100644
--- a/lib/test_server/src/ts_lib.erl
+++ b/lib/test_server/src/ts_lib.erl
@@ -27,6 +27,7 @@
erlang_type/1,
initial_capital/1,
specs/1, suites/2,
+ specialized_specs/2,
subst_file/3, subst/2, print_data/1,
make_non_erlang/2,
maybe_atom_to_list/1, progress/4,
@@ -91,13 +92,22 @@ initial_capital([C|Rest]) when $a =< C, C =< $z ->
initial_capital(String) ->
String.
+specialized_specs(Dir,PostFix) ->
+ Specs = filelib:wildcard(filename:join([filename:dirname(Dir),
+ "*_test", "*_"++PostFix++".spec"])),
+ sort_tests([begin
+ Base = filename:basename(Name),
+ list_to_atom(string:substr(Base,1,string:rstr(Base,"_")-1))
+ end || Name <- Specs]).
+
specs(Dir) ->
Specs = filelib:wildcard(filename:join([filename:dirname(Dir),
"*_test", "*.{dyn,}spec"])),
- % Filter away all spec which end with _bench.spec
+ % Filter away all spec which end with {_bench,_smoke}.spec
NoBench = fun(SpecName) ->
case lists:reverse(SpecName) of
"ceps.hcneb_"++_ -> false;
+ "ceps.ekoms_"++_ -> false;
_ -> true
end
end,
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/emacs/erlang.el b/lib/tools/emacs/erlang.el
index f3bc95e3e5..3ecda1d285 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -2813,6 +2813,9 @@ Return nil if inside string, t if in a comment."
(- (+ previous erlang-argument-indent) 1))))
(t
(nth 2 stack-top))))
+ ((= (following-char) ?,)
+ ;; a comma at the start of the line: line up with opening parenthesis.
+ (nth 2 stack-top))
(t
(goto-char (nth 1 stack-top))
(let ((base (cond ((looking-at "[({]\\s *\\($\\|%\\)")
diff --git a/lib/tools/emacs/test.erl.indented b/lib/tools/emacs/test.erl.indented
index 6c9343f6cb..7e61bcc45b 100644
--- a/lib/tools/emacs/test.erl.indented
+++ b/lib/tools/emacs/test.erl.indented
@@ -700,3 +700,34 @@ some_function_name_xyz(xyzzy, #some_record{
field2 = Field1,
field2 = Field2}}),
{ok, SomeVariable}.
+
+commas_first() ->
+ {abc, [ {some_var, 1}
+ , {some_other_var, 2}
+ , {erlang_ftw, 9}
+ , {erlang_cookie, 'cookie'}
+ , {cmds,
+ [ {one, "sudo ls"}
+ , {one, "sudo ls"}
+ , {two, "sudo ls"}
+ , {three, "sudo ls"}
+ , {four, "sudo ls"}
+ , {three, "sudo ls"}
+ ] }
+ , {ssh_username, "yow"}
+ , {cluster,
+ [ {aaaa, [ {"10.198.55.12" , "" }
+ , {"10.198.55.13" , "" }
+ ] }
+ , {bbbb, [ {"10.198.55.151", "" }
+ , {"10.198.55.123", "" }
+ , {"10.198.55.34" , "" }
+ , {"10.198.55.85" , "" }
+ , {"10.198.55.67" , "" }
+ ] }
+ , {cccc, [ {"10.198.55.68" , "" }
+ , {"10.198.55.69" , "" }
+ ] }
+ ] }
+ ]
+ }.
diff --git a/lib/tools/emacs/test.erl.orig b/lib/tools/emacs/test.erl.orig
index 0f8c4a9175..932758997d 100644
--- a/lib/tools/emacs/test.erl.orig
+++ b/lib/tools/emacs/test.erl.orig
@@ -700,3 +700,34 @@ some_function_name_xyz(xyzzy, #some_record{
field2 = Field1,
field2 = Field2}}),
{ok, SomeVariable}.
+
+commas_first() ->
+ {abc, [ {some_var, 1}
+ , {some_other_var, 2}
+ , {erlang_ftw, 9}
+ , {erlang_cookie, 'cookie'}
+ , {cmds,
+ [ {one, "sudo ls"}
+ , {one, "sudo ls"}
+ , {two, "sudo ls"}
+ , {three, "sudo ls"}
+ , {four, "sudo ls"}
+ , {three, "sudo ls"}
+ ] }
+ , {ssh_username, "yow"}
+ , {cluster,
+ [ {aaaa, [ {"10.198.55.12" , "" }
+ , {"10.198.55.13" , "" }
+ ] }
+ , {bbbb, [ {"10.198.55.151", "" }
+ , {"10.198.55.123", "" }
+ , {"10.198.55.34" , "" }
+ , {"10.198.55.85" , "" }
+ , {"10.198.55.67" , "" }
+ ] }
+ , {cccc, [ {"10.198.55.68" , "" }
+ , {"10.198.55.69" , "" }
+ ] }
+ ] }
+]
+}.
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/lib/xmerl/doc/src/xmerl_ug.xmlsrc b/lib/xmerl/doc/src/xmerl_ug.xmlsrc
index 8a0805020e..10c770c400 100644
--- a/lib/xmerl/doc/src/xmerl_ug.xmlsrc
+++ b/lib/xmerl/doc/src/xmerl_ug.xmlsrc
@@ -409,9 +409,9 @@ Data =
specification but the basic functionality. For all details see
the <seealso marker="xmerl_xs">reference manual</seealso></p>
<p>First, some words about the xmerl_xs functionality:</p>
- <p>You need to wright template functions to be able to control
+ <p>You need to write template functions to be able to control
what kind of output you want. Thus if you want to encapsulate a
- <c>bike</c> element in &lt;p&gt; tags you simply wright a
+ <c>bike</c> element in &lt;p&gt; tags you simply write a
function:</p>
<pre>
template(E = #xmlElement{name='bike'}) ->
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.