annotate some logical sharing in the futex impl

上级 264a783d
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "proc.hh" #include "proc.hh"
#include "cpu.hh" #include "cpu.hh"
#include "percpu.hh" #include "percpu.hh"
#include "kmtrace.hh"
// //
// futexkey // futexkey
...@@ -171,6 +172,7 @@ futexwait(futexkey_t key, u64 val, u64 timer) ...@@ -171,6 +172,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
{ {
futexaddr* fa; futexaddr* fa;
mtreadavar("futex:ns:%lx", key);
{ {
scoped_gc_epoch gc; scoped_gc_epoch gc;
again: again:
...@@ -185,6 +187,7 @@ futexwait(futexkey_t key, u64 val, u64 timer) ...@@ -185,6 +187,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
fa->dec(); fa->dec();
goto again; goto again;
} }
mtwriteavar("futex:ns:%lx", key);
fa->inserted_ = true; fa->inserted_ = true;
} else { } else {
if (!fa->tryinc()) { if (!fa->tryinc()) {
...@@ -193,6 +196,7 @@ futexwait(futexkey_t key, u64 val, u64 timer) ...@@ -193,6 +196,7 @@ futexwait(futexkey_t key, u64 val, u64 timer)
} }
} }
assert(fa->key_ == key); assert(fa->key_ == key);
mtwriteavar("futex:%lx.%p", key, fa);
acquire(&myproc()->futex_lock); acquire(&myproc()->futex_lock);
auto cleanup = scoped_cleanup([&fa](){ auto cleanup = scoped_cleanup([&fa](){
...@@ -228,6 +232,7 @@ futexwake(futexkey_t key, u64 nwake) ...@@ -228,6 +232,7 @@ futexwake(futexkey_t key, u64 nwake)
if (nwake == 0) if (nwake == 0)
return -1; return -1;
mtreadavar("futex:ns:%lx", key);
{ {
scoped_gc_epoch gc; scoped_gc_epoch gc;
fa = nsfutex->lookup(key); fa = nsfutex->lookup(key);
...@@ -238,6 +243,7 @@ futexwake(futexkey_t key, u64 nwake) ...@@ -238,6 +243,7 @@ futexwake(futexkey_t key, u64 nwake)
auto cleanup = scoped_cleanup([&fa](){ auto cleanup = scoped_cleanup([&fa](){
fa->dec(); fa->dec();
}); });
mtwriteavar("futex:%lx.%p", key, fa);
fa->nspid_->enumerate([&nwoke, &nwake](u32 pid, proc* p) { fa->nspid_->enumerate([&nwoke, &nwake](u32 pid, proc* p) {
acquire(&p->futex_lock); acquire(&p->futex_lock);
......
...@@ -178,6 +178,9 @@ sys_futex(const u64* addr, int op, u64 val, u64 timer) ...@@ -178,6 +178,9 @@ sys_futex(const u64* addr, int op, u64 val, u64 timer)
if (futexkey(addr, myproc()->vmap, &key) < 0) if (futexkey(addr, myproc()->vmap, &key) < 0)
return -1; return -1;
mt_ascope ascope("%s(%p,%d,%lu,%lu)", __func__, addr, op, val, timer);
mtwriteavar("thread:%x", myproc()->pid);
switch(op) { switch(op) {
case FUTEX_WAIT: case FUTEX_WAIT:
return futexwait(key, val, timer); return futexwait(key, val, timer);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论