summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
Diffstat (limited to 'rts')
-rw-r--r--rts/RtsFlags.c66
-rw-r--r--rts/RtsFlags.h2
2 files changed, 68 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
+}
diff --git a/rts/RtsFlags.h b/rts/RtsFlags.h
index c36c64a63b..bfcc43af42 100644
--- a/rts/RtsFlags.h
+++ b/rts/RtsFlags.h
@@ -10,6 +10,7 @@
#pragma once
#include "BeginPrivate.h"
+#include <stdbool.h>
/* Routines that operate-on/to-do-with RTS flags: */
@@ -21,6 +22,7 @@ char** getUTF8Args(int* argc);
void initRtsFlagsDefaults (void);
void setupRtsFlags (int *argc, char *argv[], RtsConfig rtsConfig);
void freeRtsArgs (void);
+bool is_io_mng_native_p (void);
extern RtsConfig rtsConfig;