• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * pthread_spin_init.c
3  *
4  * Description:
5  * This translation unit implements spin lock primitives.
6  *
7  * --------------------------------------------------------------------------
8  *
9  *      Pthreads-win32 - POSIX Threads Library for Win32
10  *      Copyright(C) 1998 John E. Bossom
11  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
12  *
13  *      Contact Email: rpj@callisto.canberra.edu.au
14  *
15  *      The current list of contributors is contained
16  *      in the file CONTRIBUTORS included with the source
17  *      code distribution. The list can also be seen at the
18  *      following World Wide Web location:
19  *      http://sources.redhat.com/pthreads-win32/contributors.html
20  *
21  *      This library is free software; you can redistribute it and/or
22  *      modify it under the terms of the GNU Lesser General Public
23  *      License as published by the Free Software Foundation; either
24  *      version 2 of the License, or (at your option) any later version.
25  *
26  *      This library is distributed in the hope that it will be useful,
27  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
28  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29  *      Lesser General Public License for more details.
30  *
31  *      You should have received a copy of the GNU Lesser General Public
32  *      License along with this library in the file COPYING.LIB;
33  *      if not, write to the Free Software Foundation, Inc.,
34  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
35  */
36 
37 #include "pthread.h"
38 #include "implement.h"
39 
40 
41 int
pthread_spin_init(pthread_spinlock_t * lock,int pshared)42 pthread_spin_init (pthread_spinlock_t * lock, int pshared)
43 {
44   pthread_spinlock_t s;
45   int cpus = 0;
46   int result = 0;
47 
48   if (lock == NULL)
49     {
50       return EINVAL;
51     }
52 
53   if (0 != ptw32_getprocessors (&cpus))
54     {
55       cpus = 1;
56     }
57 
58   if (cpus > 1)
59     {
60       if (pshared == PTHREAD_PROCESS_SHARED)
61 	{
62 	  /*
63 	   * Creating spinlock that can be shared between
64 	   * processes.
65 	   */
66 #if _POSIX_THREAD_PROCESS_SHARED >= 0
67 
68 	  /*
69 	   * Not implemented yet.
70 	   */
71 
72 #error ERROR [__FILE__, line __LINE__]: Process shared spin locks are not supported yet.
73 
74 #else
75 
76 	  return ENOSYS;
77 
78 #endif /* _POSIX_THREAD_PROCESS_SHARED */
79 
80 	}
81     }
82 
83   s = (pthread_spinlock_t) calloc (1, sizeof (*s));
84 
85   if (s == NULL)
86     {
87       return ENOMEM;
88     }
89 
90   if (cpus > 1)
91     {
92       s->u.cpus = cpus;
93       s->interlock = PTW32_SPIN_UNLOCKED;
94     }
95   else
96     {
97       pthread_mutexattr_t ma;
98       result = pthread_mutexattr_init (&ma);
99 
100       if (0 == result)
101 	{
102 	  ma->pshared = pshared;
103 	  result = pthread_mutex_init (&(s->u.mutex), &ma);
104 	  if (0 == result)
105 	    {
106 	      s->interlock = PTW32_SPIN_USE_MUTEX;
107 	    }
108 	}
109       (void) pthread_mutexattr_destroy (&ma);
110     }
111 
112   if (0 == result)
113     {
114       *lock = s;
115     }
116   else
117     {
118       (void) free (s);
119       *lock = NULL;
120     }
121 
122   return (result);
123 }
124