#include <string.h>
#include <time.h>
#include <unistd.h>
-#include <sys/poll.h>
-#include <errno.h>
#include <vector>
#include "client.h"
#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");
- close(fd);
- unlink(filename);
+ safe_close(fd);
+ if (unlink(filename) == -1) {
+ log_perror(filename);
+ }
free(filename);
goto sleep;
}
client_stats[i].remote_addr.c_str(),
client_stats[i].sock,
client_stats[i].fwmark,
- client_stats[i].stream_id.c_str(),
+ client_stats[i].url.c_str(),
int(now - client_stats[i].connect_time),
(long long unsigned)(client_stats[i].bytes_sent),
(long long unsigned)(client_stats[i].bytes_lost),
}
if (fclose(fp) == EOF) {
log_perror("fclose");
- unlink(filename);
+ if (unlink(filename) == -1) {
+ log_perror(filename);
+ }
free(filename);
goto sleep;
}
if (rename(filename, stats_file.c_str()) == -1) {
log_perror("rename");
- unlink(filename);
+ if (unlink(filename) == -1) {
+ log_perror(filename);
+ }
}
+ free(filename);
sleep:
- // Wait until the stop_fd pipe is closed, stats_interval timeout,
+ // Wait until we are asked to quit, stats_interval timeout,
// or a spurious signal. (The latter will cause us to write stats
// too often, but that's okay.)
- 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;
- }
+ timespec timeout_ts;
+ timeout_ts.tv_sec = stats_interval;
+ timeout_ts.tv_nsec = 0;
+ wait_for_wakeup(&timeout_ts);
}
}