/* * Copyright (c) 2022 Meta * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_LIB_POSIX_POSIX_INTERNAL_H_ #define ZEPHYR_LIB_POSIX_POSIX_INTERNAL_H_ /* * Bit used to mark a pthread object as initialized. Initialization status is * verified (against internal status) in lock / unlock / destroy functions. */ #define PTHREAD_OBJ_MASK_INIT 0x80000000 struct posix_mutex { k_tid_t owner; uint16_t lock_count; int type; _wait_q_t wait_q; }; struct posix_cond { _wait_q_t wait_q; }; enum pthread_state { /* The thread is running and detached. */ PTHREAD_DETACHED = PTHREAD_CREATE_DETACHED, /* The thread is running and joinable. */ PTHREAD_JOINABLE = PTHREAD_CREATE_JOINABLE, /* The thread structure is unallocated and available for reuse. */ PTHREAD_TERMINATED, /* A joinable thread exited and its return code is available. */ PTHREAD_EXITED }; struct posix_thread { struct k_thread thread; /* List of keys that thread has called pthread_setspecific() on */ sys_slist_t key_list; /* Exit status */ void *retval; /* Pthread cancellation */ int cancel_state; int cancel_pending; struct k_spinlock cancel_lock; /* Pthread State */ enum pthread_state state; pthread_mutex_t state_lock; pthread_cond_t state_cond; }; typedef struct pthread_key_obj { /* List of pthread_key_data objects that contain thread * specific data for the key */ sys_slist_t key_data_l; /* Optional destructor that is passed to pthread_key_create() */ void (*destructor)(void *value); } pthread_key_obj; typedef struct pthread_thread_data { sys_snode_t node; /* Key and thread specific data passed to pthread_setspecific() */ pthread_key_obj *key; void *spec_data; } pthread_thread_data; typedef struct pthread_key_data { sys_snode_t node; pthread_thread_data thread_data; } pthread_key_data; static inline bool is_pthread_obj_initialized(uint32_t obj) { return (obj & PTHREAD_OBJ_MASK_INIT) != 0; } static inline uint32_t mark_pthread_obj_initialized(uint32_t obj) { return obj | PTHREAD_OBJ_MASK_INIT; } static inline uint32_t mark_pthread_obj_uninitialized(uint32_t obj) { return obj & ~PTHREAD_OBJ_MASK_INIT; } struct posix_thread *to_posix_thread(pthread_t pthread); /* get and possibly initialize a posix_mutex */ struct posix_mutex *to_posix_mutex(pthread_mutex_t *mu); /* get a previously initialized posix_mutex */ struct posix_mutex *get_posix_mutex(pthread_mutex_t mut); /* get and possibly initialize a posix_cond */ struct posix_cond *to_posix_cond(pthread_cond_t *cvar); /* get a previously initialized posix_cond */ struct posix_cond *get_posix_cond(pthread_cond_t cond); /* get and possibly initialize a posix_key */ pthread_key_obj *to_posix_key(pthread_key_t *keyp); /* get a previously initialized posix_key */ pthread_key_obj *get_posix_key(pthread_key_t key); #endif