Kill a NIF's process

Sverker Eriksson sverker.eriksson@REDACTED
Thu Apr 22 10:56:24 CEST 2021

If enif_monitor_process(_, Rsrc, Proc, _) returns 0 (success) then the monitor 
is active and the down callback is guaranteed to be called when process Proc 
terminates, unless

*	the resource Rsrc was deallocated before. The destructor callback will 
always be the last callback of a resource object.
*	the monitor was cancelled before with enif_demitor_process().

If the target process has already been killed then enif_monitor_process() is 
guaranteed to fail. There is no in between race, as with all other monitor and 
link creation.

Side note:

A dirty NIF can check the liveness of its process with 
enif_is_current_process_alive() without the need of self monitoring.


From: Robert Harris <robert.harris@REDACTED>
Sent: den 22 april 2021 09:05
To: Sverker Eriksson <sverker.eriksson@REDACTED>
Cc: erlang-questions@REDACTED
Subject: Re: Kill a NIF's process

Hi Sverker,

> On 21 Apr 2021, at 17:37, Sverker Eriksson <sverker.eriksson@REDACTED 
> <mailto:sverker.eriksson@REDACTED> > wrote:
> At process termination the deallocation of the heap is delayed until a 
> running dirty NIF has returned. This to make sure the dirty NIF can safely 
> continue read its arguments.

That makes things somewhat simpler; thank you.

> The firing of links and monitors (including NIF monitor down calls), on the 
> other hand, are not delayed by a running dirty NIF.

Is enif_monitor_process() serialised with respect to the delivery of
an exit signal by a concurrent thread? I.e. if the function returns zero
and the caller is later killed then is it guaranteed that its down
callback will be invoked? I am wondering if (absent any documentation
to the contrary) there might exist a race condition in which process A
might kill process B at exactly the time that the latter calls
enif_monitor_process(), e.g. in the (untested) code below.



/* resource object */
typedef struct foo {
int abort;
} foo_t;

down(ErlNifEnv *env, void *obj, ErlNifPid *pid, ErlNifMonitor *mon)
((foo_t *)obj)->abort = 1;

some_dirty_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
foo_t *foop;
ErlNifPid pid;
ErlNifMonitor monitor;

enif_get_resource(env, argv[0], foo_resource, (void **)&foop));
foop->abort = 0;

enif_self(env, &pid);
if (enif_monitor_process(env, foop, pid, &monitor) > 0)
/* process already dead; abort */

/* lost a signal here? */

while (/* some very long loop */) {
if (foop->abort) {
/* process waiting to die; abort */
/* do stuff */

/* no longer care about being directed to abort */
enif_demonitor_process(env, foop, &monitor);
/* return */
Confidentiality Notice | This email and any included attachments may be 
privileged, confidential and/or otherwise protected from disclosure. Access to 
this email by anyone other than the intended recipient is unauthorized. If you 
believe you have received this email in error, please contact the sender 
immediately and delete all copies. If you are not the intended recipient, you 
are notified that disclosing, copying, distributing or taking any action in 
reliance on the contents of this information is strictly prohibited.


The information contained in this communication from the sender is 
confidential. It is intended solely for use by the recipient and others 
authorized to receive it. If you are not the recipient, you are hereby 
notified that any disclosure, copying, distribution or taking action in 
relation of the contents of this information is strictly prohibited and may be 

This email has been scanned for viruses and malware, and may have been 
automatically archived by Mimecast, a leader in email security and cyber 
resilience. Mimecast integrates email defenses with brand protection, security 
awareness training, web security, compliance and other essential capabilities. 
Mimecast helps protect large and small organizations from malicious activity, 
human error and technology failure; and to lead the movement toward building a 
more resilient world. To find out more, visit our website.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5509 bytes
Desc: not available
URL: <>

More information about the erlang-questions mailing list