@@ -109,6 +109,8 @@ static BaseType_t xSchedulerEnd = pdFALSE;
109
109
static pthread_t hTimerTickThread ;
110
110
static bool xTimerTickThreadShouldRun ;
111
111
static uint64_t prvStartTimeNs ;
112
+ static pthread_mutex_t xThreadMutex = PTHREAD_MUTEX_INITIALIZER ;
113
+ static pthread_key_t xThreadKey = 0 ;
112
114
/*-----------------------------------------------------------*/
113
115
114
116
static void prvSetupSignalsAndSchedulerPolicy ( void );
@@ -123,6 +125,44 @@ static void vPortStartFirstTask( void );
123
125
static void prvPortYieldFromISR ( void );
124
126
/*-----------------------------------------------------------*/
125
127
128
+ void prvThreadKeyDestructor ( void * data )
129
+ {
130
+ free ( data );
131
+ }
132
+
133
+ static void prvInitThreadKey ()
134
+ {
135
+ pthread_mutex_lock ( & xThreadMutex );
136
+
137
+ if ( xThreadKey == 0 )
138
+ {
139
+ pthread_key_create ( & xThreadKey , prvThreadKeyDestructor );
140
+ }
141
+
142
+ pthread_mutex_unlock ( & xThreadMutex );
143
+ }
144
+
145
+ static void prvMarkAsFreeRTOSThread ( pthread_t thread )
146
+ {
147
+ prvInitThreadKey ();
148
+ uint8_t * thread_data = malloc ( 1 );
149
+ * thread_data = 1 ;
150
+ pthread_setspecific ( xThreadKey , thread_data );
151
+ }
152
+
153
+ static BaseType_t prvIsFreeRTOSThread ( pthread_t thread )
154
+ {
155
+ uint8_t * thread_data = ( uint8_t * ) pthread_getspecific ( xThreadKey );
156
+
157
+ return thread_data != NULL && * thread_data == 1 ;
158
+ }
159
+
160
+ static void prvDestroyThreadKey ()
161
+ {
162
+ pthread_key_delete ( xThreadKey );
163
+ }
164
+ /*-----------------------------------------------------------*/
165
+
126
166
static void prvFatalError ( const char * pcCall ,
127
167
int iErrno ) __attribute__( ( __noreturn__ ) );
128
168
@@ -253,6 +293,8 @@ BaseType_t xPortStartScheduler( void )
253
293
/* Restore original signal mask. */
254
294
( void ) pthread_sigmask ( SIG_SETMASK , & xSchedulerOriginalSignalMask , NULL );
255
295
296
+ prvDestroyThreadKey ();
297
+
256
298
return 0 ;
257
299
}
258
300
/*-----------------------------------------------------------*/
@@ -270,8 +312,12 @@ void vPortEndScheduler( void )
270
312
( void ) pthread_kill ( hMainThread , SIG_RESUME );
271
313
272
314
/* Waiting to be deleted here. */
273
- pxCurrentThread = prvGetThreadFromTask ( xTaskGetCurrentTaskHandle () );
274
- event_wait ( pxCurrentThread -> ev );
315
+ if ( prvIsFreeRTOSThread ( pthread_self () ) == pdTRUE )
316
+ {
317
+ pxCurrentThread = prvGetThreadFromTask ( xTaskGetCurrentTaskHandle () );
318
+ event_wait ( pxCurrentThread -> ev );
319
+ }
320
+
275
321
pthread_testcancel ();
276
322
}
277
323
/*-----------------------------------------------------------*/
@@ -326,13 +372,21 @@ void vPortYield( void )
326
372
327
373
void vPortDisableInterrupts ( void )
328
374
{
329
- pthread_sigmask ( SIG_BLOCK , & xAllSignals , NULL );
375
+ if ( prvIsFreeRTOSThread ( pthread_self () ) == pdFALSE )
376
+ {
377
+ return ;
378
+ }
379
+ pthread_sigmask (SIG_BLOCK , & xAllSignals , NULL );
330
380
}
331
381
/*-----------------------------------------------------------*/
332
382
333
383
void vPortEnableInterrupts ( void )
334
384
{
335
- pthread_sigmask ( SIG_UNBLOCK , & xAllSignals , NULL );
385
+ if ( prvIsFreeRTOSThread ( pthread_self () ) == pdFALSE )
386
+ {
387
+ return ;
388
+ }
389
+ pthread_sigmask (SIG_UNBLOCK , & xAllSignals , NULL );
336
390
}
337
391
/*-----------------------------------------------------------*/
338
392
@@ -368,6 +422,8 @@ static void * prvTimerTickHandler( void * arg )
368
422
{
369
423
( void ) arg ;
370
424
425
+ prvMarkAsFreeRTOSThread ( pthread_self () );
426
+
371
427
prvPortSetCurrentThreadName ("Scheduler timer" );
372
428
373
429
while ( xTimerTickThreadShouldRun )
@@ -400,6 +456,12 @@ void prvSetupTimerInterrupt( void )
400
456
401
457
static void vPortSystemTickHandler ( int sig )
402
458
{
459
+ if ( prvIsFreeRTOSThread ( pthread_self () ) == pdFALSE )
460
+ {
461
+ fprintf ( stderr , "vPortSystemTickHandler called from non-FreeRTOS thread\n" );
462
+ return ;
463
+ }
464
+
403
465
Thread_t * pxThreadToSuspend ;
404
466
Thread_t * pxThreadToResume ;
405
467
@@ -452,6 +514,8 @@ static void * prvWaitForStart( void * pvParams )
452
514
{
453
515
Thread_t * pxThread = pvParams ;
454
516
517
+ prvMarkAsFreeRTOSThread ( pthread_self () );
518
+
455
519
prvSuspendSelf ( pxThread );
456
520
457
521
/* Resumed for the first time, unblocks all signals. */
0 commit comments