X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=accesslog.cpp;h=2d5eb0503e9ac00ab2c0bd7207f31eda61f1fa82;hp=03aeec8a51fb284884410418c1c9eef901cfd725;hb=HEAD;hpb=71fc5575037bead8b6e927a1fffd199e4fc4514b diff --git a/accesslog.cpp b/accesslog.cpp index 03aeec8..f10621f 100644 --- a/accesslog.cpp +++ b/accesslog.cpp @@ -1,98 +1,92 @@ -#include -#include #include #include #include -#include #include #include #include "accesslog.h" #include "client.h" #include "log.h" -#include "mutexlock.h" +#include "timespec.h" using namespace std; AccessLogThread::AccessLogThread() { - pthread_mutex_init(&mutex, NULL); } AccessLogThread::AccessLogThread(const string &filename) : filename(filename) { - pthread_mutex_init(&mutex, NULL); } void AccessLogThread::write(const ClientStats& client) { - MutexLock lock(&mutex); - pending_writes.push_back(client); + { + lock_guard lock(mu); + pending_writes.push_back(client); + } + wakeup(); } void AccessLogThread::do_work() { // Open the file. if (filename.empty()) { - logfp = NULL; + logfp = nullptr; } else { - logfp = fopen(filename.c_str(), "a+"); - if (logfp == NULL) { + logfp = fopen(filename.c_str(), "a+e"); + if (logfp == nullptr) { log_perror(filename.c_str()); // Continue as before. } } - while (!should_stop) { + while (!should_stop()) { // Empty the queue. vector writes; { - MutexLock lock(&mutex); + lock_guard lock(mu); swap(pending_writes, writes); } - if (logfp != NULL) { + if (logfp != nullptr) { // 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)); + timespec now_monotonic; + timespec now_realtime; + if (clock_gettime(CLOCK_MONOTONIC_COARSE, &now_monotonic) == -1) { + log_perror("clock_gettime(CLOCK_MONOTONIC_COARSE)"); + } else if (clock_gettime(CLOCK_REALTIME, &now_realtime) == -1) { + log_perror("clock_gettime(CLOCK_REALTIME)"); + } else { + timespec realtime_offset = clock_diff(now_monotonic, now_realtime); + for (size_t i = 0; i < writes.size(); ++i) { + timespec connect_time_realtime = clock_add(writes[i].connect_time, realtime_offset); + timespec time_since_connect = clock_diff(writes[i].connect_time, now_monotonic); + fprintf(logfp, "%llu %s %s %d %llu %llu %llu \"%s\" \"%s\"\n", + (long long unsigned)(connect_time_realtime.tv_sec), + writes[i].remote_addr.c_str(), + writes[i].url.c_str(), + int(time_since_connect.tv_sec), + (long long unsigned)(writes[i].bytes_sent), + (long long unsigned)(writes[i].bytes_lost), + (long long unsigned)(writes[i].num_loss_events), + writes[i].referer.c_str(), + writes[i].user_agent.c_str()); + } + fflush(logfp); } - 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; - int nfds = poll(&pfd, 1, 1000); - if (nfds == 0 || (nfds == -1 && errno == EINTR)) { - continue; - } - if (nfds == 1) { - // Should stop. - break; - } - if (nfds == -1) { - log_perror("poll"); - usleep(100000); - continue; - } + // Wait until we are being woken up, either to quit or because + // there is material in pending_writes. + wait_for_wakeup(nullptr); } - if (logfp != NULL) { + if (logfp != nullptr) { if (fclose(logfp) == EOF) { log_perror("fclose"); } } - logfp = NULL; + logfp = nullptr; }