Hello,
Alex Peshkoff, le Wed 18 May 2011 10:27:32 +0400, a écrit :
> > ../src/jrd/os/posix/isc_ipc.cpp:187:31: error: 'SA_SIGINFO' was not
> > declared in
> > this scope
Indeed, some systems do not have SA_SIGINFO. I'd suggest the attached
patch to cope with them.
Samuel
--- src/jrd/os/posix/isc_ipc.cpp.original 2011-08-20 16:12:53.342786365
+0200
+++ src/jrd/os/posix/isc_ipc.cpp 2011-08-20 16:14:54.042717109 +0200
@@ -124,7 +124,11 @@
static bool isc_signal2(int signal, FPTR_VOID handler, void* arg, ULONG);
static SIG que_signal(int signal, FPTR_VOID handler, void* arg, int flags,
bool w_siginfo);
+#ifdef SA_SIGINFO
static void CLIB_ROUTINE signal_action(int number, siginfo_t *siginfo, void
*context);
+#else
+static void CLIB_ROUTINE signal_action(int number);
+#endif
#ifndef SIG_HOLD
#define SIG_HOLD SIG_DFL
@@ -183,20 +187,34 @@
if (!sig) {
struct sigaction act, oact;
+#ifdef SA_SIGINFO
act.sa_sigaction = signal_action;
act.sa_flags = SA_RESTART | SA_SIGINFO;
+#else
+ act.sa_handler = signal_action;
+#endif
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, signal_number);
sigaction(signal_number, &act, &oact);
+#ifdef SA_SIGINFO
old_sig_w_siginfo = oact.sa_flags & SA_SIGINFO;
+#endif
- if (oact.sa_sigaction != signal_action &&
+ if (
+#ifdef SA_SIGINFO
+ oact.sa_sigaction != signal_action &&
+#else
+ oact.sa_handler != signal_action &&
+#endif
oact.sa_handler != SIG_DFL &&
oact.sa_handler != SIG_HOLD &&
oact.sa_handler != SIG_IGN)
{
- que_signal(signal_number, old_sig_w_siginfo ?
+ que_signal(signal_number,
+#ifdef SA_SIGINFO
+ old_sig_w_siginfo ?
reinterpret_cast<FPTR_VOID>(oact.sa_sigaction) :
+#endif
reinterpret_cast<FPTR_VOID>(oact.sa_handler),
NULL, SIG_client, old_sig_w_siginfo);
rc = true;
@@ -322,6 +340,12 @@
DEV_REPORT("que_signal: out of memory");
return NULL; /* NOMEM: not handled, too
difficult */
}
+#ifndef SA_SIGINFO
+ if (sig_w_siginfo) {
+ DEV_REPORT("SA_SIGINFO not supported");
+ return NULL;
+ }
+#endif
#ifdef DEBUG_GDS_ALLOC
/* This will only be freed when a signal handler is de-registered
@@ -344,7 +368,11 @@
}
+#ifdef SA_SIGINFO
static void CLIB_ROUTINE signal_action(int number, siginfo_t *siginfo, void
*context)
+#else
+static void CLIB_ROUTINE signal_action(int number)
+#endif
{
/**************************************
*
@@ -364,11 +392,13 @@
{
if (sig->sig_flags & SIG_client)
{
+#ifdef SA_SIGINFO
if (sig->sig_w_siginfo)
{
(*sig->sig_routine.client3)(number,
siginfo, context);
}
else
+#endif
{
(*sig->sig_routine.client1)(number);
}
------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel