x86*: Return syscall error for lll_futex_wake.
authorCarlos O'Donell <carlos@redhat.com>
Mon, 10 Jun 2013 16:05:11 +0000 (12:05 -0400)
committerCarlos O'Donell <carlos@redhat.com>
Mon, 10 Jun 2013 16:05:11 +0000 (12:05 -0400)
It is very very possible that the futex syscall returns an
error and that the caller of lll_futex_wake may want to
look at that error and propagate the failure.

This patch allows a caller to see the syscall error.

There are no users of the syscall error at present, but
future cleanups are now be able to check for the error.

--

nplt/

2013-06-10  Carlos O'Donell  <carlos@redhat.com>

* sysdeps/unix/sysv/linux/i386/lowlevellock.h
(lll_futex_wake): Return syscall error.
* sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
(lll_futex_wake): Return syscall error.

nptl/ChangeLog
nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h
nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h

index 0c666b9..8fb473f 100644 (file)
@@ -1,3 +1,10 @@
+2013-06-10  Carlos O'Donell  <carlos@redhat.com>
+
+       * sysdeps/unix/sysv/linux/i386/lowlevellock.h
+       (lll_futex_wake): Return syscall error.
+       * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
+       (lll_futex_wake): Return syscall error.
+
 2013-08-06   Ondřej Bílka  <neleai@seznam.cz>
 
        * sysdeps/pthread/allocalim.h: (__libc_use_alloca): Fix warning.
index f51f650..f665ac9 100644 (file)
@@ -224,20 +224,21 @@ LLL_STUB_UNWIND_INFO_END
 
 
 #define lll_futex_wake(futex, nr, private) \
-  do {                                                                       \
-    int __ignore;                                                            \
+  ({                                                                         \
+    int __status;                                                            \
     register __typeof (nr) _nr asm ("edx") = (nr);                           \
     LIBC_PROBE (lll_futex_wake, 3, futex, nr, private);                       \
     __asm __volatile (LLL_EBX_LOAD                                           \
                      LLL_ENTER_KERNEL                                        \
                      LLL_EBX_LOAD                                            \
-                     : "=a" (__ignore)                                       \
+                     : "=a" (__status)                                       \
                      : "0" (SYS_futex), LLL_EBX_REG (futex),                 \
                        "c" (__lll_private_flag (FUTEX_WAKE, private)),       \
                        "d" (_nr),                                            \
                        "i" (0) /* phony, to align next arg's number */,      \
                        "i" (offsetof (tcbhead_t, sysinfo)));                 \
-  } while (0)
+    __status;                                                                \
+  })
 
 
 /* NB: in the lll_trylock macro we simply return the value in %eax
index 6722294..7a176ae 100644 (file)
@@ -225,17 +225,18 @@ LLL_STUB_UNWIND_INFO_END
 
 
 #define lll_futex_wake(futex, nr, private) \
-  do {                                                                       \
-    int __ignore;                                                            \
+  ({                                                                         \
+    int __status;                                                            \
     register __typeof (nr) _nr __asm ("edx") = (nr);                         \
     LIBC_PROBE (lll_futex_wake, 3, futex, nr, private);                       \
     __asm __volatile ("syscall"                                                      \
-                     : "=a" (__ignore)                                       \
+                     : "=a" (__status)                                       \
                      : "0" (SYS_futex), "D" (futex),                         \
                        "S" (__lll_private_flag (FUTEX_WAKE, private)),       \
                        "d" (_nr)                                             \
                      : "memory", "cc", "r10", "r11", "cx");                  \
-  } while (0)
+    __status;                                                                \
+  })
 
 
 /* NB: in the lll_trylock macro we simply return the value in %eax