improved signal handling in App

This commit is contained in:
hyung-hwan 2019-01-21 15:12:01 +00:00
parent f91b85e0cf
commit 39e43d4201

View File

@ -29,6 +29,7 @@
#include <qse/si/sinfo.h> #include <qse/si/sinfo.h>
#include <qse/si/os.h> #include <qse/si/os.h>
#include "../cmn/syscall.h" #include "../cmn/syscall.h"
#include "../cmn/mem-prv.h"
#include <qse/cmn/mbwc.h> #include <qse/cmn/mbwc.h>
///////////////////////////////// /////////////////////////////////
@ -271,25 +272,28 @@ int App::set_signal_handler_no_mutex (int sig, SignalHandler sighr)
if (::sigaction(sig, QSE_NULL, &oldsa) == -1) return -1; if (::sigaction(sig, QSE_NULL, &oldsa) == -1) return -1;
QSE_MEMSET (&sa, 0, QSE_SIZEOF(sa));
if (oldsa.sa_flags & SA_SIGINFO) if (oldsa.sa_flags & SA_SIGINFO)
{ {
sa.sa_sigaction = dispatch_siginfo; sa.sa_sigaction = dispatch_siginfo;
sigfillset (&sa.sa_mask); // block all signals while the handler is being executed sa.sa_flags = SA_SIGINFO;
sa.sa_flags |= SA_SIGINFO;
} }
else else
{ {
sa.sa_handler = dispatch_signal; sa.sa_handler = dispatch_signal;
sigfillset (&sa.sa_mask);
sa.sa_flags = 0; sa.sa_flags = 0;
//sa.sa_flags |= SA_INTERUPT;
//sa.sa_flags |= SA_RESTART;
} }
//sa.sa_flags |= SA_INTERUPT;
//sa.sa_flags |= SA_RESTART;
sigfillset (&sa.sa_mask); // block all signals while the handler is being executed
if (::sigaction(sig, &sa, QSE_NULL) == -1) return -1; if (::sigaction(sig, &sa, QSE_NULL) == -1) return -1;
App::_sighrs[0][sig] = (qse_size_t)sighr; App::_sighrs[0][sig] = (qse_size_t)sighr;
App::_sighrs[1][sig] = (qse_size_t)oldsa.sa_handler; if (oldsa.sa_flags & SA_SIGINFO)
App::_sighrs[1][sig] = (qse_size_t)oldsa.sa_sigaction;
else
App::_sighrs[1][sig] = (qse_size_t)oldsa.sa_handler;
g_app_oldsi[sig].sa_mask = oldsa.sa_mask; g_app_oldsi[sig].sa_mask = oldsa.sa_mask;
g_app_oldsi[sig].sa_flags = oldsa.sa_flags; g_app_oldsi[sig].sa_flags = oldsa.sa_flags;
@ -308,6 +312,7 @@ int App::unset_signal_handler_no_mutex(int sig, int ignore)
struct sigaction sa; struct sigaction sa;
QSE_MEMSET (&sa, 0, QSE_SIZEOF(sa));
sa.sa_mask = g_app_oldsi[sig].sa_mask; sa.sa_mask = g_app_oldsi[sig].sa_mask;
sa.sa_flags = g_app_oldsi[sig].sa_flags; sa.sa_flags = g_app_oldsi[sig].sa_flags;
if (ignore) if (ignore)