aboutsummaryrefslogtreecommitdiff
path: root/nptl/pthread_create.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2009-08-24 16:23:47 -0700
committerUlrich Drepper <drepper@redhat.com>2009-08-24 16:23:47 -0700
commitb42a214c1807dc596cf3647fc35a0eb42ccc7e68 (patch)
treed5eb10baefc9c3e7097220bb81ada99438fa7859 /nptl/pthread_create.c
parent9a1ea1525eb8e02ce20eb93d65dc880186731bf7 (diff)
downloadglibc-b42a214c1807dc596cf3647fc35a0eb42ccc7e68.zip
glibc-b42a214c1807dc596cf3647fc35a0eb42ccc7e68.tar.gz
glibc-b42a214c1807dc596cf3647fc35a0eb42ccc7e68.tar.bz2
Hint to kernel that thread stack memory can be removed.
Diffstat (limited to 'nptl/pthread_create.c')
-rw-r--r--nptl/pthread_create.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index c693979..89938b3 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -377,6 +377,19 @@ start_thread (void *arg)
}
#endif
+ /* Mark the memory of the stack as usable to the kernel. We free
+ everything except for the space used for the TCB itself. */
+ size_t pagesize_m1 = __getpagesize () - 1;
+#ifdef _STACK_GROWS_DOWN
+ char *sp = CURRENT_STACK_FRAME;
+ size_t freesize = (sp - (char *) pd->stackblock) & ~pagesize_m1;
+#else
+# error "to do"
+#endif
+ assert (freesize < pd->stackblock_size);
+ if (freesize > PTHREAD_STACK_MIN)
+ madvise (pd->stackblock, freesize - PTHREAD_STACK_MIN, MADV_DONTNEED);
+
/* If the thread is detached free the TCB. */
if (IS_DETACHED (pd))
/* Free the TCB. */