檢視原始碼 ERTS 發行說明

本文檔描述了對 ERTS 應用程式所做的變更。

Erts 15.2

已修正的錯誤和故障

  • gen_sctp:peeloff/2 已修正,使其更像 gen_tcp:accept/1 一樣將 Socket 選項繼承到剝離的 Socket,例如 tostclass 選項。

    當設定平台上不支援的 SCTP 選項時,某些選項應靜默忽略,但一個錯誤導致選項剖析脫軌,因此後續的選項可能會中止並導致錯誤。此問題已修正。

    自有 ID:OTP-19225 輔助 ID:PR-8789

  • 修正了當 stdin 為 TTY 但 stdout 不是時,Erlang 會損壞終端設定的錯誤。

    自有 ID:OTP-19232 輔助 ID:PR-8794, GH-8487

  • 修正了在非 JIT VM 中,當透過多個工作階段追蹤的函式載入 NIF 時發生的錯誤。這會導致 VM 崩潰。此錯誤自 OTP-27.0(引入多個追蹤工作階段)以來一直存在。

    自有 ID:OTP-19248 輔助 ID:PR-8856

  • 修正了載入帶有極大二進位建構指令的模組時,模擬器在 AArch64 上崩潰的錯誤。

    自有 ID:OTP-19261 輔助 ID:GH-8815, PR-8816

  • 當使用 inet_backend = socket 時,inet:getifaddrs/0,1 得到改進。

    自有 ID:OTP-19264

  • 當值為大小為 0 的未終止 REG_SZ 時,win32reg:value/2 將不再使模擬器崩潰。

    自有 ID:OTP-19283 輔助 ID:GH-8903, PR-8912

  • 已修正 Windows 在 WSL 2 中 Makefile 的相依性產生。

    自有 ID:OTP-19300 輔助 ID:PR-8955

  • 修正了如果 NIF 監視器 down 回呼呼叫 enif_whereis_pid 時的鎖定順序違規。會導致偵錯模擬器崩潰,但可能會導致最佳化模擬器中的死鎖。

    自有 ID:OTP-19330 輔助 ID:GH-8983, PR-9008

  • 修正了使用 --enable-vm-probes 編譯時的編譯錯誤。

    自有 ID:OTP-19333

  • 修正了在 Windows 上使用 gcc 或 clang 時編譯的 erl_nif.h

    自有 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 訊息可能會浪費訊息的第一個片段,並僅傳遞最後一個片段。

    當作業系統發出訊號指示 Socket 已準備好進行讀取時,再加上內部逾時重試,就會發生這種情況(機率較低)。

    已修正一個錯誤,該錯誤與 SCTP 連線之後殘留的逾時有關,該逾時可能會停止活動 gen_tcp Socket 上傳入訊息的流程。

    自有 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 也可能會無限期地掛起

    • Socket 必須處於被動模式。
    • 所有輸出緩衝區都必須填滿,直到達到 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 例外的程式碼。

    自有 ID:OTP-19268 輔助 ID:GH-8875, PR-8895

  • 修正了在呼叫函式時重設函式的 call_timecall_memory 追蹤計數器時可能發生的 beam 崩潰。此錯誤自 OTP R16 以來就已存在。

    自有 ID:OTP-19269 輔助 ID:GH-8835, PR-8897

Erts 15.1.1

已修正的錯誤和故障

  • 在 Windows 上,連續失敗的 Socket 呼叫會導致 Socket 變成「未初始化」。

    自有 ID:OTP-19251 輔助 ID:#8853

  • Socket 架構無法在僅限 IPv6 的 Windows 機器上啟動。

    自有 ID:OTP-19254 輔助 ID:#8848

Erts 15.1

已修正的錯誤和故障

  • 已更正 erl -man example,使其不考慮在 ERL_ZFLAGS 中設定的值,並在遇到 -- 時停止剖析引數。

    自有 ID:OTP-19098 輔助 ID:PR-8478, GH-8477

  • 已靜默 Windows I/O 後端的編譯器警告。

    自有 ID:OTP-19113

  • 已修正與 return_to 追蹤相關的錯誤。它對多個追蹤工作階段無效,並且有時不會觸發例外。

    自有 ID:OTP-19122

  • 已消除寫入損毀傾印時的潛在死鎖。

    自有 ID:OTP-19133 輔助 ID:PR-8521, GH-8498

  • 當載入損毀或過舊的 BEAM 檔案時,執行階段系統可能會崩潰。

    自有 ID:OTP-19153 輔助 ID:PR-8623

  • 當其他排程器同時刪除和/或插入相鄰的載體時,排程器執行緒可能會在刪除記憶體配置器載體時陷入停滯。這反過來可能會導致其他排程器也陷入停滯。

    自有 ID:OTP-19154 輔助 ID:GH-8613, PR-8627

  • 在呼叫 instrument:allocationsinstrument:carriers 後,共用集區中載體數量的統計資料現在是正確的。此外,還消除載體區塊掃描中的潛在錯誤。

    自有 ID:OTP-19166 輔助 ID:PR-8636

  • 已修正 SSL 發佈的 kTLS 風味中的競爭,因此 inet_drv.c 不會超前讀取太多資料,這可能會導致在某些加密資料已作為未加密資料讀入 inet_drv.c 緩衝區時,kTLS 加密啟動太晚。

    自有 ID:OTP-19175 輔助 ID:GH-8561, PR-8690

  • 修正了與壓縮 ETS 表格相關的模擬器崩潰。

    自有 ID:OTP-19176 輔助 ID:PR-8683

  • 在 Windows 上,net nif 中使用多餘的引數呼叫了一個函式 (encode_sockaddr)。

    自有 ID:OTP-19181

  • 修正了重新配置失敗時可能發生的崩潰。

    自有 ID:OTP-19192

  • 現在提供 erlerlcdialyzer 和 Erlang/OTP 中包含的所有其他程式的手冊頁。

    自有 ID:OTP-19201 輔助 ID:PR-8740

  • 在 Erlang/OTP 27.0.1 緊急修補程式中的先前修正,有一個不幸的副作用,有時會導致不必要的完整掃描(主要)垃圾回收,而不是世代(次要)垃圾回收。此問題已修正。

    自有 ID: OTP-19209 輔助 ID: PR-8751, PR-8539

  • 修正追蹤匹配規格函式 traceenable_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.'}.

    自有 ID: OTP-19220 輔助 ID: PR-8774, GH-7621

改進和新功能

  • net 模組中新增函式 getservbynamegetservbyport

    自有 ID: OTP-19101 輔助 ID: OTP-18835

  • 引入 inet 函式的 enet | esock 變體,無論是在使用 sockets 呼叫時、使用明確的 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

    自有 ID: OTP-19123 輔助 ID: GH-8484, PR-8546

  • 修正使 Erlang VM 可執行檔的透明巨頁面對齊的選項,僅適用於 Erlang VM,而不適用於其他原生程式(例如 erlcdialyzer)。此錯誤是在 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]) 時,meta 追蹤器錯誤地設定為呼叫程序。現在它會如預期地設定為會期追蹤器。

    自有 ID: OTP-19151 輔助 ID: PR-8616, GH-8614

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]/*,如果資料立即可用,則可能會導致(案例子句)崩潰。

    自有 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 接收函式傳回的二進位檔,不再建立為通常很大的接收緩衝區二進位檔(socket 選項 {otp,rcvbuf})的子二進位檔。這可避免空間浪費,並信任配置器有效地實作重新配置。

    自有 ID: OTP-18642 輔助 ID: GH-6152, PR-7465

  • 預設程序限制已提高到 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 socket 選項為 oncetrueN 已進行最佳化,以及對應的資料傳輸。

    專屬 ID:OTP-18835

  • 新增了用於傳送 I/O 向量的 socket:sendv/* 函式。

    專屬 ID:OTP-18845

  • 接受字串的 Socket 選項現在也接受二進制資料。

    專屬 ID:OTP-18849 輔助 ID:PR-6510

  • JIT 中已實作原生覆蓋率支援。它將自動被 cover 工具使用,以減少執行經過覆蓋率編譯程式碼時的執行開銷。

    還有新的 API 可以在不使用 cover 工具的情況下支援原生覆蓋率。

    要對程式碼進行原生覆蓋率檢測,必須使用 line_coverage 選項進行編譯。

    若要在執行階段系統中啟用原生覆蓋率,請像這樣啟動它

    $ erl +JPcover true

    還有以下用於支援原生覆蓋率的新函式

    專屬 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

  • 當執行階段系統停止時,它會在終止前執行各種清除操作。預設情況下,不限制清除操作允許執行的時間。已引入新的「停止清除逾時」功能,可用於限制清除操作允許執行的時間。如需更多資訊,請參閱 erlang:halt/2 BIF 的 flush_timeout 選項的說明文件,以及 erl+zhft <Timeout> 命令列旗標的說明文件。

    專屬 ID:OTP-18938 輔助 ID:PR-8035GH-7438

  • 透過將某些操作從程式碼伺服器移動到呼叫者來最佳化程式碼載入。

    專屬 ID:OTP-18941 輔助 ID:PR-7981

  • 將 asmjit 更新到版本 a465fe71ab3d0e224b2b4bd0fac69ae68ab9239d

    專屬 ID:OTP-18942

  • 已移除 zlib 中已棄用的函式。這包括 inflateChunk/{1,2}getBufSize/1setBufSize/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.

    if 的三個子句中的每一個中的記錄更新可以安全地就地完成,因為變數 R 不會再次使用。

    專屬 ID:OTP-18972 輔助 ID:PR-8090

  • 已移除透過傳遞原子(或字串)作為 open_port() 的第一個引數來開啟外部資源連接埠的過時且未記錄的支援,此支援由 vanilla 驅動程式實作。自 OTP 26 發佈以來,此功能已排程在 OTP 27 中移除。

    專屬 ID:OTP-18976 輔助 ID:PR-7125

  • 當 NIF 函式庫卸載時,所有排程器執行緒都會呼叫可選的 NIF 回呼 ERL_NIF_OPT_ON_UNLOAD_THREAD。用於釋放執行緒特定資料。可以使用函式 enif_set_option 設定。

    專屬 ID:OTP-18977 輔助 ID:PR-7809

  • Kernel 中有一個新的模組 trace,它提供了與 erlang:trace/3erlang: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 說明文件,因此修復了一些細節

    • 例如,socket:is_supported/1 現在對於 protocols 等「類別」而非「項目」會傳回 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 訊息時,會浪費訊息的第一個片段,並且只傳送最後一個片段。

    當作業系統發出訊號指示 Socket 已準備好進行讀取時,再加上內部逾時重試,就會發生這種情況(機率較低)。

    已修復 SCTP 連線後持續逾時的錯誤,該錯誤可能會停止作用中的 `gen_tcp` socket 上傳入訊息的流動。

    專屬 ID:OTP-19235 輔助 ID:ERIERL-1133、PR-8837

  • 在 Windows 上,連續失敗的 Socket 呼叫會導致 Socket 變成「未初始化」。

    專屬 ID:OTP-19251 輔助 ID:GH-8853

  • Socket 架構無法在僅限 IPv6 的 Windows 機器上啟動。

    專屬 ID:OTP-19254 輔助 ID:GH-8848

  • 已為 SCTP 新增布林值選項 `non_block_send`,以便能夠實現舊的行為,透過傳遞 OS 網路堆疊錯誤訊息 (`{error,eagain}`) 來避免封鎖傳送操作。

    自有 ID:OTP-19258 輔助 ID:OTP-19061, ERIERL-1134

  • 在以下不幸的情況組合下,即使已設定 `send_timeout` 選項,`gen_tcp:send/2` 的呼叫也可能會無限期地掛起

    * socket 必須處於被動模式。所有輸出緩衝區都必須填滿,直到達到 `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_timecall_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 現在會等待傳送完成,而不是傳回 OS 結果,例如 {error, ewouldblock}

    專屬 ID:OTP-19061

  • ETS 函式無法正確處理包含地圖的索引鍵,有時會比對過多或過少的物件。

    專屬 ID:OTP-19070 輔助 ID:GH-8385

  • 修正 cgroups 的 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

  • 使用第一個參數為 portsprocessesexisting_portsexisting_processesexistingall 之一呼叫 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

  • 修正一個或多或少無害的錯誤,該錯誤導致在 Windows 平台上使用 QueryPerformanceCounter() 作為作業系統單調時間來源時,Erlang 單調時間的時間校正略微偏差。

    erlang:system_info(os_monotonic_time_source) 現在也回傳關於使用解析度的資訊,該解析度並不總是與作業系統單調時間來源的解析度相對應。

    自有 ID:OTP-19048 輔助 ID:PR-8343

  • 當使用 IPv6 時,經典的 gen_udp 無法新增(群組)成員資格(而是使用刪除)。

    自有 ID:OTP-19049 輔助 ID:#8176

  • 修正在 Windows 上「未知事件: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

  • 修正產生包含 persistent_term 儲存中 fun 位置的當機傾印時發生的分段錯誤。

    自有 ID:OTP-19009 輔助 ID:PR-8181

  • 預設情況下,由於 macOS Sonoma 上惱人的彈出視窗,JIT 在 Intel Mac 上已停用。現在可以在 Intel Mac 上明確啟用 JIT。方法如下:./configure --enable-jit

    自有 ID:OTP-19011

Erts 14.2.2

已修正的錯誤與故障

  • 如果 BIF 計時器設定的逾時時間遠大於未來 68 年,則大多數類 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

  • 現在已在 x86 Mac 上停用 JIT,以防止惱人的 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-ball。

    自有 ID:OTP-18902

Erts 14.2

已修正的錯誤與故障

  • 修正 erl.exe 在退出時將主控台還原至其原始狀態。此錯誤是在 OTP 26.0 中引入的,並且僅在 cmd.exe 中執行 erl.exe 時才會發生。

    自有 ID:OTP-18751 輔助 ID:GH-7621 GH-7548

  • 修正在 PowerPC 等頁面大小大於 16kb 時發生的錯誤除錯斷言。在啟動時直接使除錯 VM 崩潰。

    自有 ID:OTP-18802

  • zlib 不再隨機回傳垃圾(負)Adler32 檢查和。

    自有 ID:OTP-18811 輔助 ID:ERIERL-994

  • 將某些檔案中非故意的 Erlang 公共許可證 1.1 標頭取代為預期的 Apache 許可證 2.0 標頭。

    自有 ID:OTP-18815 輔助 ID:PR-7780

  • 當使用 receive 追蹤、使用 process_info/2 以及 message_queue_len 項目檢查或使用中斷選單 (CTRL-C) 檢查時,設定為 off_heapmessage_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 socket 連接的支援。

    自有 ID:OTP-18762

  • process_info/2 現在支援查詢程序字典中特定鍵的值。例如,{{dictionary, Key}, Value} = process_info(Pid, {dictionary, Key})

    自有 ID:OTP-18765 輔助 ID:PR-7707

  • 移除在產生讓步 BIF 時使用的不必要的 regexp 函式庫。

    自有 ID:OTP-18830 輔助 ID:PR-7823

  • 修正使用 +Bc 時 tty 還原的問題。

    自有 ID:OTP-18872 輔助 ID:GH-7832

  • 將舊的 md5 實作替換為 OpenSSL 的實作。

    自有 ID:OTP-18877

  • 移除未使用的 makewhatis 腳本。

    自有 ID:OTP-18899

Erts 14.1.1

修正的錯誤和故障

  • 如果分散式 spawn 操作的參數列表部分的外部 term 格式編碼有誤,新產生的遠端程序可能會行為異常。這種異常行為包括掛起或將傳入的訊息解讀為要使用的參數列表。除非使用分布協定的替代實作,且該實作產生了有誤的參數列表編碼,否則這種情況不太可能發生。子程序現在會偵測到這個錯誤,並在執行使用者指定的程式碼之前終止。

    自有 ID:OTP-18790 輔助 ID:PR-7742

  • 修正錯誤,如果 matchspec 的主體傳回一個將變數('$1'、'$_' 等)作為鍵或值的 map,且該變數不是立即值,則該 term 不會被複製到接收程序的堆積中。這會稍後損壞表格中的 term,因為 GC 可能會在其中放置移動標記,進而導致 VM 崩潰。

    此錯誤自 OTP 17.0 起就存在。

    自有 ID:OTP-18797 輔助 ID:PR-7712 GH-7683

Erts 14.1

修正的錯誤和故障

  • 如果 maps:put 使用現有鍵和相同的值,並且與 map 中的另一個鍵具有相同的 32 位元雜湊值,則不會被最佳化為 no-op。實際上非常罕見且無害。

    自有 ID:OTP-18592

  • 修正模擬器啟動失敗時截斷崩潰標語的問題。

    自有 ID:OTP-18623 輔助 ID:GH-7344

  • 修正模擬器無法判斷目前 cgroup CPU 配額的錯誤。

    自有 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 中的一個錯誤,當建立大小不是 8 位元偶數倍的位元字串時,它可能會意外新增垃圾尾部位元。

    自有 ID:OTP-18672 輔助 ID:GH-7469

  • 修正 erlang:system_info/1 文件以顯示正確的類型。

    自有 ID:OTP-18674 輔助 ID:PR-7472

  • 擴展了關於如何使用 standard_iostandard_erroruser I/O 裝置的文件。

    新增了類型 io:standard_io/0io:standard:error/0io: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

  • 修正導致 compressed ETS 表格中的「魔術」參考無法保持所參考物件存活的錯誤。症狀是所參考的物件會過早被垃圾回收,並且參考會顯得過時,不參考任何東西。此類魔術參考物件的範例包括 atomics 和 NIF 資源。

    自有 ID:OTP-18732 輔助 ID:GH-7444, PR-7458

  • 匹配固定大小且不能被 8 整除的短位元字串可能會導致執行階段系統因「堆疊和堆積溢位」錯誤而終止。

    自有 ID:OTP-18733 輔助 ID:GH-7292

  • 持續不斷的傳入非訊息信號可能會阻止需要執行 dirty 的程序執行。

    自有 ID:OTP-18737 輔助 ID:PR-7595

  • BEAM 檔案通常包含一個具有標籤「Type」的區塊,其中包含 JIT 可以使用的類型資訊。beam_lib:strip/1 會負責保留該區塊,但執行自訂剝離的建置/發布工具可能會意外移除該區塊。載入沒有「Type」區塊的 BEAM 檔案可能會導致載入的程式碼行為不正確。

    自有 ID:OTP-18745 輔助 ID:GH-7492, PR-7616

  • 已修正二進位模式和被動模式下,用於 Unix Domain Socket 的 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 以處理「完成」(Windows 上的 socket)。

    自有 ID:OTP-18586 輔助 ID:OTP-18029

  • 在 Windows 上為 'socket' 新增對 Unix Domain Socket 的支援(僅限 STREAM socket)。

    自有 ID:OTP-18611 輔助 ID:OTP-18029, #5024

  • 在 Erlang/OTP 27 中,預設情況下,escript 會在執行前進行編譯。這表示必須安裝 compiler 應用程式。可以透過在 escript 檔案中新增指令 -mode(interpret). 來強制 escript 進行解譯。

    在 Erlang/OTP 28 中,將會移除對解譯 escript 的支援。

    自有 ID:OTP-18638

  • 新增 Windows 上對 socket ioctl 的基本支援。

    自有 ID:OTP-18660

  • 移除 erts/etc/darwin/Info.plist,因為在 macOS 10.12 之後已不再需要。

    自有 ID:OTP-18661 輔助 ID:PR-6112

  • 新增對(Windows)socket 選項 exclusiveaddruse 的支援。

    自有 ID:OTP-18686

  • [socket] 新增對 'nopush' 選項的支援。

    自有 ID:OTP-18687

  • 新增對 socket 選項 'BSP STATE' 的支援。

    自有 ID:OTP-18693

  • 新增 tcp socket 選項 'keepcnt'、'keepidle' 和 'keepintvl'。

    自有 ID:OTP-18698

  • 新增對其他(Windows)socket 選項的支援('max_msg_size' 和 'maxdg')。

    自有 ID:OTP-18710

Erts 14.0.2

修正的錯誤和故障

  • 修正使用 IME(輸入法編輯器)在 Windows 上的 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 上,當有等待的活動呼叫讀取、寫入或 accept 函式時,呼叫函式 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

修正的錯誤和故障

  • socket nif 在 Solaris 11 上的建置失敗。

    自有 ID:OTP-18585 輔助 ID:OTP-18029

  • 修正兩個與二進位相關的減少計數錯誤。

    自有 ID:OTP-18587

  • 建構未與位元組邊界對齊、大小不符合 31 位元且值不符合 64 位元字的二進位區段,可能會導致執行階段系統崩潰。

    自有 ID:OTP-18597

  • 當由於區段大小錯誤而導致二進位建構失敗時,錯誤資訊並不總是正確的。

    自有 ID:OTP-18602 輔助 ID:GH-7282

  • 修正在已升級的模組中定義的 fun 時呼叫它時發生的崩潰。

    自有 ID:OTP-18621 輔助 ID:GH-7288

Erts 14.0

修正的錯誤和故障

  • 如果在重新載入定義該 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 creator pid」功能。請參閱即將發生的潛在不相容性以獲取更多詳細資訊。

    自身 ID:OTP-18498

  • 修復了在某些無法使用機器堆疊來執行 Erlang 程式碼的平台上(主要是 OpenBSD 和使用 musl 的 Linux),追蹤期間發生的崩潰問題。

    自身 ID:OTP-18561

改進和新功能

  • NIF API 中引入了 enif_set_option() 函數。它可以用來設定 ERL_NIF_OPT_DELAY_HALT 和/或 ERL_NIF_OPT_ON_HALT 選項,藉此可以使執行時期系統的停止與啟用刷新和執行 NIF 同步。啟用刷新的執行時期系統停止,現在會終止執行時期系統,而不會執行可能已安裝到執行時期系統中的 atexit/on_exit 處理常式,這可能會被視為潛在的不相容性。

    * 潛在的不相容性 *

    自身 ID:OTP-17771 輔助 ID:GH-5325, PR-6370

  • TTY/終端機子系統已被重寫,將更多程式碼從舊的連結驅動程式移至 Erlang,並在 NIF 中實作所有需要的 I/O 原語。

    在 Unix 平台上,除了更好地處理 Unicode 字元並修復一些長期存在的錯誤之外,使用者應該不會注意到太多差異。

    Windows 使用者會注意到 erl.exe 具有與一般 Unix shell 相同的功能,而 werl.exe 已被移除並替換為指向 erl.exe 的符號連結。這使得 Windows Erlang 終端機體驗與 Unix 相同。

    這次重寫帶來了一些錯誤修復和功能新增

    • Erlang 退出時,TTY 現在會被重置,修復了 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}]).

    * 潛在的不相容性 *

    自身 ID:OTP-17932 輔助 ID:PR-6144 GH-3150 GH-3390 GH-4343 GH-4225

  • 新增對 Windows 上 Socket 的支援。

    • 預發佈狀態。
    • 錯誤碼尚未最終確定。
    • 沒有明確支援 Windows 特定的選項(socket 選項,用於讀取和寫入的旗標)。
    • 適用於 Windows 的新非同步 API(完成)。請參閱(Socket 使用)使用者指南中的「非同步呼叫」章節。
    • 為了確保平台獨立性,預期使用 gen_tcp 和 gen_udp(尚未更新)。

    自身 ID:OTP-18029

  • 更新了 Windows 的配置快取。這使得 Windows 上的配置執行速度更快,因為快取了更多檢查。

    自身 ID:OTP-18053 輔助 ID:PR-6101

  • 最佳化了記錄更新。

    自身 ID:OTP-18126 輔助 ID:PR-6033

  • 最佳化了內部雜湊常式。

    自身 ID:OTP-18131

  • 如在 OTP 25 發佈時宣布的,現在預設啟用多時間扭曲模式。這假設系統上執行的所有程式碼都是時間扭曲安全的。

    如果系統中有舊程式碼不是時間扭曲安全的,您現在需要明確地以無時間扭曲模式(如果部分時間扭曲安全,則以單時間扭曲模式)啟動系統,以避免問題。當以無時間扭曲模式啟動系統時,系統的行為與 OTP 18 中引入擴展的時間功能之前相同。

    如果您的程式碼不是時間扭曲安全的,強烈建議您變更此設定,以便可以使用多時間扭曲模式。與無時間扭曲模式相比,多時間扭曲模式可提高可擴展性和效能,以及時間測量的準確性和精確度。

    * 潛在的不相容性 *

    自身 ID:OTP-18135 輔助 ID:GH-4965, PR-6046

  • JIT 中針對二進制語法有幾個新的最佳化

    • 已最佳化固定大小的區段的二進制檔建立和比對。
    • 已最佳化 UTF-8 區段的建立和比對。
    • 已最佳化附加到二進制檔的操作。

    自身 ID:OTP-18137 輔助 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 節點。

    * 潛在的不相容性 *

    自身 ID:OTP-18140 輔助 ID:PR-6072

  • 現在強制要求外部術語格式中支援版本 4 節點容器類型,因此最佳化了進程別名

    自身 ID:OTP-18141 輔助 ID:OTP-18140, PR-6073

  • 編譯器和 JIT 現在為建立所有鍵在編譯時都已知的文字的小型映射產生更好的程式碼。

    自身 ID:OTP-18185 輔助 ID:GH-6139

  • erl -eval 無法執行命令時,會將錯誤描述列印到 standard_error。

    自身 ID:OTP-18227 輔助 ID:PR-6254

  • 支援 NIF 介面中的 UTF-8 原子和字串,包括新函數 enif_make_new_atomenif_make_new_atom_lenenif_get_string_length

    自身 ID:OTP-18334 輔助 ID:PR-6434

  • 引入了以下 inet:setopts/2 選項

    • reuseport - 重複使用本機埠。負載平衡可能會或可能不會提供,具體取決於底層 OS。

    • reuseport_lb - 重複使用本機埠。提供負載平衡。

    • exclusiveaddruse - Windows 上的獨佔位址/埠使用。此 socket 選項是 Windows 特有的,在其他系統上會被靜默忽略。

    在 Windows 上設定 reuseaddr 的行為發生了向後不相容的變更。現在,只有在設定了 reusaddrreuseport inet 選項時,才會設定底層 SO_REUSEADDR socket 選項。這是因為 Windows 上的底層 SO_REUSEADDR socket 選項的行為與同時設定底層 socket 選項 SO_REUSEADDRSO_REUSEPORT 時 BSD 的行為類似。有關更多資訊,請參閱 reuseaddr 選項的文件。

    * 潛在的不相容性 *

    自身 ID:OTP-18344 輔助 ID:PR-6522, PR-6944, OTP-18324, PR-6481, GH-6461

  • erlang:display/1 現在將以更易於閱讀的方式列印大型映射(類似於列印小型映射的方式)。

    自身 ID:OTP-18360 輔助 ID:PR-6497

  • 現在允許在 guard 和 match spec 中使用 BIF min/2max/2

    自身 ID:OTP-18367 輔助 ID:GH-6544

  • 如果在載入/升級期間未呼叫,則傳回 NULL 來使 enif_init_resource_type 和相關函數失敗。舊行為未定義。

    自身 ID:OTP-18369

  • 針對 max_heap_size 進程限制的新選項 include_shared_binaries。如果設定為 true,則會將大型二進制檔(> 64 個位元組)包含在與 max_heap_size 限制比較的記憶體總和中,這些大型二進制檔可能會被多個進程引用。

    自身 ID:OTP-18410 輔助 ID:GH-5889, PR-6345

  • 現在已實作 EEP 58 中建議的映射推導式。

    自身 ID:OTP-18413 輔助 ID:EEP-58, PR-6727

  • 透過變更原子鍵的內部排序,最佳化了一些映射操作。這會變更小型映射中原子鍵的列印方式以及 maps:to_list/1maps:next/1 傳回的(未記錄)順序。新的順序是不可預測的,並且可能會在 Erlang VM 的不同調用之間發生變更。

    對於順序很重要的應用,有一個新的函式 maps:iterator/2 可以建立迭代器,以確定的順序傳回 map 元素。此外,io:format() 的格式字串也新增了修飾符 kK,以支援按順序列印 map 元素。

    內部 ID:OTP-18414 輔助 ID:PR-6151

  • 減少了 file:read_file_info/1,2 的記憶體使用量

    內部 ID:OTP-18424 輔助 ID:PR-6716

  • 新增函式 current_stacktrace,用於 erlang:trace_pattern/3 使用的追蹤匹配規格。

    這個新選項會將呼叫者的目前堆疊追蹤放入傳送給追蹤接收器的追蹤訊息中。

    內部 ID:OTP-18425 輔助 ID:PR-6628, GH-5333

  • 在 64 位元的執行期系統上,節點本機程序識別碼和埠識別碼的重要位元數量已從 28 位元擴展到 60 位元。這使得這些識別碼足夠大,在節點的生命週期中實際上永遠不必重複使用。

    內部 ID:OTP-18435 輔助 ID:PR-6827

  • 新的追蹤功能 call_memory。與 call_time 追蹤類似,但它不是測量追蹤函式中累積的時間,而是測量追蹤函式消耗的累積堆積空間。它可以用來比較不同函式對觸發垃圾回收的貢獻程度。

    內部 ID:OTP-18440 輔助 ID:PR-6351

  • 不再需要在執行期系統中啟用功能才能載入使用該功能的模組。在編譯時於編譯器中啟用該功能就足夠了。

    這表示要在 Erlang/OTP 26 中使用功能 maybe_expr,在編譯期間啟用它就足夠了。

    在 Erlang/OTP 27 中,功能 maybe_expr 將預設啟用,但可以停用它。

    內部 ID:OTP-18445

  • 透過在嵌入模式的啟動順序中加入額外的步驟,改善了啟動期間對 on_load 模組的處理,該步驟會執行所有 on_load 處理常式,而不是依賴稍後在核心監管樹狀結構啟動時的明確調用。

    這主要是程式碼改進和 OTP 內部簡化,以避免未來出現錯誤並簡化程式碼維護。

    內部 ID:OTP-18447

  • 引入了 local 選項,用於 term_to_binary/2term_to_iovec/2

    內部 ID:OTP-18477 輔助 ID:PR-7006

  • 在回呼函式 loadupgrade 中,記錄於 NIF 載入時建立和儲存靜態原子 (static atom) 的常用做法。

    內部 ID:OTP-18483 輔助 ID:PR-6888

  • 最佳化未壓縮表格的 ets:lookup_element,方法是使用更有效率的方法將詞 (term) 從 ETS 複製到呼叫程序的堆積。

    內部 ID:OTP-18493 輔助 ID:PR-6272

  • term_to_binaryterm_to_iovec 的原子預設編碼已從 Latin1 變更為 UTF-8。舊的編碼仍然可以使用選項 {minor_version, 1} 取得。

    除了使用兩個位元組 (UTF-8) 而不是一個位元組來編碼 128 到 255 之間的程式碼點外,大多數原子會少佔用一個位元組,因為長度欄位在可能的情況下只使用一個位元組而不是兩個位元組。

    * 潛在的不相容性 *

    內部 ID:OTP-18505 輔助 ID:PR-6991

  • Erlang/OTP 原始碼中包含的 zlib 版本現在為 1.2.13。

    內部 ID:OTP-18517

  • 最佳化了 gen_tcp:send/*gen_udp:send/*gen_sctp:send/* 以使用惡名昭彰的接收參考最佳化,因此當呼叫程序具有大型訊息佇列時,傳送現在不應該有不良的效能。

    內部 ID:OTP-18520 輔助 ID:GH-6455

  • 新增了 EEP-61 中引入的新內建型別 dynamic/0,改善了對漸進式型別檢查器的支援。

    內部 ID:OTP-18522

  • 針對小型 map (少於 33 個鍵),透過在結果 map 與任何引數 map 具有相同鍵數時,重複使用鍵元組或整個 map,最佳化 maps:merge/2 的記憶體消耗。

    內部 ID:OTP-18523 輔助 ID:PR-7004

  • 透過變更第 2 個 map 以使用第 1 個 map 的字面鍵元組 (literal key tuple),進一步最佳化小型 map 的 maps:merge/2 記憶體消耗,前提是兩者具有相同的鍵。

    內部 ID:OTP-18524 輔助 ID:PR-7004, OTP-18523

  • 現在可以在匹配規格中使用 ceil/1floor/1is_bitstring/1is_boolean/1is_function/2tuple_size/1

    內部 ID:OTP-18526 輔助 ID:GH-7045

  • 允許 IPv6 位址作為 erlang:decode_packet/3gen_tcp 封包選項解碼的 http 封包中的主機。根據 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>,dirty CPU 排程器命名為 erts_dcpus_<IX>,dirty IO 排程器命名為 erts_dios_<IX>。無論底層平台是否支援更多字元,NIF 和驅動程式執行緒名稱都會截斷為 15 個字元。

    * 潛在的不相容性 *

    內部 ID:OTP-18552 輔助 ID:PR-6973

  • 進一步強化大型 map (超過 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_timecall_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

  • 修正 cgroups 的 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

  • 使用第一個參數為 portsprocessesexisting_portsexisting_processesexistingall 之一呼叫 erlang:trace/3,如果髒排程器正在執行同步追蹤動作,則可能導致模擬器崩潰。

    自有 ID:OTP-19034

  • 修正當作業系統回報的單調時間單位大於 10 且小於 100 微秒時的整數溢位。

    自有 ID:OTP-19036 輔助 ID:GH-8186

  • 當在髒排程器上執行的追蹤程序收到退出訊號時,髒排程器可能會使用錯誤的執行緒特定資料,這可能導致崩潰。

    自有 ID:OTP-19043 輔助 ID:PR-8342

  • 修正一個或多或少無害的錯誤,該錯誤導致在 Windows 平台上使用 QueryPerformanceCounter() 作為作業系統單調時間來源時,Erlang 單調時間的時間校正略微偏差。

    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

修正錯誤和故障

  • 如果 BIF 計時器設定的逾時時間遠大於未來 68 年,則大多數類 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

修正錯誤和故障

  • 修正在 PowerPC 等頁面大小大於 16kb 時發生的錯誤除錯斷言。在啟動時直接使除錯 VM 崩潰。

    自有 ID:OTP-18802

  • 當使用 receive 追蹤、使用 process_info/2 以及 message_queue_len 項目檢查或使用中斷選單 (CTRL-C) 檢查時,設定為 off_heapmessage_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-ball。

    自有 ID:OTP-18902

改進和新功能

  • 移除在產生讓步 BIF 時使用的不必要的 regexp 函式庫。

    自有 ID:OTP-18830 輔助 ID:PR-7823

  • 將舊的 md5 實作替換為 OpenSSL 的實作。

    自有 ID:OTP-18877

  • 移除未使用的 makewhatis 腳本。

    自有 ID:OTP-18899

Erts 13.2.2.4

修正錯誤和故障

  • 如果分散式 spawn 操作的參數列表部分的外部 term 格式編碼有誤,新產生的遠端程序可能會行為異常。這種異常行為包括掛起或將傳入的訊息解讀為要使用的參數列表。除非使用分布協定的替代實作,且該實作產生了有誤的參數列表編碼,否則這種情況不太可能發生。子程序現在會偵測到這個錯誤,並在執行使用者指定的程式碼之前終止。

    自有 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,且該變數不是立即值,則該 term 不會被複製到接收程序的堆積中。這會稍後損壞表格中的 term,因為 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

  • 修正導致 compressed ETS 表格中的「魔術」參考無法保持所參考物件存活的錯誤。症狀是所參考的物件會過早被垃圾回收,並且參考會顯得過時,不參考任何東西。此類魔術參考物件的範例包括 atomics 和 NIF 資源。

    自有 ID:OTP-18732 輔助 ID:GH-7444, PR-7458

  • 持續不斷的傳入非訊息信號可能會阻止需要執行 dirty 的程序執行。

    自有 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

改進和新功能

  • 進一步強化大型 map (超過 32 個鍵) 的實作。具有相同內部 32 位元雜湊值的鍵現在會放入碰撞節點中,並使用線性搜尋遍歷這些節點。這消除了在進行加鹽處理時,內部雜湊函式必須最終為所有可能的不相等詞組產生不同雜湊值的需求。

    內部 ID:OTP-18569

Erts 13.2.2

修正錯誤與故障

  • 如果啟動分散式系統的執行階段系統,已經存在指向具有相同節點名稱/建立配對的節點的 pid、port 或參考,則在節點啟動後,這些已存在的 pid、port 或參考在各種情況下將無法如預期運作。只有在分散式系統啟動之前,將這些 pid、port 或參考傳達給執行階段系統時才會發生這種情況。也就是說,除非動態啟動分散式系統,否則極不可能發生這種情況,即使動態啟動,發生的機率也很低。現在,執行階段系統會檢查是否已存在具有相同節點名稱/建立配對的 pid、port 和參考。如果找到,將會選擇另一個建立,以避免這些問題。

    自身 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} 選項建立的別名,在收到因監控器而產生的 'DOWN' 訊號後,或使用 erlang:demonitor() BIF 移除監控器時,將無法從遠端節點運作。

    此錯誤是在 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

  • 修正了浮點數取反中的邊緣情況,其中 A = 0.0, B = -A 在 x86_64 JIT 上沒有產生 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 時,將 ETS 插入 bagduplicate_bag 的順序。插入順序一直以來都是從頭到尾,但在 OTP 23.0 中意外更改。對於 bag,它已還原(從尾到頭),而對於 duplicate_bag,則有時會根據列表的長度和呼叫程序剩餘的「減少」數量而還原。

    此修復將 ets:insert/2 的插入順序更改回始終為列表引數的從頭到尾。

    自身 ID:OTP-18434 輔助 ID:PR-6752

  • 對於 AArch64 (AMD64) 的 JIT,在守護式中以非整數引數呼叫 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/1list_to_integer/2 BIFs 不會崩潰,而是引發 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 選項,以明確停用否則在使用 +JPperf map 選項時新增的 Erlang 框架指標。

    自身 ID:OTP-18426

Erts 13.1.5

修正錯誤與故障

  • 在某些邊緣情況下,小數字與 pid 或 port 之間的比較會說數字大於 pid 或 port,違反了詞彙順序。

    自身 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:insertets: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

  • 修正 binary_to_term 解碼 2G 位元組或更大的二進位詞組中的錯誤。

    自身 ID:OTP-18306 輔助 ID:GH-6393, PR-6401

  • 已調整 erlang:module_loaded/1 的文件說明。

    • 先前的文件說明中,沒有提到此 BIF 僅針對以目前程式碼載入的模組回傳 true
    • 已移除警告訊息,該訊息聲稱此 BIF 應僅由程式碼伺服器使用。

    自有 ID:OTP-18313 輔助 ID:PR-6456

  • 修正 list_to_atom/1 針對負程式碼點的問題。先前可能回傳正程式碼點,或以不正確的例外狀況失敗。

    自有 ID:OTP-18321

  • 修正在發送訊息至從 erlang:processes/0 回傳的衍生程序之 pid 時,導致 VM 當機的罕見錯誤。

    僅在系統程序 literal_area_collector 觸發模組清除操作,且 VM 以 +Meamin(無自訂配置器)啟動時才會出現此問題。

    自有 ID:OTP-18322 輔助 ID:PR-6479

  • 使用選項 add_membership 或 drop_membership 的 gen_udp:open/2 會捨棄較早的選項。

    自有 ID:OTP-18323 輔助 ID:#6476

  • 現在,除非 socket 是 UDP socket,否則在 Windows 上會忽略 inet:setopts/2{reuseaddr, true} 選項。如需詳細資訊,請參閱 inet:setopts/2 文件中關於 reuseaddr 選項的部分。

    在 OTP 25 之前,{reuseaddr, true} 選項在 Windows 上會被所有 socket 忽略,但從 OTP 25.0 開始,已變更為不會被任何 socket 忽略。

    * 潛在的不相容性 *

    自有 ID:OTP-18324 輔助 ID:GH-6461、PR-6481

  • 修正 binary_to_term 解碼長度為 1G 或更長之列表的錯誤。

    自有 ID:OTP-18328 輔助 ID:GH-6439、PR-6440

  • 修正 binary_to_term(以及分散式接收)在解碼具有未排序的小型映射(<= 32 個)作為大型映射鍵的大型映射(> 32 個鍵)時的錯誤。

    僅當 term 由 erl_interfacejinterface 或其他方式編碼時,才會發生此問題,因為 VM 本身始終使用排序的鍵對小型映射進行編碼。

    「binary_to_term」看似成功,但建立的大型映射在內部是不一致的。使用 maps:get 和相關函數無法找到較小的鍵映射。其他操作(例如映射比較和合併)也可能產生不正確的結果。

    自有 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

修正的錯誤和故障

  • 將放棄載體可用性限制(+Muacful)選項新增至 erts_alloc。此選項允許使用者將記憶體載體中未使用的區段標記為 OS 可重複使用(如果需要)。

    此功能在 Erlang/OTP 25 之前是不可設定的預設值,但由於效能問題而被移除。

    自有 ID:OTP-18290 輔助 ID:ERIERL-866 PR-6378

Erts 13.1.1

修正的錯誤和故障

  • 使用 socket 模組建立的監聽 socket 會洩漏(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_groupglobal 中的各種其他不一致性錯誤和死鎖。

    作為這些修正的建構區塊,已引入新的 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 和成員資格 socket 選項。

    自有 ID:OTP-18091 輔助 ID:#5789

  • 接受具有錯誤編碼大小欄位的 funs (NEW_FUN_EXT)。這是針對 OTP 23 和 24 中存在的錯誤 (OTP-18104) 的解決方案,該錯誤在某些情況下可能會導致不正確的大小欄位。模擬器不使用解碼的大小欄位,但 erl_interface 仍會使用,且無法藉由此解決方案獲得幫助。

    自有 ID:OTP-18093 輔助 ID:OTP-18104、PR-5987

  • 修正了在純 IPv6 Windows 上,inet:getifaddrs 掛起的問題

    自有 ID:OTP-18102 輔助 ID:#5904

  • 修正在下列情況下,term 的錯誤分散式編碼

    • 當 fun 的環境中具有位元字串或 export-fun 時,在編碼到尚未建立的(擱置的)連線時
    • 或當 fun 的環境中具有二進位/位元字串,該字串參考堆外二進位(大於 64 個位元組)時。

    症狀可能是接收端解碼失敗,導致連線中止。修正 OTP-18093 是這些錯誤的解決方案,可讓 VM 接受此類錯誤編碼的 fun。

    針對擱置連線的第一個編碼錯誤僅存在於 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 所允許的大小之錯誤。

    自有 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:insert,則導致 ets:info(有時為 ets:whereis)針對現有表格回傳 'undefined' 的錯誤。

    自有 ID:OTP-18218 輔助 ID:ERIERL-855

  • 修正了在 macOS 上單次讀取/寫入操作中寫入和讀取超過 2 GB 的問題。在此修正之前,嘗試讀取/寫入超過 2GB 會導致 {error,einval}

    自有 ID:OTP-18222 輔助 ID:PR-6248 GH-6242

  • 修正了當存在擱置連線時,有時會在節點關閉時導致模擬器當機的錯誤。僅在執行雙重分散式協定 inet_drv 和 inet_tls_dist 時才會出現此問題。

    自有 ID:OTP-18243 輔助 ID:GH-6247、PR-6258

改進和新功能

  • 由於下列原因,在調整大型程序訊息佇列時產生 yield

    • 從常值區域複製 term(在移除常值區域之前)。
    • message_queue_data 狀態從 on_heap 變更為 off_heap

    訊息佇列調整工作現在將與程序必須執行的所有其他類型的工作交錯進行,甚至包括其他訊息佇列調整工作。

    自有 ID:OTP-17340 輔助 ID:PR-6133

  • 為基於 inet 驅動程式的 socket(例如 gen_tcp 和 gen_udp)新增基本的偵錯功能(選項)。

    自有 ID:OTP-18032

  • hiddendist_listen 選項引入 net_kernel:start/2

    也說明了 -dist_listen 命令列引數,該引數被錯誤地記載為 kernel 參數,而不是命令列引數。

    自有 ID:OTP-18107 輔助 ID:PR-6009

  • 在「互通性教學」下新增新的文件章節「偵錯 NIF 和 Port 驅動程式」。

    自有 ID:OTP-18109

  • 新增新的 API 函數 erl_features:configurable/0

    自有 ID:OTP-18199 輔助 ID:PR-5790

Erts 13.0.4

修正的錯誤和故障

  • 如果目標程序或埠不存在,monitor/3 BIF 不會將選項套用至建立的監控器。也就是說,即使已設定自訂標籤,對應的 down 訊息也會取得 `DOWN` 標籤,即使已傳遞 alias 選項,回傳的參考也不是別名。

    自有 ID:OTP-18190 輔助 ID:GH-6185、PR-6209

  • 當傳遞引數 native 時,erlang:monotonic_time/1erlang:system_time/1erlang:time_offset/1os:system_time/1 BIF 會錯誤地失敗。

    自有 ID:OTP-18197 輔助 ID:GH-6165、PR-6213

Erts 13.0.3

修正的錯誤和故障

  • 在下列情況下,分散式結束訊號可能會遺失

    • 如果符合以下條件,則從父程序到子程序的結束訊號會遺失

      • 父程序在建立子程序的衍生要求完成之前終止,
      • 衍生要求在父程序和子程序之間建立連結
      • 衍生要求是分散式的,以及
      • 結束原因大於一個機器字。
    • 在尚未完成的衍生要求正在進行的連線上遺失連線,可能會導致遺失結束訊號。此類遺失結束訊號的情況非常罕見。除了上述連線遺失之外,還必須滿足以下條件

      • 因連線中斷而中斷的衍生請求,也必須在父程序和子程序之間建立連結。
      • 發出衍生請求的父程序,在衍生請求因連線中斷而中斷時,也必須正在終止。
      • 同一個父程序也必須對其他節點發出過衍生請求,而非僅對連線中斷的節點發出。
      • 對其他節點的這些衍生請求也必須建立連結。
      • 對其他節點的這些衍生請求,在連線中斷時也必須尚未完成。也就是說,來自子程序的衍生回覆尚未到達父程序。

      如果滿足以上所有條件,則由於上述對其他節點的衍生請求而產生的子程序,其終止訊號可能會遺失。

      當觸發上述錯誤時,也會導致嚴重的記憶體洩漏,因為父程序的銷毀永遠不會完成。

    自身 ID:OTP-18164 輔助 ID:PR-6114

  • 競爭狀況可能導致其他程序的 process_info(Pid, message_queue_len) 傳回無效的結果。

    自身 ID:OTP-18169 輔助 ID:PR-6134

  • 修正了處理程序系統任務的縮減計數。

    自身 ID:OTP-18170 輔助 ID:PR-6135

  • 終止程序的優先權提升無法運作,這可能會導致此類程序的執行延遲。

    自身 ID:OTP-18175 輔助 ID:PR-6142

  • 在取消連結操作完成之前(也就是在收到來自已連結程序的取消連結確認訊號之前)終止的程序所進行的取消連結操作,會導致終止程序錯誤地將終止訊號傳送給正在取消連結的程序。接收者通常會忽略此終止訊號,但是,如果終止訊號的接收者同時建立新的連結,則可能會收到帶有終止程序實際終止原因的終止訊號,而不是 noproc 終止原因。然而,很難偵測到這種情況,而且沒有明顯的負面影響,因此應視為無害。

    終止程序收到的分散式取消連結確認訊號也沒有被正確移除,這可能會導致輕微的記憶體洩漏。

    自身 ID:OTP-18177 輔助 ID:PR-6150

Erts 13.0.2

已修正的錯誤和故障

  • 在具有 ARM64 (AArch64) 架構(例如 Apple Silicon Macs)的電腦上,如果 rem 表達式的結果未使用,則 rem 表達式後接相同運算元的 div 表達式可能會評估出錯誤的結果。

    自身 ID:OTP-18143

Erts 13.0.1

已修正的錯誤和故障

  • 來自遠端節點的 spawn_reply 訊號可能會延遲,並且會在來自新衍生程序的其他訊號之後傳送。

    當觸發此錯誤時,有時可能會由於此錯誤而導致與衍生程序所在節點的連線中斷。如果發生這種情況,則會記錄以下錯誤訊息:在節點 <LocalNode> 上,由 <Pid> 偵測到來自節點 <RemoteNode> 的 'spawn_reply' 訊號遺失。節點 <RemoteNode> 可能受到票證 ID 為 OTP-17737 的錯誤影響。

    此錯誤僅影響已啟用 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.dev.org.tw/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

  • 針對具有大量二進制檔案、函式和/或外部 pid/port/ref 的程序,最佳化次要垃圾回收。這是 OTP-24.1 中發布的最佳化 (OTP-17602) 的延續。

    自身 ID:OTP-16852 輔助 ID:ERL-1347、PR-5195

  • 已最佳化 message_queue_data=off_heap* 程序的訊號佇列,以允許從多個程序平行接收訊號。

    這是可以實現的,因為 Erlang 僅保證從單一程序傳送到另一個程序的訊號(即訊息訊號和非訊息訊號)會按傳送順序排序。但是,對於從不同程序傳送到特定程序的訊號,沒有排序保證。因此,多個程序可以平行地向特定程序傳送訊號,而無需彼此同步。但是,此類訊號傳送以前始終是序列化的,因為傳送者必須取得接收程序的外部訊號佇列的鎖定。這種並行訊號傳送最佳化產生比以前可能更好的訊號傳送可擴展性,基準測試結果請參閱 https://erlang.dev.org.tw/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 安裝目錄現在可在檔案系統上重新定位。`release_handler:create_RELEASES/4 函數可以產生具有相對路徑的 RELEASES 檔案,如果其 RootDir 參數設定為空字串。

    自身 ID:OTP-17304

  • 以下分散式旗標現在是強制性的:DFLAG_BIT_BINARIESDFLAG_EXPORT_PTR_TAGDFLAG_MAP_TAGSDFLAG_NEW_FLOATSDFLAG_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/1binary_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_listerlang:float_to_binary 中新增了一個名為 short 的選項。此選項會建立給定浮點數最短且正確四捨五入的字串表示法,該字串可以再次轉換回相同的浮點數。

    專屬 ID:OTP-17562 輔助 ID:GH-4492

  • 標記的元組測試和函式呼叫已進行最佳化,現在比以前更為節省資源。

    在確保所有 boxed term 在 arity word 之後至少分配一個 word 後,這些最佳化才成為可能。這是透過讓所有空元組參照相同的空元組文字來實現的,這也減少了空元組的記憶體使用量。

    專屬 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_interfacejinterface 節點使用零作為建立值。

    專屬 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 對外部工具(例如 perfgdb)的支援,使其能夠顯示行號,甚至在可以找到的情況下顯示原始 Erlang 原始碼。

    為了協助他們找到原始碼,新增了 absolute_path 編譯器選項,以嵌入模組的絕對檔案路徑。

    專屬 ID:OTP-17685

  • 在 32 位元 VM 的 Erlang shell 標題列中加入 [32-bit]。

    專屬 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 (系列 '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_niferl_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

  • 現在,當 Mac OS 上提供 F_BARRIERFSYNC 旗標時,file:sync/1 將會使用該旗標。

    專屬 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

  • 使用第一個參數為 portsprocessesexisting_portsexisting_processesexistingall 之一呼叫 erlang:trace/3,如果髒排程器正在執行同步追蹤動作,則可能導致模擬器崩潰。

    自有 ID:OTP-19034

  • 修正當作業系統回報的單調時間單位大於 10 且小於 100 微秒時的整數溢位。

    自有 ID:OTP-19036 輔助 ID:GH-8186

  • 當在髒排程器上執行的追蹤程序收到退出訊號時,髒排程器可能會使用錯誤的執行緒特定資料,這可能導致崩潰。

    自有 ID:OTP-19043 輔助 ID:PR-8342

  • 修正一個或多或少無害的錯誤,該錯誤導致在 Windows 平台上使用 QueryPerformanceCounter() 作為作業系統單調時間來源時,Erlang 單調時間的時間校正略微偏差。

    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

已修正的錯誤與故障

  • 如果 BIF 計時器設定的逾時時間遠大於未來 68 年,則大多數類 Unix 平台上的 32 位元執行階段系統可能會崩潰。為了讓崩潰發生,這個巨大的計時器(在設定時間之後)必須成為設定它的特定排程器上設定的最近活動計時器。這不會發生在只有一個排程器的系統上,因為系統中總會有更短的計時器。

    在 Windows 上設定大於 49 天的計時器,在極少數情況下可能會導致逾時延遲。

    自有 ID:OTP-18911 輔助 ID:ERIERL-1023,PR-7983

Erts 12.3.2.15

已修正的錯誤與故障

  • 修正在 PowerPC 等頁面大小大於 16kb 時發生的錯誤除錯斷言。在啟動時直接使除錯 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-ball。

    自有 ID:OTP-18902

改進與新功能

  • 移除在產生讓步 BIF 時使用的不必要的 regexp 函式庫。

    自有 ID:OTP-18830 輔助 ID:PR-7823

  • 將舊的 md5 實作替換為 OpenSSL 的實作。

    自有 ID:OTP-18877

  • 移除未使用的 makewhatis 腳本。

    自有 ID:OTP-18899

Erts 12.3.2.14

已修正的錯誤與故障

  • 修正導致 compressed ETS 表格中的「魔術」參考無法保持所參考物件存活的錯誤。症狀是所參考的物件會過早被垃圾回收,並且參考會顯得過時,不參考任何東西。此類魔術參考物件的範例包括 atomics 和 NIF 資源。

    自有 ID:OTP-18732 輔助 ID:GH-7444, PR-7458

  • 未傳送到已終止程序的信號清除操作過度產生讓步。

    自有 ID:OTP-18752 輔助 ID:PR-7633

  • 如果分散式 spawn 操作的參數列表部分的外部 term 格式編碼有誤,新產生的遠端程序可能會行為異常。這種異常行為包括掛起或將傳入的訊息解讀為要使用的參數列表。除非使用分布協定的替代實作,且該實作產生了有誤的參數列表編碼,否則這種情況不太可能發生。子程序現在會偵測到這個錯誤,並在執行使用者指定的程式碼之前終止。

    自有 ID:OTP-18790 輔助 ID:PR-7742

  • 修正錯誤,如果 matchspec 的主體傳回一個將變數('$1'、'$_' 等)作為鍵或值的 map,且該變數不是立即值,則該 term 不會被複製到接收程序的堆積中。這會稍後損壞表格中的 term,因為 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、port 或參考,則在節點啟動後,這些已存在的 pid、port 或參考在各種情況下將無法如預期運作。只有在分散式系統啟動之前,將這些 pid、port 或參考傳達給執行階段系統時才會發生這種情況。也就是說,除非動態啟動分散式系統,否則極不可能發生這種情況,即使動態啟動,發生的機率也很低。現在,執行階段系統會檢查是否已存在具有相同節點名稱/建立配對的 pid、port 和參考。如果找到,將會選擇另一個建立,以避免這些問題。

    自身 ID:OTP-18570 輔助 ID:PR-7190

  • 建構未與位元組邊界對齊、大小不符合 31 位元且值不符合 64 位元字的二進位區段,可能會導致執行階段系統崩潰。

    自有 ID:OTP-18597

改進與新功能

  • 進一步強化大型 map (超過 32 個鍵) 的實作。具有相同內部 32 位元雜湊值的鍵現在會放入碰撞節點中,並使用線性搜尋遍歷這些節點。這消除了在進行加鹽處理時,內部雜湊函式必須最終為所有可能的不相等詞組產生不同雜湊值的需求。

    內部 ID:OTP-18569

Erts 12.3.2.11

已修正的錯誤與故障

  • 修正了當存在擱置連線時,有時會在節點關閉時導致模擬器當機的錯誤。僅在執行雙重分散式協定 inet_drv 和 inet_tls_dist 時才會出現此問題。

    自有 ID:OTP-18243 輔助 ID:GH-6247、PR-6258

  • 修正 binary_to_term(以及分散式接收)在解碼具有未排序的小型映射(<= 32 個)作為大型映射鍵的大型映射(> 32 個鍵)時的錯誤。

    僅當 term 由 erl_interfacejinterface 或其他方式編碼時,才會發生此問題,因為 VM 本身始終使用排序的鍵對小型映射進行編碼。

    「binary_to_term」看似成功,但建立的大型映射在內部是不一致的。使用 maps:get 和相關函數無法找到較小的鍵映射。其他操作(例如映射比較和合併)也可能產生不正確的結果。

    自有 ID:OTP-18343 輔助 ID:GH-6496

  • 返回錯誤編碼結果的 call() 驅動程式回呼的實作,可能會導致記憶體洩漏,並可能導致呼叫 erlang:port_call/3 的程序堆積上出現無效資料。

    自身 ID:OTP-18525 輔助 ID:PR-7049

  • 結合使用監控器和 {alias, explicit_unalias} 選項建立的別名,在收到因監控器而產生的 'DOWN' 訊號後,或使用 erlang:demonitor() BIF 移除監控器時,將無法從遠端節點運作。

    此錯誤是在 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

  • 修正 binary_to_term 解碼 2G 位元組或更大的二進位詞組中的錯誤。

    自身 ID:OTP-18306 輔助 ID:GH-6393, PR-6401

  • 修正 list_to_atom/1 針對負程式碼點的問題。先前可能回傳正程式碼點,或以不正確的例外狀況失敗。

    自有 ID:OTP-18321

  • 修正 binary_to_term 解碼長度為 1G 或更長之列表的錯誤。

    自有 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:insert,則導致 ets:info(有時為 ets:whereis)針對現有表格回傳 'undefined' 的錯誤。

    自有 ID:OTP-18218 輔助 ID:ERIERL-855

Erts 12.3.2.3

已修正的錯誤與故障

  • 修正在下列情況下,term 的錯誤分散式編碼

    • 當 fun 的環境中具有位元字串或 export-fun 時,在編碼到尚未建立的(擱置的)連線時
    • 或當 fun 的環境中具有二進位/位元字串,該字串參考堆外二進位(大於 64 個位元組)時。

    症狀可能是接收端解碼失敗,導致連線中止。修正 OTP-18093 是這些錯誤的解決方案,可讓 VM 接受此類錯誤編碼的 fun。

    針對擱置連線的第一個編碼錯誤僅存在於 OTP 23 和 24 中,但第二個錯誤也存在於 OTP 25 中。

    自有 ID:OTP-18104 輔助 ID:OTP-18093

  • 在下列情況下,分散式結束訊號可能會遺失

    • 如果符合以下條件,則從父程序到子程序的結束訊號會遺失

      • 父程序在建立子程序的衍生要求完成之前終止,
      • 衍生要求在父程序和子程序之間建立連結
      • 衍生要求是分散式的,以及
      • 結束原因大於一個機器字。
    • 在尚未完成的衍生要求正在進行的連線上遺失連線,可能會導致遺失結束訊號。此類遺失結束訊號的情況非常罕見。除了上述連線遺失之外,還必須滿足以下條件

      • 因連線中斷而中斷的衍生請求,也必須在父程序和子程序之間建立連結。
      • 發出衍生請求的父程序,在衍生請求因連線中斷而中斷時,也必須正在終止。
      • 同一個父程序也必須對其他節點發出過衍生請求,而非僅對連線中斷的節點發出。
      • 對其他節點的這些衍生請求也必須建立連結。
      • 對其他節點的這些衍生請求,在連線中斷時也必須尚未完成。也就是說,來自子程序的衍生回覆尚未到達父程序。

      如果滿足以上所有條件,則由於上述對其他節點的衍生請求而產生的子程序,其終止訊號可能會遺失。

      當觸發上述錯誤時,也會導致嚴重的記憶體洩漏,因為父程序的銷毀永遠不會完成。

    自身 ID:OTP-18164 輔助 ID:PR-6114

  • 競爭狀況可能導致其他程序的 process_info(Pid, message_queue_len) 傳回無效的結果。

    自身 ID:OTP-18169 輔助 ID:PR-6134

  • 修正了處理程序系統任務的縮減計數。

    自身 ID:OTP-18170 輔助 ID:PR-6135

  • 終止程序的優先權提升無法運作,這可能會導致此類程序的執行延遲。

    自身 ID:OTP-18175 輔助 ID:PR-6142

  • 在取消連結操作完成之前(也就是在收到來自已連結程序的取消連結確認訊號之前)終止的程序所進行的取消連結操作,會導致終止程序錯誤地將終止訊號傳送給正在取消連結的程序。接收者通常會忽略此終止訊號,但是,如果終止訊號的接收者同時建立新的連結,則可能會收到帶有終止程序實際終止原因的終止訊號,而不是 noproc 終止原因。然而,很難偵測到這種情況,而且沒有明顯的負面影響,因此應視為無害。

    終止程序收到的分散式取消連結確認訊號也沒有被正確移除,這可能會導致輕微的記憶體洩漏。

    自身 ID:OTP-18177 輔助 ID:PR-6150

  • 如果目標程序或埠不存在,monitor/3 BIF 不會將選項套用至建立的監控器。也就是說,即使已設定自訂標籤,對應的 down 訊息也會取得 `DOWN` 標籤,即使已傳遞 alias 選項,回傳的參考也不是別名。

    自有 ID:OTP-18190 輔助 ID:GH-6185、PR-6209

  • 當傳遞引數 native 時,erlang:monotonic_time/1erlang:system_time/1erlang:time_offset/1os: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 中存在的錯誤 (OTP-18104) 的解決方案,該錯誤在某些情況下可能會導致不正確的大小欄位。模擬器不使用解碼的大小欄位,但 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 除了透過 ERL_EPMD_ADDRESS-address 選項由使用者提供的位址外,還能容忍繫結到 IPv4/IPv6 回路介面時發生的失敗。舉例來說,如果主機系統透過 disable_ipv6 sysctl 停用 IPv6,就可能發生這種情況。

    自有 ID:OTP-17970 輔助 ID:PR-5762

  • 修正了 binary_to_term/1enif_make_map_from_arrayserl_drv_send_term 和 Erlang 分散式處理中,可能導致模擬器崩潰的罕見錯誤。

    自有 ID:OTP-18027

  • 修正了 persistent_term:get/1,2 中可能導致其傳回另一個金鑰值的罕見競爭條件。

    自有 ID:OTP-18065 輔助 ID:GH-5908

  • 修正了當從 on_heap 變更為 off_heap 訊息佇列資料時,程序訊息佇列處於不一致狀態,導致 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_tcpsend_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/2file: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 中的網頁檢視針對 localhost 運作所需的絕對最小資訊量。其他欄位已移除,讓套件在套件組合中的應用程式可以在自己的 Info.plist 檔案中指定應用程式名稱和其他參數。

    自有 ID:OTP-17785 輔助 ID:PR-5393

  • 修正了 term_to_binary/2 用來編碼詞彙的內部堆疊(WSTACK 和 ESTACK)中的錯誤。如果使用 deterministic 選項編碼非常非常大的對應,則此錯誤可能會導致區段錯誤。

    自有 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

  • 由於程式碼清除或在具有大量程序的系統上移除常值區域,在 normallow 優先順序下執行的程序的反應速度可能會受到影響。這是因為在這些操作期間,系統上的所有程序都會同時排程執行。

    此問題已透過限制系統中未完成的清除和複製常值要求來修正。預設情況下,此限制設定為系統上排程器數量的兩倍。這將確保排程器將有足夠的工作排程以盡快執行這些操作,同時其他工作將以更高程度穿插。然而,由於強制執行此限制的額外負荷(相較於使用非常大的限制時),這些操作的效能將會有些許降低。

    此限制可以透過將 +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 socket 的行為進行了改進,僅在 socket 已連線的情況下,才在連線前解除 socket 的連線,也就是說:僅在重新連線時才會解除連線。

    這允許程式碼開啟一個具有臨時埠的 socket,取得埠號並連線;而埠號不會變更(在 Linux 上)。事實證明,這至少有一個有效的使用案例(除了測試案例之外)。

    如果重新連線 socket,則埠號可能會變更(在 Linux 上);這是一個已知的怪癖,可以透過在開啟 socket 時綁定到特定的埠號來解決。如果可以不用臨時埠,那就另當別論...

    專屬 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 寫入錯誤時,會導致 use after free 區段錯誤的錯誤。

    專屬 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 之前的狀態時呼叫。這可能導致堆積包含無效的 term,這可能會在掃描整個堆積時造成問題(例如,崩潰)。

    專屬 ID:OTP-17677

  • 當嘗試建構一個具有大小類型不合法區段的二進制檔案(例如 atom)時,可能會在操作失敗之前進行不必要的記憶體配置(以及後續的解除配置)。已修改為在為二進制檔案配置任何記憶體之前失敗。

    專屬 ID:OTP-17686

  • 修正了當鍵值對包含多個引用的 magic 參考時,persistent_term 中的錯誤。Magic 參考是 NIF 資源或從 BIF 返回的,例如 ets:newatomics:new。該錯誤可能會導致提前解除配置所引用資源的記憶體。

    該錯誤也適用於以組態選項 --enable-sharing-preserving 建構的執行期系統上訊息傳遞中的 magic 參考。

    該錯誤從 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} 選項。
    • 如果監視器參考在操作後保持為活動別名,則 demonitor 操作並未阻止傳遞對應的 'DOWN' 訊息。僅當受監視的程序同時在 demonitor 訊號到達之前終止,且退出原因不是立即 term 時,才會發生這種情況。也就是說,term 大於一個機器字。

    專屬 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

已修正的錯誤和故障

  • 正在退出的埠與同時接收到該埠的訊號之間的競爭可能導致執行期系統崩潰。受影響的訊號為 linkmonitordemonitor。在 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

已修正的錯誤和故障

  • 具有大於 255 的 Unicode 碼點(例如希臘文或西里爾文字符)的 atom 無法由 crashdump_viewer 正確顯示。

    專屬 ID:OTP-17377

  • 修正了與 jit 程式碼載入相關的罕見輕微記憶體洩漏。

    專屬 ID:OTP-17445 輔助 ID:PR-4843

  • 已針對以下 BIF 更正和改進了擴展錯誤資訊:binary_to_existing_atom/2list_to_existing_atom/1erlang: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 個元素的 map 字面值的模組可能會導致此問題。

    作為此修正的一部分,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 中使用 map 的比對規範,使其正常運作。

    透過此修正,map 中的鍵和值都可以是表達式。

    還修正了在比對規範中使用 map 時發生的各種其他崩潰和錯誤。

    專屬 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 現在更能抵抗包含外部格式 map 的損壞二進制檔案。

    專屬 ID:OTP-17604

  • process_info(Pid, status) 應該回報 waiting 狀態時,可能會錯誤地回報 running 狀態。當呼叫程序以高於被檢查程序的優先順序執行時,就會發生這種情況。此錯誤自 OTP 21.0 (erts 版本 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 socket 時不會調整來源 IP 位址。

    這個變通方案是在 Linux 上,總是先解除任何連線,再連線 UDP socket。

    自有 ID:OTP-17559 輔助 ID:GH-5092, PR-5120

  • 已更新關於如何使用 Yielding C Fun (YCF) 的內部文件,包含關於為 ERTS 使用 YCF 的最佳實務文字。

    自有 ID:OTP-17596

  • 最佳化具有大量二進位檔案、fun 和/或外部 pids/ports/refs 的程序之垃圾回收。

    自有 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

  • 修正當追蹤在 dirty scheduler 上執行的程序的排程或垃圾回收時,可能導致崩潰的競爭條件。

    自有 ID:OTP-17568 輔助 ID:PR-4940

  • 修正當給定一個子二進位檔案作為主體時,re:run 可能會崩潰/返回無效結果的罕見錯誤。

    此錯誤自 Erlang/OTP 20.0 起就已存在。

    自有 ID:OTP-17585 輔助 ID:GH-5150

  • binary_to_term/1,2 現在對包含外部格式中 map 的損壞二進位檔案更具彈性。

    自有 ID:OTP-17594

Erts 12.0.3

已修正的錯誤與故障

  • 呼叫 erlang:cancel_timer(_, [{info, false}]) 可能會導致呼叫的程序在呼叫中永遠阻塞。請注意,只有同步版本的呼叫(也就是 async 選項為 false),且 info 選項設定為 false 的組合才會受此錯誤影響。

    自有 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

  • 修正當在大型 map (> 32) 的索引鍵中使用外部 pid/port 時的錯誤。可能會導致執行階段崩潰。此錯誤自 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 忙碌且呼叫的程序在呼叫時有傳入信號,則呼叫 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 程式碼中 socket 關閉的內部狀態處理。

    已移除 NIF 程式碼中針對 EINTRclose() 迴圈,因為在 Linux 上強烈不建議使用,且 Posix 並未明確說明是否允許使用。

    已記錄舊版 gen_tcp socket 的 inet_backend 暫時 socket 選項。

    已修正 net:getaddrinfo/2 的傳回值:protocol 欄位現在是一個 atom/0,而不是錯誤的 list(atom())。關於此傳回類型的文件也已修正。

    已損壞 socket:sendfile/* 檔案的延遲關閉,且已修正。

    已修正 socket NIF 中預設未啟用的一些偵錯程式碼,使其不會因或多或少無害的事件的偵錯列印而意外核心傾印。

    自有 ID:OTP-17452

  • 程序的 dirty 執行與從 port 到程序的取消連結信號結合,可能會導致程序的信號佇列進入不一致的狀態。不一致的結果通常會導致執行階段系統崩潰。此錯誤是在 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

已修正的錯誤與故障

  • 當使用 ramraw 選項同時開啟時,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

  • 如果無法啟用請求的功能,cryptoerts 中的 configure 指令碼現在會失敗。

    已重寫 cryptoconfigure 指令碼的大部分,並進行了各種改進和錯誤修正。現在它更擅長尋找可用的 OpenSSL 程式庫,但在以下情況下,將無法偵測到 OpenSSL 程式庫,而之前有時可能會偶然偵測到程式庫

    • 在不同的基本目錄中安裝了 include 目錄和 lib 目錄部分的 OpenSSL 安裝。為了在此變更之後偵測到此類安裝,使用者必須使用 --with-ssl=<path>--with-ssl-incl=<path> configure 命令列引數明確指定位置。
    • 當使用舊的 gcc 編譯器或 Debian 衍生產品上 lib 目錄下具有 multiarch 目錄的其他編譯器進行建置時。為了在此變更之後偵測到此類安裝,使用者必須使用 --with-ssl-lib-subdir=lib/<multiarch-dir> configure 命令列引數明確指定 multiarch 目錄名稱。

    自有 ID:OTP-17254 輔助 ID:ERIERL-618, GH-4230

  • 指令列參數 erl+Bi+Bd+B 參數,先前會錯誤地導致接收到 USR1 訊號時,在未建立當機傾印檔的情況下終止執行階段系統。現在,無論傳遞的指令列參數為何,接收到 USR1 訊號一律會導致終止並建立當機傾印檔。這個錯誤至少從 OTP R5B 就已存在。

    * 潛在的不相容性 *

    自有 ID:OTP-17275,輔助 ID:PR-4553

  • 新增檢查,確保在傳遞給 erl 的選項需要引數,但未提供任何引數時,會回報錯誤。這修正了透過 OTP-15926 在 OTP-22.1 中引入的錯誤。

    自有 ID:OTP-17314,輔助 ID:OTP-15926、GH-4624、PR-

  • 當機傾印檔中的「最後呼叫」區段已更新,會在每個非函式的 save_calls 狀態(傳送、接收、逾時)後列印換行符號。

    自有 ID:OTP-17329,輔助 ID:PR-4730

  • 使用 socket:accept 建立的 Socket 不會被計數 (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_libcommon_testqlc 也會使用相同的擴充錯誤資訊。

    對於希望提供相同擴充錯誤資訊的應用程式,有新的函式 erl_error:format_exception/3erl_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

  • 透過新增新的 beam 指令 make_fun3(不執行 GC 並可改善暫存器配置)來改善建立 funs 時的程式碼產生。

    自有 ID:OTP-16712

  • 已引入 EEP 53 所概述的程序別名功能。引入此功能是為了提供一種輕量機制,可防止逾時或連線中斷後的回覆延遲。如需更多資訊,請參閱 EEP 53 以及新的 alias/1 BIF 和 monitor/3 BIF 新選項的文件。

    已更新 gen_servergen_statemgen_event 使用的架構中的 call 作業,以使用別名來防止回應延遲。gen_statem 行為在分散式案例中仍然使用 Proxy 程序,因為它始終防止回應延遲,且別名無法對抗 OTP 24 之前的節點。Proxy 程序可以在 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

  • 實驗性的新 socket API 已進一步開發。已進行一些與 OTP 23 相較不相容的回溯變更。

    控制訊息格式已變更,因此解碼的值現在位於 'value' 欄位中,而非 'data' 欄位中。'data' 欄位現在一律包含二進位資料。

    已變更一些關於訊息標頭和控制訊息標頭的型別名稱。

    socket:bind/2 現在傳回純 ok,而不是 {ok, Port},後者只與 inetinet6 位址系列相關,而且通常不重要。若要找出選取的連接埠,請使用 socket:sockname/1

    * 潛在的不相容性 *

    自有 ID:OTP-16749,輔助 ID:OTP-14601

  • 移除舊的未使用 +MYmERL_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/3intersect/2intersect_with/3filtermap/2from_keys/2maps:foreach/2

    maps:merge_with/3merge/2 相同,但會採用額外的 fun,用於合併具有相同索引鍵的項目。

    maps:intersect/2 計算兩個映射的交集。

    maps:intersect_with/3intersect/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 腳本。這使得在 Android 應用程式中使用 Erlang 更加容易。在 Android 上,應用程式無法控制它們將安裝在哪裡。

    專屬 ID:OTP-17028

  • maps API 中所有長時間執行的函式現在都會讓步 (yielding)。在之前的版本中,函式 maps:from_list/1maps:keys/1maps:values/1 不會讓步。這可能會導致程序排程不公平。

    專屬 ID:OTP-17057

  • 已實作 socket:sendfile/2,3,4,5,適用於支援底層 socket 函式庫呼叫的平台。

    專屬 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/0nonempty_bitstring/0

    專屬 ID:OTP-17301 輔助 ID:GH-4636

  • 最佳化具有相同鍵和值的大型 map 的更新。例如,在下面的範例中,原始的 Map 將被重複使用作為第二次更新的返回值。

    1> Map = LargeMap#{ a => b }.

    2> Map#{ a := b }.

    在 erts-10.4 (OTP 22.0) 中,針對小型 map(少於 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、port 或參考,則在節點啟動後,這些已存在的 pid、port 或參考在各種情況下將無法如預期運作。只有在分散式系統啟動之前,將這些 pid、port 或參考傳達給執行階段系統時才會發生這種情況。也就是說,除非動態啟動分散式系統,否則極不可能發生這種情況,即使動態啟動,發生的機率也很低。現在,執行階段系統會檢查是否已存在具有相同節點名稱/建立配對的 pid、port 和參考。如果找到,將會選擇另一個建立,以避免這些問題。

    自身 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

已修復的錯誤和故障

  • 在下列情況下,分散式結束訊號可能會遺失

    • 如果符合以下條件,則從父程序到子程序的結束訊號會遺失

      • 父程序在建立子程序的衍生要求完成之前終止,
      • 衍生要求在父程序和子程序之間建立連結
      • 衍生要求是分散式的,以及
      • 結束原因大於一個機器字。
    • 在尚未完成的衍生要求正在進行的連線上遺失連線,可能會導致遺失結束訊號。此類遺失結束訊號的情況非常罕見。除了上述連線遺失之外,還必須滿足以下條件

      • 因連線中斷而中斷的衍生請求,也必須在父程序和子程序之間建立連結。
      • 發出衍生請求的父程序,在衍生請求因連線中斷而中斷時,也必須正在終止。
      • 同一個父程序也必須對其他節點發出過衍生請求,而非僅對連線中斷的節點發出。
      • 對其他節點的這些衍生請求也必須建立連結。
      • 對其他節點的這些衍生請求,在連線中斷時也必須尚未完成。也就是說,來自子程序的衍生回覆尚未到達父程序。

      如果滿足以上所有條件,則由於上述對其他節點的衍生請求而產生的子程序,其終止訊號可能會遺失。

      當觸發上述錯誤時,也會導致嚴重的記憶體洩漏,因為父程序的銷毀永遠不會完成。

    自身 ID:OTP-18164 輔助 ID:PR-6114

  • 競爭狀況可能導致其他程序的 process_info(Pid, message_queue_len) 傳回無效的結果。

    自身 ID:OTP-18169 輔助 ID:PR-6134

  • 修正了處理程序系統任務的縮減計數。

    自身 ID:OTP-18170 輔助 ID:PR-6135

  • 終止程序的優先權提升無法運作,這可能會導致此類程序的執行延遲。

    自身 ID:OTP-18175 輔助 ID:PR-6142

  • 在取消連結操作完成之前(也就是在收到來自已連結程序的取消連結確認訊號之前)終止的程序所進行的取消連結操作,會導致終止程序錯誤地將終止訊號傳送給正在取消連結的程序。接收者通常會忽略此終止訊號,但是,如果終止訊號的接收者同時建立新的連結,則可能會收到帶有終止程序實際終止原因的終止訊號,而不是 noproc 終止原因。然而,很難偵測到這種情況,而且沒有明顯的負面影響,因此應視為無害。

    終止程序收到的分散式取消連結確認訊號也沒有被正確移除,這可能會導致輕微的記憶體洩漏。

    自身 ID:OTP-18177 輔助 ID:PR-6150

  • 當傳遞引數 native 時,erlang:monotonic_time/1erlang:system_time/1erlang:time_offset/1os: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

已修復的錯誤和故障

  • 修正在下列情況下,term 的錯誤分散式編碼

    • 當 fun 的環境中具有位元字串或 export-fun 時,在編碼到尚未建立的(擱置的)連線時
    • 或當 fun 的環境中具有二進位/位元字串,該字串參考堆外二進位(大於 64 個位元組)時。

    症狀可能是接收端解碼失敗,導致連線中止。修正 OTP-18093 是這些錯誤的解決方案,可讓 VM 接受此類錯誤編碼的 fun。

    針對擱置連線的第一個編碼錯誤僅存在於 OTP 23 和 24 中,但第二個錯誤也存在於 OTP 25 中。

    自有 ID:OTP-18104 輔助 ID:OTP-18093

Erts 11.2.2.14

已修復的錯誤和故障

  • 接受具有錯誤編碼大小欄位的 funs (NEW_FUN_EXT)。這是針對 OTP 23 和 24 中存在的錯誤 (OTP-18104) 的解決方案,該錯誤在某些情況下可能會導致不正確的大小欄位。模擬器不使用解碼的大小欄位,但 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 除了透過 ERL_EPMD_ADDRESS-address 選項由使用者提供的位址外,還能容忍繫結到 IPv4/IPv6 回路介面時發生的失敗。舉例來說,如果主機系統透過 disable_ipv6 sysctl 停用 IPv6,就可能發生這種情況。

    自有 ID:OTP-17970 輔助 ID:PR-5762

  • 修正了 binary_to_term/1enif_make_map_from_arrayserl_drv_send_term 和 Erlang 分散式處理中,可能導致模擬器崩潰的罕見錯誤。

    自有 ID:OTP-18027

  • 修正了 persistent_term:get/1,2 中可能導致其傳回另一個金鑰值的罕見競爭條件。

    自有 ID:OTP-18065 輔助 ID:GH-5908

  • 修正了當從 on_heap 變更為 off_heap 訊息佇列資料時,程序訊息佇列處於不一致狀態,導致 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

已修復的錯誤和故障

改進和新功能

  • 由於程式碼清除或在具有大量程序的系統上移除常值區域,在 normallow 優先順序下執行的程序的反應速度可能會受到影響。這是因為在這些操作期間,系統上的所有程序都會同時排程執行。

    此問題已透過限制系統中未完成的清除和複製常值要求來修正。預設情況下,此限制設定為系統上排程器數量的兩倍。這將確保排程器將有足夠的工作排程以盡快執行這些操作,同時其他工作將以更高程度穿插。然而,由於強制執行此限制的額外負荷(相較於使用非常大的限制時),這些操作的效能將會有些許降低。

    此限制可以透過將 +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) 應該回報 waiting 狀態時,可能會錯誤地回報 running 狀態。當呼叫程序以高於被檢查程序的優先順序執行時,就會發生這種情況。此錯誤自 OTP 21.0 (erts 版本 10.0) 起已存在。

    專屬 ID:OTP-17628

  • 正在退出的埠與同時接收到該埠的訊號之間的競爭可能導致執行期系統崩潰。受影響的訊號為 linkmonitordemonitor。在 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 之前的狀態時呼叫。這可能導致堆積包含無效的 term,這可能會在掃描整個堆積時造成問題(例如,崩潰)。

    專屬 ID:OTP-17677

  • 修正了當鍵值對包含多個引用的 magic 參考時,persistent_term 中的錯誤。Magic 參考是 NIF 資源或從 BIF 返回的,例如 ets:newatomics:new。該錯誤可能會導致提前解除配置所引用資源的記憶體。

    該錯誤也適用於以組態選項 --enable-sharing-preserving 建構的執行期系統上訊息傳遞中的 magic 參考。

    該錯誤從 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 現在更能抵抗包含外部格式 map 的損壞二進制檔案。

    專屬 ID:OTP-17604

Erts 11.2.2.5

已修復的錯誤和故障

  • 修正 tty 驅動程式中的緩衝區溢位問題。當在 newshell 中使用 CTRL+R 功能,且歷史記錄中有非常長的字串時,某些平台上會發生此問題。

    自有 ID:OTP-17560 輔助 ID:GH-5116

  • 修正當追蹤在 dirty scheduler 上執行的程序的排程或垃圾回收時,可能導致崩潰的競爭條件。

    自有 ID:OTP-17568 輔助 ID:PR-4940

  • 修正當給定一個子二進位檔案作為主體時,re:run 可能會崩潰/返回無效結果的罕見錯誤。

    此錯誤自 Erlang/OTP 20.0 起就已存在。

    自有 ID:OTP-17585 輔助 ID:GH-5150

  • binary_to_term/1,2 現在對包含外部格式中 map 的損壞二進位檔案更具彈性。

    自有 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),且 info 選項設定為 false 的組合才會受此錯誤影響。

    自有 ID:OTP-17472 輔助 ID:PR-4932

Erts 11.2.2.2

已修復的錯誤和故障

  • 如果 port 忙碌且呼叫的程序在呼叫時有傳入信號,則呼叫 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

  • 程序的 dirty 執行與從 port 到程序的取消連結信號結合,可能會導致程序的信號佇列進入不一致的狀態。不一致的結果通常會導致執行階段系統崩潰。此錯誤是在 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

已修復的錯誤和故障

  • 修復了匹配規格編譯器中的錯誤,該錯誤被發現在除錯 VM 上針對某些匹配規格導致堆疊溢出崩潰。這可能會對標準 VM 造成問題,但尚未驗證。匹配規格由 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/0info/0 中的錯誤,該錯誤可能在極少數情況下導致 VM 崩潰。該錯誤自 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_termerl_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

  • 修正了從 Port 程式接收 sigchld 到已死亡的 Port 時發生的記憶體洩漏問題。

    自有 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 的組態檢查。此檢查失敗會導致 epmd 在沒有 IPv6 支援的情況下建置。

    自有 ID:OTP-17283

改進和新功能

  • 各種位址清理器支援。

    自有 ID:OTP-16959 輔助 ID:PR-2965

  • 模擬器現在會遵守 cgroup2 CPU 配額。

    自有 ID:OTP-17002

  • 改進了 ARMv8 硬體上的記憶體屏障使用,特別是在 Apple Silicon 上。

    自有 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 實作同時呼叫時可能導致 VM 崩潰的錯誤。該錯誤自 OTP 23.0 開始存在。

    自有 ID:OTP-16859

  • 修復了從 enif_alloc_env 取得環境時,偵錯建置中的 enif_make_map_* 函式。

    自有 ID:OTP-16863 輔助 ID:ERL-1352

  • 修復了損壞的組態選項 --disable-pie

    自有 ID:OTP-16864

  • 修復了接收訊號(連結/監控/spawn_request/spawn_reply)與斷線之間競爭時,罕見的分發錯誤。症狀:VM 崩潰。自: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 驅動程式過去使用 16 作為傳遞給 writev()(和 Windows 上的 WSASend())的 I/O 向量中的最大元素數。當要傳送的資料包含許多元素時,這會導致效能下降,因為必須更頻繁地重複呼叫 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/2compressed 表格上的錯誤,該錯誤可能會產生錯誤的結果或 VM 崩潰。該錯誤自 OTP 20 開始存在。

    自有 ID:OTP-16874 輔助 ID:ERL-1356、PR-2763

  • 在使用 Xcode 12 在 macOS 上編譯 Erlang/OTP 時,BEAM 直譯器的效能會降低。

    自有 ID:OTP-16892

改進和新功能

  • 自 OTP 22 起,特定於配置器的記憶體載體池被節點全域載體池取代。不幸的是,在某些情況下,由於主要處理短期資料的配置器使用的載體中散佈了長期存在的資料,這會導致大量的記憶體碎片。

    引入了一個新的命令列參數 +M<S>cp,可用來啟用舊的行為,並設定載體池的其他行為。為了設定所有分配器使用特定分配器的載體池的舊行為,請在啟動 Erlang 系統時,將 +Mucp : (包含冒號字元) 作為命令列參數傳遞給 erl

    載體池的預設配置將在未來某個時間點變更為 +Mucp :,但不會在此修補程式中變更。

    Own Id: OTP-16856

Erts 11.1

修正的錯誤與故障

  • 更新抽象格式的文件,使用 ANNO 而不是 LINE

    Own Id: OTP-16625 Aux Id: PR-2609

  • 當在低於 1 個 CPU 的 CPU 配額下執行時,模擬器將不再還原為預設的排程器數量。

    Own Id: OTP-16710 Aux Id: ERL-1280

  • 修正了當一個包含對執行階段系統內部建立的字面值(例如 os:type/0 所回傳的元組)的參考的行程發生當機時,所產生的當機傾印檔的問題。該字面值不會被包含在當機傾印檔中,而當機傾印檢視器會抱怨堆積不完整。

    Own Id: OTP-16713

  • 修正了 clang 的 PGO 配置偵測。

    Own Id: OTP-16738

  • to_erl 程式已修正,可將換行符號正確地解譯為僅換行,而不是換行 + 回車。

    此錯誤會導致終端機在使用長度超過終端機大小的行時產生異常行為。

    Own Id: OTP-16741

  • 當呼叫 process_flag(priority, Prio) 變更行程優先權時,可能會發生競賽條件,導致系統任務的優先權提升被忽略。如果系統任務在變更優先權的同時,被排程在呼叫 process_flag() 的行程上,則會發生此錯誤。此錯誤相當無害,而且應該很少發生。

    Own Id: OTP-16770

  • 在 Android 上安裝時,將腳本中的 /bin/sh 調整為 /system/bin/sh

    Own Id: OTP-16833 Aux Id: PR-2729

  • 在極少數情況下,當載入由替代程式碼產生器(非 OTP 中的 Erlang 編譯器)產生、手寫或修補的 BEAM 檔案時,載入器可能會執行不安全的最佳化。

    Own Id: OTP-16850 Aux Id: ERL-1344

  • 修正了 socket 中的記憶體和檔案描述符洩漏問題。(當一個新開啟的 socket 沒有將 fd 加入到 VM 的輪詢集中(既沒有接收、傳送、接受或連線),在指定不同的控制行程之後,在沒有關閉的情況下被放棄(行程死亡),則可能會洩漏記憶體區塊和檔案描述符。)

    Own Id: OTP-16857

  • statistics(run_queue) 的文件錯誤地指出它會回傳所有正常執行佇列的總長度,但實際上它回傳的是所有正常和髒 CPU 執行佇列的總長度。文件已更新以反映實際行為。

    Own Id: OTP-16866 Aux Id: ERL-1355

改進與新功能

  • 變更以便在 Haiku 作業系統上建置。

    感謝 Calvin Buckley

    Own Id: OTP-16707 Aux Id: PR-2638

  • 在 Windows 上建置 inet 驅動程式時,關於類型轉換(在呼叫除錯巨集時使用)有很多編譯器警告。現在已解決此問題。

    Own Id: OTP-16715

  • 將 socket 註冊表設為可選(預設仍為啟用)。現在可以建置關閉 socket 註冊表的 OTP、透過設定環境變數關閉它,以及在執行階段控制(透過建立 socket 時的函式呼叫和參數)。

    Own Id: OTP-16763

  • 將 Android 上的預設檔案名稱編碼變更為 UTF-8。

    Own Id: OTP-16821 Aux Id: PR-2733

  • 澄清了分配所使用的原子快取標頭的格式。

    Own Id: OTP-16848 Aux Id: PR-2737

Erts 11.0.4

修正的錯誤與故障

  • ERTS 內部 I/O 輪詢實作可能會進入不一致的狀態,導致輸入事件被忽略。

    Own Id: OTP-16780 Aux Id: PR-2701

Erts 11.0.3

修正的錯誤與故障

  • 修正了 erlang:load_nif/2 中的錯誤,如果同時有程式碼變更操作正在進行,可能會導致它拋出 badarg 例外。此錯誤自 OTP 23.0 起存在。

    Own Id: OTP-16704 Aux Id: ERL-1273, PR-16704

  • 對除錯編譯的 VM 進行了小修正。

    Own Id: OTP-16717

  • 無意中重複使用已使用的模擬器內部事件物件可能會導致執行緒的喚醒訊號遺失。在最壞的情況下,這可能會導致執行階段系統掛起。但是,這種掛起非常罕見。

    Own Id: OTP-16766 Aux Id: ERL-1304

  • NIF 執行緒和驅動程式執行緒在終止時,會在非 Linux 系統上洩漏內部資源。在 Windows 上,這些資源是每個執行緒一個事件。在大多數其他系統上,每個執行緒一個互斥鎖和一個條件變數。在這些也缺乏 pthread_cond_timedwait() 的其他系統上,還會洩漏一個包含檔案描述符的管道。

    Own Id: OTP-16772 Aux Id: ERL-1304

Erts 11.0.2

修正的錯誤與故障

  • 修正了在尚未建立連線時傳送導出函式(例如 lists:reverse/1)時的錯誤。這可能會導致 VM 當機。此錯誤自 OTP 23.0 起存在。

    Own Id: OTP-16693 Aux Id: ERL-1254, PR-2640

Erts 11.0.1

修正的錯誤與故障

  • BIF 在讓出時暫時停用垃圾收集所使用的功能,可能會導致執行此類 BIF 的行程上的系統任務佇列變得不一致。行程系統任務用於例如清除程式碼、收集字面值資料,以及在其他行程中發出普通的垃圾收集時。

    此錯誤不會頻繁觸發。直接連續進行多次程式碼清除會使其更有可能觸發此錯誤。在觀察到的情況中,這導致了程式碼清除操作掛起。

    Own Id: OTP-16639 Aux Id: ERL-1236

  • 如果在呼叫 recv 時(socket 處於被動模式)關閉 socket,則 SCTP 和 UDP recv/2,3 會無限期地掛起。

    Own Id: OTP-16654 Aux Id: ERL-1242

Erts 11.0

修正的錯誤與故障

  • 現在 BIF 的行為就像普通函式一樣進行追蹤,允許 call_count 追蹤,並修正了一些 BIF 尾部呼叫自己或其他函式(「陷阱」)時遺失回傳追蹤訊息的錯誤。

    Own Id: OTP-14734 Aux Id: ERL-496

  • 修正了 64 位元 Windows 上的各種編譯器警告。

    Own Id: OTP-15800

  • erlang:fun_info(fun foo/1, name/1) 過去會根據使用 fun foo/1 的函式名稱回傳函式名稱。現在回傳的名稱是 -fun.foo/1-

    Own Id: OTP-15837

  • file:allocate/3 現在會在所有平台上更新檔案大小。

    Own Id: OTP-16155 Aux Id: PR-2408

  • 設定類型為 httpherlang:decode_packet 不再接受標頭名稱和冒號之間有空白字元的 HTTP 標頭。也就是說

    Content-Type : text/html

    不再被允許。這已變更為符合 RFC 7230,從而防止 HTTP desync 攻擊。

    * 潛在的不相容性 *

    Own Id: OTP-16168 Aux Id: ERL-1053

  • 修正了 erl -args_fileERL_FLAGSERL_AFLAGSERL_ZFLAGS 中的引號規則,使其與 unix sh 引號相同。

    此錯誤修正可能會導致之前透過 ERL_FLAGSERL_AFLAGSERL_ZFLAGS-args_file 傳遞給 erl 的配置選項,與修正前的方式不同。

    * 潛在的不相容性 *

    Own Id: OTP-16244 Aux Id: ERL-1051

  • 修正了 Erlang 分配,以處理節點連線但可以處理訊息分段,卻無法處理原子快取的情況。此錯誤只影響實作自訂分配載體的用戶。它自 OTP-21 起就存在。

    DFLAG_FRAGMENT 分配旗標新增至可以被分配實作拒絕的旗標集中。

    Own Id: OTP-16284

  • 編譯具有過度巢狀結構的匹配規格會導致執行階段系統因排程器堆疊耗盡而當機。在此情況下,受影響的函式現在會引發 system_limit 錯誤例外,而不是使執行階段系統當機。

    Own Id: OTP-16431 Aux Id: ERL-592

  • 修正了如果 Erlang 安裝在某些路徑上,則無法在 Windows 上啟動的問題。

    Own Id: OTP-16478 Aux Id: ERL-1115

  • 修正了 Windows 上在標準輸入關閉時效能不佳的錯誤,特別是當 VM 只被分配一個 CPU 核心時。例如,可以透過函式 os:cmd/1 啟動 erl 或 escript 來觸發此錯誤。可以使用命令列選項 -noinput 來避免此錯誤。

    效能不佳的原因是 I/O 執行緒無限期地旋轉。

    自身 ID:OTP-16521 輔助 ID:ERL-716

  • 修正了 Unix 平台上的一個錯誤,如果模擬器的有效使用者或群組 ID 與其實際 ID 不同,則會導致 file:read_file_info/1 返回不正確的結果。

    自身 ID:OTP-16571

  • socket:當同時定義了 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。

    在二進位匹配中,現在允許要匹配的片段大小為 guard 表達式,類似地,在 map 匹配中,鍵現在可以是 guard 表達式。更多詳細資訊請參閱 Erlang 參考手冊和程式設計範例。

    產生 Core Erlang 程式碼的語言編譯器或程式碼產生器可能需要更新,才能與 OTP 23 中的編譯器相容。更多詳細資訊請參閱 EEP 52 中向後相容性部分。

    自身 ID:OTP-14708

  • 在 BEAM 內部,已簡化對續指標的處理。此變更對使用者不可見,除非在 crashdump 檢視器中檢查進程堆疊。函式的續指標現在將儲存在該函式的 y(0) 下方。

    自身 ID:OTP-15077

  • seq_trace 權杖現在會傳播到衍生的進程。

    自身 ID:OTP-15232 輔助 ID:ERL-700

  • 改進了分散式衍生操作。這些改進包括可擴展性和效能改進,以及新功能。

    新功能

    • 分散式 spawn_monitor() BIF。
    • 支援分散式 spawn_opt() BIF 中的 monitor 選項。
    • 用於非同步衍生進程的新 spawn_request() BIF。spawn_request() 支援 spawn_opt() 支援的所有選項,以及一些其他選項。

    自身 ID:OTP-15251

  • 使 ets:insert/2ets:insert_new/2 在插入長記錄清單時讓出排程器執行。

    自身 ID:OTP-15517 輔助 ID:ERL-560

  • 將節點化身編號(也稱為「建立」)的大小從 2 位元增加到 32 位元。這將降低來自不同節點化身且名稱相同的 pid/port/ref 混淆的風險。

    自身 ID:OTP-15603

  • 執行階段系統現在可以將 Erlang 詞彙編碼為 I/O 向量的 Erlang 外部詞彙格式。這樣做的好處是,可以直接引用參考計數的二進位,而不是複製到新的二進位中。

    TCP 上的預設 Erlang 分散式會始終使用此功能。如果驅動程式實作了 outputv 回呼,則使用 port 作為分散式控制器的替代分散式實作將會使用此功能。如果 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/1term_to_iovec/2。它們的工作方式與具有對應元數的 term_to_binary() 完全相同,只是返回類型不同。

    自身 ID:OTP-15618

  • 改進了 ETS 並行呼叫的可擴展性,這些呼叫會變更表格大小,例如 ets:insert/2ets:delete/2

    此效能功能已在 OTP 22.0 中針對 ordered_set 實作,現在適用於所有 ETS 表格類型。

    改進的可擴展性可能會以較長的 ets:info(T,size)ets:info(T,memory) 的延遲為代價。因此,新增了新的表格選項 decentralized_counters。對於啟用 write_concurrencyordered_set,預設值為 true,對於所有其他表格類型,預設值為 false

    自身 ID:OTP-15744 輔助 ID:OTP-15623, PR-2229

  • 現在可以使用 file:open/2 在傳遞 directory 選項時開啟目錄。

    自身 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

  • 新增元數為 1 的 atom_to_binarybinary_to_atombinary_to_existing_atom 版本,所有版本都以 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_pollasync I/O dtrace 和 LTTng 追蹤探針。

    * 潛在的不相容性 *

    自身 ID:OTP-16215

  • 最佳化 persistent_term:put/2erase/1,以在許多情況下減少 CPU 消耗。

    自身 ID:OTP-16237 輔助 ID:PR-2389

  • 已擴展在不依賴 EPMD 的情況下執行 Erlang 分散式的可能性。為了實現這一點,已向 inet 分散式新增了幾個新選項。

    • -dist_listen false - 設定分散式通道,但不監聽傳入連線。當您想要使用目前的節點與同一台電腦上的另一個節點互動,而無需讓它加入整個叢集時,這非常有用。

    • -erl_epmd_port Port - 設定內建 EPMD 用戶端應返回的預設 port。這允許本機節點知道叢集中任何其他節點的連線 port。

    也已擴展 erl_epmd 回呼 API,以允許返回 -1 作為建立,這表示節點將會建立隨機建立。

    此外,新增了一個名為 listen_port_please 的新回呼函式,該函式允許回呼返回分散式應使用的監聽 port。如果要從外部服務擷取監聽 port,則可以使用此函式來取代 inet_dist_listen_min/max

    自身 ID:OTP-16250

  • 在沒有 closefrom() 的系統(例如 Linux)上,迭代所有可能的檔案描述元並針對每個描述元呼叫 close() 效率不高。當檔案描述元的最大數量已調整為較大數字時,情況尤其如此。

    相反地,在 erl_child_setup 中,瀏覽 /dev/fd 下的開啟描述元,並僅關閉那些開啟的描述元。

    此最佳化會影響啟動新的 Erlang 執行個體的 CPU 使用率。

    自身 ID:OTP-16270

  • 針對空 map 或相同 map 的微不足道情況,最佳化 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

  • 當使用 erlang:decode_packet/3inet:setopts/2httphhttph_bin 選項時,返回值已變更為也包含未修改的原始標頭。請參閱 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 在重新建立與相同節點的連線之前,先傳送失敗連線的 nodedown 訊息,然後再傳送 nodeup 訊息。

    自身 ID:OTP-16362

  • 更新循序追蹤,以支援訊息傳遞以外的其他資訊傳輸。

    自身 ID:OTP-16370 輔助 ID:OTP-15251, OTP-15232

  • socket:現在可以從已存在的檔案描述元建立 socket。

    自身 ID:OTP-16398 輔助 ID:ERL-1154

  • socket:socket:supports/1 函式現在也會報告是否支援 netns。

    自身 ID:OTP-16432

  • 當比較兩個大小不同的 map 時,=:= 已最佳化為立即返回 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/1init:restart/1 可用於在重新啟動期間變更程式碼載入模式。

    自有 ID:OTP-16492 輔助 ID:PR-2461

  • 改進 net nif 的配置,應可提高可攜性。

    自有 ID:OTP-16530 輔助 ID:OTP-16464

  • socket:Socket 計數器和 socket 全域計數器現在以映射(map)表示(而不是屬性列表)。

    自有 ID:OTP-16535

  • 減少並行建置中 erlc 的資源使用量(例如 make -j128)。

    自有 ID:OTP-16543 輔助 ID:ERL-1186

  • 實驗性的 socket 模組已移除限制,因此現在 'seqpacket' socket 類型應可適用於作業系統支援的任何通訊網域(協定族),通常是 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

  • 修正了緩衝區溢位錯誤,此錯誤導致在 NetBSD 上同時連線多個節點後,EPMD 佔用 100% 的 CPU。

    自有 ID:OTP-16615

  • erl -remsh 現在預設使用動態節點名稱功能。詳情請參閱 erl 文件。

    自有 ID:OTP-16616

  • socket:預設情況下,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

  • 修正了處理程序系統任務的縮減計數。

    自身 ID:OTP-18170 輔助 ID:PR-6135

  • 終止程序的優先權提升無法運作,這可能會導致此類程序的執行延遲。

    自身 ID:OTP-18175 輔助 ID:PR-6142

  • 當傳遞引數 native 時,erlang:monotonic_time/1erlang:system_time/1erlang:time_offset/1os: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

已修正的錯誤和故障

  • 修正了當從 on_heap 變更為 off_heap 訊息佇列資料時,程序訊息佇列處於不一致狀態,導致 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

改進和新功能

  • 由於程式碼清除或在具有大量程序的系統上移除常值區域,在 normallow 優先順序下執行的程序的反應速度可能會受到影響。這是因為在這些操作期間,系統上的所有程序都會同時排程執行。

    此問題已透過限制系統中未完成的清除和複製常值要求來修正。預設情況下,此限制設定為系統上排程器數量的兩倍。這將確保排程器將有足夠的工作排程以盡快執行這些操作,同時其他工作將以更高程度穿插。然而,由於強制執行此限制的額外負荷(相較於使用非常大的限制時),這些操作的效能將會有些許降低。

    此限制可以透過將 +zosrl 命令列引數傳遞至 erl,或呼叫 erlang:system_flag(outstanding_system_requests_limit, NewLimit) 來設定。

    自有 ID:OTP-17796 輔助 ID:ERIERL-729, PR-5473

Erts 10.7.2.15

已修正的錯誤和故障

  • 在 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

已修正的錯誤和故障

  • 在 32 位元電腦上,binary_to_term/1,2 現在更能抵抗包含外部格式 map 的損壞二進制檔案。

    專屬 ID:OTP-17604

  • process_info(Pid, status) 應該回報 waiting 狀態時,可能會錯誤地回報 running 狀態。當呼叫程序以高於被檢查程序的優先順序執行時,就會發生這種情況。此錯誤自 OTP 21.0 (erts 版本 10.0) 起已存在。

    專屬 ID:OTP-17628

  • 正在退出的埠與同時接收到該埠的訊號之間的競爭可能導致執行期系統崩潰。受影響的訊號為 linkmonitordemonitor。在 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 之前的狀態時呼叫。這可能導致堆積包含無效的 term,這可能會在掃描整個堆積時造成問題(例如,崩潰)。

    專屬 ID:OTP-17677

  • 修正了當鍵值對包含多個引用的 magic 參考時,persistent_term 中的錯誤。Magic 參考是 NIF 資源或從 BIF 返回的,例如 ets:newatomics:new。該錯誤可能會導致提前解除配置所引用資源的記憶體。

    該錯誤也適用於以組態選項 --enable-sharing-preserving 建構的執行期系統上訊息傳遞中的 magic 參考。

    該錯誤從 OTP-24.0 開始存在於 64 位元版本中,從 OTP-20.0 開始存在於 32 位元版本中。

    專屬 ID:OTP-17700 輔助 ID:GH-5271、PR-5273

Erts 10.7.2.13

已修正的錯誤和故障

  • 修正了 zlib 中的錯誤,該錯誤導致解壓縮在某些有效輸入上當機並出現 data_error。此錯誤也可能導致使用 zip:extract() 從 zip 封存檔擷取失敗。

    自有 ID:OTP-17470 輔助 ID:ERIERL-657

  • 呼叫 erlang:cancel_timer(_, [{info, false}]) 可能會導致呼叫的程序在呼叫中永遠阻塞。請注意,只有同步版本的呼叫(也就是 async 選項為 false),且 info 選項設定為 false 的組合才會受此錯誤影響。

    自有 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

  • 修正當追蹤在 dirty scheduler 上執行的程序的排程或垃圾回收時,可能導致崩潰的競爭條件。

    自有 ID:OTP-17568 輔助 ID:PR-4940

  • 修正當給定一個子二進位檔案作為主體時,re:run 可能會崩潰/返回無效結果的罕見錯誤。

    此錯誤自 Erlang/OTP 20.0 起就已存在。

    自有 ID:OTP-17585 輔助 ID:GH-5150

  • binary_to_term/1,2 現在對包含外部格式中 map 的損壞二進位檔案更具彈性。

    自有 ID:OTP-17594

Erts 10.7.2.12

已修正的錯誤和故障

  • 如果 port 忙碌且呼叫的程序在呼叫時有傳入信號,則呼叫 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

已修正的錯誤和故障

  • 修復了匹配規格編譯器中的錯誤,該錯誤被發現在除錯 VM 上針對某些匹配規格導致堆疊溢出崩潰。這可能會對標準 VM 造成問題,但尚未驗證。匹配規格由 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

已修正的錯誤和故障

  • 下列訊號可能會在來自同一發送者給同一接收者的其他訊號之前傳遞。也就是說,這些訊號可能會過早到達。

    • 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

已修正的錯誤和故障

  • 修復了計時器實作中的一個錯誤,該錯誤可能導致設定在未來超過 37.25 小時觸發的計時器被延遲。如果有多個計時器安排在非常接近的時間觸發,但仍在不同的時間,並且處理計時器的排程器執行緒無法足夠快地處理它們,則可能會發生這種情況。在這種情況下,延遲的計時器會在另一個不相關的計時器觸發時觸發。

    自有 ID:OTP-17253

  • 修正了可能導致 VM 當機的呼叫時間追蹤錯誤(由 eprof 使用)。此錯誤自 OTP-22.2 起存在(但 OTP-23 中不存在)。

    自有 ID:OTP-17290 輔助 ID:GH-4635

改進和新功能

  • 修正了當使用 sendfile 且遠端關閉連線時,檔案描述器洩漏的問題。此錯誤自 OTP-21.0 開始存在。

    自有 ID:OTP-17244

Erts 10.7.2.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 10.7.2.7

已修正的錯誤和故障

  • suspend_process()resume_process() BIF 沒有正確檢查其參數,這可能會導致模擬器崩潰。

    自有 ID:OTP-17080

  • 如果執行階段系統在啟動時已開啟超過 1023 個檔案描述器,則執行階段系統會進入無限迴圈。

    自有 ID:OTP-17088 輔助 ID:ERIERL-580

Erts 10.7.2.6

已修正的錯誤和故障

  • 修復了接收訊號(連結/監控/spawn_request/spawn_reply)與斷線之間競爭時,罕見的分發錯誤。症狀:VM 崩潰。自:OTP 21.0。

    自有 ID:OTP-16869 輔助 ID:ERL-1337

Erts 10.7.2.5

已修正的錯誤和故障

  • 修復了在具有未記載且不受支援的 SMALL_MEMORY 功能的系統上啟用 ERTS 內部配置器時導致問題的錯誤。

    自有 ID:OTP-16939

Erts 10.7.2.4

已修正的錯誤和故障

  • inet:setopts([{active,once}]) 不必要地喚醒 IO 輪詢執行緒,導致鎖定爭用和明顯更高的 CPU 使用率。

    自有 ID:OTP-16847 輔助 ID:ERL-1301

  • statistics(run_queue) 的文件錯誤地指出它會回傳所有正常執行佇列的總長度,但實際上它回傳的是所有正常和髒 CPU 執行佇列的總長度。文件已更新以反映實際行為。

    Own Id: OTP-16866 Aux Id: ERL-1355

  • 修復了 ERTS 內部執行緒喚醒功能中的兩個錯誤。這些錯誤主要是在系統中的所有執行緒嘗試進入休眠狀態時發生。當觸發錯誤時,某些操作會延遲,直到某個執行緒因其他原因而喚醒。受影響的最重要操作是程式碼載入、持久性術語更新和記憶體釋放。

    自有 ID:OTP-16870

  • 修復了 ets:select_replace/2compressed 表格上的錯誤,該錯誤可能會產生錯誤的結果或 VM 崩潰。該錯誤自 OTP 20 開始存在。

    自有 ID:OTP-16874 輔助 ID:ERL-1356、PR-2763

改進和新功能

  • 自 OTP 22 起,特定於配置器的記憶體載體池被節點全域載體池取代。不幸的是,在某些情況下,由於主要處理短期資料的配置器使用的載體中散佈了長期存在的資料,這會導致大量的記憶體碎片。

    引入了一個新的命令列參數 +M<S>cp,可用來啟用舊的行為,並設定載體池的其他行為。為了設定所有分配器使用特定分配器的載體池的舊行為,請在啟動 Erlang 系統時,將 +Mucp : (包含冒號字元) 作為命令列參數傳遞給 erl

    載體池的預設配置將在未來某個時間點變更為 +Mucp :,但不會在此修補程式中變更。

    Own Id: OTP-16856

Erts 10.7.2.3

已修正的錯誤和故障

  • ERTS 內部 I/O 輪詢實作可能會進入不一致的狀態,導致輸入事件被忽略。

    Own Id: OTP-16780 Aux Id: PR-2701

Erts 10.7.2.2

已修正的錯誤和故障

  • 無意中重複使用已使用的模擬器內部事件物件可能會導致執行緒的喚醒訊號遺失。在最壞的情況下,這可能會導致執行階段系統掛起。但是,這種掛起非常罕見。

    Own Id: OTP-16766 Aux Id: ERL-1304

  • NIF 執行緒和驅動程式執行緒在終止時,會在非 Linux 系統上洩漏內部資源。在 Windows 上,這些資源是每個執行緒一個事件。在大多數其他系統上,每個執行緒一個互斥鎖和一個條件變數。在這些也缺乏 pthread_cond_timedwait() 的其他系統上,還會洩漏一個包含檔案描述符的管道。

    Own Id: OTP-16772 Aux Id: ERL-1304

Erts 10.7.2.1

已修正的錯誤和故障

  • 修正在 erl_crash.dump 產生中,如果找到最近取消的計時器,可能會導致 SEGV 核心傾印的錯誤。

    自身 ID:OTP-16596 輔助 ID:ERL-1105, PR-2606

  • BIF 在讓出時暫時停用垃圾收集所使用的功能,可能會導致執行此類 BIF 的行程上的系統任務佇列變得不一致。行程系統任務用於例如清除程式碼、收集字面值資料,以及在其他行程中發出普通的垃圾收集時。

    此錯誤不會頻繁觸發。直接連續進行多次程式碼清除會使其更有可能觸發此錯誤。在觀察到的情況中,這導致了程式碼清除操作掛起。

    Own Id: OTP-16639 Aux Id: ERL-1236

  • 如果在呼叫 recv 時(socket 處於被動模式)關閉 socket,則 SCTP 和 UDP recv/2,3 會無限期地掛起。

    Own Id: OTP-16654 Aux Id: ERL-1242

Erts 10.7.2

已修正的錯誤和故障

  • 在移除所有對它的使用之前,可能會過早釋放常值區域。當終止的程序有複雜的結束原因,參考到同時移除的常值,或者當終止的程序繼續執行存取同時移除的常值(透過堆積)的髒 NIF 時,就會發生這種情況。

    自有 ID:OTP-16640 輔助 ID:OTP-16193

  • 當檢查正在執行髒 NIF 時終止的程序的程序碼時,VM 可能會當機。檢查程序碼是程式碼清除作業的一部分。

    自有 ID:OTP-16641

  • low 優先順序的系統工作未與 normal 優先順序的系統工作交錯,如同它們應該交錯一樣。如果垃圾收集是由 low 優先順序的程序請求,這可能會導致延遲另一個程序的垃圾收集時間,時間會比預期的長。

    自有 ID:OTP-16642

Erts 10.7.1

已修正的錯誤和故障

  • [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

已修正的錯誤和故障

  • gen_udp:recv(S, N, 0) 會損壞 socket 的內部狀態,因此在使用 {active, once} 接收後,它總是返回 {error, timeout},並浪費已接收的 UDP 封包。此錯誤現已修正。

    由 Alexander Petrovsky 回報並精確指出。

    自身 ID:OTP-16059

  • 原子 esock_atom_user 和 esock_atom_kernel 從未實際建立。現在已修正此問題。

    自身 ID:OTP-16381

  • 修正了 socket 模組中可能導致排程器死鎖的錯誤。

    自身 ID:OTP-16384

  • 修正了當 NIF 資源的 downstop 回呼在 NIF 模組被清除後被呼叫時,導致 VM 崩潰的錯誤。此修正將延遲卸載,直到所有此類資源物件都被垃圾回收。

    自身 ID:OTP-16399

  • 修正了當使用無效的 UpdateOp 和不存在的 Key 呼叫 ets:update_counter/4 時,導致 ets:info(T,size) 返回不正確值的錯誤。此錯誤自 OTP-19.0.2 起存在。

    自身 ID:OTP-16404 輔助 ID:ERL-1127

  • 修正了當程序呼叫會阻塞其他正常排程器的 BIF,然後在沒有主程序鎖定的情況下寫入自己的堆時,可能導致堆損壞的錯誤。在 dirty 排程器上執行的 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 在第一個排程的 dirty I/O 工作時崩潰。

    自身 ID:OTP-16481

  • 修正了在早期啟動期間嘗試記錄載入檔案時的錯誤的崩潰問題。

    自身 ID:OTP-16491

改進和新功能

  • 對於 socket,並非所有 send 和 receive 旗標都受所有平台支援。為了(至少)簡化測試,socket:supports/0,1,2,3 函式已擴充了 send_flags 和 recv_flags 項目,這些項目指示目前平台可以管理哪些旗標。

    自身 ID:OTP-16153

  • 在 net 模組中新增 getifaddrs 的「完整功能」版本。

    自身 ID:OTP-16212 輔助 ID:ERL-1070

  • 選項 busy_limits_portbusy_limits_msgq 已新增至 BIF erlang:open_port/2busy_limits_port 選項可用於控制執行 spawn_driverfd_driver 的 port 的忙碌狀態。busy_limits_msgq 選項可用於控制 port 訊息佇列的忙碌狀態。

    自身 ID:OTP-16306 輔助 ID:ERIERL-439

  • 新增了一個 socket「註冊表」,使其可以列出目前開啟的 socket。

    自身 ID:OTP-16309

  • 已擴充了 socket nif 管理的計數器。它們的「大小」已從 32 位元增加到 64 位元。新增了兩個最大封包大小(用於讀取和寫入)。並新增了四個接受計數器。

    自身 ID:OTP-16387

  • 新增 gcc 選項 -fno-common 以偵測全域變數的意外名稱衝突。

    自身 ID:OTP-16420 輔助 ID:PR-2513

  • 新的動態鎖定檢查器,可驗證鎖定順序並偵測驅動程式和 NIF 中潛在的死鎖錯誤。在以 -emu_type debug 啟動的模擬器中,或使用組態選項 --enable-lock-checking 建置時,會與舊的靜態鎖定檢查器(用於 ERTS 內部鎖定)一起啟用。

    自身 ID:OTP-16427

Erts 10.6.4

已修正的錯誤和故障

  • 一個程序可能會進入不一致的狀態,即它處於可執行狀態,但永遠不會排程執行。當在同一類型的 dirty 排程器上同時排程 normallow 優先權程序的組合時,可能會發生這種情況。

    自身 ID:OTP-16446 輔助 ID:ERL-1157

Erts 10.6.3

已修正的錯誤和故障

  • 一個程序可能會進入無限期重新排程但沒有任何進展的狀態。當在試圖在 dirty 排程器上執行的高優先權程序上排程系統任務(例如程序程式碼檢查(程式碼清除的一部分))時,會發生這種情況。

    自身 ID:OTP-16436 輔助 ID:ERL-1152

改進和新功能

  • 改進了執行 dirty 的程序的訊號處理。例如,避免在程序在 dirty 排程器上執行垃圾回收時,dirty 訊號處理程序中出現忙碌等待。

    自身 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

已修正的錯誤和故障

  • 修正了新的 socket API 中可能導致核心傾印的問題。socket 關閉期間的競爭可能會導致核心傾印(無效的 nif 環境釋放)。

    自身 ID:OTP-16314 輔助 ID:ERL-1098

  • 修正了新的 socket 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,send 和 receive 旗標的無效編碼導致 badarg 和 send 失敗。

    自身 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 socket 選項 'peek_off' 已停用。如果已設定 peek_off,然後呼叫 socket:recv/3 並帶有 peek 旗標,則此呼叫可能會掛起。

    自有 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 選項且 term 包含 atom 時,ETS 查閱中的效能問題。在此修正之前,atom 的解壓縮演算法會不必要地取得全域鎖定來驗證 atom。

    自有 ID:OTP-16316

改進和新功能

  • 對於 socket,並非所有 send 和 receive 旗標都受所有平台支援。為了(至少)簡化測試,socket:supports/0,1,2,3 函式已擴充了 send_flags 和 recv_flags 項目,這些項目指示目前平台可以管理哪些旗標。

    自身 ID:OTP-16153

  • 對於 socket,新增對 IPv6 socket 選項 tclass 和 recvtclass 的支援。兩者都已新增,但它們的使用取決於平台。呼叫 socket:supports(options, ipv6, Opt) 以確定要使用哪個選項來要求 TCLASS 控制訊息標頭。

    自有 ID:OTP-16180

  • 對於 socket,TCP socket 選項 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,新增對 socket 選項 extended_err 的支援。Andreas Schultz。

    自有 ID:OTP-16302 輔助 ID:#2449

  • 已最佳化 ETS 表格,使其在僅啟用一個排程器的系統中執行時不使用任何鎖定。這可以為大量使用 ETS 表格的應用程式提供顯著的效能提升。

    自有 ID:OTP-16315

Erts 10.5.6

已修正的錯誤和故障

  • 大量快速執行的 dirty work 可能會導致內部旋轉鎖定上的嚴重爭用。旋轉鎖定已由在這些情況下表現更好的互斥鎖取代。

    自有 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

已修正的錯誤和故障

  • 編譯器可能會對接收執行不安全的最佳化,這會導致接收僅掃描部分訊息佇列。

    編譯器中的這個錯誤修復程式修正了 socket 模組中的一個錯誤。

    自有 ID:OTP-16219 輔助 ID:ERL-1076

  • 修正執行時間用於執行接收佇列最佳化的接收標記可能設定不正確的錯誤。此錯誤的徵兆是本應在接收中匹配的訊息永遠不會匹配。

    此錯誤需要 OTP-22 編譯器和多次選擇性接收才能觸發。請參閱 OTP-16219 以了解編譯器中錯誤修復程式的詳細資訊。

    自有 ID:OTP-16241 輔助 ID:ERL-1076 OTP-16219

Erts 10.5.3

已修正的錯誤和故障

  • Erlang/OTP 現在可以在 macOS Catalina (10.15) 上建置。

    自有 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 通常是 atom badarg

    自有 ID:OTP-16107 輔助 ID:ERL-1049

Erts 10.5

已修正的錯誤和故障

  • 如果您在 gen_tcp 接聽 socket 上設定 {linger,{true,0}}、在該 socket 上接受連線,然後關閉接受的 socket,則現在會將 linger 零設定傳輸到接受的 socket。在此修正之前,該資訊遺失,且接受的 socket 上的關閉行為不正確。

    自有 ID:OTP-15370 輔助 ID:ERIERL-353

  • 在 OTP-15747 中實作的傳送輔助資料意外遺留下測試程式碼,導致 Windows 上所有 UDP 傳送失敗。現在已修正此問題。

    自有 ID:OTP-15422 輔助 ID:OTP-15747

  • 在 socket nif 中,在 if-def'ing 支援的 TCP 旗標時使用了無效的旗標:TCP_MAXSEG 和 TCP_NODELAY(支援函式)。

    自有 ID:OTP-15827

  • 修正實驗性 socket 模組中的記憶體洩漏。

    自有 ID:OTP-15830

  • re:run() 現在會在驗證大型主體中的 utf8 時產生 yield。

    自有 ID:OTP-15836 輔助 ID:ERL-876

  • 修正在 seq_trace:set_token(label,Term) 中的錯誤,如果 Term 是堆積配置的(不是 atom、小型整數、本地 pid 或 port),則可能會導致 VM 當機。此錯誤自 OTP 21.0 起就已存在,當時首次允許小型整數以外的 term 作為標籤。

    自有 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。請參閱 http://pcre.org/original/changelog.txt 以了解對 PCRE 所做的變更。此程式庫實作 re 正規表示式模組的主要部分。

    自有 ID:OTP-15889

  • 修正當在 Windows 上使用 {active,N} 時關閉 socket 的競爭情況。

    自有 ID:OTP-15901 輔助 ID:ERL-960 PR-2272

  • 允許在 Windows 上使用多個 -config 命令列選項 erl,以符合其他作業系統。

    自有 ID:OTP-15918 輔助 ID:ERL-912

  • 修正使 ERL_FLAGS 環境變數不會干擾命令列引數。在此修正之前,您可以寫入

    ERL_FLAGS="10" erl +S

    並且 erlang 會像給定引數 10 一樣啟動 +S

    自有 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 的內嵌組裝中使用具名的標籤。這樣可以讓 erts 使用啟用 LTO 的 gcc 9.1.0 編譯。

    自有 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:putpersistent_term:erase 期間,如果進程被終止時會觸發的錯誤。

    自有 ID:OTP-16041

  • 在當機傾印文件中,將單位新增至所有記憶體標語。

    自有 ID:OTP-16042

  • 修正了 binary_to_term 中的錯誤,如果解碼的 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

  • 現在 Socket 計數器可以如預期般運作,並且也可以使用(新的)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 的 ETS ordered_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

已修正的錯誤和故障

  • 無效的值測試導致 socket:setopt(Socket, ip, add_membership, ip_mreq()) 因 badarg 而失敗。drop_membership 也是如此。

    自有 ID:OTP-15908 輔助 ID:ERL-980

  • 修正了在對包含未處理的監控器關閉訊號的進程進行文字傾印時,導致 VM 當機的錯誤。可以使用 erlang:system_info(procs)、追蹤功能 process_dump、Erlang Shell 中斷選單和當機傾印來完成文字處理程序傾印。此錯誤自 OTP 21.0 起存在。

    自有 ID:OTP-15909 輔助 ID:ERL-979

  • lists:subtract/2 在 64 位元平台上會針對某些輸入產生不正確的結果。

    自有 ID:OTP-15938 輔助 ID:ERL-986

  • 修正了載入器中類似於 OTP-15938 的錯誤,在 64 位元平台上針對某些輸入產生不正確的程式碼。

    自有 ID:OTP-15939

  • 修正了導致排程器執行緒在極少數情況下無限期阻止旋轉的錯誤。此錯誤自 OTP 21.0 起存在。

    自有 ID:OTP-15941 輔助 ID:PR-2313

Erts 10.4.3

已修正的錯誤和故障

  • 修正了當使用 latin1 編碼時使用 binary_to_existing_atom/2list_to_existing_atom/2 時發生的緩衝區溢位問題。

    自有 ID:OTP-15819 輔助 ID:ERL-944

  • 如果執行階段系統收到接收者是目前節點舊版本上的進程的 exit/2 訊號,則會斷開連線。也就是說,接收節點具有相同的節點名稱,但「建立」編號不同。由於接收進程不再存在,因此現在只會捨棄該訊號。

    自有 ID:OTP-15867 輔助 ID:ERIERL-373

Erts 10.4.2

已修正的錯誤和故障

  • 修正了 process_info(Pid,reductions),使其不會絕對增加所測量進程 Pid 的縮減計數。重複測量閒置進程的縮減次數,大多數情況下(但不能保證)會回傳相同的值,就像 OTP 21.3.8 之前的行為一樣。

    自有 ID:OTP-15865 輔助 ID:ERL-964

  • 修正了不正確的載入時最佳化,可能會在提取深層巢狀 Tuple 元素時導致當機。

    自有 ID:OTP-15871 輔助 ID:ERIERL-374

  • 修正了在 Erlang Shell 中斷選單中按下 P 以取得「進程資訊」時,導致 VM 當機的錯誤。此錯誤自 OTP 22.0 起存在。

    自有 ID:OTP-15873 輔助 ID:ERL-965

Erts 10.4.1

已修正的錯誤和故障

  • 在巢狀使用 try/catch 時,使用不同的類別使用 erlang:raise/3 重新擲回例外狀況,並不總是能夠變更例外狀況的類別。

    自有 ID:OTP-15834 輔助 ID:ERIERL-367

Erts 10.4

已修正的錯誤和故障

  • 當附加空二進位時,不要配置新的位元字串/二進位。

    自有 ID:OTP-15535 輔助 ID:PR-2055

  • 記錄 process_info(_, current_function) 在執行原生程式碼時可以回傳 {current_function, undefined}

    自有 ID:OTP-15543 輔助 ID:PR-2089

  • 修正了 ets:selectets:match 和相關函式中的錯誤,可能會導致表格在呼叫回傳後保持固定狀態(如同已呼叫 ets:safe_fixtable 一樣)。如果另一個並行執行的進程在其 ets:select/match 呼叫期間將表格所有權轉移給該進程,則可能會發生這種情況。可以使用 ets:give_awayheir 表格選項來轉移所有權。

    自有 ID:OTP-15672

  • 修正了 file:list_dir/1 中特定於 Windows 的錯誤,該錯誤導致它在網路共用上發生錯誤。

    自有 ID:OTP-15693

  • 修正了從 NIF 資源解構函式呼叫 enif_whereis_* 時的錯誤。症狀可能是模擬器當機或排程器執行緒掛起。

    自有 ID:OTP-15694 輔助 ID:ERL-863

  • 修正了 apply/3 錯誤情況中的錯誤,在某些情況下,例外狀況會錯誤地具有空的引數清單。

    自有 ID:OTP-15698

  • 已修正 maps 實作中的錯誤,可能會導致當機或記憶體使用量增長,直到機器記憶體不足為止。當將具有二進位 B1 的索引鍵 K1 的新索引鍵值對插入到具有二進位 B2 的索引鍵 K2 的 Map M 中時,如果滿足下列條件,則可能會發生這種情況

    • B1 =/= B2
    • size(B1) >= 4294967296
    • size(B2) >= 4294967296
    • size(M) >= 32
    • (size(B1) rem 4294967296) == (size(B2) rem 4294967296)
    • B1B2 中的前 (size(B1) rem 4294967296) 個位元組相同
    • K1 中的 B1 替換為 B2 會建立與 K2 相同值的 term

    問題的根本原因是 maps 實作只雜湊了二進位的前 (X rem 4294967296) 個位元組,因此不同的二進位可以獨立於雜湊種子而獲得相同的雜湊值。

    自有 ID:OTP-15707

  • 當嘗試編碼大於 4 GB 的二進位資料時,term_to_binary() 和分散式傳送現在會拋出 system_limit 例外,而不是產生錯誤的結果。

    內部 ID:OTP-15708

  • vxworks 的組態已更新,以符合環境變數 CFLAGS 的設定。

    內部 ID:OTP-15773

  • 修正組態,使其在 PGO (profile guided optimizations,設定檔引導最佳化) 二進位檔連結失敗時,不會啟用 PGO。例如,當沒有安裝 gcov 函式庫時,就會發生這種情況。

    內部 ID:OTP-15788

  • 修正 OpenBSD 上的錯誤,在該錯誤中,使用 active, trueactive, N 的 socket 可能會導致系統進入死鎖。此錯誤是在 erts-10.2 (OTP-21.2) 中引入的。

    內部 ID:OTP-15791

改進和新功能

  • 新增 Erlang 分散式協定的支援,將大型訊號的酬載分割成多個片段。這允許其他行程在這些訊號傳輸期間不中斷地進行通訊。

    內部 ID:OTP-13397

  • 透過 socket 模組提供了一個簡單的 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_undefinedenif_is_pid_undefinedenif_compare_pids

    內部 ID:OTP-15011,輔助 ID:PR-2147

  • 未充分利用的記憶體區段(載體)現在可以在所有配置器實例之間移動,而不僅僅是在相同類型的實例之間移動,這在某些情況下大大減少了記憶體使用量。

    內部 ID:OTP-15063

  • 模擬器現在會使用 madvise(2) + MADV_FREE(或類似的機制)來標記池化載體中的空閒區塊,讓作業系統在必要時回收相關的實體記憶體。

    內部 ID:OTP-15075

  • enif_select 新增了 ERL_NIF_SELECT_CANCEL 功能,以便取消(或「取消選取」)先前選取之檔案描述器上的讀取或寫入事件。

    內部 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/2binary: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_readenif_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/ref 現在都與來自該節點且具有相同編號的任何其他 pid/port/ref 相等。

    在此變更之前,它們的比較結果不同,因為 pid/port/ref 的節點建立與任何實際的 pid/port/ref 建立都不相等。

    這主要會影響在 shell 中輸入的 pid/port/ref。

    內部 ID:OTP-15613

  • persistent_term 函數 put/2erase/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_concurrencyordered_set 類型的 ETS 表格使用分散式計數器。實驗表明,此變更大幅提高了在頻繁呼叫 ets:insert/2ets:delete/2 的情況下,啟用 write_concurrency 的 ETS ordered_set 表格的擴展性。

    內部 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 編碼器)特別有用,它可以提高效能和可讀性。

    內部 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

修正錯誤與故障

  • 修復了匹配規格編譯器中的錯誤,該錯誤被發現在除錯 VM 上針對某些匹配規格導致堆疊溢出崩潰。這可能會對標準 VM 造成問題,但尚未驗證。匹配規格由 ets:match/select 函式和 erlang:trace_pattern 使用。

    專屬 ID:OTP-17379 輔助 ID:PR-4804

  • 如果 port 忙碌且呼叫的程序在呼叫時有傳入信號,則呼叫 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

修正錯誤與故障

  • 修復了接收訊號(連結/監控/spawn_request/spawn_reply)與斷線之間競爭時,罕見的分發錯誤。症狀:VM 崩潰。自: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 輪詢實作可能會進入不一致的狀態,導致輸入事件被忽略。

    Own Id: OTP-16780 Aux Id: PR-2701

  • statistics(run_queue) 的文件錯誤地指出它會回傳所有正常執行佇列的總長度,但實際上它回傳的是所有正常和髒 CPU 執行佇列的總長度。文件已更新以反映實際行為。

    Own Id: OTP-16866 Aux Id: ERL-1355

  • 修復了 ERTS 內部執行緒喚醒功能中的兩個錯誤。這些錯誤主要是在系統中的所有執行緒嘗試進入休眠狀態時發生。當觸發錯誤時,某些操作會延遲,直到某個執行緒因其他原因而喚醒。受影響的最重要操作是程式碼載入、持久性術語更新和記憶體釋放。

    自有 ID:OTP-16870

  • 修復了 ets:select_replace/2compressed 表格上的錯誤,該錯誤可能會產生錯誤的結果或 VM 崩潰。該錯誤自 OTP 20 開始存在。

    自有 ID:OTP-16874 輔助 ID:ERL-1356、PR-2763

Erts 10.3.5.13

修正錯誤與故障

  • 無意中重複使用已使用的模擬器內部事件物件可能會導致執行緒的喚醒訊號遺失。在最壞的情況下,這可能會導致執行階段系統掛起。但是,這種掛起非常罕見。

    Own Id: OTP-16766 Aux Id: ERL-1304

  • NIF 執行緒和驅動程式執行緒在終止時,會在非 Linux 系統上洩漏內部資源。在 Windows 上,這些資源是每個執行緒一個事件。在大多數其他系統上,每個執行緒一個互斥鎖和一個條件變數。在這些也缺乏 pthread_cond_timedwait() 的其他系統上,還會洩漏一個包含檔案描述符的管道。

    Own Id: OTP-16772 Aux Id: ERL-1304

Erts 10.3.5.12

修正錯誤與故障

  • BIF 在讓出時暫時停用垃圾收集所使用的功能,可能會導致執行此類 BIF 的行程上的系統任務佇列變得不一致。行程系統任務用於例如清除程式碼、收集字面值資料,以及在其他行程中發出普通的垃圾收集時。

    此錯誤不會頻繁觸發。直接連續進行多次程式碼清除會使其更有可能觸發此錯誤。在觀察到的情況中,這導致了程式碼清除操作掛起。

    Own Id: OTP-16639 Aux 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

修正錯誤與故障

  • 修正了當使用無效的 UpdateOp 和不存在的 Key 呼叫 ets:update_counter/4 時,導致 ets:info(T,size) 返回不正確值的錯誤。此錯誤自 OTP-19.0.2 起存在。

    自身 ID:OTP-16404 輔助 ID:ERL-1127

  • 一個程序可能會進入不一致的狀態,即它處於可執行狀態,但永遠不會排程執行。當在同一類型的 dirty 排程器上同時排程 normallow 優先權程序的組合時,可能會發生這種情況。

    自身 ID:OTP-16446 輔助 ID:ERL-1157

  • 更正了 erl 命令列參數 +SDio <NumberOfDirtyIoSchedulers> 的有效範圍,從 0..1024 更正為 1..1024+SDio 0 之前被錯誤地允許,這只會導致 VM 在第一個排程的 dirty I/O 工作時崩潰。

    自身 ID:OTP-16481

Erts 10.3.5.9

修正錯誤與故障

  • 一個程序可能會進入無限期重新排程但沒有任何進展的狀態。當在試圖在 dirty 排程器上執行的高優先權程序上排程系統任務(例如程序程式碼檢查(程式碼清除的一部分))時,會發生這種情況。

    自身 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 中的錯誤,如果解碼的 term 大於 16GB,可能會導致模擬器當機。

    自有 ID:OTP-16058 輔助 ID:PR-2382

  • 透過 erlang:port_*() BIF 與同時退出的埠通訊時,有時可能會收到雜散的 {Ref, What} 訊息。其中 Ref 是一個參考,而 What 通常是 atom badarg

    自有 ID:OTP-16107 輔助 ID:ERL-1049

Erts 10.3.5.5

修正錯誤與故障

  • process_info(P,binary) 會忽略搜尋堆積片段,可能遺漏一些與進程相關的二進位資料。

    自有 ID:OTP-15978 輔助 ID:ERIERL-366

  • 修正了在呼叫 persistent_term:putpersistent_term:erase 期間,如果進程被終止時會觸發的錯誤。

    自有 ID:OTP-16041

改進與新功能

  • 修正了 instrument:allocations/0-1 中罕見的模擬器當機問題。

    自有 ID:OTP-15983

Erts 10.3.5.4

修正錯誤與故障

  • 修正了在對包含未處理的監控器關閉訊號的進程進行文字傾印時,導致 VM 當機的錯誤。可以使用 erlang:system_info(procs)、追蹤功能 process_dump、Erlang Shell 中斷選單和當機傾印來完成文字處理程序傾印。此錯誤自 OTP 21.0 起存在。

    自有 ID:OTP-15909 輔助 ID:ERL-979

  • lists:subtract/2 在 64 位元平台上會針對某些輸入產生不正確的結果。

    自有 ID:OTP-15938 輔助 ID:ERL-986

  • 修正了載入器中類似於 OTP-15938 的錯誤,在 64 位元平台上針對某些輸入產生不正確的程式碼。

    自有 ID:OTP-15939

  • 修正了導致排程器執行緒在極少數情況下無限期阻止旋轉的錯誤。此錯誤自 OTP 21.0 起存在。

    自有 ID:OTP-15941 輔助 ID:PR-2313

Erts 10.3.5.3

修正錯誤與故障

  • 如果您在 gen_tcp 接聽 socket 上設定 {linger,{true,0}}、在該 socket 上接受連線,然後關閉接受的 socket,則現在會將 linger 零設定傳輸到接受的 socket。在此修正之前,該資訊遺失,且接受的 socket 上的關閉行為不正確。

    自有 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 是堆積配置的(不是 atom、小型整數、本地 pid 或 port),則可能會導致 VM 當機。此錯誤自 OTP 21.0 起就已存在,當時首次允許小型整數以外的 term 作為標籤。

    自有 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/2list_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_PIDNEW_PORTNEWER_REFERENCE 的遺失文件。

    這些新標籤計劃在 OTP 23 中「啟用」,屆時分發功能標誌 DFLAG_BIG_CREATION 將成為強制性。較舊的節點(>= 19)能夠解碼這些新標籤並將它們發送回新節點。但是,早於 OTP 23 的節點將永遠不會使用新標籤編碼它們自己的本地 pid、port 和參考。

    自有 ID:OTP-15766

Erts 10.3.3

修正錯誤與故障

  • 修正了使用 fd 選項的 erlang:open_port/2,以便在 port 關閉時正確清除輪詢集。在此修正之前,當在新的 port 中重複使用相同的 fd 時,會將錯誤訊息發送到記錄器。

    自有 ID:OTP-15753 輔助 ID:ERL-900

Erts 10.3.2

修正錯誤與故障

Erts 10.3.1

修正錯誤與故障

  • 如果在執行髒任務時向程序發送暫停/恢復信號對,則接收程序稍後可能會無限期地處於暫停狀態。此錯誤是在 ERTS 版本 10.0 (OTP 21.0) 中引入的。

    暫停/恢復信號是從 erlang:suspend_process()/erlang:resume_process() 發送的。 dbg 追蹤工具利用此功能,因此可能會觸發此錯誤。

    自有 ID:OTP-15688

  • 修復了因髒排程器在終止時未釋放其執行佇列鎖而導致終止 ERTS 時可能發生的死鎖。

    自有 ID:OTP-15690 輔助 ID:PR-2172

Erts 10.3

修正錯誤與故障

  • 當一個數字與自身相乘時,可能會讀取(並忽略)堆上的數字後面的字。此錯誤實際上不太可能造成真正的問題。

    自有 ID:OTP-15484

  • 修復了當另一個程序正在進行垃圾回收時執行 seq_trace:reset_trace() 可能導致執行系統發生區段錯誤的錯誤。

    自有 ID:OTP-15490

  • 修復了在舊版 Linux 核心版本上從面向數據包的套接字讀取輔助數據的問題。如果沒有此修復,獲取數據將導致 port 進入無限循環。

    自有 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,使其在髒排程器上成為無操作,並且不會使除錯編譯的模擬器崩潰。

    自有 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/2integer_to_binary/2 現在以 C 語言實作,提高了效能。

    自有 ID:OTP-15503 輔助 ID:PR-2052

  • 改進了 term_to_binary,使其在編碼大型位元組列表(字串)時執行更公平的歸約計數和讓步。

    自有 ID:OTP-15514 輔助 ID:ERL-774

  • 使內部 port 驅動程式更能抵抗使用無效引數的 erlang:port_control,並新增了關於此類濫用的文件警告。

    自有 ID:OTP-15555 輔助 ID:ERIERL-231

  • 修正了 NetBSD 上,port 程式的 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 socket 的 recbuf 大小時,buffer 也會自動增加。修復了一個錯誤,即即使已明確設定 inet buffer 大小,也會觸發 inet buffer 大小的自動調整。

    內部 ID:OTP-15651 輔助 ID:ERIERL-304

  • 當 socket 上有比 read_packets 指定的封包更多時,使用 active true 或 active N 模式從 UDP 讀取已最佳化。

    內部 ID:OTP-15652 輔助 ID:ERIERL-304

Erts 10.2.4

已修復的錯誤和故障

  • 當使用 {linger,{true,T}} 選項時,gen_tcp:listen/2 會在返回(例如 eaddrinuse)之前使用完整的 linger 時間。此錯誤現已修正。

    內部 ID:OTP-14728 輔助 ID:ERIERL-303

Erts 10.2.3

已修復的錯誤和故障

  • 修復了一個錯誤,即當 delay_send 設定為 true 時,在 socket 上執行 gen_tcp:send,如果另一端關閉連線,可能會導致分段錯誤。

    此錯誤是在 erts-10.2 (OTP-21.2) 中引入的。

    內部 ID:OTP-15536 輔助 ID:ERL-827

  • 修復了當 port 程式關閉時可能發生的競爭條件,這可能會導致下一個啟動的 port 在啟動期間掛起。

    當發生此錯誤時,通常會記錄以下錯誤(但不一定總是如此)

    =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

  • 修復了一個錯誤,即如果所有 active scheduler 的負載都達到 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 scheduler 無法回應的錯誤。

    內部 ID:OTP-15509 輔助 ID:PR-2027, PR-2093

Erts 10.2.1

已修復的錯誤和故障

  • 修正了在使用 file:change_modechange_ownerchange_groupwrite_file_info 變更檔案權限或所有權時,big endian 架構上的錯誤。此錯誤自 OTP-21.0 開始存在。

    內部 ID:OTP-15485

  • 修正了在傳回值為 (1 bsl 63) 或更大時,使用 {signed,false} 選項的 atomics 中的錯誤。可能導致堆積損壞,進而導致 VM 崩潰或其他不愉快的徵狀。此錯誤自引入 atomics 模組的 OTP-21.2 開始存在。

    內部 ID:OTP-15486 輔助 ID:PR-2061

  • 修正了兩個負運算元進行 band 運算時的錯誤,如果其中一個運算元的絕對值的最低 N*W 位元為零,而另一個絕對值不超過 N*W 位元,則會產生錯誤結果。N 是大於或等於 1 的整數,W 則根據 word 大小而定,為 32 或 64。

    內部 ID:OTP-15487 輔助 ID:ERL-804

Erts 10.2

已修復的錯誤和故障

  • 當一個程序正在等待 TCP socket 完成傳送操作時,而另一個程序在傳送過程中關閉了 socket,則傳送程序可能會掛起。此錯誤現已修正。

    內部 ID:OTP-12242 輔助 ID:ERL-561

  • 在 match specifications 中記錄 bit_size,並允許在 ets:fun2ms 中使用它。

    內部 ID:OTP-15343 輔助 ID:PR-1962

  • 修正了當使用完全綁定的鍵呼叫 ets:select_replace 時,可能導致後續呼叫 ets:nextets:prev 時,模擬器崩潰或返回無效結果的錯誤。

    內部 ID:OTP-15346

  • 當一個模組從記憶體中清除後,屬於該模組的任何字面量都會複製到所有持有它們參考的程序中。在將字面量複製到程序時啟動的垃圾回收中,會忽略最大堆積大小限制。如果超過最大堆積大小,則該程序通常會在後續的垃圾回收中終止。已修正為如果複製字面量會超過最大堆積大小,則直接終止該程序。

    內部 ID:OTP-15360

  • 修正了在 Solaris 11.4 及更高版本上編譯 run_erl 的錯誤。

    內部 ID:OTP-15389

  • 修正了一個錯誤,即 lists:reverse/1-2 可能會使用過多的 reductions。此錯誤是在 OTP 21.1 中引入的。

    內部 ID:OTP-15436

  • 修正了一個錯誤,即如果一個分佈條目在 dirty GC 中被移除,dirty scheduler 可能會永遠保持清醒狀態。

    內部 ID:OTP-15446 輔助 ID:PR-2024

  • 修正了在多個位置的 microstate accounting 處理。最重要的是,現在正確管理在 dirty scheduler 上執行 GC 時的 GC 狀態。

    內部 ID:OTP-15450 輔助 ID:ERIERL-229

  • 修正了當傳送操作失敗時 file:sendfile 中的錯誤。對於 active 模式下的 socket,它可能導致模擬器崩潰或掛起的呼叫。對於 {active,false} 的 socket,可能會將意外的 {inet_reply, _, _} 訊息傳送到呼叫的程序。此錯誤自 OTP-21.0 開始存在。

    內部 ID:OTP-15461 輔助 ID:ERL-784

  • 已更新 erts configure script,以拒絕任何沒有 -O 的 CFLAGS。這是為了防止忘記將 -O2 新增到自訂 CFLAGS 的常見錯誤。

    內部 ID:OTP-15465

  • 修正了 lists:member/2 中的 reduction 計數

    內部 ID:OTP-15474 輔助 ID:ERIERL-229

改進和新功能

  • 新的 countersatomics 模組提供了對可變固定字組大小變數的高效操作的存取。

    內部 ID:OTP-13468

  • 有一個新的模組 persistent_term,它實作了一個適合頻繁使用但不常更新的 term 儲存。查詢是在恆定時間內完成的,無需複製 terms。

    內部 ID:OTP-14669 輔助 ID:PR-1989

  • 已新增一個函式 inet:getifaddrs/1,它採用包含命名空間選項的列表,適用於支援該功能的平台,例如 Linux(僅限?)。

    內部 ID:OTP-15121 輔助 ID:ERIERL-189, PR-1974

  • 為 TCP socket 新增了 nopush 選項,它對應於 *BSD 上的 TCP_NOPUSH 和 Linux 上的 TCP_CORK

    這也在內部用於 file:sendfile,以減少後續傳送操作的延遲。

    內部 ID:OTP-15357 輔助 ID:ERL-698

  • 列表減法(-- 運算子)現在將在大型輸入上產生正確的結果。

    內部 ID:OTP-15371

  • 最佳化了 tcp sockes 的 send_delay 處理,以更好地與 OTP-21 中引入的新 pollthread 實作搭配使用。

    內部 ID:OTP-15471 輔助 ID:ERIERL-229

  • 最佳化了具有零逾時的 driver_set_timer,以短路並且不建立任何 timer 結構,而是立即排程 timer。

    內部 ID:OTP-15472 輔助 ID:ERIERL-229

  • 新增 erl_xcomp_code_model_small 作為交叉設定變數,以便讓模擬器在假設目標機器將使用小型程式碼模型的假設下進行建置。

    內部 ID:OTP-15473 輔助 ID:ERIERL-229

  • 新增了一個新的 pollset,用於處理使用 {active, true}{active, N} 的 socket。新的 pollset 不會由 pollthread 輪詢,而是由正常的 scheduler 輪詢。

    之所以進行此變更,是因為在所有輸入事件都感興趣的 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

已修正的錯誤和故障

  • 已修正一個導致讀取未初始化記憶體的 socket 選項 'pktoptions' 錯誤。在 FreeBSD 上會導致故障。

    自有 ID:OTP-14297 輔助 ID:OTP-15141

  • 修正讀取檔案時發生錯誤時的記憶體洩漏問題。

    自有 ID:OTP-15318

  • 在 Windows 上,透過 UNC 路徑進行檔案存取再次運作。此回歸問題是在 OTP 21 中引入的。

    自有 ID:OTP-15333 輔助 ID:ERL-737

Erts 10.1

已修正的錯誤和故障

  • 修正 seq_trace 權杖,使其不會在進程接收到由 erts 發送的訊息時被清除。可能發生此情況的一些範例是所有 port BIF,例如 open_portport_command 等等。

    修正使用一般和 seq_trace 追蹤來追蹤 nif 發送的訊息的功能。

    自有 ID:OTP-15038 輔助 ID:ERL-602

  • 修正 process_info 項目 monitored_by 的規格和文件,以包含 port 識別碼和 nif 資源作為可能類型。

    自有 ID:OTP-15180 輔助 ID:ERL-648

  • 修正 erl_crash.dump 產生中的錯誤,此錯誤可能導致 VM 崩潰。

    此錯誤自 erts-9.2 (OTP-20.2) 起存在。

    自有 ID:OTP-15181

  • 修正 ctrl-break 或 ctrl-c 無法在 Windows 上正確觸發中斷模式的錯誤。此錯誤是在 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"},...) 會導致模擬器以「無法寫入 erl_child_setup: 」的原因終止的錯誤。在此修正之後,open_port 呼叫將改為擲回 emfile 例外狀況。

    自有 ID:OTP-15210

  • 將 ERTS 內部的 PCRE 程式庫從 8.41 版升級至 8.42 版。請參閱 http://pcre.org/original/changelog.txt 以取得有關 PCRE 變更的資訊。此程式庫實作 re 正則表達式模組的主要部分。

    自有 ID:OTP-15217

  • 修正 open_port({fd,X,Y}, ...),使其在關閉 port 時釋放 pollset 中的檔案描述符。如果沒有此修正,在執行多個 open_port 和 port_close 序列時,無法重複使用相同的檔案描述符號碼。

    自有 ID:OTP-15236 輔助 ID:ERL-692

  • 修正 float_to_list/2float_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 程序行為不當時進行復原。

    自有 ID:OTP-15297 輔助 ID:OTP-15279、OTP-15280

改進和新功能

  • socket 模組中已實作 socket 選項 recvtosrecvttlrecvtclasspktoptions。請參閱 gen_tcpgen_udpinet 模組的文件。請注意,執行階段系統對這些選項的支援取決於平台。特別是對於 pktoptions,它非常特定於 Linux,並且已被定義它的 RFC 取代。

    自有 ID:OTP-15145 輔助 ID:ERIERL-187

Erts 10.0.8

已修正的錯誤和故障

  • 從 ERTS 10.0 版 (OTP 21.0) 開始,建立 port 程式的 erl_child_setup 程式會忽略 TERM 訊號。此設定會被 port 程式無意中繼承。port 程式中 TERM 訊號的處理現在已恢復為預設行為。也就是說,終止進程。

    自有 ID:OTP-15289 輔助 ID:ERIERL-235、OTP-14943、ERL-576

  • 在 erts-10.07 (OTP-21.0.8) 中針對 OTP-15279 所做的修正並不完整。在某些情況下,可能會導致新的連線嘗試被錯誤地中止。此修正將修正該缺陷。

    自有 ID:OTP-15296 輔助 ID:OTP-15279、ERIERL-226

Erts 10.0.7

已修正的錯誤和故障

  • 進程可能會在一般排程器和 dirty 排程器之間陷入無限重新排程迴圈。此錯誤是在 ERTS 10.0 版中引入的。

    感謝 Maxim Fedorov 發現並修正此問題。

    自有 ID:OTP-15275 輔助 ID:PR-1943

  • 如果 net_kernel 沒有正確地關閉先前的連線嘗試,則分配項目的垃圾收集可能會導致模擬器崩潰。

    自有 ID:OTP-15279 輔助 ID:ERIERL-226

Erts 10.0.6

已修正的錯誤和故障

  • 透過 erlang:resume_process/1 終止進程和恢復相同進程之間的競爭可能會導致 VM 崩潰。此錯誤是在 erts 10.0 版 (OTP 21.0) 中引入的。

    自有 ID:OTP-15237

  • 當進程在 dirty 排程器和一般排程器之間重新排程時,在 running 上追蹤時,可能會遺失 in 追蹤事件。

    自有 ID:OTP-15269 輔助 ID:ERL-713

Erts 10.0.5

已修正的錯誤和故障

  • 修正了當在 dirty 排程器上執行的 NIF 呼叫 enif_send() 時導致模擬器崩潰的錯誤。當 NIF 在沒有訊息環境的情況下呼叫 enif_send() 時,或當執行 NIF 的進程被 send 追蹤時,會觸發此錯誤。

    自有 ID:OTP-15223

  • 修正了一個導致某些 Erlang 參考排序不一致的錯誤。例如,這可能會導致無法在搜尋資料結構中查找以參考作為鍵的特定元素。此錯誤是在 R13B02 中引入的。

    感謝 Simon Cornish 發現此錯誤並提供修正。

    * 潛在的不相容性 *

    自有 ID:OTP-15225

Erts 10.0.4

已修正的錯誤和故障

  • 修正了一個錯誤,該錯誤會阻止 noshell 選項在 Mac OS X 和 BSD 上正確運作。

    自有 ID:OTP-15169

  • 修正了直接針對已儲存在堆疊上的單一鍵的文字對應進行比對時發生的崩潰。

    自有 ID:OTP-15184

  • 修正將錯誤時間選項傳遞至 file:read_file_info/2 時發生的節點崩潰。

    自有 ID:OTP-15196

Erts 10.0.3

已修正的錯誤和故障

  • 修正了一個導致一般排程器執行 dirty 程式碼的排程器錯誤。

    自有 ID:OTP-15154

  • 修正 erlang:trace_info/2 中的一個錯誤,該錯誤會在傳遞錯誤引數時導致模擬器崩潰。此錯誤是在 ERTS 10.0 版中引入的。

    自有 ID:OTP-15183 輔助 ID:ERL-670

Erts 10.0.2

已修正的錯誤和故障

  • 修正了一個罕見的錯誤,此錯誤可能導致進程在被釋放後仍被排程。

    自有 ID:OTP-15067 輔助 ID:ERL-573

  • 修正 inet 驅動程式中的競爭條件,該條件可能導致在使用 gcc 8 編譯模擬器時接收掛起。

    自有 ID:OTP-15158 輔助 ID:ERL-654

Erts 10.0.1

已修正的錯誤和故障

  • 在 Windows 上,os:getenvos:putenv 中使用的金鑰再次不區分大小寫。

    自有 ID:OTP-15147 輔助 ID:ERL-644

Erts 10.0

已修正的錯誤和故障

  • 已根據檔案和 socket 作業應該能夠傳回的錯誤更新 file:posix/0inet:posix/0 的類型規格。

    自有 ID:OTP-14019 輔助 ID:ERL-550

  • 修正 run_erl 中的錯誤列印輸出和可能導致不必要的 fd 洩漏到啟動程式中的錯誤。

    自有 ID:OTP-14537 輔助 ID:PR1529

  • 檔案操作過去會接受包含空字元 (整數值為零) 的檔名。這會導致檔名被截斷,在某些情況下,也會導致基本操作的參數混淆。現在會拒絕檔名內包含空字元的檔名,並導致基本檔案操作失敗。

    此外,環境變數操作過去會接受包含空字元 (整數值為零) 的環境變數名稱。這會導致操作在無聲無息的情況下產生錯誤的結果。現在會拒絕名稱或值內包含空字元的環境變數名稱和值,並導致環境變數操作失敗。

    基本環境變數操作過去也會接受環境變數名稱中的 $= 字元,導致各種問題。現在也會拒絕環境變數名稱中的 $= 字元。

    此外,os:cmd/1 現在也會拒絕其命令中包含空字元。

    erlang:open_port/2 從現在起也會拒絕埠名稱中包含空字元。

    * 潛在的不相容性 *

    內部 ID:OTP-14543 輔助 ID:ERL-370

  • 修正與微狀態記帳狀態簿記相關的錯誤。

    內部 ID:OTP-14652

  • os:putenvos:getenv 不再直接存取程序環境,而是對執行緒安全模擬進行操作。唯一可觀察到的差異是,它不會與 libc 的 getenv(3) / putenv(3) 同步,因此在驅動程式或 NIF 中依賴該行為的使用者需要新增手動同步。

    在 Windows 上,這表示您無法再透過在載入驅動程式/NIF 之前修改 PATH 來解析 DLL 相依性。為了減少這個問題,模擬器現在會將目標 DLL 的資料夾新增至 DLL 搜尋路徑。

    * 潛在的不相容性 *

    內部 ID:OTP-14666

  • 更正 erlang:is_builtin(erlang, M, F),使其針對 apply/2yield/0 傳回 true

    內部 ID:OTP-14713 輔助 ID:ERL-500

  • 修正了在版本降級時,PATH 環境變數未正確更新的錯誤,導致實際上保留了新版本的 PATH。

    內部 ID:OTP-14719

  • 當接收包含新建立參考的訊息時,可避免掃描整個訊息佇列的接收最佳化,在極少數情況下 (涉及對執行接收的函數進行遞迴呼叫) 可能會導致接收掛起。此問題已修正。

    內部 ID:OTP-14782 輔助 ID:ERL-511

  • 修正了在具有短尋址的小資料區域的平台上建置 Erlang/OTP 的問題。例如 PowerPC/RTEMS 平台。

    內部 ID:OTP-14909 輔助 ID:PR-1692

  • 修正了當 enif_make_binary 以不同環境中的 enif_inspect_binary 產生的二進位呼叫時發生的當機問題。

    內部 ID:OTP-14931

  • 修正了當 enif_make_binary 多次以先前新增至 enif_ioq 的二進位呼叫時發生的當機問題。

    內部 ID:OTP-14932

  • erl_child_setup 程式現在會忽略 SIGTERM 訊號。

    內部 ID:OTP-14943 輔助 ID:ERL-576

  • 在需要 64 位元對齊的架構上,強制預先配置器進行 64 位元對齊。

    內部 ID:OTP-14977

  • 修正了 dirty 排程器擷取非 dirty 工作的問題。

    內部 ID:OTP-14978

  • 對已關閉的 socket 呼叫 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 中的錯誤,此錯誤可能會導致立即 term (原子、小整數、pid、埠、空列表) 的記憶體損毀。

    內部 ID:OTP-15080

  • 修正了 erlang:system_profile/2 中的錯誤,此錯誤可能會導致終止的程序出現多餘的 {profile,_,active,_,_} 訊息。

    內部 ID:OTP-15085

  • 在支援每個執行緒 CPU 時間的作業系統上,將 erlang:trace/3 中的 cpu_timestamp 變更為使用每個執行緒 CPU 時間,而非每個程序 CPU 時間。這使得在執行多個排程器時,此選項可在這類作業系統上使用。

    內部 ID:OTP-15090

  • 修正了 abort_signal_task 中的區段錯誤,如果埠終止時存在未傳訊的未完成埠工作 (例如 ready_input/ready_output 事件),則可能會發生此錯誤。

    內部 ID:OTP-15108 輔助 ID:ERL-621

  • 修正了 ets 中的錯誤,此錯誤可能會導致虛擬機器當機,如果程序 A 在固定表格後終止,且程序 B「同時」刪除表格。可以使用 ets:safe_fixtable 進行表格固定,或者如果程序 A 在執行長時間執行的 selectmatch 呼叫時終止。

    內部 ID:OTP-15109

  • 透過 file:write_file_infofile:change_ownerfile: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。

    請注意以下潛在的不相容性

    • Kernel 配置參數 error_logger 仍然有效,但如果使用 Kernel 配置參數 logger 配置預設處理常式的輸出目的地,則會被覆寫。

      一般而言,用於配置錯誤記錄器的參數會被用於配置 Logger 的新參數覆寫。

    • SASL 錯誤記錄的概念已過時,這表示預設情況下,SASL 應用程式不會影響記錄哪些記錄事件。

      預設情況下,監督程式報告和當機報告會由 Kernel 啟動的預設 Logger 處理常式記錄,並與來自 Erlang/OTP 的其他標準記錄事件位於相同的目的地 (終端機或檔案)。

      預設情況下不會記錄進度報告,但可以透過將主要記錄層級設定為 info 來啟用,例如使用 Kernel 配置參數 logger_level

      為了獲得與早期版本 SASL 錯誤記錄功能的回溯相容性,請將 Kernel 配置參數 logger_sasl_compatible 設定為 true。這會阻止預設 Logger 處理常式記錄任何監督程式、當機或進度報告。相反地,SASL 會在應用程式啟動期間新增個別的 Logger 處理常式,負責處理這些記錄事件。SASL 配置參數 sasl_error_loggersasl_errlog_type 指定這些事件記錄的目的地 (終端機或檔案) 和嚴重性層級。

    由於 Logger 是 Erlang/OTP 21.0 中的新功能,因此我們保留在此版本之後的修補程式中引入對 Logger API 和功能進行變更的權利。這些變更可能與初始版本回溯相容,也可能不相容。

    * 潛在的不相容性 *

    內部 ID:OTP-13295

  • gen_sctp:connect_init/4 或更確切地說,針對 SCTP 的 inet_drv.c 中的連線已修正,使其不會在連線後檢查寫入檔案描述元的寫入能力,因為對於 SCTP (SOCK_SEQPACKET),該屬性似乎不是連線何時完成的任何指示。這修正了作業系統傳回為「進行中」的連線,這些連線被 gen_sctp:connect_init 誤解為失敗。

    內部 ID:OTP-13760 輔助 ID:PR-1592

  • 檔案驅動程式已重寫為 NIF,從而減少了檔案操作的延遲。值得注意的不相容性如下

    • file:sendfile/5use_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 已被移除。雖然仍然可以停用核心輪詢(kernel-poll),但必須在編譯時透過設定選項 --disable-kernel-poll 來達成。

    新的 erl 選項 +IOt+IOp 可用於變更 erts 應使用的 IO 輪詢執行緒和輪詢集合數量。詳情請參閱它們各自的文件。

    自有 ID:OTP-14346

  • 真正的非同步自動連線。先前,當 erlang:send 指向未連線的節點時,該函式會等到連線設定完成(或失敗)才會返回。現在,該函式會在訊息加入佇列並開始連線設定後立即返回。

    這同樣適用於所有可能觸發自動連線的分散式操作,例如 '!'sendlinkmonitormonitor_nodeexit/2group_leader

    所有這些函式的介面都保持不變,因為它們不會返回連線失敗。唯一的例外是 erlang:monitor,其中引入了*可能的不相容性*:嘗試監控原始節點(例如 erl_interface 或 jinterface)上的進程,而該節點未實作遠端進程監控時,將不再會因 badarg 例外而失敗。而是會建立監控器,但它只會監管與節點的連線。

    * 潛在的不相容性 *

    自有 ID:OTP-14370

  • 變更了 .erlang 載入的預設行為:不再從目前目錄載入 .erlangc:erlangrc(PathList) 可用於從使用者指定的目錄搜尋和載入 .erlang 檔案。

    escripterlcdialyzertyper 完全不再載入 .erlang

    * 潛在的不相容性 *

    自有 ID:OTP-14439

  • 引入了用於實作 Erlang 分散式系統替代載體的新功能。這主要包括支援使用分散式控制器進程(先前只有埠可以用作分散式控制器)。如需更多資訊,請參閱 ERTS 使用者指南 ➜ 如何為 Erlang 分散式系統實作替代載體 ➜ 分散式模組

    自有 ID:OTP-14459

  • 新增對 lcc 編譯器以及延伸的 Elbrus 2000 平台支援。

    自有 ID:OTP-14492

  • 已從執行階段系統中移除對「tuple 呼叫」的支援。Tuple 呼叫是一項未記載且不受支援的功能,允許 apply 操作的模組引數是一個 tuple:Var = dict:new(), Var:size()。此「功能」經常造成混淆,尤其是在此類呼叫失敗時。堆疊追蹤會指出原始碼中不存在的函式。

    對於需要使用參數化模組或 tuple 呼叫的舊版程式碼,有一個新的編譯器選項稱為 tuple_calls。當指定此選項時,編譯器會產生額外的程式碼,模擬模組為變數的呼叫的舊行為。

    * 潛在的不相容性 *

    自有 ID:OTP-14497

  • 已最佳化以更快速度建立具有常值鍵的小型映射,並可能使用較少的記憶體。這些鍵會合併到一個常值鍵 tuple 中,該 tuple 會放入常值池中。鍵 tuple 可以在許多具有相同鍵的映射實例之間共用。

    自有 ID:OTP-14502

  • 當擲回例外狀況時,請在 BIF bandborbslbsrbxordivrem 和運算子 +-*/ 的堆疊追蹤中包含呼叫的引數。

    * 潛在的不相容性 *

    自有 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

  • 已將 PGO(設定檔引導最佳化)傳遞新增至 erts 的建置步驟。這可以透過將 --disable-pgo 傳遞至組態來停用。

    自有 ID:OTP-14604

  • 改善了 binary:splitbinary:match 的效能。

    自有 ID:OTP-14610 輔助 ID:PR-1480

  • 建置 erlang 時,不再可以停用 dirty 排程器。

    自有 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,因為標準驅動程式不再使用它們。將此值變更為調整檔案驅動程式的使用者應使用 +SDio 取代 +A,因為它現在使用 dirty 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

  • 新增用於 dirty 排程器的忙碌等待和喚醒臨界值的組態開關,並且變更一般排程器的這些設定不再會影響 dirty 排程器。

    如需詳細資訊,請參閱文件。新的開關為 +sbwtdcpu+sbwtdio+swtdcpu+swtdio

    dirty 排程器執行緒的預設忙碌等待臨界值也已降低至 short

    自有 ID:OTP-14959

  • 除了 NIF 函式庫之外,「taints」列表現在也包含了動態載入的驅動程式。靜態連結的驅動程式和屬於 erts 的 NIF 函式庫則不包含在內。「taints」會由 system_info(taints) 回傳,並印在 erl_crash.dump 檔案的標頭中。

    Own Id: OTP-14960

  • 新增 instrument:allocationsinstrument:carriers,用於檢索關於記憶體使用率和碎片化的資訊。

    舊的 instrument 介面已移除,相關的選項 +Mim+Mis 也已移除。

    * 潛在的不相容性 *

    Own Id: OTP-14961

  • erlang:suspend_process/2 BIF 使用的程序暫停功能已重新實作,改用新導入的程序間真非同步訊號傳遞。這主要是為了減少所有程序的程序控制區塊中的記憶體使用量,同時簡化實作。

    警告

    如果程序彼此暫停(直接或循環),很容易產生死鎖。在 ERTS 10.0 版本之前的 ERTS 版本中,執行時期系統會防止此類死鎖,但現在為了效能考量,已移除此預防措施。

    其他使用先前程序暫停功能的 ERTS 內部功能也已重新實作,改為使用非同步訊號傳遞。

    * 潛在的不相容性 *

    Own Id: OTP-14964 Aux Id: OTP-14589

  • ?MODULE:module_info/1 新增 nifs 選項,用於列出模組已安裝的 NIF 函式。

    Own Id: OTP-14965

  • erlang:process_info/[1,2] 的新實作。

    一般情況下,當檢查另一個程序時,新的實作會向另一個程序傳送一個非同步的程序資訊請求訊號,並等待結果,而不是鎖定另一個程序並直接讀取結果。在某些沒有衝突的特殊情況下,訊號順序不會被違反,且請求的資料量保證很小,則可以直接檢查被檢查的程序。

    現在檢查程序時也會適當地增加 reduction 的數量。

    Own Id: OTP-14966

  • 為了節省程序控制區塊中的記憶體,已從損毀傾印中移除程序啟動時間。

    Own Id: OTP-14975 Aux Id: PR-1597

  • 當使用新的立即值(atom、小整數、pid、port)更新現有鍵時,優化 erlang:put/2

    Own Id: OTP-14976

  • erlang:process_info/1 已變更為預設不再包含 messages。應改用 erlang:process_info/2

    * 潛在的不相容性 *

    Own Id: OTP-14986 Aux Id: PR-1745

  • 新增 erlang:system_info(ets_count),用於取得本機節點上存在的 ets 表格總數。

    Own Id: OTP-14987

  • 新的 NIF 函式:enif_mutex_nameenif_cond_nameenif_rwlock_nameenif_thread_nameenif_vfprintfenif_vsnprintf

    Own Id: OTP-14994

  • 當呼叫 erlang:system_flag(backtrace_depth, 0) 時,現在所有例外狀況都會包含「一個」函式的條目(儘管設定為零)。過去傳遞給 erlang:raise/3 的手動堆疊回溯會被截斷為空列表。

    Own Id: OTP-15026

  • 修正了具名 ets 表格的錯誤,該錯誤可能導致在迭代期間刪除並以相同名稱重新建立表格時,從 matchspec 迭代函式(ets:select*ets:match*)產生非預期的結果。迭代可能會錯誤地繼續遍歷重新建立的表格。現在預期的正確行為是,如果表格在迭代完成之前被刪除,則迭代呼叫會失敗並出現 badarg 例外狀況。

    Own Id: OTP-15031

  • 新增了兩個作用於 map 的新 guard BIF:map_get/2is_map_key/2。它們的作用與 maps:get/2maps:is_key/2 相同,只是允許在 guard 中使用。

    Own Id: OTP-15037 Aux Id: PR-1784, PR-1802

  • 在清理已終止的 dirty 程序時釋放執行緒佇列鎖定。

    Own Id: OTP-15081

  • 傳遞給 erl 作為 -epmd_module 的回呼模組已擴充為能夠進行名稱和連接埠解析。

    文件也已新增至 erl_epmd 參考手冊和 ERTS 使用者指南 如何為 Erlang 分散式系統實作替代節點發現機制

    Own Id: OTP-15086 Aux Id: PR-1694

Erts 9.3.3.15

修正的錯誤和故障

  • 一個程序可能會進入無限期重新排程但沒有任何進展的狀態。當在試圖在 dirty 排程器上執行的高優先權程序上排程系統任務(例如程序程式碼檢查(程式碼清除的一部分))時,會發生這種情況。

    自身 ID:OTP-16436 輔助 ID:ERL-1152

  • 修正了當使用遠端節點建立的參考呼叫 erlang:list_to_ref/1 時的錯誤。函式 list_to_ref/1 用於除錯,不應在應用程式中使用。此錯誤自 OTP 20.0 起存在。

    自身 ID:OTP-16438

  • 一個程序可能會進入不一致的狀態,即它處於可執行狀態,但永遠不會排程執行。當在同一類型的 dirty 排程器上同時排程 normallow 優先權程序的組合時,可能會發生這種情況。

    自身 ID:OTP-16446 輔助 ID:ERL-1157

  • 修正了由於連結損壞,在接收到某些結束訊號時,將退出原因從 kill 錯誤地對應到 killed 的問題。這個錯誤自 ERTS 5.5.2 版本(OTP R11)以來就存在。

    由於 ERTS 內部在程序間傳遞訊號的實作更新,此錯誤也在 ERTS 10.0 版本(OTP 21.0)中被不知不覺地修正。

    Own Id: OTP-16465 Aux Id: ERL-1165, OTP-6160, OTP-14589

  • 更正了 erl 命令列參數 +SDio <NumberOfDirtyIoSchedulers> 的有效範圍,從 0..1024 更正為 1..1024+SDio 0 之前被錯誤地允許,這只會導致 VM 在第一個排程的 dirty I/O 工作時崩潰。

    自身 ID:OTP-16481

Erts 9.3.3.14

修正的錯誤和故障

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 中的錯誤,如果解碼的 term 大於 16GB,可能會導致模擬器當機。

    自有 ID:OTP-16058 輔助 ID:PR-2382

  • 透過 erlang:port_*() BIF 與同時退出的埠通訊時,有時可能會收到雜散的 {Ref, What} 訊息。其中 Ref 是一個參考,而 What 通常是 atom badarg

    自有 ID:OTP-16107 輔助 ID:ERL-1049

Erts 9.3.3.11

修正的錯誤和故障

  • 修正了當使用 latin1 編碼時使用 binary_to_existing_atom/2list_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 時可能發生的死鎖。

    自有 ID:OTP-15690 輔助 ID:PR-2172

  • 新增了 OTP 19 中引入的新外部標籤 NEW_PIDNEW_PORTNEWER_REFERENCE 的遺失文件。

    這些新標籤計劃在 OTP 23 中「啟用」,屆時分發功能標誌 DFLAG_BIG_CREATION 將成為強制性。較舊的節點(>= 19)能夠解碼這些新標籤並將它們發送回新節點。但是,早於 OTP 23 的節點將永遠不會使用新標籤編碼它們自己的本地 pid、port 和參考。

    自有 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 scheduler 無法回應的錯誤。

    內部 ID:OTP-15509 輔助 ID:PR-2027, PR-2093

Erts 9.3.3.7

修正的錯誤和故障

  • 修正了兩個負運算元進行 band 運算時的錯誤,如果其中一個運算元的絕對值的最低 N*W 位元為零,而另一個絕對值不超過 N*W 位元,則會產生錯誤結果。N 是大於或等於 1 的整數,W 則根據 word 大小而定,為 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 版本中。

    Own Id: OTP-15399 Aux Id: ERL-751, ERIERL-262, OTP-14205

Erts 9.3.3.4

修正的錯誤和故障

  • 修正了當使用完全綁定的鍵呼叫 ets:select_replace 時,可能導致後續呼叫 ets:nextets:prev 時,模擬器崩潰或返回無效結果的錯誤。

    內部 ID:OTP-15346

Erts 9.3.3.3

修正的錯誤和故障

  • 修正了當在 dirty 排程器上執行的 NIF 呼叫 enif_send() 時導致模擬器崩潰的錯誤。當 NIF 在沒有訊息環境的情況下呼叫 enif_send() 時,或當執行 NIF 的進程被 send 追蹤時,會觸發此錯誤。

    自有 ID:OTP-15223

  • 修正了一個導致某些 Erlang 參考排序不一致的錯誤。例如,這可能會導致無法在搜尋資料結構中查找以參考作為鍵的特定元素。此錯誤是在 R13B02 中引入的。

    感謝 Simon Cornish 發現此錯誤並提供修正。

    * 潛在的不相容性 *

    自有 ID:OTP-15225

Erts 9.3.3.2

修正的錯誤和故障

  • 修正 inet 驅動程式中的競爭條件,該條件可能導致在使用 gcc 8 編譯模擬器時接收掛起。

    自有 ID:OTP-15158 輔助 ID:ERL-654

  • 修正 erl_crash.dump 產生中的錯誤,此錯誤可能導致 VM 崩潰。

    此錯誤自 erts-9.2 (OTP-20.2) 起存在。

    自有 ID:OTP-15181

Erts 9.3.3.1

修正的錯誤和故障

  • 修正了一個罕見的錯誤,此錯誤可能導致進程在被釋放後仍被排程。

    自有 ID:OTP-15067 輔助 ID:ERL-573

Erts 9.3.3

修正的錯誤和故障

  • 修正了 ets 中的錯誤,此錯誤可能會導致虛擬機器當機,如果程序 A 在固定表格後終止,且程序 B「同時」刪除表格。可以使用 ets:safe_fixtable 進行表格固定,或者如果程序 A 在執行長時間執行的 selectmatch 呼叫時終止。

    內部 ID:OTP-15109

Erts 9.3.2

修正的錯誤和故障

  • 修正了 enif_binary_to_term 中的錯誤,此錯誤可能會導致立即 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 碼位 (codepoint) 的檔案名稱在堆疊追蹤中未正確編碼。

    內部 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

  • 修正了使用 decimals 選項的 float_to_list/2float_to_binary/2 中的錯誤,該錯誤導致大約 6% 的帶有小數部分的浮點數的最後一位小數向上捨入錯誤。

    例如,float_to_list(0.145, [{decimals,1}]) 傳回 "0.2" 而不是 "0.1"

    內部 ID:OTP-14890

  • 修正了在啟動期間早期載入或由 code:atomic_loadcode:finish_loading 載入的模組中,導致 hipe 執行緩慢的錯誤。

    內部 ID:OTP-14891

  • 修正了內部字串格式化函式中的緩衝區溢位問題,如果為 erts_sprintf 或類似函式指定長浮點數格式規範,可能會觸發此問題。

    內部 ID:OTP-14920

  • 當提供的二進位在非位元組邊界上匹配時,erlang:iolist_to_iovec/1enif_inspect_iovec 將不再失敗。

    內部 ID:OTP-14921

  • 如果提供位元字串(沒有列表),則 iolist_to_binary/1erlang:iolist_to_iovec/1 現在會出現 badarg 錯誤。

    內部 ID:OTP-14926

  • 拒絕載入名稱包含目錄分隔符號(Windows 上的 '/' 或 '\')的模組。

    內部 ID:OTP-14933 輔助 ID:ERL-564,PR-1716

  • 修正當追蹤器程序在追蹤程序於髒排程器上執行時死掉時,可能發生的死鎖問題。

    內部 ID:OTP-14938

改進和新功能

  • 更多當機傾印資訊,例如:程序二進位虛擬堆積統計資訊、在 GC 期間導致記憶體不足的程序的完整資訊、更多與埠相關的資訊,以及髒排程器資訊。

    內部 ID:OTP-14820

Erts 9.2.1

改進和新功能

  • 改進了廢棄記憶體載體的搜尋演算法。每個配置器實例不再進行有限的線性搜尋,而是維護所有廢棄載體的平衡搜尋樹,以加快速度並進行更詳盡的搜尋。

    內部 ID:OTP-14915 輔助 ID:ERIERL-88

  • 新增 erts_alloc 命令列選項 +M_acnl+M_acfml 以限制載體廢棄。

    內部 ID:OTP-14916 輔助 ID:ERIERL-88

  • 新的 erts_alloc 策略系列:Age Order First Fit。與「地址順序」類似,但始終選擇最舊的可用載體進行分配。

    內部 ID:OTP-14917 輔助 ID:ERIERL-88

  • 新增在運行時使用 system_info(erts_alloc, ...) 變更配置器選項的可能性。目前僅透過此介面支援選項 sbct(單區塊載體臨界值)。

    內部 ID:OTP-14918 輔助 ID:ERIERL-88

Erts 9.2.0.1

改進和新功能

  • 針對與 erl_child_setup 程序通訊的額外內部一致性檢查。

    內部 ID:OTP-15488 輔助 ID:ERIERL-231

Erts 9.2

已修正的錯誤與故障

  • 修正在追蹤中,當與某些函式的 return_to 或 return_trace 一起使用時,{caller} 匹配規範函式會被錯誤地設定為未定義的錯誤。

    受影響的函式包括: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 所做的分析可能會不正確。

    內部 ID:OTP-14677

  • 修正如果 trap_exit 設定為 true,且程序在使用 exit(self(), Reason) 向自身傳送結束訊號時啟用接收追蹤,則會發生的模擬器死鎖問題。

    內部 ID:OTP-14678 輔助 ID:ERL-495

  • 當機傾印的寫入速度顯著加快。

    現在當機傾印中會包含映射 (Maps)。

    常數項只會顯示在一個程序中,而其他引用相同常數項的程序則會顯示不完整堆積的標記。

    內部 ID:OTP-14685 輔助 ID:OTP-14611、OTP-14603、OTP-14595

  • Windows 的後備主目錄已變更為 PROFILE 目錄,而不是 WINDOWS 目錄。當未設定環境變數 HOMEDRIVE 和 HOMEPATH 時,會使用後備目錄。

    內部 ID:OTP-14691

  • 修正了 HiPE 編譯程式碼使用 <<X/utf32>> 二進位結構的錯誤,該錯誤可能導致錯誤的結果,甚至導致 VM 崩潰。

    在 x86_64 以外的架構上,需要重新編譯程式碼才能從此修正中受益。

    內部 ID:OTP-14740

  • 修正了 erlang:garbage_collect/2erlang:check_process_code/3 在使用選項 {async,ReqestId} 呼叫時的錯誤。如果 RequestId 是立即項(如 PID、Atom 或小整數),則可能會導致 VM 崩潰或堆積損毀。此錯誤自 OTP-17.0 起存在。

    內部 ID:OTP-14752

  • ERL_NIF_MINOR_VERSION 並未隨著加入 `enif_ioq_*` 而更新。

    內部 ID:OTP-14779

  • 清除包含「假字面值」(例如,從 'ets:new/2' 取得的魔術參考)的已載入程式碼會使執行時間系統崩潰。已修正。

    內部 ID:OTP-14791

  • 將 Atom 表格的大小設定為接近 2147483647 的數字(使用 '+t' 選項)會導致模擬器因無法分配大量記憶體而退出。已修正此問題。此外,'+t' 選項的使用訊息已更正,以顯示正確的上限 2147483647 而不是 0。

    內部 ID:OTP-14796

  • 修正了阻止在 lcnt 結果中解析已註冊程序名稱的錯誤。

    內部 ID:OTP-14803

  • 修正了數個 HiPE 偵錯 BIF 中的格式化錯誤。

    內部 ID:OTP-14804

改進和新功能

  • 現在當機傾印中的二進位和其他一些資料會以 base64 編碼(而不是十六進位),這將減少當機傾印的大小。

    修正了 crashdump_viewer 中處理子二進位的一些錯誤。

    內部 ID:OTP-14686

  • 對傳送訊息到其他節點的傳送作業進行了微最佳化。對於分散式傳送作業,現在會更早忽略從 TPC/IP 埠驅動程式傳送回傳送端用戶端程序的本機 ack 訊息。

    內部 ID:OTP-14689

Erts 9.1.5

已修正的錯誤與故障

  • 修正了 Unix 上檔案關閉的錯誤;在 EINTR 上重試 close(2),這也可能導致關閉不同的(最近開啟的)檔案。

    內部 ID:OTP-14775

  • 當拆除具有活動節點監視器的連線時,競爭情況可能導致執行時間系統崩潰。

    此錯誤是在 ERTS 版本 8.0 (OTP 19.0) 中引入的。

    內部 ID:OTP-14781 輔助 ID:OTP-13047

Erts 9.1.4

已修正的錯誤與故障

  • 微狀態計算有時會產生髒排程器的不正確結果。

    內部 ID:OTP-14707

  • 修正了 zlib:gunzip/1 的回歸錯誤,當解壓縮的大小是 16384 的完美倍數時,會阻止其運作。此回歸錯誤是在 20.1.1 中引入的。

    內部 ID:OTP-14730 輔助 ID:ERL-507

  • 修正了 enif_inspect_iovec 中的記憶體損毀錯誤;可寫入的二進位在進入 iovec 後仍保持可寫入。

    內部 ID:OTP-14745

  • 修正了在遇到空二進位時,enif_inspect_iovec 中的崩潰問題。

    內部 ID:OTP-14750

  • 在 zlib 1.2.11 中使用 zlib:deflate/2 後呼叫時,zlib:deflateParams/3 將不再傳回 buf_error

    內部 ID:OTP-14751

Erts 9.1.3

已修正的錯誤與故障

  • 新增 zlib:set_controlling_process/2 以在程序之間移動 zstream()。

    內部 ID:OTP-14672 輔助 ID:ERL-494

  • 修正了當第一個可用的 CPU 不是第一個偵測到的 CPU 時,正確繫結排程器的問題。例如,當 X 不等於 0 時使用 "taskset -c X..Y" 時。

    內部 ID:OTP-14694

Erts 9.1.2

已修正的錯誤與故障

  • 修正了當從其他節點的分散式通道接收到損毀的訊息時,可能導致 VM 崩潰的錯誤。

    內部 ID:OTP-14661 輔助 ID:ERIERL-80

Erts 9.1.1

已修正的錯誤與故障

  • 新的 zlib 模組在解壓縮串接的資料流時會回傳 data_error 錯誤,這與舊模組的行為不相容,舊模組會回傳第一個資料流結尾前的未壓縮資料。

    自有 ID:OTP-14648

  • zlib:gunzip/1 在解壓縮串接的 gzip 檔案時,將不再於第一個資料流結尾停止。

    自有 ID:OTP-14649

Erts 9.1

已修正的錯誤與故障

  • 如果第二個參數不是正確的列表,則變更 erlang:apply/2 會引發 badarg 例外。先前的行為會產生誤導的 undef 例外。

    自有 ID:OTP-14490 輔助 ID:ERL-432

  • 在 macOS 上,如果在 crypto 之前啟動 observer,則 crypto 會崩潰。在 macOS 10.13 (High Sierra) 的 beta 版上,crypto 會崩潰。這些錯誤都已修正。

    自有 ID:OTP-14499 輔助 ID:ERL-251 ERL-439

  • 修正 enif_whereis_pid/port 中可能在極少數情況下導致堆積損壞的錯誤。

    自有 ID:OTP-14523

  • 修正當 dirty nif 執行完成時,在 dirty nif 中產生的追蹤訊息可以正確刷新的問題。

    自有 ID:OTP-14538

  • 修正 shell 中使用 ANSI 顏色代碼時的跳脫碼處理。

    自有 ID:OTP-14549 輔助 ID:PR1536

  • 將 ERTS 內部的 PCRE 程式庫從 8.40 版升級到 8.41 版。請參閱 http://pcre.org/original/changelog.txt 以取得有關 PCRE 所做變更的資訊。此程式庫實作了 re 正則表達式模組的主要部分。

    自有 ID:OTP-14574

  • 修正了導致 statistics(runtime) 產生負值的錯誤,以及 statistics(wall_clock) 產生數值過長一秒的錯誤。

    statistics(runtime) 現在也會在可用時使用 getrusage() 作為來源,防止傳回的值像以前一樣頻繁地回繞。

    自有 ID:OTP-14597 輔助 ID:ERL-465

  • 修正了傳送到終止埠時可能發生的小型記憶體洩漏。

    自有 ID:OTP-14609

  • 修正當啟用 erlang:trace(on_load, ...) 時,載入具有 -on_load 指示詞的模組時導致 VM 崩潰的錯誤。

    自有 ID:OTP-14612

  • list_to_existing_atom/1binary_to_existing_atom/2 的文件中加入編譯器可能會最佳化掉 atom 的警告。

    自有 ID:OTP-14614 輔助 ID:ERL-453

改進與新功能

  • 現在可以在鎖定計數模擬器 ( -emu_type lcnt) 中於執行期間完整切換鎖定計數。依預設會啟用所有項目以符合舊行為,但是可以在停用時以最少的執行期間額外負擔隨意切換特定類別。如需詳細資訊,請參閱 lcnt:rt_mask/1 的文件。

    自有 ID:OTP-13170

  • zlib 模組已重構,其所有作業現在都會適當地產生結果,允許在並行應用程式中自由使用。

    已棄用下列函式,但直到 OTP 21 才會產生編譯器警告: zlib:adler32zlib:crc32zlib:inflateChunkzlib:getBufSizezlib:setBufSize

    當解壓縮需要字典時擲回錯誤的行為也已棄用。如需詳細資訊,請參閱 inflateSetDictionary/2 的文件。

    自有 ID:OTP-14185

  • lcnt:collectlcnt:clear 將不再封鎖執行階段系統中的所有其他執行緒。

    自有 ID:OTP-14412

  • 新增 erlang:iolist_to_iovec/1,將 iolist() 轉換為 erlang:iovec(),適用於 enif_inspect_iovec

    自有 ID:OTP-14520

  • 當提供錯誤的引數時,zlib 模組現在會引發具名的例外,而不是只有 badarg。例如,使用未初始化的資料流呼叫 zlib:inflate/2 時會產生 not_initialized

    自有 ID:OTP-14527

  • erlang:halt/2 允許將任何 Unicode 字串作為當機傾印的標語。

    自有 ID:OTP-14553

  • 新增新的 NIF API 函式以管理 I/O 佇列。新增的函式如下

    自有 ID:OTP-14598

Erts 9.0.5

已修正的錯誤與故障

  • 修正 binary_to_termbinary_to_atom 中可能導致 VM 崩潰的錯誤。通常發生在 UTF8 字串的最後一個字元位於 128 到 255 的範圍內,但截斷為只有一個位元組時。此錯誤存在於 ERTS 5.10.2 版 (OTP_R16B01) 以來的 binary_to_term 中,以及 ERTS 9.0 版 (OTP-20.0) 以來的 binary_to_atom 中。

    自有 ID:OTP-14590 輔助 ID:ERL-474

Erts 9.0.4

已修正的錯誤與故障

  • 用於儲存排程器 ID 的計時器內部位元欄位太小。因此,當系統上使用 1024 個排程器時,VM 內部計時器資料結構可能會變得不一致。請注意,使用少於 1024 個排程器的系統不會受到此錯誤的影響。

    此錯誤是在 ERTS 7.0 版 (OTP 18.0) 中引入的。

    自有 ID:OTP-14548 輔助 ID:OTP-11997, ERL-468

  • 當擁有者程序終止時,BIF 計時器的自動清理可能會與計時器的逾時競爭。這可能會導致 VM 內部資料結構變得不一致,這很可能導致 VM 崩潰。

    此錯誤是在 ERTS 9.0 版 (OTP 20.0) 中引入的。

    自有 ID:OTP-14554 輔助 ID:OTP-14356, ERL-468

Erts 9.0.3

已修正的錯誤與故障

  • 二進位附加作業未檢查溢位,導致附加巨大的二進位時產生無意義的結果。

    自有 ID:OTP-14524

Erts 9.0.2

已修正的錯誤與故障

  • 為包含在 erts-9.0.1 (OTP-20.0.1) 中的 OTP-14491 (「預先配置器中的效能錯誤」) 新增了遺失的版本資訊。

    自有 ID:OTP-14494

  • 修正了在傳送逾時時無法正確關閉 TCP 通訊端的錯誤。

    自有 ID:OTP-14509

  • 修正了當一個運算元是最低 N*W 位為零的大的整數,而另一個運算元不超過 N*W 位時,運算子 bxor 產生錯誤結果的錯誤。N 是大於或等於 1 的整數,而 W 則為 32 或 64,取決於字組大小。

    自有 ID:OTP-14514

Erts 9.0.1

已修正的錯誤與故障

  • 修正了當在遠端關閉的 TCP 通訊端上重複呼叫 gen_tcp:send 時永遠不會返回的錯誤。

    自有 ID:OTP-13939 輔助 ID:ERL-193

  • 修正了在中止 erlang:port_command/3 呼叫的清理期間可能會發生的區段錯誤。如果埠在發出 port_command 的同時關閉,則會中止 port_command。此錯誤是在 erts-8.0 中引入的。

    自有 ID:OTP-14481

  • 修正了 statistics(wall_clock)statistics(runtime) 的實作,讓數值不會因為模擬器而產生不必要的回繞。請注意,由於作業系統提供的基礎功能限制,statistics(runtime) 傳回的數值仍然可能會回繞。

    自有 ID:OTP-14484

  • 修正了預先配置器中的效能錯誤,可能會導致它們永久回復到效能較差的一般記憶體配置。預先配置器用於快速配置訊息和其他排程任務所使用的短暫中繼資料。此錯誤從 OTP_R15B02 就存在。[此版本資訊在 erts-9.0.1 中遺失]

    自有 ID:OTP-14491

Erts 9.0

已修正的錯誤與故障

  • 修正與載入、升級和清除 HiPE 編譯碼相關的各種錯誤

    • 永遠不會釋放已清除模組的本機程式碼記憶體。
    • 在某些情況下,模組升級後可能會呼叫錯誤的函式。
    • erlang:check_process_code 未檢查從本機程式碼進行的遞迴呼叫。

    自有 ID:OTP-13968

  • Hipe 選用的 LLVM 後端需要 LLVM 3.9 版或更新版本,因為較舊版本強制強烈依賴 erts 內部結構。

    自有 ID:OTP-14238

  • 當捕捉到諸如 'throw(HugeTerm)' 之類的例外狀況時,HugeTerm 項目將保留在程序中,直到下一個例外狀況發生,可能會增加程序的堆積大小。這已獲得更正。

    自有 ID:OTP-14255 輔助 ID:OTP-14400, OTP-14401

  • 當機傾印中的標語已擴充為列印更複雜的項目。

    自有 ID:OTP-14303

  • 修正了搭配 enif_copy 使用 enif_inspect_binary 時的錯誤。在某些情況下,當不應該重新配置時,enif_copy 呼叫可能會重新配置所檢查的二進位。

    自有 ID:OTP-14304

  • 位址家族 local (AF_UNIX / AF_LOCAL) 現在不保證 Linux 抽象位址的零終止,因此它們可以使用所有位元組。

    自有 ID:OTP-14305

  • 對 Gentoo Hardened 和其他不接受連結器旗標 -no-pie 的系統使用 -fno-PIE

    自有 ID:OTP-14307 輔助 ID:PR-1379

  • 停用 ppc64le 架構 (小端) 的 hipe,因為它未曾支援。它先前被視為 ppc64 (大端),導致組建損壞,除非使用 --disable-hipe

    自有 ID:OTP-14314 輔助 ID:ERL-369, PR-1394

  • 修正「epmd -kill」,以便在由於某些錯誤而未終止 epmd 時返回失敗結束狀態代碼。

    自有 ID:OTP-14324

  • 修正了以下與 dirty 排程器相關的錯誤

    • +SDPcpu 命令列引數可能會導致 dirty CPU 排程器的數量設定為零
    • 當僅使用一個正常排程器搭配 dirty 排程器支援時,erlang:system_flag(multi_scheduling, _) 失敗

    自身 ID:OTP-14335

  • 修正 erlexec 在計算 CPU 拓撲時,處理 sysconf 和 proc fs 不匹配的問題。當使用 Docker 和 --cpuset-cpus 時,會出現這種情況。

    自身 ID:OTP-14352

  • 修正了用於多區塊載體的記憶體區段快取。巨大的(> 2GB)記憶體區段可能導致 VM 崩潰。不過,創建用於多區塊載體的這種巨大記憶體區段非常少見。

    自身 ID:OTP-14360 輔助 ID:ERL-401, PR-1417

  • 修正了當模組啟用 local 呼叫追蹤時,導致 code:is_module_native 錯誤地返回 true 的錯誤。

    自身 ID:OTP-14390

  • 修正了在 trace_delivered 訊息上接收追蹤時,模擬器崩潰的問題。

    自身 ID:OTP-14411

  • 修正了在 SunOS 上,當傳輸期間連線關閉時,file:sendfile 的錯誤處理。

    自身 ID:OTP-14424

  • escript 未正確處理帶有空格的路徑。

    自身 ID:OTP-14433

  • 修正了在 MacOS X 上執行 wx 時,錯誤的鎖定檢查斷言。

    自身 ID:OTP-14437 輔助 ID:ERL-360

  • 現在在傳送/關閉錯誤時,會正確清理主動模式 TCP 套接字。

    自身 ID:OTP-14441 輔助 ID:ERL-430

  • 修正了當必須設定 LIBS 配置變數時,hipe_mkliterals 的編譯。

    自身 ID:OTP-14447

改進和新功能

  • 新增了 erlang:garbage_collect/2,它將選項列表作為最後一個引數,可用於控制執行次要或主要垃圾收集。次要收集僅收集最近已死亡的術語,但比主要收集更便宜。

    自身 ID:OTP-11695

  • 優化了以原子作為第一個元素的元組的測試。

    自身 ID:OTP-12148

  • 在程序之間的訊息傳遞期間,不再複製 Erlang 字面值。

    自身 ID:OTP-13529

  • erl_nif API 中新增了對非同步訊息通知的支援,以便在套接字或其他檔案描述符準備好接受讀取或寫入操作時發出通知。已新增下列函式

    • enif_select
    • enif_monitor_process
    • enif_demonitor_process
    • enif_compare_monitors
    • enif_open_resource_type_x

    自身 ID:OTP-13684

  • 有兩個新的保護 BIF 'floor/1' 和 'ceil/1'。它們都返回整數。在 'math' 模組中,有兩個同名的新 BIF,它們返回浮點數值。

    自身 ID:OTP-13692

  • 移除已棄用的 erlang:hash/2

    * 潛在的不相容性 *

    自身 ID:OTP-13827

  • 取代了已棄用的符號 時間單位 表示法的使用。

    自身 ID:OTP-13831 輔助 ID:OTP-13735

  • 在 zlib 中新增了對提取解壓縮字典的支援。

    自身 ID:OTP-13842

  • 已移除先前使用的清除策略。在 ERTS 版本 8.1 中引入的可選清除策略現在是唯一可用的策略。

    新的清除策略與舊策略略有不相容。先前,持有參照正在清除模組的 fun 的程序,在軟清除時會失敗,或者在硬清除期間會被終止。新的策略完全忽略 fun。如果存在參照正在清除程式碼的 fun,且在清除後使用,則在使用時會引發例外。也就是說,行為將與在清除後程序接收 fun 的情況完全相同。

    如需更多資訊,請參閱 erlang:check_process_code/3 的文件。

    * 潛在的不相容性 *

    自身 ID:OTP-13844 輔助 ID:OTP-13833

  • 當使用 SMP 支援建置執行階段系統時,現在預設啟用 Dirty 排程器。

    自身 ID:OTP-13860

  • 透過大幅減少雜湊負載因子,提高了大型 setbagduplicate_bag 的 ETS 查找/插入/刪除速度。此速度提升的代價是每個表條目少於一個字。具有少於 256 個條目的表完全不受影響。

    自身 ID:OTP-13903

  • 不再支援 NIF 函式庫 reload 功能。自 OTP R15B 以來,它已標示為已棄用。這表示對於每個模組實例,您只允許成功呼叫一次 erlang:load_nif/2。即使 NIF 函式庫實作 reload 回呼,第二次呼叫 erlang:load_nif/2 也會返回 {error, {reload, _}}

    仍支援透過使用 Erlang 模組升級機制來升級 NIF 函式庫,同時存在目前的和舊的模組實例及其對應的 NIF 函式庫。

    * 潛在的不相容性 *

    自身 ID:OTP-13908

  • 新增 erlang:system_info(atom_count)erlang:system_info(atom_limit),以提供一種方式來擷取目前和最大原子數。

    自身 ID:OTP-13976

  • 函式 fmod/2 已新增至 math 模組。

    自身 ID:OTP-14000

  • 當為 HiPE 編譯的模組呼叫 erlang:load_nif/2 時,它會返回新的錯誤類型 notsup,這是未支援的。

    自身 ID:OTP-14002

  • 將驅動程式和 nif 鎖定檢測新增至 lcnt

    自身 ID:OTP-14069

  • 在可能的情況下,透過將子二進位轉換為堆積二進位來減少記憶體壓力。這在垃圾收集期間完成。

    自身 ID:OTP-14149

  • 現在在具有 SMP 支援的 Erlang 執行階段系統上啟用和支援 Dirty 排程器。

    除了支援 Dirty NIF 之外,還引入了對 Dirty BIF 和 Dirty 垃圾收集的支援。如果啟用,則所有可能需要長時間才能完成的垃圾收集,現在都在 Dirty 排程器上執行。

    由於 Dirty 排程器支援,已變更以檢測排程器和執行佇列狀態為引數的 erlang:statistics/1。使用此功能的程式碼可能必須重新撰寫,並將這些不相容性納入考量。此類使用的範例包括呼叫 erlang:statistics(scheduler_wall_time)statistics(total_run_queue_lengths)statistics(total_active_tasks) 等。

    * 潛在的不相容性 *

    自身 ID:OTP-14152

  • 原子現在可能包含任意 Unicode 字元。

    自身 ID:OTP-14178

  • 在 Erlang 中引入事件管理員以處理 OS 信號。可以訂閱 OS 信號的子集,這些信號在 Kernel 應用程式中描述。

    自身 ID:OTP-14186

  • 現在 escript 程式會處理 escript 的符號連結。

    這對於獨立系統很有用,這些系統的 escript 位於未包含在執行路徑中的 bin 目錄中(因為這可能會導致它們的 erl 程式覆寫所需的程式)。相反地,可以從路徑中的 bin 目錄,透過符號連結參照 escript

    自身 ID:OTP-14201 輔助 ID:PR-1293

  • 魔術二進位的所有使用都已取代為使用 erlang 參考。

    魔術二進位呈現為空二進位,但實際上在 Erlang VM 中內部參照其他資料。由於它們呈現為空二進位,因此不同的魔術二進位比較為相等,並且在傳遞出 erlang 節點時也會遺失其內部資料。

    新的參考用法沒有任何這些奇怪的語義問題,並且這些參考的用法已得到優化,以提供與魔術二進位相同的效能優勢和記憶體使用優勢。

    先前使用魔術二進位的幾個範例是比對規格和 NIF 資源。

    自身 ID:OTP-14205

  • 已棄用非 SMP 模擬器,並計劃在 OTP-21 中移除。

    為了準備這一點,預設不再建置線程非 SMP 模擬器,並且必須使用 --enable-plain-emulator 才能進行設定。

    * 潛在的不相容性 *

    自身 ID:OTP-14272

  • 允許 HiPE 在使用 --enable-m32-build 建置的 VM 上執行。

    自身 ID:OTP-14330 輔助 ID:PR-1397

  • 將 OTP 內部 PCRE 函式庫從版本 8.33 升級到版本 8.40。此函式庫用於實作 re 正規表示式模組。

    除了各種錯誤修正之外,新版本還允許更好的堆疊保護。為了利用此功能,現在預設將所有平台上的正常排程器線程堆疊大小設定為 128 千字。可以在系統啟動時,透過將 +sss 命令列引數傳遞給 erl 命令來設定正常排程器線程的堆疊大小。

    如需有關 PCRE 在版本 8.33 和 8.40 之間所做變更的資訊,請參閱 http://pcre.org/original/changelog.txt

    * 潛在的不相容性 *

    自身 ID:OTP-14331 輔助 ID:ERL-208

  • 移除 erlang 節點、erl_interfacejinterface 之間分配中以舊 latin1 外部格式產生的原子。原子新的 utf8 格式是在 OTP R16 中引入的。因此,OTP 20 節點無法連線到舊於 R16 的節點。

    仍然可以使用 latin1 編碼,透過 term_to_binary() 來編碼可以使用 latin1 編碼的原子。請注意,在未來的 Erlang/OTP 版本中,所有原子預設都會使用 utf8 編碼。如需更多資訊,請參閱 erlang:term_to_binary/2 的文件。

    自身 ID:OTP-14337

  • 新增函式 re:version/0,此函式返回有關用於實作 re 模組的 OTP 內部 PCRE 版本資訊。

    自身 ID:OTP-14347 輔助 ID:PR-1412

  • 新增新的除錯 bif erlang:list_to_port/1

    自身 ID:OTP-14348

  • VM 內部計時器管理的各種改進。這些改進既減少了計時器輪的記憶體消耗,也減少了為處理計時器必須執行的工作量。

    自身 ID:OTP-14356

  • 現在可以將套接字繫結到支援它的平台上的裝置 (SO_BINDTODEVICE)。

    例如,已實作此功能以支援 Linux 下的 VRF-Lite;請參閱 VRF 和 GitHub pull request #1326

    自身 ID:OTP-14357 輔助 ID:PR-1326

  • 新增了下列 erl 命令列引數,您可以使用這些引數來設定建議的 Dirty 排程器堆疊

    Dirty 排程器的預設建議堆疊大小為 40 千字。

    自身 ID:OTP-14380

  • 變更了 erts 啟動程式名稱,argv 0,以使用環境變數 ESCRIPT_NAME,以便可以使用外部程式(例如 unix 上的 ps 和 htop (取決於選項))來查看 erlcdialyzertyperct_run 或 escript 名稱。

    自身 ID:OTP-14381

  • 改進了 escript 文件。

    自身 ID:OTP-14384 輔助 ID:OTP-14201

  • 為 NIF 新增函式 enif_hash,以計算任意 term 的雜湊值。

    Own Id: OTP-14385 Aux Id: PR-1413

  • './configure --enable-lock-counter' 將啟用額外模擬器的建置,該模擬器支援鎖計數。(此選項先前存在,但會在建置預設模擬器時啟用鎖計數。)要啟動鎖計數模擬器,請使用 'erl -emu_type lcnt'。

    在 Windows 上,erl 可辨識未公開的選項 -debug 以啟動除錯編譯的模擬器。該選項已移除。請改用 'erl -emu_type debug'。

    Own Id: OTP-14407

  • 相關文件中已新增警告,說明不應在暴露的環境中使用不安全的分散式節點。

    Own Id: OTP-14425

  • 改進了環境變數 ERL_CRASH_DUMP_SECONDS 的文件說明,以及未設定時的預設行為。

    Own Id: OTP-14434

  • 針對某些可能接收大量訊息的系統程序啟用了堆外訊息佇列。

    Own Id: OTP-14438

  • ETS 鎖索引已在 LCNT 結果中被表格名稱取代。

    Own Id: OTP-14442 Aux Id: ERIERL-22

  • 引入了新函式 enif_whereis_pid()enif_whereis_port()

    Own Id: OTP-14453 Aux Id: PR-1400

Erts 8.3.5.7

已修正錯誤和故障

  • 修正了兩個負運算元進行 band 運算時的錯誤,如果其中一個運算元的絕對值的最低 N*W 位元為零,而另一個絕對值不超過 N*W 位元,則會產生錯誤結果。N 是大於或等於 1 的整數,W 則根據 word 大小而定,為 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

已修正錯誤和故障

  • 修正了傳送到終止埠時可能發生的小型記憶體洩漏。

    Own Id: OTP-14609 Aux Id: ERIERL-238

Erts 8.3.5.5

已修正錯誤和故障

  • 修正 inet 驅動程式中的競爭條件,該條件可能導致在使用 gcc 8 編譯模擬器時接收掛起。

    自有 ID:OTP-15158 輔助 ID:ERL-654

  • 修正了一個導致某些 Erlang 參考排序不一致的錯誤。例如,這可能會導致無法在搜尋資料結構中查找以參考作為鍵的特定元素。此錯誤是在 R13B02 中引入的。

    感謝 Simon Cornish 發現此錯誤並提供修正。

    * 潛在的不相容性 *

    自有 ID:OTP-15225

Erts 8.3.5.4

已修正錯誤和故障

  • 修正了 Unix 上檔案關閉的錯誤;在 EINTR 上重試 close(2),這也可能導致關閉不同的(最近開啟的)檔案。

    內部 ID:OTP-14775

  • 當拆除具有活動節點監視器的連線時,競爭情況可能導致執行時間系統崩潰。

    此錯誤是在 ERTS 版本 8.0 (OTP 19.0) 中引入的。

    內部 ID:OTP-14781 輔助 ID:OTP-13047

Erts 8.3.5.3

已修正錯誤和故障

  • 用於儲存排程器 ID 的計時器內部位元欄位太小。因此,當系統上使用 1024 個排程器時,VM 內部計時器資料結構可能會變得不一致。請注意,使用少於 1024 個排程器的系統不會受到此錯誤的影響。

    此錯誤是在 ERTS 7.0 版 (OTP 18.0) 中引入的。

    自有 ID:OTP-14548 輔助 ID:OTP-11997, ERL-468

  • 修正 binary_to_termbinary_to_atom 中可能導致 VM 崩潰的錯誤。通常發生在 UTF8 字串的最後一個字元位於 128 到 255 的範圍內,但截斷為只有一個位元組時。此錯誤存在於 ERTS 5.10.2 版 (OTP_R16B01) 以來的 binary_to_term 中,以及 ERTS 9.0 版 (OTP-20.0) 以來的 binary_to_atom 中。

    自有 ID:OTP-14590 輔助 ID:ERL-474

  • 修正當啟用 erlang:trace(on_load, ...) 時,載入具有 -on_load 指示詞的模組時導致 VM 崩潰的錯誤。

    自有 ID:OTP-14612

  • 修正了當從其他節點的分散式通道接收到損毀的訊息時,可能導致 VM 崩潰的錯誤。

    內部 ID:OTP-14661 輔助 ID:ERIERL-80

Erts 8.3.5.2

已修正錯誤和故障

  • 修正了預先分配器中的效能錯誤,該錯誤可能會導致它們永久回退到較昂貴的正常記憶體分配。預先分配器用於快速分配訊息和其他排程任務使用的短期元資料。此錯誤自 OTP_R15B02 開始存在。

    自有 ID:OTP-14491

  • 修正了在傳送逾時時無法正確關閉 TCP 通訊端的錯誤。

    自有 ID:OTP-14509

  • 修正了當一個運算元是最低 N*W 位為零的大的整數,而另一個運算元不超過 N*W 位時,運算子 bxor 產生錯誤結果的錯誤。N 是大於或等於 1 的整數,而 W 則為 32 或 64,取決於字組大小。

    自有 ID:OTP-14514

Erts 8.3.5.1

已修正錯誤和故障

  • 修正了當在遠端關閉的 TCP 通訊端上重複呼叫 gen_tcp:send 時永遠不會返回的錯誤。

    自有 ID:OTP-13939 輔助 ID:ERL-193

  • 修正了在中止 erlang:port_command/3 呼叫的清理期間可能會發生的區段錯誤。如果埠在發出 port_command 的同時關閉,則會中止 port_command。此錯誤是在 erts-8.0 中引入的。

    自有 ID:OTP-14481

  • 修正了 statistics(wall_clock)statistics(runtime) 的實作,讓數值不會因為模擬器而產生不必要的回繞。請注意,由於作業系統提供的基礎功能限制,statistics(runtime) 傳回的數值仍然可能會回繞。

    自有 ID:OTP-14484

Erts 8.3.5

已修正錯誤和故障

  • 現在在傳送/關閉錯誤時,會正確清理主動模式 TCP 套接字。

    自身 ID:OTP-14441 輔助 ID:ERL-430

  • 在某些情況下,程式碼清除作業可能會擴大休眠程序的大小。

    Own Id: OTP-14444 Aux Id: ERIERL-24

  • 修正了在 erts-8.3.4 中引入的 ERL_ZZ_SIGTERM_KILL 的運作方式。

    Own Id: OTP-14451

Erts 8.3.4

已修正錯誤和故障

  • 新增選項,使 SIGTERM 觸發 OS 預設行為,而不是進行正常關機。要啟用此行為,應將環境變數 ERL_ZZ_SIGTERM_KILL 設定為 "true"。此選項僅適用於 OTP 19,因為 OTP 20 將以不同的方式處理 SIGTERM。

    Own Id: OTP-14418 Aux Id: ERIERL-15

Erts 8.3.3

已修正錯誤和故障

  • 修正了用於多區塊載體的記憶體區段快取。巨大的(> 2GB)記憶體區段可能導致 VM 崩潰。不過,創建用於多區塊載體的這種巨大記憶體區段非常少見。

    自身 ID:OTP-14360 輔助 ID:ERL-401, PR-1417

  • 修正了 ERTS 8.3.1 版中 OTP-14290 的發行說明。它被錯誤地放置在「已知錯誤和問題」下。

    Own Id: OTP-14363 Aux Id: OTP-14290

Erts 8.3.2

已修正錯誤和故障

  • erl+Bi 命令列參數錯誤地導致 VM 以及其所有子程序忽略 SIGTERM。此錯誤是在 erts 8.3 版中引入的。

    Own Id: OTP-14358 Aux Id: OTP-14085

Erts 8.3.1

已修正錯誤和故障

  • 在非 SMP BEAM 中,透過 SIGTERM 信號調用 init:stop/0 可能會導致 BEAM 以嚴重錯誤終止。現在已修正此問題,當收到 SIGTERM 時,BEAM 將正常終止。

    Own Id: OTP-14290

  • 嘗試在 Unix 上使用 file:read_file/1 開啟目錄會洩漏檔案描述符。此錯誤現已修正。

    Own Id: OTP-14308 Aux Id: ERL-383

Erts 8.3

已修正錯誤和故障

  • 修正了許多導致產生錯誤堆疊追蹤的錯誤。當套用下列函式或追蹤下列函式時,會產生錯誤的堆疊追蹤

    Own Id: OTP-14055

  • 修正了有關 map 記憶體佔用空間的文件說明。

    Own Id: OTP-14118

  • 修正 process_info(Pid, current_stacktrace) 以使用 system_flag(backtrace_depth) 設定的堆疊深度限制。舊的行為是硬編碼的深度限制 8。

    Own Id: OTP-14119 Aux Id: PR-1263

  • 調用 erlang:system_flag(multi_scheduling, block) 的程序最終可能會永遠掛在呼叫中。

    Own Id: OTP-14121

  • Dirty scheduler 錯誤修正

    • 修正了在 dirty scheduler 上排程的程序的調用時間追蹤。
    • 來自 dirty schedulers 的 GC 資訊。
    • 使用 dirty schedulers 的多重排程區塊可能會導致執行階段系統崩潰。
    • 可以過早移除程序結構。
    • 在 dirty scheduler 上的 GC 可能會導致執行階段系統崩潰。
    • 在 dirty scheduler 上執行的程序終止可能會導致執行階段系統崩潰。

    Own Id: OTP-14122

  • 修正了將計時器資料寫入當機傾印時發生的崩潰。

    Own Id: OTP-14133

  • 文字區域可能會在仍從程序參照時被移除。

    Own Id: OTP-14134

  • 修正了垃圾收集器中可能導致執行階段系統崩潰的錯誤。

    Own Id: OTP-14135

  • 修正了 NIF 的調用時間追蹤中的錯誤,該錯誤導致一次調用多次錯誤地啟動追蹤。

    Own Id: OTP-14136

  • 移除在處理 hipe 編譯程式碼中的例外狀況時的偵錯輸出和不必要的垃圾收集。

    Own Id: OTP-14153

  • 修正了垃圾收集追蹤中可能導致 VM 崩潰的錯誤。此錯誤自 OTP 19.0 開始存在。

    Own Id: OTP-14154

  • 修正了使用 compressed 選項由 term_to_binary 建立的二進位的 binary_to_term 中的錯誤。當 Erlang VM 連結到 1.2.9 或更新版本的 zlib 程式庫時,此錯誤可能會導致有效二進位的 badarg 例外狀況。此錯誤自 OTP 17.0 開始存在。

    Own Id: OTP-14159 Aux Id: ERL-340

  • 修正了產生當機傾印時排程器的暫停問題。

    Own Id: OTP-14164

  • 在不支援 SMP 的執行階段系統中,NIF 資源未以執行緒安全的方式處理。

    作為此修正的結果,以下驅動程式函式現在在不支援 SMP 的執行階段系統中也是執行緒安全的

    • driver_free_binary()
    • driver_realloc_binary()
    • driver_binary_get_refc()
    • driver_binary_inc_refc()
    • driver_binary_dec_refc()

    Own Id: OTP-14202

  • 修正了在 (1 bsl 52)(1 bsl 53) 之間具有奇數絕對值的大型浮點數的 erlang:round/1。儘管 up to (1 bsl 53) 的所有整數值都可以使用完整精度表示為浮點數,但結果錯誤地計算為下一個更高的偶數。

    Own Id: OTP-14227

  • 在當機傾印和中斷選單中的 (l)oaded 命令中,將文字的大小新增至模組程式碼大小,就像 OTP-19.0 之前一樣。

    Own Id: OTP-14228

  • 修正了在沒有程序內容且以引數 msg_envNULL 的情況下調用 enif_send 時的潛在錯誤。

    Own Id: OTP-14229

  • 修正了將可附加二進位傳遞給 erlang:port_control() 可能會導致模擬器崩潰的錯誤。

    Own Id: OTP-14231

  • Erlang shell 中具有逾時的接收運算式可能會導致 VM 崩潰。

    Own Id: OTP-14241 Aux Id: ERL-365

改進和新功能

  • 傳送至 beam 的 SIGTERM 信號將會產生一則 'stop' 訊息到 init 程序,並正常終止 Erlang VM。這相當於調用 init:stop/0

    Own Id: OTP-14085

  • 針對 Android 有錯誤的 PTHREAD_STACK_MIN 實作的解決方法,該實作導致執行階段系統的建置在未宣告的 PAGE_SIZE 上崩潰。

    Own Id: OTP-14165 Aux Id: ERL-319

  • 新增組態選項 --without-thread-names,該選項會移除個別模擬器執行緒的命名。

    Own Id: OTP-14234

  • 在關於選項 WindowsBits 值 8 和 -8 的 zlib:deflateInit/6 的文件中新增警告。

    Own Id: OTP-14254 Aux Id: ERL-362

Erts 8.2.2

修正的錯誤與故障

  • 修正了使用 compressed 選項由 term_to_binary 建立的二進位的 binary_to_term 中的錯誤。當 Erlang VM 連結到 1.2.9 或更新版本的 zlib 程式庫時,此錯誤可能會導致有效二進位的 badarg 例外狀況。此錯誤自 OTP 17.0 開始存在。

    Own Id: OTP-14159 Aux Id: ERL-340

  • 驅動程式 efile_drv 現在開啟檔案時,若 fstat() 存在,會對開啟的檔案使用 fstat(),而不是在開啟前使用 stat()。這避免了在 stat() 和 open() 之間檔案發生變更時的競爭情況。

    自有 ID:OTP-14184 輔助 ID:seq-13266

Erts 8.2.1

修正的錯誤與故障

  • 修正了一個相當罕見的錯誤,該錯誤會在程式碼載入期間以及使用尚未載入模組的匯出函數 (fun M:F/A) 時導致 VM 崩潰。需要並行排程器執行緒非常特定的時間點。已在 ARM 上看到,但可能也發生在其他架構上。此錯誤自 OTP R16 就存在。

    自有 ID:OTP-14144 輔助 ID:seq13242

Erts 8.2

修正的錯誤與故障

  • 修正了 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

  • 稍微改進了針對在 hipe 編譯程式碼中引發的例外狀況的 erlang:get_stacktrace/0。此類堆疊追蹤中的 Beam 編譯函數之前會被某些不相關的函數取代。現在會改為省略這些函數。這是為了在缺少混合 beam 和 hipe 函數的完整且正確的堆疊追蹤的情況下,減少混淆的嘗試。

    自有 ID:OTP-13992

  • 更正了比對規格標頭的類型宣告。

    自有 ID:OTP-13996

  • 如果 gcc 設定為 --enable-default-pie,則 HiPE 程式碼載入在 x86_64 上失敗。已透過在建置 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

修正的錯誤與故障

  • 在某些情況下,程式碼清除作業可能會擴大休眠程序的大小。

    Own Id: OTP-14444 Aux Id: ERIERL-24

Erts 8.1.1

修正的錯誤與故障

  • 模擬器對 libsctp 有了動態程式庫相依性,這在 Linux 上並非本意,因為模擬器會在執行階段載入並解析所需的 sctp 函數。此問題已修正,並且為那些想要此類程式庫相依性的人新增了一個 configure 開關 --enable-sctp=lib。

    自有 ID:OTP-13956 輔助 ID:ERL-262、ERL-133

  • 修正 SIGUSR1 損毀傾印產生

    要求損毀傾印時,不要產生核心。

    自有 ID:OTP-13997

  • 允許一次載入多個模組的 code 中的新函數存在效能問題。在 erl_prim_loader 處理程序中執行協助程式函數時,會產生垃圾訊息。垃圾訊息會被忽略並最終捨棄,但會對效能和記憶體使用產生負面影響。垃圾訊息的數量取決於要載入的模組數量和程式碼路徑的長度。

    受此問題影響的函數包括:atomic_load/1ensure_modules_loaded/1prepare_loading/1

    自有 ID:OTP-14009

Erts 8.1

修正的錯誤與故障

  • 修正了從 hipe 程式碼呼叫在產生時停用 GC 的 BIF 的錯誤。已導致 ARM(以及可能所有其他非 intel 平台)上的 Dialyzer 崩潰。

    自有 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

  • 修正了 map 雜湊的熵,其中 map 的 key 也是 map。

    自有 ID:OTP-13763,輔助 ID:ERL-199

  • 改進了 dirty scheduler 的支援。現在可以執行模組的清除,而無需等待所有正在進行的 dirty NIF 呼叫完成。

    請注意,當啟用對 dirty scheduler 的支援時,從 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 時,可以選擇啟用新的策略,如果執行階段系統是使用對 dirty scheduler 的支援建置的,則將自動啟用。

    如需更多資訊,請參閱 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

已修正的錯誤和故障

  • 修正了在垃圾收集透過分佈收到 map 的程序時發生的 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 崩潰傾印後發生的 segmentation fault。

    自有 ID:OTP-13799

Erts 8.0.2

已修正的錯誤和故障

  • 修正了在找不到 key 且插入預設物件導致表格增長時,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

  • 修正了在 Unix 平台上以 +B 啟動 erlang 時,建立崩潰傾印時會被 SIGUSR2 信號終止的錯誤。

    自有 ID:OTP-13425

  • 修正了 process_flag(trap_exit,true) 和收到的 exit 信號之間的競爭。

    即使 process_flag(trap_exit,true) 已傳回,程序也可能因 exit 信號而終止。需要 process_flag/2 呼叫和來自另一個排程器的 exit 信號之間非常特定的時序,才會發生這種情況。

    自有 ID:OTP-13452

  • 不要搜尋不存在的 Map key 兩次

    對於 maps:get/2,3maps:find/2,在小型 map 中搜尋立即 key(例如 atom)時,如果 key 不存在,則會執行搜尋兩次。

    自有 ID:OTP-13459

  • 當要傳送異常大的分佈訊息時,已將 VM 變更為建立崩潰傾印,而不是核心傾印。

    自有 ID:OTP-13474

  • 修正了 erlang:process_info/2 類型規格

    自有 ID:OTP-13485,輔助 ID:ERL-123

  • 修正了選項為 {args, List}open_port/2 中的錯誤。不正確的 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 vector 插槽中處理的更大的二進制檔案時,現在會將二進制檔案分割成 io vector 中的多個插槽。此變更僅影響 io vector 插槽的最大大小小於系統字長度的系統(例如 Windows)。

    此變更表示現在可以在 Windows 上將大於 4GB 的二進制檔案傳送到 port_command,這也是 file:write、gen_tcp:send 等所使用的。

    自有 ID:OTP-13628

  • 解決崩潰傾印中 Map 輸出問題的臨時解決方案。目前,如果在崩潰期間遇到 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 模組。

    專案編號:OTP-12345

  • 已移除 Erlang/OTP 到即時作業系統 OSE 的移植。

    專案編號:OTP-12573

  • 為訊息和結束訊號保留副本共享

    使用設定選項 --enable-sharing-preserving 啟用保留副本共享。這會在 Erlang 節點中與其他程序通訊時,在程序內保留共享。這是一種權衡,複製的成本較高,但如果訊息中有很多共享,則可以回收此成本。此外,在模組的清除階段(其中找到文字)以外,文字不會在發送時複製。此功能在 19.0 中被視為實驗性功能。

    專案編號:OTP-12590,輔助編號:OTP-10251

  • 已移除半字 BEAM。

    專案編號:OTP-12883

  • 新增 os:perf_counter/1

    perf_counter 是一個非常非常低成本且高解析度的計時器,可用於時間戳記系統事件。它沒有單調性保證,但在大多數作業系統上應該會顯示單調的時間。

    專案編號:OTP-12908

  • 支援片段化的年輕堆積生成。也就是說,年輕堆積生成可以包含多個不連續的記憶體區域。此變更的主要原因是避免額外複製無法直接在接收器堆積上配置的訊息。

    專案編號:OTP-13047

  • Erlang 連結驅動程式現在可以強制呼叫 open_port 進入封鎖狀態,直到在驅動程式內部呼叫 erl_drv_init_ack 為止。當您想要執行一些非同步初始化,例如從管道取得設定,並且您希望在設定不完整或錯誤時讓初始 open_port 呼叫失敗時,這非常有用。有關 API 的更多詳細資訊,請參閱 erl_driver 文件。

    專案編號:OTP-13086

  • Erlang 連結驅動程式現在可以使用 erl_drv_set_pid 函式設定自己的 pid,如 erlang:port_info/1 中所見。有關更多詳細資訊,請參閱 erl_driver 文件。

    專案編號:OTP-13087

  • 當使用 spawn 或 spawn_executable 呼叫時,erlang:open_port/2 背後的函式已重新設計,以便新程式的分支在一個名為 erl_child_setup 的獨立程序中完成。這允許更穩健的實作,使用更少的記憶體,並且如果啟動的程式位於無法存取的 NFS 上,則不會封鎖整個模擬器。基準測試顯示,這種方法的速度比舊方法(由 erts 完成 fork/vfork)快約 3-5 倍。這是一個純粹的穩定性和效能修正,但是某些錯誤訊息可能已變更,因此標記為向後不相容的變更。

    * 潛在的不相容性 *

    專案編號:OTP-13088

  • 改善下列原生函式實作中的讓步策略

    這是為了提高這些函式的效能。

    專案編號:OTP-13096

  • 現在,程序的所有垃圾收集都會增加歸約。此外,垃圾收集時增加的歸約量已調整。它現在更好地對應於執行的工作量。這是為了提高系統的即時特性。

    專案編號:OTP-13097

  • 已將一次載入多個模組的新函式新增至 'code' 模組。這些函式為 code:atomic_load/1code:prepare_loading/1code:finish_loading/1code:ensure_modules_loaded/1

    專案編號:OTP-13111

  • erl-boot_var 選項現在僅支援單一鍵和單一值(如文件所述)。該選項以前允許使用多個鍵/值對,但此行為未記錄在文件中。

    已移除函式 erl_prim_loader:start/3。其文件也已移除。

    已移除未記錄在文件且不受支援的函式 erl_prim_loader:get_files/2

    專案編號:OTP-13112

  • 低階 BIF erlang:purge_module/1 對於不正確的使用更加穩健。在清除模組之前,會先終止仍參考舊程式碼的持續性程序,以防止發生致命的 VM 行為。

    專案編號:OTP-13122

  • 改善了骯髒排程器的實作。有關更多資訊,請參閱 NIF 文件

    注意

    • 骯髒排程器支援仍處於實驗性階段。
    • 已移除使用 C 前置處理器巨集 ERL_NIF_DIRTY_SCHEDULER_SUPPORT 在編譯時判斷是否存在骯髒 NIF 支援的功能。
    • 已移除 enif_is_on_dirty_scheduler() 函式。請改用 enif_thread_type()

    專案編號:OTP-13123

  • 對程序字典存取進行了各種最佳化。

    專案編號:OTP-13167

  • 新增 max_heap_size 程序旗標。max_heap_size 允許使用者限制程序使用的最大堆積。如需更多詳細資訊,請參閱 erlang:process_flag

    專案編號:OTP-13174

  • 允許使用 gcc 選項 -fvisibility=hidden 建置動態驅動程式和 NIF 程式庫,以加快載入速度並最佳化程式碼。

    專案編號:OTP-13227

  • 新增 erlang:process_info(Pid, garbage_collection_info),其會傳回擴充的垃圾收集資訊。有關更多詳細資訊,請參閱文件。

    專案編號:OTP-13265

  • 已針對大型輸入最佳化函式 erlang:list_to_integer/1string:to_integer/1

    專案編號:OTP-13293

  • 透過保留 HiPE/AMD64 小型程式碼模型所需的足夠低虛擬位址空間,改善了 x86_64 (amd64) 架構上 hipe 原生程式碼的記憶體配置策略。hipe 程式碼的預設虛擬位址區域設定為 512Mb,但可以使用模擬器旗標 +MXscs 進行變更。

    專案編號:OTP-13359

  • 導入對程序訊息佇列所參考的資料的可設定管理。每個程序都可以個別設定。

    現在可以設定程序的訊息佇列,以便其所參考的所有資料都將保留在堆積之外,並藉此防止此資料成為垃圾收集的一部分。

    如需更多資訊,請參閱 process_flag(message_queue_data, MQD) 的文件。

    專案編號:OTP-13366,輔助編號:OTP-13047

  • 現在,程序在掃描大型訊息佇列並且未找到相符訊息時會讓步。這是為了改善即時特性。

    專案編號:OTP-13401

  • 最佳化用於遍歷 Erlang 項目的 erts 內部函式。該內部函式主要用於 term_to_binary 和項目比較。基準測試顯示,最佳化後這些函式的效能提高了 10%。

    專案編號:OTP-13440

  • 新增下列 NIF API 函式

    有關每個函式的功能詳細資訊,請參閱 erl_nif 文件。

    專案編號:OTP-13442

  • 透過使用單次傳遞來建置新列表,同時檢查是否正確,以最佳化 '++' 運算子和 lists:append/2

    專案編號:OTP-13487

  • 處理來自「建立」值大於 3 的節點的項目(pid、埠和參照)。這是分發協定的準備工作,以便允許 OTP 19 節點與未來節點(20 或更高版本)正確通訊。「建立」值區分同一節點(名稱)的不同化身。

    專案編號:OTP-13488

  • 不要在 epmd 中傳送未要求的 systemd 通知

    專案編號:OTP-13493,輔助編號:PR-999

  • 已擴充 enif_send API,允許使用 NULL 作為訊息環境。以這種方式使用時,會隱式建立訊息環境,並在傳送之前將給定項目複製到該環境中。如果 NIF 傳送許多小型訊息,這可能是一種最佳化方式。

    專案編號:OTP-13495

  • 已擴充追蹤支援,以允許追蹤埠。可以使用 'ports'、'send' 和 'receive' 追蹤旗標追蹤埠。

    已擴充 erlang:trace/3 的第一個引數,以便 'all''existing''new' 現在包含程序和埠。已新增新的 Tracee 變體,'all_processes''all_ports''existing_processes' 等,以指定僅程序或埠。

    * 潛在的不相容性 *

    專案編號:OTP-13496

  • 啟用 'procs' 追蹤旗標時,新建立的程序現在也會產生 'spawned' 追蹤事件。先前的事件 'spawn' 仍然存在,但由於它是由執行產生動作的程序產生,因此無法保證它與新產生程序的其他追蹤事件排序。因此,在追蹤程序的生命週期時,此新事件應用作建立事件。

    由於在啟用 'procs' 時預期某些追蹤事件的工具必須更新,因此此新追蹤事件標記為不相容。

    * 潛在的不相容性 *

    專案編號:OTP-13497

  • 新增 erlang:match_spec_test/3 函式。此函式允許測試追蹤和 ets 表格的配對規範。它可用於測試配對規範是否在特定資料上執行預期的篩選。它也會針對錯誤建構的配對規範傳回更詳細的錯誤原因。

    專案編號:OTP-13501

  • 已變更 erts 內部追蹤支援,使其具有更少的開銷和更高的可擴展性。

    此重寫不會破壞任何向後不相容性,但與先前的版本相比,它確實變更了一些追蹤訊息的排序。應注意,這僅適用於傳送至程序或埠的追蹤訊息,不適用於新的追蹤器模組。但是,在未來的版本中,它們也可能會受到此影響。

    追蹤訊息僅保證來自一個追蹤的程序或埠的排序。在先前的版本中,這並不明顯,因為 'send' 追蹤訊息始終會在對應的 'receive' 追蹤訊息之前到達,但現在不再總是如此。這也表示時間戳記追蹤訊息似乎會以亂序到達,因為時間戳記是在觸發事件時取得,而不是在將其放入追蹤器的佇列時取得。

    專案編號:OTP-13503

  • 新增使用配對規範篩選 sendreceive 追蹤的可能性。

    專案編號:OTP-13507

  • 新增 maps:update_with/3,4maps:take/2

    專案編號:OTP-13522,輔助編號:PR-1025

  • 透過 Erlang 追蹤引入 LTTng 追蹤。

    若要啟用 LTTng,需要使用組態選項 --with-dynamic-trace=lttng 建置 OTP。

    動態追蹤模組 dyntrace 現在可以作為 Erlang 追蹤的 LTTng 接收器使用。如需所有追蹤點的列表,請參閱 Runtime Tools 使用者指南

    此功能也引入了追蹤標籤的不相容變更。追蹤標籤 gc_startgc_end 已拆分為 gc_minor_startgc_minor_endgc_major_startgc_major_end

    * 潛在的不相容性 *

    專案編號:OTP-13532

  • 在當機傾印期間列印正在進行垃圾收集的程序的堆積指標

    專案編號:OTP-13541,輔助編號:PR-1026

  • 變更並改善了 erlang:system_info/1 所回傳的低階記憶體統計資訊。關於 erts_mmap 的資訊已從 mseg_alloc 移至由 {allocator, erts_mmap} 回傳的專屬區段。

    專屬 ID:OTP-13560

  • 在 NIF API 中新增 enif_snprintf

    函式 enif_snprintf 類似於 snprintf 呼叫,但可以透過 %T 格式指定符處理 Erlang 項的格式化。

    專屬 ID:OTP-13580

  • 已移除 erlang:raise/3 文件中的警告。現在在生產程式碼中使用 raise/3 是完全可以接受的。

    專屬 ID:OTP-13599

  • 修正了 VM 在 64 位元主機上有時會將物件大小或偏移量截斷為 32 位元所導致的錯誤。這些錯誤主要在處理大型 Unicode 字串和 NIF 環境時發現。

    專屬 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

修正的錯誤和故障

  • 修正了傳送到終止埠時可能發生的小型記憶體洩漏。

    Own Id: OTP-14609 Aux Id: ERIERL-238

Erts 7.3.1.4

修正的錯誤和故障

  • 修正了預先分配器中的效能錯誤,該錯誤可能會導致它們永久回退到較昂貴的正常記憶體分配。預先分配器用於快速分配訊息和其他排程任務使用的短期元資料。此錯誤自 OTP_R15B02 開始存在。

    自有 ID:OTP-14491

  • 修正了當一個運算元是最低 N*W 位為零的大的整數,而另一個運算元不超過 N*W 位時,運算子 bxor 產生錯誤結果的錯誤。N 是大於或等於 1 的整數,而 W 則為 32 或 64,取決於字組大小。

    自有 ID:OTP-14514

  • 用於儲存排程器 ID 的計時器內部位元欄位太小。因此,當系統上使用 1024 個排程器時,VM 內部計時器資料結構可能會變得不一致。請注意,使用少於 1024 個排程器的系統不會受到此錯誤的影響。

    此錯誤是在 ERTS 7.0 版 (OTP 18.0) 中引入的。

    自有 ID:OTP-14548 輔助 ID:OTP-11997, ERL-468

  • 修正 binary_to_termbinary_to_atom 中可能導致 VM 崩潰的錯誤。通常發生在 UTF8 字串的最後一個字元位於 128 到 255 的範圍內,但截斷為只有一個位元組時。此錯誤存在於 ERTS 5.10.2 版 (OTP_R16B01) 以來的 binary_to_term 中,以及 ERTS 9.0 版 (OTP-20.0) 以來的 binary_to_atom 中。

    自有 ID:OTP-14590 輔助 ID:ERL-474

Erts 7.3.1.3

修正的錯誤和故障

  • 修正了在 Unix 平台上以 +B 啟動 erlang 時,建立崩潰傾印時會被 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 開始存在。

    Own Id: OTP-14159 Aux Id: ERL-340

Erts 7.3.1.2

修正的錯誤和故障

  • 修正了在 receive ... after 中超時的程序,可能導致喚醒遺失的競爭情況。此錯誤是在 ERTS 版本 7.0 中引入的。

    自有 ID:OTP-13798,輔助 ID:OTP-11997

  • 修正了寫入 erl 崩潰傾印後發生的 segmentation fault。

    自有 ID:OTP-13799

Erts 7.3.1.1

修正的錯誤和故障

  • 修正了在找不到 key 且插入預設物件導致表格增長時,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) 和收到的 exit 信號之間的競爭。

    即使 process_flag(trap_exit,true) 已傳回,程序也可能因 exit 信號而終止。需要 process_flag/2 呼叫和來自另一個排程器的 exit 信號之間非常特定的時序,才會發生這種情況。

    自有 ID:OTP-13452

Erts 7.3

修正的錯誤和故障

  • 已記錄 'erl' 的 '-path' 旗標。此旗標會取代啟動腳本中指定的路徑。它一直都存在,但早期只在 SASL (腳本) 中記錄。

    專屬 ID:OTP-13060

  • call_time 追蹤功能在內部使用基於作業系統系統時間的時間來測量呼叫時間,如果作業系統系統時間在追蹤期間變更,可能會導致錯誤的結果。

    此功能現在使用 Erlang 單調時間來測量時間。除了修正因使用作業系統系統時間而導致的錯誤結果外,結果通常也會更好,因為 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

改進和新功能

  • 引入新的統計功能,以便更有效率地擷取有關可執行和活動的處理序和埠的資訊。如需詳細資訊,請參閱

    專屬 ID:OTP-13201

  • 時間扭曲安全性改進。

    在追蹤、循序追蹤和系統設定檔功能中引入了 monotonic_timestampstrict_monotonic_timestamp 選項。這是因為已存在的 timestamp 選項不是時間扭曲安全的。

    safe_fixed_monotonic_time 選項引入 ets:info/2dets:info/2。這是因為已存在的 safe_fixed 選項不是時間扭曲安全的。

    專屬 ID:OTP-13222 輔助 ID:OTP-11997

  • 修正 epmd 中未偵測到停機節點的註冊競爭

    專屬 ID:OTP-13301

  • 改進了在 x86/x86_64 上實作雙字原子比較和交換的 gcc 內嵌組件,使其也可以在以 clang 編譯時使用。

    專屬 ID:OTP-13336

  • 一個阻止排程器執行緒尋找在另一個排程器執行緒上執行的處理序資訊的長時間等待的最佳化,在 erts-5.10 (OTP R16A) 中無意間遺失了。現在已重新引入此最佳化。

    專屬 ID:OTP-13365 輔助 ID:OTP-9892

Erts 7.2.1.1

改進和新功能

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 處理常式處理序未重新啟動,導致需要它存在才能正確載入 NIF 的模組 (例如 crypto 和 asn1rt_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 中的一些錯誤,並新增了一些遺失的目標。

    自有 ID:OTP-13026

  • 新增函式 enif_getenv,以可攜式方式從 NIF 中讀取作業系統環境變數。

    自有 ID:OTP-13147

Erts 7.1

已修正的錯誤與故障

  • 修復了 ETS 中的一個錯誤,該錯誤可能導致 safe_fixtable(_,false) 的清理偶爾會遺漏標記為刪除的雜散物件。

    自有 ID:OTP-12870

  • 修復了虛擬機器損毀的問題,該問題可能發生於追蹤埠連結到一個行程,並且追蹤埠在處理追蹤訊息時異常終止。此錯誤始終存在於支援 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

  • 修復了由 hipe 編譯程式碼呼叫 maps:merge/2 時可能導致虛擬機器損毀的錯誤。該錯誤自 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 上用於作業系統系統時間的預設時鐘來源變更為 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

  • 變更了在建置時選取的預設作業系統單調時鐘來源。這是為了提高效能。現在在大多數系統上的行為將會是(作業系統和 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() 作為作業系統系統時間。這將提高 MacOS X 上 os:system_time()os:timestamp() 的效能,但會降低 Erlang 單調時間、Erlang 系統時間和作業系統系統時間的準確度、解析度和精確度。

    自有 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 建置映射結果的問題

    一個錯誤的「盒裝值」輸入堆積,如果寫入堆積片段,可能會導致垃圾回收器出現區段錯誤。

    自有 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

改進與新功能

  • md5module 項目新增到 ?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 毫秒的時間解析度的輪詢/選擇 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 的「原子記憶體操作和 VM」章節。

    自有 ID:OTP-12383

  • 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_treesdict 小。對使用者而言,任何其他影響都是透明的,但以下變更除外。

    與 OTP 17 中的實驗性實作相比,映射的語意在兩個不相容的方式上有所變更。

    • erlang:phash2/1,2erlang:phash/1erlang: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,但也可以透過設定環境變數:HEART_KILL_SIGNAL=SIGABRT 來使用 SIGABRT。

    自有 ID:OTP-12613 輔助 ID:seq12826

  • 將 autoconf 更新為最新版本 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/4erlang:send_after/4erlang:cancel_timer/2erlang:read_timer/2 的文件。

    特性影響:呼叫 erlang:cancel_timer()erlang:read_timer() 的同步版本可能需要比以往長得多的時間才能完成。當存取的計時器由遠端排程器管理時,就會發生這種情況。您通常會想要使用新的非同步選項,以避免封鎖呼叫程序。

    自有 ID:OTP-12650 輔助 ID:OTP-11997

  • 將常見組合器模式的指令特殊化。

    將 beam 載入器中 rembandminusplus 的常見指令特殊化。這將減少擷取次數,從而減輕執行期間的指令分配壓力,並在某些常見情況下加快這些運算的速度。

    使用新的 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

  • 在許多情況下,使用者程式碼需要能夠區分正常關閉的 socket 和中止的 socket。設定選項 {show_econnreset, true} 可讓使用者在主動和被動 socket 上接收 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 開始存在。

    Own Id: OTP-14159 Aux Id: ERL-340

  • 修正了當一個運算元是最低 N*W 位為零的大的整數,而另一個運算元不超過 N*W 位時,運算子 bxor 產生錯誤結果的錯誤。N 是大於或等於 1 的整數,而 W 則為 32 或 64,取決於字組大小。

    自有 ID:OTP-14514

  • 修正 binary_to_termbinary_to_atom 中可能導致 VM 崩潰的錯誤。通常發生在 UTF8 字串的最後一個字元位於 128 到 255 的範圍內,但截斷為只有一個位元組時。此錯誤存在於 ERTS 5.10.2 版 (OTP_R16B01) 以來的 binary_to_term 中,以及 ERTS 9.0 版 (OTP-20.0) 以來的 binary_to_atom 中。

    自有 ID:OTP-14590 輔助 ID: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

已修正的錯誤和故障

  • 在單次呼叫任何 gen_tcp 函式時,'raw' socket 選項無法多次使用,因為只會使用其中一個。此錯誤已修正,同時也修正了一個關於從 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

  • 修正 crashdump 檔案中監控器列印錯誤的問題。

    自身 ID:OTP-12537

  • 如果正在存取的 port 在呼叫 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

  • 修正精確項目的比較。已修正可能導致比較錯誤的溢位。精確項目的比較專用於 Map 內。

    自身 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 中關閉所有檔案描述器兩次

    commit c2b4eab25c907f453a394d382c04cd04e6c06b49 引入了一個錯誤,其中 child_setup 錯誤地嘗試關閉所有檔案描述器兩次。

    如果可用,在關閉所有檔案描述器時使用 closefrom()。

    函式 closefrom() 之前僅在 vfork() 案例中使用,但現在如果可用,也會在 fork() 案例中使用。

    自身 ID:OTP-12446

  • 在 crashdump 期間,會關閉所有檔案描述器,以確保關閉 epmd port 並為 crashdump 檔案保留檔案描述器。

    如果驅動程式 (第三方函式庫) 無法處理 socket 的關閉,可能會導致區段錯誤,在這種情況下不會產生 crashdump。現在已修正此問題,方法是僅透過緊急關閉回呼關閉 inets socket 到驅動程式,從而關閉 epmd socket。

    自身 ID:OTP-12447

Erts 6.3

已修正的錯誤和故障

  • 修正 OS X 64 位元上的 HiPE 除錯鎖定檢查

    位置無關程式碼在 OS X 上是強制性的。我們使用 r11 作為中間暫存器來填入 BIF_P->hipe.bif_callee。這修正了在執行 `make debug FLAVOR=smp` 時發生的以下錯誤

    clang -cc1as:致命錯誤:後端發生錯誤:64 位元模式不支援 32 位元絕對定址

    自身 ID:OTP-12188

  • 修正可能在 concurrent 程序關閉 port 時導致 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 的新 options 欄位新增初始設定式,防止在編譯器指示將遺失欄位初始設定式視為錯誤時,NIF 中出現編譯時錯誤。

    自身 ID:OTP-12266

  • 修正 FreeBSD 系統上 Erlang/OTP 由新的 C 編譯器 (包括但不限於 gcc 4.9 和 clang) 編譯時的 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 中對帶正負號的整數取負數會觸發未定義的行為。這修正了使用大數和 list_to_integer 進行除法時的問題。

    自身 ID:OTP-12290

  • 當將輸出重新整理到 Windows 上的 stdout 時,模擬器有時可能會無限期地掛起,等待重新整理完成。此問題已修正。

    自身 ID:OTP-12291

  • 進行修正,讓具有 dirty 排程器支援的非 smp 模擬器在呼叫 erlang:system_info(system_version) 時顯示正確的 dirty 排程器數量。

    自身 ID:OTP-12295

  • nif_version 新增至 erlang:system_info/1,以便取得執行時系統的 NIF API 版本,方式與 driver_version 類似。

    自身 ID:OTP-12298

  • 修復可能導致將零元數 dirty 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

  • 實作將訊號傳送到埠的 VM 程式碼中的錯誤可能會導致接收埠佇列永遠保持忙碌狀態。當達到此狀態時,向埠傳送命令訊號的處理序會永遠暫停,或者,如果使用了 nosuspend 功能,則總是無法傳送到埠。此錯誤是在 ERTS 版本 5.10 中引入的。

    為了在埠上觸發此錯誤,必須至少一次在將訊號傳送到埠時使用 nosuspend 功能。方法是呼叫

    感謝 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/2runnable_procs 和/或 runnable_ports 上進行分析時,可能會以錯亂的順序傳送分析訊息。此錯誤是在 ERTS 版本 5.10 中引入的。

    自有 ID:OTP-12105 輔助 ID:OTP-10336

  • 各種記錄修復,包括:將執行佇列索引新增至損毀傾印中的處理序傾印。
    當損毀時,將執行緒索引新增至記憶體不足標語。
    移除將訊息傳送到相同節點的舊執行個體的錯誤記錄器訊息。

    自有 ID:OTP-12115

  • 修復 LLVM 回報的編譯器警告

    自有 ID:OTP-12138

  • 更正 list_to_integer/1binary_to_integer/1MIN_SMALL 的轉換。此錯誤產生了未標準化的大數字,這可能會導致奇怪的行為,例如與正確的 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

改進和新功能

  • 將 log2 長條圖新增至 lcnt,以取得鎖定等待時間

    自有 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/1erlang:list_to_bitstr/1。它們是錯誤新增的,且在呼叫時總是會引發 undefined 例外狀況。

    自有 ID:OTP-11942

  • 修復了在 Windows 上使用 mingw-w64 進行的編譯。

    感謝 Jani Hakala。

    自有 ID:OTP-11945

  • 當從已標記的 git 版本建置 erlang 時,不再在 shell 啟動標頭中列印 git sha。

    自有 ID:OTP-11961

  • 修復了當向已註冊的處理序完成傳送時,錯誤地捨棄了 send 追蹤事件的錯誤。此錯誤是在 R16B 中引入的。

    自有 ID:OTP-11968

改進和新功能

  • 現在,以下原生函式會在還原次數不足時,適當地增加還原次數並讓出資源

    特性影響

    • 效能 - 從清單轉換的函式對於非常小的清單效能有所損失,而對於非常大的清單效能有所提升。

    • 優先順序 - 之前,執行這些函式之一的處理序實際上會獲得不公平的優先順序提升。這種優先順序提升取決於輸入大小。輸入越大,優先順序提升就越大。現在失去了這種不公平的優先順序提升。

    自有 ID:OTP-11888

  • epmd 的 systemd 功能預設已從 epmd 中移除。若要啟用它們,您必須使用組態選項 --enable-systemd 建置 erlang。

    自有 ID:OTP-11921

  • 已移除在呼叫 binary_to_term/1binary_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 位元模擬器中,在 [-2147483648,-1] 和 [256,2147483647] 區間內的整數,於 binary_to_term(和遠端訊息接收)中過度估計的堆積空間。

    自身 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

  • 修正了當 Socket 處於被動模式時,sendfile 對於遠端關閉的 Socket 會回傳錯誤程式碼的錯誤。(感謝 Vincent Siliakus 回報此錯誤。)

    自身 ID:OTP-11614

  • 增加垃圾回收的任期率

    垃圾回收器會在次要 gc 期間嘗試維持先前的堆積區塊大小,也就是說,在決定新堆積的大小時不會使用 'need',而是依賴於任期和足夠大的垃圾。

    在堆積上持續增長且僅有活動資料的情況下,加上延遲的任期,在次要 gc 後會立即觸發完整掃描,以便為 'need' 騰出空間,因為新的堆積將會填滿。

    為了補救此問題,次要堆積上的 term 任期將始終發生(如果它低於高水位線),而不是每隔一次次要 gc。

    特性影響:減少垃圾回收中消耗的 CPU 時間,但也可能會延遲從堆積中收集垃圾。若有需要,請調整 'fullsweep_after' 選項以增加 gc 壓力。

    自身 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

改進和新功能

  • 已將設定 match_limit 和 match_limit_recursion 的選項新增至 re:run。同時新增了 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 (widestring)。

    自身 ID:OTP-11135

  • Erlang 的 re 模組使用的 PCRE 程式庫版本從 7.6 提升到 8.33。這意味著,除其他外,更好的 Unicode 和 Unicode 字元屬性支援。同時將與 PCRE 8.33 連接的新選項新增至 re 模組(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 nifs 和驅動程式的 asn1 和 crypto nifs 進行靜態連結。如需更多詳細資訊,請參閱系統文件中的安裝指南。

    自身 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} Socket 選項,其中 N 是 -32768..32767 範圍內的整數,允許呼叫者指定要傳遞到控制流程的資料訊息數量。一旦 Socket 的傳遞訊息計數達到 0,或者透過 inet:setopts/2 明確設定為 0,或是在建立 Socket 時包含 {active,0} 作為選項,Socket 就會轉換為被動模式 ({active, false}),並且 Socket 的控制流程會收到一則訊息通知它此轉換。TCP Socket 接收 {tcp_passive,Socket}、UDP Socket 接收 {udp_passive,Socket},而 SCTP Socket 接收 {sctp_passive,Socket}。

    Socket 的傳遞訊息計數預設為 0,但可以使用 {active,N} 透過任何將 Socket 選項作為引數的 gen_tcp、gen_udp 或 gen_sctp 函式,或透過 inet:setopts/2 來設定。新的 N 值會新增至 Socket 的目前計數器值,並且可以使用負數來減少計數器值。如果指定的數字會導致 Socket 的計數器值超過 32767,則會導致 einval 錯誤。如果指定的負數會使計數器值變成負數,則 Socket 的計數器值會設定為 0,並且 Socket 會轉換為被動模式。如果計數器值已經是 0,並且指定了 inet:setopts(Socket, [{active,0}]),則計數器值將保持為 0,但會為 Socket 產生適當的被動模式轉換訊息。

    感謝 Steve Vinoski

    自身 ID:OTP-11368

  • 已引入一個新的選用排程器利用率平衡機制。如需更多資訊,請參閱 +sub 命令列引數。

    特性影響:未啟用時無。啟用時,系統中的計時會發生變化,通常會因為測量利用率和計算平衡資訊而產生少量額外負擔。在某些系統上,例如舊的 Windows 系統,額外負擔可能會相當大。此時間測量額外負擔高度取決於作業系統提供的基礎基元。

    自身 ID:OTP-11385

  • 呼叫 garbage_collect/1 BIF 或 check_process_code/2 BIF 可能會觸發另一個程序(而非呼叫 BIF 的程序)的垃圾回收。先前的實作在執行這類垃圾回收時,不會考慮到被回收程序的內部狀態。為了能更輕鬆且有效率地實作產生原生程式碼,這些類型的垃圾回收已被重寫。現在,這類垃圾回收是由非同步請求訊號觸發,實際的垃圾回收由被回收的程序自行執行,並由發出請求的程序的回覆訊號完成。使用這種方法,程序可以停用垃圾回收並產生,而不必將堆積設定為可以進行垃圾回收的狀態。

    已引入 garbage_collect/2check_process_code/3 BIF。兩者都將選項列表作為最後一個引數。使用這些 BIF,可以發出非同步請求。

    code:purge/1code:soft_purge/1 已被重寫為利用非同步 check_process_code 請求以實現工作平行化。

    特性影響:呼叫 garbage_collect/1 BIF 或 check_process_code/2 BIF 通常需要較長的時間才能完成,但整個系統受此操作的負面影響不會像以前那麼大。呼叫 code:purge/1code: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 現在會消耗適量的歸約,並且如果詞彙很大,則會中斷(產生)以重新排程。這可避免在使用 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 時,可改善系統回應能力,而不會顯著降低單執行緒效能。

    自身 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 選項的 3 個元素的元組,以建置 zip 檔案。

    感謝 Pierre Fenoll

    自身 ID:OTP-11827

  • 為 epmd 新增 systemd Socket 啟動。

    感謝 Matwey V. Kornilov

    自身 ID:OTP-11829

Erts 5.10.4.1

已知錯誤和問題

  • 當使用 gen_tcp:connect 和 fd 選項與 port 和/或 ip 時,portip 選項會被忽略。這已修正,因此如果 port 和/或 ipfd 一起指定,則會要求繫結該 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 時,排程器執行緒以外的執行緒可能會進行執行緒不安全的存取。這可能會導致虛擬機器內部狀態損毀。

    此錯誤是在 erts-5.10.2 中引入的,當時引入了記憶體載體遷移支援。

    自有 ID:OTP-11456 輔助 ID:OTP-10279

  • 修復 binary_to_term 中位元字串無效和大二進位檔案 (>2Gb) 的錯誤。

    自有 ID:OTP-11479

  • 在罕見的情況下,呼叫 inet:close/1gen_tcp:close/1gen_udp:close/1gen_sctp:close/1 的程序可能會無限期地掛起。

    自有 ID:OTP-11491

  • 修復可能導致 32 位元模擬器在啟動時(自 R16B01 起)總是崩潰的錯誤,具體取決於 beam 可執行檔中靜態資料的對齊方式。

    自有 ID:OTP-11496

  • 修復有關位元字串比較的良性錯誤。僅對除錯和 valgrind 虛擬機器造成困擾。

    自有 ID:OTP-11501

  • 消除警告(感謝 Anthony Ramine)

    自有 ID:OTP-11517

  • 模擬器 (beam) 的預設字組大小現在由 Mac OSX (Darwin) 上的編譯器預設值決定。先前,除非另有指定,否則此值會由設定腳本強制設為 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,它會刪除環境變數。感謝 Martin Hässler。

    自有 ID:OTP-11446

  • 針對來自埠的結束訊號引入了新的保證

    如果呼叫以下列出的其中一個同步埠 BIF 的程序與第一個引數所識別的埠連結,且該埠在傳送埠操作結果之前結束,則由於此連結發出的結束訊號會在 BIF 傳回之前被程序接收,或者因為埠未開啟而失敗並出現例外狀況。

    同步埠 BIF 為

    請注意,某些埠在某些情況下會在結束前與呼叫程序取消連結,即即使程序本身與該埠連結,也可能沒有觸發結束訊號的連結。

    特性影響:如果埠同時因為與未完成的同步埠 BIF 呼叫無關的某些問題而結束,則同步埠 BIF 的傳回或例外狀況將會延遲。在所有其他情況下,特性都保持不變。

    自有 ID:OTP-11489

Erts 5.10.3.1

改進和新功能

  • 如果 mseg_alloc 無法建立更多載體,則記憶體配置器將能夠在具有 posix_memalign() 支援的系統上建立 sys_alloc 載體作為後備方案。這與 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 中嚴重的競爭錯誤,該錯誤可能導致在具有至少兩個排程器執行緒的 SMP 模擬器上以非常快的速度產生和終止大量程序時產生 PID 混淆。

    自有 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

改進和新功能

  • 有一個新的、有些實驗性的 Socket 選項 'netns',可以在支援它的 Linux 上設定 Socket 的網路命名空間。請參閱文件。

    自有 ID:OTP-11157

  • 新的配置器策略 aoffcbf(位址順序優先擬合載體最佳擬合)。支援載體遷移,但 CPU 效能優於 aoffcaobf

    自有 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 選項需要指定排程器執行緒和線上排程器執行緒的絕對數量。

    為了解決此問題,請將 +SP 選項新增至 erl,與現有的 +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 中的一個錯誤。如果埠擁有者在關閉 Socket 埠時在錯誤的時間被終止,則該埠可能會變成孤立狀態,因此導致埠和 Socket 洩漏。由 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

  • 修正了 type: 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

  • 修正了使用 BEAM 模組時 erl_eval 中的接收支援。感謝 Anthony Ramine。

    自有 ID:OTP-11137

  • 在 Windows 上,erlang:now() 可能會突然跳到未來約 24 天。現在已更正。感謝 Garret Smith 的報告和測試修正。

    自有 ID:OTP-11146

  • erlang:term_to_binary 現在將花費適量的歸約,如果 term 很大,則會中斷 (yield) 以進行重新排程。這避免了在使用 term_to_binary 時過長的排程。

    影響:在大型 term 上執行 term_to_binary 的程式將會更順暢地執行,但重新排程將會影響 BIF 的單一程序效能。當呼叫非常大的 term 時,單執行緒基準測試將會顯示 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

  • 透過使用無鎖實作來最佳化同一 socket 上同時進行的 inet_db 操作。

    對系統特性的影響:效能提升。

    自有 ID:OTP-11074

  • 在 OTP-R16A 中引入的 high_msgq_watermarklow_msgq_watermark inet socket 選項只能在 TCP socket 上設定。這些選項現在是通用的,可以在所有類型的 socket 上設定。

    自有 ID:OTP-11075 輔助 ID:OTP-10336

  • 引入了一種新的、更好的演算法來管理程序和埠表。

    對系統特性的影響

    • 新的演算法確保插入和刪除操作都可以在 O(1) 時間複雜度內完成。先前使用的演算法導致插入或刪除為 O(N)。
    • 新的演算法也將確保 ID 的重複使用頻率低於使用舊演算法時的頻率。
    • 先前使用的演算法確保當比較在同一節點上建立的同類型兩個 ID 時,只要沒有重複使用 ID,則最新建立的 ID 會比較大。由於 ID 可以很快地重複使用,因此從來無法依賴此屬性。由於引入了這種新演算法,即使尚未重複使用任何 ID,此屬性也不成立。這可以被視為不相容。

    由於上述潛在的不相容性,仍有可能在一段時間內啟用舊演算法。命令列引數 +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

改進與新功能

  • 排程器執行緒現在預設會減少因特定清除操作而急於請求喚醒。這也可以使用 +swct erl(1) 的命令列參數來控制。

    自有 ID:OTP-10994

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

  • 修正未辨識的標頭欄位(例如 Sec-Websocket-Version)超過 20 個字元的 {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

  • 修正了程式碼載入期間半字元 VM 上偶爾發生的崩潰。

    自有 ID:OTP-10896

改進與新功能

  • 不再支援元組函式 (在 R15B 中已棄用)。

    * 潛在的不相容性 *

    自有 ID:OTP-10170

  • 新增了四個新的 bifs,erlang:binary_to_integer/1,2erlang:integer_to_binary/1erlang:binary_to_float/1erlang: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()

    提供這些函式是為了更好地支援協作排程、提高系統回應能力,並更容易防止因程序或連接埠獨佔排程器執行緒而導致 VM 的異常行為。當將冗長的工作劃分為多個重複呼叫時,可以使用這些函式,而無需使用執行緒。

    自有 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 的 RAM 時導致問題。(感謝 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 模組時,虛擬機器中的所有其他執行都會暫停,同時在單執行緒模式下執行載入操作。現在,模組的載入不會阻塞虛擬機器。程序可以在整個載入操作期間繼續平行執行不受干擾。載入操作會透過單一不可分割的指令使載入的程式碼以一致的方式對所有程序可見,藉此完成。當在執行中的 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。
    • 透過增加直接呼叫驅動程式回呼的程序的縮減次數來提高回應能力。

    這些變更意味著系統特性的變更。最值得注意的是:

    • 訊號傳遞的順序 - 先前虛擬機器的實作以比語言要求更嚴格的同步方式將訊號從程序傳遞到埠。從 ERTS 5.10 版開始,訊號以真正的非同步方式傳遞。訊號傳遞的順序仍然符合語言的要求,但僅符合要求。也就是說,先前總是按特定順序傳遞的某些訊號序列現在可能會不時以不同的順序傳遞。這可能會導致 Erlang 程式在訊號傳遞順序上做出錯誤假設而失敗,即使它們先前成功執行。有關訊號順序保證的詳細資訊,請參閱 ERTS 使用者指南中關於通訊的章節。當嘗試尋找因這些變更而暴露的 Erlang 程式碼中的訊號順序錯誤時,erl(1)+n 命令列旗標可能會有所幫助。

    • 從程序傳送到埠的訊號延遲 - 先前,從程序傳送到埠的訊號總是立即傳遞。這將此類通訊的延遲保持在最低限度,但可能會導致鎖定爭用,這對整個系統來說非常昂貴。為了將此延遲在未來也保持在較低水平,只要沒有發生衝突,預設情況下大多數從程序傳送到埠的訊號仍然會立即傳遞。此類衝突包括無法取得埠鎖,但也包括其他衝突。當發生衝突時,將排程訊號以便稍後傳遞。排程的訊號傳遞可能會導致此特定通訊的延遲更高,但由於減少了排程器之間的鎖定爭用,因此提高了系統的整體效能。預設行為是在發生衝突時才排程這些訊號的傳遞,可以透過將 +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 時,錯誤的參數可能會導致虛擬機器崩潰。此問題現已修正。

    自身 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。可以使用 erl(1)+P 命令列旗標變更此值。請注意,現在傳遞的值會被視為提示,並且在大多數情況下選擇的實際值將是 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 命令列參數設定。

    這個預設值的變更將減少在使用 read_concurrency 選項的 ETS 表格上的鎖爭用,但當排程器和邏輯處理器的數量介於 8 和 64 之間時,會增加記憶體消耗。如需更多資訊,請參閱 erl+rg 命令列參數的說明文件。

    專案編號:OTP-10737

  • 新的 BIF float_to_list/2 解決了 float_to_list/1 在格式化浮點數時不允許指定小數點後位數的問題。(感謝 Serge Aleynikov)。

    專案編號:OTP-10752

  • 在外部格式和虛擬機器的內部表示中,有限度地支援 Unicode 原子。這是一個準備性的功能,目的是為了支援與未來可能建立 Unicode 原子的 Erlang/OTP 版本進行通訊。

    專案編號:OTP-10753

  • 提高了 ETS 中 write_concurrency 選項的潛在並發性。內部表格鎖的數量已從 16 增加到 64。這使得兩個並發程序寫入同一個表格時發生衝突並因此序列化的可能性降低了四倍。代價是使用 write_concurrency 的表格增加了固定的記憶體佔用量。每個插入記錄的記憶體消耗不受影響。如果 write_concurrencyread_concurrency 結合使用,則增加的佔用量可能會特別大。

    專案編號:OTP-10787

Erts 5.9.3.1

已知錯誤和問題

  • 如果不存在 heart 且未設定 ERL_CRASH_DUMP_SECONDS,則建立 erl_crash.dump(行為已變更)。

    如果存在 heart 且未設定 ERL_CRASH_DUMP_SECONDS,則不建立 erl_crash.dump(行為未變更)。

    這將行為改回 R15B02 的預設值,考量到是否有一個沒有 heart 的 beam 正在執行。

    專案編號:OTP-10602

Erts 5.9.3

已修正的錯誤和故障

  • 修正 OpenBSD 中的連結。(感謝 Matthew Dempsky)

    專案編號:OTP-10395

  • 修正了導致即使偵測到健康的 gcc 原子或 libatomic_ops 也會使用回退原子的錯誤。

    專案編號: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 的錯誤。

    專案編號:OTP-10481

  • 在表達式 <<Bin/binary,...>> 中,如果 Bin 是大小不是 8 的倍數的位元字串,則不會產生例外,或產生不正確的例外。(感謝 Adam Rutkowski 回報此錯誤。)

    專案編號: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

  • 在非常罕見的情況下,如果在執行附加位元語法指令時呼叫了垃圾收集器,則虛擬機器可能會崩潰。症狀是在 erts_bs_append 函數中重新配置記憶體時出現核心轉儲。現在已修正垃圾收集器的錯誤。

    專案編號: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

已修正的錯誤和故障

  • 修正在處理主要封存檔時發生的 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

  • 修正:新增主動一次和主動真值,而不僅是主動假值的埠 I/O 統計資料。

    專案編號:OTP-10073

  • 64 位元 Windows 安裝程式未在正確的目錄中尋找 64 位元版本的 Microsoft Visual C++ 2010 Redistibutable Package,因此如果安裝了 32 位元版本但沒有安裝 64 位元版本,反之亦然,則會對是否需要安裝 Redistibutable Package 做出錯誤的決定。此錯誤現在已修正。此外,如果 erlang 安裝程式處於靜默模式,則用於 Redistibutable Package 的子安裝程式現在也會在靜默模式下執行。

    專案編號:OTP-10096

  • 當啟動安裝在路徑中帶有空格的位置的分散式 erlang 節點時,epmd 將無法自動啟動。

    專案編號:OTP-10106

  • 一個或多或少無害的錯誤,有時會導致記憶體釋放被延遲的時間比預期的長,現已修正。

    專案編號:OTP-10116

  • 修正了在 ARM 上執行 HiPE 時導致模擬器崩潰的錯誤。此錯誤自 R15B 起就存在。

    專案編號:OTP-10137

  • 修正了 C 函數原型中關於空格的錯誤。(感謝 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

  • 在 Windows 上,werl 視窗的插入符號在重新取得焦點後可能會出現在錯誤的位置。現在已修正。

    專屬 ID:OTP-10181

  • 修正某些情況下,使用 compressed 選項的 ETS 表格中可能會產生損壞的二進位資料的錯誤。

    專屬 ID:OTP-10182

  • 修正使用「聰明」的 mktime

    Commit 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 在我受 RSI 傷害的手指無法動彈時提供協助。(注意: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 函式,因為我們使用它來尋找 bind 的位址,以能夠混合 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 現在將呼叫停止動作,而不是忽略事件。同樣地,Erlang 模擬器(及其 po 驅動程式)在主控台控制處理常式中接收到 CTRL_SHUTDOWN_EVENT 事件時,不得退出。感謝 Jan Kloetzke。

    專屬 ID:OTP-10228

  • 修正檔案重新命名作業中的 dtrace 錯誤。

    專屬 ID:OTP-10234

  • 修正驅動程式埠資料鎖定 (PDL) 的記憶體管理中的錯誤。在某些情況下,PDL 可以在 ready_asyncasync_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 可能會在約 298 到 497 天(取決於核心設定)後觸發,即使 Erlang 執行良好。這是由於 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

  • 修正在 64 位元電腦上,ETS 使用 compressed 選項,並插入包含大型整數 (>2G) 的詞彙時的錯誤。已觀察到會導致模擬器崩潰。(感謝 Diego Llarrull 的出色錯誤報告)

    專屬 ID:OTP-9932

  • 處理 /sys/devices/system/node 僅能由 root 讀取的 Linux OS。回退到 /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 甚至不會等待擱置中的非同步執行緒作業。

    若要大致達到舊行為,在您退出模擬器時不等待埠和非同步執行緒作業,您可以使用 erlang:halt/2,第一個引數為整數,第二個引數為包含 {flush,false} 的選項清單。請注意,現在的刷新與退出程式碼無關,而且您不能只刷新我們認為無論如何都是奇怪行為的非同步執行緒作業。

    此外,erlang:halt/1,2 還有了一個新功能:如果第一個引數是原子 'abort',則模擬器會中止並產生核心傾印(如果作業系統允許)。

    專屬 ID:OTP-9985

  • 在 inet 驅動程式中新增檢查,以避免在尚未具有 IPv6 相容的 Socket 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 利用率對於實際排程器/VM 的使用情況的指示非常差。

    內部 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 socket 和 erlang:decode_packet 的 http 封包解析,遵守 packet_size 選項。這提供了接受大於預設設定的 HTTP 標頭的能力,而且透過只接受您希望允許的長度來避免 DoS 攻擊。為了保持一致性,封包類型 line 也遵守 packet_size 選項。(感謝 Steve Vinoski)

    內部 ID:OTP-9389

  • 已修正 lists 模組中的一些合約。

    內部 ID:OTP-9616

  • Unicode 非字元碼點 16#FFFE 和 16#FFFF 不允許使用 unicode 模組或位元語法進行編碼或解碼。這與其他非字元 16#FDD0 到 16#FDEF 可以編碼/解碼的情況不一致。為了解決不一致性,現在可以對 16#FFFE 和 16#FFFF 進行編碼和解碼。(感謝 Alisdair Sullivan。)

    * 潛在的不相容性 *

    內部 ID:OTP-9624

  • 在包含另一個檔案時,使 epp 優先搜尋目前檔案的目錄。這完成了 R11 中僅適用於 include_lib() 的部分修正。(感謝 Richard Carlsson)

    內部 ID:OTP-9645

  • 修正當應用於獨立於程序的環境時,enif_inspect_io_list_as_binary 中的記憶體洩漏問題。

    內部 ID:OTP-9668

  • 程式碼中允許的 beam catch 數量不再是靜態定義的,而是會根據其需求成長。

    內部 ID:OTP-9692

  • 在 heart 文件中新增遺失的括號。

    在參考手冊的 distributed 區段中新增遺失的空格。

    在文件的 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/2file:read_link_info/2file: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,並建立了一個現在也支援的一對一 socket

    * 潛在的不相容性 *

    內部 ID:OTP-9239

  • Sendfile 已新增至檔案模組的 API。如果該作業系統可用,則 sendfile/2 用於從檔案讀取資料,並使用零複製機制將其傳送至 tcp socket。

    感謝 Tuncer Ayaz 和 Steve Vinovski 的原始實作

    內部 ID:OTP-9240

  • nif API 中新增了 enif_get_reverse_list 函式。此函式應用於反轉其他結構深處的小型列表,以使其在 Erlang 中進行反轉變得不切實際。

    內部 ID:OTP-9392

  • 已移除已棄用的 concat_binary/1 BIF。請改用 list_to_binaryiolist_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

    此函式可輕鬆判斷一個 term 是否代表數字(整數、浮點數、small 或 big)。(感謝 Filipe David Manana)

    內部 ID:OTP-9629

  • ERTS 內部系統封鎖功能已替換為用於封鎖系統的新功能。舊的系統封鎖功能存在爭用問題和複雜性問題。新功能建立在執行階段系統中新引入的無鎖同步所需的執行緒進度追蹤功能之上。當未使用封鎖系統的功能時,幾乎沒有任何額外負荷。因為追蹤執行緒進度的功能無論如何都存在且需要。

    內部 ID:OTP-9631

  • 已引入 ERTS 內部的、通用的、多對一、用於執行緒之間通訊的無鎖佇列。多對一的情境在 ERTS 中非常常見,因此將來可以在許多地方使用。目前,它用於排程某些工作和非同步執行緒集區,但未來計畫有更多用途。

    使用 driver_async 功能的驅動程式不再自動鎖定到系統,並且可以像任何動態連結的驅動程式一樣卸載。

    準備好的非同步工作的排程現在也穿插在其他工作之間。先前,所有準備好的非同步工作都會一次執行。

    內部 ID:OTP-9632

  • 元組函式 (包含模組名稱和函式的雙元素元組) 現在已正式棄用,並將在 R16 中移除。請改用 'fun M:F/A'。為了讓您知道您的系統使用了元組函式,當第一次應用元組函式時,將會傳送警告到錯誤記錄器。

    自有編號:OTP-9649

  • 變更了內部 BIF 呼叫慣例。將使程式碼更簡單、速度更快,並允許任意數量的 BIF。

    自有編號:OTP-9662

  • Windows 原生重要區段現在在 Windows 的執行時系統內部用作互斥鎖的實作。這是因為它們在極端競爭下比我們自己的實作效能更好。

    自有編號:OTP-9671

  • 將一些 erl_nif 巨集轉換為內聯函式。允許更好的編譯時類型檢查。(感謝 Tuncer Ayaz)

    自有編號:OTP-9675

  • 已新增 +scl 命令列旗標。它可用於停用排程器負載的壓縮。如需更多資訊,請參閱 erl 文件。

    自有編號:OTP-9695

  • 已更新建置系統,以便 Erlang/OTP 可以在沒有 GCC 編譯器的 Mac OS X Lion 系統上建置。已更新 INSTALL 指南,其中包含如何安裝 GCC 編譯器並使用它建置 Erlang/OTP 的說明,以便獲得效能更好的執行時系統。

    自有編號:OTP-9712

  • 載入模組時,系統過去會在整個載入過程中在單一排程器上執行。現在已變更為僅在將載入的程式碼插入系統表格之前關閉系統,如果在忙碌的系統中載入模組,則會縮短中斷時間。(由 Bob Ippolito 建議。)

    自有編號:OTP-9720

  • 可以在沒有浮點數例外 (FPE) 的情況下執行 HiPE。在缺少可靠 FPE 的平台上很有用。與使用 FPE 的 HiPE 相比,浮點數運算速度較慢。

    自有編號:OTP-9724

  • 從 ERTS 版本 5.9 (OTP-R15B) 開始,執行時系統預設會將排程器繫結到邏輯處理器。

    如果 Erlang 執行時系統是唯一將執行緒繫結到邏輯處理器的作業系統程序,則會提高執行時系統的效能。但是,如果其他作業系統程序 (例如另一個 Erlang 執行時系統) 也將執行緒繫結到邏輯處理器,則反而可能會造成效能損失。在某些情況下,這種效能損失可能很嚴重。因此,我們變更預設值,讓使用者必須做出主動決定才能繫結排程器。

    * 潛在的不相容性 *

    自有編號:OTP-9726

  • 使用 erlang:system_flag(scheduler_bind_type, _)erlang:system_flag(cpu_topology, _) 已被棄用,並計劃在 erts-5.10/OTP-R16 中移除。如需更多資訊,請參閱 erlang:system_flag/2 的文件。

    * 潛在的不相容性 *

    自有編號:OTP-9749

  • 已從 open_port 程式碼中移除針對 Windows 錯誤的舊有解決方法,open_port({spawn,...}...) 現在速度更快。感謝 Daniel Goertzen。

    自有編號:OTP-9766

  • 已移除在 32 位元 Windows 上使用已棄用的 32 位元 time_t。

    自有編號:OTP-9767

  • NIF reload 機制已棄用。請勿將其用作線上生產系統的升級方法。它可能會在未來的版本中移除。它仍然可以用作開發功能,但每次使用時都會記錄警告訊息。

    * 潛在的不相容性 *

    自有編號:OTP-9771

  • 已變更驅動程式介面以啟用 64 位元驅動程式。最重要的是,ErlDrvEntry 回呼 'call' 和 'control' 的傳回類型已擴大,這需要變更驅動程式,否則它們將導致模擬器當機。請參閱驅動程式手冊中的 64 位元驅動程式介面的重寫

    由於這個原因,驅動程式版本管理現在是強制性的。未撰寫版本管理或使用錯誤的主要版本編譯的驅動程式將不會由模擬器載入。

    * 潛在的不相容性 *

    自有編號:OTP-9795

  • 消除使用已棄用的 regexp 模組

    自有編號:OTP-9810

Erts 5.8.5

已修正的錯誤和故障

  • 已修正多個關於常數二進位結構的錯誤,例如 <<0:4294967295>>。根據二進位的實際大小和執行時系統的類型 (32 位元、半字組、64 位元),此類表示式可能會導致執行時系統當機或使載入器拒絕載入模組。

    自有編號:OTP-9284

  • 如果停止服務時未定義 StopAction,Erlsrv 公用程式將無法停止 erlang 機。現在已修正此問題。

    自有編號:OTP-9344

  • 由於 glibc 中的錯誤,執行時系統可能會在嘗試銷毀互斥鎖時中止。R14B02 中引入了此問題的修復程式。但是,此修復程式並未解決此問題。執行時系統現在將發出警告,而不是中止。

    自有編號:OTP-9373 輔助編號:OTP-9009

  • 將 prim_file 中 DRV 巨集中的原子取代為字串

    Dialyzer 的實驗版本發現,在 prim_file 中取代 DRV 巨體的原子會作為 Driver 引數出現在對 erlang:open_port({spawn, Driver}, Portopts) 的呼叫中。文件指出此呼叫需要一個字串。

    此變更也與 Kostis Sagonas 在 commit 0f03b1e9d2bef3bc830c31a369261af4c5234727 中引入的變更一致。

    自有編號:OTP-9377

  • 修正 epmd 文件中的錯字 (感謝 Holger Weiß)

    自有編號:OTP-9387

  • 修正半字組模擬器上由 NIF API 從 64 位元整數建立的錯誤整數項。(感謝 Paolo Negri 和 Paul Davis)

    自有編號:OTP-9394

  • 修正由於對 select() 系統呼叫的錯誤引數而導致的 vxworks 上的 epmd 當機。

    自有編號:OTP-9427 輔助編號:seq11855

  • ets:test_ms 函式在極少數情況下可能會截斷錯誤訊息。現在已修正此問題。

    自有編號:OTP-9435

  • 修正與 hibernate 和 HiPE 相關的錯誤 (清除 F_HIBERNATE_SCHED 旗標)

    在 hipe_mode_switch 中也必須清除在 b7ecdcd1ae9e11b8f75e 中引入的 F_HIBERNATE_SCHED 旗標。否則,執行 hibernate 的 HiPE 程式碼、喚醒然後陷入 BIF 的程序將不會重新排程。(感謝 Paul Guyot)

    自有編號:OTP-9452

  • 修正 FreeBSD 拓撲偵測程式碼中的錯誤 (感謝 Paul Guyot)

    自有編號:OTP-9453

  • 修正將邏輯運算子 && 與常數運算元一起使用,而不是位元運算子 & (感謝 Cristian Greco)

    自有編號:OTP-9454

  • inet:如果 fd 與 socket 網域不符,則會發生錯誤

    如果將 IPv4 fd 開啟為 IPv6 socket,則可能會發生意外行為。例如,如果開啟 IPv4 UDP socket 並將其作為 IPv6 socket 傳遞到 Erlang,則會從有效負載中移除前 3 個位元組 (對應於 1 個位元組表示協定系列,2 個位元組設定為埠)。UDP 有效負載截斷的原因發生在 inet_drv.c:packet_inet_input 中,當對 inet_get_address 的呼叫因為系列設定為 PF_INET6 但緩衝區長度為 IPv4 struct sockaddr_in 的大小而靜默失敗時。

    (感謝 Andrew Tunnell-Jones 發現錯誤和測試案例!)

    自有編號:OTP-9455

  • erts:使用 union 以避免嚴格別名問題

    使用 union 進行指標類型轉換,以避免編譯器發出關於使用 gcc-4.1 時嚴格別名違規的警告。gcc >= 4.2 不會發出警告。erts:使 matrix_nif 適應 R14 erl_nif API 變更 (感謝 Tuncer Ayaz)

    自有編號:OTP-9487

  • 修正垃圾回收中的 64 位元問題 (感謝 Richard Carlsson)

    自有編號:OTP-9488

  • epmd:修正編譯器警告

    抑制關於忽略傳回值的編譯器警告。(感謝 Michael Santos )

    自有編號:OTP-9500

  • 修正分散式參考手冊中不存在的函式 (erlang:disconnect/1) (感謝 Fabian Król)

    自有編號:OTP-9504

  • 記錄 fdatasync -lrt 要求 (SunOS <= 5.10) (感謝 Tuncer Ayaz)

    自有編號: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ß)

    自有編號:OTP-9525

  • 移除 erl_compile 中的無效程式碼 (感謝 Tuncer Ayaz)

    自有編號:OTP-9527

  • 新增 erlang:external_size/2 BIF

    此 BIF 的第二個參數是選項清單。目前唯一允許的選項是 {minor_version, Version},其中 version 為 0 (預設值) 或 1。(感謝 Filipe David Manana )

    自有編號:OTP-9528

  • 修正 64 位元機器上的 enif_compare

    在 64 位元機器中,Sint 類型的大小為 8 個位元組,而在 32 位元機器中,其大小為 4 個位元組。enif_compare 忽略了這一點,因此當 CMP 函式 (傳回 Sint 值) 的結果不符合 4 個位元組時,會傳回不正確的值。(感謝 Filipe David Manana)

    自有編號:OTP-9533

  • 實作或修正 -Werror 選項

    如果啟用 -Werror 且有警告,則不會寫入輸出檔。此外,請確保錯誤/警告報告一致。(感謝 Tuncer Ayaz)

    自有編號:OTP-9536

  • 在某些極少數情況下,我們在排程雜項操作時沒有執行佇列。現在已修正此問題。

    自有編號:OTP-9537

  • 移除雜項編譯器警告

    自有編號:OTP-9542

  • 已修正 gen_sctp 中的兩個錯誤:getopts/setopts,因此 send 也只能從 socket 擁有者呼叫,而選項 'linger'、'rcvbuf' 和 'sndbuf' 是從錯誤的協定層讀取,因此 getopts 會讀取錯誤的值。

    自有編號:OTP-9544

  • Erlang/OTP 現在可以在 MacOS X Lion 上建置。

    自有編號:OTP-9547

  • 已修正 XML 檔案。

    自有編號:OTP-9550 輔助編號:OTP-9541

  • 修正受執行 cppcheck(1) 啟發的潛在錯誤 (感謝 Christian von Roques)

    自有編號:OTP-9557

  • 當在排程器上將輔助工作排入佇列時,可能會遺失排程器為了處理此工作而進行的喚醒。為了處理一般工作而進行的喚醒不受此錯誤影響。此錯誤僅影響具有 SMP 支援的執行時系統,如下所示

    • 某些 ETS 資料結構的解除配置可能會延遲。
    • 在不使用 NPTL 執行緒程式庫的 Linux 系統 (通常是核心版本早於 2.6 的舊系統) 和 Windows 系統上,來自終止埠程式的 {Port, {exit_status, Status}} 訊息可能會延遲。也就是說,它僅影響已透過將 exit_status 作為選項傳遞到 open_port/2 而啟動的埠程式。

    自有編號:OTP-9567

  • 處理加密金鑰伺服器功能中極少數的競爭

    自有編號:OTP-9586

改進和新功能

  • 已新增類型和規格。

    自有編號: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 會傳回清單而不是 atom。(感謝 Markus Knofe)

    專屬 ID:OTP-9215

  • 修正 epmd 的 dbg_perror() 輸出。

    dbg_perror() 函式現在會將目前的 errno 值傳遞給 dbg_gen_printf()。這修正了在 dbg_gen_printf() 函式中使用 (以列印對應的錯誤訊息) 時,errno 已重設為零的問題。(感謝 Holger Weiß)

    專屬 ID:OTP-9223

  • heart: 移除附加到 heart 命令的垃圾。

    heart:get_cmd/0 文件的說明為,如果命令已清除,則會傳回空字串。get_cmd/0 會傳回 2 個額外的位元組:1 個位元組用於尾隨 null,1 個位元組來自 op (op 是 unsigned char,在傳回的緩衝區中為其配置 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

  • 驅動程式名稱應為字串,而不是 atom。

    專屬 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 表格的固定可能會進入內部不一致的狀態。

    專屬 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_deleteordered_set 的半字組模擬器錯誤,該錯誤導致模擬器崩潰。

    專屬 ID:OTP-9258 輔助 ID:seq11836

Erts 5.8.3.1

已修正的錯誤和故障

  • Ets 表格類型 ordered_set 可能在純 64 位元平台上錯誤地排序大型整數金鑰。現在已修正。

    專屬 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 不是整數,表達式 <<A:0>> 也會始終產生空的二進位檔案。已更正為,如果 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

  • 在當機傾印中修正了兩個問題:計時器的剩餘時間現在顯示為無號整數,且不再包含 ordered_set ETS 表格的內容。

    自有 ID:OTP-9057

  • 在某些情況下,虛擬機器可能無法設定 IP_TOS 和 SO_PRIORITY,原因可能是 socket 是以開啟的檔案描述符提供,或是因為 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

  • 修正了一個潛在問題(透過程式碼檢查發現),該問題發生在呼叫程式碼尚未載入的 fun 時。

    自有 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

改進和新功能

  • 從這個版本開始,先前實驗性的半字組模擬器現在正式推出。可以透過將 --enable-halfword-emulator 選項提供給 configure 指令稿來啟用它。

    半字組模擬器是一個 64 位元的應用程式,但對 Erlang 處理程序中的所有資料使用半字組 (32 位元字組),因此使用較少的記憶體且比標準的 64 位元模擬器更快。所有 BEAM 程式碼和所有處理程序資料的總大小限制為 4Gb,但 ETS 表格和堆外二進位檔僅受可用記憶體量的限制。

    自有 ID:OTP-8941

  • 在執行階段系統內部引入了 32 位元的原子記憶體操作,現在在適當的地方使用它們。先前只有可用字組大小的原子記憶體操作。32 位元的原子記憶體操作稍微減少了記憶體消耗,並稍微提高了 64 位元執行階段系統的效能。

    自有 ID:OTP-8974

  • 增強了查詢計時器項目和從輪中移除計時器的效能。

    自有 ID:OTP-8990

  • 已最佳化對 ETS 表格的寫入存取,方法是減少寫入存取期間所需的原子記憶體操作量。

    自有 ID:OTP-9000

  • 虛擬機器中奇怪的 C 程式碼導致 gcc-4.5 的 -D_FORTIFY_SOURCE 選項產生不良反應。現在已清理程式碼,使其可被 gcc-4.5 接受。

    自有 ID:OTP-9025

  • 已稍微減少已載入程式碼的記憶體佔用量(尤其是在 64 位元的 BEAM 機器中)。

    自有 ID:OTP-9030

  • Erlang 函式允許的最大引數數量已從 256 降低到 255,因此現在引數的數量可以放入一個位元組中。

    自有 ID:OTP-9049

  • 已將 Makefiles 的依賴性產生功能新增至編譯器和 erlc。請參閱 compileerlc 的手冊頁面。(感謝 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

  • 由於 CPU 拓撲偵測中的錯誤,Windows 2003 和 Windows XP pre SP3 有時根本無法啟動 Erlang R14B VM。此錯誤僅影響 Windows,沒有其他平台受到影響。現在已修正此錯誤。

    自有 ID:OTP-8876

  • 64 位元模擬器中的 HiPE 執行階段可能會將 64 位元寫入到 32 位元的結構欄位。它碰巧在 Intel/AMD 處理器上無害。已修正。(感謝 Mikael Pettersson。)

    自有 ID:OTP-8877

  • erl_drv_tsd_get()enif_tsd_get() 中的錯誤可能會導致模擬器崩潰。這些函式目前未在 OTP 中使用。也就是說,崩潰只會發生在使用使用者實作的 NIF 函式庫或使用這些函式之一的驅動程式的系統上。

    自有 ID:OTP-8889

  • 使用與已記錄的原子 defineddetectedused 不同的 CpuTopologyType 元素呼叫 erlang:system_info({cpu_topology, CpuTopologyType}) 會導致模擬器崩潰。(感謝 Paul Guyot)

    自有 ID:OTP-8914

  • ERTS 內部 rwlock 實作可能會進入不一致的狀態。此錯誤很少被觸發,但在嚴重的競爭期間可能會被觸發。此錯誤是在 R14B (erts-5.8.1) 中引入的。

    當在 ETS 表格上使用 read_concurrency 選項時,最有可能觸發此錯誤,該表格經常被多個執行大量寫入和讀取的處理程序存取。也就是說,在您通常不希望首先使用 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

  • 已為支援 IPv6 位址的 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 的章節。另請參閱檔案模組手冊頁面。

    * 潛在的不相容性 *

    自有 ID:OTP-8887

  • 已防止 erlcdialyzertyperrun_testheartescripterlexec 中發生緩衝區溢位。

    (感謝 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/1code 中其他函式的 on_load 處理常式會導致系統掛起。由於 crypto 應用程式現在包含一個呼叫 code:priv_dir/1 的 on_loader 處理常式,因此在啟動檔中包含 crypto 應用程式會導致系統無法啟動。

    此外,擴充了 -init_debug 選項,以列印關於正在執行的 on_load 處理常式的資訊,以方便偵錯。

    自有 ID:OTP-8902,輔助 ID:seq11703

Erts 5.8.1.1

已修正的錯誤與故障

  • 由於 CPU 拓撲偵測中的錯誤,Windows 2003 和 Windows XP pre SP3 有時根本無法啟動 Erlang R14B VM。此錯誤僅影響 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 socket 會回傳 {error,einval}。inet_drv 在檢查選項大小時有錯誤。

    自有 ID:OTP-8726,輔助 ID:seq11617

  • 修正 libm 與 --as-needed 旗標的連結問題

    在 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() returned misaligned address 0x8016a512c」的訊息。已修正。(感謝 Mikael Pettersson。)

    自有 ID:OTP-8769

  • erts_poll() 中的競爭條件可能會導致 I/O 輪詢延遲。

    自有 ID:OTP-8773

  • 從 Erlang Port Mapper Daemon (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 封包模式中的 socket,如果標頭中發生錯誤,則來自 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 實作可以在啟動執行階段系統時進行微調。如需更多資訊,請參閱 +rg erl 命令列引數的文件。

    還有一個新的 rwlock 實作,它並未針對讀者進行優化。兩種實作都會在競爭期間交錯讀者和寫入者,而不是使用讀者或寫入者優先策略,例如 NPTL (Linux) pthread rwlock 實作。讀取者/寫入者優先策略會造成問題,因為它會使執行非優先操作的執行緒處於飢餓狀態。

    在 ERTS 中,新的 rwlock 實作通常比常見的 pthread 實作執行得更好。然而,在某些競爭極其激烈的情況下,情況並非如此。這種激烈的競爭或多或少只會出現在 ETS 表格上。當多個程序同時在同一個表格上執行大量寫入鎖定操作時會發生這種情況。無論 rwlock 實作如何,這種 ETS 使用方式都很糟糕,永遠無法擴展,而且我們強烈建議不要這樣做。

    新的 rwlock 實作取決於原子操作。如果找不到原生原子實作,將使用備用解決方案。使用備用解決方案意味著效能會下降。也就是說,現在比以前更重要的是使用原生原子實作來建置 OTP。

    ethread 程式庫包含 x86(32 位元和 64 位元)、powerpc(32 位元)、sparc V9(32 位元和 64 位元)和 tilera(32 位元)的原生原子實作。在其他硬體上,如果存在 gcc 的內建原子記憶體存取支援,則會使用它。如果找不到此類支援,configure 將會警告沒有可用的原子實作。

    ethread 程式庫現在也可以使用 libatomic_ops 程式庫進行原子記憶體存取。這使得 Erlang 執行階段系統可以在比以前更多的平台上利用最佳化的原生原子操作。如果 configure 警告沒有可用的原子實作,請嘗試使用 libatomic_ops 程式庫。請在使用 --with-libatomic_ops=PATH configure 命令列引數時,指定 libatomic_ops 安裝所在的位置。libatomic_ops 程式庫可以從以下網址下載:http://www.hpl.hp.com/research/linux/atomic_ops/

    ethread 程式庫的 API 已變更,也導致 Erlang 執行階段系統進行了修改。由於它取決於 ethread 程式庫,因此也完成了即將到來的「延遲釋放」功能的準備工作。

    注意:在為 x86 建置時,ethread 程式庫現在將使用首次出現在 pentium 4 處理器上的指令。如果您希望執行階段系統與較舊的處理器(回溯到 486)相容,則需要在設定系統時傳遞 --enable-ethread-pre-pentium4-compatibility configure 命令列引數。

    自有 ID:OTP-8544

  • 當 TZ=UTC 時,erlang:localtime_to_universaltime({{2008, 8, 1}, {0, 0, 0}},true) 現在在所有 Unix 平台上都一致地運作。

    此問題最初由 Paul Guyot 在 erlang-bugs 郵件清單中回報

    https://erlang.dev.org.tw/pipermail/erlang-bugs/2008-November/001077.html

    自有 ID:OTP-8580

  • 優化措施,可將每個 ETS 物件的記憶體消耗量減少兩個字。

    自有 ID:OTP-8737

  • 針對不受支援的半字模擬器進行修正

    自有 ID:OTP-8745

  • NIF 64 位元整數支援:enif_get_int64enif_get_uint64enif_make_int64enif_make_uint64

    自有 ID:OTP-8746

  • 訊息中尾隨資料的對齊方式已調整。這是為了將來能夠傳遞任何類型的資料作為尾隨資料。

    自有 ID:OTP-8754

  • 已移除過時的/driver.h 標頭檔。自 R8B 以來,它已過時且已棄用。仍包含過時的/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

已修復的錯誤和故障

  • 驅動程式執行緒,例如非同步執行緒,在使用 port data locks 時,在查詢驅動程式佇列時,會在沒有適當鎖定的情況下偷看埠狀態欄位。

    自有 ID:OTP-8475

  • 在交叉編譯時,不必要地停用了 mmap() 的使用。

    當交叉編譯時,configure 引數 --with-ssl--with-odbc 無故拒絕接受 $erl_xcomp_sysroot 之外的程式庫。

    configure 引數 --with-odbc 未正確處理值 yes

    configure 引數 --with-odbc--without-odbc 也已新增至 configure 說明。

    (感謝 Steve Vinoski 回報這些問題)

    自有 ID:OTP-8484

  • 當埠在執行時系統中註冊的名稱為 RegName 而沒有 SMP 支援時,呼叫 BIF unregister(RegName) 會導致執行時系統崩潰。(感謝 Per Hedeland 提供錯誤修復和測試案例。)

    自有 ID:OTP-8487

  • 如果找到的邏輯處理器數量少於 sysconf(SC_NPROCESSORS_CONF) 回報的數量,執行時系統會崩潰。

    自有 ID:OTP-8549

  • 修復記憶體管理錯誤,該錯誤會導致啟用非同步執行緒的非 SMP 模擬器崩潰。該錯誤最早出現在 R13B03 中。

    自有 ID:OTP-8591 Aux 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

  • 在 Montavista Linux on Cavium Octeon 處理器的某些組合上,某些與 Socket 相關的系統呼叫會為錯誤傳回 -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) 應該返回 blocked 時,有時會錯誤地返回 enabled

    自有 ID:OTP-8675

  • 修復了導致 erlang:decode_packetenif_make_string 為 ascii 值大於 127 的值產生帶有負字元值的錯誤字串的錯誤。(感謝 Paul Guyot)

    自有 ID:OTP-8685

  • 帶有 spawnspawn_executable 選項的 open_port/2 可以包含 {env,Env} 選項。在某些情況下,在 Unix 上取消設定變數將無法運作(通常如果取消設定的變數多於環境中實際存在的變數)。

    自有 ID:OTP-8701

  • 透過呼叫 erlang:system_flag(cpu_topology, CPUTopology) 設定的使用者定義 CPU 拓撲未經過正確驗證,在最壞的情況下可能導致模擬器崩潰。僅當已存在使用者定義的 CPU 拓撲並重新定義時,才會發生模擬器崩潰。

    自有 ID:OTP-8710

改進和新功能

  • ERTS 使用者指南中針對比對規格的文法僅描述了比對規格的追蹤方言。新增了 ETS 方言的非正式文法。

    自有 ID:OTP-8086 Aux 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/2escript:extract/2

    已移除未記錄的函數 escript:foldl/3。可以使用更具彈性的函數 escript:extract/2zip:foldl/3 來實現相同的功能。

    記錄欄位已使用類型資訊進行註解。原始碼檔案已調整為符合 80 個字元,並且已移除尾隨空白。

    自有 ID:OTP-8521

  • 具有多層括號的正規表示式可能會導致緩衝區溢位。這已得到更正。(感謝 Michael Santos。)

    自有 ID:OTP-8539

  • erlang:decode_packet(httph_bin,..) 可能會傳回損壞的標頭字串,甚至會使 VM 崩潰。這已修復。只有在標頭名稱未知且長度介於 16 到 20 個字元之間時,才會在 32 位元 VM 上發生這種情況。具有類似 packet 選項的 Socket 不會受到此錯誤的影響。

    自有 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

  • 如果找不到 '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 編譯器指示詞的目前程式碼,可能需要變更才能被編譯器接受。

    * 潛在的不相容性 *

    自身 ID:OTP-8579

  • 修正了 re 模組中可能導致某些正規表示式匹配永遠無法終止的錯誤。(感謝 Michael Santos 和 Gordon Guthrie。)

    自身 ID:OTP-8589

  • erlang:open_port 和 spawn_executable 指令可以包含 {env,Env} 指令,為產生的進程設定環境變數。一個錯誤導致應用程式無法使用 {env,Env} 設定值以 '=' (等號)字元結尾的環境變數;尾部的等號被誤認為是要從產生進程的環境中清除該環境變數的指示。(感謝 Steve Vinoski。)

    自身 ID:OTP-8614

  • 現在,只能讀取新建立參考的 receive 語句經過特殊最佳化,使其執行時間為常數時間,不受進程接收佇列中訊息數量的影響。此最佳化將有益於對 gen_server:call() 的呼叫。(請參閱 gen:do_call/4,其中包含一個將被最佳化的 receive 語句範例。)

    自身 ID:OTP-8623

  • 新增了函式 file:advise/4 和 file:datasync/1。(感謝 Filipe David Manana。)

    自身 ID:OTP-8637

  • 新的 NIF API 函式:enif_make_atom_lenenif_make_existing_atom_lenenif_make_string_lenenif_get_atom_lengthenif_get_list_lengthenif_is_listenif_is_tuple (由 Tuncer Ayaz 提供)

    自身 ID:OTP-8640

  • 新增了對使用 gcc 內建函式進行原子記憶體存取的支援。如果可以使用,且 ERTS 中沒有其他原生原子實作可用,將會使用此功能。

    自身 ID:OTP-8659

  • 在沒有原生原子實作可用時,實作原子回退所使用的自旋鎖數量已從 16 個增加到 1024 個。

    自身 ID:OTP-8660

  • 在 Linux 上啟用了寫入器優先的 pthread 讀寫鎖。

    自身 ID:OTP-8661

  • 如果排程器數量至少等於已配置的邏輯處理器數量、支援排程器繫結,且啟動時有可用的 CPU 拓撲,則執行階段系統預設會使用 default_bind 繫結類型將排程器繫結到邏輯處理器。

    注意:如果 Erlang 執行階段系統是唯一將執行緒繫結到邏輯處理器的作業系統進程,這將提高執行階段系統的效能。但是,如果有其他作業系統進程(例如另一個 Erlang 執行階段系統)也將執行緒繫結到邏輯處理器,則可能會產生效能損失。如果發生這種情況,建議您使用 +sbtu 命令列參數,或呼叫 erlang:system_flag(scheduler_bind_type, unbound) 來取消繫結排程器。

    自身 ID: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]}). 來移除警告。

    * 潛在的不相容性 *

    自身 ID:OTP-8669 輔助 ID:OTP-8579

  • file:open/2 有一個新的選項 'exclusive',它會在支援的地方使用 OS O_EXCL 旗標來以獨佔模式開啟檔案。

    自身 ID:OTP-8670

  • 現在,binary_to_term/2 會自動匯入。如果模組具有同名的本機函式,則會導致編譯警告。

    * 潛在的不相容性 *

    自身 ID:OTP-8671

  • 調整了排程器資料和執行佇列的對齊方式。

    自身 ID:OTP-8673

  • 呼叫時間中斷點追蹤

    • erlang:trace_pattern/3 中引入 call_time 選項。此選項啟用對啟用呼叫追蹤的進程所執行的程式碼進行呼叫時間中斷點追蹤。呼叫時間追蹤會儲存啟用此追蹤模式的每個函式的呼叫次數和花費時間。可以使用 erlang:trace_info/2 擷取資訊。
    • 為 BpData 新增排程器陣列。為了解決多個排程器不斷更新 bp 資料輪頭部指標的問題,每個排程器現在都有自己的輪子進入點。可以在不取得鎖定的情況下更新此頭部指標。

    教導呼叫計數追蹤使用原子操作

    • 呼叫計數先前使用全域鎖定來存取和寫入中斷點中的計數器。現在已改為原子操作。
    • 此變更將在增加排程器數量時讓呼叫計數追蹤和 cprof 更好地擴展。

    自身 ID:OTP-8677

  • eprof 已透過在 Erlang 虛擬機器中提供支援來重新實作,現在速度更快(即減慢被測量的程式碼的速度更少),並且擴展性更好。在測量中,我們看到與舊 eprof 相比,速度提高了 6 倍(對於僅使用一個排程器/核心的循序程式碼),最高可達 84 倍(對於使用 8 個核心的並行程式碼)。

    注意:eprof 的 API 已被清除和擴充。請參閱文件。

    * 潛在的不相容性 *

    自身 ID:OTP-8706

Erts 5.7.5.2

已知錯誤和問題

  • 已修正 gen_sctp 中的兩個錯誤:getopts/setopts,因此 send 也只能從 socket 擁有者呼叫,而選項 'linger'、'rcvbuf' 和 'sndbuf' 是從錯誤的協定層讀取,因此 getopts 會讀取錯誤的值。

    自有編號:OTP-9544

Erts 5.7.5.1

已修正的錯誤和故障

  • 驅動程式執行緒,例如非同步執行緒,在使用 port data locks 時,在查詢驅動程式佇列時,會在沒有適當鎖定的情況下偷看埠狀態欄位。

    自有 ID:OTP-8475

  • 當埠在執行時系統中註冊的名稱為 RegName 而沒有 SMP 支援時,呼叫 BIF unregister(RegName) 會導致執行時系統崩潰。(感謝 Per Hedeland 提供錯誤修復和測試案例。)

    自有 ID:OTP-8487

  • 修復記憶體管理錯誤,該錯誤會導致啟用非同步執行緒的非 SMP 模擬器崩潰。該錯誤最早出現在 R13B03 中。

    自有 ID:OTP-8591 Aux ID:seq11554

Erts 5.7.5

已修正的錯誤和故障

  • 修正了 binary_to_term 在壓縮術語中出現損壞大小欄位時發生的崩潰問題。

    自身 ID:OTP-8336

  • 當使用 erlang:system_flag(multi_scheduling, block) 時,進程和/或埠可能會在受阻的排程器上卡住。

    當使用 erlang:system_flag(schedulers_online, SchedulersOnline) 減少上線排程器時,進程和/或埠可能會在離線排程器上卡住。

    自身 ID:OTP-8342

  • 如果 mc.exerc.exe 的路徑包含空格,則在 Windows 上進行建置現在可以正常運作。README.win32 檔案已更新,其中包含一些關於使用 Visual Studio 2008 進行建置的資訊。(感謝 Andrew Thompson。)

    自身 ID:OTP-8345

  • EPMD 現在可以正確處理在 ALIVE2_REQ 請求中提供的額外資料欄位,並在 PORT2_RESP 回應中擷取。(感謝 Klas Johansson。)

    自身 ID:OTP-8361

  • 用於可靠浮點異常的組態測試已更新,可在新版的 Mac OS X 上運作。(感謝 Trannie Carter。)

    自身 ID: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)

    自身 ID:OTP-8373

  • ETS 錯誤導致來自 ets:infomemory 計數器,對於 ordered_set 有時會失去同步,且數值高得離譜。

    自身 ID:OTP-8377 輔助 ID:seq11442

  • 使用 erlang:system_flag(multi_scheduling, block | unblock) 立即重複的多重排程區塊/解除區塊週期可能會導致執行階段系統死鎖。

    自身 ID:OTP-8386

  • 修正了許多關於 re 和 unicode 的錯誤

    re:compile 不再遺失 unicode 選項,這也修正了 re:split 中的錯誤。

    re:replace 現在處理 unicode 字元清單取代引數

    re:replace 現在正確處理 unicode RE 字元清單引數

    re:replace 現在在沒有取代任何內容時,正確處理二進位 unicode 輸出。

    大部分程式碼、測試案例和錯誤隔離由 Rory Byrne 完成。

    自身 ID:OTP-8394

  • 在 SMP 模擬器中,原生程式碼的載入未正確地進行原子操作,這可能會導致崩潰。此外,原生程式碼的每個 MFA 資訊表現在都受到鎖定的保護,因為在 SMP 模擬器中,它可以同時存取。(感謝 Mikael Pettersson。)

    自身 ID:OTP-8397

  • 修正了處於退出狀態且即將排程的進程,使其不允許進行垃圾回收。

    自身 ID:OTP-8420

  • 移除文件中錯誤的 "\011" 字元序列。

    自身 ID:OTP-8422

  • 如果 OS 原生解析器配置錯誤,則解析器常式無法將自己的節點名稱查閱為主機名稱,此錯誤由 Yogish Baliga 報告,現在已修正。

    解析器常式現在會嘗試將主機名稱剖析為 IP 字串,就像大多數 OS 解析器一樣,除非使用了原生解析器。

    DNS 解析器 inet_res 和檔案解析器 inet_hosts 現在不會讀取 OS 組態檔,直到它們被需要。由於原生解析器是預設值,因此在大多數情況下永遠不需要它們。

    如果沒有 'search' 關鍵字,DNS 解析器的 OS 組態檔資料 (/etc/resolv.conf) 自動更新現在會使用 'domain' 關鍵字作為預設搜尋網域。

    自身 ID:OTP-8426 輔助 ID:OTP-8381

  • re 模組:在模式開頭具有選項變更且具有頂層替代項的正規表示式可能會導致覆寫和/或崩潰。(感謝 Michael Santos。)

    自身 ID:OTP-8438

  • asn1 和 ram_file_drv 中無害的單一位元組緩衝區溢位。

    自身 ID:OTP-8451

改進和新功能

  • 改善在 BIF/NIF 呼叫之後建立大量堆積片段時的 GC 效能。這將主要有益於傳回大型複合術語的 NIF。

    自身 ID:OTP-8240

  • 實驗性 NIF 功能中的不相容變更。

    • 變更了 NIF 函式原型,以允許超過 3 個函式引數。
    • enif_get_data 已重新命名為 enif_priv_data
    • enif_make_string 獲得了第三個字元編碼引數。
    • 錯誤時,erlang:load_nif/2 的傳回值已變更。

    請閱讀 erl_niferlang:load_nif/2 的文件,以瞭解更多資訊

    .

    * 潛在的不相容性 *

    自身 ID:OTP-8304

  • 交叉編譯改進和其他建置系統改進。

    最值得注意的是

    • 大量的交叉編譯改進。舊的交叉編譯支援或多或少不存在且已損壞。請注意,交叉編譯支援仍應被視為實驗性。另請注意,舊的交叉編譯組態無法在未修改的情況下使用。如需關於交叉編譯 Erlang/OTP 的詳細資訊,請參閱 $ERL_TOP/INSTALL-CROSS.md 檔案。
    • 支援使用 DESTDIR 進行分段安裝。舊的損壞的 INSTALL_PREFIX 也已修復。如需詳細資訊,請參閱 $ERL_TOP/INSTALL.md 檔案。
    • 頂層 Makefilerelease 目標文件。如需詳細資訊,請參閱 $ERL_TOP/INSTALL.md 檔案。
    • 現在,預設情況下,make install 會建立相對符號連結,而非絕對符號連結。更多資訊請參閱 $ERL_TOP/INSTALL.md 檔案。
    • $ERL_TOP/configure --help=recursive 現在可以運作,並為所有具有 configure 腳本的應用程式列印說明。
    • make all 之後直接執行 make installmake release 不再觸發雜項重建。
    • 當在沒有先執行 make all 的情況下執行 make installmake release 時,現在會使用現有的引導系統。
    • 當動態連結 libssl.solibcrypto.so 時,cryptossl 應用程式會使用相同的執行階段程式庫路徑。執行階段程式庫搜尋路徑也已擴充。
    • Erl_interface 和 ODBC 的 configure 腳本現在會以與 ERTS 相同的方式搜尋執行緒程式庫和執行緒程式庫特性。
    • 在 64 位元系統上建置時,odbc 應用程式的 configure 腳本現在也會在 lib64lib/64 目錄中搜尋 odbc 程式庫。
    • erl_interface 應用程式中的 config.h.in 檔案現在會自動產生,而不是靜態更新,這降低了 configure 測試沒有任何效果的風險。

    (感謝 Henrik Riomar 提供建議和測試)

    (感謝 Winston Smith 提供 AVR32-Linux 交叉組態和測試)

    * 潛在的不相容性 *

    內部 ID:OTP-8323

  • NIF 改進

    • NIF 提供用於多執行緒的 Driver API。
    • 支援記憶體管理(垃圾回收)資源物件。這是一種在 C 和 Erlang 之間以安全方式傳遞原生資料結構「指標」的方法。
    • 支援參考、浮點數和 Term 比較。
    • 各種新函數,例如 enif_inspect_iolist_as_binaryenif_make_sub_binaryenif_get_stringenif_get_atomenif_make_tuple_from_arrayenif_make_list_from_arrayenif_make_existing_atom

    內部 ID:OTP-8335

  • 排程器特定資料的微小對齊調整。

    內部 ID:OTP-8341

  • 在修復許多錯誤並在文件建置過程中新增一些功能後,現在可以在開源環境中建置文件。

    - Arity 計算已更新。

    - 在產生的連結中,bif 函數名稱中使用的模組前綴已移除,因此連結看起來會像 "https://erlang.dev.org.tw/doc/man/erlang.html#append_element-2" 而不是 "https://erlang.dev.org.tw/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 選項可用於防止建立未被垃圾回收的資源(例如 Atom)。(感謝 Jayson Vantuyl。)

    內部 ID:OTP-8367

  • 二進位垃圾回收的預設設定已調整為比 R13B03 中的不那麼積極。現在也可以設定二進位 GC 的設定。請參閱 spawn_opt/2-5erlang:system_info/1erlang:system_flag/2process_flag/2-3erlang: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 模擬器選項,用於變更 Atom 的最大數量。(感謝 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

  • Ticker 程序可能會無限期地被阻止,嘗試將 tick 傳送到沒有回應的節點。如果發生這種情況,連線將不會像預期的那樣關閉。

    內部 ID:OTP-8218

  • 使用某些防火牆(即 MS IAS Client 和某些版本的 COMODO)可能會暴露出 Win32 Socket 介面中未記錄的行為,導致名稱解析呼叫無限期地掛起。現在透過為 Windows 下的埠程式新增在其標準輸入/輸出檔案控制代碼上使用重疊 I/O 的可能性來解決此問題。

    內部 ID:OTP-8230

  • 修正了具有 write_concurrency 的 ETS 表格上的錯誤。當使用綁定索引鍵執行 selectmatch 而沒有找到任何物件時,模擬器可能會崩潰。

    內部 ID:OTP-8242

  • 以下描述的 information-request / information-responsegroup-leader-change-request / group-leader-changed-response 訊號對並非始終遵守具有 SMP 支援的執行階段系統中 Erlang 訊號模型的訊號順序保證。例如,這些訊號有時可能會傳遞結束訊號。

    可以將以下 BIF 的行為建模為好像已將非同步 information-request 訊號傳送到 Pid。如果 Pid 處於活動狀態,它會以非同步 information-response 訊號回應;否則,執行階段系統會以 no-such-process 訊號回應。當收到回應時,呼叫者會將其轉換為 BIF 的結果。

    Pidgroup_leader(GroupLeader, Pid) 的呼叫者位於相同節點時,group_leader/2 BIF 的行為可以建模為好像已將非同步 group-leader-change-request 訊號傳送到 Pid。如果 Pid 處於活動狀態,它會以非同步 group-leader-changed-response 訊號回應;否則,執行階段系統會以 no-such-process 訊號回應。當收到回應時,呼叫者會將其轉換為 BIF 的結果。僅包含非同步 group-leader-change-request 訊號且沒有回應的分散式案例不受影響。

    內部 ID:OTP-8245

  • 已修正 system_profile 文件中的錯誤。

    內部 ID:OTP-8257

  • inet_driver 中的低水位線 Socket 選項修改了高水位線,而不是低水位線。(感謝 Feng Yu 和 Tuncer Ayaz)

    內部 ID:OTP-8279

  • 競爭條件可能會導致具有 SMP 支援的執行階段系統最終進入完全沒有回應的狀態。

    內部 ID:OTP-8297

改進和新功能

  • 已從執行階段系統中完全移除 pthread_cond_timedwait() 的使用。這是因為當系統時鐘突然變更時,其行為不可預測。先前的使用是無害的。

    內部 ID:OTP-8193

  • 現在使用大多數平台上存在的開放原始碼工具 (xsltproc 和 fop) 建置文件。一個明顯的變更是移除了框架。

    內部 ID:OTP-8201

  • 二進位的新垃圾回收策略,比先前的實作更積極。二進位現在有一個與每個程序綁定的虛擬二進位堆積。當二進位建立或接收到程序時,它會檢查是否已達到堆積限制,以及是否應執行回收。這模仿了一般 Erlang Term 的行為。虛擬堆積像一般堆積一樣成長和縮小。這將減少系統中二進位的記憶體佔用量。

    內部 ID:OTP-8202

  • driver_output_term()driver_send_term() 使用的 ErlDrvTermData Term 類型已擴充,包含 Term 類型 ERL_DRV_INT64ERL_DRV_UINT64,用於傳遞 64 位元整數。此外,還引入了 64 位元整數資料類型 ErlDrvSInt64ErlDrvUInt64

    更多資訊請參閱 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

  • 模組可以擁有原生實作的函數 (NIFs),這些函數可以透過呼叫 erlang:load_nif/2 動態載入。這是一個實驗性質的功能,尚未打算用於生產系統。發布此功能的目的在於在介面定案之前,先取得一些關於介面的早期回饋。

    內部編號:OTP-8220

  • float/1 BIF 會總是強制進行垃圾回收。如果結果不是一個足夠小的整數,BIF size/1byte_size/1bit_size/1abs/1round/1 也會強制進行垃圾回收。

    內部編號:OTP-8221

  • 已加入 erlang:port_command/3 BIF。erlang:port_command/3 目前不是自動匯入的,但計畫在 OTP R14 中自動匯入。更多資訊請參考 erlang 文件。

    內部編號:OTP-8225

  • 如果 Snow Leopard 是以 64 位元核心啟動的, 'configure --enable-darwin-64bit' 會失敗。(感謝 Ryan M. Graham。)

    內部編號:OTP-8236

Erts 5.7.3

已修復的錯誤和故障

  • 在 Windows 上,`open_port({spawn,Command},Opts)` 無法執行路徑或檔名中有空格的可執行檔,無論如何引用。雖然 `open_port({spawn_executable,Exec},Opts)` 可以執行任何可執行檔,但仍然無法使用 'spawn' 來執行相同的操作。這個問題現在已修正。

    內部編號:OTP-8055

  • 排程器綁定類型 processor_spread 在大型 NUMA 系統上會過度分散排程器。

    新的排程器綁定類型 spread 會盡可能分散排程器,並且行為與先前 processor_spread 的行為相同。更多資訊請參考 erl 文件中 +sbt 命令列引數的說明文件,以及 erlang:system_flag(scheduler_bind_type, SchedulerBindType) 的說明文件。

    內部編號:OTP-8063

  • 在 Linux 系統上自動偵測到的 CPU 拓撲可能會錯誤地包含以 -1 作為識別符的邏輯處理器。當 sysconf(_SC_NPROCESSORS_CONF) 傳回的值大於找到的邏輯處理器數量時,就會發生這種情況。

    內部編號:OTP-8064

  • 當最小的項 [] (列表結尾) 作為完整訊息傳送到另一個節點上的進程,並在那裡接收時,它無法被解碼。這個錯誤現在已修正。幸運的是,在實際應用程式中,[] 作為完整訊息並不常見,但無論如何它都是一個嚴重的錯誤。

    內部編號:OTP-8092

  • 一個浮點數例外指標未初始化的錯誤已被修正。當浮點數值被傳送到遠端節點時,它有時會在 CentOS 5.1 上顯示出來。錯誤由 David Reiss 回報並提供補丁建議,Mikael Pettersson 確認。

    一些在 IRIX 上的建置問題也已修正。問題由 Patrick Baggett 回報,補丁由 Mikael Pettersson 提供。

    內部編號:OTP-8095

  • 一個終止的進程可能會錯誤地取消註冊另一個進程的名稱。這可能在以下條件下發生:當第一個擁有該名稱的進程正在終止時,終止進程的名稱被取消註冊,然後同時為另一個進程註冊。

    內部編號:OTP-8099 輔助編號:seq11344

  • 在非常深的目錄中執行 erlc (路徑長度超過 256 個字元或更多) 會導致模擬器在呼叫 list_to_atom/1 時崩潰。(感謝 Chris Newcombe。)

    內部編號:OTP-8124

  • 當取消註冊連接埠的名稱時,可能會發生執行階段系統的死鎖。

    內部編號:OTP-8145

  • Makefile.in 已更新以使用 LDFLAGS 環境變數 (如果已設定)。(感謝 Davide Pesavento。)

    內部編號:OTP-8157

  • Linux 上的 pthread rwlock 實作可能會導致寫入器飢餓。因此,我們現在在 Linux 上使用我們自己的 rwlock 實作。

    內部編號:OTP-8158

  • 開放原始碼的 Erlang 建置已更新,可以在 Snow Leopard (MacOS X 10.6) 上正常運作。

    內部編號:OTP-8168

  • 呼叫 erlang:system_info(schedulers_online) 可能會導致無限迴圈。如果排程器的數量大於 1,線上排程器的數量為 1,並且有人正在阻止多重排程,就會發生這種情況。

    內部編號:OTP-8169

  • erlang:system_profile/2 中的錯誤可能會導致時間戳記訊息在 SMP 的情況下以亂序到達。這個問題現在已修正。

    內部編號:OTP-8171

  • 如果二進位包含未對齊的資料,binary_to_atom/2binary_to_existing_atom/2 會洩漏記憶體。

    內部編號:OTP-8192

  • 在沒有 SMP 支援的執行階段系統中,非同步執行緒池使用了一個對於非同步工作來說不是執行緒安全的記憶體配置器。

    內部編號:OTP-8194

改進和新功能

  • ERTS 內部 CPU 拓撲表示法現在支援處理器內部 NUMA 節點。更多資訊請參考 erl 文件中 +sct 命令列引數的說明文件,以及 erlang:system_info(cpu_topology) 的說明文件。

    內部編號:OTP-8041

  • 改進了關於並行的 ets 文件。

    內部編號:OTP-8050

  • 在 escript 中的模擬器標誌之前會繼承到從執行 escript 的模擬器啟動的模擬器。例如,當 escript 呼叫 os:cmd("erl") 時,新的模擬器會被賦予錯誤的模擬器標誌。這個錯誤現在已修正。

    Escript 檔名現在可以包含點號。

    內部編號:OTP-8060

  • 將一些 BIF (關係運算子、hash 和 phash) 設為非遞迴,以限制內部堆疊使用量。

    內部編號:OTP-8065

  • 修正了 erl_prim_loader 中 Windows 特有的錯誤。現在它可以更好地處理根目錄 (例如 c:/)。這個錯誤影響了除錯器中的目錄清單。

    內部編號:OTP-8080

  • 如果 TCP 連接埠的選項為 {packet,4},並且收到一個大小值非常大 (>2Gb) 的封包標頭,則可能會導致模擬器崩潰。相同的錯誤導致 erlang:decode_packet/3 傳回錯誤的值。(感謝 Georgos Seganos。)

    內部編號:OTP-8102

  • 匯出表格的最大大小已從 65536 個條目增加到 524288 個條目。

    內部編號:OTP-8104 輔助編號:seq11345

  • 檔案模組現在有一個類似於 io:get_line/2 的 read_line/1 函數,但具有位元組導向的語義。函數 file:read_line/1 也適用於原始檔案,但為了獲得良好的效能,建議將其與原始檔案存取的 'read_ahead' 選項一起使用。

    內部編號:OTP-8108

  • 修正了當讀取一個包含帶有負長度的損壞列表的外部格式的項時,導致模擬器崩潰的錯誤。

    內部編號:OTP-8117

  • 新的模擬器標誌 +sss,用於設定排程器執行緒的堆疊大小。

    內部編號:OTP-8119

  • 在互動模式下執行的 Windows 公用程式 Erlsrv 現在接受用於註冊 Windows 登錄資料庫的內部服務名稱和描述欄位的選項。

    內部編號:OTP-8132

  • erlang:demonitor(Mon, [flush]) 已最佳化。先前它總是搜尋呼叫者的訊息佇列以尋找 'DOWN' 訊息。目前的實作僅在必要時才搜尋訊息佇列。通常情況下不需要搜尋。

    已在 erlang:demonitor/2 中加入一個新的選項 info。更多資訊請參考 erlang 文件。

    內部編號:OTP-8143

  • I/O 任務可能會不必要地重新排程。這是無害的,但不是有用的工作。

    內部編號:OTP-8148

  • erlang:memory/[1,2] 進行了小的改進。

    內部編號:OTP-8152

  • 新的組態選項以啟用共用 zlib 的使用。

    內部編號:OTP-8155

  • 修正了 ETS 中的 smp 錯誤,當多個進程存取包含超過 1000 個物件的表格時,可能會導致模擬器崩潰,包括呼叫 selectmatch 的變體,並同時進行物件刪除。

    內部編號:OTP-8166 輔助編號:seq11392

  • 程式碼路徑解讀現在更寬鬆了。標誌 -code_path_choice 現在預設為 relaxed,而不是 strict。有關更多資訊,請參閱程式碼和 init 的說明文件。

    內部編號:OTP-8170

  • 當進程經常被排程但每次執行都做很少的工作時,會比以前更頻繁地觸發執行佇列的負載平衡和檢查 I/O。

    內部編號:OTP-8172

  • 呼叫追蹤二進位式綜合運算會導致模擬器崩潰。(感謝 Paul Mineiro。)

    內部編號:OTP-8179

  • 當給定某些無效的項時,binary_to_term/1 會導致模擬器崩潰,而不是產生 badarg 例外。(感謝 Scott Lystig Fritchie。)

    內部編號:OTP-8180

Erts 5.7.2

已修復的錯誤和故障

  • 當機傾印現在應該會為 crashdump_viewer 應用程式帶來較少的問題。(對於參數數量非零的進程,現在不再列印參數 - 它們以前會以無法解析的格式列印。)

    內部編號:OTP-7472 輔助編號:seq11019, 11292

  • 進程可能會停留在離線排程器上。

    內部編號:OTP-7990

  • 如果 binary_to_atom/2binary_to_existing_atom/2 導致 badarg 例外,可能會洩漏記憶體。

    內部編號:OTP-7997

  • 在非常罕見的情況下,進程可能會被錯誤地恢復。

    內部編號:OTP-8000

  • 排程器之間的負載平衡在罕見的情況下可能會導致模擬器崩潰。

    內部編號:OTP-8008

  • erlang:memory(processes_used) 總是傳回 0,而不是正確的值。(感謝 Geoff Cant)

    內部編號: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:selectselect_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/1erlang: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

  • term_to_binary/1 BIF 過去是使用遞迴 C 程式碼實作的,這可能會導致 Erlang 模擬器因堆疊溢位而終止。

    也修正了 Matthew Dempsky 指出的 term_to_binary/1binary_to_term/1 中的一些小問題。

    自有 Id: OTP-7894

  • 修正了 R13A 的 Unicode 和 I/O 系統實作中的幾個故障和效能問題。

    自有 Id: OTP-7896 輔助 Id: OTP-7648 OTP-7887

  • 對於 erlang:system_flag/2scheduler_bind_type 引數,以及 erlang:system_info/1scheduler_bind_typescheduler_bindings 引數,進行了較小的文件改進。

    自有 Id: OTP-7901 輔助 Id: OTP-7777

  • 有一個新的 BIF erlang:make_tuple/3

    自有 Id: OTP-7913

Erts 5.7

已修正的錯誤和故障

  • 開放原始碼

    FreeBSD 的閏秒是根據開放原始碼使用者 Kenji Rikitake 提交的修補程式處理的。沒有測試案例涵蓋此功能(不支援的平台)。

    自有 Id: OTP-7609

  • 修正了 ETS 中 bagduplicate_bag 的錯誤。如果已經刪除了一個或多個具有相同鍵的物件,則 delete/2lookup_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

  • 對 Unicode 的支援實作方式如 EEP10 所述。io 和 io_lib 模組支援對終端機和檔案進行 Unicode 資料的格式化和讀取。檔案可以以自動轉換為不同 Unicode 格式的模式開啟。 'unicode' 模組包含在外部和內部 Unicode 格式之間轉換的函式,而 re 模組則支援 Unicode 資料。此外,還有語言語法可以指定超出 ISO-latin-1 範圍的字串和字元資料。

    當終端機和作業系統支援時,互動式 Shell 將支援 Unicode 字元的輸入和輸出。

    請參閱 EEP 和 io/io_lib 手冊頁面,以及 stdlib 使用者指南以了解詳細資訊。

    I/O 協定不相容性

    io_Server 和客戶端之間的 io 協定已更新,以處理 Unicode 格式的協定資料。更新後的協定現在已記錄在文件中。該規範位於 stdlib _使用者手冊_中,這是手冊的新部分。

    io 模組不相容性

    io:put_chars、io:get_chars 和 io:get_line 都會處理並傳回 Unicode 資料。在可以提供二進位資料的情況下(例如 io:put_chars),它們應以 UTF-8 編碼。當傳回二進位資料時(例如,當 io_server 設定為 _binary 模式_時,由 io:get_line/get_chars 傳回),傳回的資料也_總是_以 UTF-8 編碼。然而,檔案模組仍然傳回以位元組為導向的資料,因此可以使用 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

  • 未記錄、不受支援且已棄用的 guard BIF is_constant/1 已移除。

    *與 R12B 不相容*

    自有 Id:OTP-7673

  • Erlang 處理程序鎖定實作已由 Tilera Corporation 的 Mat Hostetter 改進。

    自有 Id:OTP-7692

  • net_kernel:monitor_nodes/X 功能傳遞的 {nodedown, Node} 訊息現在保證會在 Nodeerlang:nodes/Y 傳回的結果中移除後傳送。

    自有 Id:OTP-7725

  • 短路運算子 andalsoorelse 不再保證它們的第二個引數是 truefalse。因此,andalso/orelse 現在是尾遞迴的。

    * 潛在的不相容性 *

    自有 Id:OTP-7748

  • 新增了一個新的 BIF,lists:keyfind/3。它的作用類似於 lists:keysearch/3,不同之處在於,如果成功,它不會將傳回的 tuple 包裝在 value tuple 中。(感謝 James Hague 建議此函式。)

    自有 Id:OTP-7752

  • 透過直接在處理程序堆積上建立小型二進位資料來最佳化驅動程式。

    自有 Id:OTP-7762

  • 如果 N 非常大,I bsl N 可能會導致 Erlang 虛擬機器耗盡記憶體,而不是產生 system_limit。(感謝 Daniel Hedlund。)

    當評估 I bsl NI bsr N 時,如果 I 是一個 bignum,則總會進行垃圾收集。

    如果 I 是整數且 N 是 bignum,則 I bsl N 現在會導致正確的 system_limit 例外,而不是像早期版本那樣導致 bad_arith

    如果 I 是整數且 N 是 bignum,則 I bsr N 將會根據 I 的符號傳回 0 或 -1,而不是像早期版本那樣導致 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/2binary_to_atom/2binary_to_existing_atom/2

    自有 Id:OTP-7804

  • 現在可以在運作期間變更線上排程器的數量。線上排程器的數量預設與可用邏輯處理器的數量相同。如需詳細資訊,請參閱 erlang:system_flag/2erl 的文件。

    自有 Id:OTP-7811

  • 已移除已棄用的函式 erlang:fault/1erlang:fault/2file: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/2erlang:max/2 分別計算兩個項的最小值和最大值。請注意,這些函式不會自動匯入,因此必須明確匯入它們,或者在呼叫它們時必須使用 erlang 字首。

    自有 Id:OTP-7841

  • 版權聲明已更新。

    自有 Id:OTP-7851

  • 針對交叉編譯到 Tilera Tile 架構的增強型建置環境。

    支援 Tilera Tile64/TilePro 上的原生 ethread 原子操作(感謝 Tilera Corporation)。

    自有 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 中 bagduplicate_bag 的錯誤。如果已經刪除了一個或多個具有相同鍵的物件,則 delete/2lookup_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},它會在逾時時自動關閉。隨後對 send 的呼叫將會因為連線已關閉而立即失敗。

    自有 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 的錯誤。透過開啟的防火牆連線到未開啟的埠,有時可能會錯誤地成功。但後續的任何操作都會失敗。

    內部編號:OTP-6542

  • 驅動程式中的浮點數運算可能會導致啟用浮點數例外狀況的執行階段系統崩潰和/或產生非預期的結果。除非明確啟用或啟用 hipe,否則會停用浮點數例外狀況。

    內部編號:OTP-7237

  • 修正了當許多 socket 同時發出訊號時,導致模擬器發出「Inconsistent, why isn't io reported?」訊息而崩潰的錯誤。

    內部編號:OTP-7420

  • 現在使用 "-detached" 選項啟動 erl 會正確地從 Unix 終端機連線中斷連線。

    內部編號:OTP-7461

  • 修復了用於 ETS 存取的 gdb etp 命令。

    內部編號:OTP-7538

  • erlang:decode_packet/3 允許 HTTP 標頭標籤和冒號之間存在空白,符合 RFC2616 規範。

    內部編號:OTP-7543

  • 現在,即使動態程式庫不存在,為 SCTP 編譯的模擬器也會啟動。當然,SCTP 驅動程式將不會載入。

    內部編號: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 提供修補程式。

    內部編號:OTP-7562

  • 更正了一些關於 EPMD 和 Erlang 節點之間協定的資訊。(感謝 Michael Regen。)

    內部編號:OTP-7594

  • 當使用 erlang:system_monitor(Pid,{long_gc,Time}) 且 GC 時間超過 1 秒時,有時會錯誤地顯示約 4300 秒。(此錯誤已在 R9C 中修正,但在 R12B 中重新引入。)(感謝 Chris Newcombe。)

    內部編號:OTP-7622 輔助編號:OTP-4903,seq8379

改進和新功能

  • 動態載入驅動程式的驅動程式條目現在在載入時會被複製,這可以進行一些內部最佳化。請注意,在執行期間修改驅動程式條目的驅動程式將不再運作。但是,不支援這種濫用驅動程式介面的行為。

    內部編號:OTP-6900

  • 現在已將 split 函式新增至 re 程式庫。來自 run、replace 和 split 的例外狀況和錯誤現在更加一致。

    內部編號:OTP-7514 輔助編號:OTP-7494

  • 修復了建置模擬器時的無害編譯器警告,以及為了避免不必要的重建而進行的微小建置變更。

    內部編號:OTP-7530

  • 現在實驗性地支援從封存檔案載入程式碼。如需更多資訊,請參閱 codeiniterl_prim_loaderescript 的文件。

    已改進 escripts 的錯誤處理。

    現在,escript 可以設定模擬器的明確引數,例如 -smp enabled

    現在,escript 可以包含預先編譯的 beam 檔案。

    現在,escript 可以包含包含一個或多個應用程式的封存檔案(實驗性)。

    已移除內部模組 code_aux

    內部編號:OTP-7548 輔助編號:otp-6622

  • ERTS 內部記憶體配置器的重新配置功能部分,現在會將目前區塊與周圍的可用區塊結合起來,作為重新配置的替代位置。

    內部編號:OTP-7555

  • 從程序到較早呼叫的模組可能存在虛假的參考,因此如果重新載入模組,則會終止該程序。(感謝 Richard Carlsson。)

    此外,此錯誤的修正也使得堆疊回溯(從 erlang:get_stacktrace/0 和其他函式傳回)更加正確,因為堆疊回溯中始終包含直接呼叫者(有時可能會遺失)。

    內部編號:OTP-7559

  • 改進了 IO 處理中的鎖定,以提高 smp 效能。

    內部編號:OTP-7560

  • 改進了 BIF 重新排程功能。

    內部編號:OTP-7587

  • 載入使用 Erlang/OTP R9C 編譯的模組,並在模組中呼叫 module_info/0 會導致模擬器崩潰。現在,模擬器會拒絕載入使用 R9C 或更早版本編譯的任何模組。(注意:無論如何,只能載入使用 R10B 或更早版本編譯的簡單模組。)(感謝 Martin Kjellin。)

    內部編號:OTP-7590

Erts 5.6.4.2

已修正的錯誤和故障

  • 呼叫下列 BIF 之一的程序,在 SMP 支援的執行階段系統中,極少數情況下可能會發生死鎖:check_process_code/2garbage_collect/1process_info/[1,2]system_flag/2erlang:suspend_process/[1,2]

    內部編號:OTP-7582

  • 在 SMP 支援的執行階段系統中,一對統計變數不是以執行緒安全的方式管理。

    內部編號:OTP-7583

  • 終止程序時,極少數情況下可能會發生競爭條件,進而導致執行階段系統崩潰。

    內部編號:OTP-7584

  • 在某些情況下,且使用 run_erl/to_erl 時,由於終端機回報零寬度的處理不正確,終端機 Erlang 驅動程式 (ttsl_drv) 可能會因除以零而使模擬器崩潰。對於回報零寬度的終端機,驅動程式現在會回復為預設寬度 80 和預設高度 24 (vt100) 作為回復行為。這修正了崩潰問題,也使得「啞」終端機上的輸出更具可讀性。

    內部編號:OTP-7592 輔助編號:seq11073

Erts 5.6.4.1

改進和新功能

  • 新增了一個新的 erts_alloc 參數 +M<S>rmbcmt(相對多區塊載體移動閾值)。它決定當區塊縮小時,在多區塊載體中強制移動重新配置的時間。如需更多資訊,請參閱 erts_alloc(3) 文件。

    內部編號:OTP-7540

  • 現在可以將新選項 +d 提供給 erl,以在偵測到內部錯誤時抑制當機傾印的產生。因此,會產生更有用的核心傾印。

    內部編號:OTP-7578 輔助編號:seq11052

Erts 5.6.4

已修正的錯誤和故障

  • 傳遞給 erts 內部 printf 實作的格式字串中的雙反斜線產生了錯誤的結果。沒有將此類格式字串傳遞給 erts 內部 printf 實作,也就是說,此錯誤因此完全無害。(感謝 Perry Smith。)

    內部編號:OTP-7408

  • 現在在 Windows 上處理大型檔案,前提是檔案系統支援它。

    內部編號:OTP-7410

  • 修正了當 http 標頭後面有空格時,{packet,http} 的錯誤。

    內部編號:OTP-7458

  • 如果無法判斷目前函式,追蹤選項 running 可能會導致模擬器崩潰。

    內部編號:OTP-7484

  • 在 receive...after 中使用 16#ffffFFFF 作為逾時值通常會因 32 位元整數溢位而幾乎立即導致逾時。(感謝 Serge Aleynikov 和 Matthias Lang。)

    內部編號:OTP-7493

  • 對於 escript 執行的程序,trap_exit 程序旗標現在為 false 而不是 true(如先前版本)。依賴於先前(違反直覺)行為的指令碼可能無法運作。(感謝 Bengt Kleberg。)

    * 潛在的不相容性 *

    內部編號:OTP-7517

  • string:to_integer/1 內建函式中的一個錯誤導致模擬器不穩定。現在已修正此問題。(感謝 Lev Walkin。)

    內部編號:OTP-7526

改進和新功能

  • 現在,在 SMP 模擬器中,ETS 密集型應用程式的效能應該更好。此外,ETS 表格識別碼(由 ets:new/2 傳回)現在比以前分散在更廣泛的範圍內(在 32 位元模擬器中使用 28 位元),以確保已刪除表格的表格識別碼不會很快被重複使用。

    注意:表格識別碼現在可以是負整數。錯誤地假設表格識別碼只能是正整數的程式可能會停止運作。(表格識別碼的類型故意未記錄,並且可能在未來版本中變更。)

    內部編號:OTP-7348

  • 新的 BIF erlang:decode_packet/3 可從二進位檔中擷取協定封包。與 socket 選項 {packet, Type} 類似。也記錄了 socket 封包類型 http 並使其正式化。注意:從作用中 socket 傳送的 http 封包的元組格式已以不相容的方式變更。

    * 潛在的不相容性 *

    內部編號:OTP-7404

  • 現在,原始碼 tar 球中包含一些應用程式(erts、kernel、stdlib 和其他幾個應用程式)的文件原始碼。目前沒有從原始碼建置 HTML 檔案的 Makefile 支援(此支援將包含在未來版本中)。

    內部編號:OTP-7406

  • 已刪除許多頻繁存取的記憶體計數器(erts 內部)。這是因為它們會損害 SMP 支援的執行階段系統的效能。因此,只有在啟用所有 erts_alloc(3) 配置器(預設)時,erlang:memory/[0,1] 才會傳回結果。啟用所有 erts_alloc(3) 配置器時傳回的結果,無論是比以前更準確還是更不準確。結果中包含的記憶體比以前多,但加總的不同部分不是以原子方式收集的。erlang:memory/[0,1] 的呼叫對於系統而言比以前便宜得多。這是因為資訊不再以原子方式收集,而原子方式收集非常昂貴。

    * 潛在的不相容性 *

    內部編號:OTP-7468

  • 用於計時器和訊息等用途的預先配置器已重寫為特定於排程器。也就是說,不同的排程器現在將從不同的集區中配置,這會減少鎖定爭用。

    內部編號:OTP-7470

  • 在 Mac OS X 上,file:sync/1 現在保證所有檔案系統緩衝區都會使用帶有 F_FULLFSYNC 選項的 fcntl() 寫入磁碟。先前,file:sync/1 呼叫 fsync(),它僅保證資料已傳輸到磁碟機。(感謝 Jan Lehnardt。)

    專屬 ID:OTP-7471

  • 現在可以搶佔長時間運行的進程終止,也就是說,終止中的進程將被重新排程以便稍後繼續終止,以便其他進程可以執行。擁有許多和/或大型 ets 表的進程終止通常需要很長時間。

    專屬 ID:OTP-7477

  • 新增了一個新的追蹤選項 exitingexiting 追蹤類似於 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

  • 現在針對 socket 設定 {active,once}(使用 inets:setopts/2)進行了特殊優化(因為 {active,once} 選項通常比其他選項更常使用)。

    專屬 ID:OTP-7520

已知錯誤和問題

  • 在啟用浮點數異常的執行時期系統上,驅動程式中的浮點數算術可能會導致執行時期系統崩潰和/或產生意外的結果。除非明確啟用或啟用 hipe,否則浮點數異常會被停用。

    內部編號:OTP-7237

Erts 5.6.3.3

已修復的錯誤和故障

  • 在建構的二進制結尾處使用大小為 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

已修復的錯誤和故障

  • 呼叫 erlang:memory/[0,1] 可能會導致具有 SMP 支援的執行時期系統崩潰。

    專屬 ID:OTP-7415

Erts 5.6.3.1

已修復的錯誤和故障

  • 在已使用延遲子二進制建立最佳化的位元語法比對程式碼上執行本機呼叫追蹤,可能會導致模擬器崩潰。

    專屬 ID:OTP-7399 輔助 ID:seq10978

Erts 5.6.3

已修復的錯誤和故障

  • 一次只允許一個 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

  • 在極為罕見的情況下,終止中的進程可能會觸發錯誤,從而導致具有 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) 上,傳送到另一端關閉的 socket 可能會導致模擬器消耗 100% 的 CPU 時間。(感謝 Matthias Radestock。)

    專屬 ID:OTP-7289

  • 在 Windows 上使用的 Vanilla 驅動程式可能會導致模擬器崩潰,有時會產生損壞的檔案。Vanilla 驅動程式是當只將檔案名稱作為第一個引數傳遞給 open_port/2 時所使用的驅動程式。注意:此種使用 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() 和朋友的問題),則檔案操作的 compressed 選項不起作用。

    專屬 ID:OTP-7343 輔助 ID:seq10949

  • 已修復具有 SMP 支援的執行時期系統中的競爭條件,該條件會導致錯誤地刪除新建立的 ets 表。

    當一個進程在終止期間刪除一個表,同時另一個進程透過 ets:delete/1 刪除同一個表,而第三個進程建立一個意外取得與要刪除的表相同內部表索引的表時,就會發生競爭。

    專屬 ID:OTP-7349

  • 當解壓縮資料的大小剛好是內部緩衝區大小(預設為 4000 個位元組)的倍數時,zlib:inflate 會失敗。

    專屬 ID:OTP-7359

  • 如果超過允許的原子總數,現在將會控制模擬器終止並產生崩潰轉儲檔案。模擬器過去只是簡單地崩潰。(感謝 Howard Yeh 和 Thomas Lindgren。)

    專屬 ID:OTP-7372

  • 現在已更正 Windows 上 werl 中的中斷處理常式可能會導致模擬器掛起或崩潰的問題。

    專屬 ID:OTP-7394 輔助 ID:seq10969

  • configure 腳本現在會測試 gcc-4.3.0 中嚴重的最佳化錯誤。如果存在錯誤,則 configure 腳本將會中止(如果發生這種情況,建立 Erlang/OTP 的唯一方法是變更為其他版本的 gcc)。(感謝 Mikael Pettersson。)

    專屬 ID:OTP-7397

改進和新功能

  • 在 Unix 上,模擬器現在會在終端的寬度變更時通知。(感謝 Matthew Dempsky 和 Patrick Mahoney。)

    專屬 ID:OTP-7290

  • 有一個新的函式 init:stop/1,可用於乾淨地關閉系統,並產生非零的結束狀態或崩潰轉儲。(感謝 Magnus Froberg。)

    專屬 ID:OTP-7308

  • process_info(Pid, garbage_collection) 現在會傳回更多資訊

    專屬 ID:OTP-7311

  • 現在記錄了 open_port/2hide 選項。(感謝 Richard Carlsson。)

    專屬 ID:OTP-7358

已知錯誤和問題

  • 在啟用浮點數異常的執行時期系統上,驅動程式中的浮點數算術可能會導致執行時期系統崩潰。除非明確啟用或啟用 hipe,否則浮點數異常會被停用。

    內部編號:OTP-7237

Erts 5.6.2

已修復的錯誤和故障

  • 現在嚴格執行原子最大長度為 255 個字元。binary_to_term/1 如果編碼的 term 包含長度超過 255 個字元的原子,現在將會失敗並顯示 badarg。如果需要,驅動程式建立的原子現在將被截斷為 255 個字元。(感謝 Matthew Dempsky。)

    專屬 ID:OTP-7147

  • 在某些 64 位元架構上,「大數處理」中的錯誤可能會導致對大型數字執行 rem 和 div 操作無限期掛起。涉及以 28 位元或 60 位元表示的最小負數的 Rem 操作也可能導致存取違規和模擬器崩潰。兩個錯誤都已更正。

    專屬 ID:OTP-7177

  • 在喚醒休眠的進程後執行初始垃圾收集時,會不必要地觸發完整掃描垃圾收集。

    專屬 ID:OTP-7212

  • beta 測試模組 gen_sctp 現在支援如文件中所述的主動模式。主動模式仍未經過充分測試,且關於 gen_sctp:connect/5 的正確語意存在一些問題。特別是:應該是阻塞式、非阻塞式還是可選擇的。在(近期)未來的修補程式中,它很可能會改變語意。

    試試看,給予評論並發送錯誤報告!

    自有 ID:OTP-7225

  • 傳遞給 ets:update_counter/3 的無效參數未被正確處理。一個小於 1 的元組位置(Pos)會導致更新緊接在鍵之後的元素(就像根本沒有指定位置一樣)。現在,所有 Pos 的無效值都會因為 badarg 而失敗。

    自有 ID:OTP-7226

  • 當在分發通道上執行多個並行操作時,具備 SMP 支援的執行時系統在極少數情況下可能會發生死鎖。

    自有 ID:OTP-7260

改進和新功能

  • zlib 庫中的更多校驗和/雜湊演算法現在可用作內建函數(就像 md5 雜湊已經存在很長時間一樣)。

    自有 ID:OTP-7128

  • 垃圾收集器中的一些小改進。

    自有 ID:OTP-7139 輔助 ID:OTP-7132

  • Windows werl 程式的 "-detached" 參數現在可以建立一個沒有任何主視窗且不顯示臨時控制台的 Erlang 虛擬機器。

    自有 ID:OTP-7142

  • erlang:system_info/1 現在接受 logical_processorsdebug_compiled 參數。更多資訊請參閱 erlang 文件。

    如果模擬器使用的排程器執行緒數量大於系統上的邏輯處理器數量,則 test_server:timetrap_scale_factor/0 返回的比例因子現在也會受到影響。

    自有 ID:OTP-7175

  • 新增 BIF ets:update_element/3。用於更新 ets 元組內的個別元素,而無需讀取、更新並寫回整個元組。

    自有 ID:OTP-7200

  • 執行 processes/0 BIF 的進程現在可以在執行期間被其他進程搶佔。這是為了盡可能減少對系統其餘部分的干擾。當然,返回的結果仍然是在呼叫 processes/0 期間某個時間點的現有進程的一致快照。

    已更新 processes/0 BIF 和 is_process_alive/1 BIF 的文件,以闡明現有進程和存活進程之間的差異。

    自有 ID:OTP-7213

Erts 5.6.1.1

已修正的錯誤和故障

  • 在 erl_check_io.c 中發送錯誤報告時,傳遞的參數不足。(感謝 Matthew Dempsky)。

    自有 ID:OTP-7176

  • 在極少數情況下,複雜的二進位匹配程式碼可能會導致模擬器崩潰或在應該匹配時不匹配。(感謝 Rory Byrne。)

    自有 ID:OTP-7198

改進和新功能

  • {allocator_sizes, Alloc}alloc_util_allocators 參數現在被 erlang:system_info/1 接受。更多資訊請參閱 erlang 文件。

    自有 ID:OTP-7167

  • 休眠進程時,堆積區塊的最後重新分配現在總是會移動堆積區塊,因為它在休眠大量進程時會大幅減少記憶體碎片。

    自有 ID:OTP-7187

Erts 5.6.1

已修正的錯誤和故障

  • sparc64 上的 SMP 模擬器錯誤地使用了 sparc32 原子和 sparc32 自旋鎖實作,導致其崩潰。

    自有 ID:OTP-7006

  • 呼叫追蹤新的 guard BIF byte_sizebit_sizetuple_size 以及載入使用其中一個函數的模組,可能會導致模擬器終止。

    自有 ID:OTP-7008

  • 在 MacOSX 上設定 --enable-darwin-universal 或 --enable-darwin-64bit 可能會導致非最佳化的模擬器。頂層設定指令碼現在已修正。

    自有 ID:OTP-7014

  • 設定 --with-gd 並未產生 percept 的正確 include 旗標。

    自有 ID:OTP-7015

  • 在 Windows 上,具備 SMP 支援的執行時系統中,環境變數未以執行緒安全的方式處理。

    已引入 erl_drv_putenv()erl_drv_getenv() 以供驅動程式中使用。請直接在驅動程式中使用 putenv() 或 getenv()。更多資訊請參閱 erl_driver 文件。

    自有 ID:OTP-7035

  • HIPE:更正了 send/3 和 setnode/3 BIF 的介面選擇,用於原生編譯程式碼。使用不正確的介面在異常情況下可能會導致隨機執行時錯誤。

    自有 ID:OTP-7067

  • 當進程字典中存在許多鍵時,垃圾回收可能會變得非常緩慢。(感謝 Fredrik Svahn。)

    自有 ID:OTP-7068

  • 已移除 Windows 安裝中的重複文件目錄。

    自有 ID:OTP-7070

  • 文件錯誤修正和說明。

    (感謝 Joern (opendev@gmail.com)、Matthias Lang 和 Richard Carlsson。)

    自有 ID:OTP-7079

  • 在具備一個以上邏輯處理器的系統上執行時,使用 OTP 原生原子整數實作的 SMP 支援執行時系統可能會發生死鎖。也就是說,只有在 x86、x86_64、sparc32 和 powerpc32 以外的其他硬體平台上,具備 SMP 支援的執行時系統才會受到此錯誤的影響。

    自有 ID:OTP-7080

  • 中斷處理程式碼(在按下 Ctrl-C 時執行)可能會導致具備 SMP 支援的執行時系統死鎖。

    自有 ID: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'。

    * 潛在的不相容性 *

    自有 ID:OTP-7120

  • 已修正 64 位元平台上 erlang:phash2/1 中的錯誤。(感謝 Scott Lystig Fritchie。)

    自有 ID:OTP-7127

  • 模擬器在極少數情況下可能會在垃圾收集時崩潰。

    自有 ID: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_configerlang 文件。

    * 潛在的不相容性 *

    自有 ID:OTP-7100

  • 在 Unix 上,無法使用 list_to_float/1binary_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_BUF2BINARYERL_DRV_EXT2TERMERL_DRV_UINTERL_DRV_BUF2BINARY 用於傳遞和建立二進制檔案,ERL_DRV_EXT2TERM 用於傳遞以外部術語格式編碼的術語,而 ERL_DRV_UINT 用於傳遞無號整數。

    也新增了資料類型 ErlDrvUIntErlDrvSInt,這使得如何根據寬度和符號解譯術語類型的引數更加明顯。

    erl_driver(3) 文件中不正確的資料類型 ErlDriverTermErlDriverBinaryErlDriverPort 已取代為正確的資料類型 ErlDrvTermDataErlDrvBinaryErlDrvPort

    有關更多資訊,請參閱 erl_driver(3) 文件。

    自有 ID:OTP-6823

  • erts 內部執行緒函式庫的雜項改進。

    它現在支援 Windows 上最佳化的原子操作和自旋鎖定。

    已實作基於互斥和/或自旋鎖定來支援遺失的最佳化原子操作、自旋鎖定或 rwlocks。這使得可以在更多平台上編譯具有 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/1erlang:info/1

    * 潛在的不相容性 *

    自有 ID:OTP-6876

  • 由外部事件觸發的驅動程式回呼呼叫現在會排程,並與 Erlang 程序的執行交錯,即使是在沒有 SMP 支援的執行階段系統上也是如此。

    自有 ID:OTP-6878

  • 速度更快的超過 27 位元符號整數(或 64 位元 CPU 上超過 60 位元符號整數)的算術,以及速度更快的整數乘法。(感謝 Tony Rogvall。)

    自有 ID:OTP-6891

  • process_info BIF 的顯著改進

    • 現在可以使用項目列表作為第二個引數呼叫 process_info/2,以便以原子方式擷取有關多個項目的資訊。
    • 已在具有 SMP 支援的執行階段系統中最佳化 process_info/[1,2]。先前,在 process_info/[1,2] 中等待檢查程序的鎖定時,整個排程器可能會被封鎖很長一段時間。呼叫 process_info/[1,2] 的 Erlang 程序仍然可能因為等待鎖定而被封鎖很長一段時間,但現在排程器將能夠在呼叫 process_info/[1,2] 的程序等待鎖定的同時執行其他程序。
    • process_info/2 現在接受比以前更多的項目。
    • 已改進 process_info/[1,2] 的文件。

    有關更多資訊,請參閱 erlang 文件。

    自有 ID:OTP-6899

  • open_port({}, []) 可能會導致模擬器崩潰。(感謝 Matthew Dempsky。)

    自有 ID:OTP-6901

  • 已引入兩個新的防護 BIF,作為 size/1 的建議替代品。(size/1 BIF 將不早於 R14B 移除。)BIF 是 tuple_size/1 用於計算元組的大小,以及 byte_size/1 用於計算二進制檔案或位元字串內容所需的位元組數(必要時四捨五入到最接近的位元組數)。

    還有一個新的 bit_size/1 BIF,它會傳回二進制檔案或位元字串包含的確切位元數。

    自有 ID: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

  • 現在可以針對 64 位元 intel 編譯模擬器,也可以在 darwin/MacOSX 10.4 和 10.5 上編譯 32 位元通用二進位檔。

    內部編號:OTP-6961

  • 如果 open_port 因為所有可用的連接埠都已在使用中而失敗,它現在會擲回 system_limit 例外,而不是 enfile 例外。(如果作業系統傳回 ENFILE,則可能仍然會擲回 enfile。)

    內部編號:OTP-6968

  • spawn_monitor/1spawn_monitor/3 BIF 現在會自動匯入(也就是說,它們不再需要 erlang: 前綴)。

    內部編號:OTP-6975

  • 在 Windows 上,werl 視窗現在可以處理調整大小,以便可以利用整個視窗。文字選取也已更新為以行為導向,而不是像早期版本那樣以矩形導向。

    內部編號:OTP-6994 輔助編號:OTP-6933

  • FreeBSD 上已啟用 Kqueue 支援 (kernel-poll)。Kqueue 無法偵測到 FreeBSD 上管道寫入的問題,實際上並非 Kqueue 問題,而是管道上的 writev 問題。當錯誤發生時,poll() 和 select() 都無法偵測到寫入。NetBSD 和 DragonFlyBSD 可能有或曾經有相同的錯誤。由於 Jean-Sebastien Pedron 的協助,此錯誤應已在 FreeBSD 6.3 和 FreeBSD 7.0 中修正。

    內部編號:OTP-7001

Erts 5.5.5.5

已修正的錯誤和故障

  • 在暫時無法使用的 NFS 檔案系統上掛起寫入可能會導致執行(與檔案無關的)Erlang 程式碼被封鎖,即使使用了 I/O 執行緒。此問題現已修正。

    內部編號: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 的常數字段的位元語法建構的模組將無法載入。

    消除了其他幾個與巨大欄位大小相關的類似錯誤。

    現在,嘗試建構長度大於 536870911 個位元組的二進位檔將會因為 system_limit 例外而失敗(而不是以神秘的方式失敗或建構具有不正確內容的二進位檔)。同樣地,嘗試比對長度大於 536870911 個位元組的二進位檔現在也會失敗(而不是產生不正確的結果)。此限制已記錄在《效率指南》中。(此限制在 32 位元模擬器中;如果需要處理大於 536870911 個位元組的較大二進位檔,請使用 64 位元模擬器。)

    內部編號:OTP-6686

  • 已修正極大數字的 rem 和 div 中的錯誤。

    內部編號:OTP-6692

  • erlang:system_info({allocator, Alloc}) 當 bignum 是結果的一部分時,不會配置足夠的堆積,這可能會導致模擬器當機。

    內部編號:OTP-6693

  • 先前無法透過命令列傳遞 erts_alloc 與預設使用相同的組態。

    現在可以將設定某種大小的 +M* 命令列引數傳遞等於位址空間大小的值。在這種情況下,使用的值會是 "位址空間的大小" - 1

    內部編號:OTP-6699

  • 如果 port 無效,則 SysIOVec* driver_peekq(ErlDrvPort port, int *vlen) 不會更新 *vlen。如果 port 無效,現在會將 *vlen 設定為 -1

    即使 port 無效,efile 驅動程式也預期會更新 *vlen。這種情況很少發生,但當執行階段系統啟用非同步執行緒且連接埠遭到終止時可能會發生。當這種情況發生時,執行階段系統會當機。

    內部編號:OTP-6729

改進和新功能

  • 對於使用 escript 編寫的腳本,有一個新的函式 escript:script_name/0,可用於擷取腳本的路徑名稱。文件已澄清有關預先定義的巨集(例如 ?MODULE)和模組名稱。

    內部編號:OTP-6593

  • 已更新《ERTS 使用者指南》章節〈抽象格式〉中的〈防護〉區段。

    內部編號:OTP-6600

  • 已修正 SCTP 的通訊協定層 flue,以處理插槽選項 SO_LINGER、SO_SNDBUF 和 SO_RCVBUF。

    內部編號:OTP-6625 輔助編號:OTP-6336

  • 已改善並記錄對等關閉時 inet 選項 {active,once} 的行為。

    內部編號:OTP-6681

  • 針對連線導向插槽新增了 inet 選項 send_timeout,以允許在將傳送請求傳達至基礎 TCP 堆疊時設定逾時。

    內部編號:OTP-6684 輔助編號:seq10637 OTP-6681

  • 已新增命令列旗標 -args_file FileName,以及用於 erl 命令的環境變數 ERL_AFLAGSERL_ZFLAGS。如需詳細資訊,請參閱 erl 文件。

    內部編號:OTP-6697

  • 已棄用 is_constant/1 類型測試。is_constant/1 的命名不正確,而且幾乎沒有文件記錄。

    內部編號:OTP-6731

Erts 5.5.4.3

已修正的錯誤和故障

  • process_flag(trap_exit, Bad) 其中 Bad 是不等於 truefalse 的項,不會像應該的那樣因為 badarg 而失敗;相反地,會以靜默方式忽略失敗。此錯誤是在 erts-5.5.2 中引入的。

    內部編號:OTP-6627 輔助編號:OTP-6160

  • 非同步執行緒的最小和預設堆疊大小已增加至 16 千字組。這是因為先前 8 千字組的最小和預設堆疊大小已被證明太小(在 erts-5.5.4.2 中引入)。

    Own Id: OTP-6628 Aux Id: OTP-6580, Seq10633

改進和新功能

  • process_flag/2 接受新的 flag sensitive

    Own Id: OTP-6592 Aux Id: seq10555

Erts 5.5.4.2

已修正的錯誤和故障

  • 當一個埠從另一個埠竊取檔案描述器的控制權時,竊取的埠會測試另一個埠是否存活,以便能夠提供準確的錯誤訊息。在具有 SMP 支援的執行時期系統中,此測試在未持有適當鎖定的情況下進行。在最壞的情況下,這可能導致錯誤的錯誤訊息;因此,此錯誤被認為是無害的。

    Own Id: OTP-6602

改進和新功能

  • 非同步執行緒池中執行緒的預設堆疊大小已縮小至 8 千字組,即 32 位元架構上的 32 KB。選擇此較小的預設大小是因為非同步執行緒的數量可能相當多。預設堆疊大小對於 Erlang/OTP 隨附的驅動程式來說已足夠,但對於使用 driver_async() 功能的其他動態連結驅動程式來說可能不夠大。非同步執行緒池中執行緒的建議堆疊大小可以透過 erl+a 命令列引數進行設定。

    * 潛在的不相容性 *

    Own Id: OTP-6580

Erts 5.5.4.1

已修正的錯誤和故障

  • 在 Linux 機器上使用 heart 時設定系統時間,而該模擬器是以 clock_gettime 支援(從 Linux 2.6/erts-5.5.4 及更高版本預設)構建的,可能會觸發 heart 命令。這是由於 heart 可執行檔中的錯誤,現在已修正。

    Own Id: OTP-6598 Aux Id: seq10614

Erts 5.5.4

已修正的錯誤和故障

  • 更正了 erlc 的說明文字中 '-pz' 的拼寫錯誤。(感謝 Ulf Wiger。)

    Own Id: OTP-6433

  • code:module_md5/1beam_lib:md5/1 和編譯器為 vsn 屬性的預設值所做的 BEAM 檔案 MD5 計算都已變更,以便其結果在所有平台上都相同;包含 fun 的模組在不同平台上可能會得到不同的 MD5。

    Own Id: OTP-6459

  • 如果 fun 的環境中有大型 term,模擬器可能會在寫入 erl_crash.dump 檔案時傾印核心。由於無論如何都無法在 crashdump_viewer 應用程式中檢查 fun 的環境,因此現在在傾印 fun 之前,環境中的變數會設定為 []。(感謝 Jean-Sebastien Pedron。)

    Own Id: OTP-6504

  • 來自以 exit_status 選項開啟的埠的 {Port, {exit_status, S}} 訊息在極少數情況下可能會延遲。此錯誤存在於除 SunOS 之外的所有 Unix 作業系統上不支援 SMP 的 Erlang 執行時期系統中。

    Own Id: OTP-6528

  • linuxthreads 中的一個錯誤可能會導致模擬器在第一次呼叫 dlopen() 之前呼叫 dlerror() 時傾印核心。作為一種解決方法,當使用 linuxthreads 作為執行緒庫時,模擬器總是在初始化時呼叫 dlopen()。

    Own Id: OTP-6530

  • file:sync/1 在 Windows 上沒有任何作用。現在它會呼叫系統函式來刷新緩衝區 (FlushFileBuffers())。(感謝 Matthew Sackman。)

    Own Id: OTP-6531

  • 當無法建立埠時,open_port/2 在具有 SMP 支援的執行時期系統上可能會因錯誤的結束原因而失敗。發生這種情況時,結束原因通常是 eintrebusy 而不是 eagain

    Own Id: OTP-6536

  • 檔案驅動程式 (efile_drv) 在設定的逾時時間後,不會刷新使用選項 'delayed_write' 寫入的資料,而是在下一個檔案操作時才會刷新。此錯誤現已更正。

    Own Id: OTP-6538

改進和新功能

  • 已實作 SCTP Socket API Extensions 的介面。這是由 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 介面處於 beta 狀態。它僅經過手動測試,並且在 OPT 中沒有自動測試套件,這表示並非所有內容都經過測試。Socket active 模式已損壞。尚未測試 IPv6。由於 API 的變更,文件已重新設計,但此後尚未經過校對。

    OTP 團隊感謝 Serge Aleynikov 和 Leonid Timochouk 的寶貴貢獻。我們希望我們沒有把它搞砸太多。

    Own Id: OTP-6336

  • term_to_binary/2 現在可辨識 {minor_version,Version} 選項。與先前的編碼相比,{minor_version,1} 將使浮點數以精確且更節省空間的方式進行編碼。

    Own Id: OTP-6434

  • 現在有一個新的 escript 程式,可用於以 Erlang 編寫指令碼。Erlang 指令碼不需要編譯,並且任何引數都可以傳遞給它們,而無需擔心它們被 Erlang 系統解譯。

    Own Id: OTP-6505

  • 現在允許以「raw」方式設定和取得 Socket 選項。使用此功能將不可避免地產生不可移植的程式碼,但允許在具有這些選項的 TCP 堆疊上設定和取得任意不常見的選項。

    Own Id: OTP-6519

  • Erlang 執行時期系統上具有 SMP 支援的雜項訊號處理改進。

    現在,當在系統上找到 pthread 自旋鎖時,自旋鎖和原子操作的回退實作會使用 pthread 自旋鎖實作。

    具有 SMP 支援的 Erlang 執行時期系統現在可以在具有 Linuxthreads 而不是 NPTL (Native POSIX Thread Library) 的 Linux 系統上執行。請注意,具有 SMP 支援的 Linuxthreads 的測試不如 NPTL 那樣徹底。因此,當找不到 NPTL 時,預設情況下不會在 Linux 上建構具有 SMP 支援的執行時期系統。為了強制建構具有 SMP 支援的執行時期系統,請在建構 OTP 時將 --enable-smp-support 傳遞給 configure

    Own Id: OTP-6525

Erts 5.5.3.1

已修正的錯誤和故障

  • erlang:system_flag(multi_scheduling, block) 可能會導致具有 SMP 支援的模擬器死鎖。

    Own Id: OTP-6431 Aux Id: OTP-6403

  • 具有 SMP 支援的執行時期系統無法呼叫關閉狀態埠的驅動程式逾時回呼。這可能會導致埠無法刷新其 I/O 佇列。

    Own Id: OTP-6432

  • 來自已關閉埠的 {Port, closed} 訊息可能會在具有 SMP 支援的執行時期系統中從 erlang:ports/0 的結果中移除 Port 之前到達埠擁有者。

    Own Id: OTP-6437

  • 在具有 SMP 支援的執行時期系統中,透過 driver_async 建立的非同步工作的非同步 ID 不是以執行緒安全的方式建立的。在最壞的情況下,這可能會導致 driver_async_cancel() 取消另一個非同步工作而不是預期的工作。

    Own Id: OTP-6438

  • 在極少數情況下,兩個節點之間終止的連線可能會導致兩個節點之間在具有 SMP 支援的執行時期系統上即時重新連線失敗。

    Own Id: OTP-6447

  • 在 erts 5.5.3 (driver_entry(3)) 的驅動程式輸入欄位 extended_marker 的文件中,說明如下:「如果此欄位等於 0,則會忽略下列欄位」。這是一個文件錯誤,已變更為:「如果此欄位等於 0,則此欄位之後的所有欄位也*必須*為 0,如果它是指標欄位,則為 NULL。」

    已改進載入驅動程式時偵測舊不相容驅動程式的執行時期檢查。但是,模擬器無法確保不使用擴充驅動程式介面的驅動程式不相容。因此,當載入不使用擴充驅動程式介面的驅動程式時,即使驅動程式不相容,也存在載入的風險。當驅動程式使用擴充驅動程式介面時,模擬器可以驗證它不是不相容的驅動程式版本。因此,建議使用擴充驅動程式介面。

    如需更多資訊,請參閱 erl_driver(3)driver_entry(3) 文件。

    Own Id: OTP-6452 Aux Id: OTP-6330

  • 當終止具有 SMP 支援的執行時期系統上的埠時,移除與程序的連結是在未鎖定程序的連結鎖定的情況下完成的。這可能會導致模擬器崩潰。

    Own Id: OTP-6475

  • 當埠透過從逾時驅動程式回呼呼叫 driver_async() 來刷新其 I/O 佇列時,具有 SMP 支援的模擬器可能會崩潰。

    Own Id: OTP-6479

  • 在極少數情況下,大型結束原因可能會導致具有 SMP 支援的執行時期系統崩潰。

    Own Id: OTP-6521

改進和新功能

  • 較新的 Linux 核心使用了更快的系統呼叫來保持時間準確,這可以顯著加快這些系統上模擬器的速度。

    Own Id: OTP-6430

  • 將非同步執行緒的數量和排程器執行緒的數量新增至可透過 driver_system_info() 擷取的系統資訊。如需更多資訊,請參閱 erl_driver(3) 文件。

    Own Id: OTP-6440

  • 當具有 SMP 支援的執行時期系統收到 SIGUSR1 時,erl_crash.dump 現在由一個特殊的執行緒寫入,而不是像之前那樣直接從訊號處理常式寫入。

    Own Id: OTP-6465

  • 使用壓縮的 term_to_binary/2 現在更快。

    term_to_binary/2 現在接受選項 '{compressed,Level}',用於指定壓縮等級。Level 必須在 0(無壓縮)到 9(最高壓縮等級)的範圍內。預設值為 6。

    未來相容性錯誤修復:binary_to_term/1 沒有正確處理 UniqIndex 欄位。

    問題追蹤編號:OTP-6494

  • 移除初始化核心輪詢集合時不必要的重新分配。

    問題追蹤編號:OTP-6516

Erts 5.5.3

已修正的錯誤與故障

  • 在支援 SMP 的模擬器上,節點和 fun 表格條目在極少數情況下可能被多次釋放。

    問題追蹤編號:OTP-6369

  • epoll_wait() 可以在結果陣列中重複相同檔案描述符的條目。這可能會導致驅動程式的 ready_input、ready_output 或 event 回呼函數被意外地多次呼叫。我們只在檔案描述符發生錯誤情況時才注意到重複的條目。在這種情況下,重複的條目通常對驅動程式來說不是問題,因為它應該會檢測到錯誤並取消選擇檔案描述符。因此,這個錯誤應該被認為是無害的。現在,模擬器會將重複的條目合併為一個。

    如果您使用的是 erts-5.5.2.* 和 Linux 上的核心輪詢功能,您才會受到此錯誤的影響。

    問題追蹤編號:OTP-6376,輔助追蹤編號:OTP-6222

  • 如果一個在 gen_tcp:accept/1 中等待的進程被終止,則在同一個監聽 socket 上再次呼叫 gen_tcp:accept/1 將會失敗,並出現 '{error,einval}' 的錯誤。

    問題追蹤編號:OTP-6381,輔助追蹤編號:seq10535

  • 當啟用核心輪詢支援且設定的最大檔案描述符數量小於或等於 256 時,模擬器無法在 Solaris 10 上啟動。

    問題追蹤編號:OTP-6384,輔助追蹤編號:OTP-6222

  • R10B 編譯器可能會產生不安全的 bs_save/bs_restore 指令,這可能會導致記憶體損壞。(R11B 編譯器沒有這個問題。)現在,Erlang 模擬器將拒絕載入包含此類不安全 bs_save/bs_restore 指令的 R10B 編譯模組。此外,編譯器中的 beam_validator 模組也會拒絕此類指令(以防它被用於驗證 R10B 程式碼)。(感謝 Matthew Reilly。)

    問題追蹤編號:OTP-6386

  • 在支援 SMP 的執行時系統上,進程和埠計時器可能無法正常工作。非常感謝 Dmitriy Kargapolov 和 Serge Aleynikov 追蹤到這個錯誤。

    問題追蹤編號:OTP-6387

  • 由 R10B 編譯器編譯的位元語法程式碼,如果匹配到浮點數,則不會正確檢查該浮點數是否有效;如果浮點數是 NaN 等,則模擬器可能會崩潰。

    問題追蹤編號:OTP-6395

  • Windows 上的 statistics(runtime) 過去會返回進程經過的系統時間,而不是使用者時間。已更正。(感謝 Robert Virding。)

    問題追蹤編號:OTP-6407

  • 使用 driver_async() 的可載入驅動程式(由 erl_ddll 載入)會導致模擬器崩潰。(感謝 Dmitriy Kargapolov。)

    問題追蹤編號:OTP-6410

  • 在極少數情況下,Unix 平台上的模擬器可能無法終止對應於使用 exit_status 選項開啟的埠程式的 Erlang 埠。

    問題追蹤編號:OTP-6411

  • 透過 unlink/1 移除的連結,在極少數情況下,當使用支援 SMP 的執行時系統時,可能會在呼叫 unlink/1 返回後的一小段時間內傳輸退出訊號。

    問題追蹤編號:OTP-6425,輔助追蹤編號:OTP-6160

改進和新功能

  • 在支援 SMP 的執行時系統中,埠現在與進程交錯在排程器執行緒上排程,而不是在單獨的 I/O 執行緒中執行。

    問題追蹤編號:OTP-6262

  • 在 erl_ddll 中新增了更多介面,以支援不同的使用情境。

    問題追蹤編號:OTP-6307,輔助追蹤編號: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) 的手冊頁。

    注意:動態連結的驅動程式必須重新編譯。

    * 潛在的不相容性 *

    問題追蹤編號:OTP-6330,輔助追蹤編號:OTP-6262

  • 新增了一個測試和除錯功能,可修改執行時系統的計時。有關更多資訊,請參閱 erl+T<Level> 命令列引數的文件。

    問題追蹤編號:OTP-6382

  • 連結到執行時系統的 zlib 版本(http://zlib.net)已更新至 1.2.3 版。

    問題追蹤編號:OTP-6394

  • 現在,erlc 程式會將 -smp-hybrid 選項傳遞給它啟動的 Erlang 模擬器。這主要用於編譯原生程式碼,因為原生程式碼必須使用與執行時系統相同的類型進行編譯。

    如果給定 -s 選項,erlc 現在會列印一個警告,指出該選項已過時,並且將在 R12B 中移除。

    問題追蹤編號:OTP-6398

  • erlang:system_flag/2schedulers 選項已被移除,即排程器執行緒的數量在模擬器啟動後無法再變更。

    已將 multi_scheduling 選項新增至 erlang:system_flag/2。此選項可用於封鎖和解除封鎖多排程。有關更多資訊,請參閱 erlang 文件。

    問題追蹤編號:OTP-6403

  • 使用 exit_status 選項啟動,並關閉其中一個用於與模擬器通訊的管道的埠程式,會導致模擬器持續輪詢埠程式的終止。只有在模擬器沒有其他事情可做,並且埠程式比終止早得多關閉管道時,才會出現問題。當模擬器有其他事情可做時,例如執行 Erlang 進程,模擬器會在排程進程之間輪詢終止。

    現在,模擬器根本不會輪詢埠程式的終止;相反地,它會等待來自終止埠程式的子訊號到達,然後排程 Erlang 埠終止。

    任何埠程式的終止也已最佳化。先前,任何埠程式的終止總是會導致掃描大小等於最大檔案描述符數量的表格。如果最大檔案描述符數量很大,則此掃描可能非常耗費資源。現在,搜尋已縮減至使用 exit_status 選項啟動的埠集合。

    請注意,以上所有內容僅適用於 Unix 平台上的 Erlang 模擬器。

    問題追蹤編號:OTP-6412,輔助追蹤編號:seq10194

  • * BEAM:新增了對 FreeBSD(32 位元 x86)上浮點數例外情況的支援

    * SMP:即使未實作原生鎖定操作,也使鎖定程序正常運作

    * SMP:改進了計時器執行緒中的計時準確性(如果已啟用)

    問題追蹤編號:OTP-6424

Erts 5.5.2.2

已修正的錯誤與故障

  • 核心輪詢實作中的一個錯誤可能會導致模擬器忽略輪詢檔案描述符上的事件。該錯誤僅在使用基於 epoll 或 kqueue 的核心輪詢實作時才會出現。此錯誤是在 erts-5.5.2 中引入的。

    問題追蹤編號:OTP-6344,輔助追蹤編號: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 秒後終止(以允許任何擱置的輸出寫入日誌檔案)。

    問題追蹤編號:OTP-6225,輔助追蹤編號:seq10500

  • ordered_set ETS 資料類型中的一個錯誤導致 ets:select(和 match)在表格包含來自另一個節點的進程 ID 時返回錯誤的結果。

    問題追蹤編號:OTP-6338

Erts 5.5.2

修正錯誤與故障

  • erlc:更正了 '-pa path' 說明文字中的錯字。

    專屬 ID:OTP-6218

  • port 命令/控制驅動程式回呼中的失敗可能會導致非 SMP 模擬器崩潰。此錯誤是在 erts 的 5.5 版本中引入的。

    專屬 ID:OTP-6224

  • 當驅動程式實例在驅動程式的 ready_output() 回呼中終止時,有時可能會出現錯誤的「Input driver gone away without deselecting!」錯誤報告。此錯誤僅存在於使用 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 支援的程式碼產生問題,因為這些程式碼期望 ets 表格已被移除。

    專屬 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/pollepollkqueue。Linux kpoll 已被 epoll 取代。在不久的將來,還將有一個使用 Solaris 事件連接埠的核心輪詢版本。

    unix 的「檢查 io」實作已完全重寫。目前的核心輪詢實作減少了與舊核心輪詢實作相比所需的系統呼叫次數。

    當使用 epollkqueue 時,pollselect 將用作回退。先前只有 poll 可以用作回退。由於 select 現在可以用作回退,因此核心輪詢支援現在也可在較新的 MacOSX 上使用。但請注意,當 select 用作回退時,檔案描述符的最大數量會限制為 FD_SETSIZE

    如果在建置 OTP 時找到 /dev/pollepollkqueue,則核心輪詢支援預設為啟用,也就是說,您不必將 --enable-kernel-poll 引數傳遞給 configure。與以前一樣,核心輪詢在運行時系統中預設為停用。為了啟用它,請將 +Ktrue 命令列引數傳遞給 erl

    注意:configure 將拒絕在 FreeBSD 上啟用核心輪詢支援,因為我們測試過的所有 FreeBSD 版本中,kqueue(至少)在管道方面存在問題。

    專屬 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,3spawn_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

  • 當程序執行 receive after 且逾時時間大於 10 分鐘時,記憶體配置錯誤可能會導致 SMP 模擬器崩潰。

    專屬 ID:OTP-6199

  • 當系統時間突然變更時,具有 SMP 支援的運行時系統不會緩慢調整其時間檢視。

    在具有 SMP 支援的運行時系統上,逾時有時可能會過早逾時。

    專屬 ID:OTP-6202

改進和新功能

  • smp 運行時系統現在會自動偵測 MacOSX (darwin) 和 OpenBSD 上的邏輯處理器數量。

    smp 運行時系統現在預設在 x86 上的 MacOSX (darwin) 上建置。

    專屬 ID:OTP-6119

  • -smp 命令列引數現在採用以下選項:enableautodisable

    尤其是 -smpauto 引數非常有用,因為如果 SMP 支援可用且偵測到多個邏輯處理器,則它會啟動具有 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 浮點例外。

    使 FP 例外在 FreeBSD/x86 上的 SMP 運行時系統中運作。

    支援在執行 Linux 的 SPARC 上浮點例外。

    運行時系統

    非 SMP 執行時期系統中的次要排程器最佳化。

    如果使用獨立的計時器執行緒,SMP 執行時期系統中 I/O 執行緒的額外負荷大幅降低。(在 R11B-1 中,未使用獨立的計時器執行緒。)

    專屬 ID:OTP-6211

ERTS 5.5

已修正的錯誤與故障

  • 先前,unlink/1erlang:demonitor/2 的行為是完全非同步的。但這有一個不良的影響。您永遠無法知道何時才能保證不會受到您已取消連結的連結或您已取消監視的監視器的影響。

    unlink/1erlang: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

  • 現在允許在保護式語法中使用 andalsoorelse 運算子。這也適用於比對規格。

    專屬 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 上的原生 POSIX 執行緒程式庫。
    • Solaris,具備至少 8 版的 32 位元 SPARC-V9。
    • MacOSX,具備至少 10.4 版 (Darwin 8.0) 的 32 位元 PowerPC。

    已知具有 SMP 支援的執行時期系統無法在以下環境建置

    • Windows。
    • Linux,內核版本低於 2.4,或沒有原生 POSIX 執行緒程式庫。
    • 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 執行時期系統才能利用所有處理器核心。

    具有 SMP 支援的 Erlang 執行時期系統如果一直只有一個 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

  • 在 Linux 系統 (至少某些 SuSE 和 Debian) 上,同時安裝 NPTL 和 Linuxthreads 程式庫時,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_tcpdelay_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 手冊頁面。

    為了能夠維護大量的計時器而不會增加維護成本,已擴大內部計時器輪和 bif 計時器表格。

    此外,還實作了一些小的 bif 計時器最佳化。

    自身 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/1iolist_to_binary/1

    已新增 BIF list_to_existing_atom/1

    小錯誤修正:如果在巢狀 try/catch 結構內部呼叫了具有空堆疊追蹤的 erlang:raise/3 BIF,則異常原因可能會變更為 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

  • 新的套接字選項 prioritytos 適用於支援它們的平台(目前僅限 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 = 範圍在 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

  • 已修正關於 tcp 套接字的錯誤,該錯誤會導致 gen_tcp:send/2 掛起。若要遇到此錯誤,您需要一個從套接字讀取的程序、一個寫入比讀取器讀取出的更多數據的程序(以便傳送者暫停),然後讀取器關閉套接字。(由 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}

    自身 ID:OTP-5618

改進與新功能

  • 新的 fun M:F/A 建構會建立一個 fun,該 fun 會參照 M:F/A 的最新版本。此語法旨在取代具有許多問題的元組 fun {M,F}

    新的類型測試 is_function(Fun,A)(可能在 guard 中使用)會測試 Fun 是否為可使用 A 個引數套用的 fun。(目前,Fun 也可以是元組 fun。)

    自身 ID:OTP-5584

  • 在 HiPE 應用程式中,有一個新的實驗性暫存器配置器(樂觀合併),而線性掃描暫存器配置器現在也適用於 ppc 架構。此外還有許多清理工作。

    混合堆積的微小修正。

    過去堆積的最大大小被人為限制,以便堆積的大小可以容納在 28 位元中;這種限制可能會導致模擬器在垃圾回收時終止,即使仍有可用記憶體。現在 32 位元 CPU 的最大堆積大小為 1,699,221,830 位元組。(感謝 Jesper Wilhelmsson。)

    同時移除了未記錄的 +H 模擬器選項。

    自身 ID:OTP-5596

ERTS 5.4.7

已修正的錯誤和故障

  • to_erl 在 Linux 系統上可能會意外關閉。此外,模擬器的輸出可能會遺失。已修正。

    自身 ID:OTP-5561

改進和新功能

  • 現在 Linux 也支援 erlang:trace/3cpu_timestamp 選項。

    自身 ID:OTP-5532 輔助 ID:seq9813

  • 當以最小化視窗停止 werl 時,最後已知的 werl 視窗大小/位置現在會正確儲存。如果模擬器從 JCL 選單停止或暫停,則位置未被儲存的問題也已修正。

    自身 ID:OTP-5544 輔助 ID:OTP-5522

ERTS 5.4.6

已修正的錯誤和故障

  • 某些數學函式庫並非總是在錯誤時拋出浮點數例外。為了能夠使用這些函式庫,現在會更徹底地檢查浮點數錯誤。

    針對 Linux 和 MacOSX 的其他浮點數修正。

    自身 ID:OTP-5467

  • 內部緩衝區有時未被清除,導致垃圾出現在傳送到錯誤記錄器的錯誤訊息中。

    errno 有時會被覆寫,導致關於 poll() 錯誤的錯誤報告。

    只有 Unix 平台上的模擬器受到這些錯誤的影響。

    自身 ID:OTP-5492

  • ethread 函式庫現在可以在 OpenBSD 上運作。

    自身 ID:OTP-5515

  • 修正了 gen_tcp 的(未記錄且不受支援的)選項 {packet,http} 中的錯誤。(感謝 Claes Wikstrom 和 Luke Gorrie。)

    自身 ID:OTP-5519

改進和新功能

  • 當給定無效的 pid 或 funs 時,binary_to_term/1 可能會導致模擬器崩潰。

    自身 ID:OTP-5484 輔助 ID:seq9801

  • 混合堆積模擬器中修正了一些穩定性問題。

    自身 ID:OTP-5489

  • 在最小化視窗關閉 werl 後,無法以開啟的視窗重新啟動 werl。目前已實施臨時解決方案,每次啟動 werl 時都會還原初始視窗設定。

    自身 ID:OTP-5522

ERTS 5.4.5

已修正的錯誤和故障

  • 如果一個進程有節點連結(由 monitor_node/2 建立),則為該進程執行 process_info(Pid,memory) 會使模擬器崩潰。

    自身 ID:OTP-5420

  • erlc -help 列印的說明文字進行了微小的修正。也稍微更新了 erlc 的文件。

    自身 ID:OTP-5428

  • 垃圾收集器中使用 32 位元字來表示偏移量。當垃圾收集期間堆積移動超過 4 GB 時,這會導致模擬器在 64 位元機器上崩潰。

    自身 ID:OTP-5430

  • 如果明確關閉優化,則 is_boolean(42.5) 無法載入。

    自身 ID:OTP-5448

  • 如果從任何已載入的模組呼叫 Module:foo/X,則 M:module_info(exports) 傳回的結果將始終包含 {foo,X}(即使 Module:foo/X 未定義)。

    自身 ID:OTP-5450 輔助 ID:seq9722

改進和新功能

  • +B 標誌引入了 c 選項,它可以使用 Ctrl-C(在 Windows 上為 Ctrl-Break)來中斷 shell 進程,而不是調用模擬器中斷處理程序。從現在起,所有新的 +B 選項也支援 Windows (werl)。此外,Windows 上的 Ctrl-C 現在已保留用於複製文字(之前使用 Ctrl-Ins)。Ctrl-Break 應使用於中斷處理。最後,系統標誌的文件已更新。

    自身 ID:OTP-5388

ERTS 5.4.4

已修正的錯誤和故障

  • 現在可以在匹配規格中使用函式 erlang:float/1,並且 dbg:fun2ms/1ets:fun2ms/1 可以識別它。此新增是將匹配規格防護與 Erlang 防護「協調一致」的工作的一部分。

    自身 ID:OTP-5297 輔助 ID:OTP-4927

  • 即使第二個參數不是活動進程的 pid,register/2 BIF 也會傳回 true。已修正為導致例外。

    自身 ID:OTP-5324 輔助 ID:seq9698

  • 在 ets 表的 'bag' 類型中,具有相同鍵的元素應按插入順序排序。如果發生重新雜湊,則會出錯。

    自身 ID:OTP-5340 輔助 ID:seq9704

  • 當模擬器啟用執行緒支援時,Crypto 和 Asn1 應用程式中的連結驅動程式現在會使用 -D_THREAD_SAFE-D_REENTRANT 開關在 Unix 上編譯。

    MacOSX 上的連結驅動程式不再使用未記錄的 -lbundle1.o 開關編譯。感謝 Sean Hinde 發送給我們的修補程式。

    現在,Crypto 中的連結驅動程式和 SSL 中的埠程式會在 OSF1 上編譯。

    Runtime_Tools 中的微小 makefile 改進。

    自身 ID:OTP-5346

  • 修正了分散式傳送操作中混合堆積的錯誤。

    自身 ID:OTP-5361

  • 新增了一個 BIF erlang:raise/3。詳細資訊請參閱手冊。它僅適用於內部系統程式設計,用於進階錯誤處理。

    自身 ID:OTP-5376 輔助 ID:OTP-5257

  • Mikael Pettersson (HiPE) 修正了模擬器中的一些錯誤,這些錯誤會在使用實驗性 gcc-4.0.0 編譯時導致問題。

    自身 ID:OTP-5386

改進和新功能

  • epmd 協定的內部文件進行了微小的更新。

    現在 epmd 的監聽埠已在 IANA 註冊:http://www.iana.org/assignments/port-numbers

    自身 ID:OTP-5234

  • 現在 run_erl.c 可以在 Mac OS X 和 FreeBSD 上運作。

    自身 ID:OTP-5384

  • HiPE 應用程式中修正了一些錯誤。

    自身 ID:OTP-5385

ERTS 5.4.3

已修正的錯誤和故障

  • 現在即使在第一次執行 werl.exe 之後,也可以儲存 werl.exe 的字型和顏色喜好設定。也會儲存視窗位置和大小。來自 James Hague 的修補程式,他完成了所有艱難的工作。

    自身 ID:OTP-5250

  • MacOSX 上的 OTP 封存函式庫(例如,erl_interface 函式庫)必須先對它們重新執行 ranlib,才能使用。此錯誤現已修正。

    自身 ID:OTP-5274

  • 已修正 64 位元平台上 erlang:hash/2erlang:phash/2 中的錯誤。

    自身 ID:OTP-5292

改進和新功能

  • 修正了 64 位元模擬器中的崩潰。

    修正了混合堆積模擬器中的問題。

    在 ERTS 使用者指南中關於抽象格式的章節中,更新了關於抽象格式如何儲存在 BEAM 檔案中的最後一部分。

    自身 ID:OTP-5262

  • 內部 ethread 執行緒套件中的最大並行執行緒數已限制為 2048。

    自身 ID:OTP-5280

ERTS 5.4.2.1

改進和新功能

  • 如果 Erlang/OTP 安裝在簡短的目錄名稱中,例如 C:\Program\erl5.4.2,模擬器將無法啟動。

    自身 ID:OTP-5254

ERTS 5.4.2

已修正的錯誤和故障

  • 如果對非固定 ETS 表同時使用 select/3select/1 並刪除物件,則模擬器可能會崩潰。請注意,對處於非固定狀態的表進行此類同步操作的結果仍然是未定義的,但不用說,模擬器崩潰已修正。

    自身 ID:OTP-5209 輔助 ID: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。

    專屬 ID:OTP-5216

  • 已更正 erts_alloc(3) 文件中的一個文件錯誤。文件中指出某些記憶體分配器預設是停用的。這對於 Erlang/OTP R9C 是正確的,但對於 Erlang/OTP R10B 則不正確。在 R10B 中,所有現有的記憶體分配器預設都是啟用的。

    專屬 ID:OTP-5217

改進和新功能

  • 現在,模擬器在收到 USR1 訊號後會立即關閉所有開啟的檔案和 Socket。這會導致模擬器儘早從 epmd 取消註冊。

    專屬 ID:OTP-5221 輔助 ID:OTP-4985,seq9514

  • 模擬器中的 try/catch 支援已稍微更新。

    專屬 ID:OTP-5229