pthread_attr.cpp revision 3e898476c7230b60a0f76968e64ff25f475b48c0
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 Hughes#define DEFAULT_STACKSIZE (1024 * 1024) 343e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 353e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesconst pthread_attr_t gDefaultPthreadAttr = { 363e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes .flags = 0, 373e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes .stack_base = NULL, 383e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes .stack_size = DEFAULT_STACKSIZE, 393e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes .guard_size = PAGE_SIZE, 403e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes .sched_policy = SCHED_NORMAL, 413e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes .sched_priority = 0 423e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes}; 433e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 443e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_init(pthread_attr_t* attr) { 453e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *attr = gDefaultPthreadAttr; 463e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 473e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 483e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 493e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_destroy(pthread_attr_t* attr) { 503e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes memset(attr, 0x42, sizeof(pthread_attr_t)); 513e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 523e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 533e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 543e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setdetachstate(pthread_attr_t* attr, int state) { 553e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (state == PTHREAD_CREATE_DETACHED) { 563e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->flags |= PTHREAD_ATTR_FLAG_DETACHED; 573e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } else if (state == PTHREAD_CREATE_JOINABLE) { 583e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->flags &= ~PTHREAD_ATTR_FLAG_DETACHED; 593e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } else { 603e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 613e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 623e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 633e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 643e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 653e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getdetachstate(pthread_attr_t const* attr, int* state) { 663e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *state = (attr->flags & PTHREAD_ATTR_FLAG_DETACHED) ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE; 673e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 683e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 693e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 703e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy) { 713e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->sched_policy = policy; 723e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 733e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 743e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 753e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getschedpolicy(pthread_attr_t const* attr, int* policy) { 763e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *policy = attr->sched_policy; 773e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 783e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 793e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 803e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setschedparam(pthread_attr_t * attr, struct sched_param const* param) { 813e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->sched_priority = param->sched_priority; 823e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 833e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 843e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 853e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getschedparam(pthread_attr_t const* attr, struct sched_param* param) { 863e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes param->sched_priority = attr->sched_priority; 873e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 883e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 893e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 903e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setstacksize(pthread_attr_t* attr, size_t stack_size) { 913e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if ((stack_size & (PAGE_SIZE - 1) || stack_size < PTHREAD_STACK_MIN)) { 923e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 933e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 943e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->stack_size = stack_size; 953e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 963e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 973e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 983e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getstacksize(pthread_attr_t const* attr, size_t* stack_size) { 993e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_size = attr->stack_size; 1003e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1013e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1023e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1033e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setstackaddr(pthread_attr_t*, void*) { 1043e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // This was removed from POSIX.1-2008, and is not implemented on bionic. 1053e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // Needed for ABI compatibility with the NDK. 1063e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return ENOSYS; 1073e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1083e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1093e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getstackaddr(pthread_attr_t const* attr, void** stack_addr) { 1103e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // This was removed from POSIX.1-2008. 1113e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes // Needed for ABI compatibility with the NDK. 1123e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_addr = (char*)attr->stack_base + attr->stack_size; 1133e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1143e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1153e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1163e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setstack(pthread_attr_t* attr, void* stack_base, size_t stack_size) { 1173e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if ((stack_size & (PAGE_SIZE - 1) || stack_size < PTHREAD_STACK_MIN)) { 1183e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1193e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1203e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if ((uint32_t)stack_base & (PAGE_SIZE - 1)) { 1213e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1223e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1233e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->stack_base = stack_base; 1243e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->stack_size = stack_size; 1253e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1263e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1273e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1283e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getstack(pthread_attr_t const* attr, void** stack_base, size_t* stack_size) { 1293e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_base = attr->stack_base; 1303e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *stack_size = attr->stack_size; 1313e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1323e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1333e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1343e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setguardsize(pthread_attr_t* attr, size_t guard_size) { 1353e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (guard_size & (PAGE_SIZE - 1) || guard_size < PAGE_SIZE) { 1363e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1373e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1383e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes attr->guard_size = guard_size; 1393e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1403e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1413e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1423e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getguardsize(pthread_attr_t const* attr, size_t* guard_size) { 1433e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *guard_size = attr->guard_size; 1443e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1453e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1463e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1473e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_getattr_np(pthread_t thid, pthread_attr_t* attr) { 1483e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes pthread_internal_t* thread = (pthread_internal_t*) thid; 1493e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes *attr = thread->attr; 1503e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1513e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1523e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1533e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_setscope(pthread_attr_t* , int scope) { 1543e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (scope == PTHREAD_SCOPE_SYSTEM) { 1553e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return 0; 1563e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1573e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes if (scope == PTHREAD_SCOPE_PROCESS) { 1583e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return ENOTSUP; 1593e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes } 1603e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return EINVAL; 1613e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 1623e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes 1633e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughesint pthread_attr_getscope(pthread_attr_t const*) { 1643e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes return PTHREAD_SCOPE_SYSTEM; 1653e898476c7230b60a0f76968e64ff25f475b48c0Elliott Hughes} 166