提交 d8736319 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Add cli handling and mtrace to qlock.h

上级 78207b6e
...@@ -6,12 +6,14 @@ struct qnode { ...@@ -6,12 +6,14 @@ struct qnode {
typedef struct { typedef struct {
struct qnode *v __mpalign__; struct qnode *v __mpalign__;
const char *name;
} qlock_t; } qlock_t;
static inline void static inline void
ql_init(qlock_t *l) ql_init(qlock_t *l, const char *name)
{ {
l->v = NULL; l->v = NULL;
l->name = name;
} }
static inline void static inline void
...@@ -19,9 +21,10 @@ ql_lock(qlock_t *l, volatile struct qnode *mynode) ...@@ -19,9 +21,10 @@ ql_lock(qlock_t *l, volatile struct qnode *mynode)
{ {
struct qnode *predecessor; struct qnode *predecessor;
pushcli();
mtlock(l);
mynode->next = NULL; mynode->next = NULL;
predecessor = (struct qnode *)xchg((u64 *)&l->v, (u64)mynode); predecessor = (struct qnode *)xchg((u64 *)&l->v, (u64)mynode);
if (predecessor) { if (predecessor) {
mynode->locked = 1; mynode->locked = 1;
barrier(); barrier();
...@@ -29,23 +32,35 @@ ql_lock(qlock_t *l, volatile struct qnode *mynode) ...@@ -29,23 +32,35 @@ ql_lock(qlock_t *l, volatile struct qnode *mynode)
while (mynode->locked) while (mynode->locked)
rep_nop(); rep_nop();
} }
mtacquired(l);
} }
static inline int static inline int
ql_trylock(qlock_t *l, volatile struct qnode *mynode) ql_trylock(qlock_t *l, volatile struct qnode *mynode)
{ {
int r;
mynode->next = NULL; mynode->next = NULL;
return cmpswap((long *)&l->v, 0, (long)mynode); pushcli();
r = cmpswap((long *)&l->v, 0, (long)mynode);
if (!r)
popcli();
return r;
} }
static inline void static inline void
ql_unlock(qlock_t *l, volatile struct qnode *mynode) ql_unlock(qlock_t *l, volatile struct qnode *mynode)
{ {
if (!mynode->next) { if (!mynode->next) {
if (cmpswap((long *)&l->v, (long)mynode, 0)) if (cmpswap((long *)&l->v, (long)mynode, 0)) {
mtunlock(l);
popcli();
return; return;
}
while (!mynode->next) while (!mynode->next)
rep_nop(); rep_nop();
} }
((struct qnode *)mynode->next)->locked = 0; ((struct qnode *)mynode->next)->locked = 0;
mtunlock(l);
popcli();
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论