-#include <errno.h>
-#include <poll.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>
-#include <unistd.h>
#include <string>
#include <vector>
#include "client.h"
#include "log.h"
#include "mutexlock.h"
+#include "timespec.h"
using namespace std;
void AccessLogThread::write(const ClientStats& client)
{
- MutexLock lock(&mutex);
- pending_writes.push_back(client);
+ {
+ MutexLock lock(&mutex);
+ pending_writes.push_back(client);
+ }
+ wakeup();
}
void AccessLogThread::do_work()
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].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 we are being woken up, either to quit or because