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