@@ -97,6 +97,7 @@ static inline Thread_t * prvGetThreadFromTask( TaskHandle_t xTask )
97
97
/*-----------------------------------------------------------*/
98
98
99
99
static pthread_once_t hSigSetupThread = PTHREAD_ONCE_INIT ;
100
+ static pthread_once_t hThreadKeyOnce = PTHREAD_ONCE_INIT ;
100
101
static sigset_t xAllSignals ;
101
102
static sigset_t xSchedulerOriginalSignalMask ;
102
103
static pthread_t hMainThread = ( pthread_t ) NULL ;
@@ -105,7 +106,6 @@ static BaseType_t xSchedulerEnd = pdFALSE;
105
106
static pthread_t hTimerTickThread ;
106
107
static bool xTimerTickThreadShouldRun ;
107
108
static uint64_t prvStartTimeNs ;
108
- static pthread_mutex_t xThreadMutex = PTHREAD_MUTEX_INITIALIZER ;
109
109
static pthread_key_t xThreadKey = 0 ;
110
110
/*-----------------------------------------------------------*/
111
111
@@ -134,22 +134,15 @@ static void prvThreadKeyDestructor( void * pvData )
134
134
135
135
static void prvInitThreadKey ( void )
136
136
{
137
- pthread_mutex_lock ( & xThreadMutex );
138
-
139
- if ( xThreadKey == 0 )
140
- {
141
- pthread_key_create ( & xThreadKey , prvThreadKeyDestructor );
142
- }
143
-
144
- pthread_mutex_unlock ( & xThreadMutex );
137
+ pthread_key_create ( & xThreadKey , prvThreadKeyDestructor );
145
138
}
146
139
/*-----------------------------------------------------------*/
147
140
148
141
static void prvMarkAsFreeRTOSThread ( void )
149
142
{
150
143
uint8_t * pucThreadData = NULL ;
151
144
152
- prvInitThreadKey ( );
145
+ ( void ) pthread_once ( & hThreadKeyOnce , prvInitThreadKey );
153
146
154
147
pucThreadData = malloc ( 1 );
155
148
configASSERT ( pucThreadData != NULL );
@@ -165,7 +158,10 @@ static BaseType_t prvIsFreeRTOSThread( void )
165
158
uint8_t * pucThreadData = NULL ;
166
159
BaseType_t xRet = pdFALSE ;
167
160
161
+ ( void ) pthread_once ( & hThreadKeyOnce , prvInitThreadKey );
162
+
168
163
pucThreadData = ( uint8_t * ) pthread_getspecific ( xThreadKey );
164
+
169
165
if ( ( pucThreadData != NULL ) && ( * pucThreadData == 1 ) )
170
166
{
171
167
xRet = pdTRUE ;
@@ -192,13 +188,13 @@ void prvFatalError( const char * pcCall,
192
188
}
193
189
/*-----------------------------------------------------------*/
194
190
195
- static void prvPortSetCurrentThreadName (char * pxThreadName )
191
+ static void prvPortSetCurrentThreadName ( char * pxThreadName )
196
192
{
197
- #ifdef __APPLE__
198
- pthread_setname_np (pxThreadName );
199
- #else
200
- pthread_setname_np (pthread_self (), pxThreadName );
201
- #endif
193
+ #ifdef __APPLE__
194
+ pthread_setname_np ( pxThreadName );
195
+ #else
196
+ pthread_setname_np ( pthread_self (), pxThreadName );
197
+ #endif
202
198
}
203
199
/*-----------------------------------------------------------*/
204
200
@@ -269,7 +265,7 @@ BaseType_t xPortStartScheduler( void )
269
265
sigset_t xSignals ;
270
266
271
267
hMainThread = pthread_self ();
272
- prvPortSetCurrentThreadName ("Scheduler" );
268
+ prvPortSetCurrentThreadName ( "Scheduler" );
273
269
274
270
/* Start the timer that generates the tick ISR(SIGALRM).
275
271
* Interrupts are disabled here already. */
@@ -303,9 +299,12 @@ BaseType_t xPortStartScheduler( void )
303
299
* memset the internal struct members for MacOS/Linux Compatibility */
304
300
#if __APPLE__
305
301
hSigSetupThread .__sig = _PTHREAD_ONCE_SIG_init ;
306
- memset ( ( void * ) & hSigSetupThread .__opaque , 0 , sizeof (hSigSetupThread .__opaque ));
302
+ hThreadKeyOnce .__sig = _PTHREAD_ONCE_SIG_init ;
303
+ memset ( ( void * ) & hSigSetupThread .__opaque , 0 , sizeof ( hSigSetupThread .__opaque ) );
304
+ memset ( ( void * ) & hThreadKeyOnce .__opaque , 0 , sizeof ( hThreadKeyOnce .__opaque ) );
307
305
#else /* Linux PTHREAD library*/
308
306
hSigSetupThread = PTHREAD_ONCE_INIT ;
307
+ hThreadKeyOnce = PTHREAD_ONCE_INIT ;
309
308
#endif /* __APPLE__*/
310
309
311
310
/* Restore original signal mask. */
@@ -392,7 +391,7 @@ void vPortDisableInterrupts( void )
392
391
{
393
392
if ( prvIsFreeRTOSThread () == pdTRUE )
394
393
{
395
- pthread_sigmask (SIG_BLOCK , & xAllSignals , NULL );
394
+ pthread_sigmask ( SIG_BLOCK , & xAllSignals , NULL );
396
395
}
397
396
}
398
397
/*-----------------------------------------------------------*/
@@ -540,7 +539,7 @@ static void * prvWaitForStart( void * pvParams )
540
539
vPortEnableInterrupts ();
541
540
542
541
/* Set thread name */
543
- prvPortSetCurrentThreadName (pcTaskGetName (xTaskGetCurrentTaskHandle ()) );
542
+ prvPortSetCurrentThreadName ( pcTaskGetName ( xTaskGetCurrentTaskHandle () ) );
544
543
545
544
/* Call the task's entry point. */
546
545
pxThread -> pxCode ( pxThread -> pvParams );
0 commit comments