summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-07-04 23:47:25 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-07-07 16:16:11 +0900
commita530ce8c349f2250584f0f29445f83e096ecd439 (patch)
treef96655b2bd3c5561aeab638eac2b2520b014189e
parent7c75aba57d556ec2b4e7ae33619af06844be7bbb (diff)
downloadefl-a530ce8c349f2250584f0f29445f83e096ecd439.tar.gz
efl - threads and signals - make efl work on "insane" os's with signals
so. on linux signals are delivered to the main process thread/loop. thats' where signal handlers are set up and always run. this is sane. it's predicatble. but of course this is not the same in bsd land. there "just send the signal to any old thread and call the signal handler there" seems to tbe the order of the day. this explains why wer are losing sigchld signals in edje_cc - it's heavily threaded and bsd is just randombly picking a thread to call it on. this fixes that. in theory. i hope. i can't test, but putting it in to share @fix
-rw-r--r--README8
-rw-r--r--src/bin/evas/evas_cserve2_slaves.c17
-rw-r--r--src/lib/eina/eina_debug_monitor.c17
-rw-r--r--src/lib/eina/eina_thread.c22
-rw-r--r--src/modules/emotion/xine/emotion_xine.c19
5 files changed, 82 insertions, 1 deletions
diff --git a/README b/README
index 1d3f41f396..e26420e9bf 100644
--- a/README
+++ b/README
@@ -26,6 +26,14 @@ For more doumentation please see:
http://www.enlightenment.org/p.php?p=docs
+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.
+
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 d76618f101..e490aeca46 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 <signal.h>
#ifdef EINA_HAVE_DEBUG
@@ -334,11 +335,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 3216719a95..83e752a964 100644
--- a/src/lib/eina/eina_thread.c
+++ b/src/lib/eina/eina_thread.c
@@ -32,8 +32,14 @@
#include "eina_debug.h"
+<<<<<<< HEAD
# include <pthread.h>
# include <errno.h>
+=======
+#include <pthread.h>
+#include <errno.h>
+#include <signal.h>
+>>>>>>> aeeda1f... efl - threads and signals - make efl work on "insane" os's with signals
#ifdef EINA_HAVE_PTHREAD_AFFINITY
#ifndef __linux__
@@ -57,6 +63,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 +81,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 <Eina.h>
#include <Evas.h>
#include <Ecore.h>
+#include <signal.h>
#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);