- add sources.
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / libraries / third_party / pthreads-win32 / pthread_mutex_init.c
1 /*
2  * pthread_mutex_init.c
3  *
4  * Description:
5  * This translation unit implements mutual exclusion (mutex) 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
42 pthread_mutex_init (pthread_mutex_t * mutex, const pthread_mutexattr_t * attr)
43 {
44   int result = 0;
45   pthread_mutex_t mx;
46
47   if (mutex == NULL)
48     {
49       return EINVAL;
50     }
51
52   if (attr != NULL && *attr != NULL)
53     {
54       if ((*attr)->pshared == PTHREAD_PROCESS_SHARED)
55         {
56           /*
57            * Creating mutex that can be shared between
58            * processes.
59            */
60 #if _POSIX_THREAD_PROCESS_SHARED >= 0
61
62           /*
63            * Not implemented yet.
64            */
65
66 #error ERROR [__FILE__, line __LINE__]: Process shared mutexes are not supported yet.
67
68 #else
69
70           return ENOSYS;
71
72 #endif /* _POSIX_THREAD_PROCESS_SHARED */
73         }
74     }
75
76   mx = (pthread_mutex_t) calloc (1, sizeof (*mx));
77
78   if (mx == NULL)
79     {
80       result = ENOMEM;
81     }
82   else
83     {
84       mx->lock_idx = 0;
85       mx->recursive_count = 0;
86       mx->robustNode = NULL;
87       if (attr == NULL || *attr == NULL)
88         {
89           mx->kind = PTHREAD_MUTEX_DEFAULT;
90         }
91       else
92         {
93           mx->kind = (*attr)->kind;
94           if ((*attr)->robustness == PTHREAD_MUTEX_ROBUST)
95             {
96               /*
97                * Use the negative range to represent robust types.
98                * Replaces a memory fetch with a register negate and incr
99                * in pthread_mutex_lock etc.
100                *
101                * Map 0,1,..,n to -1,-2,..,(-n)-1
102                */
103               mx->kind = -mx->kind - 1;
104
105               mx->robustNode = (ptw32_robust_node_t*) malloc(sizeof(ptw32_robust_node_t));
106               mx->robustNode->stateInconsistent = PTW32_ROBUST_CONSISTENT;
107               mx->robustNode->mx = mx;
108               mx->robustNode->next = NULL;
109               mx->robustNode->prev = NULL;
110             }
111         }
112
113       mx->ownerThread.p = NULL;
114
115       mx->event = CreateEvent (NULL, PTW32_FALSE,    /* manual reset = No */
116                               PTW32_FALSE,           /* initial state = not signaled */
117                               NULL);                 /* event name */
118
119       if (0 == mx->event)
120         {
121           result = ENOSPC;
122           free (mx);
123           mx = NULL;
124         }
125     }
126
127   *mutex = mx;
128
129   return (result);
130 }