-#undef I3__FILE__
-#define I3__FILE__ "log.c"
/*
* vim:ts=4:sw=4:expandtab
*
* log.c: Logging functions.
*
*/
+#include <config.h>
+
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
+#if !defined(__OpenBSD__)
#include <pthread.h>
+#endif
#include "util.h"
#include "log.h"
static int logbuffer_size;
/* File descriptor for shm_open. */
static int logbuffer_shm;
+/* Size (in bytes) of physical memory */
+static long long physical_mem_bytes;
/*
* Writes the offsets for the next write and for the last wrap to the
fprintf(stderr, "Could not initialize errorlog\n");
else {
errorfile = fopen(errorfilename, "w");
- if (fcntl(fileno(errorfile), F_SETFD, FD_CLOEXEC)) {
- fprintf(stderr, "Could not set close-on-exec flag\n");
+ if (!errorfile) {
+ fprintf(stderr, "Could not initialize errorlog on %s: %s\n",
+ errorfilename, strerror(errno));
+ } else {
+ if (fcntl(fileno(errorfile), F_SETFD, FD_CLOEXEC)) {
+ fprintf(stderr, "Could not set close-on-exec flag\n");
+ }
}
}
}
+ if (physical_mem_bytes == 0) {
+#if defined(__APPLE__)
+ int mib[2] = {CTL_HW, HW_MEMSIZE};
+ size_t length = sizeof(long long);
+ sysctl(mib, 2, &physical_mem_bytes, &length, NULL, 0);
+#else
+ physical_mem_bytes = (long long)sysconf(_SC_PHYS_PAGES) *
+ sysconf(_SC_PAGESIZE);
+#endif
+ }
/* Start SHM logging if shmlog_size is > 0. shmlog_size is SHMLOG_SIZE by
* default on development versions, and 0 on release versions. If it is
* not > 0, the user has turned it off, so let's close the logbuffer. */
* For 512 MiB of RAM this will lead to a 5 MiB log buffer.
* At the moment (2011-12-10), no testcase leads to an i3 log
* of more than ~ 600 KiB. */
- long long physical_mem_bytes;
-#if defined(__APPLE__)
- int mib[2] = {CTL_HW, HW_MEMSIZE};
- size_t length = sizeof(long long);
- sysctl(mib, 2, &physical_mem_bytes, &length, NULL, 0);
-#else
- physical_mem_bytes = (long long)sysconf(_SC_PHYS_PAGES) *
- sysconf(_SC_PAGESIZE);
-#endif
logbuffer_size = min(physical_mem_bytes * 0.01, shmlog_size);
#if defined(__FreeBSD__)
sasprintf(&shmlogname, "/tmp/i3-log-%d", getpid());
header = (i3_shmlog_header *)logbuffer;
+#if !defined(__OpenBSD__)
pthread_condattr_t cond_attr;
pthread_condattr_init(&cond_attr);
if (pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED) != 0)
fprintf(stderr, "pthread_condattr_setpshared() failed, i3-dump-log -f will not work!\n");
pthread_cond_init(&(header->condvar), &cond_attr);
+#endif
logwalk = logbuffer + sizeof(i3_shmlog_header);
loglastwrap = logbuffer + logbuffer_size;
void close_logbuffer(void) {
close(logbuffer_shm);
shm_unlink(shmlogname);
+ free(shmlogname);
logbuffer = NULL;
shmlogname = "";
}
store_log_markers();
+#if !defined(__OpenBSD__)
/* Wake up all (i3-dump-log) processes waiting for condvar. */
pthread_cond_broadcast(&(header->condvar));
+#endif
if (print)
fwrite(message, len, 1, stdout);