Conversation
e2c4216 to
f30b1f3
Compare
|
@bettio it seems that CI sometimes fails because it cannot find |
src/libAtomVM/term.h
Outdated
| #define BOXED_FUN_SIZE 3 | ||
| #define FLOAT_SIZE (sizeof(float_term_t) / sizeof(term) + 1) | ||
| #define REF_SIZE ((int) ((sizeof(uint64_t) / sizeof(term)) + 1)) | ||
| #define TERM_BOXED_PID_REF_SIZE (REF_SIZE + 1) |
There was a problem hiding this comment.
For consistency with the work we are doing lately I suggest renaming all PID_REF and pid_reference to PROCESS_REF and process_reference
src/libAtomVM/term.h
Outdated
| term *boxed_value = memory_heap_alloc(heap, TERM_BOXED_PID_REF_SIZE); | ||
| boxed_value[0] = TERM_BOXED_PID_REF_HEADER; | ||
|
|
||
| #if TERM_BYTES == 8 |
There was a problem hiding this comment.
nitpicking/very low priority comment: just for consistency I would suggest moving first the 4 branch:
#if TERM_BYTES == 4 ... #elif TERM_BYTES == 8.
Same applies to the other functions as well.
src/libAtomVM/term.c
Outdated
| return ret; | ||
|
|
||
| } else if (term_is_pid_reference(t)) { | ||
| int32_t process_id = term_pid_ref_to_process_id(t); |
There was a problem hiding this comment.
We are using uint32_t for process id.
There was a problem hiding this comment.
Are you sure? It's int32 here: https://github.com/atomvm/AtomVM/blob/main/src/libAtomVM/context.h#L106 and in many other places
tests/erlang_tests/test_monitor.erl
Outdated
| ok = test_alias(), | ||
| ok = test_monitor_alias(), | ||
| ok = test_monitor_alias_explicit_unalias(), | ||
| ok = test_monitor_down_alias(), |
There was a problem hiding this comment.
We should also test unhappy paths, such as:
- double/triple unalias
- alias a dead process
- unalias a dead process
In addition multiple aliases should be tested, this is legit but is should be properly tested.
src/libAtomVM/nifs.c
Outdated
| RAISE_ERROR(BADARG_ATOM); | ||
| } | ||
|
|
||
| while (!term_is_nil(options)) { |
There was a problem hiding this comment.
We should use term_is_nonempty_list to avoid issues with non proper lists.
src/libAtomVM/nifs.c
Outdated
| RAISE_ERROR(UNSUPPORTED_ATOM); | ||
| } else { | ||
| RAISE_ERROR(BADARG_ATOM); | ||
| } |
There was a problem hiding this comment.
here we check that last list item is nil.
src/libAtomVM/context.h
Outdated
| enum ContextMonitorAliasType | ||
| { | ||
| CONTEXT_MONITOR_ALIAS_EXPLICIT_UNALIAS, | ||
| CONTEXT_MONITOR_ALIAS_DEMONITOR, |
There was a problem hiding this comment.
Let's use PascalCase. See AVMCCS-N004 rule in our coding style guide.
(There is still some old code that has to be migrated to updated style).
4b23228 to
07373d0
Compare
|
@bettio added more tests and missing features. The CI is failing, but it seems unrelated to the changes |
bettio
left a comment
There was a problem hiding this comment.
Looks mostly good: there is only one change related to IS_NULL_PTR that is required. I suggest also rebasing on top of main, since main has a lot of fixes for flaky tests.
src/libAtomVM/opcodesswitch.h
Outdated
| Context *p = globalcontext_get_process_lock(glb, local_process_id); | ||
| if (p) { | ||
| struct MonitorAlias *alias = context_find_alias(p, ref_ticks); | ||
| if (!IS_NULL_PTR(alias)) { |
There was a problem hiding this comment.
We should not use !IS_NULL_PTR (x) since it is a shorthand for UNLIKELY(x == NULL). So we must use it only when it is unlikely that the pointer is null (that is mostly for error handling purposes).
There was a problem hiding this comment.
Done, but there are many occurrences of !IS_NULL_PTR in the code
92db4b7 to
1bdef14
Compare
|
esp32 tests are crashing |
pguyot
left a comment
There was a problem hiding this comment.
My main concern so far is that monitors are now extended to 2 or 3 words instead of 1 or 2. This may break some code that took monitors and passed it around as references, as the term_to_ref_ticks/term_from_ref_ticks is a common pattern. A similar breakage existed with resources being larger references if one tries to pass a resource where a 1/2 words ref is expected, but it is less likely as resources were not references so far. This may be the crash cause of esp32 tests.
port.erl
call(Port, Message, Timeout) ->
MonitorRef = monitor(port, Port),
Port ! {'$call', {self(), MonitorRef}, Message},
Result =
receive
{'DOWN', MonitorRef, port, Port, normal} ->
{error, noproc};
{'DOWN', MonitorRef, port, Port, Reason} ->
{error, Reason};
out_of_memory ->
out_of_memory;
{MonitorRef, Ret} ->
Ret
after Timeout ->
{error, timeout}
end,
demonitor(MonitorRef, [flush]),
Result.
uart_driver.c:
static void uart_driver_do_read(Context *ctx, GenMessage gen_message)
{
GlobalContext *glb = ctx->global;
struct UARTData *uart_data = ctx->platform_data;
term pid = gen_message.pid;
term ref = gen_message.ref;
uint64_t ref_ticks = term_to_ref_ticks(ref);
libs/estdlib/src/erlang.erl
Outdated
| -type raise_stacktrace() :: | ||
| [{module(), atom(), arity() | [term()]} | {function(), arity() | [term()]}] | stacktrace(). | ||
|
|
||
| -type monitor_option() :: {'alias', 'explicit_unalias' | 'demonitor' | 'reply_demonitor'}. |
There was a problem hiding this comment.
This is not enforced by style guide but usually we don't quote atoms when it's not required.
src/libAtomVM/context.c
Outdated
| } | ||
| // Prepare the message on ctx's heap which will be freed afterwards. | ||
| term ref = term_from_ref_ticks(monitored_monitor->ref_ticks, &ctx->heap); | ||
| term ref = term_make_process_reference(target->process_id, monitored_monitor->ref_ticks, &ctx->heap); |
There was a problem hiding this comment.
This is not what OTP does and there probably is a good reason.
Regular monitors are smaller than aliases.
7> Pid = spawn(fun() -> receive ok -> ok end end).
<0.94.0>
8> monitor(process, Pid).
#Ref<0.3008598808.1200095248.57512>
9> monitor(process, Pid, [{alias, explicit_unalias}]).
#Ref<0.0.11651.3008598808.1200160784.57533>
10> make_ref().
#Ref<0.3008598808.1200095248.57553>
src/libAtomVM/term.h
Outdated
| boxed_value[0] = TERM_BOXED_PROCESS_REF_HEADER; | ||
|
|
||
| #if TERM_BYTES == 4 | ||
| boxed_value[1] = (ref_ticks >> 4); |
There was a problem hiding this comment.
This was fixed for regular refs, we probably want ref_ticks >> 32
| end, | ||
| Term. | ||
|
|
||
| is_atomvm_or_otp_version_at_least(OTPVersion) -> |
There was a problem hiding this comment.
get_otp_version/0 already exists in this module.
Also there is a poor usage (fixed in #2025 )
OTPVersion = get_otp_version(),
if
OTPVersion =:= atomvm orelse OTPVersion >= 26 ->
B == erlang:term_to_binary(A);
true ->
true
end.
be sure to rather do:
OTPVersion = get_otp_version(),
if
OTPVersion >= 26 ->
B == erlang:term_to_binary(A);
true ->
true
end.
as atoms sort higher than integers.
There was a problem hiding this comment.
Also there is a poor usage
I would call it 'a readable way' :P
ce57282 to
eac7682
Compare
|
@pguyot the reason for the STM32 tests failing was that the size of a regular reference is actually 3 terms there, which means process reference takes 4 terms, and it probably conflicts with resource reference size, which is always 4 terms. I changed the process reference size to 5, but that's not a perfect solution :P So we need to come up with another way of distinguishing references - do you have anything in mind? I also added |
dc30e6b to
a0f7887
Compare
| TRACE_SEND(ctx, x_regs[0], x_regs[1]); | ||
| globalcontext_send_message(ctx->global, local_process_id, x_regs[1]); | ||
| } else if (term_is_process_reference(recipient_term)) { | ||
| int32_t local_process_id = term_process_ref_to_process_id(recipient_term); |
There was a problem hiding this comment.
I also found the same issue with send() NIF.
|
|
||
| globalcontext_send_message(glb, local_process_id, argv[1]); | ||
|
|
||
| } else if (term_is_process_reference(target)) { |
src/libAtomVM/nifs.c
Outdated
| RefData ref_data = { | ||
| .type = RefTypeProcess, | ||
| .process = { .ref_ticks = globalcontext_get_ref_ticks(ctx->global), .process_id = ctx->process_id } | ||
| }; |
There was a problem hiding this comment.
Tried that, it cannot be left enabled by default, otherwise it would format some trivial code in a quite awful way :(
src/libAtomVM/context.h
Outdated
|
|
||
| /** | ||
| * @brief Find a process alias | ||
| * @details Called within the process only |
There was a problem hiding this comment.
The information here in details is not clear to me.
| { | ||
| struct Monitor monitor; | ||
| uint64_t ref_ticks; | ||
| RefData ref_data; |
There was a problem hiding this comment.
Let's use this as an example.
We are storing the entire the entire RefData structure even if we already know in advance: which monitor type is and that we will use only ref_ticks.
This is not efficient in terms of memory usage as soon as we starting having around several monitors.
There was a problem hiding this comment.
In this particular case, RefData is needed, because when making a term out of it, we need to know whether to create a process ref or a regular ref. If we need a process ref, then we also need a process id, which we now have in RefData, which is convenient, but we could probably keep a flag instead and get process_id from the context. Still, we'd have to keep a flag, so the savings would be marginal, if any.
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
31b3f98 to
f836ea9
Compare
f836ea9 to
8651323
Compare
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
Signed-off-by: Mateusz Front <mateusz.front@swmansion.com>
|
Amp delivered this review: https://ampcode.com/threads/T-019cc41b-47c0-735d-a474-3fc46fe3caee - expanded here: https://gist.github.com/petermm/c3286d0cd622e7d5985a32dbca4b006d All caveats apply - and I'm fully pragmatic about llm being both wrong and pedantic - so pick and choose, and let's land this sooner rather than later, even if there is an todo issue - with further hardening.. PR #2027 Review — Process Aliases & Process ReferencesBranch: SummaryThis PR adds Erlang/OTP-compatible process aliases to AtomVM. Key changes:
The design direction is sound and the test coverage is good. However, there are several issues that should be addressed before merge. 🔴 Critical Issues1.
|
TODO:
spawn_optThese changes are made under both the "Apache 2.0" and the "GNU Lesser General
Public License 2.1 or later" license terms (dual license).
SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later