diff options
| author | rpj <rpj> | 2000-07-25 16:14:23 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2000-07-25 16:14:23 +0000 | 
| commit | e2fd6e2de322cc12d9153da548ab76379049c11c (patch) | |
| tree | 0e055e3496bbe45a4003d3e140e09a763d116fda /tsd.c | |
| parent | b035ed05977fdef5ced4691028284b7f0ebaba19 (diff) | |
2000-07-25  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * sched.c (sched_get_priority_max): Handle different WinCE and
        Win32 priority values together.
        (sched_get_priority_min): Ditto.
        - Tristan Savatier <tristan@mpegtv.com>
        * 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  <rpj@special.ise.canberra.edu.au>
        * 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  <rpj@special.ise.canberra.edu.au>
        * FAQ: Added Q5 and Q6.
tests/ChangeLog:
2000-07-25  Ross Johnson  <rpj@special.ise.canberra.edu.au>
        * 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.
Diffstat (limited to 'tsd.c')
| -rw-r--r-- | tsd.c | 63 | 
1 files changed, 36 insertions, 27 deletions
@@ -71,9 +71,6 @@ pthread_key_create (pthread_key_t * key, void (*destructor) (void *))      }    else if (((*key)->key = TlsAlloc ()) == TLS_OUT_OF_INDEXES)      { -      /* -       * Create system key -       */        result = EAGAIN;        free (*key); @@ -86,6 +83,13 @@ pthread_key_create (pthread_key_t * key, void (*destructor) (void *))         * Therefore, need a lock that allows multiple threads         * to gain exclusive access to the key->threads list         */ +#if 1 +      /* +       * The mutex will only be created when it is first locked. +       */ +      (*key)->threadsLock = PTHREAD_MUTEX_INITIALIZER; +      (*key)->destructor = destructor; +#else        result = pthread_mutex_init (&((*key)->threadsLock), NULL);        if (result != 0) @@ -95,7 +99,11 @@ pthread_key_create (pthread_key_t * key, void (*destructor) (void *))            free (*key);            *key = NULL;          } -      (*key)->destructor = destructor; +      else +	{ +      	  (*key)->destructor = destructor; +	} +#endif      }    return (result); @@ -134,6 +142,7 @@ pthread_key_delete (pthread_key_t key)    if (key != NULL)      {        if (key->threads != NULL && +          key->destructor != NULL &&            pthread_mutex_lock (&(key->threadsLock)) == 0)          {            /* @@ -194,25 +203,24 @@ pthread_setspecific (pthread_key_t key, const void *value)       /*        * ------------------------------------------------------        * DOCPUBLIC -      *      This function initializes an unnamed semaphore. the -      *      initial value of the semaphore is 'value' +      *      This function sets the value of the thread specific +      *	     key in the calling thread.        *        * PARAMETERS -      *      sem -      *              pointer to an instance of sem_t +      *      key +      *              an instance of pthread_key_t +      *	     value +      *		     the value to set key to        *        *        * DESCRIPTION -      *      This function  initializes an unnamed semaphore. The -      *      initial value of the semaphore is set to 'value'. +      *      This function sets the value of the thread specific +      *      key in the calling thread.        *        * RESULTS -      *              0               successfully created semaphore, -      *              EINVAL          'sem' is not a valid semaphore, -      *              ENOSPC          a required resource has been exhausted, -      *              ENOSYS          semaphores are not supported, -      *              EPERM           the process lacks appropriate privilege -      *              ENOENT          the thread couldn't find it's own handle +      *              0               successfully set value +      *              EAGAIN          could not set value +      *              ENOENT          SERIOUS!!        *        * ------------------------------------------------------        */ @@ -229,9 +237,9 @@ pthread_setspecific (pthread_key_t key, const void *value)         */        self = pthread_self ();        if (self == NULL) -	{ -	  return ENOENT; -	} +        { +          return ENOENT; +        }      }    else      { @@ -284,20 +292,21 @@ pthread_setspecific (pthread_key_t key, const void *value)            /*             * create an association if not found             */ -          result = (assoc == NULL) -            ? _pthread_tkAssocCreate (&assoc, self, key) -            : 0; -        } -      else -        { -          result = 0; +	  if (assoc == NULL) +	    { +	      result = _pthread_tkAssocCreate (&assoc, self, key); +	    }          }        if (result == 0)          { -          TlsSetValue (key->key, (LPVOID) value); +          if ( ! TlsSetValue (key->key, (LPVOID) value)) +	    { +	      result = EAGAIN; +	    }          }      } +    return (result);  }                               /* pthread_setspecific */  | 
