Merge branch 'bugfix/pthread_local_storage_spinlock' into 'master'
pthreads: Remove potentially blocking mutex from idle task cleanup path See merge request !1621
This commit is contained in:
commit
af63ca1522
1 changed files with 7 additions and 7 deletions
|
@ -42,7 +42,7 @@ typedef struct key_entry_t_ {
|
||||||
// List of all keys created with pthread_key_create()
|
// List of all keys created with pthread_key_create()
|
||||||
SLIST_HEAD(key_list_t, key_entry_t_) s_keys = SLIST_HEAD_INITIALIZER(s_keys);
|
SLIST_HEAD(key_list_t, key_entry_t_) s_keys = SLIST_HEAD_INITIALIZER(s_keys);
|
||||||
|
|
||||||
static _lock_t s_keys_lock;
|
static portMUX_TYPE s_keys_lock = portMUX_INITIALIZER_UNLOCKED;
|
||||||
|
|
||||||
// List of all value entries associated with a thread via pthread_setspecific()
|
// List of all value entries associated with a thread via pthread_setspecific()
|
||||||
typedef struct value_entry_t_ {
|
typedef struct value_entry_t_ {
|
||||||
|
@ -62,7 +62,7 @@ int pthread_key_create(pthread_key_t *key, pthread_destructor_t destructor)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
_lock_acquire_recursive(&s_keys_lock);
|
portENTER_CRITICAL(&s_keys_lock);
|
||||||
|
|
||||||
const key_entry_t *head = SLIST_FIRST(&s_keys);
|
const key_entry_t *head = SLIST_FIRST(&s_keys);
|
||||||
new_key->key = (head == NULL) ? 1 : (head->key + 1);
|
new_key->key = (head == NULL) ? 1 : (head->key + 1);
|
||||||
|
@ -71,27 +71,27 @@ int pthread_key_create(pthread_key_t *key, pthread_destructor_t destructor)
|
||||||
|
|
||||||
SLIST_INSERT_HEAD(&s_keys, new_key, next);
|
SLIST_INSERT_HEAD(&s_keys, new_key, next);
|
||||||
|
|
||||||
_lock_release_recursive(&s_keys_lock);
|
portEXIT_CRITICAL(&s_keys_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static key_entry_t *find_key(pthread_key_t key)
|
static key_entry_t *find_key(pthread_key_t key)
|
||||||
{
|
{
|
||||||
_lock_acquire_recursive(&s_keys_lock);
|
portENTER_CRITICAL(&s_keys_lock);
|
||||||
key_entry_t *result = NULL;;
|
key_entry_t *result = NULL;;
|
||||||
SLIST_FOREACH(result, &s_keys, next) {
|
SLIST_FOREACH(result, &s_keys, next) {
|
||||||
if(result->key == key) {
|
if(result->key == key) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_lock_release_recursive(&s_keys_lock);
|
portEXIT_CRITICAL(&s_keys_lock);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pthread_key_delete(pthread_key_t key)
|
int pthread_key_delete(pthread_key_t key)
|
||||||
{
|
{
|
||||||
|
|
||||||
_lock_acquire_recursive(&s_keys_lock);
|
portENTER_CRITICAL(&s_keys_lock);
|
||||||
|
|
||||||
/* Ideally, we would also walk all tasks' thread local storage value_list here
|
/* Ideally, we would also walk all tasks' thread local storage value_list here
|
||||||
and delete any values associated with this key. We do not do this...
|
and delete any values associated with this key. We do not do this...
|
||||||
|
@ -103,7 +103,7 @@ int pthread_key_delete(pthread_key_t key)
|
||||||
free(entry);
|
free(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
_lock_release_recursive(&s_keys_lock);
|
portEXIT_CRITICAL(&s_keys_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue