--- Gnu-Mach/kern/thread.h 2020/09/02 04:41:17 1.1.1.2 +++ Gnu-Mach/kern/thread.h 2020/09/02 04:47:44 1.1.1.4 @@ -34,12 +34,6 @@ #ifndef _KERN_THREAD_H_ #define _KERN_THREAD_H_ -#include -#include -#include -#include -#include - #include #include #include @@ -49,11 +43,11 @@ #include #include #include +#include #include #include #include #include /* event_t, continuation_t */ -#include #include #include #include @@ -76,6 +70,22 @@ struct thread { task_t task; /* Task to which I belong */ queue_chain_t thread_list; /* list of threads in task */ + /* Flags */ + /* The flags are grouped here, but documented at the original + position. */ + union { + struct { + unsigned state:16; + unsigned wake_active:1; + unsigned vm_privilege:1; + unsigned active:1; + }; + event_t event_key; +/* These keys can be used with thread_wakeup and friends. */ +#define TH_EV_WAKE_ACTIVE(t) ((event_t) (&(t)->event_key + 0)) +#define TH_EV_STATE(t) ((event_t) (&(t)->event_key + 1)) + }; + /* Thread bookkeeping */ queue_chain_t pset_threads; /* list of all threads in proc set*/ @@ -98,9 +108,10 @@ struct thread { kern_return_t wait_result; /* outcome of wait - may be examined by this thread WITHOUT locking */ - boolean_t wake_active; /* someone is waiting for this + /* Defined above */ + /* boolean_t wake_active; someone is waiting for this thread to become suspended */ - int state; /* Thread state: */ + /* int state; Thread state: */ /* * Thread states [bits or'ed] */ @@ -135,7 +146,8 @@ struct thread { /* VM global variables */ vm_offset_t recover; /* page fault recovery (copyin/out) */ - boolean_t vm_privilege; /* Can use reserved memory? */ + /* Defined above */ + /* boolean_t vm_privilege; Can use reserved memory? */ /* User-visible scheduling state */ int user_stop_count; /* outstanding stops */ @@ -160,9 +172,6 @@ struct thread { struct ipc_port *ith_self; /* not a right, doesn't hold ref */ struct ipc_port *ith_sself; /* a send right */ struct ipc_port *ith_exception; /* a send right */ -#if MACH_IPC_COMPAT - struct ipc_port *ith_reply; /* a send right */ -#endif /* MACH_IPC_COMPAT */ mach_port_t ith_mig_reply; /* reply port for mig */ struct ipc_port *ith_rpc_reply; /* reply port for kernel RPCs */ @@ -203,7 +212,8 @@ struct thread { timer_elt_data_t depress_timer; /* timer for priority depression */ /* Ast/Halt data structures */ - boolean_t active; /* how alive is the thread */ + /* Defined above */ + /* boolean_t active; how alive is the thread */ int ast; /* ast's needed. See ast.h */ /* Processor data structures */ @@ -220,10 +230,6 @@ struct thread { #if NCPUS > 1 processor_t last_processor; /* processor this last ran on */ #endif /* NCPUS > 1 */ - -#if NET_ATM - nw_ep_owned_t nw_ep_waited; -#endif /* NET_ATM */ }; /* typedef of thread_t is in kern/kern_types.h */ @@ -272,12 +278,44 @@ extern kern_return_t thread_create( thread_t *child_thread); extern kern_return_t thread_terminate( thread_t thread); +extern kern_return_t thread_terminate_release( + thread_t thread, + task_t task, + mach_port_t thread_name, + mach_port_t reply_port, + vm_offset_t address, + vm_size_t size); extern kern_return_t thread_suspend( thread_t thread); extern kern_return_t thread_resume( thread_t thread); extern kern_return_t thread_abort( thread_t thread); +extern void thread_start( + thread_t thread, + continuation_t start); +extern thread_t kernel_thread( + task_t task, + continuation_t start, + void *arg); +extern kern_return_t thread_priority( + thread_t thread, + int priority, + boolean_t set_max); +extern void thread_set_own_priority( + int priority); +extern kern_return_t thread_max_priority( + thread_t thread, + processor_set_t pset, + int max_priority); +extern kern_return_t thread_policy( + thread_t thread, + int policy, + int data); +extern void consider_thread_collect( + void); +extern void stack_privilege( + thread_t thread); extern kern_return_t thread_get_state( thread_t thread, int flavor, @@ -306,6 +344,7 @@ extern kern_return_t thread_assign( processor_set_t new_pset); extern kern_return_t thread_assign_default( thread_t thread); +extern void stack_collect(void); #endif /* @@ -325,14 +364,12 @@ extern kern_return_t thread_halt( boolean_t must_halt); extern void thread_halt_self(void); extern void thread_force_terminate(thread_t); -extern void thread_set_own_priority( - int priority); extern thread_t kernel_thread( task_t task, void (*start)(void), void * arg); -extern void reaper_thread(void); +extern void reaper_thread(void) __attribute__((noreturn)); #if MACH_HOST extern void thread_freeze( @@ -371,4 +408,9 @@ extern void thread_unfreeze( #define current_space() (current_task()->itk_space) #define current_map() (current_task()->map) +#if MACH_DEBUG +void stack_init(vm_offset_t stack); +void stack_finalize(vm_offset_t stack); +#endif /* MACH_DEBUG */ + #endif /* _KERN_THREAD_H_ */