Back to index

glibc  2.9
pthread_once.c
Go to the documentation of this file.
00001 /* Copyright (C) 2002, 2007 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 #include "pthreadP.h"
00021 #include <lowlevellock.h>
00022 
00023 
00024 
00025 static int once_lock = LLL_LOCK_INITIALIZER;
00026 
00027 
00028 int
00029 __pthread_once (once_control, init_routine)
00030      pthread_once_t *once_control;
00031      void (*init_routine) (void);
00032 {
00033   /* XXX Depending on whether the LOCK_IN_ONCE_T is defined use a
00034      global lock variable or one which is part of the pthread_once_t
00035      object.  */
00036   if (*once_control == PTHREAD_ONCE_INIT)
00037     {
00038       lll_lock (once_lock, LLL_PRIVATE);
00039 
00040       /* XXX This implementation is not complete.  It doesn't take
00041         cancelation and fork into account.  */
00042       if (*once_control == PTHREAD_ONCE_INIT)
00043        {
00044          init_routine ();
00045 
00046          *once_control = !PTHREAD_ONCE_INIT;
00047        }
00048 
00049       lll_unlock (once_lock, LLL_PRIVATE);
00050     }
00051 
00052   return 0;
00053 }
00054 strong_alias (__pthread_once, pthread_once)