Age | Commit message (Collapse) | Author |
|
|
|
In the #erlang IRC channel Anthony Ramine once mentioned the idea of
allowing a NIF to use an emulator trap, similar to a BIF trap, to schedule
another NIF for execution. This is exactly how dirty NIFs were implemented
for Erlang/OTP 17.0, so this commit refactors and generalizes that dirty
NIF code to support a new enif_schedule_nif() API function.
The enif_schedule_nif() function allows a long-running NIF to be broken
into separate NIF invocations. The NIF first executes part of the
long-running task, then calls enif_schedule_nif() to schedule a NIF for
later execution to continue the task. Any number of NIFs can be scheduled
in this manner, one after another. Since the emulator regains control
between invocations, this helps avoid problems caused by native code tying
up scheduler threads for too long.
The enif_schedule_nif() function also replaces the original experimental
dirty NIF API. The function takes a flags parameter that a caller can use
to indicate the NIF should be scheduled onto either a dirty CPU scheduler
thread, a dirty I/O scheduler thread, or scheduled as a regular NIF on a
regular scheduler thread. With this change, the original experimental
enif_schedule_dirty_nif(), enif_schedule_dirty_nif_finalizer() and
enif_dirty_nif_finalizer() API functions are no longer needed and have been
removed. Explicit scheduling of a dirty NIF finalization function is no
longer necessary; if an application wants similar functionality, it can
have a dirty NIF just invoke enif_schedule_nif() to schedule a non-dirty
NIF to complete its task.
Lift the restriction that dirty NIFs can't call enif_make_badarg() to raise
an exception. This was a problem with the original dirty NIF API because it
forced developers to get and check all incoming arguments in a regular NIF,
and then schedule the dirty NIF which then had to get all the arguments
again. Now, the argument checking can be done in the dirty NIF and it can
call enif_make_badarg() itself to flag incorrect arguments.
Extend the ErlNifFunc struct with a new flags field that allows NIFs to be
declared as dirty. The default value for this field is 0, indicating a
regular NIF, so it's backwards compatible with all existing statically
initialized ErlNifFunc struct instances, and so such instances require no
code changes. Defining the flags field with a value of
ERL_NIF_DIRTY_JOB_CPU_BOUND indicates that the NIF should execute on a
dirty CPU scheduler thread, or defining it with a value of
ERL_NIF_DIRTY_JOB_IO_BOUND indicates that the NIF should execute on a dirty
I/O scheduler thread. Any other flags field value causes a NIF library
loading error.
Extend the ErlNifEntry struct with a new options field that indicates
whether a NIF library was built with support for optional features such as
dirty NIFs. When a NIF library is loaded, the runtime checks the options
field to ensure compatibility. If a NIF library built with dirty NIF
support is loaded into a runtime that does not support dirty NIFs, and the
library defines one or more ErlNifFunc entries with non-zero flags fields
indicating dirty NIFs, a NIF library loading error results. There is no
error if a NIF library built with dirty NIF support is loaded into a
runtime that does not support dirty NIFs but the library does not have any
dirty NIFs. It is also not an error if a library without dirty NIF support
is loaded into a runtime built with dirty NIF support.
Add documentation and tests for enif_schedule_nif().
|
|
* egil/proc_lib-optimizations/OTP-12060:
stdlib: Update dependencies to erts-6.2
erts: Update preloaded erlang.beam
stdlib: Use erlang:fun_info_mfa/1 in proc_lib:init_p/3
erts: Test erlang:fun_info_mfa/1
erts: Introduce erlang:fun_info_mfa/1
|
|
* nox/reedr-logging/OTP-12115:
Add number of entries to mnesia copy debug message
Add thread index to allocator enomem dump slogan
Add run queue index to process dump info
Add missing error string to syslog logging in epmd
Demote rare debug slogan of message discarding to debug build
|
|
|
|
* lukas/erts/fix_neg_of_int64_min/OTP-12097:
erts: Fix neg int overflow when sint is min size
|
|
* nox/clang-ubsan/OTP-12097:
Properly handle SINT_MIN in small_to_big()
Use offsetof() in io.c
|
|
* rickard/nosuspend-bug/OTP-12082:
Fix build of test port program
Update Makefile.src
Add async_ports test
Fix abort of nosuspend-tasks in erts_port_task_schedule()
|
|
When INT64_MIN is the value of a Sint64 we have to first cast it to
an Uint64 before negating it. Otherwise we get an integer overflow
which is undefined behaviour and in gcc 4.9 this results in -0 instead
of -9223372036854775808 in gcc 4.8.
|
|
OTP-12081
* tuncer/sanitizers:
Implement --enable-sanitizers[=sanitizers]
|
|
* lukas/erts/malloc_failure_errors/OTP-12085:
erts: Print error reason when malloc fails
|
|
|
|
* lukas/erts/fd_bind_tc_fix/OTP-12061:
erts: Fix tc and docs after {fd,FD} bind change
|
|
The sha of the original change is 52810718b
|
|
|
|
|
|
|
|
The counter for the amount of outstanding data in the port queue
became inconsistent when aborting nosuspend-signals in
erts_port_task_schedule(). This since the counter was subtracted
by the data size of the signal although the data size had never
been added to it. This inconsistency caused the port queue to
remain in a busy state forever.
|
|
OTP-12052
* derek121/epmd-docs-2:
Fix minor grammatical errors in epmd docs
|
|
|
|
Conflicts:
erts/doc/src/notes.xml
erts/preloaded/ebin/prim_inet.beam
erts/vsn.mk
lib/kernel/doc/src/notes.xml
lib/kernel/vsn.mk
|
|
|
|
Inet close must remove fd from select/poll without closing the fd.
|
|
|
|
Small grammar changes.
|
|
|
|
Specs for erlang:fun_info_mfa/1
|
|
Similar to debugging with Valgrind, it's very useful to enable
-fsanitize= switches to catch bugs at runtime.
$ ./configure
Result: no sanitizer enabled
$ ./configure --enable-sanitizers
Result: -fsanitize=address,undefined
$ ./configure --enable-sanitizers=address,thread,undefined
Result: -fsanitize=address,thread,undefined
$ ./configure --enable-sanitizers=undefined
Result: -fsanitize=undefined
|
|
* sverk/alloc-size-overflow:
erts: Fix size overflow bugs in memory allocation
|
|
|
|
Introduced for proc_lib:init_p/3
|
|
OTP-12052
* vinoski/vinoski/erl-sdio-option:
add missing description for erl +SDio option
|
|
|
|
|
|
* nox/filelib-wildcard-broken-link:
Update stdlib appup file
Update runtime dependencies
Update preloaded
Add tests of filelib and symlinks
Fix handling of broken symlinks in filelib
Conflicts:
erts/preloaded/ebin/erl_prim_loader.beam
|
|
|
|
|
|
This fixes a bug introduced in f11aabdc9fec593c31e6c4f3fa25c1707e9c35df where
filelib:eval_read_file_info/2 was made to use file:read_link_info/1 to never
follow symlinks. This fixed wildcard/1 but broke every other function using
eval_read_file_info/2.
Reported-by: Louis-Philippe Gauthier
Reported-by: Danil Zagoskin
|
|
Specify in the documentation that erlang:statistics(runtime) returns milliseconds.
|
|
As there is no overflow for signed integers, -SINT_MIN is undefined behaviour
and the cast to unsigned needs to happen before negation. SINT_MIN denotes the
minimum value that can be stored in the Sint type.
beam/big.c:1512:6: runtime error: negation of -9223372036854775808 cannot be represented in type 'Sint' (aka 'long'); cast to an unsigned type to negate this value to itself
|
|
This silences the following UBSan errors:
beam/io.c:7131:27: runtime error: member access within null pointer of type 'ErlDrvSysInfo'
beam/io.c:7140:20: runtime error: member access within null pointer of type 'ErlDrvSysInfo'
beam/io.c:7166:20: runtime error: member access within null pointer of type 'ErlDrvSysInfo'
beam/io.c:7174:20: runtime error: member access within null pointer of type 'ErlDrvSysInfo'
|
|
|
|
|
|
The commit adb5dc0090bc419e2c4c1250653badbddeb6263b (ETHR_FORCE_INLINE)
broke some platforms without adequate thread support.
|
|
|
|
Add explanatory text for the erl +SDio option, which is used to set the
number of dirty I/O schedulers.
|
|
|
|
* egil/fix-doc-links:
doc: Fix broken links in Installation Guide
doc: Fix broken links
|
|
|
|
* siri/cuddle-with-tests:
[upgrade_SUITE] Set previous major to r16b
|