This document contains a list of potential incompatibilities between Erlang 5.5/OTP R11B (unpatched) and the previous version Erlang 5.4/OTP R10B (unpatched), and is an extract from the release notes for the respective applications.
Some of the potential incompatibilities listed below have been introduced in R10B patches, although as a general rule, this is avoided.
Note: This document was compiled at the time when R11B was released and does not list any potential incompatibilities introduced in R11B patches. If using a patched version of R11B, please refer to the README for the respective patches for information about additional potential incompatibilites.
ignore_try
and
ignore_cond
, which allowed code that used unquoted
try
or cond
as atoms or record tags, has
been removed. Old code that depended on the options need to be
revised to have occurrences of try
or cond
as atom or record tags single-quoted. (Note: Although
cond
is a reserved keyword, there is no
cond
statement. It might be introduced in a future
release.)
refc
field in the ErlDrvBinary
type has been removed. The reference count can be
accessed via API functions. For more information see the
erl_driver(1)
man page.
gen_tcp:recv
with a timeout and retries resulted in code that was hard to
get a good overview of, and ultimate led to situations where
the client got the wrong answer or no answer at all.
The errors where many times very timing dependent and mainly
effected the chunk-related functions, so if you where lucky
you probably would not have noticed. The internal design was
changed to use gen_tcp
active once semantics. The API
is not effected except for the function ftp:quote/2
which now returns a list of strings (ftp result lines) where
the line endings "\r\n" has been removed. This was
the original intention for the return value of
ftp:quote/2
but it was non trivial to make a good such
solution with the old design and a compromise was made.ftp:force_active/1
this way you can get the old
behavior.
unlink/1
and erlang:demonitor/2
behaved completely asynchronous. This had one undesirable
effect, though. You could never know when you were
guaranteed not to be affected by a link that you
had unlinked or a monitor that you had demonitored.unlink/1
and
erlang:demonitor/2
can be viewed as two operations
performed atomically. Asynchronously send an unlink
signal or a demonitor signal, and ignore any future
results of the link or monitor.Mon = erlang:monitor(process, Pid), %% ... exit(Pid, bang), erlang:demonitor(Mon), receive {'DOWN', Mon, process, Pid, _} -> ok %% We were previously guaranteed to get a down message %% (since we exited the process ourself), so we could %% in this case leave out: %% after 0 -> ok end,Own Id: OTP-5772
global_multi_name_action
can be given the value
allow
.auth
module API is deprecated.global(3)
):nodedown
was immediately followed by a
nodeup
;
global
no longer supports nodes
running Erlang/OTP R7B or earlier.zlib
module has been updated in an incompatible way and many
bugs have been corrected. It is now also documented.
format_versions/1
, have been deprecated.conn_info
function once again returns
the next transaction id.localControlDescriptor
list of localParm
now
at least has to be of length 1.ok
return value from
test_digit_event
and
eval_digit_map
has been changed.test_digit_event
and
eval_digit_map
has been changed.File
argument to the function
enable_trace
no
longer sets up dbg
to write the trace events directly
to file but instead to be written to a plain text file using
io:format
.enable_trace
no longer accepts the argument
{io, Verbosity}
.
get_memory_data/0
,
get_system_memory_data/0
) now do not fail, but
return the previously collected value, if any, or a dummy
value otherwise. Also, a warning message is printed.
{update_paths,Bool}
has been added
for release_handler:install_release/2
. It
indicates if all application code paths should be updated
(Bool==true
), or if only code paths for modified
applications should be updated (Bool==false
,
default).release_handler:set_unpacked/2
now returns an
error tuple if a specified application directory does not
exist.
snmpm_network_interface
behaviour has been updated (see
inform_response
and
definition of the manager net if).old_info_format
function.
tcp_closed
message was incorrectly considered illegal, resulting in a
premature termination of the connection process.
ets:info/1
has been corrected to behave according
to the documentation and return a list of tuples, not a
tuple with tuples.filelib:ensure_dir/1
which sometimes
returned true
and sometimes ok
to always
return ok
when successful. This goes against the
documentation which said true
, but ok
was
judged to be a more logical return value.lists:ukeysort/2
and
lists:ukeymerge/3
have been changed in such a way
that two tuples are considered equal if their keys
match.lists:usort/2
and
lists:umerge/3
have been modified too: two elements
are considered equal if they compare equal.file_sorter
module has been modified in a
similar way: the unique
option now applies to the
key (keysort()
and keymerge()
) and the
ordering function (the option {order, Order}
).public
option has been removed from
digraph:new/1
. The reason is that several
functions in the digraph
module are implemented
using multiple ETS accesses, which is not thread safe.
(Thanks to Ulf Wiger.)filelib:wildcard/2
was broken (it ignored its
second argument).filelib:wildcard("Filename")
(where the
argument does not contain any meta-characters) would
always return ["Filename"]
. Corrected so that an
empty list will be returned if "Filename"
does not
actually exist. (Same correction in
filelib:wildcard/2
.) (This change is a slight
incompatibility.)filelib:wildcard/1,2
will generate a different
exception when given bad patterns such as "{a,"
. The
exception used to be caused by
exit(missing_delimiter)
but is now
erlang:error({badpattern,missing_delimiter})
.gb_sets:del_element/2
was changed to do the
same as gb_sets:delete_any/2
which was the
original intention, not as gb_sets:delete/2
. Code
that relies on gb_sets:del_element/2
causing an
error if the element does not exist must be changed to
call gb_sets:delete/2
instead.gb_sets
, sets
, and
ordsets
was added.