📄 kapidata.h
字号:
#ifdef CYGSEM_KERNEL_SCHED_TIMESLICE_ENABLE
# define CYG_SCHEDTHREAD_TIMESLICE_ENABLED_MEMBER \
cyg_bool timeslice_enabled; /* per-thread timeslice enable */
#else
# define CYG_SCHEDTHREAD_TIMESLICE_ENABLED_MEMBER
#endif
#if defined(CYGSEM_KERNEL_SCHED_BITMAP)
# define CYG_SCHEDTHREAD_SCHEDIMP_MEMBERS \
cyg_priority_t priority; /* current thread priority */
#elif defined(CYGSEM_KERNEL_SCHED_MLQUEUE)
# define CYG_SCHEDTHREAD_SCHEDIMP_MEMBERS \
cyg_thread *next; \
cyg_thread *prev; \
cyg_priority_t priority; /* current thread priority */ \
CYG_SCHEDTHREAD_CPU_MEMBER \
CYG_SCHEDTHREAD_TIMESLICE_ENABLED_MEMBER
#elif defined(CYGSEM_KERNEL_SCHED_LOTTERY)
# define CYG_SCHEDTHREAD_SCHEDIMP_MEMBERS \
cyg_thread *next; \
cyg_thread *prev; \
cyg_priority_t priority; /* current thread priority */ \
cyg_priority_t compensation_tickets; /* sleep compensation */
#else
# error Undefined scheduler type
#endif
#ifndef CYGSEM_KERNEL_SCHED_ASR_GLOBAL
# define CYG_SCHEDTHREAD_ASR_NONGLOBAL_MEMBER \
void (*asr)(CYG_ADDRWORD); // ASR function
#else
# define CYG_SCHEDTHREAD_ASR_NONGLOBAL_MEMBER
#endif
#ifndef CYGSEM_KERNEL_SCHED_ASR_DATA_GLOBAL
# define CYG_SCHEDTHREAD_ASR_DATA_NONGLOBAL_MEMBER \
CYG_ADDRWORD asr_data; // ASR data pointer
#else
# define CYG_SCHEDTHREAD_ASR_DATA_NONGLOBAL_MEMBER
#endif
#ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT
# define CYG_SCHEDTHREAD_ASR_MEMBER \
volatile cyg_ucount32 asr_inhibit; /* If true, blocks calls to ASRs */ \
volatile cyg_bool asr_pending; /* If true, this thread's ASR */ \
/* should be called. */ \
CYG_SCHEDTHREAD_ASR_NONGLOBAL_MEMBER \
CYG_SCHEDTHREAD_ASR_DATA_NONGLOBAL_MEMBER
#else
# define CYG_SCHEDTHREAD_ASR_MEMBER
#endif
#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE
# define CYG_SCHEDTHREAD_MUTEX_INV_PROTO_SIMPLE_MEMBERS \
cyg_priority_t original_priority; \
cyg_bool priority_inherited;
#else
# define CYG_SCHEDTHREAD_MUTEX_INV_PROTO_SIMPLE_MEMBERS
#endif
#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
# define CYG_SCHEDTHREAD_MUTEX_INV_PROTO_MEMBERS \
cyg_count32 mutex_count; \
CYG_SCHEDTHREAD_MUTEX_INV_PROTO_SIMPLE_MEMBERS
#else
# define CYG_SCHEDTHREAD_MUTEX_INV_PROTO_MEMBERS
#endif
#define CYG_SCHEDTHREAD_MEMBERS \
CYG_SCHEDTHREAD_SCHEDIMP_MEMBERS \
cyg_threadqueue *queue; \
CYG_SCHEDTHREAD_ASR_MEMBER \
CYG_SCHEDTHREAD_MUTEX_INV_PROTO_MEMBERS
typedef struct
{
CYG_SCHEDTHREAD_MEMBERS
} cyg_schedthread;
/* This compiler version test is required because the C++ ABI changed in
GCC v3.x and GCC could now reuse "spare" space from base classes in derived
classes, and in C++ land, cyg_alarm is a base class of cyg_threadtimer.
*/
#if defined(__GNUC__) && (__GNUC__ < 3)
#define CYG_THREADTIMER_MEMBERS \
cyg_alarm alarm; \
cyg_thread *thread;
#else
#define CYG_THREADTIMER_MEMBERS \
CYG_ALARM_MEMBERS \
cyg_thread *thread;
#endif
/*---------------------------------------------------------------------------*/
/* Thread structure */
typedef struct
{
CYG_THREADTIMER_MEMBERS
} cyg_threadtimer;
typedef enum
{
CYG_REASON_NONE,
CYG_REASON_WAIT,
CYG_REASON_DELAY,
CYG_REASON_TIMEOUT,
CYG_REASON_BREAK,
CYG_REASON_DESTRUCT,
CYG_REASON_EXIT,
CYG_REASON_DONE
} cyg_reason_t;
#if defined(CYGPKG_KERNEL_EXCEPTIONS) && !defined(CYGSEM_KERNEL_EXCEPTIONS_GLOBAL)
# define CYG_THREAD_EXCEPTION_CONTROL_MEMBER \
cyg_exception_control exception_control;
#else
# define CYG_THREAD_EXCEPTION_CONTROL_MEMBER
#endif
#ifdef CYGFUN_KERNEL_THREADS_TIMER
# define CYG_THREAD_TIMER_MEMBER \
cyg_threadtimer timer;
#else
# define CYG_THREAD_TIMER_MEMBER
#endif
#ifdef CYGVAR_KERNEL_THREADS_DATA
# define CYG_THREAD_THREAD_DATA_MEMBER \
CYG_ADDRWORD thread_data[CYGNUM_KERNEL_THREADS_DATA_MAX];
#else
# define CYG_THREAD_THREAD_DATA_MEMBER
#endif
#ifdef CYGVAR_KERNEL_THREADS_NAME
# define CYG_THREAD_NAME_MEMBER \
char *name;
#else
# define CYG_THREAD_NAME_MEMBER
#endif
#ifdef CYGVAR_KERNEL_THREADS_LIST
# define CYG_THREAD_LIST_NEXT_MEMBER \
cyg_thread *list_next;
#else
# define CYG_THREAD_LIST_NEXT_MEMBER
#endif
#ifdef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD
struct Cyg_Destructor_Entry {
cyg_thread_destructor_fn fn;
cyg_addrword_t data;
};
# define CYG_THREAD_DESTRUCTORS_MEMBER \
struct Cyg_Destructor_Entry destructors[ CYGNUM_KERNEL_THREADS_DESTRUCTORS ];
#else
# define CYG_THREAD_DESTRUCTORS_MEMBER
#endif
#define CYG_THREAD_MEMBERS \
CYG_HARDWARETHREAD_MEMBERS \
CYG_SCHEDTHREAD_MEMBERS \
\
cyg_uint32 state; \
cyg_ucount32 suspend_count; \
cyg_ucount32 wakeup_count; \
CYG_ADDRWORD wait_info; \
cyg_uint16 unique_id; \
\
CYG_THREAD_EXCEPTION_CONTROL_MEMBER \
CYG_THREAD_TIMER_MEMBER \
\
cyg_reason_t sleep_reason; \
cyg_reason_t wake_reason; \
\
CYG_THREAD_THREAD_DATA_MEMBER \
CYG_THREAD_DESTRUCTORS_MEMBER \
CYG_THREAD_NAME_MEMBER \
CYG_THREAD_LIST_NEXT_MEMBER
struct cyg_thread
{
CYG_THREAD_MEMBERS
};
/*---------------------------------------------------------------------------*/
struct cyg_mbox
{
cyg_count32 base; /* index of first used slot */
cyg_count32 count; /* count of used slots */
cyg_threadqueue get_threadq; /* Queue of waiting threads */
#ifdef CYGMFN_KERNEL_SYNCH_MBOXT_PUT_CAN_WAIT
cyg_threadqueue put_threadq; /* Queue of waiting threads */
#endif
void * itemqueue[ CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE ];
};
/*---------------------------------------------------------------------------*/
struct cyg_sem_t
{
cyg_count32 count; /* The semaphore count */
cyg_threadqueue queue; /* Queue of waiting threads */
};
/*---------------------------------------------------------------------------*/
struct cyg_flag_t
{
cyg_flag_value_t value; /* The flag value */
cyg_threadqueue queue; /* Queue of waiting threads */
};
/*---------------------------------------------------------------------------*/
typedef enum
{
CYG_MUTEX_PROTOCOL_NONE,
CYG_MUTEX_PROTOCOL_INHERIT,
CYG_MUTEX_PROTOCOL_CEILING
} cyg_mutex_protocol_t;
struct cyg_mutex_t
{
cyg_atomic locked; /* true if locked */
cyg_thread *owner; /* Current locking thread */
cyg_threadqueue queue; /* Queue of waiting threads */
#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC
cyg_mutex_protocol_t protocol; /* this mutex's protocol */
#endif
#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING
cyg_priority_t ceiling; /* mutex priority ceiling */
#endif
};
/*---------------------------------------------------------------------------*/
struct cyg_cond_t
{
cyg_mutex_t *mutex; /* Associated mutex */
cyg_threadqueue queue; /* Queue of waiting threads */
};
/*------------------------------------------------------------------------*/
struct cyg_spinlock_t
{
cyg_uint32 lock; /* lock word */
};
/*------------------------------------------------------------------------*/
/* Memory allocator types now come from the "memalloc" package which is */
/* where the implementation lives. */
#ifdef CYGPKG_MEMALLOC
# include <cyg/memalloc/kapidata.h>
#endif
#ifdef __cplusplus
}
#endif
/*---------------------------------------------------------------------------*/
/* EOF kapidata.h */
#endif /* CYGONCE_KERNEL_KAPIDATA_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -