From e2fd6e2de322cc12d9153da548ab76379049c11c Mon Sep 17 00:00:00 2001 From: rpj Date: Tue, 25 Jul 2000 16:14:23 +0000 Subject: 2000-07-25 Ross Johnson * sched.c (sched_get_priority_max): Handle different WinCE and Win32 priority values together. (sched_get_priority_min): Ditto. - Tristan Savatier * create.c (pthread_create): Force new threads to wait until pthread_create has the new thread's handle; we also retain a local copy of the handle for internal use until pthread_create returns. * private.c (_pthread_threadStart): Initialise ei[]. (_pthread_threadStart): When beginthread is used to start the thread, force waiting until the creator thread had the thread handle. * cancel.c (_pthread_cancel_thread): Include context switch code for defined(_X86_) environments in addition to _M_IX86. * rwlock.c (pthread_rwlock_destroy): Assignment changed to avoid compiler warning. * private.c (_pthread_get_exception_services_code): Cast NULL return value to avoid compiler warning. * cleanup.c (pthread_pop_cleanup): Initialise "cleanup" variable to avoid compiler warnings. * misc.c (_pthread_new): Change "new" variable to "t" to avoid confusion with the C++ keyword of the same name. * condvar.c (cond_wait_cleanup): Initialise lastWaiter variable. (cond_timedwait): Remove unused local variables. to avoid compiler warnings. * dll.c (dllMain): Remove 2000-07-21 change - problem appears to be in pthread_create(). 2000-07-22 Ross Johnson * tsd.c (pthread_key_create): If a destructor was given and the pthread_mutex_init failed, then would try to reference a NULL pointer (*key); eliminate this section of code by using a dynamically initialised mutex (PTHREAD_MUTEX_INITIALIZER). * tsd.c (pthread_setspecific): Return an error if unable to set the value; simplify cryptic conditional. * tsd.c (pthread_key_delete): Locking threadsLock relied on mutex_lock returning an error if the key has no destructor. ThreadsLock is only initialised if the key has a destructor. Making this mutex a static could reduce the number of mutexes used by an application since it is actually created only at first use and it's often destroyed soon after. 2000-07-22 Ross Johnson * FAQ: Added Q5 and Q6. tests/ChangeLog: 2000-07-25 Ross Johnson * runtest.bat: modified to work under W98. * runall.bat: Add new tests; modified to work under W98. It was ok under NT. * Makefile: Add new tests. * exception1.c: New; Test passing exceptions back to the application and retaining library internal exceptions. * join0.c: New; Test a single join. --- private.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'private.c') diff --git a/private.c b/private.c index 5af936b..f374e27 100644 --- a/private.c +++ b/private.c @@ -187,7 +187,7 @@ _pthread_threadStart (ThreadParms * threadParms) #ifdef _MSC_VER - DWORD ei[3]; + DWORD ei[] = {0,0,0}; #endif @@ -197,13 +197,24 @@ _pthread_threadStart (ThreadParms * threadParms) start = threadParms->start; arg = threadParms->arg; + free (threadParms); + #if defined (__MINGW32__) && ! defined (__MSVCRT__) - /* beginthread does not return the thread id, and so we do it here. */ + /* + * beginthread does not return the thread id and is running + * before it returns us the thread handle, and so we do it here. + */ self->thread = GetCurrentThreadId (); + if (pthread_mutex_lock(&self->cancelLock) == 0) + { + /* + * We got the lock which means that our creator has + * our thread handle. Unlock and continue on. + */ + (void) pthread_mutex_unlock(&self->cancelLock); + } #endif - free (threadParms); - pthread_setspecific (_pthread_selfThreadKey, self); #ifdef _MSC_VER @@ -231,6 +242,7 @@ _pthread_threadStart (ThreadParms * threadParms) break; default: status = PTHREAD_CANCELED; + break; } } else @@ -366,7 +378,9 @@ _pthread_tkAssocCreate (ThreadKeyAssoc ** assocP, * key on which to create an association. * Returns: * 0 - if successful, - * -1 - general error + * ENOMEM - not enough memory to create assoc or other object + * EINVAL - an internal error occurred + * ENOSYS - an internal error occurred * ------------------------------------------------------------------- */ { @@ -382,12 +396,11 @@ _pthread_tkAssocCreate (ThreadKeyAssoc ** assocP, if (assoc == NULL) { - result = -1; + result = ENOMEM; goto FAIL0; } - if ((result = pthread_mutex_init (&(assoc->lock), NULL)) != - 0) + if ((result = pthread_mutex_init (&(assoc->lock), NULL)) != 0) { goto FAIL1; } @@ -398,8 +411,7 @@ _pthread_tkAssocCreate (ThreadKeyAssoc ** assocP, /* * Register assoc with key */ - if ((result = pthread_mutex_lock (&(key->threadsLock))) != - 0) + if ((result = pthread_mutex_lock (&(key->threadsLock))) != 0) { goto FAIL2; } @@ -793,7 +805,7 @@ _pthread_get_exception_services_code(void) #else - return NULL; + return (DWORD) NULL; #endif } -- cgit v1.2.3