diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2013-08-29 18:32:04 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2013-08-29 18:32:04 +0300 |
| commit | 3f940c5aa6fc1d03e6658cda5c440fb6bd75e4c5 (patch) | |
| tree | 5729694efb5e29a00b9fad2f9c081d2198f3ccc9 /src/w32.c | |
| parent | 20de2834a594370b2f30fa55932c9de3da6150ed (diff) | |
| download | emacs-3f940c5aa6fc1d03e6658cda5c440fb6bd75e4c5.tar.gz | |
A possible fix for bug #14333 with hanging at exit on MS-Windows.
src/w32.c (term_winsock): Call release_listen_threads before calling
WSACleanup.
(_sys_wait_accept): Wait for accept event in a loop with a finite
timeout, instead of waiting indefinitely. Will hopefully avoid
hanging during exit because WSACleanup deadlocks waiting for the
event object to be released.
src/w32proc.c (release_listen_threads): New function, signals all
the reader threads that listen for connections to stop waiting.
src/w32.h (release_listen_threads): Add prototype.
Diffstat (limited to 'src/w32.c')
| -rw-r--r-- | src/w32.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/w32.c b/src/w32.c index 05a3fde97ce..1dcf46b5f4b 100644 --- a/src/w32.c +++ b/src/w32.c @@ -6092,6 +6092,7 @@ term_winsock (void) { if (winsock_lib != NULL && winsock_inuse == 0) { + release_listen_threads (); /* Not sure what would cause WSAENETDOWN, or even if it can happen after WSAStartup returns successfully, but it seems reasonable to allow unloading winsock anyway in that case. */ @@ -7076,7 +7077,12 @@ _sys_wait_accept (int fd) rc = pfn_WSAEventSelect (SOCK_HANDLE (fd), hEv, FD_ACCEPT); if (rc != SOCKET_ERROR) { - rc = WaitForSingleObject (hEv, INFINITE); + do { + rc = WaitForSingleObject (hEv, 500); + Sleep (5); + } while (rc == WAIT_TIMEOUT + && cp->status != STATUS_READ_ERROR + && cp->char_avail); pfn_WSAEventSelect (SOCK_HANDLE (fd), NULL, 0); if (rc == WAIT_OBJECT_0) cp->status = STATUS_READ_SUCCEEDED; |
