diff options
author | Carlos O'Donell <carlos@redhat.com> | 2013-06-10 12:05:11 -0400 |
---|---|---|
committer | Carlos O'Donell <carlos@redhat.com> | 2013-06-10 12:05:11 -0400 |
commit | be11d713940133fd4200fb96db8200092b05325e (patch) | |
tree | ccb973c4111f038228f655b9339893be054309ed | |
parent | 0efa6f8b9906cddf2da36722449c8e30fb698b37 (diff) | |
download | glibc-be11d713940133fd4200fb96db8200092b05325e.tar.gz glibc-be11d713940133fd4200fb96db8200092b05325e.tar.xz glibc-be11d713940133fd4200fb96db8200092b05325e.zip |
x86*: Return syscall error for lll_futex_wake.
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.
-rw-r--r-- | nptl/ChangeLog | 7 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h | 9 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | 9 |
3 files changed, 17 insertions, 8 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 0c666b9b39..8fb473f3ea 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -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. diff --git a/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h index f51f650927..f665ac9e6b 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h @@ -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 diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h index 67222940c5..7a176aec38 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h @@ -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 |