Age | Commit message (Collapse) | Author | |
---|---|---|---|
2018-04-12 | New process_info() implementation using signals | Rickard Green | |
2018-03-21 | Implementation of true asynchronous signaling between processes | Rickard Green | |
Communication between Erlang processes has conceptually always been performed through asynchronous signaling. The runtime system implementation has however previously preformed most operation synchronously. In a system with only one true thread of execution, this is not problematic (often the opposite). In a system with multiple threads of execution (as current runtime system implementation with SMP support) it becomes problematic. This since it often involves locking of structures when updating them which in turn cause resource contention. Utilizing true asynchronous communication often avoids these resource contention issues. The case that triggered this change was contention on the link lock due to frequent updates of the monitor trees during communication with a frequently used server. The signal order delivery guarantees of the language makes it hard to change the implementation of only some signals to use true asynchronous signaling. Therefore the implementations of (almost) all signals have been changed. Currently the following signals have been implemented as true asynchronous signals: - Message signals - Exit signals - Monitor signals - Demonitor signals - Monitor triggered signals (DOWN, CHANGE, etc) - Link signals - Unlink signals - Group leader signals All of the above already defined as asynchronous signals in the language. The implementation of messages signals was quite asynchronous to begin with, but had quite strict delivery constraints due to the ordering guarantees of signals between a pair of processes. The previously used message queue partitioned into two halves has been replaced by a more general signal queue partitioned into three parts that service all kinds of signals. More details regarding the signal queue can be found in comments in the erl_proc_sig_queue.h file. The monitor and link implementations have also been completely replaced in order to fit the new asynchronous signaling implementation as good as possible. More details regarding the new monitor and link implementations can be found in the erl_monitor_link.h file. | |||
2018-01-19 | erts: Optimize move_cons & move_boxed | Sverker Eriksson | |
Replace double pointer with return that can mostly be ignored. Use restrict pointers. | |||
2017-05-04 | Update copyright year | Raimo Niskanen | |
2017-02-28 | erts: Refactor MOVE_CONS to inline function | Björn-Egil Dahlberg | |
2017-02-28 | erts: Refactor MOVE_BOXED to inline function | Björn-Egil Dahlberg | |
2017-02-28 | erts: Convert small sub-binaries to heap-binaries | Björn-Egil Dahlberg | |
In many cases sub-binaries costs more memory than converting them to heap-binaries. Sub-binaries also has a hidden cost of pinning larger binaries in memory. By converting binaries this cost is reduced. Byte aligned sub-binaries upto 24 bytes (64-bit) or 12 bytes (32-bit) are converted. | |||
2017-01-23 | Merge branch 'sverker/ASSERT_IN_ENV' | Sverker Eriksson | |
* sverker/ASSERT_IN_ENV: erts: Add macro ERTS_PROC_LOCKS_HIGHER_THAN erts: Cleanup and extra assertions in nif_SUITE.c erts: Cleanup enif_make_reverse_list erts: Add assertions for correct ErlNifEnv erts: Make erts_dbg_within_proc available # Conflicts: # erts/emulator/beam/erl_gc.h | |||
2017-01-17 | Merge branch 'rickard/ds-features-20' | Rickard Green | |
OTP-14152 * rickard/ds-features-20: Remove experimental disclaimer on dirty schedulers Scheduler wall time support for dirty schedulers Always return info from system_info(dirty_[cpu|io]_schedulers*) Improve etp-commands Switch between scheduler types when multi-scheduling is blocked Perform potentially long GC on dirty schedulers if available Return and exception trace for nif-export scheduled BIFs Optimize handling of BIF errors Support for dirty BIFs Reduction counting on non-tail return | |||
2017-01-17 | Merge branch 'rickard/no-harddebug' into maint | Rickard Green | |
* rickard/no-harddebug: Do not automatically define HARDDEBUG when DEBUG is defined | |||
2017-01-13 | Do not automatically define HARDDEBUG when DEBUG is defined | Rickard Green | |
2017-01-13 | Fix memory leak of temporary heap | Rickard Green | |
This bug was introduced in previous commit, and has never been released in an official OTP version. | |||
2017-01-12 | Perform potentially long GC on dirty schedulers if available | Rickard Green | |
2017-01-04 | erts: Make erts_dbg_within_proc available | Sverker Eriksson | |
for debug assertions. | |||
2016-05-10 | erts: Implement max_heap_size process flag | Lukas Larsson | |
The max_heap_size process flag can be used to limit the growth of a process heap by killing it before it becomes too large to handle. It is possible to set the maximum using the `erl +hmax` option, `system_flag(max_heap_size, ...)`, `spawn_opt(Fun, [{max_heap_size, ...}])` and `process_flag(max_heap_size, ...)`. It is possible to configure the behaviour of the process when the maximum heap size is reached. The process may be sent an untrappable exit signal with reason kill and/or send an error_logger message with details on the process state. A new trace event called gc_max_heap_size is also triggered for the garbage_collection trace flag when the heap grows larger than the configured size. If kill and error_logger are disabled, it is still possible to see that the maximum has been reached by doing garbage collection tracing on the process. The heap size is defined as the sum of the heap memory that the process is currently using. This includes all generational heaps, the stack, any messages that are considered to be part of the heap and any extra memory the garbage collector may need during collection. In the current implementation this means that when a process is set using on_heap message queue data mode, the messages that are in the internal message queue are counted towards this value. For off_heap, only matched messages count towards the size of the heap. For mixed, it depends on race conditions within the VM whether a message is part of the heap or not. Below is an example run of the new behaviour: Eshell V8.0 (abort with ^G) 1> f(P),P = spawn_opt(fun() -> receive ok -> ok end end, [{max_heap_size, 512}]). <0.60.0> 2> erlang:trace(P, true, [garbage_collection, procs]). 1 3> [P ! lists:duplicate(M,M) || M <- lists:seq(1,15)],ok. ok 4> =ERROR REPORT==== 26-Apr-2016::16:25:10 === Process: <0.60.0> Context: maximum heap size reached Max heap size: 512 Total heap size: 723 Kill: true Error Logger: true GC Info: [{old_heap_block_size,0}, {heap_block_size,609}, {mbuf_size,145}, {recent_size,0}, {stack_size,9}, {old_heap_size,0}, {heap_size,211}, {bin_vheap_size,0}, {bin_vheap_block_size,46422}, {bin_old_vheap_size,0}, {bin_old_vheap_block_size,46422}] flush(). Shell got {trace,<0.60.0>,gc_start, [{old_heap_block_size,0}, {heap_block_size,233}, {mbuf_size,145}, {recent_size,0}, {stack_size,9}, {old_heap_size,0}, {heap_size,211}, {bin_vheap_size,0}, {bin_vheap_block_size,46422}, {bin_old_vheap_size,0}, {bin_old_vheap_block_size,46422}]} Shell got {trace,<0.60.0>,gc_max_heap_size, [{old_heap_block_size,0}, {heap_block_size,609}, {mbuf_size,145}, {recent_size,0}, {stack_size,9}, {old_heap_size,0}, {heap_size,211}, {bin_vheap_size,0}, {bin_vheap_block_size,46422}, {bin_old_vheap_size,0}, {bin_old_vheap_block_size,46422}]} Shell got {trace,<0.60.0>,exit,killed} | |||
2016-05-04 | Ensure correct reduction counting | Rickard Green | |
2016-03-15 | update copyright-year | Henrik Nord | |
2015-11-16 | erts: Add garbage_collection_info to process_info/2 | Lukas Larsson | |
This info request returns greater details about the current gc state. This info is not included in the default process_info/1 as it would clutter the default printout with too much information. | |||
2015-11-12 | Bump reductions on GC | Rickard Green | |
2015-11-12 | Fragmented young heap generation and off_heap_message_queue option | Rickard Green | |
* The youngest generation of the heap can now consist of multiple blocks. Heap fragments and message fragments are added to the youngest generation when needed without triggering a GC. After a GC the youngest generation is contained in one single block. * The off_heap_message_queue process flag has been added. When enabled all message data in the queue is kept off heap. When a message is selected from the queue, the message fragment (or heap fragment) containing the actual message is attached to the youngest generation. Messages stored off heap is not part of GC. | |||
2015-11-12 | Introduce literal tag | Rickard Green | |
2015-06-18 | Change license text to APLv2 | Bruce Yinhe | |
2015-03-25 | erts: Combine flat and hash maps under one unifying tag | Björn-Egil Dahlberg | |
2015-03-12 | erts: Refactor maps naming convention | Sverker Eriksson | |
flatmap: Small map hashmap: Large map map: flatmap or hashmap | |||
2015-03-12 | Initial Persistent HAMT - Map framework | Björn-Egil Dahlberg | |
Conflicts: erts/emulator/Makefile.in erts/emulator/beam/bif.tab erts/emulator/beam/erl_gc.c erts/emulator/beam/erl_gc.h erts/emulator/beam/erl_printf_term.c erts/emulator/beam/erl_term.c erts/emulator/beam/erl_term.h | |||
2014-10-24 | erts: Make hipe_{un}reserve_beam_trap_frame INLINE | Sverker Eriksson | |
2014-01-28 | erts: Initial Map instructions, type and structure | Björn-Egil Dahlberg | |
2011-12-09 | Update copyright years | Björn-Egil Dahlberg | |
2011-12-02 | Get cerl and distribution working in Win64 | Patrik Nyblom | |
Can still not setup -a, but cerl works. | |||
2010-06-03 | OTP-8555 Send message from NIF | Sverker Eriksson | |
New NIF features: Send messages from a NIF, or from thread created by NIF, to any local process (enif_send) Store terms between NIF calls (enif_alloc_env, enif_make_copy) Create binary terms with user defined memory management (enif_make_resource_binary) | |||
2009-11-20 | The R13B03 release.OTP_R13B03 | Erlang/OTP | |