Age | Commit message (Collapse) | Author |
|
* maint:
Updated OTP version
Update release notes
Update version numbers
erts: Fix bug in quick alloc
Fix old length usage in string
stdlib: Fix bug in proc_lib
Support arbitrary crash report in proc_lib.
|
|
* maint-20:
Updated OTP version
Update release notes
Update version numbers
erts: Fix bug in quick alloc
Fix old length usage in string
stdlib: Fix bug in proc_lib
Support arbitrary crash report in proc_lib.
|
|
Support e2k platform
OTP-14492
|
|
Choose a "lagom" low value to provoke both
fallback on erts_alloc
AND thread racing in lockless deallocation queue.
|
|
* sverker/prealloc-race-bug/OTP-14491:
erts: Fix bug in quick alloc
|
|
* rickard/statistics/OTP-14484:
Fix statistics(wall_clock) and statistics(runtime) implementation
|
|
into maint-20
* lukas/erts/fix_outputv_port_task_cleanup/ERL-428/OTP-14481:
fixup! erts: Cleanup dropped port tasks correctly
erts: Add tests to detect port close race
erts: Cleanup dropped port tasks correctly
|
|
The effect of the race is that a pre-allocated memory block
is inserted last without updating tail.data.last, which will cause
all subsequent insertions to also fail to update tail.data.last.
Hence all pre-allocation for this quick alloc instance is leaked
for this thread and will fallback on erts_alloc.
|
|
|
|
* sverker/erts/apply-badarg/ERL-432/OTP-14490:
erts: Make apply throw 'badarg' if Args is not a list
|
|
Bit syntax instructions never store their result in a Y register.
Therefore, change the bit syntax instructions to use 'x' as the
destination instead of 'd'. That will simplify the code that stores
the result, and will be a slight reduction in code size and execution
time.
|
|
|
|
* maint:
Eliminate potential unsafe use of general destination
|
|
* bjorn/erts/fix-gen-dest:
Eliminate potential unsafe use of general destination
|
|
|
|
instead of a strange 'undef' exception.
|
|
* maint-19:
Updated OTP version
Update release notes
Update version numbers
Fix statistics(wall_clock) and statistics(runtime) implementation
fixup! erts: Cleanup dropped port tasks correctly
erts: Add tests to detect port close race
Add a testcase for OTP-13939/ERL-193
erts: Cleanup dropped port tasks correctly
Mark socket disconnected on tcp_send_or_shutdown_error
|
|
* rickard/statistics/OTP-14484:
Fix statistics(wall_clock) and statistics(runtime) implementation
|
|
into maint-19
* lukas/erts/fix_outputv_port_task_cleanup/ERL-428/OTP-14481:
fixup! erts: Cleanup dropped port tasks correctly
erts: Add tests to detect port close race
erts: Cleanup dropped port tasks correctly
|
|
a3407eaa2104d6 eliminated the -gen_dest flag for macros in ops.tab.
It turns out that the new implementation (taking the address of the
X or X destination register) is unsafe if the destination is a Y
register and there can be a GC. The problem is that the address to
the Y register will change if there is a GC.
Fortunately, the few instructions in OTP 20 that have a general
destinations are safe. The put_list_ssd instruction never does a GC.
The bit syntax instructions that may do a GC will always store the
result to an X register.
To be completely sure, rewrite the destination register from 'd' to
'x' for the bit syntax instructions. That means that a bit syntax
instruction with a Y register destionation will abort the loading
if it is encountered.
|
|
|
|
|
|
If we don't have the main lock, multiple threads may come in and
do the flush at the same time which will lead to all kinds of
strang problems.
|
|
|
|
|
|
|
|
|
|
|
|
Before this fix, the extra data attached to a port task had to
be cleaned up by the calling function. This caused problems
because the outputv call, co-allocates the extra data with the
port task. So in rare circumstances the port task would be
free'd before the extra data was free'd which led to segfault
when looking at the port task.
This has been fixed by the generic PORT_TASK_ABORT behaviour
being used even for tasks dropped in the erts_schedule_proc2port_signal
API.
|
|
The relevant macros are already guarded by said #ifdefs.
|
|
You're not supposed to do this, but it behaved correctly even with a debug
build aside from degraded performance (The scheduler started to busy-wait
for new operations rather than sleep).
|
|
This reverts commit 65b04e233e09e3cc2e0fda3c28e155b95c5a4baf.
|
|
Add enif_whereis_pid() and enif_whereis_port() functions
OTP-14453
|
|
* rickard/purge-hibernated-20:
Update testcase to check that purge handle hibernated process correct
Do not GC hibernated process from other processes
Fix check_process_code() on hibernated process
|
|
* bjorn/erts/fix-sys-task-cleanup:
Make sure that asynchronous replies are not lost
|
|
* rickard/purge-hibernated-19/ERIERL-24/OTP-14444:
Update testcase to check that purge handle hibernated process correct
Do not GC hibernated process from other processes
Fix check_process_code() on hibernated process
|
|
Make some C code static
|
|
erts: Remove unused functions from erl_cpu_topology
|
|
|
|
* rickard/purge-hibernated-19:
Do not GC hibernated process from other processes
Fix check_process_code() on hibernated process
Conflicts:
erts/emulator/beam/beam_bif_load.c
erts/emulator/beam/erl_process.c
erts/emulator/beam/erl_process.h
|
|
* rickard/purge-hibernated:
Do not GC hibernated process from other processes
Fix check_process_code() on hibernated process
Conflicts:
erts/emulator/beam/beam_bif_load.c
erts/emulator/beam/erl_gc.c
erts/emulator/beam/erl_process.h
|
|
|
|
|
|
(First attempt to fix in 23f132d9ab776a.)
If an synchronous GC was requested by calling:
erlang:garbage_collect(Pid, [{async,Ref}])
the reply message could in certain circumstances be
lost.
The problem is that cleanup_sys_tasks() is never called
if there are dirty tasks, but no other active system tasks.
Also shorten the long waiting times in the test case
binary_SUITE:trapping/1 to make it much more likely that
the GC have not already finished when the process is killed.
|
|
OTP-14438
* rickard/sys-proc-off-heap-msgq:
Enable off-heap message queue for code purger, et. al.
|
|
|
|
Before terminating a process, add assertions to make sure that
all queues for system tasks have been emptied.
|
|
If an synchronous GC was requested by calling:
erlang:garbage_collect(Pid, [{async,Ref}])
the reply message could in certain circumstances be
lost.
The problem is in cleanup_sys_tasks() in erl_process.c.
If there were at least one dirty task, only the first
dirty task would be cleaned up. All other systems tasks
would not be cleaned up (that is, no replies would be
sent to other processes waiting for the tasks to finish).
|
|
|
|
#### Why do we need this new feature?
There are cases when a NIF needs to send a message, using `enif_send()`, to a long-lived process with a registered name.
A common use-case is logging, where asynchronous fire-and-forget messages are the norm.
There can also be cases where a yielding or dirty NIF or background thread may request a callback from a service with additional information it needs to complete its operation, yielding or waiting (with suitable timeouts, etc) until its state has been updated through the NIF module's API.
NIFs can only send messages to pids, and the lack of name resolution leaves a complicated dance between separate monitoring processes and the NIF as the only way to keep a NIF informed of the whereabouts of such long-lived processes.
Providing a reliable, built-in facility for NIFs to resolve process (or port) names simplifies these use cases considerably.
#### Risks or uncertain artifacts?
Testing has not exposed any significant risk.
The implementation behaves as expected on regular and dirty scheduler threads as well as non-scheduler threads.
By constraining the `enif_whereis_...()` functions to their minimal scopes and using patterns consistent with related functions, the implementation, testing, and maintenance burden is low.
The API and behavior of existing functions is unchanged.
#### How did you solve it?
While extending `enif_send()` to operate on a pid or an atom (as `erlang:send/2` does) was attractive, it would have entailed changing the type of its `to_pid` parameter and thereby breaking backward compatibility.
The same consideration applies to `enif_port_command()`.
That leaves a choice between 1, 2, or 3 new functions:
1. `enif_whereis()`
2. `enif_whereis_pid()` and `enif_whereis_port()`
3. All of the above.
While option (1), directly mimicking the behavior of `erlang:whereis/1`, is appealing, it poses potential problems if `pid()` or `port()` are subsequently implemented as non-integral types that must be bound to an owning `ErlNifEnv` instance.
Therefore, option (2) has been chosen to use `ErlNifPid`/`ErlNifPort` structures in the API to maintain proper term ownership semantics.
|