diff options
| author | Shell <[email protected]> | 2023-07-20 00:02:41 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-20 00:02:41 +0800 |
| commit | 58e0ddf2879032495a74897c34e3605de929f82c (patch) | |
| tree | 097f18153aa9dbf18c12565957a7e25ade127b23 /include | |
| parent | c732cc0083be02335c189e36a651bcb3496bda0d (diff) | |
[component/lwp] support more feature of signal from IEEE Std 1003.1-2017 (#7828)
Signed-off-by: Shell <[email protected]>
Diffstat (limited to 'include')
| -rw-r--r-- | include/rtdef.h | 161 |
1 files changed, 94 insertions, 67 deletions
diff --git a/include/rtdef.h b/include/rtdef.h index d12c929d9a..9562c410f5 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -218,6 +218,7 @@ typedef __gnuc_va_list va_list; #define rt_used __attribute__((used)) #define rt_align(n) __attribute__((aligned(n))) #define rt_weak __attribute__((weak)) +#define rt_noreturn __attribute__ ((noreturn)) #define rt_inline static __inline #define RTT_API #elif defined (__ADSPBLACKFIN__) /* for VisualDSP++ Compiler */ @@ -399,6 +400,7 @@ typedef int (*init_fn_t)(void); #define RT_ETRAP 11 /**< Trap event */ #define RT_ENOENT 12 /**< No entry */ #define RT_ENOSPC 13 /**< No space left */ +#define RT_EPERM 14 /**< Operation not permitted */ /**@}*/ @@ -753,14 +755,20 @@ struct rt_wakeup #define _LWP_NSIG_BPW 32 #endif -#define _LWP_NSIG_WORDS (_LWP_NSIG / _LWP_NSIG_BPW) +#define _LWP_NSIG_WORDS (RT_ALIGN(_LWP_NSIG, _LWP_NSIG_BPW) / _LWP_NSIG_BPW) typedef void (*lwp_sighandler_t)(int); +typedef void (*lwp_sigaction_t)(int signo, siginfo_t *info, void *context); typedef struct { unsigned long sig[_LWP_NSIG_WORDS]; } lwp_sigset_t; +#if _LWP_NSIG <= 64 +#define lwp_sigmask(signo) ((lwp_sigset_t){.sig = {[0] = ((long)(1u << ((signo)-1)))}}) +#define lwp_sigset_init(mask) ((lwp_sigset_t){.sig = {[0] = (long)(mask)}}) +#endif + struct lwp_sigaction { union { void (*_sa_handler)(int); @@ -771,6 +779,29 @@ struct lwp_sigaction { void (*sa_restorer)(void); }; +typedef struct lwp_siginfo { + rt_list_t node; + + struct { + int signo; + int code; + long value; + + int from_tid; + pid_t from_pid; + } ksiginfo; +} *lwp_siginfo_t; + +typedef struct lwp_sigqueue { + rt_list_t siginfo_list; + lwp_sigset_t sigset_pending; +} *lwp_sigqueue_t; + +struct lwp_thread_signal { + lwp_sigset_t sigset_mask; + struct lwp_sigqueue sig_queue; +}; + struct rt_user_context { void *sp; @@ -779,120 +810,116 @@ struct rt_user_context }; #endif +typedef void (*rt_thread_cleanup_t)(struct rt_thread *tid); + /** * Thread structure */ struct rt_thread { - struct rt_object parent; - rt_list_t tlist; /**< the thread list */ + struct rt_object parent; + rt_list_t tlist; /**< the thread list */ /* stack point and entry */ - void *sp; /**< stack point */ - void *entry; /**< entry */ - void *parameter; /**< parameter */ - void *stack_addr; /**< stack address */ - rt_uint32_t stack_size; /**< stack size */ + void *sp; /**< stack point */ + void *entry; /**< entry */ + void *parameter; /**< parameter */ + void *stack_addr; /**< stack address */ + rt_uint32_t stack_size; /**< stack size */ /* error code */ - rt_err_t error; /**< error code */ + rt_err_t error; /**< error code */ - rt_uint8_t stat; /**< thread status */ + rt_uint8_t stat; /**< thread status */ #ifdef RT_USING_SMP - rt_uint8_t bind_cpu; /**< thread is bind to cpu */ - rt_uint8_t oncpu; /**< process on cpu */ + rt_uint8_t bind_cpu; /**< thread is bind to cpu */ + rt_uint8_t oncpu; /**< process on cpu */ - rt_uint16_t scheduler_lock_nest; /**< scheduler lock count */ - rt_uint16_t cpus_lock_nest; /**< cpus lock count */ - rt_uint16_t critical_lock_nest; /**< critical lock count */ + rt_uint16_t scheduler_lock_nest; /**< scheduler lock count */ + rt_int16_t cpus_lock_nest; /**< cpus lock count */ + rt_uint16_t critical_lock_nest; /**< critical lock count */ #endif /*RT_USING_SMP*/ /* priority */ - rt_uint8_t current_priority; /**< current priority */ - rt_uint8_t init_priority; /**< initialized priority */ + rt_uint8_t current_priority; /**< current priority */ + rt_uint8_t init_priority; /**< initialized priority */ #if RT_THREAD_PRIORITY_MAX > 32 - rt_uint8_t number; - rt_uint8_t high_mask; + rt_uint8_t number; + rt_uint8_t high_mask; #endif /* RT_THREAD_PRIORITY_MAX > 32 */ - rt_uint32_t number_mask; /**< priority number mask */ + rt_uint32_t number_mask; /**< priority number mask */ #ifdef RT_USING_MUTEX /* object for IPC */ - rt_list_t taken_object_list; - rt_object_t pending_object; + rt_list_t taken_object_list; + rt_object_t pending_object; #endif #ifdef RT_USING_EVENT /* thread event */ - rt_uint32_t event_set; - rt_uint8_t event_info; + rt_uint32_t event_set; + rt_uint8_t event_info; #endif /* RT_USING_EVENT */ #ifdef RT_USING_SIGNALS - rt_sigset_t sig_pending; /**< the pending signals */ - rt_sigset_t sig_mask; /**< the mask bits of signal */ + rt_sigset_t sig_pending; /**< the pending signals */ + rt_sigset_t sig_mask; /**< the mask bits of signal */ #ifndef RT_USING_SMP - void *sig_ret; /**< the return stack pointer from signal */ + void *sig_ret; /**< the return stack pointer from signal */ #endif /* RT_USING_SMP */ - rt_sighandler_t *sig_vectors; /**< vectors of signal handler */ - void *si_list; /**< the signal infor list */ + rt_sighandler_t *sig_vectors; /**< vectors of signal handler */ + void *si_list; /**< the signal infor list */ #endif /* RT_USING_SIGNALS */ -#ifdef RT_USING_SMART - void *msg_ret; /**< the return msg */ -#endif - - rt_ubase_t init_tick; /**< thread's initialized tick */ - rt_ubase_t remaining_tick; /**< remaining tick */ + rt_ubase_t init_tick; /**< thread's initialized tick */ + rt_ubase_t remaining_tick; /**< remaining tick */ #ifdef RT_USING_CPU_USAGE - rt_uint64_t duration_tick; /**< cpu usage tick */ + rt_uint64_t duration_tick; /**< cpu usage tick */ #endif /* RT_USING_CPU_USAGE */ #ifdef RT_USING_PTHREADS - void *pthread_data; /**< the handle of pthread data, adapt 32/64bit */ + void *pthread_data; /**< the handle of pthread data, adapt 32/64bit */ #endif /* RT_USING_PTHREADS */ - struct rt_timer thread_timer; /**< built-in thread timer */ + struct rt_timer thread_timer; /**< built-in thread timer */ - void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */ + rt_thread_cleanup_t cleanup; /**< cleanup function when thread exit */ /* light weight process if present */ #ifdef RT_USING_SMART - void *lwp; + void *msg_ret; /**< the return msg */ + + void *lwp; /**< the lwp reference */ /* for user create */ - void *user_entry; - void *user_stack; - rt_uint32_t user_stack_size; - rt_uint32_t *kernel_sp; /**< kernel stack point */ - rt_list_t sibling; /**< next thread of same process */ + void *user_entry; + void *user_stack; + rt_uint32_t user_stack_size; + rt_uint32_t *kernel_sp; /**< kernel stack point */ + rt_list_t sibling; /**< next thread of same process */ - lwp_sigset_t signal; - lwp_sigset_t signal_mask; - int signal_mask_bak; - rt_uint32_t signal_in_process; -#ifndef ARCH_MM_MMU - lwp_sighandler_t signal_handler[32]; -#endif - struct rt_user_context user_ctx; + struct lwp_thread_signal signal; /**< lwp signal for user-space thread */ + struct rt_user_context user_ctx; /**< user space context */ + struct rt_wakeup wakeup; /**< wakeup data */ + int exit_request; + int tid; - struct rt_wakeup wakeup; /**< wakeup data */ - int exit_request; -#if defined(ARCH_MM_MMU) - int step_exec; - int debug_attach_req; - int debug_ret_user; - int debug_suspend; - struct rt_hw_exp_stack *regs; - void * thread_idr; /** lwp thread indicator */ - int *clear_child_tid; -#endif - int tid; -#endif +#ifndef ARCH_MM_MMU + lwp_sighandler_t signal_handler[32]; +#else + int step_exec; + int debug_attach_req; + int debug_ret_user; + int debug_suspend; + struct rt_hw_exp_stack *regs; + void *thread_idr; /** lwp thread indicator */ + int *clear_child_tid; +#endif /* ARCH_MM_MMU */ +#endif /* RT_USING_SMART */ - rt_ubase_t user_data; /**< private user data beyond this thread */ + rt_ubase_t user_data; /**< private user data beyond this thread */ }; typedef struct rt_thread *rt_thread_t; |
