summaryrefslogtreecommitdiff
path: root/dll.c
diff options
context:
space:
mode:
authorrpj <rpj>2000-12-28 05:32:07 +0000
committerrpj <rpj>2000-12-28 05:32:07 +0000
commitc94735ecdde19c4de652efd144faeec1a729b1e0 (patch)
tree1780c2bfe14e0b41931d85f6a5ed2f5e2695b6b2 /dll.c
parent548fc29a8cc3fd016eba997facc9566af8fd2d75 (diff)
./ChangeLog:
2000-12-28 Ross Johnson <rpj@special.ise.canberra.edu.au> * private.c (ptw32_threadStart): Unhandled exceptions are now passed through to the system to deal with. This is consistent with normal Windows behaviour. C++ applications may use set_terminate() to override the default behaviour which is to call ptw32_terminate(). Ptw32_terminate() cleans up some POSIX thread stuff before calling the system default function which calls abort(). The users termination function should conform to standard C++ semantics which is to not return. It should exit the thread (call pthread_exit()) or exit the application. * private.c (ptw32_terminate): Added as the default set_terminate() function. It calls the system default function after cleaning up some POSIX thread stuff. * implement.h (ptw32_try_enter_critical_section): Move declaration. * global.c (ptw32_try_enter_critical_section): Moved from dll.c. * dll.c: Move process and thread attach/detach code into functions in nonportable.c. * nonportable.c (pthread_win32_process_attach_np): Process attach code from dll.c is now available to static linked applications. * nonportable.c (pthread_win32_process_detach_np): Likewise. * nonportable.c (pthread_win32_thread_attach_np): Likewise. * nonportable.c (pthread_win32_thread_detach_np): Likewise. * pthread.h: Add new non-portable prototypes for static linked applications. * GNUmakefile (OPT): Increase optimisation flag and remove debug info flag. * pthread.def: Add new non-portable exports for static linked applications. 2000-12-11 Ross Johnson <rpj@special.ise.canberra.edu.au> * FAQ: Update Answer 6 re getting a fully working Mingw32 built library. 2000-09-09 Ross Johnson <rpj@special.ise.canberra.edu.au> * pthread.h (ctime_r): Fix arg. ./tests/ChangeLog: 2000-12-28 Ross Johnson <rpj@special.ise.canberra.edu.au> * eyal1.c: Increase thread work loads. * exception2.c: New test. * exception3.c: New test. * Makefile: Add new tests exception2.c and exception3.c. * GNUmakefile: Likewise. 2000-12-11 Ross Johnson <rpj@special.ise.canberra.edu.au> * cleanup3.c: Remove unused variable. * cleanup2.c: Likewise. * exception1.c: Throw an exception rather than use a deliberate zero divide so that catch(...) will handle it under Mingw32. Mingw32 now builds the library correctly to pass all tests - see Thomas Pfaff's detailed instructions re needed changes to Mingw32 in the Pthreads-Win32 FAQ.
Diffstat (limited to 'dll.c')
-rw-r--r--dll.c117
1 files changed, 10 insertions, 107 deletions
diff --git a/dll.c b/dll.c
index 15c1bda..96552a3 100644
--- a/dll.c
+++ b/dll.c
@@ -27,22 +27,9 @@
#include "pthread.h"
#include "implement.h"
-
-/*
- * Function pointer to TryEnterCriticalSection if it exists; otherwise NULL
- */
-BOOL (WINAPI *ptw32_try_enter_critical_section)(LPCRITICAL_SECTION) = NULL;
-
-/*
- * We use this to double-check that TryEnterCriticalSection works.
- */
-CRITICAL_SECTION cs;
-
-/*
- * Handle to kernel32.dll
- */
-static HINSTANCE ptw32_h_kernel32;
-
+#if 1
+#include <stdio.h>
+#endif
#ifdef _MSC_VER
/*
@@ -79,110 +66,26 @@ DllMain (
{
case DLL_PROCESS_ATTACH:
- /*
- * The DLL is being mapped into the process's address space
- */
- result = ptw32_processInitialize ();
-
- /* Load KERNEL32 and try to get address of TryEnterCriticalSection */
- ptw32_h_kernel32 = LoadLibrary(TEXT("KERNEL32.DLL"));
- ptw32_try_enter_critical_section =
- (BOOL (PT_STDCALL *)(LPCRITICAL_SECTION))
-
-#if defined(NEED_UNICODE_CONSTS)
- GetProcAddress(ptw32_h_kernel32,
- (const TCHAR *)TEXT("TryEnterCriticalSection"));
-#else
- GetProcAddress(ptw32_h_kernel32,
- (LPCSTR) "TryEnterCriticalSection");
-#endif
-
- if (ptw32_try_enter_critical_section != NULL)
- {
- InitializeCriticalSection(&cs);
- if ((*ptw32_try_enter_critical_section)(&cs))
- {
- LeaveCriticalSection(&cs);
- }
- else
- {
- /*
- * Not really supported (Win98?).
- */
- ptw32_try_enter_critical_section = NULL;
- }
- DeleteCriticalSection(&cs);
- }
-
- if (ptw32_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(ptw32_h_kernel32);
- ptw32_h_kernel32 = 0;
- }
+ result = pthread_win32_process_attach_np();
break;
case DLL_THREAD_ATTACH:
/*
* A thread is being created
*/
- result = TRUE;
+ result = pthread_win32_thread_attach_np();
break;
case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
/*
* A thread is exiting cleanly
- * NOTE: The "main" thread detaches using
- * DLL_PROCESS_DETACH
*/
- {
- pthread_t self;
-
- if (ptw32_processInitialized)
- {
- self = (pthread_t) pthread_getspecific (ptw32_selfThreadKey);
-
- /*
- * Detached threads have their resources automatically
- * cleaned up upon exit (others must be 'joined').
- */
- if (self != NULL &&
- self->detachState == PTHREAD_CREATE_DETACHED)
- {
- pthread_setspecific (ptw32_selfThreadKey, NULL);
- ptw32_threadDestroy (self);
- }
-
- if (fdwReason == DLL_PROCESS_DETACH)
- {
- /*
- * The DLL is being unmapped into the process's address space
- */
- ptw32_processTerminate ();
-
- if (ptw32_h_kernel32)
- {
- (void) FreeLibrary(ptw32_h_kernel32);
- }
- }
- }
+ result = pthread_win32_thread_detach_np();
+ break;
- result = TRUE;
- }
+ case DLL_PROCESS_DETACH:
+ (void) pthread_win32_thread_detach_np();
+ result = pthread_win32_process_detach_np();
break;
}
return (result);