1/*
2 * Copyright 2003-2007, Axel D��rfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <pthread.h>
8#include "pthread_private.h"
9
10#include <stdlib.h>
11
12
13int
14pthread_mutexattr_init(pthread_mutexattr_t *_mutexAttr)
15{
16	pthread_mutexattr *attr;
17
18	if (_mutexAttr == NULL)
19		return B_BAD_VALUE;
20
21	attr = (pthread_mutexattr *)malloc(sizeof(pthread_mutexattr));
22	if (attr == NULL)
23		return B_NO_MEMORY;
24
25	attr->type = PTHREAD_MUTEX_DEFAULT;
26	attr->process_shared = false;
27
28	*_mutexAttr = attr;
29	return B_OK;
30}
31
32
33int
34pthread_mutexattr_destroy(pthread_mutexattr_t *_mutexAttr)
35{
36	pthread_mutexattr *attr;
37
38	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL)
39		return B_BAD_VALUE;
40
41	*_mutexAttr = NULL;
42	free(attr);
43
44	return B_OK;
45}
46
47
48int
49pthread_mutexattr_gettype(const pthread_mutexattr_t *_mutexAttr, int *_type)
50{
51	pthread_mutexattr *attr;
52
53	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL || _type == NULL)
54		return B_BAD_VALUE;
55
56	*_type = attr->type;
57	return B_OK;
58}
59
60
61int
62pthread_mutexattr_settype(pthread_mutexattr_t *_mutexAttr, int type)
63{
64	pthread_mutexattr *attr;
65
66	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL
67		|| type < PTHREAD_MUTEX_DEFAULT
68		|| type > PTHREAD_MUTEX_RECURSIVE)
69		return B_BAD_VALUE;
70
71	attr->type = type;
72	return B_OK;
73}
74
75
76int
77pthread_mutexattr_getpshared(const pthread_mutexattr_t *_mutexAttr,
78	int *_processShared)
79{
80	pthread_mutexattr *attr;
81
82	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL
83		|| _processShared == NULL) {
84		return B_BAD_VALUE;
85	}
86
87	*_processShared = attr->process_shared ? PTHREAD_PROCESS_SHARED
88		: PTHREAD_PROCESS_PRIVATE;
89	return B_OK;
90}
91
92
93int
94pthread_mutexattr_setpshared(pthread_mutexattr_t *_mutexAttr,
95	int processShared)
96{
97	pthread_mutexattr *attr;
98
99	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL
100		|| processShared < PTHREAD_PROCESS_PRIVATE
101		|| processShared > PTHREAD_PROCESS_SHARED) {
102		return B_BAD_VALUE;
103	}
104
105	attr->process_shared = processShared == PTHREAD_PROCESS_SHARED;
106	return B_OK;
107}
108
109
110int
111pthread_mutexattr_getprioceiling(const pthread_mutexattr_t *_mutexAttr,
112	int *_priorityCeiling)
113{
114	pthread_mutexattr *attr;
115
116	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL
117		|| _priorityCeiling == NULL) {
118		return B_BAD_VALUE;
119	}
120
121	*_priorityCeiling = 0;
122		// not implemented
123
124	return B_OK;
125}
126
127
128int
129pthread_mutexattr_setprioceiling(pthread_mutexattr_t *_mutexAttr,
130	int priorityCeiling)
131{
132	pthread_mutexattr *attr;
133
134	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL)
135		return B_BAD_VALUE;
136
137	// not implemented
138	return B_NOT_ALLOWED;
139}
140
141
142int
143pthread_mutexattr_getprotocol(const pthread_mutexattr_t *_mutexAttr,
144	int *_protocol)
145{
146	pthread_mutexattr *attr;
147
148	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL
149		|| _protocol == NULL) {
150		return B_BAD_VALUE;
151	}
152
153	*_protocol = 0;
154		// not implemented
155
156	return B_OK;
157}
158
159
160int
161pthread_mutexattr_setprotocol(pthread_mutexattr_t *_mutexAttr, int protocol)
162{
163	pthread_mutexattr *attr;
164
165	if (_mutexAttr == NULL || (attr = *_mutexAttr) == NULL)
166		return B_BAD_VALUE;
167
168	// not implemented
169	return B_NOT_ALLOWED;
170}
171