mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
Update.
* sysdeps/unix/sysv/linux/s390/lowlevellock.h (__lll_mutex_unlock_force): New function (lll_mutex_unlock_force): Use __lll_mutex_unlock_force.
This commit is contained in:
parent
65d46efed2
commit
b8ba4a2741
@ -1 +1 @@
|
||||
NPTL 0.41 by Ulrich Drepper
|
||||
NPTL 0.42 by Ulrich Drepper
|
||||
|
@ -1,5 +1,9 @@
|
||||
2003-05-29 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/s390/lowlevellock.h
|
||||
(__lll_mutex_unlock_force): New function
|
||||
(lll_mutex_unlock_force): Use __lll_mutex_unlock_force.
|
||||
|
||||
* sysdeps/unix/sysv/linux/ia64/lowlevellock.h
|
||||
(__lll_mutex_unlock_force): New function.
|
||||
(lll_mutex_unlock_force): Use __lll_mutex_unlock_force.
|
||||
|
@ -93,6 +93,7 @@ typedef union
|
||||
unsigned long long int __total_seq;
|
||||
unsigned long long int __wakeup_seq;
|
||||
unsigned long long int __woken_seq;
|
||||
void *__mutex;
|
||||
} __data;
|
||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||
long long int __align;
|
||||
|
@ -29,6 +29,7 @@
|
||||
#define __NR_futex 221
|
||||
#define FUTEX_WAIT 0
|
||||
#define FUTEX_WAKE 1
|
||||
#define FUTEX_REQUEUE 3
|
||||
|
||||
/* Initializer for compatibility lock. */
|
||||
#define LLL_MUTEX_LOCK_INITIALIZER (0)
|
||||
@ -63,6 +64,17 @@
|
||||
INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret: 0; \
|
||||
})
|
||||
|
||||
#define lll_futex_requeue(futexp, nr_wake, nr_move, mutex) \
|
||||
({ \
|
||||
INTERNAL_SYSCALL_DECL (__err); \
|
||||
long int __ret; \
|
||||
\
|
||||
__ret = INTERNAL_SYSCALL (futex, __err, 5, \
|
||||
(futexp), FUTEX_REQUEUE, (nr_wake), (nr_move), \
|
||||
(mutex)); \
|
||||
INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret: 0; \
|
||||
})
|
||||
|
||||
#ifdef UP
|
||||
# define __lll_acq_instr ""
|
||||
# define __lll_rel_instr ""
|
||||
@ -100,6 +112,15 @@ extern void __lll_lock_wait (int *futex, int val) attribute_hidden;
|
||||
__lll_lock_wait (__futex, __val); \
|
||||
})
|
||||
|
||||
#define lll_mutex_cond_lock(lock) \
|
||||
(void) ({ \
|
||||
int *__futex = &(lock); \
|
||||
int __val = atomic_exchange_and_add (__futex, 2); \
|
||||
__asm __volatile (__lll_acq_instr ::: "memory"); \
|
||||
if (__builtin_expect (__val != 0, 0)) \
|
||||
__lll_lock_wait (__futex, __val); \
|
||||
})
|
||||
|
||||
extern int __lll_timedlock_wait
|
||||
(int *futex, int val, const struct timespec *) attribute_hidden;
|
||||
|
||||
@ -120,6 +141,13 @@ extern int __lll_timedlock_wait
|
||||
lll_futex_wake (__futex, 1); \
|
||||
}))
|
||||
|
||||
#define lll_mutex_unlock_force(lock) \
|
||||
((void) ({ \
|
||||
int *__futex = &(lock); \
|
||||
*__futex = 0; \
|
||||
lll_futex_wake (__futex, 1); \
|
||||
}))
|
||||
|
||||
#define lll_mutex_islocked(futex) \
|
||||
(futex != 0)
|
||||
|
||||
|
@ -170,7 +170,7 @@ __attribute__ ((always_inline))
|
||||
__lll_mutex_unlock (int *futex)
|
||||
{
|
||||
int oldval;
|
||||
int newval;
|
||||
int newval = 0;
|
||||
|
||||
lll_compare_and_swap (futex, oldval, newval, "slr %2,%2");
|
||||
if (oldval > 1)
|
||||
@ -179,8 +179,16 @@ __lll_mutex_unlock (int *futex)
|
||||
#define lll_mutex_unlock(futex) \
|
||||
__lll_mutex_unlock(&(futex))
|
||||
|
||||
|
||||
static inline void
|
||||
__attribute__ ((always_inline))
|
||||
__lll_mutex_unlock_force (int *futex)
|
||||
{
|
||||
*futex = 0;
|
||||
lll_futex_wake (futex, 1);
|
||||
}
|
||||
#define lll_mutex_unlock_force(futex) \
|
||||
lll_futex_wake (&(futex), 1)
|
||||
__lll_mutex_unlock_force(&(futex))
|
||||
|
||||
#define lll_mutex_islocked(futex) \
|
||||
(futex != 0)
|
||||
|
Loading…
Reference in New Issue
Block a user