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