@@ -88,15 +88,31 @@ static s32 __lwp_mutex_locksupp(mutex_t lock,u64 timeout,u8 block)
8888 if (!p ) return -1 ;
8989
9090 __lwp_mutex_seize (& p -> mutex ,p -> object .id ,block ,timeout ,level );
91- return _thr_executing -> wait .ret_code ;
91+
92+ switch (_thr_executing -> wait .ret_code ) {
93+ case LWP_MUTEX_SUCCESSFUL :
94+ break ;
95+ case LWP_MUTEX_UNSATISFIED_NOWAIT :
96+ return EBUSY ;
97+ case LWP_MUTEX_NEST_NOTALLOWED :
98+ return EDEADLK ;
99+ case LWP_MUTEX_NOTOWNER :
100+ return EPERM ;
101+ case LWP_MUTEX_DELETED :
102+ return EINVAL ;
103+ case LWP_MUTEX_TIMEOUT :
104+ return EAGAIN ;
105+ case LWP_MUTEX_CEILINGVIOL :
106+ return EINVAL ;
107+ }
108+ return 0 ;
92109}
93110
94111void __lwp_mutex_init (void )
95112{
96113 __lwp_objmgr_initinfo (& _lwp_mutex_objects ,LWP_MAX_MUTEXES ,sizeof (mutex_st ));
97114}
98115
99-
100116static __inline__ mutex_st * __lwp_mutex_open (mutex_t lock )
101117{
102118 LWP_CHECK_MUTEX (lock );
@@ -182,14 +198,30 @@ s32 LWP_MutexTryLock(mutex_t mutex)
182198
183199s32 LWP_MutexUnlock (mutex_t mutex )
184200{
185- u32 ret ;
201+ u32 status ;
186202 mutex_st * lock ;
187203
188204 lock = __lwp_mutex_open (mutex );
189205 if (!lock ) return -1 ;
190206
191- ret = __lwp_mutex_surrender (& lock -> mutex );
207+ status = __lwp_mutex_surrender (& lock -> mutex );
192208 __lwp_thread_dispatchenable ();
193209
194- return ret ;
210+ switch (status ) {
211+ case LWP_MUTEX_SUCCESSFUL :
212+ break ;
213+ case LWP_MUTEX_UNSATISFIED_NOWAIT :
214+ return EBUSY ;
215+ case LWP_MUTEX_NEST_NOTALLOWED :
216+ return EDEADLK ;
217+ case LWP_MUTEX_NOTOWNER :
218+ return EPERM ;
219+ case LWP_MUTEX_DELETED :
220+ return EINVAL ;
221+ case LWP_MUTEX_TIMEOUT :
222+ return EAGAIN ;
223+ case LWP_MUTEX_CEILINGVIOL :
224+ return EINVAL ;
225+ }
226+ return 0 ;
195227}
0 commit comments