Skip to content

Commit 72b0615

Browse files
committed
Implement f{,try,un}lockfile
Drop UART write if it would block
1 parent 31b16ad commit 72b0615

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

libogc/console.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -597,9 +597,10 @@ static ssize_t __console_write_r(struct _reent *r,void *fd,const char *ptr,size_
597597
{
598598
ssize_t ret = __console_write(r,fd,ptr,len);
599599

600-
if(stdcon) {
601-
if(ret!=-1) _fwrite_r(r,ptr,1,len,stdcon);
602-
else ret = _fwrite_r(r,ptr,1,len,stdcon);
600+
if(stdcon && !ftrylockfile(stdcon)) {
601+
if(ret!=-1) _fwrite_unlocked_r(r,ptr,1,len,stdcon);
602+
else ret = _fwrite_unlocked_r(r,ptr,1,len,stdcon);
603+
funlockfile(stdcon);
603604
}
604605
return ret;
605606
}

libogc/lock_supp.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,18 @@ void __syscall_lock_release(_LOCK_T *lock)
7777
plock = (mutex_t)*lock;
7878
LWP_MutexUnlock(plock);
7979
}
80+
81+
void flockfile(FILE *fp)
82+
{
83+
__lock_acquire_recursive(fp->_lock);
84+
}
85+
86+
int ftrylockfile(FILE *fp)
87+
{
88+
return ({ __lock_try_acquire_recursive(fp->_lock); });
89+
}
90+
91+
void funlockfile(FILE *fp)
92+
{
93+
__lock_release_recursive(fp->_lock);
94+
}

0 commit comments

Comments
 (0)