xref: /haiku/src/system/libroot/posix/pthread/pthread_attr.c (revision 9760dcae2038d47442f4658c2575844c6cf92c40)
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 
18 int
19 pthread_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 
34 	*_attr = attr;
35 	return B_OK;
36 }
37 
38 
39 int
40 pthread_attr_destroy(pthread_attr_t *_attr)
41 {
42 	pthread_attr *attr;
43 
44 	if (_attr == NULL || (attr = *_attr) == NULL)
45 		return B_BAD_VALUE;
46 
47 	*_attr = NULL;
48 	free(attr);
49 
50 	return B_OK;
51 }
52 
53 
54 int
55 pthread_attr_getdetachstate(const pthread_attr_t *_attr, int *state)
56 {
57 	pthread_attr *attr;
58 
59 	if (_attr == NULL || (attr = *_attr) == NULL || state == NULL)
60 		return B_BAD_VALUE;
61 
62 	*state = attr->detach_state;
63 
64 	return B_OK;
65 }
66 
67 
68 int
69 pthread_attr_setdetachstate(pthread_attr_t *_attr, int state)
70 {
71 	pthread_attr *attr;
72 
73 	if (_attr == NULL || (attr = *_attr) == NULL)
74 		return B_BAD_VALUE;
75 
76 	if (state != PTHREAD_CREATE_JOINABLE && state != PTHREAD_CREATE_DETACHED)
77 		return B_BAD_VALUE;
78 
79 	attr->detach_state = state;
80 
81 	return B_OK;
82 }
83 
84 
85 int
86 pthread_attr_getstacksize(const pthread_attr_t *_attr, size_t *stacksize)
87 {
88 	pthread_attr *attr;
89 
90 	if (_attr == NULL || (attr = *_attr) == NULL || stacksize == NULL)
91 		return B_BAD_VALUE;
92 
93 	*stacksize = attr->stack_size;
94 
95 	return 0;
96 }
97 
98 
99 int
100 pthread_attr_setstacksize(pthread_attr_t *_attr, size_t stacksize)
101 {
102 	pthread_attr *attr;
103 
104 	if (_attr == NULL || (attr = *_attr) == NULL)
105 		return B_BAD_VALUE;
106 
107 	if (stacksize < PTHREAD_STACK_MIN || stacksize > MAX_USER_STACK_SIZE)
108 		return B_BAD_VALUE;
109 
110 	attr->stack_size = stacksize;
111 
112 	return 0;
113 }
114 
115 
116 int
117 pthread_attr_getscope(const pthread_attr_t *attr, int *contentionScope)
118 {
119 	if (attr == NULL || contentionScope == NULL)
120 		return EINVAL;
121 
122 	*contentionScope = PTHREAD_SCOPE_SYSTEM;
123 	return 0;
124 }
125 
126 
127 int
128 pthread_attr_setscope(pthread_attr_t *attr, int contentionScope)
129 {
130 	if (attr == NULL)
131 		return EINVAL;
132 
133 	if (contentionScope != PTHREAD_SCOPE_SYSTEM)
134 		return ENOTSUP;
135 
136 	return 0;
137 }
138 
139 
140 int
141 pthread_attr_setschedparam(pthread_attr_t *attr,
142 	const struct sched_param *param)
143 {
144 	if (attr == NULL || param == NULL)
145 		return EINVAL;
146 
147 	(*attr)->sched_priority = param->sched_priority;
148 
149 	return 0;
150 }
151 
152 
153 int
154 pthread_attr_getschedparam(const pthread_attr_t *attr,
155 	struct sched_param *param)
156 {
157 	if (attr == NULL || param == NULL)
158 		return EINVAL;
159 
160 	param->sched_priority = (*attr)->sched_priority;
161 
162 	return 0;
163 }
164 
165