summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-11-13 21:03:28 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-11-13 21:03:28 (GMT)
commit5b2d20cdcbe08cf350f3adc4e83618cdd5720cf7 (patch)
treee03b318dbb0e29de111d837975f499df3be1a176
parentfd53317415e2ad6115af604bbe52c4ef4f080dcb (diff)
parentba16c7a4403b1fa99daafb9292751bf572c09616 (diff)
downloadtcl-5b2d20cdcbe08cf350f3adc4e83618cdd5720cf7.zip
tcl-5b2d20cdcbe08cf350f3adc4e83618cdd5720cf7.tar.gz
tcl-5b2d20cdcbe08cf350f3adc4e83618cdd5720cf7.tar.bz2
merge 8.4bug_3567063
-rw-r--r--ChangeLog5
-rw-r--r--generic/tclIOUtil.c6
-rw-r--r--generic/tclTest.c2
-rw-r--r--win/configure.in1
-rw-r--r--win/tclWinSock.c13
5 files changed, 19 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 6f84707..1a372f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-07 Don Porter <dgp@users.sourceforge.net>
+
+ * win/tclWinSock.c: [Bug 3574493] Avoid hanging on exit due to
+ use of synchronization calls in routines called by DllMain().
+
2012-10-03 Don Porter <dgp@users.sourceforge.net>
* generic/tclIO.c: When checking for std channels being closed,
diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c
index 69b7e44..cfa01f0 100644
--- a/generic/tclIOUtil.c
+++ b/generic/tclIOUtil.c
@@ -2774,6 +2774,9 @@ Tcl_FSChdir(pathPtr)
*----------------------------------------------------------------------
*/
+typedef int (Tcl_FSLoadFileProc2) (Tcl_Interp *interp, Tcl_Obj *pathPtr,
+ Tcl_LoadHandle *handlePtr, Tcl_FSUnloadFileProc **unloadProcPtr, int flags);
+
int
Tcl_FSLoadFile(interp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr,
handlePtr, unloadProcPtr)
@@ -2797,7 +2800,8 @@ Tcl_FSLoadFile(interp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr,
if (fsPtr != NULL) {
Tcl_FSLoadFileProc *proc = fsPtr->loadFileProc;
if (proc != NULL) {
- int retVal = (*proc)(interp, pathPtr, handlePtr, unloadProcPtr);
+ int retVal = ((Tcl_FSLoadFileProc2 *)proc)
+ (interp, pathPtr, handlePtr, unloadProcPtr, 0);
if (retVal != TCL_OK) {
return retVal;
}
diff --git a/generic/tclTest.c b/generic/tclTest.c
index 8256461..998416c 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -468,7 +468,7 @@ static Tcl_Filesystem testReportingFilesystem = {
&TestReportRenameFile,
&TestReportCopyDirectory,
&TestReportLstat,
- &TestReportLoadFile,
+ (Tcl_FSLoadFileProc *) &TestReportLoadFile,
NULL /* cwd */,
&TestReportChdir
};
diff --git a/win/configure.in b/win/configure.in
index f839521..635469b 100644
--- a/win/configure.in
+++ b/win/configure.in
@@ -119,6 +119,7 @@ AC_CACHE_CHECK(for LPFN_ACCEPT support in winsock2.h,
tcl_cv_lpfn_decls,
AC_TRY_COMPILE([
#define WIN32_LEAN_AND_MEAN
+#define INCL_WINSOCK_API_TYPEDEFS 1
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#include <winsock2.h>
diff --git a/win/tclWinSock.c b/win/tclWinSock.c
index 328198b..050564d 100644
--- a/win/tclWinSock.c
+++ b/win/tclWinSock.c
@@ -659,12 +659,13 @@ TclpFinalizeSockets()
if (tsdPtr != NULL) {
if (tsdPtr->socketThread != NULL) {
if (tsdPtr->hwnd != NULL) {
- PostMessage(tsdPtr->hwnd, SOCKET_TERMINATE, 0, 0);
- /*
- * Wait for the thread to exit. This ensures that we are
- * completely cleaned up before we leave this function.
- */
- WaitForSingleObject(tsdPtr->readyEvent, INFINITE);
+ if (PostMessage(tsdPtr->hwnd, SOCKET_TERMINATE, 0, 0)) {
+ /*
+ * Wait for the thread to exit. This ensures that we are
+ * completely cleaned up before we leave this function.
+ */
+ WaitForSingleObject(tsdPtr->readyEvent, INFINITE);
+ }
tsdPtr->hwnd = NULL;
}
CloseHandle(tsdPtr->socketThread);