111 lines
2.5 KiB
C
111 lines
2.5 KiB
C
/*
|
|
* 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
|