* 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:
Ulrich Drepper 2003-05-30 04:53:50 +00:00
parent 65d46efed2
commit b8ba4a2741
5 changed files with 44 additions and 3 deletions

View File

@ -1 +1 @@
NPTL 0.41 by Ulrich Drepper NPTL 0.42 by Ulrich Drepper

View File

@ -1,5 +1,9 @@
2003-05-29 Ulrich Drepper <drepper@redhat.com> 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 * sysdeps/unix/sysv/linux/ia64/lowlevellock.h
(__lll_mutex_unlock_force): New function. (__lll_mutex_unlock_force): New function.
(lll_mutex_unlock_force): Use __lll_mutex_unlock_force. (lll_mutex_unlock_force): Use __lll_mutex_unlock_force.

View File

@ -93,6 +93,7 @@ typedef union
unsigned long long int __total_seq; unsigned long long int __total_seq;
unsigned long long int __wakeup_seq; unsigned long long int __wakeup_seq;
unsigned long long int __woken_seq; unsigned long long int __woken_seq;
void *__mutex;
} __data; } __data;
char __size[__SIZEOF_PTHREAD_COND_T]; char __size[__SIZEOF_PTHREAD_COND_T];
long long int __align; long long int __align;

View File

@ -29,6 +29,7 @@
#define __NR_futex 221 #define __NR_futex 221
#define FUTEX_WAIT 0 #define FUTEX_WAIT 0
#define FUTEX_WAKE 1 #define FUTEX_WAKE 1
#define FUTEX_REQUEUE 3
/* Initializer for compatibility lock. */ /* Initializer for compatibility lock. */
#define LLL_MUTEX_LOCK_INITIALIZER (0) #define LLL_MUTEX_LOCK_INITIALIZER (0)
@ -63,6 +64,17 @@
INTERNAL_SYSCALL_ERROR_P (__ret, __err)? -__ret: 0; \ 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 #ifdef UP
# define __lll_acq_instr "" # define __lll_acq_instr ""
# define __lll_rel_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); \ __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 extern int __lll_timedlock_wait
(int *futex, int val, const struct timespec *) attribute_hidden; (int *futex, int val, const struct timespec *) attribute_hidden;
@ -120,6 +141,13 @@ extern int __lll_timedlock_wait
lll_futex_wake (__futex, 1); \ 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) \ #define lll_mutex_islocked(futex) \
(futex != 0) (futex != 0)

View File

@ -170,7 +170,7 @@ __attribute__ ((always_inline))
__lll_mutex_unlock (int *futex) __lll_mutex_unlock (int *futex)
{ {
int oldval; int oldval;
int newval; int newval = 0;
lll_compare_and_swap (futex, oldval, newval, "slr %2,%2"); lll_compare_and_swap (futex, oldval, newval, "slr %2,%2");
if (oldval > 1) if (oldval > 1)
@ -179,8 +179,16 @@ __lll_mutex_unlock (int *futex)
#define lll_mutex_unlock(futex) \ #define lll_mutex_unlock(futex) \
__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) \ #define lll_mutex_unlock_force(futex) \
lll_futex_wake (&(futex), 1) __lll_mutex_unlock_force(&(futex))
#define lll_mutex_islocked(futex) \ #define lll_mutex_islocked(futex) \
(futex != 0) (futex != 0)