summaryrefslogtreecommitdiff
path: root/rts/win32
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2021-12-28 15:06:16 +0000
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-01-15 03:41:55 -0500
commit0dc723957d0fdb5909f145405b775efea0fe2f6e (patch)
treef6ee9f0a8ec293c4d6b60e6d6cb8cdb7b67ec082 /rts/win32
parente2b60be8472ad5b7b6ef2b265b4a06d1b2b67c7d (diff)
downloadhaskell-0dc723957d0fdb5909f145405b775efea0fe2f6e.tar.gz
winio: fix heap corruption and various leaks.
Diffstat (limited to 'rts/win32')
-rw-r--r--rts/win32/AsyncWinIO.c3
-rw-r--r--rts/win32/ConsoleHandler.c2
-rw-r--r--rts/win32/ConsoleHandler.h7
-rw-r--r--rts/win32/ThrIOManager.c10
-rw-r--r--rts/win32/ThrIOManager.h2
5 files changed, 21 insertions, 3 deletions
diff --git a/rts/win32/AsyncWinIO.c b/rts/win32/AsyncWinIO.c
index 7fb71e92e7..5f61f815f3 100644
--- a/rts/win32/AsyncWinIO.c
+++ b/rts/win32/AsyncWinIO.c
@@ -147,7 +147,7 @@
There we initialize IO manager locale variables and.
* call ioManagerStart()
- * Creat a thread to execute "runner"
+ * Create a thread to execute "runner"
We never truly shut down the IO Manager. While this means we
might block forever on the IOPort if the IO Manager is no longer
@@ -274,6 +274,7 @@ void shutdownAsyncWinIO(bool wait_threads)
WaitForSingleObject (workerThread, INFINITE);
}
completionPortHandle = INVALID_HANDLE_VALUE;
+ CloseHandle (workerThread);
workerThread = NULL;
workerThreadId = 0;
free (entries);
diff --git a/rts/win32/ConsoleHandler.c b/rts/win32/ConsoleHandler.c
index 05d15868eb..4af897bc54 100644
--- a/rts/win32/ConsoleHandler.c
+++ b/rts/win32/ConsoleHandler.c
@@ -57,7 +57,7 @@ freeSignalHandlers(void) {
/* Do nothing */
}
-/* Seems to be a bit of an orphan...where used? */
+/* Called in hs_exit to clean up resources. */
void
finiUserSignals(void)
{
diff --git a/rts/win32/ConsoleHandler.h b/rts/win32/ConsoleHandler.h
index bb7278abba..d22f10f16a 100644
--- a/rts/win32/ConsoleHandler.h
+++ b/rts/win32/ConsoleHandler.h
@@ -62,3 +62,10 @@ extern void startSignalHandlers(Capability *cap);
extern int rts_waitConsoleHandlerCompletion(void);
#endif /* THREADED_RTS */
+
+/*
+ * Function: finiUserSignals()
+ *
+ * Tear down and shut down user signal processing.
+ */
+extern void finiUserSignals(void);
diff --git a/rts/win32/ThrIOManager.c b/rts/win32/ThrIOManager.c
index d614d49a0c..6bbf65a45f 100644
--- a/rts/win32/ThrIOManager.c
+++ b/rts/win32/ThrIOManager.c
@@ -161,3 +161,13 @@ ioManagerStart (void)
rts_unlock(cap);
}
}
+
+/*
+ * Called to close the io_manager_event handle when the IO manager thread is
+ * terminating.
+ */
+void
+ioManagerFinished(void)
+{
+ CloseHandle(io_manager_event);
+}
diff --git a/rts/win32/ThrIOManager.h b/rts/win32/ThrIOManager.h
index a67bdde364..c7ecc76e9f 100644
--- a/rts/win32/ThrIOManager.h
+++ b/rts/win32/ThrIOManager.h
@@ -15,4 +15,4 @@
void ioManagerWakeup (void);
void ioManagerDie (void);
void ioManagerStart (void);
-
+void ioManagerFinished (void);