1
0
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:
Russ Cox 2010-02-22 20:45:36 -08:00
parent 5c2197ac8f
commit 8ba5c5593f

View File

@ -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.