From: Russ Cox Date: Tue, 23 Feb 2010 04:45:36 +0000 (-0800) Subject: runtime: work around Linux kernel bug in futex X-Git-Tag: weekly.2010-02-23~5 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8ba5c5593f1a95e850143c46108d830ecd228c09;p=gostls13.git runtime: work around Linux kernel bug in futex Fixes #420. R=r CC=golang-dev https://golang.org/cl/218065 --- 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.