diff options
Diffstat (limited to 'linuxthreads')
-rw-r--r-- | linuxthreads/ChangeLog | 5 | ||||
-rw-r--r-- | linuxthreads/manager.c | 27 |
2 files changed, 18 insertions, 14 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 1daf1bc31c..69426bfb7c 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,8 @@ +1998-06-24 Ulrich Drepper <drepper@cygnus.com> + + * manager.c (pthread_free): Undo patch from 980430. + Reported by David Wragg <dpw@doc.ic.ac.uk>. + 1998-06-09 15:07 Ulrich Drepper <drepper@cygnus.com> * manager.c: Define __pthread_manager_adjust_prio and use it to diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index c9625327c1..ac78d6e4ce 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -35,7 +35,11 @@ /* Array of active threads. Entry 0 is reserved for the initial thread. */ struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] = -{ { 0, &__pthread_initial_thread}, /* All NULLs */ }; +{ { 0, &__pthread_initial_thread, 0}, /* All NULLs */ }; + +/* Indicate whether at least one thread has a user-defined stack (if 1), + or if all threads have stacks supplied by LinuxThreads (if 0). */ +int __pthread_nonstandard_stacks; /* Mapping from stack segment to thread descriptor. */ /* Stack segment numbers are also indices into the __pthread_handles array. */ @@ -181,6 +185,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, size_t sseg; int pid; pthread_descr new_thread; + char * new_thread_bottom; pthread_t new_thread_id; void *guardaddr = NULL; @@ -195,6 +200,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, if (attr == NULL || !attr->stackaddr_set) { new_thread = thread_segment(sseg); + new_thread_bottom = (char *) new_thread - STACK_SIZE; /* Allocate space for stack and thread descriptor. */ if (mmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE), INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, @@ -219,7 +225,9 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, } else { - new_thread = (pthread_descr) attr->stackaddr - 1; + new_thread = (pthread_descr) ((long) attr->stackaddr + & -sizeof(void *)) - 1; + new_thread_bottom = (char *) attr->stackaddr - attr->stacksize; break; } } @@ -258,6 +266,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, /* Initialize the thread handle */ __pthread_handles[sseg].h_spinlock = 0; /* should already be 0 */ __pthread_handles[sseg].h_descr = new_thread; + __pthread_handles[sseg].h_bottom = new_thread_bottom; /* Determine scheduling parameters for the thread */ new_thread->p_start_args.schedpolicy = -1; if (attr != NULL) { @@ -318,22 +327,12 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, static void pthread_free(pthread_descr th) { pthread_handle handle; - pthread_descr t; - - /* Check that the thread th is still there -- pthread_reap_children - might have deallocated it already */ - t = __pthread_main_thread; - do { - if (t == th) break; - t = t->p_nextlive; - } while (t != __pthread_main_thread); - if (t != th) return; - ASSERT(th->p_exited); /* Make the handle invalid */ handle = thread_handle(th->p_tid); acquire(&handle->h_spinlock); handle->h_descr = NULL; + handle->h_bottom = (char *)(-1L); release(&handle->h_spinlock); /* If initial thread, nothing to free */ if (th == &__pthread_initial_thread) return; @@ -481,7 +480,7 @@ void __pthread_manager_adjust_prio(int thread_prio) if (thread_prio <= __pthread_manager_thread.p_priority) return; param.sched_priority = - thread_prio < __sched_get_priority_max(SCHED_FIFO) + thread_prio < __sched_get_priority_max(SCHED_FIFO) ? thread_prio + 1 : thread_prio; __sched_setscheduler(__pthread_manager_thread.p_pid, SCHED_FIFO, ¶m); __pthread_manager_thread.p_priority = thread_prio; |