@@ -191,13 +191,19 @@ portBASE_TYPE xPortStartScheduler( void )
191
191
* Interrupts are disabled here already. */
192
192
prvSetupTimerInterrupt ();
193
193
194
+ /*
195
+ * Block SIG_RESUME before starting any tasks so the main thread can sigwait on it.
196
+ * To sigwait on an unblocked signal is undefined.
197
+ * https://pubs.opengroup.org/onlinepubs/009604499/functions/sigwait.html
198
+ */
199
+ sigemptyset ( & xSignals );
200
+ sigaddset ( & xSignals , SIG_RESUME );
201
+ ( void ) pthread_sigmask ( SIG_BLOCK , & xSignals , NULL );
202
+
194
203
/* Start the first task. */
195
204
vPortStartFirstTask ();
196
205
197
206
/* Wait until signaled by vPortEndScheduler(). */
198
- sigemptyset ( & xSignals );
199
- sigaddset ( & xSignals , SIG_RESUME );
200
-
201
207
while ( xSchedulerEnd != pdTRUE )
202
208
{
203
209
sigwait ( & xSignals , & iSignal );
@@ -543,23 +549,10 @@ static void prvSetupSignalsAndSchedulerPolicy( void )
543
549
& xAllSignals ,
544
550
& xSchedulerOriginalSignalMask );
545
551
546
- /* SIG_RESUME is only used with sigwait() so doesn't need a
547
- * handler. */
548
- sigresume .sa_flags = 0 ;
549
- sigresume .sa_handler = SIG_IGN ;
550
- sigfillset ( & sigresume .sa_mask );
551
-
552
552
sigtick .sa_flags = 0 ;
553
553
sigtick .sa_handler = vPortSystemTickHandler ;
554
554
sigfillset ( & sigtick .sa_mask );
555
555
556
- iRet = sigaction ( SIG_RESUME , & sigresume , NULL );
557
-
558
- if ( iRet == -1 )
559
- {
560
- prvFatalError ( "sigaction" , errno );
561
- }
562
-
563
556
iRet = sigaction ( SIGALRM , & sigtick , NULL );
564
557
565
558
if ( iRet == -1 )
0 commit comments