From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Pfaff To: "Phil Frisbie, Jr." Cc: Subject: Re: Thread local storage problem, and fix Date: Thu, 23 Aug 2001 00:41:00 -0000 Message-id: References: <3B83FF1D.DDB30CB0@hawksoft.com> X-SW-Source: 2001/msg00118.html On Wed, 22 Aug 2001, Phil Frisbie, Jr. wrote: > While converting the simple per thread error storage in HawkNL over to > POSIX and > native Windows thread local storage, I came across some problems. I > store a > HawkNL error code for the thread, and if it is a Winsock error I set the > error > to NL_SOCKET_ERROR so the application can retrieve the real error code. > But > Winsock errors seemed to be cleared whenever pthread_getspecific() was > called. > They were also cleared by calling the native Windows TlsGetValue(). > > So, I looked at the Pthreads-win32 source code for > pthread_getspecific(), and > found this: > > void * > pthread_getspecific (pthread_key_t key) > { > int lasterror = GetLastError(); > > void *ptr = TlsGetValue (key->key); > > SetLastError( lasterror ); > > return ptr; > } > > I guess someone already found out TlsGetValue() clears out the last > error, but > they did not know it also clears out the last Winsock error. The fix is > to > change the code to: > > void * > pthread_getspecific (pthread_key_t key) > { > int lasterror = GetLastError(); > int lastWSAerror = WSAGetLastError(); > > void *ptr = TlsGetValue (key->key); > > SetLastError( lasterror ); > WSASetLastError( lastWSAerror ); > > return ptr; > } > > I have added a work around to HawkNL until this gets fixed. > > > Phil Frisbie, Jr. > Lead Developer, Hawk Software > http://www.hawksoft.com > strange, at least on NT4 the WSALastError equals to Win32 LastError when i used Winsock2, so i did not saved it too. I will have a look if you tell me your platform. Greetings, Thomas