mirror of
https://github.com/golang/go
synced 2024-11-21 20:44:39 -07:00
runtime: work around Linux kernel bug in futex
Fixes #420. R=r CC=golang-dev https://golang.org/cl/218065
This commit is contained in:
parent
5c2197ac8f
commit
8ba5c5593f
@ -42,20 +42,12 @@ static Timespec longtime =
|
||||
static void
|
||||
futexsleep(uint32 *addr, uint32 val)
|
||||
{
|
||||
int32 ret;
|
||||
|
||||
ret = futex(addr, FUTEX_WAIT, val, &longtime, nil, 0);
|
||||
if(ret >= 0 || ret == -EAGAIN || ret == -EINTR)
|
||||
return;
|
||||
|
||||
prints("futexsleep addr=");
|
||||
·printpointer(addr);
|
||||
prints(" val=");
|
||||
·printint(val);
|
||||
prints(" returned ");
|
||||
·printint(ret);
|
||||
prints("\n");
|
||||
*(int32*)0x1005 = 0x1005;
|
||||
// Some Linux kernels have a bug where futex of
|
||||
// FUTEX_WAIT returns an internal error code
|
||||
// as an errno. Libpthread ignores the return value
|
||||
// here, and so can we: as it says a few lines up,
|
||||
// spurious wakeups are allowed.
|
||||
futex(addr, FUTEX_WAIT, val, &longtime, nil, 0);
|
||||
}
|
||||
|
||||
// If any procs are sleeping on addr, wake up at least one.
|
||||
|
Loading…
Reference in New Issue
Block a user