summaryrefslogtreecommitdiff
path: root/dll.c
diff options
context:
space:
mode:
authorrpj <rpj>2000-01-04 10:19:28 +0000
committerrpj <rpj>2000-01-04 10:19:28 +0000
commita378d97dc9d9eadaef00a9f01816948db5f3a796 (patch)
tree654435cc0a85156c2a9b4793ab7d8e0da8424e32 /dll.c
parent27d833666dfd72cc6e74c3900d3e8e66321bea3a (diff)
Main changes (see ChangeLog diff for details and attributions):-
- asynchronous cancellation added - attempt to hide internal exceptions from applications - kernel32 load/free problem fixed - new tests - changes only to comments in some tests
Diffstat (limited to 'dll.c')
-rw-r--r--dll.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/dll.c b/dll.c
index add5832..9d59379 100644
--- a/dll.c
+++ b/dll.c
@@ -107,6 +107,26 @@ DllMain (
}
DeleteCriticalSection(&cs);
}
+
+ if (_pthread_try_enter_critical_section == NULL)
+ {
+ /*
+ * If TryEnterCriticalSection is not being used, then free
+ * the kernel32.dll handle now, rather than leaving it until
+ * DLL_PROCESS_DETACH.
+ *
+ * Note: this is not a pedantic exercise in freeing unused
+ * resources! It is a work-around for a bug in Windows 95
+ * (see microsoft knowledge base article, Q187684) which
+ * does Bad Things when FreeLibrary is called within
+ * the DLL_PROCESS_DETACH code, in certain situations.
+ * Since w95 just happens to be a platform which does not
+ * provide TryEnterCriticalSection, the bug will be
+ * effortlessly avoided.
+ */
+ (void) FreeLibrary(_pthread_h_kernel32);
+ _pthread_h_kernel32 = 0;
+ }
break;
case DLL_THREAD_ATTACH:
@@ -150,7 +170,10 @@ DllMain (
*/
_pthread_processTerminate ();
- (void) FreeLibrary(_pthread_h_kernel32);
+ if (_pthread_h_kernel32)
+ {
+ (void) FreeLibrary(_pthread_h_kernel32);
+ }
}
}