check for a disc before mounting to avoid IOS breakage
[libogc.git] / gc / ogc / lwp_mutex.h
blobfb8c495eaae014c94eb3f1a0a0730fcac7eecedc
1 #ifndef __LWP_MUTEX_H__
2 #define __LWP_MUTEX_H__
4 #include <gctypes.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
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
31 typedef struct _lwpmutexattr {
32 u32 mode;
33 u32 nest_behavior;
34 u8 prioceil,onlyownerrelease;
35 } lwp_mutex_attr;
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;
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) \
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)
68 #ifdef LIBOGC_INTERNAL
69 #include <libogc/lwp_mutex.inl>
70 #endif
72 #ifdef __cplusplus
74 #endif
76 #endif