summaryrefslogtreecommitdiff
path: root/erts/emulator/test/erts_test_utils.erl
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2023-02-08 01:39:35 +0100
committerRickard Green <rickard@erlang.org>2023-02-09 16:08:56 +0100
commitaad2efaee02ae4507dc56bd5bdecac3ee21b4200 (patch)
treee28114875cfde45fe6e2eac61e2e459ad20a19b6 /erts/emulator/test/erts_test_utils.erl
parenta2311845930de6dccba93c58b733dc4a75b1d754 (diff)
downloaderlang-aad2efaee02ae4507dc56bd5bdecac3ee21b4200.tar.gz
[erts] 60-bit process/port identifiers on 64-bit runtime
Extending the amount of significant bits in node local process identifiers and port identifiers from 28 bits to 60 bits on 64-bit runtime systems. This makes these identifiers large enough to in practice never having to be reused during the life time of a node.
Diffstat (limited to 'erts/emulator/test/erts_test_utils.erl')
-rw-r--r--erts/emulator/test/erts_test_utils.erl61
1 files changed, 45 insertions, 16 deletions
diff --git a/erts/emulator/test/erts_test_utils.erl b/erts/emulator/test/erts_test_utils.erl
index 85ef8c203f..9cedff4f84 100644
--- a/erts/emulator/test/erts_test_utils.erl
+++ b/erts/emulator/test/erts_test_utils.erl
@@ -47,6 +47,8 @@
-define(V4_PORT_EXT, $x).
-define(OLD_MAX_PIDS_PORTS, ((1 bsl 28) - 1)).
+-define(OLD_MAX_PID_NUM, ((1 bsl 15) - 1)).
+-define(OLD_MAX_PID_SER, ((1 bsl 13) - 1)).
uint64_be(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 64 ->
[(Uint bsr 56) band 16#ff,
@@ -79,27 +81,52 @@ uint8(Uint) when is_integer(Uint), 0 =< Uint, Uint < 1 bsl 8 ->
uint8(Uint) ->
exit({badarg, uint8, [Uint]}).
-pid_tag(bad_creation) -> ?PID_EXT;
-pid_tag(Creation) when Creation =< 3 -> ?PID_EXT;
-pid_tag(_Creation) -> ?NEW_PID_EXT.
-
-enc_creation(bad_creation) -> uint8(4);
-enc_creation(Creation) when Creation =< 3 -> uint8(Creation);
-enc_creation(Creation) -> uint32_be(Creation).
+pid_tag(_, _, bad_creation) ->
+ ?PID_EXT;
+pid_tag(Num, Ser, Creation) when Num =< ?OLD_MAX_PID_NUM,
+ Ser =< ?OLD_MAX_PID_SER,
+ Creation =< 3 ->
+ ?PID_EXT;
+pid_tag(_Num, _Ser, _Creation) ->
+ ?NEW_PID_EXT.
+
+enc_creation(_, bad_creation) ->
+ uint8(4);
+enc_creation(Num, Creation) when is_integer(Num),
+ Num =< ?OLD_MAX_PIDS_PORTS,
+ Creation =< 3 ->
+ uint8(Creation);
+enc_creation(Nums, Creation) when is_list(Nums),
+ length(Nums) =< 3,
+ Creation =< 3 ->
+ uint8(Creation);
+enc_creation(_Num, Creation) ->
+ uint32_be(Creation).
+
+enc_creation(_, _, bad_creation) ->
+ uint8(4);
+enc_creation(Num, Ser, Creation) when Num =< ?OLD_MAX_PID_NUM,
+ Ser =< ?OLD_MAX_PID_SER,
+ Creation =< 3 ->
+ uint8(Creation);
+enc_creation(_Num, _Ser, Creation) ->
+ uint32_be(Creation).
mk_ext_pid({NodeName, Creation}, Number, Serial) when is_atom(NodeName) ->
mk_ext_pid({atom_to_list(NodeName), Creation}, Number, Serial);
mk_ext_pid({NodeName, Creation}, Number, Serial) ->
case catch binary_to_term(list_to_binary([?VERSION_MAGIC,
- pid_tag(Creation),
+ pid_tag(Number, Serial, Creation),
?ATOM_EXT,
uint16_be(length(NodeName)),
NodeName,
uint32_be(Number),
uint32_be(Serial),
- enc_creation(Creation)])) of
+ enc_creation(Number, Serial, Creation)])) of
Pid when is_pid(Pid) ->
Pid;
+ {'EXIT', {badarg, uint32_be, _}} ->
+ exit({badarg, mk_pid, [{NodeName, Creation}, Number, Serial]});
{'EXIT', {badarg, _}} ->
exit({badarg, mk_pid, [{NodeName, Creation}, Number, Serial]});
Other ->
@@ -127,21 +154,23 @@ mk_ext_port({NodeName, Creation}, Number) ->
true -> uint64_be(Number);
false -> uint32_be(Number)
end,
- enc_creation(Creation)])) of
+ enc_creation(Number, Creation)])) of
Port when is_port(Port) ->
Port;
+ {'EXIT', {badarg, Uint, _}} when Uint == uint64_be; Uint == uint32_be ->
+ exit({badarg, mk_port, [{NodeName, Creation}, Number]});
{'EXIT', {badarg, _}} ->
exit({badarg, mk_port, [{NodeName, Creation}, Number]});
Other ->
exit({unexpected_binary_to_term_result, Other})
end.
-ref_tag(bad_creation) -> ?NEW_REFERENCE_EXT;
-ref_tag(Creation) when Creation =< 3 -> ?NEW_REFERENCE_EXT;
-ref_tag(_Creation) -> ?NEWER_REFERENCE_EXT.
+ref_tag(_Nums, bad_creation) -> ?NEW_REFERENCE_EXT;
+ref_tag(Nums, Creation) when length(Nums) =< 3, Creation =< 3 -> ?NEW_REFERENCE_EXT;
+ref_tag(_Nums, _Creation) -> ?NEWER_REFERENCE_EXT.
mk_ext_ref({NodeName, Creation}, Numbers) when is_atom(NodeName),
- is_list(Numbers) ->
+ is_list(Numbers) ->
mk_ext_ref({atom_to_list(NodeName), Creation}, Numbers);
mk_ext_ref({NodeName, Creation}, [Number]) when is_list(NodeName),
Creation =< 3,
@@ -163,12 +192,12 @@ mk_ext_ref({NodeName, Creation}, [Number]) when is_list(NodeName),
mk_ext_ref({NodeName, Creation}, Numbers) when is_list(NodeName),
is_list(Numbers) ->
case catch binary_to_term(list_to_binary([?VERSION_MAGIC,
- ref_tag(Creation),
+ ref_tag(Numbers, Creation),
uint16_be(length(Numbers)),
?ATOM_EXT,
uint16_be(length(NodeName)),
NodeName,
- enc_creation(Creation),
+ enc_creation(Numbers, Creation),
lists:map(fun (N) ->
uint32_be(N)
end,