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, see
17    <http://www.gnu.org/licenses/>.  */
18 
19 #include "pthreadP.h"
20 #include <lowlevellock.h>
21 
22 
23 
24 static int once_lock = LLL_LOCK_INITIALIZER;
25 
26 
27 int
__pthread_once(pthread_once_t * once_control,void (* init_routine)(void))28 __pthread_once (
29      pthread_once_t *once_control,
30      void (*init_routine) (void))
31 {
32   /* XXX Depending on whether the LOCK_IN_ONCE_T is defined use a
33      global lock variable or one which is part of the pthread_once_t
34      object.  */
35   if (*once_control == PTHREAD_ONCE_INIT)
36     {
37       lll_lock (once_lock, LLL_PRIVATE);
38 
39       /* XXX This implementation is not complete.  It doesn't take
40 	 cancellation and fork into account.  */
41       if (*once_control == PTHREAD_ONCE_INIT)
42 	{
43 	  init_routine ();
44 
45 	  *once_control = !PTHREAD_ONCE_INIT;
46 	}
47 
48       lll_unlock (once_lock, LLL_PRIVATE);
49     }
50 
51   return 0;
52 }
53 strong_alias (__pthread_once, pthread_once)
54