Blob
1 #include <u.h>2 #include <libc.h>4 /*5 * The function pointers are supplied by the thread6 * library during its initialization. If there is no thread7 * library, there is no multithreading.8 */10 int (*_lock)(Lock*, int, ulong);11 void (*_unlock)(Lock*, ulong);12 int (*_qlock)(QLock*, int, ulong); /* do not use */13 void (*_qunlock)(QLock*, ulong);14 void (*_rsleep)(Rendez*, ulong); /* do not use */15 int (*_rwakeup)(Rendez*, int, ulong);16 int (*_rlock)(RWLock*, int, ulong); /* do not use */17 int (*_wlock)(RWLock*, int, ulong);18 void (*_runlock)(RWLock*, ulong);19 void (*_wunlock)(RWLock*, ulong);21 void22 lock(Lock *l)23 {24 if(_lock)25 (*_lock)(l, 1, getcallerpc(&l));26 else27 l->held = 1;28 }30 int31 canlock(Lock *l)32 {33 if(_lock)34 return (*_lock)(l, 0, getcallerpc(&l));35 else{36 if(l->held)37 return 0;38 l->held = 1;39 return 1;40 }41 }43 void44 unlock(Lock *l)45 {46 if(_unlock)47 (*_unlock)(l, getcallerpc(&l));48 else49 l->held = 0;50 }52 void53 qlock(QLock *l)54 {55 if(_qlock)56 (*_qlock)(l, 1, getcallerpc(&l));57 else58 l->l.held = 1;59 }61 int62 canqlock(QLock *l)63 {64 if(_qlock)65 return (*_qlock)(l, 0, getcallerpc(&l));66 else{67 if(l->l.held)68 return 0;69 l->l.held = 1;70 return 1;71 }72 }74 void75 qunlock(QLock *l)76 {77 if(_qunlock)78 (*_qunlock)(l, getcallerpc(&l));79 else80 l->l.held = 0;81 }83 void84 rlock(RWLock *l)85 {86 if(_rlock)87 (*_rlock)(l, 1, getcallerpc(&l));88 else89 l->readers++;90 }92 int93 canrlock(RWLock *l)94 {95 if(_rlock)96 return (*_rlock)(l, 0, getcallerpc(&l));97 else{98 if(l->writer)99 return 0;100 l->readers++;101 return 1;102 }103 }105 void106 runlock(RWLock *l)107 {108 if(_runlock)109 (*_runlock)(l, getcallerpc(&l));110 else111 l->readers--;112 }114 void115 wlock(RWLock *l)116 {117 if(_wlock)118 (*_wlock)(l, 1, getcallerpc(&l));119 else120 l->writer = (void*)1;121 }123 int124 canwlock(RWLock *l)125 {126 if(_wlock)127 return (*_wlock)(l, 0, getcallerpc(&l));128 else{129 if(l->writer || l->readers)130 return 0;131 l->writer = (void*)1;132 return 1;133 }134 }136 void137 wunlock(RWLock *l)138 {139 if(_wunlock)140 (*_wunlock)(l, getcallerpc(&l));141 else142 l->writer = nil;143 }145 void146 rsleep(Rendez *r)147 {148 if(_rsleep)149 (*_rsleep)(r, getcallerpc(&r));150 }152 int153 rwakeup(Rendez *r)154 {155 if(_rwakeup)156 return (*_rwakeup)(r, 0, getcallerpc(&r));157 return 0;158 }160 int161 rwakeupall(Rendez *r)162 {163 if(_rwakeup)164 return (*_rwakeup)(r, 1, getcallerpc(&r));165 return 0;166 }