Skip to content

Commit 37e9ae9

Browse files
committed
Fix semaphore overflow
1 parent 81cbeee commit 37e9ae9

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

libogc/lwp_sema.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ u32 __lwp_sema_surrender(lwp_sema *sema,u32 id)
7171
if((thethread=__lwp_threadqueue_dequeue(&sema->wait_queue))) return ret;
7272
else {
7373
_CPU_ISR_Disable(level);
74-
if(sema->count<=sema->attrs.max_cnt)
74+
if(sema->count<sema->attrs.max_cnt)
7575
++sema->count;
7676
else
7777
ret = LWP_SEMA_MAXCNT_EXCEEDED;

libogc/semaphore.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ static s32 __lwp_sema_waitsupp(sem_t sem,u8 block,s64 timeout)
124124
case LWP_SEMA_UNSATISFIED_NOWAIT:
125125
return EAGAIN;
126126
case LWP_SEMA_DELETED:
127-
return EAGAIN;
127+
return EINVAL;
128128
case LWP_SEMA_TIMEOUT:
129129
return ETIMEDOUT;
130130
case LWP_SEMA_MAXCNT_EXCEEDED:
131-
break;
131+
return EOVERFLOW;
132132
}
133133
return 0;
134134
}
@@ -177,14 +177,27 @@ s32 LWP_SemTryWait(sem_t sem)
177177

178178
s32 LWP_SemPost(sem_t sem)
179179
{
180+
u32 status;
180181
sema_st *lwp_sem;
181182

182183
lwp_sem = __lwp_sema_open(sem);
183184
if(!lwp_sem) return EINVAL;
184185

185-
__lwp_sema_surrender(&lwp_sem->sema,lwp_sem->object.id);
186+
status = __lwp_sema_surrender(&lwp_sem->sema,lwp_sem->object.id);
186187
__lwp_thread_dispatchenable();
187188

189+
switch(status) {
190+
case LWP_SEMA_SUCCESSFUL:
191+
break;
192+
case LWP_SEMA_UNSATISFIED_NOWAIT:
193+
return EAGAIN;
194+
case LWP_SEMA_DELETED:
195+
return EINVAL;
196+
case LWP_SEMA_TIMEOUT:
197+
return ETIMEDOUT;
198+
case LWP_SEMA_MAXCNT_EXCEEDED:
199+
return EOVERFLOW;
200+
}
188201
return 0;
189202
}
190203

0 commit comments

Comments
 (0)