Skip to content

Commit

Permalink
* sysdeps/unix/sysv/linux/m68k/fchownat.c: Include string.h.
Browse files Browse the repository at this point in the history
	* sysdeps/sparc/sparc32/dl-machine.h (LD_SO_PRELOAD): Remove unused
	define.

	* sysdeps/sparc/sparc32/bits/atomic.h: Include stdint.h, add
	{,u}atomic*_t typedefs.
	(__sparc32_atomic_do_lock): Add __volatile and memory clobber.
	(__sparc32_atomic_do_unlock): Add memory barrier.
	(__sparc32_atomic_do_lock24, __sparc32_atomic_do_unlock24): Define.
	[!SHARED] (__v9_compare_and_exchange_val_32_acq): Define.
	(__v7_compare_and_exchange_val_acq, __v7_compare_and_exchange_bool_acq,
	__v7_exchange_acq, __v7_exchange_and_add, __v7_exchange_24_rel,
	__v7_compare_and_exchange_val_24_acq, __atomic_is_v9,
	atomic_exchange_acq, atomic_compare_and_exchange_val_24_acq,
	atomic_exchange_24_rel): Define.
	[SHARED] (atomic_exchange_and_add): Define.
	[!SHARED] (__ATOMIC_HWCAP_SPARC_V9): Define.
	[!SHARED] (_dl_hwcap): New weak decl.
	* sysdeps/sparc/sparc32/sparcv9/bits/atomic.h (atomic_exchange_24_rel,
	atomic_compare_and_exchange_val_24_acq): Define.
	* sysdeps/sparc/sparc64/bits/atomic.h (atomic_exchange_24_rel,
	atomic_compare_and_exchange_val_24_acq): Define.
  • Loading branch information
Ulrich Drepper committed Jan 4, 2006
1 parent 6d3aff2 commit b01fe5f
Showing 23 changed files with 1,006 additions and 31 deletions.
26 changes: 26 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
2006-01-03 Jakub Jelinek <jakub@redhat.com>

* sysdeps/unix/sysv/linux/m68k/fchownat.c: Include string.h.

* sysdeps/sparc/sparc32/dl-machine.h (LD_SO_PRELOAD): Remove unused
define.

* sysdeps/sparc/sparc32/bits/atomic.h: Include stdint.h, add
{,u}atomic*_t typedefs.
(__sparc32_atomic_do_lock): Add __volatile and memory clobber.
(__sparc32_atomic_do_unlock): Add memory barrier.
(__sparc32_atomic_do_lock24, __sparc32_atomic_do_unlock24): Define.
[!SHARED] (__v9_compare_and_exchange_val_32_acq): Define.
(__v7_compare_and_exchange_val_acq, __v7_compare_and_exchange_bool_acq,
__v7_exchange_acq, __v7_exchange_and_add, __v7_exchange_24_rel,
__v7_compare_and_exchange_val_24_acq, __atomic_is_v9,
atomic_exchange_acq, atomic_compare_and_exchange_val_24_acq,
atomic_exchange_24_rel): Define.
[SHARED] (atomic_exchange_and_add): Define.
[!SHARED] (__ATOMIC_HWCAP_SPARC_V9): Define.
[!SHARED] (_dl_hwcap): New weak decl.
* sysdeps/sparc/sparc32/sparcv9/bits/atomic.h (atomic_exchange_24_rel,
atomic_compare_and_exchange_val_24_acq): Define.
* sysdeps/sparc/sparc64/bits/atomic.h (atomic_exchange_24_rel,
atomic_compare_and_exchange_val_24_acq): Define.

2006-01-03 Ulrich Drepper <drepper@redhat.com>

lio_listio should emit an event for each individual request in
33 changes: 33 additions & 0 deletions nptl/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,36 @@
2006-01-03 Jakub Jelinek <jakub@redhat.com>

