diff options
| author | Jason Evans <jasone@FreeBSD.org> | 1999-07-05 00:35:19 +0000 |
|---|---|---|
| committer | Jason Evans <jasone@FreeBSD.org> | 1999-07-05 00:35:19 +0000 |
| commit | ecaa6e8c9e261638b1a72bdfd9c02257ec8c2995 (patch) | |
| tree | 4c280d3e26867313882a75e5a5fc1e17cd9323be /lib/libpthread/thread/thr_gc.c | |
| parent | 9539436c36cf3d5c1286e0f732d923db57000428 (diff) | |
Notes
Diffstat (limited to 'lib/libpthread/thread/thr_gc.c')
| -rw-r--r-- | lib/libpthread/thread/thr_gc.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/lib/libpthread/thread/thr_gc.c b/lib/libpthread/thread/thr_gc.c index e29e29bddf47..a8e05ea91752 100644 --- a/lib/libpthread/thread/thr_gc.c +++ b/lib/libpthread/thread/thr_gc.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: uthread_gc.c,v 1.3 1999/03/23 05:07:55 jb Exp $ + * $Id: uthread_gc.c,v 1.4 1999/06/20 08:28:25 jb Exp $ * * Garbage collector thread. Frees memory allocated for dead threads. * @@ -38,6 +38,10 @@ #include <time.h> #include <unistd.h> #include <sys/types.h> +#ifdef _PTHREAD_GSTACK +#include <sys/types.h> +#include <sys/mman.h> +#endif #include <pthread.h> #include "pthread_private.h" @@ -132,11 +136,23 @@ _thread_gc(pthread_addr_t arg) */ if (pthread->attr.stackaddr_attr == NULL && pthread->stack != NULL) { +#ifdef _PTHREAD_GSTACK + if (pthread->attr.stacksize_attr == PTHREAD_STACK_DEFAULT) { + /* Default-size stack. Cache it: */ + struct stack * spare_stack = (pthread->stack + PTHREAD_STACK_DEFAULT + - sizeof(struct stack)); + SLIST_INSERT_HEAD(&_stackq, spare_stack, qe); + } else { + /* Non-standard stack size. free() it outside the locks: */ + p_stack = pthread->stack; + } +#else /* * Point to the stack that must * be freed outside the locks: */ p_stack = pthread->stack; +#endif } /* @@ -156,12 +172,24 @@ _thread_gc(pthread_addr_t arg) */ if (pthread->attr.stackaddr_attr == NULL && pthread->stack != NULL) { +#ifdef _PTHREAD_GSTACK + if (pthread->attr.stacksize_attr == PTHREAD_STACK_DEFAULT) { + /* Default-size stack. Cache it: */ + struct stack * spare_stack = (pthread->stack + PTHREAD_STACK_DEFAULT + - sizeof(struct stack)); + SLIST_INSERT_HEAD(&_stackq, spare_stack, qe); + } else { + /* Non-standard stack size. free() it outside the locks: */ + p_stack = pthread->stack; + } +#else /* * Point to the stack that must * be freed outside the locks: */ p_stack = pthread->stack; - +#endif + /* * NULL the stack pointer now * that the memory has been freed: |
