From a4c344228d34a30f3bcb5875f57318fabf3414ff Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 11 Mar 2009 18:40:32 +0000 Subject: [PATCH] fix bug related to sleeping and Windows networking (take 3) svn: r14056 --- src/mred/mredmsw.cxx | 7 ++++++- src/mzscheme/src/port.c | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/mred/mredmsw.cxx b/src/mred/mredmsw.cxx index 70514cdc68..7c283d29c6 100644 --- a/src/mred/mredmsw.cxx +++ b/src/mred/mredmsw.cxx @@ -986,7 +986,12 @@ void MrEdMSWSleep(float secs, void *fds) } if (th2) { - closesocket(fake); + while (closesocket(fake)) { + /* I don't think WSAEINPROGRESS should happen, but just in case... */ + if (WSAGetLastError() != WSAEINPROGRESS) + break; + } + scheme_interrupt_win32_thread(th2); WaitForSingleObject(th2, INFINITE); scheme_forget_thread(thread_memory); CloseHandle(th2); diff --git a/src/mzscheme/src/port.c b/src/mzscheme/src/port.c index 56554dc79b..74c7114bd3 100644 --- a/src/mzscheme/src/port.c +++ b/src/mzscheme/src/port.c @@ -4607,6 +4607,16 @@ static CSI_proc get_csi(void) END_XFORM_SKIP; return csi; } + +MZ_EXTERN void scheme_interrupt_win32_thread(HANDLE th); +void scheme_interrupt_win32_thread(HANDLE th) +{ + CSI_proc csi; + csi = get_csi(); + if (csi) + csi(th); +} + # endif /* forward decl: */ @@ -8104,7 +8114,13 @@ static void default_sleep(float v, void *fds) clean_up_wait(result, array, rps, count); /* cause selector thread to end: */ - closesocket(fake); + while (closesocket(fake)) { + /* I don't think WSAEINPROGRESS should happen, but just in case... */ + if (WSAGetLastError() != WSAEINPROGRESS) + break; + } + + scheme_interrupt_win32_thread(th); WaitForSingleObject(th, INFINITE); scheme_forget_thread(thread_memory);