pthread: Add support for PTHREAD_COND_INITIALIZER

Includes unit test for condition variables in C (previous test was C++ only)
This commit is contained in:
Angus Gratton
2021-04-23 10:01:37 +10:00
parent e6d15a0975
commit a6dea64106
5 changed files with 160 additions and 9 deletions

View File

@@ -66,7 +66,7 @@ typedef struct {
static SemaphoreHandle_t s_threads_mux = NULL;
static portMUX_TYPE s_mutex_init_lock = portMUX_INITIALIZER_UNLOCKED;
portMUX_TYPE pthread_lazy_init_lock = portMUX_INITIALIZER_UNLOCKED; // Used for mutexes and cond vars
static SLIST_HEAD(esp_thread_list_head, esp_pthread_entry) s_threads_list
= SLIST_HEAD_INITIALIZER(s_threads_list);
static pthread_key_t s_pthread_cfg_key;
@@ -581,6 +581,10 @@ int pthread_mutex_destroy(pthread_mutex_t *mutex)
if (!mutex) {
return EINVAL;
}
if ((intptr_t) *mutex == PTHREAD_MUTEX_INITIALIZER) {
return 0; // Static mutex was never initialized
}
mux = (esp_pthread_mutex_t *)*mutex;
if (!mux) {
return EINVAL;
@@ -634,11 +638,11 @@ static int pthread_mutex_init_if_static(pthread_mutex_t *mutex)
{
int res = 0;
if ((intptr_t) *mutex == PTHREAD_MUTEX_INITIALIZER) {
portENTER_CRITICAL(&s_mutex_init_lock);
portENTER_CRITICAL(&pthread_lazy_init_lock);
if ((intptr_t) *mutex == PTHREAD_MUTEX_INITIALIZER) {
res = pthread_mutex_init(mutex, NULL);
}
portEXIT_CRITICAL(&s_mutex_init_lock);
portEXIT_CRITICAL(&pthread_lazy_init_lock);
}
return res;
}