aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-02-22 20:45:36 -0800
committerRuss Cox <rsc@golang.org>2010-02-22 20:45:36 -0800
commit8ba5c5593f1a95e850143c46108d830ecd228c09 (patch)
tree0f7298608bf0d15b29d7e4d1440fe0efebaa0973
parent5c2197ac8f6a7ca48a22e9d2d2e1128e004ebe12 (diff)
downloadgo-8ba5c5593f1a95e850143c46108d830ecd228c09.tar.gz
go-8ba5c5593f1a95e850143c46108d830ecd228c09.zip
runtime: work around Linux kernel bug in futex
Fixes #420. R=r CC=golang-dev https://golang.org/cl/218065
-rw-r--r--src/pkg/runtime/linux/thread.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/src/pkg/runtime/linux/thread.c b/src/pkg/runtime/linux/thread.c
index efb138021f..d6811eb378 100644
--- a/src/pkg/runtime/linux/thread.c
+++ b/src/pkg/runtime/linux/thread.c
@@ -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.