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