<br><div class="gmail_quote">On Thu, Dec 15, 2011 at 9:00 AM, Zabrane Mickael <span dir="ltr"><<a href="mailto:zabrane3@gmail.com">zabrane3@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 style="word-wrap:break-word"><div><div><div class="im"><blockquote type="cite">I have a NIF thread that listens on kqueue/epoll and communicates with a gen_server. Sockets are resources.</blockquote><div><br></div></div>
1 thread NIF per core?</div><div><div class="im"><br></div></div></div></div></blockquote><div><br>All that the NIF thread does is accept connections and reads from sockets. I see no need to have more than 1.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div style="word-wrap:break-word"><div><div><div class="im"><blockquote type="cite"> Communication from NIFs to gen_server is simple since enif_send exists, communication from gen_server to the NIF thread is done by pipes (global library read pipe and write pipe).<br>
</blockquote><div><br></div></div>Could you please elaborae further on how communication is made from Erlang to NIF (the read/write pipe)?</div><div><br></div></div></div></blockquote><div> <br>On thread initialization the pipes get created and read pipe is placed in epoll/kqueue. Write pipe is from erlang to NIF, and read pipe is for NIF to read that data. I have a simple struct:<br>
typedef struct kqmsg<br>{<br>    char what;<br>    int fd;<br>    ErlNifPid pid;<br>    void* data;<br>}kqmsg;<br>So I just fill up this struct with whatever info is required and do: write(pipe_write,&msg,sizeof(struct kqmsg)<br>
<br>As for sockets, I do not use prim_inet:getfd, sockets are completely separate from gen_tcp. The NIF thread keeps the socket FD until it reads the first buffer from it. Once this happens it creates a socket resource, then sends the binary and socket with enif_send to the Erlang process that is in charge of deciding what to do with it. <br>
<br><br>Sergej<br></div></div>