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 (at) 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 } 131