* extra system calls and confusion. */
FD_CLR(server->udp_socket, read_fds);
- count = sread(server->udp_socket, buf, sizeof(buf));
- if (count == -1 && try_again(SOCKERRNO))
- continue;
- else if (count <= 0)
- handle_error(channel, i, now);
-
- process_answer(channel, buf, (int)count, i, 0, now);
+ /* To reduce event loop overhead, read and process as many
+ * packets as we can. */
+ do {
+ count = sread(server->udp_socket, buf, sizeof(buf));
+ if (count == -1 && try_again(SOCKERRNO))
+ continue;
+ else if (count <= 0)
+ handle_error(channel, i, now);
+ else
+ process_answer(channel, buf, (int)count, i, 0, now);
+ } while (count > 0);
}
}