summaryrefslogtreecommitdiff
path: root/rts/RtsFlags.c
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2019-06-02 14:55:34 +0100
committerBen Gamari <ben@smart-cactus.org>2020-07-15 16:41:01 -0400
commit71245fcce24723910f12f934fbc4c700658b727a (patch)
tree83d387775893a72afc97cb73b345864f77b1bf98 /rts/RtsFlags.c
parent90e69f779b6da755fac472337535a1321cbb7917 (diff)
downloadhaskell-71245fcce24723910f12f934fbc4c700658b727a.tar.gz
winio: Add new io-manager cmdline options
Diffstat (limited to 'rts/RtsFlags.c')
-rw-r--r--rts/RtsFlags.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c
index 6180f42e39..3963e6d0d5 100644
--- a/rts/RtsFlags.c
+++ b/rts/RtsFlags.c
@@ -35,6 +35,7 @@
#endif
#include <fs_rts.h>
+#include <stdbool.h>
// Flag Structure
RTS_FLAGS RtsFlags;
@@ -254,6 +255,16 @@ void initRtsFlagsDefaults(void)
RtsFlags.MiscFlags.internalCounters = false;
RtsFlags.MiscFlags.linkerAlwaysPic = DEFAULT_LINKER_ALWAYS_PIC;
RtsFlags.MiscFlags.linkerMemBase = 0;
+#if defined(DEFAULT_NATIVE_IO_MANAGER)
+ RtsFlags.MiscFlags.ioManager = IO_MNGR_NATIVE;
+#else
+ RtsFlags.MiscFlags.ioManager = IO_MNGR_POSIX;
+#endif
+#if defined(THREADED_RTS) && defined(mingw32_HOST_OS)
+ RtsFlags.MiscFlags.numIoWorkerThreads = getNumberOfProcessors();
+#else
+ RtsFlags.MiscFlags.numIoWorkerThreads = 1;
+#endif
#if defined(THREADED_RTS)
RtsFlags.ParFlags.nCapabilities = 1;
@@ -474,7 +485,14 @@ usage_text[] = {
" fatal error. When symbols are available an attempt will be",
" made to resolve addresses to names. (default: yes)",
#endif
+" --io-manager=<native|posix>",
+" The I/O manager subsystem to use. (default: posix)",
#if defined(THREADED_RTS)
+#if defined(mingw32_HOST_OS)
+" --io-manager-threads=<num>",
+" The number of worker threads to use in the native I/O manager to",
+" handle completion events. (defualt: num cores)",
+#endif
" -e<n> Maximum number of outstanding local sparks (default: 4096)",
#endif
#if defined(x86_64_HOST_ARCH)
@@ -933,6 +951,16 @@ error = true;
OPTION_SAFE;
RtsFlags.MiscFlags.internalCounters = true;
}
+ else if (strequal("io-manager=native",
+ &rts_argv[arg][2])) {
+ OPTION_UNSAFE;
+ RtsFlags.MiscFlags.ioManager = IO_MNGR_NATIVE;
+ }
+ else if (strequal("io-manager=posix",
+ &rts_argv[arg][2])) {
+ OPTION_UNSAFE;
+ RtsFlags.MiscFlags.ioManager = IO_MNGR_POSIX;
+ }
else if (strequal("info",
&rts_argv[arg][2])) {
OPTION_SAFE;
@@ -945,6 +973,31 @@ error = true;
RtsFlags.GcFlags.useNonmoving = true;
}
#if defined(THREADED_RTS)
+#if defined(mingw32_HOST_OS)
+ else if (!strncmp("io-manager-threads",
+ &rts_argv[arg][2], 18)) {
+ OPTION_SAFE;
+ uint32_t num;
+ if (rts_argv[arg][20] == '=') {
+ num = (StgWord)strtol(rts_argv[arg]+21,
+ (char **) NULL, 10);
+ } else {
+ errorBelch("%s: Expected number of threads to use.",
+ rts_argv[arg]);
+ error = true;
+ break;
+ }
+
+ if (num < 1) {
+ errorBelch("%s: Expected number of threads to be at least 1.",
+ rts_argv[arg]);
+ error = true;
+ break;
+ }
+
+ RtsFlags.MiscFlags.numIoWorkerThreads = num;
+ }
+#endif
else if (!strncmp("numa", &rts_argv[arg][2], 4)) {
if (!osBuiltWithNumaSupport()) {
errorBelch("%s: This GHC build was compiled without NUMA support.",
@@ -2460,3 +2513,16 @@ built in the -debug, -eventlog, -prof ways. And even if they do, the
damage should be limited to DOS, information disclosure and writing
files like <progname>.eventlog, not arbitrary files.
*/
+
+/* ----------------------------------------------------------------------------
+ Helper utilities to query state.
+ ------------------------------------------------------------------------- */
+
+bool is_io_mng_native_p (void)
+{
+#if defined(mingw32_HOST_OS)
+ return RtsFlags.MiscFlags.ioManager == IO_MNGR_NATIVE;
+#else
+ return false;
+#endif
+}