(linenum→info "unix/slp.c:2238")

glibc/2.7/nptl/pthread_barrier_init.c

    1: /* Copyright (C) 2002, 2007 Free Software Foundation, Inc.
    2:    This file is part of the GNU C Library.
    3:    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #include <errno.h>
   21: #include "pthreadP.h"
   22: #include <lowlevellock.h>
   23: #include <kernel-features.h>
   24: 
   25: 
   26: static const struct pthread_barrierattr default_attr =
   27:   {
   28:     .pshared = PTHREAD_PROCESS_PRIVATE
   29:   };
   30: 
   31: 
   32: int
   33: pthread_barrier_init (barrier, attr, count)
   34:      pthread_barrier_t *barrier;
   35:      const pthread_barrierattr_t *attr;
   36:      unsigned int count;
   37: {
   38:   struct pthread_barrier *ibarrier;
   39: 
   40:   if (__builtin_expect (count == 0, 0))
   41:     return EINVAL;
   42: 
   43:   const struct pthread_barrierattr *iattr
   44:     = (attr != NULL
   45:        ? iattr = (struct pthread_barrierattr *) attr
   46:        : &default_attr);
   47: 
   48:   if (iattr->pshared != PTHREAD_PROCESS_PRIVATE
   49:       && __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0))
   50:     /* Invalid attribute.  */
   51:     return EINVAL;
   52: 
   53:   ibarrier = (struct pthread_barrier *) barrier;
   54: 
   55:   /* Initialize the individual fields.  */
   56:   ibarrier->lock = LLL_LOCK_INITIALIZER;
   57:   ibarrier->left = count;
   58:   ibarrier->init_count = count;
   59:   ibarrier->curr_event = 0;
   60: 
   61: #ifdef __ASSUME_PRIVATE_FUTEX
   62:   ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE
   63:                        ? 0 : FUTEX_PRIVATE_FLAG);
   64: #else
   65:   ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE
   66:                        ? 0 : THREAD_GETMEM (THREAD_SELF,
   67:                                             header.private_futex));
   68: #endif
   69: 
   70:   return 0;
   71: }
Syntax (Markdown)