Skip to content

Commit 31b16ad

Browse files
committed
Return sensible error codes for mutexes
1 parent 820765e commit 31b16ad

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

gc/ogc/lwp_mutex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ distribution.
7373
#define LWP_MUTEX_UNSATISFIED_NOWAIT 1
7474
#define LWP_MUTEX_NEST_NOTALLOWED 2
7575
#define LWP_MUTEX_NOTOWNER 3
76-
#define LWP_MUTEX_DELETED 4
76+
#define LWP_MUTEX_DELETED 4
7777
#define LWP_MUTEX_TIMEOUT 5
7878
#define LWP_MUTEX_CEILINGVIOL 6
7979

libogc/mutex.c

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

94111
void __lwp_mutex_init(void)
95112
{
96113
__lwp_objmgr_initinfo(&_lwp_mutex_objects,LWP_MAX_MUTEXES,sizeof(mutex_st));
97114
}
98115

99-
100116
static __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

183199
s32 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
}

libogc/semaphore.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ static s32 __lwp_sema_waitsupp(sem_t sem,u8 block,u64 timeout)
127127
return EAGAIN;
128128
case LWP_SEMA_TIMEOUT:
129129
return ETIMEDOUT;
130-
130+
case LWP_SEMA_MAXCNT_EXCEEDED:
131+
break;
131132
}
132133
return 0;
133134
}

0 commit comments

Comments
 (0)