1 #ifndef __LWP_MUTEX_H__
2 #define __LWP_MUTEX_H__
3 
4 #include <gctypes.h>
5 #include <lwp_threadq.h>
6 
7 #define LWP_MUTEX_LOCKED				0
8 #define LWP_MUTEX_UNLOCKED				1
9 
10 #define LWP_MUTEX_NEST_ACQUIRE			0
11 #define LWP_MUTEX_NEST_ERROR			1
12 #define LWP_MUTEX_NEST_BLOCK			2
13 
14 #define LWP_MUTEX_FIFO					0
15 #define LWP_MUTEX_PRIORITY				1
16 #define LWP_MUTEX_INHERITPRIO			2
17 #define LWP_MUTEX_PRIORITYCEIL			3
18 
19 #define LWP_MUTEX_SUCCESSFUL			0
20 #define LWP_MUTEX_UNSATISFIED_NOWAIT	1
21 #define LWP_MUTEX_NEST_NOTALLOWED		2
22 #define LWP_MUTEX_NOTOWNER				3
23 #define LWP_MUTEX_DELETED				4
24 #define LWP_MUTEX_TIMEOUT				5
25 #define LWP_MUTEX_CEILINGVIOL			6
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 typedef struct _lwpmutexattr {
32 	u32 mode;
33 	u32 nest_behavior;
34 	u8 prioceil,onlyownerrelease;
35 } lwp_mutex_attr;
36 
37 typedef struct _lwpmutex {
38 	lwp_thrqueue wait_queue;
39 	lwp_mutex_attr atrrs;
40 	u32 lock,nest_cnt,blocked_cnt;
41 	lwp_cntrl *holder;
42 } lwp_mutex;
43 
44 void __lwp_mutex_initialize(lwp_mutex *mutex,lwp_mutex_attr *attrs,u32 init_lock);
45 u32 __lwp_mutex_surrender(lwp_mutex *mutex);
46 void __lwp_mutex_seize_irq_blocking(lwp_mutex *mutex,u64 timeout);
47 void __lwp_mutex_flush(lwp_mutex *mutex,u32 status);
48 
49 static __inline__ u32 __lwp_mutex_seize_irq_trylock(lwp_mutex *mutex,u32 *isr_level);
50 
51 #define __lwp_mutex_seize(_mutex_t,_id,_wait,_timeout,_level) \
52 	do { \
53 		if(__lwp_mutex_seize_irq_trylock(_mutex_t,&_level)) { \
54 			if(!_wait) {	\
55 				_CPU_ISR_Restore(_level); \
56 				_thr_executing->wait.ret_code = LWP_MUTEX_UNSATISFIED_NOWAIT; \
57 			} else { \
58 				__lwp_threadqueue_csenter(&(_mutex_t)->wait_queue); \
59 				_thr_executing->wait.queue = &(_mutex_t)->wait_queue; \
60 				_thr_executing->wait.id = _id; \
61 				__lwp_thread_dispatchdisable(); \
62 				_CPU_ISR_Restore(_level); \
63 				__lwp_mutex_seize_irq_blocking(_mutex_t,(u64)_timeout); \
64 			} \
65 		} \
66 	} while(0)
67 
68 #ifdef LIBOGC_INTERNAL
69 #include <libogc/lwp_mutex.inl>
70 #endif
71 
72 #ifdef __cplusplus
73 	}
74 #endif
75 
76 #endif
77