#include "log.h"
#include "serverpool.h"
#include "stats.h"
-#include "util.h"
using namespace std;
void StatsThread::do_work()
{
- while (!should_stop()) {
+ while (!should_stop) {
int fd;
FILE *fp;
time_t now;
fp = fdopen(fd, "w");
if (fp == NULL) {
log_perror("fdopen");
- safe_close(fd);
+ if (close(fd) == -1) {
+ log_perror("close");
+ }
if (unlink(filename) == -1) {
log_perror(filename);
}
free(filename);
sleep:
- // Wait until we are asked to quit, stats_interval timeout,
+ // Wait until the stop_fd pipe is closed, stats_interval timeout,
// or a spurious signal. (The latter will cause us to write stats
// too often, but that's okay.)
- timespec timeout_ts;
- timeout_ts.tv_sec = stats_interval;
- timeout_ts.tv_nsec = 0;
- wait_for_wakeup(&timeout_ts);
+ pollfd pfd;
+ pfd.fd = stop_fd_read;
+ pfd.events = POLLIN | POLLRDHUP;
+
+ int nfds = poll(&pfd, 1, stats_interval * 1000);
+ if (nfds == 0 || (nfds == -1 && errno == EINTR)) {
+ continue;
+ }
+ if (nfds == 1) {
+ // Should stop.
+ break;
+ }
+ if (nfds == -1) {
+ log_perror("poll");
+ usleep(100000);
+ continue;
+ }
}
}