Semantic Monitors: a proposal
Michael Truog
mjtruog@REDACTED
Tue Feb 16 22:54:55 CET 2021
Using a string this way wouldn't be a good approach due to a lack of
visibility and quick evaluation (the expand function only works for
data, not evaluating functions). Providing an anonymous function for
evaluation would be the proper approach: fun erlang:monotonic_time/0.
So, I am suggesting allowing function evaluation when the DOWN message
is created unless the monotonic time could be added to the DOWN message
due to a separate option.
On 2/16/21 1:14 PM, Michael Truog wrote:
> Hi Guilherme,
>
> I have mainly wanted to get the native monotonic time added to monitor
> messages because of a monitor creation option, to avoid any variation
> due to Erlang process message queue delays (so the monotonic time
> value would be stored when the DOWN message is created, equivalent to
> a erlang:monotonic_time/0 function call).
>
> If it was possible to provide the data as a string, like
> "erlang:monotonic_time()" to get evaluated when the DOWN message is
> created, that would make me happy though it may seem like an odd
> approach that adds extra latency (it could be a separate option). The
> evaluation could be similar to the expand function below:
>
> expand(L) ->
> {ok, S, _} = erl_scan:string(L ++ "."),
> case erl_parse:parse_term(S) of
> {ok, Term} ->
> Term;
> {error, _} ->
> badarg
> end.
>
> I would want to avoid using a NIF outside of Erlang/OTP for this
> functionality, to keep all the core logic as Erlang source code.
> Adding the monotonic time to a monitor DOWN message helps to ensure
> you have the time of the process death in a consistent way where the
> time isn't being influenced by the Erlang process receiving the DOWN
> message (which remains completely separate and unrelated to the
> process that died).
>
> Best Regards,
> Michael
>
> On 2/16/21 9:32 AM, Guilherme Andrade wrote:
>> Hello list,
>>
>> I've spent years writing boilerplate for associating process monitors
>> with other identifiers and react appropriately (and performantly)
>> when one of those processes terminates.
>>
>> But: what if we could attach data to a monitor and get it back in its
>> DOWN message?
>>
>> You'd optionally associate data to a monitor when creating it:
>> * Ref = monitor(process, Pid, [{data, {user_id, <<"12345">>}}])
>>
>> And you'd get it back upon the monitor being triggered:
>> * {'DOWN', Ref, process, Pid, Reason, {user_id, <<"12345">>}}
>>
>> Regular monitors would still work the same way and keep the current
>> DOWN message format - nothing would break.
>>
>> I've explored this concept using NIFs and published the result to GitHub:
>> * https://github.com/g-andrade/vaktari
>>
>> Is this a good idea? If so, would it be feasible to implement it in
>> OTP? Should there be an EEP first? I'd be willing to contribute to
>> either.
>>
>> Any input is welcome.
>>
>> Cheers!
>>
>> --
>> Guilherme
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20210216/f10e87d2/attachment.htm>
More information about the erlang-questions
mailing list