<div dir="ltr">NIF provides for implementing 'functions with header in Erlang, and body in C'. This improves performance significantly against Port Drivers.<br><div><br></div><div>I am not sure why you wanted to send messages to a NIF. NIFs are not processes or ports, that you can send a message to. Only function arguments are passed from Erlang to C.</div><div><br></div><div>Also, NIFs are most suitable for synchronous returns.</div><div><br></div><div>Theepan</div><div><br></div><div> </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 29, 2015 at 8:25 PM, Daniel Goertzen <span dir="ltr"><<a href="mailto:daniel.goertzen@gmail.com" target="_blank">daniel.goertzen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span><p dir="ltr" style="margin-top:0pt;margin-bottom:0pt"><font color="#000000" face="Arial"><span style="font-size:14.6667px;line-height:20.24px;white-space:pre-wrap">I love the Erlang NIF API, but one thing I’ve missed is a nice way to send messages into NIF code.   Native Processes could provide that, but for a variety of reasons it doesn’t look like that will be implemented any time soon.  As a stopgap I would like to pitch the idea of “NIF Callback Pids”.  The idea is that there would be a new NIF API that would create a new PID and bind it to a user NIF function.  When anything is sent to that pid, the user NIF function is executed with the message term as a parameter.  It would look something like...

ErlNifPid enif_make_callback_pid(ErlNifEnv *, ErlNifSendCallback *cb, void *data);

... and then the callback would look like ...

void my_callback(ErlNifEnv *env, ErlNifCBEvent event, ERL_NIF_TERM msg, void *data) {
   if(event == Message) {
      ... handle message, parse and post to thread, etc
   } else if(event == Destroy) {
      ... free private data
   }



This would give NIF modules the power to emulate processes in a very flexible way.  A typical application would parse the message term and post a C struct to a thread.  A single thread could possibly represent many callback pids.  Or for certain applications, a thread may not be needed at all.

So, I’ve been reading VM code to see how this might be implemented, but before I get too far I should ask…

1. Has anyone explored this already?
2. Is the idea fundamentally broken is some way that would prevent it from ever working?
3. Does anyone other than me think this would be useful?</span></font></p><p dir="ltr" style="margin-top:0pt;margin-bottom:0pt"><font color="#000000" face="Arial"><span style="font-size:14.6667px;line-height:20.24px;white-space:pre-wrap"><br></span></font></p><p style="margin-top:0pt;margin-bottom:0pt"><font color="#000000" face="Arial"><span style="font-size:14.6667px;line-height:20.24px;white-space:pre-wrap">Thanks,</span></font></p><p style="margin-top:0pt;margin-bottom:0pt"><font color="#000000" face="Arial"><span style="font-size:14.6667px;line-height:20.24px;white-space:pre-wrap">Dan.</span></font></p></span><font color="#000000" face="Arial"><span style="font-size:14.6667px;line-height:20.24px;white-space:pre-wrap"> <br></span></font><div><br></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>