LCOV - code coverage report
Current view: top level - zephyr/posix - pthread.h Hit Total Coverage
Test: new.info Lines: 38 115 33.0 %
Date: 2024-12-21 18:13:37

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2017 Intel Corporation
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_POSIX_PTHREAD_H_
       8             : #define ZEPHYR_INCLUDE_POSIX_PTHREAD_H_
       9             : 
      10             : #include <stdlib.h>
      11             : #include <string.h>
      12             : 
      13             : #include <zephyr/kernel.h>
      14             : #include <zephyr/posix/time.h>
      15             : #include <zephyr/posix/unistd.h>
      16             : #include <zephyr/posix/sched.h>
      17             : 
      18             : #ifdef __cplusplus
      19             : extern "C" {
      20             : #endif
      21             : 
      22             : /*
      23             :  * Pthread detach/joinable
      24             :  * Undefine possibly predefined values by external toolchain headers
      25             :  */
      26             : #undef PTHREAD_CREATE_DETACHED
      27           0 : #define PTHREAD_CREATE_DETACHED 1
      28             : #undef PTHREAD_CREATE_JOINABLE
      29           0 : #define PTHREAD_CREATE_JOINABLE 0
      30             : 
      31             : /* Pthread resource visibility */
      32           0 : #define PTHREAD_PROCESS_PRIVATE 0
      33           0 : #define PTHREAD_PROCESS_SHARED  1
      34             : 
      35             : /* Pthread cancellation */
      36           0 : #define PTHREAD_CANCELED       ((void *)-1)
      37           0 : #define PTHREAD_CANCEL_ENABLE  0
      38           0 : #define PTHREAD_CANCEL_DISABLE 1
      39           0 : #define PTHREAD_CANCEL_DEFERRED     0
      40           0 : #define PTHREAD_CANCEL_ASYNCHRONOUS 1
      41             : 
      42             : /* Pthread scope */
      43             : #undef PTHREAD_SCOPE_PROCESS
      44           0 : #define PTHREAD_SCOPE_PROCESS    1
      45             : #undef PTHREAD_SCOPE_SYSTEM
      46           0 : #define PTHREAD_SCOPE_SYSTEM     0
      47             : 
      48             : /* Pthread inherit scheduler */
      49             : #undef PTHREAD_INHERIT_SCHED
      50           0 : #define PTHREAD_INHERIT_SCHED  0
      51             : #undef PTHREAD_EXPLICIT_SCHED
      52           0 : #define PTHREAD_EXPLICIT_SCHED 1
      53             : 
      54             : /* Passed to pthread_once */
      55           0 : #define PTHREAD_ONCE_INIT {0}
      56             : 
      57             : /* The minimum allowable stack size */
      58           0 : #define PTHREAD_STACK_MIN K_KERNEL_STACK_LEN(0)
      59             : 
      60             : /**
      61             :  * @brief Declare a condition variable as initialized
      62             :  *
      63             :  * Initialize a condition variable with the default condition variable attributes.
      64             :  */
      65           1 : #define PTHREAD_COND_INITIALIZER (-1)
      66             : 
      67             : /**
      68             :  * @brief POSIX threading compatibility API
      69             :  *
      70             :  * See IEEE 1003.1
      71             :  */
      72           1 : int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *att);
      73             : 
      74             : /**
      75             :  * @brief POSIX threading compatibility API
      76             :  *
      77             :  * See IEEE 1003.1
      78             :  */
      79           1 : int pthread_cond_destroy(pthread_cond_t *cv);
      80             : 
      81             : /**
      82             :  * @brief POSIX threading compatibility API
      83             :  *
      84             :  * See IEEE 1003.1
      85             :  */
      86           1 : int pthread_cond_signal(pthread_cond_t *cv);
      87             : 
      88             : /**
      89             :  * @brief POSIX threading compatibility API
      90             :  *
      91             :  * See IEEE 1003.1
      92             :  */
      93           1 : int pthread_cond_broadcast(pthread_cond_t *cv);
      94             : 
      95             : /**
      96             :  * @brief POSIX threading compatibility API
      97             :  *
      98             :  * See IEEE 1003.1
      99             :  */
     100           1 : int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mut);
     101             : 
     102             : /**
     103             :  * @brief POSIX threading compatibility API
     104             :  *
     105             :  * See IEEE 1003.1
     106             :  */
     107           1 : int pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *mut,
     108             :                            const struct timespec *abstime);
     109             : 
     110             : /**
     111             :  * @brief POSIX threading compatibility API
     112             :  *
     113             :  * See IEEE 1003.1.
     114             :  *
     115             :  */
     116           1 : int pthread_condattr_init(pthread_condattr_t *att);
     117             : 
     118             : /**
     119             :  * @brief POSIX threading compatibility API
     120             :  *
     121             :  * See IEEE 1003.1
     122             :  *
     123             :  */
     124           1 : int pthread_condattr_destroy(pthread_condattr_t *att);
     125             : 
     126             : /**
     127             :  * @brief POSIX threading compatibility API
     128             :  *
     129             :  * See IEEE 1003.1
     130             :  *
     131             :  */
     132           1 : int pthread_condattr_getclock(const pthread_condattr_t *ZRESTRICT att,
     133             :                 clockid_t *ZRESTRICT clock_id);
     134             : 
     135             : /**
     136             :  * @brief POSIX threading compatibility API
     137             :  *
     138             :  * See IEEE 1003.1
     139             :  *
     140             :  */
     141             : 
     142           1 : int pthread_condattr_setclock(pthread_condattr_t *att, clockid_t clock_id);
     143             : 
     144             : /**
     145             :  * @brief Declare a mutex as initialized
     146             :  *
     147             :  * Initialize a mutex with the default mutex attributes.
     148             :  */
     149           1 : #define PTHREAD_MUTEX_INITIALIZER (-1)
     150             : 
     151             : /**
     152             :  * @brief Declare a rwlock as initialized
     153             :  *
     154             :  * Initialize a rwlock with the default rwlock attributes.
     155             :  */
     156           1 : #define PTHREAD_RWLOCK_INITIALIZER (-1)
     157             : 
     158             : /*
     159             :  *  Mutex attributes - type
     160             :  *
     161             :  *  PTHREAD_MUTEX_NORMAL: Owner of mutex cannot relock it. Attempting
     162             :  *      to relock will cause deadlock.
     163             :  *  PTHREAD_MUTEX_RECURSIVE: Owner can relock the mutex.
     164             :  *  PTHREAD_MUTEX_ERRORCHECK: If owner attempts to relock the mutex, an
     165             :  *      error is returned.
     166             :  *
     167             :  */
     168           0 : #define PTHREAD_MUTEX_NORMAL        0
     169           0 : #define PTHREAD_MUTEX_RECURSIVE     1
     170           0 : #define PTHREAD_MUTEX_ERRORCHECK    2
     171           0 : #define PTHREAD_MUTEX_DEFAULT       PTHREAD_MUTEX_NORMAL
     172             : 
     173             : /*
     174             :  *  Mutex attributes - protocol
     175             :  *
     176             :  *  PTHREAD_PRIO_NONE: Ownership of mutex does not affect priority.
     177             :  *  PTHREAD_PRIO_INHERIT: Owner's priority is boosted to the priority of
     178             :  *      highest priority thread blocked on the mutex.
     179             :  *  PTHREAD_PRIO_PROTECT:  Mutex has a priority ceiling.  The owner's
     180             :  *      priority is boosted to the highest priority ceiling of all mutexes
     181             :  *      owned (regardless of whether or not other threads are blocked on
     182             :  *      any of these mutexes).
     183             :  *  FIXME: Only PRIO_NONE is supported. Implement other protocols.
     184             :  */
     185           0 : #define PTHREAD_PRIO_NONE           0
     186           0 : #define PTHREAD_PRIO_INHERIT        1
     187           0 : #define PTHREAD_PRIO_PROTECT        2
     188             : 
     189             : /**
     190             :  * @brief POSIX threading compatibility API
     191             :  *
     192             :  * See IEEE 1003.1
     193             :  */
     194           1 : int pthread_mutex_destroy(pthread_mutex_t *m);
     195             : 
     196             : /**
     197             :  * @brief POSIX threading compatibility API
     198             :  *
     199             :  * See IEEE 1003.1
     200             :  */
     201           1 : int pthread_mutex_lock(pthread_mutex_t *m);
     202             : 
     203             : /**
     204             :  * @brief POSIX threading compatibility API
     205             :  *
     206             :  * See IEEE 1003.1
     207             :  */
     208           1 : int pthread_mutex_unlock(pthread_mutex_t *m);
     209             : 
     210             : /**
     211             :  * @brief POSIX threading compatibility API
     212             :  *
     213             :  * See IEEE 1003.1
     214             :  */
     215             : 
     216           1 : int pthread_mutex_timedlock(pthread_mutex_t *m,
     217             :                             const struct timespec *abstime);
     218             : 
     219             : /**
     220             :  * @brief POSIX threading compatibility API
     221             :  *
     222             :  * See IEEE 1003.1
     223             :  */
     224           1 : int pthread_mutex_trylock(pthread_mutex_t *m);
     225             : 
     226             : /**
     227             :  * @brief POSIX threading compatibility API
     228             :  *
     229             :  * See IEEE 1003.1
     230             :  */
     231           1 : int pthread_mutex_init(pthread_mutex_t *m,
     232             :                                      const pthread_mutexattr_t *att);
     233             : 
     234             : /**
     235             :  * @brief POSIX threading compatibility API
     236             :  *
     237             :  * See IEEE 1003.1
     238             :  */
     239           1 : int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);
     240             : 
     241             : /**
     242             :  * @brief POSIX threading compatibility API
     243             :  *
     244             :  * See IEEE 1003.1
     245             :  */
     246           1 : int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type);
     247             : 
     248             : /**
     249             :  * @brief POSIX threading compatibility API
     250             :  *
     251             :  * See IEEE 1003.1
     252             :  */
     253           1 : int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *attr,
     254             :                                   int *protocol);
     255             : 
     256             : /**
     257             :  * @brief POSIX threading compatibility API
     258             :  *
     259             :  * See IEEE 1003.1
     260             :  */
     261           1 : int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *type);
     262             : 
     263             : /**
     264             :  * @brief POSIX threading compatibility API
     265             :  *
     266             :  * See IEEE 1003.1
     267             :  *
     268             :  * Note that pthread attribute structs are currently noops in Zephyr.
     269             :  */
     270           1 : int pthread_mutexattr_init(pthread_mutexattr_t *attr);
     271             : 
     272             : /**
     273             :  * @brief POSIX threading compatibility API
     274             :  *
     275             :  * See IEEE 1003.1
     276             :  *
     277             :  * Note that pthread attribute structs are currently noops in Zephyr.
     278             :  */
     279           1 : int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
     280             : 
     281           0 : #define PTHREAD_BARRIER_SERIAL_THREAD 1
     282             : 
     283             : /*
     284             :  *  Barrier attributes - type
     285             :  */
     286           0 : #define PTHREAD_PROCESS_PRIVATE         0
     287           0 : #define PTHREAD_PROCESS_PUBLIC          1
     288             : 
     289             : /**
     290             :  * @brief POSIX threading compatibility API
     291             :  *
     292             :  * See IEEE 1003.1
     293             :  */
     294           1 : int pthread_barrier_wait(pthread_barrier_t *b);
     295             : 
     296             : /**
     297             :  * @brief POSIX threading compatibility API
     298             :  *
     299             :  * See IEEE 1003.1
     300             :  */
     301           1 : int pthread_barrier_init(pthread_barrier_t *b, const pthread_barrierattr_t *attr,
     302             :                          unsigned int count);
     303             : 
     304             : /**
     305             :  * @brief POSIX threading compatibility API
     306             :  *
     307             :  * See IEEE 1003.1
     308             :  */
     309           1 : int pthread_barrier_destroy(pthread_barrier_t *b);
     310             : 
     311             : /**
     312             :  * @brief POSIX threading compatibility API
     313             :  *
     314             :  * See IEEE 1003.1
     315             :  */
     316           1 : int pthread_barrierattr_init(pthread_barrierattr_t *b);
     317             : 
     318             : /**
     319             :  * @brief POSIX threading compatibility API
     320             :  *
     321             :  * See IEEE 1003.1
     322             :  */
     323           1 : int pthread_barrierattr_destroy(pthread_barrierattr_t *b);
     324             : 
     325             : /**
     326             :  * @brief POSIX threading compatibility API
     327             :  *
     328             :  * See IEEE 1003.1
     329             :  */
     330           1 : int pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared);
     331             : 
     332             : /**
     333             :  * @brief POSIX threading compatibility API
     334             :  *
     335             :  * See IEEE 1003.1
     336             :  */
     337           1 : int pthread_barrierattr_getpshared(const pthread_barrierattr_t *ZRESTRICT attr,
     338             :                                    int *ZRESTRICT pshared);
     339             : 
     340             : /* Predicates and setters for various pthread attribute values that we
     341             :  * don't support (or always support: the "process shared" attribute
     342             :  * can only be true given the way Zephyr implements these
     343             :  * objects). Leave these undefined for simplicity instead of defining
     344             :  * stubs to return an error that would have to be logged and
     345             :  * interpreted just to figure out that we didn't support it in the
     346             :  * first place. These APIs are very rarely used even in production
     347             :  * Unix code.  Leave the declarations here so they can be easily
     348             :  * uncommented and implemented as needed.
     349             : 
     350             : int pthread_condattr_getpshared(const pthread_condattr_t * int *);
     351             : int pthread_condattr_setpshared(pthread_condattr_t *, int);
     352             : int pthread_mutex_consistent(pthread_mutex_t *);
     353             : int pthread_mutexattr_getpshared(const pthread_mutexattr_t * int *);
     354             : int pthread_mutexattr_getrobust(const pthread_mutexattr_t * int *);
     355             : int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
     356             : int pthread_mutexattr_setrobust(pthread_mutexattr_t *, int);
     357             : */
     358             : 
     359             : #ifdef CONFIG_POSIX_THREAD_PRIO_PROTECT
     360             : int pthread_mutex_getprioceiling(const pthread_mutex_t *ZRESTRICT mutex,
     361             :                                  int *ZRESTRICT prioceiling);
     362             : int pthread_mutex_setprioceiling(pthread_mutex_t *ZRESTRICT mutex, int prioceiling,
     363             :                                  int *ZRESTRICT old_ceiling);
     364             : int pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *ZRESTRICT attr,
     365             :                                      int *ZRESTRICT prioceiling);
     366             : int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr, int prioceiling);
     367             : #endif /* CONFIG_POSIX_THREAD_PRIO_PROTECT */
     368             : 
     369             : /* Base Pthread related APIs */
     370             : 
     371             : /**
     372             :  * @brief Obtain ID of the calling thread.
     373             :  *
     374             :  * The results of calling this API from threads not created with
     375             :  * pthread_create() are undefined.
     376             :  *
     377             :  * See IEEE 1003.1
     378             :  */
     379           1 : pthread_t pthread_self(void);
     380             : 
     381             : /**
     382             :  * @brief Compare thread IDs.
     383             :  *
     384             :  * See IEEE 1003.1
     385             :  */
     386           1 : int pthread_equal(pthread_t pt1, pthread_t pt2);
     387             : 
     388             : /**
     389             :  * @brief Destroy the read-write lock attributes object.
     390             :  *
     391             :  * See IEEE 1003.1
     392             :  */
     393           1 : int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
     394             : 
     395             : /**
     396             :  * @brief initialize the read-write lock attributes object.
     397             :  *
     398             :  * See IEEE 1003.1
     399             :  */
     400           1 : int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
     401             : 
     402           0 : int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *ZRESTRICT attr,
     403             :                                   int *ZRESTRICT pshared);
     404           0 : int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared);
     405             : 
     406           0 : int pthread_attr_getguardsize(const pthread_attr_t *ZRESTRICT attr, size_t *ZRESTRICT guardsize);
     407           0 : int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
     408           0 : int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
     409           0 : int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
     410           0 : int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
     411           0 : int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
     412           0 : int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
     413           0 : int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
     414           0 : int pthread_attr_init(pthread_attr_t *attr);
     415           0 : int pthread_attr_destroy(pthread_attr_t *attr);
     416           0 : int pthread_attr_getschedparam(const pthread_attr_t *attr,
     417             :                                struct sched_param *schedparam);
     418           0 : int pthread_getschedparam(pthread_t pthread, int *policy,
     419             :                           struct sched_param *param);
     420           0 : int pthread_attr_getstack(const pthread_attr_t *attr,
     421             :                           void **stackaddr, size_t *stacksize);
     422           0 : int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr,
     423             :                           size_t stacksize);
     424           0 : int pthread_attr_getscope(const pthread_attr_t *attr, int *contentionscope);
     425           0 : int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
     426           0 : int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
     427           0 : int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
     428             : #ifdef CONFIG_POSIX_THREADS
     429             : int pthread_once(pthread_once_t *once, void (*initFunc)(void));
     430             : #endif
     431           0 : FUNC_NORETURN void pthread_exit(void *retval);
     432           0 : int pthread_timedjoin_np(pthread_t thread, void **status, const struct timespec *abstime);
     433           0 : int pthread_tryjoin_np(pthread_t thread, void **status);
     434           0 : int pthread_join(pthread_t thread, void **status);
     435           0 : int pthread_cancel(pthread_t pthread);
     436           0 : int pthread_detach(pthread_t thread);
     437           0 : int pthread_create(pthread_t *newthread, const pthread_attr_t *attr,
     438             :                    void *(*threadroutine)(void *), void *arg);
     439           0 : int pthread_setcancelstate(int state, int *oldstate);
     440           0 : int pthread_setcanceltype(int type, int *oldtype);
     441           0 : void pthread_testcancel(void);
     442           0 : int pthread_attr_setschedparam(pthread_attr_t *attr,
     443             :                                const struct sched_param *schedparam);
     444           0 : int pthread_setschedparam(pthread_t pthread, int policy,
     445             :                           const struct sched_param *param);
     446           0 : int pthread_setschedprio(pthread_t thread, int prio);
     447           0 : int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
     448           0 : int pthread_rwlock_init(pthread_rwlock_t *rwlock,
     449             :                         const pthread_rwlockattr_t *attr);
     450           0 : int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
     451           0 : int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock,
     452             :                                const struct timespec *abstime);
     453           0 : int pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlock,
     454             :                                const struct timespec *abstime);
     455           0 : int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
     456           0 : int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
     457           0 : int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
     458           0 : int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
     459           0 : int pthread_key_create(pthread_key_t *key,
     460             :                 void (*destructor)(void *));
     461           0 : int pthread_key_delete(pthread_key_t key);
     462           0 : int pthread_setspecific(pthread_key_t key, const void *value);
     463           0 : void *pthread_getspecific(pthread_key_t key);
     464           0 : int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
     465           0 : int pthread_getconcurrency(void);
     466           0 : int pthread_setconcurrency(int new_level);
     467             : 
     468             : void __z_pthread_cleanup_push(void *cleanup[3], void (*routine)(void *arg), void *arg);
     469             : void __z_pthread_cleanup_pop(int execute);
     470             : 
     471           0 : #define pthread_cleanup_push(_rtn, _arg)                                                           \
     472             :         do /* enforce '{'-like behaviour */ {                                                      \
     473             :                 void *_z_pthread_cleanup[3];                                                       \
     474             :                 __z_pthread_cleanup_push(_z_pthread_cleanup, _rtn, _arg)
     475             : 
     476           0 : #define pthread_cleanup_pop(_ex)                                                                   \
     477             :                 __z_pthread_cleanup_pop(_ex);                                                      \
     478             :         } /* enforce '}'-like behaviour */ while (0)
     479             : 
     480             : /* Glibc / Oracle Extension Functions */
     481             : 
     482             : /**
     483             :  * @brief Set name of POSIX thread.
     484             :  *
     485             :  * Non-portable, extension function that conforms with most
     486             :  * other definitions of this function.
     487             :  *
     488             :  * @param thread POSIX thread to set name
     489             :  * @param name Name string
     490             :  * @retval 0 Success
     491             :  * @retval ESRCH Thread does not exist
     492             :  * @retval EINVAL Name buffer is NULL
     493             :  * @retval Negative value if kernel function error
     494             :  *
     495             :  */
     496           1 : int pthread_setname_np(pthread_t thread, const char *name);
     497             : 
     498             : /**
     499             :  * @brief Get name of POSIX thread and store in name buffer
     500             :  *        that is of size len.
     501             :  *
     502             :  * Non-portable, extension function that conforms with most
     503             :  * other definitions of this function.
     504             :  *
     505             :  * @param thread POSIX thread to obtain name information
     506             :  * @param name Destination buffer
     507             :  * @param len Destination buffer size
     508             :  * @retval 0 Success
     509             :  * @retval ESRCH Thread does not exist
     510             :  * @retval EINVAL Name buffer is NULL
     511             :  * @retval Negative value if kernel function error
     512             :  */
     513           1 : int pthread_getname_np(pthread_t thread, char *name, size_t len);
     514             : 
     515             : #ifdef CONFIG_POSIX_THREADS
     516             : 
     517             : /**
     518             :  * @brief Destroy a pthread_spinlock_t.
     519             :  *
     520             :  * See IEEE 1003.1
     521             :  */
     522             : int pthread_spin_destroy(pthread_spinlock_t *lock);
     523             : 
     524             : /**
     525             :  * @brief Initialize a thread_spinlock_t.
     526             :  *
     527             :  * See IEEE 1003.1
     528             :  */
     529             : int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
     530             : 
     531             : /**
     532             :  * @brief Lock a previously initialized thread_spinlock_t.
     533             :  *
     534             :  * See IEEE 1003.1
     535             :  */
     536             : int pthread_spin_lock(pthread_spinlock_t *lock);
     537             : 
     538             : /**
     539             :  * @brief Attempt to lock a previously initialized thread_spinlock_t.
     540             :  *
     541             :  * See IEEE 1003.1
     542             :  */
     543             : int pthread_spin_trylock(pthread_spinlock_t *lock);
     544             : 
     545             : /**
     546             :  * @brief Unlock a previously locked thread_spinlock_t.
     547             :  *
     548             :  * See IEEE 1003.1
     549             :  */
     550             : int pthread_spin_unlock(pthread_spinlock_t *lock);
     551             : 
     552             : #endif
     553             : 
     554             : #ifdef __cplusplus
     555             : }
     556             : #endif
     557             : 
     558             : #endif /* ZEPHYR_INCLUDE_POSIX_PTHREAD_H_ */

Generated by: LCOV version 1.14