From 44f3864ffcf205930a0cf7e553ab91f2cb01d02d Mon Sep 17 00:00:00 2001 From: Austin Foxley Date: Wed, 17 Feb 2010 16:52:15 -0800 Subject: move pthread_barrier_{init,destroy} to sysdeps/pthread for archs that implement their own like sparc and x86_64 Signed-off-by: Austin Foxley --- libpthread/nptl/Makefile.in | 2 + libpthread/nptl/pthread_barrier_destroy.c | 44 -------------- libpthread/nptl/pthread_barrier_init.c | 71 ---------------------- libpthread/nptl/sysdeps/pthread/Makefile.in | 5 +- .../nptl/sysdeps/pthread/pthread_barrier_destroy.c | 44 ++++++++++++++ .../nptl/sysdeps/pthread/pthread_barrier_init.c | 71 ++++++++++++++++++++++ .../unix/sysv/linux/sparc/pthread_barrier_wait.c | 1 + 7 files changed, 122 insertions(+), 116 deletions(-) delete mode 100644 libpthread/nptl/pthread_barrier_destroy.c delete mode 100644 libpthread/nptl/pthread_barrier_init.c create mode 100644 libpthread/nptl/sysdeps/pthread/pthread_barrier_destroy.c create mode 100644 libpthread/nptl/sysdeps/pthread/pthread_barrier_init.c create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c diff --git a/libpthread/nptl/Makefile.in b/libpthread/nptl/Makefile.in index d3386a305..ee596315b 100644 --- a/libpthread/nptl/Makefile.in +++ b/libpthread/nptl/Makefile.in @@ -189,6 +189,7 @@ libpthread-misc-routines = pthread_rwlock_rdlock pthread_rwlock_timedrdlock \ pthread_cond_broadcast pthread_spin_init \ pthread_spin_destroy pthread_spin_lock \ pthread_spin_trylock pthread_spin_unlock \ + pthread_barrier_init pthread_barrier_destroy \ pthread_barrier_wait pthread_sigmask \ pthread_kill pthread_once \ pthread_getcpuclockid sem_wait \ @@ -250,6 +251,7 @@ libc-shared-y += $(patsubst %.c, $(PTHREAD_OUT)/%.oS, forward.c \ libc-cancellation.c) libpthread-nonshared-y += $(patsubst %,$(PTHREAD_OUT)/%.oS,$(libpthread_static_SRC)) + ifeq ($(DOPIC),y) libpthread-a-y := $(patsubst $(PTHREAD_DIR)/%.c,$(PTHREAD_OUT)/%.os,$(libpthread_a_SRC)) else diff --git a/libpthread/nptl/pthread_barrier_destroy.c b/libpthread/nptl/pthread_barrier_destroy.c deleted file mode 100644 index 2afe5b3c5..000000000 --- a/libpthread/nptl/pthread_barrier_destroy.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002, 2007 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 -#include "pthreadP.h" -#include - - -int -pthread_barrier_destroy ( - pthread_barrier_t *barrier) -{ - struct pthread_barrier *ibarrier; - int result = EBUSY; - - ibarrier = (struct pthread_barrier *) barrier; - - lll_lock (ibarrier->lock, ibarrier->private ^ FUTEX_PRIVATE_FLAG); - - if (__builtin_expect (ibarrier->left == ibarrier->init_count, 1)) - /* The barrier is not used anymore. */ - result = 0; - else - /* Still used, return with an error. */ - lll_unlock (ibarrier->lock, ibarrier->private ^ FUTEX_PRIVATE_FLAG); - - return result; -} diff --git a/libpthread/nptl/pthread_barrier_init.c b/libpthread/nptl/pthread_barrier_init.c deleted file mode 100644 index f0396f929..000000000 --- a/libpthread/nptl/pthread_barrier_init.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2002, 2007 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 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 -#include "pthreadP.h" -#include -#include - - -static const struct pthread_barrierattr default_attr = - { - .pshared = PTHREAD_PROCESS_PRIVATE - }; - - -int -pthread_barrier_init ( - pthread_barrier_t *barrier, - const pthread_barrierattr_t *attr, - unsigned int count) -{ - struct pthread_barrier *ibarrier; - - if (__builtin_expect (count == 0, 0)) - return EINVAL; - - const struct pthread_barrierattr *iattr - = (attr != NULL - ? iattr = (struct pthread_barrierattr *) attr - : &default_attr); - - if (iattr->pshared != PTHREAD_PROCESS_PRIVATE - && __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0)) - /* Invalid attribute. */ - return EINVAL; - - ibarrier = (struct pthread_barrier *) barrier; - - /* Initialize the individual fields. */ - ibarrier->lock = LLL_LOCK_INITIALIZER; - ibarrier->left = count; - ibarrier->init_count = count; - ibarrier->curr_event = 0; - -#ifdef __ASSUME_PRIVATE_FUTEX - ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE - ? 0 : FUTEX_PRIVATE_FLAG); -#else - ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE - ? 0 : THREAD_GETMEM (THREAD_SELF, - header.private_futex)); -#endif - - return 0; -} diff --git a/libpthread/nptl/sysdeps/pthread/Makefile.in b/libpthread/nptl/sysdeps/pthread/Makefile.in index 303b04f3f..e417e6ce6 100644 --- a/libpthread/nptl/sysdeps/pthread/Makefile.in +++ b/libpthread/nptl/sysdeps/pthread/Makefile.in @@ -10,7 +10,8 @@ # pt-longjmp.c in libc and libpthread. For uClibc, they are # in libc only. # -libpthread_CSRC = pthread_barrier_wait.c pthread_cond_broadcast.c \ +libpthread_CSRC = pthread_barrier_init.c pthread_barrier_destroy.c \ + pthread_barrier_wait.c pthread_cond_broadcast.c \ pthread_cond_signal.c pthread_cond_timedwait.c \ pthread_cond_wait.c pthread_rwlock_rdlock.c \ pthread_rwlock_timedrdlock.c \ @@ -63,6 +64,8 @@ endif CFLAGS-pt-common = -DNOT_IN_libc=1 $(SSP_ALL_CFLAGS) +CFLAGS-pthread_barrier_init.c = $(CFLAGS-pt-common) -DIS_IN_libpthread=1 +CFLAGS-pthread_barrier_destroy.c = $(CFLAGS-pt-common) -DIS_IN_libpthread=1 CFLAGS-pthread_barrier_wait.c = -D_GNU_SOURCE $(CFLAGS-pt-common) \ -DIS_IN_libpthread=1 CFLAGS-pthread_cond_broadcast.c = $(CFLAGS-pt-common) -DIS_IN_libpthread=1 diff --git a/libpthread/nptl/sysdeps/pthread/pthread_barrier_destroy.c b/libpthread/nptl/sysdeps/pthread/pthread_barrier_destroy.c new file mode 100644 index 000000000..2afe5b3c5 --- /dev/null +++ b/libpthread/nptl/sysdeps/pthread/pthread_barrier_destroy.c @@ -0,0 +1,44 @@ +/* Copyright (C) 2002, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 +#include "pthreadP.h" +#include + + +int +pthread_barrier_destroy ( + pthread_barrier_t *barrier) +{ + struct pthread_barrier *ibarrier; + int result = EBUSY; + + ibarrier = (struct pthread_barrier *) barrier; + + lll_lock (ibarrier->lock, ibarrier->private ^ FUTEX_PRIVATE_FLAG); + + if (__builtin_expect (ibarrier->left == ibarrier->init_count, 1)) + /* The barrier is not used anymore. */ + result = 0; + else + /* Still used, return with an error. */ + lll_unlock (ibarrier->lock, ibarrier->private ^ FUTEX_PRIVATE_FLAG); + + return result; +} diff --git a/libpthread/nptl/sysdeps/pthread/pthread_barrier_init.c b/libpthread/nptl/sysdeps/pthread/pthread_barrier_init.c new file mode 100644 index 000000000..f0396f929 --- /dev/null +++ b/libpthread/nptl/sysdeps/pthread/pthread_barrier_init.c @@ -0,0 +1,71 @@ +/* Copyright (C) 2002, 2007 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 +#include "pthreadP.h" +#include +#include + + +static const struct pthread_barrierattr default_attr = + { + .pshared = PTHREAD_PROCESS_PRIVATE + }; + + +int +pthread_barrier_init ( + pthread_barrier_t *barrier, + const pthread_barrierattr_t *attr, + unsigned int count) +{ + struct pthread_barrier *ibarrier; + + if (__builtin_expect (count == 0, 0)) + return EINVAL; + + const struct pthread_barrierattr *iattr + = (attr != NULL + ? iattr = (struct pthread_barrierattr *) attr + : &default_attr); + + if (iattr->pshared != PTHREAD_PROCESS_PRIVATE + && __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0)) + /* Invalid attribute. */ + return EINVAL; + + ibarrier = (struct pthread_barrier *) barrier; + + /* Initialize the individual fields. */ + ibarrier->lock = LLL_LOCK_INITIALIZER; + ibarrier->left = count; + ibarrier->init_count = count; + ibarrier->curr_event = 0; + +#ifdef __ASSUME_PRIVATE_FUTEX + ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE + ? 0 : FUTEX_PRIVATE_FLAG); +#else + ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE + ? 0 : THREAD_GETMEM (THREAD_SELF, + header.private_futex)); +#endif + + return 0; +} diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c new file mode 100644 index 000000000..73eaa695e --- /dev/null +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c @@ -0,0 +1 @@ +#include "sparc32/pthread_barrier_wait.c" -- cgit v1.2.3