+
/* -----------------------------------------------------------------------------
*
* (c) The AQUA Project, Glasgow University, 1994-1997
RtsFlags.GcFlags.maxStkSize = (8 * 1024 * 1024) / sizeof(W_);
RtsFlags.GcFlags.initialStkSize = 1024 / sizeof(W_);
- RtsFlags.GcFlags.minAllocAreaSize = (256 * 1024) / BLOCK_SIZE;
+ RtsFlags.GcFlags.minAllocAreaSize = (512 * 1024) / BLOCK_SIZE;
RtsFlags.GcFlags.minOldGenSize = (1024 * 1024) / BLOCK_SIZE;
RtsFlags.GcFlags.maxHeapSize = 0; /* off by default */
RtsFlags.GcFlags.heapSizeSuggestion = 0; /* none */
#ifdef RTS_GTK_FRONTPANEL
RtsFlags.GcFlags.frontpanel = rtsFalse;
#endif
+ RtsFlags.GcFlags.idleGCDelayTicks = 300 / TICK_MILLISECS; /* ticks */
#ifdef DEBUG
RtsFlags.DebugFlags.scheduler = rtsFalse;
RtsFlags.DebugFlags.block_alloc = rtsFalse;
RtsFlags.DebugFlags.sanity = rtsFalse;
RtsFlags.DebugFlags.stable = rtsFalse;
+ RtsFlags.DebugFlags.stm = rtsFalse;
RtsFlags.DebugFlags.prof = rtsFalse;
RtsFlags.DebugFlags.gran = rtsFalse;
RtsFlags.DebugFlags.par = rtsFalse;
RtsFlags.DebugFlags.linker = rtsFalse;
+ RtsFlags.DebugFlags.squeeze = rtsFalse;
#endif
#if defined(PROFILING) || defined(PAR)
RtsFlags.ConcFlags.ctxtSwitchTime = CS_MIN_MILLISECS; /* In milliseconds */
-#ifdef SMP
+#ifdef THREADED_RTS
RtsFlags.ParFlags.nNodes = 1;
#endif
RtsFlags.ParFlags.fishDelay = FISH_DELAY;
#endif
-#if defined(PAR) || defined(SMP)
+#if defined(PAR) || defined(THREADED_RTS)
RtsFlags.ParFlags.maxLocalSparks = 4096;
-#endif /* PAR || SMP */
+#endif /* PAR || THREADED_RTS */
#if defined(GRAN)
/* ToDo: check defaults for GranSim and GUM */
" -c<n> Auto-enable compaction of the oldest generation when live data is",
" at least <n>% of the maximum heap size set with -M (default: 30%)",
" -c Enable compaction for all major collections",
+#if defined(THREADED_RTS)
+" -I<sec> Perform full GC after <sec> idle time (default: 0.3, 0 == off)",
+#endif
"",
" -t<file> One-line GC statistics (default file: <program>.stat)",
" -s<file> Summary GC statistics (with -Sstderr going to stderr)",
" -Dr DEBUG: gran",
" -DP DEBUG: par",
" -Dl DEBUG: linker",
+" -Dm DEBUG: stm",
+" -Dz DEBUG: stack squezing",
"",
-#endif // DEBUG
-#if defined(SMP)
+#endif /* DEBUG */
+#if defined(THREADED_RTS)
" -N<n> Use <n> OS threads (default: 1)",
#endif
-#if defined(SMP) || defined(PAR)
+#if defined(THREADED_RTS) || defined(PAR)
" -e<size> Size of spark pools (default 100)",
#endif
#if defined(PAR)
" -qd Turn on PVM-ish debugging",
" -qO Disable output for performance measurement",
#endif
-#if defined(SMP) || defined(PAR)
+#if defined(THREADED_RTS) || defined(PAR)
" -e<n> Maximum number of outstanding local sparks (default: 4096)",
#endif
#if defined(PAR)
rtsBool error = rtsFalse;
I_ mode;
I_ arg, total_arg;
- char *last_slash;
-
- /* Remove directory from argv[0] -- default files in current directory */
- if ((last_slash = (char *) strrchr(argv[0],
-#if !defined(mingw32_TARGET_OS)
- '/')
-#else
- '\\')
-#endif
- ) != NULL) {
- prog_name = last_slash+1;
- } else {
- prog_name = argv[0];
- }
+ setProgName (argv);
total_arg = *argc;
arg = 1;
error = rtsTrue;
#endif
-#ifdef SMP
-# define SMP_BUILD_ONLY(x) x
-#else
-# define SMP_BUILD_ONLY(x) \
-errorBelch("not built for: -smp"); \
-error = rtsTrue;
-#endif
-
#ifdef PAR
# define PAR_BUILD_ONLY(x) x
#else
error = rtsTrue;
#endif
-#if defined(SMP) || defined(PAR)
-# define PAR_OR_SMP_BUILD_ONLY(x) x
+#ifdef THREADED_RTS
+# define THREADED_BUILD_ONLY(x) x
#else
-# define PAR_OR_SMP_BUILD_ONLY(x) \
+# define THREADED_BUILD_ONLY(x) \
+errorBelch("not built for: -smp"); \
+error = rtsTrue;
+#endif
+
+#if defined(THREADED_RTS) || defined(PAR)
+# define PAR_OR_THREADED_BUILD_ONLY(x) x
+#else
+# define PAR_OR_THREADED_BUILD_ONLY(x) \
errorBelch("not built for: -parallel or -smp"); \
error = rtsTrue;
#endif
case 'a':
RtsFlags.DebugFlags.apply = rtsTrue;
break;
+ case 'm':
+ RtsFlags.DebugFlags.stm = rtsTrue;
+ break;
+ case 'z':
+ RtsFlags.DebugFlags.squeeze = rtsTrue;
+ break;
default:
bad_option( rts_argv[arg] );
}
break;
#endif
+ case 'I': /* idle GC delay */
+ if (rts_argv[arg][2] == '\0') {
+ /* use default */
+ } else {
+ I_ cst; /* tmp */
+
+ /* Convert to ticks */
+ cst = (I_) ((atof(rts_argv[arg]+2) * 1000));
+ if (cst > 0 && cst < TICK_MILLISECS) {
+ cst = TICK_MILLISECS;
+ } else {
+ cst = cst / TICK_MILLISECS;
+ }
+ RtsFlags.GcFlags.idleGCDelayTicks = cst;
+ }
+ break;
+
case 'S':
RtsFlags.GcFlags.giveStats = VERBOSE_GC_STATS;
goto stats;
error = rtsTrue;
}
)
-#endif // PROFILING
+#endif /* PROFILING */
break;
#if defined(PROFILING)
}
break;
-#ifdef SMP
+#ifdef THREADED_RTS
case 'N':
- SMP_BUILD_ONLY(
+ THREADED_BUILD_ONLY(
if (rts_argv[arg][2] != '\0') {
RtsFlags.ParFlags.nNodes
= strtol(rts_argv[arg]+2, (char **) NULL, 10);
#endif
/* =========== PARALLEL =========================== */
case 'e':
- PAR_OR_SMP_BUILD_ONLY(
+ PAR_OR_THREADED_BUILD_ONLY(
if (rts_argv[arg][2] != '\0') {
RtsFlags.ParFlags.maxLocalSparks
= strtol(rts_argv[arg]+2, (char **) NULL, 10);
errorBelch("bad RTS option: %s", s);
stg_exit(EXIT_FAILURE);
}
+
+/* -----------------------------------------------------------------------------
+ Getting/Setting the program's arguments.
+
+ These are used by System.Environment, and parts of the RTS.
+ -------------------------------------------------------------------------- */
+
+void
+setProgName(char *argv[])
+{
+ /* Remove directory from argv[0] -- default files in current directory */
+#if !defined(mingw32_HOST_OS)
+ char *last_slash;
+ if ( (last_slash = (char *) strrchr(argv[0], '/')) != NULL ) {
+ prog_name = last_slash+1;
+ } else {
+ prog_name = argv[0];
+ }
+#else
+ char* last_slash = argv[0] + (strlen(argv[0]) - 1);
+ while ( last_slash > argv[0] ) {
+ if ( *last_slash == '/' || *last_slash == '\\' ) {
+ prog_name = last_slash+1;
+ return;
+ }
+ last_slash--;
+ }
+ prog_name = argv[0];
+#endif
+}
+
+void
+getProgArgv(int *argc, char **argv[])
+{
+ if (argc) { *argc = prog_argc; }
+ if (argv) { *argv = prog_argv; }
+}
+
+void
+setProgArgv(int argc, char *argv[])
+{
+ /* Usually this is done by startupHaskell, so we don't need to call this.
+ However, sometimes Hugs wants to change the arguments which Haskell
+ getArgs >>= ... will be fed. So you can do that by calling here
+ _after_ calling startupHaskell.
+ */
+ prog_argc = argc;
+ prog_argv = argv;
+ setProgName(prog_argv);
+}