1 #ifndef __LWP_THREADS_H__ 2 #define __LWP_THREADS_H__ 3 4 #include <gctypes.h> 5 #include <stdlib.h> 6 #include "lwp_states.h" 7 #include "lwp_tqdata.h" 8 #include "lwp_watchdog.h" 9 #include "lwp_objmgr.h" 10 #include "context.h" 11 12 //#define _LWPTHREADS_DEBUG 13 #define LWP_TIMESLICE_TIMER_ID 0x00070040 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 typedef enum 20 { 21 LWP_CPU_BUDGET_ALGO_NONE = 0, 22 LWP_CPU_BUDGET_ALGO_TIMESLICE 23 } lwp_cpu_budget_algorithms; 24 25 typedef struct _lwpwaitinfo { 26 u32 id; 27 u32 cnt; 28 void *ret_arg; 29 void *ret_arg_1; 30 u32 option; 31 u32 ret_code; 32 lwp_queue block2n; 33 lwp_thrqueue *queue; 34 } lwp_waitinfo; 35 36 typedef struct _lwpcntrl { 37 lwp_obj object; 38 u8 cur_prio,real_prio; 39 u32 suspendcnt,res_cnt; 40 u32 isr_level; 41 u32 cur_state; 42 u32 cpu_time_budget; 43 lwp_cpu_budget_algorithms budget_algo; 44 bool is_preemptible; 45 lwp_waitinfo wait; 46 prio_cntrl priomap; 47 wd_cntrl timer; 48 49 void* (*entry)(void *); 50 void *arg; 51 void *stack; 52 u32 stack_size; 53 u8 stack_allocated; 54 lwp_queue *ready; 55 lwp_thrqueue join_list; 56 frame_context context; //16 57 void *libc_reent; 58 } lwp_cntrl, *lwp_cntrl_t; 59 60 extern lwp_cntrl *_thr_main; 61 extern lwp_cntrl *_thr_idle; 62 extern lwp_cntrl *_thr_executing; 63 extern lwp_cntrl *_thr_heir; 64 extern lwp_cntrl *_thr_allocated_fp; 65 extern vu32 _context_switch_want; 66 extern vu32 _thread_dispatch_disable_level; 67 68 extern wd_cntrl _lwp_wd_timeslice; 69 extern void **__lwp_thr_libc_reent; 70 extern lwp_queue _lwp_thr_ready[]; 71 72 void __thread_dispatch(); 73 void __lwp_thread_yield(); 74 void __lwp_thread_closeall(); 75 void __lwp_thread_setstate(lwp_cntrl *,u32); 76 void __lwp_thread_clearstate(lwp_cntrl *,u32); 77 void __lwp_thread_changepriority(lwp_cntrl *,u32,u32); 78 void __lwp_thread_setpriority(lwp_cntrl *,u32); 79 void __lwp_thread_settransient(lwp_cntrl *); 80 void __lwp_thread_suspend(lwp_cntrl *); 81 void __lwp_thread_resume(lwp_cntrl *,u32); 82 void __lwp_thread_loadenv(lwp_cntrl *); 83 void __lwp_thread_ready(lwp_cntrl *); 84 u32 __lwp_thread_init(lwp_cntrl *,void *,u32,u32,u32,bool); 85 u32 __lwp_thread_start(lwp_cntrl *,void* (*)(void*),void *); 86 void __lwp_thread_exit(void *); 87 void __lwp_thread_close(lwp_cntrl *); 88 void __lwp_thread_startmultitasking(); 89 void __lwp_thread_stopmultitasking(void (*exitfunc)()); 90 lwp_obj* __lwp_thread_getobject(lwp_cntrl *); 91 u32 __lwp_evaluatemode(); 92 93 u32 __lwp_isr_in_progress(); 94 void __lwp_thread_resettimeslice(); 95 void __lwp_rotate_readyqueue(u32); 96 void __lwp_thread_delayended(void *); 97 void __lwp_thread_tickle_timeslice(void *); 98 99 #ifdef LIBOGC_INTERNAL 100 #include <libogc/lwp_threads.inl> 101 #endif 102 103 #ifdef __cplusplus 104 } 105 #endif 106 107 #endif 108