mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Block SIG_RESUME in the main thread of the Posix port so that sigwait works as expected (#532)
Co-authored-by: alfred gedeon <28123637+alfred2g@users.noreply.github.com>
This commit is contained in:
parent
4a8c06689e
commit
fc615627f6
25
portable/ThirdParty/GCC/Posix/port.c
vendored
25
portable/ThirdParty/GCC/Posix/port.c
vendored
|
@ -191,13 +191,19 @@ portBASE_TYPE xPortStartScheduler( void )
|
||||||
* Interrupts are disabled here already. */
|
* Interrupts are disabled here already. */
|
||||||
prvSetupTimerInterrupt();
|
prvSetupTimerInterrupt();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Block SIG_RESUME before starting any tasks so the main thread can sigwait on it.
|
||||||
|
* To sigwait on an unblocked signal is undefined.
|
||||||
|
* https://pubs.opengroup.org/onlinepubs/009604499/functions/sigwait.html
|
||||||
|
*/
|
||||||
|
sigemptyset( &xSignals );
|
||||||
|
sigaddset( &xSignals, SIG_RESUME );
|
||||||
|
( void ) pthread_sigmask( SIG_BLOCK, &xSignals, NULL );
|
||||||
|
|
||||||
/* Start the first task. */
|
/* Start the first task. */
|
||||||
vPortStartFirstTask();
|
vPortStartFirstTask();
|
||||||
|
|
||||||
/* Wait until signaled by vPortEndScheduler(). */
|
/* Wait until signaled by vPortEndScheduler(). */
|
||||||
sigemptyset( &xSignals );
|
|
||||||
sigaddset( &xSignals, SIG_RESUME );
|
|
||||||
|
|
||||||
while( xSchedulerEnd != pdTRUE )
|
while( xSchedulerEnd != pdTRUE )
|
||||||
{
|
{
|
||||||
sigwait( &xSignals, &iSignal );
|
sigwait( &xSignals, &iSignal );
|
||||||
|
@ -543,23 +549,10 @@ static void prvSetupSignalsAndSchedulerPolicy( void )
|
||||||
&xAllSignals,
|
&xAllSignals,
|
||||||
&xSchedulerOriginalSignalMask );
|
&xSchedulerOriginalSignalMask );
|
||||||
|
|
||||||
/* SIG_RESUME is only used with sigwait() so doesn't need a
|
|
||||||
* handler. */
|
|
||||||
sigresume.sa_flags = 0;
|
|
||||||
sigresume.sa_handler = SIG_IGN;
|
|
||||||
sigfillset( &sigresume.sa_mask );
|
|
||||||
|
|
||||||
sigtick.sa_flags = 0;
|
sigtick.sa_flags = 0;
|
||||||
sigtick.sa_handler = vPortSystemTickHandler;
|
sigtick.sa_handler = vPortSystemTickHandler;
|
||||||
sigfillset( &sigtick.sa_mask );
|
sigfillset( &sigtick.sa_mask );
|
||||||
|
|
||||||
iRet = sigaction( SIG_RESUME, &sigresume, NULL );
|
|
||||||
|
|
||||||
if( iRet == -1 )
|
|
||||||
{
|
|
||||||
prvFatalError( "sigaction", errno );
|
|
||||||
}
|
|
||||||
|
|
||||||
iRet = sigaction( SIGALRM, &sigtick, NULL );
|
iRet = sigaction( SIGALRM, &sigtick, NULL );
|
||||||
|
|
||||||
if( iRet == -1 )
|
if( iRet == -1 )
|
||||||
|
|
Loading…
Reference in a new issue