1 #ifndef __LWP_MUTEX_H__
2 #define __LWP_MUTEX_H__
5 #include <lwp_threadq.h>
7 #define LWP_MUTEX_LOCKED 0
8 #define LWP_MUTEX_UNLOCKED 1
10 #define LWP_MUTEX_NEST_ACQUIRE 0
11 #define LWP_MUTEX_NEST_ERROR 1
12 #define LWP_MUTEX_NEST_BLOCK 2
14 #define LWP_MUTEX_FIFO 0
15 #define LWP_MUTEX_PRIORITY 1
16 #define LWP_MUTEX_INHERITPRIO 2
17 #define LWP_MUTEX_PRIORITYCEIL 3
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
31 typedef struct _lwpmutexattr
{
34 u8 prioceil
,onlyownerrelease
;
37 typedef struct _lwpmutex
{
38 lwp_thrqueue wait_queue
;
40 u32 lock
,nest_cnt
,blocked_cnt
;
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
);
49 static __inline__ u32
__lwp_mutex_seize_irq_trylock(lwp_mutex
*mutex
,u32
*isr_level
);
51 #define __lwp_mutex_seize(_mutex_t,_id,_wait,_timeout,_level) \
53 if(__lwp_mutex_seize_irq_trylock(_mutex_t,&_level)) { \
55 _CPU_ISR_Restore(_level); \
56 _thr_executing->wait.ret_code = LWP_MUTEX_UNSATISFIED_NOWAIT; \
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); \
68 #ifdef LIBOGC_INTERNAL
69 #include <libogc/lwp_mutex.inl>