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

Add cli handling and mtrace to qlock.h

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