summaryrefslogtreecommitdiffstats
path: root/lib/libkse/thread/thr_stack.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2003-09-14 22:39:44 +0000
committerdavidxu <davidxu@FreeBSD.org>2003-09-14 22:39:44 +0000
commitb622332e18b29fb3d634953210ec0be4db366373 (patch)
treee7ea22439446d401f0fb1dbd32800ea86c76308d /lib/libkse/thread/thr_stack.c
parent5b99feb20561244587f5f8e73a977ae420b42fdf (diff)
downloadFreeBSD-src-b622332e18b29fb3d634953210ec0be4db366373.zip
FreeBSD-src-b622332e18b29fb3d634953210ec0be4db366373.tar.gz
Respect POSIX specification, a value return from pthread_attr_getguardsize
should be a value past to pthread_attr_setguardsize, not a rounded up value. Also fix a stack size matching bug in thr_stack.c, now stack matching code uses number of pages but not bytes length to match stack size, so for example, size 512 bytes and size 513 bytes should both match 1 page stack size. Reviewed by: deischen
Diffstat (limited to 'lib/libkse/thread/thr_stack.c')
-rw-r--r--lib/libkse/thread/thr_stack.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/libkse/thread/thr_stack.c b/lib/libkse/thread/thr_stack.c
index 530e2b9..9714593 100644
--- a/lib/libkse/thread/thr_stack.c
+++ b/lib/libkse/thread/thr_stack.c
@@ -113,6 +113,19 @@ static LIST_HEAD(, stack) mstackq = LIST_HEAD_INITIALIZER(mstackq);
*/
static void *last_stack = NULL;
+/*
+ * Round size up to the nearest multiple of
+ * _thr_page_size.
+ */
+static inline size_t
+round_up(size_t size)
+{
+ if (size % _thr_page_size != 0)
+ size = ((size / _thr_page_size) + 1) *
+ _thr_page_size;
+ return size;
+}
+
int
_thr_stack_alloc(struct pthread_attr *attr)
{
@@ -122,9 +135,6 @@ _thr_stack_alloc(struct pthread_attr *attr)
size_t stacksize;
size_t guardsize;
- stacksize = attr->stacksize_attr;
- guardsize = attr->guardsize_attr;
-
/*
* Round up stack size to nearest multiple of _thr_page_size so
* that mmap() * will work. If the stack size is not an even
@@ -132,9 +142,9 @@ _thr_stack_alloc(struct pthread_attr *attr)
* unused space above the beginning of the stack, so the stack
* sits snugly against its guard.
*/
- if ((stacksize % _thr_page_size) != 0)
- stacksize = ((stacksize / _thr_page_size) + 1) *
- _thr_page_size;
+ stacksize = round_up(attr->stacksize_attr);
+ guardsize = round_up(attr->guardsize_attr);
+
attr->stackaddr_attr = NULL;
attr->flags &= ~THR_STACK_USER;
@@ -221,8 +231,8 @@ _thr_stack_free(struct pthread_attr *attr)
&& (attr->stackaddr_attr != NULL)) {
spare_stack = (attr->stackaddr_attr + attr->stacksize_attr
- sizeof(struct stack));
- spare_stack->stacksize = attr->stacksize_attr;
- spare_stack->guardsize = attr->guardsize_attr;
+ spare_stack->stacksize = round_up(attr->stacksize_attr);
+ spare_stack->guardsize = round_up(attr->guardsize_attr);
spare_stack->stackaddr = attr->stackaddr_attr;
if (spare_stack->stacksize == THR_STACK_DEFAULT &&
OpenPOWER on IntegriCloud