use SIGALRM instead of SIGURG to wakeup blocking socket calls
This commit is contained in:
@@ -167,7 +167,7 @@ cac::cac ( cacNotify & notifyIn ) :
|
||||
* close(). To solve this problem we need to employ OS specific
|
||||
* mechanisms.
|
||||
*/
|
||||
epicsSignalInstallSigUrgIgnore ();
|
||||
epicsSignalInstallSigAlarmIgnore ();
|
||||
epicsSignalInstallSigPipeIgnore ();
|
||||
|
||||
{
|
||||
|
||||
@@ -1493,14 +1493,14 @@ void tcpRecvThread::interruptSocketRecv ()
|
||||
{
|
||||
epicsThreadId threadId = this->thread.getId ();
|
||||
if ( threadId ) {
|
||||
epicsSignalRaiseSigUrg ( threadId );
|
||||
epicsSignalRaiseSigAlarm ( threadId );
|
||||
}
|
||||
}
|
||||
void tcpSendThread::interruptSocketSend ()
|
||||
{
|
||||
epicsThreadId threadId = this->thread.getId ();
|
||||
if ( threadId ) {
|
||||
epicsSignalRaiseSigUrg ( threadId );
|
||||
epicsSignalRaiseSigAlarm ( threadId );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ epicsShareFunc void epicsShareAPI epicsSignalInstallSigPipeIgnore ( void );
|
||||
* required only if shutdown() and close() do not interrupt a thread blocking in
|
||||
* a socket system call
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigUrgIgnore ( void );
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigUrg ( struct epicsThreadOSD * );
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigAlarmIgnore ( void );
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigAlarm ( struct epicsThreadOSD * );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
* All NOOPs if the os isnt POSIX
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigPipeIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigUrgIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigUrg ( struct epicsThreadOSD * /* threadId */ ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigAlarmIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigAlarm ( struct epicsThreadOSD * /* threadId */ ) {}
|
||||
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
* NOOP
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigPipeIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigUrgIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigUrg ( struct epicsThreadOSD * /* threadid */ ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigAlarmIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigAlarm ( struct epicsThreadOSD * /* threadid */ ) {}
|
||||
|
||||
|
||||
@@ -732,7 +732,7 @@ epicsShareFunc void epicsShareAPI epicsThreadSleep ( double seconds )
|
||||
}
|
||||
|
||||
/*
|
||||
* epicsThreadGetIdSelf ()
|
||||
* epicsThreadSleepQuantum ()
|
||||
*/
|
||||
double epicsShareAPI epicsThreadSleepQuantum ()
|
||||
{
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
* All NOOPs if the os isnt POSIX
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigPipeIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigUrgIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigUrg ( struct epicsThreadOSD * /* threadId */ ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigAlarmIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigAlarm ( struct epicsThreadOSD * /* threadId */ ) {}
|
||||
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
* Author: J. Hill
|
||||
*/
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
@@ -23,7 +27,7 @@ typedef void ( *pSigFunc ) ( int );
|
||||
}
|
||||
|
||||
static pSigFunc pReplacedSigPipeFunc = 0;
|
||||
static pSigFunc pReplacedSigUrgFunc = 0;
|
||||
static pSigFunc pReplacedSigAlarmFunc = 0;
|
||||
|
||||
/*
|
||||
* localInstallSigHandler ()
|
||||
@@ -61,8 +65,6 @@ static void localInstallSigHandler ( int signalIn, pSigFunc pNewFunc,
|
||||
|
||||
/*
|
||||
* ignoreSigPipe ()
|
||||
*
|
||||
* install NOOP SIGPIPE handler
|
||||
*/
|
||||
extern "C" {
|
||||
static void ignoreSigPipe ( int signal )
|
||||
@@ -74,15 +76,13 @@ static void ignoreSigPipe ( int signal )
|
||||
}
|
||||
|
||||
/*
|
||||
* ignoreSigUrg ()
|
||||
*
|
||||
* install NOOP SIGURG handler
|
||||
* ignoreSigAlarm ()
|
||||
*/
|
||||
extern "C" {
|
||||
static void ignoreSigUrg ( int signal )
|
||||
static void ignoreSigAlarm ( int signal )
|
||||
{
|
||||
if ( pReplacedSigUrgFunc ) {
|
||||
( *pReplacedSigUrgFunc ) ( signal );
|
||||
if ( pReplacedSigAlarmFunc ) {
|
||||
( *pReplacedSigAlarmFunc ) ( signal );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,22 +93,28 @@ static void ignoreSigUrg ( int signal )
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigPipeIgnore (void)
|
||||
{
|
||||
localInstallSigHandler ( SIGPIPE,
|
||||
ignoreSigPipe, & pReplacedSigPipeFunc );
|
||||
ignoreSigAlarm, & pReplacedSigPipeFunc );
|
||||
}
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigUrgIgnore ( void )
|
||||
/*
|
||||
* epicsSignalInstallSigAlarmIgnore ()
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigAlarmIgnore ( void )
|
||||
{
|
||||
localInstallSigHandler ( SIGURG,
|
||||
ignoreSigUrg, & pReplacedSigUrgFunc );
|
||||
localInstallSigHandler ( SIGALRM,
|
||||
ignoreSigUrg, & pReplacedSigAlarmFunc );
|
||||
}
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigUrg
|
||||
/*
|
||||
* epicsSignalRaiseSigAlarm ()
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigAlarm
|
||||
( struct epicsThreadOSD * threadId )
|
||||
{
|
||||
pthread_t id = epicsThreadGetPosixThreadId ( threadId );
|
||||
int status = pthread_kill ( id, SIGURG );
|
||||
int status = pthread_kill ( id, SIGALRM );
|
||||
if ( status ) {
|
||||
errlogPrintf ( "Failed to send SIGURG to thread. Status = \"%s\"\n",
|
||||
errlogPrintf ( "Failed to send SIGALARM to thread. Status = \"%s\"\n",
|
||||
strerror ( status ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
* NOOP
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigPipeIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigUrgIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigUrg ( struct epicsThreadOSD * /* threadId */ ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalInstallSigAlarmIgnore ( void ) {}
|
||||
epicsShareFunc void epicsShareAPI epicsSignalRaiseSigAlarm ( struct epicsThreadOSD * /* threadId */ ) {}
|
||||
|
||||
Reference in New Issue
Block a user