correctly handle old kernels without FUTEX_WAIT_BITSET
authorRich Felker <dalias@aerifal.cx>
Wed, 3 Aug 2011 01:18:43 +0000 (21:18 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 3 Aug 2011 01:18:43 +0000 (21:18 -0400)
futex returns EINVAL, not ENOSYS, when op is not supported.
unfortunately this looks just like EINVAL from other causes, and we
end up running the fallback code and getting EINVAL again. fortunately
this case should be rare since correct code should not generate EINVAL
anyway.

src/thread/__timedwait.c

index 931675eb74ed10e1781405dccf3e240864112810..0444d39f9002b672daab5f0a6873874d5218fd04 100644 (file)
@@ -16,7 +16,7 @@ static int do_wait(volatile int *addr, int val, clockid_t clk, const struct time
                if (clk == CLOCK_REALTIME) flag = FUTEX_CLOCK_REALTIME;
                if (cp) r = -__syscall_cp(SYS_futex, addr, FUTEX_WAIT_BITSET|flag, val, at, 0, -1);
                else r = -__syscall(SYS_futex, addr, FUTEX_WAIT_BITSET|flag, val, at, 0, -1);
-               if (r != ENOSYS) goto done;
+               if (r != EINVAL) goto done;
        }
        if (clock_gettime(clk, &to)) return EINVAL;
        to.tv_sec = at->tv_sec - to.tv_sec;