From f7cc12b389748853b43a2a4fa42b47ea2f812e61 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 9 May 2008 01:36:49 +0000 Subject: [PATCH] Implemented pthread_attr_{g,s}etstacksize(). Also added commented-out prototypes for the missing pthread_attr_*() functions. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25390 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/posix/pthread.h | 41 +++++++++++++++++++ src/system/libroot/posix/pthread/Jamfile | 1 + src/system/libroot/posix/pthread/pthread.c | 21 ++++++++-- .../libroot/posix/pthread/pthread_attr.c | 41 +++++++++++++++++-- .../libroot/posix/pthread/pthread_private.h | 1 + 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/headers/posix/pthread.h b/headers/posix/pthread.h index 787c459769..4e34de2952 100644 --- a/headers/posix/pthread.h +++ b/headers/posix/pthread.h @@ -170,6 +170,47 @@ extern int pthread_attr_init(pthread_attr_t *attr); extern int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); extern int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); +extern int pthread_attr_getstacksize(const pthread_attr_t *attr, + size_t *stacksize); +extern int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); + +#if 0 /* Unimplemented attribute functions: */ + +// mandatory! +extern int pthread_attr_getschedparam(const pthread_attr_t *attr, + struct sched_param *param); +extern int pthread_attr_setschedparam(pthread_attr_t *attr, + const struct sched_param *param); + +// [TPS] +extern int pthread_attr_getinheritsched(const pthread_attr_t *attr, + int *inheritsched); +extern int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched); + +extern int pthread_attr_getschedpolicy(const pthread_attr_t *attr, + int *policy); +extern int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); +extern int pthread_attr_getscope(const pthread_attr_t *attr, + int *contentionscope); +extern int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope); + +// [XSI] +extern int pthread_attr_getguardsize(const pthread_attr_t *attr, + size_t *guardsize); +extern int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); + +// [TSA] +extern int pthread_attr_getstackaddr(const pthread_attr_t *attr, + void **stackaddr); +extern int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr); + +// [TSA TSS] +extern int pthread_attr_getstack(const pthread_attr_t *attr, + void **stackaddr, size_t *stacksize); +extern int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); + +#endif /* 0 */ + /* thread functions */ extern int pthread_create(pthread_t *thread, const pthread_attr_t *attr, diff --git a/src/system/libroot/posix/pthread/Jamfile b/src/system/libroot/posix/pthread/Jamfile index b8e9fb7103..680306a5f2 100644 --- a/src/system/libroot/posix/pthread/Jamfile +++ b/src/system/libroot/posix/pthread/Jamfile @@ -1,5 +1,6 @@ SubDir HAIKU_TOP src system libroot posix pthread ; +UsePrivateKernelHeaders ; UsePrivateHeaders libroot ; MergeObject posix_pthread.o : diff --git a/src/system/libroot/posix/pthread/pthread.c b/src/system/libroot/posix/pthread/pthread.c index 31e6000f18..1a3b7c3774 100644 --- a/src/system/libroot/posix/pthread/pthread.c +++ b/src/system/libroot/posix/pthread/pthread.c @@ -11,10 +11,15 @@ #include +#include +#include +#include + static const pthread_attr pthread_attr_default = { PTHREAD_CREATE_JOINABLE, - B_NORMAL_PRIORITY + B_NORMAL_PRIORITY, + USER_STACK_SIZE }; @@ -60,7 +65,7 @@ pthread_destroy_thread(void *data) static int32 -pthread_thread_entry(void *_thread) +pthread_thread_entry(thread_func _unused, void *_thread) { struct pthread_thread *thread = (struct pthread_thread *)_thread; @@ -84,6 +89,7 @@ pthread_create(pthread_t *_thread, const pthread_attr_t *_attr, const pthread_attr *attr = NULL; struct pthread_thread *thread; thread_id threadID; + struct thread_creation_attributes attributes; if (_thread == NULL) return B_BAD_VALUE; @@ -109,8 +115,15 @@ pthread_create(pthread_t *_thread, const pthread_attr_t *_attr, sPthreadSlot = tls_allocate(); } - threadID = spawn_thread(pthread_thread_entry, "pthread func", - attr->sched_priority, thread); + attributes.entry = pthread_thread_entry; + attributes.name = "pthread func"; + attributes.priority = attr->sched_priority; + attributes.args1 = thread; + attributes.args2 = NULL; + attributes.stack_address = NULL; + attributes.stack_size = attr->stack_size; + + threadID = _kern_spawn_thread(&attributes); if (threadID < B_OK) { // stupid error code (EAGAIN) but demanded by POSIX return B_WOULD_BLOCK; diff --git a/src/system/libroot/posix/pthread/pthread_attr.c b/src/system/libroot/posix/pthread/pthread_attr.c index 7a17ca8114..6fbb0693d9 100644 --- a/src/system/libroot/posix/pthread/pthread_attr.c +++ b/src/system/libroot/posix/pthread/pthread_attr.c @@ -1,14 +1,16 @@ /* -** Copyright 2006, Jérôme Duval. All rights reserved. -** Distributed under the terms of the MIT License. -*/ - + * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. + * Copyright 2006, Jérôme Duval. All rights reserved. + * Distributed under the terms of the MIT License. + */ #include #include "pthread_private.h" #include +#include + int pthread_attr_init(pthread_attr_t *_attr) @@ -24,6 +26,7 @@ pthread_attr_init(pthread_attr_t *_attr) attr->detach_state = PTHREAD_CREATE_JOINABLE; attr->sched_priority = B_NORMAL_PRIORITY; + attr->stack_size = USER_STACK_SIZE; *_attr = attr; return B_OK; @@ -75,3 +78,33 @@ pthread_attr_setdetachstate(pthread_attr_t *_attr, int state) return B_OK; } + +int +pthread_attr_getstacksize(const pthread_attr_t *_attr, size_t *stacksize) +{ + pthread_attr *attr; + + if (_attr == NULL || (attr = *_attr) == NULL || stacksize == NULL) + return B_BAD_VALUE; + + *stacksize = attr->stack_size; + + return 0; +} + + +int +pthread_attr_setstacksize(pthread_attr_t *_attr, size_t stacksize) +{ + pthread_attr *attr; + + if (_attr == NULL || (attr = *_attr) == NULL) + return B_BAD_VALUE; + + if (stacksize < MIN_USER_STACK_SIZE || stacksize > MAX_USER_STACK_SIZE) + return B_BAD_VALUE; + + attr->stack_size = stacksize; + + return 0; +} diff --git a/src/system/libroot/posix/pthread/pthread_private.h b/src/system/libroot/posix/pthread/pthread_private.h index d8b8bee323..7b771732fa 100644 --- a/src/system/libroot/posix/pthread/pthread_private.h +++ b/src/system/libroot/posix/pthread/pthread_private.h @@ -44,6 +44,7 @@ typedef struct _pthread_mutex { typedef struct _pthread_attr { int32 detach_state; int32 sched_priority; + size_t stack_size; } pthread_attr; typedef void (*pthread_key_destructor)(void *data);