source: trunk/sys/libpthread/pthread_attr.c @ 397

Last change on this file since 397 was 1, checked in by alain, 8 years ago

First import

File size: 5.6 KB
Line 
1/*
2 * pthread_attr.c - pthread attributes related functions
3 *
4 * Copyright (c) 2008,2009,2010,2011,2012 Ghassan Almaless
5 * Copyright (c) 2011,2012 UPMC Sorbonne Universites
6 *
7 * This file is part of ALMOS.
8 *
9 * ALMOS is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2.0 of the License.
12 *
13 * ALMOS is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with ALMOS; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include <errno.h>
24#include <sched.h>
25#include <cpu-syscall.h>
26
27#include <pthread.h>
28
29#define PT_DEFAULT_ATTRS (PT_ATTR_AUTO_NXTT | PT_ATTR_AUTO_MGRT | PT_ATTR_MEM_PRIO)
30
31int pthread_attr_init (pthread_attr_t *attr)
32{
33        attr->flags                      = PT_DEFAULT_ATTRS;
34        attr->sched_policy               = SCHED_RR;
35        attr->inheritsched               = PTHREAD_EXPLICIT_SCHED;
36        attr->stack_addr                 = NULL;
37        attr->stack_size                 = 0;//PTHREAD_STACK_SIZE;
38        attr->sched_param.sched_priority = -1;
39        attr->cpu_gid                    = -1;
40        return 0;
41}
42
43int pthread_attr_destroy (pthread_attr_t *attr)
44{
45        return 0;
46}
47
48int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
49{
50        if(attr == NULL)
51                return EINVAL;
52 
53        attr->flags = (detachstate == PTHREAD_CREATE_DETACHED) ? __PT_ATTR_DETACH : attr->flags;
54        return 0;
55}
56
57int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate)
58{
59        if((attr == NULL) || (detachstate == NULL))
60                return EINVAL;
61 
62        *detachstate = (attr->flags & __PT_ATTR_DETACH) ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE;
63        return 0;
64}
65
66int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
67{
68        if((attr = NULL) || (policy < 0) || (policy > 2))
69                return EINVAL;
70
71        attr->sched_policy = policy;
72        return 0;
73}
74
75int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)
76{
77        if((attr = NULL) || (policy == NULL))
78                return EINVAL;
79
80        *policy = attr->sched_policy;
81        return 0;
82}
83
84int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param)
85{
86        if((attr = NULL) || (param == NULL))
87                return EINVAL;
88 
89        attr->sched_param = *param;
90        return 0;
91}
92
93int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param)
94{
95        if((attr = NULL) || (param == NULL))
96                return EINVAL;
97
98        *param = attr->sched_param;
99        return 0;
100}
101
102int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit)
103{
104        if((attr == NULL) || (inherit != PTHREAD_EXPLICIT_SCHED))
105                return EINVAL;
106 
107        return 0;
108}
109
110int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit)
111{
112        if((attr == NULL) || (inherit == NULL))
113                return EINVAL;
114
115        *inherit = PTHREAD_EXPLICIT_SCHED;
116        return 0;
117}
118
119int pthread_attr_setscope(pthread_attr_t *attr, int scope)
120{
121        if((attr == NULL) || (scope != PTHREAD_SCOPE_SYSTEM))
122                return EINVAL;
123
124        return 0;
125}
126
127int pthread_attr_getscope(const pthread_attr_t *attr, int *scope)
128{
129        if((attr == NULL) || (scope == NULL))
130                return 0;
131
132        *scope = PTHREAD_SCOPE_SYSTEM;
133        return 0;
134}
135
136int pthread_attr_setstacksize(pthread_attr_t *attr, unsigned int stacksize)
137{
138        if((attr == NULL) || (stacksize < PTHREAD_STACK_MIN))
139                return EINVAL;
140
141        attr->stack_size = stacksize;
142        return 0;
143}
144
145int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize)
146{
147        if((attr == NULL) || (stacksize == NULL))
148                return EINVAL;
149
150        *stacksize = attr->stack_size;
151        return 0;
152}
153
154int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize)
155{
156        if((attr == NULL)                    ||
157           ((uint32_t)stackaddr & 0x3)       || 
158           (stacksize < PTHREAD_STACK_MIN))
159                return EINVAL;
160
161        attr->stack_addr = stackaddr;
162        attr->stack_size = stacksize;
163        return 0;
164}
165
166int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize)
167{
168        if((attr == NULL)                  ||
169           (stackaddr == NULL)             || 
170           (stacksize == NULL))
171                return EINVAL;
172
173        *stackaddr = attr->stack_addr;
174        *stacksize = attr->stack_size;
175        return 0;
176}
177
178int pthread_attr_setflags_np(pthread_attr_t *attr, unsigned int flags, unsigned int *old)
179{
180        if(attr == NULL)
181                return EINVAL;
182
183        if(old != NULL)
184                *old = attr->flags;
185
186        attr->flags = flags;
187        return 0;
188}
189
190int pthread_attr_setcpuid_np(pthread_attr_t * attr, int cpu_id, int *old_cpu_id)
191{
192        if(attr == NULL)
193                return EINVAL;
194
195        if(old_cpu_id)
196                *old_cpu_id = attr->cpu_gid;
197
198        attr->cpu_gid = cpu_id;
199        return 0;
200}
201
202int pthread_attr_getcpuid_np(int *cpu_id)
203{
204        if(cpu_id == NULL) return EINVAL;
205
206        *cpu_id = (int)(((__pthread_tls_t*)cpu_get_tls())->attr.cpu_gid);
207        return 0;
208}
209
210int pthread_attr_setforkinfo_np(int flags)
211{
212        register __pthread_tls_t *tls;
213
214        tls = cpu_get_tls();
215        __pthread_tls_set(tls,__PT_TLS_FORK_FLAGS,flags);
216        return 0;
217}
218
219int pthread_attr_setforkcpuid_np(int cpu_id)
220{
221        register __pthread_tls_t *tls;
222        register uint_t flags;
223
224        tls    = cpu_get_tls();
225        flags  = __pthread_tls_get(tls,__PT_TLS_FORK_FLAGS);
226        flags |= PT_FORK_TARGET_CPU;
227
228        __pthread_tls_set(tls,__PT_TLS_FORK_FLAGS,flags);
229        __pthread_tls_set(tls,__PT_TLS_FORK_CPUID,cpu_id);
230        return 0;
231}
232
233int pthread_attr_getforkcpuid_np(int *cpu_id)
234{
235        register __pthread_tls_t *tls;
236        register uint_t flags;
237
238        if(cpu_id == NULL) 
239                return EINVAL;
240
241        tls   = cpu_get_tls();
242        flags = __pthread_tls_get(tls,__PT_TLS_FORK_FLAGS);
243
244        if(flags & PT_FORK_TARGET_CPU)
245                *cpu_id = (int)__pthread_tls_get(tls,__PT_TLS_FORK_CPUID);
246        else
247                *cpu_id = -1;
248
249        return 0;
250}
Note: See TracBrowser for help on using the repository browser.