[erlang-questions] Port is included in erlang:ports(), but erlang:port_info(Port) returnes 'undefined'

skyman <>
Tue Mar 19 16:36:42 CET 2013


Hi everyone,
I encounter a problem:
While server socket is sending packets, client socket closes, then I find the socket's send_pend( inet:getstat(Socket, [send_pend]) ) is always > 0, that is some data isn't sent out. After closing the port, I find the port is still included in erlang:ports(), but erlang:port_info(Port) returnes 'undefined'. I guess that because the port's send queue is not empty, the erts set the port's status to be ERTS_PORT_SFLG_CLOSING, so the results between erlang:ports() and erlang:port_info() are inconsistent. The code:


void erts_do_exit_port(Port *p, Eterm from, Eterm reason)
{
   ...
   if ((reason != am_kill) && !is_port_ioq_empty(p)) {
       erts_port_status_bandor_set(p,
                                        ~ERTS_PORT_SFLG_EXITING, /* must turn it off */
                                        ERTS_PORT_SFLG_CLOSING);
      flush_port(p);
   }
   ...
}


The problem can only exist with TCP option: {delay_send, true}. When set {delay_send, false}, the problem disappears.


In addition, on this occasion erlang:halt() cannot terminate the node, have to use erlang:halt(Status, [{flush,false}]).


Can anyone help me? Thanks in advance!

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130319/18a52106/attachment.html>


More information about the erlang-questions mailing list