X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=accesslog.cpp;h=410b3b6e1b92b655530f2de415653916ddde54f0;hp=a0467b1572603c17ea74ea2839e5408f7bdf13f5;hb=9abb89bcf7940e2ada9d708f86a218a56334f68d;hpb=f67fda5486a09098c75691c1ac1fcdc033903f59 diff --git a/accesslog.cpp b/accesslog.cpp index a0467b1..410b3b6 100644 --- a/accesslog.cpp +++ b/accesslog.cpp @@ -1,9 +1,9 @@ +#include +#include +#include #include +#include #include -#include -#include - -#include #include #include @@ -16,12 +16,12 @@ using namespace std; AccessLogThread::AccessLogThread() { - pthread_mutex_init(&mutex); + pthread_mutex_init(&mutex, NULL); } AccessLogThread::AccessLogThread(const string &filename) : filename(filename) { - pthread_mutex_init(&mutex); + pthread_mutex_init(&mutex, NULL); } void AccessLogThread::write(const ClientStats& client) @@ -43,7 +43,7 @@ void AccessLogThread::do_work() } } - while (!should_stop) { + while (!should_stop()) { // Empty the queue. vector writes; { @@ -51,47 +51,31 @@ void AccessLogThread::do_work() swap(pending_writes, writes); } - if (logfp == NULL) { - continue; + if (logfp != NULL) { + // Do the actual writes. + time_t now = time(NULL); + for (size_t i = 0; i < writes.size(); ++i) { + fprintf(logfp, "%llu %s %s %d %llu %llu %llu\n", + (long long unsigned)(writes[i].connect_time), + writes[i].remote_addr.c_str(), + writes[i].url.c_str(), + int(now - writes[i].connect_time), + (long long unsigned)(writes[i].bytes_sent), + (long long unsigned)(writes[i].bytes_lost), + (long long unsigned)(writes[i].num_loss_events)); + } + fflush(logfp); } - // Do the actual writes. - time_t now = time(NULL); - for (size_t i = 0; i < writes.size(); ++i) { - fprintf(logfp, "%llu %s %s %d %llu %llu %llu\n", - (long long unsigned)(writes[i].connect_time), - writes[i].remote_addr.c_str(), - writes[i].stream_id.c_str(), - int(now - writes[i].connect_time), - (long long unsigned)(writes[i].bytes_sent), - (long long unsigned)(writes[i].bytes_lost), - (long long unsigned)(writes[i].num_loss_events)); - } - fflush(logfp); - - // Wait until the stop_fd pipe is closed, one second has passed. - // or a spurious signal arrives. - pollfd pfd; - pfd.fd = stop_fd_read; - pfd.events = POLLIN | POLLRDHUP; + // Wait until we are being woken up, either to quit or because + // there is material in pending_writes. + wait_for_wakeup(NULL); + } - int nfds = poll(&pfd, 1, 1000); - if (nfds == 0 || (nfds == -1 && errno == EINTR)) { - continue; - } - if (nfds == 1) { - // Should stop. - break; + if (logfp != NULL) { + if (fclose(logfp) == EOF) { + log_perror("fclose"); } - if (nfds == -1) { - log_perror("poll"); - usleep(100000); - continue; - } - } - - if (fclose(logfp) == EOF) { - log_perror("fclose"); } logfp = NULL;