| /* |
| * 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 <stdbool.h> |
| #include <stdint.h> |
| |
| #include <zephyr/kernel.h> |
| #include <zephyr/posix/pthread.h> |
| #include <zephyr/posix/signal.h> |
| #include <zephyr/sys/dlist.h> |
| #include <zephyr/sys/slist.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_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; |
| bool contentionscope: 1; |
| bool inheritsched: 1; |
| 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 |