X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Flog.c;h=916085f456a8d8c1a95dbfca8c13d3d5b038db12;hb=2269b2e7950d0d984ba73eed8d506c9feaeb82e9;hp=856330b6d4a8ea4ebe0c353d5aecd906296fd921;hpb=c82e6a87dc2d0f4da45e6e8023903f6d46c097f8;p=i3%2Fi3 diff --git a/src/log.c b/src/log.c index 856330b6..916085f4 100644 --- a/src/log.c +++ b/src/log.c @@ -1,5 +1,3 @@ -#undef I3__FILE__ -#define I3__FILE__ "log.c" /* * vim:ts=4:sw=4:expandtab * @@ -9,6 +7,8 @@ * log.c: Logging functions. * */ +#include + #include #include #include @@ -20,7 +20,9 @@ #include #include #include +#if !defined(__OpenBSD__) #include +#endif #include "util.h" #include "log.h" @@ -58,6 +60,8 @@ static char *loglastwrap; 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 @@ -84,11 +88,26 @@ void init_logging(void) { 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. */ @@ -108,15 +127,6 @@ void open_logbuffer(void) { * 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()); @@ -154,11 +164,13 @@ void open_logbuffer(void) { 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; @@ -172,6 +184,7 @@ void open_logbuffer(void) { void close_logbuffer(void) { close(logbuffer_shm); shm_unlink(shmlogname); + free(shmlogname); logbuffer = NULL; shmlogname = ""; } @@ -273,8 +286,10 @@ static void vlog(const bool print, const char *fmt, va_list args) { 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);