summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Coutts <duncan@well-typed.com>2021-01-03 16:35:59 +0000
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-01-25 05:11:14 -0500
commit54946e4f4bed9b8146db9235794d1698c9b7ad50 (patch)
tree1ec618dcae3a1f96a3c6ddac42726a0d7b683f50
parent8bdbfdd8e03f44572e683d221dd40ca81b0ed852 (diff)
downloadhaskell-54946e4f4bed9b8146db9235794d1698c9b7ad50.tar.gz
Start to centralise the I/O manager hooks from other bits of the RTS
It is currently rather difficult to understand or work with the various I/O manager implementations. This is for a few reasons: 1. They do not have a clear or common API. There are some common function names, but a lot of things just get called directly. 2. They have hooks into many other parts of the RTS where they get called from. 3. There is a _lot_ of CPP involved, both THREADED_RTS vs !THREADED_RTS and also mingw32_HOST_OS vs !mingw32_HOST_OS. This doesn't really identify the I/O manager implementation. 4. They have data structures with unclear ownership, or that are co-owned with other components like the scheduler. Some data structures are used by multiple I/O managers. One thing that would help is if the interface between the I/O managers and the rest of the RTS was clearer, even if it was not completely uniform. Centralising it would make it easier to see how to reduce any unnecessary diversity in the interfaces. This patch makes a start by creating a new IOManager.{h,c} module. It is initially empty, but we will move things into it in subsequent patches.
-rw-r--r--rts/IOManager.c21
-rw-r--r--rts/IOManager.h25
-rw-r--r--rts/rts.cabal.in1
3 files changed, 47 insertions, 0 deletions
diff --git a/rts/IOManager.c b/rts/IOManager.c
new file mode 100644
index 0000000000..533edbf45e
--- /dev/null
+++ b/rts/IOManager.c
@@ -0,0 +1,21 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team 1998-2020
+ *
+ * Hooks for the I/O subsystem(s) that are called from other parts of the RTS.
+ *
+ * There are several different I/O subsystem implementations (aka I/O managers),
+ * for different platforms (notably Windows vs others), and for the threaded vs
+ * non-threaded RTS. These implementations all need hooks into other parts of
+ * the RTS, such as startup/shutdown, the scheduler and other special features.
+ *
+ * To keep things comprehensible, all the hooks used by all the different I/O
+ * subsystem implementations are centralised here. Not all implementations use
+ * all hooks.
+ *
+ * -------------------------------------------------------------------------*/
+
+#include "Rts.h"
+#include "rts/IOInterface.h" // exported
+#include "IOManager.h" // RTS internal
+
diff --git a/rts/IOManager.h b/rts/IOManager.h
new file mode 100644
index 0000000000..da322c6e40
--- /dev/null
+++ b/rts/IOManager.h
@@ -0,0 +1,25 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team 1998-2020
+ *
+ * Prototypes for functions in IOManager.c and elsewhere
+ *
+ * Hooks for the I/O subsystem(s) that are called from other parts of the RTS.
+ *
+ * There are several different I/O subsystem implementations (aka I/O managers),
+ * for different platforms (notably Windows vs others), and for the threaded vs
+ * non-threaded RTS. These implementations all need hooks into other parts of
+ * the RTS, such as startup/shutdown, the scheduler and other special features.
+ *
+ * To keep things comprehensible, all the hooks used by all the different I/O
+ * subsystem implementations are centralised here. Not all implementations use
+ * all hooks.
+ *
+ * -------------------------------------------------------------------------*/
+
+#pragma once
+
+#include "BeginPrivate.h"
+
+
+#include "EndPrivate.h"
diff --git a/rts/rts.cabal.in b/rts/rts.cabal.in
index b98a6eaca7..ed727111ca 100644
--- a/rts/rts.cabal.in
+++ b/rts/rts.cabal.in
@@ -433,6 +433,7 @@ library
HsFFI.c
Inlines.c
Interpreter.c
+ IOManager.c
LdvProfile.c
Libdw.c
LibdwPool.c