summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/misc.c b/misc.c
index e79819d..ec5f9fa 100644
--- a/misc.c
+++ b/misc.c
@@ -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