X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Flog.c;h=7cf988438063ca5df2aaacce329e7d1e35224cb6;hb=884214f14fdbd0a4a368d2a36d5e50324fa1d52a;hp=0269fb21ff9b7078a6f94ecd787c7e4a2dd4a1f6;hpb=70d28bc7afb013de718969371d3a3671de4a9bfc;p=i3%2Fi3 diff --git a/src/log.c b/src/log.c index 0269fb21..7cf98843 100644 --- a/src/log.c +++ b/src/log.c @@ -4,7 +4,7 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * * log.c: Logging functions. * @@ -21,10 +21,6 @@ #include #include #include -#if defined(__APPLE__) -#include -#include -#endif #include "util.h" #include "log.h" @@ -32,6 +28,10 @@ #include "libi3.h" #include "shmlog.h" +#if defined(__APPLE__) +#include +#endif + static bool debug_logging = false; static bool verbose = false; static FILE *errorfile; @@ -89,67 +89,91 @@ void init_logging(void) { } } } + /* 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. */ + if (shmlog_size > 0 && logbuffer == NULL) + open_logbuffer(); + else if (shmlog_size <= 0 && logbuffer) + close_logbuffer(); + atexit(purge_zerobyte_logfile); +} - /* If this is a debug build (not a release version), we will enable SHM - * logging by default, unless the user turned it off explicitly. */ - if (logbuffer == NULL && shmlog_size > 0) { - /* Reserve 1% of the RAM for the logfile, but at max 25 MiB. +/* + * Opens the logbuffer. + * + */ +void open_logbuffer(void) { + /* Reserve 1% of the RAM for the logfile, but at max 25 MiB. * 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; + 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); + 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); + physical_mem_bytes = (long long)sysconf(_SC_PHYS_PAGES) * + sysconf(_SC_PAGESIZE); #endif - logbuffer_size = min(physical_mem_bytes * 0.01, shmlog_size); + logbuffer_size = min(physical_mem_bytes * 0.01, shmlog_size); #if defined(__FreeBSD__) - sasprintf(&shmlogname, "/tmp/i3-log-%d", getpid()); + sasprintf(&shmlogname, "/tmp/i3-log-%d", getpid()); #else - sasprintf(&shmlogname, "/i3-log-%d", getpid()); + sasprintf(&shmlogname, "/i3-log-%d", getpid()); #endif - logbuffer_shm = shm_open(shmlogname, O_RDWR | O_CREAT, S_IREAD | S_IWRITE); - if (logbuffer_shm == -1) { - fprintf(stderr, "Could not shm_open SHM segment for the i3 log: %s\n", strerror(errno)); - return; - } + logbuffer_shm = shm_open(shmlogname, O_RDWR | O_CREAT, S_IREAD | S_IWRITE); + if (logbuffer_shm == -1) { + fprintf(stderr, "Could not shm_open SHM segment for the i3 log: %s\n", strerror(errno)); + return; + } - if (ftruncate(logbuffer_shm, logbuffer_size) == -1) { - close(logbuffer_shm); - shm_unlink(shmlogname); - fprintf(stderr, "Could not ftruncate SHM segment for the i3 log: %s\n", strerror(errno)); - return; - } +#if defined(__OpenBSD__) || defined(__APPLE__) + if (ftruncate(logbuffer_shm, logbuffer_size) == -1) { + fprintf(stderr, "Could not ftruncate SHM segment for the i3 log: %s\n", strerror(errno)); +#else + int ret; + if ((ret = posix_fallocate(logbuffer_shm, 0, logbuffer_size)) != 0) { + fprintf(stderr, "Could not ftruncate SHM segment for the i3 log: %s\n", strerror(ret)); +#endif + close(logbuffer_shm); + shm_unlink(shmlogname); + return; + } - logbuffer = mmap(NULL, logbuffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, logbuffer_shm, 0); - if (logbuffer == MAP_FAILED) { - close(logbuffer_shm); - shm_unlink(shmlogname); - fprintf(stderr, "Could not mmap SHM segment for the i3 log: %s\n", strerror(errno)); - logbuffer = NULL; - return; - } + logbuffer = mmap(NULL, logbuffer_size, PROT_READ | PROT_WRITE, MAP_SHARED, logbuffer_shm, 0); + if (logbuffer == MAP_FAILED) { + close_logbuffer(); + fprintf(stderr, "Could not mmap SHM segment for the i3 log: %s\n", strerror(errno)); + return; + } - /* Initialize with 0-bytes, just to be sure… */ - memset(logbuffer, '\0', logbuffer_size); + /* Initialize with 0-bytes, just to be sure… */ + memset(logbuffer, '\0', logbuffer_size); - header = (i3_shmlog_header*)logbuffer; + header = (i3_shmlog_header *)logbuffer; - 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); + 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); - logwalk = logbuffer + sizeof(i3_shmlog_header); - loglastwrap = logbuffer + logbuffer_size; - store_log_markers(); - } - atexit(purge_zerobyte_logfile); + logwalk = logbuffer + sizeof(i3_shmlog_header); + loglastwrap = logbuffer + logbuffer_size; + store_log_markers(); +} + +/* + * Closes the logbuffer. + * + */ +void close_logbuffer(void) { + close(logbuffer_shm); + shm_unlink(shmlogname); + logbuffer = NULL; + shmlogname = ""; } /* @@ -162,6 +186,14 @@ void set_verbosity(bool _verbose) { verbose = _verbose; } +/* + * Get debug logging. + * + */ +bool get_debug_logging(void) { + return debug_logging; +} + /* * Set debug logging. * @@ -218,7 +250,7 @@ static void vlog(const bool print, const char *fmt, va_list args) { /* If there is no space for the current message in the ringbuffer, we * need to wrap and write to the beginning again. */ - if (len >= (logbuffer_size - (logwalk - logbuffer))) { + if (len >= (size_t)(logbuffer_size - (logwalk - logbuffer))) { loglastwrap = logwalk; logwalk = logbuffer + sizeof(i3_shmlog_header); store_log_markers();