From 3ccd708bc0406c3bf460feb261192179db1dccbd Mon Sep 17 00:00:00 2001 From: Sverker Eriksson Date: Tue, 10 May 2016 20:16:49 +0200 Subject: runtime_tools: Fix bug in trace_ip_drv causing extra calls to driver_select(,, _|ERL_DRV_USE, 0) reporting "... (re)selected before stop_select was called" Solution: Set data->fd to INVALID to avoid double call to close_client() in close_inlink_port(). --- lib/runtime_tools/c_src/trace_ip_drv.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/runtime_tools/c_src/trace_ip_drv.c') diff --git a/lib/runtime_tools/c_src/trace_ip_drv.c b/lib/runtime_tools/c_src/trace_ip_drv.c index a7d132ca6e..ab5a2d429d 100644 --- a/lib/runtime_tools/c_src/trace_ip_drv.c +++ b/lib/runtime_tools/c_src/trace_ip_drv.c @@ -384,6 +384,7 @@ static void trace_ip_output(ErlDrvData handle, char *buff, ErlDrvSizeT bufflen) } return; } + ASSERT(!IS_INVALID_SOCKET(data->fd)); if (data->que[data->questart] != NULL) { trace_ip_ready_output(handle, sock2event(data->fd)); } @@ -422,6 +423,7 @@ static void trace_ip_ready_input(ErlDrvData handle, ErlDrvEvent fd) /* ** Maybe accept, we are a listen port... */ + ASSERT(IS_INVALID_SOCKET(data->fd)); if (!IS_INVALID_SOCKET((client = my_accept(data->listenfd)))) { data->fd = client; set_nonblocking(client); @@ -745,6 +747,7 @@ static void close_client(TraceIpData *data) { my_driver_select(data, data->fd, FLAG_WRITE | FLAG_READ, SELECT_CLOSE); data->flags |= FLAG_LISTEN_PORT; + data->fd = INVALID_SOCKET; if (!(data->flags & FLAG_FILL_ALWAYS)) { clean_que(data); } -- cgit v1.2.3