/* * Copyright (c) 2022 Meta * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_LIB_POSIX_POSIX_INTERNAL_H_ #define ZEPHYR_LIB_POSIX_POSIX_INTERNAL_H_ #include #include #include #include #include #include #include /* * 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_thread_attr { void *stack; /* the following two bitfields should combine to be 32-bits in size */ uint32_t stacksize : CONFIG_POSIX_PTHREAD_ATTR_STACKSIZE_BITS; uint16_t guardsize : CONFIG_POSIX_PTHREAD_ATTR_GUARDSIZE_BITS; int8_t priority; uint8_t schedpolicy: 2; union { bool caller_destroys: 1; bool initialized: 1; }; bool cancelpending: 1; bool cancelstate: 1; bool canceltype: 1; bool detachstate: 1; }; struct posix_thread { struct k_thread thread; /* List nodes for pthread_cleanup_push() / pthread_cleanup_pop() */ sys_slist_t cleanup_list; /* List node for ready_q, run_q, or done_q */ sys_dnode_t q_node; /* List of keys that thread has called pthread_setspecific() on */ sys_slist_t key_list; /* pthread_attr_t */ struct posix_thread_attr attr; /* Exit status */ void *retval; /* Signal mask */ sigset_t sigset; /* Queue ID (internal-only) */ uint8_t qid; }; 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; 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 pth); /* get and possibly initialize a posix_mutex */ struct k_mutex *to_posix_mutex(pthread_mutex_t *mu); int posix_to_zephyr_priority(int priority, int policy); int zephyr_to_posix_priority(int priority, int *policy); #endif