added support for realtime signals. all signal event structs now have a siginfo_t member (this might replace the unused void *ext_data). sa_sigaction is now used instead of sa_handler
SVN revision: 9591
This commit is contained in:
parent
e012d65c46
commit
087eb83658
|
@ -12,6 +12,7 @@
|
|||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#include <limits.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <Ecore_Data.h>
|
||||
|
||||
|
@ -45,7 +46,8 @@ extern "C" {
|
|||
#define ECORE_EVENT_SIGNAL_HUP 3 /**< Hup signal event */
|
||||
#define ECORE_EVENT_SIGNAL_EXIT 4 /**< Exit signal event */
|
||||
#define ECORE_EVENT_SIGNAL_POWER 5 /**< Power signal event */
|
||||
#define ECORE_EVENT_COUNT 6
|
||||
#define ECORE_EVENT_SIGNAL_REALTIME 6 /**< Realtime signal event */
|
||||
#define ECORE_EVENT_COUNT 7
|
||||
|
||||
#ifndef _ECORE_PRIVATE_H
|
||||
enum _Ecore_Fd_Handler_Flags
|
||||
|
@ -71,6 +73,7 @@ extern "C" {
|
|||
typedef struct _Ecore_Event_Signal_Hup Ecore_Event_Signal_Hup; /**< Hup signal event */
|
||||
typedef struct _Ecore_Event_Signal_Exit Ecore_Event_Signal_Exit; /**< Exit signal event */
|
||||
typedef struct _Ecore_Event_Signal_Power Ecore_Event_Signal_Power; /**< Power signal event */
|
||||
typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime; /**< Realtime signal event */
|
||||
|
||||
struct _Ecore_Event_Exe_Exit /** Process exit event */
|
||||
{
|
||||
|
@ -81,17 +84,20 @@ extern "C" {
|
|||
char exited : 1; /** < set to 1 if the process exited of its own accord */
|
||||
char signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
|
||||
void *ext_data; /**< Extension data - not used */
|
||||
siginfo_t data; /**< Signal info */
|
||||
};
|
||||
|
||||
struct _Ecore_Event_Signal_User /** User signal event */
|
||||
{
|
||||
int number; /**< The signal number. Either 1 or 2 */
|
||||
void *ext_data; /**< Extension data - not used */
|
||||
siginfo_t data; /**< Signal info */
|
||||
};
|
||||
|
||||
struct _Ecore_Event_Signal_Hup /** Hup signal event */
|
||||
{
|
||||
void *ext_data; /**< Extension data - not used */
|
||||
siginfo_t data; /**< Signal info */
|
||||
};
|
||||
|
||||
struct _Ecore_Event_Signal_Exit /** Exit request event */
|
||||
|
@ -100,11 +106,19 @@ extern "C" {
|
|||
int quit : 1; /**< set if the exit request was a quit signal */
|
||||
int terminate : 1; /**< Set if the exit request was a terminate singal */
|
||||
void *ext_data; /**< Extension data - not used */
|
||||
siginfo_t data; /**< Signal info */
|
||||
};
|
||||
|
||||
struct _Ecore_Event_Signal_Power /** Power event */
|
||||
{
|
||||
void *ext_data; /**< Extension data - not used */
|
||||
void *ext_data; /**< Extension data - not used */
|
||||
siginfo_t data; /**< Signal info */
|
||||
};
|
||||
|
||||
struct _Ecore_Event_Signal_Realtime /** Realtime event */
|
||||
{
|
||||
int num; /**< The realtime signal's number */
|
||||
siginfo_t data; /**< Signal info */
|
||||
};
|
||||
|
||||
int ecore_init(void);
|
||||
|
|
|
@ -540,3 +540,15 @@ _ecore_event_signal_power_free(void *data, void *ev)
|
|||
e = ev;
|
||||
free(e);
|
||||
}
|
||||
|
||||
void *
|
||||
_ecore_event_signal_realtime_new(void)
|
||||
{
|
||||
return calloc(1, sizeof(Ecore_Event_Signal_Realtime));
|
||||
}
|
||||
|
||||
void
|
||||
_ecore_event_signal_realtime_free(void *data, void *ev)
|
||||
{
|
||||
free(ev);
|
||||
}
|
||||
|
|
|
@ -192,6 +192,8 @@ void *_ecore_event_signal_exit_new(void);
|
|||
void _ecore_event_signal_exit_free(void *data, void *ev);
|
||||
void *_ecore_event_signal_power_new(void);
|
||||
void _ecore_event_signal_power_free(void *data, void *ev);
|
||||
void * _ecore_event_signal_realtime_new(void);
|
||||
void _ecore_event_signal_realtime_free(void *data, void *ev);
|
||||
|
||||
void _ecore_main_shutdown(void);
|
||||
|
||||
|
|
|
@ -5,18 +5,26 @@
|
|||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
|
||||
static void _ecore_signal_callback_set(int sig, void (*func)(int sig));
|
||||
static void _ecore_signal_callback_ignore(int sig);
|
||||
static void _ecore_signal_callback_sigchld(int sig);
|
||||
static void _ecore_signal_callback_sigusr1(int sig);
|
||||
static void _ecore_signal_callback_sigusr2(int sig);
|
||||
static void _ecore_signal_callback_sighup(int sig);
|
||||
static void _ecore_signal_callback_sigquit(int sig);
|
||||
static void _ecore_signal_callback_sigint(int sig);
|
||||
static void _ecore_signal_callback_sigterm(int sig);
|
||||
static void _ecore_signal_callback_sigpwr(int sig);
|
||||
typedef void (*Signal_Handler)(int sig, siginfo_t *si, void *foo);
|
||||
|
||||
static void _ecore_signal_callback_set(int sig, Signal_Handler func);
|
||||
static void _ecore_signal_callback_ignore(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigchld(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigusr1(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigusr2(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sighup(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigquit(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigint(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigterm(int sig, siginfo_t *si, void *foo);
|
||||
static void _ecore_signal_callback_sigpwr(int sig, siginfo_t *si, void *foo);
|
||||
|
||||
#ifdef SIGRTMIN
|
||||
static void _ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo);
|
||||
#endif
|
||||
|
||||
static volatile sig_atomic_t sig_count = 0;
|
||||
static volatile sig_atomic_t sigchld_count = 0;
|
||||
static volatile sig_atomic_t sigusr1_count = 0;
|
||||
static volatile sig_atomic_t sigusr2_count = 0;
|
||||
|
@ -24,25 +32,44 @@ static volatile sig_atomic_t sighup_count = 0;
|
|||
static volatile sig_atomic_t sigquit_count = 0;
|
||||
static volatile sig_atomic_t sigint_count = 0;
|
||||
static volatile sig_atomic_t sigterm_count = 0;
|
||||
static volatile sig_atomic_t sigpwr_count = 0;
|
||||
|
||||
static volatile sig_atomic_t sig_count = 0;
|
||||
static volatile siginfo_t sigchld_info = {0};
|
||||
static volatile siginfo_t sigusr1_info = {0};
|
||||
static volatile siginfo_t sigusr2_info = {0};
|
||||
static volatile siginfo_t sighup_info = {0};
|
||||
static volatile siginfo_t sigquit_info = {0};
|
||||
static volatile siginfo_t sigint_info = {0};
|
||||
static volatile siginfo_t sigterm_info = {0};
|
||||
|
||||
#ifdef SIGPWR
|
||||
static volatile sig_atomic_t sigpwr_count = 0;
|
||||
static volatile siginfo_t sigpwr_info = {0};
|
||||
#endif
|
||||
|
||||
#ifdef SIGRTMIN
|
||||
static volatile sig_atomic_t *sigrt_count = NULL;
|
||||
static volatile siginfo_t *sigrt_info = NULL;
|
||||
#endif
|
||||
|
||||
void
|
||||
_ecore_signal_shutdown(void)
|
||||
{
|
||||
_ecore_signal_callback_set(SIGPIPE, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGALRM, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGCHLD, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGUSR1, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGUSR2, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGHUP, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGQUIT, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGINT, SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGTERM, SIG_DFL);
|
||||
#ifdef SIGPWR
|
||||
_ecore_signal_callback_set(SIGPWR, SIG_DFL);
|
||||
#endif
|
||||
#ifdef SIGRTMIN
|
||||
int i, num = SIGRTMAX - SIGRTMIN;
|
||||
#endif
|
||||
|
||||
_ecore_signal_callback_set(SIGPIPE, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGALRM, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGCHLD, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGUSR1, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGUSR2, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGHUP, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGQUIT, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGINT, (Signal_Handler) SIG_DFL);
|
||||
_ecore_signal_callback_set(SIGTERM, (Signal_Handler) SIG_DFL);
|
||||
#ifdef SIGPWR
|
||||
_ecore_signal_callback_set(SIGPWR, (Signal_Handler) SIG_DFL);
|
||||
#endif
|
||||
sigchld_count = 0;
|
||||
sigusr1_count = 0;
|
||||
sigusr2_count = 0;
|
||||
|
@ -52,11 +79,32 @@ _ecore_signal_shutdown(void)
|
|||
sigterm_count = 0;
|
||||
sigpwr_count = 0;
|
||||
sig_count = 0;
|
||||
|
||||
#ifdef SIGRTMIN
|
||||
for (i = 0; i < num; i++) {
|
||||
_ecore_signal_callback_set(SIGRTMIN + i, (Signal_Handler) SIG_DFL);
|
||||
sigrt_count[i] = 0;
|
||||
}
|
||||
|
||||
if (sigrt_count) {
|
||||
free((sig_atomic_t *) sigrt_count);
|
||||
sigrt_count = NULL;
|
||||
}
|
||||
|
||||
if (sigrt_info) {
|
||||
free((siginfo_t *) sigrt_info);
|
||||
sigrt_info = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_ecore_signal_init(void)
|
||||
{
|
||||
#ifdef SIGRTMIN
|
||||
int i, num = SIGRTMAX - SIGRTMIN;
|
||||
#endif
|
||||
|
||||
_ecore_signal_callback_set(SIGPIPE, _ecore_signal_callback_ignore);
|
||||
_ecore_signal_callback_set(SIGALRM, _ecore_signal_callback_ignore);
|
||||
_ecore_signal_callback_set(SIGCHLD, _ecore_signal_callback_sigchld);
|
||||
|
@ -66,9 +114,20 @@ _ecore_signal_init(void)
|
|||
_ecore_signal_callback_set(SIGQUIT, _ecore_signal_callback_sigquit);
|
||||
_ecore_signal_callback_set(SIGINT, _ecore_signal_callback_sigint);
|
||||
_ecore_signal_callback_set(SIGTERM, _ecore_signal_callback_sigterm);
|
||||
#ifdef SIGPWR
|
||||
#ifdef SIGPWR
|
||||
_ecore_signal_callback_set(SIGPWR, _ecore_signal_callback_sigpwr);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SIGRTMIN
|
||||
sigrt_count = calloc(1, sizeof(sig_atomic_t) * num);
|
||||
assert(sigrt_count);
|
||||
|
||||
sigrt_info = calloc(1, sizeof(siginfo_t) * num);
|
||||
assert(sigrt_info);
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
_ecore_signal_callback_set(SIGRTMIN + i, _ecore_signal_callback_sigrt);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -80,6 +139,10 @@ _ecore_signal_count_get(void)
|
|||
void
|
||||
_ecore_signal_call(void)
|
||||
{
|
||||
#ifdef SIGRTMIN
|
||||
int i, num = SIGRTMAX - SIGRTMIN;
|
||||
#endif
|
||||
|
||||
while (sigchld_count > 0)
|
||||
{
|
||||
pid_t pid;
|
||||
|
@ -104,6 +167,7 @@ _ecore_signal_call(void)
|
|||
}
|
||||
e->pid = pid;
|
||||
e->exe = _ecore_exe_find(pid);
|
||||
e->data = sigchld_info;
|
||||
_ecore_event_add(ECORE_EVENT_EXE_EXIT, e,
|
||||
_ecore_event_exe_exit_free, NULL);
|
||||
}
|
||||
|
@ -119,6 +183,7 @@ _ecore_signal_call(void)
|
|||
if (e)
|
||||
{
|
||||
e->number = 1;
|
||||
e->data = sigusr1_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_USER, e,
|
||||
_ecore_event_signal_user_free, NULL);
|
||||
}
|
||||
|
@ -133,6 +198,7 @@ _ecore_signal_call(void)
|
|||
if (e)
|
||||
{
|
||||
e->number = 2;
|
||||
e->data = sigusr2_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_USER, e,
|
||||
_ecore_event_signal_user_free, NULL);
|
||||
}
|
||||
|
@ -146,6 +212,7 @@ _ecore_signal_call(void)
|
|||
e = _ecore_event_signal_hup_new();
|
||||
if (e)
|
||||
{
|
||||
e->data = sighup_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_HUP, e,
|
||||
_ecore_event_signal_hup_free, NULL);
|
||||
}
|
||||
|
@ -160,6 +227,7 @@ _ecore_signal_call(void)
|
|||
if (e)
|
||||
{
|
||||
e->quit = 1;
|
||||
e->data = sigquit_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
|
||||
_ecore_event_signal_exit_free, NULL);
|
||||
}
|
||||
|
@ -174,6 +242,7 @@ _ecore_signal_call(void)
|
|||
if (e)
|
||||
{
|
||||
e->interrupt = 1;
|
||||
e->data = sigint_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
|
||||
_ecore_event_signal_exit_free, NULL);
|
||||
}
|
||||
|
@ -188,12 +257,14 @@ _ecore_signal_call(void)
|
|||
if (e)
|
||||
{
|
||||
e->terminate = 1;
|
||||
e->data = sigterm_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e,
|
||||
_ecore_event_signal_exit_free, NULL);
|
||||
}
|
||||
sigterm_count--;
|
||||
sig_count--;
|
||||
}
|
||||
#ifdef SIGPWR
|
||||
while (sigpwr_count > 0)
|
||||
{
|
||||
Ecore_Event_Signal_Power *e;
|
||||
|
@ -201,82 +272,120 @@ _ecore_signal_call(void)
|
|||
e = _ecore_event_signal_power_new();
|
||||
if (e)
|
||||
{
|
||||
e->data = sigpwr_info;
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_POWER, e,
|
||||
_ecore_event_signal_power_free, NULL);
|
||||
}
|
||||
sigpwr_count--;
|
||||
sig_count--;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SIGRTMIN
|
||||
for (i = 0; i < num; i++)
|
||||
while (sigrt_count[i] > 0) {
|
||||
Ecore_Event_Signal_Realtime *e;
|
||||
|
||||
if ((e = _ecore_event_signal_realtime_new())) {
|
||||
e->data = sigrt_info[i];
|
||||
_ecore_event_add(ECORE_EVENT_SIGNAL_REALTIME, e,
|
||||
_ecore_event_signal_realtime_free, NULL);
|
||||
}
|
||||
|
||||
sigrt_count[i]--;
|
||||
sig_count--;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_set(int sig, void (*func)(int sig))
|
||||
_ecore_signal_callback_set(int sig, Signal_Handler func)
|
||||
{
|
||||
struct sigaction sa;
|
||||
|
||||
sa.sa_handler = func;
|
||||
sa.sa_flags = SA_RESTART;
|
||||
sa.sa_sigaction = func;
|
||||
sa.sa_flags = SA_RESTART | SA_SIGINFO;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sigaction(sig, &sa, NULL);
|
||||
sigaction(sig, &sa, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_ignore(int sig)
|
||||
_ecore_signal_callback_ignore(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sigchld(int sig)
|
||||
_ecore_signal_callback_sigchld(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigchld_info = *si;
|
||||
sigchld_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sigusr1(int sig)
|
||||
_ecore_signal_callback_sigusr1(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigusr1_info = *si;
|
||||
sigusr1_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sigusr2(int sig)
|
||||
_ecore_signal_callback_sigusr2(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigusr2_info = *si;
|
||||
sigusr2_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sighup(int sig)
|
||||
_ecore_signal_callback_sighup(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sighup_info = *si;
|
||||
sighup_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sigquit(int sig)
|
||||
_ecore_signal_callback_sigquit(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigquit_info = *si;
|
||||
sigquit_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sigint(int sig)
|
||||
_ecore_signal_callback_sigint(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigint_info = *si;
|
||||
sigint_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
_ecore_signal_callback_sigterm(int sig)
|
||||
_ecore_signal_callback_sigterm(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigterm_info = *si;
|
||||
sigterm_count++;
|
||||
sig_count++;
|
||||
}
|
||||
|
||||
#ifdef SIGPWR
|
||||
static void
|
||||
_ecore_signal_callback_sigpwr(int sig)
|
||||
_ecore_signal_callback_sigpwr(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigpwr_info = *si;
|
||||
sigpwr_count++;
|
||||
sig_count++;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SIGRTMIN
|
||||
static void
|
||||
_ecore_signal_callback_sigrt(int sig, siginfo_t *si, void *foo)
|
||||
{
|
||||
sigrt_info[sig - SIGRTMIN] = *si;
|
||||
sigrt_count[sig - SIGRTMIN]++;
|
||||
sig_count++;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue