minimal plan9port to cross-build Jehanne
This commit is contained in:
166
lib/lib9/qlock.c
Normal file
166
lib/lib9/qlock.c
Normal file
@@ -0,0 +1,166 @@
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
|
||||
/*
|
||||
* The function pointers are supplied by the thread
|
||||
* library during its initialization. If there is no thread
|
||||
* library, there is no multithreading.
|
||||
*/
|
||||
|
||||
int (*_lock)(Lock*, int, ulong);
|
||||
void (*_unlock)(Lock*, ulong);
|
||||
int (*_qlock)(QLock*, int, ulong); /* do not use */
|
||||
void (*_qunlock)(QLock*, ulong);
|
||||
void (*_rsleep)(Rendez*, ulong); /* do not use */
|
||||
int (*_rwakeup)(Rendez*, int, ulong);
|
||||
int (*_rlock)(RWLock*, int, ulong); /* do not use */
|
||||
int (*_wlock)(RWLock*, int, ulong);
|
||||
void (*_runlock)(RWLock*, ulong);
|
||||
void (*_wunlock)(RWLock*, ulong);
|
||||
|
||||
void
|
||||
lock(Lock *l)
|
||||
{
|
||||
if(_lock)
|
||||
(*_lock)(l, 1, getcallerpc(&l));
|
||||
else
|
||||
l->held = 1;
|
||||
}
|
||||
|
||||
int
|
||||
canlock(Lock *l)
|
||||
{
|
||||
if(_lock)
|
||||
return (*_lock)(l, 0, getcallerpc(&l));
|
||||
else{
|
||||
if(l->held)
|
||||
return 0;
|
||||
l->held = 1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
unlock(Lock *l)
|
||||
{
|
||||
if(_unlock)
|
||||
(*_unlock)(l, getcallerpc(&l));
|
||||
else
|
||||
l->held = 0;
|
||||
}
|
||||
|
||||
void
|
||||
qlock(QLock *l)
|
||||
{
|
||||
if(_qlock)
|
||||
(*_qlock)(l, 1, getcallerpc(&l));
|
||||
else
|
||||
l->l.held = 1;
|
||||
}
|
||||
|
||||
int
|
||||
canqlock(QLock *l)
|
||||
{
|
||||
if(_qlock)
|
||||
return (*_qlock)(l, 0, getcallerpc(&l));
|
||||
else{
|
||||
if(l->l.held)
|
||||
return 0;
|
||||
l->l.held = 1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
qunlock(QLock *l)
|
||||
{
|
||||
if(_qunlock)
|
||||
(*_qunlock)(l, getcallerpc(&l));
|
||||
else
|
||||
l->l.held = 0;
|
||||
}
|
||||
|
||||
void
|
||||
rlock(RWLock *l)
|
||||
{
|
||||
if(_rlock)
|
||||
(*_rlock)(l, 1, getcallerpc(&l));
|
||||
else
|
||||
l->readers++;
|
||||
}
|
||||
|
||||
int
|
||||
canrlock(RWLock *l)
|
||||
{
|
||||
if(_rlock)
|
||||
return (*_rlock)(l, 0, getcallerpc(&l));
|
||||
else{
|
||||
if(l->writer)
|
||||
return 0;
|
||||
l->readers++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
runlock(RWLock *l)
|
||||
{
|
||||
if(_runlock)
|
||||
(*_runlock)(l, getcallerpc(&l));
|
||||
else
|
||||
l->readers--;
|
||||
}
|
||||
|
||||
void
|
||||
wlock(RWLock *l)
|
||||
{
|
||||
if(_wlock)
|
||||
(*_wlock)(l, 1, getcallerpc(&l));
|
||||
else
|
||||
l->writer = (void*)1;
|
||||
}
|
||||
|
||||
int
|
||||
canwlock(RWLock *l)
|
||||
{
|
||||
if(_wlock)
|
||||
return (*_wlock)(l, 0, getcallerpc(&l));
|
||||
else{
|
||||
if(l->writer || l->readers)
|
||||
return 0;
|
||||
l->writer = (void*)1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
wunlock(RWLock *l)
|
||||
{
|
||||
if(_wunlock)
|
||||
(*_wunlock)(l, getcallerpc(&l));
|
||||
else
|
||||
l->writer = nil;
|
||||
}
|
||||
|
||||
void
|
||||
rsleep(Rendez *r)
|
||||
{
|
||||
if(_rsleep)
|
||||
(*_rsleep)(r, getcallerpc(&r));
|
||||
}
|
||||
|
||||
int
|
||||
rwakeup(Rendez *r)
|
||||
{
|
||||
if(_rwakeup)
|
||||
return (*_rwakeup)(r, 0, getcallerpc(&r));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rwakeupall(Rendez *r)
|
||||
{
|
||||
if(_rwakeup)
|
||||
return (*_rwakeup)(r, 1, getcallerpc(&r));
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user