diff options
| -rw-r--r-- | ChangeLog | 5 | ||||
| -rw-r--r-- | generic/tclIOUtil.c | 6 | ||||
| -rw-r--r-- | generic/tclTest.c | 2 | ||||
| -rw-r--r-- | win/configure.in | 1 | ||||
| -rw-r--r-- | win/tclWinSock.c | 13 | 
5 files changed, 19 insertions, 8 deletions
@@ -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);  | 
