Age | Commit message (Collapse) | Author |
|
I've found stdlib's timer to burn CPU without good reason. Here's what
happens.
The problem is that it sleeps in milliseconds but computes time in
microseconds. And there is bug in code to compute milliseconds to
sleep. It computes microseconds difference between now and nearest
timer event and then does _truncating_ division by 1000. So on average
it sleeps 500 microseconds _less than needed_. On wakeup its checks do
I have timer tick that already occurred? No. Ok how much I need to
sleep ? It does that bad computation again and gets 0
milliseconds. So next gen_server timeout happens right away only to
find we're still before closest timer tick and to decide to sleep 0
milliseconds again. And again and again.
This commit changes division to pick ceiling of ratio rather than
floor. So that we always sleep not less then difference between now
and closest event time.
|
|
|
|
* lh/demonitor-flush/OTP-11039:
Use erlang:demonitor(Ref, [flush]) where applicable
|
|
* lh/otp-optims/OTP-11035:
Use erlang:demonitor's flush option on timeout
Don't lookup the node unless required in gen:call/{3,4}
|
|
|
|
* sv/stdlib/sys-get-state/OTP-11013:
Removed ?line macro
add sys:get_state/1,2 and sys:replace_state/2,3
update sys:get_status/2,3 documentation for gen_event
|
|
In rest_for_one and one_for_all supervisors one child dying can cause
multiple children to be restarted. Previously if the child that caused
the restart is started successfully but another child fails to start,
the supervisor would not terminate this child with the other
successfully restarted children as no record of the pid was kept. Thus
the supervisor would try to start this child again. This could lead to
multiples of the same child or if the child is registered cause repeated
attempts at starting this child - until the max restart threshold was
reached.
Now the child that failed to start becomes the restarting child, instead
of staying with the same child, for the next restart attempt. This has
the following side effects:
1) In one_for_all the new version of the child that original died is
terminated before a restart attempt is made.
2) In rest_for_one all succesfully restarted children are not terminated
and restarting continues from the child that failed to start.
|
|
At Erlang Factory 2013 there was discussion during one of the talks about
the sys:get_status functions and how useful they were for debugging. Geoff
Cant mentioned it would be very useful if the sys module also provided
functions to use while debugging to get just the state of a process and
also to be able to replace the state of a process, and many others in the
audience appeared to agree.
The sys:get_state/1,2 functions return the state of a gen_server, gen_fsm,
or gen_event process. The return value varies depending on the process
type: process state for a gen_server, state name and state data for a
gen_fsm, and handler module, handler id, and handler state for each handler
registered in a gen_event process.
The sys:replace_state/2,3 functions allow the state of a gen_server,
gen_fsm, or gen_event process to be replaced with a new state. These
functions take a function argument that updates or replaces the process
state; using a function to change the state eliminates the race condition
of first reading the state via sys:get_state/1 or sys:get_state/2, using
its return value to create a new state, and then replacing the old state
with the new state, since during that time the process might have received
other calls or messages that could have changed its state.
* For a gen_server process, the state replacement function takes the
process state as an argument and returns a new state.
* For a gen_fsm process, the state replacement function gets a tuple of
{StateName, StateData} and returns a similar tuple that specifies a new
state name, new state data, or both.
* For a gen_event process, the state replacement function is called for
each registered event handler. It gets a tuple {Module, Id, HandlerState}
and returns a similar tuple that specifies the same Module and Id values
but may specify a different value for HandlerState.
If the state replacement function crashes or results in an error, the
original state of a gen_server or gen_fsm process is maintained; if such a
crash occurs for a gen_event process, the original state of the event
handler for which the state replacement function was called is maintained,
but the states of other event handlers of the same gen_event process may
still be updated if no errors or crashes occur while replacing their
states.
Add documentation for sys:get_state/1,2 and sys:replace_state/2,3. The
documentation explicitly notes that the functions are intended for use
during debugging.
Add new tests for these functions to gen_server_SUITE, gen_fsm_SUITE, and
gen_event_SUITE.
|
|
It is equivalent to the few lines removed, except more efficient.
|
|
Move some operations that aren't required for the happy path.
The operations were small, so they shouldn't show a big difference
in benchmarks except for systems with many active gen processes.
|
|
A bug has been fixed: when given the option {encoding,utf8} a list of
floating point numbers (in the correct interval) was mistakenly
returned as a string.
|
|
The scanner did not crash when a floating point number was encountered
in the input string.
|
|
The manual says that an Emacs directive can be placed on the second
line. With this patch that directive is also recognized when selecting
encoding of the script.
|
|
The test case deletes a Dets process while it is repairing a file.
Another client waiting for the Dets process to reply then kicks in and
repairs the file. Apparently the temporary file was still open,
resulting in an eacces error on Windows.
|
|
|
|
The I/O-server group.erl echoed the skipped line.
|
|
* hb/file_name_type/OTP-10852:
Introduce new type file:name_all()
|
|
* pan/unicode_printable_ranges:
Adapt stdlib tests to ~tp detecting latin1 binaries
Update primary bootstrap
Make wx debugger use +pc flag when applicable
Correct misspelled comments and space at lin ends
Make ~tp output latin1 binaries as strings if possible
Leave the +pc handling to io and io_lib_pretty
Remove newly introduced warning in erlexec.c
Make shell_SUITE:otp_10302 use +pc unicode when needed
Fix io_proto_SUITE to handle the new io_lib_pretty:print
Add testcase for +pc and io:printable_range/0
Make printing of UTF-8 in binaries behave like lists.
Document +pc flag and io:printable_range/0
Add usage of and spec for io:printable_range/0
Add +pc {latin1|unicode} switch and io:printable_range/0
Fix some Unicode issues
OTP-18084
|
|
* lukas/stdlib/binary_typespec:
bin_to_list can also take a negative len
|
|
|
|
|
|
* hb/stdlib/unicode_corrections/OTP-10820:
Use ~ts for filenames
|
|
|
|
|
|
|
|
This makes the shell output binaries and list as intended by
the +pc setting.
|
|
pan/unicode_printable_ranges
* hb/stdlib/unicode_corrections/OTP-10820:
Fix some Unicode issues
Conflicts:
lib/stdlib/test/shell_SUITE.erl
|
|
This means that only UTF-8 characters in binaries that conform
to the printable_range are printed as <<"..."/utf8>> in io_lib_pretty.
|
|
This makes both io:format("~tp", ...) and
the shell honor the +pc setting and also reverts the shell to
the old behaviour of only interpreting latin1 strings as "strings"
by default. +pc unicode turns on the R16A behaviour. Doing
io:format("~tp~n", [[1024,1025]]).
will show you the difference when starting with +pc unicode.
|
|
Also let the Erlang shell use the new function io:printable_range().
|
|
|
|
|
|
Use the new function shell:strings/1 to toggle how the Erlang shell
outputs lists of integers.
|
|
The modifier 'l' can be used for turning off the string recognition of
~p and ~P.
|
|
* lukas/erts/binary_conv_bifs/OTP-10300:
erts: Remove ?line macro from hash_SUITE
Add float_to_binary and binary_to_float
Add new binary conversion bifs
|
|
|
|
Added: binary_to_integer/1,2, integer_to_binary/1,2
|
|
Too late now to remove gs in R16.
|
|
* bjorn/stdlib/filelib-wildcard/OTP-10812:
Remove special case handling "-" at the beginning of a charset
Optimize character sets using gb_sets
Clean up and simplify the inner matching loop
Only sort the result list once, just before returning
Replace filename:join/2 with '++'
Rethink the filelib:wildcard() functions
Don't redefine error/1
Don't allow binaries as the Cwd argument for filelib:wildcard()
Don't handle binaries from file:list_dir/1
Strengthen test suite
|
|
* bjorn/stdlib/types:
Make the file:filename() type more restrictive
c: Remove handling of binaries in return from file:list_dir/1
|
|
Make sure io_lib:fwrite() with a format string including "~ts" does
not crash when given binaries that cannot be interpreted as
UTF-8-encoded strings.
We want to avoid crashes caused by excessive use of the 't' modifier.
|
|
We don't need this special case, since "-" is only special between
two other characters.
|
|
|
|
Use list comprehensions and 'orelse' to make the code more concise.
Rename wildcard_5/2 to match_part/2 to make it clearer what it does.
If the pattern always matches, don't test it in every iteration of
the loop.
|
|
There does not seem to be any advantage of sorting the result of
file:list_dir/1 directly. Disadvantages are that we'll need to be
careful to keep the result sorted, and that we could waste time
sorting filenames that the pattern matching will discard anyway.
|
|
Under controlled circumstances (and we are in control of the
circumstances), filename:join/2 can be replaced with '++'.
'++' is faster because it is implmented in C, does not need to
look at the list elements it copies, and does not need to copy
its right operand.
|
|
Commit 70b5e24c9498225fadc08d19503269c8aad851bf broke
filelib:wildcard(Pattern, ".").
Over the years, the logic for filelib:wilcard() has become a mess
of special cases.
Probably because of premature optimization, filelib:wildcard(Pattern)
and filelib:wildcard(Pattern, Cwd) are handled differently.
They can be consolidated if we use a "." as the default Cwd argument.
We can also simplify things by compiling the Cwd argument into the
wildcard. We did not that in the initial implementation because it
used to be possible to pre-compile a wildcard and pass it to
filelib:wildcard/{1,2}. Since that is no longer possible, there is
no point in keeping the compiled wildcard "portable" (not dependent
on the Cwd argument).
|
|
It is confusing. Rename our own exception-generating function to
badpattern/1.
|
|
filelib:wildcard() will no longer support "raw filenames", so it
makes no sense for it to accept a binary Cwd argument.
|
|
In R16B, file:list_dir/1 will never return binaries.
|