From 1322af1e4f94a3771905a72fe417c807bf84c2c6 Mon Sep 17 00:00:00 2001 From: Christopher Zimmermann Date: Sat, 11 Jun 2016 13:05:29 +0200 Subject: [PATCH] Don't use pthread on OpenBSD since OpenBSD pthread does not support pthread_condattr_setpshared(). This patch could also stay in the OpenBSD ports tree or depend on a configure test macro rather than defined __OpenBSD__. --- i3-dump-log/main.c | 31 +++++++++++++++++++++++++------ include/shmlog.h | 4 ++++ src/i3.mk | 5 ++++- src/log.c | 6 ++++++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/i3-dump-log/main.c b/i3-dump-log/main.c index 9d4eefc7..d9b0613c 100644 --- a/i3-dump-log/main.c +++ b/i3-dump-log/main.c @@ -28,8 +28,10 @@ #include "shmlog.h" #include -static uint32_t offset_next_write, - wrap_count; +#if !defined(__OpenBSD__) +static uint32_t offset_next_write; +#endif +static uint32_t wrap_count; static i3_shmlog_header *header; static char *logbuffer, @@ -57,17 +59,26 @@ static void print_till_end(void) { int main(int argc, char *argv[]) { int o, option_index = 0; - bool verbose = false, - follow = false; + bool verbose = false; +#if !defined(__OpenBSD__) + bool follow = false; +#endif static struct option long_options[] = { {"version", no_argument, 0, 'v'}, {"verbose", no_argument, 0, 'V'}, +#if !defined(__OpenBSD__) {"follow", no_argument, 0, 'f'}, +#endif {"help", no_argument, 0, 'h'}, - {0, 0, 0, 0}}; + {0, 0, 0, 0} + }; +#if !defined(__OpenBSD__) char *options_string = "s:vfVh"; +#else + char *options_string = "vVh"; +#endif while ((o = getopt_long(argc, argv, options_string, long_options, &option_index)) != -1) { if (o == 'v') { @@ -75,11 +86,17 @@ int main(int argc, char *argv[]) { return 0; } else if (o == 'V') { verbose = true; +#if !defined(__OpenBSD__) } else if (o == 'f') { follow = true; +#endif } else if (o == 'h') { printf("i3-dump-log " I3_VERSION "\n"); - printf("i3-dump-log [-f] [-s ]\n"); +#if !defined(__OpenBSD__) + printf("i3-dump-log [-fhVv]\n"); +#else + printf("i3-dump-log [-hVv]\n"); +#endif return 0; } } @@ -162,6 +179,7 @@ int main(int argc, char *argv[]) { walk = logbuffer + sizeof(i3_shmlog_header); print_till_end(); +#if !defined(__OpenBSD__) if (follow) { /* Since pthread_cond_wait() expects a mutex, we need to provide one. * To not lock i3 (that’s bad, mhkay?) we just define one outside of @@ -177,6 +195,7 @@ int main(int argc, char *argv[]) { } } } +#endif return 0; } diff --git a/include/shmlog.h b/include/shmlog.h index 01fea8b4..0216c8d6 100644 --- a/include/shmlog.h +++ b/include/shmlog.h @@ -11,7 +11,9 @@ #pragma once #include +#if !defined(__OpenBSD__) #include +#endif /* Default shmlog size if not set by user. */ extern const int default_shmlog_size; @@ -37,8 +39,10 @@ typedef struct i3_shmlog_header { * and don’t matter — clients use an equality check (==). */ uint32_t wrap_count; +#if !defined(__OpenBSD__) /* pthread condvar which will be broadcasted whenever there is a new * message in the log. i3-dump-log uses this to implement -f (follow, like * tail -f) in an efficient way. */ pthread_cond_t condvar; +#endif } i3_shmlog_header; diff --git a/src/i3.mk b/src/i3.mk index 6cb4abf4..de747826 100644 --- a/src/i3.mk +++ b/src/i3.mk @@ -6,7 +6,10 @@ i3_SOURCES := $(filter-out $(i3_SOURCES_GENERATED),$(wildcard src/*.c) i3_HEADERS_CMDPARSER := $(wildcard include/GENERATED_*.h) i3_HEADERS := $(filter-out $(i3_HEADERS_CMDPARSER),$(wildcard include/*.h)) i3_CFLAGS = $(XKB_COMMON_CFLAGS) $(XKB_COMMON_X11_CFLAGS) $(XCB_CFLAGS) $(XCB_KBD_CFLAGS) $(XCB_WM_CFLAGS) $(XCB_CURSOR_CFLAGS) $(XCB_XRM_CFLAGS) $(PANGO_CFLAGS) $(YAJL_CFLAGS) $(LIBEV_CFLAGS) $(PCRE_CFLAGS) $(LIBSN_CFLAGS) -i3_LIBS = $(XKB_COMMON_LIBS) $(XKB_COMMON_X11_LIBS) $(XCB_LIBS) $(XCB_XKB_LIBS) $(XCB_KBD_LIBS) $(XCB_WM_LIBS) $(XCB_CURSOR_LIBS) $(XCB_XRM_LIBS) $(PANGO_LIBS) $(YAJL_LIBS) $(LIBEV_LIBS) $(PCRE_LIBS) $(LIBSN_LIBS) -lm -lpthread +i3_LIBS = $(XKB_COMMON_LIBS) $(XKB_COMMON_X11_LIBS) $(XCB_LIBS) $(XCB_XKB_LIBS) $(XCB_KBD_LIBS) $(XCB_WM_LIBS) $(XCB_CURSOR_LIBS) $(XCB_XRM_LIBS) $(PANGO_LIBS) $(YAJL_LIBS) $(LIBEV_LIBS) $(PCRE_LIBS) $(LIBSN_LIBS) -lm +ifneq ($(UNAME),OpenBSD) +i3_LIBS += -lpthread +endif # When using clang, we use pre-compiled headers to speed up the build. With # gcc, this actually makes the build slower. diff --git a/src/log.c b/src/log.c index e8a08b53..e9a1160d 100644 --- a/src/log.c +++ b/src/log.c @@ -20,7 +20,9 @@ #include #include #include +#if !defined(__OpenBSD__) #include +#endif #include "util.h" #include "log.h" @@ -157,11 +159,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; @@ -277,8 +281,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); -- 2.39.5