Commit 9dbcb11c authored by Jan Moskyto Matejka's avatar Jan Moskyto Matejka
Browse files

Unix IO: Tried to fix strange behavior after POLLHUP or POLLERR.

parent 3f2c7600
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -1853,6 +1853,20 @@ sk_write(sock *s)
  }
}

void
sk_err(sock *s, int revents)
{
  int se = 0, sse = sizeof(se);
  if (revents & POLLERR)
    if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &se, &sse) < 0)
    {
      log(L_ERR "IO: Socket error: SO_ERROR: %m");
      se = 0;
    }

  s->err_hook(s, se);
}

void
sk_dump_all(void)
{
@@ -2163,7 +2177,7 @@ io_loop(void)
	      int steps;

	      steps = MAX_STEPS;
	      if (s->fast_rx && (pfd[s->index].revents & (POLLIN | POLLHUP | POLLERR)) && s->rx_hook)
	      if (s->fast_rx && (pfd[s->index].revents & POLLIN) && s->rx_hook)
		do
		  {
		    steps--;
@@ -2185,6 +2199,7 @@ io_loop(void)
		      goto next;
		  }
		while (e && steps);

	      current_sock = sk_next(s);
	    next: ;
	    }
@@ -2208,7 +2223,7 @@ io_loop(void)
		  goto next2;
		}

	      if (!s->fast_rx && (pfd[s->index].revents & (POLLIN | POLLHUP | POLLERR)) && s->rx_hook)
	      if (!s->fast_rx && (pfd[s->index].revents & POLLIN) && s->rx_hook)
		{
		  count++;
		  io_log_event(s->rx_hook, s->data);
@@ -2216,10 +2231,18 @@ io_loop(void)
		  if (s != current_sock)
		    goto next2;
		}

	      if (pfd[s->index].revents & (POLLHUP | POLLERR))
		{
		  sk_err(s, pfd[s->index].revents);
		    goto next2;
		}

	      current_sock = sk_next(s);
	    next2: ;
	    }


	  stored_sock = current_sock;
	}
    }