tls: Merge tls_xxx into pthread_keyxxx
it's always better to provide the standard api directly Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
parent
c19d37adf0
commit
bd76e69f8d
@ -209,88 +209,6 @@ struct tls_info_s
|
|||||||
* Public Function Prototypes
|
* Public Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_alloc
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Allocate a group-unique TLS data index
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* dtor - The destructor of TLS data element
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* A TLS index that is unique for use within this task group.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
int tls_alloc(CODE void (*dtor)(FAR void *));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_free
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Release a group-unique TLS data index previous obtained by tls_alloc()
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* tlsindex - The previously allocated TLS index to be freed
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* OK is returned on success; a negated errno value will be returned on
|
|
||||||
* failure:
|
|
||||||
*
|
|
||||||
* -EINVAL - the index to be freed is out of range.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
int tls_free(int tlsindex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_get_value
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Return an the TLS data value associated with the 'tlsindx'
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* tlsindex - Index of TLS data element to return
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* The value of TLS element associated with 'tlsindex'. Errors are not
|
|
||||||
* reported. Zero is returned in the event of an error, but zero may also
|
|
||||||
* be valid value and returned when there is no error. The only possible
|
|
||||||
* error would be if tlsindex < 0 or tlsindex >=CONFIG_TLS_NELEM.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
uintptr_t tls_get_value(int tlsindex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_set_value
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Set the TLS element associated with the 'tlsindex' to 'tlsvalue'
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* tlsindex - Index of TLS data element to set
|
|
||||||
* tlsvalue - The new value of the TLS data element
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* Zero is returned on success, a negated errno value is return on
|
|
||||||
* failure:
|
|
||||||
*
|
|
||||||
* EINVAL - tlsindex is not in range.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
int tls_set_value(int tlsindex, uintptr_t tlsvalue);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CONFIG_TLS_TASK_NELEM > 0
|
#if CONFIG_TLS_TASK_NELEM > 0
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -25,9 +25,13 @@
|
|||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/tls.h>
|
#include <nuttx/tls.h>
|
||||||
|
|
||||||
|
#if CONFIG_TLS_NELEM > 0
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -59,5 +63,23 @@
|
|||||||
|
|
||||||
FAR void *pthread_getspecific(pthread_key_t key)
|
FAR void *pthread_getspecific(pthread_key_t key)
|
||||||
{
|
{
|
||||||
return (FAR void *)tls_get_value((int)key);
|
FAR struct tls_info_s *info;
|
||||||
|
FAR void *ret = NULL;
|
||||||
|
|
||||||
|
DEBUGASSERT(key >= 0 && key < CONFIG_TLS_NELEM);
|
||||||
|
if (key >= 0 && key < CONFIG_TLS_NELEM)
|
||||||
|
{
|
||||||
|
/* Get the TLS info structure from the current threads stack */
|
||||||
|
|
||||||
|
info = up_tls_info();
|
||||||
|
DEBUGASSERT(info != NULL);
|
||||||
|
|
||||||
|
/* Get the element value from the TLS info. */
|
||||||
|
|
||||||
|
ret = (FAR void *)info->tl_elem[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_TLS_NELEM */
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/semaphore.h>
|
||||||
#include <nuttx/tls.h>
|
#include <nuttx/tls.h>
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
#if CONFIG_TLS_NELEM > 0
|
||||||
@ -70,23 +72,46 @@
|
|||||||
int pthread_key_create(FAR pthread_key_t *key,
|
int pthread_key_create(FAR pthread_key_t *key,
|
||||||
CODE void (*destructor)(FAR void *))
|
CODE void (*destructor)(FAR void *))
|
||||||
{
|
{
|
||||||
int tlsindex;
|
FAR struct task_info_s *info = task_get_info();
|
||||||
|
int candidate;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DEBUGASSERT(key != NULL);
|
DEBUGASSERT(key != NULL);
|
||||||
|
DEBUGASSERT(info != NULL);
|
||||||
|
|
||||||
/* Allocate a TLS index */
|
/* Search for an unused index. This is done in a critical section here to
|
||||||
|
* avoid concurrent modification of the group TLS index set.
|
||||||
|
*/
|
||||||
|
|
||||||
tlsindex = tls_alloc(destructor);
|
ret = _SEM_WAIT(&info->ta_sem);
|
||||||
|
|
||||||
/* Check if found a TLS index. */
|
if (ret < 0)
|
||||||
|
|
||||||
if (tlsindex >= 0)
|
|
||||||
{
|
{
|
||||||
*key = tlsindex;
|
ret = _SEM_ERRNO(ret);
|
||||||
return OK;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -tlsindex;
|
ret = EAGAIN;
|
||||||
|
|
||||||
|
for (candidate = 0; candidate < CONFIG_TLS_NELEM; candidate++)
|
||||||
|
{
|
||||||
|
/* Is this candidate index available? */
|
||||||
|
|
||||||
|
tls_ndxset_t mask = (tls_ndxset_t)1 << candidate;
|
||||||
|
if ((info->ta_tlsset & mask) == 0)
|
||||||
|
{
|
||||||
|
/* Yes.. allocate the index and break out of the loop */
|
||||||
|
|
||||||
|
info->ta_tlsset |= mask;
|
||||||
|
info->ta_tlsdtor[candidate] = destructor;
|
||||||
|
*key = candidate;
|
||||||
|
ret = OK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_SEM_POST(&info->ta_sem);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_TLS_NELEM */
|
#endif /* CONFIG_TLS_NELEM */
|
||||||
|
@ -25,9 +25,14 @@
|
|||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/semaphore.h>
|
||||||
#include <nuttx/tls.h>
|
#include <nuttx/tls.h>
|
||||||
|
|
||||||
|
#if CONFIG_TLS_NELEM > 0
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -52,8 +57,33 @@
|
|||||||
|
|
||||||
int pthread_key_delete(pthread_key_t key)
|
int pthread_key_delete(pthread_key_t key)
|
||||||
{
|
{
|
||||||
/* Free the TLS index */
|
FAR struct task_info_s *info = task_get_info();
|
||||||
|
tls_ndxset_t mask;
|
||||||
|
int ret = EINVAL;
|
||||||
|
|
||||||
int ret = tls_free((int)key);
|
DEBUGASSERT(info != NULL);
|
||||||
return ret < 0 ? -ret : 0;
|
DEBUGASSERT(key >= 0 && key < CONFIG_TLS_NELEM);
|
||||||
|
if (key >= 0 && key < CONFIG_TLS_NELEM)
|
||||||
|
{
|
||||||
|
/* This is done while holding a semaphore here to avoid concurrent
|
||||||
|
* modification of the group TLS index set.
|
||||||
|
*/
|
||||||
|
|
||||||
|
mask = (tls_ndxset_t)1 << key;
|
||||||
|
ret = _SEM_WAIT(&info->ta_sem);
|
||||||
|
if (ret == OK)
|
||||||
|
{
|
||||||
|
DEBUGASSERT((info->ta_tlsset & mask) != 0);
|
||||||
|
info->ta_tlsset &= ~mask;
|
||||||
|
_SEM_POST(&info->ta_sem);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = _SEM_ERRNO(ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_TLS_NELEM */
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include <nuttx/arch.h>
|
||||||
#include <nuttx/tls.h>
|
#include <nuttx/tls.h>
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
#if CONFIG_TLS_NELEM > 0
|
||||||
@ -72,9 +74,23 @@
|
|||||||
|
|
||||||
int pthread_setspecific(pthread_key_t key, FAR const void *value)
|
int pthread_setspecific(pthread_key_t key, FAR const void *value)
|
||||||
{
|
{
|
||||||
int ret = tls_set_value((int)key, (uintptr_t)value);
|
FAR struct tls_info_s *info;
|
||||||
return ret < 0 ? -ret : 0;
|
|
||||||
|
DEBUGASSERT(key >= 0 && key < CONFIG_TLS_NELEM);
|
||||||
|
if (key >= 0 && key < CONFIG_TLS_NELEM)
|
||||||
|
{
|
||||||
|
/* Get the TLS info structure from the current threads stack */
|
||||||
|
|
||||||
|
info = up_tls_info();
|
||||||
|
DEBUGASSERT(info != NULL);
|
||||||
|
|
||||||
|
/* Set the element value int the TLS info. */
|
||||||
|
|
||||||
|
info->tl_elem[key] = (uintptr_t)value;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_TLS_NELEM */
|
#endif /* CONFIG_TLS_NELEM */
|
||||||
|
|
||||||
|
@ -20,13 +20,15 @@
|
|||||||
|
|
||||||
CSRCS += task_getinfo.c tls_getinfo.c
|
CSRCS += task_getinfo.c tls_getinfo.c
|
||||||
|
|
||||||
|
ifneq ($(CONFIG_TLS_TASK_NELEM),0)
|
||||||
|
CSRCS += task_tls.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($(CONFIG_TLS_NELEM),0)
|
ifneq ($(CONFIG_TLS_NELEM),0)
|
||||||
CSRCS += tls_alloc.c tls_free.c
|
CSRCS += tls_destruct.c
|
||||||
CSRCS += tls_setvalue.c tls_getvalue.c tls_destruct.c
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Include tls build support
|
# Include tls build support
|
||||||
|
|
||||||
DEPPATH += --dep-path tls
|
DEPPATH += --dep-path tls
|
||||||
VPATH += :tls
|
VPATH += :tls
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libs/libc/tls/tls_setvalue.c
|
* libs/libc/tls/task_tls.c
|
||||||
*
|
*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
@ -24,61 +24,44 @@
|
|||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <nuttx/arch.h>
|
|
||||||
#include <nuttx/tls.h>
|
#include <nuttx/tls.h>
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
#if CONFIG_TLS_TASK_NELEM > 0
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: tls_set_value
|
* Name: task_tls_get_value
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the TLS element associated with the 'tlsindex' to 'tlsvalue'
|
* Return an the task local storage data value associated with 'tlsindx'
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* tlsindex - Index of TLS data element to set
|
* tlsindex - Index of task local storage data element to return
|
||||||
* tlsvalue - The new value of the TLS data element
|
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* Zero is returned on success, a negated errno value is return on
|
* The value of TLS element associated with 'tlsindex'. Errors are not
|
||||||
* failure:
|
* reported. Zero is returned in the event of an error, but zero may also
|
||||||
*
|
* be valid value and returned when there is no error. The only possible
|
||||||
* EINVAL - tlsindex is not in range.
|
* error would be if tlsindex < 0 or tlsindex >=CONFIG_TLS_TASK_NELEM.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int tls_set_value(int tlsindex, uintptr_t tlsvalue)
|
uintptr_t task_tls_get_value(int tlsindex)
|
||||||
{
|
{
|
||||||
FAR struct tls_info_s *info;
|
FAR struct task_info_s *info = task_get_info();
|
||||||
|
|
||||||
DEBUGASSERT(tlsindex >= 0 && tlsindex < CONFIG_TLS_NELEM);
|
if (tlsindex >= 0 && tlsindex < CONFIG_TLS_TASK_NELEM)
|
||||||
if (tlsindex >= 0 && tlsindex < CONFIG_TLS_NELEM)
|
|
||||||
{
|
{
|
||||||
/* Get the TLS info structure from the current threads stack */
|
return info->ta_telem[tlsindex];
|
||||||
|
|
||||||
info = up_tls_info();
|
|
||||||
DEBUGASSERT(info != NULL);
|
|
||||||
|
|
||||||
/* Set the element value int the TLS info. */
|
|
||||||
|
|
||||||
info->tl_elem[tlsindex] = tlsvalue;
|
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_TLS_NELEM > 0 */
|
|
||||||
|
|
||||||
#if CONFIG_TLS_TASK_NELEM > 0
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: task_tls_set_value
|
* Name: task_tls_set_value
|
||||||
*
|
*
|
@ -1,100 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* libs/libc/tls/tls_alloc.c
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership. The
|
|
||||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the
|
|
||||||
* License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Included Files
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
|
||||||
|
|
||||||
#include <sched.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <debug.h>
|
|
||||||
|
|
||||||
#include <nuttx/spinlock.h>
|
|
||||||
#include <nuttx/tls.h>
|
|
||||||
#include <nuttx/sched.h>
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_alloc
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Allocate a group-unique TLS data index
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* A TLS index that is unique for use within this task group.
|
|
||||||
* If unsuccessful, an errno value will be returned and set to errno.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
int tls_alloc(CODE void (*dtor)(FAR void *))
|
|
||||||
{
|
|
||||||
FAR struct task_info_s *info = task_get_info();
|
|
||||||
int candidate;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
DEBUGASSERT(info);
|
|
||||||
|
|
||||||
/* Search for an unused index. This is done in a critical section here to
|
|
||||||
* avoid concurrent modification of the group TLS index set.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ret = _SEM_WAIT(&info->ta_sem);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
ret = _SEM_ERRVAL(ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = -EAGAIN;
|
|
||||||
|
|
||||||
for (candidate = 0; candidate < CONFIG_TLS_NELEM; candidate++)
|
|
||||||
{
|
|
||||||
/* Is this candidate index available? */
|
|
||||||
|
|
||||||
tls_ndxset_t mask = (tls_ndxset_t)1 << candidate;
|
|
||||||
if ((info->ta_tlsset & mask) == 0)
|
|
||||||
{
|
|
||||||
/* Yes.. allocate the index and break out of the loop */
|
|
||||||
|
|
||||||
info->ta_tlsset |= mask;
|
|
||||||
info->ta_tlsdtor[candidate] = dtor;
|
|
||||||
ret = candidate;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_SEM_POST(&info->ta_sem);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_TLS_NELEM > 0 */
|
|
@ -1,90 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* libs/libc/tls/tls_free.c
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership. The
|
|
||||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the
|
|
||||||
* License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Included Files
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
|
||||||
|
|
||||||
#include <sched.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include <nuttx/spinlock.h>
|
|
||||||
#include <nuttx/tls.h>
|
|
||||||
#include <nuttx/sched.h>
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_free
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Release a group-unique TLS data index previous obtained by tls_alloc()
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* tlsindex - The previously allocated TLS index to be freed
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* OK is returned on success;
|
|
||||||
* If unsuccessful an errno value will be returned and set to errno.
|
|
||||||
* -EINVAL - the index to be freed is out of range.
|
|
||||||
* -EINTR - the wait operation interrupted by signal
|
|
||||||
* -ECANCELED - the thread was canceled during waiting
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
int tls_free(int tlsindex)
|
|
||||||
{
|
|
||||||
FAR struct task_info_s *info = task_get_info();
|
|
||||||
tls_ndxset_t mask;
|
|
||||||
int ret = -EINVAL;
|
|
||||||
|
|
||||||
DEBUGASSERT((unsigned)tlsindex < CONFIG_TLS_NELEM && info != NULL);
|
|
||||||
if ((unsigned)tlsindex < CONFIG_TLS_NELEM)
|
|
||||||
{
|
|
||||||
/* This is done while holding a semaphore here to avoid concurrent
|
|
||||||
* modification of the group TLS index set.
|
|
||||||
*/
|
|
||||||
|
|
||||||
mask = (1 << tlsindex);
|
|
||||||
|
|
||||||
ret = _SEM_WAIT(&info->ta_sem);
|
|
||||||
if (ret == OK)
|
|
||||||
{
|
|
||||||
DEBUGASSERT((info->ta_tlsset & mask) != 0);
|
|
||||||
info->ta_tlsset &= ~mask;
|
|
||||||
_SEM_POST(&info->ta_sem);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = _SEM_ERRVAL(ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_TLS_NELEM > 0 */
|
|
@ -1,110 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* libs/libc/tls/tls_getvalue.c
|
|
||||||
*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership. The
|
|
||||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
||||||
* "License"); you may not use this file except in compliance with the
|
|
||||||
* License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Included Files
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <nuttx/arch.h>
|
|
||||||
#include <nuttx/tls.h>
|
|
||||||
|
|
||||||
#if CONFIG_TLS_NELEM > 0
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: tls_get_value
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Return an the TLS data value associated with the 'tlsindx'
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* tlsindex - Index of TLS data element to return
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* The value of TLS element associated with 'tlsindex'. Errors are not
|
|
||||||
* reported. Zero is returned in the event of an error, but zero may also
|
|
||||||
* be valid value and returned when there is no error. The only possible
|
|
||||||
* error would be if tlsindex < 0 or tlsindex >=CONFIG_TLS_NELEM.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
uintptr_t tls_get_value(int tlsindex)
|
|
||||||
{
|
|
||||||
FAR struct tls_info_s *info;
|
|
||||||
uintptr_t ret = 0;
|
|
||||||
|
|
||||||
DEBUGASSERT(tlsindex >= 0 && tlsindex < CONFIG_TLS_NELEM);
|
|
||||||
if (tlsindex >= 0 && tlsindex < CONFIG_TLS_NELEM)
|
|
||||||
{
|
|
||||||
/* Get the TLS info structure from the current threads stack */
|
|
||||||
|
|
||||||
info = up_tls_info();
|
|
||||||
DEBUGASSERT(info != NULL);
|
|
||||||
|
|
||||||
/* Get the element value from the TLS info. */
|
|
||||||
|
|
||||||
ret = info->tl_elem[tlsindex];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* CONFIG_TLS_NELEM > 0 */
|
|
||||||
|
|
||||||
#if CONFIG_TLS_TASK_NELEM > 0
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: task_tls_get_value
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Return an the task local storage data value associated with 'tlsindx'
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* tlsindex - Index of task local storage data element to return
|
|
||||||
*
|
|
||||||
* Returned Value:
|
|
||||||
* The value of TLS element associated with 'tlsindex'. Errors are not
|
|
||||||
* reported. Zero is returned in the event of an error, but zero may also
|
|
||||||
* be valid value and returned when there is no error. The only possible
|
|
||||||
* error would be if tlsindex < 0 or tlsindex >=CONFIG_TLS_TASK_NELEM.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
uintptr_t task_tls_get_value(int tlsindex)
|
|
||||||
{
|
|
||||||
FAR struct task_info_s *info = task_get_info();
|
|
||||||
|
|
||||||
if (tlsindex >= 0 && tlsindex < CONFIG_TLS_TASK_NELEM)
|
|
||||||
{
|
|
||||||
return info->ta_telem[tlsindex];
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue
Block a user