diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 65afaad0f9..04a474e509 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,8 +1,28 @@ 2003-03-31 Ulrich Drepper + * sysdeps/unix/sysv/linux/ia64/lowlevellock.h (__lll_mutex_lock): + Use atomic_exchange_and_add instead of __lll_add. + (__lll_mutex_timedlock): Likewise. + Patch by Ian Wienand. + +2003-03-24 Steven Munroe + + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h + (SINGLE_THREAD_P): Fix typo. + * tst-cancel-wrappers.sh: Handle '.'ed symbols. + +2003-03-31 Ulrich Drepper + + * Makefile (tests): Add tst-align. + * tst-align.c: New file. + * sysdeps/i386/Makefile: Define CFLAGS-tst-align. + * sysdeps/x86_64/Makefile: Likewise. + * sysdeps/i386/tls.h (CALL_THREAD_FCT): Align stack of called function correctly. + * tst-tsd2.c: Add casts to avoid warnings. + 2003-03-30 Ulrich Drepper * descr.h (struct pthread): Move most often used elements to the front. diff --git a/nptl/Makefile b/nptl/Makefile index 9d9936e33f..c352216421 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -140,6 +140,7 @@ tests = tst-attr1 tst-attr2 \ tst-key1 tst-key2 tst-key3 tst-key4 \ tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 \ tst-barrier1 tst-barrier2 tst-barrier3 \ + tst-align \ tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \ tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \ tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 \ diff --git a/nptl/sysdeps/i386/Makefile b/nptl/sysdeps/i386/Makefile index 24990a2b7e..a18c1bc8f1 100644 --- a/nptl/sysdeps/i386/Makefile +++ b/nptl/sysdeps/i386/Makefile @@ -19,3 +19,7 @@ ifeq ($(subdir),csu) gen-as-const-headers += tcb-offsets.sym endif + +ifeq ($(subdir),nptl) +CFLAGS-tst-align.c += -malign-double +endif diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h index 8fa96ed6a2..24cbfe8cc3 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/ia64/lowlevellock.h @@ -103,7 +103,7 @@ static inline void __attribute__ ((always_inline)) __lll_mutex_lock (int *futex) { - int val = __lll_add (futex, 1); + int val = atomic_exchange_and_add (futex, 1); if (__builtin_expect (val != 0, 0)) __lll_lock_wait (futex, val); @@ -119,7 +119,7 @@ static inline int __attribute__ ((always_inline)) __lll_mutex_timedlock (int *futex, const struct timespec *abstime) { - int val = __lll_add (futex, 1); + int val = atomic_exchange_and_add (futex, 1); int result = 0; if (__builtin_expect (val != 0, 0)) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h index 7c9147e3cc..5483586c7b 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h @@ -91,7 +91,7 @@ # else # define SINGLE_THREAD_P \ lwz 10,MULTIPLE_THREADS_OFFSET(13); \ - cmpdi 10,0 + cmpwi 10,0 # endif #elif !defined __ASSEMBLER__ diff --git a/nptl/sysdeps/x86_64/Makefile b/nptl/sysdeps/x86_64/Makefile index 24990a2b7e..a18c1bc8f1 100644 --- a/nptl/sysdeps/x86_64/Makefile +++ b/nptl/sysdeps/x86_64/Makefile @@ -19,3 +19,7 @@ ifeq ($(subdir),csu) gen-as-const-headers += tcb-offsets.sym endif + +ifeq ($(subdir),nptl) +CFLAGS-tst-align.c += -malign-double +endif diff --git a/nptl/tst-align.c b/nptl/tst-align.c new file mode 100644 index 0000000000..902a1c772a --- /dev/null +++ b/nptl/tst-align.c @@ -0,0 +1,85 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 +#include +#include +#include + + +static void * +tf (void *arg) +{ + bool ok = true; + + puts ("in thread"); + + double d = 2.0; + printf ("double: %g %p %zu\n", d, &d, __alignof (double)); + if ((((uintptr_t) &d) & (__alignof (double) - 1)) != 0) + ok = false; + + long double ld = 3.0; + printf ("ldouble: %Lg %p %zu\n", ld, &ld, __alignof (long double)); + if ((((uintptr_t) &ld) & (__alignof (long double) - 1)) != 0) + ok = false; + + return ok ? NULL : (void *) -1l; +} + +static int +do_test (void) +{ + bool ok = true; + + puts ("in main"); + + double d = 0.0; + printf ("double: %g %p %zu\n", d, &d, __alignof (double)); + if ((((uintptr_t) &d) & (__alignof (double) - 1)) != 0) + ok = false; + + long double ld = 1.0; + printf ("ldouble: %Lg %p %zu\n", ld, &ld, __alignof (long double)); + if ((((uintptr_t) &ld) & (__alignof (long double) - 1)) != 0) + ok = false; + + pthread_t th; + if (pthread_create (&th, NULL, tf, NULL) != 0) + { + puts ("create failed"); + return 1; + } + + void *res; + if (pthread_join (th, &res) != 0) + { + puts ("join failed"); + return 1; + } + + if (res != NULL) + ok = false; + + return ok ? 0 : 1; +} + + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/nptl/tst-cancel-wrappers.sh b/nptl/tst-cancel-wrappers.sh index 4561c02ae8..e2035c7ed5 100644 --- a/nptl/tst-cancel-wrappers.sh +++ b/nptl/tst-cancel-wrappers.sh @@ -1,5 +1,5 @@ #! /bin/sh -# Test whether all cancellable functions are cancellable. +# Test whether all cancelable functions are cancelable. # Copyright (C) 2002, 2003 Free Software Foundation, Inc. # This file is part of the GNU C Library. # Contributed by Jakub Jelinek , 2002. @@ -82,9 +82,9 @@ C["__xpg_sigpause"]=1 { if (C[$1] && $2 ~ /^[TW]$/) seen=$1 - else if ($1 ~ /^__(libc|pthread)_enable_asynccancel$/ && $2 == "U") + else if ($1 ~ /^([.]|)__(libc|pthread)_enable_asynccancel$/ && $2 == "U") seen_enable=1 - else if ($1 ~ /^__(libc|pthread)_disable_asynccancel$/ && $2 == "U") + else if ($1 ~ /^([.]|)__(libc|pthread)_disable_asynccancel$/ && $2 == "U") seen_disable=1 } END { diff --git a/nptl/tst-tsd2.c b/nptl/tst-tsd2.c index 66a1128e91..19d8a69f9e 100644 --- a/nptl/tst-tsd2.c +++ b/nptl/tst-tsd2.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -38,7 +38,7 @@ destr (void *arg) static void * tf (void *arg) { - pthread_key_t key = (pthread_key_t) arg; + pthread_key_t key = (pthread_key_t) (long int) arg; int err; err = pthread_setspecific (key, (void *) -2l); @@ -65,7 +65,7 @@ do_test (void) result = 1; - err = pthread_create (&th, NULL, tf, (void *) key); + err = pthread_create (&th, NULL, tf, (void *) (long int) key); if (err != 0) { printf ("create failed: %s\n", strerror (err));