From 9e87b853abe33bfc220b43e6b9f871a7ed5c3bb3 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sun, 25 Mar 2012 17:53:16 +0200 Subject: [PATCH] use pthread_sigmask instead of sigprocmask pthread is already in our vmem due to our dependencies so link to it explicitly and use pthread_sigmask to avoid buggy sigprocmask in multi-threaded applications. Signed-off-by: David Herrmann --- Makefile.am | 3 ++- src/eloop.c | 5 +++-- src/pty.c | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index 6d63cf3..f5c7d43 100644 --- a/Makefile.am +++ b/Makefile.am @@ -97,7 +97,8 @@ libkmscon_core_la_LIBADD = \ $(FREETYPE2_LIBS) \ $(XPROTO_LIBS) \ $(XKBCOMMON_LIBS) \ - $(GLIB_LIBS) + $(GLIB_LIBS) \ + -lpthread kmscon_SOURCES = src/main.c kmscon_LDADD = libkmscon-core.la diff --git a/src/eloop.c b/src/eloop.c index 239c6d5..f0bae2b 100644 --- a/src/eloop.c +++ b/src/eloop.c @@ -32,6 +32,7 @@ */ #include +#include #include #include #include @@ -540,7 +541,7 @@ int ev_eloop_add_signal(struct ev_eloop *loop, struct ev_signal *sig, return ret; } - sigprocmask(SIG_BLOCK, &mask, NULL); + pthread_sigmask(SIG_BLOCK, &mask, NULL); sig->cb = cb; sig->data = data; ev_signal_ref(sig); @@ -617,7 +618,7 @@ static int signal_new(struct ev_signal_shared **out, struct ev_eloop *loop, if (ret) goto err_sig; - sigprocmask(SIG_BLOCK, &mask, NULL); + pthread_sigmask(SIG_BLOCK, &mask, NULL); sig->next = loop->sig_list; loop->sig_list = sig; diff --git a/src/pty.c b/src/pty.c index 7c592e6..0888f38 100644 --- a/src/pty.c +++ b/src/pty.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -131,7 +132,7 @@ static int setup_child(int master, struct winsize *ws) /* The child should not inherit our signal mask. */ sigemptyset(&sigset); - ret = sigprocmask(SIG_SETMASK, &sigset, NULL); + ret = pthread_sigmask(SIG_SETMASK, &sigset, NULL); if (ret) log_warn("cannot reset blocked signals: %m");