/* -----------------------------------------------------------------------------
- * $Id: RtsFlags.c,v 1.56 2001/12/12 14:31:43 simonmar Exp $
+ * $Id: RtsFlags.c,v 1.68 2003/04/21 14:45:28 sof Exp $
*
* (c) The AQUA Project, Glasgow University, 1994-1997
* (c) The GHC Team, 1998-1999
#include "RtsFlags.h"
#include "RtsUtils.h"
#include "BlockAlloc.h"
-#include "Itimer.h" /* CS_MIN_MILLISECS */
+#include "Timer.h" /* CS_MIN_MILLISECS */
#include "Profiling.h"
-#if defined(PROFILING)
-#include "Itimer.h"
-#endif
-
#ifdef HAVE_CTYPE_H
#include <ctype.h>
#endif
+#include <stdlib.h>
+#include <string.h>
+
extern struct RTS_FLAGS RtsFlags;
/*
* Split argument lists
*/
-int prog_argc; /* an "int" so as to match normal "argc" */
+int prog_argc = 0; /* an "int" so as to match normal "argc" */
char **prog_argv = NULL;
-int rts_argc; /* ditto */
+int rts_argc = 0; /* ditto */
char *rts_argv[MAX_RTS_ARGS];
//@node Constants, Static function decls, Includes
#define RTS 1
#define PGM 0
-char *debug_opts_strs[] = {
- "DEBUG (-D1): scheduler\n",
- "DEBUG (-D2): evaluator\n",
- "DEBUG (-D4): codegen\n",
- "DEBUG (-D8): weak\n",
- "DEBUG (-D16): gccafs\n",
- "DEBUG (-D32): gc\n",
- "DEBUG (-D64): block\n",
- "DEBUG (-D128): sanity\n",
- "DEBUG (-D256): stable\n",
- "DEBUG (-D512): prof\n",
- "DEBUG (-D1024): gran\n",
- "DEBUG (-D2048): par\n",
- "DEBUG (-D4096): linker\n"
-};
-
-char *debug_opts_prefix[] = {
- "_-", /* scheduler */
- "_.", /* evaluator */
- "_,", /* codegen */
- "_;", /* weak */
- "_~", /* gccafs */
- "_@", /* gc */
- "_#", /* block */
- "_&", /* sanity */
- "_:", /* stable */
- "_!", /* prof */
- "_=", /* gran */
- "_=" /* par */
- "_*" /* linker */
-};
-
#if defined(GRAN)
-char *gran_debug_opts_strs[] = {
+static char *gran_debug_opts_strs[] = {
"DEBUG (-bDe, -bD1): event_trace; printing event trace.\n",
"DEBUG (-bDE, -bD2): event_stats; printing event statistics.\n",
"DEBUG (-bDb, -bD4): bq; check blocking queues\n",
};
/* one character codes for the available debug options */
-char gran_debug_opts_flags[] = {
+static char gran_debug_opts_flags[] = {
'e', 'E', 'b', 'G', 'q', 'f', 'r', 'F', 'u', 'S', ':', 'o', 'z', 'P', 't'
};
-/* prefix strings printed with the debug messages of the corresponding type */
-char *gran_debug_opts_prefix[] = {
- "", /* event_trace */
- "", /* event_stats */
- "##", /* bq */
- "**", /* pack */
- "^^", /* checkSparkQ */
- "==", /* thunkStealing */
- "^^", /* randomSteal */
- "+-", /* findWork */
- "", /* unused */
- "++", /* pri */
- "::", /* checkLight */
- "##", /* sortedQ */
- "", /* blockOnFetch */
- "", /* packBuffer */
- "" /* blockOnFetch_sanity */
-};
-
#elif defined(PAR)
-char *par_debug_opts_strs[] = {
+static char *par_debug_opts_strs[] = {
"DEBUG (-qDv, -qD1): verbose; be generally verbose with parallel related stuff.\n",
"DEBUG (-qDq, -qD2): bq; print blocking queues.\n",
"DEBUG (-qDs, -qD4): schedule; scheduling of parallel threads.\n",
};
/* one character codes for the available debug options */
-char par_debug_opts_flags[] = {
+static char par_debug_opts_flags[] = {
'v', 'q', 's', 'e', 'r', 'w', 'F', 'f', 'l', 'o', 'p', 'z'
};
-/* prefix strings printed with the debug messages of the corresponding type */
-char *par_debug_opts_prefix[] = {
- " ", /* verbose */
- "##", /* bq */
- "--", /* schedule */
- "!!", /* free */
- "[]", /* resume */
- ";;", /* weight */
- "%%", /* fetch */
- //",,", /* ack */
- "$$", /* fish */
- "", /* tables */
- "**", /* packet */
- "**" /* pack */
- ":(" /* paranoia */
-};
-
#endif /* PAR */
//@node Static function decls, Command-line option parsing routines, Constants
static void set_par_debug_options(nat n);
static void help_par_debug_options(nat n);
#endif
-#if defined(DEBUG)
-static void set_debug_options(nat n);
-static void help_debug_options(nat n);
-#endif
//@node Command-line option parsing routines, GranSim specific options, Static function decls
//@subsection Command-line option parsing routines
RtsFlags.GcFlags.frontpanel = rtsFalse;
#endif
+#ifdef DEBUG
+ RtsFlags.DebugFlags.scheduler = rtsFalse;
+ RtsFlags.DebugFlags.interpreter = rtsFalse;
+ RtsFlags.DebugFlags.codegen = rtsFalse;
+ RtsFlags.DebugFlags.weak = rtsFalse;
+ RtsFlags.DebugFlags.gccafs = rtsFalse;
+ RtsFlags.DebugFlags.gc = rtsFalse;
+ RtsFlags.DebugFlags.block_alloc = rtsFalse;
+ RtsFlags.DebugFlags.sanity = rtsFalse;
+ RtsFlags.DebugFlags.stable = rtsFalse;
+ RtsFlags.DebugFlags.prof = rtsFalse;
+ RtsFlags.DebugFlags.gran = rtsFalse;
+ RtsFlags.DebugFlags.par = rtsFalse;
+ RtsFlags.DebugFlags.linker = rtsFalse;
+#endif
+
#if defined(PROFILING) || defined(PAR)
RtsFlags.CcFlags.doCostCentres = 0;
#endif /* PROFILING or PAR */
#ifdef PROFILING
RtsFlags.ProfFlags.doHeapProfile = rtsFalse;
RtsFlags.ProfFlags.profileInterval = 100;
+ RtsFlags.ProfFlags.includeTSOs = rtsFalse;
RtsFlags.ProfFlags.showCCSOnException = rtsFalse;
RtsFlags.ProfFlags.maxRetainerSetSize = 8;
RtsFlags.ProfFlags.modSelector = NULL;
"",
" -R<size> Set the maximum retainer set size (default: 8)",
"",
-" -i<msec> Time between heap samples (msec, default: 100)",
+" -i<sec> Time between heap samples (seconds, default: 0.1)",
+"",
+" -xt Include threads (TSOs) in a heap profile",
"",
" -xc Show current cost centre stack on raising an exception",
# endif
" -C<secs> Context-switch interval in seconds",
" (0 or no argument means switch as often as possible)",
" the default is .02 sec; resolution is .02 sec",
+"",
+#if defined(DEBUG)
+" -Ds DEBUG: scheduler",
+" -Di DEBUG: interpreter",
+" -Dc DEBUG: codegen",
+" -Dw DEBUG: weak",
+" -DG DEBUG: gccafs",
+" -Dg DEBUG: gc",
+" -Db DEBUG: block",
+" -DS DEBUG: sanity",
+" -Dt DEBUG: stable",
+" -Dp DEBUG: prof",
+" -Dr DEBUG: gran",
+" -DP DEBUG: par",
+" -Dl DEBUG: linker",
+"",
+#endif // DEBUG
#if defined(SMP)
" -N<n> Use <n> OS threads (default: 1)",
#endif
if (c1 == c2) { break; }
if (*rts_argc < MAX_RTS_ARGS-1) {
- s = malloc(c2-c1+1);
+ s = stgMallocBytes(c2-c1+1, "RtsFlags.c:splitRtsFlags()");
strncpy(s, c1, c2-c1);
s[c2-c1] = '\0';
rts_argv[(*rts_argc)++] = s;
}
}
- // process arguments from the GHCRTS environment variable first
+ // process arguments from the GHCRTS environment variable next
// (arguments from the command line override these).
{
char *ghc_rts = getenv("GHCRTS");
#ifdef DEBUG
case 'D':
- if (isdigit(rts_argv[arg][2])) {/* Set all debugging options in one */
- /* hack warning: interpret the flags as a binary number */
- nat n = decode(rts_argv[arg]+2);
- set_debug_options(n);
- }
- break;
+ {
+ char *c;
+
+ for (c = rts_argv[arg] + 2; *c != '\0'; c++) {
+ switch (*c) {
+ case 's':
+ RtsFlags.DebugFlags.scheduler = rtsTrue;
+ break;
+ case 'i':
+ RtsFlags.DebugFlags.interpreter = rtsTrue;
+ break;
+ case 'c':
+ RtsFlags.DebugFlags.codegen = rtsTrue;
+ break;
+ case 'w':
+ RtsFlags.DebugFlags.weak = rtsTrue;
+ break;
+ case 'G':
+ RtsFlags.DebugFlags.gccafs = rtsTrue;
+ break;
+ case 'g':
+ RtsFlags.DebugFlags.gc = rtsTrue;
+ break;
+ case 'b':
+ RtsFlags.DebugFlags.block_alloc = rtsTrue;
+ break;
+ case 'S':
+ RtsFlags.DebugFlags.sanity = rtsTrue;
+ break;
+ case 't':
+ RtsFlags.DebugFlags.stable = rtsTrue;
+ break;
+ case 'p':
+ RtsFlags.DebugFlags.prof = rtsTrue;
+ break;
+ case 'r':
+ RtsFlags.DebugFlags.gran = rtsTrue;
+ break;
+ case 'P':
+ RtsFlags.DebugFlags.par = rtsTrue;
+ break;
+ case 'l':
+ RtsFlags.DebugFlags.linker = rtsTrue;
+ break;
+ case 'a':
+ RtsFlags.DebugFlags.apply = rtsTrue;
+ break;
+ default:
+ bad_option( rts_argv[arg] );
+ }
+ }
+ break;
+ }
#endif
case 'K':
case 'R':
PROFILING_BUILD_ONLY(
RtsFlags.ProfFlags.maxRetainerSetSize = atof(rts_argv[arg]+2);
-
- if (RtsFlags.ProfFlags.maxRetainerSetSize < 0)
- bad_option( rts_argv[arg] );
- break;
) break;
case 'h': /* serial heap profile */
case 'c': /* Debugging tool: show current cost centre on an exception */
PROFILING_BUILD_ONLY(
- RtsFlags.ProfFlags.showCCSOnException = rtsTrue;
- ) break;
+ RtsFlags.ProfFlags.showCCSOnException = rtsTrue;
+ );
+ break;
+
+ case 't': /* Include memory used by TSOs in a heap profile */
+ PROFILING_BUILD_ONLY(
+ RtsFlags.ProfFlags.includeTSOs = rtsTrue;
+ );
+ break;
/* The option prefix '-xx' is reserved for future extension. KSW 1999-11. */
} else if (RtsFlags.GranFlags.proc > MAX_PROC ||
RtsFlags.GranFlags.proc < 1)
{
- fprintf(stderr,"setupRtsFlags: no more than %u processors
-allowed\n",
+ fprintf(stderr,"setupRtsFlags: no more than %u processors allowed\n",
MAX_PROC);
*error = rtsTrue;
}
#endif /* PAR */
-#ifdef DEBUG
-static void
-set_debug_options(nat n) {
- nat i;
-
- for (i=0; i<=MAX_DEBUG_OPTION; i++)
- if ((n>>i)&1) {
- fprintf(stderr, debug_opts_strs[i]);
- switch (i) {
- case 0: RtsFlags.DebugFlags.scheduler = rtsTrue; break;
- case 1: RtsFlags.DebugFlags.evaluator = rtsTrue; break;
- case 2: RtsFlags.DebugFlags.codegen = rtsTrue; break;
- case 3: RtsFlags.DebugFlags.weak = rtsTrue; break;
- case 4: RtsFlags.DebugFlags.gccafs = rtsTrue; break;
- case 5: RtsFlags.DebugFlags.gc = rtsTrue; break;
- case 6: RtsFlags.DebugFlags.block_alloc = rtsTrue; break;
- case 7: RtsFlags.DebugFlags.sanity = rtsTrue; break;
- case 8: RtsFlags.DebugFlags.stable = rtsTrue; break;
- case 9: RtsFlags.DebugFlags.prof = rtsTrue; break;
- case 10: RtsFlags.DebugFlags.gran = rtsTrue; break;
- case 11: RtsFlags.DebugFlags.par = rtsTrue; break;
- case 12: RtsFlags.DebugFlags.linker = rtsTrue; break;
- default: barf("set_debug_options: only %d debug options expected",
- MAX_DEBUG_OPTION);
- } /* switch */
- } /* if */
-}
-
-static void
-help_debug_options(nat n) {
- nat i;
-
- for (i=0; i<=MAX_DEBUG_OPTION; i++)
- if ((n>>i)&1)
- fprintf(stderr, debug_opts_strs[i]);
-}
-#endif /* DEBUG */
-
//@node Aux fcts, , GranSim specific options
//@subsection Aux fcts