From 5ab9f5892826bb1c4e45b4dcb2692d4eb2f813f1 Mon Sep 17 00:00:00 2001 From: rpj Date: Sun, 3 Jan 1999 16:41:14 +0000 Subject: Mon Jan 4 11:23:40 1999 Ross Johnson * all: No code changes, just cleanup. - remove #if 0 /* Pre Bossom */ enclosed code. - Remove some redundant #includes. * pthread.h: Update implemented/unimplemented routines list. * Tag the bossom merge branch getting ready to merge back to main trunk. --- private.c | 135 -------------------------------------------------------------- 1 file changed, 135 deletions(-) (limited to 'private.c') diff --git a/private.c b/private.c index d27e4bf..72fca03 100644 --- a/private.c +++ b/private.c @@ -417,138 +417,3 @@ _pthread_callUserDestroyRoutines (pthread_t thread) /* */ - -#if 0 /* Pre Bossom */ - -/* Thread ID management. - --------------------- - - We started by simply mapping the Win32 thread handle directly to - pthread_t. However, in order to process pthread_join()'s, we need - to be able to keep our POSIX thread ID (pthread_t) around after the - Win32 thread has terminated. Win32 may reuse the Win32 handle during that - time, which will conflict. - - The pthread_t value is now actually the pointer to a thread struct: - - typedef struct _pthread * pthread_t; - - which amongst other things stores the Win32 thread handle: - - struct _pthread { - HANDLE win32handle; - int ptstatus; - ... - }; - - So now whereever we need to use the Win32 handle it can be accessed - as: - - pthread_t T = pthread_this(); - HANDLE H; - - H = T->win32handle; - - // or (which is NOT preferred, let the compiler optimise to this). - - H = (HANDLE) *T; - - - POSIX Threads Table - ------------------- - - Having the thread ID as a pointer to the thread struct itself - avoids the need to search the threads table in all but the initial - occasion where we create the thread. - - Initially we used a hash function to select a free thread struct - from the table, possibly needing a walk through the table if the - hash collided with an already in-use thread. - - The scheme used now is more efficient and is done as follows: - - We use two tables and two counters: - - struct _pthread _pthread_virgins[PTHREAD_THREADS_MAX]; - pthread_t _pthread_reuse[PTHREAD_THREADS_MAX]; - - int _pthread_virgin_next = 0; - int _pthread_reuse_top = -1; - - The counter _pthread_virgin_next is an index into _pthread_virgins[], - which can be thought of as a list, and _pthread_reuse_top is an - index into _pthread_reuse[], which can be thought of as a LIFO stack. - - Once taken from _pthread_virgins[], used and freed threads are only - ever pushed back onto _pthread_reuse[]. - - */ - -int -_pthread_new_thread(pthread_t * thread) -{ - pthread_t new_thread; - - if (_pthread_reuse_top >= 0) - { - new_thread = _pthread_reuse[_pthread_reuse_top--]; - } - else - { - if (_pthread_virgin_next < PTHREAD_THREADS_MAX) - { - new_thread = (pthread_t) &_pthread_virgins[_pthread_virgin_next++]; - } - else - { - return EAGAIN; - } - } - - new_thread->win32handle = (HANDLE) NULL; - new_thread->ptstatus = _PTHREAD_NEW; - pthread_attr_init(&(new_thread->attr)); - new_thread->joinvalueptr = NULL; - new_thread->cancelstate = PTHREAD_CANCEL_ENABLE; - new_thread->canceltype = PTHREAD_CANCEL_DEFERRED; - new_thread->cancel_pending = FALSE; - new_thread->cleanupstack = NULL; - new_thread->forkpreparestack = NULL; - new_thread->forkparentstack = NULL; - new_thread->forkchildstack = NULL; - - *thread = new_thread; - _pthread_threads_count++; - - return 0; -} - -int -_pthread_delete_thread(_pthread_t * thread) -{ - /* We don't check that the thread has been properly cleaned up, so - it had better be done already. */ - - /* Release any keys */ - - _pthread_destructor_run_all(); - - /* Remove the thread entry if necessary. */ - - if (thread != NULL - && thread->ptstatus == _PTHREAD_EXITED) - { - pthread_attr_destroy(&(thread->attr)); - thread->win32handle = (HANDLE) NULL; - thread->ptstatus = _PTHREAD_REUSE; - - _pthread_reuse[++_pthread_reuse_top] = thread; - _pthread_threads_count--; - - return 0; - } - - return EINVAL; -} - -#endif /* Pre Bossom */ -- cgit v1.2.3