]> git.sesse.net Git - cubemap/blobdiff - accesslog.cpp
Create $(libdir) on make install.
[cubemap] / accesslog.cpp
index 3e1ebe522ff3f5d462f42659788993b7bffa368f..f10621f52c5055f17dd01ac0cd7391efa7bc204f 100644 (file)
@@ -7,24 +7,22 @@
 #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);
+               lock_guard<mutex> lock(mu);
                pending_writes.push_back(client);
        }
        wakeup();
@@ -34,10 +32,10 @@ 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.
                }
@@ -47,22 +45,28 @@ void AccessLogThread::do_work()
                // Empty the queue.
                vector<ClientStats> writes;
                {
-                       MutexLock lock(&mutex);
+                       lock_guard<mutex> lock(mu);
                        swap(pending_writes, writes);
                }
 
-               if (logfp != NULL) {
+               if (logfp != nullptr) {
                        // Do the actual writes.
-                       timespec now;
-                       if (clock_gettime(CLOCK_MONOTONIC_COARSE, &now) == -1) {
+                       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)(writes[i].connect_time.tv_sec),
+                                               (long long unsigned)(connect_time_realtime.tv_sec),
                                                writes[i].remote_addr.c_str(),
                                                writes[i].url.c_str(),
-                                               int(now.tv_sec - writes[i].connect_time.tv_sec),  // Rather coarse.
+                                               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),
@@ -75,14 +79,14 @@ void AccessLogThread::do_work()
 
                // Wait until we are being woken up, either to quit or because
                // there is material in pending_writes.
-               wait_for_wakeup(NULL);
+               wait_for_wakeup(nullptr);
        }
 
-       if (logfp != NULL) {    
+       if (logfp != nullptr) { 
                if (fclose(logfp) == EOF) {
                        log_perror("fclose");
                }
        }
 
-       logfp = NULL;
+       logfp = nullptr;
 }