diff options
Diffstat (limited to 'libpthread/linuxthreads/sysdeps/ia64')
-rw-r--r-- | libpthread/linuxthreads/sysdeps/ia64/pspinlock.c | 78 | ||||
-rw-r--r-- | libpthread/linuxthreads/sysdeps/ia64/pt-machine.h | 6 | ||||
-rw-r--r-- | libpthread/linuxthreads/sysdeps/ia64/tcb-offsets.sym | 9 | ||||
-rw-r--r-- | libpthread/linuxthreads/sysdeps/ia64/tls.h | 6 |
4 files changed, 94 insertions, 5 deletions
diff --git a/libpthread/linuxthreads/sysdeps/ia64/pspinlock.c b/libpthread/linuxthreads/sysdeps/ia64/pspinlock.c new file mode 100644 index 000000000..d5e52ff6b --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/ia64/pspinlock.c @@ -0,0 +1,78 @@ +/* POSIX spinlock implementation. ia64 version. + Copyright (C) 2000, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jes Sorensen <jes@linuxcare.com> + + 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; see the file COPYING.LIB. If + not, see <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <pthread.h> +#include "internals.h" +#include <ia64intrin.h> + +/* This implementation is inspired by the implementation used in the + Linux kernel. */ + +int +__pthread_spin_lock (pthread_spinlock_t *lock) +{ + int *p = (int *) lock; + + while (__builtin_expect (__sync_val_compare_and_swap (p, 0, 1), 0)) + { + /* Spin without using the atomic instruction. */ + do + __asm__ __volatile__ ("" : : : "memory"); + while (*p); + } + return 0; +} +weak_alias (__pthread_spin_lock, pthread_spin_lock) + + +int +__pthread_spin_trylock (pthread_spinlock_t *lock) +{ + return __sync_val_compare_and_swap ((int *) lock, 0, 1) == 0 ? 0 : EBUSY; +} +weak_alias (__pthread_spin_trylock, pthread_spin_trylock) + + +int +__pthread_spin_unlock (pthread_spinlock_t *lock) +{ + return *lock = 0; +} +weak_alias (__pthread_spin_unlock, pthread_spin_unlock) + + +int +__pthread_spin_init (pthread_spinlock_t *lock, int pshared) +{ + /* We can ignore the `pshared' parameter. Since we are busy-waiting + all processes which can access the memory location `lock' points + to can use the spinlock. */ + return *lock = 0; +} +weak_alias (__pthread_spin_init, pthread_spin_init) + + +int +__pthread_spin_destroy (pthread_spinlock_t *lock) +{ + /* Nothing to do. */ + return 0; +} +weak_alias (__pthread_spin_destroy, pthread_spin_destroy) diff --git a/libpthread/linuxthreads/sysdeps/ia64/pt-machine.h b/libpthread/linuxthreads/sysdeps/ia64/pt-machine.h index f4c6be989..55bdd5df5 100644 --- a/libpthread/linuxthreads/sysdeps/ia64/pt-machine.h +++ b/libpthread/linuxthreads/sysdeps/ia64/pt-machine.h @@ -23,10 +23,6 @@ #include <features.h> #include <ia64intrin.h> -#include <sys/types.h> -extern int __clone2 (int (*__fn) (void *__arg), void *__child_stack_base, - size_t __child_stack_size, int __flags, void *__arg, ...); - #ifndef PT_EI # define PT_EI __extern_always_inline #endif @@ -34,7 +30,7 @@ extern int __clone2 (int (*__fn) (void *__arg), void *__child_stack_base, /* Make sure gcc doesn't try to be clever and move things around on us. We need to use _exactly_ the address the user gave us, not some alias that contains the same information. */ -#define __atomic_fool_gcc(x) (*(volatile struct { int a[100]; } *)x) +#define __atomic_fool_gcc(x) (*(__volatile__ struct { int a[100]; } *)x) #ifndef ELF_MACHINE_NAME diff --git a/libpthread/linuxthreads/sysdeps/ia64/tcb-offsets.sym b/libpthread/linuxthreads/sysdeps/ia64/tcb-offsets.sym new file mode 100644 index 000000000..1000ad0a9 --- /dev/null +++ b/libpthread/linuxthreads/sysdeps/ia64/tcb-offsets.sym @@ -0,0 +1,9 @@ +#include <sysdep.h> +#include <tls.h> + +-- +#ifdef __UCLIBC_HAS_TLS__ +MULTIPLE_THREADS_OFFSET offsetof (struct _pthread_descr_struct, p_multiple_threads) - sizeof (struct _pthread_descr_struct) +#else +MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) +#endif diff --git a/libpthread/linuxthreads/sysdeps/ia64/tls.h b/libpthread/linuxthreads/sysdeps/ia64/tls.h index a78f0ec7a..c86073f26 100644 --- a/libpthread/linuxthreads/sysdeps/ia64/tls.h +++ b/libpthread/linuxthreads/sysdeps/ia64/tls.h @@ -111,6 +111,9 @@ typedef struct # define TLS_MULTIPLE_THREADS_IN_TCB 1 +/* Get the thread descriptor definition. */ +# include <linuxthreads/descr.h> + # endif #else @@ -125,6 +128,9 @@ typedef struct int multiple_threads; } tcbhead_t; +/* Get the thread descriptor definition. */ +# include <linuxthreads/descr.h> + # define NONTLS_INIT_TP \ do { \ static const tcbhead_t nontls_init_tp = { .multiple_threads = 0 }; \ |