diff --git a/README b/README index 30d5de672e..4956591cc5 100644 --- a/README +++ b/README @@ -32,12 +32,7 @@ PLATFORMS EFL is primarily developerd on Linux (GNU/Linux) and should work on most distributions as long as dependencies are provided. It has been compiled and run also on Windows (using MINGW32 - please see -http://www.winbuilds.org ), Mac OS X, FreeBSD and NetBSD. Due to -serious bugs in OpenBSD, EFL cannot be compiled or used there. Please -see: - -https://www.mail-archive.com/search?l=misc@openbsd.org&q=subject:%22SIGCHLD+and+libpthread.so%22&o=newest&f=1 - +http://www.winbuilds.org ), Mac OS X, FreeBSD and NetBSD. COMPONENTS ---------- diff --git a/src/bin/evas/evas_cserve2_slaves.c b/src/bin/evas/evas_cserve2_slaves.c index 3958046459..f790357bd8 100644 --- a/src/bin/evas/evas_cserve2_slaves.c +++ b/src/bin/evas/evas_cserve2_slaves.c @@ -507,6 +507,7 @@ cserve2_slave_thread_run(Slave_Thread_Cb thread_cb, void *thread_data, Slave_Rea pthread_t tid; int child[2], parent[2]; int flags; + sigset_t oldset, newset; s = calloc(1, sizeof(Slave_Thread)); if (!s) @@ -550,8 +551,23 @@ cserve2_slave_thread_run(Slave_Thread_Cb thread_cb, void *thread_data, Slave_Rea sd->cb = thread_cb; sd->cb_data = thread_data; + sigemptyset(&newset); + sigaddset(&newset, SIGPIPE); + sigaddset(&newset, SIGALRM); + sigaddset(&newset, SIGCHLD); + sigaddset(&newset, SIGUSR1); + sigaddset(&newset, SIGUSR2); + sigaddset(&newset, SIGHUP); + sigaddset(&newset, SIGQUIT); + sigaddset(&newset, SIGINT); + sigaddset(&newset, SIGTERM); +#ifdef SIGPWR + sigaddset(&newset, SIGPWR); +#endif + sigprocmask(SIG_BLOCK, &newset, &oldset); if (pthread_create(&tid, &slave_thread_attr, _slave_thread_cb, sd)) { + sigprocmask(SIG_SETMASK, &oldset, NULL); ERR("Could not start slave thread."); free(s); free(sd); @@ -561,6 +577,7 @@ cserve2_slave_thread_run(Slave_Thread_Cb thread_cb, void *thread_data, Slave_Rea close(parent[1]); return NULL; } + sigprocmask(SIG_SETMASK, &oldset, NULL); s->tid = tid; s->tdata = sd; diff --git a/src/lib/eina/eina_debug_monitor.c b/src/lib/eina/eina_debug_monitor.c index d11f0e542e..18bd87efc7 100644 --- a/src/lib/eina/eina_debug_monitor.c +++ b/src/lib/eina/eina_debug_monitor.c @@ -20,6 +20,7 @@ #include "eina_types.h" #include "eina_evlog.h" #include "eina_util.h" +#include #ifdef EINA_HAVE_DEBUG @@ -355,11 +356,27 @@ void _eina_debug_monitor_thread_start(void) { int err; + sigset_t oldset, newset; // if it's already running - we're good. if (_monitor_thread_runs) return; // create debug monitor thread + sigemptyset(&newset); + sigaddset(&newset, SIGPIPE); + sigaddset(&newset, SIGALRM); + sigaddset(&newset, SIGCHLD); + sigaddset(&newset, SIGUSR1); + sigaddset(&newset, SIGUSR2); + sigaddset(&newset, SIGHUP); + sigaddset(&newset, SIGQUIT); + sigaddset(&newset, SIGINT); + sigaddset(&newset, SIGTERM); +#ifdef SIGPWR + sigaddset(&newset, SIGPWR); +#endif + sigprocmask(SIG_BLOCK, &newset, &oldset); err = pthread_create(&_monitor_thread, NULL, _eina_debug_monitor, NULL); + sigprocmask(SIG_SETMASK, &oldset, NULL); if (err != 0) { fprintf(stderr, "EINA DEBUG ERROR: Can't create debug thread!\n"); diff --git a/src/lib/eina/eina_thread.c b/src/lib/eina/eina_thread.c index 37f66fde92..a56bf80988 100644 --- a/src/lib/eina/eina_thread.c +++ b/src/lib/eina/eina_thread.c @@ -34,6 +34,7 @@ #include #include +#include #if defined(EINA_HAVE_PTHREAD_AFFINITY) || defined(EINA_HAVE_PTHREAD_SETNAME) #ifndef __linux__ @@ -57,6 +58,7 @@ _eina_thread_create(Eina_Thread *t, int affinity, void *(*func)(void *data), voi { int err; pthread_attr_t attr; + sigset_t oldset, newset; pthread_attr_init(&attr); if (affinity >= 0) @@ -74,7 +76,22 @@ _eina_thread_create(Eina_Thread *t, int affinity, void *(*func)(void *data), voi } /* setup initial locks */ + sigemptyset(&newset); + sigaddset(&newset, SIGPIPE); + sigaddset(&newset, SIGALRM); + sigaddset(&newset, SIGCHLD); + sigaddset(&newset, SIGUSR1); + sigaddset(&newset, SIGUSR2); + sigaddset(&newset, SIGHUP); + sigaddset(&newset, SIGQUIT); + sigaddset(&newset, SIGINT); + sigaddset(&newset, SIGTERM); +#ifdef SIGPWR + sigaddset(&newset, SIGPWR); +#endif + sigprocmask(SIG_BLOCK, &newset, &oldset); err = pthread_create((pthread_t *)t, &attr, func, data); + sigprocmask(SIG_SETMASK, &oldset, NULL); pthread_attr_destroy(&attr); if (err == 0) return EINA_TRUE; diff --git a/src/modules/emotion/xine/emotion_xine.c b/src/modules/emotion/xine/emotion_xine.c index 6ff6de10a4..0e55b3a3b4 100644 --- a/src/modules/emotion/xine/emotion_xine.c +++ b/src/modules/emotion/xine/emotion_xine.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "emotion_modules.h" #include "emotion_xine.h" @@ -322,6 +323,7 @@ em_add(const Emotion_Engine *api EINA_UNUSED, { Emotion_Xine_Video *ev; int fds[2]; + sigset_t oldset, newset; ev = calloc(1, sizeof(Emotion_Xine_Video)); EINA_SAFETY_ON_NULL_RETURN_VAL(ev, NULL); @@ -366,9 +368,24 @@ em_add(const Emotion_Engine *api EINA_UNUSED, pthread_cond_init(&(ev->get_pos_len_cond), NULL); pthread_mutex_init(&(ev->get_pos_len_mutex), NULL); + sigemptyset(&newset); + sigaddset(&newset, SIGPIPE); + sigaddset(&newset, SIGALRM); + sigaddset(&newset, SIGCHLD); + sigaddset(&newset, SIGUSR1); + sigaddset(&newset, SIGUSR2); + sigaddset(&newset, SIGHUP); + sigaddset(&newset, SIGQUIT); + sigaddset(&newset, SIGINT); + sigaddset(&newset, SIGTERM); +#ifdef SIGPWR + sigaddset(&newset, SIGPWR); +#endif + sigprocmask(SIG_BLOCK, &newset, &oldset); pthread_create(&ev->get_pos_len_th, NULL, _em_get_pos_len_th, ev); - pthread_create(&ev->slave_th, NULL, _em_slave, ev); + sigprocmask(SIG_SETMASK, &oldset, NULL); + pthread_detach(ev->slave_th); _em_slave_event(ev, 1, NULL);