diff options
author | Russ Cox <rsc@golang.org> | 2010-02-22 20:45:36 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-02-22 20:45:36 -0800 |
commit | 8ba5c5593f1a95e850143c46108d830ecd228c09 (patch) | |
tree | 0f7298608bf0d15b29d7e4d1440fe0efebaa0973 | |
parent | 5c2197ac8f6a7ca48a22e9d2d2e1128e004ebe12 (diff) | |
download | go-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.c | 20 |
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. |