mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Simpler, more targeted solution
This commit is contained in:
parent
0e644d3cd0
commit
94263d23bd
42
portable/ThirdParty/GCC/Posix/port.c
vendored
42
portable/ThirdParty/GCC/Posix/port.c
vendored
|
@ -260,39 +260,12 @@ void vPortStartFirstTask( void )
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/*
|
|
||||||
* Clear a signal that is pending for the calling thread.
|
|
||||||
*/
|
|
||||||
void prvClearPendingSignal( int sig )
|
|
||||||
{
|
|
||||||
sigset_t set, oldset;
|
|
||||||
|
|
||||||
/* Block the signal */
|
|
||||||
sigemptyset( &set );
|
|
||||||
sigaddset( &set, sig );
|
|
||||||
pthread_sigmask( SIG_BLOCK, &set, &oldset );
|
|
||||||
|
|
||||||
/* Check if signal is pending */
|
|
||||||
sigpending( &set );
|
|
||||||
|
|
||||||
if( sigismember( &set, sig ) )
|
|
||||||
{
|
|
||||||
int signum;
|
|
||||||
/* Wait for and remove signal */
|
|
||||||
sigwait( &set, &signum );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore the original signal mask */
|
|
||||||
pthread_sigmask( SIG_SETMASK, &oldset, NULL );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See header file for description.
|
* See header file for description.
|
||||||
*/
|
*/
|
||||||
BaseType_t xPortStartScheduler( void )
|
BaseType_t xPortStartScheduler( void )
|
||||||
{
|
{
|
||||||
int iSignal;
|
int iSignal = 0;
|
||||||
sigset_t xSignals;
|
sigset_t xSignals;
|
||||||
|
|
||||||
hMainThread = pthread_self();
|
hMainThread = pthread_self();
|
||||||
|
@ -318,6 +291,16 @@ BaseType_t xPortStartScheduler( void )
|
||||||
while( xSchedulerEnd != pdTRUE )
|
while( xSchedulerEnd != pdTRUE )
|
||||||
{
|
{
|
||||||
sigwait( &xSignals, &iSignal );
|
sigwait( &xSignals, &iSignal );
|
||||||
|
|
||||||
|
/* For some reason, sigwait() doesn't always clear the signal the first time.
|
||||||
|
* Clear it again if it's still pending.
|
||||||
|
*/
|
||||||
|
sigset_t set;
|
||||||
|
sigpending( &set );
|
||||||
|
if( sigismember( &set, SIG_RESUME ) )
|
||||||
|
{
|
||||||
|
sigwait( &xSignals, &iSignal );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -335,9 +318,6 @@ BaseType_t xPortStartScheduler( void )
|
||||||
hSigSetupThread = PTHREAD_ONCE_INIT;
|
hSigSetupThread = PTHREAD_ONCE_INIT;
|
||||||
#endif /* __APPLE__*/
|
#endif /* __APPLE__*/
|
||||||
|
|
||||||
// Clear SIG_RESUME (SIGUSR1), because it might have fired again while we were shutting things down.
|
|
||||||
prvClearPendingSignal( SIG_RESUME );
|
|
||||||
|
|
||||||
/* Restore original signal mask. */
|
/* Restore original signal mask. */
|
||||||
( void ) pthread_sigmask( SIG_SETMASK, &xSchedulerOriginalSignalMask, NULL );
|
( void ) pthread_sigmask( SIG_SETMASK, &xSchedulerOriginalSignalMask, NULL );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue