Skip to content

Commit 546f150

Browse files
committed
Handle negative time values
1 parent 3588a9b commit 546f150

16 files changed

Lines changed: 68 additions & 46 deletions

gc/ogc/lwp_messages.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ typedef struct _mqcntrl {
113113

114114
u32 __lwpmq_initialize(mq_cntrl *mqueue,mq_attr *attrs,u32 max_pendingmsgs,u32 max_msgsize);
115115
void __lwpmq_close(mq_cntrl *mqueue,u32 status);
116-
u32 __lwpmq_seize(mq_cntrl *mqueue,u32 id,void *buffer,u32 *size,u32 wait,u64 timeout);
117-
u32 __lwpmq_submit(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 type,u32 wait,u64 timeout);
116+
u32 __lwpmq_seize(mq_cntrl *mqueue,u32 id,void *buffer,u32 *size,u32 wait,s64 timeout);
117+
u32 __lwpmq_submit(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 type,u32 wait,s64 timeout);
118118
u32 __lwpmq_broadcast(mq_cntrl *mqueue,void *buffer,u32 size,u32 id,u32 *count);
119119
void __lwpmq_msg_insert(mq_cntrl *mqueue,mq_buffercntrl *msg,u32 type);
120120
u32 __lwpmq_flush(mq_cntrl *mqueue);

gc/ogc/lwp_mutex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ typedef struct _lwpmutex {
9696

9797
void __lwp_mutex_initialize(lwp_mutex *mutex,lwp_mutex_attr *attrs,u32 init_lock);
9898
u32 __lwp_mutex_surrender(lwp_mutex *mutex);
99-
void __lwp_mutex_seize_irq_blocking(lwp_mutex *mutex,u64 timeout);
99+
void __lwp_mutex_seize_irq_blocking(lwp_mutex *mutex,s64 timeout);
100100
void __lwp_mutex_flush(lwp_mutex *mutex,u32 status);
101101

102102
#ifdef LIBOGC_INTERNAL

gc/ogc/lwp_sema.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ typedef struct _lwpsema {
8383

8484
void __lwp_sema_initialize(lwp_sema *sema,lwp_semattr *attrs,u32 init_count);
8585
u32 __lwp_sema_surrender(lwp_sema *sema,u32 id);
86-
u32 __lwp_sema_seize(lwp_sema *sema,u32 id,u32 wait,u64 timeout);
86+
u32 __lwp_sema_seize(lwp_sema *sema,u32 id,u32 wait,s64 timeout);
8787
void __lwp_sema_flush(lwp_sema *sema,u32 status);
8888

8989
#ifdef LIBOGC_INTERNAL

gc/ogc/lwp_threadq.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ extern "C" {
6767

6868
lwp_cntrl* __lwp_threadqueue_firstfifo(lwp_thrqueue *queue);
6969
lwp_cntrl* __lwp_threadqueue_firstpriority(lwp_thrqueue *queue);
70-
void __lwp_threadqueue_enqueuefifo(lwp_thrqueue *queue,lwp_cntrl *thethread,u64 timeout);
70+
void __lwp_threadqueue_enqueuefifo(lwp_thrqueue *queue,lwp_cntrl *thethread,s64 timeout);
7171
lwp_cntrl* __lwp_threadqueue_dequeuefifo(lwp_thrqueue *queue);
72-
void __lwp_threadqueue_enqueuepriority(lwp_thrqueue *queue,lwp_cntrl *thethread,u64 timeout);
72+
void __lwp_threadqueue_enqueuepriority(lwp_thrqueue *queue,lwp_cntrl *thethread,s64 timeout);
7373
lwp_cntrl* __lwp_threadqueue_dequeuepriority(lwp_thrqueue *queue);
7474
void __lwp_threadqueue_init(lwp_thrqueue *queue,u32 mode,u32 state,u32 timeout_state);
7575
lwp_cntrl* __lwp_threadqueue_first(lwp_thrqueue *queue);
76-
void __lwp_threadqueue_enqueue(lwp_thrqueue *queue,u64 timeout);
76+
void __lwp_threadqueue_enqueue(lwp_thrqueue *queue,s64 timeout);
7777
lwp_cntrl* __lwp_threadqueue_dequeue(lwp_thrqueue *queue);
7878
void __lwp_threadqueue_flush(lwp_thrqueue *queue,u32 status);
7979
void __lwp_threadqueue_extract(lwp_thrqueue *queue,lwp_cntrl *thethread);

libogc/cond.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,19 @@ static cond_st* __lwp_cond_allocate(void)
109109
return NULL;
110110
}
111111

112-
static s32 __lwp_cond_waitsupp(cond_t cond,mutex_t mutex,u64 timeout,u8 timedout)
112+
static s32 __lwp_cond_waitsupp(cond_t cond,mutex_t mutex,s64 timeout,u8 timedout)
113113
{
114114
u32 status,mstatus,level;
115115
cond_st *thecond;
116116

117117
thecond = __lwp_cond_open(cond);
118118
if(!thecond) return -1;
119-
119+
120120
if(thecond->lock!=LWP_MUTEX_NULL && thecond->lock!=mutex) {
121121
__lwp_thread_dispatchenable();
122122
return EINVAL;
123123
}
124124

125-
126125
LWP_MutexUnlock(mutex);
127126
if(!timedout) {
128127
thecond->lock = mutex;
@@ -201,13 +200,13 @@ s32 LWP_CondBroadcast(cond_t cond)
201200

202201
s32 LWP_CondTimedWait(cond_t cond,mutex_t mutex,const struct timespec *reltime)
203202
{
204-
u64 timeout = LWP_THREADQ_NOTIMEOUT;
205-
bool timedout = FALSE;
203+
s64 timeout = LWP_THREADQ_NOTIMEOUT;
204+
u8 timedout = FALSE;
206205

207206
if(reltime) {
208207
if(!__lwp_wd_timespec_valid(reltime)) return EINVAL;
209-
if(reltime->tv_sec<0) timedout = TRUE;
210208
timeout = __lwp_wd_calc_ticks(reltime);
209+
if(timeout<=0) timedout = TRUE;
211210
}
212211
return __lwp_cond_waitsupp(cond,mutex,timeout,timedout);
213212
}

libogc/lwp.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ void LWP_CloseQueue(lwpq_t thequeue)
412412
return;
413413
}
414414

415-
static s32 __lwp_tqueue_sleepsupp(lwpq_t thequeue,u64 timeout)
415+
static s32 __lwp_tqueue_sleepsupp(lwpq_t thequeue,s64 timeout,u8 timedout)
416416
{
417417
u32 level;
418418
tqueue_st *tq;
@@ -426,6 +426,12 @@ static s32 __lwp_tqueue_sleepsupp(lwpq_t thequeue,u64 timeout)
426426
return EDEADLK;
427427
}
428428

429+
if(timedout) {
430+
__lwp_thread_yield();
431+
__lwp_thread_dispatchenable();
432+
return ETIMEDOUT;
433+
}
434+
429435
exec = _thr_executing;
430436
_CPU_ISR_Disable(level);
431437
__lwp_threadqueue_csenter(&tq->tqueue);
@@ -442,18 +448,20 @@ static s32 __lwp_tqueue_sleepsupp(lwpq_t thequeue,u64 timeout)
442448

443449
s32 LWP_ThreadSleep(lwpq_t thequeue)
444450
{
445-
return __lwp_tqueue_sleepsupp(thequeue,LWP_THREADQ_NOTIMEOUT);
451+
return __lwp_tqueue_sleepsupp(thequeue,LWP_THREADQ_NOTIMEOUT,FALSE);
446452
}
447453

448454
s32 LWP_ThreadTimedSleep(lwpq_t thequeue,const struct timespec *reltime)
449455
{
450-
u64 timeout = LWP_THREADQ_NOTIMEOUT;
456+
s64 timeout = LWP_THREADQ_NOTIMEOUT;
457+
u8 timedout = FALSE;
451458

452459
if(reltime) {
453460
if(!__lwp_wd_timespec_valid(reltime)) return EINVAL;
454461
timeout = __lwp_wd_calc_ticks(reltime);
462+
if(timeout<=0) timedout = TRUE;
455463
}
456-
return __lwp_tqueue_sleepsupp(thequeue,timeout);
464+
return __lwp_tqueue_sleepsupp(thequeue,timeout,timedout);
457465
}
458466

459467
void LWP_ThreadBroadcast(lwpq_t thequeue)

libogc/lwp_messages.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ u32 __lwpmq_initialize(mq_cntrl *mqueue,mq_attr *attrs,u32 max_pendingmsgs,u32 m
126126
return 1;
127127
}
128128

129-
u32 __lwpmq_seize(mq_cntrl *mqueue,u32 id,void *buffer,u32 *size,u32 wait,u64 timeout)
129+
u32 __lwpmq_seize(mq_cntrl *mqueue,u32 id,void *buffer,u32 *size,u32 wait,s64 timeout)
130130
{
131131
u32 level;
132132
mq_buffercntrl *msg;
@@ -179,7 +179,7 @@ u32 __lwpmq_seize(mq_cntrl *mqueue,u32 id,void *buffer,u32 *size,u32 wait,u64 ti
179179
return LWP_MQ_STATUS_SUCCESSFUL;
180180
}
181181

182-
u32 __lwpmq_submit(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 type,u32 wait,u64 timeout)
182+
u32 __lwpmq_submit(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 type,u32 wait,s64 timeout)
183183
{
184184
u32 level;
185185
lwp_cntrl *thread;

libogc/lwp_messages.inl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@ static __inline__ void __lwpmq_msg_prepend(mq_cntrl *mqueue,mq_buffercntrl *msg)
9191
__lwp_queue_prepend(&mqueue->pending_msgs,&msg->node);
9292
}
9393

94-
static __inline__ u32 __lwpmq_send(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 wait,u32 timeout)
94+
static __inline__ u32 __lwpmq_send(mq_cntrl *mqueue,u32 id,void *buffer,u32 size,u32 wait,s64 timeout)
9595
{
9696
return __lwpmq_submit(mqueue,id,buffer,size,LWP_MQ_SEND_REQUEST,wait,timeout);
9797
}
9898

99-
static __inline__ u32 __lwpmq_urgent(mq_cntrl *mqueue,void *buffer,u32 size,u32 id,u32 wait,u32 timeout)
99+
static __inline__ u32 __lwpmq_urgent(mq_cntrl *mqueue,void *buffer,u32 size,u32 id,u32 wait,s64 timeout)
100100
{
101101
return __lwpmq_submit(mqueue,id,buffer,size,LWP_MQ_SEND_URGENT,wait,timeout);
102102
}

libogc/lwp_mutex.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ u32 __lwp_mutex_surrender(lwp_mutex *mutex)
120120
return LWP_MUTEX_SUCCESSFUL;
121121
}
122122

123-
void __lwp_mutex_seize_irq_blocking(lwp_mutex *mutex,u64 timeout)
123+
void __lwp_mutex_seize_irq_blocking(lwp_mutex *mutex,s64 timeout)
124124
{
125125
lwp_cntrl *exec;
126126

libogc/lwp_sema.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ u32 __lwp_sema_surrender(lwp_sema *sema,u32 id)
8080
return ret;
8181
}
8282

83-
u32 __lwp_sema_seize(lwp_sema *sema,u32 id,u32 wait,u64 timeout)
83+
u32 __lwp_sema_seize(lwp_sema *sema,u32 id,u32 wait,s64 timeout)
8484
{
8585
u32 level;
8686
lwp_cntrl *exec;

0 commit comments

Comments
 (0)