1/*
2 * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2008, Axel D��rfler, axeld@pinc-software.de.
4 * Copyright 2006, J��r��me Duval. All rights reserved.
5 * Distributed under the terms of the MIT License.
6 */
7
8
9#include <pthread.h>
10#include "pthread_private.h"
11
12#include <limits.h>
13#include <stdlib.h>
14
15#include <thread_defs.h>
16
17
18int
19pthread_attr_init(pthread_attr_t *_attr)
20{
21	pthread_attr *attr;
22
23	if (_attr == NULL)
24		return B_BAD_VALUE;
25
26	attr = (pthread_attr *)malloc(sizeof(pthread_attr));
27	if (attr == NULL)
28		return B_NO_MEMORY;
29
30	attr->detach_state = PTHREAD_CREATE_JOINABLE;
31	attr->sched_priority = B_NORMAL_PRIORITY;
32	attr->stack_size = USER_STACK_SIZE;
33	attr->guard_size = USER_STACK_GUARD_SIZE;
34
35	*_attr = attr;
36	return B_OK;
37}
38
39
40int
41pthread_attr_destroy(pthread_attr_t *_attr)
42{
43	pthread_attr *attr;
44
45	if (_attr == NULL || (attr = *_attr) == NULL)
46		return B_BAD_VALUE;
47
48	*_attr = NULL;
49	free(attr);
50
51	return B_OK;
52}
53
54
55int
56pthread_attr_getdetachstate(const pthread_attr_t *_attr, int *state)
57{
58	pthread_attr *attr;
59
60	if (_attr == NULL || (attr = *_attr) == NULL || state == NULL)
61		return B_BAD_VALUE;
62
63	*state = attr->detach_state;
64
65	return B_OK;
66}
67
68
69int
70pthread_attr_setdetachstate(pthread_attr_t *_attr, int state)
71{
72	pthread_attr *attr;
73
74	if (_attr == NULL || (attr = *_attr) == NULL)
75		return B_BAD_VALUE;
76
77	if (state != PTHREAD_CREATE_JOINABLE && state != PTHREAD_CREATE_DETACHED)
78		return B_BAD_VALUE;
79
80	attr->detach_state = state;
81
82	return B_OK;
83}
84
85
86int
87pthread_attr_getstacksize(const pthread_attr_t *_attr, size_t *stacksize)
88{
89	pthread_attr *attr;
90
91	if (_attr == NULL || (attr = *_attr) == NULL || stacksize == NULL)
92		return B_BAD_VALUE;
93
94	*stacksize = attr->stack_size;
95
96	return 0;
97}
98
99
100int
101pthread_attr_setstacksize(pthread_attr_t *_attr, size_t stacksize)
102{
103	pthread_attr *attr;
104
105	if (_attr == NULL || (attr = *_attr) == NULL)
106		return B_BAD_VALUE;
107
108	if (stacksize < PTHREAD_STACK_MIN || stacksize > MAX_USER_STACK_SIZE)
109		return B_BAD_VALUE;
110
111	attr->stack_size = stacksize;
112
113	return 0;
114}
115
116
117int
118pthread_attr_getscope(const pthread_attr_t *attr, int *contentionScope)
119{
120	if (attr == NULL || contentionScope == NULL)
121		return EINVAL;
122
123	*contentionScope = PTHREAD_SCOPE_SYSTEM;
124	return 0;
125}
126
127
128int
129pthread_attr_setscope(pthread_attr_t *attr, int contentionScope)
130{
131	if (attr == NULL)
132		return EINVAL;
133
134	if (contentionScope != PTHREAD_SCOPE_SYSTEM)
135		return ENOTSUP;
136
137	return 0;
138}
139
140
141int
142pthread_attr_setschedparam(pthread_attr_t *attr,
143	const struct sched_param *param)
144{
145	if (attr == NULL || param == NULL)
146		return EINVAL;
147
148	(*attr)->sched_priority = param->sched_priority;
149
150	return 0;
151}
152
153
154int
155pthread_attr_getschedparam(const pthread_attr_t *attr,
156	struct sched_param *param)
157{
158	if (attr == NULL || param == NULL)
159		return EINVAL;
160
161	param->sched_priority = (*attr)->sched_priority;
162
163	return 0;
164}
165
166
167int
168pthread_attr_getguardsize(const pthread_attr_t *_attr, size_t *guardsize)
169{
170	pthread_attr *attr;
171
172	if (_attr == NULL || (attr = *_attr) == NULL || guardsize == NULL)
173		return B_BAD_VALUE;
174
175	*guardsize = attr->guard_size;
176
177	return 0;
178}
179
180
181int
182pthread_attr_setguardsize(pthread_attr_t *_attr, size_t guardsize)
183{
184	pthread_attr *attr;
185
186	if (_attr == NULL || (attr = *_attr) == NULL)
187		return B_BAD_VALUE;
188
189	attr->guard_size = guardsize;
190
191	return 0;
192}
193