[erlang-questions] Non-blocking send in erlang: how to save memory when send one content to many people
Rapsey
rapsey@REDACTED
Thu Dec 15 09:26:16 CET 2011
On Thu, Dec 15, 2011 at 9:00 AM, Zabrane Mickael <zabrane3@REDACTED> wrote:
> I have a NIF thread that listens on kqueue/epoll and communicates with a
> gen_server. Sockets are resources.
>
>
> 1 thread NIF per core?
>
>
All that the NIF thread does is accept connections and reads from sockets.
I see no need to have more than 1.
> 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).
>
>
> Could you please elaborae further on how communication is made from Erlang
> to NIF (the read/write pipe)?
>
>
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:
typedef struct kqmsg
{
char what;
int fd;
ErlNifPid pid;
void* data;
}kqmsg;
So I just fill up this struct with whatever info is required and do:
write(pipe_write,&msg,sizeof(struct kqmsg)
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.
Sergej
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20111215/841e00fd/attachment.htm>
More information about the erlang-questions
mailing list