You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.5 KiB
108 lines
2.5 KiB
/* |
|
* 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; |
|
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
|
|
|