diff options
| author | rpj <rpj> | 2000-12-28 05:43:49 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2000-12-28 05:43:49 +0000 | 
| commit | bab1896412f2d292ebd8d44bc9d6ddb58a8702b0 (patch) | |
| tree | 09ecfc5f9042224f9b64c5e0aaaa09fcba22dd92 /misc.c | |
| parent | c94735ecdde19c4de652efd144faeec1a729b1e0 (diff) | |
2000-10-10  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
        * misc.c (pthread_self): Restore Win32 "last error"
        cleared by TlsGetValue() call in
        pthread_getspecific()
        - "Steven Reddie" <smr@essemer.com.au>
2000-09-20  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
        * mutex.c (pthread_mutex_lock): Record the owner
        of the mutex. This requires also keeping count of
        recursive locks ourselves rather than leaving it
        to Win32 since we need to know when to NULL the
        thread owner when the mutex is unlocked.
        (pthread_mutex_trylock): Likewise.
        (pthread_mutex_unlock): Check that the calling
        thread owns the mutex, decrement the recursive
        lock count, and NULL the owner if zero. Return
        EPERM if the mutex is owned by another thread.
        * implement.h (pthread_mutex_t_): Add ownerThread
        and lockCount members.
        - reported by Arthur Kantor <akantor@bexusa.com>
Diffstat (limited to 'misc.c')
| -rw-r--r-- | misc.c | 31 | 
1 files changed, 28 insertions, 3 deletions
| @@ -143,12 +143,37 @@ pthread_self (void)        */  {    pthread_t self = NULL; +  DWORD lastErr; +    /* -   * need to ensure there always is a self +   * Need to ensure there always is a self. +   * +   * The following call to pthread_getspecific uses TlsGetValue. +   * Win32 functions that return indications of failure call SetLastError when +   * they fail. They generally do not call SetLastError when they succeed. The +   * TlsGetValue function is an exception to this general rule. The TlsGetValue +   * function calls SetLastError to clear a thread's last error when it +   * succeeds. +   * +   * We restore the last error if TlsGetValue succeeds.     */ +  lastErr = GetLastError(); +  self = (pthread_t) pthread_getspecific (ptw32_selfThreadKey); +  if (GetLastError() == NO_ERROR) +    { +      SetLastError(lastErr); +    } +  else +    { +      /* +       * What else can we do? GetLastError will tell the +       * the caller more but this is not supposed to +       * happen. +       */ +      return(NULL); +    } -  if ((self = (pthread_t) pthread_getspecific (ptw32_selfThreadKey))  -      == NULL) +  if (self == NULL)      {        /*         * Need to create an implicit 'self' for the currently | 
