mirror of
https://github.com/golang/go
synced 2024-11-22 02:54: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
|
static void
|
||||||
futexsleep(uint32 *addr, uint32 val)
|
futexsleep(uint32 *addr, uint32 val)
|
||||||
{
|
{
|
||||||
int32 ret;
|
// Some Linux kernels have a bug where futex of
|
||||||
|
// FUTEX_WAIT returns an internal error code
|
||||||
ret = futex(addr, FUTEX_WAIT, val, &longtime, nil, 0);
|
// as an errno. Libpthread ignores the return value
|
||||||
if(ret >= 0 || ret == -EAGAIN || ret == -EINTR)
|
// here, and so can we: as it says a few lines up,
|
||||||
return;
|
// spurious wakeups are allowed.
|
||||||
|
futex(addr, FUTEX_WAIT, val, &longtime, nil, 0);
|
||||||
prints("futexsleep addr=");
|
|
||||||
·printpointer(addr);
|
|
||||||
prints(" val=");
|
|
||||||
·printint(val);
|
|
||||||
prints(" returned ");
|
|
||||||
·printint(ret);
|
|
||||||
prints("\n");
|
|
||||||
*(int32*)0x1005 = 0x1005;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If any procs are sleeping on addr, wake up at least one.
|
// If any procs are sleeping on addr, wake up at least one.
|
||||||
|
Loading…
Reference in New Issue
Block a user