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