use SIGALRM instead of SIGURG to wakeup blocking socket calls

This commit is contained in:
Jeff Hill
2003-05-01 21:53:14 +00:00
parent 6802e5154e
commit 4c5dab8e72
9 changed files with 36 additions and 30 deletions

View File

@@ -167,7 +167,7 @@ cac::cac ( cacNotify & notifyIn ) :
* close(). To solve this problem we need to employ OS specific
* mechanisms.
*/
epicsSignalInstallSigUrgIgnore ();
epicsSignalInstallSigAlarmIgnore ();
epicsSignalInstallSigPipeIgnore ();
{

View File

@@ -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 );
}
}

View File

@@ -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
}

View File

@@ -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 */ ) {}

View File

@@ -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 */ ) {}

View File

@@ -732,7 +732,7 @@ epicsShareFunc void epicsShareAPI epicsThreadSleep ( double seconds )
}
/*
* epicsThreadGetIdSelf ()
* epicsThreadSleepQuantum ()
*/
double epicsShareAPI epicsThreadSleepQuantum ()
{

View File

@@ -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 */ ) {}

View File

@@ -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 ) );
}
}

View File

@@ -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 */ ) {}