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.
This commit is contained in:
Carlos O'Donell 2013-06-10 12:05:11 -04:00
parent 0efa6f8b99
commit be11d71394
3 changed files with 17 additions and 8 deletions

View 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> 2013-08-06 Ondřej Bílka <neleai@seznam.cz>
* sysdeps/pthread/allocalim.h: (__libc_use_alloca): Fix warning. * sysdeps/pthread/allocalim.h: (__libc_use_alloca): Fix warning.

View File

@ -224,20 +224,21 @@ LLL_STUB_UNWIND_INFO_END
#define lll_futex_wake(futex, nr, private) \ #define lll_futex_wake(futex, nr, private) \
do { \ ({ \
int __ignore; \ int __status; \
register __typeof (nr) _nr asm ("edx") = (nr); \ register __typeof (nr) _nr asm ("edx") = (nr); \
LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \ LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \
__asm __volatile (LLL_EBX_LOAD \ __asm __volatile (LLL_EBX_LOAD \
LLL_ENTER_KERNEL \ LLL_ENTER_KERNEL \
LLL_EBX_LOAD \ LLL_EBX_LOAD \
: "=a" (__ignore) \ : "=a" (__status) \
: "0" (SYS_futex), LLL_EBX_REG (futex), \ : "0" (SYS_futex), LLL_EBX_REG (futex), \
"c" (__lll_private_flag (FUTEX_WAKE, private)), \ "c" (__lll_private_flag (FUTEX_WAKE, private)), \
"d" (_nr), \ "d" (_nr), \
"i" (0) /* phony, to align next arg's number */, \ "i" (0) /* phony, to align next arg's number */, \
"i" (offsetof (tcbhead_t, sysinfo))); \ "i" (offsetof (tcbhead_t, sysinfo))); \
} while (0) __status; \
})
/* NB: in the lll_trylock macro we simply return the value in %eax /* NB: in the lll_trylock macro we simply return the value in %eax

View File

@ -225,17 +225,18 @@ LLL_STUB_UNWIND_INFO_END
#define lll_futex_wake(futex, nr, private) \ #define lll_futex_wake(futex, nr, private) \
do { \ ({ \
int __ignore; \ int __status; \
register __typeof (nr) _nr __asm ("edx") = (nr); \ register __typeof (nr) _nr __asm ("edx") = (nr); \
LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \ LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \
__asm __volatile ("syscall" \ __asm __volatile ("syscall" \
: "=a" (__ignore) \ : "=a" (__status) \
: "0" (SYS_futex), "D" (futex), \ : "0" (SYS_futex), "D" (futex), \
"S" (__lll_private_flag (FUTEX_WAKE, private)), \ "S" (__lll_private_flag (FUTEX_WAKE, private)), \
"d" (_nr) \ "d" (_nr) \
: "memory", "cc", "r10", "r11", "cx"); \ : "memory", "cc", "r10", "r11", "cx"); \
} while (0) __status; \
})
/* NB: in the lll_trylock macro we simply return the value in %eax /* NB: in the lll_trylock macro we simply return the value in %eax