summaryrefslogtreecommitdiff
path: root/lib/libc_r/uthread/uthread_stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc_r/uthread/uthread_stack.c')
-rw-r--r--lib/libc_r/uthread/uthread_stack.c118
1 files changed, 0 insertions, 118 deletions
diff --git a/lib/libc_r/uthread/uthread_stack.c b/lib/libc_r/uthread/uthread_stack.c
deleted file mode 100644
index 6e359b970fb..00000000000
--- a/lib/libc_r/uthread/uthread_stack.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/* $OpenBSD: uthread_stack.c,v 1.7 2000/03/22 02:06:05 d Exp $ */
-/*
- * Copyright 1999, David Leonard. All rights reserved.
- * <insert BSD-style license&disclaimer>
- */
-
-/*
- * Thread stack allocation.
- *
- * If stack pointers grow down, towards the beginning of stack storage,
- * the first page of the storage is protected using mprotect() so as
- * to generate a SIGSEGV if a thread overflows its stack. Similarly,
- * for stacks that grow up, the last page of the storage is protected.
- */
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/user.h>
-#include <sys/mman.h>
-#include <pthread.h>
-#include <pthread_np.h>
-#include "pthread_private.h"
-
-struct stack *
-_thread_stack_alloc(base, size)
- void *base;
- size_t size;
-{
- struct stack *stack;
- int nbpg = getpagesize();
-
- /* Maintain a stack of default-sized stacks that we can re-use. */
- if (base == NULL && size == PTHREAD_STACK_DEFAULT) {
- if (pthread_mutex_lock(&_gc_mutex) != 0)
- PANIC("Cannot lock gc mutex");
-
- if ((stack = SLIST_FIRST(&_stackq)) != NULL) {
- SLIST_REMOVE_HEAD(&_stackq, qe);
- if (pthread_mutex_unlock(&_gc_mutex) != 0)
- PANIC("Cannot unlock gc mutex");
- return stack;
- }
- if (pthread_mutex_unlock(&_gc_mutex) != 0)
- PANIC("Cannot unlock gc mutex");
- }
-
- /* Allocate some storage to hold information about the stack: */
- stack = (struct stack *)malloc(sizeof (struct stack));
- if (stack == NULL)
- return NULL;
-
- if (base != NULL) {
- /* Use the user's storage */
- stack->base = base;
- stack->size = size;
- stack->redzone = NULL;
- stack->storage = NULL;
- return stack;
- }
-
- /* Allocate some storage for the stack, with some overhead: */
- stack->storage = malloc(size + nbpg * 2);
- if (stack->storage == NULL) {
- free(stack);
- return NULL;
- }
-
- /*
- * Compute the location of the red zone.
- * Use _BSD_PTRDIFF_T_ to convert the storage base pointer
- * into an integer so that page alignment can be done with
- * integer arithmetic.
- */
-#if defined(MACHINE_STACK_GROWS_UP)
- /* Red zone is the last page of the storage: */
- stack->redzone = (void *)(((_BSD_PTRDIFF_T_)stack->storage +
- size + nbpg - 1) & ~(nbpg - 1));
- stack->base = (caddr_t)stack->storage;
- stack->size = size;
-#else
- /* Red zone is the first page of the storage: */
- stack->redzone = (void *)(((_BSD_PTRDIFF_T_)stack->storage +
- nbpg - 1) & ~(nbpg - 1));
- stack->base = (caddr_t)stack->redzone + nbpg;
- stack->size = size;
-#endif
- if (mprotect(stack->redzone, nbpg, 0) == -1)
- PANIC("Cannot protect stack red zone");
-
- return stack;
-}
-
-void
-_thread_stack_free(stack)
- struct stack *stack;
-{
- int nbpg = getpagesize();
-
- /* Cache allocated stacks of default size: */
- if (stack->storage != NULL && stack->size == PTHREAD_STACK_DEFAULT)
- SLIST_INSERT_HEAD(&_stackq, stack, qe);
- else {
- /* Restore storage protection to what malloc gave us: */
- if (stack->redzone)
- mprotect(stack->redzone, nbpg,
- PROT_READ|PROT_WRITE);
-
- /* Free storage: */
- if (stack->storage)
- free(stack->storage);
-
- /* Free stack information storage: */
- free(stack);
- }
-}