* sysdeps/unix/sysv/linux/sparc/lowlevellock.h: Remove #error for
sparc-linux configured glibc.
(lll_futex_wake_unlock): Define to 1 for sparc-linux configured glibc.
(__lll_mutex_trylock, __lll_mutex_cond_trylock, __lll_mutex_lock,
__lll_mutex_cond_lock, __lll_mutex_timedlock): Use
atomic_compare_and_exchange_val_24_acq instead of
atomic_compare_and_exchange_val_acq.
(lll_mutex_unlock, lll_mutex_unlock_force): Use atomic_exchange_24_rel
instead of atomic_exchange_rel.
* sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_init.c: New
file.
* sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c: New
file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_init.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_init.c:
New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/pthread_barrier_wait.c:
New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_init.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_post.c: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_timedwait.c: New
file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_trywait.c: New
file.
* sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/sem_wait.c: New file.

2006-01-03 Ulrich Drepper <drepper@redhat.com>

* sysdeps/pthread/pthread.h [__WORDSIZE==64]: Don't use cast in
25 changes: 13 additions & 12 deletions nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
/* Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
@@ -79,7 +79,11 @@
})

/* Returns non-zero if error happened, zero if success. */
#define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) \
#ifdef __sparc32_atomic_do_lock
/* Avoid FUTEX_WAKE_OP if supporting pre-v9 CPUs. */
# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) 1
#else
# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) \
({ \
INTERNAL_SYSCALL_DECL (__err); \
long int __ret; \
@@ -90,24 +94,21 @@
FUTEX_OP_CLEAR_WAKE_IF_GT_ONE); \
INTERNAL_SYSCALL_ERROR_P (__ret, __err); \
})

#ifdef __sparc32_atomic_do_lock
#error SPARC < v9 does not support compare and swap which is essential for futex based locking
#endif

static inline int
__attribute__ ((always_inline))
__lll_mutex_trylock (int *futex)
{
return atomic_compare_and_exchange_val_acq (futex, 1, 0) != 0;
return atomic_compare_and_exchange_val_24_acq (futex, 1, 0) != 0;
}
#define lll_mutex_trylock(futex) __lll_mutex_trylock (&(futex))

static inline int
__attribute__ ((always_inline))
__lll_mutex_cond_trylock (int *futex)
{
return atomic_compare_and_exchange_val_acq (futex, 2, 0) != 0;
return atomic_compare_and_exchange_val_24_acq (futex, 2, 0) != 0;
}
#define lll_mutex_cond_trylock(futex) __lll_mutex_cond_trylock (&(futex))

