#include "serverpool.h"
#include "state.pb.h"
#include "udpinput.h"
-#include "util.h"
#include "version.h"
using namespace std;
void UDPInput::close_socket()
{
- safe_close(sock);
+ int ret;
+ do {
+ ret = close(sock);
+ } while (ret == -1 && errno == EINTR);
+
+ if (ret == -1) {
+ log_perror("close()");
+ }
+
sock = -1;
}
void UDPInput::do_work()
{
- while (!should_stop()) {
+ while (!should_stop) {
if (sock == -1) {
int port_num = atoi(port.c_str());
sock = create_server_socket(port_num, UDP_SOCKET);
}
}
- // Wait for a packet, or a wakeup.
- bool activity = wait_for_activity(sock, POLLIN, NULL);
- if (!activity) {
- // Most likely, should_stop was set.
+ // Since we are non-blocking, we need to wait for the right state first.
+ // Wait up to 50 ms, then check should_stop.
+ pollfd pfd;
+ pfd.fd = sock;
+ pfd.events = POLLIN;
+
+ int nfds = poll(&pfd, 1, 50);
+ if (nfds == 0 || (nfds == -1 && errno == EINTR)) {
continue;
}
+ if (nfds == -1) {
+ log_perror("poll");
+ close_socket();
+ continue;
+ }
char buf[4096];
int ret;