diff -urp src.old/winsup/cygwin/thread.cc src/winsup/cygwin/thread.cc --- src.old/winsup/cygwin/thread.cc Fri Aug 16 12:52:02 2002 +++ src/winsup/cygwin/thread.cc Fri Aug 16 13:14:49 2002 @@ -1020,16 +1020,27 @@ pthread_key::~pthread_key () int pthread_key::set (const void *value) { - /*the OS function doesn't perform error checking */ - TlsSetValue (dwTlsIndex, (void *) value); + if (dwTlsIndex == TLS_OUT_OF_INDEXES || + !TlsSetValue (dwTlsIndex, (void *) value)) + return EINVAL; + return 0; } void * pthread_key::get () { - set_errno (0); - return TlsGetValue (dwTlsIndex); + void *result; + int last_error = GetLastError (); + + if (dwTlsIndex == TLS_OUT_OF_INDEXES) + result = NULL; + else + result = TlsGetValue (dwTlsIndex); + + SetLastError (last_error); + + return result; } void @@ -1884,8 +1895,8 @@ __pthread_setspecific (pthread_key_t key { if (verifyable_object_isvalid (&key, PTHREAD_KEY_MAGIC) != VALID_OBJECT) return EINVAL; - (key)->set (value); - return 0; + + return (key)->set (value); } void * @@ -1895,7 +1906,6 @@ __pthread_getspecific (pthread_key_t key return NULL; return (key)->get (); - } /*Thread synchronisation */