查看源代码 ERTS 发行说明
本文档描述了对 ERTS 应用程序所做的更改。
Erts 15.2
已修复的错误和故障
gen_sctp:peeloff/2
已修复,可以更像gen_tcp:accept/1
一样将套接字选项继承到剥离的套接字,例如选项tos
或tclass
。当设置平台不支持的 SCTP 选项时,一些选项应该被静默忽略,但一个错误导致选项解析脱轨,因此之后的选项可能会退出并导致错误。 此问题已修复。
自有 ID:OTP-19225 辅助 ID:PR-8789
修复了当 stdin 是 TTY 但 stdout 不是时,Erlang 会损坏终端设置的错误。
修复了在非 JIT VM 中,当通过多个会话跟踪的函数加载 NIF 时会出现的错误。 这会导致 VM 崩溃。 此错误自 OTP-27.0 引入多个跟踪会话以来就存在。
自有 ID:OTP-19248 辅助 ID:PR-8856
修复了在 AArch64 上,加载具有极大的二进制构造指令的模块时,模拟器会崩溃的错误。
当使用 inet_backend = socket 时,
inet:getifaddrs/0,1
得到了改进。自有 ID:OTP-19264
当值是大小为 0 的未终止 REG_SZ 时,
win32reg:value/2
不再会使模拟器崩溃。修复了 WSL 2 中 Windows 上
Makefile
依赖项生成的问题。自有 ID:OTP-19300 辅助 ID:PR-8955
修复了如果 NIF 监视器
down
回调调用enif_whereis_pid
时出现的锁顺序冲突。这会导致调试模拟器崩溃,但也可能导致优化后的模拟器中出现死锁。修复了使用
--enable-vm-probes
进行编译时出现的编译错误。自有 ID:OTP-19333
修复了 Windows 上
erl_nif.h
在使用 gcc 或 clang 时的编译问题。自有 ID:OTP-19341 辅助 ID:PR-9016
修复了 JIT 调试信息中的一个小问题,该问题会使 GDB 和 perf 等工具感到困惑。
自有 ID:OTP-19362 辅助 ID:PR-9003
改进和新功能
改进了 计时器的文档。
自有 ID:OTP-19360 辅助 ID:ERIERL-1149, PR-9062
除了
proc_lib:get_label/1
之外,现在还可以使用process_info(Pid, label)
来检索进程的标签。当想要检索多个进程信息项时,此新选项非常有用。 例如
process_info(Pid, [label,registered_name])
自有 ID:OTP-19373 辅助 ID:PR-9108
Erts 15.1.3
已修复的错误和故障
gen_udp:send 在域本地可能泄漏 inet_reply 消息。
自有 ID:OTP-19332 辅助 ID:#8989
net:getifaddrs 未能在 Windows 上正确报告正在运行的标志。
自有 ID:OTP-19366 辅助 ID:OTP-19061, ERIERL-1134
Erts 15.1.2
已修复的错误和故障
修复了接收
gen_sctp
的 SCTP 消息时,可能会浪费消息的第一个片段并仅传递最后一个片段的错误。当操作系统发出套接字已准备好读取的信号,并结合内部超时重试时,这种情况发生的概率很低。
修复了 SCTP 连接后遗留的超时问题,该问题可能会阻止活动
gen_tcp
套接字上流入的消息。自有 ID:OTP-19235 辅助 ID:ERIERL-1133, PR-8837
为 SCTP 添加了一个布尔选项
non_block_send
,以便能够实现旧的行为,通过传递操作系统网络堆栈错误消息 ({error,eagain}
) 来避免阻塞发送操作。自有 ID:OTP-19258 辅助 ID:OTP-19061, ERIERL-1134
尽管为以下不幸的情况组合设置了
send_timeout
选项,调用gen_tcp:send/2
可能会无限期挂起- 套接字必须处于被动模式。
- 所有输出缓冲区都必须被填满,直到达到
high_watermark
,导致gen_tcp:send/2
操作被阻塞。 - 当发送操作被阻塞时,必须从不同的进程完成
gen_tcp:recv/2,3
调用。 它必须被阻塞,等待数据一段时间,然后才能完成操作,并且接收到的数据包必须至少填充 75% 的接收缓冲区。
在这些情况下,发送操作正在等待的信息丢失了,因此第一个被阻塞的发送操作永远不会返回。 但是,它所拥有的数据将被发送,并且来自其他进程的发送操作仍然有效。
此错误已修复。
自有 ID:OTP-19267 辅助 ID:GH-6455, OTP-18520, ERIERL-1138, PR-8892
在极少数情况下,在匹配多个元组的代码中,即使给定的元组是正确的,JIT 也可能会生成会引发
badmatch
异常的代码。修复了在调用函数时重置该函数的
call_time
或call_memory
跟踪计数器时可能发生的 beam 崩溃。 此错误自 OTP R16 以来就存在。
Erts 15.1.1
已修复的错误和故障
在 Windows 上,连续失败的套接字调用导致套接字变为“未初始化”。
自有 ID:OTP-19251 辅助 ID:#8853
套接字框架无法在仅 IPv6 的 Windows 计算机上启动。
自有 ID:OTP-19254 辅助 ID:#8848
Erts 15.1
已修复的错误和故障
更正了
erl -man example
,使其不考虑在ERL_ZFLAGS
中设置的值,并在遇到--
时停止解析参数。消除了 Windows I/O 后端的编译器警告。
自有 ID:OTP-19113
修复了与
return_to
跟踪相关的错误。 它不适用于多个跟踪会话,并且有时不会触发异常。自有 ID:OTP-19122
消除了写入崩溃转储时可能发生的死锁。
当加载损坏或过旧的 BEAM 文件时,运行时系统可能会崩溃。
自有 ID:OTP-19153 辅助 ID:PR-8623
当其他调度程序同时删除和/或插入相邻的载波时,调度程序线程可能会在删除内存分配器载波时卡住。 反过来,这也会导致其他调度程序卡住。
在调用
instrument:allocations
或instrument:carriers
后,共享池中载波数量的统计信息现在是正确的。 此外,还消除了载波块扫描中潜在的错误。自有 ID:OTP-19166 辅助 ID:PR-8636
修复了 SSL 分发的 kTLS 版本中的竞争,以便
inet_drv.c
不会预先读取太多数据,这可能会导致在某些加密数据已被作为未加密数据读取到inet_drv.c
缓冲区时,kTLS 加密被激活得太晚。修复了与压缩 ETS 表相关的模拟器崩溃。
自有 ID:OTP-19176 辅助 ID:PR-8683
在 net nif 中,Windows 上调用了一个带有多余参数的函数 (encode_sockaddr)。
自有 ID:OTP-19181
修复了重新分配失败时可能发生的崩溃。
自有 ID:OTP-19192
现在可以使用
erl
、erlc
、dialyzer
以及 Erlang/OTP 中包含的所有其他程序的 man 页面。自有 ID:OTP-19201 辅助 ID:PR-8740
之前在 Erlang/OTP 27.0.1 紧急补丁中的修复有一个不幸的副作用,有时会导致不必要的完全扫描(主要)垃圾回收,而不是代(次要)垃圾回收。 此问题已得到更正。
修正了固定的跟踪匹配规范函数
trace
和enable_trace
,以便在未跟踪的进程上启用跟踪标志时使用会话跟踪器。自有 ID: OTP-19211 辅助 ID: GH-8657
修正了
erlang:garbage_collection_defaults/0
的类型规范中的一个错别字。自有 ID: OTP-19215 辅助 ID: PR-8757
修正了 genaddr (SIOCGENADDR) 的 socket:ioctl。
自有 ID: OTP-19216
在非 amd64 Linux 系统上禁用了对透明巨页的支持。
自有 ID: OTP-19219 辅助 ID: PR-8702
修复了在 Windows 上从
-noshell
升级到 shell 时出现的竞争条件,该竞争条件会导致 Erlang 崩溃并出现错误{'GetOverlappedResult', 'The I/O operation has been aborted because of either a thread exit or an application request.'}.
改进和新特性
向
net
模块添加了函数getservbyname
和getservbyport
。自有 ID: OTP-19101 辅助 ID: OTP-18835
引入了
inet
函数的 enet | esock 变体,当使用套接字调用、使用显式 inet_backend 配置或使用 e inet_backend 内核配置选项时。自有 ID: OTP-19132 辅助 ID: OTP-19101
当任何跟踪会话都未启用此类跟踪时,优化进程和端口的创建。
自有 ID: OTP-19167 辅助 ID: PR-8655
修正了一些已删除函数的编译器警告,以指出正确的替换函数。
自有 ID: OTP-19186 辅助 ID: PR-8709
为
gen_tcp
实现了一个布尔选项read_ahead
,默认值为true
,以方便不读取超出数据包末尾(缓存数据)。特别是对于 kTLS,缓存数据可能会读取本应由平台的网络堆栈解密的数据,然后再激活加密参数。自有 ID: OTP-19199 辅助 ID: OTP-19175, GH-8561, GH-8690, GH-8785
zip
模块已更新,支持- zip64 归档文件 - 大于 4GB 或包含超过 2^32 个条目的归档文件。
- 扩展时间戳 - 更高的分辨率,并使用 UTC 时间。
- UID/GID - 保存和提取原始 UID/GID。
- 修复了归档文件中文件的权限模式属性被正确读取和设置的问题。
zip:list_dir/2
现在也返回目录,而不仅仅是文件。(您可以使用skip_directories
选项禁用此行为)。
还修复了原始实现中的各种错误,例如
- 正确编码和解码归档文件中条目的 DOS 时间戳(即非扩展时间戳)。
- 修复 DOS 时间戳以设置为本地时间而不是 UTC 时间(使用扩展时间戳表示 UTC 时间戳)。
- 在创建归档文件时使用从磁盘读取的 unix 文件属性,而不是将所有内容设置为 644。
自有 ID: OTP-19214 辅助 ID: PR-8765
Erts 15.0.1
修复的错误和故障
在极少数情况下,JIT 可能会对元组进行不安全的就地更新。
自有 ID: OTP-19108 辅助 ID: PR-8539
当端口命令在
gen_tcp:send/2
期间在 inet 驱动程序中崩溃时,监视器'DOWN'
消息可能会遗留在调用者的邮箱中。现在已修复此问题。自有 ID: OTP-19121 辅助 ID: GH-8484
来自受监视端口的
'DOWN'
消息,当退出原因不是立即项时,第三个元素包含原子process
而不是原子port
。修复了仅将启用 Erlang VM 可执行文件的透明巨页对齐的选项应用于 Erlang VM,而不应用于其他本机程序(如
erlc
和dialyzer
)的问题。此错误是在 Erlang/OTP 27.0 中引入的。自有 ID: OTP-19137 辅助 ID: GH-8574
启用无时间扭曲模式时,读取到的 Erlang 单调时间可能小于先前读取的时间,即破坏了单调属性。自 OTP 24.3.4.17 和 OTP 25.0 以来,当检测到此类问题时,运行时系统将中止。
在 OTP 25 之前,无时间扭曲模式 是默认设置。从 OTP 26 开始,多时间扭曲模式 是默认设置。
自有 ID: OTP-19147 辅助 ID: ERIERL-1043, ERIERL-1106, PR-8619
当调用
trace:function(Session, _, true, [meta])
时,元跟踪器被错误地设置为调用进程。现在它像预期的那样设置为会话跟踪器。
Erts 15.0
修复的错误和故障
修复了
erl -extra
如何通过 ERL_*FLAGS 或-args_file
传递标志的错误。自有 ID: OTP-18766 辅助 ID: PR-7639
修复了一个阻止模拟器在最新版本的 Yocto Linux 上构建的错误。
自有 ID: OTP-18918 辅助 ID: PR-7952
修复了 spectre 缓解配置测试,以使其与 GCC 补丁一起使用,始终添加
-fcf-protection=full
。自有 ID: OTP-18928 辅助 ID: PR-8006
如果数据立即可用,则在 Windows 上使用 Timeout = 0 调用
socket:[recv|recvfrom|recvmsg]/*
可能会导致(case 子句)崩溃。自有 ID: OTP-19063 辅助 ID: OTP-18835
修复了 Windows 上的一个错误,该错误会导致在 stdin/stdout 句柄关闭后端口退出时不会发送
exit_status
。自有 ID: OTP-19077 辅助 ID: PR-8324
改进和新特性
重构了 JIT 处理 POSIX 信号以及它们如何影响线程堆栈的方式,使我们能够在更多平台上使用本机堆栈寄存器来处理 Erlang 堆栈。
值得注意的是,在 64 位 x86 Alpine Linux 镜像上构建的容器现在在顺序代码中的性能将更好。例如,对 OTP 代码库运行
dialyzer
完成速度大约快 15%。自有 ID: OTP-18568 辅助 ID: PR-7174
instrument
模块现在可以按进程或按端口跟踪分配。自有 ID: OTP-18577 辅助 ID: PR-7236
从
erlang:fun_info/1,2
返回的pid
字段现在始终是本地节点的init
进程的 pid,而不是创建 fun 的实际进程的 pid。潜在的不兼容性
自有 ID: OTP-18594 辅助 ID: PR-7274
默认情况下,escript 现在将编译而不是解释。这意味着必须安装
compiler
应用程序。潜在的不兼容性
自有 ID: OTP-18639 辅助 ID: PR-7348
从
socket
接收函数返回的二进制文件不再作为通常很大的接收缓冲区二进制文件(套接字选项{otp,rcvbuf}
)的子二进制文件创建。这避免了空间浪费,相信分配器可以有效地实现重新分配。默认进程限制已提高到
1048576
个进程。自有 ID: OTP-18699 辅助 ID: PR-7388
erlang:system_monitor/2
功能现在能够监视系统中的长消息队列。自有 ID: OTP-18709 辅助 ID: PR-7651
erl
命令现在支持-S
标志,该标志类似于-run
标志,不同之处在于它会将命令行末尾的所有参数传递给被调用的函数。(-run
标志不会传递以连字符开头的参数。)另一个区别是-S
始终会使用一个参数调用函数,如果没有给出参数,则传递一个空列表。自有 ID: OTP-18744 辅助 ID: PR-7470
当为 Erlang 分布实现备用载体时,现在可以使用
erlang:dist_ctrl_input_handler/2
注册单独的输入处理程序进程,即使在分布控制器是端口的情况下也是如此。自有 ID: OTP-18774 辅助 ID: PR-7110
当超出
max_heap_size
限制时,调用堆栈跟踪现在已添加到erlang:process_flag/2
报告的错误中。自有 ID: OTP-18779 辅助 ID: PR-7592
-callback
属性已添加到erl_tracer
。自有 ID: OTP-18794 辅助 ID: PR-7703
对于
inet_backend = socket
,单独将active
套接字选项设置为once
、true
或N
已得到优化,并且相应的数据传递也得到了优化。自有 ID: OTP-18835
添加了用于发送 I/O 向量的新函数
socket:sendv/*
。自有 ID: OTP-18845
接受字符串的套接字选项现在也接受二进制文件。
自有 ID: OTP-18849 辅助 ID: PR-6510
JIT 中已实现本机覆盖率支持。它将由
cover
工具自动使用,以减少运行覆盖编译代码时的执行开销。还有一些新的 API,无需使用
cover
工具即可支持本地覆盖率。要对代码进行本地覆盖率检测,必须使用
line_coverage
选项进行编译。要在运行时系统中启用本地覆盖率,请像这样启动它
$ erl +JPcover true
还有以下用于支持本地覆盖率的新函数
code:coverage_support/0
code:get_coverage/2
code:reset_coverage/1
code:get_coverage_mode/0
code:get_coverage_mode/1
code:set_coverage_mode/1
自属 ID:OTP-18856 辅助 ID:PR-7856
命令行标志
-code_path_choice
的默认值已更改为strict
。请注意,对于使用归档文件的应用程序系统,必须将
code_path_choice relaxed
添加到调用erl
的命令行中。自属 ID:OTP-18894 辅助 ID:PR-7243
将模块加载添加到
erl -init_debug
输出中。自属 ID:OTP-18929 辅助 ID:PR-8004
当运行时系统停止时,它会在终止之前执行各种刷新操作。默认情况下,对刷新操作允许的时间没有限制。引入了一个新的停止刷新超时功能,可用于限制刷新操作允许的时间。有关更多信息,请参阅
flush_timeout
选项的文档(erlang:halt/2
BIF)和erl
的文档(+zhft <Timeout>
命令行标志)。通过将某些操作从代码服务器移动到调用方来优化代码加载。
自属 ID:OTP-18941 辅助 ID:PR-7981
将 asmjit 更新到版本 a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d
自属 ID:OTP-18942
已删除
zlib
中已弃用的函数。这包括inflateChunk/{1,2}
、getBufSize/1
、setBufSize/2
、CRC32 函数和 Adler 校验和函数。自属 ID:OTP-18950
文档已迁移为使用 Markdown 和 ExDoc。
自属 ID:OTP-18955 辅助 ID:PR-8026
已在编译器和运行时系统中实现元组的安全破坏性更新。这使得 VM 能够在安全的情况下就地更新元组,从而通过减少复制并产生更少的垃圾来提高性能。
示例
-record(rec, {a,b,c}). update(#rec{a=needs_update,b=N}=R0) -> R = R0#rec{a=up_to_date}, if N < 0 -> R#rec{c=negative}; N == 0 -> R#rec{c=zero}; N > 0 -> R#rec{c=positive} end.
由于变量
R
不再使用,因此if
的三个子句中的每个记录更新都可以安全地就地完成。自属 ID:OTP-18972 辅助 ID:PR-8090
已删除通过传递原子(或字符串)作为
open_port()
的第一个参数来打开到外部资源的端口的过时且未文档化的支持(由 vanilla 驱动程序实现)。自 OTP 26 发布以来,此功能已计划在 OTP 27 中删除。自属 ID:OTP-18976 辅助 ID:PR-7125
可选的 NIF 回调
ERL_NIF_OPT_ON_UNLOAD_THREAD
,用于在卸载 NIF 库时由所有调度程序线程调用。用于释放特定于线程的数据。可以使用函数enif_set_option
进行设置。自属 ID:OTP-18977 辅助 ID:PR-7809
Kernel 中有一个新模块
trace
,它提供与erlang:trace/3
和erlang:trace_pattern/3
相同的跟踪功能,但增加了**动态隔离跟踪会话**。自属 ID:OTP-18980
添加了
+MMlp on|off
模拟器选项,以允许mseg
分配器使用“大页面”(有时称为“巨型页面”或“超级页面”)。这目前仅影响超级载波分配,但将来可能会扩展。自属 ID:OTP-18984 辅助 ID:PR-7977
已优化和重构
inet_backend = socket
,使其与原始的inet_backend = inet
更加兼容。自属 ID:OTP-19004 辅助 ID:OTP-18835
socket
文档已重构,因此修复了一些细节- 例如,对于作为“类别”而非项目的
protocols
,socket:is_supported/1
现在返回true
。 - 对于由另一个进程设置的监视器,
socket:cancel_monitor/1
不再返回 badargs,而是像其他未知reference()
一样返回false
。
自属 ID:OTP-19054
- 例如,对于作为“类别”而非项目的
Erts 14.2.5.5
修复的错误和故障
修复了如果 NIF 监视器
down
回调调用enif_whereis_pid
时出现的锁顺序冲突。这会导致调试模拟器崩溃,但也可能导致优化后的模拟器中出现死锁。自属 ID:OTP-19330 辅助 ID:GH-8983,PR-9008
gen_udp:send 在域本地可能泄漏 inet_reply 消息。
自属 ID:OTP-19332 辅助 ID:#8989
net:getifaddrs 未能在 Windows 上正确报告正在运行的标志。
自有 ID:OTP-19366 辅助 ID:OTP-19061, ERIERL-1134
Erts 14.2.5.4
修复的错误和故障
修复了一个错误,其中使用 `gen_sctp` 接收 SCTP 消息可能会浪费消息的第一个片段,并且仅传递最后一个片段。
当操作系统发出套接字已准备好读取的信号,并结合内部超时重试时,这种情况发生的概率很低。
修复了 SCTP 连接后可能会出现的超时错误,该超时可能会阻止主动 `gen_tcp` 套接字上的传入消息流。
自属 ID:OTP-19235 辅助 ID:ERIERL-1133,PR-8837
在 Windows 上,连续失败的套接字调用导致套接字变为“未初始化”。
自属 ID:OTP-19251 辅助 ID:GH-8853
套接字框架无法在仅 IPv6 的 Windows 计算机上启动。
自属 ID:OTP-19254 辅助 ID:GH-8848
添加了一个布尔选项 `non_block_send` 用于 SCTP,以便能够实现旧的行为,通过传递 OS 网络堆栈错误消息(`{error,eagain}`)来避免阻塞发送操作。
自有 ID:OTP-19258 辅助 ID:OTP-19061, ERIERL-1134
以下不幸情况的组合可能会导致调用 `gen_tcp:send/2` 无限期挂起
* 套接字必须处于被动模式。* 所有输出缓冲区都必须被填充,直到达到 `high_watermark`,从而导致 `gen_tcp:send/2` 操作阻塞。* 当发送操作被阻塞时,必须从不同的进程完成 `gen_tcp:recv/2,3` 调用。它必须阻塞,等待数据一段时间,然后才能完成操作,并且接收到的数据包必须至少填充接收缓冲区的 75%。
在这些情况下,发送操作正在等待的信息丢失了,因此第一个被阻塞的发送操作永远不会返回。 但是,它所拥有的数据将被发送,并且来自其他进程的发送操作仍然有效。
此错误已修复。
自属 ID:OTP-19267 辅助 ID:GH-6455,OTP-18520,ERIERL-1138,PR-8892
修复了在调用函数时重置该函数的
call_time
或call_memory
跟踪计数器时可能发生的 beam 崩溃。 此错误自 OTP R16 以来就存在。自属 ID:OTP-19269 辅助 ID:GH-8835,PR-8897
Erts 14.2.5.3
修复的错误和故障
修复了 SSL 分布的 kTLS 风味中的竞争条件,因此 inet_drv.c 不会提前读取太多数据,这可能会导致在某些加密数据已作为未加密数据读取到 inet_drv.c 缓冲区中时,kTLS 加密过晚激活。
自属 ID:OTP-19175 辅助 ID:GH-8561,PR-8690
Erts 14.2.5.2
修复的错误和故障
启用无时间扭曲模式时,读取到的 Erlang 单调时间可能小于先前读取的时间,即破坏了单调属性。自 OTP 24.3.4.17 和 OTP 25.0 以来,当检测到此类问题时,运行时系统将中止。
在 OTP 25 之前,无时间扭曲模式 是默认设置。从 OTP 26 开始,多时间扭曲模式 是默认设置。
自属 ID:OTP-19147 辅助 ID:ERIERL-1043,ERIERL-1106,PR-8619
当其他调度程序同时删除和/或插入相邻的载波时,调度程序线程可能会在删除内存分配器载波时卡住。 反过来,这也会导致其他调度程序卡住。
自属 ID:OTP-19154 辅助 ID:GH-8613,PR-8627
Erts 14.2.5.1
修复的错误和故障
如果数据立即可用,则在 Windows 上使用 Timeout = 0 调用 socket:[recv|recvfrom|recvmsg]/* 可能会导致(案例子句)崩溃。
自有 ID: OTP-19063 辅助 ID: OTP-18835
当端口命令在
gen_tcp:send/2
期间在 inet 驱动程序中崩溃时,监视器'DOWN'
消息可能会遗留在调用者的邮箱中。现在已修复此问题。自属 ID:OTP-19121 辅助 ID:GH-8484
来自受监视端口的
'DOWN'
消息,当退出原因不是立即项时,第三个元素包含原子process
而不是原子port
。自属 ID:OTP-19123 辅助 ID:GH-8484,PR-8546
Erts 14.2.5
修复的错误和故障
gen_sctp:send/3,4
现在等待发送完成,而不是返回诸如{error, ewouldblock}
之类的操作系统结果。自属 ID:OTP-19061
ETS 函数无法正确处理包含映射的键,有时会匹配过多或过少的对象。
自属 ID:OTP-19070 辅助 ID:GH-8385
修复 cgroup 的 CPU 配额确定。
该错误是通过 OTP-18999 引入的。
自属 ID:OTP-19071 辅助 ID:OTP-18999 PR-8380
改进和新功能
添加了关于影响 Windows 的 BadBatBut 攻击的 open_port/2 警告。
自属 ID:OTP-19069
Erts 14.2.4
修复的错误和故障
修复了 cgroup 版本 2 的 CPU 配额确定
自属 ID:OTP-18999 辅助 ID:GH-7928
修复了退出进程中错误的缩减计数,这可能导致它进行不必要的让步。
自属 ID:OTP-19014
修复了
re:run/3
中的错误,如果给出了无效的 UTF-8 主题,re:run 可能会陷入无限循环。该错误是在 Erlang/OTP 22.1 中引入的。自属 ID:OTP-19015 辅助 ID:ERIERL-682
在 AArch64 (ARM64) 上,使用 Erlang/OTP 24 编译的使用位语法结构的 Erlang 代码在 Erlang/OTP 26.2.3 中运行时可能会导致运行时系统崩溃。
自属 ID:OTP-19021 辅助 ID:GH-8238,PR-8248
如果脏调度程序正在执行同时跟踪操作,则使用第一个参数
ports
、processes
、existing_ports
、existing_processes
、existing
或all
调用erlang:trace/3
可能会导致模拟器崩溃。自属 ID:OTP-19034
修复了当操作系统报告的单调时间单位大于 10 且小于 100 微秒时发生的整数溢出。
自属 ID:OTP-19036 辅助 ID:GH-8186
修复 FreeBSD 14 的选项 reuseaddr
自属 ID:OTP-19041
当在脏调度程序上执行的跟踪进程收到退出信号时,脏调度程序可能会使用错误的线程特定数据,这可能会导致崩溃。
自属 ID:OTP-19043 辅助 ID:PR-8342
修复了一个或多或少无害的错误,该错误导致当
QueryPerformanceCounter()
用作操作系统单调时间源时,Erlang 单调时间的时间校正在 Windows 平台上略有偏差。erlang:system_info(os_monotonic_time_source)
现在还返回有关*已用分辨率*的信息,该信息并不总是与操作系统单调时间源的分辨率相对应。自属 ID:OTP-19048 辅助 ID:PR-8343
当使用 IPv6 时,经典的 gen_udp 无法添加(组)成员资格(而是使用了丢弃)。
自身 ID:OTP-19049 辅助 ID:#8176
修复了 Windows 上 “Unknown event: 2” 会打印到控制台的错误。
自身 ID:OTP-19060
改进和新特性
改进了单调时间检查,现在 Erlang 和操作系统单调时间会分别进行检查。
新增了一个
configure
参数--enable-ensure-os-monotonic-time
。它启用了确保操作系统提供的单调时间戳单调性的功能。当检测到非单调的时间戳时,它将被最近一次提供的单调时间戳替换,然后再被 Erlang 的时间功能使用。请注意,除非系统上的操作系统单调时间源无法生成单调时间戳,否则您不想启用此功能。这是因为确保操作系统单调时间戳的单调性会损害系统的可伸缩性和性能。自身 ID:OTP-19044 辅助 ID:ERIERL-1043, PR-8342
对于严重的错误,当 `socket` 模块终止 Erlang VM 时,现在会生成 erl_crash.dump,以便于事后调试。
自身 ID:OTP-19058
Erts 14.2.3
修复的错误和故障
修复了 gcc-13 的 erl_nif.c 中的编译警告。
自身 ID:OTP-18906 辅助 ID:PR-7930
修复了宏
enif_select_read
及其友元函数的 C++ 编译错误。自身 ID:OTP-18907 辅助 ID:PR-7932
修复了 Solaris 上阻止 JIT 构建的名称冲突。
自身 ID:OTP-18940 辅助 ID:GH-8024
修复了 Solaris 上的 termcap 检测。
自身 ID:OTP-18952 辅助 ID:PR-8025
修复了堆损坏错误,该错误可能由于进程退出时出现循环的堆外列表而导致失控的内存消耗。也可能出现其他症状。该错误存在于 OTP 25.0 以来。
自身 ID:OTP-18971 辅助 ID:GH-8044
如果加载失败并出现 'not_purged',则不要清除旧模块实例中的跟踪。
自身 ID:OTP-18979
当在由某些位语法操作触发的垃圾回收中超过 `max_heap_size` 限制时,进程并不总是会立即终止。
自身 ID:OTP-18982
如果一个带有
on_load
函数的模块在另一个模块直接使用erlang:purge_module
清除的同时被加载,代码服务器可能会挂起。自身 ID:OTP-19006
一个针对并行信号传递优化的进程在某些情况下可能会丢失唤醒信息。也就是说,该进程没有被唤醒来处理信号,因此该信号不会被处理,直到该进程被另一个信号唤醒。只有配置了
message_queue_data
设置为off_heap
的进程才会使用此优化。自身 ID:OTP-19008 辅助 ID:GH-8119, PR-8201
修复了生成包含持久化术语存储中 fun 的崩溃转储时的段错误。
自身 ID:OTP-19009 辅助 ID:PR-8181
默认情况下,JIT 在 Intel Mac 上被禁用,因为 macOS Sonoma 上会出现烦人的弹出窗口。现在可以在 Intel Mac 上显式启用 JIT。方法如下:
./configure --enable-jit
自身 ID:OTP-19011
Erts 14.2.2
修复的错误和故障
如果使用超过 68 年的巨大超时设置 BIF 定时器,则大多数类 Unix 平台上的 32 位运行时系统可能会崩溃。为了发生崩溃,巨大的定时器(在其设置的时间之后)必须成为在其设置的特定调度器上设置的最近的活动定时器。这在只有一个调度器的系统上不可能发生,因为系统中始终会有更短的定时器。
在 Windows 上设置大于 49 天的定时器在极少数情况下可能会导致超时延迟。
自身 ID:OTP-18911 辅助 ID:ERIERL-1023, PR-7983
修复了系统安装的 openssl/md5.h 会与供应商提供的 md5.h 混淆的错误。
自身 ID:OTP-18931 辅助 ID:GH-7987 PR-7989
现在,JIT 在 x86 Mac 上被禁用,以防止在 MacOS Sonoma 中引入的烦人的“正在验证 shm-xyz”弹出窗口。
ARM Mac 不受影响。
自身 ID:OTP-18949
脏调度器上进程的垃圾回收可能会与该进程的信号处理冲突,导致运行时系统崩溃。此错误是在 OTP 25.3.2.8 和 OTP 26.2 中引入的。
自身 ID:OTP-18957 辅助 ID:GH-8051, PR-8088, OTP-18841
Erts 14.2.1
修复的错误和故障
删除了不必要的 PCRE 源 tar 包。
自身 ID:OTP-18902
Erts 14.2
修复的错误和故障
修复了 erl.exe 在退出时无法将控制台恢复到原始状态的问题。此错误是在 OTP 26.0 中引入的,并且仅在 cmd.exe 中运行 erl.exe 时才会发生。
自身 ID:OTP-18751 辅助 ID:GH-7621 GH-7548
修复了当页面大小大于 16kb 时(如 PowerPC 上)的错误调试断言。导致调试 VM 在启动时直接崩溃。
自身 ID:OTP-18802
zlib
将不再随机返回垃圾(负)Adler32 校验和。自身 ID:OTP-18811 辅助 ID:ERIERL-994
将某些文件中无意的 Erlang 公共许可证 1.1 标头替换为预期的 Apache 许可证 2.0 标头。
自身 ID:OTP-18815 辅助 ID:PR-7780
当使用
process_info/2
(带有message_queue_len
项)或者使用中断菜单 (CTRL-C) 检查时,配置为off_heap
的message_queue_data
的进程可能会陷入不一致的状态。当它陷入这种不一致的状态时,即使它被设置为可运行状态,也不会被放入运行队列。这也影响了在此不一致状态之后发送给进程的信号,导致从那时起无法与它通信。自身 ID:OTP-18838 辅助 ID:PR-7822, GH-7801
当一个进程被选为脏执行的同时也被安排处理信号时,发生的竞争可能会导致该进程陷入不一致的状态。当它陷入这种不一致的状态时,即使它被设置为可运行状态,也不会被放入运行队列。这也影响了在此不一致状态之后发送给进程的信号,导致从那时起无法与它通信。
自身 ID:OTP-18839 辅助 ID:PR-7822, GH-7801
当一个进程必须在运行队列中等待很长时间才能被选为脏执行时,它可能无法接收信号。这会导致检查此类进程(例如,使用
process_info/2
)花费很长时间。此问题是在 OTP 25.3.2.6 和 26.1 中修复了阻止进程执行脏操作的持续信号流的问题时引入的。
自身 ID:OTP-18841 辅助 ID:PR-7822, GH-7801, OTP-18737
修复了 JIT 中错误编译大型
select_val
指令的错误。自身 ID:OTP-18842
修复了 Windows 上向
standard_io
大量写入可能会导致写入重复数据的错误。自身 ID:OTP-18871 辅助 ID:GH-7838
struct ip_mreqn
字段imr_ifindex
的字节顺序转换不正确,现已更正。自身 ID:OTP-18880 辅助 ID:GH-7736, PR-7761
在 OTP 24 和 OTP 25 上,如果在使用别名发送的传入分布式消息大于 64 KiB 时,如果别名在进入节点之前已被删除,则会发生内存泄漏。此问题在 OTP 26 上不存在。
使用在接收节点上已删除的别名发送的传入分布式消息大于 64 KiB 可能会导致节点崩溃。这种崩溃在 OTP 24 和 OTP 25 上非常不可能发生,但在 OTP 26 上非常可能发生。
如果
'DOWN'
信号的退出原因大于 64 KiB,并且指向的节点上的进程的创建不匹配,则会在接收节点上发生内存泄漏。但是,此类信号应该非常罕见。自身 ID:OTP-18885 辅助 ID:GH-7834, GH-7890, PR-7915
改进和新特性
添加了对 Windows 上 DGRAM 套接字连接的支持。
自身 ID:OTP-18762
process_info/2
现在支持查找进程字典中特定键的值。例如,{{dictionary, Key}, Value} = process_info(Pid, {dictionary, Key})
。自身 ID:OTP-18765 辅助 ID:PR-7707
删除了生成 yield BIF 时使用的不必要的正则表达式库。
自身 ID:OTP-18830 辅助 ID:PR-7823
修复了使用
+Bc
时 tty 恢复的问题。自身 ID:OTP-18872 辅助 ID:GH-7832
用 OpenSSL 的实现替换了旧的 md5 实现。
自身 ID:OTP-18877
删除了未使用的
makewhatis
脚本。自身 ID:OTP-18899
Erts 14.1.1
修复的错误和故障
如果分布式 spawn 操作的参数列表部分的外部术语格式编码错误,则新生成的远程进程可能会行为异常。行为异常包括挂起或将传入的消息解释为要使用的参数列表。除非使用分布协议的替代实现,该协议对参数列表进行了错误的编码,否则这种情况非常不可能发生。子进程现在将检测到此错误并在执行用户指定的代码之前终止。
自身 ID:OTP-18790 辅助 ID:PR-7742
修复了如果 matchspec 的主体返回一个以变量('$1'、'$_' 等)作为键或值的 map,并且该变量不是立即数,则该术语不会被复制到接收进程的堆中的错误。这会在以后损坏表中的术语,因为 GC 可能会在其中放置移动标记,这反过来会导致 VM 崩溃。
自 OTP 17.0 以来就存在此错误。
自身 ID:OTP-18797 辅助 ID:PR-7712 GH-7683
Erts 14.1
修复的 Bug 和故障
如果映射中存在具有相同 32 位哈希值的其他键,则使用现有键和相同值进行 maps:put 操作时,未正确优化为无操作。实际上这种情况非常罕见且无害。
自身 ID:OTP-18592
修复了模拟器启动失败时崩溃标语被截断的问题。
自身 ID:OTP-18623 辅助 ID:GH-7344
修复了模拟器无法确定当前
cgroup
CPU 配额的 Bug。自身 ID:OTP-18645 辅助 ID:GH-7401
一个针对并行信号传递优化的进程在某些情况下可能会丢失唤醒信息。也就是说,该进程没有被唤醒来处理信号,因此该信号不会被处理,直到该进程被另一个信号唤醒。只有配置了
message_queue_data
设置为off_heap
的进程才会使用此优化。自身 ID:OTP-18647 辅助 ID:PR-7595
函数 socket:close/1 可能导致 Windows 上的 VM 崩溃。
自身 ID:OTP-18669 辅助 ID:OTP-18029
修复了 ARM JIT 中的一个 Bug,该 Bug 可能在创建大小不是 8 位偶数倍的位串时意外添加垃圾尾部位。
自身 ID:OTP-18672 辅助 ID:GH-7469
修复
erlang:system_info/1
文档,以显示正确的类型。自身 ID:OTP-18674 辅助 ID:PR-7472
扩展了关于如何使用
standard_io
、standard_error
和user
I/O 设备 的文档。添加了类型
io:standard_io/0
、io:standard:error/0
和io:user/0
。自身 ID:OTP-18676 辅助 ID:PR-7473 GH-7459
修复了使用 GNU termcap 进行编译的问题。
自身 ID:OTP-18702 辅助 ID:GH-7381
消息信号传递到不执行任何
receive
表达式的进程的时间可能会变得非常长,甚至可能无限长。例如,使用process_info(self(), message_queue_len)
或process_info(self(), messages)
检查消息,并且避免执行匹配消息的receive
表达式的进程在检测新消息时可能会非常慢。请注意,仍然不建议以这种方式使用process_info()
。想要检查是否有消息可供处理的进程应该执行匹配消息的receive
表达式。自身 ID:OTP-18706 辅助 ID:GH-7413, PR-7595, ERIERL-979
在 AArch64 (ARM64) 上,当计算除数为 2 的幂的商和余数时,余数可能会被错误地计算。
自身 ID:OTP-18724 辅助 ID:GH-7566, PR-7567
修复了一个 Bug,该 Bug 导致
compressed
ETS 表中的“魔术”引用无法保持被引用对象的活动状态。症状是被引用的对象被过早地垃圾回收,并且引用显得过时,不再指向任何内容。这种魔术引用对象的示例包括atomics
和 NIF 资源。自身 ID:OTP-18732 辅助 ID:GH-7444, PR-7458
匹配固定大小(不能被 8 整除)的短位串可能会导致运行时系统以“堆栈溢出”错误终止。
自身 ID:OTP-18733 辅助 ID:GH-7292
持续不断的传入非消息信号可能会阻止需要执行脏操作的进程执行此操作。
自身 ID:OTP-18737 辅助 ID:PR-7595
BEAM 文件通常包含一个带有标签 “Type” 的块,其中包含可供 JIT 使用的类型信息。
beam_lib:strip/1
会注意保留该块,但是执行自定义剥离的构建/发布工具可能会意外删除该块。加载没有 “Type” 块的 BEAM 文件可能会导致加载的代码行为不正确。自身 ID:OTP-18745 辅助 ID:GH-7492, PR-7616
已修复 Unix 域套接字的二进制模式和被动模式下的
gen_udp:recv/*
不会崩溃的问题。自身 ID:OTP-18747 辅助 ID:GH-7605
尚未传递到已终止进程的信号的清理操作会过度屈服。
自身 ID:OTP-18752 辅助 ID:PR-7633
修复了
term_to_binary()
/term_to_iovec()
的local
选项中的一个小哈希问题。自身 ID:OTP-18753 辅助 ID:PR-7634
改进和新功能
更新 gen_tcp_socket 和 gen_udp_socket 以处理 “completion”(Windows 上的套接字)。
自身 ID:OTP-18586 辅助 ID:OTP-18029
在 Windows 上为 'socket' 添加对 Unix 域套接字(仅用于 STREAM 套接字)的支持。
自身 ID:OTP-18611 辅助 ID:OTP-18029, #5024
在 Erlang/OTP 27 中,默认情况下,escript 会在执行前进行编译。这意味着必须安装
compiler
应用程序。可以通过在 escript 文件中添加指令-mode(interpret).
来强制 escript 以解释方式运行。在 Erlang/OTP 28 中,将删除对解释 escript 的支持。
自身 ID:OTP-18638
添加对 Windows 上套接字 ioctl 的基本支持。
自身 ID:OTP-18660
删除了 erts/etc/darwin/Info.plist,因为它在 macos 10.12 之后不再必要。
自身 ID:OTP-18661 辅助 ID:PR-6112
添加对(Windows)套接字选项 exclusiveaddruse 的支持。
自身 ID:OTP-18686
[套接字] 添加对 'nopush' 选项的支持。
自身 ID:OTP-18687
添加对套接字选项 'BSP STATE' 的支持。
自身 ID:OTP-18693
添加 TCP 套接字选项 'keepcnt'、'keepidle' 和 'keepintvl'。
自身 ID:OTP-18698
添加对其他(Windows)套接字选项('max_msg_size' 和 'maxdg')的支持。
自身 ID:OTP-18710
Erts 14.0.2
修复的 Bug 和故障
修复了在 Windows 上使用 IME(输入法编辑器)在 cmd.exe 和 powershell.exe 中输入文本的问题。
自身 ID:OTP-18630 辅助 ID:PR-7275 GH-7029
多个 socket:accept 调用问题。当进行多次 accept 调用时,只有最后一次调用处于活动状态。
自身 ID:OTP-18635 辅助 ID:#7328
修复了 shell 以忽略终端延迟的问题,当终端功能报告应使用终端延迟时。
自身 ID:OTP-18636 辅助 ID:PR-7352 GH-7308
修复了 “oldshell” 在 Windows 上键入时回显字符的问题。
自身 ID:OTP-18637 辅助 ID:PR-7359 GH-7324
在 Windows 上,当有等待的活动调用读取、写入或接受函数时,调用函数 socket:close 可能会挂起。
自身 ID:OTP-18646
修复了在 Windows 上,当使用
-noshell
标志启动 erl.exe 时,读取或配置standard_io
时出现的问题。自身 ID:OTP-18649 辅助 ID:GH-7261 PR-7400
以下函数在给定长列表或二进制文件时现在快得多:
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自身 ID:OTP-18659 辅助 ID:PR-7426
在 AArch64 (ARM64) 上,使用字面量位串进行相等和非相等测试时,可能会在应该失败时成功,反之亦然。
自身 ID:OTP-18663 辅助 ID:GH-7433, PR-7437
Erts 14.0.1
修复的 Bug 和故障
在 Solaris 11 上构建套接字 NIF 失败。
自身 ID:OTP-18585 辅助 ID:OTP-18029
修复了与二进制文件相关的两个缩减计数 Bug。
自身 ID:OTP-18587
构造一个未与字节边界对齐、大小不适合 31 位且值不适合 64 位字的二进制段可能会导致运行时系统崩溃。
自身 ID:OTP-18597
当二进制构造因段的大小错误而失败时,错误信息并不总是正确的。
自身 ID:OTP-18602 辅助 ID:GH-7282
修复了调用在已升级的模块中定义的 fun 时发生的崩溃。
自身 ID:OTP-18621 辅助 ID:GH-7288
Erts 14.0
修复的 Bug 和故障
如果在重新加载定义了该 fun 的完全相同的模块时调用了本地 fun,则在很小的窗口内,该调用将落在尚未完全加载的代码中。
自身 ID:OTP-18016
修复了在嵌入式模式下启动 Erlang 并在内核完全启动之前完成连接时,TLS 分发无法正常工作的问题。
自身 ID:OTP-18248 辅助 ID:PR-6227 GH-6085
erl
-remsh
已得到改进,可提供更好的错误原因,并在使用没有终端支持的 shell(即 “oldshell”)时正常工作。自身 ID:OTP-18271 辅助 ID:PR-6279
修复了当使用 JIT 时,将
-fno-omit-frame-pointer
应用于整个 Erlang VM,以便诸如 perf 之类的工具可以爬取进程堆栈的问题。自身 ID:OTP-18274 辅助 ID:PR-6048
编译服务器现在支持在编译服务器中对使用 Unicode 编码的文件系统使用 Unicode 路径。
自身 ID:OTP-18277 辅助 ID:PR-6306
重新引入了将没有自由变量的匿名函数转换为字面量的优化 (OTP-15195)。此优化在 OTP 24 中的重构过程中丢失了。
除了此修复程序之外,我们计划在 OTP 27 中删除 “fun 创建者 pid” 功能。有关更多详细信息,请参阅即将到来的潜在不兼容性。
自身 ID:OTP-18498
修复了在某些无法使用机器堆栈进行 Erlang 代码的平台(主要是 OpenBSD 和带有 musl 的 Linux)上进行跟踪时发生的崩溃。
自身 ID:OTP-18561
改进和新功能
已将
enif_set_option()
函数引入 NIF API。它可用于设置ERL_NIF_OPT_DELAY_HALT
和/或ERL_NIF_OPT_ON_HALT
选项,您可以使用这些选项将运行时系统的暂停与启用刷新和执行 NIF 同步。 未启用刷新的运行时系统暂停现在将终止运行时系统,而不执行可能已安装到运行时系统中的atexit
/on_exit
处理程序,这可能被认为是一种潜在的不兼容性。* 潜在的不兼容性 *
自身 ID:OTP-17771 辅助 ID:GH-5325, PR-6370
通过将更多代码从旧的链接驱动程序移动到 Erlang,并在 NIF 中实现所有所需的 I/O 原语,重写了 TTY/终端子系统。
在 Unix 平台上,除了更好地处理 Unicode 字符和修复一些长期存在的 Bug 之外,用户不应注意到太多差异。
Windows 用户会注意到 erl.exe 具有与普通 Unix shell 相同的功能,并且 werl.exe 已被删除,并替换为指向 erl.exe 的符号链接。这使得 Windows Erlang 终端体验与 Unix 相同。
重写带来了许多 Bug 修复和功能添加。
- TTY 现在在 Erlang 退出时重置,修复了 zsh 在终止 Erlang 会话时无法正常工作的问题。
standard_error
现在使用与standard_io
相同的 Unicode 模式。- 使用空搜索字符串搜索 shell 历史记录时按退格键不再会破坏 shell。
- Tab 扩展现在可以在使用 JCL 接口启动的远程节点上工作。
- 现在可以配置 shell 标语和会话标语(即启动 Erlang shell 时出现的文本)。有关更多详细信息,请参阅内核文档。
- 添加了 shell:start_interactive,用于从非交互式 Erlang 会话(例如 escript)启动交互式 shell。
- 在 Windows 上,当以分离模式启动时,标准句柄现在被设置为
nul
设备,而不是保持未设置状态。 - 如果支持,标准 I/O 现在始终默认为
unicode
模式。之前,如果运行时系统使用-oldshell
或-noshell
启动(例如在escript
中),则默认为latin1
。要通过标准输出发送原始字节,现在必须显式指定io:setopts(standard_io, [{encoding, latin1}]).
* 潜在的不兼容性 *
Own Id: OTP-17932 Aux Id: PR-6144 GH-3150 GH-3390 GH-4343 GH-4225
添加了对 Windows 上 socket 的支持。
- 预发布状态。
- 错误代码尚未最终确定。
- 没有对 Windows 特定选项(socket 选项,读写标志)的显式支持。
- 用于 Windows 的新异步 API(完成)。请参阅(Socket 使用)用户指南中的“异步调用”章节。
- 为了确保平台独立性,_应该_使用 gentcp 和 gen_udp(尚未更新)。
Own Id: OTP-18029
更新了 Windows 的配置缓存。这使得在 Windows 上配置运行更快,因为更多的检查被缓存了。
Own Id: OTP-18053 Aux Id: PR-6101
优化了记录更新。
Own Id: OTP-18126 Aux Id: PR-6033
优化了内部哈希例程。
Own Id: OTP-18131
正如在 OTP 25 发布时宣布的那样,多时间扭曲模式现在默认启用。这假设系统上执行的所有代码都是时间扭曲安全的。
如果系统中有旧代码不是时间扭曲安全的,现在需要显式地以无时间扭曲模式(或者如果它部分是时间扭曲安全的,则以单时间扭曲模式)启动系统,以避免出现问题。当以无时间扭曲模式启动系统时,系统的行为与 OTP 18 中引入扩展时间功能之前一样。
如果您的代码不是时间扭曲安全的,强烈建议您更改它,以便可以使用多时间扭曲模式。与无时间扭曲模式相比,多时间扭曲模式提高了可伸缩性和性能,以及时间测量的准确性和精确度。
* 潜在的不兼容性 *
Own Id: OTP-18135 Aux Id: GH-4965, PR-6046
JIT 中对二进制语法进行了一些新的优化
- 优化了具有固定大小段的二进制的创建和匹配。
- 优化了 UTF-8 段的创建和匹配。
- 优化了附加到二进制的操作。
Own Id: OTP-18137 Aux Id: PR-6259, PR-6404, PR-6576, PR-6804
正如自 OTP 24 发布以来宣布的那样,对
- 外部项格式中的版本 4 节点容器类型的支持现在是强制性的。也就是说,引用支持最多 5 个 32 位整数标识符,以及支持 64 位数据存储的进程和端口标识符。因此,分布标志
DFLAG_V4_NC
现在也是强制性的。自 OTP 24 以来,OTP 就支持此功能。另请注意,term_to_binary()
和term_to_iovec()
生成的外部格式将无条件生成支持此更大格式的 pid、端口和引用。 - OTP 23.3 中引入的新链接协议现在是强制性的。因此,分布标志
DFLAG_UNLINK_ID
现在也是强制性的。
由于上述原因,OTP 26 节点将拒绝连接到 OTP 24 之前版本的 OTP 节点。
* 潜在的不兼容性 *
Own Id: OTP-18140 Aux Id: PR-6072
- 外部项格式中的版本 4 节点容器类型的支持现在是强制性的。也就是说,引用支持最多 5 个 32 位整数标识符,以及支持 64 位数据存储的进程和端口标识符。因此,分布标志
现在,由于对外部项格式中 版本 4 节点容器类型 的支持是强制性的,因此优化了 进程别名。
Own Id: OTP-18141 Aux Id: OTP-18140, PR-6073
编译器和 JIT 现在为创建所有键都是编译时已知的字面量的小映射生成更好的代码。
Own Id: OTP-18185 Aux Id: GH-6139
当
erl -eval
执行命令失败时,会将错误描述打印到 standard_error。Own Id: OTP-18227 Aux Id: PR-6254
支持 NIF 接口中的 UTF-8 原子和字符串,包括新函数
enif_make_new_atom
,enif_make_new_atom_len
和enif_get_string_length
。Own Id: OTP-18334 Aux Id: PR-6434
引入了以下
inet:setopts/2
选项reuseport
- 重用本地端口。负载均衡可能提供,也可能不提供,具体取决于底层操作系统。reuseport_lb
- 重用本地端口。提供负载均衡。exclusiveaddruse
- Windows 上的独占地址/端口使用。此套接字选项是 Windows 特定的,在其他系统上将被静默忽略。
在 Windows 上设置
reuseaddr
的行为已发生向后不兼容的更改。现在仅当同时设置了reusaddr
和reuseport
inet
选项时,才会设置底层的SO_REUSEADDR
套接字选项。这是因为 Windows 上的底层SO_REUSEADDR
套接字选项的行为类似于如果同时设置了底层套接字选项SO_REUSEADDR
和SO_REUSEPORT
时 BSD 的行为。有关更多信息,请参见reuseaddr
选项的文档。* 潜在的不兼容性 *
Own Id: OTP-18344 Aux Id: PR-6522, PR-6944, OTP-18324, PR-6481, GH-6461
erlang:display/1
现在将以更易读的方式打印大型映射(类似于打印小型映射的方式)。Own Id: OTP-18360 Aux Id: PR-6497
BIF
min/2
和max/2
现在允许在 guard 和匹配规范中使用。Own Id: OTP-18367 Aux Id: GH-6544
如果在加载/升级期间未调用,则通过返回 NULL 使
enif_init_resource_type
及其友元失败。旧行为未定义。Own Id: OTP-18369
max_heap_size
进程限制的新选项include_shared_binaries
。如果设置为true
,则会将可能由多个进程引用的较大二进制文件(> 64 字节)包含在与max_heap_size
限制进行比较的内存总和中。Own Id: OTP-18410 Aux Id: GH-5889, PR-6345
现在已实现了 EEP 58 中建议的映射推导。
Own Id: OTP-18413 Aux Id: EEP-58, PR-6727
通过更改原子键的内部排序顺序,优化了一些映射操作。这更改了(未记录的)小映射中原子键的打印顺序,以及
maps:to_list/1
和maps:next/1
返回的顺序。新的顺序是不可预测的,并且可能在 Erlang VM 的不同调用之间发生变化。对于顺序很重要的应用程序,有一个新的函数
maps:iterator/2
用于创建以确定性顺序返回映射元素的迭代器。还有新的修饰符k
和K
用于io:format()
的格式字符串,以支持按顺序打印映射元素。Own Id: OTP-18414 Aux Id: PR-6151
减少了
file:read_file_info/1,2
的内存使用量Own Id: OTP-18424 Aux Id: PR-6716
为
erlang:trace_pattern/3
使用的跟踪匹配规范添加了新函数current_stacktrace
。这个新选项将调用者的当前堆栈跟踪放入发送到跟踪接收器的跟踪消息中。
Own Id: OTP-18425 Aux Id: PR-6628, GH-5333
在 64 位运行时系统中,节点本地进程标识符和端口标识符中的有效位数已从 28 位扩展到 60 位。这使得这些标识符足够大,在节点生命周期内实际上永远不必重复使用。
Own Id: OTP-18435 Aux Id: PR-6827
新的跟踪功能
call_memory
。类似于call_time
跟踪,但不是测量跟踪函数中累积的时间,而是测量跟踪函数消耗的累积堆空间。它可以用来比较不同的函数对触发垃圾回收的贡献程度。Own Id: OTP-18440 Aux Id: PR-6351
不再需要在运行时系统中启用某个功能才能加载正在使用该功能的模块。在编译时在编译器中启用该功能就足够了。
这意味着要在 Erlang/OTP 26 中使用功能
maybe_expr
,在编译期间启用它就足够了。在 Erlang/OTP 27 中,功能
maybe_expr
将默认启用,但可以禁用它。Own Id: OTP-18445
通过在嵌入模式的启动顺序中添加一个额外的步骤来改进启动期间对
on_load
模块的处理,该步骤运行所有on_load
处理程序,而不是依赖于稍后在内核监督树启动时显式调用它们。这主要是一个代码改进和 OTP 内部简化,以避免未来出现错误并简化代码维护。
Own Id: OTP-18447
引入了
term_to_binary/2
和term_to_iovec/2
的local
选项。Own Id: OTP-18477 Aux Id: PR-7006
记录了在 NIF 加载时在回调
load
或upgrade
中创建和存储静态原子的常用做法。Own Id: OTP-18483 Aux Id: PR-6888
通过使用更有效的方法将术语从 ETS 复制到调用进程的堆中,优化了未压缩表的
ets:lookup_element
。Own Id: OTP-18493 Aux Id: PR-6272
term_to_binary
和term_to_iovec
的原子默认编码已从 Latin1 更改为 UTF-8。旧编码仍然可以使用选项{minor_version, 1}
获得。除了用两个字节 (UTF-8) 而不是一个字节对 128 到 255 之间的代码点进行编码之外,大多数原子将占用一个字节,因为长度字段尽可能只使用一个字节而不是两个字节。
* 潜在的不兼容性 *
Own Id: OTP-18505 Aux Id: PR-6991
Erlang/OTP 源代码中包含的 zlib 版本现在是 1.2.13。
Own Id: OTP-18517
优化了
gen_tcp:send/*
、gen_udp:send/*
和gen_sctp:send/*
以使用臭名昭著的接收引用优化,因此现在当调用进程具有较大的消息队列时,发送不应具有较差的性能。Own Id: OTP-18520 Aux Id: GH-6455
添加了 EEP-61 中引入的新内置类型
dynamic/0
,改进了对渐进式类型检查器的支持。Own Id: OTP-18522
通过重用键元组或整个映射(如果结果映射的键数与任何参数映射的键数相同),优化了小映射(< 33 个键)的
maps:merge/2
内存消耗。Own Id: OTP-18523 Aux Id: PR-7004
通过改变第二个映射以使用第一个映射的字面键元组(如果两者具有相同的键),进一步优化了小映射的
maps:merge/2
内存消耗。Own Id: OTP-18524 Aux Id: PR-7004, OTP-18523
现在可以在匹配规范中使用
ceil/1
、floor/1
、is_bitstring/1
、is_boolean/1
、is_function/2
和tuple_size/1
。自有 ID: OTP-18526 辅助 ID: GH-7045
允许 IPv6 地址作为
http
数据包中由erlang:decode_packet/3
和gen_tcp
数据包选项解码的主机。根据 RFC2732,IPv6 地址应包含在[]
中。自有 ID: OTP-18540 辅助 ID: PR-6900
移除了实验性的
erts_alloc_config
模块。它不再产生良好的配置,并且无法以合理向后兼容的方式修复。自 OTP 25 以来,它已被弃用,并计划在 OTP 26 中删除。* 潜在的不兼容性 *
自有 ID: OTP-18549 辅助 ID: PR-7105
ERTS 内部线程名称已更改。ERTS 创建的所有线程现在都有一个前缀
erts_
,后跟一个类型名称,可能还会后跟一个整数索引。例如,正常的调度器现在被命名为erts_sched_<IX>
,脏 CPU 调度器命名为erts_dcpus_<IX>
,脏 IO 调度器命名为erts_dios_<IX>
。无论底层平台是否支持更多字符,NIF 和驱动线程名称都会被截断为 15 个字符。* 潜在的不兼容性 *
自有 ID: OTP-18552 辅助 ID: PR-6973
进一步增强了大型映射(> 32 个键)的实现。恰好具有相同内部 32 位哈希值的键现在被放入使用线性搜索遍历的冲突节点中。这消除了在加盐时内部哈希函数最终为所有可能的不等项对产生不同哈希值的需求。
自有 ID: OTP-18569
在 Erlang/OTP 27 中,
0.0
将不再被认为与-0.0
完全相等。请参阅即将出现的不兼容性。自有 ID: OTP-18574
Erts 13.2.2.12
修复的错误和故障
修复了如果 NIF 监视器
down
回调调用enif_whereis_pid
时出现的锁顺序冲突。这会导致调试模拟器崩溃,但也可能导致优化后的模拟器中出现死锁。自属 ID:OTP-19330 辅助 ID:GH-8983,PR-9008
Erts 13.2.2.11
修复的错误和故障
修复了在调用函数时重置该函数的
call_time
或call_memory
跟踪计数器时可能发生的 beam 崩溃。 此错误自 OTP R16 以来就存在。自属 ID:OTP-19269 辅助 ID:GH-8835,PR-8897
Erts 13.2.2.10
修复的错误和故障
来自受监视端口的
'DOWN'
消息,当退出原因不是立即项时,第三个元素包含原子process
而不是原子port
。自属 ID:OTP-19123 辅助 ID:GH-8484,PR-8546
启用无时间扭曲模式时,读取到的 Erlang 单调时间可能小于先前读取的时间,即破坏了单调属性。自 OTP 24.3.4.17 和 OTP 25.0 以来,当检测到此类问题时,运行时系统将中止。
在 OTP 25 之前,无时间扭曲模式 是默认设置。从 OTP 26 开始,多时间扭曲模式 是默认设置。
自属 ID:OTP-19147 辅助 ID:ERIERL-1043,ERIERL-1106,PR-8619
当其他调度程序同时删除和/或插入相邻的载波时,调度程序线程可能会在删除内存分配器载波时卡住。 反过来,这也会导致其他调度程序卡住。
自属 ID:OTP-19154 辅助 ID:GH-8613,PR-8627
Erts 13.2.2.9
修复的错误和故障
ETS 函数无法正确处理包含映射的键,有时会匹配过多或过少的对象。
自属 ID:OTP-19070 辅助 ID:GH-8385
修复 cgroup 的 CPU 配额确定。
该错误是通过 OTP-18999 引入的。
自属 ID:OTP-19071 辅助 ID:OTP-18999 PR-8380
Erts 13.2.2.8
修复的错误和故障
修复了 cgroup 版本 2 的 CPU 配额确定
自属 ID:OTP-18999 辅助 ID:GH-7928
修复了退出进程中错误的缩减计数,这可能导致它进行不必要的让步。
自属 ID:OTP-19014
如果脏调度程序正在执行同时跟踪操作,则使用第一个参数
ports
、processes
、existing_ports
、existing_processes
、existing
或all
调用erlang:trace/3
可能会导致模拟器崩溃。自属 ID:OTP-19034
修复了当操作系统报告的单调时间单位大于 10 且小于 100 微秒时发生的整数溢出。
自属 ID:OTP-19036 辅助 ID:GH-8186
当在脏调度程序上执行的跟踪进程收到退出信号时,脏调度程序可能会使用错误的线程特定数据,这可能会导致崩溃。
自属 ID:OTP-19043 辅助 ID:PR-8342
修复了一个或多或少无害的错误,该错误导致当
QueryPerformanceCounter()
用作操作系统单调时间源时,Erlang 单调时间的时间校正在 Windows 平台上略有偏差。erlang:system_info(os_monotonic_time_source)
现在还返回有关*已用分辨率*的信息,该信息并不总是与操作系统单调时间源的分辨率相对应。自属 ID:OTP-19048 辅助 ID:PR-8343
改进和新功能
改进了单调时间检查,现在 Erlang 和操作系统单调时间会分别进行检查。
新增了一个
configure
参数--enable-ensure-os-monotonic-time
。它启用了确保操作系统提供的单调时间戳单调性的功能。当检测到非单调的时间戳时,它将被最近一次提供的单调时间戳替换,然后再被 Erlang 的时间功能使用。请注意,除非系统上的操作系统单调时间源无法生成单调时间戳,否则您不想启用此功能。这是因为确保操作系统单调时间戳的单调性会损害系统的可伸缩性和性能。自身 ID:OTP-19044 辅助 ID:ERIERL-1043, PR-8342
对于严重的错误,当 `socket` 模块终止 Erlang VM 时,现在会生成 erl_crash.dump,以便于事后调试。
自身 ID:OTP-19058
Erts 13.2.2.7
修复的错误和故障
修复了堆损坏错误,该错误可能由于进程退出时出现循环的堆外列表而导致失控的内存消耗。也可能出现其他症状。该错误存在于 OTP 25.0 以来。
自身 ID:OTP-18971 辅助 ID:GH-8044
如果一个带有
on_load
函数的模块在另一个模块直接使用erlang:purge_module
清除的同时被加载,代码服务器可能会挂起。自身 ID:OTP-19006
一个针对并行信号传递优化的进程在某些情况下可能会丢失唤醒信息。也就是说,该进程没有被唤醒来处理信号,因此该信号不会被处理,直到该进程被另一个信号唤醒。只有配置了
message_queue_data
设置为off_heap
的进程才会使用此优化。自身 ID:OTP-19008 辅助 ID:GH-8119, PR-8201
修复了
re:run/3
中的错误,如果给出了无效的 UTF-8 主题,re:run 可能会陷入无限循环。该错误是在 Erlang/OTP 22.1 中引入的。自属 ID:OTP-19015 辅助 ID:ERIERL-682
Erts 13.2.2.6
修复的错误和故障
如果使用超过 68 年的巨大超时设置 BIF 定时器,则大多数类 Unix 平台上的 32 位运行时系统可能会崩溃。为了发生崩溃,巨大的定时器(在其设置的时间之后)必须成为在其设置的特定调度器上设置的最近的活动定时器。这在只有一个调度器的系统上不可能发生,因为系统中始终会有更短的定时器。
在 Windows 上设置大于 49 天的定时器在极少数情况下可能会导致超时延迟。
自身 ID:OTP-18911 辅助 ID:ERIERL-1023, PR-7983
脏调度器上进程的垃圾回收可能会与该进程的信号处理冲突,导致运行时系统崩溃。此错误是在 OTP 25.3.2.8 和 OTP 26.2 中引入的。
自身 ID:OTP-18957 辅助 ID:GH-8051, PR-8088, OTP-18841
Erts 13.2.2.5
修复的错误和故障
修复了当页面大小大于 16kb 时(如 PowerPC 上)的错误调试断言。导致调试 VM 在启动时直接崩溃。
自身 ID:OTP-18802
当使用
process_info/2
(带有message_queue_len
项)或者使用中断菜单 (CTRL-C) 检查时,配置为off_heap
的message_queue_data
的进程可能会陷入不一致的状态。当它陷入这种不一致的状态时,即使它被设置为可运行状态,也不会被放入运行队列。这也影响了在此不一致状态之后发送给进程的信号,导致从那时起无法与它通信。自身 ID:OTP-18838 辅助 ID:PR-7822, GH-7801
当一个进程被选为脏执行的同时也被安排处理信号时,发生的竞争可能会导致该进程陷入不一致的状态。当它陷入这种不一致的状态时,即使它被设置为可运行状态,也不会被放入运行队列。这也影响了在此不一致状态之后发送给进程的信号,导致从那时起无法与它通信。
自身 ID:OTP-18839 辅助 ID:PR-7822, GH-7801
当一个进程必须在运行队列中等待很长时间才能被选为脏执行时,它可能无法接收信号。这会导致检查此类进程(例如,使用
process_info/2
)花费很长时间。此问题是在 OTP 25.3.2.6 和 26.1 中修复了阻止进程执行脏操作的持续信号流的问题时引入的。
自身 ID:OTP-18841 辅助 ID:PR-7822, GH-7801, OTP-18737
修复了 JIT 中错误编译大型
select_val
指令的错误。自身 ID:OTP-18842
在 OTP 24 和 OTP 25 上,如果在使用别名发送的传入分布式消息大于 64 KiB 时,如果别名在进入节点之前已被删除,则会发生内存泄漏。此问题在 OTP 26 上不存在。
使用在接收节点上已删除的别名发送的传入分布式消息大于 64 KiB 可能会导致节点崩溃。这种崩溃在 OTP 24 和 OTP 25 上非常不可能发生,但在 OTP 26 上非常可能发生。
如果
'DOWN'
信号的退出原因大于 64 KiB,并且指向的节点上的进程的创建不匹配,则会在接收节点上发生内存泄漏。但是,此类信号应该非常罕见。自身 ID:OTP-18885 辅助 ID:GH-7834, GH-7890, PR-7915
删除了不必要的 PCRE 源 tar 包。
自身 ID:OTP-18902
改进和新功能
删除了生成 yield BIF 时使用的不必要的正则表达式库。
自身 ID:OTP-18830 辅助 ID:PR-7823
用 OpenSSL 的实现替换了旧的 md5 实现。
自身 ID:OTP-18877
删除了未使用的
makewhatis
脚本。自身 ID:OTP-18899
Erts 13.2.2.4
修复的错误和故障
如果分布式 spawn 操作的参数列表部分的外部术语格式编码错误,则新生成的远程进程可能会行为异常。行为异常包括挂起或将传入的消息解释为要使用的参数列表。除非使用分布协议的替代实现,该协议对参数列表进行了错误的编码,否则这种情况非常不可能发生。子进程现在将检测到此错误并在执行用户指定的代码之前终止。
自身 ID:OTP-18790 辅助 ID:PR-7742
在运行 macOS Sonoma 的 Apple Silicon Mac 上,启用 JIT 的运行时系统会崩溃。因此,
configure
脚本现在默认在具有 Apple Silicon 的 Mac 上禁用 JIT。当为早期版本的 macOS 构建时,可以通过将--enable-jit
传递给configure
脚本来显式启用 JIT。自有 ID: OTP-18792 辅助 ID: GH-7687
修复了如果 matchspec 的主体返回一个以变量('$1'、'$_' 等)作为键或值的 map,并且该变量不是立即数,则该术语不会被复制到接收进程的堆中的错误。这会在以后损坏表中的术语,因为 GC 可能会在其中放置移动标记,这反过来会导致 VM 崩溃。
自 OTP 17.0 以来就存在此错误。
自身 ID:OTP-18797 辅助 ID:PR-7712 GH-7683
Erts 13.2.2.3
修复的错误和故障
一个针对并行信号传递优化的进程在某些情况下可能会丢失唤醒信息。也就是说,该进程没有被唤醒来处理信号,因此该信号不会被处理,直到该进程被另一个信号唤醒。只有配置了
message_queue_data
设置为off_heap
的进程才会使用此优化。自身 ID:OTP-18647 辅助 ID:PR-7595
消息信号传递到不执行任何
receive
表达式的进程的时间可能会变得非常长,甚至可能无限长。例如,使用process_info(self(), message_queue_len)
或process_info(self(), messages)
检查消息,并且避免执行匹配消息的receive
表达式的进程在检测新消息时可能会非常慢。请注意,仍然不建议以这种方式使用process_info()
。想要检查是否有消息可供处理的进程应该执行匹配消息的receive
表达式。自身 ID:OTP-18706 辅助 ID:GH-7413, PR-7595, ERIERL-979
修复了一个 Bug,该 Bug 导致
compressed
ETS 表中的“魔术”引用无法保持被引用对象的活动状态。症状是被引用的对象被过早地垃圾回收,并且引用显得过时,不再指向任何内容。这种魔术引用对象的示例包括atomics
和 NIF 资源。自身 ID:OTP-18732 辅助 ID:GH-7444, PR-7458
持续不断的传入非消息信号可能会阻止需要执行脏操作的进程执行此操作。
自身 ID:OTP-18737 辅助 ID:PR-7595
尚未传递到已终止进程的信号的清理操作会过度屈服。
自身 ID:OTP-18752 辅助 ID:PR-7633
Erts 13.2.2.2
修复的错误和故障
多个 socket:accept 调用问题。当进行多次 accept 调用时,只有最后一次调用处于活动状态。
自身 ID:OTP-18635 辅助 ID:#7328
以下函数在给定长列表或二进制文件时现在快得多:
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自身 ID:OTP-18659 辅助 ID:PR-7426
Erts 13.2.2.1
修复的错误和故障
修复了在某些无法使用机器堆栈进行 Erlang 代码的平台(主要是 OpenBSD 和带有 musl 的 Linux)上进行跟踪时发生的崩溃。
自身 ID:OTP-18561
构造一个未与字节边界对齐、大小不适合 31 位且值不适合 64 位字的二进制段可能会导致运行时系统崩溃。
自身 ID:OTP-18597
改进和新功能
进一步增强了大型映射(> 32 个键)的实现。恰好具有相同内部 32 位哈希值的键现在被放入使用线性搜索遍历的冲突节点中。这消除了在加盐时内部哈希函数最终为所有可能的不等项对产生不同哈希值的需求。
自有 ID: OTP-18569
Erts 13.2.2
修复的错误和故障
如果启动分布的运行时系统已经有引用具有相同节点名/创建对的节点的现有 pid、端口或引用,则在节点启动后,这些已经存在的 pid、端口或引用在各种情况下将无法按预期工作。只有在运行时系统在分布启动之前收到此类 pid、端口或引用时才会发生这种情况。也就是说,除非分布是动态启动的,否则这种情况极不可能发生,即使这样也很少发生。运行时系统现在会检查是否已经存在具有它将要使用的相同节点名/创建对的 pid、端口和引用。如果找到这样的,将选择另一个创建,以避免这些问题。
自有 ID: OTP-18570 辅助 ID: PR-7190
Erts 13.2.1
修复的错误和故障
修复了加载器中的一个错误,该错误阻止加载使用
no_ssa_opt
编译的某些模块。自有 ID: OTP-18519 辅助 ID: GH-7024
call()
驱动程序回调的实现如果返回错误的编码结果,可能会导致内存泄漏,并可能导致调用erlang:port_call/3
的进程堆上出现无效数据。自有 ID: OTP-18525 辅助 ID: PR-7049
修复了升级代码时的内存损坏问题。该错误是在
OTP 25.3
中引入的自有 ID: OTP-18553
修复了几个 ARM 特定指令的配置测试,这阻止了在某些平台上构建仿真器。
自有 ID: OTP-18554
使用
{alias, explicit_unalias}
选项与监视器组合创建的别名在收到由于监视器或使用erlang:demonitor()
BIF 删除监视器而收到的'DOWN'
信号后,停止从远程节点工作。此错误是在 OTP 24.3.4.10 和 OTP 25.3 中引入的。
自有 ID: OTP-18557 辅助 ID: PR-7131, OTP-18496
在极少数情况下,
utf32
的无效代码点的位语法匹配会导致运行时系统崩溃。自有 ID: OTP-18560
当缺少本机原子支持时,构建运行时系统会失败。请注意,在这些系统上的执行仅经过初步测试。
自有 ID: OTP-18563 辅助 ID: GH-7114, PR-7159
Erts 13.2
修复的错误和故障
修复了 Windows 上的一个错误,该错误导致
file:read_file_info/1
无法读取具有损坏元数据的文件。自有 ID: OTP-18348 辅助 ID: GH-6356
修复了
process_info(_, binary)
以再次包含在 OTP-25.0 中丢失的“可写二进制文件”。可写二进制文件是在循环中追加二进制文件时使用的一种优化。自有 ID: OTP-18373 辅助 ID: PR-6574, GH-6573
修复了在终止连接上接收碎片消息时出现的罕见竞争条件。可能导致内存泄漏以及双重释放崩溃。该错误自 OTP 22.0 起存在。
自有 ID: OTP-18382 辅助 ID: PR-6585
修复了一个错误,该错误可能会在链接驱动程序关闭文件描述符号并随后由 NIF 打开(重用)并传递给
enif_select
时导致问题。未观察到实际症状,只有在调试构建中才会失败内部断言。自有 ID: OTP-18391
在脏调度器上执行跟踪进程时,运行时系统可能会崩溃。
自有 ID: OTP-18398 辅助 ID: PR-6495, GH-6448, GH-5984
在二进制语法中,尝试匹配大小超过 2 GiB 的整数可能会导致运行时系统崩溃。
自有 ID: OTP-18406 辅助 ID: GH-6701
修复了浮点数求反中的极端情况,其中在 x86_64 JIT 上
A = 0.0, B = -A
不会产生B = -0.0
。自有 ID: OTP-18411 辅助 ID: GH-6717
修复了 JIT 中的一个问题,该问题可能导致模拟器在某些平台上崩溃。
自有 ID:OTP-18418
向 Windows 安装程序添加了元数据。
自有 ID:OTP-18429 辅助 ID:PR-6587 GH-4232 GH-6537
修复了当以列表形式传递给
ets:insert/2
时,具有相同键的元组插入bag
和duplicate_bag
的 ETS 顺序。插入顺序原本是头到尾,但在 OTP 23.0 中意外更改。对于bag
,已恢复为(尾到头),而对于duplicate_bag
,有时会根据列表的长度和调用进程剩余的“归约”次数而恢复。此修复将
ets:insert/2
的插入顺序改回始终为列表参数的头到尾。自有 ID:OTP-18434 辅助 ID:PR-6752
在 AArch64 (AMD64) 的 JIT 中,在 guard 中使用非整数参数调用
bxor
会导致运行时系统崩溃。自有 ID:OTP-18454 辅助 ID:PR-6839
修复了有关进程标志
max_heap_size
的错误。当进程由于超出限制而被终止时,可能会导致奇怪的行为。自有 ID:OTP-18457 辅助 ID:PR-6816
修复了二进制推导式,使其在触发垃圾回收方面与其他二进制数据的创建类似。
自有 ID:OTP-18458
在极少数情况下,当进程超出选项
max_heap_size
设置的允许堆大小时,它不会像应该的那样被终止,而是进入一种永远无法退出的僵尸状态。自有 ID:OTP-18463 辅助 ID:PR-6858
现在,对于无法转换为整数的过长列表,
list_to_integer/1
和list_to_integer/2
BIF 不会崩溃,而是引发system_limit
异常。同样,对于过长的列表,string:to_integer/1
BIF 现在返回{error,system_limit}
。自有 ID:OTP-18475 辅助 ID:PR-6897
进程终止时,该进程的活动进程别名会泄漏内存。
自有 ID:OTP-18496 辅助 ID:GH-6947,PR-6953
改进和新功能
支持完全异步的分布式信号,其中发送操作永不阻塞。此功能默认禁用,可以按进程启用。有关详细信息,请参阅
process_flag(async_dist, Bool)
的文档。自有 ID:OTP-18374 辅助 ID:PR-6632
添加了
+JPperf no_fp
选项,用于显式禁用 Erlang 帧指针,否则在使用+JPperf map
选项时会添加帧指针。自有 ID:OTP-18426
Erts 13.1.5
修复的错误和故障
在某些极端情况下,小数与 pid 或端口之间的比较会说该数大于 pid 或端口,从而违反了项顺序。
自有 ID:OTP-18415
当
Pid /= self()
时,process_info(Pid, status)
可能会返回错误的结果。自有 ID:OTP-18421 辅助 ID:PR-6806
Erts 13.1.4
修复的错误和故障
修复了选择性接收优化中的一个错误,该错误可能会导致 32 位模拟器崩溃。
自有 ID:OTP-18383 辅助 ID:ERIERL-905
一个极少触发的竞态条件可能导致进程的信号队列变得不一致,从而导致运行时系统崩溃。
自有 ID:OTP-18388 辅助 ID:OTP-17462,PR-6662
Erts 13.1.3
修复的错误和故障
修复 perf/gdb JIT 符号,使其不包含 JIT 内部模块 erts_beamasm 的
CodeInfoPrologue
。自有 ID:OTP-18256 辅助 ID:PR-6316
修复了小的内存泄漏。
自有 ID:OTP-18281 辅助 ID:PR-4840
修复了在并发进程删除或重命名表时,使用元组列表调用
ets:insert
和ets:insert_new
的错误。可以使用ets:delete/1
完成表删除,或者由表所有进程的终止引起。症状是 VM 崩溃或插入操作的奇怪不正确行为。触发错误的风险随着要插入的元组列表的长度而增加。这些错误自 OTP 23.0 起就存在。
自有 ID:OTP-18284 辅助 ID:PR-6305
增强计划线程进度作业的执行。这是为了防止在极快的分配/取消分配场景(例如重复的 ETS 表创建/删除)中出现内存耗尽。
自有 ID:OTP-18294 辅助 ID:PR-6390
修复了在崩溃转储一个执行
ets:delete_all_objects
的 ETS 表期间发生的 segv 崩溃。自有 ID:OTP-18295
函数 net:if_names/0 的规范不正确
自有 ID:OTP-18296 辅助 ID:OTP-16464
修复了解码 2G 字节或更大的二进制项时
binary_to_term
中的错误。自有 ID:OTP-18306 辅助 ID:GH-6393,PR-6401
调整了
erlang:module_loaded/1
的文档- 它以前没有说明该 BIF 仅对作为当前代码加载的模块返回
true
。 - 已删除声称该 BIF 只能由代码服务器使用的警告。
自有 ID:OTP-18313 辅助 ID:PR-6456
- 它以前没有说明该 BIF 仅对作为当前代码加载的模块返回
修复了负代码点的
list_to_atom/1
。可能会返回一个正代码点或因错误异常而失败。自有 ID:OTP-18321
修复了当向从
erlang:processes/0
返回的生成进程的 pid 发送消息时导致 VM 崩溃的罕见错误。仅当由系统进程 literal_area_collector 在使用 +Meamin(无自定义分配器)启动的 VM 上,由模块清除操作触发时才会看到此错误。
自有 ID:OTP-18322 辅助 ID:PR-6479
带选项 add_membership 或 drop_membership 的 gen_udp:open/2 会删除较早的选项。
自有 ID:OTP-18323 辅助 ID:#6476
现在,除非套接字是 UDP 套接字,否则
inet:setopts/2
{reuseaddr, true}
选项将在 Windows 上被忽略。有关详细信息,请参阅inet:setopts/2
文档中reuseaddr
选项部分的文档。在 OTP 25 之前,
{reuseaddr, true}
选项对于 Windows 上的所有套接字都被忽略,但自 OTP 25.0 起,此更改使其对于任何套接字都不会被忽略。* 潜在的不兼容性 *
自有 ID:OTP-18324 辅助 ID:GH-6461,PR-6481
修复了解码长度为 1G 或更长的列表时
binary_to_term
中的错误。自有 ID:OTP-18328 辅助 ID:GH-6439,PR-6440
修复了在解码具有未排序的小映射(<= 32)作为大映射(> 32 个键)的键时
binary_to_term
(和分布式接收)中的错误。仅当项由
erl_interface
、jinterface
或其他方式编码时,这才会成为问题,因为 VM 本身始终使用排序的键编码小映射。“binary_to_term”看起来会成功,但创建的大映射在内部不一致。使用 maps:get 和 friends 无法找到较小的键映射。诸如映射比较和合并之类的其他操作也可能给出不正确的结果。
自有 ID:OTP-18343 辅助 ID:GH-6496
修复了 Windows 中当通过 OS 搜索 PATH 找到
Command
且该目录路径包含空格时open_port({spawn, Command}, ..)
中的错误。端口程序将启动,但其命令行参数可能不正确。自有 ID:OTP-18345 辅助 ID:GH-6387,PR-6396
Erts 13.1.2.1
修复的错误和故障
修复了选择性接收优化中的一个错误,该错误可能会导致 32 位模拟器崩溃。
自有 ID:OTP-18383 辅助 ID:ERIERL-905
一个极少触发的竞态条件可能导致进程的信号队列变得不一致,从而导致运行时系统崩溃。
自有 ID:OTP-18388 辅助 ID:OTP-17462,PR-6662
Erts 13.1.2
修复的错误和故障
向 erts_alloc 添加放弃载体空闲利用率限制 (
+Muacful
) 选项。此选项允许用户将内存载体中未使用的段标记为可由 OS 在需要时重复使用。此功能在 Erlang/OTP 25 之前是一个不可配置的默认值,但由于性能问题而被删除。
自有 ID:OTP-18290 辅助 ID:ERIERL-866 PR-6378
Erts 13.1.1
修复的错误和故障
使用套接字模块创建的侦听套接字泄漏了(erlang-)监视器。
自有 ID:OTP-18240 辅助 ID:#6285
发送给分布控制器进程的有关可用分布数据的通知可能会丢失。在实现备用分布载体时可以使用分布控制器进程。通过 TCP 的默认分布不受影响,并且该错误也不存在于 x86/x86_64 平台上。
自有 ID:OTP-18258 辅助 ID:GH-6309,PR-6324
Erts 13.1
修复的错误和故障
修复了由于
nodeup
/nodedown
消息在连接上的流量之前/之后没有传递而导致的global
中的不一致性错误。还修复了global_group
和global
中的各种其他不一致性错误和死锁。作为这些修复的基础,引入了一个新的 BIF
erlang:nodes/2
,并且扩展了net_kernel:monitor_nodes/2
。如果命令行中存在多个实例,则
-hidden
和-connect_all
命令行参数不起作用,此问题已修复。为了替换-connect_all
命令行参数,还引入了新的内核参数connect_all
。自有 ID:OTP-17934 辅助 ID:PR-6007
修复了 IPv6 multicast_if 和成员资格套接字选项。
自有 ID:OTP-18091 辅助 ID:#5789
接受具有错误编码大小字段的 funs (NEW_FUN_EXT)。这是对 OTP 23 和 24 中存在的 bug (OTP-18104) 的一种解决方法,该 bug 可能在某些情况下导致错误的大小字段。模拟器不使用解码的大小字段,但
erl_interface
仍然使用,并且此解决方法没有帮助。自有 ID:OTP-18093 辅助 ID:OTP-18104,PR-5987
修复了在纯 IPv6 Windows 上 inet:getifaddrs 挂起的问题
自有 ID:OTP-18102 辅助 ID:#5904
修复了以下情况下的错误分布编码:
- 当向尚未建立(待定)的连接编码时,在环境中使用位串或 export-fun 的 fun
- 或者在环境中使用二进制/位串的 fun,该二进制/位串引用堆外二进制(大于 64 字节)。
症状可能是接收方解码失败,导致连接中止。修复 OTP-18093 是对这些 bug 的一种解决方法,它使 VM 接受此类错误编码的 funs。
第一个针对待定连接的编码错误仅存在于 OTP 23 和 24 中,但第二个错误也存在于 OTP 25 中。
自有 ID:OTP-18104 辅助 ID:OTP-18093
修复了在使用选项
ordered_set
和{write_concurrency,true}
生成 ETS 表的崩溃转储时可能发生的模拟器崩溃。自有 ID:OTP-18144 辅助 ID:GH-5981
在 MacOS 上检索单调时钟和系统时钟分辨率可能会导致崩溃和/或错误的结果。
自有 ID:OTP-18160 辅助 ID:PR-6103
修复了
erl +hmax
允许的最大大小低于process_flag
允许的最大大小的 bug。自有 ID:OTP-18161 辅助 ID:PR-6081
在具有 ARM64 (AArch64) 处理器的计算机上,如果在二进制匹配的末尾跳过 4095 位以上,则 JIT 可能会生成不正确的代码。
自有 ID:OTP-18201
在极少数情况下,当给定一个大整数时,
is_binary/1
保护测试可能会成功。自有 ID:OTP-18216 辅助 ID:GH-6239,PR-6240
修复了导致
ets:info
(有时ets:whereis
) 在并发进程对同一表使用长列表执行ets:insert
时,为现有表返回“undefined”的 bug。自有 ID:OTP-18218 辅助 ID:ERIERL-855
修复了在 macOS 上单次读/写操作中写入和读取超过 2 GB 的问题。在此修复之前,尝试读取/写入超过 2GB 将导致
{error,einval}
。自有 ID:OTP-18222 辅助 ID:PR-6248 GH-6242
修复了在有待处理的连接时有时会在节点关闭时导致模拟器崩溃的 bug。仅在运行 duel 分布协议 inet_drv 和 inet_tls_dist 时出现。
自有 ID:OTP-18243 辅助 ID:GH-6247,PR-6258
改进和新功能
由于以下原因,在调整大型进程消息队列时进行让步:
- 在删除文字区域之前,从文字区域复制术语。
- 将
message_queue_data
状态从on_heap
更改为off_heap
。
消息队列调整工作现在将与进程必须执行的所有其他类型的工作交错进行,甚至包括其他消息队列调整工作。
自有 ID:OTP-17340 辅助 ID:PR-6133
为基于 inet 驱动程序的套接字(如 gen_tcp 和 gen_udp)添加了基本的调试功能(选项)。
自有 ID:OTP-18032
为
net_kernel:start/2
引入了hidden
和dist_listen
选项。还记录了
-dist_listen
命令行参数,该参数被错误地记录为kernel
参数,而不是命令行参数。自有 ID:OTP-18107 辅助 ID:PR-6009
在互操作性教程下添加了新的文档章节“调试 NIF 和端口驱动程序”。
自有 ID:OTP-18109
添加新的 API 函数 erl_features:configurable/0
自有 ID:OTP-18199 辅助 ID:PR-5790
Erts 13.0.4
修复的 Bug 和故障
如果目标进程或端口不存在,则
monitor/3
BIF 不会将选项应用于创建的监视器。也就是说,即使设置了自定义标签,相应的 down 消息也会获得一个`DOWN`
标签,并且即使已传递alias
选项,返回的引用也不是别名。自有 ID:OTP-18190 辅助 ID:GH-6185,PR-6209
当传递参数
native
时,erlang:monotonic_time/1
、erlang:system_time/1
、erlang:time_offset/1
和os:system_time/1
BIF 错误地失败。自有 ID:OTP-18197 辅助 ID:GH-6165,PR-6213
Erts 13.0.3
修复的 Bug 和故障
在以下情况下,可能会丢失分布式退出信号:
如果发生以下情况,则从父进程到子进程的退出信号会丢失:
- 父进程在创建子进程的 spawn 请求完成之前终止,
- spawn 请求在父进程和子进程之间设置了链接
- spawn 请求是分布式的,并且
- 退出原因大于一个机器字。
在尚未完成的 spawn 请求正在进行时,连接丢失可能会导致退出信号丢失。这种退出信号的丢失非常罕见。除了上述连接丢失之外,还必须满足以下条件:
- 被连接丢失中断的 spawn 请求还必须在父进程和子进程之间设置链接。
- 发出 spawn 请求的父进程在 spawn 请求被连接丢失中断时也必须终止。
- 同一父进程还必须向其他节点而不是连接丢失的节点发出其他 spawn 请求。
- 向其他节点的这些 spawn 请求也必须设置链接。
- 在连接丢失时,向其他节点的这些 spawn 请求也必须尚未完成。也就是说,来自子进程的 spawn 回复尚未到达父进程。
如果满足以上所有条件,则由于上述向其他节点发出的 spawn 请求而产生的子进程的退出信号可能会丢失。
上面的 bug 在触发时还会导致严重的内存泄漏,因为父进程的销毁永远不会完成。
自有 ID:OTP-18164 辅助 ID:PR-6114
竞争可能会导致其他进程上的
process_info(Pid, message_queue_len)
返回无效结果。自有 ID:OTP-18169 辅助 ID:PR-6134
修复了处理进程系统任务的 reduction 计数。
自有 ID:OTP-18170 辅助 ID:PR-6135
终止进程的优先级提升不起作用,这可能会导致此类进程的执行被延迟。
自有 ID:OTP-18175 辅助 ID:PR-6142
在取消链接操作完成之前(即在收到来自链接进程的取消链接-ack 信号之前)终止的进程执行的取消链接操作,会导致从终止进程错误地向被取消链接的进程发送退出信号。此退出信号通常会被接收者忽略,但是,如果退出信号的接收者同时设置了新的链接,则它可能会收到终止进程的实际退出原因的退出信号,而不是
noproc
退出原因。但是,很难检测到这种情况是否发生,也没有明显的负面影响,因此应该认为它是无害的。终止进程接收到的分布式取消链接-ack 信号也没有被正确删除,这可能会导致轻微的内存泄漏。
自有 ID:OTP-18177 辅助 ID:PR-6150
Erts 13.0.2
修复的 Bug 和故障
在具有 ARM64 (AArch64) 架构(如 Apple Silicon Mac)的计算机上,如果未使用
rem
表达式的结果,则后跟具有相同操作数的div
表达式的rem
表达式可能会评估为错误的结果。自有 ID:OTP-18143
Erts 13.0.1
修复的 Bug 和故障
来自远程节点的
spawn_reply
信号可能会被延迟,并在来自新生成进程的其他信号之后传递。当此 bug 被触发时,由于该 bug,有时可能会断开与生成进程的节点的连接。如果发生这种情况,则会记录以下错误消息:
由节点 <LocalNode> 上的 <Pid> 检测到来自节点 <RemoteNode> 的缺少 'spawn_reply' 信号。节点 <RemoteNode> 可能存在票证 ID 为 OTP-17737 的 bug。
此错误仅影响启用了
off_heap
message_queue_data
并且自动启用了并行接收信号的进程。此错误是在 OTP 25.0,ERTS 版本 13.0 中引入的。
自有 ID:OTP-18105 辅助 ID:OTP-16982, PR-6003
修复了
erlang:system_info(dist_ctrl)
的类型规范。自有 ID:OTP-18106 辅助 ID:PR-5992
运行时系统中内置的 zlib 已更新至 1.2.12 版本。(请注意,在大多数平台上,使用的是平台自己的 zlib。)
自有 ID:OTP-18123 辅助 ID:GH-5994
erlang:is_alive()
BIF 在配置的分布式服务可用之前可能返回true
。此错误是在 OTP 25.0 ERTS 版本 13.0 中引入的。即使配置的分布式服务可用,
erlang:monitor_node()
和erlang:monitor()
BIF 也可能错误地失败。如果这些 BIF 在使用动态节点名称分配启动分布式之后但在名称分配之前调用,则会发生这种情况。自有 ID:OTP-18124 辅助 ID:OTP-17558, PR-6032
Erts 13.0
修复的错误和故障
Windows 上不再忽略套接字选项 'reuseaddr'。
自有 ID:OTP-17447 辅助 ID:GH-4819
可写二进制文件的增长率已调整为大小超过 16MB 后仅增加 20%。在此更改之前,大小将始终加倍。
此更改可能会降低大型二进制文件的写入性能。
* 潜在的不兼容性 *
自有 ID:OTP-17569 辅助 ID:PR-4793
修复了
re:run
中的归约计数错误,该错误导致函数在执行global
匹配时过于频繁地产生结果。自有 ID:OTP-17661 辅助 ID:PR-5165
修复了 epmd 错误消息中的拼写错误。
自有 ID:OTP-17758 辅助 ID:PR-5391
修复了“newshell”会在终端的列宽处触发换行符的错误,即使下一个要打印的字符是换行符也是如此。这会导致终端呈现两个换行符而不是一个。
自有 ID:OTP-17779 辅助 ID:GH-5403 PR-5599
修复了当使用
read_concurrency
选项时,从ets:info(Tid,memory)
返回的内存值。在此修复之前,调度程序特定锁缓存行使用的内存未计入总数。这导致在具有许多调度程序的系统上,对于具有许多锁的表,返回的内存使用情况非常不正确。
自有 ID:OTP-17832 辅助 ID:PR-5494
修复了未文档化的
--profile_boot
选项使其再次工作。自有 ID:OTP-17836 辅助 ID:PR-5546
[socket] 改进了 sockaddr 的编码。
自有 ID:OTP-18020
修复了
erl_child_setup
(open_port({spawn,...})
和os:cmd/1
使用的程序),以更好地处理来自 Erlang VM 的部分读取。自有 ID:OTP-18047 辅助 ID:PR-5861
当尝试创建超过 33554431 个原子时,运行时系统会崩溃。
自有 ID:OTP-18068 辅助 ID:GH-5903
改进和新功能
用户现在可以使用
{write_concurrency, auto}
选项配置 ETS 表。此选项强制表在运行时根据检测到的并发程度自动更改使用的锁的数量。当{write_concurrency, auto}
处于活动状态时,默认启用{decentralized_counters, true}
选项。此处提供了将此选项与其他 ETS 优化选项进行比较的基准测试结果
https://erlang.ac.cn/bench/ets_bench_result_lock_config.html
自有 ID:OTP-15991 辅助 ID:PR-5208
net 模块现在可以在 Windows 上运行。
自有 ID:OTP-16464
为了启用更多优化,在 OTP 21 及更早版本中编译的 BEAM 文件无法在 OTP 25 中加载。
自有 ID:OTP-16702
优化具有大量二进制文件、fun 和/或外部 pid/端口/引用的进程的次要垃圾回收。这是在 OTP-24.1 中发布的优化 (OTP-17602) 的延续。
自有 ID:OTP-16852 辅助 ID:ERL-1347, PR-5195
已优化 message_queue_data=off_heap* 的进程的信号队列,以允许从多个进程并行接收信号。
这是可行的,因为 Erlang 仅保证从单个进程发送到另一个进程的信号(即,消息信号和非消息信号)按发送顺序排序。但是,对于从不同进程发送到特定进程的信号,没有排序保证。因此,多个进程可以并行向特定进程发送信号,而无需彼此同步。但是,这种信号发送以前总是串行化的,因为发送者必须获取接收进程的外部信号队列的锁。这种并行信号发送优化比以前可能实现的信号发送具有更好的可扩展性,有关基准测试结果,请参阅 https://erlang.ac.cn/bench/sigq_bench_result.html。
* 有关如何启用 message_queue_data=off_heap 设置的信息可以在函数 erlang:process_flag/2 的文档中找到。
自有 ID:OTP-16982 辅助 ID:PR-5020
JIT 现在适用于 64 位 ARM 处理器。
自有 ID:OTP-17119 辅助 ID:PR-4869
添加了对编译属性
-nifs()
的支持,以使编译器和加载器能够了解哪些函数可以通过erlang:load_nif/2
作为 NIF 被覆盖。建议在加载 NIF 库的所有模块中使用此属性。自有 ID:OTP-17151 辅助 ID:ERIERL-590, PR-5479
已将一个测试用例添加到 otp_SUITE,以测试 OTP 应用程序的依赖版本是否正确。测试用例使用 xref 来检查指定依赖版本中是否提供了使用的函数。测试用例依赖于 Erlang/OTP 团队的测试基础设施,如果其依赖项未满足,则会跳过。
自有 ID:OTP-17224
现在,如果安装的
RELEASES
文件中的路径是相对于安装根目录的路径,则可以在文件系统上重新定位 Erlang 安装目录。如果将RootDir
参数设置为空字符串,则`release_handler:create_RELEASES/4
函数可以生成带有相对路径的RELEASES
文件。自有 ID:OTP-17304
以下分发标志现在是强制性的:
DFLAG_BIT_BINARIES
、DFLAG_EXPORT_PTR_TAG
、DFLAG_MAP_TAGS
、DFLAG_NEW_FLOATS
和DFLAG_FUN_TAGS
。这主要涉及自己实现分发协议的库或应用程序。自有 ID:OTP-17318 辅助 ID:PR-4972
针对
autoconf
2.71 调整了configure
脚本的输入。自有 ID:OTP-17414 辅助 ID:PR-4967
当使用二进制语法构造二进制文件失败时,shell 中和
erl_error:format_exception/3,4
打印的错误消息将包含有关出错原因的更多详细信息。自有 ID:OTP-17504 辅助 ID:GH-4971, PR-5281, PR-5752
配置文件
.erlang
、.erlang.cookie
和.erlang.crypt
现在可以位于 XDG Config Home 目录中。有关更多详细信息,请参阅每个文件的文档和
filename:basedir/2
。自有 ID:OTP-17554 辅助 ID:GH-5016 PR-5408 OTP-17821
使
byte_size/1
和binary_part/2/3
可从匹配规范(在 ETS 和跟踪中)调用。自有 ID:OTP-17555 辅助 ID:PR-5027
动态节点名称改进:
erlang:is_alive/0
已更改为针对待处理的动态节点名称返回 true,并且新增了函数net_kernel:get_state/0
。自有 ID:OTP-17558 辅助 ID:OTP-17538, PR-5111, GH-5402
已向函数
erlang:float_to_list
和erlang:float_to_binary
添加了一个名为short
的新选项。此选项创建给定浮点数的可以再次转换回同一浮点数的最短正确舍入的字符串表示形式。自有 ID:OTP-17562 辅助 ID:GH-4492
已优化标记的元组测试和函数调用,现在比以前稍微便宜一些。
在确保所有装箱的术语在 arity 字之后至少分配了一个字之后,这些优化成为可能。这是通过让所有空元组引用相同的空元组字面量来实现的,这也减少了空元组的内存使用。
自有 ID:OTP-17608
parallel_messages_SUITE 中的信号队列基准测试和 ets_SUITE 中的 ETS 基准测试具有基准测试结果可视化 HTML 页面,带有“全屏”按钮以使图表更大。此按钮之前未按预期工作。当按下图表的按钮时,最后一个图表被更大的版本替换,而不是按钮上方的图表。现在已修复此问题。
自有 ID:OTP-17630
测试用例 num_bif_SUITE:t_float_to_string 之前有时会失败,因为它假设使用 sprintf 打印的浮点数进行特定舍入,但舍入类型是平台特定的。
自有 ID:OTP-17636
优化解释器以在可能的情况下创建小型匹配上下文的堆二进制文件。
此优化已在 JIT 中完成。
自有 ID:OTP-17660 辅助 ID:PR-5164
优化 x86 JIT 的整数乘法
自有 ID:OTP-17667 辅助 ID:PR-5237
删除了将节点创建值零用作通配符。还阻止
erl_interface
和jinterface
节点使用零作为创建。自有 ID:OTP-17682 辅助 ID:PR-5347
分布式 spawn 操作现在需要 分布式
spawn_request()
支持。分布式spawn_request()
在 OTP 23 中引入。也就是说,针对 OTP 23 之前版本的 Erlang 节点的分布式 spawn 操作将会失败。* 潜在的不兼容性 *
自有 ID:OTP-17683 辅助 ID:PR-5306
Erlang 编译器现在在 BEAM 文件中包含类型信息,并且 JIT 现在可以使用该类型信息进行优化,例如消除或简化类型测试。
自有 ID:OTP-17684 辅助 ID:PR-5316, PR-5664
改进了 JIT 对
perf
和gdb
等外部工具的支持,允许它们显示行号,甚至在可以找到时显示原始 Erlang 源代码。为了帮助它们查找源代码,已添加
absolute_path
编译器选项以嵌入模块的绝对文件路径。自有 ID:OTP-17685
为 32 位 VM 的 Erlang shell 标题行添加 [32 位]。
自有 ID:OTP-17717 辅助 ID:PR-5290
现在可以在
HOWTO/INSTALL.md
中找到有关如何为 iOS/iPadOS 构建运行时系统的说明。自有 ID:OTP-17728 辅助 ID:PR-5284
通过使用新的宏
STATIC_ERLANG_NIF_LIBNAME
添加对带有非字母数字字符的静态 Elixir NIF 模块的支持。自有 ID:OTP-17729 辅助 ID:PR-5477
为 erlang:trace_pattern/3 使用的跟踪匹配规范添加新函数
caller_line
。这个新选项将调用者的行号放入发送给跟踪接收器的跟踪消息中。
自有 ID:OTP-17753 辅助 ID:PR-5305 GH-5297
引入了一个新的
erl
命令行参数+ssrct
,它将导致运行时系统跳过读取 CPU 拓扑信息。这会缩短启动时间,尤其是在 CPU 拓扑很大时。如果使用+sct
命令行参数设置了用户定义的 CPU 拓扑,则现在也会跳过读取 CPU 拓扑信息。自有 ID:OTP-17762 辅助 ID:GH-5204, PR-5219
默认的时间扭曲模式将在 Erlang/OTP 26 中更改。在文档中添加了关于即将到来的潜在不兼容性的警告。
自有 ID:OTP-17772 辅助 ID:GH-4965 PR-5644
模拟器将不再把未使用的内存标记为可丢弃的(例如通过
madvise(2)
),因为它导致的问题多于它解决的问题。自有 Id:OTP-17824
当记录匹配或记录更新失败时,之前会抛出
{badrecord,ExpectedRecordTag}
异常。在此版本中,异常已更改为{badrecord,ActualValue}
,其中ActualValue
是实际找到的值,而不是预期的记录。自有 Id:OTP-17841 辅助 Id:PR-5694
删除了之前未记录且不支持的
emem
工具。自有 Id:OTP-17892 辅助 Id:PR-5591
从 Windows 上的默认安装路径中删除版本号。
自有 Id:OTP-17899 辅助 Id:PR-5524
在 Windows 上,在 Erlang 服务中应用限制标志 JOB_OBJECT_LIMIT_BREAKAWAY_OK,以便能够启动具有不同会话号的 OS 子进程。
自有 Id:OTP-17927 辅助 Id:PR-5283
新的 erl 命令行选项
+IOs
。它可用于禁用调度器线程轮询优化,该优化已被发现在某些用例中导致事件延迟降低。自有 Id:OTP-17945 辅助 Id:GH-4759, PR-5809
以
gen_sctp:connectx_init/*
的形式添加了多宿主 SCTP 连接的 API。自有 Id:OTP-17951 辅助 Id:PR-5656
[socket] 添加了类型 sockaddr_ll (family 'packet') 的字段 hatype 的编码。
自有 Id:OTP-17968 辅助 Id:OTP-16464
修复了在配置阶段查找 libdlpi 的交叉编译问题。
自有 Id:OTP-17985 辅助 Id:GH-5728
process_info/2
现在也接受parent
作为参数。传递时,将返回父进程的进程标识符。自有 Id:OTP-17999 辅助 Id:PR-5768
将函数属性添加到
erl_nif
和erl_driver
API,以改进编译器对接口误用的检测。自有 Id:OTP-18006 辅助 Id:PR-5932
引入了导出的类型
erlang:send_destination/0
。自有 Id:OTP-18033 辅助 Id:PR-2926, GH-5376
优化了 Windows 上 C/C++ make 依赖项的构建,使其速度更快。
自有 Id:OTP-18036 辅助 Id:PR-5846
file:sync/1
现在在 Mac OS 上可用时将使用F_BARRIERFSYNC
标志。自有 Id:OTP-18038
Erts 12.3.2.17
修复的错误和故障
如果一个带有
on_load
函数的模块在另一个模块直接使用erlang:purge_module
清除的同时被加载,代码服务器可能会挂起。自身 ID:OTP-19006
修复了
re:run/3
中的错误,如果给出了无效的 UTF-8 主题,re:run 可能会陷入无限循环。该错误是在 Erlang/OTP 22.1 中引入的。自属 ID:OTP-19015 辅助 ID:ERIERL-682
如果脏调度程序正在执行同时跟踪操作,则使用第一个参数
ports
、processes
、existing_ports
、existing_processes
、existing
或all
调用erlang:trace/3
可能会导致模拟器崩溃。自属 ID:OTP-19034
修复了当操作系统报告的单调时间单位大于 10 且小于 100 微秒时发生的整数溢出。
自属 ID:OTP-19036 辅助 ID:GH-8186
当在脏调度程序上执行的跟踪进程收到退出信号时,脏调度程序可能会使用错误的线程特定数据,这可能会导致崩溃。
自属 ID:OTP-19043 辅助 ID:PR-8342
修复了一个或多或少无害的错误,该错误导致当
QueryPerformanceCounter()
用作操作系统单调时间源时,Erlang 单调时间的时间校正在 Windows 平台上略有偏差。erlang:system_info(os_monotonic_time_source)
现在还返回有关*已用分辨率*的信息,该信息并不总是与操作系统单调时间源的分辨率相对应。自属 ID:OTP-19048 辅助 ID:PR-8343
改进和新功能
改进了单调时间检查,现在 Erlang 和操作系统单调时间会分别进行检查。
新增了一个
configure
参数--enable-ensure-os-monotonic-time
。它启用了确保操作系统提供的单调时间戳单调性的功能。当检测到非单调的时间戳时,它将被最近一次提供的单调时间戳替换,然后再被 Erlang 的时间功能使用。请注意,除非系统上的操作系统单调时间源无法生成单调时间戳,否则您不想启用此功能。这是因为确保操作系统单调时间戳的单调性会损害系统的可伸缩性和性能。自身 ID:OTP-19044 辅助 ID:ERIERL-1043, PR-8342
Erts 12.3.2.16
修复的错误和故障
如果使用超过 68 年的巨大超时设置 BIF 定时器,则大多数类 Unix 平台上的 32 位运行时系统可能会崩溃。为了发生崩溃,巨大的定时器(在其设置的时间之后)必须成为在其设置的特定调度器上设置的最近的活动定时器。这在只有一个调度器的系统上不可能发生,因为系统中始终会有更短的定时器。
在 Windows 上设置大于 49 天的定时器在极少数情况下可能会导致超时延迟。
自身 ID:OTP-18911 辅助 ID:ERIERL-1023, PR-7983
Erts 12.3.2.15
修复的错误和故障
修复了当页面大小大于 16kb 时(如 PowerPC 上)的错误调试断言。导致调试 VM 在启动时直接崩溃。
自身 ID:OTP-18802
在 OTP 24 和 OTP 25 上,如果在使用别名发送的传入分布式消息大于 64 KiB 时,如果别名在进入节点之前已被删除,则会发生内存泄漏。此问题在 OTP 26 上不存在。
使用在接收节点上已删除的别名发送的传入分布式消息大于 64 KiB 可能会导致节点崩溃。这种崩溃在 OTP 24 和 OTP 25 上非常不可能发生,但在 OTP 26 上非常可能发生。
如果
'DOWN'
信号的退出原因大于 64 KiB,并且指向的节点上的进程的创建不匹配,则会在接收节点上发生内存泄漏。但是,此类信号应该非常罕见。自身 ID:OTP-18885 辅助 ID:GH-7834, GH-7890, PR-7915
删除了不必要的 PCRE 源 tar 包。
自身 ID:OTP-18902
改进和新功能
删除了生成 yield BIF 时使用的不必要的正则表达式库。
自身 ID:OTP-18830 辅助 ID:PR-7823
用 OpenSSL 的实现替换了旧的 md5 实现。
自身 ID:OTP-18877
删除了未使用的
makewhatis
脚本。自身 ID:OTP-18899
Erts 12.3.2.14
修复的错误和故障
修复了一个 Bug,该 Bug 导致
compressed
ETS 表中的“魔术”引用无法保持被引用对象的活动状态。症状是被引用的对象被过早地垃圾回收,并且引用显得过时,不再指向任何内容。这种魔术引用对象的示例包括atomics
和 NIF 资源。自身 ID:OTP-18732 辅助 ID:GH-7444, PR-7458
尚未传递到已终止进程的信号的清理操作会过度屈服。
自身 ID:OTP-18752 辅助 ID:PR-7633
如果分布式 spawn 操作的参数列表部分的外部术语格式编码错误,则新生成的远程进程可能会行为异常。行为异常包括挂起或将传入的消息解释为要使用的参数列表。除非使用分布协议的替代实现,该协议对参数列表进行了错误的编码,否则这种情况非常不可能发生。子进程现在将检测到此错误并在执行用户指定的代码之前终止。
自身 ID:OTP-18790 辅助 ID:PR-7742
修复了如果 matchspec 的主体返回一个以变量('$1'、'$_' 等)作为键或值的 map,并且该变量不是立即数,则该术语不会被复制到接收进程的堆中的错误。这会在以后损坏表中的术语,因为 GC 可能会在其中放置移动标记,这反过来会导致 VM 崩溃。
自 OTP 17.0 以来就存在此错误。
自身 ID:OTP-18797 辅助 ID:PR-7712 GH-7683
Erts 12.3.2.13
修复的错误和故障
以下函数在给定长列表或二进制文件时现在快得多:
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自身 ID:OTP-18659 辅助 ID:PR-7426
Erts 12.3.2.12
修复的错误和故障
在极少数情况下,
utf32
的无效代码点的位语法匹配会导致运行时系统崩溃。自有 ID: OTP-18560
如果启动分布的运行时系统已经有引用具有相同节点名/创建对的节点的现有 pid、端口或引用,则在节点启动后,这些已经存在的 pid、端口或引用在各种情况下将无法按预期工作。只有在运行时系统在分布启动之前收到此类 pid、端口或引用时才会发生这种情况。也就是说,除非分布是动态启动的,否则这种情况极不可能发生,即使这样也很少发生。运行时系统现在会检查是否已经存在具有它将要使用的相同节点名/创建对的 pid、端口和引用。如果找到这样的,将选择另一个创建,以避免这些问题。
自有 ID: OTP-18570 辅助 ID: PR-7190
构造一个未与字节边界对齐、大小不适合 31 位且值不适合 64 位字的二进制段可能会导致运行时系统崩溃。
自身 ID:OTP-18597
改进和新功能
进一步增强了大型映射(> 32 个键)的实现。恰好具有相同内部 32 位哈希值的键现在被放入使用线性搜索遍历的冲突节点中。这消除了在加盐时内部哈希函数最终为所有可能的不等项对产生不同哈希值的需求。
自有 ID: OTP-18569
Erts 12.3.2.11
修复的错误和故障
修复了在有待处理的连接时有时会在节点关闭时导致模拟器崩溃的 bug。仅在运行 duel 分布协议 inet_drv 和 inet_tls_dist 时出现。
自有 ID:OTP-18243 辅助 ID:GH-6247,PR-6258
修复了在解码具有未排序的小映射(<= 32)作为大映射(> 32 个键)的键时
binary_to_term
(和分布式接收)中的错误。仅当项由
erl_interface
、jinterface
或其他方式编码时,这才会成为问题,因为 VM 本身始终使用排序的键编码小映射。“binary_to_term”看起来会成功,但创建的大映射在内部不一致。使用 maps:get 和 friends 无法找到较小的键映射。诸如映射比较和合并之类的其他操作也可能给出不正确的结果。
自有 ID:OTP-18343 辅助 ID:GH-6496
call()
驱动程序回调的实现如果返回错误的编码结果,可能会导致内存泄漏,并可能导致调用erlang:port_call/3
的进程堆上出现无效数据。自有 ID: OTP-18525 辅助 ID: PR-7049
使用
{alias, explicit_unalias}
选项与监视器组合创建的别名在收到由于监视器或使用erlang:demonitor()
BIF 删除监视器而收到的'DOWN'
信号后,停止从远程节点工作。此错误是在 OTP 24.3.4.10 和 OTP 25.3 中引入的。
自有 ID: OTP-18557 辅助 ID: PR-7131, OTP-18496
Erts 12.3.2.10
修复的错误和故障
进程终止时,该进程的活动进程别名会泄漏内存。
自有 ID:OTP-18496 辅助 ID:GH-6947,PR-6953
Erts 12.3.2.9
修复的错误和故障
当
Pid /= self()
时,process_info(Pid, status)
可能会返回错误的结果。自有 ID:OTP-18421 辅助 ID:PR-6806
在极少数情况下,当进程超出选项
max_heap_size
设置的允许堆大小时,它不会像应该的那样被终止,而是进入一种永远无法退出的僵尸状态。自有 ID:OTP-18463 辅助 ID:PR-6858
Erts 12.3.2.8
修复的错误和故障
修复了选择性接收优化中的一个错误,该错误可能会导致 32 位模拟器崩溃。
自有 ID:OTP-18383 辅助 ID:ERIERL-905
一个极少触发的竞态条件可能导致进程的信号队列变得不一致,从而导致运行时系统崩溃。
自有 ID:OTP-18388 辅助 ID:OTP-17462,PR-6662
Erts 12.3.2.7
修复的错误和故障
函数 net:if_names/0 的规范不正确
自有 ID:OTP-18296 辅助 ID:OTP-16464
修复了解码 2G 字节或更大的二进制项时
binary_to_term
中的错误。自有 ID:OTP-18306 辅助 ID:GH-6393,PR-6401
修复了负代码点的
list_to_atom/1
。可能会返回一个正代码点或因错误异常而失败。自有 ID:OTP-18321
修复了解码长度为 1G 或更长的列表时
binary_to_term
中的错误。自有 ID:OTP-18328 辅助 ID:GH-6439,PR-6440
Erts 12.3.2.6
修复的错误和故障
发送给分布控制器进程的有关可用分布数据的通知可能会丢失。在实现备用分布载体时可以使用分布控制器进程。通过 TCP 的默认分布不受影响,并且该错误也不存在于 x86/x86_64 平台上。
自有 ID:OTP-18258 辅助 ID:GH-6309,PR-6324
Erts 12.3.2.5
修复的错误和故障
修复了在 macOS 上单次读/写操作中写入和读取超过 2 GB 的问题。在此修复之前,尝试读取/写入超过 2GB 将导致
{error,einval}
。自有 ID:OTP-18222 辅助 ID:PR-6248 GH-6242
Erts 12.3.2.4
修复的错误和故障
修复了导致
ets:info
(有时ets:whereis
) 在并发进程对同一表使用长列表执行ets:insert
时,为现有表返回“undefined”的 bug。自有 ID:OTP-18218 辅助 ID:ERIERL-855
Erts 12.3.2.3
修复的错误和故障
修复了以下情况下的错误分布编码:
- 当向尚未建立(待定)的连接编码时,在环境中使用位串或 export-fun 的 fun
- 或者在环境中使用二进制/位串的 fun,该二进制/位串引用堆外二进制(大于 64 字节)。
症状可能是接收方解码失败,导致连接中止。修复 OTP-18093 是对这些 bug 的一种解决方法,它使 VM 接受此类错误编码的 funs。
第一个针对待定连接的编码错误仅存在于 OTP 23 和 24 中,但第二个错误也存在于 OTP 25 中。
自有 ID:OTP-18104 辅助 ID:OTP-18093
在以下情况下,可能会丢失分布式退出信号:
如果发生以下情况,则从父进程到子进程的退出信号会丢失:
- 父进程在创建子进程的 spawn 请求完成之前终止,
- spawn 请求在父进程和子进程之间设置了链接
- spawn 请求是分布式的,并且
- 退出原因大于一个机器字。
在尚未完成的 spawn 请求正在进行时,连接丢失可能会导致退出信号丢失。这种退出信号的丢失非常罕见。除了上述连接丢失之外,还必须满足以下条件:
- 被连接丢失中断的 spawn 请求还必须在父进程和子进程之间设置链接。
- 发出 spawn 请求的父进程在 spawn 请求被连接丢失中断时也必须终止。
- 同一父进程还必须向其他节点而不是连接丢失的节点发出其他 spawn 请求。
- 向其他节点的这些 spawn 请求也必须设置链接。
- 在连接丢失时,向其他节点的这些 spawn 请求也必须尚未完成。也就是说,来自子进程的 spawn 回复尚未到达父进程。
如果满足以上所有条件,则由于上述向其他节点发出的 spawn 请求而产生的子进程的退出信号可能会丢失。
上面的 bug 在触发时还会导致严重的内存泄漏,因为父进程的销毁永远不会完成。
自有 ID:OTP-18164 辅助 ID:PR-6114
竞争可能会导致其他进程上的
process_info(Pid, message_queue_len)
返回无效结果。自有 ID:OTP-18169 辅助 ID:PR-6134
修复了处理进程系统任务的 reduction 计数。
自有 ID:OTP-18170 辅助 ID:PR-6135
终止进程的优先级提升不起作用,这可能会导致此类进程的执行被延迟。
自有 ID:OTP-18175 辅助 ID:PR-6142
在取消链接操作完成之前(即在收到来自链接进程的取消链接-ack 信号之前)终止的进程执行的取消链接操作,会导致从终止进程错误地向被取消链接的进程发送退出信号。此退出信号通常会被接收者忽略,但是,如果退出信号的接收者同时设置了新的链接,则它可能会收到终止进程的实际退出原因的退出信号,而不是
noproc
退出原因。但是,很难检测到这种情况是否发生,也没有明显的负面影响,因此应该认为它是无害的。终止进程接收到的分布式取消链接-ack 信号也没有被正确删除,这可能会导致轻微的内存泄漏。
自有 ID:OTP-18177 辅助 ID:PR-6150
如果目标进程或端口不存在,则
monitor/3
BIF 不会将选项应用于创建的监视器。也就是说,即使设置了自定义标签,相应的 down 消息也会获得一个`DOWN`
标签,并且即使已传递alias
选项,返回的引用也不是别名。自有 ID:OTP-18190 辅助 ID:GH-6185,PR-6209
当传递参数
native
时,erlang:monotonic_time/1
、erlang:system_time/1
、erlang:time_offset/1
和os:system_time/1
BIF 错误地失败。自有 ID:OTP-18197 辅助 ID:GH-6165,PR-6213
Erts 12.3.2.2
修复的错误和故障
修复了在使用选项
ordered_set
和{write_concurrency,true}
生成 ETS 表的崩溃转储时可能发生的模拟器崩溃。自有 ID:OTP-18144 辅助 ID:GH-5981
Erts 12.3.2.1
修复的错误和故障
接受具有错误编码大小字段的 funs (NEW_FUN_EXT)。这是对 OTP 23 和 24 中存在的 bug (OTP-18104) 的一种解决方法,该 bug 可能在某些情况下导致错误的大小字段。模拟器不使用解码的大小字段,但
erl_interface
仍然使用,并且此解决方法没有帮助。自有 ID:OTP-18093 辅助 ID:OTP-18104,PR-5987
运行时系统中内置的 zlib 已更新至 1.2.12 版本。(请注意,在大多数平台上,使用的是平台自己的 zlib。)
自有 ID:OTP-18123 辅助 ID:GH-5994
Erts 12.3.2
修复的错误和故障
让 EPMD 容忍在绑定到 IPv4/IPv6 回环接口时发生故障,以及通过
ERL_EPMD_ADDRESS
或-address
选项提供的用户地址。例如,如果主机系统通过 disable_ipv6 sysctl 禁用了 ipv6,则可能会发生这种情况。自有 Id:OTP-17970 辅助 Id:PR-5762
修复了
binary_to_term/1
、enif_make_map_from_arrays
、erl_drv_send_term
和可能导致模拟器崩溃的 Erlang 分布中的一个罕见错误。自有 Id:OTP-18027
修复了
persistent_term:get/1,2
中可能导致其返回另一个键的值的罕见竞争。自有 Id:OTP-18065 辅助 Id:GH-5908
修复了当进程消息队列从堆上数据更改为堆外消息队列数据时,进程消息队列处于不一致状态的错误,导致 GC 段错误。
自有 Id:OTP-18075 辅助 Id:PR-5927
修复了将通用时间转换为本地时间(例如 erlang:localtime/0 和 erlang:universaltime_to_localtime/1)的函数,以在 VM 启动后更改时获取正确的本地时间。
自有 Id:OTP-18076 辅助 Id:ERIERL-802 PR-5905
修复了当执行分布式分段发送的进程被发送退出信号时的内存泄漏。在此修复之前,接收节点将留下一个不完整的消息,该消息将保留到节点断开连接为止。该错误自 Erlang/OTP 21 起就已存在。
自有 Id:OTP-18077 辅助 Id:GH-5876 PR-5892
修正了使用 inet_backend = socket 时的关闭函数的行为。它与“旧”的 gen_tcp 不够兼容。
自有 Id:OTP-18080 辅助 Id:GH-5930
Erts 12.3.1
修复的错误和故障
在 Windows 上修复了
erlang:open_port({spawn, _},_)
,以正确处理路径中的空格字符。例如,这可能会导致解析器辅助程序
inet_gethost
的执行失败,并可能执行不同的程序。自有 Id:OTP-17978 辅助 Id:OTP-17958
修复了创建崩溃转储时可能导致多个线程在写入崩溃转储中的初始信息时发生竞争的竞争条件。
该竞争条件是在 erts-12.2 (Erlang/OTP 24.2) 中引入的。
自有 Id:OTP-17993 辅助 Id:PR-5806
修复了 MacOS 上的 Erlang 单调时间。以前在 MacOS 上使用的 OS 单调时间原语存在错误,将不再使用。它已被替换为使用另一个似乎没有错误的 OS 单调时间原语。
自有 Id:OTP-17998 辅助 Id:PR-5825, GH-5554
Erts 12.3
修复的错误和故障
修复了 x86 JIT 中的一个错误,该错误可能导致浮点指令错误地抛出异常。
自有 Id:OTP-17822
如果受监督的分布式控制器进程以
{shutdown, Reason}
退出,则保留正确的nodedown_reason
。自有 Id:OTP-17838 辅助 Id:PR-5748
修正了
gen_tcp
的send_timeout
的处理,以便在发送 0 个字节时也遵循超时。自有 Id:OTP-17840
默认情况下,当由于网络问题导致连接丢失时,
global
*不会*采取任何操作来恢复完全连接的网络。这对于期望提供完全连接网络的所有应用程序(例如mnesia
),以及对于global
本身都是有问题的。重叠分区的网络可能会导致global
的内部状态变得不一致。即使在将这些分区重新组合以形成完全连接的网络之后,这种不一致也可能仍然存在。对其他期望维护完全连接的网络的应用程序的影响可能会有所不同,但它们可能会在这样的分区期间以非常微妙的难以检测的方式出现故障。为了防止此类问题,我们引入了一个*防止重叠分区*的修复,可以使用
prevent_overlapping_partitions
kernel(6)
参数启用。启用此修复后,global
将主动断开与报告已丢失与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是将网络保持在具有重叠分区的状态。请注意,此修复程序*必须*在网络中的*所有*节点上启用才能正常工作。由于这会相当大地改变行为,因此此修复程序当前默认禁用。由于您可能会在没有此修复程序的情况下遇到难以检测的问题,因此*强烈*建议您启用此修复程序,以避免出现上述问题。从 OTP 25 开始,此修复程序将默认启用。自有 ID:OTP-17843 辅助 ID:ERIERL-732, PR-5611
更正了
erlang:seq_trace/2
的类型规范。自有 ID:OTP-17900 辅助 ID:GH-5667
修复了在仅处理系统任务或非消息信号(例如 process_info 请求)的进程上进行跟踪时出现的内存泄漏问题。
自有 ID:OTP-17904 辅助 ID:ERIERL-757
改进和新功能
添加了在使用 gen_sctp、gen_tcp 和 gen_udp 时使用 socket:sockaddr_in() 和 socket:sockaddr_in6() 的支持。这将使其可以使用链路本地 IPv6 地址。
自有 ID:OTP-17455 辅助 ID:GH-4852
在嵌入模式下显示
on_load
失败原因。自有 ID:OTP-17718 辅助 ID:PR-5199
已删除 Erlang VM 可执行文件中保存的编译日期。
自有 ID:OTP-17891 辅助 ID:PR-5589
改进了动态节点名称功能的文档。
自有 ID:OTP-17918
Erts 12.2.1
修复的错误和故障
修复了 Windows 上
file:read_file_info/2
和file:read_file/1
中的内存泄漏问题。自有 ID:OTP-17827 辅助 ID:GH-5527
修复了在启用消息跟踪时使用
spawn_request
时发生的 GC 模拟器崩溃问题。自有 ID:OTP-17871 辅助 ID:PR-5612
Erts 12.2
修复的错误和故障
在二进制语法中匹配和构造
utf16
段时,native
标志会被忽略。也就是说,即使在小端计算机(几乎所有现代计算机)上,字节序也始终是大端。自有 ID:OTP-17713
修复了
+JPperf
的帮助输出。自有 ID:OTP-17749 辅助 ID:PR-5378 GH-5361
修复了可能导致 Erlang 在创建 Erlang 崩溃转储期间死锁的错误。
自有 ID:OTP-17751 辅助 ID:PR-5315
修复了某些 aarch64 平台上的 C++ 构建错误。
自有 ID:OTP-17763 辅助 ID:GH-5351
对于 macOS,嵌入到运行时系统中的
Info.plist
文件现在仅包含wx
中 Web 视图向localhost
工作所需的绝对最少量的信息。其他字段已删除,允许以捆绑包形式打包的应用程序在其自己的Info.plist
文件中指定应用程序名称和其他参数。自有 ID:OTP-17785 辅助 ID:PR-5393
修复了
term_to_binary/2
用来编码项的内部堆栈(WSTACK 和 ESTACK)中的错误。如果使用给定的deterministic
选项编码一个非常大的 map,则该错误可能会导致段错误。自有 ID:OTP-17804 辅助 ID:PR-5372
改进了由于无效参数导致
open_port/2
失败时的错误输出。自有 ID:OTP-17805 辅助 ID:PR-5406
修复了崩溃转储中进程堆栈帧使用不正确格式打印的错误。
崩溃转储查看器也已修复,能够读取损坏的堆栈格式。
该错误自 Erlang/OTP 23.0 起就存在。
自有 ID:OTP-17814 辅助 ID:PR-5462
改进和新功能
引入了一个用于启用脏调度器特定分配器实例的选项。默认情况下,此类分配器实例被禁用。有关更多信息,请参见
+Mdai
erl
命令行参数的文档。自有 ID:OTP-17363 辅助 ID:GH-4728, PR-5187
对消息队列中的接收标记进行了小优化。
自有 ID:OTP-17673 辅助 ID:OTP-16226
所有预定义类型都已添加到
erlang
模块,并附带文档。现在,对预定义类型的任何引用都会链接到该文档,以便用户可以查看它。
自有 ID:OTP-17689 辅助 ID:PR-5292
抑制了 YCF 调试版本引起的代码检查器警告。YCF 尝试通过读取和返回已分配的调用堆栈变量来保守地估计堆栈底部。
自有 ID:OTP-17719
将文件和产品属性添加到 erl.exe 和 werl.exe。
自有 ID:OTP-17724 辅助 ID:ERL-1224
位字符串追加操作中的微优化。
自有 ID:OTP-17760 辅助 ID:ERIERL-725, PR-5414
在具有大量进程的系统上,由于代码清除或字面量区域删除,以
normal
或low
优先级执行的进程的响应能力可能会受到影响。这是因为在这些操作期间,系统上的所有进程都会被同时安排执行。通过限制系统中未完成的清除和复制字面量请求,此问题已得到修复。默认情况下,此限制设置为系统上调度器数量的两倍。这将确保调度器有足够的工作被调度,以便尽可能快地执行这些操作,同时其他工作将被更高程度地交错执行。但是,由于强制执行此限制的开销,与使用非常大的限制相比,这些操作的性能将有所降低。
可以通过将
+zosrl
命令行参数传递给erl
,或调用erlang:system_flag(outstanding_system_requests_limit, NewLimit)
来设置此限制。自有 ID:OTP-17796 辅助 ID:ERIERL-729, PR-5473
Erts 12.1.5
修复的错误和故障
在 MacOS 上执行时,运行时系统可能会使用过大的超时值调用
select()
。这反过来可能会导致运行时系统崩溃。自有 ID:OTP-17735 辅助 ID:GH-5339
在 OTP-24.1.2 中发布的 PR-5120 中,针对 Linux 重新连接 UDP 套接字的行为的修复已得到改进,仅当套接字已连接时才会在连接之前断开套接字的连接,即:仅用于重新连接。
这允许代码打开一个具有临时端口的套接字,获取端口号并连接;而端口号不会改变(在 Linux 上)。事实证明,这至少有一个有效的用例(除了测试用例)。
如果重新连接套接字,则端口号可能会更改(在 Linux 上);这是一个已知的怪癖,可以通过在打开套接字时绑定到特定的端口号来解决。如果您可以不用临时端口,那就更好了...
自有 ID:OTP-17736 辅助 ID:GH-5279, PR-5120, OTP-17559
某些由于各种原因必须强制进入分发缓冲区的分布式信号,如果发送时分发缓冲区已满,则会被丢失。受影响的信号包括
- 退出原因为一个字大小的
EXIT
信号。 - 退出原因为一个字大小的
DOWN
信号。 - 来自终止进程的
demonitor
信号。 - 在 OTP 23 和 24 上的
unlink_ack
信号。 - 在 OTP 23 和 24 上的
spawn_reply
信号。
自有 ID:OTP-17737 辅助 ID:GH-5346, GH-4989
- 退出原因为一个字大小的
Erts 12.1.4
修复的错误和故障
修复了在 delayed_send 期间发生的 gen_tcp 写入错误会导致使用后释放段错误的问题。
自有 ID:OTP-17731 辅助 ID:PR-5285
修复了 x86 JIT 错误,如果给定会导致 badarith 异常的值,
rem
指令可能会导致段错误。自有 ID:OTP-17732 辅助 ID:PR-5331 ERIERL-664
Erts 12.1.3
修复的错误和故障
在启用 jit 的运行时系统上执行
apply
操作之前和之后,未更新缩减计数器。如果垃圾回收是作为apply
操作的一部分进行的,则会导致缩减计数不同步。自有 ID:OTP-17675
这修复了
erts_factory_undo
中的一个错误,该错误导致堆无法正确重置。erts_factory_undo
函数在binary_to_term/1
调用失败时调用,例如,将堆重置为调用binary_to_term/1
之前的状态。这可能会导致堆包含无效的项,当扫描整个堆时可能会导致问题(例如,崩溃)。自有 ID:OTP-17677
当尝试使用大小具有非法类型(例如原子)的段构造二进制文件时,在操作失败之前可能会进行不必要的内存分配(以及随后的释放)。修改为在为二进制文件分配任何内存之前就失败。
自有 ID:OTP-17686
修复了当键值对包含被多次引用的魔术引用时,
persistent_term
中的错误。魔术引用是 NIF 资源或从 BIF 返回的资源,例如ets:new
、atomics:new
。该错误可能会导致过早释放所引用资源的内存。该错误也适用于在具有配置选项
--enable-sharing-preserving
的运行时上进行消息传递的魔术引用。该错误自 OTP-24.0 起存在于 64 位系统中,自 OTP-20.0 起存在于 32 位系统中。
自有 ID:OTP-17700 辅助 ID:GH-5271, PR-5273
修复了当检查在非常高的行号引发的异常的堆栈跟踪时发生的崩溃。
此错误是在 OTP 24 中引入的。
自有 ID:OTP-17712
以下两个导致
erlang:demonitor()
行为错误的错误已修复。仅当使用demonitor()
删除的监视器先前同时创建为监视器和别名时,才会触发这些错误。- 对使用
{alias, reply_demonitor}
选项创建的监视器执行的 demonitor 操作错误地表现为使用了{alias, explicit_unalias}
选项。 - 如果监控引用在操作后保持为活动别名,则取消监控操作不会阻止传递相应的
'DOWN'
消息。只有在被监控进程在取消监控信号到达之前同时终止,并且退出原因不是立即项(即,大于一个机器字)时,才会发生这种情况。
内部 ID:OTP-17722 辅助 ID:GH-5310,PR-5313
- 对使用
Erts 12.1.2
改进和新功能
erts/lib_src/yielding_c_fun/lib/tiny_regex_c/scripts 中存在的 Python 脚本的许可证与 Erlang/OTP 的许可证不兼容。此票据删除了我们未使用的这些脚本。
内部 ID:OTP-17658
Erts 12.1.1
已修复的错误和故障
退出端口与同时接收到该端口的信号的处理之间的竞争可能导致运行时系统崩溃。受影响的信号是
link
、monitor
和demonitor
。在 OTP 22 上,当接收到unlink
信号时,类似的竞争也可能导致内存泄漏。内部 ID:OTP-17642 辅助 ID:PR-5248
监控消息上的用户定义标签可能导致在收到监控消息时运行时系统崩溃。
内部 ID:OTP-17646 辅助 ID:GH-5221,PR-5232
调用
erlang:demonitor(Ref)
,其中引用Ref
指的是活动别名,而不是活动监控器,会导致运行时系统崩溃。内部 ID:OTP-17647 辅助 ID:GH-5225,PR-5230
在执行带有无效超时值的
receive
表达式后,进程的消息队列进入不一致状态。如果由于无效超时值而引发的异常被捕获,则该进程执行的以下receive
表达式可能无法匹配消息队列中已存在的消息。在 OTP 24 上,这也可能导致整个运行时系统崩溃。
内部 ID:OTP-17651 辅助 ID:GH-5235,PR-5244
从端口所有者以外的进程发送
Port ! {PortOwner, close}
信号,可能会错误地触发将badsig
退出信号发送到端口所有者进程,即使信号中传递了正确的PortOwner
。内部 ID:OTP-17665 辅助 ID:PR-5248
Erts 12.1
已修复的错误和故障
Unicode 代码点大于 255(例如希腊语或西里尔字符)的原子不会被
crashdump_viewer
正确显示。内部 ID:OTP-17377
修复与 jit 代码加载相关的罕见的小内存泄漏。
内部 ID:OTP-17445 辅助 ID:PR-4843
以下 BIF 的扩展错误信息已得到纠正和改进:
binary_to_existing_atom/2
、list_to_existing_atom/1
、erlang:send_after/{3,4}
和erlang:start_timer/{3,4}
。内部 ID:OTP-17449 辅助 ID:GH-4900
修复了使用 gcc 10 和链接时优化 (-flto) 构建时引发的错误,导致 Erlang 编译器崩溃。该错误自 OTP-24.0 起存在。
内部 ID:OTP-17477 辅助 ID:GH-4846,PR-4894
修复了即使给出
deterministic
选项,构建也不可减少的错误。特别是,具有超过 32 个元素的映射文字的模块可能会导致此问题。作为此修复的一部分,
term_to_binary
BIF 现在接受deterministic
选项。内部 ID:OTP-17495 辅助 ID:PR-5153
在进程中捕获异常后,堆栈跟踪在进程中保留的时间过长。
内部 ID:OTP-17512
修复了分布条目的内存管理中罕见的竞争错误。当大量重复的并发连接尝试失败时,已被观察到会导致 VM 崩溃。
内部 ID:OTP-17513 辅助 ID:GH-4964,PR-5015
--disable-esock-socket-registry
的配置测试已得到纠正,因此禁用现在有效。内部 ID:OTP-17539
init:stop()
不再在终止运行时系统之前卸载已加载的代码。在 CPU 速度较慢的系统(如 Raspberry PI Zero)上,这可以显著加快运行时系统的终止速度。内部 ID:OTP-17542 辅助 ID:GH-5031,PR-5032
修复了在 guard 或 body 中使用映射的匹配规范,使其可以正常工作。
通过此修复,映射中的键和值都可以是表达式。
还修复了在匹配规范中使用映射时的各种其他崩溃和错误。
内部 ID:OTP-17567 辅助 ID:PR-4915 PR-5115
本机 DNS 解析器中结果值的解析已针对不正确的结果进行了更具防御性的处理。
内部 ID:OTP-17578 辅助 ID:ERIERL-683
当
binary_to_term/2
失败时,即使实际错误在第一个参数中,扩展错误信息也会始终将责任归咎于第二个参数。内部 ID:OTP-17591 辅助 ID:GH-5171
在 32 位计算机上,
binary_to_term/1,2
现在更能抵抗包含外部格式映射的损坏二进制文件。内部 ID:OTP-17604
当调用进程以高于被检查进程的优先级执行时,调用
process_info(Pid, status)
可能会错误地报告状态running
,而它应该报告waiting
。此错误自 OTP 21.0 (erts version 10.0) 起就存在。内部 ID:OTP-17628
改进和新功能
通过在长时间不活动后休眠它们,优化代码加载/清除期间使用的 erts 内部进程的内存使用情况。
内部 ID:OTP-17426 辅助 ID:PR-4785
添加类型
erlang:stacktrace/0
。内部 ID:OTP-17453 辅助 ID:PR-4764
error/2,3
的 arity 参数现在可以是none
,以指示应使用调用函数的 arity。内部 ID:OTP-17456 辅助 ID:PR-4764
针对立即(单字)常量项优化匹配规范编译器。
内部 ID:OTP-17469
添加了函数
erlang:set_cookie(Cookie)
和erlang:get_cookie(Node)
,以完善功能并方便使用不同的 cookie 配置分布式节点。关于分布式 cookie 的文档已得到改进,不再那么模糊。
内部 ID:OTP-17538 辅助 ID:GH-5063,PR-5111
针对 Linux 连接已连接(重新连接)UDP 套接字时不会调整源 IP 地址的奇怪行为,实现了一种解决方法。
解决方法是,在 Linux 上,始终在连接 UDP 套接字之前解除任何连接。
内部 ID:OTP-17559 辅助 ID:GH-5092,PR-5120
关于如何使用 Yielding C Fun (YCF) 的内部文档已更新,其中包含关于为 ERTS 使用 YCF 的最佳实践的文本。
内部 ID:OTP-17596
优化具有大量二进制文件、fun 和/或外部 pid/端口/引用的进程的垃圾回收。
内部 ID:OTP-17602 辅助 ID:PR-5149
Erts 12.0.4
已修复的错误和故障
由于 OTP 24.0 中引入新的选择性接收优化时引入的错误,对
process_info()
BIF 的调用可能最终会永远挂起。请注意,此错误仅影响process_info()
。内部 ID:OTP-17548 辅助 ID:PR-5078,OTP-10391
修复了 tty 驱动程序中的缓冲区溢出问题。当使用 newshell 的 CTRL+R 功能,并且历史记录中有很长的字符串时,在某些平台上会出现此问题。
内部 ID:OTP-17560 辅助 ID:GH-5116
修复了在脏调度程序上运行的进程上跟踪调度或垃圾回收时可能导致崩溃的竞争条件。
内部 ID:OTP-17568 辅助 ID:PR-4940
修复了当给定子二进制作为主题时,re:run 会崩溃/返回无效结果的罕见错误。
此错误自 Erlang/OTP 20.0 起就存在。
内部 ID:OTP-17585 辅助 ID:GH-5150
binary_to_term/1,2
现在更能抵抗包含外部格式映射的损坏二进制文件。内部 ID:OTP-17594
Erts 12.0.3
已修复的错误和故障
调用
erlang:cancel_timer(_, [{info, false}])
可能导致调用进程在调用中永久阻塞。请注意,只有调用的同步版本(即async
选项为false
)与设置为false
的info
选项组合才会受此错误影响。内部 ID:OTP-17472 辅助 ID:PR-4932
微状态核算 (msacc) 和
os:perf_counter()
在许多系统上意外地使用了系统时间而不是单调时间进行时间测量。这些系统都是非 x86/x86_64 系统或没有可靠且恒定的 rdtsc 指令的 x86/x86_64 系统。锁定计数 (lcnt) 构建的运行时系统也意外地在所有系统上使用了系统时间而不是单调时间进行时间测量。
内部 ID:OTP-17493
同时调用
erlang:system_flag(schedulers_online, _)
可能会导致调用者永久处于挂起状态。自身 ID: OTP-17500 辅助 ID: GH-4809
Erts 12.0.2
已修复的错误和故障
在执行垃圾回收时,信号队列中尚未处理的别名消息信号可能会导致内存损坏,进而导致运行时系统崩溃。此错误是在 OTP 24.0 中引入的。
自身 ID: OTP-17431 辅助 ID: GH-4858, PR-4870, OTP-16718
修复了在大映射(> 32)的键中使用外部 pid/端口时的错误。可能会导致运行时崩溃。该错误自 OTP 24.0 起存在。
自身 ID: OTP-17436 辅助 ID: PR-4875
在使用
init:restart/0,1
重启节点后,模块socket
不可用,因为支持表已被清除且未重新初始化。现在已修复此问题。将“.”域作为搜索域的处理不正确,导致 DNS 解析器
inet_res
崩溃,现在已修复。自身 ID: OTP-17439 辅助 ID: GH-4827, PR-4888, GH-4838
如果端口繁忙且调用进程在调用时有传入信号,则调用
port_command()
可能会导致调度程序进入无限循环。此错误是在 OTP 23.3.2(ERTS 版本 11.2.1)、OTP 22.3.4.18(ERTS 版本 10.7.2.10)和 OTP 21.3.8.23(ERTS 版本 10.3.5.18)中引入的。自身 ID: OTP-17448 辅助 ID: GH-4898, PR-4903, OTP-17291
对新的
socket
实现进行错误修复和代码清理,例如在适当的情况下,在 NIF 代码中添加了对取消监控结果的断言。
审查了 NIF 代码中套接字关闭的内部状态处理。
删除了 NIF 代码中对
EINTR
进行close()
的循环,因为在 Linux 上强烈不建议这样做,并且 Posix 对其是否允许也不明确。记录了旧版
gen_tcp
套接字的inet_backend
临时套接字选项。更正了
net:getaddrinfo/2
的返回值:protocol
字段现在是atom/0
,而不是错误地list(atom())
。文档也已更正,以反映此返回类型。延迟关闭
socket:sendfile/*
文件已损坏,现已更正。已更正套接字 NIF 中一些默认情况下未启用的调试代码,以避免因调试打印或多或少的无害事件而意外发生核心转储。
自身 ID: OTP-17452
进程的脏执行与来自端口到该进程的取消链接信号结合使用,可能会导致该进程的信号队列进入不一致状态。不一致的结果通常会导致运行时系统崩溃。此错误是在 OTP 23.3(ERTS 版本 11.2)中引入的。
自身 ID: OTP-17462 辅助 ID: GH-4885, PR-4914, OTP-17127
Erts 12.0.1
已修复的错误和故障
提交生成的
configure
脚本。自身 ID: OTP-17420 辅助 ID: OTP-17398, GH-4821
Erts 12.0
已修复的错误和故障
现在,当使用
ram
和raw
选项打开时,file:open/2
会引发 badarg 错误。自身 ID: OTP-16822 辅助 ID: PR-2723
已更新 estone 基准测试,以更好地反映编译器和运行时系统中的更改。
自身 ID: OTP-16879
修复了在使用 GCC 7 或更高版本时运行时系统的配置文件引导优化。
自身 ID: OTP-16880
修复了创建崩溃转储时 fd 的双重关闭。
自身 ID: OTP-16884
改进了无法打开包含的
args_file
时erl
的错误消息。自身 ID: OTP-17014
从文档中删除有关
--
操作的警告文本--
操作已在 Erlang/OTP 22 中进行了优化,使其最坏情况的复杂度为 O(N*log(N)),其中 N 是输入列表的总大小。因此,文档中说时间复杂度与 length(A)*length(B) 成正比的警告是不正确的,不再需要。请注意,当 Erlang/OTP 24 发布时,将不再支持 Erlang/OTP 21。自身 ID: OTP-17020
浮点零 (0.0) 可以是正数 (+0.0) 和负数 (-0.0)。已修复编译器、运行时系统和 STDLIB 中的多个错误,以确保 0.0 上的负号不会丢失。
自身 ID: OTP-17077 辅助 ID: ERL-1431, PR-2903, PR-2905, PR-2906
修复了 clang 编译器产生的编译器警告。
自身 ID: OTP-17105 辅助 ID: PR-2872
如果 Windows 进程
erl.exe
的服务进程erlsrv.exe
终止,则该进程将被杀死。自身 ID: OTP-17131 辅助 ID: PR-3031, GH-4360
如果无法启用请求的功能,则
crypto
和erts
中的configure
脚本现在会失败。已重写
crypto
的configure
脚本的大部分内容,并进行了各种改进和错误修复。现在,它可以更好地找到可用的 OpenSSL 库,但在以下情况下,它将无法检测到 OpenSSL 库,而在以前,它有时会偶然检测到这些库- OpenSSL 安装的
include
目录和lib
目录部分安装在不同的基本目录中。为了在此更改后检测到此类安装,用户必须使用--with-ssl=<path>
和--with-ssl-incl=<path>
configure
命令行参数显式指定位置。 - 当在
lib
目录下使用旧的gcc
编译器或其他编译器在带有 multiarch 目录的 Debian 衍生产品上进行构建时。为了在此更改后检测到此类安装,用户必须使用--with-ssl-lib-subdir=lib/<multiarch-dir>
configure
命令行参数显式指定 multiarch 目录名称。
自身 ID: OTP-17254 辅助 ID: ERIERL-618, GH-4230
- OpenSSL 安装的
erl
命令行参数+Bi
、+Bd
和+B
错误地导致接收USR1
信号而终止运行时系统,并且不创建崩溃转储。现在,无论传递什么命令行参数,接收到USR1
信号总是会导致终止并创建崩溃转储。此错误至少自 OTP R5B 起就存在。* 潜在的不兼容性 *
自身 ID: OTP-17275 辅助 ID: PR-4553
添加检查以确保当向
erl
传递一个需要参数的选项但没有给出任何参数时,我们会报告一个错误。这修复了在 OTP-22.1 中通过 OTP-15926 引入的错误。自身 ID: OTP-17314 辅助 ID: OTP-15926, GH-4624, PR-
已更新崩溃转储中的“最后调用”部分,以便在每个非函数
save_calls
状态(发送、接收、超时)后打印换行符。自身 ID: OTP-17329 辅助 ID: PR-4730
使用 socket:accept 创建的套接字未被计数 (socket:info/0)。
自身 ID: OTP-17372
改进和新功能
实验性
socket
模块现在可以使用操作系统支持的任何协议(按名称)。在 PR-2641 中建议,在 PR-2670 中实现。自身 ID: OTP-14601 辅助 ID: PR-2641, PR-2670, OTP-16749
新函数
enif_dynamic_resource_call
使 NIF 能够在另一个 NIF 模块中调用本机代码。此调用通过用户使用新的enif_init_resource_type
提供的资源回调函数dyncall
完成。自身 ID: OTP-14753
对新的改进的选择性接收优化提供运行时支持。
自身 ID: OTP-16226 辅助 ID: OTP-10391
已删除已弃用的函数
erlang:get_stacktrace/0
。使用 try/catch 中的新语法来检索堆栈回溯。自身 ID: OTP-16653
已删除对 OTP R15 之前创建的抽象代码的处理支持。
自身 ID: OTP-16678 辅助 ID: PR-2627
已实现 EEP 54 中提出的失败 BIF 调用的扩展错误信息。
当 Erlang shell 中的 BIF 调用失败时,将打印有关哪个或哪些参数出错的更多信息。当 BIF 调用失败时,
proc_lib
、common_test
和qlc
将使用相同的扩展错误信息。对于希望提供相同扩展错误信息的应用程序,有新函数
erl_error:format_exception/3
和erl_error:format_exception/4
。有一个新的
error/3
BIF,允许应用程序或库以相同的方式为自己的异常提供扩展错误信息。自身 ID: OTP-16686
已更新
erlang
模块文档,以提高清晰度和对边缘情况的描述。自身 ID: OTP-16687 辅助 ID: PR-2996 PR-2762
已引入使用分布式进程通过 UDS 实现 Erlang 分布的示例。
感谢 Jérôme de Bretagne
自身 ID: OTP-16703 辅助 ID: PR-2620
通过添加不进行 GC 并允许更好的寄存器分配的新 beam 指令 make_fun3,改进了创建 funs 时的代码生成。
自身 ID: OTP-16712
已引入 进程别名 功能,如 EEP 53 中所述。引入它的目的是为了提供一种轻量级机制,可以防止超时或连接丢失后出现延迟回复。有关更多信息,请参见 EEP 53 以及新
alias/1
BIF 和monitor/3
BIF 的新选项的文档。已更新
gen_server
、gen_statem
和gen_event
使用的框架中的call
操作,以利用别名来防止延迟响应。gen_statem
行为在分布式情况下仍使用代理进程,因为它始终防止延迟回复,并且别名无法针对 OTP 24 之前的节点工作。代理进程可以在 OTP 26 中删除。别名功能还使得引入类似于 gen 行为中
erpc:receive_response()
函数的新函数成为可能,因此还引入了新函数gen_server:receive_response()
、gen_statem:receive_response()
和gen_event:receive_response()
。自身 ID: OTP-16718 辅助 ID: PR-2735
接受来自外部节点的 64 位进程标识符。这是在将来的 OTP 版本中使用 64 位 pid 的升级路径的第一步。
自身 ID: OTP-16720 辅助 ID: PR-2680
实验性的新套接字 API 已得到进一步开发。与 OTP 23 相比,进行了一些向后不兼容的更改。
控制消息格式已更改,因此解码后的值现在位于“value”字段中,而不是位于“data”字段中。“data”字段现在始终包含二进制数据。
关于消息头和控制消息头,一些类型名称已更改。
socket:bind/2
现在返回纯ok
,而不是{ok, Port}
,后者仅与inet
和inet6
地址族相关,而且通常不重要。要找出选择了哪个端口,请使用socket:sockname/1
。* 潜在的不兼容性 *
自有 Id:OTP-16749 辅助 Id:OTP-14601
删除旧的未使用的
+MYm
和ERL_MALLOC_LIB
选项。自有 Id:OTP-16788
提高 Windows 上的计时器分辨率。
自有 Id:OTP-16814 辅助 Id:PR-2704
代码加载器已重写,以便能够加载 JIT 编译的代码。因此,不再可能加载 HiPE 代码。
* 潜在的不兼容性 *
自有 Id:OTP-16878
在 Erlang/OTP 构建系统中添加了对生成编译数据库的支持,该数据库可供第三方工具(例如 Emacs 中的 irony)用来编译 erts C 和 C++ 源代码。使用
make compdb
创建数据库。自有 Id:OTP-16881
BeamAsm JIT 编译器已添加到 Erlang/OTP。默认情况下,在大多数具有可以编译 C++17 的 C++ 编译器的 x86 64 位平台上启用 JIT 编译器。要验证是否正在运行启用了 JIT 的模拟器,可以使用
erlang:system_info(emu_flavor)
。有关详细信息,请参阅 erts 中 BeamAsm 的内部文档。
自有 Id:OTP-16885 辅助 Id:PR-2745
默认情况下,所有基于
alloc_util
的 ERTS 内部内存分配器现在都将使用它们自己单独的载体池进行载体迁移,而不是使用节点全局载体池。这是 OTP 17 和 OTP 21 之间的默认行为,但在 OTP 22.0 中更改为使用节点全局载体池。使用节点全局载体池被证明是有问题的,因为它往往会将长期存在的块分散到通常具有短期块的分配器中,从而导致内存碎片增加。可以使用+M<S>cp
命令行参数配置节点全局载体池行为以及其他行为。自有 Id:OTP-16898 辅助 Id:OTP-16856
maps
模块中添加了新函数:merge_with/3
、intersect/2
、intersect_with/3
、filtermap/2
、from_keys/2
和maps:foreach/2
。maps:merge_with/3
与merge/2
相同,但接受一个额外的 fun,用于组合具有相同键的项。maps:intersect/2
计算两个映射的交集。maps:intersect_with/3
与intersect/2
相同,但接受一个额外的 fun,用于组合相交的项。maps:filtermap/2
允许在一次遍历中过滤和映射映射。maps:from_keys/2
从键列表和单个值构造映射,可用于优化集合操作,例如 from_list/1、filter/2、intersection/2 和 subtract/2。maps:foreach/2
允许在不返回任何值的情况下遍历映射。自有 Id:OTP-16936 辅助 Id:ERL-1367
更改
escript
,使其将任何错误或警告输出到标准错误,而不是标准输出。* 潜在的不兼容性 *
自有 Id:OTP-16945
添加了一个新的 erl 参数,用于指定具有配置数据的文件描述符。这使得在执行 erl 命令时可以传递参数“-configfd FD”。如果给定了此选项,系统将尝试从文件描述符读取和解析配置参数。
自有 Id:OTP-16952
实验性的 HiPE 应用程序已删除,同时删除了其他应用程序中的所有相关功能。
* 潜在的不兼容性 *
自有 Id:OTP-16963
浮点数的漂亮打印机已更改,以便更容易查看数字的整数部分是否已舍入。更改后,可能已舍入的数字始终出现在最后或紧靠指数字符(e 或 E)之前。这是通过在数字太大以至于整数部分可能被舍入时始终使用科学计数法打印数字来实现的。
自有 Id:OTP-16980 辅助 Id:ERL-1308
如果当前节点上尚未启动分布,
erlang:monitor_node/2
BIF 现在将失败并显示notalive
异常;以前会失败并显示badarg
异常。* 潜在的不兼容性 *
自有 Id:OTP-16987
接受来自远程节点的最大大小为 160 位的引用。这是在未来 OTP 版本中使用最大 160 位引用的升级路径中的第一步。
自有 Id:OTP-17005 辅助 Id:OTP-16718
接受来自外部节点的 64 位端口标识符。这是在未来 OTP 版本中使用 64 位端口标识符的升级路径中的第一步。
自有 Id:OTP-17007
现在可以将 ERL_ROOTDIR 环境变量传递给 erl 和 start scrips。这使得在 Android 应用程序中使用 Erlang 更加容易。在 Android 上,应用程序无法控制它们的安装位置。
自有 Id:OTP-17028
maps API 中的所有长时间运行的函数现在都会屈服。在之前的版本中,函数
maps:from_list/1
、maps:keys/1
和maps:values/1
不会屈服。这可能会导致进程调度不公平。自有 Id:OTP-17057
已为支持底层套接字库调用的平台实现了
socket:sendfile/2,3,4,5
。自有 Id:OTP-17154 辅助 Id:OTP-16749
位匹配和构造语法现在支持 16 位浮点数 (IEEE 754-2008)。
自有 Id:OTP-17207
添加
process_flag(fullsweep_after, N)
以更改已生成的进程中的fullsweep_after
值。自有 Id:OTP-17285 辅助 Id:PR-4651
max_heap_size
错误报告已更新,以包含消息队列大小。自有 Id:OTP-17293 辅助 Id:PR-4672
引入了新类型
nonempty_binary/0
和nonempty_bitstring/0
。自有 Id:OTP-17301 辅助 Id:GH-4636
优化具有相同键和值的大映射的更新。例如,在下面的示例中,原始
Map
将被重用作为第二次更新的返回。1> Map = LargeMap#{ a => b }.
2> Map#{ a := b }.
在 erts-10.4 (OTP 22.0) 中对小型映射(< 33 个键)进行了相同的优化。
自有 Id:OTP-17310 辅助 Id:PR-4656
先前未记录的内部
-no_epmd
选项已记录在案并公开。自有 Id:OTP-17341 辅助 Id:PR-2945
减少 64 位架构上的内存载体超级对齐。实际上,允许更精细地控制内存载体大小的配置,从 256kb 的增量到 16kb 的增量。
自有 Id:OTP-17368
Erts 11.2.2.18
已修复的错误和故障
修复了负代码点的
list_to_atom/1
。可能会返回一个正代码点或因错误异常而失败。自有 ID:OTP-18321
一个极少触发的竞态条件可能导致进程的信号队列变得不一致,从而导致运行时系统崩溃。
自有 ID:OTP-18388 辅助 ID:OTP-17462,PR-6662
当
Pid /= self()
时,process_info(Pid, status)
可能会返回错误的结果。自有 ID:OTP-18421 辅助 ID:PR-6806
在极少数情况下,当进程超出选项
max_heap_size
设置的允许堆大小时,它不会像应该的那样被终止,而是进入一种永远无法退出的僵尸状态。自有 ID:OTP-18463 辅助 ID:PR-6858
call()
驱动程序回调的实现如果返回错误的编码结果,可能会导致内存泄漏,并可能导致调用erlang:port_call/3
的进程堆上出现无效数据。自有 ID: OTP-18525 辅助 ID: PR-7049
如果启动分布的运行时系统已经有引用具有相同节点名/创建对的节点的现有 pid、端口或引用,则在节点启动后,这些已经存在的 pid、端口或引用在各种情况下将无法按预期工作。只有在运行时系统在分布启动之前收到此类 pid、端口或引用时才会发生这种情况。也就是说,除非分布是动态启动的,否则这种情况极不可能发生,即使这样也很少发生。运行时系统现在会检查是否已经存在具有它将要使用的相同节点名/创建对的 pid、端口和引用。如果找到这样的,将选择另一个创建,以避免这些问题。
自有 ID: OTP-18570 辅助 ID: PR-7190
Erts 11.2.2.17
已修复的错误和故障
发送给分布控制器进程的有关可用分布数据的通知可能会丢失。在实现备用分布载体时可以使用分布控制器进程。通过 TCP 的默认分布不受影响,并且该错误也不存在于 x86/x86_64 平台上。
自有 ID:OTP-18258 辅助 ID:GH-6309,PR-6324
Erts 11.2.2.16
已修复的错误和故障
在以下情况下,可能会丢失分布式退出信号:
如果发生以下情况,则从父进程到子进程的退出信号会丢失:
- 父进程在创建子进程的 spawn 请求完成之前终止,
- spawn 请求在父进程和子进程之间设置了链接
- spawn 请求是分布式的,并且
- 退出原因大于一个机器字。
在尚未完成的 spawn 请求正在进行时,连接丢失可能会导致退出信号丢失。这种退出信号的丢失非常罕见。除了上述连接丢失之外,还必须满足以下条件:
- 被连接丢失中断的 spawn 请求还必须在父进程和子进程之间设置链接。
- 发出 spawn 请求的父进程在 spawn 请求被连接丢失中断时也必须终止。
- 同一父进程还必须向其他节点而不是连接丢失的节点发出其他 spawn 请求。
- 向其他节点的这些 spawn 请求也必须设置链接。
- 在连接丢失时,向其他节点的这些 spawn 请求也必须尚未完成。也就是说,来自子进程的 spawn 回复尚未到达父进程。
如果满足以上所有条件,则由于上述向其他节点发出的 spawn 请求而产生的子进程的退出信号可能会丢失。
上面的 bug 在触发时还会导致严重的内存泄漏,因为父进程的销毁永远不会完成。
自有 ID:OTP-18164 辅助 ID:PR-6114
竞争可能会导致其他进程上的
process_info(Pid, message_queue_len)
返回无效结果。自有 ID:OTP-18169 辅助 ID:PR-6134
修复了处理进程系统任务的 reduction 计数。
自有 ID:OTP-18170 辅助 ID:PR-6135
终止进程的优先级提升不起作用,这可能会导致此类进程的执行被延迟。
自有 ID:OTP-18175 辅助 ID:PR-6142
在取消链接操作完成之前(即在收到来自链接进程的取消链接-ack 信号之前)终止的进程执行的取消链接操作,会导致从终止进程错误地向被取消链接的进程发送退出信号。此退出信号通常会被接收者忽略,但是,如果退出信号的接收者同时设置了新的链接,则它可能会收到终止进程的实际退出原因的退出信号,而不是
noproc
退出原因。但是,很难检测到这种情况是否发生,也没有明显的负面影响,因此应该认为它是无害的。终止进程接收到的分布式取消链接-ack 信号也没有被正确删除,这可能会导致轻微的内存泄漏。
自有 ID:OTP-18177 辅助 ID:PR-6150
当传递参数
native
时,erlang:monotonic_time/1
、erlang:system_time/1
、erlang:time_offset/1
和os:system_time/1
BIF 错误地失败。自有 ID:OTP-18197 辅助 ID:GH-6165,PR-6213
修复了在 macOS 上单次读/写操作中写入和读取超过 2 GB 的问题。在此修复之前,尝试读取/写入超过 2GB 将导致
{error,einval}
。自有 ID:OTP-18222 辅助 ID:PR-6248 GH-6242
Erts 11.2.2.15
已修复的错误和故障
修复了以下情况下的错误分布编码:
- 当向尚未建立(待定)的连接编码时,在环境中使用位串或 export-fun 的 fun
- 或者在环境中使用二进制/位串的 fun,该二进制/位串引用堆外二进制(大于 64 字节)。
症状可能是接收方解码失败,导致连接中止。修复 OTP-18093 是对这些 bug 的一种解决方法,它使 VM 接受此类错误编码的 funs。
第一个针对待定连接的编码错误仅存在于 OTP 23 和 24 中,但第二个错误也存在于 OTP 25 中。
自有 ID:OTP-18104 辅助 ID:OTP-18093
Erts 11.2.2.14
已修复的错误和故障
接受具有错误编码大小字段的 funs (NEW_FUN_EXT)。这是对 OTP 23 和 24 中存在的 bug (OTP-18104) 的一种解决方法,该 bug 可能在某些情况下导致错误的大小字段。模拟器不使用解码的大小字段,但
erl_interface
仍然使用,并且此解决方法没有帮助。自有 ID:OTP-18093 辅助 ID:OTP-18104,PR-5987
运行时系统中内置的 zlib 已更新至 1.2.12 版本。(请注意,在大多数平台上,使用的是平台自己的 zlib。)
自有 ID:OTP-18123 辅助 ID:GH-5994
修复了在使用选项
ordered_set
和{write_concurrency,true}
生成 ETS 表的崩溃转储时可能发生的模拟器崩溃。自有 ID:OTP-18144 辅助 ID:GH-5981
Erts 11.2.2.13
已修复的错误和故障
让 EPMD 容忍在绑定到 IPv4/IPv6 回环接口时发生故障,以及通过
ERL_EPMD_ADDRESS
或-address
选项提供的用户地址。例如,如果主机系统通过 disable_ipv6 sysctl 禁用了 ipv6,则可能会发生这种情况。自有 Id:OTP-17970 辅助 Id:PR-5762
修复了
binary_to_term/1
、enif_make_map_from_arrays
、erl_drv_send_term
和可能导致模拟器崩溃的 Erlang 分布中的一个罕见错误。自有 Id:OTP-18027
修复了
persistent_term:get/1,2
中可能导致其返回另一个键的值的罕见竞争。自有 Id:OTP-18065 辅助 Id:GH-5908
修复了当进程消息队列从堆上数据更改为堆外消息队列数据时,进程消息队列处于不一致状态的错误,导致 GC 段错误。
自有 Id:OTP-18075 辅助 Id:PR-5927
修复了将通用时间转换为本地时间(例如 erlang:localtime/0 和 erlang:universaltime_to_localtime/1)的函数,以在 VM 启动后更改时获取正确的本地时间。
自有 Id:OTP-18076 辅助 Id:ERIERL-802 PR-5905
修复了当执行分布式分段发送的进程被发送退出信号时的内存泄漏。在此修复之前,接收节点将留下一个不完整的消息,该消息将保留到节点断开连接为止。该错误自 Erlang/OTP 21 起就已存在。
自有 Id:OTP-18077 辅助 Id:GH-5876 PR-5892
Erts 11.2.2.12
已修复的错误和故障
修复了 MacOS 上的 Erlang 单调时间。以前在 MacOS 上使用的 OS 单调时间原语存在错误,将不再使用。它已被替换为使用另一个似乎没有错误的 OS 单调时间原语。
自有 Id:OTP-17998 辅助 Id:PR-5825, GH-5554
Erts 11.2.2.11
已修复的错误和故障
默认情况下,当由于网络问题导致连接丢失时,
global
*不会*采取任何操作来恢复完全连接的网络。这对于期望提供完全连接网络的所有应用程序(例如mnesia
),以及对于global
本身都是有问题的。重叠分区的网络可能会导致global
的内部状态变得不一致。即使在将这些分区重新组合以形成完全连接的网络之后,这种不一致也可能仍然存在。对其他期望维护完全连接的网络的应用程序的影响可能会有所不同,但它们可能会在这样的分区期间以非常微妙的难以检测的方式出现故障。为了防止此类问题,我们引入了一个*防止重叠分区*的修复,可以使用
prevent_overlapping_partitions
kernel(6)
参数启用。启用此修复后,global
将主动断开与报告已丢失与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是将网络保持在具有重叠分区的状态。请注意,此修复程序*必须*在网络中的*所有*节点上启用才能正常工作。由于这会相当大地改变行为,因此此修复程序当前默认禁用。由于您可能会在没有此修复程序的情况下遇到难以检测的问题,因此*强烈*建议您启用此修复程序,以避免出现上述问题。从 OTP 25 开始,此修复程序将默认启用。自有 ID:OTP-17843 辅助 ID:ERIERL-732, PR-5611
修复了在仅处理系统任务或非消息信号(例如 process_info 请求)的进程上进行跟踪时出现的内存泄漏问题。
自有 ID:OTP-17904 辅助 ID:ERIERL-757
Erts 11.2.2.10
已修复的错误和故障
修复了在启用消息跟踪时使用
spawn_request
时发生的 GC 模拟器崩溃问题。自有 ID:OTP-17871 辅助 ID:PR-5612
Erts 11.2.2.9
已修复的错误和故障
修复了 Windows 上
file:read_file_info/2
和file:read_file/1
中的内存泄漏问题。自有 ID:OTP-17827 辅助 ID:GH-5527
改进和新功能
在具有大量进程的系统上,由于代码清除或字面量区域删除,以
normal
或low
优先级执行的进程的响应能力可能会受到影响。这是因为在这些操作期间,系统上的所有进程都会被同时安排执行。通过限制系统中未完成的清除和复制字面量请求,此问题已得到修复。默认情况下,此限制设置为系统上调度器数量的两倍。这将确保调度器有足够的工作被调度,以便尽可能快地执行这些操作,同时其他工作将被更高程度地交错执行。但是,由于强制执行此限制的开销,与使用非常大的限制相比,这些操作的性能将有所降低。
可以通过将
+zosrl
命令行参数传递给erl
,或调用erlang:system_flag(outstanding_system_requests_limit, NewLimit)
来设置此限制。自有 ID:OTP-17796 辅助 ID:ERIERL-729, PR-5473
Erts 11.2.2.8
已修复的错误和故障
在 MacOS 上执行时,运行时系统可能会使用过大的超时值调用
select()
。这反过来可能会导致运行时系统崩溃。自有 ID:OTP-17735 辅助 ID:GH-5339
某些由于各种原因必须强制进入分发缓冲区的分布式信号,如果发送时分发缓冲区已满,则会被丢失。受影响的信号包括
- 退出原因为一个字大小的
EXIT
信号。 - 退出原因为一个字大小的
DOWN
信号。 - 来自终止进程的
demonitor
信号。 - 在 OTP 23 和 24 上的
unlink_ack
信号。 - 在 OTP 23 和 24 上的
spawn_reply
信号。
自有 ID:OTP-17737 辅助 ID:GH-5346, GH-4989
- 退出原因为一个字大小的
Erts 11.2.2.7
已修复的错误和故障
当调用进程以高于被检查进程的优先级执行时,调用
process_info(Pid, status)
可能会错误地报告状态running
,而它应该报告waiting
。此错误自 OTP 21.0 (erts version 10.0) 起就存在。内部 ID:OTP-17628
退出端口与同时接收到该端口的信号的处理之间的竞争可能导致运行时系统崩溃。受影响的信号是
link
、monitor
和demonitor
。在 OTP 22 上,当接收到unlink
信号时,类似的竞争也可能导致内存泄漏。内部 ID:OTP-17642 辅助 ID:PR-5248
在执行带有无效超时值的
receive
表达式后,进程的消息队列进入不一致状态。如果由于无效超时值而引发的异常被捕获,则该进程执行的以下receive
表达式可能无法匹配消息队列中已存在的消息。在 OTP 24 上,这也可能导致整个运行时系统崩溃。
内部 ID:OTP-17651 辅助 ID:GH-5235,PR-5244
从端口所有者以外的进程发送
Port ! {PortOwner, close}
信号,可能会错误地触发将badsig
退出信号发送到端口所有者进程,即使信号中传递了正确的PortOwner
。内部 ID:OTP-17665 辅助 ID:PR-5248
这修复了
erts_factory_undo
中的一个错误,该错误导致堆无法正确重置。erts_factory_undo
函数在binary_to_term/1
调用失败时调用,例如,将堆重置为调用binary_to_term/1
之前的状态。这可能会导致堆包含无效的项,当扫描整个堆时可能会导致问题(例如,崩溃)。自有 ID:OTP-17677
修复了当键值对包含被多次引用的魔术引用时,
persistent_term
中的错误。魔术引用是 NIF 资源或从 BIF 返回的资源,例如ets:new
、atomics:new
。该错误可能会导致过早释放所引用资源的内存。该错误也适用于在具有配置选项
--enable-sharing-preserving
的运行时上进行消息传递的魔术引用。该错误自 OTP-24.0 起存在于 64 位系统中,自 OTP-20.0 起存在于 32 位系统中。
自有 ID:OTP-17700 辅助 ID:GH-5271, PR-5273
改进和新功能
erts/lib_src/yielding_c_fun/lib/tiny_regex_c/scripts 中存在的 Python 脚本的许可证与 Erlang/OTP 的许可证不兼容。此票据删除了我们未使用的这些脚本。
内部 ID:OTP-17658
Erts 11.2.2.6
已修复的错误和故障
本机 DNS 解析器中结果值的解析已针对不正确的结果进行了更具防御性的处理。
内部 ID:OTP-17578 辅助 ID:ERIERL-683
在 32 位计算机上,
binary_to_term/1,2
现在更能抵抗包含外部格式映射的损坏二进制文件。内部 ID:OTP-17604
Erts 11.2.2.5
已修复的错误和故障
修复了 tty 驱动程序中的缓冲区溢出问题。当使用 newshell 的 CTRL+R 功能,并且历史记录中有很长的字符串时,在某些平台上会出现此问题。
内部 ID:OTP-17560 辅助 ID:GH-5116
修复了在脏调度程序上运行的进程上跟踪调度或垃圾回收时可能导致崩溃的竞争条件。
内部 ID:OTP-17568 辅助 ID:PR-4940
修复了当给定子二进制作为主题时,re:run 会崩溃/返回无效结果的罕见错误。
此错误自 Erlang/OTP 20.0 起就存在。
内部 ID:OTP-17585 辅助 ID:GH-5150
binary_to_term/1,2
现在更能抵抗包含外部格式映射的损坏二进制文件。内部 ID:OTP-17594
Erts 11.2.2.4
已修复的错误和故障
微状态核算 (msacc) 和
os:perf_counter()
在许多系统上意外地使用了系统时间而不是单调时间进行时间测量。这些系统都是非 x86/x86_64 系统或没有可靠且恒定的 rdtsc 指令的 x86/x86_64 系统。锁定计数 (lcnt) 构建的运行时系统也意外地在所有系统上使用了系统时间而不是单调时间进行时间测量。
内部 ID:OTP-17493
同时调用
erlang:system_flag(schedulers_online, _)
可能会导致调用者永久处于挂起状态。自身 ID: OTP-17500 辅助 ID: GH-4809
修复了分布条目的内存管理中罕见的竞争错误。当大量重复的并发连接尝试失败时,已被观察到会导致 VM 崩溃。
内部 ID:OTP-17513 辅助 ID:GH-4964,PR-5015
Erts 11.2.2.3
已修复的错误和故障
调用
erlang:cancel_timer(_, [{info, false}])
可能导致调用进程在调用中永久阻塞。请注意,只有调用的同步版本(即async
选项为false
)与设置为false
的info
选项组合才会受此错误影响。内部 ID:OTP-17472 辅助 ID:PR-4932
Erts 11.2.2.2
已修复的错误和故障
如果端口繁忙且调用进程在调用时有传入信号,则调用
port_command()
可能会导致调度程序进入无限循环。此错误是在 OTP 23.3.2(ERTS 版本 11.2.1)、OTP 22.3.4.18(ERTS 版本 10.7.2.10)和 OTP 21.3.8.23(ERTS 版本 10.3.5.18)中引入的。自身 ID: OTP-17448 辅助 ID: GH-4898, PR-4903, OTP-17291
进程的脏执行与来自端口到该进程的取消链接信号结合使用,可能会导致该进程的信号队列进入不一致状态。不一致的结果通常会导致运行时系统崩溃。此错误是在 OTP 23.3(ERTS 版本 11.2)中引入的。
自身 ID: OTP-17462 辅助 ID: GH-4885, PR-4914, OTP-17127
Erts 11.2.2.1
已修复的错误和故障
提交生成的
configure
脚本。自身 ID: OTP-17420 辅助 ID: OTP-17398, GH-4821
Erts 11.2.2
已修复的错误和故障
修复了匹配规范编译器中的一个错误,该错误被发现在调试虚拟机上,对于某些匹配规范会导致堆栈溢出崩溃。可能对标准虚拟机造成问题,但尚未验证。匹配规范由
ets:match/select
函数和erlang:trace_pattern
使用。自有 ID: OTP-17379 辅助 ID: PR-4804
Erts 11.2.1
已修复的错误和故障
以下信号可能在同一发送者到同一接收者的其他信号之前传递。也就是说,这些信号可能到达得太早。
garbage-collect
请求。使用garbage_collect/0
BIF 之一从一个进程发送到另一个进程。check-process-code
请求。使用check_process_code()
BIF 之一从一个进程发送到另一个进程。is-process-alive
回复。作为进程调用is_process_alive()
BIF 的响应发送。process-info
回复。作为进程调用process_info()
BIF 之一的响应发送。port-command
回复。作为进程调用port_command()
BIF 之一的响应发送。port-connect
回复。作为进程调用port_connect()
BIF 的响应发送。port-close
回复。作为进程调用port_close()
BIF 的响应发送。port-control
回复。作为进程调用port_control()
BIF 的响应发送。port-call
回复。作为进程调用port_call()
BIF 的响应发送。port-info
回复。作为进程调用port_info()
BIF 之一的响应发送。
自有 ID: OTP-17291
修复了
persistent_term:get/0
和info/0
中的一个错误,该错误可能在极少数情况下导致虚拟机崩溃。该错误自 OTP 23.0 起存在。自有 ID: OTP-17298
修复了
zlib
中的一个错误,该错误会导致解压缩在某些有效输入上崩溃并显示data_error
。自有 ID: OTP-17299 辅助 ID: GH-4710
文字区域的垃圾回收错过了完全由文字区域中的项组成的消息。这反过来可能导致运行时系统崩溃。
自有 ID: OTP-17307
当启用顺序跟踪时,调用
process_flag(message_queue_data, off_heap)
可能会导致运行时系统崩溃。自有 ID: OTP-17349
Erts 11.2
已修复的错误和故障
修复了当使用已死进程的 pid 调用
erlang:process_flag/3
时大约 6 个字的内存泄漏。该错误自 OTP-21.0 起存在。自有 ID: OTP-17081 辅助 ID: PR-2930
修复了由于项无效而导致失败时,
erl_drv_send_term
和erl_drv_output_term
中的小内存泄漏。自有 ID: OTP-17089 辅助 ID: PR-2934
现在,DTrace/SystemTap
process_heap_grow
探针会使用相关进程的有效堆和堆栈指针来调用。自有 ID: OTP-17096 辅助 ID: PR-2932
修复了不支持
MADV_FREE
的 Linux 内核中内存分配的性能问题。自有 ID: OTP-17124
引入了一种新的链接协议,可防止链接最终处于不一致的状态,即一个参与者认为自己已链接,而另一个参与者则不认为。此错误始终存在于分布式情况下,但自 OTP 21 起,也存在于节点本地情况下,因为分布式链接协议随后也用于节点本地链接。但是,只有当两个参与者同时操作链接时,该错误才会触发。
自有 ID: OTP-17127
修复了当从端口程序接收到已死端口的 sigchld 时发生的内存泄漏。
自有 ID: OTP-17163
修复了复杂 seq_trace 令牌(即列表、元组、映射等)可能被 GC 损坏的错误。该错误在 OTP-21 中引入。
自有 ID: OTP-17209 辅助 ID: PR-3039
修复了 Windows 上 WSLPATH 环境变量添加到 PATH 的问题,最后一个字符丢失了。
自有 ID: OTP-17229
修复了计时器实现中的一个错误,该错误可能导致设置为未来超过 37.25 小时的计时器被延迟。如果安排了多个计时器在非常接近的时间触发,但仍然在不同的时间,并且处理计时器的调度器线程无法足够快地处理它们,则可能发生这种情况。在这种情况下,当触发另一个无关计时器时,会触发延迟的计时器。
自有 ID: OTP-17253
修复了如果包含选项
{tracer,_}
并且选项列表无效,或者调用与并发跟踪或代码更改操作竞争时,erlang:trace/3
中的小内存泄漏。自有 ID: OTP-17265 辅助 ID: PR-4596
修复了 32 位 Windows 上
inet_pton
的配置检查。此检查失败将导致在不启用 ipv6 支持的情况下构建 epmd。自有 ID: OTP-17283
改进和新功能
各种地址清理器支持。
自有 ID: OTP-16959 辅助 ID: PR-2965
现在,模拟器将遵守
cgroup2
CPU 配额。自有 ID: OTP-17002
改进了 ARMv8 硬件,特别是 Apple 芯片上的内存屏障使用。
自有 ID: OTP-17195 辅助 ID: PR-4505, PR-4538
改进了 64 位 POWER 硬件上的内存屏障使用。
自有 ID: OTP-17200 辅助 ID: PR-4510
修复了当使用 sendfile 且远程端关闭连接时发生的文件描述符泄漏。此错误自 OTP-21.0 起存在。
自有 ID: OTP-17244
改进了
message_queue_data
进程标志的文档。自有 ID: OTP-17252 辅助 ID: PR-4568
Erts 11.1.8
已修复的错误和故障
修复了一个错误,该错误可能导致某些计划在调度器线程上执行的工作被延迟,直到出现其他类似的工作。除了延迟各种内部数据结构的清理外,以下内容也可能被延迟
- 分配控制器进程的终止
- 在节点上禁用分配
- 使用
instrument
模块收集内存分配器信息 - 启用、禁用和收集
msacc
信息 - 当监视时间偏移时,传递
'CHANGE'
消息 - 调用
erlang:cancel_timer()
- 调用
erlang:read_timer()
调用
erlang:statistics(io | garbage_collection | scheduler_wall_time)
- 调用
ets:all()
- 调用
erlang:memory()
调用
erlang:system_info({allocator | allocator_sizes, _})
- 调用
erlang:trace_delivered()
该错误存在于除 x86/x86_64 以外的所有类型硬件上运行的运行时系统中。
自有 ID: OTP-17185
Erts 11.1.7
改进和新功能
当安装到非默认目录时,使 Windows 安装程序删除非管理员用户的写入访问权限。降低了 DLL 侧加载的风险,但用户应始终注意安装的访问权限。
自有 ID: OTP-17097
Erts 11.1.6
已修复的错误和故障
suspend_process()
和resume_process()
BIF 没有正确检查它们的参数,这可能会导致模拟器崩溃。自有 ID: OTP-17080
如果运行时系统在启动时已经打开了 1023 个以上的文件描述符,则运行时系统将进入无限循环。
自有 ID: OTP-17088 辅助 ID: ERIERL-580
Erts 11.1.5
已修复的错误和故障
修复了在 Erlang 分配连接正在设置时发送小位字符串时发生的模拟器崩溃。
该故障是在 OTP-23.0 中引入的
自有 ID: OTP-17083 辅助 ID: ERIERL-572
Erts 11.1.4
已修复的错误和故障
修复了在加载 NIF 的同时调用 NIF 的 Erlang 实现时可能导致虚拟机崩溃的错误。该错误自 OTP 23.0 起存在。
自有 ID: OTP-16859
修复了从
enif_alloc_env
给定环境时,调试版本中的enif_make_map_*
函数。自有 ID: OTP-16863 辅助 ID: ERL-1352
修复了损坏的配置选项
--disable-pie
。自有 ID: OTP-16864
修复了接收信号(link/monitor/spawn_request/spawn_reply)和断开连接之间竞争中罕见的分配错误。症状:虚拟机崩溃。自:OTP 21.0。
自有 ID: OTP-16869 辅助 ID: ERL-1337
修复了在进程字典中存储极多项时出现的性能问题。(修复此错误还可以消除最新版本的 Clang 发出的编译器警告。)
自有 ID: OTP-16888
构建 erts 时,移除传递给编译器的
-ftree-copyrename
标志。现代 gcc 不使用此标志,并且 clang 不支持此标志。自有 ID:OTP-16894
使用复杂嵌套二进制推导的模块可能无法加载。
自有 ID:OTP-16899
修复了
file:read_file/1
中的一个竞争条件,如果另一个操作系统进程在读取时将文件换出,则可能返回不完整的文件。自有 ID:OTP-16948 辅助 ID:PR-2792
调用
list_to_integer("10", true)
会返回4
而不是引发异常。某些其他原子也会被解释为数字基数。自有 ID:OTP-17030
在 macOS 11 (Big Sur) 上,如果最大文件描述符数量不受限制(
ulimit -n unlimited
),则 erl 将无法启动。自有 ID:OTP-17055 辅助 ID:ERL-1417
改进和新功能
向所有可执行文件和动态库添加清单。
自有 ID:OTP-17067 辅助 ID:PR-2907
Erts 11.1.3
修复的错误和故障
修复了在调用时序跟踪期间抛出异常时发生的崩溃。
自有 ID:OTP-16994
Erts 11.1.2
修复的错误和故障
修复了在启用使用未记录和不支持的
SMALL_MEMORY
功能构建的系统上的 ERTS 内部分配器时导致问题的错误。自有 ID:OTP-16939
inet 驱动程序过去在传递给
writev()
(以及 Windows 上的WSASend()
)的 I/O 向量中使用 16 作为最大元素数量。当要发送的数据包含大量元素时,由于必须多次调用writev()
,导致性能下降。现在,inet 驱动程序会查找系统上可以使用的实际最大元素数量,而不是仅仅假设为 16。在大多数系统上,这将导致最大 I/O 向量元素数量为 1024。从 OTP 23.0 开始,通过分布发送的信号的项编码被编码为缓冲区 I/O 向量,而不是编码为单个缓冲区。引用计数的二进制文件直接从 I/O 向量引用,而不是复制到单个缓冲区。也就是说,包含大量引用计数二进制文件的 Erlang 信号受到了此性能下降的影响。
自有 ID:OTP-16955 辅助 ID:ERL-1343,OTP-15618
在分布式情况下,调用
spawn_request()
BIF 时,错误的reply
选项错误地导致了badarg
异常,而不是badopt
错误消息回复。自有 ID:OTP-16991 辅助 ID:OTP-15251
Erts 11.1.1
修复的错误和故障
inet:setopts([{active,once}]) 不必要地唤醒 IO 轮询线程,导致锁争用和明显更高的 CPU 利用率。
自有 ID:OTP-16847 辅助 ID:ERL-1301
修复了 ERTS 内部线程唤醒功能中的两个错误。这些错误主要在系统中所有线程都试图进入休眠时发生。当触发这些错误时,某些操作会被延迟,直到某个线程由于其他原因被唤醒。受影响的最重要操作是代码加载、持久术语更新和内存释放。
自有 ID:OTP-16870
修复了
ets:select_replace/2
在compressed
表上的错误,该错误可能产生错误的结果或 VM 崩溃。该错误自 OTP 20 起就存在。自有 ID:OTP-16874 辅助 ID:ERL-1356,PR-2763
当在 macOS 上使用 Xcode 12 编译 Erlang/OTP 时,BEAM 解释器的性能会下降。
自有 ID:OTP-16892
改进和新功能
从 OTP 22 开始,特定于分配器的内存载体池被节点全局载体池所取代。不幸的是,在某些情况下,这会导致严重的内存碎片,因为长期存在的数据会分散到主要处理短期数据的分配器使用的载体中。
引入了一个新的命令行参数
+M<S>cp
,可以使用该参数启用旧的行为以及配置载体池的其他行为。为了配置旧的行为,为所有分配器提供特定于分配器的载体池,请在启动 Erlang 系统时将+Mucp :
(包括冒号字符)作为命令行参数传递给erl
。载体池的默认配置将在未来某个时候更改为
+Mucp :
,但不会在此补丁中更改。自有 ID:OTP-16856
Erts 11.1
修复的错误和故障
更新抽象格式的文档,以使用
ANNO
而不是LINE
。自有 ID:OTP-16625 辅助 ID:PR-2609
当在低于 1 个 CPU 的 CPU 配额下运行时,模拟器将不再恢复为默认的调度器数量。
自有 ID:OTP-16710 辅助 ID:ERL-1280
修复了崩溃转储的问题。当进程包含对运行时系统内部创建的文字的引用(例如
os:type/0
返回的元组)时,该文字不会包含在崩溃转储中,并且崩溃转储查看器会抱怨堆不完整。自有 ID:OTP-16713
修复了 clang 的 PGO 的配置检测。
自有 ID:OTP-16738
已修复 to_erl 程序,以将换行符正确地解释为仅换行符,而不是换行符+回车符。
当使用长于终端大小的行时,此错误会导致终端行为异常。
自有 ID:OTP-16741
通过调用
process_flag(priority, Prio)
更改进程优先级时发生的竞争条件可能会导致忽略系统任务的优先级提升。如果系统任务在更改优先级的同时调度到调用process_flag()
的进程上,则会发生此错误。该错误相当无害,即使发生也很少发生。自有 ID:OTP-16770
在 Android 上安装时,将脚本中的
/bin/sh
调整为/system/bin/sh
。自有 ID:OTP-16833 辅助 ID:PR-2729
在极少数情况下,当加载由替代代码生成器(不是 OTP 中的 Erlang 编译器)生成或来自手写或修补的 BEAM 代码的 BEAM 文件时,加载器可能会执行不安全的优化。
自有 ID:OTP-16850 辅助 ID:ERL-1344
修复了套接字中的内存和文件描述符泄漏。(当一个新打开的套接字,尚未将 fd 进入 VM 的轮询集(既没有接收、发送、接受也没有连接),在没有关闭(进程死亡)的情况下被放弃,在分配不同的控制进程之后,则可能会泄漏内存块和文件描述符。)
自有 ID:OTP-16857
statistics(run_queue)
的文档错误地声明它返回所有正常运行队列的总长度,而实际上返回的是所有正常和脏 CPU 运行队列的总长度。已更新文档以反映实际行为。自有 ID:OTP-16866 辅助 ID:ERL-1355
改进和新功能
为了在 Haiku 操作系统上构建而进行的更改。
感谢 Calvin Buckley
自有 ID:OTP-16707 辅助 ID:PR-2638
在 Windows 上构建 inet 驱动程序时,存在许多关于类型转换(在调用调试宏时使用)的编译器警告。现在已解决此问题。
自有 ID:OTP-16715
使(使用)套接字注册表成为可选(默认仍启用)。现在可以构建关闭套接字注册表的 OTP,可以通过设置环境变量来关闭它,并在运行时进行控制(通过创建套接字时的函数调用和参数)。
自有 ID:OTP-16763
将 Android 上的默认文件名编码更改为 UTF-8。
自有 ID:OTP-16821 辅助 ID:PR-2733
澄清了分发使用的原子缓存标头的格式。
自有 ID:OTP-16848 辅助 ID:PR-2737
Erts 11.0.4
修复的错误和故障
ERTS 内部 I/O 轮询实现可能会进入不一致的状态,导致输入事件被忽略。
自有 ID:OTP-16780 辅助 ID:PR-2701
Erts 11.0.3
修复的错误和故障
修复了
erlang:load_nif/2
中的错误,如果并发代码更改操作正在进行中,则可能导致它抛出badarg
异常。该错误自 OTP 23.0 起就存在。自有 ID:OTP-16704 辅助 ID:ERL-1273,PR-16704
对调试编译的 VM 进行了小修复。
自有 ID:OTP-16717
无意中重复使用已用过的模拟器内部事件对象可能导致线程的唤醒信号丢失。在最坏的情况下,这可能导致运行时系统挂起。不过,这种情况非常罕见。
自有 ID:OTP-16766 辅助 ID:ERL-1304
在非 Linux 系统上,NIF 线程和驱动程序线程在终止时会泄漏内部资源。在 Windows 上,这些资源是每个线程一个事件。在大多数其他系统上,每个线程泄漏一个互斥锁和一个条件变量。在那些缺少
pthread_cond_timedwait()
的其他系统上,还会泄漏一个管道及其文件描述符。自有 ID:OTP-16772 辅助 ID:ERL-1304
Erts 11.0.2
修复的错误和故障
修复了在未建立的连接上发送导出函数(例如
lists:reverse/1
)时的错误。它可能导致虚拟机崩溃。该错误自 OTP 23.0 起存在。自有 ID:OTP-16693 辅助 ID:ERL-1254, PR-2640
Erts 11.0.1
修复的错误和故障
在让步时,BIF 用于临时禁用垃圾回收的功能可能会导致执行此类 BIF 的进程上的系统任务队列不一致。进程系统任务例如在清除代码、垃圾收集文字数据以及从另一个进程发出普通垃圾收集时使用。
此错误不会频繁触发。连续多次代码清除操作会增加触发此错误的可能性。在观察到的情况下,这会导致挂起的代码清除操作。
自有 ID:OTP-16639 辅助 ID:ERL-1236
如果套接字在调用 recv 时关闭(被动模式下的套接字),则 SCTP 和 UDP recv/2,3 会无限期挂起。
自有 ID:OTP-16654 辅助 ID:ERL-1242
Erts 11.0
修复的错误和故障
BIF 现在在跟踪方面表现得像普通函数,允许
call_count
跟踪,并修复了一些当 BIF 尾调用自身或其他函数(“陷阱”)时返回跟踪消息丢失的错误。自有 ID:OTP-14734 辅助 ID:ERL-496
修复了 64 位 Windows 上各种编译器警告。
自有 ID:OTP-15800
erlang:fun_info(fun foo/1, name/1)
过去会返回一个函数名,该函数名基于使用fun foo/1
的函数名。现在返回的名称是-fun.foo/1-
。自有 ID:OTP-15837
file:allocate/3
现在将在所有平台上更新文件大小。自有 ID:OTP-16155 辅助 ID:PR-2408
类型设置为
httph
的erlang:decode_packet
不再接受在标头名称和冒号之间有空格的 HTTP 标头。也就是说Content-Type : text/html
不再允许。此更改是为了符合 RFC 7230,从而防止 HTTP 反同步攻击。
* 潜在的不兼容性 *
自有 ID:OTP-16168 辅助 ID:ERL-1053
修复了
erl -args_file
、ERL_FLAGS
、ERL_AFLAGS
和ERL_ZFLAGS
中的引用规则,使其像 unix sh 引用一样工作。此错误修复可能会导致以前通过
ERL_FLAGS
、ERL_AFLAGS
、ERL_ZFLAGS
或-args_file
传递给erl
的配置选项的解释方式与修复前不同。* 潜在的不兼容性 *
自有 ID:OTP-16244 辅助 ID:ERL-1051
修复了当一个节点连接时,该节点可以处理消息分片但不能处理原子缓存的 Erlang 分布。此错误仅影响实现了自定义分布载体的用户。自 OTP-21 起就存在此错误。
将
DFLAG_FRAGMENT
分布标志添加到可以被分布实现拒绝的标志集中。自有 ID:OTP-16284
编译具有过度嵌套的匹配规范会导致运行时系统因调度程序堆栈耗尽而崩溃。在这种情况下,受影响的函数现在将引发
system_limit
错误异常,而不是使运行时系统崩溃。自有 ID:OTP-16431 辅助 ID:ERL-592
修复了如果 Erlang 安装在某些路径上,则阻止在 Windows 上启动 Erlang 的错误。
自有 ID:OTP-16478 辅助 ID:ERL-1115
修复了 Windows 上当标准输入关闭时(特别是当 VM 仅分配一个 CPU 核心时)导致性能不佳的错误。例如,可以通过函数
os:cmd/1
启动 erl 或 escript 来触发此问题。可以使用命令行选项-noinput
来避免此问题。性能不佳是由一个无限期旋转的 IO 线程引起的。
自有 ID:OTP-16521 辅助 ID:ERL-716
修复了 Unix 平台上,如果模拟器的有效用户或组 ID 与其实际用户或组 ID 不同,则会导致
file:read_file_info/1
返回错误结果的错误。自有 ID:OTP-16571
套接字:当 PACKET_FASTROUTE 和 PACKET_USER 都被定义且具有相同的值时,Android 上的编译问题。已删除 PACKET_FASTROUTE 的使用,因为它可能未使用,并且也仅适用于非用户区。
自有 ID:OTP-16576 辅助 ID:ERL-1208
修复了 erl_crash.dump 生成中的一个错误,如果找到最近取消的计时器,则可能导致 SEGV 核心转储。
自有 ID:OTP-16596 辅助 ID:ERL-1105, PR-2606
改进和新功能
改进了
erlang:load_nif/2
的并发性,因为它在 NIF 库的初始加载期间不再阻止其他调度程序执行。自有 ID:OTP-10278
已实现 EEP-52。
在二进制匹配中,现在允许要匹配的段的大小是一个保护表达式,类似地,在映射匹配中,键现在可以是保护表达式。有关更多详细信息,请参阅 Erlang 参考手册和编程示例。
生成 Core Erlang 代码的语言编译器或代码生成器可能需要更新才能与 OTP 23 中的编译器兼容。有关更多详细信息,请参阅 EEP 52 中的向后兼容性部分。
自有 ID:OTP-14708
在 BEAM 内部,延续指针的处理已得到简化。此更改对用户不可见,除非在崩溃转储查看器中检查进程堆栈。函数的延续指针现在将存储在该函数的 y(0) 下方。
自有 ID:OTP-15077
seq_trace
令牌现在会传播到派生的进程。自有 ID:OTP-15232 辅助 ID:ERL-700
改进了分布式 spawn 操作。这些改进包括可伸缩性和性能改进,以及新功能。
新功能
- 分布式
spawn_monitor()
BIF。 - 支持分布式
spawn_opt()
BIF 中的monitor
选项。 - 新的
spawn_request()
BIF,用于异步生成进程。spawn_request()
支持spawn_opt()
支持的所有选项,以及一些其他选项。
自有 ID:OTP-15251
- 分布式
使
ets:insert/2
和ets:insert_new/2
在要插入的长记录列表上产生调度程序执行。自有 ID:OTP-15517 辅助 ID:ERL-560
将节点化身号(又名“创建”)的大小从 2 位增加到 32 位。这将降低来自不同节点化身且名称相同的 pid/端口/refs 混淆的风险。
自有 ID:OTP-15603
运行时系统现在可以将 Erlang 项编码为 Erlang 外部项格式,作为 I/O 向量。这样做的好处是,可以直接引用引用计数的二进制文件,而无需将其复制到新的二进制文件中。
TCP 上的默认 Erlang 分布将始终利用这一点。如果驱动程序实现了
outputv
回调,则利用端口作为分布控制器的备用分布实现将利用这一点。如果 I/O 向量被处理从erlang:dist_ctrl_get_data()
返回的数据的功能所利用,则利用进程作为分布控制器的备用 Erlang 分布实现将利用这一点。由
erlang:dist_ctrl_get_data()
返回的数据的返回类型已从iodata/0
更改为iovec()
。请注意,iovec()
数据是有效的iodata/0
,因此使用erlang:dist_ctrl_get_data()
的旧实现不需要更改,但可以根据使用场景从更改中获益。引入了新的 BIF
term_to_iovec/1
和term_to_iovec/2
。它们的工作方式与具有相应元数的term_to_binary()
完全相同,除了返回类型。自有 ID:OTP-15618
改进了更改表大小的并发调用的 ETS 可伸缩性,如
ets:insert/2
和ets:delete/2
。此性能功能在 OTP 22.0 中为
ordered_set
实现,现在适用于所有 ETS 表类型。改进的可伸缩性可能会以
ets:info(T,size)
和ets:info(T,memory)
的更长延迟为代价。因此,添加了一个新的表选项decentralized_counters
。对于启用write_concurrency
的ordered_set
,它的默认值为true
,对于所有其他表类型,它的默认值为false
。自有 ID:OTP-15744 辅助 ID:OTP-15623,PR-2229
现在可以通过传递
directory
选项,使用file:open/2
打开目录。自有 ID:OTP-15835 辅助 ID:PR-2212
添加海光 Dhyana 作为已知处理器,以启用对原子操作的支持。
自有 ID:OTP-15840
使
erlang:phash2
函数消耗的归约次数与输入项的大小成正比,并在归约次数耗尽时让出调度器。自有 ID:OTP-15842 辅助 ID:PR-2182
修复了将 Erlang/OTP 编译到 IBM AIX 平台时的各种构建问题。
自有 ID:OTP-15866 辅助 ID:PR-2110
添加配置选项
--enable-pie
和--disable-pie
来控制位置无关可执行文件的构建。自有 ID:OTP-15868
现在可以在打开的文件和目录上使用
file:read_file_info/2
。自有 ID:OTP-15956 辅助 ID:PR-2231
添加了
atom_to_binary
、binary_to_atom
和binary_to_existing_atom
的 arity-1 版本,所有版本都以utf8
作为默认编码。自有 ID:OTP-15995 辅助 ID:PR-2358
优化了 erts 内部哈希表实现,以加快查找速度。内部哈希用于以下内容:进程注册表,执行 erlang:apply/2,执行 M:func(test) 等。
自有 ID:OTP-16014 辅助 ID:PR-2345
现在在决定在线调度器的默认数量时会考虑 CPU 配额,从而提高了在应用配额的容器环境(例如使用
--cpus
标志的docker
)中的性能。自有 ID:OTP-16105 辅助 ID:ERL-927
现在,
erl
的-config
选项可以接受多个配置文件,而无需重复-config
选项。 示例erl -config sys local
自有 ID:OTP-16148 辅助 ID:PR-2373
移除了
scheduler_poll
和async I/O
dtrace 和 LTTng 跟踪探针。* 潜在的不兼容性 *
自有 ID:OTP-16215
优化了
persistent_term:put/2
和erase/1
,在许多情况下减少 CPU 消耗。自有 ID:OTP-16237 辅助 ID:PR-2389
扩展了在不依赖 EPMD 的情况下运行 Erlang 分布的可能性。 为此,已向 inet 分布添加了几个新选项。
-dist_listen false - 设置分发通道,但不监听传入连接。 当您想使用当前节点与同一台机器上的另一个节点进行交互,而无需加入整个集群时,这非常有用。
-erl_epmd_port Port - 配置内置 EPMD 客户端应返回的默认端口。 这允许本地节点知道要连接到集群中任何其他节点的端口。
还扩展了
erl_epmd
回调 API,以允许将-1
作为创建返回,这意味着节点将创建一个随机创建。此外,还添加了一个名为
listen_port_please
的新回调函数,允许回调返回分发应使用的监听端口。 如果监听端口要从外部服务获取,则可以使用它代替inet_dist_listen_min/max
。自有 ID:OTP-16250
在没有
closefrom()
的系统(例如 Linux)上,迭代所有可能的文件描述符并为每个文件描述符调用close()
是低效的。 当文件描述符的最大数量已调整为很大的数字时,情况尤其如此。相反,在 erl_child_setup 中,遍历
/dev/fd
下的打开描述符,并仅关闭那些已打开的描述符。此优化会影响启动新的 Erlang 实例的 CPU 使用率。
自有 ID:OTP-16270
优化了
maps:merge/2
,以处理空映射或相同映射的简单情况。自有 ID:OTP-16283 辅助 ID:PR-2441
新的实验性
socket
模块已移至 Kernel 应用程序。自有 ID:OTP-16312
改进了
instrument
模块中分配和载体的表示。自有 ID:OTP-16327
如 OTP 22.0 中宣布的那样,先前对 VxWorks 的有限支持现已删除。
* 潜在的不兼容性 *
自有 ID:OTP-16329 辅助 ID:OTP-15621
使用
httph
和httph_bin
选项到erlang:decode_packet/3
和inet:setopts/2
时的返回值已更改为也包含未经修改的原始标头。请参阅erlang:decode_packet/3
。示例> erlang:decode_packet(httph_bin,<<"HELLO: hi\r\n\r\n">>,[]). {ok,{http_header,0,<<"Hello">>,<<"HELLO">>,<<"hi">>},<<"\r\n">>}
自有 ID:OTP-16347 辅助 ID:PR-2466
确保
net_kernel:monitor_nodes/1
在向同一节点发送重新建立连接的nodeup
消息之前,发送失败连接的nodedown
消息。自有 ID:OTP-16362
更新了 顺序跟踪,以支持消息传递之外的其他信息传输。
自有 ID:OTP-16370 辅助 ID:OTP-15251, OTP-15232
socket:现在可以从已存在的文件描述符创建套接字。
自有 ID:OTP-16398 辅助 ID:ERL-1154
socket:socket:supports/1 函数现在还会报告是否支持 netns。
自有 ID:OTP-16432
当比较两个大小不同的映射时,
=:=
已被优化为立即返回false
。自有 ID:OTP-16454
更改了传递
erl
命令行参数+A 0
的行为,使其静默地表示+A 1
。 也就是说,将不再可能完全禁用异步线程池。 自 OTP 21 以来,禁用异步线程池没有任何好处; 只有许多缺点。自有 ID:OTP-16482
不推荐使用的
erlang:get_stacktrace/0
BIF 现在返回一个空列表而不是堆栈跟踪。 要检索堆栈跟踪,请使用在 OTP 21 中引入的扩展 try/catch 语法。erlang:get_stacktrace/0
计划在 OTP 24 中删除。* 潜在的不兼容性 *
自有 ID:OTP-16484
引入了
init:restart/1
。init:restart/1
可用于在重启期间更改代码加载模式。自有 ID:OTP-16492 辅助 ID:PR-2461
改进了 net nif 的配置,这应提高可移植性。
自有 ID:OTP-16530 辅助 ID:OTP-16464
socket:套接字计数器和套接字全局计数器现在表示为映射(而不是属性列表)。
自有 ID:OTP-16535
减少了并行构建(例如
make -j128
)中erlc
的资源使用量。自有 ID:OTP-16543 辅助 ID:ERL-1186
实验性套接字模块已取消限制,因此现在“seqpacket”套接字类型应适用于操作系统支持的任何通信域(协议族),通常是 Unix 域。
自有 ID:OTP-16550 辅助 ID:ERIERL-476
将内部
pcre
库更新到8.44
。自有 ID:OTP-16557
现在使用二进制语法复制二进制数据时会产生归约方面的成本。
自有 ID:OTP-16601 辅助 ID:OTP-16577
可执行文件
erl_call
现在是erts
发行版的一部分,此外还有erl_interface
。自有 ID:OTP-16602
修复了一个缓冲区溢出错误,该错误导致 EPMD 在 NetBSD 上同时连接许多节点后消耗 100% 的 CPU。
自有 ID:OTP-16615
erl -remsh
现在默认使用动态节点名称功能。 有关详细信息,请参阅 erl 文档。自有 ID:OTP-16616
socket:默认情况下,套接字选项 rcvtimeo 和 sndtimeo 现在处于禁用状态。 要启用这些,现在必须使用配置选项 --enable-esock-rcvsndtimeo 构建 OTP
自有 ID:OTP-16620
在启动 Erlang 之前,不再需要设置环境变量 $HOME。
自有 ID:OTP-16635 辅助 ID:ERL-476 PR-2390
Erts 10.7.2.19
已修复的错误和故障
竞争可能会导致其他进程上的
process_info(Pid, message_queue_len)
返回无效结果。自有 ID:OTP-18169 辅助 ID:PR-6134
修复了处理进程系统任务的 reduction 计数。
自有 ID:OTP-18170 辅助 ID:PR-6135
终止进程的优先级提升不起作用,这可能会导致此类进程的执行被延迟。
自有 ID:OTP-18175 辅助 ID:PR-6142
当传递参数
native
时,erlang:monotonic_time/1
、erlang:system_time/1
、erlang:time_offset/1
和os:system_time/1
BIF 错误地失败。自有 ID:OTP-18197 辅助 ID:GH-6165,PR-6213
发送到分发控制器进程的有关可用分发数据的通知可能会丢失。 在实现替代分发载体时可以使用分发控制器进程。 基于 tcp 的默认分发不受影响,并且该错误也不存在于 x86/x86_64 平台上。
自有 ID:OTP-18258 辅助 ID:GH-6309,PR-6324
Erts 10.7.2.18
已修复的错误和故障
修复了当进程消息队列从堆上数据更改为堆外消息队列数据时,进程消息队列处于不一致状态的错误,导致 GC 段错误。
自有 Id:OTP-18075 辅助 Id:PR-5927
修复了将通用时间转换为本地时间(例如 erlang:localtime/0 和 erlang:universaltime_to_localtime/1)的函数,以在 VM 启动后更改时获取正确的本地时间。
自有 Id:OTP-18076 辅助 Id:ERIERL-802 PR-5905
修复了当执行分布式分段发送的进程被发送退出信号时的内存泄漏。在此修复之前,接收节点将留下一个不完整的消息,该消息将保留到节点断开连接为止。该错误自 Erlang/OTP 21 起就已存在。
自有 Id:OTP-18077 辅助 Id:GH-5876 PR-5892
Erts 10.7.2.17
已修复的错误和故障
默认情况下,当由于网络问题导致连接丢失时,
global
*不会*采取任何操作来恢复完全连接的网络。这对于期望提供完全连接网络的所有应用程序(例如mnesia
),以及对于global
本身都是有问题的。重叠分区的网络可能会导致global
的内部状态变得不一致。即使在将这些分区重新组合以形成完全连接的网络之后,这种不一致也可能仍然存在。对其他期望维护完全连接的网络的应用程序的影响可能会有所不同,但它们可能会在这样的分区期间以非常微妙的难以检测的方式出现故障。为了防止此类问题,我们引入了一个防止重叠分区的修复,可以使用
prevent_overlapping_partitions
kernel(6)
参数启用。 启用此修复后,global
将主动断开与报告它们已丢失与其他节点连接的节点的连接。 这将导致形成完全连接的分区,而不是将网络置于具有重叠分区的状态。 请注意,此修复必须在网络中的所有节点上启用才能正常工作。 由于这会大幅改变行为,因此此修复当前默认处于禁用状态。 但是,由于如果没有此修复,您可能会遇到难以检测的问题,因此强烈建议启用此修复,以避免出现上述问题。 从 OTP 25 开始,此修复将默认启用。自有 ID:OTP-17843 辅助 ID:ERIERL-732, PR-5611
修复了在仅处理系统任务或非消息信号(例如 process_info 请求)的进程上进行跟踪时出现的内存泄漏问题。
自有 ID:OTP-17904 辅助 ID:ERIERL-757
修复了 MacOS 上的 Erlang 单调时间。以前在 MacOS 上使用的 OS 单调时间原语存在错误,将不再使用。它已被替换为使用另一个似乎没有错误的 OS 单调时间原语。
自有 Id:OTP-17998 辅助 Id:PR-5825, GH-5554
Erts 10.7.2.16
改进和新功能
在具有大量进程的系统上,由于代码清除或字面量区域删除,以
normal
或low
优先级执行的进程的响应能力可能会受到影响。这是因为在这些操作期间,系统上的所有进程都会被同时安排执行。通过限制系统中未完成的清除和复制字面量请求,此问题已得到修复。默认情况下,此限制设置为系统上调度器数量的两倍。这将确保调度器有足够的工作被调度,以便尽可能快地执行这些操作,同时其他工作将被更高程度地交错执行。但是,由于强制执行此限制的开销,与使用非常大的限制相比,这些操作的性能将有所降低。
可以通过将
+zosrl
命令行参数传递给erl
,或调用erlang:system_flag(outstanding_system_requests_limit, NewLimit)
来设置此限制。自有 ID:OTP-17796 辅助 ID:ERIERL-729, PR-5473
Erts 10.7.2.15
修复的 Bug 和故障
在 MacOS 上执行时,运行时系统可能会使用过大的超时值调用
select()
。这反过来可能会导致运行时系统崩溃。自有 ID:OTP-17735 辅助 ID:GH-5339
某些由于各种原因必须强制进入分发缓冲区的分布式信号,如果发送时分发缓冲区已满,则会被丢失。受影响的信号包括
- 退出原因为一个字大小的
EXIT
信号。 - 退出原因为一个字大小的
DOWN
信号。 - 来自终止进程的
demonitor
信号。 - 在 OTP 23 和 24 上的
unlink_ack
信号。 - 在 OTP 23 和 24 上的
spawn_reply
信号。
自有 ID:OTP-17737 辅助 ID:GH-5346, GH-4989
- 退出原因为一个字大小的
Erts 10.7.2.14
修复的 Bug 和故障
在 32 位计算机上,
binary_to_term/1,2
现在更能抵抗包含外部格式映射的损坏二进制文件。内部 ID:OTP-17604
当调用进程以高于被检查进程的优先级执行时,调用
process_info(Pid, status)
可能会错误地报告状态running
,而它应该报告waiting
。此错误自 OTP 21.0 (erts version 10.0) 起就存在。内部 ID:OTP-17628
退出端口与同时接收到该端口的信号的处理之间的竞争可能导致运行时系统崩溃。受影响的信号是
link
、monitor
和demonitor
。在 OTP 22 上,当接收到unlink
信号时,类似的竞争也可能导致内存泄漏。内部 ID:OTP-17642 辅助 ID:PR-5248
在执行带有无效超时值的
receive
表达式后,进程的消息队列进入不一致状态。如果由于无效超时值而引发的异常被捕获,则该进程执行的以下receive
表达式可能无法匹配消息队列中已存在的消息。在 OTP 24 上,这也可能导致整个运行时系统崩溃。
内部 ID:OTP-17651 辅助 ID:GH-5235,PR-5244
从端口所有者以外的进程发送
Port ! {PortOwner, close}
信号,可能会错误地触发将badsig
退出信号发送到端口所有者进程,即使信号中传递了正确的PortOwner
。内部 ID:OTP-17665 辅助 ID:PR-5248
这修复了
erts_factory_undo
中的一个错误,该错误导致堆无法正确重置。erts_factory_undo
函数在binary_to_term/1
调用失败时调用,例如,将堆重置为调用binary_to_term/1
之前的状态。这可能会导致堆包含无效的项,当扫描整个堆时可能会导致问题(例如,崩溃)。自有 ID:OTP-17677
修复了当键值对包含被多次引用的魔术引用时,
persistent_term
中的错误。魔术引用是 NIF 资源或从 BIF 返回的资源,例如ets:new
、atomics:new
。该错误可能会导致过早释放所引用资源的内存。该错误也适用于在具有配置选项
--enable-sharing-preserving
的运行时上进行消息传递的魔术引用。该错误自 OTP-24.0 起存在于 64 位系统中,自 OTP-20.0 起存在于 32 位系统中。
自有 ID:OTP-17700 辅助 ID:GH-5271, PR-5273
Erts 10.7.2.13
修复的 Bug 和故障
修复了
zlib
中的一个 bug,该 bug 会导致在某些有效输入上解压缩时崩溃并出现data_error
。此 bug 还可能导致使用zip:extract()
从 zip 存档中提取失败。自有 ID:OTP-17470 辅助 ID:ERIERL-657
调用
erlang:cancel_timer(_, [{info, false}])
可能导致调用进程在调用中永久阻塞。请注意,只有调用的同步版本(即async
选项为false
)与设置为false
的info
选项组合才会受此错误影响。内部 ID:OTP-17472 辅助 ID:PR-4932
微状态核算 (msacc) 和
os:perf_counter()
在许多系统上意外地使用了系统时间而不是单调时间进行时间测量。这些系统都是非 x86/x86_64 系统或没有可靠且恒定的 rdtsc 指令的 x86/x86_64 系统。锁定计数 (lcnt) 构建的运行时系统也意外地在所有系统上使用了系统时间而不是单调时间进行时间测量。
内部 ID:OTP-17493
同时调用
erlang:system_flag(schedulers_online, _)
可能会导致调用者永久处于挂起状态。自身 ID: OTP-17500 辅助 ID: GH-4809
修复了分布条目的内存管理中罕见的竞争错误。当大量重复的并发连接尝试失败时,已被观察到会导致 VM 崩溃。
内部 ID:OTP-17513 辅助 ID:GH-4964,PR-5015
修复了 tty 驱动程序中的缓冲区溢出问题。当使用 newshell 的 CTRL+R 功能,并且历史记录中有很长的字符串时,在某些平台上会出现此问题。
内部 ID:OTP-17560 辅助 ID:GH-5116
修复了在脏调度程序上运行的进程上跟踪调度或垃圾回收时可能导致崩溃的竞争条件。
内部 ID:OTP-17568 辅助 ID:PR-4940
修复了当给定子二进制作为主题时,re:run 会崩溃/返回无效结果的罕见错误。
此错误自 Erlang/OTP 20.0 起就存在。
内部 ID:OTP-17585 辅助 ID:GH-5150
binary_to_term/1,2
现在更能抵抗包含外部格式映射的损坏二进制文件。内部 ID:OTP-17594
Erts 10.7.2.12
修复的 Bug 和故障
如果端口繁忙且调用进程在调用时有传入信号,则调用
port_command()
可能会导致调度程序进入无限循环。此错误是在 OTP 23.3.2(ERTS 版本 11.2.1)、OTP 22.3.4.18(ERTS 版本 10.7.2.10)和 OTP 21.3.8.23(ERTS 版本 10.3.5.18)中引入的。自身 ID: OTP-17448 辅助 ID: GH-4898, PR-4903, OTP-17291
Erts 10.7.2.11
修复的 Bug 和故障
修复了匹配规范编译器中的一个错误,该错误被发现在调试虚拟机上,对于某些匹配规范会导致堆栈溢出崩溃。可能对标准虚拟机造成问题,但尚未验证。匹配规范由
ets:match/select
函数和erlang:trace_pattern
使用。自有 ID: OTP-17379 辅助 ID: PR-4804
提交生成的
configure
脚本。自身 ID: OTP-17420 辅助 ID: OTP-17398, GH-4821
Erts 10.7.2.10
修复的 Bug 和故障
以下信号可能在同一发送者到同一接收者的其他信号之前传递。也就是说,这些信号可能到达得太早。
garbage-collect
请求。使用garbage_collect/0
BIF 之一从一个进程发送到另一个进程。check-process-code
请求。使用check_process_code()
BIF 之一从一个进程发送到另一个进程。is-process-alive
回复。作为进程调用is_process_alive()
BIF 的响应发送。process-info
回复。作为进程调用process_info()
BIF 之一的响应发送。port-command
回复。作为进程调用port_command()
BIF 之一的响应发送。port-connect
回复。作为进程调用port_connect()
BIF 的响应发送。port-close
回复。作为进程调用port_close()
BIF 的响应发送。port-control
回复。作为进程调用port_control()
BIF 的响应发送。port-call
回复。作为进程调用port_call()
BIF 的响应发送。port-info
回复。作为进程调用port_info()
BIF 之一的响应发送。
自有 ID: OTP-17291
文字区域的垃圾回收错过了完全由文字区域中的项组成的消息。这反过来可能导致运行时系统崩溃。
自有 ID: OTP-17307
当启用顺序跟踪时,调用
process_flag(message_queue_data, off_heap)
可能会导致运行时系统崩溃。自有 ID: OTP-17349
Erts 10.7.2.9
修复的 Bug 和故障
修复了计时器实现中的一个错误,该错误可能导致设置为未来超过 37.25 小时的计时器被延迟。如果安排了多个计时器在非常接近的时间触发,但仍然在不同的时间,并且处理计时器的调度器线程无法足够快地处理它们,则可能发生这种情况。在这种情况下,当触发另一个无关计时器时,会触发延迟的计时器。
自有 ID: OTP-17253
修复了调用时间跟踪(由 eprof 使用)中可能导致 VM 崩溃的错误。该错误自 OTP-22.2 以来就存在(但不在 OTP-23 中)。
自有 ID:OTP-17290 辅助 ID:GH-4635
改进和新功能
修复了当使用 sendfile 且远程端关闭连接时发生的文件描述符泄漏。此错误自 OTP-21.0 起存在。
自有 ID: OTP-17244
Erts 10.7.2.8
修复的 Bug 和故障
修复了一个错误,该错误可能导致某些计划在调度器线程上执行的工作被延迟,直到出现其他类似的工作。除了延迟各种内部数据结构的清理外,以下内容也可能被延迟
- 分配控制器进程的终止
- 在节点上禁用分配
- 使用
instrument
模块收集内存分配器信息 - 启用、禁用和收集
msacc
信息 - 当监视时间偏移时,传递
'CHANGE'
消息 - 调用
erlang:cancel_timer()
- 调用
erlang:read_timer()
调用
erlang:statistics(io | garbage_collection | scheduler_wall_time)
- 调用
ets:all()
- 调用
erlang:memory()
调用
erlang:system_info({allocator | allocator_sizes, _})
- 调用
erlang:trace_delivered()
该错误存在于除 x86/x86_64 以外的所有类型硬件上运行的运行时系统中。
自有 ID: OTP-17185
Erts 10.7.2.7
修复的 Bug 和故障
suspend_process()
和resume_process()
BIF 没有正确检查它们的参数,这可能会导致模拟器崩溃。自有 ID: OTP-17080
如果运行时系统在启动时已经打开了 1023 个以上的文件描述符,则运行时系统将进入无限循环。
自有 ID: OTP-17088 辅助 ID: ERIERL-580
Erts 10.7.2.6
修复的 Bug 和故障
修复了接收信号(link/monitor/spawn_request/spawn_reply)和断开连接之间竞争中罕见的分配错误。症状:虚拟机崩溃。自:OTP 21.0。
自有 ID: OTP-16869 辅助 ID: ERL-1337
Erts 10.7.2.5
修复的 Bug 和故障
修复了在启用使用未记录和不支持的
SMALL_MEMORY
功能构建的系统上的 ERTS 内部分配器时导致问题的错误。自有 ID:OTP-16939
Erts 10.7.2.4
修复的 Bug 和故障
inet:setopts([{active,once}]) 不必要地唤醒 IO 轮询线程,导致锁争用和明显更高的 CPU 利用率。
自有 ID:OTP-16847 辅助 ID:ERL-1301
statistics(run_queue)
的文档错误地声明它返回所有正常运行队列的总长度,而实际上返回的是所有正常和脏 CPU 运行队列的总长度。已更新文档以反映实际行为。自有 ID:OTP-16866 辅助 ID:ERL-1355
修复了 ERTS 内部线程唤醒功能中的两个错误。这些错误主要在系统中所有线程都试图进入休眠时发生。当触发这些错误时,某些操作会被延迟,直到某个线程由于其他原因被唤醒。受影响的最重要操作是代码加载、持久术语更新和内存释放。
自有 ID:OTP-16870
修复了
ets:select_replace/2
在compressed
表上的错误,该错误可能产生错误的结果或 VM 崩溃。该错误自 OTP 20 起就存在。自有 ID:OTP-16874 辅助 ID:ERL-1356,PR-2763
改进和新功能
从 OTP 22 开始,特定于分配器的内存载体池被节点全局载体池所取代。不幸的是,在某些情况下,这会导致严重的内存碎片,因为长期存在的数据会分散到主要处理短期数据的分配器使用的载体中。
引入了一个新的命令行参数
+M<S>cp
,可以使用该参数启用旧的行为以及配置载体池的其他行为。为了配置旧的行为,为所有分配器提供特定于分配器的载体池,请在启动 Erlang 系统时将+Mucp :
(包括冒号字符)作为命令行参数传递给erl
。载体池的默认配置将在未来某个时候更改为
+Mucp :
,但不会在此补丁中更改。自有 ID:OTP-16856
Erts 10.7.2.3
修复的 Bug 和故障
ERTS 内部 I/O 轮询实现可能会进入不一致的状态,导致输入事件被忽略。
自有 ID:OTP-16780 辅助 ID:PR-2701
Erts 10.7.2.2
修复的 Bug 和故障
无意中重复使用已用过的模拟器内部事件对象可能导致线程的唤醒信号丢失。在最坏的情况下,这可能导致运行时系统挂起。不过,这种情况非常罕见。
自有 ID:OTP-16766 辅助 ID:ERL-1304
在非 Linux 系统上,NIF 线程和驱动程序线程在终止时会泄漏内部资源。在 Windows 上,这些资源是每个线程一个事件。在大多数其他系统上,每个线程泄漏一个互斥锁和一个条件变量。在那些缺少
pthread_cond_timedwait()
的其他系统上,还会泄漏一个管道及其文件描述符。自有 ID:OTP-16772 辅助 ID:ERL-1304
Erts 10.7.2.1
修复的 Bug 和故障
修复了 erl_crash.dump 生成中的一个错误,如果找到最近取消的计时器,则可能导致 SEGV 核心转储。
自有 ID:OTP-16596 辅助 ID:ERL-1105, PR-2606
在让步时,BIF 用于临时禁用垃圾回收的功能可能会导致执行此类 BIF 的进程上的系统任务队列不一致。进程系统任务例如在清除代码、垃圾收集文字数据以及从另一个进程发出普通垃圾收集时使用。
此错误不会频繁触发。连续多次代码清除操作会增加触发此错误的可能性。在观察到的情况下,这会导致挂起的代码清除操作。
自有 ID:OTP-16639 辅助 ID:ERL-1236
如果套接字在调用 recv 时关闭(被动模式下的套接字),则 SCTP 和 UDP recv/2,3 会无限期挂起。
自有 ID:OTP-16654 辅助 ID:ERL-1242
Erts 10.7.2
修复的 Bug 和故障
在删除之前,文字区域可能会过早地被释放。当一个终止进程有一个引用同时被删除的文字的复杂退出原因,或者当一个终止进程继续执行一个访问(通过堆)同时被删除的文字的脏 NIF 时,会发生这种情况。
自有 ID:OTP-16640 辅助 ID:OTP-16193
当检查正在执行脏 NIF 时终止的进程的代码时,VM 可能会崩溃。进程代码的检查是代码清除操作的一部分。
自有 ID:OTP-16641
low
优先级的系统任务没有像应该的那样与normal
优先级的系统任务交错执行。如果垃圾回收是从low
优先级进程请求的,这可能会导致另一个进程的垃圾回收延迟比预期的时间长。自有 ID:OTP-16642
Erts 10.7.1
修复的 Bug 和故障
[re:run(Subject, RE, [unicode])](
re:run/3
) 在Subject
包含非法 utf8 并且RE
作为二进制传递时,返回nomatch
而不是失败并出现badarg
错误异常。 这已得到纠正,同时还纠正了re:run()
错误情况下的减少计数。自有 ID:OTP-16553
修复了在清除模块或持久术语时可能导致模拟器崩溃的错误。
自有 ID:OTP-16555 辅助 ID:ERL-1188
修复了接收优化中的一个错误。这可能导致即使消息队列中存在匹配消息,
receive
也无法匹配。此错误是在 ERTS 版本 10.6 (OTP 22.2) 中引入的。自有 ID:OTP-16572 辅助 ID:ERL-1199, OTP-16269
Erts 10.7
修复的 Bug 和故障
gen_udp:recv(S, N, 0)
损坏了套接字的内部状态,因此在{active, once}
接收后,它总是返回{error, timeout}
,并浪费了接收到的 UDP 数据包。此错误现已修复。由 Alexander Petrovsky 报告并精确定位。
自有 ID:OTP-16059
原子 esock_atom_user 和 esock_atom_kernel 实际上从未创建。这现已得到纠正。
自有 ID:OTP-16381
修复了
socket
模块中可能导致调度程序死锁的错误。自有 ID:OTP-16384
修复了如果 NIF 模块被清除后调用 NIF 资源的
down
或stop
回调导致 VM 崩溃的错误。修复将延迟卸载,直到所有此类资源对象都被垃圾回收。自有 ID:OTP-16399
修复了
ets:update_counter/4
中的错误,当使用无效的UpdateOp
和不存在的Key
调用时,会导致ets:info(T,size)
返回不正确的值。该错误自 OTP-19.0.2 以来就存在。自有 ID:OTP-16404 辅助 ID:ERL-1127
修复了当进程调用阻止其他正常调度程序的 BIF,然后在没有主进程锁的情况下写入自己的堆时,可能导致堆损坏的错误。在脏调度程序上运行的 NIF 试图与这样的进程交互可能会损坏其堆。修复的 BIF 与代码加载和跟踪有关。
自有 ID:OTP-16417
修复了使用远程节点创建的引用调用
erlang:list_to_ref/1
中的错误。函数list_to_ref/1
旨在用于调试,而不是在应用程序中使用。该错误自 OTP 20.0 以来就存在。自有 ID:OTP-16438
prim_net nif (net/kernel) 使用了一个未定义的原子 notsup。这现已得到纠正。
自有 ID:OTP-16440
将
erl
命令行参数+SDio <NumberOfDirtyIoSchedulers>
的有效范围从0..1024
更正为1..1024
。+SDio 0
被错误地允许,这只会导致 VM 在第一个调度的脏 I/O 作业上崩溃。自有 ID:OTP-16481
修复了在早期启动期间加载文件时尝试记录故障时的崩溃问题。
自有 ID:OTP-16491
改进和新功能
对于 socket,并非所有发送和接收标志都在所有平台上都支持。为了(至少)简化测试,socket:supports/0,1,2,3 函数已扩展了 send_flags 和 recv_flags 项,指示当前平台可以管理的内容。
自有 ID:OTP-16153
在 net 模块中添加了 getifaddrs 的“全功能”版本。
自有 ID:OTP-16212 辅助 ID:ERL-1070
选项
busy_limits_port
和busy_limits_msgq
已添加到 BIFerlang:open_port/2
。busy_limits_port
选项可用于控制执行spawn_driver
或fd_driver
的端口的繁忙状态。busy_limits_msgq
选项可用于控制端口消息队列的繁忙状态。自有 ID:OTP-16306 辅助 ID:ERIERL-439
已添加套接字“注册表”,可以列出当前打开的套接字。
自有 ID:OTP-16309
套接字 nif 管理的计数器已扩展。它们的“大小”已从 32 位增加到 64 位。增加了两个最大数据包大小(用于读取和写入)。并添加了四个接受计数器。
自有 ID:OTP-16387
添加 gcc 选项
-fno-common
来检测全局变量的意外名称冲突。自有 ID:OTP-16420 辅助 ID:PR-2513
新的动态锁检查器,用于验证锁定顺序并检测驱动程序和 NIF 中的潜在死锁错误。与旧的静态锁检查器(用于 ERTS 内部锁)一起在以
-emu_type debug
启动的模拟器中启用,或使用配置选项--enable-lock-checking
构建的模拟器中启用。自有 ID:OTP-16427
Erts 10.6.4
修复的 Bug 和故障
一个进程可能会进入不一致的状态,其中它是可运行的,但从未被调度执行。当
normal
和low
优先级进程同时在相同类型的脏调度程序上调度时,可能会发生这种情况。自有 ID:OTP-16446 辅助 ID:ERL-1157
Erts 10.6.3
修复的 Bug 和故障
一个进程可能会陷入一种状态,即它被无限期地重新调度而没有任何进展。当系统任务(例如,检查进程代码(代码清除的一部分))在高优先级进程尝试在“脏”调度器上执行时被调度时,就会发生这种情况。
自身 ID:OTP-16436 辅助 ID:ERL-1152
改进和新功能
改进了在“脏”调度器上执行的进程的信号处理。例如,当进程在“脏”调度器上进行垃圾回收时,避免在“脏”信号处理程序进程中进行忙等待。
自身 ID:OTP-16358
Erts 10.6.2
已修复的错误和故障
使调度器离线可能会导致在该调度器上执行时设置的计时器延迟,直到该调度器再次上线。此错误是在 ERTS 版本 10.0 (OTP 21.0) 中引入的。
自身 ID:OTP-16371
当给定一个启用了写入并发且位置无效的 ordered_set 时,
ets:update_counter/4
核心转储。此错误已修复。自身 ID:OTP-16378 辅助 ID:ERL-1125
调用
erlang:system_flag(multi_scheduling, block)
的进程可能会无限期地阻塞等待操作完成。自身 ID:OTP-16379
改进和新功能
man 页面中 [socket:]getopt 和 [socket:]setopt 的重复条目。
自身 ID:OTP-16333 辅助 ID:ERL-1104
Erts 10.6.1
已修复的错误和故障
纠正了新的套接字 API 中可能导致核心转储的问题。套接字关闭期间的竞争可能导致核心转储(无效的 NIF 环境释放)。
自身 ID:OTP-16314 辅助 ID:ERL-1098
纠正了新的套接字 API 中可能导致核心转储的问题。当多个接受进程等待连接时,连接可能导致核心转储。
自身 ID:OTP-16359
Erts 10.6
已修复的错误和故障
当传递非常大的无效代码点作为输入时,函数
unicode:characters_to_list()
和unicode:characters_to_binary()
引发了badarg
异常,而不是返回错误元组。自身 ID:OTP-16052
file:allocate/3
现在可以在 Mac OS 上正常工作。自身 ID:OTP-16074 辅助 ID:ERL-1042,PR-2386
对于 socket,发送和接收标志的无效编码导致 badarg 和发送失败。
自身 ID:OTP-16149
修复了本机堆栈向上增长的平台(例如 HP PA-RISC)上的
re
中的一个错误。自身 ID:OTP-16150 辅助 ID:ERL-1043
对于 socket,无法在 FreeBSD 上正确解码时间戳控制消息标头。我们错误地使用了 SO_TIMESTAMP 标志来表示时间戳控制消息标头类型。它应该是 SCM_TIMESTAMP。这导致时间戳控制消息标头未被完全解码。
自身 ID:OTP-16151 辅助 ID:#2400
对于 socket,当将 IP 选项 'recvtos' 设置为 true,从而指示我们想要接收 TOS 控制消息标头时,我们实际上在 FreeBSD(以及可能其他系统)上获得的不是 TOS 而是 RECVTOS!这以前没有处理。
自身 ID:OTP-16152 辅助 ID:OTP-16114
修复了如果模拟器在启动期间崩溃会无限打印错误消息的错误。
自身 ID:OTP-16159 辅助 ID:ERL-1060
对于 socket,如果协议以 {raw, integer()} 的形式提供,则协议类型错误会导致分段错误。
自身 ID:OTP-16163 辅助 ID:ERL-1061
对于 socket,当将 IP 选项 'recvttl' 设置为 true,从而指示我们想要接收 TTL 控制消息标头时,我们实际上在 Solaris(以及可能其他系统)上获得的不是 TTL 而是 RECVTTL!这以前没有处理。
自身 ID:OTP-16172 辅助 ID:OTP-16114
对于 socket,IPv6 控制消息标头被错误地使用级别 IP 而不是 IPv6 解码。
自身 ID:OTP-16173
修复了配置错误,其中
clock_getres
不会被正确检测到,导致erlang:system_info(os_system_time_source)
返回不正确的分辨率。此错误影响所有使用
clock_gettime
获取时间的操作系统(基本上除了 Windows 之外的所有操作系统),并且自 OTP-19.2 以来一直存在。自身 ID:OTP-16191 辅助 ID:ERL-1067
修复了在 Windows 上构建 Erlang/OTP 时使用
ERLC_USE_SERVER=true
时的错误。更改编译服务器使用的 cookie 为硬编码,而不是使用用户的 cookie。
自身 ID:OTP-16192
修复了
persistent_term
列在 erts 应用程序文件中的问题。自身 ID:OTP-16194
修复了调用时间跟踪中的错误,该错误有时可能导致将调用时间测量归因于错误的函数。
自身 ID:OTP-16195 辅助 ID:ERL-1027
socket 套接字选项 'peek_off' 已禁用。如果设置了 peek_off,然后使用 peek 标志调用 socket:recv/3,则调用可能会挂起。
自身 ID:OTP-16196
处理可能未初始化的(控制消息标头)数据。
自身 ID:OTP-16197
对于 net,一些 NI 宏在新版本的 glibc 中已弃用,因此不再使用这些宏 (IDN_ALLOW_UNASSIGNED 和 IDN_USE_STD3_ASCII_RULES)。
自身 ID:OTP-16203
需要截断 get 操作中的字符串值。
自身 ID:OTP-16204
修复了针对命名进程的远程发送操作的误导性 seq_trace 消息。将接收器更改为
{Name,Node}
而不仅仅是Name
。自身 ID:OTP-16206 辅助 ID:PR-2423
修复了导致
net_kernel:monitor_nodes(true, [nodedown_reason])
报告的实际节点关闭原因丢失并被原因killed
替换的错误。自身 ID:OTP-16216
对于 socket,打印警告消息和调试输出时使用的时间戳创建不起作用。使用的缓冲区太小。
自身 ID:OTP-16223
修复了 GCC 8 生成的编译器警告
自身 ID:OTP-16235
修复
erl -emu_type
以接受选项opt
,这意味着正常的优化模拟器。这可以用来覆盖环境变量中的-emu_type
选项。自身 ID:OTP-16297
纠正了函数规范,以反映函数 socket:bind 的实际代码。
自身 ID:OTP-16310 辅助 ID:ERL-1082
修复了当使用
compressed
选项且术语包含原子时,ETS 查找中的性能问题。在此修复之前,原子的解压缩算法会不必要地获取全局锁来验证原子。自身 ID:OTP-16316
改进和新功能
对于 socket,并非所有发送和接收标志都在所有平台上都支持。为了(至少)简化测试,socket:supports/0,1,2,3 函数已扩展了 send_flags 和 recv_flags 项,指示当前平台可以管理的内容。
自有 ID:OTP-16153
对于 socket,添加对 IPv6 套接字选项 tclass 和 recvtclass 的支持。两者都已添加,但它们的使用取决于平台。调用 socket:supports(options, ipv6, Opt) 以确保使用哪个选项来请求 TCLASS 控制消息标头。
自身 ID:OTP-16180
对于 socket,TCP 套接字选项 cork 不被支持,即使 supports 函数报告它是这样的。
自身 ID:OTP-16205
Kernel 应用程序的用户指南现在包含一个带有常用用法模式的 Logger Cookbook。
自身 ID:OTP-16208
在 net 模块中添加了 getifaddrs 的“全功能”版本。
自有 ID:OTP-16212 辅助 ID:ERL-1070
修复了 OTP-16241 中的错误修复引入的效率低下问题,该问题修复了接收优化的问题。当接收进程的邮箱为空时,使用接收优化且消息爆发式到达时,该错误修复引入了效率低下问题。
自身 ID:OTP-16269 辅助 ID:OTP-16241
对于 socket,添加了对套接字选项 extended_err 的支持。Andreas Schultz。
自身 ID:OTP-16302 辅助 ID:#2449
当在仅启用一个调度器的系统中运行时,已优化 ETS 表以不使用任何锁。这可以为大量使用 ETS 表的应用程序提供显着的性能提升。
自身 ID:OTP-16315
Erts 10.5.6
已修复的错误和故障
大量快速执行的脏工作可能会导致内部自旋锁上的严重争用。自旋锁已被互斥锁替换,在这些条件下,互斥锁的表现要好得多。
自身 ID:OTP-16301 辅助 ID:ERL-1079
Erts 10.5.5
已修复的错误和故障
在删除之前,文字区域可能会过早地被释放。当一个终止进程有一个引用同时被删除的文字的复杂退出原因,或者当一个终止进程继续执行一个访问(通过堆)同时被删除的文字的脏 NIF 时,会发生这种情况。
自身 ID:OTP-16193
修复了由于分布条目的内存损坏而导致 VM 崩溃的错误。如果 Erlang 分布频繁断开并重新建立与相同节点名称的连接,则崩溃的可能性会增加。该错误自 OTP-21.0 以来就存在。
自身 ID:OTP-16224 辅助 ID:ERL-1044
修复了导致使用配置
--enable--sharing-preserving
构建的 VM 崩溃的错误。当发送的消息包含位串和与位串匹配的堆二进制文件(< 65 字节)时会触发此问题。该错误自 OTP-19.0 以来就存在,但自 OTP-22.1 以来更容易触发。自身 ID:OTP-16265 辅助 ID:ERL-1064
Erts 10.5.4
已修复的错误和故障
编译器可能对接收操作进行不安全的优化,导致接收操作只扫描消息队列的一部分。
编译器中的此错误修复修复了套接字模块中的一个错误。
内部 ID: OTP-16219 辅助 ID: ERL-1076
修复了运行时用于执行接收队列优化的接收标记可能被错误设置的错误。此问题的症状是,本应匹配的接收消息永远无法匹配。
此错误需要 OTP-22 编译器和多个选择性接收才能触发。有关编译器中的此错误修复的详细信息,请参阅 OTP-16219。
内部 ID: OTP-16241 辅助 ID: ERL-1076 OTP-16219
Erts 10.5.3
已修复的错误和故障
现在可以在 macOS Catalina (10.15) 上构建 Erlang/OTP。
内部 ID: OTP-16177 辅助 ID: ERL-1063
Erts 10.5.2
改进和新功能
添加了环境变量
ERLC_SERVER_ID
,允许在同一用户下单独运行多个编译服务器。内部 ID: OTP-16125 辅助 ID: ERIERL-412
Erts 10.5.1
已修复的错误和故障
正在终止的进程在终止时发送分布式
'EXIT'
或'DOWN'
信号,可能最终处于完全无法取得进展的状态。这是由于终止进程正在发送的分布式通道变得繁忙而触发的。此错误自 ERTS 版本 10.4 (OTP 22.0) 以来就存在。内部 ID: OTP-16069
当通过
erlang:port_*()
BIF 与同时退出的端口通信时,有时可能会收到无关的{Ref, What}
消息。其中Ref
是一个引用,What
通常是原子badarg
。内部 ID: OTP-16107 辅助 ID: ERL-1049
Erts 10.5
已修复的错误和故障
如果在
gen_tcp
监听套接字上设置{linger,{true,0}}
,在该套接字上接受连接,然后关闭接受的套接字,现在延迟为零的设置会传输到接受的套接字。在此更正之前,该信息会丢失,并且接受的套接字的关闭行为不正确。内部 ID: OTP-15370 辅助 ID: ERIERL-353
在 OTP-15747 中实现的发送辅助数据意外地留下了测试代码,导致 Windows 上所有 UDP 发送失败。现在已修复此问题。
内部 ID: OTP-15422 辅助 ID: OTP-15747
在套接字 nif 中,为支持的 TCP 标志(TCP_MAXSEG 和 TCP_NODELAY (支持函数))进行 if-def 时,使用了无效的标志。
内部 ID: OTP-15827
修复了实验性套接字模块中的内存泄漏。
内部 ID: OTP-15830
re:run()
现在会在验证大型主题中的 utf8 时产生结果。内部 ID: OTP-15836 辅助 ID: ERL-876
修复了
seq_trace:set_token(label,Term)
中的错误,如果Term
是堆分配的(不是原子、小整数、本地 pid 或端口),则可能导致 VM 崩溃。此错误自 OTP 21.0 起存在,当时首次允许将除小整数之外的术语用作标签。内部 ID: OTP-15849 辅助 ID: ERL-700
传递给
erl
的额外-mode
标志将被忽略并显示警告。内部 ID: OTP-15852
当向 configure 提供
--enable-pgo
但编译器不支持 pgo 时,不要无限循环。内部 ID: OTP-15853 辅助 ID: PR-2254
修复
seq_trace:print/2
,如果标签不是小整数,则不会引发badarg
异常。此错误自 OTP 21.0 起存在。内部 ID: OTP-15859 辅助 ID: ERL-700
修复了 ARM 上非 Linux 操作系统中的 hipe_flush_icache_range。
内部 ID: OTP-15874 辅助 ID: ERL-958, PR-2266
OTP-15871 中的修复过于保守,在某些安全的情况下禁用了有问题的加载时优化。
内部 ID: OTP-15881
将 ERTS 内部 PCRE 库从版本 8.42 升级到版本 8.43。有关对 PCRE 所做更改的信息,请参阅 http://pcre.org/original/changelog.txt。此库实现了
re
正则表达式模块的主要部分。内部 ID: OTP-15889
修复了在 Windows 上使用
{active,N}
时关闭套接字时的竞争条件。内部 ID: OTP-15901 辅助 ID: ERL-960 PR-2272
允许在 Windows 上向
erl
提供多个-config
命令行选项,以与其他操作系统保持一致。内部 ID: OTP-15918 辅助 ID: ERL-912
修复了 ERL_FLAGS 环境变量不干扰命令行参数的问题。在此修复之前,您可以编写
ERL_FLAGS="10" erl +S
Erlang 将启动,就像
+S
被赋予了参数10
一样。内部 ID: OTP-15931
已修复 ID 为 ERL-717 的错误。在此修复之前,函数
io:columns()
和io:rows()
仅在交互式 erlang shell 中正常工作。在此修复之前,即使 stdout 和 stdin 在从 escript 或使用例如erl -noshell
启动的程序调用时连接到终端,这些函数也会返回{error,enotsup}
。内部 ID: OTP-15959 辅助 ID: ERL-717
不要在
ethread.c
内联汇编中使用命名标签。这允许使用启用了 LTO 的 gcc 9.1.0 编译 erts。内部 ID: OTP-15971 辅助 ID: PR-2333
erlang:fun_to_list/1
现在将在必要时转义模块和函数名称。内部 ID: OTP-15975 辅助 ID: ERL-1009
process_info(P,binary)
将忽略搜索堆片段,可能会遗漏与该进程关联的一些二进制文件。内部 ID: OTP-15978 辅助 ID: ERIERL-366
现在在具有非 glibc 实现(例如 musl)的系统上自动禁用 HiPE。这是因为 musl 没有提供用于保证在正确的本机堆栈上传递信号的 API。
内部 ID: OTP-16037
修复了在调用
persistent_term:put
或persistent_term:erase
期间进程被终止时触发的错误。内部 ID: OTP-16041
在崩溃转储文档中向所有内存标语添加单位。
内部 ID: OTP-16042
修复了
binary_to_term
中的一个错误,如果解码的术语大于 16GB,则会导致模拟器崩溃。内部 ID: OTP-16058 辅助 ID: PR-2382
修复了与正在退出的进程向远程链接/监视进程发送 EXIT 和 DOWN 信号相关的错误。此错误自 OTP 22.0 起存在。
内部 ID: OTP-16060
改进和新功能
erlc
现在可以自动使用编译服务器,以避免在多文件项目中为每个要编译的文件启动 Erlang 系统。请参阅文档以了解如何启用它。内部 ID: OTP-15738 辅助 ID: PR-2361
已将发送辅助数据(尤其是 TOS 字段)的可能性添加到
gen_udp:send/4,5
中。内部 ID: OTP-15747 辅助 ID: ERIERL-294
net 模块已拆分为“net”(内核)和 prim_net(预加载)。
内部 ID: OTP-15765
套接字计数器现在按预期工作,也可以使用(新的)info 函数提取。
内部 ID: OTP-15818
re:run()
现在避免在同一调用中多次验证主题中的 utf8。以前在传递global
选项时可能会多次执行此验证。内部 ID: OTP-15831 辅助 ID: ERL-876
未公开的函数
erlang:dist_get_stat/1
现在返回分布队列中包含内容的真实值,而不是布尔值。内部 ID: OTP-15905 辅助 ID: PR-2270
启用了
write_concurrency
的 ETSordered_set
表修复了一个性能问题。在此修复之前,内部统计计数器的值没有限制。这可能会导致数据结构有时对使用它的并行进程数量的变化反应缓慢。内部 ID: OTP-15906
优化大型分布消息的接收。
内部 ID: OTP-15926 辅助 ID: PR-2291
当结果足够小时,二进制匹配和诸如
split_binary/2
之类的函数现在将创建堆二进制文件,从而减少小型子二进制文件使大型二进制文件保持活动状态的可能性。内部 ID: OTP-15977 辅助 ID: ERIERL-366
修复了
instrument:allocations/0-1
中罕见的模拟器崩溃。内部 ID: OTP-15983
端口可以将非常小的二进制文件作为引用计数的堆外二进制文件传递给进程。这可能会导致不必要的内存使用量以及二进制分配器上不必要的负载。现在,小型二进制文件始终作为堆二进制文件传递给进程。
内部 ID: OTP-16001 辅助 ID: ERIERL-366
unicode:characters_to_binary()
可能会将非常小的二进制文件作为引用计数的堆外二进制文件返回。这可能会导致不必要的内存使用量以及二进制分配器上不必要的负载。现在,小型二进制文件始终作为堆二进制文件返回。内部 ID: OTP-16002 辅助 ID: ERIERL-366
改进了关于
on_load
和 Erlang stub/fallback 函数的erl_nif
文档。内部 ID: OTP-16028 辅助 ID: PR-2362
新功能
ets:info(_, binary)
用于获取有关表保留的所有引用计数二进制文件的信息。这与process_info(_, binary)
为进程返回的调试信息类型相同。内部 ID: OTP-16035 辅助 ID: ERIERL-366
Erts 10.4.4
修复的 Bug 和故障
一个无效值测试导致 socket:setopt(Socket, ip, add_membership, ip_mreq()) 因 badarg 而失败。drop_membership 也存在同样的问题。
内部 ID: OTP-15908 辅助 ID: ERL-980
修复了当对包含未处理的 monitor down 信号的进程进行文本转储时导致 VM 崩溃的 Bug。文本进程转储可以使用
erlang:system_info(procs)
、跟踪功能process_dump
、Erlang shell 中断菜单和崩溃转储完成。此 Bug 自 OTP 21.0 起存在。内部 ID: OTP-15909 辅助 ID: ERL-979
lists:subtract/2
在 64 位平台上对某些输入会产生不正确的结果。内部 ID: OTP-15938 辅助 ID: ERL-986
修复了加载器中类似于
OTP-15938
的 Bug,该 Bug 在 64 位平台上对某些输入产生不正确的代码。内部 ID: OTP-15939
修复了在极少数情况下导致调度器线程无限期阻塞的 Bug。此 Bug 自 OTP 21.0 起存在。
内部 ID: OTP-15941 辅助 ID: PR-2313
Erts 10.4.3
修复的 Bug 和故障
修复了当使用
latin1
编码使用binary_to_existing_atom/2
和list_to_existing_atom/2
时发生的缓冲区溢出。内部 ID: OTP-15819 辅助 ID: ERL-944
如果运行时系统接收到一个
exit/2
信号,而接收者是当前节点的旧实例上的进程,则该运行时系统会断开连接。也就是说,接收节点具有相同的节点名称,但具有不同的“创建”编号。由于接收进程不再存在,该信号现在将被丢弃。内部 ID: OTP-15867 辅助 ID: ERIERL-373
Erts 10.4.2
修复的 Bug 和故障
修复了
process_info(Pid,reductions)
,使其不再绝对增加被测进程Pid
的规约计数。对空闲进程的重复规约测量将最经常(但不能保证)返回相同的值,就像 OTP 21.3.8 之前的行为一样。内部 ID: OTP-15865 辅助 ID: ERL-964
修复了一个不正确的加载时优化,该优化可能在提取深层嵌套的元组元素时导致崩溃。
内部 ID: OTP-15871 辅助 ID: ERIERL-374
修复了在 Erlang shell 中断菜单中按 P 键以获取“进程信息”时导致 VM 崩溃的 Bug。此 Bug 自 OTP 22.0 起存在。
内部 ID: OTP-15873 辅助 ID: ERL-965
Erts 10.4.1
修复的 Bug 和故障
在嵌套使用
try
/catch
的情况下,使用不同类别的erlang:raise/3
重新抛出异常并非总是能够更改异常的类别。内部 ID: OTP-15834 辅助 ID: ERIERL-367
Erts 10.4
修复的 Bug 和故障
当附加空二进制文件时不分配新的位串/二进制文件。
内部 ID: OTP-15535 辅助 ID: PR-2055
记录
process_info(_, current_function)
在执行本机代码时可以返回{current_function, undefined}
。内部 ID: OTP-15543 辅助 ID: PR-2089
修复了
ets:select
、ets:match
和相关函数中的 Bug,该 Bug 可能导致在调用返回后表保持固定状态(如同调用了ets:safe_fixtable
)。如果另一个并发运行的进程在其 ets:select/match 调用期间将表的所有权转移给该进程,则可能会为protected
表发生这种情况。可以使用ets:give_away
或heir
表选项转移所有权。内部 ID: OTP-15672
修复了
file:list_dir/1
中特定于 Windows 的 Bug,该 Bug 导致其在网络共享上行为不正常。内部 ID: OTP-15693
修复了从 NIF 资源析构函数调用
enif_whereis_*
时的 Bug。症状可能是模拟器崩溃或挂起的调度器线程。内部 ID: OTP-15694 辅助 ID: ERL-863
修复了
apply/3
错误情况中的 Bug,其中在某些情况下,异常会错误地包含一个空的参数列表。内部 ID: OTP-15698
已修复
maps
实现中的一个 Bug,该 Bug 可能导致崩溃或内存使用量增长,直到计算机耗尽内存。当将包含二进制文件B1
的新键值对插入到具有包含二进制文件B2
的键K2
的映射M
中时,如果满足以下条件,则可能会发生这种情况B1 =/= B2
size(B1) >= 4294967296
size(B2) >= 4294967296
size(M) >= 32
(size(B1) rem 4294967296) == (size(B2) rem 4294967296)
B1
和B2
中前(size(B1) rem 4294967296)
个字节相同- 用
B2
替换K1
中的B1
将创建一个与K2
具有相同值的项
问题的根本原因是
maps
实现仅哈希了二进制文件的前(X rem 4294967296)
个字节,因此不同的二进制文件可以独立于哈希种子获得相同的哈希值。内部 ID: OTP-15707
当尝试编码大于 4 GB 的二进制文件时,
term_to_binary()
和分布式发送现在将抛出system_limit
异常,而不是产生错误的结果。内部 ID: OTP-15708
vxworks 配置已更新,以遵循环境 CFLAGS。
内部 ID: OTP-15773
修复了在 PGO(配置文件引导的优化)二进制文件的链接失败时,配置不启用 PGO 的问题。例如,当没有安装 gcov 库时会发生这种情况。
内部 ID: OTP-15788
修复了 OpenBSD 上的 Bug,其中使用
active, true
或active, N
的套接字可能导致系统死锁。此 Bug 在 erts-10.2 (OTP-21.2) 中引入。内部 ID: OTP-15791
改进和新功能
增加了对 Erlang 分布协议的支持,以将大型信号的有效负载拆分为多个片段。这允许其他进程在这些信号传输期间不中断地进行通信。
内部 ID: OTP-13397
通过 socket 模块提供了一个简单的套接字 API。这是一个低级 API,它不替换 gen_[tcp|udp|sctp]。它的目的是最终替换 inet 驱动程序,而不是高级 gen 模块(gen_tcp、gen_udp 和 gen_sctp)。它还提供了一个基本 API,有助于实现其他协议,即 TCP、UDP 和 SCTP。
已知问题是:不支持 Windows 操作系统(当前)。
内部 ID: OTP-14831
添加了 NIF 函数
enif_set_pid_undefined
、enif_is_pid_undefined
和enif_compare_pids
。内部 ID: OTP-15011 辅助 ID: PR-2147
未充分利用的内存段(载体)现在可以在所有分配器实例之间移动,而不仅仅是在同一类型的实例之间移动,这在某些情况下大大减少了内存使用量。
内部 ID: OTP-15063
模拟器现在将使用
madvise(2) + MADV_FREE
(或类似)标记池化载体中的空闲块,从而允许操作系统在必要时回收相关的物理内存。内部 ID: OTP-15075
新的
ERL_NIF_SELECT_CANCEL
功能已添加到enif_select
中,以便取消(或“取消选择”)先前选择的文件描述符上的读取或写入事件。内部 ID: OTP-15095
ETS 选项
write_concurrency
现在也影响并提高了ordered_set
表的可扩展性。该实现基于一种称为争用自适应搜索树的数据结构,其中锁粒度会适应应用程序在运行时利用的实际并发量。内部 ID: OTP-15128
crypto
应用程序的构建配置已从erts
应用程序移动到crypto
应用程序。内部 ID: OTP-15129
不捕获环境的匿名函数现在在加载时创建,而不是在运行时创建。
内部 ID: OTP-15195 辅助 ID: PR-1812
优化具有相同键和值的映射的更新。例如,在下面的示例中,原始 Map 将被重用为更新的返回值。
1> Map = #{ a => b }. #{ a => b } 2> Map#{ a := b }.
内部 ID: OTP-15211 辅助 ID: PR-1889
优化
binary:match/2
和binary:matches/2
以在内部使用 memchr。内部 ID: OTP-15238 辅助 ID: PR-1803
当通过分布传递大于 2 Gb 的消息时,运行时系统过去会终止。现在,发送操作将抛出
system_limit
异常。内部 ID: OTP-15261
更改了 erts 调用的第一个模块的名称,使其为 erl_init 而不是 otp_ring0。 sasl 中的 systools 已更新以反映此更改。
内部 ID: OTP-15336 辅助 ID: PR-1825
对用于并行配置的构建系统进行了小的调整。
内部 ID: OTP-15340 辅助 ID: OTP-14625
两个新的 NIF 接口函数
enif_select_read
和enif_select_write
。它们与现有的enif_select
类似,但允许将自定义事件消息作为参数。内部 ID: OTP-15349 辅助 ID: PR-2084
嵌入的
zlib
副本已从1.2.8
更新到1.2.11
。请注意,此副本仅在目标平台不提供任何
zlib
开发库时用作后备。如果您的系统提供了zlib
,即使它比1.2.11
旧,也会使用它。自有 ID:OTP-15351 辅助 ID:ERL-749
新的 NIF 函数
enif_make_monitor_term
。自有 ID:OTP-15362 辅助 ID:PR-2127
追加列表(++ 运算符)现在会在大输入时正确让步。
自有 ID:OTP-15427
length/1
BIF 过去会一次性计算列表的长度而不让步,即使列表很长。在 OTP 22 中,当使用长列表调用length/1
时,它会进行让步。自有 ID:OTP-15439
现在,发送消息的进程会根据消息大小受到一定的归约成本惩罚。也就是说,发送大型消息的进程会比以前更早让步。
自有 ID:OTP-15513 辅助 ID:ERL-773
已移除临时的仿真器选项
+ztma true
(在 OTP 21.3 中引入)。自有 ID:OTP-15581 辅助 ID:OTP-15580
在 OTP 22 中,HiPE(本机代码编译器)不是完全可用的。原因如下:
存在新的用于二进制匹配的 BEAM 指令,而 HiPE 本机代码编译器不支持这些指令。
Erlang 编译器中的新优化创建了 HiPE 当前无法正确处理的新指令组合。
如果使用
+native
选项调用 erlc,并且使用了任何新的二进制匹配指令,编译器将发出警告并生成不包含本机代码的 BEAM 文件。自有 ID:OTP-15596
进程的终止行为已更改,允许进程在发送链接退出/监视停止信号时进行让步。
erl 崩溃转储已扩展为现在还包括正在终止但尚未终止的进程。
自有 ID:OTP-15610
dist 消息 EXIT、EXIT2 和 MONITOR_DOWN 已更新为新版本,这些版本将原因项作为消息有效负载的一部分发送,而不是作为控制消息的一部分发送。
旧版本仍然存在,并且可以在与不支持新版本的节点通信时使用。
自有 ID:OTP-15611
在发送消息、退出、退出 2 和监视停止分布式信号时,发送进程现在会适当地让步。
这意味着终止进程会在终止时让步,并且可能会在忙碌的分布条目上暂停。这意味着此类进程持有的任何内存都不会在发送所有退出/监视停止信号后才被释放。
自有 ID:OTP-15612
由 erlang:list_to_pid/port/ref 调试函数创建的所有外部 pid/port/refs 现在与来自该节点的任何其他具有相同数字的 pid/port/ref 相等。
在此更改之前,它们的比较结果不同,因为 pid/port/ref 的节点创建与任何实际的 pid/port/ref 创建不相等。
这将主要影响在 shell 中键入的 pid/port/refs。
自有 ID:OTP-15613
persistent_term
函数put/2
和erase/1
现在进行让步。自有 ID:OTP-15615
添加了新的
erlang:dist_ctrl_set_opt(DHandle, get_size, Value)
选项。此选项使您可以配置由DHandle
标识的分布通道,以便erlang:dist_ctrl_get_data(DHandle)
也返回要通过通道传递的数据的大小。自有 ID:OTP-15617
以前,所有 ETS 表都使用集中的计数器变量来跟踪存储的项目数量和消耗的内存量。这些计数器可能会导致可伸缩性问题(尤其是在大型 NUMA 系统上)。此更改添加了分散计数器的实现,并修改了 ETS 的实现,以便启用了
write_concurrency
的类型为ordered_set
的 ETS 表使用分散计数器。实验表明,此更改显着提高了启用了write_concurrency
的 ETSordered_set
表在频繁调用ets:insert/2
和ets:delete/2
的场景中的可伸缩性。自有 ID:OTP-15623 辅助 ID:PR-2190
iolist_size/1
函数现在进行让步,这意味着即使在系统上运行的应用程序频繁使用大型 iolist 调用iolist_size/1
,Erlang/OTP 系统也将保持响应。自有 ID:OTP-15631
已添加一个用于 net 模块的简单测试套件。
自有 ID:OTP-15635
添加了 NIF 函数
enif_term_type
,通过返回给定项的类型,有助于避免冗长的enif_is_xyz
序列。这对于序列化项的 NIF(例如 JSON 编码器)尤其有用,在这些 NIF 中,它可以提高性能和可读性。自有 ID:OTP-15640
尾调用优化现在应用于 BIF。当在函数的尾部位置调用 BIF 时,将在调用 BIF 之前丢弃返回地址和堆栈帧。作为此更改的结果,尾调用的 BIF 的直接调用方将不再在堆栈回溯中可用。
自有 ID:OTP-15674 辅助 ID:PR-2177
修复了 GC 错误,该错误会导致进程邮箱中的分布式消息导致额外的 GC。如果邮箱中有许多消息,这可能代价很高。
自有 ID:OTP-15703
现在已将内部文档添加到 *Erts* 和 *Compiler* 应用程序。
Erts 的内部文档描述了各种有趣的实现细节。这些细节可能随时更改。
Compiler 的内部文档记录了 Core Erlang 模块的 API。虽然我们不会在没有充分理由的情况下更改这些 API,但我们不会像 OTP 中其余的 API 那样保证向后兼容性。
自有 ID:OTP-15715
非大整数算术的性能已得到提高。
自有 ID:OTP-15740
如果未给出节点名称,则
erl
的-remsh
选项现在会自动将本地系统的主机名添加到目标节点。例如:erl -name foo -remsh bar
erl -sname foo -remsh bar
自有 ID:OTP-15794 辅助 ID:PR-2219
Erts 10.3.5.19
修复的错误和故障
修复了匹配规范编译器中的一个错误,该错误被发现在调试虚拟机上,对于某些匹配规范会导致堆栈溢出崩溃。可能对标准虚拟机造成问题,但尚未验证。匹配规范由
ets:match/select
函数和erlang:trace_pattern
使用。自有 ID: OTP-17379 辅助 ID: PR-4804
如果端口繁忙且调用进程在调用时有传入信号,则调用
port_command()
可能会导致调度程序进入无限循环。此错误是在 OTP 23.3.2(ERTS 版本 11.2.1)、OTP 22.3.4.18(ERTS 版本 10.7.2.10)和 OTP 21.3.8.23(ERTS 版本 10.3.5.18)中引入的。自身 ID: OTP-17448 辅助 ID: GH-4898, PR-4903, OTP-17291
Erts 10.3.5.18
修复的错误和故障
以下信号可能在同一发送者到同一接收者的其他信号之前传递。也就是说,这些信号可能到达得太早。
garbage-collect
请求。使用garbage_collect/0
BIF 之一从一个进程发送到另一个进程。check-process-code
请求。使用check_process_code()
BIF 之一从一个进程发送到另一个进程。is-process-alive
回复。作为进程调用is_process_alive()
BIF 的响应发送。process-info
回复。作为进程调用process_info()
BIF 之一的响应发送。port-command
回复。作为进程调用port_command()
BIF 之一的响应发送。port-connect
回复。作为进程调用port_connect()
BIF 的响应发送。port-close
回复。作为进程调用port_close()
BIF 的响应发送。port-control
回复。作为进程调用port_control()
BIF 的响应发送。port-call
回复。作为进程调用port_call()
BIF 的响应发送。port-info
回复。作为进程调用port_info()
BIF 之一的响应发送。
自有 ID: OTP-17291
文字区域的垃圾回收错过了完全由文字区域中的项组成的消息。这反过来可能导致运行时系统崩溃。
自有 ID: OTP-17307
当启用顺序跟踪时,调用
process_flag(message_queue_data, off_heap)
可能会导致运行时系统崩溃。自有 ID: OTP-17349
Erts 10.3.5.17
修复的错误和故障
修复了计时器实现中的一个错误,该错误可能导致设置为未来超过 37.25 小时的计时器被延迟。如果安排了多个计时器在非常接近的时间触发,但仍然在不同的时间,并且处理计时器的调度器线程无法足够快地处理它们,则可能发生这种情况。在这种情况下,当触发另一个无关计时器时,会触发延迟的计时器。
自有 ID: OTP-17253
改进和新功能
修复了当使用 sendfile 且远程端关闭连接时发生的文件描述符泄漏。此错误自 OTP-21.0 起存在。
自有 ID: OTP-17244
Erts 10.3.5.16
修复的错误和故障
修复了一个错误,该错误可能导致某些计划在调度器线程上执行的工作被延迟,直到出现其他类似的工作。除了延迟各种内部数据结构的清理外,以下内容也可能被延迟
- 分配控制器进程的终止
- 在节点上禁用分配
- 使用
instrument
模块收集内存分配器信息 - 启用、禁用和收集
msacc
信息 - 当监视时间偏移时,传递
'CHANGE'
消息 - 调用
erlang:cancel_timer()
- 调用
erlang:read_timer()
调用
erlang:statistics(io | garbage_collection | scheduler_wall_time)
- 调用
ets:all()
- 调用
erlang:memory()
调用
erlang:system_info({allocator | allocator_sizes, _})
- 调用
erlang:trace_delivered()
该错误存在于除 x86/x86_64 以外的所有类型硬件上运行的运行时系统中。
自有 ID: OTP-17185
Erts 10.3.5.15
修复的错误和故障
修复了接收信号(link/monitor/spawn_request/spawn_reply)和断开连接之间竞争中罕见的分配错误。症状:虚拟机崩溃。自:OTP 21.0。
自有 ID: OTP-16869 辅助 ID: ERL-1337
suspend_process()
和resume_process()
BIF 没有正确检查它们的参数,这可能会导致模拟器崩溃。自有 ID: OTP-17080
如果运行时系统在启动时已经打开了 1023 个以上的文件描述符,则运行时系统将进入无限循环。
自有 ID: OTP-17088 辅助 ID: ERIERL-580
Erts 10.3.5.14
修复的错误和故障
ERTS 内部 I/O 轮询实现可能会进入不一致的状态,导致输入事件被忽略。
自有 ID:OTP-16780 辅助 ID:PR-2701
statistics(run_queue)
的文档错误地声明它返回所有正常运行队列的总长度,而实际上返回的是所有正常和脏 CPU 运行队列的总长度。已更新文档以反映实际行为。自有 ID:OTP-16866 辅助 ID:ERL-1355
修复了 ERTS 内部线程唤醒功能中的两个错误。这些错误主要在系统中所有线程都试图进入休眠时发生。当触发这些错误时,某些操作会被延迟,直到某个线程由于其他原因被唤醒。受影响的最重要操作是代码加载、持久术语更新和内存释放。
自有 ID:OTP-16870
修复了
ets:select_replace/2
在compressed
表上的错误,该错误可能产生错误的结果或 VM 崩溃。该错误自 OTP 20 起就存在。自有 ID:OTP-16874 辅助 ID:ERL-1356,PR-2763
Erts 10.3.5.13
修复的错误和故障
无意中重复使用已用过的模拟器内部事件对象可能导致线程的唤醒信号丢失。在最坏的情况下,这可能导致运行时系统挂起。不过,这种情况非常罕见。
自有 ID:OTP-16766 辅助 ID:ERL-1304
在非 Linux 系统上,NIF 线程和驱动程序线程在终止时会泄漏内部资源。在 Windows 上,这些资源是每个线程一个事件。在大多数其他系统上,每个线程泄漏一个互斥锁和一个条件变量。在那些缺少
pthread_cond_timedwait()
的其他系统上,还会泄漏一个管道及其文件描述符。自有 ID:OTP-16772 辅助 ID:ERL-1304
Erts 10.3.5.12
修复的错误和故障
在让步时,BIF 用于临时禁用垃圾回收的功能可能会导致执行此类 BIF 的进程上的系统任务队列不一致。进程系统任务例如在清除代码、垃圾收集文字数据以及从另一个进程发出普通垃圾收集时使用。
此错误不会频繁触发。连续多次代码清除操作会增加触发此错误的可能性。在观察到的情况下,这会导致挂起的代码清除操作。
自有 ID:OTP-16639 辅助 ID:ERL-1236
在删除之前,文字区域可能会过早地被释放。当一个终止进程有一个引用同时被删除的文字的复杂退出原因,或者当一个终止进程继续执行一个访问(通过堆)同时被删除的文字的脏 NIF 时,会发生这种情况。
自有 ID:OTP-16640 辅助 ID:OTP-16193
当检查正在执行脏 NIF 时终止的进程的代码时,VM 可能会崩溃。进程代码的检查是代码清除操作的一部分。
自有 ID:OTP-16641
low
优先级的系统任务没有像应该的那样与normal
优先级的系统任务交错执行。如果垃圾回收是从low
优先级进程请求的,这可能会导致另一个进程的垃圾回收延迟比预期的时间长。自有 ID:OTP-16642
Erts 10.3.5.11
修复的错误和故障
[re:run(Subject, RE, [unicode])](
re:run/3
) 在Subject
包含非法 utf8 并且RE
作为二进制传递时,返回nomatch
而不是失败并出现badarg
错误异常。 这已得到纠正,同时还纠正了re:run()
错误情况下的减少计数。自有 ID:OTP-16553
修复了在清除模块或持久术语时可能导致模拟器崩溃的错误。
自有 ID:OTP-16555 辅助 ID:ERL-1188
Erts 10.3.5.10
修复的错误和故障
修复了
ets:update_counter/4
中的错误,当使用无效的UpdateOp
和不存在的Key
调用时,会导致ets:info(T,size)
返回不正确的值。该错误自 OTP-19.0.2 以来就存在。自有 ID:OTP-16404 辅助 ID:ERL-1127
一个进程可能会进入不一致的状态,其中它是可运行的,但从未被调度执行。当
normal
和low
优先级进程同时在相同类型的脏调度程序上调度时,可能会发生这种情况。自有 ID:OTP-16446 辅助 ID:ERL-1157
将
erl
命令行参数+SDio <NumberOfDirtyIoSchedulers>
的有效范围从0..1024
更正为1..1024
。+SDio 0
被错误地允许,这只会导致 VM 在第一个调度的脏 I/O 作业上崩溃。自有 ID:OTP-16481
Erts 10.3.5.9
修复的错误和故障
一个进程可能会陷入一种状态,即它被无限期地重新调度而没有任何进展。当系统任务(例如,检查进程代码(代码清除的一部分))在高优先级进程尝试在“脏”调度器上执行时被调度时,就会发生这种情况。
自身 ID:OTP-16436 辅助 ID:ERL-1152
修复了使用远程节点创建的引用调用
erlang:list_to_ref/1
中的错误。函数list_to_ref/1
旨在用于调试,而不是在应用程序中使用。该错误自 OTP 20.0 以来就存在。自有 ID:OTP-16438
Erts 10.3.5.8
修复的错误和故障
使调度器离线可能会导致在该调度器上执行时设置的计时器延迟,直到该调度器再次上线。此错误是在 ERTS 版本 10.0 (OTP 21.0) 中引入的。
自身 ID:OTP-16371
调用
erlang:system_flag(multi_scheduling, block)
的进程可能会无限期地阻塞等待操作完成。自身 ID:OTP-16379
Erts 10.3.5.7
修复的错误和故障
在删除之前,文字区域可能会过早地被释放。当一个终止进程有一个引用同时被删除的文字的复杂退出原因,或者当一个终止进程继续执行一个访问(通过堆)同时被删除的文字的脏 NIF 时,会发生这种情况。
自身 ID:OTP-16193
修复了由于分布条目的内存损坏而导致 VM 崩溃的错误。如果 Erlang 分布频繁断开并重新建立与相同节点名称的连接,则崩溃的可能性会增加。该错误自 OTP-21.0 以来就存在。
自身 ID:OTP-16224 辅助 ID:ERL-1044
修复了运行时用于执行接收队列优化的接收标记可能被错误设置的错误。此问题的症状是,本应匹配的接收消息永远无法匹配。
此错误需要 OTP-22 编译器和多个选择性接收才能触发。有关编译器中的此错误修复的详细信息,请参阅 OTP-16219。
内部 ID: OTP-16241 辅助 ID: ERL-1076 OTP-16219
修复了导致使用配置
--enable--sharing-preserving
构建的 VM 崩溃的错误。当发送的消息包含位串和与位串匹配的堆二进制文件(< 65 字节)时会触发此问题。该错误自 OTP-19.0 以来就存在,但自 OTP-22.1 以来更容易触发。自身 ID:OTP-16265 辅助 ID:ERL-1064
Erts 10.3.5.6
修复的错误和故障
修复了
binary_to_term
中的一个错误,如果解码的术语大于 16GB,则会导致模拟器崩溃。内部 ID: OTP-16058 辅助 ID: PR-2382
当通过
erlang:port_*()
BIF 与同时退出的端口通信时,有时可能会收到无关的{Ref, What}
消息。其中Ref
是一个引用,What
通常是原子badarg
。内部 ID: OTP-16107 辅助 ID: ERL-1049
Erts 10.3.5.5
修复的错误和故障
process_info(P,binary)
将忽略搜索堆片段,可能会遗漏与该进程关联的一些二进制文件。内部 ID: OTP-15978 辅助 ID: ERIERL-366
修复了在调用
persistent_term:put
或persistent_term:erase
期间进程被终止时触发的错误。内部 ID: OTP-16041
改进和新功能
修复了
instrument:allocations/0-1
中罕见的模拟器崩溃。内部 ID: OTP-15983
Erts 10.3.5.4
修复的错误和故障
修复了当对包含未处理的 monitor down 信号的进程进行文本转储时导致 VM 崩溃的 Bug。文本进程转储可以使用
erlang:system_info(procs)
、跟踪功能process_dump
、Erlang shell 中断菜单和崩溃转储完成。此 Bug 自 OTP 21.0 起存在。内部 ID: OTP-15909 辅助 ID: ERL-979
lists:subtract/2
在 64 位平台上对某些输入会产生不正确的结果。内部 ID: OTP-15938 辅助 ID: ERL-986
修复了加载器中类似于
OTP-15938
的 Bug,该 Bug 在 64 位平台上对某些输入产生不正确的代码。内部 ID: OTP-15939
修复了在极少数情况下导致调度器线程无限期阻塞的 Bug。此 Bug 自 OTP 21.0 起存在。
内部 ID: OTP-15941 辅助 ID: PR-2313
Erts 10.3.5.3
修复的错误和故障
如果在
gen_tcp
监听套接字上设置{linger,{true,0}}
,在该套接字上接受连接,然后关闭接受的套接字,现在延迟为零的设置会传输到接受的套接字。在此更正之前,该信息会丢失,并且接受的套接字的关闭行为不正确。内部 ID: OTP-15370 辅助 ID: ERIERL-353
修复了
process_info(Pid,reductions)
,使其不再绝对增加被测进程Pid
的规约计数。对空闲进程的重复规约测量将最经常(但不能保证)返回相同的值,就像 OTP 21.3.8 之前的行为一样。内部 ID: OTP-15865 辅助 ID: ERL-964
如果运行时系统接收到一个
exit/2
信号,而接收者是当前节点的旧实例上的进程,则该运行时系统会断开连接。也就是说,接收节点具有相同的节点名称,但具有不同的“创建”编号。由于接收进程不再存在,该信号现在将被丢弃。内部 ID: OTP-15867 辅助 ID: ERIERL-373
改进和新功能
已将发送辅助数据(尤其是 TOS 字段)的可能性添加到
gen_udp:send/4,5
中。内部 ID: OTP-15747 辅助 ID: ERIERL-294
Erts 10.3.5.2
修复的错误和故障
在嵌套使用
try
/catch
的情况下,使用不同类别的erlang:raise/3
重新抛出异常并非总是能够更改异常的类别。内部 ID: OTP-15834 辅助 ID: ERIERL-367
修复了
seq_trace:set_token(label,Term)
中的错误,如果Term
是堆分配的(不是原子、小整数、本地 pid 或端口),则可能导致 VM 崩溃。此错误自 OTP 21.0 起存在,当时首次允许将除小整数之外的术语用作标签。内部 ID: OTP-15849 辅助 ID: ERL-700
修复
seq_trace:print/2
,如果标签不是小整数,则不会引发badarg
异常。此错误自 OTP 21.0 起存在。内部 ID: OTP-15859 辅助 ID: ERL-700
Erts 10.3.5.1
修复的错误和故障
修复了当使用
latin1
编码使用binary_to_existing_atom/2
和list_to_existing_atom/2
时发生的缓冲区溢出。内部 ID: OTP-15819 辅助 ID: ERL-944
Erts 10.3.5
修复的错误和故障
修复了
process_info(reductions)
中的更多错误,这些错误会导致它有时表现出非单调性。也就是说,对同一进程的后续调用可能会返回较低的归约值。自有 ID:OTP-15793 辅助 ID:ERIERL-337, OTP-15709
Erts 10.3.4
修复的错误和故障
添加了 OTP 19 中引入的新的外部标签
NEW_PID
、NEW_PORT
和NEWER_REFERENCE
的缺失文档。计划在 OTP 23 中“激活”这些新标签,届时分布能力标志
DFLAG_BIG_CREATION
将成为强制性的。较旧的节点(>= 19)能够解码这些新标签并将其发送回新节点。但是,早于 OTP 23 的节点永远不会使用新标签编码它们自己的本地进程 ID、端口和引用。自身 ID:OTP-15766
Erts 10.3.3
已修复的错误和故障
修复了带有
fd
选项的erlang:open_port/2
,以便在端口关闭时正确清理 pollset。在此修复之前,当在新的端口中重用同一个 fd 时,会向日志记录器发送错误打印输出。自身 ID:OTP-15753 辅助 ID:ERL-900
Erts 10.3.2
已修复的错误和故障
修复了
seq_trace:reset_trace/0
中可能导致模拟器崩溃的错误。自身 ID:OTP-15704
修复了
process_info(reductions)
中的错误,该错误有时会导致返回无效结果。自身 ID:OTP-15709 辅助 ID:ERIERL-337
Erts 10.3.1
已修复的错误和故障
如果在进程执行 dirty 时向其发送挂起/恢复信号对,则接收进程稍后可能会无限期地处于挂起状态。此错误是在 ERTS 版本 10.0 (OTP 21.0) 中引入的。
挂起/恢复信号是从
erlang:suspend_process()
/erlang:resume_process()
发送的。dbg
跟踪工具利用此功能,因此可能会触发此错误。自身 ID:OTP-15688
修复了终止 ERTS 时由于 dirty 调度程序在终止时未释放其运行队列锁而可能导致的死锁。
自身 ID:OTP-15690 辅助 ID:PR-2172
Erts 10.3
已修复的错误和故障
当一个数字与其自身相乘时,可能会读取(并忽略)堆上该数字之外的一个字。此错误极不可能实际导致真正的实际问题。
自身 ID:OTP-15484
修复了在另一个进程正在进行垃圾回收时执行
seq_trace:reset_trace()
可能导致运行时系统段错误的问题。自身 ID:OTP-15490
修复了从旧 Linux 内核版本上的面向数据包的套接字读取辅助数据的问题。如果没有此修复,获取数据将导致端口进入无限循环。
自身 ID:OTP-15494
修复了在另一个进程正在进行垃圾回收时进行崩溃转储或执行
erlang:system_info(procs)
可能导致运行时系统段错误的问题。自身 ID:OTP-15527
修复
erlang:system_info(kernel_poll)
以返回正确的值。在此修复之前,该调用始终返回false
。自身 ID:OTP-15556
修复了
enif_make_map_from_arrays
中当键的数量为 32 时会生成损坏的映射的错误。该错误自 OTP 21.0 起就存在。自身 ID:OTP-15567
修复了
binary:encode_unsigned
中可能导致读取未初始化内存的错误。该错误自添加该函数以来(OTP R16B02)就存在。
自身 ID:OTP-15583 辅助 ID:PR-2118
修复了一个可能导致
heart
在退出节点有机会刷新所有缓冲写入之前将其终止的错误。如果设置了环境变量HEART_KILL_SIGNAL=SIGABRT
,则还可能会生成多余的核心转储。自身 ID:OTP-15599 辅助 ID:ERIERL-298
修复了
enif_consume_timeslice
,使其在 dirty 调度程序上成为空操作,而不是使调试编译的模拟器崩溃。自身 ID:OTP-15604
修复了宏重新定义警告。
自身 ID:OTP-15629
to_erl
修复为不混淆 7 位 ASCII 之外的终端输入。自身 ID:OTP-15650 辅助 ID:ERL-854, PR-2161
make clean
的小修复。自身 ID:OTP-15657
修复了所有
ets:select*
和ets:match*
函数中的一个错误,该错误在某些极少数情况下可能导致性能非常差。自身 ID:OTP-15660 辅助 ID:ERL-869
改进和新功能
添加
erlang:system_flag(system_logger, Pid)
和erlang:system_info(system_logger)
。此 system_flag 可用于设置将接收 ERTS 生成的日志消息的进程。自身 ID:OTP-15375
integer_to_list/2
和integer_to_binary/2
现在用 C 实现,从而提高了它们的性能。自身 ID:OTP-15503 辅助 ID:PR-2052
改进了
term_to_binary
,以便在编码大型字节列表(字符串)时进行更公平的归约计数和让步。自身 ID:OTP-15514 辅助 ID:ERL-774
使内部端口驱动程序对于带有无效参数的
erlang:port_control
更健壮,并添加了关于此类滥用的文档警告。自身 ID:OTP-15555 辅助 ID:ERIERL-231
修复了 NetBSD 上端口程序中的
exit_status
永远不会发送的错误。自身 ID:OTP-15558 辅助 ID:ERL-725
有一个新函数
persistent:term(Key, Default)
,允许在查找持久化项时指定默认值。自身 ID:OTP-15576 辅助 ID:ERL-843
添加了一个临时的模拟器选项“
+ztma true
”,以允许运行依赖于“元组调用”(对参数化模块进行分派)的现有 BEAM 代码,这些代码是在 OTP 20 或更早版本下编译的。此选项将在 OTP 22 中删除,因此此类模块最终应使用+tuple_calls
选项重新编译。自身 ID:OTP-15580 辅助 ID:PR-2113
Erts 10.2.5
已修复的错误和故障
修复了构建系统中安装/发布阶段的问题。
- 在安装/发布和/或应用补丁时,修改了源树。
- 某些文件以错误的访问权限安装。
- 如果以另一个用户(root 用户除外)的身份应用补丁(使用
otp_patch_apply
),而不是构建源的用户,则文档将不会正确更新。
自身 ID:OTP-15551
设置 inet 套接字的
recbuf
大小时,buffer
也会自动增加。修复了一个错误,即使已显式设置了 inet 缓冲区大小,也会触发 inet 缓冲区大小的自动调整。自身 ID:OTP-15651 辅助 ID:ERIERL-304
当套接字上有比
read_packets
指定的更多的数据包可用时,使用活动true
或活动N
模式从 UDP 读取已得到优化。自身 ID:OTP-15652 辅助 ID:ERIERL-304
Erts 10.2.4
已修复的错误和故障
当使用
{linger,{true,T}}
选项时;gen_tcp:listen/2
使用完整的 linger 时间,然后才返回,例如eaddrinuse
。 此错误现已更正。自身 ID:OTP-14728 辅助 ID:ERIERL-303
Erts 10.2.3
已修复的错误和故障
修复了在将
delay_send
设置为 true 的套接字上执行gen_tcp:send
,如果另一端关闭连接,可能会导致段错误的问题。该错误是在 erts-10.2 (OTP-21.2) 中引入的。
自身 ID:OTP-15536 辅助 ID:ERL-827
修复了端口程序关闭时可能导致下一个启动的端口在启动期间挂起的竞争条件。
发生此错误时,通常(但不总是)会记录以下错误
=ERROR REPORT==== 14-Jan-2019::10:45:52.868246 ===
erts_poll() 中的错误输入 fd!fd=11,port=#Port<0.505>,driver=spawn,name=/bin/sh -s unix:cmd
该错误是在 erts-10.0 (OTP-21.0) 中引入的。
自身 ID:OTP-15537
修复了如果所有活动的调度程序都 100% 加载,则对外部事件的轮询可能会延迟很长时间的问题。
该错误是在 erts-10.2 (OTP-21.2) 中引入的。
自身 ID:OTP-15538 辅助 ID:ERIERL-229
Erts 10.2.2
已修复的错误和故障
修复了在
init:restart/0
后关闭悬空文件时的崩溃问题。自身 ID:OTP-15495 辅助 ID:ERL-821
已修复一个可能导致 dirty 调度程序无响应的错误。
自身 ID:OTP-15509 辅助 ID:PR-2027, PR-2093
Erts 10.2.1
已修复的错误和故障
修复了当使用
file:change_mode
、change_owner
、change_group
或write_file_info
更改文件权限或所有权时,大端架构上的错误。该错误自 OTP-21.0 起就存在。自身 ID:OTP-15485
修复了
atomics
中当返回的值为(1 bsl 63)
或更大时,选项{signed,false}
的错误。可能会导致堆损坏,从而导致 VM 崩溃或其他不愉快的症状。该错误自引入模块atomics
的 OTP-21.2 起就存在。自身 ID:OTP-15486 辅助 ID:PR-2061
修复了当两个负操作数进行
band
操作时,如果其中一个操作数的绝对值的最低N*W
位为零,而另一个操作数的绝对值不大于N*W
位时,导致结果错误的错误。N
是一个大于等于 1 的整数,W
根据字大小为 32 或 64。内部 ID:OTP-15487 辅助 ID:ERL-804
Erts 10.2
已修复的错误和故障
当一个进程正在等待 TCP 套接字发送操作完成时,而另一个进程在该发送过程中关闭了套接字,则发送进程可能会挂起。此错误现已更正。
内部 ID:OTP-12242 辅助 ID:ERL-561
在匹配规范中记录
bit_size
并允许在ets:fun2ms
中使用。内部 ID:OTP-15343 辅助 ID:PR-1962
修复了当使用完全绑定的键调用
ets:select_replace
时,可能导致后续调用ets:next
或ets:prev
时崩溃仿真器或返回无效结果的错误。内部 ID:OTP-15346
当一个模块从内存中清除时,属于该模块的任何字面量都将被复制到所有持有对其引用的进程中。在将字面量复制到进程时启动的垃圾回收中,最大堆大小限制将被忽略。如果超过最大堆大小,该进程通常会在随后的垃圾回收中被终止。已更正为如果复制字面量将超过最大堆大小,则直接终止进程。
内部 ID:OTP-15360
修复了在 Solaris 11.4 及更高版本上编译 run_erl 的问题。
内部 ID:OTP-15389
修复了
lists:reverse/1-2
可能使用过多归约的错误。此错误是在OTP 21.1
中引入的。内部 ID:OTP-15436
修复了脏调度器在脏 GC 中删除分发条目时可能永远保持唤醒状态的错误。
内部 ID:OTP-15446 辅助 ID:PR-2024
修复了在多个地方处理微状态核算的问题。最重要的是,现在可以正确管理在脏调度器上运行 GC 时的 GC 状态。
内部 ID:OTP-15450 辅助 ID:ERIERL-229
修复了当发送操作失败时
file:sendfile
中的错误。对于active
模式的套接字,它可能导致仿真器崩溃或挂起调用。对于{active,false}
的套接字,可能会向调用进程发送意外的{inet_reply, _, _}
消息。该错误自 OTP-21.0 起存在。内部 ID:OTP-15461 辅助 ID:ERL-784
已更新 erts 配置脚本,以拒绝任何没有
-O
的 CFLAGS。这是为了防止忘记将-O2
添加到自定义 CFLAGS 的常见错误。内部 ID:OTP-15465
修复了 lists:member/2 中的归约计数。
内部 ID:OTP-15474 辅助 ID:ERIERL-229
改进和新功能
新的
counters
和atomics
模块提供了对可变固定字大小变量的高效操作的访问。内部 ID:OTP-13468
有一个新的模块
persistent_term
,它实现了一个适合频繁使用但很少或从不更新的术语的存储。查找以恒定时间完成,无需复制术语。内部 ID:OTP-14669 辅助 ID:PR-1989
已添加一个函数
inet:getifaddrs/1
,它接受一个带有命名空间选项的列表,对于支持该功能的平台,例如 Linux(仅限?)。内部 ID:OTP-15121 辅助 ID:ERIERL-189, PR-1974
为 TCP 套接字添加了
nopush
选项,它对应于 *BSD 上的TCP_NOPUSH
和 Linux 上的TCP_CORK
。这也在内部用于
file:sendfile
,以减少后续发送操作的延迟。内部 ID:OTP-15357 辅助 ID:ERL-698
列表减法(
--
运算符)现在将在大型输入上正确产生结果。内部 ID:OTP-15371
优化了 tcp 套接字的 send_delay 处理,以便更好地与 OTP-21 中引入的新 pollthread 实现一起工作。
内部 ID:OTP-15471 辅助 ID:ERIERL-229
优化了超时为零的 driver_set_timer,使其短路而不创建任何计时器结构,而是立即调度计时器。
内部 ID:OTP-15472 辅助 ID:ERIERL-229
添加了
erl_xcomp_code_model_small
作为交叉配置变量,以便让仿真器构建时假设目标机器将使用小型代码模型。内部 ID:OTP-15473 辅助 ID:ERIERL-229
添加了一个新的 pollset,用于处理使用
{active, true}
或{active, N}
的套接字。新的 pollset 将不会由 pollthread 轮询,而是由普通调度器轮询。进行此更改的原因是需要不断地对所有输入事件都感兴趣的 fd 重新应用 ONESHOT 机制的开销。
新的 pollset 仅在支持并发内核轮询更新的平台上处于活动状态,即 Linux 和 BSD。
内部 ID:OTP-15475 辅助 ID:ERIERL-229
修复了当启用序列跟踪时发送字面量消息会导致仿真器段错误的错误。
内部 ID:OTP-15478 辅助 ID:ERL-741
Erts 10.1.3
改进和新功能
添加了一个可选的
./configure
标志,用于使用 spectre 缓解措施编译仿真器:--with-spectre-mitigation
请注意,这需要最新版本的 GCC,支持 spectre 缓解措施和
--mindirect-branch=thunk
标志,例如8.1
。内部 ID:OTP-15430 辅助 ID:ERIERL-237
Erts 10.1.2
已修复的错误和故障
修复了一个罕见的错误,该错误可能导致文件在普通调度器而不是 IO 调度器上关闭,如果操作被阻止,则会导致系统不稳定。
内部 ID:OTP-15421
Erts 10.1.1
已修复的错误和故障
修复了套接字选项“pktoptions”导致读取未初始化内存的错误。会导致 FreeBSD 上出现故障。
内部 ID:OTP-14297 辅助 ID:OTP-15141
修复了读取文件时出现错误的内存泄漏。
内部 ID:OTP-15318
通过 UNC 路径的文件访问在 Windows 上再次工作。此回归是在 OTP 21 中引入的。
内部 ID:OTP-15333 辅助 ID:ERL-737
Erts 10.1
已修复的错误和故障
修复了当进程接收到 erts 发送的消息时,seq_trace 令牌不会被清除的问题。一些可能发生这种情况的示例是所有端口 BIF,即
open_port
、port_command
等等。修复了以便可以使用普通和
seq_trace
跟踪来跟踪 nifs 发送的消息。内部 ID:OTP-15038 辅助 ID:ERL-602
修复了
process_info
项monitored_by
的规范和文档,以包括端口标识符和 nif 资源作为可能的类型。内部 ID:OTP-15180 辅助 ID:ERL-648
修复了 erl_crash.dump 生成中的错误,该错误可能导致 VM 崩溃。
该错误自 erts-9.2 (OTP-20.2) 起存在。
内部 ID:OTP-15181
修复了在 Windows 上 ctrl-break 或 ctrl-c 不会正确触发中断模式的错误。此错误是在 erts-10.0 (OTP-21) 中引入的。
内部 ID:OTP-15205
修复了接收 UDP 数据包的性能错误,该错误在不应该重新分配内存缓冲区时重新分配了内存缓冲区。
对 UDP 用户空间缓冲区的最大自动增加引入了限制,限制为网络 PATH 的理论最大值,即 65535。
内部 ID:OTP-15206
修复了 erts 分配器状态在 erts 内部的对齐方式。由于对齐不当,当在 32 位系统上使用 clang 编译时,仿真器会拒绝启动。
内部 ID:OTP-15208 辅助 ID:PR-1897 ERL-677
修复了太多并发调用
erlang:open_port({spawn,"cmd"},...)
会导致仿真器以原因 “Failed to write to erl_child_setup: ” 终止的错误。修复此错误后,open_port
调用将抛出emfile
异常。内部 ID:OTP-15210
已将 ERTS 内部的 PCRE 库从版本 8.41 升级到版本 8.42。有关对 PCRE 所做的更改的信息,请参阅 http://pcre.org/original/changelog.txt。此库实现了
re
正则表达式模块的主要部分。内部 ID:OTP-15217
修复了
open_port({fd,X,Y}, ...)
以在关闭端口时从 pollset 中释放文件描述符。如果没有此修复,在执行多个 open_port 和 port_close 序列时,相同的数字文件描述符将无法重用。内部 ID:OTP-15236 辅助 ID:ERL-692
修复了
float_to_list/2
和float_to_binary/2
使用选项[{decimals,0},compact]
导致完全错误结果的错误。该错误自 OTP-21.0 起存在。内部 ID:OTP-15276 辅助 ID:PR-1920
修复了
erlang:memory
中导致ets
报告过多内存的错误。当具有选项write_concurrency
的表上的调度器线程之间发生特定竞争条件时,才会发生这种小的虚假内存泄漏(每次 16 个字节)。内部 ID:OTP-15278
小的
configure
测试修复内部 ID:OTP-15282
改进了分布式连接设置的稳健性。在 OTP-21.0 中,引入了真正的异步连接设置。这项工作在此基础上进行了进一步改进,使模拟器更加健壮,并且能够在涉及的 Erlang 进程行为异常时进行恢复。
内部编号:OTP-15297 辅助编号:OTP-15279, OTP-15280
改进和新功能
套接字模块中实现了套接字选项
recvtos
、recvttl
、recvtclass
和pktoptions
。请参阅gen_tcp
、gen_udp
和inet
模块的文档。请注意,运行时系统中对这些选项的支持取决于平台。特别是pktoptions
,它非常特定于 Linux,并且已被定义它的 RFC 弃用。内部编号:OTP-15145 辅助编号:ERIERL-187
Erts 10.0.8
修复的错误和故障
从 ERTS 版本 10.0 (OTP 21.0) 开始,创建端口程序的
erl_child_setup
程序会忽略TERM
信号。此设置被端口程序无意中继承了。现在已将端口程序中TERM
信号的处理恢复为默认行为。也就是说,终止进程。内部编号:OTP-15289 辅助编号:ERIERL-235, OTP-14943, ERL-576
为 erts-10.07 (OTP-21.0.8) 中 OTP-15279 所做的修复并不完整。在某些情况下,它可能导致新的连接尝试被错误地中止。此修复将纠正该缺陷。
内部编号:OTP-15296 辅助编号:OTP-15279, ERIERL-226
Erts 10.0.7
修复的错误和故障
进程可能会在普通调度器和脏调度器之间陷入无限的重新调度循环。此错误是在 ERTS 版本 10.0 中引入的。
感谢 Maxim Fedorov 发现并修复了此问题。
内部编号:OTP-15275 辅助编号:PR-1943
如果
net_kernel
没有正确关闭之前的连接尝试,则对分布式条目的垃圾回收可能会导致模拟器崩溃。内部编号:OTP-15279 辅助编号:ERIERL-226
Erts 10.0.6
修复的错误和故障
进程终止和通过
erlang:resume_process/1
恢复同一进程之间的竞争可能导致虚拟机崩溃。此错误是在 erts 版本 10.0 (OTP 21.0) 中引入的。内部编号:OTP-15237
在
running
上进行跟踪时,当进程在脏调度器和普通调度器之间重新调度时,可能会丢失in
跟踪事件。内部编号:OTP-15269 辅助编号:ERL-713
Erts 10.0.5
修复的错误和故障
修复了当在脏调度器上执行的 NIF 调用
enif_send()
时导致模拟器崩溃的错误。当 NIF 在没有消息环境的情况下调用enif_send()
时,或者当执行 NIF 的进程被send
跟踪时,会触发此错误。内部编号:OTP-15223
修复了导致某些 Erlang 引用排序不一致的错误。例如,这可能导致无法在搜索数据结构中查找以引用作为键的某些元素。此错误是在 R13B02 中引入的。
感谢 Simon Cornish 发现该错误并提供修复。
* 潜在的不兼容性 *
内部编号:OTP-15225
Erts 10.0.4
修复的错误和故障
修复了阻止
noshell
选项在 Mac OS X 和 BSD 上正常工作的错误。内部编号:OTP-15169
修复了当使用已保存在堆栈上的单个键直接匹配文字映射时发生的崩溃。
内部编号:OTP-15184
修复了将错误的时间选项传递给
file:read_file_info/2
时导致的节点崩溃。内部编号:OTP-15196
Erts 10.0.3
修复的错误和故障
修复了导致普通调度器运行脏代码的调度器错误。
内部编号:OTP-15154
修复了
erlang:trace_info/2
中的错误,该错误导致在传递错误的参数时模拟器崩溃。此错误是在 ERTS 版本 10.0 中引入的。内部编号:OTP-15183 辅助编号:ERL-670
Erts 10.0.2
修复的错误和故障
修复了一个罕见的错误,该错误可能导致进程在释放后被调度。
内部编号:OTP-15067 辅助编号:ERL-573
修复了 inet 驱动程序中的竞争条件,该条件可能导致当模拟器使用 gcc 8 编译时接收挂起。
内部编号:OTP-15158 辅助编号:ERL-654
Erts 10.0.1
修复的错误和故障
在 Windows 上,
os:getenv
和os:putenv
中使用的键再次不区分大小写。内部编号:OTP-15147 辅助编号:ERL-644
Erts 10.0
修复的错误和故障
已根据文件和套接字操作应能够返回的错误更新了
file:posix/0
和inet:posix/0
的类型规范。内部编号:OTP-14019 辅助编号:ERL-550
修复了 run_erl 的错误打印输出以及可能导致不必要的 fd 泄漏到启动程序中的错误。
内部编号:OTP-14537 辅助编号:PR1529
文件操作过去接受包含空字符(整数值零)的 文件名。这会导致名称被截断,并且在某些情况下,基本操作的参数会被混淆。现在会拒绝文件名中包含空字符的文件名,并且会导致基本文件操作失败。
此外,环境变量操作过去接受包含空字符(整数值零)的 名称和 环境变量的值。这会导致操作默默地产生错误的结果。现在会拒绝名称或值中包含空字符的环境变量名称和值,并且会导致环境变量操作失败。
基本环境变量操作过去还接受环境变量名称中的
$=
字符,从而导致各种问题。现在也拒绝环境变量名称中的$=
字符。erlang:open_port/2
从现在起也将拒绝端口名称中的空字符。* 潜在的不兼容性 *
内部编号:OTP-14543 辅助编号:ERL-370
修复了与微状态核算状态簿记相关的错误。
内部编号:OTP-14652
os:putenv
和os:getenv
不再直接访问进程环境,而是使用线程安全的模拟。唯一可观察到的区别是,它不与 libcgetenv(3)
/putenv(3)
同步,因此那些依赖于驱动程序或 NIF 中该行为的人将需要添加手动同步。在 Windows 上,这意味着您不能再通过在加载驱动程序/NIF 之前修改
PATH
来解析 DLL 依赖项。为了减少这个问题,模拟器现在将目标 DLL 的文件夹添加到 DLL 搜索路径中。* 潜在的不兼容性 *
内部编号:OTP-14666
更正了
erlang:is_builtin(erlang, M, F)
,以便为apply/2
和yield/0
返回true
。内部编号:OTP-14713 辅助编号:ERL-500
修复了在版本降级时 PATH 环境变量未正确更新的错误,从而有效地保留了新版本的 PATH。
内部编号:OTP-14719
一个接收优化,它避免在接收包含新创建的引用的消息时扫描整个消息队列,在极少数情况下(涉及对执行接收的函数的递归调用)可能导致接收挂起。这已得到纠正。
内部编号:OTP-14782 辅助编号:ERL-511
修复了在具有使用短寻址的小数据区域的平台上构建 Erlang/OTP 的问题。例如,PowerPC/RTEMS 平台。
内部编号:OTP-14909 辅助编号:PR-1692
修复了在不同环境中调用
enif_inspect_binary
生成的二进制文件时调用enif_make_binary
时发生的崩溃。内部编号:OTP-14931
修复了当使用先前添加到
enif_ioq
的二进制文件多次调用enif_make_binary
时发生的崩溃。内部编号:OTP-14932
erl_child_setup 程序现在会忽略 SIGTERM 信号。
内部编号:OTP-14943 辅助编号:ERL-576
在需要进行 64 位对齐的架构上,强制预分配器进行 64 位对齐。
内部 ID: OTP-14977
修复了脏调度器拾取非脏工作的错误。
内部 ID: OTP-14978
在已关闭的套接字上调用
gen_tcp:send/2
现在返回{error, closed}
而不是{error,enotconn}
。内部 ID: OTP-15001
当传递
perf_counter
时间单位作为参数时,erlang:monotonic_time/1
失败并出现badarg
错误。内部 ID: OTP-15008
修复了快速调用
init:restart()
时有时会崩溃的错误,原因是代码加载请求在重启之间泄漏。内部 ID: OTP-15013
改进了
float_to_list(F, [{decimals,D}])
,使其更接近io_lib:format("~.*f", [D,F])
的行为。然而,仍然存在
float_to_list
的输出结果与io_lib:format
不完全相同的情况,尤其是对于较大的值F
和/或较多的小数位D
。内部 ID: OTP-15015 辅助 ID: OTP-14890
修复了启用
+ramv
时,在某些分配器上重新分配失败时发生的死锁。内部 ID: OTP-15024
修复了导致无法使用 erl_tracer 作为 seq_trace 跟踪接收器的错误。
内部 ID: OTP-15029
修复了当生成大型(> 1 GB)模拟器错误日志消息时会导致模拟器崩溃的错误。
内部 ID: OTP-15032
读取具有 NTFS 重解析点的普通文件(例如存储在 OneDrive 映射文件夹中的文件)的文件信息时,模拟器不再崩溃。
内部 ID: OTP-15062 辅助 ID: ERL-615
修复了
enif_binary_to_term
中的错误,该错误可能导致立即项(原子、小整数、PID、端口、空列表)的内存损坏。内部 ID: OTP-15080
修复了
erlang:system_profile/2
中的错误,该错误可能导致终止进程出现多余的{profile,_,active,_,_}
消息。内部 ID: OTP-15085
在支持每个线程 CPU 时间的操作系统上,更改
erlang:trace/3
中的cpu_timestamp
以使用它,而不是每个进程的 CPU 时间。这使得此选项在运行多个调度器时,可以在此类操作系统上使用。内部 ID: OTP-15090
修复了 abort_signal_task 中的段错误,如果端口终止时存在未处理的非信号端口任务(例如 ready_input/ready_output 事件),则可能会发生此错误。
内部 ID: OTP-15108 辅助 ID: ERL-621
修复了
ets
中的一个错误,如果进程 A 在固定表后终止,并且进程 B“同时”删除该表,则可能导致 VM 崩溃。表格的固定可以使用ets:safe_fixtable
完成,或者如果进程 A 在长时间运行的select
或match
调用中间终止。内部 ID: OTP-15109
通过
file:write_file_info
、file:change_owner
和file:change_group
进行的所有者和组更改,在出现权限错误时将不再报告成功。* 潜在的不兼容性 *
内部 ID: OTP-15118
修复了 Windows 上 escript 的错误报告中,错误消息会变得混乱的错误。
内部 ID: OTP-15119 辅助 ID: PR-1826
修复了在为输入/输出事件跟踪时,进程在内部重新调度时发生的段错误。此错误在 erts-8.0 (OTP-19.0) 中引入。
内部 ID: OTP-15125
改进和新功能
现在可以使用
file:open/2
打开设备文件和 FIFO。内部 ID: OTP-11462
erlang:system_flag(scheduler_wall_time,Bool)
调用现在使用引用计数,如果启动性能统计信息的(最后一个)进程死亡,则会关闭。因此,不再可能通过rpc:call(Node, erlang, system_flag, [scheduler_wall_time, true])
启动统计信息,因为它会在 rpc 进程死亡后立即关闭。* 潜在的不兼容性 *
内部 ID: OTP-11694
Erlang/OTP 中添加了一个新的日志记录 API,请参阅
logger
手册页以及 Kernel 用户指南中的 日志记录 部分。对
error_logger
的调用会自动重定向到新的 API,并且仍然可以使用旧的错误日志记录事件处理程序。但是,建议在编写新代码时直接使用 Logger API。请注意以下潜在的不兼容性
内核配置参数
error_logger
仍然有效,但如果默认处理程序的输出目标配置了内核配置参数logger
,则会被覆盖。通常,用于配置错误日志记录的参数会被用于配置 Logger 的新参数覆盖。
SASL 错误日志记录的概念已被弃用,这意味着默认情况下 SASL 应用程序不会影响记录哪些日志事件。
默认情况下,Supervisor 报告和崩溃报告由 Kernel 启动的默认 Logger 处理程序记录,并最终与来自 Erlang/OTP 的其他标准日志事件一起到达同一目标(终端或文件)。
默认情况下不记录进度报告,但可以通过将主要日志级别设置为 info 来启用,例如使用内核配置参数
logger_level
。要获得与早期版本中的 SASL 错误日志记录功能向后兼容性,请将内核配置参数
logger_sasl_compatible
设置为true
。这将阻止默认的 Logger 处理程序记录任何 Supervisor、崩溃或进度报告。相反,SASL 在应用程序启动期间添加单独的 Logger 处理程序,负责处理这些日志事件。SASL 配置参数sasl_error_logger
和sasl_errlog_type
指定这些事件的日志记录目标(终端或文件)和严重性级别。
由于 Logger 是 Erlang/OTP 21.0 中的新功能,我们确实保留在本次发布后的补丁中对 Logger API 和功能进行更改的权利。这些更改可能与初始版本向后兼容,也可能不兼容。
* 潜在的不兼容性 *
内部 ID: OTP-13295
gen_sctp:connect_init/4
或者说inet_drv.c
中用于 SCTP 的连接已得到修复,不再检查连接后的写入文件描述符是否可写,因为对于 SCTP (SOCK_SEQPACKET) 而言,该属性似乎不是连接完成的任何指标。 这修复了 OS 返回为“正在进行中”的连接,被gen_sctp:connect_init
错误地解释为失败。内部 ID: OTP-13760 辅助 ID: PR-1592
文件驱动程序已重写为 NIF,从而减少了文件操作的延迟。 值得注意的不兼容性是
file:sendfile/5
的use_threads
选项不再有任何效果; 我们要么使用非阻塞sendfile(2)
,要么回退到file:read
+gen_tcp:send
。- 文件特定的 DTrace 探针已被删除。可以使用常规跟踪以及
nif__entry
/nif__return
探针来跟踪调度,以达到相同的效果。
* 潜在的不兼容性 *
内部 ID: OTP-14256
erts 的 I/O 轮询功能已重写,以更好地利用操作系统的轮询机制。此更改意味着 erts 现在将始终优先使用内核轮询机制(如果可能)。此外,所有 I/O 轮询已移至专用线程,而不是放置在调度程序循环中。
因此,删除了
erl
选项+K
和+secio
。仍然可以禁用内核轮询,但必须在编译时通过 configure 选项--disable-kernel-poll
来完成。新的
erl
选项+IOt
和+IOp
可用于更改 erts 应使用的 I/O 轮询线程和轮询集的数量。有关更多详细信息,请参阅它们各自的文档。内部 ID: OTP-14346
真正的异步自动连接。以前,当
erlang:send
指向未连接的节点时,该函数不会返回,直到连接设置完成(或失败)。现在,该函数在消息入队和连接设置启动后直接返回。这同样适用于可能触发自动连接的所有分布式操作,即
'!'
、send
、link
、monitor
、monitor_node
、exit/2
和group_leader
。所有这些函数的接口都没有改变,因为它们不会返回连接失败。 唯一的例外是
erlang:monitor
,它引入了*可能的不兼容性*:尝试监视原始节点(例如 erl_interface 或 jinterface)上的进程(其中未实现远程进程监视)将不再失败并出现badarg
异常。相反,将创建一个监视器,但它只会监视与节点的连接。* 潜在的不兼容性 *
内部 ID: OTP-14370
更改了
.erlang
加载的默认行为:不再从当前目录加载.erlang
。c:erlangrc(PathList)
可用于从用户指定的目录中搜索并加载.erlang
文件。escript
、erlc
、dialyzer
和typer
不再加载.erlang
。* 潜在的不兼容性 *
内部 ID: OTP-14439
引入了用于实现 Erlang 分布式替代载体的新功能。这主要包括支持使用分布控制器进程(以前只能使用端口作为分布控制器)。更多信息请参阅 ERTS 用户指南 ➜ 如何为 Erlang 分布式实现替代载体 ➜ 分布式模块。
内部 ID: OTP-14459
添加了对 lcc 编译器以及 Elbrus 2000 平台的支持。
内部 ID: OTP-14492
运行时系统已移除对“元组调用”的支持。元组调用是一个未公开且不受支持的功能,它允许 `apply` 操作的模块参数为元组:
Var = dict:new(), Var:size()
。此“功能”经常引起混淆,尤其是在此类调用失败时。堆栈跟踪会指出源代码中不存在的函数。对于需要因某些原因使用参数化模块或元组调用的旧代码,有一个新的编译器选项
tuple_calls
。启用此选项后,编译器将生成额外的代码,以模拟模块为变量的调用中的旧行为。* 潜在的不兼容性 *
内部 ID: OTP-14497
已优化使用字面键创建小型映射,使其更快且可能使用更少的内存。键被组合成一个字面键元组,该元组被放入字面池中。键元组可以在具有相同键的映射的多个实例之间共享。
内部 ID: OTP-14502
抛出异常时,在 `band`、`bor`、`bsl`、`bsr`、`bxor`、`div`、`rem` 这些 BIF 和 `+`、`-`、`*`、`/` 这些运算符的堆栈跟踪中包含调用参数。
* 潜在的不兼容性 *
内部 ID: OTP-14508
非 SMP 模拟器已被移除。这意味着配置选项
--disable-threads
和--enable-plain-emulator
已被移除,并且配置现在会拒绝在没有线程支持的平台上构建 Erlang/OTP。为了实现与非 SMP 模拟器类似的设置,可以使用
+S 1
选项启动 Erlang/OTP。* 潜在的不兼容性 *
内部 ID: OTP-14518
使用 R15 或更早版本编译的浮点常量模块需要重新编译才能加载。
内部 ID: OTP-14575
实现了进程之间真正的异步信号传递,以提高可伸缩性。受影响的信号包括 exit、monitor、demonitor、monitor triggered、link、unlink 和 group leader。
内部 ID: OTP-14589
在 erts 的构建步骤中添加了 PGO(配置文件引导优化)传递。可以通过向 configure 传递 --disable-pgo 来禁用此功能。
内部 ID: OTP-14604
提高了
binary:split
和binary:match
的性能。内部 ID: OTP-14610 辅助 ID: PR-1480
在构建 Erlang 时,不再可以禁用脏调度器。
内部 ID: OTP-14613
由于指令操作数的更好打包,64 位系统中加载的 BEAM 代码需要更少的内存。
这些内存节省是通过对构建运行时系统和 BEAM 编译器时使用的
beam_makeops
脚本进行重大改进实现的。此外,还有关于beam_makeops
的新文档,描述了如何实现新的 BEAM 指令和加载器转换。该文档位于此处:源代码目录或 git 存储库中的 erts/emulator/internal_doc/beam_makeops.md。在线版本可以在这里找到:https://github.com/erlang/otp/blob/master/erts/emulator/internal_doc/beam_makeops.md内部 ID: OTP-14626
file:read_file
已更改为读取报告大小为 0 的文件内容,即使可以从中读取数据也是如此。此类文件的一个示例是 Linux 上的/proc/cpuinfo
。内部 ID: OTP-14637 辅助 ID: ERL-327 PR-1524
不再可以禁用
temp_alloc
分配器。禁用它会导致严重的性能下降,并且从来都不是人们想要的。内部 ID: OTP-14651
发送消息的减少成本现在是恒定的。它将不再根据接收进程的消息队列长度进行缩放。
内部 ID: OTP-14667
改进了带有
-on_load
指令的模块加载,使其在加载操作完成时不再阻止所有调度器。内部 ID: OTP-14680
在具有实时信号的平台上,SIGRTMIN+1 现在用作内部调度程序挂起信号,而不是 SIGUSR2。
内部 ID: OTP-14682
当忽略从
catch
表达式返回的值时,如果捕获到异常,则不会构建堆栈跟踪。这将节省时间并减少垃圾。编译器和运行时系统中还对try
/catch
进行了一些小的优化。内部 ID: OTP-14683
现在记录了
erlang:get_stacktrace/0
的保证和非保证。内部 ID: OTP-14687
在 '
try/catch
' 中有一种新语法,用于检索堆栈跟踪而无需调用 'erlang:get_stacktrace/0
'。有关新语法的描述,请参阅参考手册。 'erlang:get_stacktrace/0
' BIF 现在已弃用。内部 ID: OTP-14692
为
binary_to_term/2
添加了新的 'used' 选项,该选项还将返回从二进制文件中实际读取的字节数。这使得可以轻松访问二进制文件中返回的项之后直接存在的任何额外数据。内部 ID: OTP-14780
在
mbcs_pool
部分中为erlang:system_info({allocator,A})
添加了更多统计信息。内部 ID: OTP-14795 辅助 ID: ERL-88
添加了
enif_ioq_peek_head
,用于从 NIF IO 队列中检索 Erlang 项,而无需进行复制。内部 ID: OTP-14797
编译器有一个新的选项 '
makedep_side_effect
','erlc
' 有-MMD
选项,它们会生成依赖项并继续正常编译。内部 ID: OTP-14830
添加了
ets:whereis/1
,用于检索命名表的表标识符。内部 ID: OTP-14884
seq_trace
标签现在可以是任何 Erlang 项。内部 ID: OTP-14899
优化了
monitor
之后紧跟向同一本地进程send
的常见情况。现在会延迟监控信号,以便将其与发送的消息一起搭载,从而仅对接收者的消息队列进行一次锁定操作。如果进程在被调度出去时之前没有完成send
操作,则会刷新延迟的监控信号。内部 ID: OTP-14901
使 hipe 编译的代码在具有 OS 安全功能 PIE 的 x86_64 (amd64) 上工作,其中可执行代码可以加载到随机位置。如果启用了 hipe,旧行为是禁用 VM 的 PIE 构建选项。
内部 ID: OTP-14903
驱动程序异步线程数现在默认设置为 1,因为标准驱动程序不再使用它们。用户将此值更改为调整文件驱动程序时,应将
+A
替换为+SDio
,因为它现在使用脏 IO 调度器而不是异步线程。* 潜在的不兼容性 *
内部 ID: OTP-14928
优化了大小不同的二进制文件的
==
和/=
,使其在时间上是恒定的,而不是与其公共前缀的大小成正比。内部 ID: OTP-14934 辅助 ID: PR-1708
重构使一些内部进程标志可用于其他用途。
内部 ID: OTP-14948
不再需要 HiPE 在 x86_64 上分配低 2GB 地址空间的本机可执行内存。命令行选项
+MXscs
因此已过时并被忽略。内部 ID: OTP-14951
添加了
enif_make_map_from_arrays
,用于创建填充的映射,类似于enif_make_list_from_array
。内部 ID: OTP-14954
为脏调度器添加了忙等待和唤醒阈值的配置开关,并且更改普通调度器的这些设置将不再影响脏调度器。
有关详细信息,请参阅文档。新的开关是 +sbwtdcpu、+sbwtdio、+swtdcpu 和 +swtdio。
脏调度器线程的默认忙等待阈值也已降低为
short
。内部 ID: OTP-14959
“污点”列表现在除了 NIF 库之外还包括动态加载的驱动程序。静态链接的驱动程序和作为 erts 一部分的 NIF 库不包括在内。“污点”由
system_info(taints)
返回,并打印在erl_crash.dump
文件的标题中。内部 ID: OTP-14960
添加了
instrument:allocations
和instrument:carriers
,用于检索有关内存利用率和碎片的信息。旧的
instrument
接口已被删除,相关的选项+Mim
和+Mis
也已被删除。* 潜在的不兼容性 *
内部 ID: OTP-14961
使用新引入的进程之间真正的异步信号传递重新实现了
erlang:suspend_process/2
BIF 使用的进程挂起功能。这主要是为了减少所有进程的进程控制块中的内存使用,并且也为了简化实现。警告
如果进程相互挂起(直接或循环),则很容易创建死锁。在 ERTS 10.0 之前的 ERTS 版本中,运行时系统会阻止此类死锁,但出于性能原因,此预防措施现已删除。
使用以前进程挂起功能的其他 ERTS 内部功能也已重新实现为使用异步信号传递。
* 潜在的不兼容性 *
内部 ID: OTP-14964 辅助 ID: OTP-14589
将
nifs
选项添加到?MODULE:module_info/1
,以列出模块安装的 NIF 函数。内部 ID: OTP-14965
erlang:process_info/[1,2]
的新实现。在检查另一个进程的一般情况下,新实现会向另一个进程发送异步进程信息请求信号并等待结果,而不是锁定另一个进程并直接读取结果。在某些没有冲突的特殊情况下,不会违反信号顺序,并且请求的数据量保证很小,可以直接检查被检查的进程。
现在,在检查进程时也会适当地增加减少次数。
内部 ID: OTP-14966
从崩溃转储中删除了进程启动时间,以便节省进程控制块中的内存。
内部 ID: OTP-14975 辅助 ID: PR-1597
当使用新的立即值(原子、小整数、pid、端口)更新现有键时,优化了
erlang:put/2
。内部 ID: OTP-14976
erlang:process_info/1
已更改为默认不再包含messages
。而是应该使用erlang:process_info/2
。* 潜在的不兼容性 *
内部 ID: OTP-14986 辅助 ID: PR-1745
新的
erlang:system_info(ets_count)
,用于获取本地节点存在的 ets 表的总数。内部 ID: OTP-14987
新的 NIF 函数:
enif_mutex_name
、enif_cond_name
、enif_rwlock_name
、enif_thread_name
、enif_vfprintf
、enif_vsnprintf
。内部 ID: OTP-14994
当调用
erlang:system_flag(backtrace_depth, 0)
后,所有异常现在都会包含一个函数的入口(即使深度为零)。以前,传递给erlang:raise/3
的手工堆栈回溯会被截断为空列表。内部 ID: OTP-15026
修复了命名
ets
表的错误,如果在迭代期间删除并使用相同的名称重新创建表,则可能导致 matchspec 迭代函数(ets:select*
和ets:match*
)产生意外的结果。迭代可能会错误地继续遍历重新创建的表。现在预期的正确行为是,如果在迭代完成之前删除了表,则迭代调用将失败并抛出badarg
异常。内部 ID: OTP-15031
添加了两个新的操作 map 的 guard BIF:
map_get/2
和is_map_key/2
。它们分别与maps:get/2
和maps:is_key/2
的功能相同,只是允许在 guards 中使用。内部 ID: OTP-15037 辅助 ID: PR-1784, PR-1802
在清理已终止的脏进程时释放运行队列锁。
内部 ID: OTP-15081
作为
-epmd_module
传递给 erl 的回调模块已扩展为能够进行名称和端口解析。此外,还在
erl_epmd
参考手册和 ERTS 用户指南 如何为 Erlang 分布实现替代节点发现 中添加了文档。内部 ID: OTP-15086 辅助 ID: PR-1694
Erts 9.3.3.15
修复的错误和故障
一个进程可能会陷入一种状态,即它被无限期地重新调度而没有任何进展。当系统任务(例如,检查进程代码(代码清除的一部分))在高优先级进程尝试在“脏”调度器上执行时被调度时,就会发生这种情况。
自身 ID:OTP-16436 辅助 ID:ERL-1152
修复了使用远程节点创建的引用调用
erlang:list_to_ref/1
中的错误。函数list_to_ref/1
旨在用于调试,而不是在应用程序中使用。该错误自 OTP 20.0 以来就存在。自有 ID:OTP-16438
一个进程可能会进入不一致的状态,其中它是可运行的,但从未被调度执行。当
normal
和low
优先级进程同时在相同类型的脏调度程序上调度时,可能会发生这种情况。自有 ID:OTP-16446 辅助 ID:ERL-1157
修复了由于链接中断而接收到某些退出信号时,将退出原因从
kill
错误地映射到killed
的问题。此错误自 ERTS 版本 5.5.2 (OTP R11) 就已存在。由于 ERTS 内部进程间信号传递的新实现,此错误也在 ERTS 版本 10.0 (OTP 21.0) 中被不知不觉地修复了。
内部 ID: OTP-16465 辅助 ID: ERL-1165, OTP-6160, OTP-14589
将
erl
命令行参数+SDio <NumberOfDirtyIoSchedulers>
的有效范围从0..1024
更正为1..1024
。+SDio 0
被错误地允许,这只会导致 VM 在第一个调度的脏 I/O 作业上崩溃。自有 ID:OTP-16481
Erts 9.3.3.14
修复的错误和故障
调用
erlang:system_flag(multi_scheduling, block)
的进程可能会无限期地阻塞等待操作完成。自身 ID:OTP-16379
Erts 9.3.3.13
修复的错误和故障
在删除之前,文字区域可能会过早地被释放。当一个终止进程有一个引用同时被删除的文字的复杂退出原因,或者当一个终止进程继续执行一个访问(通过堆)同时被删除的文字的脏 NIF 时,会发生这种情况。
自身 ID:OTP-16193
Erts 9.3.3.12
修复的错误和故障
如果运行时系统接收到一个
exit/2
信号,而接收者是当前节点的旧实例上的进程,则该运行时系统会断开连接。也就是说,接收节点具有相同的节点名称,但具有不同的“创建”编号。由于接收进程不再存在,该信号现在将被丢弃。内部 ID: OTP-15867 辅助 ID: ERIERL-373
修复了
binary_to_term
中的一个错误,如果解码的术语大于 16GB,则会导致模拟器崩溃。内部 ID: OTP-16058 辅助 ID: PR-2382
当通过
erlang:port_*()
BIF 与同时退出的端口通信时,有时可能会收到无关的{Ref, What}
消息。其中Ref
是一个引用,What
通常是原子badarg
。内部 ID: OTP-16107 辅助 ID: ERL-1049
Erts 9.3.3.11
修复的错误和故障
修复了当使用
latin1
编码使用binary_to_existing_atom/2
和list_to_existing_atom/2
时发生的缓冲区溢出。内部 ID: OTP-15819 辅助 ID: ERL-944
Erts 9.3.3.10
修复的错误和故障
修复了构建系统中安装/发布阶段的问题。
- 在安装/发布和/或应用补丁时,修改了源树。
- 某些文件以错误的访问权限安装。
- 如果以另一个用户(root 用户除外)的身份应用补丁(使用
otp_patch_apply
),而不是构建源的用户,则文档将不会正确更新。
自身 ID:OTP-15551
make clean
的小修复。自身 ID:OTP-15657
修复了所有
ets:select*
和ets:match*
函数中的一个错误,该错误在某些极少数情况下可能导致性能非常差。自身 ID:OTP-15660 辅助 ID:ERL-869
修复了终止 ERTS 时由于 dirty 调度程序在终止时未释放其运行队列锁而可能导致的死锁。
自身 ID:OTP-15690 辅助 ID:PR-2172
添加了 OTP 19 中引入的新的外部标签
NEW_PID
、NEW_PORT
和NEWER_REFERENCE
的缺失文档。计划在 OTP 23 中“激活”这些新标签,届时分布能力标志
DFLAG_BIG_CREATION
将成为强制性的。较旧的节点(>= 19)能够解码这些新标签并将其发送回新节点。但是,早于 OTP 23 的节点永远不会使用新标签编码它们自己的本地进程 ID、端口和引用。自身 ID:OTP-15766
Erts 9.3.3.9
改进和新特性
添加了一个可选的
./configure
标志,用于使用 spectre 缓解措施编译仿真器:--with-spectre-mitigation
请注意,这需要最新版本的 GCC,支持 spectre 缓解措施和
--mindirect-branch=thunk
标志,例如8.1
。内部 ID:OTP-15430 辅助 ID:ERIERL-237
Erts 9.3.3.8
修复的错误和故障
已修复一个可能导致 dirty 调度程序无响应的错误。
自身 ID:OTP-15509 辅助 ID:PR-2027, PR-2093
Erts 9.3.3.7
修复的错误和故障
修复了当两个负操作数进行
band
操作时,如果其中一个操作数的绝对值的最低N*W
位为零,而另一个操作数的绝对值不大于N*W
位时,导致结果错误的错误。N
是一个大于等于 1 的整数,W
根据字大小为 32 或 64。内部 ID:OTP-15487 辅助 ID:ERL-804
Erts 9.3.3.6
改进和新特性
列表减法(
--
运算符)现在将在大型输入上正确产生结果。内部 ID:OTP-15371
Erts 9.3.3.5
修复的错误和故障
ERTS 内部的监视器结构树可能进入不一致的状态。这可能导致
'DOWN'
消息在应该传递时未被传递,以及传递不应该传递的'DOWN'
消息。此错误是在 ERTS 版本 9.0 (OTP 20.0) 中引入的,并在 ERTS 版本 10.0 (OTP 21.0) 中由于监视器代码的重写而被修复。也就是说,此错误仅存在于 OTP 20 版本中。
内部 ID: OTP-15399 辅助 ID: ERL-751, ERIERL-262, OTP-14205
Erts 9.3.3.4
修复的错误和故障
修复了当使用完全绑定的键调用
ets:select_replace
时,可能导致后续调用ets:next
或ets:prev
时崩溃仿真器或返回无效结果的错误。内部 ID:OTP-15346
Erts 9.3.3.3
修复的错误和故障
修复了当在脏调度器上执行的 NIF 调用
enif_send()
时导致模拟器崩溃的错误。当 NIF 在没有消息环境的情况下调用enif_send()
时,或者当执行 NIF 的进程被send
跟踪时,会触发此错误。内部编号:OTP-15223
修复了导致某些 Erlang 引用排序不一致的错误。例如,这可能导致无法在搜索数据结构中查找以引用作为键的某些元素。此错误是在 R13B02 中引入的。
感谢 Simon Cornish 发现该错误并提供修复。
* 潜在的不兼容性 *
内部编号:OTP-15225
Erts 9.3.3.2
修复的错误和故障
修复了 inet 驱动程序中的竞争条件,该条件可能导致当模拟器使用 gcc 8 编译时接收挂起。
内部编号:OTP-15158 辅助编号:ERL-654
修复了 erl_crash.dump 生成中的错误,该错误可能导致 VM 崩溃。
该错误自 erts-9.2 (OTP-20.2) 起存在。
内部 ID:OTP-15181
Erts 9.3.3.1
修复的错误和故障
修复了一个罕见的错误,该错误可能导致进程在释放后被调度。
内部编号:OTP-15067 辅助编号:ERL-573
Erts 9.3.3
修复的错误和故障
修复了
ets
中的一个错误,如果进程 A 在固定表后终止,并且进程 B“同时”删除该表,则可能导致 VM 崩溃。表格的固定可以使用ets:safe_fixtable
完成,或者如果进程 A 在长时间运行的select
或match
调用中间终止。内部 ID: OTP-15109
Erts 9.3.2
修复的错误和故障
修复了
enif_binary_to_term
中的错误,该错误可能导致立即项(原子、小整数、PID、端口、空列表)的内存损坏。内部 ID: OTP-15080
修复了
erlang:system_profile/2
中的错误,该错误可能导致终止进程出现多余的{profile,_,active,_,_}
消息。内部 ID: OTP-15085
Erts 9.3.1
修复的错误和故障
修复了当存储的命令过长时
heart:get_cmd/0
中的崩溃问题。内部 ID: OTP-15034
Erts 9.3
修复的错误和故障
修复了
libz
内部的configure
测试,该测试无意中导致 OTP 中的各种本机代码链接到libz
。在某些情况下,这会导致 OTP 的构建失败。内部 ID: OTP-14840 辅助 ID: ERL-529
包含大于 255 的 unicode 码位的文件名在堆栈跟踪中未正确编码。
内部 ID: OTP-14847 辅助 ID: ERL-544
修复了 HiPE 中类似
<<X/utf8>>
的二进制构造的错误,在极少数情况下可能会导致错误结果或 VM 崩溃。此修复程序以不兼容的方式影响
hipe
编译器和erts
运行时。旧的 hipe 编译文件需要重新编译才能作为本机正确加载和运行。* 潜在的不兼容性 *
内部 ID: OTP-14850 辅助 ID: PR-1664
修复了
term_to_binary/2
中minor_version
的规范。内部 ID: OTP-14876 辅助 ID: ERL-548
修复了 erlang:binary_to_integer/2 中的错误,其中对于大于 10 的进制,未检测到无效字符。例如,
binary_to_integer(<<":">>, 16)
将返回 3,而不是应该返回的 badarg。内部 ID: OTP-14879
修复了
float_to_list/2
和float_to_binary/2
中带有decimals
选项的错误,该错误导致大约 6% 的带有小数部分的浮点数的最后一位小数位错误地向上舍入。例如,
float_to_list(0.145, [{decimals,1}])
返回"0.2"
而不是"0.1"
。内部 ID: OTP-14890
修复了在启动期间早期加载或由
code:atomic_load
或code:finish_loading
加载的模块中导致 hipe 执行缓慢的错误。内部 ID: OTP-14891
修复了内部字符串格式化函数中的缓冲区溢出,如果为
erts_sprintf
或类似函数指定了长的浮点格式说明符,则可能会触发该溢出。内部 ID: OTP-14920
erlang:iolist_to_iovec/1
和enif_inspect_iovec
在提供在非字节边界上匹配出的二进制文件时将不再失败。内部 ID: OTP-14921
如果提供位字符串(没有列表),
iolist_to_binary/1
和erlang:iolist_to_iovec/1
现在将返回 badarg。内部 ID: OTP-14926
拒绝加载名称包含目录分隔符(Windows 上的 '/' 或 '\')的模块。
内部 ID: OTP-14933 辅助 ID: ERL-564, PR-1716
修复当跟踪进程在脏调度器上运行时死亡时可能发生的死锁。
工单号: OTP-14938
改进和新功能
更多崩溃转储信息,例如:进程二进制虚拟堆统计信息,在 GC 期间导致内存不足的进程的完整信息,更多端口相关信息以及脏调度器信息。
工单号: OTP-14820
Erts 9.2.1
改进和新功能
改进了对废弃内存载体的搜索算法。每个分配器实例不再使用有限的线性搜索,而是维护一个平衡的搜索树,其中包含其所有废弃的载体,以便进行更快、更彻底的搜索。
工单号: OTP-14915 辅助工单号: ERIERL-88
新增 erts_alloc 命令行选项
+M_acnl
和+M_acfml
,用于限制载体废弃。工单号: OTP-14916 辅助工单号: ERIERL-88
新增
erts_alloc
策略系列:按年龄排序的首次适配。类似于“按地址排序”,但始终选择最旧的可能载体进行分配。工单号: OTP-14917 辅助工单号: ERIERL-88
添加了使用
system_info(erts_alloc, ...)
在运行时更改分配器选项的可能性。目前此接口仅支持选项sbct
(单块载体阈值)。工单号: OTP-14918 辅助工单号: ERIERL-88
Erts 9.2.0.1
改进和新功能
关于与 erl_child_setup 进程通信的额外内部一致性检查。
工单号: OTP-15488 辅助工单号: ERIERL-231
Erts 9.2
已修复的错误和故障
修复了跟踪中的一个错误,当在某些函数上与 return_to 或 return_trace 结合使用时,{caller} 匹配规范函数会被错误地设置为 undefined。
受影响的函数有:erlang:put/2, erlang:erase/1, erlang:process_info/1,2, erlang:nif_load/2, erts_internal:garbage_collection/1 和 erts_internal:check_process_code/1。
由于此错误,当上述函数是函数中的尾调用时,fprof 所做的分析可能会变得不正确。
工单号: OTP-14677
修复了当
trap_exit
设置为 true 并且进程使用exit(self(), Reason)
向自身发送退出信号,同时为该进程启用了接收跟踪时,发生的模拟器死锁。工单号: OTP-14678 辅助工单号: ERL-495
崩溃转储的写入速度显着加快。
现在崩溃转储中包含 Map。
常量项仅在一个进程中显示,而引用同一常量项的其他进程则会显示不完整堆的标记。
工单号: OTP-14685 辅助工单号: OTP-14611, OTP-14603, OTP-14595
Windows 的后备主目录已更改为 PROFILE 目录,而不是 WINDOWS 目录。当未设置环境变量 HOMEDRIVE 和 HOMEPATH 时,将使用后备目录。
工单号: OTP-14691
修复了使用
<<X/utf32>>
二进制构造的 hipe 编译代码的错误,该错误可能导致错误的结果甚至 VM 崩溃。在 x86_64 以外的架构上,需要重新编译代码才能从此修复中获益。
工单号: OTP-14740
修复了在
erlang:garbage_collect/2
和erlang:check_process_code/3
中使用选项{async,ReqestId}
调用时的错误。如果RequestId
是一个立即项(如 pid、atom 或小整数),则可能导致 VM 崩溃或堆损坏。该错误从 OTP-17.0 开始存在。工单号: OTP-14752
随着 `enif_ioq_*` 的添加,ERL_NIF_MINOR_VERSION 没有更新。
工单号: OTP-14779
清除包含“伪字面量”(例如从 '
ets:new/2
' 获取的魔术引用)的加载代码会导致运行时系统崩溃。已更正。工单号: OTP-14791
将 atom 表的大小设置为接近 2147483647 的数字(使用 '
+t
' 选项)会导致模拟器因无法分配大量内存而退出。这已得到纠正。此外,已更正 '+t
' 选项的使用消息,以显示正确的上限 2147483647 而不是 0。工单号: OTP-14796
修复了一个阻止在 lcnt 结果中解析已注册进程名称的错误。
工单号: OTP-14803
修复了几个 HiPE 调试 BIF 中的格式错误。
工单号: OTP-14804
改进和新功能
现在崩溃转储中的二进制文件和其他一些数据以 base64 编码(而不是以十六进制编码),这将减小崩溃转储的大小。
修复了
crashdump_viewer
中子二进制文件处理中的一些错误。工单号: OTP-14686
针对向其他节点发送消息的发送操作的微优化。现在,对于分布式发送操作,可以更早地忽略从 TPC/IP 端口驱动程序发送回发送客户端进程的本地 ack 消息。
工单号: OTP-14689
Erts 9.1.5
已修复的错误和故障
修复了 Unix 上的文件关闭错误;close(2) 在 EINTR 上重试,这可能导致关闭另一个(最近打开的)文件。
工单号: OTP-14775
在拆除具有活动节点监视器的连接时,竞争条件可能导致运行时系统崩溃。
此错误是在 ERTS 版本 8.0 (OTP 19.0) 中引入的。
工单号: OTP-14781 辅助工单号: OTP-13047
Erts 9.1.4
已修复的错误和故障
微状态核算有时会为脏调度器产生不正确的结果。
工单号: OTP-14707
修复了
zlib:gunzip/1
中的回归,该回归阻止了解压缩大小是 16384 的完美倍数时的正常工作。此回归是在 20.1.1 中引入的。工单号: OTP-14730 辅助工单号: ERL-507
修复了
enif_inspect_iovec
中的内存损坏错误;可写二进制文件在进入 iovec 后仍保持可写状态。工单号: OTP-14745
修复了在遇到空二进制文件时
enif_inspect_iovec
中的崩溃。工单号: OTP-14750
在 zlib
1.2.11
的情况下,在zlib:deflate/2
之后调用zlib:deflateParams/3
将不再返回buf_error
。工单号: OTP-14751
Erts 9.1.3
已修复的错误和故障
添加了 zlib:set_controlling_process/2 以在进程之间移动 zstream()。
工单号: OTP-14672 辅助工单号: ERL-494
修复了当第一个可用 CPU 不是第一个检测到的 CPU 时调度器正确绑定的问题。例如,当使用“taskset -c X..Y”且 X 不等于 0 时。
工单号: OTP-14694
Erts 9.1.2
已修复的错误和故障
修复了当从其他节点在分发通道上收到损坏的消息时可能导致 VM 崩溃的错误。
工单号: OTP-14661 辅助工单号: ERIERL-80
Erts 9.1.1
已修复的错误和故障
新的 zlib 模块在解压串联流时返回 data_error,这与旧模块返回到第一个流末尾的解压缩数据的行为不兼容。
工单号: OTP-14648
zlib:gunzip/1 在解压串联的 gzip 文件时将不再在第一个流的末尾停止。
工单号: OTP-14649
Erts 9.1
已修复的错误和故障
更改了
erlang:apply/2
,如果第二个参数不是正确的列表,则引发badarg
异常。之前的行为是误导性的undef
异常。工单号: OTP-14490 辅助工单号: ERL-432
在 macOS 上,如果
observer
在crypto
之前启动,则crypto
会崩溃。在 macOS 10.13 (High Sierra) 的 beta 版上,crypto
会崩溃。这两个错误都已修复。工单号: OTP-14499 辅助工单号: ERL-251 ERL-439
修复了 enif_whereis_pid/port 中的一个错误,该错误在极少数情况下可能导致堆损坏。
工单号: OTP-14523
修复了当在脏 NIF 中时生成的跟踪消息在脏 NIF 执行完成后正确刷新的问题。
工单号: OTP-14538
修复了在 shell 中使用 ANSI 颜色代码时的转义代码处理。
工单号: OTP-14549 辅助工单号: PR1536
将 ERTS 内部 PCRE 库从 8.40 版本升级到 8.41 版本。有关 PCRE 更改的信息,请参阅 http://pcre.org/original/changelog.txt。此库实现了
re
正则表达式模块的主要部分。工单号: OTP-14574
修复了导致
statistics(runtime)
产生负值的错误,以及statistics(wall_clock)
导致值长一秒的错误。现在,
statistics(runtime)
还在可用时使用getrusage()
作为源,防止返回值像以前一样频繁地换行。工单号: OTP-14597 辅助工单号: ERL-465
修复了向终止端口发送时可能发生的小内存泄漏。
工单号: OTP-14609
修复了当启用
erlang:trace(on_load, ...)
时加载具有-on_load
指令的模块时导致 VM 崩溃的错误。工单号: OTP-14612
已在
list_to_existing_atom/1
和binary_to_existing_atom/2
的文档中添加了编译器可能会优化掉原子项的警告。工单号: OTP-14614 辅助工单号: ERL-453
改进和新功能
现在可以在锁计数仿真器(
-emu_type lcnt
)中完全在运行时切换锁计数功能。默认情况下,所有功能都已启用,以匹配旧的行为,但是当禁用特定类别时,可以随意切换,运行时开销极小。有关详细信息,请参阅lcnt:rt_mask/1
的文档。内部编号:OTP-13170
zlib
模块已重构,其所有操作现在都会适当地产生让步,从而允许它们在并发应用程序中自由使用。以下函数已弃用,但在 OTP 21 之前不会产生编译器警告:
zlib:adler32
、zlib:crc32
、zlib:inflateChunk
、zlib:getBufSize
、zlib:setBufSize
。当解压缩需要字典时抛出错误的行为也已被弃用。有关详细信息,请参阅
inflateSetDictionary/2
的文档。内部编号:OTP-14185
lcnt:collect
和lcnt:clear
将不再阻塞运行时系统中的所有其他线程。内部编号:OTP-14412
添加
erlang:iolist_to_iovec/1
,它将 iolist() 转换为 erlang:iovec(),适用于enif_inspect_iovec
。内部编号:OTP-14520
当提供错误的参数时,
zlib
模块现在将引发命名异常,而不仅仅是badarg
。例如,当使用未初始化的流的zlib:inflate/2
时,将引发not_initialized
异常。内部编号:OTP-14527
erlang:halt/2
允许将任何 Unicode 字符串用作崩溃转储的标语。内部编号:OTP-14553
添加新的 NIF API 函数来管理 I/O 队列。添加的函数包括:
enif_ioq_create()
enif_ioq_destroy()
enif_ioq_enq_binary()
enif_ioq_enqv()
enif_ioq_deq()
enif_ioq_peek()
enif_inspect_iovec()
enif_free_iovec()
内部编号:OTP-14598
Erts 9.0.5
已修复的错误和故障
修复了
binary_to_term
和binary_to_atom
中可能导致 VM 崩溃的错误。通常当 UTF8 字符串的最后一个字符在 128 到 255 的范围内,但被截断为只有一个字节时会发生。该错误在 ERTS 5.10.2 版本(OTP_R16B01)之后的binary_to_term
中存在,并且在 ERTS 9.0 版本(OTP-20.0)之后的binary_to_atom
中存在。内部编号:OTP-14590 辅助编号:ERL-474
Erts 9.0.4
已修复的错误和故障
用于存储调度程序 ID 的定时器内部位域太小。结果,当系统上使用 1024 个调度程序时,VM 内部定时器数据结构可能会变得不一致。请注意,具有少于 1024 个调度程序的系统不受此错误的影响。
此错误是在 ERTS 7.0 版本(OTP 18.0)中引入的。
内部编号:OTP-14548 辅助编号:OTP-11997, ERL-468
当所有者进程终止时,BIF 定时器的自动清理可能会与定时器的超时竞争。这可能会导致 VM 内部数据结构变得不一致,这很可能导致 VM 崩溃。
此错误是在 ERTS 9.0 版本(OTP 20.0)中引入的。
内部编号:OTP-14554 辅助编号:OTP-14356, ERL-468
Erts 9.0.3
已修复的错误和故障
二进制追加操作未检查溢出,导致追加巨大的二进制文件时产生荒谬的结果。
内部编号:OTP-14524
Erts 9.0.2
已修复的错误和故障
为 erts-9.0.1 (OTP-20.0.1) 中包含的 OTP-14491(“预分配器中的性能错误”)添加了缺失的发行说明。
内部编号:OTP-14494
修复了在发送超时时阻止 TCP 套接字正确关闭的错误。
内部编号:OTP-14509
修复了当一个操作数是最低
N*W
位为零的大的负整数,而另一个操作数不大于N*W
位时,运算符bxor
导致错误结果的错误。N
是大于或等于 1 的整数,W
是 32 或 64,具体取决于字长。内部编号:OTP-14514
Erts 9.0.1
已修复的错误和故障
修复了在远程关闭的 TCP 套接字上重复调用时,gen_tcp:send 永远不会返回的错误。
内部编号:OTP-13939 辅助编号:ERL-193
修复了在中止的 erlang:port_command/3 调用清理期间可能发生的段错误。如果端口在发出 port_command 的同时关闭,则 port_command 将被中止。此错误是在 erts-8.0 中引入的。
内部编号:OTP-14481
修复了
statistics(wall_clock)
和statistics(runtime)
的实现,以便由于仿真器,值不会不必要地回绕。请注意,由于操作系统提供的底层功能的限制,statistics(runtime)
返回的值仍然可能回绕。内部编号:OTP-14484
修复了预分配器中的性能错误,该错误可能导致它们永久回退到正常的、更昂贵的内存分配。预分配器用于快速分配消息和其他计划任务使用的短期元数据。此错误自 OTP_R15B02 起存在。[此发行说明在 erts-9.0.1 中缺失]
内部编号:OTP-14491
Erts 9.0
已修复的错误和故障
修复了有关 HiPE 编译代码的加载、升级和清除的各种错误
- 已清除模块的本机代码内存从未被释放。
- 在模块升级后,在某些情况下可能会调用错误的函数。
erlang:check_process_code
未检查从本机代码进行的递归调用。
内部编号:OTP-13968
Hipe 可选 LLVM 后端需要 LLVM 3.9 或更高版本,因为较旧的版本强制对 erts 内部结构具有很强的依赖性。
内部编号:OTP-14238
当捕获到诸如 '
throw(HugeTerm)
' 之类的异常时,HugeTerm
项将保留在进程中,直到发生下一个异常,这可能会增加进程的堆大小。该问题已被纠正。内部编号:OTP-14255 辅助编号:OTP-14400, OTP-14401
崩溃转储中的标语已扩展为打印更复杂的项。
内部编号:OTP-14303
修复了将
enif_inspect_binary
与enif_copy
结合使用时的错误。在某些情况下,当不应该时,enif_copy
调用可能会重新分配检查过的二进制文件。内部编号:OTP-14304
地址系列
local
(AF_UNIX / AF_LOCAL) 现在不确保 Linux 抽象地址的零终止,因此它们可以使用所有字节。内部编号:OTP-14305
为 Gentoo Hardened 和其他不接受链接器标志
-no-pie
的系统使用-fno-PIE
。内部编号:OTP-14307 辅助编号:PR-1379
禁用
ppc64le
架构(小端)的 hipe,因为它不支持,并且从未支持过。它之前被等同于ppc64
(大端),这导致在没有--disable-hipe
的情况下构建中断。内部编号:OTP-14314 辅助编号:ERL-369, PR-1394
修复了“epmd -kill”在由于某些错误导致 epmd 未被杀死时返回失败退出状态代码的问题。
内部编号:OTP-14324
修复了以下脏调度程序相关的错误
+SDPcpu
命令行参数可能导致脏 CPU 调度程序的数量设置为零- 当仅使用一个普通调度程序和脏调度程序支持时,
erlang:system_flag(multi_scheduling, _)
失败
内部编号:OTP-14335
修复了 erlexec 在确定 CPU 拓扑时处理 sysconf 和 proc fs 不匹配的问题。当将 docker 与
--cpuset-cpus
一起使用时,已看到此行为。内部编号:OTP-14352
修复了用于多块载体的内存段缓存。巨大的(> 2GB)内存段可能导致 VM 崩溃。但是,创建用于多块载体的这种巨大内存段非常罕见。
内部编号:OTP-14360 辅助编号:ERL-401, PR-1417
修复了当为模块启用
local
调用跟踪时,导致code:is_module_native
错误地返回 true 的错误。内部编号:OTP-14390
修复了在
trace_delivered
消息上接收跟踪时发生的仿真器崩溃。内部编号:OTP-14411
修复了在传输过程中连接关闭时,SunOS 上 file:sendfile 的错误处理。
内部编号:OTP-14424
escript
没有正确处理带有空格的路径。内部编号:OTP-14433
修复了在 MacOS X 上运行
wx
时发生的错误锁检查断言。内部编号:OTP-14437 辅助编号:ERL-360
活动模式 TCP 套接字现在在发送/关闭错误时会被正确清理。
内部编号:OTP-14441 辅助编号:ERL-430
修复了当必须设置 LIBS 配置变量时 hipe_mkliterals 的编译问题。
内部编号:OTP-14447
改进和新功能
添加了
erlang:garbage_collect/2
,它将选项列表作为最后一个参数,该列表可用于控制是执行小垃圾回收还是大垃圾回收。执行小回收仅收集最近死亡的项,但比大回收便宜。内部编号:OTP-11695
优化了对第一个元素为原子(atom)的元组的测试。
内部编号:OTP-12148
在进程间消息传递过程中,Erlang 字面量不再被复制。
内部编号:OTP-13529
在
erl_nif
API 中添加了对异步消息通知的支持,当套接字或其他文件描述符准备好接受读取或写入操作时会收到通知。添加了以下函数:- enif_select
- enif_monitor_process
- enif_demonitor_process
- enif_compare_monitors
- enif_open_resource_type_x
内部编号:OTP-13684
新增了两个 guard BIFs:'
floor/1
' 和 'ceil/1
'。它们都返回整数。在 'math
' 模块中,新增了两个同名的 BIFs,但它们返回浮点数值。内部编号:OTP-13692
移除了已弃用的
erlang:hash/2
。* 潜在的不兼容性 *
内部编号:OTP-13827
替换了已弃用的符号
time unit
表示法的使用。内部编号:OTP-13831 辅助编号:OTP-13735
在 zlib 中增加了对提取解压缩字典的支持。
内部编号:OTP-13842
移除了之前使用的清除策略。ERTS 8.1 版本中引入的可选清除策略现在是唯一可用的策略。
新的清除策略与旧策略略有不兼容。以前,持有引用被清除模块的
fun
的进程要么在软清除时失败,要么在硬清除期间被杀死。新的策略完全忽略fun
。如果存在引用被清除代码的fun
,并且在清除后使用,则在使用时会引发异常。也就是说,该行为将与清除后进程接收到fun
的情况完全相同。有关更多信息,请参见
erlang:check_process_code/3
的文档。* 潜在的不兼容性 *
内部编号:OTP-13844 辅助编号:OTP-13833
当运行时系统使用 SMP 支持构建时,现在默认启用脏调度器。
内部编号:OTP-13860
通过显著降低哈希负载因子,提高了大型
set
、bag
和duplicate_bag
的 ETS 查找/插入/删除速度。这种速度提升的代价是每个表条目少占用不到一个字。条目少于 256 个的表不受任何影响。内部编号:OTP-13903
不再支持 NIF 库的
reload
功能。自 OTP R15B 以来,它已被标记为已弃用。这意味着您对于每个模块实例只能成功调用一次erlang:load_nif/2
。即使 NIF 库实现了reload
回调,第二次调用erlang:load_nif/2
也会返回{error, {reload, _}}
。仍然支持通过 Erlang 模块升级机制来对 NIF 库进行运行时升级,同时存在当前模块实例和旧模块实例以及它们对应的 NIF 库。
* 潜在的不兼容性 *
内部编号:OTP-13908
添加了
erlang:system_info(atom_count)
和erlang:system_info(atom_limit)
,以提供一种检索当前和最大原子数量的方法。内部编号:OTP-13976
函数
fmod/2
已添加到math
模块。内部编号:OTP-14000
当为 HiPE 编译的模块调用
erlang:load_nif/2
时,会返回新的错误类型notsup
,这不受支持。内部编号:OTP-14002
将驱动程序和 nif 锁的检测添加到 lcnt
内部编号:OTP-14069
通过在垃圾回收期间尽可能将子二进制转换为堆二进制来减少内存压力。
内部编号:OTP-14149
现在,在具有 SMP 支持的 Erlang 运行时系统中,脏调度器已启用并受支持。
除了支持脏 NIF 之外,还引入了对脏 BIF 和脏垃圾回收的支持。如果启用了脏调度器,则所有可能需要很长时间才能完成的垃圾回收现在都在脏调度器上执行。
由于脏调度器的支持,使用参数检查调度器和运行队列状态的
erlang:statistics/1
已更改。使用此功能的代码可能需要重写,考虑到这些不兼容性。此类用法的示例包括对erlang:statistics(scheduler_wall_time)
、statistics(total_run_queue_lengths)
、statistics(total_active_tasks)
等的调用。* 潜在的不兼容性 *
内部编号:OTP-14152
原子现在可以包含任意 Unicode 字符。
内部编号:OTP-14178
在 Erlang 中引入了一个事件管理器来处理 OS 信号。可以订阅一部分 OS 信号,这些信号在 Kernel 应用程序中描述。
内部编号:OTP-14186
escript
程序现在可以处理指向 escript 的符号链接。这对于独立系统很有用,这些系统的
escript
位于未包含在执行路径中的 bin 目录中(因为它可能导致其erl
程序覆盖所需的程序)。相反,可以通过路径中 bin 目录中的符号链接来引用escript
。内部编号:OTP-14201 辅助编号:PR-1293
所有对 magic 二进制文件的使用都已被对 Erlang 引用的使用所取代。
magic 二进制文件呈现为空二进制文件,但实际上在 Erlang VM 内部引用了其他数据。由于它们呈现为空二进制文件,因此不同的 magic 二进制文件比较时相等,并且在传出 erlang 节点时也丢失了其内部数据。
新的引用用法没有任何这些奇怪的语义问题,并且对这些引用的使用进行了优化,使其具有与 magic 二进制文件相同的性能优势和内存使用优势。
以前使用 magic 二进制文件的几个示例是匹配规范和 NIF 资源。
内部编号:OTP-14205
非 smp 模拟器已被弃用,并计划在 OTP-21 中删除。
为了准备这样做,默认情况下不再构建线程化的非 smp 模拟器,并且必须使用 --enable-plain-emulator 来配置启用它。
* 潜在的不兼容性 *
内部编号:OTP-14272
允许 HiPE 在使用
--enable-m32-build
构建的 VM 上运行。内部编号:OTP-14330 辅助编号:PR-1397
将 OTP 内部 PCRE 库从 8.33 版本升级到 8.40 版本。该库用于实现
re
正则表达式模块。除了各种错误修复之外,新版本还允许更好的堆栈保护。为了利用此功能,默认情况下,所有平台上普通调度器线程的堆栈大小现在设置为 128 千字。普通调度器线程的堆栈大小可以在系统启动时通过将
+sss
命令行参数传递给erl
命令来设置。有关版本 8.33 和 8.40 之间对 PCRE 所做更改的信息,请参见 http://pcre.org/original/changelog.txt。
* 潜在的不兼容性 *
内部编号:OTP-14331 辅助编号:ERL-208
删除了 erlang 节点、
erl_interface
和jinterface
之间使用旧的 latin1 外部格式生成原子。用于原子的新 utf8 格式是在 OTP R16 中引入的。因此,OTP 20 节点无法连接到早于 R16 的节点。可以使用 latin1 编码的原子仍然使用
term_to_binary()
以 latin1 编码进行编码。请注意,在未来的 Erlang/OTP 版本中,所有原子都将默认使用 utf8 进行编码。有关更多信息,请参见erlang:term_to_binary/2
的文档。内部编号:OTP-14337
添加了函数
re:version/0
,该函数返回有关用于实现re
模块的 OTP 内部 PCRE 版本的信息。内部编号:OTP-14347 辅助编号:PR-1412
添加了新的调试 bif
erlang:list_to_port/1
。内部编号:OTP-14348
对 VM 内部的计时器管理进行了各种改进。这些改进既减少了计时器轮的内存消耗,又减少了处理计时器所需的工作量。
内部编号:OTP-14356
现在可以将套接字绑定到支持它的平台上的设备 (SO_BINDTODEVICE)。
例如,已实现此功能以支持 Linux 下的 VRF-Lite;请参见 VRF,以及 GitHub pull request #1326。
内部编号:OTP-14357 辅助编号:PR-1326
添加了以下
erl
命令行参数,您可以使用它们为脏调度器设置建议的堆栈:脏调度器的默认建议堆栈大小为 40 千字。
内部编号:OTP-14380
更改了 erts 启动程序名称 argv 0,以使用环境变量
ESCRIPT_NAME
,以便可以在 Unix 上使用外部程序(如 ps 和 htop)(取决于选项)查看erlc
、dialyzer
、typer
、ct_run
或 escript 名称。内部编号:OTP-14381
改进了
escript
文档。内部编号:OTP-14384 辅助编号:OTP-14201
添加了函数
enif_hash
,用于 NIF 计算任意项的哈希值。内部编号:OTP-14385 辅助编号:PR-1413
'
./configure --enable-lock-counter
' 将启用对支持锁计数的附加模拟器的构建。(该选项以前存在,但会在正在构建的默认模拟器中启用锁计数。)要启动锁计数模拟器,请使用 'erl -emu_type lcnt
'。在 Windows 上,
erl
识别了未记录的选项-debug
以启动调试编译的模拟器。该选项已被删除。请改用 'erl -emu_type debug
'。内部编号:OTP-14407
已在相关文档中添加了关于不要在暴露的环境中使用不安全的分布式节点的警告。
内部编号:OTP-14425
改进了环境变量
ERL_CRASH_DUMP_SECONDS
的文档以及未设置时的默认行为。内部编号:OTP-14434
为某些可能接收大量消息的系统进程启用了堆外消息队列。
内部编号:OTP-14438
ETS 锁索引已在 LCNT 结果中替换为表名。
内部编号:OTP-14442 辅助编号:ERIERL-22
引入了新函数
enif_whereis_pid()
和enif_whereis_port()
。内部编号:OTP-14453 辅助编号:PR-1400
Erts 8.3.5.7
修复的 Bug 和故障
修复了当两个负操作数进行
band
操作时,如果其中一个操作数的绝对值的最低N*W
位为零,而另一个操作数的绝对值不大于N*W
位时,导致结果错误的错误。N
是一个大于等于 1 的整数,W
根据字大小为 32 或 64。内部 ID:OTP-15487 辅助 ID:ERL-804
改进和新特性
添加了一个可选的
./configure
标志,用于使用 spectre 缓解措施编译仿真器:--with-spectre-mitigation
请注意,这需要最新版本的 GCC,支持 spectre 缓解措施和
--mindirect-branch=thunk
标志,例如8.1
。内部 ID:OTP-15430 辅助 ID:ERIERL-237
Erts 8.3.5.6
修复的 Bug 和故障
修复了向终止端口发送时可能发生的小内存泄漏。
自有 ID: OTP-14609 辅助 ID: ERIERL-238
Erts 8.3.5.5
修复的 Bug 和故障
修复了 inet 驱动程序中的竞争条件,该条件可能导致当模拟器使用 gcc 8 编译时接收挂起。
内部编号:OTP-15158 辅助编号:ERL-654
修复了导致某些 Erlang 引用排序不一致的错误。例如,这可能导致无法在搜索数据结构中查找以引用作为键的某些元素。此错误是在 R13B02 中引入的。
感谢 Simon Cornish 发现该错误并提供修复。
* 潜在的不兼容性 *
内部编号:OTP-15225
Erts 8.3.5.4
修复的 Bug 和故障
修复了 Unix 上的文件关闭错误;close(2) 在 EINTR 上重试,这可能导致关闭另一个(最近打开的)文件。
工单号: OTP-14775
在拆除具有活动节点监视器的连接时,竞争条件可能导致运行时系统崩溃。
此错误是在 ERTS 版本 8.0 (OTP 19.0) 中引入的。
工单号: OTP-14781 辅助工单号: OTP-13047
Erts 8.3.5.3
修复的 Bug 和故障
用于存储调度程序 ID 的定时器内部位域太小。结果,当系统上使用 1024 个调度程序时,VM 内部定时器数据结构可能会变得不一致。请注意,具有少于 1024 个调度程序的系统不受此错误的影响。
此错误是在 ERTS 7.0 版本(OTP 18.0)中引入的。
内部编号:OTP-14548 辅助编号:OTP-11997, ERL-468
修复了
binary_to_term
和binary_to_atom
中可能导致 VM 崩溃的错误。通常当 UTF8 字符串的最后一个字符在 128 到 255 的范围内,但被截断为只有一个字节时会发生。该错误在 ERTS 5.10.2 版本(OTP_R16B01)之后的binary_to_term
中存在,并且在 ERTS 9.0 版本(OTP-20.0)之后的binary_to_atom
中存在。内部编号:OTP-14590 辅助编号:ERL-474
修复了当启用
erlang:trace(on_load, ...)
时加载具有-on_load
指令的模块时导致 VM 崩溃的错误。工单号: OTP-14612
修复了当从其他节点在分发通道上收到损坏的消息时可能导致 VM 崩溃的错误。
工单号: OTP-14661 辅助工单号: ERIERL-80
Erts 8.3.5.2
修复的 Bug 和故障
修复了预分配器中的性能错误,该错误可能导致它们永久回退到正常的、开销更大的内存分配。预分配器用于快速分配消息和其他计划任务使用的短生命周期元数据。该错误自 OTP_R15B02 以来就存在。
内部编号:OTP-14491
修复了在发送超时时阻止 TCP 套接字正确关闭的错误。
内部编号:OTP-14509
修复了当一个操作数是最低
N*W
位为零的大的负整数,而另一个操作数不大于N*W
位时,运算符bxor
导致错误结果的错误。N
是大于或等于 1 的整数,W
是 32 或 64,具体取决于字长。内部编号:OTP-14514
Erts 8.3.5.1
修复的 Bug 和故障
修复了在远程关闭的 TCP 套接字上重复调用时,gen_tcp:send 永远不会返回的错误。
内部编号:OTP-13939 辅助编号:ERL-193
修复了在中止的 erlang:port_command/3 调用清理期间可能发生的段错误。如果端口在发出 port_command 的同时关闭,则 port_command 将被中止。此错误是在 erts-8.0 中引入的。
内部编号:OTP-14481
修复了
statistics(wall_clock)
和statistics(runtime)
的实现,以便由于仿真器,值不会不必要地回绕。请注意,由于操作系统提供的底层功能的限制,statistics(runtime)
返回的值仍然可能回绕。内部编号:OTP-14484
Erts 8.3.5
修复的 Bug 和故障
活动模式 TCP 套接字现在在发送/关闭错误时会被正确清理。
内部编号:OTP-14441 辅助编号:ERL-430
在某些情况下,代码清除操作可能会扩大休眠进程的大小。
自有 ID: OTP-14444 辅助 ID: ERIERL-24
修复了 erts-8.3.4 中引入的 ERL_ZZ_SIGTERM_KILL 的工作方式。
自有 ID: OTP-14451
Erts 8.3.4
修复的 Bug 和故障
添加选项使 SIGTERM 触发操作系统默认行为,而不是执行优雅关闭。要激活此行为,应将环境变量 ERL_ZZ_SIGTERM_KILL 设置为“true”。此选项仅在 OTP 19 中有效,因为 OTP 20 将采用不同的方式处理 SIGTERM。
自有 ID: OTP-14418 辅助 ID: ERIERL-15
Erts 8.3.3
修复的 Bug 和故障
修复了用于多块载体的内存段缓存。巨大的(> 2GB)内存段可能导致 VM 崩溃。但是,创建用于多块载体的这种巨大内存段非常罕见。
内部编号:OTP-14360 辅助编号:ERL-401, PR-1417
修复了 ERTS 版本 8.3.1 中 OTP-14290 的发布说明。它被错误地放置在“已知 Bug 和问题”下。
自有 ID: OTP-14363 辅助 ID: OTP-14290
Erts 8.3.2
修复的 Bug 和故障
erl
的+Bi
命令行参数错误地导致 VM 以及其所有子进程忽略SIGTERM
。此错误是在 erts 版本 8.3 中引入的。自有 ID: OTP-14358 辅助 ID: OTP-14085
Erts 8.3.1
修复的 Bug 和故障
在非 SMP BEAM 中,通过 SIGTERM 信号调用
init:stop/0
可能会导致 BEAM 因致命错误而终止。现在已修复此问题,当收到 SIGTERM 时,BEAM 将正常终止。自有 ID: OTP-14290
尝试在 Unix 上使用 file:read_file/1 打开目录会泄漏文件描述符。此错误现已修复。
自有 ID: OTP-14308 辅助 ID: ERL-383
Erts 8.3
修复的 Bug 和故障
修复了许多导致生成错误堆栈跟踪的错误。当应用以下函数或跟踪以下函数时,会生成错误的堆栈跟踪
自有 ID: OTP-14055
更正了有关映射内存占用量的文档。
自有 ID: OTP-14118
修复
process_info(Pid, current_stacktrace)
以使用system_flag(backtrace_depth)
设置的堆栈深度限制。旧行为是硬编码的 8 的深度限制。自有 ID: OTP-14119 辅助 ID: PR-1263
调用
erlang:system_flag(multi_scheduling, block)
的进程可能会在调用中永远挂起。自有 ID: OTP-14121
脏调度器错误修复
- 修复了在脏调度器上调度的进程的调用时间跟踪。
- 来自脏调度器的 GC 信息。
- 具有脏调度器的多调度块可能会导致运行时系统崩溃。
- 进程结构可能被过早删除。
- 脏调度器上的 GC 可能会导致运行时系统崩溃。
- 在脏调度器上执行的进程的终止可能会导致运行时系统崩溃。
自有 ID: OTP-14122
修复了将计时器数据写入崩溃转储时发生的崩溃。
自有 ID: OTP-14133
文字区域可能在仍被进程引用的情况下被删除。
自有 ID: OTP-14134
修复了垃圾收集器中可能导致运行时系统崩溃的错误。
自有 ID: OTP-14135
修复了 NIF 的调用时间跟踪中的错误,该错误导致对一个调用多次错误地启动跟踪。
自有 ID: OTP-14136
在处理 hipe 编译代码中的异常时,删除调试输出和不必要的垃圾回收。
自有 ID: OTP-14153
修复了可能导致 VM 崩溃的垃圾回收跟踪错误。该错误自 OTP 19.0 以来就存在。
自有 ID: OTP-14154
修复了由具有
compressed
选项的term_to_binary
创建的二进制文件的binary_to_term
中的错误。当 Erlang VM 链接到版本 1.2.9 或更高版本的zlib
库时,该错误可能会导致有效二进制文件出现badarg
异常。该错误自 OTP 17.0 以来就存在。自有 ID: OTP-14159 辅助 ID: ERL-340
修复了在生成崩溃转储时调度程序的挂起问题。
自有 ID: OTP-14164
在没有 SMP 支持的运行时系统中,NIF 资源没有以线程安全的方式处理。
由于此修复,以下驱动程序函数现在在没有 SMP 支持的运行时系统中也是线程安全的
driver_free_binary()
driver_realloc_binary()
driver_binary_get_refc()
driver_binary_inc_refc()
driver_binary_dec_refc()
自有 ID: OTP-14202
修复了绝对值在
(1 bsl 52)
和(1 bsl 53)
之间的大浮点数的erlang:round/1
。尽管所有直到(1 bsl 53)
的整数值都可以用完全精度表示为浮点数,但结果被错误地计算为下一个更高的偶数。自有 ID: OTP-14227
像 OTP-19.0 之前那样,将文字的大小添加到崩溃转储和中断菜单中的
(l)oaded
命令中的模块代码大小中。自有 ID: OTP-14228
修复了在没有进程上下文且参数
msg_env
为NULL
的情况下调用enif_send
的潜在错误。自有 ID: OTP-14229
修复了将可追加二进制文件传递给
erlang:port_control()
可能会导致模拟器崩溃的错误。自有 ID: OTP-14231
Erlang shell 中带有超时的接收表达式可能会导致 VM 崩溃。
自有 ID: OTP-14241 辅助 ID: ERL-365
改进和新特性
接收到 beam 的 SIGTERM 信号将生成一个
'stop'
消息到init
进程,并正常终止 Erlang VM。这等效于调用init:stop/0
。自有 ID: OTP-14085
解决有问题的 Android
PTHREAD_STACK_MIN
实现的问题,导致运行时系统在未声明的PAGE_SIZE
上构建时崩溃。自有 ID: OTP-14165 辅助 ID: ERL-319
添加配置选项 --without-thread-names,该选项会删除各个模拟器线程的命名。
自有 ID: OTP-14234
在关于
zlib:deflateInit/6
的文档中添加关于WindowsBits
值 8 和 -8 的选项的警告。自有 ID: OTP-14254 辅助 ID: ERL-362
Erts 8.2.2
修复的 Bug 和故障
修复了由具有
compressed
选项的term_to_binary
创建的二进制文件的binary_to_term
中的错误。当 Erlang VM 链接到版本 1.2.9 或更高版本的zlib
库时,该错误可能会导致有效二进制文件出现badarg
异常。该错误自 OTP 17.0 以来就存在。自有 ID: OTP-14159 辅助 ID: ERL-340
驱动程序 efile_drv 在打开文件时,如果 fstat() 存在,现在在打开之前使用打开的文件上的 fstat() 而不是 stat()。这避免了在 stat() 和 open() 之间文件恰好发生更改时的竞争。
自有 ID: OTP-14184 辅助 ID: seq-13266
Erts 8.2.1
修复的 Bug 和故障
修复了一个非常罕见的错误,该错误导致代码加载期间以及使用尚未加载的模块的导出函数 (fun M:F/A) 时 VM 崩溃。需要并发调度器线程的非常特定的时序。已在 ARM 上看到,但也可能发生在其他架构上。该错误自 OTP R16 以来就存在。
自有 ID: OTP-14144 辅助 ID: seq13242
Erts 8.2
修复的 Bug 和故障
修复了 MacOSX 上的
configure
失败。最重要的是,尽管在 MacOSX - Sierra 之前不可用,但在使用 XCode 8 构建 MacOSX - El Capitan 时检测到了clock_gettime()
。自有 ID: OTP-13904 辅助 ID: ERL-256
code:add_pathsa/1
和命令行选项-pa
在将给定的目录列表添加到代码路径开头时都会反转该列表。现在已对此进行文档说明。自有 Id: OTP-13920 辅助 Id: ERL-267
修复了 OpenBSD 中与 __errno 变量使用相关的 erts 编译错误。
自有 Id: OTP-13927
修复了在启用对具有无效追踪器的进程的追踪时,新追踪器会覆盖旧追踪器的问题。在此修复之前,调用 erlang:trace/3 的行为就像追踪器仍然存在并且不应用新追踪一样。
此故障是在 ERTS 8.0 中引入的。
自有 Id: OTP-13928
修复了对
-profile_boot 'true' | 'false'
的解析。自有 Id: OTP-13955 辅助 Id: ERL-280
稍微改进了
erlang:get_stacktrace/0
,以处理在 hipe 编译代码中引发的异常。此类堆栈跟踪中的 Beam 编译函数之前被替换为一些不相关的函数。现在它们被省略了。这是在没有用于混合 beam 和 hipe 函数的完整且正确的堆栈跟踪的情况下,尝试减少混淆的一种方法。自有 Id: OTP-13992
更正了匹配规范头部的类型声明。
自有 Id: OTP-13996
如果 gcc 配置了
--enable-default-pie
,则 x86_64 的 HiPE 代码加载将失败。通过在构建 VM 时(如果 HiPE 需要)禁用 PIE 解决了此问题。自有 Id: OTP-14031 辅助 Id: ERL-294, PR-1239
错误的参数可能会出现在从使用
enif_schedule_nif()
重新调度的 NIF 中抛出的异常中。自有 Id: OTP-14048
如果在 NIF 使用
enif_schedule_nif()
重新调度后立即对进程执行垃圾回收,则运行时系统可能会崩溃。自有 Id: OTP-14049
如果进程在检查时刚刚使用
enif_schedule_nif()
重新调度了 NIF 调用,则清除操作可能会留下对已清除代码的未检测到的引用。这可能会导致运行时系统崩溃。自有 Id: OTP-14050
修复了许多与脏调度程序相关的错误
- 在脏调度程序上进行调度时,进程优先级未得到正确处理。
- 当带有复合退出原因的退出信号发送到在脏调度程序上执行的进程时,运行时系统可能会崩溃。
- 当调用跟踪在脏调度程序上执行的进程时,运行时系统会崩溃。
- 当进程在脏调度程序上执行时,代码清除操作可能会永远挂起
自有 Id: OTP-14051
改进和新功能
修复了一个小的软清除竞争错误,如果软清除失败并且模块的当前版本不存在,则可能错误地触发 code_server 加载模块的新代码。
自有 Id: OTP-13925
为了方便故障排除,
erlang:load_nif/2
现在在错误元组的文本部分中包含了加载/重新加载/升级失败调用的返回值。crypto
NIF 通过返回初始化失败的源行(如果有)来使用此功能。自有 Id: OTP-13951
新的环境变量
ERL_CRASH_DUMP_BYTES
可用于限制崩溃转储的大小。如果达到限制,则会中止崩溃转储生成,并且生成的 文件将被截断。自有 Id: OTP-14046
Erts 8.1.1.1
修复的错误和故障
在某些情况下,代码清除操作可能会扩大休眠进程的大小。
自有 ID: OTP-14444 辅助 ID: ERIERL-24
Erts 8.1.1
修复的错误和故障
模拟器对 libsctp 有一个动态库依赖关系,这在 Linux 上不是预期的,因为模拟器会在运行时加载和解析所需的 sctp 函数。 这已得到修复,并为那些需要此类库依赖项的人添加了配置开关 --enable-sctp=lib。
自有 Id: OTP-13956 辅助 Id: ERL-262, ERL-133
修复 SIGUSR1 崩溃转储生成
在请求崩溃转储时不要生成核心转储。
自有 Id: OTP-13997
code
中允许一次加载多个模块的新函数存在性能问题。在erl_prim_loader
进程中执行辅助函数时,会产生垃圾消息。垃圾消息被忽略并最终丢弃,但会对性能和内存使用产生负面影响。垃圾消息的数量取决于要加载的模块数量和代码路径的长度。受此问题影响的函数是:
atomic_load/1
、ensure_modules_loaded/1
和prepare_loading/1
。自有 Id: OTP-14009
Erts 8.1
修复的错误和故障
修复了从 hipe 代码调用在 yield 时禁用 GC 的 BIF 的错误。导致 Dialyzer 在 ARM 上(以及可能所有其他非英特尔平台)崩溃。
自有 Id: OTP-13724 辅助 Id: PR-1116
修复了更改 VM 的当前工作目录不会更改使用
erlang:open_port({spawn,""}, ...)
生成的程序的当前工作目录的错误。自有 Id: OTP-13733 辅助 Id: ERL-175
修复了从启用 return_to 跟踪并正在
erlang:trace/3
上进行跟踪的进程禁用跟踪会导致段错误的问题。自有 Id: OTP-13734
更新所有 erts 文档,以使用更简单的英语,使用一致的术语,并且更易于导航。
自有 Id: OTP-13740
将脏调度程序添加到微状态核算统计信息中。
自有 Id: OTP-13744
修复了 32 位 Windows 上脏调度程序的构建支持。
自有 Id: OTP-13759
SCTP 套接字上的 inet:getstat(Socket) 为发送统计信息返回 0。此错误现已得到纠正。由 systra 在 bugs.erlang.org 上报告为问题 ERL-102。
自有 Id: OTP-13773 辅助 Id: ERL-102
AF_UNSPEC 和未知的地址族被 prim_inet 中的 UDP 接收错误读取,导致异常。此错误现已得到纠正。
自有 Id: OTP-13775
在代码清除期间扫描 HiPE 堆栈中的文字。
自有 Id: OTP-13777 辅助 Id: PR-1122
修复了 OpenBSD 上 run_erl 中的错误,该错误可能导致它在极少数情况下在根本不启动程序 (erl) 的情况下退出。
自有 Id: OTP-13795
更新构建脚本,使其不再假设 env、cp 和 perl 的位置。
自有 Id: OTP-13800
修复了如果具有无限关闭超时(例如,主管)的进程在终止时尝试加载代码,则 init:stop 可能会死锁的错误。
自有 Id: OTP-13802
修复了在释放跟踪器模块状态时,sparc CPU 上的段错误。
自有 Id: OTP-13803
在清除模块期间,未正确处理
fun
。这可能会在模块清除后导致 VM 崩溃。自有 Id: OTP-13809
修复了监视端口的进程崩溃时的内存泄漏。
自有 Id: OTP-13818
修复了多个与脏调度程序相关的跟踪错误。
自有 Id: OTP-13822
修复了 beam 代码运行时加载器中,当索引和大小字段获得损坏(负)值时的多种情况下的错误处理。
自有 Id: OTP-13848 辅助 Id: ERL-216
对脏调度程序实现的细微修复。
自有 Id: OTP-13852
在相应的端口无效时,从非调度程序线程调用
erl_drv_send_term()
或erl_drv_output_term()
会导致模拟器进入不一致状态,最终导致模拟器崩溃。自有 Id: OTP-13866
修复了
erlang:open_port({spawn, ""}, ...)
中罕见的竞争条件,该竞争条件会导致 erl_child_setup 程序中止并导致模拟器退出。自有 Id: OTP-13868
从非调度程序线程使用时,访问进程或端口的驱动程序和 NIF 操作可能会导致模拟器崩溃。这些操作是
erl_drv_send_term()
driver_send_term()
erl_drv_output_term()
driver_output_term()
enif_send()
enif_port_command()
自有 Id: OTP-13869
修复 Makefile 中启动脚本生成依赖关系
自有 Id: OTP-13871 辅助 Id: ERL-241
如果在重新调度的 NIF 抛出异常后调用
erlang:get_stacktrace()
,则 VM 可能会崩溃。自有 Id: OTP-13877
在加载带有 on_load 函数的模块之前调用
code:delete/1
,旧代码将被覆盖,如果涉及到 NIF,则会导致内存泄漏或崩溃。(感谢 vans163 报告此错误。)自有 Id: OTP-13893 辅助 Id: ERL-240
改进和新功能
提高了 MacOS X 上超时的准确性。这是通过在调度程序等待期间设置过早的超时,然后设置短的实际超时来实现的。
自有 Id: OTP-13698
将以下符号时间单位表示形式添加到
erlang:time_unit/0
类型中second
millisecond
microsecond
nanosecond
以下符号时间单位表示形式现在已弃用,但仍是
erlang:time_unit()
类型的一部分seconds
milli_seconds
micro_seconds
nano_seconds
自有 Id: OTP-13735
修复了具有映射键的映射的映射散列熵。
自有 Id: OTP-13763 辅助 Id: ERL-199
改进了脏调度程序支持。现在可以执行模块的清除,而无需等待所有正在进行的脏 NIF 调用的完成。
请注意,在启用对脏调度程序的支持时,将启用 ERTS 版本 8.1 的新清除策略。此新策略与默认使用的策略不完全向后兼容。有关详细信息,请参阅
erlang:check_process_code/3
的文档。自有 Id: OTP-13808 辅助 Id: OTP-13833
引入了一种新的清除策略。在 OTP 19 发行版期间,默认情况下将禁用新策略,但在 OTP 20 发行版中将是唯一可用的策略。
新策略与 OTP 19 中默认使用的策略略微不兼容。使用默认策略,持有引用正在清除的模块的
fun
的进程要么软清除失败,要么在硬清除期间被杀死。新策略完全忽略fun
。如果存在引用正在清除的代码的fun
并且在清除后使用,则在使用时会引发异常。也就是说,其行为将与在清除后进程收到fun
的情况完全相同。在 OTP 19 期间构建 OTP 时,可以选择启用新策略,如果运行时系统在构建时支持脏调度程序,则会自动启用新策略。
有关更多信息,请参见
erlang:check_process_code/3
的文档。自有 Id: OTP-13833
修复了垃圾回收期间不必要的堆大小需求高估。
自有 Id: OTP-13851
Erts 8.0.5
修复的错误和故障
修复了当进程接收到二进制文件时,在垃圾回收期间发生的 VM 崩溃。此错误在 ERTS 版本 8.0 (OTP 19.0) 中引入。
自有 ID: OTP-13890
Erts 8.0.4
修复的错误和故障
修复了当进程通过分布式接收到映射时,在垃圾回收期间发生的 VM 崩溃。此错误在 ERTS 版本 8.0 (OTP 19.0) 中引入。
自有 ID: OTP-13889
Erts 8.0.3
修复的错误和故障
修复了在
receive ... after
中超时进程可能导致丢失唤醒的竞争。此错误在 ERTS 版本 7.0 中引入。自有 ID: OTP-13798 辅助 ID: OTP-11997
修复了写入 erl 崩溃转储后的段错误。
自有 ID: OTP-13799
Erts 8.0.2
修复的错误和故障
修复了当未找到键并且插入默认对象导致表增长时,
ets:update_counter/4
中的调度器死锁错误。自有 ID: OTP-13731 辅助 ID: ERL-188
修复了由
bsl
操作和一些非常特定的堆条件触发的垃圾回收中 VM 中止“堆栈和堆溢出”的问题。自有 ID: OTP-13732 辅助 ID: seq13142
Erts 8.0.1
修复的错误和故障
group_leader/2
中的内存分配错误可能导致在垃圾回收已被分配远程组长的进程时发生模拟器崩溃。此错误在 ERTS 版本 8.0 中引入。自有 ID: OTP-13716
Erts 8.0
修复的错误和故障
改进了
on_load
函数的处理。主要的改进是,如果代码升级因on_load
函数失败而失败,则现在将保留模块的先前版本。自有 ID: OTP-12593
is_builtin(erlang, apply, 3)
现在将返回true
。自有 ID: OTP-13034
修复
enif_get_list_length
,如果列表不正确或长度大于UINT_MAX
,则返回 false(之前返回 true 和不正确的长度值)。自有 ID: OTP-13288 辅助 ID: PR913
清理 x86 的 hipe 信号处理代码,使其更具可移植性。
自有 ID: OTP-13341 辅助 ID: PR951
使 file:datasync 在 Mac OSX 上使用 fsync 而不是 fdatasync。
自有 ID: OTP-13411
确保在内存不足时创建崩溃转储。这在 erts-7.3 版本中意外删除。
自有 ID: OTP-13419
修复了一个错误,如果 erlang 在 unix 平台上以 +B 启动,则在创建崩溃转储时会被 SIGUSR2 信号杀死。
自有 ID: OTP-13425
修复
process_flag(trap_exit,true)
和接收到的退出信号之间的竞争。即使
process_flag(trap_exit,true)
已返回,进程也可能由于退出信号而终止。需要process_flag/2
的调用和来自另一个调度器的退出信号之间非常精确的时间才能发生这种情况。自有 ID: OTP-13452
不要搜索不存在的 Map 键两次
对于
maps:get/2,3
和maps:find/2
,如果键不存在,则在小型映射中搜索直接键(例如原子)会执行两次搜索。自有 ID: OTP-13459
当要发送异常大的分发消息时,VM 已更改为创建崩溃转储而不是核心转储。
自有 ID: OTP-13474
修复
erlang:process_info/2
类型规范自有 ID: OTP-13485 辅助 ID: ERL-123
修复
open_port/2
中带有选项{args, List}
的错误。不正确的List
可能会导致 vm 崩溃。自有 ID: OTP-13489 辅助 ID: ERL-127
修复了一个竞争条件错误,当启用
erlang:system_profile/1,2
并且在终止期间必须重新调度进程时,模拟器可能会崩溃。自有 ID: OTP-13494 辅助 ID: ERL-126
修复了缩减计数器未正确处理的错误。
自有 ID: OTP-13512
修复了
EPMD_DUMP_REQ
响应描述中的拼写错误。自有 ID: OTP-13517
修复了一个错误,其中标记为敏感的进程有时会在不应该记录其 save_calls 时记录。
自有 ID: OTP-13540
更新配置脚本,不使用 /bin/pwd 和 /bin/rm 的硬编码路径。
自有 ID: OTP-13562
当传递的二进制文件大于链接驱动程序的 outputv 回调在一个 io 矢量槽中可以处理的大小时,二进制文件现在会拆分为 io 矢量中的多个槽。此更改仅影响 io 矢量槽的最大大小小于系统字大小的系统(例如 Windows)。
此更改意味着现在可以在 Windows 上将大于 4GB 的二进制文件发送到 port_command,这用于 file:write、gen_tcp:send 等。
自有 ID: OTP-13628
解决崩溃转储中 Maps 输出的问题。目前,如果在崩溃期间遇到 Map 类型,则会生成原子“undefined”而不是 Map 数据。
自有 ID: OTP-13657
改进和新功能
扩展了跟踪支持,允许 跟踪器模块 作为跟踪事件处理程序,而不是进程或端口。跟踪器模块 使跟踪工具可以在不必先从被跟踪的进程或端口复制跟踪事件数据的情况下过滤或操作跟踪事件数据。
随着此功能的引入,
erlang:trace(all|existing, _, _)
现在还将跟踪器进程作为启用跟踪的进程数的一部分返回。这与之前的版本不兼容。* 潜在的不兼容性 *
自有 ID: OTP-10267
引入 Erlang 运行时系统的 LTTng 跟踪
要启用 LTTng,需要使用配置选项
--with-dynamic-trace=lttng
构建 OTP。此功能为调度器、驱动程序、内存载体、内存和异步线程池引入了跟踪点。
有关所有跟踪点的列表,请参阅 运行时工具用户指南 。
自有 ID: OTP-10282
可以使用
erlang:monitor/2
API 监视/取消监视端口。进程和端口信息函数也已更新,以包含有关从进程到端口的监视器的信息。自有 ID: OTP-11384
添加微状态统计
微状态统计是一种跟踪 ERTS 中不同线程所处状态的方法。主要用途是通过检查线程所处的状态,然后从中找出原因以及在何处进行优化来精确定位性能瓶颈。
由于检查微状态统计的开启或关闭相对昂贵,因此默认情况下仅启用少数状态,可以通过配置启用更多状态。
runtime_tools 中添加了一个名为 msacc 的便捷模块,可以帮助收集和解释来自微状态统计的数据。
有关更多信息,请参阅 erlang:statistics(microstateaccounting, ) 和 runtime_tools 中的
msacc
模块。自有 ID: OTP-12345
Erlang/OTP 到实时操作系统 OSE 的端口已删除。
自有 ID: OTP-12573
为消息和退出信号共享保留的副本
使用配置选项
--enable-sharing-preserving
启用共享保留的副本。这将保留在 Erlang 节点中与其他进程通信时在进程内的共享。这是一种权衡,副本的成本更高,但是如果消息中存在大量共享,则可以收回此成本。此外,文字不会在发送期间复制,除非在文字所在的模块的清除阶段。此功能在 19.0 中被认为是实验性的。自有 ID: OTP-12590 辅助 ID: OTP-10251
已删除 Halfword BEAM。
自有 ID: OTP-12883
添加了
os:perf_counter/1
。perf_counter 是一个非常非常便宜且高分辨率的计时器,可用于为系统事件加时间戳。它没有单调性保证,但应该在大多数操作系统上公开单调时间。
自有 ID: OTP-12908
支持碎片化的年轻堆生成。也就是说,年轻堆生成可以由多个不连续的内存区域组成。此更改的主要原因是避免不直接在接收器堆上分配的消息的额外复制。
自有 ID: OTP-13047
Erlang 链接驱动程序现在可以强制调用 open_port 阻塞,直到在驱动程序内部调用 erl_drv_init_ack。当您要进行一些异步初始化(例如从管道获取配置),并且如果配置不完整或错误,则希望初始 open_port 调用失败时,这很有用。有关 API 的更多详细信息,请参阅 erl_driver 文档。
自有 ID: OTP-13086
Erlang 链接驱动程序现在可以使用
erl_drv_set_pid
函数将自己的 pid 设置为在erlang:port_info/1
中看到的 pid。有关更多详细信息,请参阅 erl_driver 文档。自有 ID: OTP-13087
当使用 spawn 或 spawn_executable 调用
erlang:open_port/2
时,其背后的功能已重做,以便在名为 erl_child_setup 的单独进程中完成新程序的 fork。这允许使用更少的内存并且不会阻止整个模拟器(如果要启动的程序位于不可访问的 NFS 上)的更健壮的实现。基准测试表明,这种方法的速度大约是 erts 执行 fork/vfork 的旧方法的 3-5 倍。这是一个纯粹的稳定性和性能修复,但是某些错误消息可能已更改,这就是为什么它被标记为向后不兼容的更改。* 潜在的不兼容性 *
自有 ID: OTP-13088
改进了以下本机函数实现中的屈服策略
erlang:binary_to_list/1
erlang:binary_to_list/3
erlang:bitstring_to_list/1
erlang:list_to_binary/1
erlang:iolist_to_binary/1
erlang:list_to_bitstring/1
binary:list_to_bin/1
这是为了提高这些函数的性能。
自有 ID: OTP-13096
现在,所有进程的垃圾回收都会增加缩减。垃圾回收时增加的缩减量也已调整。它现在更好地对应于执行的工作量。这是为了提高系统的实时特性。
自有 ID:OTP-13097
在 '
code
' 模块中添加了可以一次加载多个模块的新函数。这些函数是code:atomic_load/1
、code:prepare_loading/1
、code:finish_loading/1
和code:ensure_modules_loaded/1
。自有 ID:OTP-13111
erl
的-boot_var
选项现在仅支持单个键和单个值(如文档所述)。该选项以前允许多个键/值对,但该行为未在文档中说明。函数
erl_prim_loader:start/3
已被删除。其文档也已被删除。未记录且不受支持的函数
erl_prim_loader:get_files/2
已被删除。自有 ID:OTP-13112
底层 BIF
erlang:purge_module/1
针对不正确的使用进行了增强。在模块被清除之前,仍然引用旧代码的残留进程现在会被终止,以防止致命的 VM 行为。自有 ID:OTP-13122
改进了 dirty 调度器的实现。有关更多信息,请参阅 NIF 文档。
注意
- dirty 调度器支持仍然是实验性的。
- 已删除使用 C 预处理器宏
ERL_NIF_DIRTY_SCHEDULER_SUPPORT
在编译时确定是否存在 dirty NIF 支持的功能。 - 函数
enif_is_on_dirty_scheduler()
已被删除。请改用enif_thread_type()
。
自有 ID:OTP-13123
对进程字典访问进行了各种优化。
自有 ID:OTP-13167
添加了 max_heap_size 进程标志。max_heap_size 允许用户限制进程使用的最大堆大小。有关更多详细信息,请参阅 erlang:process_flag。
自有 ID:OTP-13174
允许使用 gcc 选项
-fvisibility=hidden
构建动态驱动程序和 NIF 库,以加快加载速度并优化代码。自有 ID:OTP-13227
添加了
erlang:process_info(Pid, garbage_collection_info)
,它返回扩展的 garbage_collection 信息。有关更多详细信息,请参阅文档。自有 ID:OTP-13265
函数
erlang:list_to_integer/1
和string:to_integer/1
针对大型输入进行了优化。自有 ID:OTP-13293
通过为 HiPE/AMD64 小型代码模型保留足够的低虚拟地址空间,改进了 x86_64 (amd64) 架构上 hipe 本机代码的内存分配策略。hipe 代码的默认虚拟地址区域设置为 512Mb,但可以使用模拟器标志
+MXscs
进行更改。自有 ID:OTP-13359
引入了对进程消息队列引用的数据进行可配置管理的功能。每个进程都可以单独配置。
现在可以配置进程的消息队列,以便其引用的所有数据都保留在堆之外,从而防止这些数据成为垃圾回收的一部分。
有关更多信息,请参阅
process_flag(message_queue_data, MQD)
的文档。自有 ID:OTP-13366 辅助 ID:OTP-13047
进程现在在扫描大型消息队列且未找到匹配消息时会产生让步,以便提高实时特性。
自有 ID:OTP-13401
优化了一个用于遍历 Erlang 项的 erts 内部函数。该内部函数主要用于 term_to_binary 和项的比较。基准测试表明,优化后这些函数的性能提高了高达 10%。
自有 ID:OTP-13440
添加以下 NIF API 函数
enif_cpu_time
enif_now_time
enif_make_unique_integer
enif_is_process_alive
enif_is_port_alive
enif_term_to_binary
enif_binary_to_term
enif_port_command
有关每个函数的作用的详细信息,请参阅 erl_nif 文档。
自有 ID:OTP-13442
通过使用单次传递来构建新列表,同时检查其正确性,优化
'++'
运算符和lists:append/2
。自有 ID:OTP-13487
处理来自“创建”值大于 3 的节点的项(pid、端口和引用)。这是为分发协议准备的,以允许 OTP 19 节点与未来的节点(20 或更高版本)正确通信。“创建”值区分同一节点(名称)的不同化身。
自有 ID:OTP-13488
不要在 epmd 中发送未经请求的 systemd 通知
自有 ID:OTP-13493 辅助 ID:PR-999
enif_send API 已扩展为允许将 NULL 用作消息环境。当以这种方式使用时,会隐式创建一个消息环境,并且在发送之前将给定的项复制到该环境中。如果 NIF 发送许多小消息,这可以是一种优化。
自有 ID:OTP-13495
跟踪支持已扩展为允许在端口上进行跟踪。可以使用 'ports'、'send' 和 'receive' 跟踪标志来跟踪端口。
erlang:trace/3
的第一个参数已扩展,因此'all'
、'existing'
和'new'
现在同时包含进程和端口。添加了新的Tracee
变体,'all_processes'
、'all_ports'
、'existing_processes'
等,以仅指定进程或端口。* 潜在的不兼容性 *
自有 ID:OTP-13496
当启用
'procs'
跟踪标志时,新创建的进程现在也会生成'spawned'
跟踪事件。以前的事件'spawn'
仍然存在,但是由于它是通过执行 spawn 的进程生成的,因此不能保证它与新生成的进程的其他跟踪事件排序。因此,在跟踪进程的生命周期时,应使用此新事件作为创建事件。此新跟踪事件被标记为不兼容,因为当启用 'procs' 时,期望特定跟踪事件的工具必须进行更新。
* 潜在的不兼容性 *
自有 ID:OTP-13497
添加
erlang:match_spec_test/3
函数。该函数允许测试跟踪和 ets 表的匹配规范。它可用于测试匹配规范是否对特定数据执行了预期的过滤。它还返回结构不正确的匹配规范的更详细的错误原因。自有 ID:OTP-13501
erts 内部跟踪支持已更改为具有更少的开销并且更具可伸缩性。
此重写不会破坏任何向后不兼容性,但它会更改与以前版本相比的一些跟踪消息的顺序。应该注意的是,这仅适用于发送到进程或端口的跟踪消息,不适用于新的跟踪器模块。但是,在以后的版本中,它们也可能会受到影响。
仅保证来自一个被跟踪进程或端口的跟踪消息是有序的。在以前的版本中,这不是可见的,因为
'send'
跟踪消息始终会在相应的'receive'
跟踪消息之前到达,但现在不再总是如此。这也意味着带有时间戳的跟踪消息可能会显得乱序到达,因为时间戳是在事件触发时而不是在将其放入跟踪器的队列时获取的。自有 ID:OTP-13503
添加使用匹配规范过滤
send
和receive
跟踪的可能性。自有 ID:OTP-13507
添加
maps:update_with/3,4
和maps:take/2
自有 ID:OTP-13522 辅助 ID:PR-1025
通过 Erlang 跟踪引入 LTTng 跟踪。
要启用 LTTng,需要使用配置选项
--with-dynamic-trace=lttng
构建 OTP。动态跟踪模块
dyntrace
现在可以作为 Erlang 跟踪的 LTTng sink 使用。有关所有跟踪点的列表,请参阅 Runtime Tools 用户指南。此功能还在跟踪标签中引入了不兼容的更改。跟踪标签
gc_start
和gc_end
已拆分为gc_minor_start
、gc_minor_end
和gc_major_start
、gc_major_end
。* 潜在的不兼容性 *
自有 ID:OTP-13532
在崩溃转储期间打印正在垃圾回收的进程的堆指针
自有 ID:OTP-13541 辅助 ID:PR-1026
更改并改进了
erlang:system_info/1
返回的底层内存统计信息。erts_mmap
的信息已从mseg_alloc
移到{allocator, erts_mmap}
返回的自己的部分。自有 ID:OTP-13560
将 enif_snprintf 添加到 NIF API
函数
enif_snprintf
类似于snprintf
调用,但可以通过%T
格式说明符处理 Erlang 项的格式化。自有 ID:OTP-13580
已删除
erlang:raise/3
的文档中的警告。现在正式可以完全在生产代码中使用 raise/3。自有 ID:OTP-13599
修复了由于 VM 有时在 64 位主机上将对象大小或偏移量截断为 32 位而导致的错误。这些错误主要在使用大型 unicode 字符串和 nifs 环境时发现。
自有 ID:OTP-13606
添加
-start_epmd
命令行选项,这使您可以在启动分布式节点时禁用自动启动 epmd。添加
-epmd_module
命令行选项,这使您可以指定一个模块来注册和查找节点名称。默认模块是erl_epmd
。自有 ID:OTP-13627
erlang:halt
现在会截断长度超过 200 个字符的字符串,而不是失败并显示badarg
。自有 ID:OTP-13630
修复了 windows 上轮询器唤醒时可能出现的竞争
自有 ID:OTP-13634
Erts 7.3.1.6
改进和新功能
列表减法(
--
运算符)现在将在大型输入上正确产生结果。内部 ID:OTP-15371
Erts 7.3.1.5
已修复的错误和故障
修复了向终止端口发送时可能发生的小内存泄漏。
自有 ID: OTP-14609 辅助 ID: ERIERL-238
Erts 7.3.1.4
已修复的错误和故障
修复了预分配器中的性能错误,该错误可能导致它们永久回退到正常的、开销更大的内存分配。预分配器用于快速分配消息和其他计划任务使用的短生命周期元数据。该错误自 OTP_R15B02 以来就存在。
内部编号:OTP-14491
修复了当一个操作数是最低
N*W
位为零的大的负整数,而另一个操作数不大于N*W
位时,运算符bxor
导致错误结果的错误。N
是大于或等于 1 的整数,W
是 32 或 64,具体取决于字长。内部编号:OTP-14514
用于存储调度程序 ID 的定时器内部位域太小。结果,当系统上使用 1024 个调度程序时,VM 内部定时器数据结构可能会变得不一致。请注意,具有少于 1024 个调度程序的系统不受此错误的影响。
此错误是在 ERTS 7.0 版本(OTP 18.0)中引入的。
内部编号:OTP-14548 辅助编号:OTP-11997, ERL-468
修复了
binary_to_term
和binary_to_atom
中可能导致 VM 崩溃的错误。通常当 UTF8 字符串的最后一个字符在 128 到 255 的范围内,但被截断为只有一个字节时会发生。该错误在 ERTS 5.10.2 版本(OTP_R16B01)之后的binary_to_term
中存在,并且在 ERTS 9.0 版本(OTP-20.0)之后的binary_to_atom
中存在。内部编号:OTP-14590 辅助编号:ERL-474
Erts 7.3.1.3
已修复的错误和故障
修复了一个错误,如果 erlang 在 unix 平台上以 +B 启动,则在创建崩溃转储时会被 SIGUSR2 信号杀死。
自有 ID:OTP-13425 辅助 ID:ERL-94
在相应的端口无效时,从非调度程序线程调用
erl_drv_send_term()
或erl_drv_output_term()
会导致模拟器进入不一致状态,最终导致模拟器崩溃。自有 Id: OTP-13866
从非调度程序线程使用时,访问进程或端口的驱动程序和 NIF 操作可能会导致模拟器崩溃。这些操作是
erl_drv_send_term()
driver_send_term()
erl_drv_output_term()
driver_output_term()
enif_send()
enif_port_command()
自有 Id: OTP-13869
修复了由具有
compressed
选项的term_to_binary
创建的二进制文件的binary_to_term
中的错误。当 Erlang VM 链接到版本 1.2.9 或更高版本的zlib
库时,该错误可能会导致有效二进制文件出现badarg
异常。该错误自 OTP 17.0 以来就存在。自有 ID: OTP-14159 辅助 ID: ERL-340
Erts 7.3.1.2
已修复的错误和故障
修复了在
receive ... after
中超时进程可能导致丢失唤醒的竞争。此错误在 ERTS 版本 7.0 中引入。自有 ID: OTP-13798 辅助 ID: OTP-11997
修复了写入 erl 崩溃转储后的段错误。
自有 ID: OTP-13799
Erts 7.3.1.1
已修复的错误和故障
修复了当未找到键并且插入默认对象导致表增长时,
ets:update_counter/4
中的调度器死锁错误。自有 ID: OTP-13731 辅助 ID: ERL-188
Erts 7.3.1
已修复的错误和故障
process_info(Pid, last_calls)
对于Pid /= self()
不起作用。自有 Id: OTP-13418
确保在内存不足时创建崩溃转储。这在 erts-7.3 版本中意外删除。
自有 ID: OTP-13419
调度器可能会因 Linux 上过早的超时而唤醒。然而,这种过早的唤醒是无害的。
自有 Id: OTP-13420
如果端口在通信期间终止,则通过
erlang:port_*
BIF 之一与端口通信的进程可能会最终处于不一致的状态。发生这种情况时,即使消息队列中有匹配的消息,该进程也可能稍后在receive
中阻塞。此错误是在 erts 版本 5.10 (OTP R16A) 中引入的。
自有 Id: OTP-13424 辅助 Id: OTP-10336
进程结构的引用计数在极少数情况下可能会被错误地管理。发生这种情况时,会发生无效的内存访问。
自有 Id: OTP-13446
修复
process_flag(trap_exit,true)
和接收到的退出信号之间的竞争。即使
process_flag(trap_exit,true)
已返回,进程也可能由于退出信号而终止。需要process_flag/2
的调用和来自另一个调度器的退出信号之间非常精确的时间才能发生这种情况。自有 ID: OTP-13452
Erts 7.3
已修复的错误和故障
已经记录了 'erl' 的 '-path' 标志。此标志替换了启动脚本中指定的路径。它一直存在,但早期仅在 SASL (script) 中记录。
自有 Id: OTP-13060
call_time
跟踪功能在内部使用基于 OS 系统时间的时间来测量调用时间,如果 OS 系统时间在跟踪期间发生更改,则可能会导致错误的结果。此功能现在使用 Erlang 单调时间来测量时间。除了修复因使用 OS 系统时间而导致的错误结果外,结果通常也更好,因为 Erlang 单调时间通常具有更高的准确性和精度。
自有 Id: OTP-13216
修复 epmd 的 -delay_write 命令行开关的行为,该开关用于调试 - 在某些情况下,epmd 的睡眠时间是请求的两倍。
自有 Id: OTP-13220
修复超时和退出信号之间的竞争,这可能会导致进程忽略退出信号并继续执行。此错误自 OTP 18.0 起就存在。
自有 Id: OTP-13245
修复
erlang:halt/1,2
中针对大型退出状态值的错误,导致badarg
(在 32 位上)或退出并出现崩溃转储和/或核心转储(在 64 位上)。使erlang:halt/1,2
容忍任何非负整数作为退出状态,如果操作系统不支持,则截断高位。自有 Id: OTP-13251 辅助 Id: ERL-49
gen_tcp:accept/2
不是时间扭曲安全的。这是因为它在计算超时时使用了与erlang:now/0
返回的相同时间。现在已修复此问题。自有 Id: OTP-13254 辅助 Id: OTP-11997, OTP-13222
修复写入压缩文件时错误的错误处理。
自有 Id: OTP-13270
修复 FreeBSD 上大型文件的 sendfile 使用问题
自有 Id: OTP-13271
修复可能导致
process_info(P,current_location)
为 hipe 编译的模块崩溃模拟器的错误。自有 Id: OTP-13282 辅助 Id: ERL-79
内存不足错误已更改为导致退出而不是中止。
自有 Id: OTP-13292
从优先级高于操作进程优先级的进程调用
garbage_collect/[1,2]
或check_process_code/[2,3]
时,运行队列可能最终处于不一致的状态。此错误现已修复。自有 Id: OTP-13298 辅助 Id: OTP-11388
针对旧版本 gcc(低于 5)和 32 位 x86 上的内联汇编的问题的解决方法,当使用较新的 gcc 版本编译时,会导致模拟器崩溃。当构建 OTP 时运行的改进的
configure
测试现在可以检测是否应使用该解决方法。自有 Id: OTP-13326 辅助 Id: ERL-80
改进和新功能
引入了新的统计功能,以便更有效地检索有关可运行和活动进程和端口的信息。有关更多信息,请参阅
statistics(total_run_queue_lengths)
statistics(run_queue_lengths)
statistics(total_active_tasks)
statistics(active_tasks)
自有 Id: OTP-13201
时间扭曲安全改进。
为跟踪、顺序跟踪和系统配置文件功能引入了选项
monotonic_timestamp
和strict_monotonic_timestamp
。这是因为已经存在的timestamp
选项不是时间扭曲安全的。为
ets:info/2
和dets:info/2
引入了选项safe_fixed_monotonic_time
。这是因为已经存在的safe_fixed
选项不是时间扭曲安全的。自有 Id: OTP-13222 辅助 Id: OTP-11997
修复 epmd 中未检测到下行节点的注册竞争
自有 Id: OTP-13301
改进了 gcc 内联汇编,实现了 x86/x86_64 上的双字原子比较和交换,以便在使用 clang 编译时也可以使用。
自有 Id: OTP-13336
一个阻止调度程序线程查找在另一个调度程序线程上执行的进程信息的长时间等待的优化在 erts-5.10 (OTP R16A) 中无意中丢失了。此优化现在已重新引入。
自有 Id: OTP-13365 辅助 Id: OTP-9892
Erts 7.2.1.1
改进和新功能
引入了新的统计功能,以便更有效地检索有关可运行和活动进程和端口的信息。有关更多信息,请参阅
statistics(total_run_queue_lengths)
statistics(run_queue_lengths)
statistics(total_active_tasks)
statistics(active_tasks)
自有 Id: OTP-13201
Erts 7.2.1
已修复的错误和故障
恢复“修复模拟器路径的错误拆分”
自有 Id: OTP-13202
修复 FreeBSD 的 HiPE 启用模拟器。
自有 Id: OTP-13204 辅助 Id: pr926
Erts 7.2
已修复的错误和故障
小的文档修复
自有 Id: OTP-13017
修复了禁用分布,然后使用先前被远程节点使用的节点名称重新启用分布导致的内存损坏错误。
自有 Id: OTP-13076 辅助 Id: seq12959
将名称为 bool 的变量重命名,因为 Visual Studio 2015 现在将其视为关键字。
自有 Id: OTP-13079
erl_prim_loader
在多个版本中不支持自定义加载器。在erl_prim_loader
的文档中,所有对自定义加载器的引用现已删除。自有 Id: OTP-13102
修复了与未定义 __uint32_t 的 libc 版本一起编译 erts 的问题。
自有 Id: OTP-13105
erl -make 现在在失败时返回非零退出代码
自有 Id: OTP-13107
修复了嵌入模式下 init:restart 引起的崩溃,原因是 on_load 处理程序进程未重新启动,从而导致需要它存在的模块(如 crypto 和 asn1rt_nif)加载失败,以便正确加载 NIF。
自有 Id: OTP-13115
修复 erlang:binary_to_term/1 中的映射解码
如果外部格式不是由 beam 生成的,则在小 (FLAT) 映射中解码带有大 (HAMT) 映射的术语可能会导致严重错误。
自有 Id: OTP-13125
修复 GC 中非常罕见的错误,当来自远程节点的大型映射(具有大量哈希冲突)在内部消息队列中等待时会出现此错误。
自有 Id: OTP-13146
修复了可能导致崩溃转储几乎为空的错误。
自有 Id: OTP-13150
改进和新功能
更新了 xmllint 目标,仅检查具有真实文档内容的 xml 文件。
更正了一些错误,并在 DTD 中添加了一些缺少的 target。自有 Id: OTP-13026
添加函数 enif_getenv 以便从 NIF 中以可移植的方式读取 OS 环境变量。
自有 Id: OTP-13147
Erts 7.1
已修复的错误和故障
修复 ETS 中的错误,该错误可能导致由
safe_fixtable(_,false)
完成的清理偶尔会遗漏标记为删除的流浪对象。自有 Id: OTP-12870
修复了如果跟踪端口链接到进程,并且跟踪端口在处理跟踪消息时异常终止可能会发生的 VM 崩溃。此错误始终存在于支持 SMP 的运行时系统中。
自有 Id: OTP-12901
当系统进程终止时,虚拟机现在会创建崩溃转储,而不是中止。
自有 Id: OTP-12934
修复了当 erlang:process_flag(priority,...) 被也计划用于内部系统活动的进程调用时发生的罕见模拟器死锁。
自有 Id: OTP-12943
当使用大量文件描述符时,各种 posix 平台(Linux 和 Solaris 除外)上的运行时系统可能会崩溃。
自有 Id: OTP-12954
hipe 为不兼容的运行时系统编译的 beam 文件有时不会被加载器拒绝,这可能会导致虚拟机崩溃。此修复还将允许普通虚拟机和调试构建虚拟机使用相同的 hipe 编译器。
自有 Id: OTP-12962
修复
maps:merge/2
中由 hipe 编译的代码调用时可能导致虚拟机崩溃的错误。此错误自 erts-7.0 (OTP 18.0) 起就存在。自有 Id: OTP-12965
使用
process_dump
选项进行跟踪时,如果在跟踪进程的调用堆栈中的某个位置存在正在进行的二进制匹配,则虚拟机可能会中止。自有 Id: OTP-12968
修复了在 unix 上的非 smp 模拟器 shell 中按“CTRL-C”时 tty 驱动程序中可能出现的输出死锁。
自有 Id: OTP-12987 辅助 Id: Seq12947
修复
binary_to_integer
,使其为“+”和“-”抛出 badarg,类似于list_to_integer
。自有 Id: OTP-12988
在使用宏 enif_make_pid 时抑制未使用的参数的警告。
自有 Id: OTP-12989
改进和新功能
将 MacOS X 上用于 OS 系统时间的默认时钟源更改为
gettimeofday()
以提高性能。可以通过在配置构建时传递开关--with-clock-resolution=high
来在构建期间配置系统以使用先前使用的高分辨率时钟源。自身 ID:OTP-12945 辅助 ID:OTP-12892
添加了
configure
选项--disable-saved-compile-time
,该选项禁用在仿真器二进制文件中保存编译日期和时间。自身 ID:OTP-12971
Erts 7.0.3
修复的错误和故障
修复了在使用 tty 驱动程序(即不是 -oldshell)打印到 shell 时出现的二进制内存泄漏问题。
自身 ID:OTP-12941
修复了标准错误端口有时会因 eagain 原因而崩溃的错误。
自身 ID:OTP-12942
当使用
process_dump
选项进行跟踪时,如果被跟踪进程的调用堆栈中的某个位置存在正在进行的二进制匹配,则虚拟机可能会中止。自有 Id: OTP-12968
Erts 7.0.2
修复的错误和故障
在没有 SMP 支持的运行时系统中,进程可能最终处于不一致的半退出状态。如果进程被它也链接到的端口跟踪,并且端口在处理该进程的跟踪消息时异常终止,则可能会发生这种情况。
此错误始终存在于没有 SMP 支持的运行时系统中,但从未存在于具有 SMP 支持的运行时系统中。
自身 ID:OTP-12889 辅助 ID:seq12885
删除了在检索更正后的 Erlang 单调时间时不必要的数据复制。
自身 ID:OTP-12894
更改了在构建时选择的默认 OS 单调时钟源。这是为了提高性能。现在,在大多数系统上,行为将是在系统暂停时(OS 和 Erlang)单调时间都停止。
如果您希望在机器暂停期间单调时间流逝,您可以在构建 Erlang/OTP 时将命令行参数
--enable-prefer-elapsed-monotonic-time-during-suspend
传递给configure
。配置阶段将尝试查找此类时钟源,但可能无法找到。请注意,此类时钟源可能会产生性能损失。* 潜在的不兼容性 *
自身 ID:OTP-12895
erlang:system_info(end_time)
在 32 位架构上返回错误值。自身 ID:OTP-12896
改进和新功能
添加了
configure
命令行参数--enable-gettimeofday-as-os-system-time
,该参数强制使用gettimeofday()
获取 OS 系统时间。这将提高 MacOS X 上os:system_time()
和os:timestamp()
的性能,但会降低 Erlang 单调时间、Erlang 系统时间和 OS 系统时间的准确性、分辨率和精度。自身 ID:OTP-12892
Erts 7.0.1
修复的错误和故障
修复了在仿真器启动后不久发生的虚拟机罕见挂起问题。该错误自 R14 版本起就存在。
自身 ID:OTP-12859 辅助 ID:seq12882
Erts 7.0
修复的错误和故障
修复了在 Windows 上使用 erlang:open_port spawn_executable 时参数中出现空格和引号的问题。现在的行为模仿了 Unix 的工作方式。此更改意味着 spawn_executable 在 Windows 上的工作方式存在向后不兼容性。
* 潜在的不兼容性 *
自身 ID:OTP-11905
修复了 HIPE 编译的代码调用 BEAM 编译的函数时的全局调用跟踪。现在,无论调用者是谁,BEAM 函数的跟踪都应该始终有效。
自身 ID:OTP-11939
更正了 ETS
write_concurrency
锁的缓存对齐方式,以通过减少错误共享来提高性能。可能会增加具有write_concurrency
的表的内存占用。自身 ID:OTP-11974
fd/spawn 和终端驱动程序中所有可能阻塞的操作都已转换为非阻塞操作。在修复此问题之前,如果消耗 stdout/stderr 的实体消耗速度不够快,则虚拟机可能会被长时间阻塞。
自身 ID:OTP-12239
为从外部格式创建的堆外二进制文件添加了缺失的开销。此修复可以改进对来自
binary_to_term
或来自远程节点的消息的大型二进制文件的垃圾回收。自身 ID:OTP-12554
确保零的哈希值是一致的
Erlang 将正零和负零视为相等
true = 0.0 =:= 0.0/-1
但是,Erlang 的哈希函数:hash、phash 和 phash2 并未反映此行为。不同哈希函数产生的哈希值对于正零和负零并不相同。
此更改确保始终生成正零的哈希值,而与零浮点数的符号无关,即:
true = erlang:phash2(0.0) =:= erlang:phash2(0.0/-1)
自身 ID:OTP-12641
确保 NIF 术语创建不允许非法浮点值和过长的原子。当 NIF 返回时,此类值将导致 NIF 抛出 badarg 异常。
自身 ID:OTP-12655
修复了从 match_specs 构建 Map 结果的问题
一个错误的“box-value”被输入到堆中,如果它被写入堆片段,则可能会导致垃圾收集器中出现段错误。
自身 ID:OTP-12656
修复了匹配“可写”二进制文件时的 HIPE 错误。该错误有时会导致对正确的 utf8 字符的二进制匹配失败,但也可能出现其他症状。
自身 ID:OTP-12667
阻止脏调度器唤醒其他调度器。
自身 ID:OTP-12685
如果虚拟机由 clang/llvm 编译,则禁用浮点异常。这是 clang/llvm 中一个众所周知的长期存在的问题。
自身 ID:OTP-12717
修复了 FreeBSD 上
file:sendfile
导致未发送整个文件的错误。自身 ID:OTP-12720
修复了 erl_child_setup.c 中损坏的 Android 支持
自身 ID:OTP-12751
fix_alloc
分配器报告了错误的统计信息。自身 ID:OTP-12766
修复了两个 erts_snprintf() 调用以使用正确的大小。
- run_erl.c (ose):使用信号类型的大小,而不是其指针。 - erl_node_tables.c:使用 erts_snprintf() 中 _BUFFER 的大小来确保我们可以使用全部空间。
自身 ID:OTP-12771
延迟的内存分配可能会被不必要地延迟很长时间。
自身 ID:OTP-12812
确保以正确的顺序释放接受器池中的超时。
自身 ID:OTP-12817
修复了已删除模块的 module_info 中的段错误
自身 ID:OTP-12820
修复了代码清除中文字的垃圾收集
在代码清除和 check_process_code 期间,对于跟踪测试,省略了对嵌入在匹配二进制状态中的二进制引用的检查。这将导致二进制匹配状态引用已释放的内存。
自身 ID:OTP-12821
已更正 gen_tcp:close 的错误,因此当 {linger,{true,0}} 生效时,它不会等待驱动程序队列中的数据传输完毕才关闭端口。错误修复由 Rory Byrne 提供。
自身 ID:OTP-12840
驱动程序回调
start()
的文档错误地指出,返回值ERL_DRV_ERROR_ERRNO
导致错误值通过erl_errno
传递,而实际上应该是errno
。自身 ID:OTP-12855
改进和新功能
将
md5
和module
条目添加到?MODULE:module_info/0/1
,并删除过时的条目 'import'。* 潜在的不兼容性 *
自身 ID:OTP-11940
调试函数
erlang:display/1
显示二进制文件和位串的内容,而不仅仅是长度。自身 ID:OTP-11941
Erlang 的时间功能已得到扩展。这包括一个用于时间的新 API 以及 时间扭曲模式,该模式会在系统时间更改时更改系统的行为。强烈建议您使用新的 API,而不是基于
erlang:now/0
的旧 API。erlang:now/0
已被弃用,因为它现在并且永远都是一个可伸缩性瓶颈。有关更多信息,请参阅 ERTS 用户指南的时间和时间校正章节。除了 API 更改和时间扭曲模式之外,在运行时系统中,关于时间管理方面在内部进行了许多可伸缩性和性能改进。此类改进的示例包括:特定于调度程序的计时器轮、特定于调度程序的 BIF 计时器管理、以及在具有非错误原语的系统上并行检索单调时间和系统时间。
自身 ID:OTP-11997
如果
M:F/A
指的是 BIF,则erlang:function_exported(M, F, A)
现在将返回true
。* 潜在的不兼容性 *
自身 ID:OTP-12099
新的 BIF:
erlang:get_keys/0
,列出与进程字典关联的所有键。注意:erlang:get_keys/0
是自动导入的。* 潜在的不兼容性 *
自身 ID:OTP-12151 辅助 ID:seq12521
使大型消息的分布式发送产生收益,以提高实时特性。
自身 ID:OTP-12232
使用高精度轮询超时
在可用的情况下,使用可以处理小于 1 毫秒的时间分辨率的 poll/select API。在没有此类 API 的情况下,超时将向上舍入到最接近的毫秒。
自身 ID:OTP-12236
内部组到 user_drv 协议已更改为同步,以确保在回复之前打印发送到实现 user_drv 协议的进程的输出。此协议由 standard_output 设备和充当客户端的 ssh 应用程序使用。
此更改将以前打印到 standard_io 和其他最终进入 user_drv 的设备的无限缓冲区更改为 1KB。
* 潜在的不兼容性 *
自有 ID: OTP-12240
先前引入的“急切检查 I/O”功能现在默认启用。
可以使用
erl
命令行参数禁用急切检查 I/O:+secio false
与之前默认值相比的特性影响
- 降低延迟并更平滑地管理外部触发的 I/O 操作。
- 外部触发的 I/O 操作的优先级略有降低。
自有 ID: OTP-12254 辅助 ID: OTP-12117
正确支持 match_specs 中的映射
自有 ID: OTP-12270
崩溃转储已写入的通知已移至在生成崩溃转储之前打印,而不是之后打印。通知的措辞也已更改。
* 潜在的不兼容性 *
自有 ID: OTP-12292
新函数
ets:take/2
。其工作方式与ets:delete/2
相同,但也会返回已删除的对象。自有 ID: OTP-12309
已在 Linux 上启用带有 cpu_timestamp 选项的跟踪。
自有 ID: OTP-12366
ets:info/1,2 现在包含有关是否启用 write_concurrency 或 read_concurrency 的信息。
自有 ID: OTP-12376
改进了对
gcc
的内置函数进行原子内存访问的用法。当没有其他可用的原子内存操作实现时,会使用这些内置函数。例如,在为 ARM 编译时,当libatomic_ops
不可用时。当使用支持
__atomic_*
内置函数的gcc
(至少使用 4.7 版本的gcc
)进行编译时,会看到最大的改进,但即使只有传统的__sync_*
内置函数可用(至少使用 4.1 版本的gcc
),也可以看到改进。有关详细信息,请参阅
$ERL_TOP/HOWTO/INSTALL.md
的“原子内存操作和虚拟机”部分。自有 ID: OTP-12383
向 math 模块引入
math:log2/1
函数。自有 ID: OTP-12411
抽象格式的文档(在 ERTS 用户指南中)已更新,包含类型和规范。(感谢 Anthony Ramine。)
已删除抽象格式类型中使用的括号的显式表示。相反,可以使用新函数
erl_parse:type_inop_prec()
和erl_parse:type_preop_prec()
在需要的地方插入括号。自有 ID: OTP-12492
删除 perfctr 支持
Linux 内核中 perfctr 的开发于 2010 年停止。因此,Erlang VM 中的 perfctr 支持代码实际上是死代码,因此已删除。
自有 ID: OTP-12508
已添加
zlib:inflateChunk/2
。它的工作方式类似于zlib:inflate/2
,但解压缩的数据不会超过zlib:setBufSize/2
配置的缓冲区所能容纳的数据。自有 ID: OTP-12548
对小型 select_val 数组使用线性搜索
自有 ID: OTP-12555
新的 BIF ets:update_counter/4,带有一个默认对象作为参数,如果未找到键,该对象将插入到表中。
自有 ID: OTP-12563
从 zlib 模块导出缺失的类型
自有 ID: OTP-12584
对大型映射使用持久哈希映射
当映射中的键值对数量足够大时,映射将使用持久哈希映射实现。当映射大小达到 33 对时会发生更改,但此限制将来可能会更改。
此更改对用户最显著的影响是速度,其次是内存消耗和映射的自省。内存消耗大小是概率性的,但小于
gb_trees
或dict
。除了以下更改外,任何其他影响对于用户都是透明的。与 OTP 17 中的实验性实现相比,映射的语义以两种不兼容的方式发生了更改
- 通过
erlang:phash2/1,2
、erlang:phash/1
和erlang:hash/2
对映射进行不同的哈希处理。 - 如果键包含浮点数,则使用 ==、/=、=<、<、>= 和 > 比较两个映射的方式不同。
* 潜在的不兼容性 *
自有 ID: OTP-12585
- 通过
改进了
erlang:make_ref/0
的可伸缩性,以及其他创建引用的功能。现在,每个调度程序都管理自己的引用集。这样,创建引用时根本不需要通信。之前的实现生成了一个严格单调递增的引用序列,该序列对应于运行时系统实例上的创建时间。当前实现不是这种情况。您只能期望引用是唯一的。Erlang/OTP 文档从未提及过除唯一性属性以外的任何其他属性,因此此更改完全兼容。我们将其标记为潜在不兼容性的唯一原因是,Erlang 规范的早期草案提到了严格单调性作为属性。
如果您需要创建具有严格单调性属性的数据,请使用 [erlang:uniqueinteger([monotonic])](
erlang:unique_integer/1
)。_请勿使用已弃用的 erlang:now()。* 潜在的不兼容性 *
自有 ID: OTP-12610
启用来自 heart 的不同中止信号
通过使用环境变量 HEART_KILL_SIGNAL,heart 现在可以使用不同的信号来终止旧的正在运行的 Erlang。
默认情况下,信号是 SIGKILL,但也可以通过设置环境变量来使用 SIGABRT:HEART_KILL_SIGNAL=SIGABRT
自有 ID: OTP-12613 辅助 ID: seq12826
将 autconf 更新到最新版本 2015-03-04
自有 ID: OTP-12646
优化 VM 内部的计时器。这包括进程计时器(
receive ... after
)、端口计时器(driver_set_timer()
)以及 BIF 计时器(erlang:send_after()
/erlang:start_timer()
)。现在,每个调度程序线程都有自己的无锁计时器服务,而不是一个锁定的中央服务。这大大提高了具有大量调度程序和计时器的系统上计时器管理的性能。
计时器服务内部数据结构也经过优化,能够比以前处理更多的计时器。也就是说,每个计时器服务本身都能够处理更多的计时器,而不会像旧的集中式计时器服务那样导致严重的性能损失。
BIF 计时器的 API 也已扩展。例如,超时值不再限于 32 位整数。有关详细信息,请参阅
erlang:start_timer/4
、erlang:send_after/4
、erlang:cancel_timer/2
和erlang:read_timer/2
的文档。特性影响:对
erlang:cancel_timer()
和erlang:read_timer()
的同步版本的调用可能需要比以前更长的时间才能完成。当访问的计时器由远程调度程序管理时,会发生这种情况。您通常希望使用新的异步选项,以避免阻塞调用进程。自有 ID: OTP-12650 辅助 ID: OTP-11997
从常见汇编程序模式中专门化指令
专门化 beam 加载程序中
rem
、band
、minus
和plus
的常见指令。这将减少获取次数,从而减轻运行时期间的指令调度压力,并在某些常见情况下加快这些操作。使用新的
move_window
指令专门化从 x 寄存器到堆栈的移动模式。此更改将减少指令调度压力。自有 ID: OTP-12690
修复 Android 的交叉编译。
自有 ID: OTP-12693
修复了不正确使用 autoconf 宏 AC_EGREP_CPP 的问题,如果从包含字符串“yes”的路径运行,可能会导致错误的配置。
自有 ID: OTP-12706
最低 Java 版本现在是 1.6
自有 ID: OTP-12715
在进程退出时将格式和参数发送到 error_logger
以前,模拟器会生成一个包含值的完整字符串,并调用 error_logger 传递
"~s~n"
。此更改将其更改为包含~p
的格式字符串,并将相应的值作为参数。自有 ID: OTP-12735
默认情况下,将错误记录器警告映射到警告消息。
自有 ID: OTP-12755
将 ppc64le 架构配置为 ppc64
自有 ID: OTP-12761
添加函数
enif_raise_exception
,允许 NIF 引发任何类型的错误异常。自有 ID: OTP-12770
优化了节点表统计信息检索。
自有 ID: OTP-12777
默认情况下,将映射 beam 错误记录器警告映射到警告消息。以前,这些消息默认映射到错误通道。
自有 ID: OTP-12781
gen_tcp:shutdown/2 现在是异步的
这解决了旧实现中的以下问题
当 TCP 对等方处于空闲或缓慢状态时,它不会阻塞。这是调用 shutdown() 时的预期行为:调用者需要能够继续从套接字读取,而不是被阻止这样做。
它不会截断输出。如果 TCP 对等方处于空闲或缓慢状态,则当前版本的 gen_tcp:shutdown/2 会在约 10 秒后截断驱动程序队列中的任何出站数据。更糟糕的是,它甚至不会通知任何人数据已被截断:将 'ok' 返回给调用者;并且将 FIN 而不是 RST 发送到 TCP 对等方。
* 潜在的不兼容性 *
自有 ID: OTP-12797
引入了延迟节点表 GC。这是为了避免表中的条目进出振荡。振荡会导致表锁上不必要的锁争用。可以通过传递
+zdntgc
命令行参数来设置延迟长度。特性影响:如果节点从其他节点获得大量短暂连接,则表可能会增长到非常大的大小,并包含未使用的条目。可以使用
+zdntgc
命令行参数缩短延迟长度来缓解此问题。自有 ID: OTP-12802
改进了
erlang:statistics
(io)
的实现,以减少调度程序之间的争用。特性影响:对
erlang:statistics(io)
的实际调用需要更长的时间才能完成,但对系统的整体影响得到了改善。自有 ID: OTP-12842
在许多情况下,用户代码需要能够区分套接字是正常关闭还是中止。设置选项 {show_econnreset, true} 允许用户在主动和被动套接字上都接收 ECONNRESET 错误。
自有 ID: OTP-12843
不要预分配过大的事件池
默认池大小为 4000 对于常见情况来说太大了。这直接对应于系统中的线程数。将 ERTS_TS_EV_ALLOC_DEFAULT_POOL_SIZE 更改为 2048。将 ERTS_TS_EV_ALLOC_POOL_SIZE 更改为 32。
自有 ID: OTP-12849
Erts 6.4.1.7
已修复的错误和故障
如果端口在通信期间终止,则通过
erlang:port_*
BIF 之一与端口通信的进程可能会最终处于不一致的状态。发生这种情况时,即使消息队列中有匹配的消息,该进程也可能稍后在receive
中阻塞。此错误是在 erts 版本 5.10 (OTP R16A) 中引入的。
自有 Id: OTP-13424 辅助 Id: OTP-10336
在相应的端口无效时,从非调度程序线程调用
erl_drv_send_term()
或erl_drv_output_term()
会导致模拟器进入不一致状态,最终导致模拟器崩溃。自有 Id: OTP-13866
从非调度程序线程使用时,访问进程或端口的驱动程序和 NIF 操作可能会导致模拟器崩溃。这些操作是
erl_drv_send_term()
driver_send_term()
erl_drv_output_term()
driver_output_term()
enif_send()
enif_port_command()
自有 Id: OTP-13869
修复了由具有
compressed
选项的term_to_binary
创建的二进制文件的binary_to_term
中的错误。当 Erlang VM 链接到版本 1.2.9 或更高版本的zlib
库时,该错误可能会导致有效二进制文件出现badarg
异常。该错误自 OTP 17.0 以来就存在。自有 ID: OTP-14159 辅助 ID: ERL-340
修复了当一个操作数是最低
N*W
位为零的大的负整数,而另一个操作数不大于N*W
位时,运算符bxor
导致错误结果的错误。N
是大于或等于 1 的整数,W
是 32 或 64,具体取决于字长。内部编号:OTP-14514
修复了
binary_to_term
和binary_to_atom
中可能导致 VM 崩溃的错误。通常当 UTF8 字符串的最后一个字符在 128 到 255 的范围内,但被截断为只有一个字节时会发生。该错误在 ERTS 5.10.2 版本(OTP_R16B01)之后的binary_to_term
中存在,并且在 ERTS 9.0 版本(OTP-20.0)之后的binary_to_atom
中存在。内部编号:OTP-14590 辅助编号:ERL-474
Erts 6.4.1.6
已修复的错误和故障
从优先级高于操作进程优先级的进程调用
garbage_collect/[1,2]
或check_process_code/[2,3]
时,运行队列可能最终处于不一致的状态。此错误现已修复。自有 Id: OTP-13298 辅助 Id: OTP-11388
Erts 6.4.1.5
已修复的错误和故障
修复了可能导致崩溃转储几乎为空的错误。
自有 Id: OTP-13150
Erts 6.4.1.4
已修复的错误和故障
“raw”套接字选项不能在对任何 gen_tcp 函数的一次调用中多次使用,因为只使用了一次出现。此错误已修复,并且还修复了关于从 inet:setopts/2 中传播错误代码的小错误。
自有 ID: OTP-11482 辅助 ID: seq12872
Erts 6.4.1
已修复的错误和故障
Common Test 中的 VTS 模式已修改为使用 Webtool 应用程序 (ct_webtool) 的私有版本。
自有 ID: OTP-12704 辅助 ID: OTP-10922
Erts 6.4
已修复的错误和故障
修复
LM_FIND_EMU_CC
autoconf
宏中缺少引号的问题,这可能导致构建失败。自有 ID: OTP-12388
修复崩溃转储文件中错误的监视器打印输出。
自有 ID: OTP-12537
如果被访问的端口在调用 BIF 期间死亡,则不支持 SMP 的运行时系统可能会在 BIF
port_control/3
中崩溃。自有 ID: OTP-12544 辅助 ID: Seq12777
避免从二进制匹配创建损坏的超大整数。相反,抛出 system_limit 异常,这是正确的行为。此错误的一个特殊症状是,对此类超大整数进行按位运算(band、bor、bxor)可能会返回空列表 []。致谢:Mikael Pettersson, Nico Kruber
自有 ID: OTP-12556
修复了调用
port_info/1
时可能导致内存错误的竞争条件。自有 ID: OTP-12587
修复了精确术语的比较。修复了可能导致错误比较的溢出。精确术语的比较专门在 Maps 中使用。
自有 ID: OTP-12623
修复了
list_to_integer/1
中对于可能导致 VM 崩溃的非常长的列表的错误。自有 ID: OTP-12624
改进和新功能
引入了用于原子内存操作的运行时系统内部 64 位 API。
自有 ID: OTP-12351
为进程字典的初始大小添加命令行参数选项。
使用 '+hpds <size>' 来设置生成进程的初始进程字典大小。
自有 ID: OTP-12535 辅助 ID: seq12809
修复了关于 Unicode 的 $char 的文档
自有 ID: OTP-12545
Erts 6.3.1
已修复的错误和故障
修复 getifaddrs realloc 指针错误
当缓冲区耗尽并随后重新分配时,我们可能会得到指向错误内存的不安全指针。
要发生这种情况,我们需要有大量的接口,并将内存重新分配到较低的地址。
症状是从 erlang:port_control(Port, 25, []) (prim_inet:getifaddrs(Port) 导致 badarg) 返回垃圾或分段错误。
自有 ID: OTP-12445
不要在 child_setup 中关闭所有文件描述符两次
提交 c2b4eab25c907f453a394d382c04cd04e6c06b49 引入了一个错误,其中 child_setup 错误地尝试关闭所有文件描述符两次。
如果可用,则在关闭所有文件描述符时使用 closefrom()。
函数 closefrom() 之前仅在 vfork() 情况下使用,但现在如果可用,也用于 fork() 情况下。
自有 ID: OTP-12446
在崩溃转储期间,所有文件描述符都会关闭,以确保 epmd 端口关闭并为崩溃转储文件保留文件描述符。
如果驱动程序(第三方库)无法处理套接字的关闭,则可能会导致分段错误,在这种情况下,将不会生成崩溃转储。现在通过仅通过驱动程序的紧急关闭回调来关闭 inets 套接字来修复此问题,从而关闭 epmd 套接字。
自有 ID: OTP-12447
Erts 6.3
已修复的错误和故障
修复 OS X 64 位上的 HiPE 调试锁检查
位置无关代码在 OS X 上是强制性的。我们使用 r11 作为中间寄存器来填充 BIF_P->hipe.bif_callee。这修复了执行 `make debug FLAVOR=smp` 时出现的以下错误
clang -cc1as: fatal error: error in backend: 32-bit absolute addressing is not supported in 64-bit mode
自有 ID: OTP-12188
修复了如果端口被并发进程关闭,则可能导致
erlang:port_get_data/1
中 VM 崩溃的竞争错误。如果使用非立即数据项调用port_set_data/2
,则还会修复致命错误。这两个错误自 R16B01 起就存在。自有 ID: OTP-12208
当 erl_xcomp_sysroot 以斜杠结尾时,更正 make 变量 SSL_DED_LD_RUNTIME_LIBRARY_PATH。
自有 ID: OTP-12216 辅助 ID: seq12700
修复了由错误使用赋值运算符引起的两种无法访问的代码的情况。
自有 ID: OTP-12222
修复了 hipe 编译的代码对禁用 GC 的同时捕获异常的 BIF(例如 binary_to_list、list_to_binary、binary_to_term、term_to_binary)进行尾调用时的错误。
自有 ID: OTP-12231
修复了在创建它的线程应该销毁之前重用已迁移的空内存载体的错误。
自有 ID: OTP-12249
通过为 17.3 添加到 ErlNifEntry 的新选项字段添加初始化器,防止在编译器指示将丢失的字段初始化器视为错误时在 NIF 中发生编译时错误。
自有 ID: OTP-12266
修复了在 FreeBSD 系统上使用新的 C 编译器(包括但不限于 gcc 4.9 和 clang)编译 Erlang/OTP 时的 CPU 拓扑检测。
自有 ID: OTP-12267
在非 GCC 编译器上可用时,使用 C99 函数 isfinite() 而不是 finite()。
自有 ID: OTP-12268
修复了 Windows 上对目录执行 file:read_file_info 时可能返回不正确链接数的错误。
自有 ID: OTP-12269
修复了在以 +Meamin 启动的 VM 上清除模块时发生的罕见错误。
自有 ID: OTP-12273
修复了从 to_erl 发送的 run_erl 终端窗口大小调整。这在 OTP 17.0 中被破坏,这可能导致 to_erl shell 中的奇怪光标行为。
自有 ID: OTP-12275 辅助 ID: seq12739
修复了 Windows 上当给定一个要使用的 fd 时 gen_tcp/udp 返回错误的错误。
自有 ID: OTP-12289
修复了各种内部 erts 问题,其中在 C 中否定有符号整数会触发未定义的行为。这修复了使用 bignums 和 list_to_integer 进行除法时出现的问题。
自有 ID: OTP-12290
在 Windows 上将输出刷新到 stdout 时,模拟器有时可能会无限期地挂起,等待刷新完成。此问题已修复。
自有 ID: OTP-12291
修复了具有脏调度程序支持的非 smp 模拟器在调用 erlang:system_info(system_version) 时显示正确数量的脏调度程序的问题。
自有 ID: OTP-12295
将
nif_version
添加到erlang:system_info/1
中,以便以类似于driver_version
的方式获取运行时系统的 NIF API 版本。自有 ID: OTP-12298
修复了可能导致将零元数的脏 NIF 的返回值视为垃圾,从而导致 VM 崩溃的错误。
自有 ID: OTP-12300
改进了分配载体迁移搜索逻辑。这将降低导致内存过度消耗的迁移失败的风险。由于减少了迁移池上的内存争用,它还将提高 smp 性能。
自有 ID: OTP-12323
改进和新功能
引入了对急切检查 I/O 的支持。
默认情况下,急切检查 I/O 将被禁用,但这很可能会在 OTP 18 中更改。启用急切检查 I/O 后,调度程序将更频繁地检查 I/O 工作。但是,未完成的 I/O 操作的优先级不会像禁用急切检查 I/O 时那么高。
可以使用
erl
命令行参数启用急切检查 I/O:+secio true
启用时的特性影响
- 降低延迟并更平滑地管理外部触发的 I/O 操作。
- 外部触发的 I/O 操作的优先级略有降低。
自有 ID: OTP-12117
修复 erts .app 文件
自有 ID: OTP-12189
添加配置选项 --with-ssl-incl=PATH,以支持头文件和库位于不同位置的 OpenSSL 安装。
自有 ID: OTP-12215 辅助 ID: seq12700
当使用 OTP 中包含的实现时,优化了 32 位 PowerPC 上具有发布屏障语义的原子内存操作。
自有 ID: OTP-12250
对调度程序激活代码进行小的调整,确保调度程序的激活不会因其运行队列非空而阻止。(感谢 Songlu Cai)
自有 ID: OTP-12287
改进了对 libatomic_ops 库提供的原子内存操作的支持。最重要的是,当
libatomic_ops
实现本地双字原子操作时(例如,为 ARM 实现),支持使用本地双字原子操作。现在,
$ERL_TOP/HOWTO/INSTALL.md
文档也更清楚地描述了何时需要与libatomic_ops
安装一起构建。内部 Id: OTP-12302
添加配置选项 --with-ssl-rpath,以控制用于动态链接 OpenSSL 的运行时库路径。
内部 Id: OTP-12316 辅助 Id: seq12753
为 epmd 添加了 systemd 通知支持
内部 Id: OTP-12321
Erts 6.2.1
已修复的错误和故障
修复了当迁移的空内存载体在其创建线程销毁它之前被重用时的错误。
自有 ID: OTP-12249
修复了从 to_erl 发送的 run_erl 终端窗口大小调整。这在 OTP 17.0 中被破坏,这可能导致 to_erl shell 中的奇怪光标行为。
自有 ID: OTP-12275 辅助 ID: seq12739
Erts 6.2
已修复的错误和故障
常规文档更新。
内部 Id: OTP-12052
在虚拟机代码中,实现向端口发送信号时,一个错误可能导致接收端口队列永久处于繁忙状态。当达到此状态时,向端口发送命令信号的进程要么永久挂起,要么如果使用
nosuspend
功能,则始终无法发送到端口。此错误是在 ERTS 版本 5.10 中引入的。为了在端口上触发此错误,必须至少一次在向端口传递信号时使用
nosuspend
功能。通过调用erlang:send(Port, {PortOwner, {command, Data}}, [nosuspend | Options])
,erlang:send_nosuspend(Port, {PortOwner, {command, Data}})
, 或者erlang:send_nosuspend(Port, {PortOwner, {command, Data}}, Options)
.
感谢 Vasily Demidenok 报告此问题,并感谢 Sergey Kudryashov 提供测试用例。
内部 Id: OTP-12082 辅助 Id: OTP-10336
修复了内存分配时的尺寸溢出错误。一个具有接近整个地址空间的巨大尺寸的内存分配调用,可能会成功返回,好像只分配了几个字节。(感谢 Don A. Bailey 的报告)
内部 Id: OTP-12091
修复了否定有符号整数会触发未定义行为的各种问题。这修复了 enif_make_int64 接口和 Erlang 运行时系统内部的一些边缘情况。
内部 Id: OTP-12097
文档错误地将
+swct
命令行参数列在+sws
下。内部 Id: OTP-12102 辅助 Id: OTP-10994
当使用
erlang:system_profile/2
在runnable_procs
和/或runnable_ports
上进行性能分析时,性能分析消息可能会乱序传递。此错误是在 ERTS 版本 5.10 中引入的。内部 Id: OTP-12105 辅助 Id: OTP-10336
各种日志记录修复,包括:在崩溃转储中添加运行队列索引到进程转储。
在崩溃时将线程索引添加到 enomem 口号中。
删除向同一节点的旧实例发送消息的错误记录器消息。内部 Id: OTP-12115
修复 LLVM 报告的编译器警告
内部 Id: OTP-12138
通过
list_to_integer/1
和binary_to_integer/1
正确转换MIN_SMALL
。此错误会产生一个未标准化的 bignum,这可能会导致奇怪的行为,例如与正确的MIN_SMALL
整数比较不同。值MIN_SMALL
在 32 位 VM 上是-(1 bsl 27) = -134217728
,在 64 位 VM 上是-(1 bsl 59) = -576460752303423488
。(感谢 Jesper Louis Andersen、Mikael Pettersson 和 Anthony Ramine 的报告、补丁和优化建议)内部 Id: OTP-12140
修复了
term_to_binary
中以不一致的大小信息重新分配二进制文件的错误。尚未证实该错误是导致任何错误行为的原因。内部 Id: OTP-12141
当加载存档文件时使用的 Real_path 方法没有考虑到 Windows 目录符号链接可能跨越不同的驱动器。
内部 Id: OTP-12155
改进和新功能
为锁等待时间向 lcnt 添加 log2 直方图
内部 Id: OTP-12059
将
enif_schedule_nif()
引入 NIF API。enif_schedule_nif()
函数允许将长时间运行的 NIF 分解为单独的 NIF 调用,而无需 Erlang 中编写的包装器函数。NIF 首先执行长时间运行任务的一部分,然后调用enif_schedule_nif()
来调度 NIF 以供稍后执行,以继续该任务。可以以这种方式一个接一个地调度任意数量的 NIF。由于模拟器在调用之间重新获得控制权,这有助于避免本机代码长时间占用调度器线程而导致的问题。enif_schedule_nif()
函数还替换了实验性脏 NIF API 中的enif_schedule_dirty_nif()
。请注意,所做的唯一不兼容更改是在实验性脏 NIF API 中。有关更多信息,请参阅 NIF 文档。
感谢 Steve Vinoski。
* 潜在的不兼容性 *
内部 Id: OTP-12128
Erts 6.1.2
已修复的错误和故障
OTP-11850 修复了 filelib:wildcard/1 以使其与损坏的符号链接一起工作。但是,此更正引入了问题,因为符号链接不再被 filelib:ensure_dir/1、filelib:is_dir/1、filelib:file_size/1 等函数跟随。现在已对此进行更正。
内部 Id: OTP-12054 辅助 Id: seq12660
Erts 6.1.1
已修复的错误和故障
修复了 ETHR_FORCE_INLINE,它导致在某些没有足够线程支持的平台(VxWorks)上构建中断。
内部 Id: OTP-12010
Erts 6.1
已修复的错误和故障
现在,
spawn_opt/5
的文档中有一个注释,提到不支持monitor
选项。内部 Id: OTP-11849
修复了非 smp VM 的
large_heap
损坏的系统监控。在非 smp VM 上从未发送过large_heap
的消息。此错误自 R16B 就已存在。内部 Id: OTP-11852
当向没有足够堆空间来存放该消息的进程传递消息时,不支持 SMP 的模拟器会崩溃。此错误是在
erts-6.0
中引入的。内部 Id: OTP-11887 辅助 Id: OTP-11388
修复了 ETS 表删除和取消固定之间的竞争,这可能会导致 VM 崩溃。该竞争可能会发生在不拥有该表但对其进行了固定的终止进程与同时删除该表的另一个进程(可能是所有者终止)之间。此错误自 R15B02 就已存在。
内部 Id: OTP-11892
当调用
erl
时,-eval
选项后面的字符串不会从 UTF-8 正确转换为 Unicode 字符列表(就像-run
的参数一样)。当在路径名包含以 UTF-8 编码的非美国 ASCII 字符的目录中构建时,该错误将导致 Erlang/OTP 的构建失败。(感谢 Eric Pailleau 报告此错误。)
内部 Id: OTP-11916
修复 erts_debug:size/1 以处理 Map 大小
内部 Id: OTP-11923
移除了
erlang:bitstr_to_list/1
和erlang:list_to_bitstr/1
。它们是错误添加的,并且在调用时始终引发undefined
异常。内部 Id: OTP-11942
修复了在 Windows 上使用 mingw-w64 进行编译的问题。
感谢 Jani Hakala。
内部 Id: OTP-11945
当从标记的 git 版本构建 erlang 时,git sha 不再打印在 shell 启动头中。
内部 Id: OTP-11961
修复了当向已注册的进程发送时,
send
跟踪事件被错误地丢弃的错误。此错误是在 R16B 中引入的。内部 Id: OTP-11968
改进和新功能
以下本机函数现在会在减少时增加适当的减少量并让出 CPU 时间
erlang:binary_to_list/1
erlang:binary_to_list/3
erlang:bitstring_to_list/1
erlang:list_to_binary/1
erlang:iolist_to_binary/1
erlang:list_to_bitstring/1
binary:list_to_bin/1
特性影响
性能 - 从列表转换的函数对于非常小的列表的性能有所损失,而对于非常大的列表的性能有所提高。
优先级 - 以前,执行这些函数之一的进程实际上获得了不公平的优先级提升。此优先级提升取决于输入大小。输入越大,优先级提升就越大。这种不公平的优先级提升现在已经消失。
内部 Id: OTP-11888
默认情况下,epmd 的 systemd 功能已从 epmd 中删除。要启用它们,您必须使用配置选项 --enable-systemd 构建 erlang。
内部 Id: OTP-11921
移除了调用
binary_to_term/1
和binary_to_term/2
时使用的 Erlang 包装代码。这提高了这些 BIF 的性能,尤其是在使用小二进制数据作为输入调用它们时。自身 ID:OTP-11931
添加 erlang:system_info(tolerant_timeofday) API,用于检查是否启用了对系统时间突变进行补偿的功能。
自身 ID:OTP-11970
Erts 6.0.1
修复的错误和故障
修复了非 smp VM 的
large_heap
损坏的系统监控。在非 smp VM 上从未发送过large_heap
的消息。此错误自 R16B 就已存在。内部 Id: OTP-11852
修复了
erlang:system_info/1
的类型规范。自身 ID:OTP-11859 辅助 ID:OTP-11615
Erts 6.0
修复的错误和故障
选项 dupnames 在 re 模块中未能按预期工作。当使用 {capture, [Name, ...]} 查找名称时,re:run 返回该名称匹配的随机实例,而不是文档中声明的最左侧匹配实例。现在已更正此问题,以符合文档。还添加了选项 {capture,all_names} 以及 re:inspect/2 函数,以进一步帮助使用命名子模式。
自身 ID:OTP-11205
允许加载带有 Unicode 路径名称的 NIF 库
自身 ID:OTP-11408
允许加载带有 Unicode 路径名称的驱动程序
自身 ID:OTP-11549
修复了一个错误,该错误导致在没有在 fd 0 上打开 stdin 的情况下启动 Erlang 时,有时会在终止时导致模拟器死锁。
自身 ID:OTP-11558
epmd 中的选项 '-names' 现在可以在 Windows 上运行(感谢 Johannes Weißl)。
自身 ID:OTP-11565
更正了 escript 文档中的示例。(感谢 Pierre Fenoll)。
自身 ID:OTP-11577
修复 bs_get_integer 指令
指令 bs_get_integer 可能会在失败的情况下不必要地触发垃圾回收,这是不希望的或完全危险的。
例如
<<X:Sz,_/bits>> = <<"some binary">>
之前,如果 Sz 将 X 转换为大数,它会在检查大小是否实际匹配之前通过垃圾回收在堆上保留此内存大小。
现在它会在触发回收之前检查二进制大小。
自身 ID:OTP-11581
在 64 位模拟器上,删除
binary_to_term
(和远程消息接收)中区间 [-2147483648,-1] 和 [256,2147483647] 中的整数的堆空间高估。自身 ID:OTP-11585
添加对从 ncurses 检测单独的 tinfo 库的支持(感谢 Dirkjan Ochtman)
自身 ID:OTP-11590
system_flag(cpu_topology) 的弃用警告已扩展为在 OTP 18 中删除(感谢 Steve Vinoski 的更新)
自身 ID:OTP-11602
改进了关于 +spp 标志的一些笨拙措辞的文档。(感谢 Brian L. Troutwine)
自身 ID:OTP-11607
修复了如果套接字处于被动模式,sendfile 会为远程关闭的套接字返回错误代码的错误。(感谢 Vincent Siliakus 报告此错误。)
自身 ID:OTP-11614
提高垃圾回收的保有率
垃圾收集器会尝试在次要垃圾回收期间保持之前的堆块大小,即在确定新堆的大小时不使用 'need',而是依靠保有率和垃圾来足够大。
在堆上独占实时数据并且保有率延迟的密集增长期间,由于新堆已满,次要垃圾回收后会立即触发完全回收,为 'need' 腾出空间。
为了解决这个问题,次要堆上术语的保有率将始终发生(如果它低于高水位线),而不是每隔一次次要垃圾回收。
特性影响:减少了垃圾回收中花费的 CPU 时间,但可能会导致从堆中收集垃圾的延迟。如果需要,可以调整“fullsweep_after”选项以增加垃圾回收压力。
自身 ID:OTP-11617
修复了在比较大于 2^992 的浮点数时出现的错误。该错误可能会在 32 位模拟器上导致内存损坏。
自身 ID:OTP-11618
针对 TileraMDE-3.0.1.125620 的交叉编译修复
自身 ID:OTP-11635
sendfile 默认不再使用异步线程
这样做是因为如果使用异步线程池,可能会发生慢速客户端攻击。场景如下
客户端请求一个文件,然后一次接收一个字节地缓慢接收该文件。这将最终用阻塞的 sendfile 操作填充异步线程池,从而使虚拟机的所有文件操作都匮乏。
如果您仍然想对 sendfile 使用异步线程池,则引入了一个启用它的选项。
感谢 Christopher Faulet 识别出此漏洞。
* 潜在的不兼容性 *
自身 ID:OTP-11639
当 NIF 库的加载/升级回调返回失败时,正确回滚对
enif_open_resource_type
的调用。自身 ID:OTP-11722
在使用
$ERL_TOP/configure
配置时,将默认配置更改为与使用$ERL_TOP/otp_build configure
配置时相同。之前,当使用
$ERL_TOP/configure
配置时,如果启用了 HiPE,默认情况下会在 Linux 上启用浮点异常,而当使用$ERL_TOP/otp_build configure
配置时则不会启用。现在的默认设置是在这两种情况下都不使用浮点异常,因为 Linux 上的浮点异常仍然存在未解决的问题。有关更多信息,请参阅
$ERL_TOP/HOWTO/INSTALL.md
。* 潜在的不兼容性 *
自身 ID:OTP-11723
erl_db_tree.c 中的注释不再与代码不同。(感谢 Cobus Carstens)
自身 ID:OTP-11793
修复 VxWorks 的 epmd 调试功能(感谢 Jay True)
自身 ID:OTP-11808
在 child_setup 中可用时使用 closefrom/2(感谢 Rick Reed 和 Anthony Ramine)
自身 ID:OTP-11809
修复了 dtrace/systemtap 错误,该错误会导致由于错误的长度计算而连接探针参数。
感谢 Michal Ptaszek 和 Scott Lystig Fritchie
自身 ID:OTP-11816
现在更好地记录了
erl
的+fn*
标志也会影响如何读取命令行参数和环境变量。(感谢 Vlad Dumitrescu)自身 ID:OTP-11818
改进和新功能
为 re:run 添加了设置 match_limit 和 match_limit_recursion 的选项。还添加了 report_errors 选项,以便在 re:run 因限制或编译错误而失败时获取更多信息。
自身 ID:OTP-10285
Dialyzer 的
unmatched_return
警告已得到更正。自身 ID:OTP-10908
一个常见的情况是将
list_to_binary/1
的参数包装在一个列表中,以确保即使该参数可能已经是二进制数据,也可以进行转换。请特别注意这种情况,不要复制二进制数据。影响:可能会导致不兼容,因为不再复制单个二进制数据。请改用
binary:copy/1,2
。* 潜在的不兼容性 *
自身 ID:OTP-11082
使 erlang:open_port/2 spawn 和 spawn_executable 处理 Unicode。
自身 ID:OTP-11105
在 Windows 上的 erl、erlc、heart 等中处理 Unicode(宽字符串)。
自身 ID:OTP-11135
Erlang 的 re 模块使用的 PCRE 库的版本从 7.6 提高到 8.33。这意味着,除其他外,更好的 Unicode 和 Unicode 字符属性支持。还向 re 模块添加了与 PCRE 8.33 相关的新选项 (ucd, notempty_atstart, no_start_optimize)。PCRE 在 7.6 和 8.33 之间扩展了正则表达式语法,因此这会带来潜在的不兼容性。只有非常复杂的正则表达式可能会受到影响,但是如果您知道自己正在使用晦涩的功能,请测试运行您的正则表达式并验证它们的行为是否已更改。
* 潜在的不兼容性 *
自身 ID:OTP-11204
erlc 现在可以处理包含 UTF-8 编码字符的文件名。
如果您设置了
ERLC_EMULATOR
环境变量,请注意 OTP 17 中的erlc
只能与 OTP 17 中的erl
一起使用,因为erlc
程序和erl_compile
模块之间的协议已更改。自身 ID:OTP-11248
通过向 configure 提供 --enable-static-{nifs,drivers},现在可以将 nif 和驱动程序静态链接到主 Erlang VM 二进制文件中。目前,只有 Erlang/OTP nif 和驱动程序的 asn1 和 crypto nif 已准备好进行静态链接。有关更多详细信息,请参阅系统文档中的安装指南。
自身 ID:OTP-11258
Erlang/OTP 已移植到实时操作系统 OSE。该端口支持 smp 和非 smp 模拟器。有关端口以及如何启动的详细信息,请参阅 ose 应用程序中的用户指南。
请注意,并非 Erlang/OTP 的所有部分都已移植。
可以正常工作的值得注意的事项是:非 smp 和 smp 模拟器、OSE 信号交互、crypto、asn1、run_erl/to_erl、tcp、epmd、分配以及 Erlang 的大多数(如果不是全部)非操作系统特定功能。
无法正常工作的值得注意的事项是:udp/sctp、os_mon、erl_interface、调度程序的绑定。
自身 ID:OTP-11334
为 TCP、UDP 和 SCTP 添加 {active,N} 套接字选项,其中 N 是 -32768..32767 范围内的整数,允许调用者指定要传递给控制进程的数据消息数量。一旦套接字已传递的消息计数达到 0,或者通过 inet:setopts/2 或在创建套接字时包含 {active,0} 选项将其显式设置为 0,则套接字将转换为被动({active, false})模式,并且套接字的控制进程会收到一条消息,通知它转换。TCP 套接字接收 {tcp_passive,Socket},UDP 套接字接收 {udp_passive,Socket},SCTP 套接字接收 {sctp_passive,Socket}。
套接字已传递的消息计数器默认为 0,但可以使用 {active,N} 通过任何将套接字选项作为参数的 gen_tcp、gen_udp 或 gen_sctp 函数或通过 inet:setopts/2 进行设置。新的 N 值将添加到套接字的当前计数器值,并且可以使用负数来减少计数器值。指定一个会导致套接字的计数器值超过 32767 的数字会导致 einval 错误。如果指定的负数会导致计数器值变为负数,则套接字的计数器值设置为 0,并且套接字转换为被动模式。如果计数器值已经为 0 并且指定了 inet:setopts(Socket, [{active,0}]),则计数器值将保持为 0,但会为套接字生成适当的被动模式转换消息。
感谢 Steve Vinoski
自有 ID:OTP-11368
引入了一种新的可选调度器利用率平衡机制。有关详细信息,请参阅
+sub
命令行参数。特性影响:禁用时无。启用后,系统中的时序会发生变化,通常是由于测量利用率和计算平衡信息而产生的小开销。在某些系统上,例如旧的 Windows 系统,开销可能相当大。这种时间测量开销在很大程度上取决于操作系统提供的底层原语。
自有 ID:OTP-11385
调用
garbage_collect/1
BIF 或check_process_code/2
BIF 可能会触发对调用 BIF 的进程之外的其他进程的垃圾回收。之前的实现执行这些类型的垃圾回收时,没有考虑被垃圾回收的进程的内部状态。为了能够更轻松、更有效地实现生成本机代码,这些类型的垃圾回收已被重写。现在,这种垃圾回收由异步请求信号触发,实际的垃圾回收由被垃圾回收的进程本身执行,并通过向发出请求的进程的回复信号完成。使用这种方法,进程可以禁用垃圾回收并生成,而无需在可以进行垃圾回收的状态下设置堆。引入了
garbage_collect/2
和check_process_code/3
BIF。两者都将选项列表作为最后一个参数。使用这些选项,可以发出异步请求。code:purge/1
和code:soft_purge/1
已被重写,以利用异步check_process_code
请求来并行化工作。特性影响:调用
garbage_collect/1
BIF 或check_process_code/2
BIF 通常需要更长的时间才能完成,而系统整体受该操作的负面影响不会像以前那样大。调用code:purge/1
和code:soft_purge/1
可能会更快或更慢地完成,具体取决于系统的状态,而系统整体受该操作的负面影响不会像以前那样大。自有 ID:OTP-11388 辅助 ID:OTP-11535,OTP-11648
清理崩溃转储中的“Buckets”和“Time left”字段,以方便解析。
自有 ID:OTP-11419
为 file:open/2 添加 sync 选项。
sync 选项将 POSIX O_SYNC 标志添加到支持该标志或其等效项(例如,Windows 上的 FILE_FLAG_WRITE_THROUGH)的平台上的 open 系统调用。对于不支持它的平台,如果传入 sync 选项,file:open/2 将返回 {error, enotsup}。感谢 Steve Vinoski 和 Joseph Blomstedt
自有 ID:OTP-11498
erlang:binary_to_term 现在将花费适当数量的归约,并且如果 term 很大,则会中断(生成)以重新调度。这避免了在使用 binary_to_term 时出现过长的调度。(感谢 Svante Karlsson 的原始补丁)
影响:在大型二进制文件上运行 binary_to_term 的程序将运行得更流畅,但重新调度会影响 BIF 的单进程性能。单线程基准测试可能会显示 BIF 的性能下降,而整体系统行为将得到改善。
自有 ID:OTP-11535 辅助 ID:OTP-11388
为 Windows 添加了高分辨率图标。(感谢 Daniel Goertz 的启发。)
自有 ID:OTP-11560
基于
alloc_util
框架的所有 ERTS 内部内存分配器(temp_alloc
除外)默认启用了内存载体的迁移。也就是说,+M<S>acul de
是这些分配器的默认值。请注意,这也意味着所有这些分配器的分配策略都已更改。它们现在都将使用“地址顺序优先匹配载体最佳匹配”策略。通过在命令行上传递
+Muacul 0
,将还原此更改所做的所有配置更改。特性影响:改进了内存特性,内存占用更小,但代价是性能成本非常小。
自有 ID:OTP-11604 辅助 ID:OTP-10279
已在参考手册中
-on_load()
的文档中添加了说明,建议仅将其用于加载 NIF 库。自有 ID:OTP-11611
启动模拟器时,
+fnaw
现在是默认值;以前是+fnl
。* 潜在的不兼容性 *
自有 ID:OTP-11612
EEP43:新数据类型 - 映射
使用映射,您可以例如
____ -
M0 = #{ a => 1, b => 2}, % 创建关联
____ -
M1 = M0#{ a := 10 }, % 更新值
____ -
M2 = M1#{ "hi" => "hello"}, % 添加新关联
____ -
#{ "hi" := V1, a := V2, b := V3} = M2. % 将键与值匹配
有关如何使用映射的信息,请参阅 参考手册中的“映射表达式”。
当前的实现不包含以下功能
____ - 没有变量键
____ - 没有单值访问
____ - 没有映射推导式
请注意,在 OTP 17.0 期间,映射是实验性的。
自有 ID:OTP-11616
已删除之前已弃用的驱动程序 API 函数
driver_async_cancel()
。因此,驱动程序 API 版本已提升至 3.0。感谢 Steve Vinoski。
* 潜在的不兼容性 *
自有 ID:OTP-11628
引入了实验性的“脏调度器”功能。为了试用该功能,您需要在构建系统时将命令行参数
--enable-dirty-schedulers
传递给configure
。脏调度器目前只能由具有 SMP 支持的系统上的 NIF 使用。更多信息可以在
erl_nif(3)
文档、erl(1)
文档以及提交“c1c03ae4ee50e58b7669ea88ec4d29c6b2b67c7b”的 git 提交注释中找到。请注意,该功能是实验性的,并且不受支持。此功能将进行向后不兼容的更改。您不应在生产系统上启用脏调度器功能。它仅用于测试。
感谢 Steve Vinoski。
自有 ID:OTP-11629
改进
term_to_binary
的归约成本和生成。归约成本增加,并且在生成期间禁用垃圾回收。影响:在调用
term_to_binary
处理大型 term 时,提高了系统响应能力,而不会显著降低单线程性能。自有 ID:OTP-11648 辅助 ID:OTP-11388
默认情况下,将使用系统的 zlib 版本,前提是其版本为 1.2.4 或更高版本;否则将使用内置的 zlib。内置的 zlib 版本已升级到 1.2.8。(使用
--enable-builtin-zlib
选项configure
以强制使用内置的 zlib。)自有 ID:OTP-11669
binary_to_term 和 external_size 中的默认浮点编码已更改为使用 minor_mode 1 而不是 0。
* 潜在的不兼容性 *
自有 ID:OTP-11738
引入了
configure
选项--with-assumed-cache-line-size=SIZE
。有关详细信息,请参阅$ERL_TOP/HOWTO/INSTALL.md
。自有 ID:OTP-11742
半字模拟器被标记为已弃用。它仍然像以前一样工作,但计划在未来的主要版本中删除。
自有 ID:OTP-11777
映射的外部格式已更改,该格式与 OTP 17.0-rc1 和 OTP 17.0-rc2 中使用的格式不兼容。
* 潜在的不兼容性 *
自有 ID:OTP-11782
修复了错误的 make 依赖项,该依赖项会导致某些 make 版本在构建 gen_git_version.mk 时失败。
自有 ID:OTP-11784
引入了在过渡期间允许加载旧驱动程序和 NIF 库的功能。有关详细信息,请参阅
erl_driver(3)
文档中的版本管理部分 和erl_nif(3)
文档中的版本管理部分。自有 ID:OTP-11799
支持 Windows 上长度超过 259 个字符的文件路径。长绝对路径会自动转换为 UNC 格式,并带有
\\?\
前缀,这是表示长路径的唯一方法。259 个字符的限制仍然适用于单个文件名、相对路径和当前工作目录。自有 ID:OTP-11813
记录 escript:create/2 还接受包含文件和 zip:create/3 选项以构建 zip 文件的 3 个元素的元组。
感谢 Pierre Fenoll
自有 ID:OTP-11827
为 epmd 添加 systemd 套接字激活。
感谢 Matwey V. Kornilov
自有 ID:OTP-11829
Erts 5.10.4.1
已知错误和问题
当使用 gen_tcp:connect 和带有
port
和/或ip
的fd
选项时,port
和ip
选项会被忽略。此问题已修复,现在如果port
和/或ip
与fd
一起指定,则会为该fd
请求绑定。如果未指定port
和/或ip
,则不会调用绑定。自有 ID:OTP-12061
Erts 5.10.4
已修复的错误和故障
在规范化路径时,erl_prim_loader 始终会将反斜杠转换为正斜杠。这在 Windows 上是正确的,但在其他操作系统上则不然。erl_prim_loader 现在会检查正在运行的操作系统,然后再执行此转换。
自有 ID:OTP-11170
修复了 syslog 定义,并为没有 syslog.h 的系统定义了 LOG_ERR。感谢 Matt Lewandowsky。
自有 ID:OTP-11349
检查传递给 binary:matches/2 的所有模式参数。感谢 Mike Sassak。
自有 ID:OTP-11350
修复了两个小的静默规则遗漏。感谢 Anthony Ramine。
自有 ID:OTP-11351
教导 configure 检测 posix_memalign 是否不能对齐到大于系统页面大小的值。
对于交叉编译的系统,引入了一个名为 erl_xcomp_posix_memalign 的新环境变量,用于指示是否应使用 posix_memalign。
自有 ID:OTP-11371
修复了当将一个巨大的数字向右移动大量位时发生的 bsr 错误。感谢 Lars Hesel Christensen。
自有 ID:OTP-11381
修复了分布式监视器的内存泄漏
自有 ID:OTP-11410
修复了 erts、kernel 和 ssh 中的各种拼写错误。感谢 Martin Hässler。
自有 ID:OTP-11414
由进程生成时内存不足引发的崩溃转储可能会由于无效指针导致 beam 在写入崩溃转储期间发生段错误。
这些指针是无效的,因为进程创建从未完成。此修复程序将这些进程从打印输出中删除。由 Richard Carlsson 报告。
自有 ID:OTP-11420
来自 64 位 Erlang 计算机的崩溃转储会将所有内存地址截断为 32 位,这可能会导致在崩溃转储查看器中检查进程消息队列和堆栈时出现问题。
自有 ID:OTP-11450
当内存载体的迁移支持已启用时,即当
+M<S>acul
命令行标志已传递给erl
时,调度器线程之外的其他线程可能会进行线程不安全访问。这可能会导致 VM 的内部状态损坏。此错误是在 erts-5.10.2 中引入的,当时引入了对内存载体迁移的支持。
自有 ID:OTP-11456 辅助 ID:OTP-10279
修复了
binary_to_term
中针对无效位串和非常大的二进制文件 (>2Gb) 的错误。自有 ID:OTP-11479
在极少数情况下,调用
inet:close/1
、gen_tcp:close/1
、gen_udp:close/1
或gen_sctp:close/1
的进程可能会无限期地挂起在该调用中。自有 ID:OTP-11491
修复了可能导致 32 位模拟器在启动时始终崩溃(自 R16B01 起)的错误,具体取决于 beam 可执行文件中静态数据的对齐方式。
自有 ID:OTP-11496
修复了关于位串比较的良性错误。仅对调试和 valgrind VM 造成不便。
自有 ID:OTP-11501
消除警告(感谢 Anthony Ramine)
自有 ID:OTP-11517
模拟器 (beam) 的默认字大小现在由 Mac OSX (Darwin) 上的编译器默认值确定。这之前是被 configure 脚本强制为 32 位的,除非另有指定。
自有 ID:OTP-11521
改进和新功能
引入了一个名为“超级载体”的新内存分配功能。超级载体功能可以以不同的方式使用。例如,它可以用于预分配运行时系统应该能够使用的所有内存。
默认情况下,超级载体处于禁用状态。它通过传递
+MMscs <MB 大小>
命令行参数来启用。有关更多信息,请参阅+MMsco
、+MMscrfsd
、+MMscrpm
、+MMscs
、+MMusac
和+Mlpm
命令行参数在erts_alloc(3)
文档中的文档。由于默认情况下处于禁用状态,因此如果未使用,则不应对系统特性产生任何影响。
此更改已被标记为潜在的不兼容性,因为调用
erlang:system_info({allocator, mseg_alloc})
时返回的列表现在还包括一个{erts_mmap, _}
元组作为列表中的一个元素。* 潜在的不兼容性 *
自有 ID:OTP-11149
添加了 erlang:system_info(ets_limit) 来提供一种检索运行时 ETS 表最大数量的方法。感谢 Steve Vinoski
自有 ID:OTP-11362
添加新的 BIF os:unsetenv/1,该 BIF 删除一个环境变量。感谢 Martin Hässler。
自有 ID:OTP-11446
引入了关于端口退出信号的新保证
如果调用下面列出的同步端口 BIF 之一的进程链接到由第一个参数标识的端口,并且该端口在发送端口操作结果之前退出,则由于此链接发出的退出信号将在 BIF 返回之前被进程接收,或者由于端口未打开而失败并出现异常。
同步端口 BIF 是
port_close/1
port_command/2
port_command/3
port_connect/2
port_control/3
erlang:port_call/3
erlang:port_info/1
erlang:port_info/2
请注意,某些端口在某些情况下会在退出之前取消与调用进程的链接,即,即使进程本身链接到端口,也可能没有触发退出信号的链接。
特性影响:如果端口同时由于与未完成的同步端口 BIF 调用无关的某些问题而退出,则同步端口 BIF 的返回或异常将被延迟。在所有其他情况下,特性不变。
自有 ID:OTP-11489
Erts 5.10.3.1
改进和新功能
如果
mseg_alloc
无法创建更多载体,则内存分配器将能够创建sys_alloc
载体作为后备,在具有posix_memalign()
支持的系统上。这与 R16 之前的版本中的工作方式类似。Windows 系统将使用
_aligned_malloc()
创建载体,并且可以通过此方式使用 R16 在其他平台上引入的新的优化分配器标头方案。自有 ID:OTP-11318
Erts 5.10.3
已修复的错误和故障
预定义类型和内置类型的文档已更正。
自有 ID:OTP-11090
修复了 to_erl 中更改终端参数的问题
更改 to_erl 的行为,以便在更改终端参数时使用 TCSADRAIN 而不是 TCSANOW。这使串行驱动程序在应用终端参数更改之前等待输出队列为空。感谢 Stefan Zegenhagen。
自有 ID:OTP-11206
如果状态为整数,则 erlang:halt/2 中的 {flush, boolean()} 的默认值记录为“true”。实现行为相反。现在已更正实现以符合文档。感谢 Jose Valim 报告此错误。
* 潜在的不兼容性 *
自有 ID:OTP-11218
修复了 R16B01 中可能导致 PID 混淆的严重竞争错误,当在至少具有两个调度器线程的 SMP 模拟器上以非常快的速度生成和终止大量进程时。
自有 ID:OTP-11225
使用选项 silent 验证跟踪模式不再错误地启用/禁用调用进程的 silent 选项。
自有 ID:OTP-11232
修复了 GCC 4.8 及更高版本使用更积极的循环优化算法的问题,该算法破坏了 efile 驱动程序中一些以前工作的代码。感谢 Tomas Abrahamsson 报告此问题。
自有 ID:OTP-11246
修复了在崩溃转储中打印内存分配器 acul 选项时的错误。
自有 ID:OTP-11264
在 Windows 上打开一个新的压缩文件在极少数(随机)情况下可能会导致 {error,eisdir} 或其他错误代码,尽管它应该成功。现在已更正此问题。
自有 ID:OTP-11265
修复了关闭跟踪端口时会导致模拟器崩溃的竞争条件。
自有 ID:OTP-11290
改进和新功能
有一个新的有点实验性的套接字选项“netns”,它可以在支持它的 Linux 上为套接字设置网络命名空间。请参阅文档。
自有 ID:OTP-11157
新的分配器策略
aoffcbf
(地址顺序首次匹配载体最佳匹配)。支持载体迁移,但比aoffcaobf
具有更好的 CPU 性能。自有 ID:OTP-11174
引入了用于检查系统和构建配置的功能。
自有 ID:OTP-11196
修复了浮点中间字节序机器的匹配。感谢 Johannes Weissl。
自有 ID:OTP-11201
修复了 ARM 和 GCC 版本大于 4.1.0 的编译错误。感谢 Johannes Weissl。
自有 ID:OTP-11214
run_erl:将标准流重定向到 /dev/null。感谢 Johannes Weissl。
自有 ID:OTP-11215
erl_driver 文档中的杂项更正。感谢 Giacomo Olgeni。
自有 ID:OTP-11227
修复了关于 binary_part 的文档。
自有 ID:OTP-11239
使 edlin 理解一些重要的控制键。感谢 Stefan Zegenhagen。
自有 ID:OTP-11251
导出类型 zlib:zstream/0。感谢 Loic Hoguin。
自有 ID:OTP-11278
添加 erl 选项以按百分比设置调度程序。
对于测量结果显示使用非默认数量的模拟器调度器线程可以提高性能的应用程序,由于 erl +S 选项需要指定绝对数量的调度器线程和联机调度器线程,因此很难在每个都具有不同数量的逻辑处理器的多个主机上准确设置正确的调度器线程数量。
为了解决这个问题,在 erl 中添加一个 +SP 选项,类似于现有的 +S 选项,但允许将调度器线程数和在线调度器线程数设置为配置的逻辑处理器和可用逻辑处理器百分比。例如,“+SP 50:25” 将调度器线程数设置为配置的逻辑处理器数的 50%,将在线调度器线程数设置为可用逻辑处理器数的 25%。+SP 选项还与 +S 选项指定的任何设置进行交互,例如选项组合 “+S 4:4 +SP 50:50” (顺序任意)将导致 2 个调度器线程和 2 个在线调度器线程。
感谢 Steve Vinoski
自有 ID:OTP-11282
使用锁名称扩展 erl_driver 接口
锁和线程名称已经是驱动程序接口中的一个特性。此扩展将允许开发人员读取这些名称,从而简化调试。
自有 ID:OTP-11303
修复 integer_to_binary/2 返回的错误值。感谢 Juan Jose Comellas。
自有 ID:OTP-11311
修复 system_flag scheduling_statistics - 禁用。感谢 Steve Vinoski。
自有 ID:OTP-11317
预定义类型的文档已得到更正。感谢 Kostis Sagonas。
自有 ID:OTP-11321
Erts 5.10.2
已修复的错误和故障
已更正 prim_inet 中的一个错误。如果在关闭套接字端口时,端口所有者在错误的时间被杀死,该端口可能会变成孤立的,从而导致端口和套接字泄漏。由 Fred Herbert、Dmitry Belyaev 和其他人报告。
自有 ID:OTP-10497 辅助 ID:OTP-10562
NetBSD 的编译修复。感谢 YAMAMOTO Takashi。
自有 ID:OTP-10941
修复了当写入文件时使用 delayed_write 导致的竞争条件,该条件会导致相同的数据被多次写入。
自有 ID:OTP-10984
修复了带有选项
meta
的跟踪导致的小内存泄漏。自有 ID:OTP-10997
更正了 erlsrv 用法中的拼写错误。感谢 Bryan Hunter。
自有 ID:OTP-11002
ct_run:删除未使用的函数。感谢 Tuncer Ayaz。
自有 ID:OTP-11003
更正了 run_erl/to_erl 握手行为。
自有 ID:OTP-11012
修复类型中的拼写错误:erlang:process_info_item()。感谢 Andrew Tunnell-Jones。
自有 ID:OTP-11024
修复了 ttsl 驱动程序中的 src/dest 重叠问题。感谢 Steve Vinoski。
自有 ID:OTP-11064
当使用
erlang:send(Port, Msg, [nosuspend])
发送到端口时,发送操作是同步执行的。此错误现已修复。自有 ID:OTP-11076 辅助 ID:OTP-10336
当使用 unicode:characters_to_list 将错误的二进制文件转换为列表时,错误返回值可能包含错误的 “rest”,即无法转换的字符的 io_list 是错误的。这仅在输入为子二进制且转换来自 utf8 时发生。现在已更正此问题。
自有 ID:OTP-11080
当报告过时的
driver_select()
时,运行时系统可能会崩溃。自有 ID:OTP-11084
修复内存检测 (+Mim, +Mis, +Mit) 的锁顺序冲突。
自有 ID:OTP-11085
修复了各种平台上的某些编译警告。感谢 Anthony Ramine。
自有 ID:OTP-11086
修复了在 Windows 上关闭期间刷新 i/o 时,由于竞争条件导致 Erlang VM 有时会挂起的问题。
自有 ID:OTP-11096
修复了重复调用 erlang:nodes() 可能导致 dist_table 锁中出现不必要的争用的问题。
自有 ID:OTP-11097
在 ttsl_drv 中使用 HAVE_WCWIDTH 正确保护 WIDE_TAG 的使用。感谢 Anthony Ramine。
自有 ID:OTP-11106
修复了一些不支持静默规则的 Makefile 规则。感谢 Anthony Ramine。
自有 ID:OTP-11111
修复了 erl_eval 中对 BEAM 模块的接收支持。感谢 Anthony Ramine。
自有 ID:OTP-11137
erlang:now() 在 Windows 上可能会突然跳到未来 ~24 天。现在已更正此问题。感谢 Garret Smith 的报告和测试修复。
自有 ID:OTP-11146
erlang:term_to_binary 现在将花费适当数量的归约,并且如果 term 很大,则会中断(让步)以重新调度。这避免了在使用 term_to_binary 时出现过长的调度。
影响:在大型 term 上运行 term_to_binary 的程序将运行得更平稳,但重新调度将影响 BIF 的单进程性能。当使用非常大的 term 调用 BIF 时,单线程基准测试将显示 BIF 的性能下降,而整体系统行为将得到改善。即使对于小的 term,允许重新启动和归约计数的开销也会使 BIF 的本地性能降低 5% 到 10%。
自有 ID:OTP-11163
改进和新功能
用无锁解决方案替换了保护垃圾回收统计信息收集的锁。
自有 ID:OTP-10271 辅助 ID:kunagi-108 [04c5410f-9cc4-4696-8639-36bf98686c7a-7]
引入了内存载体在内存分配器实例之间迁移的支持。
默认情况下,此功能未启用,并且不影响系统的特性。启用后,它对系统的特性具有以下影响
- 当内存负载在特定于调度器的分配器实例之间分布不均时,减少了内存占用。
- 根据特定分配器上使用的默认分配策略,可能会或可能不会有轻微的性能损失。
- 当在
fix_alloc
分配器上启用时,将使用不同的策略来管理 fix 块。 - 当启用此功能时,从
erlang:system_info({allocator, A})
和erlang:system_info({allocator_sizes, A})
返回的信息将略有不同。将存在一个mbcs_pool
元组,提供有关已放弃载体的信息,并且在fix_alloc
情况下,将不存在fix_types
元组。
有关更多信息,请参阅
+M<S>acul
命令行参数的文档。自有 ID:OTP-10279
更改 spawn_opt 的规范,以使用 process_level() 类型声明,而不是在各个位置重新定义它。感谢 Kostis Sagonas。
自有 ID:OTP-11008
删除了不再需要用于生成 PDF 文件的 Postscript 文件。
自有 ID:OTP-11016
包含非 ASCII 字符的 Erlang 源文件现在以 UTF-8 编码(而不是 latin1)。
自有 ID:OTP-11041 辅助 ID:OTP-10907
通过使用无锁实现优化在同一套接字上同时进行的
inet_db
操作。对系统特性的影响:提高了性能。
自有 ID:OTP-11074
在 OTP-R16A 中引入的
high_msgq_watermark
和low_msgq_watermark
inet
套接字选项只能在 TCP 套接字上设置。这些选项现在是通用的,可以在所有类型的套接字上设置。自有 ID:OTP-11075 辅助 ID:OTP-10336
引入了一种用于管理进程和端口表的新型更好的算法。
对系统特性的影响
- 新算法确保可以在 O(1) 时间复杂度内执行插入和删除操作。先前使用的算法要么导致插入或删除为 O(N)。
- 新算法还将确保标识符的重用频率低于使用旧算法时的频率。
- 先前使用的算法确保,只要没有重用任何标识符,在同一节点上创建的相同类型的两个标识符进行比较时,最新创建的标识符比较大。由于标识符可以非常快速地重用,因此永远无法依赖此属性。由于引入了这种新算法,即使尚未重用任何标识符,此属性也不会成立。这可以被认为是不兼容性。
由于上述提到的潜在不兼容性,仍然可以在一段时间内启用旧算法。命令行参数
+P legacy
将在进程表上启用旧算法,而+Q legacy
将对端口表执行相同的操作。但是,这些命令行参数从引入之日起就被弃用,并计划在 OTP-R18 中删除。* 潜在的不兼容性 *
自有 ID:OTP-11077
通过 wcwidth() 支持 shell 中的宽字符。感谢 Anthony Ramine。由 Loïc Hoguin 报告。
自有 ID:OTP-11088
在 Erlang 崩溃转储中添加了每个进程的总已用内存。
自有 ID:OTP-11098
添加了对 Raspberry Pi (armv6l) 上 hipe 的支持。感谢 Klaus Alfert。
自有 ID:OTP-11125
从文档中的保留字列表中删除 “query”。感谢 Matthias Endler 和 Loïc Hoguin。
自有 ID:OTP-11158
取消 Mac OS X 上文件描述符的静态限制 (FD_SETSIZE)。(感谢 Anthony Ramine)
自有 ID:OTP-11159
已知错误和问题
OTP 中的各种本机代码由于执行时间过长或未正确增加归约而出现故障。当将大量数据传递给行为不端的 BIF 时,通常会发生问题。修复此问题具有很高的优先级,并且正在努力解决,但此类问题仍然存在一段时间。
为了缓解执行行为不端的本机代码时可能发生的调度问题,引入了命令行参数 +sfwi。
默认情况下,此功能处于禁用状态,如果您没有遇到行为不端的本机代码的问题,建议不要启用它。
启用后,它对系统的特性具有以下影响
- 即使在执行行为不端的本机代码时,工作也始终会在调度器之间分配。
- 它可能会导致在调度器之间弹跳的进程和/或端口数量增加,从而导致性能损失。
- 当所有调度器未在满负载下执行时,由于减少或丢失了工作压缩,可能会导致性能下降。
- 运行队列锁上的争用增加。
自有 ID:OTP-11164
Erts 5.10.1.2
已修复的错误和故障
离线调度器实现中的一个错误已被修复。该错误在 OTP-R16A/ERTS-5.10 中引入,导致调度器之间的工作窃取失败。这反过来导致一些运行队列中积累了工作。该错误仅在系统中有离线调度器时触发,即当在线调度器的数量少于调度器的总数时。离线调度器越多,该错误的影响就越严重。
自身 ID: OTP-11022 辅助 ID: OTP-9892
Erts 5.10.1.1
修复的错误和故障
BIF
is_process_alive/1
在被检查的进程正在终止时可能会过早返回false
。此错误在 ERTS-5.10 中引入。自身 ID: OTP-10926
修复了
erlang:delete_element/2
中的一个问题,如果在调用期间堆栈和堆相遇,该调用可能会损坏堆栈的一个字。自身 ID: OTP-10932
如果标志的参数和值部分之间没有空格,则
+sws<value>
和+swt<value>
系统标志会失败。失败后,运行时系统拒绝启动。自身 ID: OTP-11000
改进和新功能
Erts 5.10.1
修复的错误和故障
在 Windows 系统上,由 vanilla、fd 和 spawn 驱动程序在运行时系统中内部创建的线程可能会对
driver_select()
进行线程不安全调用。自身 ID: OTP-10802
在 Windows 系统上,由 vanilla、fd 和 spawn 驱动程序在运行时系统中内部创建的线程可能会在端口终止后对驱动程序数据进行不安全的内存访问。
自身 ID: OTP-10803
在 Windows 上将数据刷新到标准输出或标准错误时,运行时系统可能会崩溃。
自身 ID: OTP-10807
修复了由于 erts-5.10/OTP-R16A 中引入的端口优化而导致的错误
- 终止端口时的内存泄漏
- 达到系统最大并发端口数限制时的内存泄漏
- 由于缺少或延迟对错误端口句柄的测试而导致的崩溃
- 新引入的驱动程序 API 函数
erl_drv_busy_msgq_limits()
在 Windows 上无法被动态链接的驱动程序使用
自身 ID: OTP-10809 辅助 ID: OTP-10336
修复了长度超过 20 个字符的未识别标头字段(例如
Sec-Websocket-Version
)的{packet,httph}
标头大小写问题。简单地将限制从 20 个字符提高到 50 个字符,希望不会使用长度超过 50 个字符的有效标头。自身 ID: OTP-10824
修复 float_to_list/1,2 中的舍入问题。感谢 Serge Aleynikov
自身 ID: OTP-10837
修复了 R16A 中引入的文件驱动程序中的内存泄漏。
自身 ID: OTP-10841
ERTS 内部队列实现中的一个错误可能导致丢失向消费者线程发出的唤醒信号。此问题现已修复。
当触发此错误时,其影响通常只是某些操作的少量甚至没有延迟。这是因为线程通常会由于其他不相关的原因被唤醒。但是,如果消费者线程在触发错误时没有因其他原因被唤醒,这些操作可能会挂起,并且可能永远挂起。这种情况似乎非常罕见,但我们至少收到过一次关于此类问题的报告。
可能受此错误影响的操作
内存分配状态检查 - 调用
erlang:memory/[0,1]
或erlang:system_info({allocator|allocator_sizes, _})
的 Erlang 进程可能会挂起,等待相关线程的响应。异步线程池作业 - 异步线程池作业请求和/或回复可能会挂起。在 OTP 中,这只影响文件操作,但使用异步线程池的用户实现的驱动程序也会受到影响。在文件操作的情况下,这通常会转化为 Erlang 进程可能挂起在文件操作上。
关闭运行时系统 - 由于上述异步线程池问题,在终止运行时系统时刷新 I/O 也可能会挂起。
ETS 内存释放 - 处理 ETS 表主要结构释放的计划作业可能会挂起。这或多或少只转化为轻微的内存泄漏。
关闭分布式 - 手动关闭分布式时(即在调用
net_kernel:stop()
时)使用的分布式关闭阶段可能会挂起。
自身 ID: OTP-10854
OS X Snow Leopard 现在只使用 write,因为 writev 在非常大的文件上无法正常工作。
自身 ID: OTP-10858
修复了一个错误,该错误导致使用 read_ahead 的面向行的文件 I/O 对于行长度差异很大的文件非常慢。
自身 ID: OTP-10859
在 erts-5.10 (R16A) 中,为非 ASCII 原子(字节范围 128..255 中的字符)生成了错误的哈希值。此问题现已修复,并且哈希值符合以前的 OTP 版本。
自身 ID: OTP-10860
修复了当运行时系统在构建期间链接到第三方库以进行原子内存操作时,可能线程不安全的内存访问。大多数构建不受此错误的影响。如果触发,运行时系统很可能会立即崩溃。
自身 ID: OTP-10875 辅助 ID: OTP-10854
修复了一个错误,该错误导致不再可能将 +sws 提案标志提供给非 smp 模拟器。
自身 ID: OTP-10881 辅助 ID: seq12258
Windows 上 ReadFile 读取的字节类型错误。这可能会导致 Windows 系统行为异常。现在使用正确的类型。
自身 ID: OTP-10890
将 Windows 的默认最大端口数更改为 8192。值太大导致 Windows 无法正确恢复。如果要使用其他值,请将
+Q Value
传递给 erl 或 werl。自身 ID: OTP-10892
修复了在代码加载期间半字虚拟机上发生的罕见崩溃。
自身 ID: OTP-10896
改进和新功能
不再支持元组函数(在 R15B 中已弃用)。
* 潜在的不兼容性 *
自身 ID: OTP-10170
添加了四个新的 bifs,
erlang:binary_to_integer/1,2
、erlang:integer_to_binary/1
、erlang:binary_to_float/1
和erlang:float_to_binary/1,2
。这些 bifs 的工作方式与它们的列表对应项类似,只是它们操作二进制文件。在大多数情况下,从二进制文件转换和转换为二进制文件比从列表转换和转换为列表更快。这些 bifs 会自动导入到 erlang 源文件中,因此可以在不使用
erlang
前缀的情况下使用。自身 ID: OTP-10300 辅助 ID: kunagi-74 [74]
已删除对软件包的实验性支持。
自身 ID: OTP-10348 辅助 ID: kunagi-316 [227]
引入了驱动程序 API 函数
erl_drv_consume_timeslice()
和 NIF API 函数enif_consume_timeslice()
。提供这些函数是为了更好地支持协作式调度、提高系统响应能力,并使其更容易防止由于进程或端口垄断调度器线程而导致的虚拟机行为异常。在将长时间工作划分为多次重复调用而无需使用线程时,可以使用它们。
自身 ID: OTP-10810
当与其他 10 的基数一起使用时,已优化 list_to_integer/2 bif。
自身 ID: OTP-10834 辅助 ID: kunagi-74 [74]
现在,在编译未发布的 Erlang 版本时,HEAD 提交的 git 提交 sha 将添加到 Erlang shell 中。
自身 ID: OTP-10838
更改内存段分配器的缓存策略。例如,优先使用 sbc 段而不是 mbc 段,缓存策略具有时间感知能力,会驱逐较旧的缓存段以存储较新的段。
可缓存段的默认数量已从 5 个增加到 10 个。可以像以前一样使用命令行选项
+MMmcs 5
修改此数量。影响:提高了处理较大对象(例如二进制文件)的速度。映射和驻留内存略有增加。使用
erl
的内存选项调整系统,以获得最佳性能。自身 ID: OTP-10840
将 config.sub 和 config.guess 更新到来自 gnu.org 的最新版本
自身 ID: OTP-10848
为 Blue Gene/Q 添加一个 xcomp 文件。感谢 Kostis Sagonas。
自身 ID: OTP-10849
清理类型语言的文档。感谢 Kostis Sagonas。
自身 ID: OTP-10850
更改 hipe_bifs:remove_refs_from/1 的返回值。感谢 Kostis Sagonas。
自身 ID: OTP-10851
从 ERTS-5.10/OTP-R16A 开始,EPMD 协议中传递的节点名称必须以 UTF-8 编码。由于 EPMD 以前接受 latin1 编码的节点名称,因此这是一个不兼容的问题。但是,由于 Erlang 节点始终要求节点名称中的字符是 7 位 ASCII 字符(并且仍然需要此要求),因此这种不兼容性不应影响任何将 EPMD 用作 Erlang 端口映射守护进程的人。
* 潜在的不兼容性 *
自身 ID: OTP-10872 辅助 ID: OTP-10753
erl 的 +pc 标志可用于设置被视为可打印的字符范围。这会影响 shell 和 io:format("~tp",...) 功能如何执行启发式字符串检测。可以在 STDLIB 用户指南中阅读更多内容。
自身 ID: OTP-10884
修复了 Win64 上与格式化打印相关的多个类型转换错误,这些错误可能会在 Erlang VM 超过 4 GB 的内存时导致问题。(感谢 Blaine Whittle 的原始补丁)
自身 ID: OTP-10887
已过时环境变量 ERL_MAX_PORTS 的影响已被过早删除。现在已重新添加它。请注意,它仍计划在 R17B 中发布。
自身 ID: OTP-10895
Erts 5.10
修复的错误和故障
将新的剥离 SCTP 套接字设置为非阻塞套接字(感谢 Jonas Falkevik)
自身 ID: OTP-10491
修复各种拼写错误(感谢 Tuncer Ayaz)
自身 ID: OTP-10611
修复使用异步线程池时的 fd 泄漏
当使用异步线程池时,如果 erlang 进程请求打开文件并且在 file:open/2 调用尚未返回时被关闭/终止,则可能会泄漏针对目标文件的文件描述符。此问题现已修复。(感谢 Filipe David Manana)
自有 ID: OTP-10677
使用 sys/types.h 而不是 string.h 来提取 ssize_t 定义到 erl_driver.h。这修复了 NetBSD 上的构建问题。(感谢 Yamamoto Takashi)。
自有 ID: OTP-10699
现在,使用 -run 或 -s 标志传递给 erl 的参数将根据运行时系统的文件名编码模式进行转换。
自有 ID: OTP-10702
gen_tcp/inet 接口中的八位字节计数器在 64 位平台上可能会以意外的方式运行。现在的行为符合预期。
自有 ID: OTP-10746
某些 Linux 内核,尤其是在 Redhat 和 CentOS 发行版中,writev 存在一个错误,该错误会在 VM 的 tcp 代码中生成无限循环。该错误现已得到解决。
自有 ID: OTP-10747
一个在操作压缩文件时被终止(收到退出信号)的进程,可能会导致 VM 中出现段错误。现在已对此进行更正。感谢 Filipe David Manana 找出问题并提交解决方案。
自有 ID: OTP-10748
Windows 之前在格式化中使用三位指数,这导致了平台之间的差异,如 float_to_list/1 所见。现在已对此进行修复。
自有 ID: OTP-10751
改进和新功能
为 IPv6 套接字添加了一个布尔套接字选项 'ipv6_v6only'。该选项的默认值取决于操作系统,因此旨在实现可移植性的应用程序应考虑在创建
inet6
监听/目标套接字时使用{ipv6_v6only,true}
,并且如有必要,还应在同一端口上创建inet
套接字用于 IPv4 流量。请参阅文档。自有 ID: OTP-8928 辅助 ID: kunagi-193 [104]
现在允许为 BIF 定义桩,以便为 BIF 编写类型规范。例如,如果存在名为
lists:member/2
的 BIF,则现在允许lists:member/2
的虚拟定义。自有 ID: OTP-9861
进程优化。最值得注意的是
- 新的内部进程表实现,允许并行读取和写入。特别是读取操作变得非常便宜。这减少了各种情况下的争用。例如,在生成进程、终止进程、发送消息等时。
- 运行队列管理优化,减少争用。
- 进程内部状态更改优化,减少争用。
这些更改意味着系统特性的变化。最值得注意的是:系统中计时发生了变化。
自有 ID: OTP-9892 辅助 ID: OTP-10167
非阻塞代码加载。之前,当加载 Erlang 模块时,VM 中的所有其他执行都会停止,同时在单线程模式下执行加载操作。现在,加载模块时不会阻塞 VM。进程可以在整个加载操作期间并行且不受干扰地继续执行。通过使用单个原子指令使加载的代码对所有进程可见,从而完成加载操作。当在运行的 SMP 系统上加载/升级模块时,非阻塞代码加载将改善实时特性。
自有 ID: OTP-9974
在 SMP 模拟器中,打开和关闭跟踪将不再使系统降至单调度模式。
自有 ID: OTP-10122
删除 VxWorks 支持
自有 ID: OTP-10146
为执行 Erlang/OTP 的基准测试添加了一个通用框架。Erlang VM 和 mnesia 的基准测试已纳入该框架。
有关如何添加更多基准测试的详细信息,请参阅源代码分发中的 $ERL_TOP/HOWTO/BENCHMARKS.md。
自有 ID: OTP-10156
优化了 ETS 表的删除,当使用大量临时表时,性能会显著提高。
此更改意味着系统特性的变化。最值得注意的是:系统中计时发生了变化。
自有 ID: OTP-10167 辅助 ID: OTP-9892
不再支持元组函数(在 R15B 中已弃用)。
* 潜在的不兼容性 *
自身 ID: OTP-10170
分配器的新内部头方案
影响:在多块载体中分配的对象大小减少一个字
自有 ID: OTP-10273 辅助 ID: kunagi-20 [20]
主要的端口改进。最值得注意的是
- 新的内部端口表实现,允许并行读取和写入。特别是读取操作变得非常便宜。这减少了各种情况下的争用。例如,在创建端口、终止端口等时。
- 端口结构的动态分配。这允许默认情况下允许的最大端口数量更大。之前的默认值 1024 已提高到 65536。可以使用 +Q 命令行标志设置最大端口数量,请参考 erl(1)。之前使用的环境变量
ERL_MAX_PORTS
已被弃用,并计划在 OTP-R17 中删除。 - 对端口任务的调度进行了重大重写。重写的主要好处是减少了运行队列锁的争用,并减少了所需的内存分配操作量。为了能够调度从进程到端口的信号,也必须进行重写。
- 改进了内部线程进度功能,以便轻松管理非托管线程。端口任务调度的重写需要进行此改进。
- 为了能够调度这些操作,重写了所有进程到端口的信号实现。现在可以调度所有端口操作,这减少了端口锁的锁争用,以及与端口的真正异步通信。
- 优化了从驱动程序查找端口句柄。
- 优化了创建端口时的驱动程序查找。
- 可抢占的
erlang:ports/0
BIF。 - 通过增加直接调用驱动程序回调的进程的归约次数,从而提高响应能力。
这些更改意味着系统特性的变化。最值得注意的是
信号传递顺序 - VM 的先前实现以比语言要求的更严格的同步方式将信号从进程传递到端口。从 ERTS 5.10 版本开始,信号以真正异步的方式传递。信号传递的顺序仍然符合语言的要求,但仅限于这些要求。也就是说,以前始终以一种特定顺序传递的一些信号序列现在可能会不时以不同的顺序传递。这可能会导致对信号传递顺序做出错误假设的 Erlang 程序失败,即使它们之前成功运行。有关信号排序保证的更多信息,请参阅 ERTS 用户指南中有关通信的章节。erl(1) 的
+n
命令行标志在尝试查找因这些更改而暴露的 Erlang 代码中的信号排序错误时可能很有用。从进程发送到端口的信号的延迟 - 之前,从进程发送到端口的信号始终立即传递。这使此类通信的延迟保持在最低限度,但这可能会导致锁争用,这对整个系统来说代价非常高昂。为了在未来也能保持这种延迟较低,只要没有发生冲突,默认情况下,从进程发送到端口的大多数信号仍然会立即传递。此类冲突包括无法获取端口锁,但也包括其他冲突。当发生冲突时,将计划在稍后时间传递信号。计划的信号传递可能会导致此特定通信的延迟更高,但由于减少了调度程序之间的锁争用,因此可以提高系统的整体性能。可以通过将 +spp 命令行标志传递给 erl(1) 来更改仅在冲突时才调度这些信号传递的默认行为。也可以使用 parallelism 选项在端口基础上更改行为,请参考 open_port/2 BIF。
erlang:ports/0
BIF 的执行时间 - 由于erlang:ports/0
现在可以被抢占,因此系统的整体响应能力得到了提高。但是,与之前相比,调用erlang:ports/0
可能需要更长的时间才能完成。时间长短在很大程度上取决于系统负载。调用驱动程序回调的归约成本 - 调用驱动程序回调的成本相当高。以前这根本没有反映在归约成本中。由于归约成本现在增加了,因此执行大量直接驱动程序调用的进程将比以前更频繁地被调度出。
潜在的不兼容性:
driver_send_term()
已被弃用,并计划在 OTP-R17 中删除。将driver_send_term()
的用法替换为 erl_drv_send_term() 的用法。driver_output_term()
已被弃用,并计划在 OTP-R17 中删除。将driver_output_term()
的用法替换为 erl_drv_output_term() 的用法。- 为了能够控制端口队列的管理,添加了新函数 erl_drv_busy_msgq_limits()。
由于驱动程序 API 中的上述更改,驱动程序 API 版本已从 2.0 提升到 2.1。
* 潜在的不兼容性 *
自有 ID: OTP-10336 辅助 ID: OTP-9892
已删除对软件包的实验性支持。
自身 ID: OTP-10348 辅助 ID: kunagi-316 [227]
从跟踪模式中设置 seq_trace-tokens 时的错误参数可能会导致 VM 崩溃。现在已对此进行更正。
自有 ID: OTP-10522
Erlang 规范 4.7.3 将最大元组大小定义为 65535 个元素。现在强制规定不超过 16777215 个元素(基数 24 位)
以前的极端情况(28 位)未经过验证,可能会导致未定义的行为。
* 潜在的不兼容性 *
自有 ID: OTP-10633
添加 insert_element/3 和 delete_element/2
自有 ID: OTP-10643
之前默认的最大同时进程数为 32768 已提高到 262144。可以使用 +P 命令行标志更改此值,请参考 erl(1)。请注意,现在传递的值被视为提示,并且在大多数情况下,所选的实际值将是 2 的幂。
* 潜在的不兼容性 *
自有 ID: OTP-10647 辅助 ID: OTP-9892, OTP-10336
之前(在 R15 中)提出的调度程序唤醒策略现在默认使用。此策略不如之前的策略那样快地忘记以前的过载。
此更改意味着系统特性的变化。最值得注意的是:当小过载出现然后又反复消失时,系统会比以前更长时间地愿意唤醒调度程序。因此,系统中的计时也会发生变化。
仍然可以通过将 +sws legacy 命令行标志传递给
erl
来启用之前的策略。自有 ID: OTP-10661 辅助 ID: OTP-10033
添加了
erl
的 +stbt 命令行参数。此参数可用于尝试设置调度器绑定类型。如果失败,将使用未绑定的调度器。工单号: OTP-10668
支持控制台中的 ANSI
Unix 平台将不再过滤发送到 ttsl 驱动程序的控制序列,从而在控制台中启用 ANSI 和颜色。(感谢 Pedram Nimreezi)
工单号: OTP-10678
添加 file:allocate/3 操作
此操作允许预先分配文件空间。它仅在支持此类操作的系统上成功。(感谢 Filipe David Manana)
工单号: OTP-10680
在使用 GCC 时,将
-Wreturn-type
警告视为错误(感谢 Tuncer Ayaz)工单号: OTP-10683
实现 ./otp_build configure --enable-silent-rules
使用静默规则,make 的输出不那么冗长,并且更容易发现编译警告。静默规则默认禁用,可以通过 make V=0 和 make V=1 随意禁用或启用。(感谢 Anthony Ramine)
工单号: OTP-10726
在 Windows 上,对所有文件操作使用共享标志。感谢 Filipe David Borba Manana。
工单号: OTP-10727
Make/fakefop 调整。感谢 Tuncer Ayaz 和 Sebastian Rasmussen。
工单号: OTP-10733
如果构建运行时系统时启用了线程支持,则运行时系统现在默认使用 10 个异步线程。
这将防止长时间阻塞的文件操作长时间阻塞调度器线程,这可能是有害的。除了文件操作外,它还会影响用户实现的驱动程序在异步线程池上调度的其他操作。
异步线程的数量可以通过使用
+A
命令行参数来控制 erl。当运行某些离线工具时,您*可能*希望禁用异步线程,但通常建议您*不要*这样做。相反,您可能希望增加使用的异步线程的数量。与之前的默认值相比,此更改意味着系统特性的变化。系统的整体响应能力将得到提高。在异步线程池上调度的操作将获得更高的延迟。这些操作的吞吐量可能会增加或减少,具体取决于操作的类型以及它们的调度方式。在文件操作的情况下,吞吐量很大程度上取决于 Erlang 应用程序访问文件的方式。对不同文件的多个并发访问有可能增加吞吐量。
工单号: OTP-10736
默认的读取器组限制已从 8 增加到 64。可以使用 erl 的
+rg
命令行参数设置此限制。默认值的此更改将减少在调度器和逻辑处理器数量在 8 到 64 之间时,使用
read_concurrency
选项的 ETS 表上的锁争用,但会增加内存消耗。有关更多信息,请参阅 erl 的+rg
命令行参数的文档。工单号: OTP-10737
新的 BIF float_to_list/2 解决了 float_to_list/1 的问题,即在格式化浮点数时不允许指定小数点后的位数(感谢 Serge Aleynikov)。
工单号: OTP-10752
在外部格式和 VM 的内部表示中,对 Unicode 原子提供有限的支持。这是一个准备性功能,旨在支持与可能创建 Unicode 原子的 Erlang/OTP 未来版本的通信。
工单号: OTP-10753
提高了 ETS 中
write_concurrency
选项的潜在并发性。内部表锁的数量已从 16 增加到 64。这使得两个并发进程写入同一表时发生冲突并因此序列化的可能性降低了四倍。代价是使用 write_concurrency 的表增加了恒定的内存占用。每个插入记录的内存消耗不受影响。如果write_concurrency
与read_concurrency
结合使用,则增加的占用空间可能会特别大。工单号: OTP-10787
Erts 5.9.3.1
已知 Bug 和问题
如果不存在 heart 且未设置 ERL_CRASH_DUMP_SECONDS,则创建 erl_crash.dump(行为已更改)。
如果存在 heart 且未设置 ERL_CRASH_DUMP_SECONDS,则不创建 erl_crash.dump(行为未更改)。
考虑到如果 beam 在没有 heart 的情况下运行,此更改会将行为恢复到 R15B02 的默认行为。
工单号: OTP-10602
Erts 5.9.3
已修复的 Bug 和故障
修复 OpenBSD 中的链接。(感谢 Matthew Dempsky)
工单号: OTP-10395
修复了导致即使检测到健康的 gcc 原子操作或 libatomic_ops 也使用回退原子操作的 Bug。
工单号: OTP-10418
确保在要求时提供 'erl_crash.dump'。这将更改 erl_crash.dump 的行为。
* 不设置 ERL_CRASH_DUMP_SECONDS 现在会在崩溃时立即终止 beam,而不写入崩溃转储文件。
* 将 ERL_CRASH_DUMP_SECONDS 设置为 0 也会在崩溃时立即终止 beam,而不写入崩溃转储文件,即与不设置 ERL_CRASH_DUMP_SECONDS 环境变量相同。
* 将 ERL_CRASH_DUMP_SECONDS 设置为负值将使 beam 无限期地等待崩溃转储文件写入。
* 将 ERL_CRASH_DUMP_SECONDS 设置为正值将使 beam 等待那么多秒以写入崩溃转储文件。
如果 heart 正在运行,则正值将为 beam 和 heart 设置重启的警报/超时。
* 潜在的不兼容性 *
工单号: OTP-10422 辅助工单号: kunagi-250 [161]
修复了 Windows 安装程序中未包含 MSVRT100.dll 的 Bug。
工单号: OTP-10481
在表达式
<<Bin/binary,...>>
中,如果Bin
是大小不是 8 的倍数的位串,则不会生成异常,或生成不正确的异常。(感谢 Adam Rutkowski 报告此 Bug。)工单号: OTP-10524
运行时系统在调度端口任务时可能会崩溃。端口任务的调度是由于触发了外部 I/O 事件、触发了驱动程序超时或通过分配通道发送了数据。
工单号: OTP-10556
erlang:memory(ets)
错误地将每个 ETS 表主结构的大小计算了两次。工单号: OTP-10558
修复了为 Solaris 生成的文件 hipe_amd64_bifs.S 中的编译错误。
工单号: OTP-10577
process_info/2 的错误规范可能导致错误的 Dialyzer 警告。该规范已更正。
工单号: OTP-10584
在极少数情况下,如果执行追加位语法指令时调用了垃圾回收器,则 VM 可能会崩溃。症状是在函数 erts_bs_append 中重新分配内存时出现核心转储。垃圾回收器 Bug 现在已更正。
工单号: OTP-10590
改进和新功能
改进了在嵌入式 ppc 环境中构建和测试的支持。
工单号: OTP-10265 辅助工单号: kunagi-159 [daf97f67-5724-4812-a5b6-7e86990133d2-1]
由于 Windows 上的竞争条件,有时在打印到标准输出并立即终止 Erlang 时,不会打印所有数据。模拟器现在会等待打印所有数据后再退出。
工单号: OTP-10325 辅助工单号: kunagi-166 [dd72d0e2-3e76-4a51-8b56-7564e24eecae]
减少了因未完成的内存释放作业而唤醒睡眠调度程序的频率。
工单号: OTP-10476 辅助工单号: OTP-10162
文档中添加了关于滥用本机函数和驱动程序的危险的更清晰的警告。
工单号: OTP-10557
Erts 5.9.2
已修复的 Bug 和故障
修复了 erl_prim_loader 在处理主存档时的错误。已更正以下错误
- 如果主存档名为“xxx”,则同一目录中名为“xxxyyy”的文件将被解释为存档中名为“yyy”的文件。
- erl_prim_loader 没有正确为主存档和其中的文件创建和规范化绝对路径,因此除非使用完全相同的路径,否则找不到存档中的文件。例如,如果 escript 作为 /full/path/to/xxx 启动,则找不到“./xxx/file”,因为 erl_prim_loader 会尝试将 /full/path/to/xxx 与 /full/path/to/./xxx 匹配。../ 也存在同样的问题。
- 根据主存档的构建方式,erl_prim_loader:list_dir/1 有时会在文件列表中返回一个空字符串。这是一个表示存档顶层目录的虚拟元素。此元素已删除。
感谢 Tuncer Ayaz 和 Shunichi Shinohara 的报告和共同编写更正。
工单号: OTP-10071
修复:添加 active once 和 true 以及不仅 active false 的端口 I/O 统计信息。
工单号: OTP-10073
64 位 Windows 安装程序未在正确的目录中查找 64 位版本的 Microsoft Visual C++ 2010 Redistibutable Package,因此如果安装了 32 位版本但未安装 64 位版本,反之亦然,则会做出错误的决定,即必须安装可再发行包。此 Bug 现已修复。此外,如果 Erlang 安装程序处于静默模式,则可再发行包的子安装程序现在以静默模式运行。
工单号: OTP-10096
当在路径中包含空格的位置安装分布式 Erlang 节点时,epmd 将无法自动启动。
工单号: OTP-10106
修复了一个或多或少无害的 Bug,该 Bug 有时会导致内存释放比预期延迟更长时间。
工单号: OTP-10116
修复了在 ARM 上运行 HiPE 时导致模拟器崩溃的 Bug。该 Bug 自 R15B 以来就存在。
工单号: OTP-10137
修复了关于 C 函数原型中空格的 Bug。(感谢 Richard O'Keefe。)
工单号: OTP-10138
更正了消息相关探针中的 dtrace pid 长度。(感谢 Zheng Siyao)
工单号: OTP-10142
更正了退出错误消息中的格式
确保显示的大小不为负数。(感谢 Michael Santos)
工单号: OTP-10148
修复了 escript/主存档重新加载
如果在将 escript/主存档文件添加到代码路径后,其 mtime 发生更改,则正确重新加载存档并更新缓存。(感谢 Tuncer Ayaz)
内部 ID:OTP-10151
文档修复:将 erlang:now/0 的链接改为 os:timestamp/0
有时,os:timestamp/0 比 erlang:now/0 更为合适。前者的文档有指向后者的链接;此补丁添加了另一个方向的链接,以使 os:timestamp/0 更明显。感谢 Magnus Henoch
内部 ID:OTP-10180
在重新获得焦点后,werl 窗口(在 Windows 上)中的光标可能会出现在错误的位置。现在已得到纠正。
内部 ID:OTP-10181
修复了在某些情况下可能导致具有
compressed
选项的 ETS 表中二进制数据损坏的错误。内部 ID:OTP-10182
修复了“巧妙”的 mktime 的使用
提交 1eef765 引入了回归(条件 _always_ 评估为 true),导致 erlang:localtime_to_universaltime/2 在 *BSD 平台上配置了没有 DST(即 UTC)时区的系统上停止工作:1> erlang:localtime_to_universaltime({{2012,1,1},{0,0,0}}, true). ** exception error: bad argument 感谢 Piotr Sikora
内部 ID:OTP-10187
将 DTrace 探针的主体重新定位到静态链接的 VM。
由于各种操作系统(在 DTrace 和 SystemTap 世界中)并非完全支持共享库中的 DTrace 探针(或 SystemTap 兼容模式探针),我们将这些探针重新定位到静态链接的虚拟机。这可以被视为由(仍然)实验性的功能污染了原始的 VM。但是
1. 此代码可以被 C 预处理器完全消除。 2. 将探针留在 dyntrace NIF 共享库中在太多平台上根本无法正常工作。非常感谢 Basho 的 Macneil Shonle 在我受伤的手指无法工作时提供的帮助。(注意:Solaris 10 和 FreeBSD 9.0-RELEASE 可能需要很长时间才能编译)
内部 ID:OTP-10189
修复了
ets:test_ms/2
中的一个错误,该错误在使用匹配规范中的'$_'
时可能导致模拟器崩溃。内部 ID:OTP-10190
向 file:read_link/1 提供长于操作系统 MAX_PATH 的文件名会导致所有平台上发生崩溃(分段错误/严重错误)。现在已得到纠正。
内部 ID:OTP-10200
如果 Perl 配置为将文件解释为 UTF-8 编码,则构建会在
make_preload
中崩溃。(感谢 Aaron Harnly 注意到这个问题。)内部 ID:OTP-10201
修复 erlc -MP 标志
由于 erlc.c 中的复制粘贴错误,-MP 标志具有与 -MG 相同的效果。作为一种解决方法,您必须传递 +makedep_phony 才能启用 MP 选项。此补丁使 -MP 按预期工作。
内部 ID:OTP-10211
允许混合 IPv4 和 IPv6 地址到 sctp_bindx
还允许绑定混合地址族,因为多宿主 sctp 套接字上的第一个地址必须使用 bind 绑定,而其余的地址则使用 sctp_bindx 绑定。至少 Linux 支持添加混合族的地址。即使在未定义 HAVE_SCTP 时,也使 inet_set_faddress 函数可用,因为我们使用它来查找绑定地址,以便能够混合 ipv4 和 ipv6 地址。感谢 Tomas Abrahamsson
内部 ID:OTP-10217
修复对闰秒感知时区的支持
erlang:universaltime_to_localtime 具有闰秒感知(自 2008 年起),但 erlang:localtime_to_universaltime 没有,这在配置了闰秒感知时区的系统上会给出令人惊讶的结果:1> erlang:universaltime_to_localtime({{2012,1,1},{0,0,0}}). {{2012,1,1},{0,0,0}} 2> erlang:localtime_to_universaltime({{2012,1,1},{0,0,0}}). {{2012,1,1},{0,0,24}} 并且完全破坏了 calendar:local_time_to_universal_time_dst:3> calendar:local_time_to_universal_time_dst({{2011,1,1},{0,0,0}}). [] 感谢 Piotr Sikora
内部 ID:OTP-10227
erlsrv:在 Windows 关闭时正常停止模拟器
当系统关闭时,Windows 将向服务控制处理程序发送 SERVICE_CONTROL_SHUTDOWN 事件。erlsrv 现在将调用 stop 操作,而不是忽略该事件。同样,Erlang 模拟器(及其 po 驱动程序)不得在控制台控制处理程序中接收到 CTRL_SHUTDOWN_EVENT 事件时退出。感谢 Jan Kloetzke
内部 ID:OTP-10228
修复文件重命名操作中的 dtrace 错误。
内部 ID:OTP-10234
修复驱动程序端口数据锁 (PDL) 的内存管理中的错误。在某些情况下,PDL 可能会在
ready_async
或async_free
回调被调用之前被释放。内部 ID:OTP-10249
改进和新功能
为锁计数器分析添加端口和挂起选项。(感谢 Rick Reed)
内部 ID:OTP-10051
减少了在 gen_tcp 通信中使用 active_once 选项时的延迟。
内部 ID:OTP-10055 辅助 ID:sto139
从 inet 中删除 bit8 选项支持
内部 ID:OTP-10056
现在可以通过调用 erlang:port_info(Port,os_pid) 来获得端口程序的 OS Pid。感谢 Matthias Lang 的原始补丁。
内部 ID:OTP-10057
修复 run_erl 中的 openpty 用法。
重新打开之前关闭的从属文件描述符可能会导致连接行为不正常。现在已得到纠正。
内部 ID:OTP-10076
删除所有与实验性混合堆实现相关的代码、文档、选项和诊断函数。
内部 ID:OTP-10105
内存释放的优化。
内部 ID:OTP-10162 辅助 ID:OTP-7775
进程锁定的优化。
内部 ID:OTP-10163
为 powerpc-dso-linux-gnu 添加了 xcomp 示例文件
内部 ID:OTP-10198
检测平台何时使用中间字节序双精度数,并在解码浮点数时考虑它。(感谢 Mike Sperber)
内部 ID:OTP-10209
Erts 5.9.1.2
修复的错误和故障
在使用 heart(erl -heart)且 HEAR_BEAT_TIMEOUT 小于默认值的 Linux 系统上,heart 可能会在 Erlang 运行正常后大约 298 到 497 天(取决于内核配置)后触发。这是由于 times(2) 系统调用的行为所致。现在,times(2) 的使用已替换为 clock_gettime(2) 和 CLOCK_MONOTONIC 时钟,从而产生更稳定的解决方案。Erlang VM 本身自 R12B 之前就已在 Linux 上使用 clock_gettime(2),因此这仅影响 heart 程序。
内部 ID:OTP-10111 辅助 ID:seq12075
Erts 5.9.1.1
修复的错误和故障
如果在编译时禁用运行时系统的线程支持(将
--disable-threads
传递给configure
),并且在启动运行时系统时传递了erl
的+A
命令行参数,则 driver_system_info() 会错误地声称运行时系统具有异步线程,即使它没有。由于此错误,文件驱动程序没有将任务拆分为较小的块,而是一次性完成整个任务,也就是说,调度器被 I/O 占用时间比预期长。
内部 ID:OTP-10059
改进和新功能
已实现一种新的调度器唤醒策略的建议。有关更多信息,请参阅 +sws 命令的文档。命令行参数
erl
。内部 ID:OTP-10033 辅助 ID:Seq12025
已添加一个用于配置调度程序线程的忙等待长度的开关。有关更多信息,请参阅 +sbwt 命令行参数
erl
的文档。内部 ID:OTP-10044 辅助 ID:Seq11976
错误修复 OTP-9281 引入的额外内存屏障在未启用
write_concurrency
选项的表上也无必要地使用。这可能会在某些硬件(例如 PowerPC)上不必要地降低没有write_concurrency
的 ETS 表的性能,而在其他硬件(例如 x86/x86_64)上根本不会影响性能。OTP-9281 (R14B03):使用
write_concurrency
选项的 ETS 表可能会进入内部不一致的状态。内部 ID:OTP-10048 辅助 ID:OTP-9281
Erts 5.9.1
修复的错误和故障
erlang:system_profile
在观察可运行的进程时错误地分析了分析器进程。这已得到纠正。内部 ID:OTP-9849
调用 trace_info/2 请求有关具有本地代码的函数的信息可能会导致运行时系统崩溃。
内部 ID:OTP-9886
减少 erts_garbage_collect 中的 smp 锁定时间范围(感谢 Jovi Zhang)
内部 ID:OTP-9912
修复了 supervisor 行为文档中的拼写错误(感谢 Ricardo Catalinas Jiménez)
内部 ID:OTP-9924
更正了 registered 的拼写(感谢 Richard Carlsson)
内部 ID:OTP-9925
erts:删除未使用的变量(感谢 Jovi Zhang)
内部 ID:OTP-9926
修复了 ETS 中
compressed
选项和在 64 位机器上插入包含大整数(>2G)的项的错误。已发现会导致模拟器崩溃。(感谢 Diego Llarrull 提供的出色错误报告)内部 ID:OTP-9932
处理 /sys/devices/system/node 只能由 root 读取的 Linux 操作系统。回退到 /sys/devices/system/cpu 获取拓扑信息。
内部 ID:OTP-9978
当 escript 结束时,现在所有打印到标准输出和标准错误的内容都会在终端上输出。此错误已通过更改 erlang:halt/0,1 的行为来纠正,这应该可以解决其他类似 escript 的应用程序的相同问题,即当在 TTY 上打印并通过 erlang:halt/0,1 退出时,存储在输出端口驱动程序缓冲区中的数据会丢失。
BIF:s erlang:halt/0,1 已改进语义,并且有一个新的 BIF erlang:halt/2 来实现类似旧语义的功能。请参阅文档。
现在,带有整数参数的 erlang:halt/0 和 erlang:halt/1 将在退出虚拟机之前关闭所有端口并允许所有待处理的异步线程操作完成。以前,erlang:halt/0 和 erlang:halt(0) 只会等待待处理的异步线程操作,而不会关闭端口。而带有非零整数参数的 erlang:halt/1 甚至不会等待待处理的异步线程操作。
要大致恢复旧的行为,即在退出虚拟机时不等待端口和异步线程操作,可以使用带有整数作为第一个参数和包含 {flush,false} 的选项列表作为第二个参数的 erlang:halt/2。请注意,现在刷新不再依赖于退出代码,并且您不能只刷新异步线程操作,我们认为这无论如何都是一种奇怪的行为。
此外,erlang:halt/1,2 获得了一个新功能:如果第一个参数是原子 'abort',则虚拟机将中止并生成核心转储,如果操作系统允许。
内部 ID:OTP-9985
在 inet 驱动程序中添加了检查,以避免在尚未具有 IPv6 兼容套接字 API 的操作系统上构建。(感谢 Peer Stritzinger)
内部 ID:OTP-9996
修复了实际找到的 CPU 数量低于配置值时的错误。(感谢 Benjamin Herrenschmidt)
内部 ID:OTP-10004
在没有 SMP 支持且没有线程支持的情况下,运行时系统在没有工作时会错误地忙等待。此错误首次出现在
erts-5.9
中。内部 ID:OTP-10019
更正了 common_test、driver、erl_driver 和 windows 安装说明文档中的各种印刷错误。(感谢 Tuncer Ayaz)
内部 ID:OTP-10037
修复了由退出进程中的竞争条件引起的内存泄漏
内部 ID:OTP-10041
改进和新功能
添加
erlang:statistics(scheduler_wall_time)
以确保正确确定调度器利用率。测量调度器利用率比 CPU 利用率更可取,因为 CPU 利用率对实际的调度器/虚拟机使用情况的指示非常差。内部 ID:OTP-9858
ERTS 内部 API 改进。在某些情况下,由于此原因,所需的原子读取操作量已减少。
内部 ID:OTP-9922
来自 Scott Lystig Fritchie 的 DTrace 源代码补丁已集成到源代码树中。仍然不支持在生产环境中使用带有 dtrace 探针的虚拟机,但它可能是一个有价值的调试工具。使用 --with-dynamic-trace=dtrace(或 --with-dynamic-trace=systemtap)进行配置以创建启用 dtrace 探针的构建。有关文档和示例,请参阅 runtime_tools。
内部 ID:OTP-10017
已知错误和问题
enif_make_copy 可能会使 enif_inspect_binary 失效。
内部 ID:OTP-9828
Erts 5.9.0.1
修复的错误和故障
在运行时系统启动时,在 PowerPC 硬件上执行的
lwsync
指令的功能测试,如果不支持该指令,则会进入死循环。此错误是在 erts-5.9/OTP-R15B 中引入的。内部 ID:OTP-9843
在 Solaris 上执行的非 SMP 运行时系统上启用内核轮询时,I/O 事件可能会被永远延迟。当也与异步线程结合使用时,运行时系统在完成启动阶段之前会挂起。此错误是在 erts-5.9/OTP-R15B 中引入的。
内部 ID:OTP-9844
Erts 5.9
修复的错误和故障
通过 TCP 套接字和
erlang:decode_packet
来遵守 http 数据包解析的选项packet_size
。这使您可以接受大于默认设置的 HTTP 标头,还可以通过只接受您希望允许的长度的行来避免 DoS 攻击。为了保持一致性,数据包类型line
也遵守选项packet_size
。(感谢 Steve Vinoski)内部 ID:OTP-9389
更正了
lists
模块中的一些契约。内部 ID:OTP-9616
Unicode 非字符代码点 16#FFFE 和 16#FFFE 不允许使用
unicode
模块或位语法进行编码或解码。这与其他可以编码/解码的非字符 16#FDD0 到 16#FDEF 不一致。为了解决这种不一致性,现在可以对 16#FFFE 和 16#FFFE 进行编码和解码。(感谢 Alisdair Sullivan。)* 潜在的不兼容性 *
内部 ID:OTP-9624
当包含另一个文件时,使 epp 首先搜索当前文件的目录。这完成了 R11 中的一个部分修复,该修复仅适用于 include_lib()。(感谢 Richard Carlsson)
内部 ID:OTP-9645
修复了在进程独立环境中应用
enif_inspect_io_list_as_binary
时出现的内存泄漏。内部 ID:OTP-9668
代码中允许的 beam 捕获的数量不再是静态定义的,并且将根据其需要增长。
内部 ID:OTP-9692
在 heart 文档中添加了缺失的括号。
在参考手册的分布式部分添加了缺失的空格。
在文档的 HTML 版本中,这些空格对于分隔这些单词是必要的。
内部 ID:OTP-9693
修复了模块 erlang 文档样式:选项描述(感谢 Ricardo Catalinas Jiménez)
内部 ID:OTP-9697
在使用多个搜索字符串时,为 binary:match/3 指定范围会导致错误的返回值。现在已对此进行更正。
内部 ID:OTP-9701
如果多个线程同时尝试退出运行时系统,则运行时系统会崩溃。
内部 ID:OTP-9705
修复 erlang:process_flag/2 的文档
关于 process_flag(save_calls, N) 的小节有一个关于进程优先级的无关段落,该段落是从前面关于 process_flag(priority, Level) 的小节复制过来的。(感谢 Filipe David Manana)
内部 ID:OTP-9714
调用
erlang:system_flag(schedulers_online, N)
和/或erlang:system_flag(multi_scheduling, block|unblock)
可能会导致此功能使用的内部数据进入不一致的状态。发生这种情况时,会出现各种问题。此错误很难触发,因此希望没有人受到其影响。运行队列管理使用的自旋锁有时会受到严重争用。现在已重写此代码,并且已删除自旋锁。
内部 ID:OTP-9727
使用 libdlpi 获取物理地址(感谢 Trond Norbye)
内部 ID:OTP-9818
改进和新功能
现在可以将选项列表参数传递给
file:read_file_info/2, file:read_link_info/2
和file:write_file_info/3
并在调用中设置时间类型信息。有效选项为{time, local}, {time, universal}
和{time, posix}
。在posix
时间的情况下,不进行任何转换,这使得操作速度更快一些。内部 ID:OTP-7687
已实现许多内存分配优化。大多数优化减少了由于线程在内存分配和释放期间的同步而引起的争用。最值得注意的是
- 已重写调度器特定分配器实例中的内存管理同步,以使用无锁同步。
- 已重写调度器特定预分配器中的内存管理同步,以使用无锁同步。
- “mseg_alloc”内存段分配器现在使用调度器特定实例而不是一个实例。除了减少争用之外,这还确保内存分配器始终在 NUMA 系统上的本地 NUMA 节点上创建内存段。
内部 ID:OTP-7775
运行时系统使用的 ethread 原子内存操作 API 已扩展和改进。
ethread 库现在还对硬件功能(例如 SSE2 指令)的存在执行运行时测试,而不是要求在编译时确定这一点。
运行时系统中所有使用旧的已弃用原子 API 的地方都已替换为使用新的原子 API。在许多地方,此更改意味着放宽了使用的内存屏障。
内部 ID:OTP-9014
如果不支持 SCTP,gen_sctp:open/0-2 现在可能会返回 {error,eprotonosupport}
已实现 gen_sctp:peeloff/1 并创建了一个一对一套接字,现在也支持该套接字
* 潜在的不兼容性 *
内部 ID:OTP-9239
Sendfile 已添加到 file 模块的 API 中。如果该操作系统可用,sendfile/2 用于从文件中读取数据,并使用零复制机制将其发送到 tcp 套接字。
感谢 Tuncer Ayaz 和 Steve Vinovski 的原始实现
内部 ID:OTP-9240
将 enif_get_reverse_list 函数添加到 nif API。此函数应用于反转其他结构内部深处的小列表,使得在 Erlang 中进行反转不切实际。
内部 ID:OTP-9392
已删除已弃用的 concat_binary/1 BIF。请改用
list_to_binary
或iolist_to_binary/1
。* 潜在的不兼容性 *
内部 ID:OTP-9421
如果限制作业数,例如使用“
make -j6
”或“make -j10
”,则现在可以使用并行 make 构建 Erlang/OTP。由于缺少一些依赖项,目前“make -j
”不起作用。内部 ID:OTP-9451
现在,异常回溯中的行号和文件名信息作为 MFA 元组中的第四个元素包含在内。该信息将由 shell 美观地打印,并由
common_test
使用,以更好地指示测试用例的位置。* 潜在的不兼容性 *
内部 ID:OTP-9468
所有二进制常量过去都作为堆二进制处理(即,当发送到另一个进程时,将复制整个二进制文件)。大于 64 字节的二进制常量现在是 refc 二进制文件(即,当发送到另一个进程时,不会复制二进制文件中的实际数据)。
内部 ID:OTP-9486
如果比较浮点数和整数,则只有当浮点数据类型可以包含该整数时,才将整数转换为浮点数。否则,将浮点数转换为整数。
* 潜在的不兼容性 *
内部 ID:OTP-9497
添加 NIF 函数 enif_is_number
此函数允许轻松确定术语是否表示数字(整数、浮点数、小整数或大整数)。(感谢 Filipe David Manana)
内部 ID:OTP-9629
ERTS 内部系统阻塞功能已替换为用于阻塞系统的新功能。旧的系统阻塞功能存在争用问题和复杂性问题。新功能依靠运行时系统中新引入的无锁同步所需的线程进度跟踪功能。当不使用阻塞系统的功能时,几乎没有开销。这是因为用于跟踪线程进度的功能在那里并且无论如何都是需要的。
内部 ID:OTP-9631
引入了用于线程之间通信的 ERTS 内部、通用、多对一的无锁队列。多对一场景在 ERTS 中非常常见,因此将来可以在许多地方使用。目前,它用于调度某些作业和异步线程池,但计划将来有更多用途。
使用 driver_async 功能的驱动程序不再自动锁定到系统,可以像任何动态链接的驱动程序一样卸载。
就绪的异步作业的调度现在也会与其他作业交错进行。以前,所有就绪的异步作业都会一次性执行。
内部 ID: OTP-9632
元组函数(包含模块名和函数的二元组)现已正式弃用,并将在 R16 版本中删除。请改用 '
fun M:F/A
'。为了让您知道您的系统使用了元组函数,首次应用元组函数时,将会向错误日志发送警告。内部 ID: OTP-9649
更改了内部 BIF 调用约定。这将使代码更简单、更快,并允许 BIF 具有任意参数个数。
内部 ID: OTP-9662
在 Windows 上,运行时系统内部现在使用 Windows 原生的临界区作为互斥锁的实现。这是因为在极端争用情况下,它们的性能优于我们自己的实现。
内部 ID: OTP-9671
将一些 erl_nif 宏转换为内联函数。允许更好的编译时类型检查。(感谢 Tuncer Ayaz)
内部 ID: OTP-9675
添加了
+scl
命令行标志。它可以用于禁用调度器负载的压缩。有关更多信息,请参阅 erl 文档。内部 ID: OTP-9695
构建系统已更新,以便可以在没有 GCC 编译器的情况下在 Mac OS X Lion 系统上构建 Erlang/OTP。INSTALL 指南已更新,其中包含有关如何安装 GCC 编译器并使用它构建 Erlang/OTP 的说明,以便获得具有更好性能的运行时系统。
内部 ID: OTP-9712
加载模块时,系统过去会在整个加载过程中在单个调度器上运行。现在已更改为仅在将加载的代码插入系统表之前关闭系统,如果模块在繁忙的系统中加载,则会导致中断时间大大缩短。(由 Bob Ippolito 建议。)
内部 ID: OTP-9720
可以在不使用浮点异常 (FPE) 的情况下运行 HiPE。在缺乏可靠 FPE 的平台上很有用。与使用 FPE 的 HiPE 相比,浮点运算速度较慢。
内部 ID: OTP-9724
从 ERTS 版本 5.9 (OTP-R15B) 开始,运行时系统默认不会将调度器绑定到逻辑处理器。
如果 Erlang 运行时系统是将线程绑定到逻辑处理器的唯一操作系统进程,这将提高运行时系统的性能。但是,如果其他操作系统进程(例如另一个 Erlang 运行时系统)也将线程绑定到逻辑处理器,则可能会导致性能下降。在某些情况下,这种性能下降可能会很严重。因此,我们更改了默认设置,以便用户必须主动决定是否绑定调度器。
* 潜在的不兼容性 *
内部 ID: OTP-9726
已弃用
erlang:system_flag(scheduler_bind_type, _)
和erlang:system_flag(cpu_topology, _)
的使用,并计划在 erts-5.10/OTP-R16 中删除。有关更多信息,请参阅erlang:system_flag/2
的文档。* 潜在的不兼容性 *
内部 ID: OTP-9749
从 open_port 代码中删除了一个针对 Windows 错误的旧解决方法,open_port({spawn,...}...) 现在更快了。感谢 Daniel Goertzen。
内部 ID: OTP-9766
移除了在 32 位 Windows 上使用已弃用的 32 位 time_t。
内部 ID: OTP-9767
NIF
reload
机制已弃用。请勿将其用作生产系统的实时升级方法。它可能会在未来的版本中删除。它仍然可以作为开发功能使用,但每次使用时都会记录警告消息。* 潜在的不兼容性 *
内部 ID: OTP-9771
驱动程序接口已更改,以启用 64 位感知驱动程序。最重要的是,ErlDrvEntry 回调“call”和“control”的返回类型已扩大,这需要更改驱动程序,否则会导致模拟器崩溃。请参阅驱动程序手册中的 64 位驱动程序接口的重写。
因此,驱动程序 版本管理现在是强制性的。未使用版本管理编写的驱动程序或使用错误的主版本编译的驱动程序将不会被模拟器加载。
* 潜在的不兼容性 *
内部 ID: OTP-9795
消除对已弃用的 regexp 模块的使用
内部 ID: OTP-9810
Erts 5.8.5
已修复的错误和故障
已更正了几个关于常量二进制构造(例如 <<0:4294967295>>)的错误。根据二进制的实际大小和运行时系统的类型(32 位、半字、64 位),此类表达式可能会导致运行时系统崩溃或使加载程序拒绝加载模块。
内部 ID: OTP-9284
如果停止服务时未定义 StopAction,则 Erlsrv 实用程序无法停止 Erlang 机器。现在已更正此问题。
内部 ID: OTP-9344
由于 glibc 中的错误,运行时系统在尝试销毁互斥锁时可能会中止。此问题的修复已在 R14B02 中引入。但是,此修复并未解决问题。运行时系统现在将发出警告而不是中止。
内部 ID: OTP-9373 辅助 ID: OTP-9009
将 prim_file 中 DRV 宏中的原子替换为字符串
Dialyzer 的实验版本发现,在调用 erlang:open_port({spawn, Driver}, Portopts) 时,替换 prim_file 中 DRV 宏的原子最终会作为 Driver 参数传递。文档指出,此调用需要在此处使用字符串。
此更改也与 Kostis Sagonas 在提交 0f03b1e9d2bef3bc830c31a369261af4c5234727 中引入的更改一致。
内部 ID: OTP-9377
修复 epmd 文档中的拼写错误(感谢 Holger Weiß)
内部 ID: OTP-9387
修复半字模拟器上由 NIF API 从 64 位整数创建的错误整数项。(感谢 Paolo Negri 和 Paul Davis)
内部 ID: OTP-9394
修复因 select() 系统调用的错误参数而导致 vxworks 上
epmd
崩溃的问题。内部 ID: OTP-9427 辅助 ID: seq11855
ets:test_ms 函数在极少数情况下可能会截断错误消息。现在已更正此问题。
内部 ID: OTP-9435
修复与休眠和 HiPE 相关的错误(清除 F_HIBERNATE_SCHED 标志)
在 hipe_mode_switch 中也必须清除在 b7ecdcd1ae9e11b8f75e 中引入的 F_HIBERNATE_SCHED 标志。否则,运行 HiPE 代码的进程在休眠、唤醒然后陷入 BIF 时将不会重新调度。(感谢 Paul Guyot)
内部 ID: OTP-9452
修复 FreeBSD 拓扑检测代码中的错误(感谢 Paul Guyot)
内部 ID: OTP-9453
修复使用逻辑运算符 && 与常量操作数而不是按位 & 的问题(感谢 Cristian Greco)
内部 ID: OTP-9454
inet:如果 fd 与套接字域不匹配则报错
如果 IPv4 fd 作为 IPv6 套接字打开,则可能会发生意外行为。例如,如果打开 IPv4 UDP 套接字并作为 IPv6 套接字传递到 Erlang,则有效负载的前 3 个字节(对应于表示协议族的 1 个字节,设置为端口的 2 个字节)将被剥离。UDP 有效负载截断的原因发生在 inet_drv.c:packet_inet_input 中,当调用 inet_get_address 静默失败时,因为族设置为 PF_INET6,但缓冲区长度是 IPv4 结构 sockaddr_in 的大小。
(感谢 Andrew Tunnell-Jones 发现此错误和测试用例!)
内部 ID: OTP-9455
erts:使用联合来避免严格别名问题
使用联合进行指针类型转换,以避免使用 gcc-4.1 时出现有关严格别名违规的编译器警告。gcc >= 4.2 不会发出警告。erts:使 matrix_nif 适应 R14 erl_nif API 更改(感谢 Tuncer Ayaz)
内部 ID: OTP-9487
修复垃圾回收中的 64 位问题(感谢 Richard Carlsson)
内部 ID: OTP-9488
epmd:修复编译器警告
禁止显示有关忽略返回值的编译器警告。(感谢 Michael Santos)
内部 ID: OTP-9500
修复分布式参考手册中不存在的函数 (erlang:disconnect/1)(感谢 Fabian Król)
内部 ID: OTP-9504
记录 fdatasync -lrt 要求 (SunOS <= 5.10)(感谢 Tuncer Ayaz)
内部 ID: OTP-9512
让 epmd 忽略空的 ERL_EPMD_ADDRESS
如果环境变量 ERL_EPMD_ADDRESS 设置为空字符串,则 empd 的行为现在与 ERL_EPMD_ADDRESS 未设置时的默认行为相同。也就是说,在这种情况下,epmd 现在侦听所有可用的接口,而不是仅使用回环接口,这是因为 epmd 将回环地址添加到(在这种情况下为空的)通过 ERL_EPMD_ADDRESS 指定的地址列表中。
此外,如果 ERL_EPMD_ADDRESS 仅包含分隔符字符(逗号和空格),则 epmd 现在会忽略它。
这同样适用于 epmd 的 -address 选项。(感谢 Holger Weiß)
内部 ID: OTP-9525
删除 erl_compile 中的死代码(感谢 Tuncer Ayaz)
内部 ID: OTP-9527
添加 erlang:external_size/2 BIF
此 BIF 的第二个参数是一个选项列表。目前唯一允许的选项是 {minor_version, Version},其中 version 是 0(默认值)或 1。(感谢 Filipe David Manana)
内部 ID: OTP-9528
修复 64 位机器上的 enif_compare
在 64 位机器中,Sint 类型的大小为 8 个字节,而在 32 位机器中,其大小为 4 个字节。enif_compare 忽略了这一点,因此当 CMP 函数(返回 Sint 值)的结果不适合 4 个字节时,会返回不正确的值。(感谢 Filipe David Manana)
内部 ID: OTP-9533
实现或修复 -Werror 选项
如果启用了 -Werror 并且存在警告,则不会写入输出文件。还要确保错误/警告报告是一致的。(感谢 Tuncer Ayaz)
内部 ID: OTP-9536
在某些极少数情况下,我们在调度杂项操作时没有运行队列。现在已修复此问题。
内部 ID: OTP-9537
删除杂项编译器警告
内部 ID: OTP-9542
已更正 gen_sctp 中的两个错误:getopts/setopts,因此 send 也只能从套接字所有者调用,并且选项“linger”、“rcvbuf”和“sndbuf”是从错误的协议层读取的,因此 getopts 读取了错误的值。
内部 ID: OTP-9544
现在可以在 MacOS X Lion 上构建 Erlang/OTP。
内部 ID: OTP-9547
已更正 XML 文件。
内部 ID: OTP-9550 辅助 ID: OTP-9541
修复了受运行 cppcheck(1) 启发而出现的潜在错误(感谢 Christian von Roques)
内部 ID: OTP-9557
当辅助工作被排队到调度器时,可能会丢失调度器为了处理此工作而进行的唤醒。为了处理普通工作而进行的唤醒不受此错误的影响。该错误仅影响具有 SMP 支持的运行时系统,如下所示
- 某些 ETS 数据结构的释放可能会延迟。
- 在不使用 NPTL 线程库的 Linux 系统(通常是内核版本早于 2.6 的旧系统)和 Windows 系统上,来自终止端口程序的
{Port, {exit_status, Status}}
消息可能会延迟。也就是说,它仅影响已通过将exit_status
作为选项传递给open_port/2
启动的端口程序。
内部 ID: OTP-9567
处理加密密钥服务器功能中的罕见竞争
内部 ID: OTP-9586
改进和新功能
已添加类型和规范。
内部 ID: OTP-9356
新的分配器策略“地址顺序首次拟合”。可以更容易地清空内存载体,从而将内存真正释放回操作系统。
自有 ID:OTP-9424
新的
erlang:check_old_code/1
BIF 检查模块是否具有旧代码。自有 ID:OTP-9495
更新了一些 zlib 函数的文档和规范。
自有 ID:OTP-9506
检测 IRIX 上可用的 CPU
添加对查询运行 IRIX 的 SGI 系统上配置的和在线处理器数量的支持。(感谢 Holger Weiß)
自有 ID:OTP-9531
Erts 5.8.4
已修复的错误和故障
修复二进制和 iolist 溢出问题。通常,问题出现在长度计算中,结果会超过 (1 bsl 32 - 1)。
自有 ID:OTP-9118
在 Windows 上使用旧的 Erlang shell(即 erl 而不是 werl)并执行多次 init:restart 操作最终会导致 VM 挂起。现在不会出现这种情况了。
自有 ID:OTP-9139
删除将 Erlang 项打印到缓冲区时的递归 C 代码,避免了可能导致 VM 崩溃的堆栈溢出。
自有 ID:OTP-9140
gen_tcp 中的 send_timeout 选项在主动模式或使用 {active,once} 选项时无法正常工作。现在已更正。
自有 ID:OTP-9145
修复了文档中的各种拼写错误(感谢 Tuncer Ayaz)
自有 ID:OTP-9154
删除调用某些 BIF 后可能出现的重复堆栈条目。
自有 ID:OTP-9163
消除了使用 run_erl 同时启动两个节点时的竞争。
自有 ID:OTP-9164
再次添加关于 .erlang 处理的文档(感谢 Gabor Liptak)
自有 ID:OTP-9189
删除 driver_entry 中的多余括号(感谢 Tuncer Ayaz)
自有 ID:OTP-9192
修复了一些错误的指针解引用(感谢 Cristian Greco)
自有 ID:OTP-9194
erts:删除未使用的变量(感谢 Tuncer Ayaz)
自有 ID:OTP-9205
删除了
init:get_args/0
的文档。init:get_args/0
本身已在 R9C 中弃用,并在 R12B 中删除。(感谢 Eric Pailleau。)自有 ID:OTP-9209
允许用户指定 epmd 绑定的 IP 地址
现在用户可以指定 epmd 绑定的 IP 地址,可以通过 epmd 的新“-address”选项,或者(如果未使用该选项)通过设置环境变量 ERL_EPMD_ADDRESS。可以使用逗号分隔的列表指定多个地址。如果回环地址不在此列表中,它将隐式添加,以便守护进程可以被交互式 epmd 进程查询。(感谢 Holger Weiß)
自有 ID:OTP-9213
epmd:在本地访问检查中包含主机地址
在 FreeBSD jail 中,与 localhost 的连接的源地址和目标地址会更改为 jail 的 IP 地址。对于来自主机 IP 地址本身的连接(例如,源地址和目标地址匹配),将其视为本地连接以进行访问控制检查。(感谢 Michal Santos 和 diogunix.com 的 Tom)
自有 ID:OTP-9214
修复 net_kernel:epmd_module 返回的列表
当使用 epmd_module 标志时,net_kernel 的函数 epmd_module 返回一个列表而不是原子。(感谢 Markus Knofe)
自有 ID:OTP-9215
修复 epmd 的 dbg_perror() 输出
dbg_perror() 函数现在将当前的 errno 值传递给 dbg_gen_printf()。这解决了 errno 在 dbg_gen_printf() 函数中使用(打印相应的错误消息)时已被重置为零的问题。(感谢 Holger Weiß)
自有 ID:OTP-9223
heart:删除附加到 heart 命令的垃圾
heart:get_cmd/0 的文档说明,如果命令被清除,则返回一个空字符串。get_cmd/0 返回 2 个额外的字节:1 个字节用于尾随的 null,1 个字节来自 op(op 是一个无符号字符,并且在返回的缓冲区中为其分配了 2 个字节)。(感谢 Michael Santos)
自有 ID:OTP-9224
file:修复读取压缩文件时的挂起
当读取到压缩文件的末尾时,gzio 驱动程序会进入无限循环。报告人:Alex Morarash(感谢 Michael Santos)
自有 ID:OTP-9245
消除 gcc 4.5.2 中的别名警告
自有 ID:OTP-9250
无符号整数可能在错误消息中溢出(感谢 Michael Santos)
自有 ID:OTP-9251
驱动程序名称应该是字符串,而不是原子
自有 ID:OTP-9253
driver_entry:删除多余的括号并修复拼写错误(感谢 Tuncer Ayaz)
自有 ID:OTP-9254
修复 erl_exit 消息中的格式说明符
通过使用无符号整数说明符修复了一条错误消息,如 @metabrew 的推文所示:“#erlang VM 崩溃,出现“找不到下一个堆大小:-2090496108,偏移量 0”,突然分配了所有可用的 RAM”
还更正了 bif.c 中类型错误的字符串格式。(感谢 Michael Santos)
自有 ID:OTP-9262
net_drv:删除未使用的 tcp 请求 id inet_drv:删除多余的赋值(感谢 Tuncer Ayaz)
自有 ID:OTP-9263
教 run_erl 使用 RUN_ERL_DISABLE_FLOWCNTRL 来禁用流控制
如果意外地按下 Ctrl-S(而不是 Ctrl-D 来分离),流控制可能会导致 beam 进程出现不必要的行为,整个 beam 可能会被阻塞。
通过设置环境变量 RUN_ERL_DISABLE_FLOWCNTRL,使其可以关闭流控制来解决此问题。(感谢 Jonas Faklkevik)
自有 ID:OTP-9270
已修复以下因缺少内存屏障而导致的错误
- 使用
write_concurrency
选项的 ETS 表可能会进入内部不一致的状态。 - 使用
ordered_set
选项的 ETS 表可能会进入内部不一致的状态。 - 在使用
libatomic_ops
API 构建时(即,将--with-libatomic_ops=PATH
传递给configure
)和 tilera atomics API(即,为 tilera 芯片构建时)添加了一些内存屏障。请注意,这些错误是由于错误地使用 API 而导致的,而不是 API 的实现中。在使用这些 API 时,存在以下错误- BIF
erlang:ports/0
可能会返回错误的结果。 - 在代码加载期间或设置跟踪期间阻塞其他线程的线程可能会读取无效数据。
- ETS 表的固定可能会进入内部不一致的状态。
- BIF
自有 ID:OTP-9281
- 使用
修复了使用部分绑定的键执行
select/match
时 ETS ordered_set 的半字错误。自有 ID:OTP-9292
修复了
code:is_module_native
中的错误,该错误导致删除的模块崩溃。自有 ID:OTP-9298
调用
driver_async_cancel()
可能会导致调度程序线程进入永恒循环而不执行任何有用的工作。(感谢 Anders Ramsell)自有 ID:OTP-9302
改进和新功能
新的
enif_is_exception function
,允许 NIF 确定ERL_NIF_TERM
是否表示异常。(感谢 Steve Vinoski)自有 ID:OTP-9150
一个进程被另一个进程垃圾回收可能会在另一个调度程序上被调度。这会阻止此调度程序执行任何有用的工作,直到垃圾回收完成。这种情况要么是由于显式调用
garbage_collect/1
BIF,要么是由于代码加载的一部分垃圾回收。像这样被垃圾回收的进程现在在垃圾回收完成之前不会被调度。自有 ID:OTP-9211
删除 prim_file:drv_command/3 中不必要的验证副本(感谢 Tony Rogvall)
自有 ID:OTP-9276
Windows 上的符号链接处理已稍作更新,以更一致地映射错误条件并正确读取在 Erlang 环境之外创建的目录链接。
自有 ID:OTP-9279
由于 OpenSSL 和 Erlang/OTP 版本之间的标准库 DLL 不匹配,现在 OpenSSL 在 Windows 上静态链接到 crypto 驱动程序。这修复了在所有 Windows 版本上将 Erlang 作为服务运行时启动 crypto 的问题。
自有 ID:OTP-9280
半字仿真器内存处理改进
- 更多的内部内存结构已能够使用“高”内存,不再受限于仍适用于所有进程堆数据的 4Gb 限制。
- 修复了由 32 位计数器溢出导致的
erlang:memory()
中的错误值。 erlang:memory()
中新的计数器low
,用于汇总所有受 4Gb 限制的内存。
自有 ID:OTP-9291 辅助 ID:seq11841
现在可以使用命令行覆盖未记录和不支持的 ERL_version_FLAGS(例如 ERL_R14B03_FLAGS)环境变量中设置的值(类似于 ERL_AFLAGS)。
自有 ID:OTP-9297
Erts 5.8.3.2
已知错误和问题
修复了
ets:select_delete
中ordered_set
的半字仿真器错误,该错误导致仿真器崩溃。自有 ID:OTP-9258 辅助 ID:seq11836
Erts 5.8.3.1
已修复的错误和故障
在纯 64 位平台上,Ets 表类型 ordered_set 可能会错误地排序大的整数键。现在已更正。
自有 ID:OTP-9181
在将进程放入运行队列之前,进程的状态被不必要地设置为等待。在 OTP-R14B01 之前,此错误是无害的。在 OTP-R14B02 中,
erlang:hibernate/3
已修复 (OTP-9125)。在引入 OTP-9125 之后,以前无害的进程状态错误有时会导致来自process_info()
的错误 badarg 异常。OTP-9125 还引入了对进程状态字段的线程不安全访问,现在也已修复。
* 与 noxs 的不兼容 *
自有 ID:OTP-9197
Erts 5.8.3
修复的错误和故障
现在,在 Windows 上,滚动滚轮可以滚动 werl 窗口。
自有 ID:OTP-8985
一些格式错误的分布消息可能导致 VM 崩溃,现在已对此进行更正。
自有 ID:OTP-8993
OS 函数 getifaddrs() 在某些地址字段(例如 PPP 和隧道设备)中可以返回 NULL,这会导致模拟器段错误。此错误现已更正。
自有 ID:OTP-8996
表达式 <<A:0>> 将始终生成一个空二进制文件,即使
A
不是整数也是如此。已更正为如果A
的类型无效,则会引发badarg
异常。(感谢 Zvi。)自有 ID:OTP-8997
修复了一个可能在删除 ETS 表时导致模拟器崩溃的错误。还修复了达到允许的最大 ETS 表数量时的资源泄漏问题。
自有 ID:OTP-8999
exit/2
BIF 中的一个错误可能会导致模拟器崩溃。自有 ID:OTP-9005
由于 glibc 中的一个错误,运行时系统在尝试销毁互斥锁时可能会中止。现在,运行时系统将发出警告而不是中止。
自有 ID:OTP-9009
epmd 中的一个错误可能会在 listen() 调用失败时产生奇怪的行为。现在,感谢 Steve Vinoski,此问题已得到纠正。
自有 ID:OTP-9024
设置 file_info 时,win32_driver 现在将正确设置访问时间和修改时间。以前,这些实体被交换了。
自有 ID:OTP-9046
如果不支持调度器的绑定,或者如果 CPU 拓扑不存在,则将调度器绑定类型设置为
unbound
会失败。即使文档声明可以将绑定类型设置为unbound
。自有 ID:OTP-9056 辅助 ID:Seq11779
崩溃转储中修复了两个问题:定时器的剩余时间现在显示为无符号整数,并且不再包含有序集合 ETS 表的内容。
自有 ID:OTP-9057
VM 在某些情况下可能无法设置 IP_TOS 和 SO_PRIORITY,原因要么是套接字以打开的文件描述符的形式提供,要么是默认情况下 SO_PRIORITY 设置得高于用户可以显式设置的值。现在已处理这些情况。
自有 ID:OTP-9069
MacOS X 上的 Wx 在 stderr 上生成关于某些 cocoa 函数未从“主线程”调用的抱怨。现在已对此进行纠正。
自有 ID:OTP-9081
修复 driver_entry(3) 中的几个拼写错误(感谢 Tuncer Ayaz)。
自有 ID:OTP-9085
提到“-detached”暗示“-noinput”
澄清如果给定“-detached”标志,则指定“-noinput”是不必要的。(感谢 Holger Weiß)
自有 ID:OTP-9086
修复了调用代码未加载的函数时(通过代码检查发现)的潜在问题。
自有 ID:OTP-9095
模拟器可能会进入不检查 I/O 的状态。
自有 ID:OTP-9105 辅助 ID:Seq11798
尝试创建超过 2Gb 的二进制文件(例如使用
term_to_binary/1
)将导致模拟器崩溃,并尝试分配大量内存。(感谢 Jon Meredith。)自有 ID:OTP-9117
修复在启用 HiPE 的模拟器上的 erlang:hibernate/3(感谢 Paul Guyot)
自有 ID:OTP-9125
改进和新功能
从本版本开始,以前处于实验阶段的半字模拟器现在已正式发布。可以通过向
configure
脚本提供--enable-halfword-emulator
选项来启用它。半字模拟器是一个 64 位应用程序,但对 Erlang 进程中的所有数据使用半字(32 位字),因此使用更少的内存并且比标准的 64 位模拟器更快。所有 BEAM 代码和所有进程的所有进程数据的总大小限制为 4Gb,但 ETS 表和堆外二进制文件仅受可用内存量的限制。
自有 ID:OTP-8941
运行时系统内部引入了 32 位原子内存操作,现在在适当的情况下使用。以前只有字大小的原子内存操作可用。32 位原子内存操作略微减少了内存消耗,并且在 64 位运行时系统上略微提高了性能。
自有 ID:OTP-8974
改进了在轮中查找定时器条目和删除定时器的性能。
自有 ID:OTP-8990
通过减少写入访问期间所需的原子内存操作量,优化了对 ETS 表的写入访问。
自有 ID:OTP-9000
VM 中奇怪的 C 代码导致 gcc-4.5 的 -D_FORTIFY_SOURCE 选项反应不良。现在清理了代码,使其被 gcc-4.5 接受。
自有 ID:OTP-9025
已加载代码的内存占用量已有所减少(尤其是在 64 位 BEAM 机器中)。
自有 ID:OTP-9030
Erlang 函数允许的最大参数数量已从 256 个减少到 255 个,以便参数数量现在可以容纳在一个字节中。
自有 ID:OTP-9049
已将 Makefile 的依赖关系生成添加到编译器和 erlc。请参阅
compile
和erlc
的手册页。(感谢 Jean-Sebastien Pedron。)自有 ID:OTP-9065
Erts 5.8.2
修复的错误和故障
修复 format_man_pages,使其可以处理所有手册节,并删除各种手册页中的警告/错误。
自有 ID:OTP-8600
configure
命令行参数 --enable-ethread-pre-pentium4-compatibility 没有效果。现在,如果在构建计算机上需要,也会自动启用此选项。自有 ID:OTP-8847
Windows 2003 和 Windows XP pre SP3 有时根本无法启动 Erlang R14B VM,原因是 cpu 拓扑检测中存在错误。该错误仅影响 Windows,没有其他平台受到任何影响。该错误现已更正。
自有 ID:OTP-8876
64 位模拟器中的 HiPE 运行时可能会对 32 位结构字段进行 64 位写入。它碰巧在 Intel/AMD 处理器上是无害的。已更正。(感谢 Mikael Pettersson。)
自有 ID:OTP-8877
erl_drv_tsd_get() 和 enif_tsd_get() 中的一个错误可能会导致模拟器崩溃。这些函数目前在 OTP 中未使用。也就是说,崩溃仅发生在具有用户实现的 NIF 库或使用这些函数之一的驱动程序的系统上。
自有 ID:OTP-8889
使用另一个
CpuTopologyType
元素而不是文档化的原子defined
、detected
或used
调用erlang:system_info({cpu_topology, CpuTopologyType})
会导致模拟器崩溃。(感谢 Paul Guyot)自有 ID:OTP-8914
ERTS 内部 rwlock 实现可能会进入不一致的状态。这个错误很少被触发,但在高竞争期间可能会被触发。该错误是在 R14B (erts-5.8.1) 中引入的。
当在 ETS 表上使用
read_concurrency
选项时,最有可能触发该错误,该 ETS 表经常被执行大量写入和读取的多个进程访问。也就是说,在通常首先不希望使用read_concurrency
选项的情况下。自有 ID:OTP-8925 辅助 ID:OTP-8544
当卸载跟踪驱动程序时,跟踪到端口可能会导致模拟器崩溃。
自有 ID:OTP-8932
删除了 Windows 上 CancelIoEx 的使用,事实证明这会导致某些驱动程序出现问题。
自有 ID:OTP-8937
当找不到本机原子实现时使用的回退实现无法编译。(感谢 Patrick Baggett 和 Tuncer Ayaz)
自有 ID:OTP-8944
在极少数情况下,负载均衡期间使用的一些整数值可能会回绕,从而导致调度器之间的负载不均衡。
自有 ID:OTP-8950
windows VM 现在可以正确处理附加到大型文件(> 4GB)。
自有 ID:OTP-8958
已为支持它的 Windows 版本实现了 IPv6 地址的名称解析。已删除对 getaddrinfo() 函数的旧解析器标志 (AI_V4MAPPED | AI_ADDRCONFIG) 的使用,因为例如 FreeBSD 认为映射的 IPv4 地址是一个安全问题,并且地址配置标志的语义不确定。
自有 ID:OTP-8969
改进和新功能
顶部目录和 erts 目录中的
configure
脚本生成的帮助文本已对齐并清理。自有 ID:OTP-8859
当运行时系统的调度器少于逻辑处理器时,系统可能会获得不必要的大量读取器组。
自有 ID:OTP-8861
run_rel
已更新以支持 Solaris 的 /dev/ptmx 设备并加载必要的 STREAMS 模块,以便to_erl
可以提供键盘输入的终端回显。(感谢 Ryan Tilder。)自有 ID:OTP-8878
Erlang VM 现在支持 Unicode 文件名。此功能在默认情况下在强制使用 Unicode 文件名的系统(Windows 和 MacOSX)上启用,但也可以通过 '+fnu' 模拟器选项在其他系统上启用。但是,在默认情况下不使用的系统上启用 Unicode 文件名功能被认为是实验性的,不用于生产。除了 Unicode 文件名支持之外,还引入了“原始文件名”的概念,这意味着提供没有隐式 Unicode 编码转换的文件名。原始文件名以二进制形式提供,而不是列表。有关更多信息,请参阅 stdlib 用户指南和有关在 Erlang 中使用 Unicode 的章节。另请参阅 file 模块手册页。
* 潜在的不兼容性 *
自有 ID:OTP-8887
在
erlc
、dialyzer
、typer
、run_test
、heart
、escript
和erlexec
中阻止了缓冲区溢出。(感谢 Michael Santos。)
自有 ID:OTP-8892
运行时系统现在不太急于挂起通过分布发送消息的进程。为了提高吞吐量,分布缓冲区繁忙限制的默认值也从 128 KB 增加到 1 MB。
自有 ID:OTP-8901
现在可以在系统启动时配置分布缓冲区繁忙限制。有关更多信息,请参阅
erl
+zdbbl 命令行标志的文档。(感谢 Scott Lystig Fritchie)自有 ID:OTP-8912
为了减少锁争用,inet 驱动程序的内部缓冲区堆栈实现已被重写。
自有 ID:OTP-8916
新的 ETS 选项
compressed
,可以在以更重的表操作为代价的情况下启用更紧凑的存储格式。 为了测试和评估,可以使用erl +ec
强制对所有 ETS 表进行压缩。自有 ID:OTP-8922 辅助 ID:seq11658
现在有一个新的函数 inet:getifaddrs/0,它模仿 BSD 和 Linux 上的 C 库函数 getifaddrs(),报告主机上现有的接口及其地址。 这取代了未记录且不受支持的 inet:getiflist/0 和 inet:ifget/2。
自有 ID:OTP-8926
增加了对 FreeBSD 8 上 CPU 拓扑检测和调度程序绑定的支持。(感谢 Paul Guyot)
自有 ID:OTP-8939
修复了几个与 hibernate/3 和 HiPE 相关的错误。(感谢 Paul Guyot。)
自有 ID:OTP-8952
添加了对支持软链接和硬链接的 Windows 版本和文件系统的支持。
自有 ID:OTP-8955
win32 虚拟机现在链接为大地址感知。 这允许 Erlang VM 在 Windows 上使用高达 3 GB 的地址空间,而不是默认的 2 GB。
自有 ID:OTP-8956
Erts 5.8.1.2
已修复的错误和故障
修复了文档顶部索引生成器可以处理 Ericsson 内部应用程序组的问题。
自有 ID:OTP-8875
在嵌入模式下,调用
code:priv_dir/1
或code
中的其他函数的 on_load 处理程序会导致系统挂起。 由于crypto
应用程序现在包含一个调用code:priv_dir/1
的 on_loader 处理程序,因此在启动文件中包含crypto
应用程序会阻止系统启动。还扩展了
-init_debug
选项以打印有关正在运行的 on_load 处理程序的信息,以方便调试。自有 ID:OTP-8902 辅助 ID:seq11703
Erts 5.8.1.1
已修复的错误和故障
Windows 2003 和 Windows XP pre SP3 有时根本无法启动 Erlang R14B VM,原因是 cpu 拓扑检测中存在错误。该错误仅影响 Windows,没有其他平台受到任何影响。该错误现已更正。
自有 ID:OTP-8876
Erts 5.8.1
已修复的错误和故障
在某些 VM 版本中,将列表转换为浮点数时,非常小的浮点数会生成错误,现在已对此进行纠正,因此例如,list_to_float("1.0e-324")。 在所有 Erlang 版本中都返回 0.0。
自有 ID:OTP-7178
Windows Vista 和 Windows 7 文件系统虚拟化(使“旧式”Windows 程序在文件系统沙箱中执行)之前被意外地为 Erlang VM 打开。 现在已对此进行纠正,因此,例如,对 C:\Program Files\. 的写入。如果没有管理员权限,将会失败。
自有 ID:OTP-7405
修复了驱动程序中错误的 64 位整数项输出。 大型 64 位整数没有生成正确的 bignum,甚至可能导致模拟器崩溃。 仅影响使用 ERL_DRV_INT64 或 ERL_DRV_UINT64 的驱动程序,在 R13B03 中引入。
自有 ID:OTP-8716
已修复:inet:setopts(S, [{linger,{true,2}}]) 对于 SCTP 套接字返回 {error,einval}。 inet_drv 在检查选项大小时存在错误。
自有 ID:OTP-8726 辅助 ID:seq11617
修复了使用 --as-needed 标志链接 libm 的问题
在 Linux 上使用 "--as-needed" 链接器标志进行构建时,构建将会失败。 现在已经修复了此问题。
(感谢 Christian Faulhammer)
自有 ID:OTP-8728
gen_udp:connect/3 对于启用了 SCTP 的版本已损坏。 它没有像应有的那样检测到远程端错误。
自有 ID:OTP-8729
减少 bin vheap 大小计数中整数包装的风险。
vheap 大小序列现在将使用黄金比例,而不是加倍和斐波那契序列。
自有 ID:OTP-8730
包含
[]
作为键的 ETS ordered_set 可能会导致奇怪的事情发生,例如无限挂起的ets:select
。自有 ID:OTP-8732
文档中已将 reference() 替换为 ref()。
自有 ID:OTP-8733
当原生编译模块调用一个未加载的非原生编译模块,且该模块具有 on_load 函数时,代码加载后,导出条目将被破坏,因此下次从原生编译模块调用非原生编译模块时,模拟器会崩溃。 此错误现已修复。
自有 ID:OTP-8736
在 BSD 系统上运行的启用 HiPE 的 Erlang VM 有时会生成类似“Yikes! erts_alloc() 返回未对齐的地址 0x8016a512c”的消息。已修复。(感谢 Mikael Pettersson。)
自有 ID:OTP-8769
erts_poll()
中的竞争条件可能导致 I/O 轮询延迟。自有 ID:OTP-8773
从 Erlang 端口映射器守护程序 (epmd) 中删除了一些潜在的漏洞,并理顺了访问控制。 还删除了一些危险的接口,允许机器上的任何人强制取消注册其他节点。 这意味着 erl_interface 中的 ei_unregister/erl_unregister 接口不仅像以前一样容易出错和神秘,而且完全无效。 如果需要,可以恢复未经检查的节点取消注册的旧行为,有关详细信息,请参阅 epmd 文档。
* 潜在的不兼容性 *
自有 ID:OTP-8780
当在没有预构建的平台无关构建结果的源代码树中进行构建时,SSL 示例在以下情况下会失败
- 交叉构建。 这已通过在交叉构建期间不构建 SSL 示例来解决。
- 在 Windows 上构建。
自有 ID:OTP-8791
inet:getsockopt 对于 SCTP sctp_default_send_param 存在一个错误,未初始化所需的字段,从而导致随机答案。 现在已更正。
自有 ID:OTP-8795 辅助 ID:seq11655
即使“perfctr”Linux 内核扩展不可用,hipe_bifs:get_hrvtime/0 BIF 现在也始终返回真实值。 它过去返回虚拟值。(感谢 Mikael Pettersson。)
自有 ID:OTP-8798
调用具有
on_load
函数的本机代码编译模块可能会导致崩溃。(感谢 Mikael Pettersson。)自有 ID:OTP-8799
如果已加载本机编译的模块,则模拟器在写入崩溃转储时可能会崩溃。(感谢 Paul Guyot。)
自有 ID:OTP-8801
如果从调用 BIF 后的本机编译代码中调用垃圾回收器,则垃圾回收器可能会崩溃。(感谢 Paul Guyot。)
自有 ID:OTP-8821
删除了 binary:matches 中罕见的内存泄漏
自有 ID:OTP-8823
对于 HTTP 数据包模式下的套接字,如果标头中存在错误,则
gen_tcp:recv/2,3
的返回值将为{ok,{http_error,String}}
而不是{error,{http_error,String}}
,以便与ssl:recv/2,3
保持一致。* 潜在的不兼容性 *
自有 ID:OTP-8831
改进和新功能
现在记录了 ets:select_reverse/{1,2,3}。
自有 ID:OTP-7863
整数的外部格式已更改,以充分利用 INTEGER_EXT 的所有 32 位。 这是一项兼容的更改,因为旧代码可以读取完整的 32 位整数,但只能生成 28 位整数作为 INTEGER_EXT。
自有 ID:OTP-8540 辅助 ID:seq11534
已经重写了
ethread
库的大部分内容。ethread
库是 Erlang 运行时系统内部的、运行时系统本身使用的可移植线程库。最显著的改进是读取器优化的 rwlock 实现,它通过避免 rwlock 缓存行的乒乓操作,显着提高了多处理器系统上读锁定/读解锁操作的性能。读取器优化的 rwlock 实现用于运行时系统中已知经常被读锁定的各种 rwlock,并且可以在创建表时通过传递 {read_concurrency, true} 选项在 ETS 表上启用。有关更多信息,请参阅
ets:new/2
的文档。读取器优化的 rwlock 实现可以在启动运行时系统时进行微调。有关更多信息,请参阅erl
的 +rg 命令行参数的文档。还有一个新的 rwlock 实现,它没有针对读取器进行优化。两种实现都在争用期间交错读取器和写入器,而不是例如 NPTL (Linux) pthread rwlock 实现,它使用读取器优先或写入器优先策略。读取器/写入器优先策略是有问题的,因为它会使执行非优先操作的线程处于饥饿状态。
总的来说,新的 rwlock 实现在 ERTS 中的表现优于常见的 pthread 实现。 但是,在某些极度争用的情况下,情况并非如此。 这种严重的争用或多或少只能出现在 ETS 表上。 这是当多个进程同时对同一表执行大量的写入锁定操作时。 这种使用 ETS 的方式无论 rwlock 实现如何都是不好的,永远不会扩展,并且是我们强烈建议反对的。
新的 rwlock 实现依赖于原子操作。 如果找不到本机原子实现,则将使用回退解决方案。 使用回退意味着性能下降。 也就是说,现在比以前更重要的是使用本机原子实现来构建 OTP。
ethread
库包含 x86(32 位和 64 位)、powerpc(32 位)、sparc V9(32 位和 64 位)和 tilera(32 位)的本机原子实现。 在其他硬件上,如果存在,将使用 gcc 的内置原子内存访问支持。 如果未找到此类支持,configure
将警告没有可用的原子实现。ethread
库现在还可以使用libatomic_ops
库进行原子内存访问。 这使得 Erlang 运行时系统可以在比以前更多的平台上利用优化的本机原子操作。 如果configure
警告没有可用的原子实现,请尝试使用libatomic_ops
库。 当指定libatomic_ops
安装位置时,请使用 --with-libatomic_ops=PATHconfigure
命令行参数。libatomic_ops
库可以从以下网址下载:http://www.hpl.hp.com/research/linux/atomic_ops/ethread
库的 API 更改也导致 Erlang 运行时系统进行了修改。 由于它依赖于ethread
库,因此还完成了即将到来的“延迟释放”功能的准备工作。注意:为 x86 构建时,
ethread
库现在将使用首次出现在奔腾 4 处理器上的指令。 如果您希望运行时系统与较旧的处理器(追溯到 486)兼容,则需要在配置系统时传递 --enable-ethread-pre-pentium4-compatibilityconfigure
命令行参数。自有 ID:OTP-8544
当 TZ=UTC 时,erlang:localtime_to_universaltime({{2008, 8, 1}, {0, 0, 0}},true) 现在在所有 Unix 平台上行为一致。
最初由 Paul Guyot 在 erlang-bugs 邮件列表中报告了修复的问题
https://erlang.ac.cn/pipermail/erlang-bugs/2008-November/001077.html
自有 ID:OTP-8580
优化,每个 ETS 对象减少两个字来降低内存消耗。
自有 ID:OTP-8737
修复不支持的半字仿真器
自有 ID:OTP-8745
NIF 64 位整数支持;
enif_get_int64
、enif_get_uint64
、enif_make_int64
、enif_make_uint64
。自有 ID:OTP-8746
已调整消息中尾部数据的对齐方式。这是为了将来能够传递任何类型的数据作为尾部数据。
自有 ID:OTP-8754
已删除过时的/driver.h 头文件。自从 R8B 版本以来,它就已过时并被弃用。仍然包含 obsolete/driver.h 的驱动程序必须更新为包含 erl_driver.h。
* 潜在的不兼容性 *
自有 ID:OTP-8758
添加了 erlang:system_info(build_type),这使得根据运行时系统的构建类型选择驱动程序、NIF 库等更加容易。
现在可以为 valgrind 和/或调试构建加密的 NIF 库,作为单独的 NIF 库,如果运行时系统使用匹配的构建类型构建,则会自动加载这些库。
自有 ID:OTP-8760
进一步减少了 ETS 对象的内存需求。
自有 ID:OTP-8762
已删除损坏的 elib_malloc 备用内存分配器。
erlang:system_info(elib_malloc)
将始终返回false
,并且在 R15 中,erlang:system_info(elib_malloc)
将因badarg
异常而失败。自有 ID:OTP-8764
使用新参数
update_cpu_info
调用erlang:system_info/1
将使运行时系统重新读取并更新内部存储的 CPU 信息。有关更多信息,请参阅 erlang:system_info(update_cpu_info) 的文档。现在在少于 33 个逻辑处理器的 Windows 系统上会自动检测 CPU 拓扑。现在,在 Windows 上,如果调度器的数量至少等于配置的逻辑处理器数量,则运行时系统默认使用
default_bind
绑定类型将调度器绑定到逻辑处理器,支持调度器绑定,并且启动时可使用 CPU 拓扑。自有 ID:OTP-8765
在交叉编译重写期间(R13B03 中的 OTP-8323),Linux 系统上使用 NPTL 的 SMP ERTS 内部子进程等待线程被意外禁用。现在已重新启用。再次启用它会带来轻微的性能提升。
自有 ID:OTP-8774
epmd
过去会在启动时向系统日志生成一条消息,这可能会令人烦恼。现在已更改为仅在给定调试开关时才生成消息。(感谢 Michael Santos。)自有 ID:OTP-8775
现在可以在系统启动时调整调度器唤醒阈值。有关更多信息,请参阅
erl
的 +swt 命令行参数。自有 ID:OTP-8811
未经文档化的函数 inet:ifget/2 已得到改进,可在支持 getaddrinfo() 的平台(例如 BSD Unix)上返回接口硬件地址 (MAC)。请注意,它仍然不适用于所有平台,例如 Windows 或 Solaris,因此该函数仍然是未经文档化的。
还修复了 inet:ifget/2 和 inet:getservbyname/2 的缓冲区溢出和字段初始化错误。
感谢 Michael Santos。
自有 ID:OTP-8816
使用 gcc atomics 时针对 MIPS 的优化。(感谢 Steve Vinoski)
自有 ID:OTP-8834
计时器功能中的锁优化。
自有 ID:OTP-8835
已知错误和问题
修复 epmd 和构建环境以在 VxWorks 上构建
自有 ID:OTP-8838
Erts 5.8
修复的错误和故障
驱动程序线程(例如异步线程)在使用 端口数据锁 时,在查找驱动程序队列时会查看端口状态字段,而没有进行适当的锁定。
自有 ID:OTP-8475
交叉编译时不必要地禁用了
mmap()
的使用。在交叉编译时,
configure
参数--with-ssl
和--with-odbc
无缘无故地拒绝接受$erl_xcomp_sysroot
之外的库。configure
参数--with-odbc
没有正确处理值yes
。configure
参数--with-odbc
和--without-odbc
也已添加到配置帮助中。(感谢 Steve Vinoski 报告这些问题)
自有 ID:OTP-8484
当端口在没有 SMP 支持的运行时系统中注册了名称
RegName
时,调用 BIFunregister(RegName)
会导致运行时系统崩溃。(感谢 Per Hedeland 提供错误修复和测试用例。)自有 ID:OTP-8487
如果找到的逻辑处理器数量少于
sysconf(SC_NPROCESSORS_CONF)
报告的数量,则运行时系统会崩溃。自有 ID:OTP-8549
修复了导致启用异步线程的非 SMP 仿真器崩溃的内存管理错误。该错误首次出现在 R13B03 中。
自有 ID:OTP-8591 辅助 ID:seq11554
端口锁可能会过早销毁。
自有 ID:OTP-8612
如果
listen()
或accept()
中发生意外错误,则empd
程序可能会循环并消耗 100% 的 CPU 时间。现在,如果发生不可恢复的错误,epmd
将终止。(感谢 Michael Santos。)自有 ID:OTP-8618
当启用内核轮询时,在极少数情况下可能会发生活锁。问题由 Chetan Ahuja 报告,由 Mikael Pettersson 修复。
自有 ID:OTP-8632
Windows:关闭未读取所有数据而停止的程序的端口可能会导致调度器线程死锁。
自有 ID:OTP-8641
在 Cavium Octeon 处理器上的某些 Montavista Linux 组合上,某些与套接字相关的系统调用为错误返回了 -1 以外的其他数字。这导致了 inet_drv.c 中的核心转储。现在,代码可以解决此问题。
自有 ID:OTP-8654
erts_poll()
中缺少内存屏障可能会导致运行时系统无限期挂起。自有 ID:OTP-8658
ethr_rwmutex_tryrlock()
使用反向逻辑获取和拒绝获取锁。但是,该锁从未以线程不安全的方式获取。(感谢 JR Zhang 注意到此问题)自有 ID:OTP-8662
高度并行的 SMP 应用程序中注册/取消注册的极端组合可能会导致 VM 崩溃。已更正该错误。
自有 ID:OTP-8663
在 Windows 上,现在使用 FILE_SHARE_DELETE 打开文件,以更接近 Unix 语义。
自有 ID:OTP-8667
erlang:system_info(multi_scheduling)
有时会错误地返回enabled
,而它应该返回blocked
。自有 ID:OTP-8675
修复了导致
erlang:decode_packet
和enif_make_string
为大于 127 的 ASCII 值生成具有负字符值的错误字符串的错误。(感谢 Paul Guyot)自有 ID:OTP-8685
open_port/2
与spawn
和spawn_executable
选项可以包含{env,Env}
选项。在某些情况下,在 Unix 上取消设置变量将不起作用(通常情况下,如果取消设置的变量多于环境中实际存在的变量)。自有 ID:OTP-8701
通过调用 erlang:system_flag(cpu_topology, CPUTopology) 设置的用户定义的 CPU 拓扑未经过正确验证,最坏情况下可能会导致仿真器崩溃。只有在用户定义的 CPU 拓扑已经存在并且被重新定义时才会发生仿真器崩溃。
自有 ID:OTP-8710
改进和新功能
ERTS 用户指南中匹配规范的语法仅描述了匹配规范的跟踪方言。添加了 ETS 方言的非正式语法。
自有 ID:OTP-8086 辅助 ID:seq11333
实现了 EEP31(和 EEP9)中的模块二进制。
自有 ID:OTP-8217
新的 NIF API 函数
enif_make_new_binary
自有 ID:OTP-8474
在参考手册中,保护 BIF
is_boolean/1
(在 R10B 中引入)现已包含在保护中允许的 BIF 列表中。自有 ID:OTP-8477
添加了函数
zip:foldl/3
以遍历 zip 存档。添加了用于创建和提取 escript 的函数。请参阅
escript:create/2
和escript:extract/2
。已删除未经文档化的函数
escript:foldl/3
。使用更灵活的函数escript:extract/2
和zip:foldl/3
可以实现相同的功能。记录字段已使用类型信息进行注释。源代码文件已调整为适合 80 个字符,并且已删除尾随空格。
自有 ID:OTP-8521
具有多个级别括号的正则表达式可能会导致缓冲区溢出。已对此进行了更正。(感谢 Michael Santos。)
自有 ID:OTP-8539
erlang:decode_packet(httph_bin,..)
可能会返回损坏的标头字符串,甚至导致 VM 崩溃。这已得到修复。仅当标头名称未知且长度在 16 到 20 个字符之间时,才会发生在 32 位 VM 上。具有类似packet
选项的套接字不会受到此错误的影响。自有 ID:OTP-8548
新的 NIF 功能
- 从 NIF 或 NIF 创建的线程向任何本地进程发送消息 (
enif_send
) - 在 NIF 调用之间存储项 (
enif_alloc_env
,enif_make_copy
) - 使用用户定义的内存管理创建二进制项 (
enif_make_resource_binary
)
以及对 API 进行的一些不兼容的更改。有关更多信息,请参阅 erl_nif(3) 中的警告文本。
* 潜在的不兼容性 *
自有 ID:OTP-8555
- 从 NIF 或 NIF 创建的线程向任何本地进程发送消息 (
如果找不到“
fop
”程序(构建 PDF 文件所必需),则无论如何都可以构建 HTML 和手册页(还会创建没有真实内容的虚拟 PDF 文件)。(感谢 Tuncer Ayaz。)自有 ID:OTP-8559
定义宏时,点之前的右括号是强制性的。
* 潜在的不兼容性 *
自有 ID:OTP-8562
当名称冲突时,本地和导入的函数现在会覆盖自动导入的 BIF。R14 之前的行为是自动导入的 BIF 会覆盖本地函数。为了避免旧程序更改行为,以下内容将生成错误
- 在没有显式模块名称的情况下调用本地函数,该本地函数的名称与在 OTP R14A 之前存在(并自动导入)的自动导入的 BIF 的名称冲突。
- 显式导入一个函数,该函数的名称与在 OTP R14A 之前存在(并自动导入)的自动导入的 BIF 的名称冲突。
- 使用任何形式的旧编译器指令
nowarn_bif_clash
。
如果 BIF 是在 OTP R14A 或更高版本中添加或自动导入的,则用导入或本地函数覆盖它只会导致警告。
要解决冲突,你可以使用显式模块名称
erlang
来调用 BIF,或者你可以使用新的编译器指令-compile({no_auto_import,[F/A]}).
来删除特定 BIF 的自动导入,这将使所有对本地或导入的函数的调用在没有显式模块名称的情况下通过,而不会出现警告或错误。此更改使得将来可以添加自动导入的 BIF,而不会破坏或静默更改旧代码。但是,一些当前巧妙地利用旧行为或
nowarn_bif_clash
编译器指令的代码,可能需要更改才能被编译器接受。* 潜在的不兼容性 *
自有编号:OTP-8579
修复了 re 中的一个错误,该错误可能导致某些正则表达式匹配永远无法终止。(感谢 Michael Santos 和 Gordon Guthrie。)
自有编号:OTP-8589
erlang:open_port spawn 和 spawn_executable 指令可以包含
{env,Env}
指令,为产生的进程设置环境变量。一个错误阻止应用程序使用{env,Env}
设置值以 '=
' (等号)字符结尾的环境变量;尾部的等号被误认为是表示要从产生的进程的环境中清除环境变量。(感谢 Steve Vinoski。)自有编号:OTP-8614
现在,只能读取新创建的引用的
receive
语句经过特殊优化,使其执行时间恒定,而与进程的接收队列中的消息数量无关。此优化将有利于对gen_server:call()
的调用。(有关将优化的 receive 语句的示例,请参阅gen:do_call/4
。)自有编号:OTP-8623
添加了函数 file:advise/4 和 file:datasync/1。(感谢 Filipe David Manana。)
自有编号:OTP-8637
新的 NIF API 函数:
enif_make_atom_len
、enif_make_existing_atom_len
、enif_make_string_len
、enif_get_atom_length
、enif_get_list_length
、enif_is_list
、enif_is_tuple
(作者:Tuncer Ayaz)自有编号:OTP-8640
增加了对使用 gcc 的内置函数进行原子内存访问的支持。如果可用且 ERTS 中没有其他本机原子实现,则将使用此功能。
自有编号:OTP-8659
在没有本机原子实现的情况下实现原子回退时,使用的自旋锁数量已从 16 个增加到 1024 个。
自有编号:OTP-8660
在 Linux 上启用了写优先的 pthread 读/写锁。
自有编号:OTP-8661
如果调度器的数量至少等于配置的逻辑处理器数量,则运行时系统默认使用
default_bind
绑定类型将调度器绑定到逻辑处理器,支持调度器绑定,并且在启动时可以使用 CPU 拓扑。注意:如果 Erlang 运行时系统是唯一将线程绑定到逻辑处理器的操作系统进程,这将提高运行时系统的性能。但是,如果其他操作系统进程(例如另一个 Erlang 运行时系统)也将线程绑定到逻辑处理器,则可能会导致性能损失。如果是这种情况,建议使用 +sbtu 命令行参数或调用 erlang:system_flag(scheduler_bind_type, unbound) 来取消绑定调度器。
自有编号:OTP-8666
最近添加的 BIF erlang:min/2、erlang:max/2 和 erlang:port_command/3 现在会自动导入(正如它们最初的意图)。由于最近的编译器更改 (OTP-8579),对定义自己的 min/2、max/2 或 port_command/3 函数的旧代码的唯一影响是警告,本地函数仍将使用。可以使用源代码文件中的 -compile({no_auto_import,[min/2,max/2,port_command/3]}). 删除警告。
* 潜在的不兼容性 *
自有编号:OTP-8669 辅助编号:OTP-8579
file:open/2 有一个新的选项 'exclusive',它在支持的情况下使用 OS O_EXCL 标志以独占模式打开文件。
自有编号:OTP-8670
现在,binary_to_term/2 会自动导入。当且仅当模块具有同名的本地函数时,才会导致编译警告。
* 潜在的不兼容性 *
自有编号:OTP-8671
调整了调度器数据和运行队列的对齐方式。
自有编号:OTP-8673
调用时断点跟踪
- 向
erlang:trace_pattern/3
引入call_time
选项。此选项可以在启用调用跟踪的进程执行的代码上启用调用时断点跟踪。调用时跟踪存储每个启用此跟踪模式的函数的调用次数和花费的时间。可以使用erlang:trace_info/2
检索信息。 - 为 BpData 添加调度器数组。为了解决多个调度器不断更新 bp 数据轮头的指针的问题,现在每个调度器都有自己的轮入口点。无需获取锁即可更新此头指针。
教调用计数跟踪使用原子操作
- 调用计数先前使用全局锁来访问和写入断点中的计数器。现在已改为原子操作。
- 此更改将使调用计数跟踪和 cprof 在增加调度器数量时更好地扩展。
自有编号:OTP-8677
- 向
eprof
已在 Erlang 虚拟机中重新实现,现在速度更快(即,减少了对正在测量的代码的减速),并且扩展性更好。在测量中,我们发现与旧的 eprof 相比,速度提高了 6 倍(对于仅使用一个调度器/核心的顺序代码)到 84 倍(对于使用 8 个核心的并行代码)。注意:
eprof
的 API 已清理和扩展。请参阅文档。* 潜在的不兼容性 *
自有编号:OTP-8706
Erts 5.7.5.2
已知错误和问题
已更正 gen_sctp 中的两个错误:getopts/setopts,因此 send 也只能从套接字所有者调用,并且选项“linger”、“rcvbuf”和“sndbuf”是从错误的协议层读取的,因此 getopts 读取了错误的值。
内部 ID: OTP-9544
Erts 5.7.5.1
修复的错误和故障
驱动程序线程(例如异步线程)在使用 端口数据锁 时,在查找驱动程序队列时会查看端口状态字段,而没有进行适当的锁定。
自有 ID:OTP-8475
当端口在没有 SMP 支持的运行时系统中注册了名称
RegName
时,调用 BIFunregister(RegName)
会导致运行时系统崩溃。(感谢 Per Hedeland 提供错误修复和测试用例。)自有 ID:OTP-8487
修复了导致启用异步线程的非 SMP 仿真器崩溃的内存管理错误。该错误首次出现在 R13B03 中。
自有 ID:OTP-8591 辅助 ID:seq11554
Erts 5.7.5
修复的错误和故障
修复了具有损坏大小字段的压缩项上的
binary_to_term
崩溃。自有编号:OTP-8336
当使用
erlang:system_flag(multi_scheduling, block)
时,进程和/或端口可能会在阻塞的调度器上被卡住。当使用
erlang:system_flag(schedulers_online, SchedulersOnline)
减少在线调度器时,进程和/或端口可能会在离线调度器上被卡住。自有编号:OTP-8342
如果
mc.exe
和rc.exe
的路径包含空格,则现在可以在 Windows 上构建。README.win32 文件已更新,其中包含有关使用 Visual Studio 2008 构建的一些信息。(感谢 Andrew Thompson。)自有编号:OTP-8345
现在,EPMD 正确处理了可以在 ALIVE2_REQ 请求中给出并在 PORT2_RESP 响应中检索的额外数据字段。(感谢 Klas Johansson。)
自有编号:OTP-8361
可靠浮点异常的配置测试已更新,以在现代版本的 Mac OS X 上工作。(感谢 Trannie Carter。)
自有编号:OTP-8368
ERTS makefile 过去通过检查 CC 是否等于 gcc 来检测是否使用 gcc C 编译器。也就是说,makefile 无法检测到命令名称不是 gcc 的 gcc C 编译器。`configure` 现在将 GCC 替换到 makefile 中。如果 CC 是 gcc C 编译器,则 GCC 的值为 yes。(感谢 Jean-Sébastien Pédron)
自有编号:OTP-8373
ETS 错误导致
ets:info
中 ordered_set 的memory
计数器有时会不同步且异常高。自有编号:OTP-8377 辅助编号:seq11442
使用
erlang:system_flag(multi_scheduling, block | unblock)
立即重复的多次调度阻塞/取消阻塞循环可能会导致运行时系统死锁。自有编号:OTP-8386
修复了有关 re 和 unicode 的一些错误
re:compile 不再丢失 unicode 选项,这也修复了 re:split 中的错误。
re:replace 现在处理 unicode charlist 替换参数
re:replace 现在正确处理 unicode RE charlist 参数
re:replace 现在在未替换任何内容时正确处理二进制 unicode 输出。
Rory Byrne 完成了大多数代码、测试用例和错误隔离。
自有编号:OTP-8394
在 SMP 仿真器中,本机代码的加载不是完全原子的,这可能导致崩溃。此外,本机代码的每个 MFA 信息表现在都受到锁的保护,因为它表明可以在 SMP 仿真器中并发访问。(感谢 Mikael Pettersson。)
自有编号:OTP-8397
修复了处于退出状态的即将被调度的进程,不允许进行垃圾回收。
自有编号:OTP-8420
删除了文档中错误的“\011”字符序列。
自有编号:OTP-8422
如果操作系统本机解析器配置错误,则解析器例程无法将自己的节点名称查找为主机名,Yogish Baliga 报告了此错误,现在已修复。
现在,解析器例程会尝试将主机名解析为 IP 字符串,就像大多数操作系统解析器一样,除非使用了本机解析器。
DNS 解析器 inet_res 和文件解析器 inet_hosts 现在不会在需要之前读取操作系统配置文件。由于本机解析器是默认值,因此在大多数情况下永远不需要它们。
DNS 解析器自动更新操作系统配置文件数据 (/etc/resolv.conf) 现在如果没有“search”关键字,则默认使用“domain”关键字作为默认搜索域。
自有编号:OTP-8426 辅助编号:OTP-8381
re 模块:在具有顶级替代方案的模式开头具有选项更改的正则表达式可能会导致覆盖和/或崩溃。(感谢 Michael Santos。)
自有编号:OTP-8438
asn1 和 ram_file_drv 中的一个字节无害的缓冲区溢出。
自有编号:OTP-8451
改进和新功能
改进了在创建大量堆碎片时,BIF/NIF 调用后的 GC 性能。这将主要使返回大型复合项的 NIF 受益。
自有编号:OTP-8240
实验性 NIF 功能中的不兼容更改。
- 更改了 NIF 函数原型,以允许超过 3 个函数参数。
enif_get_data
重命名为enif_priv_data
。enif_make_string
获取了第三个字符编码参数。erlang:load_nif/2
在错误时的返回值已更改。
在
erl_nif
和erlang:load_nif/2
的文档中阅读更多信息.
* 潜在的不兼容性 *
自有 ID:OTP-8304
交叉编译改进和其他构建系统改进。
最值得注意的是
- 大量的交叉编译改进。旧的交叉编译支持或多或少是不存在的,而且是损坏的。请注意,交叉编译支持仍应被视为实验性的。另请注意,旧的交叉编译配置未经修改无法使用。有关 Erlang/OTP 交叉编译的更多信息,请参阅
$ERL_TOP/INSTALL-CROSS.md
文件。 - 支持使用 DESTDIR 进行分阶段安装。旧的损坏的
INSTALL_PREFIX
也已修复。有关更多信息,请参阅$ERL_TOP/INSTALL.md
文件。 - 顶层
Makefile
的release
目标的文档。有关更多信息,请参阅$ERL_TOP/INSTALL.md
文件。 make install
现在默认创建相对符号链接,而不是绝对链接。有关更多信息,请参阅$ERL_TOP/INSTALL.md
文件。$ERL_TOP/configure --help=recursive
现在可以工作,并为所有带有configure
脚本的应用程序打印帮助信息。- 在
make all
之后直接执行make install
或make release
不再触发各种重新构建。 - 在没有执行
make all
的前提下执行make install
或make release
时,现在会使用现有的引导系统。 - 当动态链接
libssl.so
和libcrypto.so
时,crypto
和ssl
应用程序使用相同的运行时库路径。运行时库搜索路径也已扩展。 - Erl_interface 和 ODBC 的
configure
脚本现在以与 ERTS 相同的方式搜索线程库和线程库特性。 - 当在 64 位系统上构建时,
odbc
应用程序的configure
脚本现在还在lib64
和lib/64
目录中查找 odbc 库。 - 现在会自动生成
erl_interface
应用程序中的config.h.in
文件,而不是静态更新,这降低了configure
测试无效的风险。
(感谢 Henrik Riomar 的建议和测试)
(感谢 Winston Smith 的 AVR32-Linux 交叉配置和测试)
* 潜在的不兼容性 *
自有 ID:OTP-8323
- 大量的交叉编译改进。旧的交叉编译支持或多或少是不存在的,而且是损坏的。请注意,交叉编译支持仍应被视为实验性的。另请注意,旧的交叉编译配置未经修改无法使用。有关 Erlang/OTP 交叉编译的更多信息,请参阅
NIF 改进
- 为 NIF 提供了多线程驱动程序 API。
- 支持内存管理(垃圾回收)资源对象。一种在 C 和 Erlang 之间以安全方式传递本地数据结构“指针”的方法。
- 支持引用、浮点数和项比较。
- 各种新函数,如
enif_inspect_iolist_as_binary
、enif_make_sub_binary
、enif_get_string
、enif_get_atom
、enif_make_tuple_from_array
、enif_make_list_from_array
、enif_make_existing_atom
。
自有 ID:OTP-8335
调度程序特定数据的微小对齐调整。
自有 ID:OTP-8341
在修复了许多错误并向文档构建过程中添加了一些功能之后,现在可以在开源环境中构建文档。
- 更新了元数计算。
- 在生成的链接中删除了 bif 的函数名中使用的模块前缀,因此链接将类似于“https://erlang.ac.cn/doc/man/erlang.html#append_element-2"”,而不是“https://erlang.ac.cn/doc/man/erlang.html#erlang:append_element-2"”。
- 加强了加载新页面时 html 文档中的菜单定位。
- 对 man 页面的生成进行了一些更正(感谢 Sergei Golovan)
- 法律声明取自 xml 书籍文件,因此 OTP 的构建过程可用于非 OTP 应用程序。
自有 ID:OTP-8343
有一个新的
erlang:binary_to_term/2
BIF,它接受一个选项列表。选项safe
可用于防止创建未进行垃圾回收的资源(如原子)。(感谢 Jayson Vantuyl。)自有 ID:OTP-8367
二进制垃圾回收的默认设置已调整为比 R13B03 中的更不激进。现在还可以配置二进制 GC 的设置。请参阅
spawn_opt/2-5
、erlang:system_info/1
、erlang:system_flag/2
、process_flag/2-3
、erlang:trace/3
的文档,以及erl
的文档,了解新的命令行选项+hms
和+hmbs
。自有 ID:OTP-8370
已修复 re:run() 中导致内存损坏的错误。(感谢 Yamashina Hio。)
自有 ID:OTP-8375
erlc
的-Werror
选项和编译器选项warnings_as_errors
将导致将警告视为错误。(感谢 Christopher Faulet。)自有 ID:OTP-8382
现在,归档文件中的显式顶层目录是可选的。
例如,如果归档文件 (app-vsn.ez) 仅包含一个 app-vsn/ebin/mod.beam 文件,则使用归档文件的文件信息作为来源,伪造 app-vsn 和 app-vsn/ebin 目录的文件信息。还可以列出虚拟目录。简而言之,如果顶层目录不存在,则它们是虚拟的。
自有 ID:OTP-8387
os:timestamp/0 中不必要的锁操作已被消除,使其效率略有提高。(感谢 Jonas Falkevik 和 Tuncer Ayaz。)
自有 ID:OTP-8390
有一个新的
+t
模拟器选项,用于更改原子的最大数量。(感谢 Julien Barbot。)自有 ID:OTP-8405
修复了在编译运行时系统时 gcc 4.4.1 和 tile-cc 2.0.1.78377 生成的许多编译器警告。
自有 ID:OTP-8412
configure
学习了选项--enable-m32-build
,以强制在默认情况下 C 编译器生成 64 位可执行文件的系统上构建 32 位运行时。自有 ID:OTP-8415
HiPE 现在可以在 Mac OS X 上的 64 位模拟器中工作。(感谢 Geoff Cant。)
自有 ID:OTP-8416
改进了对 escript 符号链接的处理
自有 ID:OTP-8417
添加锁分析工具。
当运行时系统启用此功能构建时,锁分析工具 lcnt 可以使用内部锁统计信息。
这提供了一种检查运行时本身内潜在的锁瓶颈的机制。
- 添加 erts_debug:lock_counters({copy_save, bool()}). 此选项启用或禁用销毁进程和 ets 表的统计信息保存。启用此选项可能会消耗大量内存。
- 为锁类添加 ID 编号,否则该编号未定义。
自有 ID:OTP-8424
从 escript 中删除了模拟器的不必要的选项。
自有 ID:OTP-8427
小的文档修复。主要是锚点调整。
自有 ID:OTP-8457
Erts 5.7.4
已修复的错误和故障
在 BSD 操作系统上读取 CPU 信息时,堆栈分配不足。(感谢 Michael Turner 和 Akira Kitada)
自有 ID:OTP-8207
在启动 erlang 时,如果在程序名称后直接提供不带破折号的参数,可能会阻止启动分发。现在已更正此问题。
自有 ID:OTP-8209
一个定时器进程可能会无限期地被阻塞,试图向未响应的节点发送滴答声。如果发生这种情况,则连接不会像应该的那样被关闭。
自有 ID:OTP-8218
使用某些防火墙(即 MS IAS 客户端和某些版本的 COMODO)可能会暴露 Win32 套接字接口中未公开的行为,导致名称解析调用无限期挂起。现在通过添加 Windows 下端口程序在其标准输入/输出文件句柄上使用重叠 I/O 的可能性来解决此问题。
自有 ID:OTP-8230
修复了具有
write_concurrency
的 ETS 表上的错误。当在没有找到任何对象的情况下使用绑定键执行select
或match
时,模拟器可能会崩溃。自有 ID:OTP-8242
下面描述的
information-request
/information-response
和group-leader-change-request
/group-leader-changed-response
信号对并非始终遵循具有 SMP 支持的运行时系统中 Erlang 信号模型的信号顺序保证。例如,这些信号有时会传递退出信号。以下 BIF 的行为可以建模为好像向
Pid
发送了一个异步的information-request
信号。如果Pid
处于活动状态,则它会以异步的information-response
信号响应;否则,运行时系统会以no-such-process
信号响应。收到响应后,调用者将其转换为 BIF 的结果。is_process_alive(Pid)
erlang:process_display(Pid, Type)
process_info(Pid)
process_info(Pid, ItemSpec)
当
Pid
与group_leader(GroupLeader, Pid)
的调用者位于同一节点上时,group_leader/2
BIF 的行为可以被建模为向Pid
发送一个异步的group-leader-change-request
信号。如果Pid
处于活动状态,它会以异步的group-leader-changed-response
信号响应;否则,运行时系统会以no-such-process
信号响应。当收到响应时,调用者将其转换为 BIF 的结果。仅包含异步group-leader-change-request
信号且没有响应的分布式情况不受影响。自有 ID:OTP-8245
已更正
system_profile
文档中的错误。自有 ID:OTP-8257
inet_driver 中,低水位套接字选项修改了高水位,而不是低水位。(感谢 Feng Yu 和 Tuncer Ayaz)
自有 ID:OTP-8279
竞态条件可能导致具有 SMP 支持的运行时系统最终处于完全无响应的状态。
自有 ID:OTP-8297
改进和新功能
已从运行时系统中完全删除
pthread_cond_timedwait()
的使用。这是因为当系统时钟突然更改时,其行为是不可预测的。之前的使用是无害的。自有 ID:OTP-8193
文档现在使用大多数平台上存在的开源工具(xsltproc 和 fop)构建。一个可见的变化是删除了框架。
自有 ID:OTP-8201
一种新的二进制文件垃圾收集策略,比以前的实现更积极。二进制文件现在有一个与每个进程绑定的虚拟二进制堆。当二进制文件被创建或接收到进程时,它将检查是否已达到堆限制以及是否应进行回收。这模仿了普通 Erlang 术语的行为。虚拟堆像普通堆一样增长和缩小。这将减少系统中二进制文件的内存占用。
自有 ID:OTP-8202
driver_output_term()
和driver_send_term()
使用的ErlDrvTermData
术语类型已扩展为术语类型ERL_DRV_INT64
和ERL_DRV_UINT64
,用于传递 64 位整数。此外,还引入了 64 位整数数据类型ErlDrvSInt64
和ErlDrvUInt64
。有关更多信息,请参阅 erl_driver(3) 文档。
自有 ID:OTP-8205
[escript] 已删除 escript 中第一行必须以
#!
开头的限制。[escript] 现在已记录 escript 可执行文件的一些命令行选项。例如,您只需添加一个命令行选项即可在调试器中运行 escript。
[escript] 已澄清 escript 标头语法的文档。例如,标头是可选的。这意味着可以直接“执行”
.erl
、.beam
和.zip
文件。自有 ID:OTP-8215
在 Windows 上构建 OTP 的说明已过时且不完整,该文档已更新。
此外,otp_build 脚本要求 Windows 驱动器使用 /cygdrive 前缀在 Cygwin 中显示。现在已删除该要求。
自有 ID:OTP-8219
模块可以具有由调用
erlang:load_nif/2
动态加载的本机实现函数 (NIF)。这是一个实验性功能,尚未用于生产系统。发布此功能是为了在接口定型之前获得一些早期反馈。自有 ID:OTP-8220
float/1
BIF 总是会强制进行垃圾回收。size/1
、byte_size/1
、bit_size/1
、abs/1
和round/1
BIF 在结果不是足够小的整数时会强制进行垃圾回收。自有 ID:OTP-8221
已添加
erlang:port_command/3
BIF。erlang:port_command/3
目前未自动导入,但计划在 OTP R14 中自动导入。有关更多信息,请参阅erlang
文档。自有 ID:OTP-8225
如果 Snow Leopard 以 64 位内核启动,'
configure --enable-darwin-64bit
' 将会失败。(感谢 Ryan M. Graham。)自有 ID:OTP-8236
Erts 5.7.3
已修复的错误和故障
在 Windows 上,open_port({spawn,Command},Opts) 无法运行路径或文件名中带有空格的可执行文件,无论引用尝试如何。虽然 open_port({spawn_executable,Exec},Opts) 可以运行任何可执行文件,但仍然无法使用 'spawn' 来执行相同的操作。现在已更正此问题。
自有 ID:OTP-8055
调度程序绑定类型
processor_spread
在大型 NUMA 系统上过度分散了调度程序。新的调度程序绑定类型
spread
会尽可能分散调度程序,并且其行为与之前的processor_spread
相同。有关更多信息,请参阅 erl 文档中+sbt
命令行参数的文档,以及erlang:system_flag(scheduler_bind_type, SchedulerBindType)
的文档。自有 ID:OTP-8063
在 Linux 系统上自动检测到的 CPU 拓扑可能错误地包含带有
-1
作为标识符的逻辑处理器。当sysconf(_SC_NPROCESSORS_CONF)
返回的值大于找到的逻辑处理器数量时,会发生这种情况。自有 ID:OTP-8064
当将最小术语 [](列表末尾)作为完整消息发送到另一个节点上的进程并在那里接收时,它无法解码。现在已更正此错误。幸运的是,在实际应用中,[] 作为完整消息的情况并不常见,但这仍然是一个严重的错误。
自有 ID:OTP-8092
已更正浮点异常指针未初始化的错误。当将浮点值发送到远程节点时,它有时会在 CentOS 5.1 上出现。David Reiss 报告并提出了补丁建议,Mikael Pettersson 确认。
还修复了 IRIX 上的一些构建问题。Patrick Baggett 报告了问题,Mikael Pettersson 提供了补丁。
自有 ID:OTP-8095
一个终止的进程可能会错误地取消注册另一个进程的名称。在以下情况下可能会发生这种情况:当第一个拥有该名称的进程正在终止时,终止进程的名称被取消注册,然后同时为另一个进程注册。
自有 ID:OTP-8099 辅助 ID:seq11344
在非常深的目录(路径长度为 256 个或更多字符)中运行 erlc 会导致模拟器在调用
list_to_atom/1
时崩溃。(感谢 Chris Newcombe。)自有 ID:OTP-8124
取消注册端口名称时可能会发生运行时系统死锁。
自有 ID:OTP-8145
Makefile.in
已更新为使用 LDFLAGS 环境变量(如果已设置)。(感谢 Davide Pesavento。)自有 ID:OTP-8157
Linux 上的 pthread rwlock 实现可能会导致写饥饿。因此,我们现在在 Linux 上使用我们自己的 rwlock 实现。
自有 ID:OTP-8158
已更新开源 Erlang 版本,使其可以在 Snow Leopard (MacOS X 10.6) 上正常运行
自有 ID:OTP-8168
调用
erlang:system_info(schedulers_online)
可能会陷入无限循环。如果调度程序的数量大于 1,在线调度程序的数量为 1,并且有人阻止了多调度,则会发生这种情况。自有 ID:OTP-8169
erlang:system_profile/2 中的错误可能导致时间戳消息在 SMP 情况下无序到达。现在已修复此问题。
自有 ID:OTP-8171
如果二进制文件包含未对齐的数据,
binary_to_atom/2
和binary_to_existing_atom/2
将会泄漏内存。自有 ID:OTP-8192
没有 SMP 支持的运行时系统中的异步线程池使用了一个对于异步作业来说不是线程安全的内存分配器。
自有 ID:OTP-8194
改进和新功能
现在 ERTS 内部 CPU 拓扑表示中支持处理器内部 NUMA 节点。有关更多信息,请参阅 erl 文档中
+sct
命令行参数的文档,以及erlang:system_info(cpu_topology)
的文档。自有 ID:OTP-8041
改进了关于并发的 ets 文档。
自有 ID:OTP-8050
escript 中的模拟器标志早先被继承到从运行 escript 的模拟器启动的模拟器中。例如,当 escript 调用
os:cmd("erl")
时,新的模拟器会获得错误的模拟器标志。现在已修复此错误Escript 文件名现在可以包含点。
自有 ID:OTP-8060
使一些 BIF 非递归(关系运算符、hash 和 phash)以限制内部堆栈使用。
自有 ID:OTP-8065
修复了 erl_prim_loader 中特定于 Windows 的错误。现在它可以更好地处理根目录(例如 c:/)。此错误影响了调试器中的目录列表。
自有 ID:OTP-8080
如果 TCP 套接字接收到大小值非常大(>2Gb)的数据包头,则带有选项
{packet,4}
的 TCP 套接字可能会导致模拟器崩溃。同样的错误导致erlang:decode_packet/3
返回错误的值。(感谢 Georgos Seganos。)自有 ID:OTP-8102
导出表的最大大小已从 65536 增加到 524288 个条目。
自有 ID:OTP-8104 辅助 ID:seq11345
文件模块现在具有类似于 io:get_line/2 的 read_line/1 函数,但具有面向字节的语义。函数 file:read_line/1 也适用于原始文件,但为了获得良好的性能,建议将其与原始文件访问的 'read_ahead' 选项一起使用。
自有 ID:OTP-8108
修复了读取包含带有负长度的损坏列表的外部格式术语时导致模拟器崩溃的错误。
自有 ID:OTP-8117
新的模拟器标志
+sss
,用于设置调度程序线程的堆栈大小。自有 ID:OTP-8119
现在,在交互模式下运行的 Windows 实用程序 Erlsrv 接受用于注册 Windows 注册表数据库的内部服务名称和描述字段的选项。
自有 ID:OTP-8132
已优化
erlang:demonitor(Mon, [flush])
。之前,它总是在调用者的消息队列中搜索'DOWN'
消息。当前实现仅在必要时搜索消息队列。不必要搜索的情况很常见。已向
erlang:demonitor/2
添加了一个新选项info
。有关更多信息,请参阅erlang
文档。自有 ID:OTP-8143
I/O 任务可能会不必要地重新调度。这是无害的,但不是有用的工作。
自有 ID:OTP-8148
对
erlang:memory/[1,2]
进行了小的改进。自有 ID:OTP-8152
用于启用共享 zlib 的新配置选项。
自有 ID:OTP-8155
修复了 ETS 中的 smp 错误,该错误可能在多个进程访问超过 1000 个对象的表时导致模拟器崩溃,包括调用
select
或match
的变体与并发对象删除相结合。自有 ID:OTP-8166 辅助 ID:seq11392
代码路径解释现在更加宽松。标志 -code_path_choice 现在默认为 relaxed 而不是 strict。有关更多信息,请参阅代码和 init 的文档。
自有 ID:OTP-8170
在进程被频繁调度但每次执行时工作量很少的情况下,运行队列的负载平衡和 I/O 检查会比以前更频繁地触发。
自有 ID:OTP-8172
调用跟踪二进制推导会导致仿真器崩溃。(感谢 Paul Mineiro。)
自有 ID:OTP-8179
当给定某些无效项时,
binary_to_term/1
会导致仿真器崩溃,而不是生成badarg
异常。(感谢 Scott Lystig Fritchie。)自有 ID:OTP-8180
Erts 5.7.2
修复的错误和故障
崩溃转储现在应该为 crashdump_viewer 应用程序带来更少的问题。(对于arity为非零的进程,不再打印参数 - 它们过去以不可解析的格式打印。)
自有 ID:OTP-7472 辅助 ID:seq11019, 11292
进程可能会被卡在离线调度程序上。
自有 ID:OTP-7990
如果
binary_to_atom/2
和binary_to_existing_atom/2
导致badarg
异常,则可能发生内存泄漏。自有 ID:OTP-7997
在极少数情况下,进程可能会被错误地恢复。
自有 ID:OTP-8000
在极少数情况下,调度程序之间的负载平衡可能会导致仿真器崩溃。
自有 ID:OTP-8008
erlang:memory(processes_used)
总是返回0
而不是正确的值。(感谢 Geoff Cant)自有 ID:OTP-8022
改进和新功能
对支持 SMP 的 Erlang 运行时系统的 Erlang 分布进行了重大改进。以前,分布端口锁的竞争非常激烈,并且特定分布通道的所有编码和解码都必须按顺序完成。现在由于分布引起的锁竞争可以忽略不计,并且 Erlang 消息的编码和解码都可以并行完成。
Erlang 分布使用的旧原子缓存协议已被删除,因为它有效地阻止了在同一分布通道上传递的消息的所有并行编码和解码。
引入了一种新的原子缓存协议,该协议隔离原子缓存访问,并使在同一分布通道上传递的消息的并行编码和解码成为可能。新的原子缓存协议还使用了比以前大 8 倍的原子缓存大小。新的原子缓存协议记录在 ERTS 用户指南中。
通过分布接收的 Erlang 消息现在由接收 Erlang 进程解码,而无需保持任何特定于分布通道的锁。通过分布发送的 Erlang 消息和信号像以前一样由发送 Erlang 进程编码,但现在在编码期间不保持任何特定于分布通道的锁。也就是说,无论使用哪种分布通道,编码和解码都可以并行完成。
无法并行化的部分是原子缓存更新。因此,原子缓存更新现在安排在分布端口上。由于每个分布通道只有一个实体执行此工作,因此不会因原子缓存更新而产生锁竞争。
新的运行时系统不理解旧的原子缓存协议。但是,新的和旧的运行时系统仍然可以通信,但不会使用任何原子缓存。
自有 ID:OTP-7774
修复了一个错误,该错误有时会导致来自
driver_select
的错误日志记录,并带有其他症状,例如 IP 通信失败,甚至仿真器崩溃。自有 ID:OTP-7898 辅助 ID:seq11304
改进了 ETS 表的 SMP 并发性。现在可以在同一表的不同记录上真正并发地执行多个修改操作。为了支持这一点,必须使用选项
write_concurrency
创建表,因为这是以一些执行和内存开销为代价实现的。ets:select
和select_count
也已针对所有表进行了改进,以便在迭代期间不获取独占表锁。自有 ID:OTP-7922
erl(即 erl.exe 和 dyn_erl)和 erlexec 已变得更加动态,因此在安装时无需将硬编码的路径添加到 erl(即 erl.ini 和 erl)。Reltool 将在未来的版本中使用此功能。
自有 ID:OTP-7952
添加了从系统获取更高分辨率时间戳的功能。由于能够应对操作系统中的较大时间变化,erlang:now 函数返回的时间戳并不总是与实际操作系统时间一致。添加了函数 os:timestamp/0 以获取与 erlang:now 返回的时间戳类似的时间戳,但不受 Erlang 时间校正和平滑算法的影响。os:timestamp 返回的时间戳始终与操作系统的时间视图一致,例如用于获取挂钟时间的日历函数,但分辨率更高。使用示例可以在 os 手册页中找到。
自有 ID:OTP-7971
向 open_port 添加了两个新选项 - spawn_executable,它以受控方式运行外部可执行文件,以及 spawn_driver,它仅打开到已加载的 Erlang 驱动程序的端口。有关详细信息,请参阅 erlang 手册页。
自有 ID:OTP-7995
ETS 中转移表所有权的新功能。通过声明一个“继承人”,另一个进程将在所有者终止时继承该表,可以更改表的所有者。也可以通过调用一个新函数
ets:give_away
来更改表的所有者。自有 ID:OTP-8006
更新 Tilera 构建环境。
自有 ID:OTP-8009
在进程终止期间不必要地保存了堆栈跟踪。
自有 ID:OTP-8014
现在可以在启动仿真器时从命令行设置用户定义的 CPU 拓扑结构和调度程序绑定类型。有关更多信息,请参阅 erl 文档中
+sct
和+sbt
仿真器标志的文档。现在,即使不是绝对必要的,从
erlang:system_info/1
和erlang:system_flag/2
返回的 CPU 拓扑结构始终包含processor
级别。自有 ID:OTP-8030
ETS 中的各种修复:
ets:first
可能会在固定的表中返回已删除的键。如果将已删除的对象重新插入固定包中,ets:lookup
可能会返回无序的对象。ets:delete_object
可能无法删除 duplicate_bag 中的重复对象。自有 ID:OTP-8040
Erts 5.7.1
修复的错误和故障
修复了 Windows 上的一个错误,该错误可能会导致
gen_tcp:send
在尝试发送超过 16 个二进制文件的 iolist 时挂起。自有 ID:OTP-7816
在极少数情况下,运行时系统可能会在负载平衡期间崩溃。
自有 ID:OTP-7908 辅助 ID:otp-7500
如果主机上不存在 Unix98 伪终端,则
run_erl
将使用回退。自有 ID:OTP-7916 辅助 ID:seq11249
修复了运行时系统中不支持 smp 的消息缓冲区内存泄漏问题。
自有 ID:OTP-7941
尝试使用位语法将 16Mb 或更大的二进制文件附加到另一个二进制文件会导致
system_limit
异常。在构建二进制文件时,在应该生成system_limit
异常的情况下,也出现了一些生成badarg
异常的情况。自有 ID:OTP-7942
如果
RemotePid
是不可达节点上进程的 pid,则支持 SMP 的运行时系统无法正确终止link(RemotePid)
的调用者。在这种情况下,调用进程被标记为退出,但从未终止。自有 ID:OTP-7946
改进和新功能
向源代码版本添加了对交叉编译的基本支持。该支持仍处于起步阶段,仅用于在 Linux 上为不同的 cpu 架构和不同的 Linux 版本进行交叉编译,但应该可以扩展以支持其他平台。包含示例的交叉配置文件位于 $ERL_TOP/xcomp/ 中。有关更多信息,请查看 README.xcomp 并运行 $ERL_TOP/otp_build -help。
自有 ID:OTP-7854
在 R13A 中被赋予新解释的转义序列
\{
保留了其旧含义({
的 ASCII 代码),这意味着大于 255 的代码必须使用十六进制字符声明(例如,\x{AAA}
)。转义序列\xH
其中 H 是一个十六进制字符,后跟其他字符而不是十六进制字符,不再有效(与 R13A 不兼容)。小于 256 的字符代码可以使用两个十六进制字符声明(例如,\x0D
)。自有 ID:OTP-7891 辅助 ID:OTP-7855
以前使用递归 C 代码实现
term_to_binary/1
BIF,这可能会由于堆栈溢出而导致 Erlang 仿真器终止。还修复了 Matthew Dempsky 指出的
term_to_binary/1
和binary_to_term/1
中的一些小问题。自有 ID:OTP-7894
R13A 的 Unicode 和 I/O 系统实现中修复了几个小故障和性能问题。
自有 ID:OTP-7896 辅助 ID:OTP-7648 OTP-7887
对
erlang:system_flag/2
的scheduler_bind_type
参数以及erlang:system_info/1
的scheduler_bind_type
和scheduler_bindings
参数进行了较小的文档改进。自有 ID:OTP-7901 辅助 ID:OTP-7777
有一个新的 BIF
erlang:make_tuple/3
。自有 ID:OTP-7913
Erts 5.7
修复的错误和故障
开源
FreeBSD 的闰秒处理根据 OpenSource 用户 Kenji Rikitake 提交的补丁进行。没有测试用例覆盖此功能(不支持的平台)。
自有 ID:OTP-7609
修复了 ETS 中
bag
和duplicate_bag
的一个错误。delete/2
或lookup_element/3
在固定表中可能会遗漏对象,如果一个或多个具有相同键的对象已被删除。自有 ID:OTP-7665
引入了一个新的驱动程序回调
stop_select
,以允许驱动程序在 SMP 模拟器中以安全的方式取消选择并关闭文件描述符。旧的方式不完全符合 POSIX 标准,在某些罕见的情况下可能导致意外行为。可以将新的标志ERL_DRV_USE
传递给driver_select()
,以告知它应该关闭描述符。stop_select
随后会在安全时被调用。旧的驱动程序仍然会像以前一样工作。自有 ID:OTP-7670
修复了带有选项
{packet,http}
的 TCP 套接字的一个错误。带有绝对 URI 的 HTTP 请求返回的路径字符串损坏。此错误仅存在于 R12B-4 和 R12B-5 中。自有 ID:OTP-7682 辅助 ID:OTP-7647
在某些情况下,run_erl 未能从 to_erl 中提取控制序列(如:winsize=X,Y),而是将它们发送到由 erlang shell 解释。
自有 ID:OTP-7688
修复了 Windows 上安装程序未正确更新文件关联的错误。
自有 ID:OTP-7746
当附加到二进制文件(也在二进制推导中)且附加的数据不包含整字节(例如 13 位)时,可能会在二进制文件中分配比必要更多的空间。
自有 ID:OTP-7747
gen_sctp 选项 sctp_peer_addr_params, #sctp_paddrparams{address={IP,Port}} 在 inet 驱动程序中被错误地解码。此错误现已更正。
自有 ID:OTP-7755
如果发出端口在异步作业完成之前死亡,则未完成的异步驱动程序作业会泄漏内存。
自有 ID:OTP-7784
修复了影响包括 OpenSolaris 在内的动态库加载的错误。(感谢 Paul Fisher。)
自有 ID:OTP-7796
修复了 FreeBSD 的 run_erl 编译错误
自有 ID:OTP-7817
修复了 Solaris 上 SCTP 的 inet 驱动程序中出现的错误,例如 gen_sctp:abort/1 和 gen_sctp:eof/1。感谢 Simon Cornish 的补丁建议。
自有 ID:OTP-7866
改进和新功能
现在文档中说明了在 ordered_set 的 select 中访问对象的顺序。
自有 ID:OTP-7339
具有 SMP 支持的运行时系统现在使用多个特定于调度器的运行队列,而不是一个全局共享的运行队列。
保护共享运行队列的锁竞争非常激烈,并且共享运行队列还导致 Erlang 进程在调度器之间随机迁移,从而导致负面的缓存影响。
使用当前的特定于调度器的运行队列解决方案,由于运行队列保护而导致的锁竞争已减少,并且 Erlang 进程仅在需要在调度器之间平衡负载时才迁移。减少的迁移量还减少了保护 erts 内部内存分配器的特定于调度器的实例的锁上的锁竞争。
特定于调度器的运行队列对于许多未来计划的 NUMA(非统一内存访问)特定优化也是必要的。
自有 ID:OTP-7500
实现了 EEP10 中描述的 Unicode 支持。io 和 io_lib 模块支持从终端和文件格式化和读取 unicode 数据。可以使用自动转换为不同 unicode 格式和从不同 unicode 格式转换的模式打开文件。“unicode”模块包含用于在外部和内部 unicode 格式之间进行转换的函数,re 模块支持 unicode 数据。还有用于指定超出 ISO-latin-1 范围的字符串和字符数据的语言语法。
当终端和操作系统支持时,交互式 shell 将支持 unicode 字符的输入和输出。
有关详细信息,请参阅 EEP 和 io/io_lib 手册页以及 stdlib 用户指南。
I/O 协议不兼容
io_Server 和客户端之间的 io 协议已更新为处理 unicode 格式的协议数据。更新后的协议现在已记录在案。该规范位于 stdlib _users 手册_中,这是手册的新部分。
io 模块不兼容
io:put_chars、io:get_chars 和 io:get_line 都处理并返回 unicode 数据。在可以提供二进制数据的情况下(如 io:put_chars),它们应以 UTF-8 编码。当返回二进制数据时(如 io:get_line/get_chars 在 io_server 设置为 _binary 模式_时),返回的数据也_始终_以 UTF-8 编码。但是,file 模块仍然返回面向字节的数据,因此可以使用 file:read 而不是 io:get_chars 来读取 ISO-latin-1 中的二进制数据。
io_lib 模块不兼容
io_lib:format 可以,在给定新的格式指令(即“~ts”和“~tc”)的情况下,返回包含大于 255 的整数的列表。
* 潜在的不兼容性 *
自有 ID:OTP-7648 辅助 ID:OTP-7580 OTP-7514 OTP-7494 OTP-7443 OTP-7181 EEP10 EEP11
erlang:system_info(system_version)
返回的字符串格式(以及 Erlang 启动时的第一条消息)已更改。该字符串现在包含 OTP 版本号以及 erts 版本号。自有 ID:OTP-7649
消息传递已针对并行执行进行了进一步优化。串行消息传递比以前稍贵,但是并行发送到公共接收器便宜得多。
自有 ID:OTP-7659
外部格式解码 Erlang 项时,原子表锁上的锁竞争已大大减少。
自有 ID:OTP-7660
已删除未记录、不支持和已弃用的保护 BIF
is_constant/1
。* 与 R12B 不兼容 *
自有 ID:OTP-7673
Tilera Corporation 的 Mat Hostetter 改进了 Erlang 进程锁实现。
自有 ID:OTP-7692
net_kernel:monitor_nodes/X
功能传递的{nodedown, Node}
消息现在保证在Node
从erlang:nodes/Y
返回的结果中删除之后发送。自有 ID:OTP-7725
短路运算符
andalso
和orelse
不再保证它们的第二个参数是true
或false
。因此,andalso
/orelse
现在是尾递归的。* 潜在的不兼容性 *
自有 ID:OTP-7748
添加了一个新的 BIF,
lists:keyfind/3
。它的工作方式类似于lists:keysearch/3
,区别在于在成功的情况下,它不会将返回的元组包装在value
元组中。(感谢 James Hague 提出了此函数。)自有 ID:OTP-7752
通过直接在进程堆上创建小型二进制文件来优化驱动程序。
自有 ID:OTP-7762
如果 N 非常大,
I bsl N
可能会导致 Erlang 虚拟机耗尽内存,而不是生成system_limit
。(感谢 Daniel Hedlund。)如果
I
是一个大整数,则在评估I bsl N
或I bsr N
时总会进行垃圾回收。如果
I
是一个整数,而N
是一个大整数,则I bsl N
现在会引发正确的system_limit
异常,而不是像早期版本中那样引发bad_arith
。如果
I
是一个整数,而N
是一个大整数,则I bsr N
将返回 0 或 -1,具体取决于I
的符号,而不是像早期版本中那样引发bad_arith
异常。自有 ID:OTP-7764
调度程序线程现在可以绑定到较新的 Linux 和 Solaris 系统上的逻辑处理器。将来将支持更多系统。
在某些情况下,绑定调度程序后,性能会大幅提高。但是,默认情况下不绑定调度程序。这是因为如果多个程序已绑定到处理器(例如,多个 Erlang 运行时系统),则可能会导致性能下降。有关更多信息,请参阅
erlang:system_flag/2
的文档。为了绑定调度程序线程,需要了解 CPU 拓扑。在某些较新的 Linux 和 Solaris 系统上,运行时系统会自动检测 CPU 拓扑。如果模拟器无法自动检测 CPU 拓扑,则可以定义 CPU 拓扑。有关更多信息,请参阅
erlang:system_flag/2
的文档。自有 ID:OTP-7777
编译器将拒绝编译文件中模块名称与输出文件名不同的文件。
在使用
erlc
进行编译时,当前工作目录将不包含在代码路径中(除非使用“-pa .”显式添加)。* 潜在的不兼容性 *
自有 ID:OTP-7793
添加了 BIF
atom_to_binary/2
、binary_to_atom/2
和binary_to_existing_atom/2
。自有 ID:OTP-7804
现在可以在操作期间更改在线调度程序的数量。在线调度程序的数量默认与可用逻辑处理器的数量相同。有关更多信息,请参阅
erlang:system_flag/2
和erl
的文档。自有 ID:OTP-7811
已删除已弃用的函数
erlang:fault/1
、erlang:fault/2
和file:rawopen/2
。* 潜在的不兼容性 *
自有 ID:OTP-7812
Erts 内部为很少使用的数据动态分配特定于进程和端口的数据。这用于减少不使用特定功能的进程和端口的内存使用量。将来版本中,更多功能将移动到特定于进程和端口的数据。
自有 ID:OTP-7818
gen_tcp 套接字和
erlang:decode_packet
的新数据包类型http_bin
。它的工作方式类似于http
,区别在于字符串返回为二进制文件而不是列表。自有 ID:OTP-7821
已删除嵌入式 Solaris 系统的已过时的 wd_keeper 程序。
自有 ID:OTP-7822
借助新的环境变量设置 ERL_EPMD_PORT,属于不同独立集群的节点现在可以在同一主机上共存。
自有 ID:OTP-7826
新增了函数
erlang:min/2
和erlang:max/2
,分别用于计算两个项的最小值和最大值。请注意,这些函数不会自动导入,因此需要在调用时显式导入或使用erlang
前缀。自有 ID: OTP-7841
版权声明已更新。
自有 ID: OTP-7851
增强了交叉编译到 Tilera Tile 架构的构建环境。
支持 Tilera Tile64/TilePro 上的原生 ethread 原子操作(感谢 Tilera 公司)。
自有 ID: OTP-7852
转义序列
\x
和\{
已被赋予新的解释(它们以前分别返回x
和{
的 ASCII 代码)。从现在起,前导反斜杠后接花括号内的一个或多个八进制字符是现有语法\NNN
的替代方案,但也可用于大于 255 的代码。类似地,一个或多个十六进制字符可以放在前导\x
后的花括号内。此外,转义序列\xH
和\xHH
(其中 N 是十六进制字符)可用于小于 256 的代码。注意:这些新的转义序列仍被认为是实验性的,可能会在 R13B 版本中更改。
* 潜在的不兼容性 *
自有 ID: OTP-7855
为了避免与动态加载的驱动程序冲突,PCRE 库的导出函数名称现在在 erlang 模拟器中以 erts_ 为前缀。
自有 ID: OTP-7861
如果找到可用的 posix 线程库或本机 Windows 线程,则默认情况下,大多数平台现在都将构建具有 SMP 支持的运行时系统。
有关更多信息,请参见顶层 README 文件。
自有 ID: OTP-7872
Erts 5.6.5.1
已修复的错误和故障
修复了 ETS 中
bag
和duplicate_bag
的一个错误。delete/2
或lookup_element/3
在固定表中可能会遗漏对象,如果一个或多个具有相同键的对象已被删除。自有 ID:OTP-7665
修复了带有选项
{packet,http}
的 TCP 套接字的一个错误。带有绝对 URI 的 HTTP 请求返回的路径字符串损坏。此错误仅存在于 R12B-4 和 R12B-5 中。自有 ID:OTP-7682 辅助 ID:OTP-7647
从多个进程在带有
send_timeout
选项的套接字上调用gen_tcp:send()
可能会导致超时时间比指定的长得多。解决方案是新的套接字选项{send_timeout_close,true}
,它将在超时时自动关闭。然后,由于连接已关闭,后续的发送调用将立即失败。自有 ID: OTP-7731 辅助 ID: seq11161
通过
garbage_collect/1
BIF 或check_process_code/2
BIF 进行垃圾回收的进程在垃圾回收期间未正确处理消息接收和恢复。发生这种情况时,进程会返回到垃圾回收之前的状态,而不是进入新状态。自有 ID: OTP-7738
Erts 5.6.5
已修复的错误和故障
已更正 inet_drv 中关于 gen_tcp:connect 的一个错误。通过打开的防火墙向未打开的端口进行连接有时可能会错误地成功。但是,任何后续操作都会失败。
自有 ID: OTP-6542
驱动程序中的浮点运算可能会导致运行时系统崩溃和/或在启用浮点异常的运行时系统上出现意外结果。除非显式启用或启用 hipe,否则浮点异常将被禁用。
自有 ID: OTP-7237
现在已纠正了当许多套接字同时发出信号时导致模拟器崩溃并显示消息“Inconsistent, why isn't io reported?”的错误。
自有 ID: OTP-7420
现在,在 Unix 上使用选项“-detached”启动 erl 会正确地从终端会话断开连接。
自有 ID: OTP-7461
修复了用于 ETS 访问的 gdb etp 命令。
自有 ID: OTP-7538
erlang:decode_packet/3
允许根据 RFC2616 在 HTTP 标头标签和冒号之间存在空格。自有 ID: OTP-7543
现在,即使动态库不存在,为 SCTP 编译的模拟器也会启动。当然,SCTP 驱动程序不会被加载。
自有 ID: OTP-7551
为了在 Mac OS X 上构建,现在需要 10.3.0 或更高版本,因为修复了两个问题
当
erl_ddl
尝试卸载驱动程序时,会出现资源泄漏。已通过使用dlopen()
(它在所有现代类 Unix 平台上都适用)而不是 Mac OS X 特定的 API 调用来纠正此问题。HiPE 的运行时系统中的信号处理已更新,以在高于 10.2.x 的 Mac OS X 版本上工作。因此,
--enable-hipe
现在可以在带有 Intel CPU 的 Mac OS X 上工作。感谢 Geoff Cant 的补丁。
自有 ID: OTP-7562
更正了有关 EPMD 和 Erlang 节点之间协议的一些信息。(感谢 Michael Regen。)
自有 ID: OTP-7594
当使用
erlang:system_monitor(Pid,{long_gc,Time})
并且 GC 时间超过 1 秒时,有时会错误地显示为大约 4300 秒。(此错误已在 R9C 中纠正,但在 R12B 中重新引入。)(感谢 Chris Newcombe。)自有 ID: OTP-7622 辅助 ID: OTP-4903, seq8379
改进和新功能
现在,动态加载的驱动程序的驱动程序条目在加载时会被复制,这使得一些内部优化成为可能。请注意,在执行期间修改驱动程序条目的驱动程序将不再工作。但是,不支持这种对驱动程序接口的误用。
自有 ID: OTP-6900
现在将 split 函数添加到 re 库中。来自 run、replace 和 split 的异常和错误更加一致。
自有 ID: OTP-7514 辅助 ID: OTP-7494
修复了构建模拟器时出现的无害编译器警告,并进行了小的构建更改以避免不必要的重建。
自有 ID: OTP-7530
现在,实验性支持从存档文件加载代码。有关更多信息,请参阅
code
、init
、erl_prim_loader
和escript
的文档。改进了
escripts
的错误处理。escript
现在可以为模拟器设置显式参数,例如-smp enabled
。escript
现在可以包含预编译的 beam 文件。escript
现在可以包含一个包含一个或多个应用程序的存档文件(实验性)。内部模块
code_aux
已被删除。自有 ID: OTP-7548 辅助 ID: otp-6622
ERTS 内部内存分配器的重新分配功能现在将当前块与周围的空闲块结合考虑,作为重新分配的替代位置。
自有 ID: OTP-7555
从进程到之前调用过的模块可能仍然存在错误的引用,因此如果重新加载模块,进程将被终止。(感谢 Richard Carlsson。)
此外,此错误的修复也使堆栈回溯(从
erlang:get_stacktrace/0
和其他函数返回)更加正确,因为立即调用者始终包含在堆栈回溯中(有时可能会丢失)。自有 ID: OTP-7559
改进了 IO 处理中的锁定,以获得更好的 SMP 性能。
自有 ID: OTP-7560
改进了 BIF 重新调度功能。
自有 ID: OTP-7587
加载使用 Erlang/OTP R9C 编译的模块并在模块中调用
module_info/0
将导致模拟器崩溃。现在,模拟器拒绝加载使用 R9C 或更早版本编译的任何模块。(注意:无论如何,只能加载使用 R10B 或更早版本编译的简单模块。)(感谢 Martin Kjellin。)自有 ID: OTP-7590
Erts 5.6.4.2
已修复的错误和故障
在极少数情况下,调用以下 BIF 之一的进程可能会在具有 SMP 支持的运行时系统中死锁:
check_process_code/2
、garbage_collect/1
、process_info/[1,2]
、system_flag/2
和erlang:suspend_process/[1,2]
。自有 ID: OTP-7582
在具有 SMP 支持的运行时系统中,一些统计变量的管理方式不是线程安全的。
自有 ID: OTP-7583
终止进程时,极少数情况下可能出现竞争条件,从而导致运行时系统崩溃。
自有 ID: OTP-7584
在某些条件下,并且在使用 run_erl/to_erl 时,终端 Erlang 驱动程序 (ttsl_drv) 可能会因终端报告零宽度而进行除零运算而使模拟器崩溃。对于报告零宽度的终端,驱动程序现在会回退到默认宽度 80 和默认高度 24 (vt100) 作为回退行为。这修复了崩溃,并且还使“哑”终端上的输出更具可读性。
自有 ID: OTP-7592 辅助 ID: seq11073
Erts 5.6.4.1
改进和新功能
添加了一个新的
erts_alloc
参数+M<S>rmbcmt
(相对多块载体移动阈值)。它确定在收缩块时何时强制在多块载体中进行移动重新分配。有关更多信息,请参阅erts_alloc(3)
文档。自有 ID: OTP-7540
如果检测到内部错误,可以给
erl
提供新选项+d
来抑制崩溃转储的生成。因此,会生成更有用的核心转储。自有 ID: OTP-7578 辅助 ID: seq11052
Erts 5.6.4
已修复的 Bug 和故障
传递给 erts 内部 printf 实现的格式字符串中的双反斜杠会产生错误的结果。没有这样的格式字符串传递给 erts 内部 printf 实现,也就是说,该 bug 因此完全无害。(感谢 Perry Smith。)
自有 ID: OTP-7408
现在在 Windows 上可以处理大文件,只要文件系统支持即可。
自有 ID: OTP-7410
修复了当 http 头部后跟空格时
{packet,http}
的 bug。自有 ID: OTP-7458
如果无法确定当前函数,跟踪选项
running
可能会导致模拟器崩溃。自有 ID: OTP-7484
在 receive...after 中使用 16#ffffFFFF 作为超时值通常会由于 32 位整数溢出而几乎立即导致超时。(感谢 Serge Aleynikov 和 Matthias Lang。)
自有 ID: OTP-7493
对于 escript 运行的进程,
trap_exit
进程标志现在是false
而不是true
(如之前的版本)。依赖于之前(违反直觉的)行为的脚本可能无法工作。(感谢 Bengt Kleberg。)* 潜在的不兼容性 *
自有 ID: OTP-7517
string:to_integer/1
内置函数中的一个 bug 导致模拟器不稳定。现在已纠正。(感谢 Lev Walkin。)自有 ID: OTP-7526
改进和新特性
对于 ETS 密集型应用程序,现在在 SMP 模拟器中性能应该更好。此外,ETS 表标识符(由
ets:new/2
返回)现在比以前分布在更广的范围内(在 32 位模拟器中使用 28 位),以确保已删除表的表标识符不会很快被重用。注意:表标识符现在可以是负整数。错误地假设表标识符只能是正整数的程序可能会停止工作。(表标识符的类型有意未记录,并且可能会在未来的版本中更改。)
自有 ID: OTP-7348
新的 BIF
erlang:decode_packet/3
从二进制文件中提取协议数据包。类似于套接字选项{packet, Type}
。还记录了套接字数据包类型http
并使其正式化。注意:从活动套接字发送的http
数据包的元组格式已以不兼容的方式更改。* 潜在的不兼容性 *
自有 ID: OTP-7404
一些应用程序(erts、kernel、stdlib 和其他几个)的文档源代码现在包含在源 tar 包中。目前没有 Makefile 支持从源代码构建 HTML 文件(这种支持将在未来的版本中包含)。
自有 ID: OTP-7406
许多频繁访问的内存计数器(erts 内部)已被删除。这是因为它们在具有 SMP 支持的运行时系统上损害了性能。因此,只有在启用所有
erts_alloc(3)
分配器(默认)时,erlang:memory/[0,1]
才会返回结果。启用所有erts_alloc(3)
分配器时返回的结果比以前更准确也更不准确。结果中包含的内存比以前多,但是被求和的不同部分不是原子地收集的。erlang:memory/[0,1]
的调用对于系统来说比以前便宜得多。这是因为不再原子地收集信息,而原子地收集信息非常昂贵。* 潜在的不兼容性 *
自有 ID: OTP-7468
用于例如定时器和消息的预分配器已被重写为特定于调度器的。也就是说,不同的调度器现在将从不同的池中分配,从而减少锁争用。
自有 ID: OTP-7470
在 Mac OS X 上,file:sync/1 现在通过使用带有 F_FULLFSYNC 选项的 fcntl() 来保证所有文件系统缓冲区都写入磁盘。以前,file:sync/1 调用 fsync(),它只保证数据已传输到磁盘驱动器。(感谢 Jan Lehnardt。)
自有 ID: OTP-7471
现在可以抢占耗时较长的进程的终止,也就是说,终止进程将被重新安排以稍后继续终止,以便其他进程可以执行。拥有许多和/或大型 ets 表的进程的终止通常需要很长时间。
自有 ID: OTP-7477
添加了一个新的跟踪选项
exiting
。exiting
跟踪类似于running
跟踪,但用于退出进程。有关更多信息,请参阅 erlang(3) 文档。如果在调用
erlang:trace/3
中仅指定一个跟踪目标,则erlang:trace/3
bif 现在不会阻塞其他调度器线程。自有 ID: OTP-7481
re 模块扩展了重复匹配(全局选项)和替换函数。
自有 ID: OTP-7494 辅助 ID: OTP-7181
在关于二进制构造的部分中,参考手册现在提到当整数值不适合大小为 N 的整数段时会发生什么(即,将 N 个最低有效位放入二进制文件中,并且将默默地丢弃最高有效位)。(感谢 Edwin Fine。)
自有 ID: OTP-7506
对于套接字(使用 inets:setopts/2)设置
{active,once}
现在进行了特殊优化(因为{active,once}
选项通常比其他选项更频繁地使用)。自有 ID: OTP-7520
已知 Bug 和问题
在启用了浮点异常的运行时系统上,驱动程序中的浮点运算可能会导致运行时系统崩溃和/或产生意外结果。除非显式启用或启用 hipe,否则会禁用浮点异常。
自有 ID: OTP-7237
Erts 5.6.3.3
已修复的 Bug 和故障
在构造的二进制文件的末尾(大小在变量中给出)使用大小为 0 的整数字段进行二进制构造,会导致在为二进制文件保留的内存之外写入一个字节,这反过来可能会导致模拟器崩溃。
自有 ID: OTP-7422
动态驱动程序实现中的竞争条件可能导致模拟器崩溃。(感谢 Paul Fisher)
自有 ID: OTP-7464
调用
erlang:system_info(allocated_areas)
可能会导致支持 SMP 的运行时系统崩溃。自有 ID: OTP-7474
open_port()
的env
选项可能会导致支持 SMP 的运行时系统崩溃。自有 ID: OTP-7475
改进和新特性
需要在支持 SMP 的运行时系统中阻塞其他线程的操作不必要地等待异步线程阻塞。最重要的是
erlang:memory/[0,1]
bif、代码加载和erlang:trace/3
bif。自有 ID: OTP-7480
Erts 5.6.3.2
已修复的 Bug 和故障
调用
erlang:memory/[0,1]
可能会导致支持 SMP 的运行时系统崩溃。自有 ID: OTP-7415
Erts 5.6.3.1
已修复的 Bug 和故障
在已使用延迟子二进制创建优化的位语法匹配代码上执行本地调用跟踪可能会使模拟器崩溃。
自有 ID: OTP-7399 辅助 ID: seq10978
Erts 5.6.3
已修复的 Bug 和故障
一次只允许一个 to_erl 进程连接到同一个 run_erl 管道。防止当多个 to_erl 的 IO 交错时出现错误行为。
自有 ID: OTP-5107
IPv6 名称解析现在已修复为使用 getaddrinfo() 补丁(经过彻底修改),该补丁由 Love Hörnquist-Åstrand 提交,并由 Fredrik Thulin 提交。它还可以使用 gethostname2() 补丁(也经过修改),该补丁由 Mikael Magnusson 为 debian 提交,并由 Sergei Golovan 提交。
自有 ID: OTP-5382
改进了 run_erl 中的错误处理
自有 ID: OTP-7252
永久修复了由 OTP-7260 暂时修复的死锁问题。
- OTP-7260 - 当在分布通道上执行多个同时操作时,支持 SMP 的运行时系统在极少数情况下可能会死锁。
自有 ID: OTP-7267 辅助 ID: OTP-7260
./configure 已得到改进,可以查找 64 位 OpenSSL 库。
自有 ID: OTP-7270
一个终止的进程在极少数情况下可能会触发一个 bug,该 bug 可能会导致支持 SMP 的运行时系统崩溃。
自有 ID: OTP-7272
gen_sctp 现在处理 SCTP_ADDR_CONFIRMED 事件。
自有 ID: OTP-7276
如果二进制数据包含具有非原子模块和/或函数的外部函数,则 binary_to_term/1 会使模拟器崩溃。已更正为生成 badarg 异常。
自有 ID: OTP-7281
在 Mac OS 10.5 (Leopard) 上,发送到另一端关闭的套接字可能会导致模拟器消耗 100% 的 CPU 时间。(感谢 Matthias Radestock。)
自有 ID: OTP-7289
在 Windows 上使用的 vanilla 驱动程序可能会使模拟器崩溃,有时会生成损坏的文件。当仅将文件名作为第一个参数传递给
open_port/2
时,会使用 vanilla 驱动程序。注意:这种open_port/2
的用法是过时的,并且该用法的文档以前已删除。该功能仅出于向后兼容性的原因存在,并且最终将被删除。自有 ID: OTP-7301
修复了在 64 位机器上匹配大于 512Mb 的二进制文件时出现的错误。(在 32 位机器上,二进制文件的大小限制仍然为 512Mb)。感谢 Edwin Fine 和 Per Gustafsson 找出故障并进行修复。
自有 ID: OTP-7309
如果在未找到 openssl DLL 时出现错误弹出窗口,则 Windows 上的 crypto:start() 会导致模拟器挂起。现在已抑制 Windows 错误弹出窗口。
自有 ID: OTP-7325
可以使用配置选项
without-termcap
来禁用在 shell 中使用 termcap 库进行终端光标控制。自有 ID: OTP-7338
to_erl 将其终端窗口大小报告给 run_erl,以便相应地格式化输出
自有 ID: OTP-7342
在 Solaris 上,如果文件描述符恰好大于 255(Solaris 本身中 fopen() 和 friends 的问题),则文件操作的
compressed
选项不起作用。自有 ID: OTP-7343 辅助 ID: seq10949
修复了支持 SMP 的运行时系统中的竞争条件,该条件会导致错误地删除新创建的 ets 表。
当一个进程在终止期间删除一个表,同时另一个进程通过
ets:delete/1
删除同一个表,并且第三个进程创建一个表,该表意外地获得了与被删除的表相同的内部表索引时,会发生竞争。自有 ID: OTP-7349
当解压缩数据的大小正好是内部缓冲区大小(默认 4000 字节)的整数倍时,
zlib:inflate
会失败。内部编号:OTP-7359
如果允许的原子总数超过限制,现在将会受控地终止模拟器并生成崩溃转储文件。 以前模拟器只是简单地崩溃。(感谢 Howard Yeh 和 Thomas Lindgren。)
内部编号:OTP-7372
Windows 上 werl 中的中断处理程序可能导致模拟器挂起或崩溃,现在已得到纠正。
内部编号:OTP-7394 辅助编号:seq10969
configure 脚本现在会测试 gcc-4.3.0 中一个严重的优化错误。如果存在此错误,configure 脚本将中止(如果发生这种情况,构建 Erlang/OTP 的唯一方法是更改为另一个版本的 gcc)。(感谢 Mikael Pettersson。)
内部编号:OTP-7397
改进和新功能
在 Unix 上,模拟器现在会注意到终端的宽度何时发生变化。(感谢 Matthew Dempsky 和 Patrick Mahoney。)
内部编号:OTP-7290
现在有一个新的函数
init:stop/1
,可用于干净地关闭系统,并生成非零退出状态或崩溃转储。(感谢 Magnus Froberg。)内部编号:OTP-7308
process_info(Pid, garbage_collection) 现在返回更多信息
内部编号:OTP-7311
现在记录了
open_port/2
的hide
选项。(感谢 Richard Carlsson。)内部编号:OTP-7358
已知错误和问题
驱动程序中的浮点运算可能会导致启用了浮点异常的运行时系统崩溃。除非显式启用或启用 hipe,否则将禁用浮点异常。
自有 ID: OTP-7237
Erts 5.6.2
修复的错误和故障
现在严格执行原子最大长度为 255 个字符。如果编码的项包含长度超过 255 个字符的原子,则
binary_to_term/1
现在将失败并返回 badarg。如果需要,驱动程序创建的原子现在将被截断为 255 个字符。(感谢 Matthew Dempsky。)内部编号:OTP-7147
在某些 64 位架构上,“大数处理”中的一个错误可能导致大数的 rem 和 div 运算无限期地挂起。涉及可以用 28 位或 60 位表示的最小负数的 Rem 运算也可能导致访问冲突和模拟器崩溃。这两个错误都已得到纠正。
内部编号:OTP-7177
在唤醒休眠进程后进行初始垃圾回收时,会不必要地触发完全扫描垃圾回收。
内部编号:OTP-7212
beta 测试模块
gen_sctp
现在支持文档中所述的活动模式。活动模式仍然未经充分测试,并且对于gen_sctp:connect/5
的正确语义存在一些问题。特别是:它应该是阻塞的还是非阻塞的还是可选择的。它在(不久的)将来很可能会更改语义。尝试一下,提供评论并发送错误报告!
内部编号:OTP-7225
对
ets:update_counter/3
的无效参数处理不正确。小于 1 的元组位置 (Pos
) 导致更新紧跟在键之后的元素(就像没有指定任何位置一样)。现在,所有无效的Pos
值都将失败并返回badarg
。内部编号:OTP-7226
当在多个并发操作正在执行时关闭分布式通道时,具有 SMP 支持的运行时系统在极少数情况下可能会死锁。
内部编号:OTP-7260
改进和新功能
来自 zlib 库的更多校验和/哈希算法现在可以作为内置函数使用(就像 md5 哈希长期以来一直那样)。
内部编号:OTP-7128
垃圾回收器中的小改进。
内部编号:OTP-7139 辅助编号:OTP-7132
现在,Windows werl 程序的“-detached”开关可以创建一个没有任何主窗口且不显示临时控制台的 erlang 虚拟机。
内部编号:OTP-7142
erlang:system_info/1
现在接受logical_processors
和debug_compiled
参数。有关更多信息,请参见erlang
文档。如果模拟器使用的调度程序线程数大于系统上的逻辑处理器数,则
test_server:timetrap_scale_factor/0
返回的比例因子现在也会受到影响。内部编号:OTP-7175
一个新的 BIF ets:update_element/3。用于更新 ets 元组中的单个元素,而无需读取、更新和写回整个元组。
内部编号:OTP-7200
执行
processes/0
BIF 的进程现在可以在执行期间被其他进程抢占。 这是为了尽可能少地干扰系统的其余部分。 当然,返回的结果仍然是在调用processes/0
期间现有进程的统一快照。更新了
processes/0
BIF 和is_process_alive/1
BIF 的文档,以便阐明现有进程和活动进程之间的差异。内部编号:OTP-7213
Erts 5.6.1.1
修复的错误和故障
在 erl_check_io.c 中发送错误报告时,传递的参数不够。(感谢 Matthew Dempsky)。
内部编号:OTP-7176
在极少数情况下,复杂的二进制匹配代码可能会导致模拟器崩溃或在应该匹配时不匹配。(感谢 Rory Byrne。)
内部编号:OTP-7198
改进和新功能
现在
erlang:system_info/1
接受{allocator_sizes, Alloc}
和alloc_util_allocators
参数。 有关更多信息,请参见erlang
文档。内部编号:OTP-7167
当休眠进程时,堆块的最终重新分配现在始终移动堆块,因为它在休眠大量进程时会大大减少内存碎片。
内部编号:OTP-7187
Erts 5.6.1
修复的错误和故障
sparc64 上的 SMP 模拟器错误地使用了 sparc32 原子和 sparc32 自旋锁实现,导致其崩溃。
内部编号:OTP-7006
调用跟踪新的 guard BIF
byte_size
、bit_size
或tuple_size
以及加载使用这些函数之一的模块,可能会导致模拟器终止。内部编号:OTP-7008
在 MacOSX 上配置 --enable-darwin-universal 或 --enable-darwin-64bit 可能会导致非优化的模拟器。 现在已更正顶级配置脚本。
内部编号:OTP-7014
配置 --with-gd 没有为 percept 生成正确的包含标志。
内部编号:OTP-7015
在 Windows 上,具有 SMP 支持的运行时系统中,环境变量的处理不是线程安全的。
已引入
erl_drv_putenv()
和erl_drv_getenv()
用于驱动程序。不要在驱动程序中直接使用 putenv() 或 getenv()。有关更多信息,请参阅erl_driver
文档。内部编号:OTP-7035
HIPE:更正了 send/3 和 setnode/3 BIF 的接口选择以用于本机编译的代码。在异常情况下,使用不正确的接口可能导致随机的运行时错误。
内部编号:OTP-7067
当进程字典中存在许多键时,垃圾回收可能会变得非常慢。(感谢 Fredrik Svahn。)
内部编号:OTP-7068
删除了 windows 安装中的重复文档目录。
内部编号:OTP-7070
文档错误修复和说明。
(感谢 Joern ([email protected])、Matthias Lang 和 Richard Carlsson。)
内部编号:OTP-7079
当在具有多个逻辑处理器的系统上运行时,没有使用 OTP 的本机原子整数实现的具有 SMP 支持的运行时系统可能会死锁。 也就是说,只有在 x86、x86_64、sparc32 和 powerpc32 以外的硬件平台上具有 SMP 支持的运行时系统才会受到此错误的影响。
内部编号:OTP-7080
中断处理代码(当按下 Ctrl-C 时运行)可能会使具有 SMP 支持的运行时系统死锁。
内部编号:OTP-7104
已更新 sctp 驱动程序,以使用较新的 lksctp 包(例如,使用 API 拼写更改 adaption -> adaptation 的 1.0.7)。 较旧的 lksctp (1.0.6) 仍然可以工作。现在,无论底层的 C API 如何,gen_sctp.erl 和 inet_sctp.hrl 中的 erlang API 都拼写为“adaptation”。
* 潜在的不兼容性 *
内部编号:OTP-7120
修复了 64 位平台上
erlang:phash2/1
中的一个错误。(感谢 Scott Lystig Fritchie。)内部编号:OTP-7127
在极少数情况下,模拟器在垃圾回收时可能会崩溃。
内部编号:OTP-7132
改进和新功能
文档已更新,以反映 Erlang shell 的最新更新以及
io_lib
模块的控制序列p
的细微修改。代码示例和 Erlang shell 示例中多余的空行已被删除。
自身 ID: OTP-6944 辅助 ID: OTP-6554, OTP-6911
在非字节对齐的、宽度大于 CPU 字长的字段中使用小整数进行位语法构造,可能会导致字段开头出现垃圾位。
自身 ID: OTP-7085
Erlang 运行时系统现在不支持所有早于 Windows 2000 的 Windows 版本。这是因为需要使用 Windows 2000 中引入的功能。
自身 ID: OTP-7086
内存管理方面的改进,特别是对于支持 SMP 的运行时系统。
- 支持 SMP 的运行时系统现在可以使用大多数内存分配器的多个线程特定实例。这提高了性能,因为它减少了内存分配器中的锁竞争。然而,这可能会增加某些应用程序的内存使用量。默认情况下,支持 SMP 的运行时系统将在大多数分配器上启用此功能。可以配置使用的实例数量。
driver_alloc()
、driver_realloc()
和driver_free()
现在使用它们自己的 erts 特定内存分配器,而不是系统上的默认malloc()
实现。- 一些分配器的默认配置已更改,以更好地适应使用大量内存的应用程序。
- 添加了一些新的
erts_alloc
配置参数。 erts_alloc_config
已被修改,使其能够创建适用于分配器多个实例的配置。erlang:system_info({allocator, Alloc})
的返回值已更改。这是因为分配器现在可能在多个实例中运行。
如果出于某种原因希望内存分配器按照之前的配置进行配置,可以将
+Mea r11b
命令行参数传递给erl
。有关更多信息,请参见
erts_alloc(3)
、m:erts_alloc_config
和erlang
文档。* 潜在的不兼容性 *
自身 ID: OTP-7100
在 Unix 上,无法使用
list_to_float/1
或binary_to_term/1
创建非规范化的浮点数。(感谢 Matthew Dempsky。)自身 ID: OTP-7122
本机原子整数和自旋锁现在也适用于 sparc64 上支持 SMP 的运行时系统。
自身 ID: OTP-7130
增加了对 Linux 上 sparc64 用户空间 FP 异常的支持。请注意,默认情况下,FP 异常支持现在已关闭,因此要实际启用它,您需要执行 '
./configure --enable-fp-exceptions
'。自身 ID: OTP-7131
Erts 5.6
修复的错误和故障
已更正读取 0 字节时原始文件返回 'eof' 而不是空数据的错误。
自身 ID: OTP-6291 辅助 ID: OTP-6967
gzio.c 中的所有导出函数现在都已重命名,以避免与间接链接到外部 zlib 库的驱动程序发生冲突。
自身 ID: OTP-6816 辅助 ID: OTP-6591
在 64 位 Erlang 模拟器上,将包含超过 60 位(“大数”)的整数位语法构造到超过 60 位的字段中可能会产生不正确的结果。
自身 ID: OTP-6833
当运行时系统无法为二进制文件分配内存时,可能会在写入
erl_crash.dump
时发生死锁。自身 ID: OTP-6848
如果进程调用
erlang:suspend_process(Pid)
BIF 或erlang:garbage_collect(Pid)
BIF,而由Pid
标识的进程当前正在运行,并且在调用 BIF 期间终止了调用 BIF 的进程,则支持 SMP 的运行时系统可能会死锁。当使用支持 SMP 的运行时系统时,通过
erlang:suspend_process/1
BIF 相互挂起或通过erlang:garbage_collect/1
BIF 相互进行垃圾回收的进程可能会相互死锁。自身 ID: OTP-6920
如果跟踪器进程因退出原因
kill
而被杀死,dbg
可能会将跟踪的进程置于挂起状态。引入了
erlang:suspend_process/2
,它接受选项列表作为第二个参数。有关更多信息,请参见erlang
文档。通过
erlang:suspend_process/[1,2]
挂起的进程现在会在调用erlang:suspend_process/[1,2]
的进程终止时自动恢复。以前,除非有人正在跟踪被挂起的进程,否则进程可以被一个进程挂起,并由另一个进程恢复。这种情况不再可能。恢复进程的进程必须是挂起它的进程。
* 潜在的不兼容性 *
自身 ID: OTP-6946
由于足够奇怪的文件系统问题,例如写入已满的文件系统,file:write_file/3、file:write/2 和 file:read/2 可能会崩溃(与文档相反)。此错误现已更正。
在此过程中,文件模块已重写以生成更好的错误代码。Posix 错误代码现在源自 OS 文件系统调用,或者仅为非常相似的原因生成(例如,如果内存分配失败,则生成 'enomem',如果 Erlang 中的文件句柄是文件句柄但当前无效,则生成 'einval')。
现在生成了更多 Erlang 风格的错误代码。例如,如果参数不是文件句柄类型,则现在从
file:close/1
返回{error,badarg}
。请参见 file(3)。已删除使用
file:write/2
写入单个字节而不是一个字节的列表或二进制文件的可能性,这与文档相矛盾。* 潜在的不兼容性 *
自身 ID: OTP-6967 辅助 ID: OTP-6597 OTP-6291
当实际堆和/或堆栈非常大时,系统监视器功能生成的监视器消息以及垃圾回收跟踪消息可能包含错误的堆和/或堆栈大小。
从 erts 版本 5.6 开始,
erlang:system_monitor/[1,2]
的large_heap
选项已修改。如果为所有堆代分配的所有内存块的大小总和等于或大于指定的大小,则发送监视器消息。以前,如果为最年轻的一代分配的内存块等于或大于指定的大小,则发送监视器消息。* 潜在的不兼容性 *
自身 ID: OTP-6974 辅助 ID: seq10796
inet:getopts/2
在 Windows Vista 上返回随机值。自身 ID: OTP-7003
改进和新功能
仿真器内部进程锁实现已重写和优化。以前的实现中存在轻微的饥饿风险。在新实现中也消除了这种风险。
自身 ID: OTP-6500
位串(位级)二进制文件和二进制推导现在是语言的一部分。请参见参考手册。
自身 ID: OTP-6558
erlang 的 Windows 版本现在支持 SMP。在显示多个虚拟或物理处理器的计算机上,默认情况下运行 SMP 模拟器。
自身 ID: OTP-6560 辅助 ID: OTP-6925
压缩的术语格式的详细信息已记录在 erl_ext_dist.txt 中。(感谢 Daniel Goertzen。)
自身 ID: OTP-6755
如果检测到多个逻辑处理器,则默认情况下启动支持 SMP 的运行时系统。有关更多信息,请参见
erl(3)
文档。自身 ID: OTP-6756
Erlang 术语的外部格式和分发协议现在已记录在 ERTS 用户指南中。
自身 ID: OTP-6779
新的 BIF erlang:system_profile/1 和 erlang:system_profile/2。这些 BIF 控制进程、端口和调度程序的并发分析选项。
自身 ID: OTP-6783 辅助 ID: OTP-6285
driver_output_term()
和driver_send_term()
使用的ErlDrvTermData
术语类型已使用术语类型ERL_DRV_BUF2BINARY
、ERL_DRV_EXT2TERM
和ERL_DRV_UINT
进行了扩展。ERL_DRV_BUF2BINARY
用于传递和创建二进制文件,ERL_DRV_EXT2TERM
用于传递以外部术语格式编码的术语,ERL_DRV_UINT
用于传递无符号整数。还添加了数据类型
ErlDrvUInt
和ErlDrvSInt
,这使得术语类型参数在宽度和符号方面的解释方式更加清晰。erl_driver(3)
文档中不正确的数据类型ErlDriverTerm
、ErlDriverBinary
和ErlDriverPort
已替换为正确的数据类型ErlDrvTermData
、ErlDrvBinary
和ErlDrvPort
。有关更多信息,请参见
erl_driver(3)
文档。自身 ID: OTP-6823
erts 内部线程库的各种改进。
它现在支持 Windows 上的优化原子操作和自旋锁。
已经为缺少的优化原子操作、自旋锁或读写锁实现了基于互斥锁和/或自旋锁的回退。这使得可以在更多平台上编译支持 SMP 的运行时系统。
OpenBSD 上的默认堆栈大小已增加到 256 千字。
自身 ID: OTP-6831 辅助 ID: OTP-6560
许多位语法操作(包括构造和匹配)速度更快。有关更多信息,请参见《效率指南》。
自身 ID: OTP-6838
文字列表、元组和二进制文件不再像以前那样在运行时构造,而是存储在每个模块的常量池中。多次使用的文字只存储一次。
这只是对其实现细节的更改,而不是对语言的更改。因此,此更改的影响在《效率指南》中进行了描述。
示例 1:在表达式
element(BitNum-1, {1,2,4,8,16,32,64,128})
中,元组过去在每次执行表达式时都会构造,如果表达式在循环中执行,这可能会在两个方面损害性能:构建元组本身的时间以及由于堆更快地充满垃圾而在垃圾回收中花费的时间。示例 2:文字字符串(例如
"abc"
)过去以字节字符串的形式紧凑地存储在编译后的代码中,并在运行时扩展为列表。现在,所有字符串都将扩展为列表(例如[$a,$b,$c]
)存储在常量池中。这意味着该字符串在运行时将更快地使用,但即使不使用,它也需要更多空间。如果空间是一个问题,您可能希望对不常用的长字符串(例如错误消息)使用二进制文字(即<<"abc">>
)而不是字符串文字。自身 ID: OTP-6850
Erlang 驱动程序 API 已通过用于多线程的可移植 POSIX 线程类 API 进行了扩展。Erlang 驱动程序线程 API 提供
- 线程
- 互斥锁
- 条件变量
- 读/写锁
- 线程特定数据
有关更多信息,请参见
erl_driver(3)
文档。自身 ID: OTP-6857
递归调用现在通常比 R11B 消耗更少的堆栈。请参见《效率指南》。
自身 ID: OTP-6862 辅助 ID: seq10746
已弃用的 BIF
erlang:old_binary_to_term/1
和erlang:info/1
已被移除。* 潜在的不兼容性 *
内部编号:OTP-6876
由外部事件触发的驱动程序回调调用现在会被调度,并与 Erlang 进程的执行交错进行,即使是在不支持 SMP 的运行时系统上也是如此。
内部编号:OTP-6878
对超过 27 位有符号整数(或在 64 位 CPU 上超过 60 位有符号整数)的算术运算以及整数乘法运算的速度更快。(感谢 Tony Rogvall。)
内部编号:OTP-6891
process_info
BIF 进行了重大改进。process_info/2
现在可以接受一个项目列表作为第二个参数,以便原子地检索有关多个项目的信息。process_info/[1,2]
在支持 SMP 的运行时系统中进行了优化。之前,在process_info/[1,2]
中等待被检查进程上的锁时,整个调度器可能会被阻塞很长一段时间。调用process_info/[1,2]
的 Erlang 进程仍然可能因为等待锁而被阻塞很长一段时间,但现在调度器能够在调用process_info/[1,2]
的进程等待锁时运行其他进程。process_info/2
现在接受比以前更多的项目。process_info/[1,2]
的文档已得到改进。
有关更多信息,请参阅
erlang
文档。内部编号:OTP-6899
open_port({}, [])
可能导致模拟器崩溃。(感谢 Matthew Dempsky。)内部编号:OTP-6901
引入了两个新的 guard BIF,作为
size/1
的推荐替代品。(size/1
BIF 将不早于 R14B 版本移除。)这两个 BIF 分别是tuple_size/1
,用于计算元组的大小,以及byte_size/1
,用于计算二进制或位串的内容所需的字节数(如果需要,向上取整到最接近的字节数)。还有一个新的
bit_size/1
BIF,它返回二进制或位串包含的确切位数。内部编号:OTP-6902
已弃用多个版本的
ets:fixtable/2
函数已被移除。ets:info/1
函数已重新实现为 BIF,从而保证返回的信息是一致的。如果第二个参数无效,
ets:info/2
函数现在将失败,并显示badarg
错误原因。(可以使用 Dialyzer 来查找第二个参数拼写错误的错误代码。)* 潜在的不兼容性 *
内部编号:OTP-6906
由于 Linux 内核在通过 CPU 时间戳进行跟踪时可能会产生轻微的错误,并且没有补丁可以修复 Linux 内核中的该问题,因此目前在 Linux 上禁用了 CPU 时间戳。
* 潜在的不兼容性 *
内部编号:OTP-6922
添加了函数 io:columns/0、io:columns/1、io:rows/0 和 io:rows/1,允许用户获取有关终端几何形状的信息。 shell 在格式化输出时会利用这些函数。对于不适用高度和宽度的常规文件和其他 io 设备,这些函数返回 {error,enotsup}。
潜在的不兼容性:如果有人编写了自定义 io 处理程序,则该处理程序必须返回错误或处理与终端高度和宽度相关的 io 请求。通常这不是问题,因为根据经验,io 处理程序在收到未知的 io 请求时应返回错误回复,而不是崩溃。
* 潜在的不兼容性 *
内部编号:OTP-6933
driver_caller()
现在也可以从驱动程序的start
回调中使用。内部编号:OTP-6951
现在可以在 darwin/MacOSX 10.4 和 10.5 上为 64 位 intel 以及 32 位通用二进制文件编译模拟器。
内部编号:OTP-6961
如果
open_port
因为所有可用端口都已在使用而失败,则现在将抛出system_limit
异常,而不是enfile
异常。(如果操作系统返回 ENFILE,则仍可能抛出enfile
。)内部编号:OTP-6968
spawn_monitor/1
和spawn_monitor/3
BIF 现在是自动导入的(即它们不再需要erlang:
前缀)。内部编号:OTP-6975
在 Windows 上,werl 窗口现在可以处理调整大小,从而可以利用整个窗口。文本选择也被更新为面向行的,而不是像早期版本那样面向矩形的。
内部编号:OTP-6994 辅助编号:OTP-6933
已在 FreeBSD 上启用了 Kqueue 支持(内核轮询)。关于 kqueue 未检测到 FreeBSD 上管道写入的问题实际上不是 kqueue 问题,而是管道上的 writev 问题。当 bug 出现时,poll() 和 select() 都没有检测到写入。NetBSD 和 DragonFlyBSD 可能存在或曾经存在相同的 bug。由于 Jean-Sebastien Pedron 的贡献,该 bug 应该已经在 FreeBSD 6.3 和 FreeBSD 7.0 中修复了。
内部编号:OTP-7001
Erts 5.5.5.5
已修复的错误和故障
即使使用了 I/O 线程,在临时不可用的 NFS 文件系统上挂起的写入操作也可能导致(非文件相关的)erlang 代码的执行被阻塞。现在已经纠正了这一点。
内部编号:OTP-6907 辅助编号:seq10771
Erts 5.5.5.4
已修复的错误和故障
当使用支持 SMP 的运行时系统时,通过
erlang:port_call
传递给驱动程序的数据可能会损坏。(感谢 YAMASHINA Hio。)内部编号:OTP-6879
在 SMP 模拟器中,如果多个进程在计数器值超过 27 位时调用 ets:update_counter/3(即使对于不同的表),计数器值可能会损坏或模拟器可能会崩溃。
内部编号:OTP-6880 辅助编号:seq10760
Erts 5.5.5.3
已修复的错误和故障
使用
ets:new/2
创建命名表或使用ets:rename/2
重命名命名表,在极少数情况下可能会成功,这意味着将有两个或多个具有相同名称的表。现在,此类调用将失败,并出现badarg
异常,正如应该做的那样。在命名表上使用的
ets:delete/1
现在会立即删除该名称,以便可以创建具有相同名称的新表。在实现
ets:delete/1
的内部 BIF 上启用调用跟踪会导致模拟器崩溃。仅限 SMP 模拟器:在已使用
ets:safe_fixtable/2
的表上使用ets:rename/2
可能会由于缺少锁而导致模拟器崩溃或未定义的行为。内部编号:OTP-6872 辅助编号:seq10756、seq10757
Erts 5.5.5.2
已知错误和问题
在 ordered_set 上使用 chunksize 为 1000 倍数的 ets:select/3 会返回所有元素,而不是仅返回 1000 个元素。此外,在 SMP 模拟器上,在 ordered set 上使用 ets:slot/2 可能会给出意外的结果。这两个问题都已得到纠正。
内部编号:OTP-6842
Erts 5.5.5.1
已修复的错误和故障
gzio.c 中的所有导出函数现在都已重命名,以避免与间接链接到外部 zlib 库的驱动程序发生冲突。
自身 ID: OTP-6816 辅助 ID: OTP-6591
使用某些无效的二进制文件调用 binary_to_term/1 会导致模拟器崩溃。
内部编号:OTP-6817
改进和新功能
恢复了 32 位整数的位语法匹配速度。
内部编号:OTP-6789 辅助编号:seq10688
Erts 5.5.5
已修复的错误和故障
gzio.c 中的函数已重命名,以避免与间接链接到外部 zlib 库的驱动程序冲突。
内部编号:OTP-6591
如果一个异步线程在模拟器开始写入
erl_crash.dump
后完成了一个作业,则不支持 SMP 的模拟器会转储核心。内部编号:OTP-6685
在位语法匹配中,大小大于 16Mb 的整数字段将无法匹配。(感谢 Bertil Karlsson 和 Francesco Pierfederici。)
从二进制文件中匹配出一个未按字节边界对齐的 32 位整数可能会导致堆溢出(以及随后的模拟器终止)。
包含文字字段大小大于 16Mb 的位语法构造的模块将无法加载。
消除了其他几个与巨大字段大小相关的类似 bug。
尝试构造一个长度超过 536870911 字节的二进制文件现在将失败,并出现
system_limit
异常(而不是以神秘的方式失败或构造一个内容不正确的二进制文件)。同样,尝试匹配长度超过 536870911 字节的二进制文件现在将失败(而不是产生不正确的结果)。此限制已记录在《效率指南》中。(该限制在 32 位模拟器中;如果需要处理大于 536870911 的二进制文件,请使用 64 位模拟器。)内部编号:OTP-6686
更正了非常大数字的 rem 和 div 中的 bug。
内部编号:OTP-6692
erlang:system_info({allocator, Alloc})
在结果中包含大数时没有分配足够的堆,这可能会导致模拟器崩溃。内部编号:OTP-6693
之前不可能通过命令行传递与默认情况下使用的相同配置给
erts_alloc
。现在,可以向配置某种大小的
+M*
命令行参数传递一个等于地址空间大小的值。在这种情况下,使用的值将是"地址空间大小" - 1
。自身 ID:OTP-6699
如果
port
无效,SysIOVec* driver_peekq(ErlDrvPort port, int *vlen)
不会更新*vlen
。如果port
无效,现在*vlen
将设置为-1
。即使
port
无效,efile
驱动程序也希望更新*vlen
。这种情况很少发生,但当运行时系统启用了异步线程并终止端口时,可能会发生这种情况。发生这种情况时,运行时系统会崩溃。自身 ID:OTP-6729
改进和新功能
对于使用
escript
编写的脚本,有一个新的函数escript:script_name/0
,可用于检索脚本的路径名。文档已澄清了有关诸如 ?MODULE 和模块名称等预定义宏的信息。自身 ID:OTP-6593
已更新 ERTS 用户指南中“抽象格式”章节中的“Guard”部分。
自身 ID:OTP-6600
更正了 SCTP 的套接字选项 SO_LINGER、SO_SNDBUF 和 SO_RCVBUF 的协议层胶合。
自身 ID:OTP-6625 辅助 ID:OTP-6336
改进并记录了对等连接关闭时 inet 选项 {active,once} 的行为。
自身 ID:OTP-6681
为面向连接的套接字添加了 inet 选项 send_timeout,允许在向底层 TCP 堆栈发送请求时设置超时。
自身 ID:OTP-6684 辅助 ID:seq10637 OTP-6681
为
erl
命令添加了命令行标志-args_file FileName
以及环境变量ERL_AFLAGS
和ERL_ZFLAGS
。有关更多信息,请参阅 erl 文档。自身 ID:OTP-6697
is_constant/1
类型测试已被弃用。is_constant/1
的命名不正确,而且几乎没有任何文档说明。自身 ID:OTP-6731
Erts 5.5.4.3
修复的错误和故障
process_flag(trap_exit, Bad)
,其中Bad
是一个不等于true
或false
的项,它不应该以badarg
失败;相反,该失败被静默忽略。此错误是在erts-5.5.2
中引入的。自身 ID:OTP-6627 辅助 ID:OTP-6160
异步线程的最小和默认堆栈大小已增加到 16 千字。这是因为之前 8 千字的最小和默认堆栈大小被证明太小(在
erts-5.5.4.2
中引入)。自身 ID:OTP-6628 辅助 ID:OTP-6580,Seq10633
改进和新功能
process_flag/2 接受新的标志
sensitive
。自身 ID:OTP-6592 辅助 ID:seq10555
Erts 5.5.4.2
修复的错误和故障
当一个端口从另一个端口窃取对文件描述符的控制权时,窃取端口会测试另一个端口是否存活。这是为了能够给出准确的错误消息。在支持 SMP 的运行时系统中,此测试是在未持有适当锁的情况下完成的。在最坏的情况下,这可能会导致错误的错误消息;因此,此错误被认为是无害的。
自身 ID:OTP-6602
改进和新功能
异步线程池中线程的默认堆栈大小已缩小到 8 千字,即在 32 位架构上为 32 KB。选择此较小的默认大小是因为异步线程的数量可能很大。默认堆栈大小对于随 Erlang/OTP 一起交付的驱动程序来说足够大,但对于使用
driver_async()
功能的其他动态链接驱动程序来说可能不够大。可以通过 erl 的+a
命令行参数配置异步线程池中线程的建议堆栈大小。* 潜在的不兼容性 *
自身 ID:OTP-6580
Erts 5.5.4.1
修复的错误和故障
在使用 heart 的 Linux 机器上设置时间,而该机器上的模拟器使用 clock_gettime 支持构建(Linux 2.6/erts-5.5.4 及更高版本的默认设置)可能会导致 heart 命令触发。这是由于 heart 可执行文件中的错误,该错误现已得到纠正。
自身 ID:OTP-6598 辅助 ID:seq10614
Erts 5.5.4
修复的错误和故障
更正了
erlc
的帮助文本中 “-pz
” 的拼写错误。(感谢 Ulf Wiger。)自身 ID:OTP-6433
code:module_md5/1
、beam_lib:md5/1
以及编译器为vsn
属性的默认值所做的 BEAM 文件 MD5 计算都已更改,以便其结果在所有平台上都相同;包含 fun 的模块在不同平台上可能会获得不同的 MD5。自身 ID:OTP-6459
如果 fun 的环境中有大量项,则模拟器在写入
erl_crash.dump
文件时可能会转储核心。由于无论如何都无法在 crashdump_viewer 应用程序中检查 fun 的环境,因此现在会在转储 fun 之前将其环境中的变量设置为 []。(感谢 Jean-Sebastien Pedron。)自身 ID:OTP-6504
从使用
exit_status
选项打开的端口发送的{Port, {exit_status, S}}
消息在极少数情况下可能会延迟。此错误存在于除 SunOS 之外的所有 Unix 操作系统上不支持 SMP 的 Erlang 运行时系统中。自身 ID:OTP-6528
linuxthreads 中的一个错误可能导致模拟器在首次调用 dlopen() 之前调用 dlerror() 时转储核心。作为一种解决方法,当使用 linuxthreads 作为线程库时,模拟器始终在初始化时调用 dlopen()。
自身 ID:OTP-6530
file:sync/1 在 Windows 上没有任何作用。现在它会调用系统函数来刷新缓冲区 (FlushFileBuffers())。(感谢 Matthew Sackman。)
自身 ID:OTP-6531
当无法创建端口时,
open_port/2
在支持 SMP 的运行时系统上可能会因错误的退出原因而失败。发生这种情况时,退出原因通常是eintr
或ebusy
而不是eagain
。自身 ID:OTP-6536
文件驱动程序 (efile_drv) 在设置超时时间后,而不是在下一次文件操作时,没有刷新使用“delayed_write”选项写入的数据。此错误现已得到纠正。
自身 ID:OTP-6538
改进和新功能
已实现面向 SCTP 套接字 API 扩展的接口。这是 Serge Aleynikov 和 Leonid Timochouk 提供的开源补丁。Erlang 代码部分已由 OTP 团队调整,稍微更改了 Erlang API。
Erlang 接口由模块
gen_sctp
和包含文件-include_lib("kernel/include/inet_sctp.hrl").
组成,用于选项记录定义。gen_sctp
模块已记录在案。在 OTP 团队重写之前,交付的开源补丁是根据 http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13 编写的,并且声称工作正常,已在 Linux Fedora Core 5.0(内核 2.6.15-2054 或更高版本)和 Solaris 10 和 11 上进行了测试。OTP 团队的重写使用了相同的标准文档,但可能意外地破坏了一些功能。如果是这样,它将很快被修补到工作状态。C 语言中的棘手部分和总体设计基本没有改变。在重写期间,代码在 SuSE Linux Enterprise Server 10 上进行了手动测试,并在 Solaris 10 上进行了简短测试。非常感谢对代码和文档的反馈。
SCTP 接口处于测试阶段。它仅经过手动测试,并且在 OPT 中没有自动测试套件,这意味着并非所有内容都经过了测试。套接字活动模式已损坏。尚未测试 IPv6。由于 API 的更改,文档已重做,但在此之后尚未校对。
OTP 团队感谢 Serge Aleynikov 和 Leonid Timochouk 的宝贵贡献。我们希望我们没有把它搞砸太多。
自身 ID:OTP-6336
现在
term_to_binary/2
识别{minor_version,Version}
选项。与之前的编码相比,{minor_version,1} 将以精确且更节省空间的方式对浮点数进行编码。自身 ID:OTP-6434
有一个新的
escript
程序,可用于以 Erlang 编写脚本。Erlang 脚本不需要编译,并且可以向它们传递任何参数,而无需担心它们被 Erlang 系统解释。自身 ID:OTP-6505
现在允许以“原始”方式设置和获取套接字选项。使用此功能将不可避免地产生不可移植的代码,但允许在确实具有这些选项的 TCP 堆栈上设置和获取任意不常见的选项。
自身 ID:OTP-6519
Erlang 运行时系统中支持 SMP 的杂项信号处理改进。
当在系统上找到 pthread 自旋锁时,现在使用 pthread 自旋锁来实现自旋锁和原子操作的回退实现。
现在,支持 SMP 的 Erlang 运行时系统可以在具有 Linuxthreads 而不是 NPTL(Native POSIX Thread Library)的 Linux 系统上运行。请注意,与 NPTL 相比,SMP 支持尚未在 Linuxthreads 上进行过全面测试。因此,当未找到 NPTL 时,默认情况下不会在 Linux 上构建支持 SMP 的运行时系统。为了强制构建支持 SMP 的运行时系统,请在构建 OTP 时将
--enable-smp-support
传递给configure
。自身 ID:OTP-6525
Erts 5.5.3.1
修复的错误和故障
erlang:system_flag(multi_scheduling, block)
可能导致支持 SMP 的模拟器死锁。自身 ID:OTP-6431 辅助 ID:OTP-6403
支持 SMP 的运行时系统未能调用处于关闭状态的端口的驱动程序超时回调。这可能导致端口无法刷新其 I/O 队列。
自身 ID:OTP-6432
在支持 SMP 的运行时系统中,来自已关闭端口的
{Port, closed}
消息可能会在Port
从erlang:ports/0
的结果中删除之前到达端口所有者。自有 ID: OTP-6437
在支持 SMP 的运行时系统中,通过
driver_async
创建的异步作业的异步 ID 不是以线程安全的方式创建的。在最坏的情况下,这可能导致driver_async_cancel()
取消了错误的异步作业。自有 ID: OTP-6438
在极少数情况下,两个节点之间终止的连接可能导致两个节点在支持 SMP 的运行时系统上立即重新连接失败。
自有 ID: OTP-6447
在 erts 版本 5.5.3 (
driver_entry(3)
) 的驱动程序入口字段extended_marker
的文档中,有如下说明:“如果此字段等于0
,则忽略以下字段”。这是一个文档错误,已更改为:“如果此字段等于0
,则此字段之后的所有字段也必须为0
,或者如果它是指针字段则为NULL
”。加载驱动程序时对旧的不兼容驱动程序的运行时检查已得到改进。但是,模拟器无法确保不使用扩展驱动程序接口的驱动程序是不兼容的。因此,当加载不使用扩展驱动程序接口的驱动程序时,即使驱动程序不兼容,也存在加载它的风险。当驱动程序使用扩展驱动程序接口时,模拟器可以验证它是否是不兼容的驱动程序版本。因此,建议您使用扩展驱动程序接口。
有关更多信息,请参阅
erl_driver(3)
和driver_entry(3)
文档。自有 ID: OTP-6452 辅助 ID: OTP-6330
在支持 SMP 的运行时系统上终止端口时,删除与进程的链接是在没有锁定进程上的链接锁的情况下完成的。这可能导致模拟器崩溃。
自有 ID: OTP-6475
当端口通过从超时驱动程序回调调用
driver_async()
来刷新其 I/O 队列时,支持 SMP 的模拟器可能会崩溃。自有 ID: OTP-6479
在极少数情况下,较大的退出原因可能导致支持 SMP 的运行时系统崩溃。
自有 ID: OTP-6521
改进和新功能
较新的 Linux 内核上使用更快的系统调用来保持时间准确,这可以显著加快这些系统上模拟器的速度。
自有 ID: OTP-6430
已将异步线程数和调度器线程数添加到可以通过
driver_system_info()
检索的系统信息中。有关更多信息,请参阅erl_driver(3)
文档。自有 ID: OTP-6440
当支持 SMP 的运行时系统收到
SIGUSR1
时,erl_crash.dump
现在由一个特殊的线程写入,而不是像以前那样直接从信号处理程序写入。自有 ID: OTP-6465
使用压缩的 term_to_binary/2 现在更快了。
term_to_binary/2 现在接受选项 '
{compressed,Level}
' 来指定压缩级别。Level
必须在 0(无压缩)到 9(最高压缩级别)的范围内。默认为 6。未来的兼容性错误修复:binary_to_term/1 没有正确处理
Uniq
和Index
字段。自有 ID: OTP-6494
在初始化 kernel-poll 集时,删除了不必要的重新分配。
自有 ID: OTP-6516
Erts 5.5.3
已修复的错误和故障
在支持 SMP 的模拟器上,节点和函数表条目在极少数情况下可能会被多次释放。
自有 ID: OTP-6369
epoll_wait() 可以在结果数组中重复同一文件描述符的条目。这可能导致驱动程序的 ready_input、ready_output 或 event 回调被意外多次调用。我们仅在文件描述符上发生错误情况时才注意到重复的条目。在这种情况下,重复的条目通常对驱动程序来说不是问题,因为它应该检测到错误并取消选择文件描述符。因此,此错误应被认为是无害的。模拟器现在将重复的条目合并为一个。
如果您在 Linux 上使用 erts-5.5.2.* 和 kernel-poll 功能,您才会受到此错误的影响。
自有 ID: OTP-6376 辅助 ID: OTP-6222
如果一个在 gen_tcp:accept/1 中等待的进程被杀死,则在同一侦听套接字上再次调用 gen_tcp:accept/1 将失败,并显示 '
{error,einval}
'。自有 ID: OTP-6381 辅助 ID: seq10535
当启用 kernel-poll 支持并且配置的最大文件描述符数小于或等于 256 时,模拟器在 Solaris 10 上启动失败。
自有 ID: OTP-6384 辅助 ID: OTP-6222
R10B 编译器可能会生成不安全的
bs_save/bs_restore
指令,这可能会导致内存损坏。(R11B 编译器没有这个问题。)Erlang 模拟器现在将拒绝加载包含此类不安全的bs_save/bs_restore
指令的 R10B 编译的模块。此外,编译器中的 beam_validator 模块也将拒绝此类指令(以防它用于验证 R10B 代码)。(感谢 Matthew Reilly。)自有 ID: OTP-6386
进程和端口计时器在支持 SMP 的运行时系统上可能无法正常工作。非常感谢 Dmitriy Kargapolov 和 Serge Aleynikov 追踪到了这个错误。
自有 ID: OTP-6387
R10B 编译器编译的位语法代码,如果匹配出一个浮点数,则不会正确检查该浮点数是否有效;例如,如果浮点数是 NaN,模拟器可能会崩溃。
自有 ID: OTP-6395
Windows 上的 statistics(runtime) 过去返回的是进程的系统运行时间,而不是用户运行时间。已更正。(感谢 Robert Virding。)
自有 ID: OTP-6407
使用 driver_async() 的可加载驱动程序(由 erl_ddll 加载)会导致模拟器崩溃。(感谢 Dmitriy Kargapolov。)
自有 ID: OTP-6410
在极少数情况下,Unix 平台上的模拟器可能无法终止与使用
exit_status
选项打开的端口程序相对应的 Erlang 端口。自有 ID: OTP-6411
当使用支持 SMP 的运行时系统时,通过
unlink/1
删除的链接在调用unlink/1
返回后的一小段时间内可能会传输退出信号。自有 ID: OTP-6425 辅助 ID: OTP-6160
改进和新功能
在支持 SMP 的运行时系统中,端口现在与进程交错在调度器线程上进行调度,而不是在单独的 I/O 线程中运行。
自有 ID: OTP-6262
erl_ddll 中添加了更多接口,以支持不同的使用场景。
自有 ID: OTP-6307 辅助 ID: OTP-6234
在支持 SMP 的运行时系统中,全局 I/O 锁已替换为更细粒度的端口锁定方案。端口锁定可以在驱动程序级别完成,即,执行同一驱动程序的所有端口共享一个锁,也可以在端口级别完成,即,每个端口都有自己的锁。目前,inet 驱动程序、efile 驱动程序和 spawn 驱动程序使用端口级别锁定,所有其他静态链接的驱动程序都使用驱动程序级别锁定。默认情况下,动态链接的驱动程序将使用驱动程序级别的锁定。有关如何启用端口级别锁定的更多信息,请参阅
erl_driver(3)
和driver_entry(3)
手册页。从 erts 版本 5.5.3 开始,驱动程序接口已扩展。扩展的接口引入了版本管理、在驱动程序初始化时将功能标志传递给运行时系统的可能性以及一些新的驱动程序 API 函数。例如,
driver_system_info()
函数,可用于确定驱动程序是否在支持 SMP 的运行时系统中运行。扩展接口不必使用,但是动态链接的驱动程序必须重新编译。有关信息,请参阅erl_driver(3)
和driver_entry(3)
手册页。注意:动态链接的驱动程序必须重新编译。
* 潜在的不兼容性 *
自有 ID: OTP-6330 辅助 ID: OTP-6262
添加了一个修改运行时系统计时的测试和调试功能。有关更多信息,请参阅 erl 的
+T<Level>
命令行参数的文档。自有 ID: OTP-6382
链接到运行时系统中的 zlib 版本 (http://zlib.net) 已更新到 1.2.3 版本。
自有 ID: OTP-6394
erlc
程序现在将-smp
和-hybrid
选项传递给它启动的 Erlang 模拟器。这主要用于编译本机代码,因为本机代码必须使用与运行时系统相同类型的运行时系统进行编译。如果给出了
-s
选项,erlc
现在会打印警告,提示该选项已弃用,将在 R12B 中删除。自有 ID: OTP-6398
已删除
erlang:system_flag/2
的schedulers
选项,即,在模拟器启动后,不能再更改调度器线程的数量。已将
multi_scheduling
选项添加到erlang:system_flag/2
。此选项可用于阻止和取消阻止多调度。有关更多信息,请参阅erlang
文档。自有 ID: OTP-6403
使用
exit_status
选项启动并且关闭了用于与模拟器通信的管道之一的端口程序会导致模拟器不断轮询端口程序的终止。只有当模拟器没有其他事情要做并且端口程序在终止之前很早就关闭了管道时,这才会成为问题。当模拟器有其他事情要做时,例如运行 Erlang 进程,模拟器会在进程调度之间轮询终止。现在,模拟器根本不会轮询端口程序的终止;相反,它会等待来自已终止端口程序的子信号到达,然后调度 Erlang 端口进行终止。
任何端口程序的终止也已得到优化。以前,任何端口程序的终止总是会导致扫描大小等于最大文件描述符数的表。如果最大文件描述符数很大,则此扫描可能会非常昂贵。现在,搜索已减少到使用
exit_status
选项启动的端口集。请注意,以上所有内容仅适用于 Unix 平台上的 Erlang 模拟器。
自有 ID: OTP-6412 辅助 ID: seq10194
* BEAM:在 FreeBSD(32 位 x86)上添加了对浮点异常的支持
* SMP:即使在未实现本机锁操作时,也使锁定程序正常工作
* SMP:提高了定时器线程中的计时精度(如果启用)
自有 ID: OTP-6424
Erts 5.5.2.2
修复的缺陷和故障
内核轮询实现中的一个错误可能导致模拟器忽略对文件描述符上的事件进行轮询。该错误仅在使用基于 epoll 或 kqueue 的内核轮询实现时出现。此错误是在 erts-5.5.2 中引入的。
自有 ID:OTP-6344 辅助 ID:OTP-6222
Erts 5.5.2.1
修复的缺陷和故障
现在,run_erl 程序使用 openpty(3) 获取其伪终端,以便它可以在较新的 Linux 发行版上工作,这些发行版在文件系统中没有传统的伪终端设备。在没有 openpty(3) 的平台上,run_erl 仍然会在文件系统中搜索伪终端设备。
现在,run_erl 程序将使用 waitpid(3) 等待,以防止它产生的程序变为失效。如果产生的程序终止,即使它的某些子程序仍然打开 stdin 和/或 stdout,run_erl 也将在延迟 5 秒后终止(以允许任何挂起的输出写入日志文件)。
自有 ID:OTP-6225 辅助 ID:seq10500
ordered_set ETS 数据类型中的一个错误导致 ets:select(和 match)在表包含来自另一个节点的进程 ID 时返回错误的结果。
自有 ID:OTP-6338
Erts 5.5.2
修复的缺陷和故障
erlc:更正了 '-pa path' 帮助文本中的一个错别字。
自有 ID:OTP-6218
端口命令/控制驱动程序回调中的故障可能会导致非 SMP 模拟器崩溃。此错误是在 erts 的 5.5 版本中引入的。
自有 ID:OTP-6224
当驱动程序实例在驱动程序的 ready_output() 回调中终止时,有时可能会出现错误的“
输入驱动程序在未取消选择的情况下消失!
”错误报告。此错误仅在使用 poll() 的模拟器中存在。请注意,此错误是无害的,它唯一的效果是错误的错误报告。自有 ID:OTP-6229 辅助 ID:OTP-3993,Seq5266,Seq7247,OTP-4307
模拟器可能会在写入 erl_crash.dump 时导致类型断言失败,从而导致 erl_crash.dump 终止并生成核心转储。
自有 ID:OTP-6235 辅助 ID:seq10444
进程的注册名称现在是进程终止时触发链接和监视器之前删除的最后一个可观察资源。
以前,ets 表是在注册名称之后删除的。如果代码期望特定进程拥有的 ets 表在进程名称被删除后已被删除,这可能会导致运行时系统在 SMP 支持方面出现问题。
自有 ID:OTP-6237
fork() 新的(操作系统)进程失败可能会导致模拟器死锁。此错误会影响所有具有 SMP 支持的模拟器以及 SunOS 上具有异步线程支持的模拟器。
自有 ID:OTP-6241 辅助 ID:OTP-3906
SMP 模拟器的 Fprof 跟踪可能会被截断。此错误现已更正。
自有 ID:OTP-6246
未公开的函数 inet:getiflist/0,1 inet:ifget/2,3 和 inet:getif/1 在 Windows 上完全损坏。这已被修复。
自有 ID:OTP-6255
当使用 dist_auto_connect 时,在 R11B-1 中曾经更改了节点消失时的行为。现在,关于正常分布式操作的超时已恢复为旧的(R11B-1 之前)。
自有 ID:OTP-6258 辅助 ID:OTP-6200,seq10449
如果给出无效参数,bsl 和 bsr 运算符可能会导致模拟器崩溃。(感谢 datacompboy 和 Per Gustafsson。)
自有 ID:OTP-6259
driver_cancel_timer() 在某些情况下可能无法在具有 SMP 支持的运行时系统上取消计时器。
自有 ID:OTP-6261
调用 erlang:system_info(info) 可能会导致具有 SMP 支持的运行时系统死锁。
自有 ID:OTP-6268
改进和新功能
现在,在具有 SMP 支持的运行时系统中,退出信号是真正的异步的。这大大简化了 bifs 中的锁定,并使进程终止成本更低。
自有 ID:OTP-6160
在具有 SMP 支持的运行时系统中进行跟踪时,很难知道何时已将跟踪传递给跟踪器。引入了一个新的内置函数
erlang:trace_delivered/1
,以便更容易知道跟踪何时已传递。有关更多信息,请参见 erlang(3) 手册页。自有 ID:OTP-6205 辅助 ID:OTP-6269
内核轮询支持现在可以与 SMP 支持结合使用。目前存在以下内核轮询版本:
/dev/poll
、epoll
和kqueue
。Linuxkpoll
已被epoll
取代。在将来某个时候,还将有一个使用 Solaris 事件端口的内核轮询版本。unix 的“检查 io”实现已完全重写。与旧的内核轮询实现相比,当前的内核轮询实现减少了所需的系统调用数量。
当使用
epoll
或kqueue
时,poll
或select
用作回退。以前,只有poll
可以用作回退。由于现在可以将select
用作回退,因此内核轮询支持现在也可在较新的 MacOSX 上使用。但是请注意,当select
用作回退时,最大文件描述符数限制为FD_SETSIZE
。如果在构建 OTP 时找到
/dev/poll
、epoll
或kqueue
,则默认启用内核轮询支持,即您无需将--enable-kernel-poll
参数传递给configure
。与以前一样,内核轮询在运行时系统中默认处于禁用状态。为了启用它,请将+Ktrue
命令行参数传递给erl
。注意:
configure
将拒绝在 FreeBSD 上启用内核轮询支持,因为kqueue
在我们测试过的所有 FreeBSD 版本中都存在(至少)管道问题。自有 ID:OTP-6222 辅助 ID:seq10380
erl_ddll
模块和模拟器中的代码已完全重写;修复了一些错误。自有 ID:OTP-6234
SMP 模拟器现在避免为以下操作进行锁定(从而使其与 UP 模拟器一样快):
atom_to_list/1
、原子比较、原子哈希、erlang:apply/3
。自有 ID:OTP-6252
有新的 BIF
erlang:spawn_monitor/1,3
,以及spawn_opt/2,3,4,5
的新选项monitor
。observer_backend
模块已更新以处理新的 BIF。自有 ID:OTP-6281
Erts 5.5.1.1
改进和新功能
现在,UDP 套接字有一个选项 read_packets,它设置每次调用套接字驱动程序时将读取的最大 UDP 数据包数。
自有 ID:OTP-6249 辅助 ID:seq10452
Erts 5.5.1
修复的缺陷和故障
由于加载程序中的一个错误,字符串的复杂模式匹配会在 64 位模拟器中失败。(感谢 Igor Goryachev。)
自有 ID:OTP-6142
-134217728 div 134217728
和-134217728 rem 134217728
的计算不正确。abs(-2147483648)
在不幸的情况下可能会导致堆溢出,当二进制文件的大小大于 128Mb 时,size(Binary) 也会导致堆溢出。自有 ID:OTP-6154
erlang:display/1 显示负整数的错误值。
以前,大整数(正数和负数)以十六进制形式显示,而小整数以十进制形式显示。现在所有整数都以十进制形式显示。
注意:erlang:display/1 仅应用于调试。
自有 ID:OTP-6156
使用错误的标志调用 erlang:trace/3 会导致 SMP 模拟器死锁,而不是使用 badarg 退出调用进程。
自有 ID:OTP-6175
已修复导致模拟器在退出异常跟踪的进程时挂起的一个错误。
自有 ID:OTP-6180
当表不是命名表时,ets:rename/1 可能会死锁或导致 SMP 模拟器崩溃。
ets:next/2 和 ets:prev/2 可能会在 SMP 模拟器上返回错误的结果。
自有 ID:OTP-6198 辅助 ID:seq10392,seq10415
当进程执行一个超时时间大于 10 分钟的
receive after
时,内存分配错误可能会导致 SMP 模拟器崩溃。自有 ID:OTP-6199
当系统时间突然改变时,具有 SMP 支持的运行时系统不会缓慢调整其时间视图。
在具有 SMP 支持的运行时系统上,超时有时可能过早超时。
自有 ID:OTP-6202
改进和新功能
smp 运行时系统现在自动检测 MacOSX (darwin) 和 OpenBSD 上的逻辑处理器数量。
现在,默认情况下在 x86 上的 MacOSX (darwin) 上构建 smp 运行时系统。
自有 ID:OTP-6119
现在,
-smp
命令行参数采用以下选项:enable
、auto
或disable
。尤其是
-smpauto
参数很有用,因为它会在可用且检测到多个逻辑处理器时启动具有 SMP 支持的 Erlang 运行时系统;否则,它会在没有 SMP 支持的情况下启动 Erlang 运行时系统。有关更多信息,请参见 erl 手册页。自有 ID:OTP-6126
增加了 SMP 模拟器中发送消息的规约成本,使其行为更像非 SMP 模拟器。
自有 ID:OTP-6196
由于驱动程序被卸载而退出的运行动态链接驱动程序的端口现在以退出原因
driver_unloaded
退出。以前,端口以退出原因-1
退出。* 潜在的不兼容性 *
自有 ID:OTP-6204
更改了
erlang:system_info/1
参数scheduler
的名称为scheduler_id
。这是因为scheduler
参数很容易与schedulers
参数(两者都返回整数)混淆。* 潜在的不兼容性 *
自有 ID:OTP-6208
以下更改由 HiPE 的 Mikael Pettersson 完成。
HiPE 运行时系统
减少 HiPE 运行时系统的 BIF 粘合代码中的开销。
修复从 BEAM 抛出异常到 HiPE 时的错误。
支持 Linux 上的 SPARC。
支持 FreeBSD 上的 x86。
浮点异常
减少检查浮点运算结果的开销。
SSE2 浮点异常处理中的小错误修复。
在 32 位 x86 机器上支持 SSE2 浮点异常。
使 FreeBSD/x86 上的 SMP 运行时系统中的 FP 异常工作。
支持运行 Linux 的 SPARC 上的浮点异常。
运行时系统
非 SMP 运行时系统中的小调度器优化。
如果使用单独的计时器线程,则在 SMP 运行时系统中,I/O 线程开销显着减少。(在 R11B-1 中,不使用单独的计时器线程。)
自有 ID:OTP-6211
ERTS 5.5
修复的错误和故障
之前,
unlink/1
和erlang:demonitor/2
的行为是完全异步的。但这有一个不理想的后果。你永远无法知道何时可以保证不受你已取消的链接或取消监视的监视器的影响。unlink/1
和erlang:demonitor/2
的新行为可以看作是原子性地执行两个操作。异步发送取消链接信号或取消监视信号,并忽略链接或监视器的任何未来结果。注意:此更改可能会导致一些之前没有失败的晦涩代码失败。例如,以下代码可能会挂起
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,
* 潜在的不兼容性 *
自身 ID: OTP-5772
修复了两个错误:如果设置了环境变量
ERL_FLAGS
,其内容将被追加到命令行末尾,即使命令行有-extra
选项。已更改为将ERL_FLAGS
中的选项放置在-extra
之前。此外,如果-smp
和-hybrid
标志放置在-extra
之后,则不再起任何作用。自身 ID: OTP-6054
改进和新特性
ERTS 用户指南中关于编写驱动程序的文档已扩展和更新。
自身 ID: OTP-5192
现在允许在守卫中使用
andalso
和orelse
运算符。这也适用于匹配规范。自身 ID: OTP-5894 辅助 ID: OTP-5149
有一个新的跟踪匹配规范函数
{exception_trace}
和相应的跟踪消息exception_from
,可用于跟踪任何函数的退出,包括正常函数返回和异常返回。有关详细信息,请参阅文档。当执行由于捕获异常而返回到函数时,现在也会生成
return_to
跟踪消息。自身 ID: OTP-5956
支持 SMP(对称多处理)的 Erlang 运行时系统。
此版本中支持 SMP 的运行时系统专注于稳定性,并且在充分利用多处理器系统之前,还需要进行许多优化步骤。然而,发布的系统是真正的多线程,您会发现许多应用程序的性能已经有所提高。我们建议您在运行时系统的 SMP 版本上评估您的应用程序,并在实际产品中使用之前等待更多的优化。然后,您将发现您的应用程序中是否存在需要在多线程环境中正常工作而需要修复的任何问题。具有 SMP 支持的运行时系统的更多优化版本将包含在 R11B 维护版本中。
如果将
-smp
命令行参数传递给erl
命令,则将启动启用 SMP 的运行时系统。为了利用多个处理器核心,使用了多个调度器线程。默认情况下,调度器线程的数量将等于处理器核心的数量。可以使用+S
命令行参数设置调度器线程的数量。有关更多信息,请参阅 erl 手册页。如果在以下平台上找到 POSIX 线程和至少版本为 2.95 的 gcc 编译器,则默认情况下会在这些平台上构建支持 SMP 的运行时系统
- Linux,至少具有 2.6 内核版本以及 x86、x86_64 和 32 位 PowerPC 上的 Native POSIX Thread Library。
- Solaris,至少在 32 位 SPARC-V9 上为 8 版本。
- MacOSX,至少在 32 位 PowerPC 上为 10.4 版本(Darwin 8.0)。
已知支持 SMP 的运行时系统无法在以下平台上构建
- Windows。
- Linux,内核版本低于 2.4,或者没有 Native POSIX Thread Library。
- 除 x86、x86_64、32 位 SPARC-V9 和 32 位 PowerPC 之外的其他硬件平台。
Windows 将在未来的版本中支持。
支持 SMP 的运行时系统可能会在其他操作系统与支持的硬件组合上构建。为了强制构建支持 SMP 的运行时系统,请将
--enable-smp-support
命令行参数传递给 configure。但请注意,仅仅构建是不够的。底层线程库和操作系统也必须提供 SMP 支持。如果线程库没有在多个处理器核心上分发调度器线程,则运行时系统似乎只能提供 SMP 支持。如果运行时系统不是默认在特定平台上构建的,那么我们没有在该平台上对其进行过测试。注意:驱动程序 SMP 支持的设计正在进行中。可能会有不兼容的驱动程序更改(仅影响在支持 SMP 的运行时系统上运行的驱动程序)作为 R11B 的补丁发布。
潜在的不兼容性:之前,特定的驱动程序回调始终是从同一个线程调用的。在支持 SMP 的运行时系统中,情况并非如此。对回调的调用将来自不同的线程,例如,对同一个回调的两个连续调用可能来自两个不同的线程。这在大多数情况下不会成为问题。对回调的所有调用都是同步的,即一次只会调用一个回调。
将来,默认行为可能如下:对回调的调用将像现在一样从不同的线程进行。对同一驱动程序实例中的回调的调用将同步。可能可以配置为使对特定驱动程序类型的所有驱动程序实例中的回调的所有调用同步。可能会配置为使对驱动程序实例或特定驱动程序类型的所有回调调用都来自同一线程。
Erlang 代码中执行的并行性是 Erlang 运行时系统能够利用多核或多处理器硬件的必要条件。需要至少有与处理器核心数量一样多的可运行的 Erlang 进程,Erlang 运行时系统才能利用所有处理器核心。
始终只有一个 Erlang 进程可运行的支持 SMP 的 Erlang 运行时系统几乎总是比没有 SMP 支持的相同 Erlang 运行时系统慢。这是由于线程同步开销。
Erlang 运行时系统中已知的 主要瓶颈
- 目前,I/O 系统使用一个“大锁”,即一次只有一个线程可以进行 I/O 操作(异步线程和用户自己的链接驱动程序创建的线程除外)。这是需要优化的重要事项。请注意,不进行 I/O 操作的代码可以与一个线程进行 I/O 操作同时执行。
可能导致在非 SMP 运行时系统上工作的 Erlang 程序在 SMP 运行时系统上失败的一些陷阱
- 新生成的进程通常会立即开始执行。期望父进程能够在子进程开始执行之前执行一段时间的代码可能会失败。
- 高优先级进程以前可以通过阻止正常和低优先级进程运行来提供互斥(不良编程风格)。高优先级进程不能以这种方式用于提供互斥。
erlang:yield()
可用于提供某种临时互斥(也是不良编程风格)。erlang:yield()
不能用于提供任何类型的互斥。- 晦涩的陷阱,仅当正在跟踪的进程也向跟踪器发送正常消息时才会发生
跟踪消息和正常消息之间的顺序未定义。即,从被跟踪者发送到跟踪器的正常消息的顺序与从同一被跟踪者生成到同一跟踪器的跟踪消息的顺序未定义。正常消息的内部顺序和跟踪消息的内部顺序当然会像以前一样保留。
支持 SMP 的运行时系统目前不支持内核轮询功能。它可能会在未来的版本中得到支持。
* 潜在的不兼容性 *
自身 ID: OTP-6006 辅助 ID: OTP-6095
链接驱动程序修改。
- 必须重新编译链接驱动程序。
ErlDrvBinary
类型中的refc
字段已被删除。可以通过 API 函数访问引用计数。有关更多信息,请参阅erl_driver(3)
手册页。
* 潜在的不兼容性 *
自身 ID: OTP-6095 辅助 ID: OTP-6006
ERTS 5.4.13
修复的错误和故障
现在可以在 Solaris 8 上处理大文件(超过 2 GB)。
自身 ID: OTP-5849 辅助 ID: seq10157
失败的位语法结构可能会因为进程中先前发生的异常原因而失败(而不是
badarg
)。自身 ID: OTP-5911
构建 OTP 时,Kernel 应用程序在主引导步骤和辅助引导步骤中都会构建,如果将包括其引导程序的 OTP 检入版本控制系统(例如 CVS),则会导致问题。(感谢 Sebastian Strollo。)
自身 ID: OTP-5921
binary_to_term(<<131,109,255,255,255,255)
和类似的表达式过去会使模拟器崩溃,而不是导致badarg
异常。(感谢 Matthias Lang。)自身 ID: OTP-5933
当不需要堆时,
erlang:hibernate/3
有时可能会使模拟器崩溃。自身 ID: OTP-5940
在极少数情况下,执行匹配规范可能会导致模拟器转储核心。
执行匹配规范可能会导致混合模拟器中的内存泄漏。
自身 ID: OTP-5955
更正了当获取已删除模块中函数的信息时,
erlang:trace_info/2
中的错误,该错误会导致模拟器崩溃。自身 ID: OTP-5957
ERTS 和 Erl_Interface 应用程序中不同的(且旧的)
config.guess
文件会导致在新的基于 Intel 的 iMac 上出现构建问题。(感谢 Sebastion Strollo。)自身 ID: OTP-5967
在安装了 NPTL 和 Linuxthreads 库的 Linux 系统(至少是一些 SuSE 和 Debian)上,pthread 标头和库不匹配。
自身 ID: OTP-5981
改进和新特性
如果第二次调用 driver_set_timer,它不会更改之前的超时。现在它按照指定的方式工作,更改超时。
自身 ID: OTP-5942
未记录的
{packet,http}
选项(用于gen_tcp
模块)在存在多个连续行时无法正常工作。(感谢 Per Hedeland。)内部 ID:OTP-5945
更正了 setuid_socket_wrap 程序,使其适用于将
char
类型视为无符号的 C 编译器。(感谢 Magnus Henoch。)内部 ID:OTP-5946
ERTS 5.4.12
修复的错误和故障
修复了 Windows 上一个小的构建问题。
内部 ID:OTP-5819 辅助 ID:OTP-5382 OTP-5540 OTP-5577
gen_tcp
的delay_send
选项在 Windows 上已损坏。内部 ID:OTP-5822
如果启动脚本中存在用户定义的变量,并且未使用
-boot_var
选项提供其值,则仿真器将拒绝启动,并显示令人困惑的错误消息。已更正为显示清晰易懂的消息。修改了
prim_file
模块,使其不再依赖于lists
模块,从而可以使用用户定义的加载器启动仿真器。(感谢 Martin Bjorklund。)内部 ID:OTP-5828 辅助 ID:seq10151
改进和新功能
HiPE 编译器识别出更多的叶函数,从而使代码略快。
更正了 HiPE 的合并寄存器分配中的问题,这些问题会导致在编译非常大的函数(例如 Megaco 应用程序中的某些解析模块)时失败。
内部 ID:OTP-5853
ERTS 5.4.11
修复的错误和故障
计时器有时可能会过早超时。此错误现已修复。
引入了对由
erlang:send_after(Time,pid(),Msg)
和erlang:start_timer(Time,pid(),Msg)
创建的计时器的自动取消。当接收方退出时,将自动取消使用 pid 指定的接收方创建的计时器。有关更多信息,请参见erlang
手册页。为了能够在不增加维护成本的情况下维护更多计时器,内部计时器轮和 bfi 计时器表已扩大。
还实现了一些小的 bfi 计时器优化。
内部 ID:OTP-5795 辅助 ID:OTP-5090, seq8913, seq10139, OTP-5782
如果
Pid
指的是一个不存在的节点上的进程,而该节点的节点名称与进行调用的节点名称相同,则erlang:monitor(process,Pid)
会挂起。此错误现已修复。内部 ID:OTP-5827
改进和新功能
通过设置 Unix 环境变量,可以在仿真器写入崩溃转储时降低其优先级,并且可以将完成写入崩溃转储的允许时间设置为一定秒数。请参阅 ERTS 应用程序中
erl
的文档。(此外,一些以前未记录的环境变量现在也已记录。)内部 ID:OTP-5818
文档改进
- 更正了
erlang:link/1
的文档- 添加了命令行标志
-code_path_cache
-
erl
命令行标志说明-
net_kernel
说明内部 ID:OTP-5847
ERTS 5.4.10
修复的错误和故障
-D_GNU_SOURCE 现在始终在 linux 上的编译命令行中传递。这是为了确保所有包含的系统头文件都看到定义了 _GNU_SOURCE。
在 linux 上,在配置时查找功能时,现在也定义了 _GNU_SOURCE。
还修复了一些小的(无害的)配置错误。
内部 ID:OTP-5749
在 Tools 应用程序中消除了一些编译器警告和 Dialyzer 警告。
当跟踪到端口时(
fprof
会这样做),对于已退出的进程,可能会发送虚假的调度出/调度入消息。内部 ID:OTP-5757
改进和新功能
添加了 BIF
iolist_size/1
和iolist_to_binary/1
。添加了 BIF
list_to_existing_atom/1
。小错误修复:如果使用空堆栈跟踪调用
erlang:raise/3
BIF,则异常原因可能会在嵌套的 try/catch 构造中更改为error
。(不建议使用空堆栈跟踪调用erlang:raise/3
。)小错误修复:在 Windows 上,如果文件名引用目录,
file:open/2
现在将返回文档化的错误原因{error,eisdir}
(以前返回{error,eacces}
)。更正了
erlang:system_monitor/2
的文档中关于busy_dist_port
的描述。内部 ID:OTP-5709 辅助 ID:seq10100
以前未记录且不受支持的
zlib
模块已以不兼容的方式更新,并且已更正了许多错误。现在也记录在案。* 潜在的不兼容性 *
内部 ID:OTP-5715
支持新套接字选项
priority
和tos
的平台(目前仅限 Linux)。内部 ID:OTP-5756
现在只有仿真器与 termcap 库链接,以减少其他 otp 程序的库依赖性。
内部 ID:OTP-5758
ERTS 5.4.9.2
修复的错误和故障
本机解析器已获得用于扩展调试和软重启的控制 API。它是:
inet_gethost_native:control(Control)
Control = {debug_level,Level} | soft_restart
Level = integer() in the range 0-4
.内部 ID:OTP-5751 辅助 ID:EABln25013
ERTS 5.4.9.1
改进和新功能
在 VxWorks 上,epmd 不会处理大于 63 的文件描述符。此外,如果 epmd 获得的文件描述符的编号 >= FD_SETSIZE,它将关闭文件描述符并向日志写入消息(而不是神秘地失败);尝试注册的 Erlang 节点将因 duplicate_name 错误而失败(不幸的是,epmd 无法向 Erlang 节点指示注册尝试失败的原因)。
内部 ID:OTP-5716 辅助 ID:seq10070
ERTS 5.4.9
修复的错误和故障
时区数据现在初始化得更好。(至少在 NetBSD 2.0.2 上存在问题)感谢 Rich Neswold。
内部 ID:OTP-5621
混合堆仿真器('erl -hybrid')更加稳定。我们已经纠正了所有已知导致它在运行测试套件时转储核心的错误。
内部 ID:OTP-5634
修复了删除分布式监视器时
erlang:demonitor/1
中罕见的内存泄漏。内部 ID:OTP-5692
进程有时在终止时会被不必要地进行垃圾回收。这些不必要的垃圾回收现在已经消除。
内部 ID:OTP-5693
改进和新功能
如果系统中有超过 100 个进程,
c:i/0
函数现在将以分页模式运行。(感谢 Ulf Wiger。)erlang:system_info(process_count)
已得到优化,现在返回的值与length(processes())
完全相同。以前,erlang:system_info(process_count)
不包括length(processes())
中包含的正在退出的进程。用于
erl
的+P
标志(设置允许同时存在的最大进程数)不再接受高于 134217727 的值。(您可能仍然会在达到该限制之前耗尽内存。)内部 ID:OTP-5645 辅助 ID:seq9984
更新了术语构建驱动程序函数
driver_output_term()
和driver_send_term()
添加了 ERL_DRV_FLOAT 类型。
对于 ERL_DRV_BINARY 类型,现在会根据驱动程序二进制的长度验证长度和偏移量。
现在已实现 ERL_DRV_PID 类型(已记录,但未实现)。
内部 ID:OTP-5674
ERTS 5.4.8
修复的错误和故障
当删除大型表时,
ets:delete/1
现在允许其他 Erlang 进程运行。内部 ID:OTP-5572
修复了导致
gen_tcp:send/2
挂起的 tcp 套接字相关的错误。要遇到此错误,您需要一个从套接字读取的进程,一个写入的数据比读取器读取的数据多,因此发送器被挂起,然后读取器关闭套接字。(由 Alexey Shchepin 报告和诊断。)更正了
gen_tcp
的(未记录且不受支持的)选项{packet,http}
中的错误。(感谢 Claes Wikstrom 和 Luke Gorrie。)更新了关于
gen_tcp:recv/2
的第二个参数(要接收的Length
)的文档。内部 ID:OTP-5582 辅助 ID:seq9839
Erlang/OTP 现在将在 Mac OS X 10.4 “Tiger” 上构建(问题是 10.4 有一个部分实现的 poll() 函数,无法处理设备)。此外,在 Mac OS X 10.3 “Panther” 上,Erlang/OTP 现在将使用 select() 而不是 poll()(因为 Mac OS X 10.3 上的 poll() 是使用 select() 实现的)。
内部 ID:OTP-5595
修正了文件驱动程序在压缩模式下打开文件时的一个错误。该错误导致从压缩库返回的已分配指针位于非常高的内存地址(>= 2GB),从而导致例如
file:read/2
返回{error,ebadf}
。内部编号:OTP-5618
改进和新特性
新的函数构造
M:F/A
创建一个指向M:F/A
最新版本的函数。此语法旨在替代存在许多问题的元组函数{M,F}
。新的类型测试
is_function(Fun,A)
(可在 guard 中使用)测试Fun
是否是可以应用A
个参数的函数。(目前,Fun
也可以是元组函数。)内部编号:OTP-5584
在 HiPE 应用程序中,有一个新的实验性寄存器分配器(乐观合并),并且线性扫描寄存器分配器现在也可用于 ppc。此外还有许多清理工作。
对混合堆进行了小幅修正。
堆的最大大小过去被人为地限制为适合 28 位,这种限制可能会导致仿真器在垃圾回收时终止,即使仍有可用内存。现在,32 位 CPU 的最大堆大小为 1,699,221,830 字节。(感谢 Jesper Wilhelmsson。)
还删除了未记录的
+H
仿真器选项。内部编号:OTP-5596
ERTS 5.4.7
已修复的错误和故障
to_erl
在 Linux 系统上可能会意外关闭。此外,仿真器的输出可能会丢失。已修正。内部编号:OTP-5561
改进和新特性
现在 Linux 也支持
erlang:trace/3
的cpu_timestamp
选项。内部编号:OTP-5532 辅助编号:seq9813
当
werl
以窗口最小化的状态停止时,现在可以正确保存最后已知的werl
窗口大小/位置。如果仿真器从 JCL 菜单停止或停止,则不会保存位置的问题也已修复。内部编号:OTP-5544 辅助编号:OTP-5522
ERTS 5.4.6
已修复的错误和故障
某些数学库并非总是在出错时抛出浮点异常。为了能够使用这些库,现在更彻底地检查浮点错误。
针对 Linux 和 MacOSX 的各种浮点修复。
内部编号:OTP-5467
一个内部缓冲区有时未被清除,导致垃圾出现在发送到错误记录器的错误消息中。
errno
有时会被破坏,导致关于poll()
错误的错误报告。只有 Unix 平台上的仿真器受到这些错误的影响。
内部编号:OTP-5492
ethread 库现在可以在 OpenBSD 上运行。
内部编号:OTP-5515
修正了
gen_tcp
的(未记录且不支持的)选项{packet,http}
中的错误。(感谢 Claes Wikstrom 和 Luke Gorrie。)内部编号:OTP-5519
改进和新特性
当给定无效的 pid 或函数时,
binary_to_term/1
可能会导致仿真器崩溃。内部编号:OTP-5484 辅助编号:seq9801
混合堆仿真器中修复了一些更稳定的问题。
内部编号:OTP-5489
在窗口最小化的情况下关闭
werl
后,无法以打开的窗口重新启动werl
。目前已实施临时解决方案,该解决方案每次启动werl
时都会恢复初始窗口设置。内部编号:OTP-5522
ERTS 5.4.5
已修复的错误和故障
如果一个进程有节点链接(通过
monitor_node/2
创建),则对该进程执行process_info(Pid,memory)
会使仿真器崩溃。内部编号:OTP-5420
对
erlc -help
打印的帮助文本进行了小幅修正。还稍微更新了erlc
的文档。内部编号:OTP-5428
32 位字用于垃圾收集器中的偏移量。这会导致仿真器在垃圾回收期间堆移动超过 4 GB 时在 64 位机器上崩溃。
内部编号:OTP-5430
如果显式关闭优化,
is_boolean(42.5)
无法加载。内部编号:OTP-5448
如果从任何已加载的模块调用
Module:foo/X
,则M:module_info(exports)
返回的内容将始终包括{foo,X}
(即使Module:foo/X
未定义)。内部编号:OTP-5450 辅助编号:seq9722
改进和新特性
引入了
+B
标志的c
选项,该选项使可以使用 Ctrl-C(在 Windows 上为 Ctrl-Break)来中断 shell 进程,而不是调用仿真器中断处理程序。所有新的+B
选项现在也受 Windows (werl
) 支持。此外,Windows 上的 Ctrl-C 现在已保留用于复制文本(以前使用 Ctrl-Ins)。Ctrl-Break 应用于中断处理。最后,已更新系统标志的文档。内部编号:OTP-5388
ERTS 5.4.4
已修复的错误和故障
函数
erlang:float/1
现在可以在匹配规范中使用,并且可以被dbg:fun2ms/1
和ets:fun2ms/1
识别。此添加是“协调”匹配规范 guard 和 Erlang guard 的工作的一部分。内部编号:OTP-5297 辅助编号:OTP-4927
即使第二个参数不是活动进程的 pid,
register/2
BIF 也会返回true
。已更正为引发异常。内部编号:OTP-5324 辅助编号:seq9698
在 ets 表的“包”类型中,具有相同键的元素应该按插入顺序排序。如果发生重新哈希,则会出错。
内部编号:OTP-5340 辅助编号:seq9704
当仿真器启用线程支持时,现在使用
-D_THREAD_SAFE
和-D_REENTRANT
开关在 Unix 上编译 Crypto 和 Asn1 应用程序中链接的驱动程序。MacOSX 上链接的驱动程序不再使用未记录的
-lbundle1.o
开关进行编译。感谢 Sean Hinde 向我们发送的补丁。Crypto 中链接的驱动程序和 SSL 中的端口程序现在可以在 OSF1 上编译。
Runtime_Tools 中的小幅 Makefile 改进。
内部编号:OTP-5346
修复了分布式发送操作中混合堆中的一个错误。
内部编号:OTP-5361
添加了一个 BIF
erlang:raise/3
。有关详细信息,请参见手册。它仅用于内部系统编程,高级错误处理。内部编号:OTP-5376 辅助编号:OTP-5257
Mikael Pettersson (HiPE) 修正了仿真器中的一些错误,这些错误在使用实验性 gcc-4.0.0 编译时会导致问题。
内部编号:OTP-5386
改进和新特性
对
epmd
协议的内部文档进行了小幅更新。现在,
epmd
的监听端口已在 IANA 注册:http://www.iana.org/assignments/port-numbers。内部编号:OTP-5234
run_erl.c
现在可在 Mac OS X 和 FreeBSD 上运行。内部编号:OTP-5384
在 HiPE 应用程序中修正了一些错误。
内部编号:OTP-5385
ERTS 5.4.3
已修复的错误和故障
现在,即使在第一次运行
werl.exe
后,也可以保存werl.exe
的字体和颜色首选项。还会保存窗口位置和大小。来自 James Hague 的补丁,他完成了所有艰苦的工作。内部编号:OTP-5250
MacOSX 上的 OTP 存档库(例如
erl_interface
库)在没有先在其上重新运行ranlib
的情况下无法使用。此错误现已修复。内部编号:OTP-5274
修复了 64 位平台上
erlang:hash/2
和erlang:phash/2
中的错误。内部编号:OTP-5292
改进和新特性
修正了 64 位仿真器中的崩溃。
修正了混合堆仿真器中的一个问题。
在 ERTS 用户指南中关于抽象格式的章节中,更新了关于抽象格式如何存储在 BEAM 文件中的最后一节。
内部编号:OTP-5262
内部 ethread 线程包中的最大并发线程数已限制为 2048。
内部编号:OTP-5280
ERTS 5.4.2.1
改进和新特性
如果 Erlang/OTP 安装在短目录名称中,例如
C:\Program\erl5.4.2
,则仿真器将无法启动。内部编号:OTP-5254
ERTS 5.4.2
已修复的错误和故障
如果在一个非固定 ETS 表上同时使用
select/3
和select/1
并删除对象,则仿真器可能会崩溃。请注意,此类对非固定状态的表进行的并发操作的结果仍然是未定义的,但不用说,仿真器崩溃的问题已修复。内部编号:OTP-5209 辅助编号:seq9198
大数的算术运算可能会导致模拟器崩溃。
模拟器中的HiPE本地代码编译器和运行时代码已更新。(注意:仍不支持本地代码。)
修复了几个可能导致混合模拟器(不支持)崩溃的错误。
自有ID: OTP-5233 辅助ID: seq9587
ERTS 5.4.1
已修复的错误和故障
在构建过程中,ethread库被不必要地多次重建,并且在安装阶段构建了一个调试版本的库。现在已删除这些不必要的构建。 请注意,已安装的 Erlang/OTP 系统的内容完全不受此更改的影响。
自有ID: OTP-5203
模拟器可能无法清除内存段缓存。当内存使用接近最大值时,这可能会导致内存分配不必要地失败。 此错误现已修复。
自有ID: OTP-5211
std_alloc(std 是 standard 的缩写)有时被调用为 def_alloc(def 是 default 的缩写)。现在所有地方都将 std_alloc 称为 std_alloc。
自有ID: OTP-5216
erts_alloc(3)
文档中已更正了一个文档错误。 其中指出,默认情况下禁用了一些内存分配器。 这对于 Erlang/OTP R9C 是正确的,但对于 Erlang/OTP R10B 则不正确。 在 R10B 中,默认情况下启用所有存在的内存分配器。自有ID: OTP-5217
改进和新功能
模拟器现在在接收到 USR1 信号后立即关闭所有打开的文件和套接字。 这会导致模拟器尽早地在
epmd
中注销。自有ID: OTP-5221 辅助ID: OTP-4985, seq9514
模拟器中的 try/catch 支持略有更新。
自有ID: OTP-5229