@@ -119,7 +120,7 @@ static inline void
__attribute__ ((always_inline))
__lll_mutex_lock (int *futex)
{
int val = atomic_compare_and_exchange_val_acq (futex, 1, 0);
int val = atomic_compare_and_exchange_val_24_acq (futex, 1, 0);

if (__builtin_expect (val != 0, 0))
__lll_lock_wait (futex);
@@ -131,7 +132,7 @@ static inline void
__attribute__ ((always_inline))
__lll_mutex_cond_lock (int *futex)
{
int val = atomic_compare_and_exchange_val_acq (futex, 2, 0);
int val = atomic_compare_and_exchange_val_24_acq (futex, 2, 0);

if (__builtin_expect (val != 0, 0))
__lll_lock_wait (futex);
@@ -147,7 +148,7 @@ static inline int
__attribute__ ((always_inline))
__lll_mutex_timedlock (int *futex, const struct timespec *abstime)
{
int val = atomic_compare_and_exchange_val_acq (futex, 1, 0);
int val = atomic_compare_and_exchange_val_24_acq (futex, 1, 0);
int result = 0;

if (__builtin_expect (val != 0, 0))
@@ -160,15 +161,15 @@ __lll_mutex_timedlock (int *futex, const struct timespec *abstime)
#define lll_mutex_unlock(lock) \
((void) ({ \
int *__futex = &(lock); \
int __val = atomic_exchange_rel (__futex, 0); \
int __val = atomic_exchange_24_rel (__futex, 0); \
if (__builtin_expect (__val > 1, 0)) \
lll_futex_wake (__futex, 1); \
}))

#define lll_mutex_unlock_force(lock) \
((void) ({ \
int *__futex = &(lock); \
(void) atomic_exchange_rel (__futex, 0); \
(void) atomic_exchange_24_rel (__futex, 0); \
lll_futex_wake (__futex, 1); \
}))

131 changes: 131 additions & 0 deletions nptl/sysdeps/unix/sysv/linux/sparc/sparc32/lowlevellock.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/* low level locking for pthread library. SPARC version.
Copyright (C) 2003, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include <errno.h>
#include <sysdep.h>
#include <lowlevellock.h>
#include <sys/time.h>


void
__lll_lock_wait (int *futex)
{
do
{
int oldval = atomic_compare_and_exchange_val_24_acq (futex, 2, 1);
if (oldval != 0)
lll_futex_wait (futex, 2);
}
while (atomic_compare_and_exchange_val_24_acq (futex, 2, 0) != 0);
}


int
__lll_timedlock_wait (int *futex, const struct timespec *abstime)
{
/* Reject invalid timeouts. */
if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
return EINVAL;

do
{
struct timeval tv;
struct timespec rt;

/* Get the current time. */
(void) __gettimeofday (&tv, NULL);

/* Compute relative timeout. */
rt.tv_sec = abstime->tv_sec - tv.tv_sec;
rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000;
if (rt.tv_nsec < 0)
{
rt.tv_nsec += 1000000000;
--rt.tv_sec;
}

/* Already timed out? */
if (rt.tv_sec < 0)
return ETIMEDOUT;

/* Wait. */
int oldval = atomic_compare_and_exchange_val_24_acq (futex, 2, 1);
if (oldval != 0)
lll_futex_timed_wait (futex, 2, &rt);
}
while (atomic_compare_and_exchange_val_24_acq (futex, 2, 0) != 0);

return 0;
}


/* These don't get included in libc.so */
#ifdef IS_IN_libpthread
int
lll_unlock_wake_cb (int *futex)
{
int val = atomic_exchange_24_rel (futex, 0);

if (__builtin_expect (val > 1, 0))
lll_futex_wake (futex, 1);

return 0;
}


int
__lll_timedwait_tid (int *tidp, const struct timespec *abstime)
{
int tid;

if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
return EINVAL;

/* Repeat until thread terminated. */
while ((tid = *tidp) != 0)
{
struct timeval tv;
struct timespec rt;

/* Get the current time. */
(void) __gettimeofday (&tv, NULL);

/* Compute relative timeout. */
rt.tv_sec = abstime->tv_sec - tv.tv_sec;
rt.tv_nsec = abstime->tv_nsec - tv.tv_usec * 1000;
if (rt.tv_nsec < 0)
{
rt.tv_nsec += 1000000000;
--rt.tv_sec;
}

/* Already timed out? */
if (rt.tv_sec < 0)
return ETIMEDOUT;

/* Wait until thread terminates. */
if (lll_futex_timed_wait (tidp, tid, &rt) == -ETIMEDOUT)
return ETIMEDOUT;
}

return 0;
}

#endif
62 changes: 62 additions & 0 deletions nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_init.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* Copyright (C) 2002, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include <errno.h>
#include "pthreadP.h"
#include <lowlevellock.h>

struct sparc_pthread_barrier
{
struct pthread_barrier b;
unsigned char left_lock;
unsigned char pshared;
};

int
pthread_barrier_init (barrier, attr, count)
pthread_barrier_t *barrier;
const pthread_barrierattr_t *attr;
unsigned int count;
{
struct sparc_pthread_barrier *ibarrier;

if (__builtin_expect (count == 0, 0))
return EINVAL;

struct pthread_barrierattr *iattr = (struct pthread_barrierattr *) attr;
if (iattr != NULL)
{
if (iattr->pshared != PTHREAD_PROCESS_PRIVATE
&& __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0))
/* Invalid attribute. */
return EINVAL;
}

ibarrier = (struct sparc_pthread_barrier *) barrier;

/* Initialize the individual fields. */
ibarrier->b.lock = LLL_LOCK_INITIALIZER;
ibarrier->b.left = count;
ibarrier->b.init_count = count;
ibarrier->b.curr_event = 0;
ibarrier->left_lock = 0;
ibarrier->pshared = (iattr && iattr->pshared == PTHREAD_PROCESS_SHARED);

return 0;
}
Loading

0 comments on commit b01fe5f

Please sign in to comment.