pthread_attr.cpp revision 50af69e8f326b2762a44d5fea2b118e7616e5d20
13e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes/* 23e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * Copyright (C) 2008 The Android Open Source Project 33e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * All rights reserved. 43e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * 53e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * Redistribution and use in source and binary forms, with or without 63e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * modification, are permitted provided that the following conditions 73e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * are met: 83e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * * Redistributions of source code must retain the above copyright 93e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * notice, this list of conditions and the following disclaimer. 103e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * * Redistributions in binary form must reproduce the above copyright 113e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * notice, this list of conditions and the following disclaimer in 123e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * the documentation and/or other materials provided with the 133e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * distribution. 143e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * 153e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 163e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 173e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 183e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 193e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 203e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 213e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 223e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 233e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 243e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 253e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 263e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes * SUCH DAMAGE. 273e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes */ 283e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 293e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes#include <pthread.h> 303e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 313e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes#include "pthread_internal.h" 323e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 333e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_init(pthread_attr_t* attr) { 346d339182070b035ca94f19bc37c94f4d9813c374Elliott Hughes attr->flags = 0; 356d339182070b035ca94f19bc37c94f4d9813c374Elliott Hughes attr->stack_base = NULL; 3650af69e8f326b2762a44d5fea2b118e7616e5d20Brian Carlstrom attr->stack_size = PTHREAD_STACK_SIZE_DEFAULT; 376d339182070b035ca94f19bc37c94f4d9813c374Elliott Hughes attr->guard_size = PAGE_SIZE; 386d339182070b035ca94f19bc37c94f4d9813c374Elliott Hughes attr->sched_policy = SCHED_NORMAL; 396d339182070b035ca94f19bc37c94f4d9813c374Elliott Hughes attr->sched_priority = 0; 403e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 413e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 423e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 433e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_destroy(pthread_attr_t* attr) { 443e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes memset(attr, 0x42, sizeof(pthread_attr_t)); 453e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 463e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 473e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 483e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setdetachstate(pthread_attr_t* attr, int state) { 493e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (state == PTHREAD_CREATE_DETACHED) { 503e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->flags |= PTHREAD_ATTR_FLAG_DETACHED; 513e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } else if (state == PTHREAD_CREATE_JOINABLE) { 523e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->flags &= ~PTHREAD_ATTR_FLAG_DETACHED; 533e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } else { 543e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 553e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 563e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 573e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 583e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 593e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getdetachstate(pthread_attr_t const* attr, int* state) { 603e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *state = (attr->flags & PTHREAD_ATTR_FLAG_DETACHED) ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE; 613e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 623e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 633e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 643e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy) { 653e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->sched_policy = policy; 663e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 673e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 683e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 693e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getschedpolicy(pthread_attr_t const* attr, int* policy) { 703e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *policy = attr->sched_policy; 713e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 723e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 733e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 743e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setschedparam(pthread_attr_t * attr, struct sched_param const* param) { 753e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->sched_priority = param->sched_priority; 763e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 773e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 783e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 793e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getschedparam(pthread_attr_t const* attr, struct sched_param* param) { 803e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes param->sched_priority = attr->sched_priority; 813e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 823e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 833e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 843e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setstacksize(pthread_attr_t* attr, size_t stack_size) { 85b95cf0d23a1db3b7c37bd98b0c86196796c9b029Elliott Hughes if (stack_size < PTHREAD_STACK_MIN) { 863e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 873e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 883e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->stack_size = stack_size; 893e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 903e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 913e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 923e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getstacksize(pthread_attr_t const* attr, size_t* stack_size) { 933e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_size = attr->stack_size; 943e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 953e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 963e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 973e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setstackaddr(pthread_attr_t*, void*) { 983e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // This was removed from POSIX.1-2008, and is not implemented on bionic. 993e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // Needed for ABI compatibility with the NDK. 1003e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return ENOSYS; 1013e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1023e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1033e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getstackaddr(pthread_attr_t const* attr, void** stack_addr) { 1043e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // This was removed from POSIX.1-2008. 1053e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // Needed for ABI compatibility with the NDK. 1063e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_addr = (char*)attr->stack_base + attr->stack_size; 1073e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1083e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1093e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1103e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setstack(pthread_attr_t* attr, void* stack_base, size_t stack_size) { 1113e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if ((stack_size & (PAGE_SIZE - 1) || stack_size < PTHREAD_STACK_MIN)) { 1123e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1133e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1143e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if ((uint32_t)stack_base & (PAGE_SIZE - 1)) { 1153e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1163e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1173e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->stack_base = stack_base; 1183e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->stack_size = stack_size; 1193e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1203e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1213e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1223e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getstack(pthread_attr_t const* attr, void** stack_base, size_t* stack_size) { 1233e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_base = attr->stack_base; 1243e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_size = attr->stack_size; 1253e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1263e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1273e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1283e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setguardsize(pthread_attr_t* attr, size_t guard_size) { 1293e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->guard_size = guard_size; 1303e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1313e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1323e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1333e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getguardsize(pthread_attr_t const* attr, size_t* guard_size) { 1343e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *guard_size = attr->guard_size; 1353e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1363e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1373e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1383e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_getattr_np(pthread_t thid, pthread_attr_t* attr) { 1393e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes pthread_internal_t* thread = (pthread_internal_t*) thid; 1403e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *attr = thread->attr; 1413e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1423e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1433e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1443e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setscope(pthread_attr_t* , int scope) { 1453e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (scope == PTHREAD_SCOPE_SYSTEM) { 1463e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1473e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1483e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (scope == PTHREAD_SCOPE_PROCESS) { 1493e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return ENOTSUP; 1503e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1513e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1523e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1533e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1543e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getscope(pthread_attr_t const*) { 1553e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return PTHREAD_SCOPE_SYSTEM; 1563e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 157