X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRtsFlags.c;h=55effe2c4a8e9acf3617531c0c3db7480ea8e2f0;hb=9e6162f9d0102d1f5738bf78258b24ea5a647ea4;hp=5424572224fc834d3f3b38d4d17603b59c8af900;hpb=3c22fb21fb18e27ce8d941069a6915fce584a526;p=ghc-hetmet.git diff --git a/ghc/rts/RtsFlags.c b/ghc/rts/RtsFlags.c index 5424572..55effe2 100644 --- a/ghc/rts/RtsFlags.c +++ b/ghc/rts/RtsFlags.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: RtsFlags.c,v 1.54 2001/11/28 14:55:34 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 @@ -26,25 +26,24 @@ #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 #endif +#include +#include + 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 @@ -56,41 +55,9 @@ char *rts_argv[MAX_RTS_ARGS]; #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", @@ -109,32 +76,13 @@ char *gran_debug_opts_strs[] = { }; /* 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", @@ -152,27 +100,10 @@ char *par_debug_opts_strs[] = { }; /* 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 @@ -202,10 +133,6 @@ static void process_par_option(int arg, int *rts_argc, char *rts_argv[], rtsBool 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 @@ -244,19 +171,37 @@ void initRtsFlagsDefaults(void) 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 = 20; + RtsFlags.ProfFlags.profileInterval = 100; + RtsFlags.ProfFlags.includeTSOs = rtsFalse; RtsFlags.ProfFlags.showCCSOnException = rtsFalse; RtsFlags.ProfFlags.maxRetainerSetSize = 8; RtsFlags.ProfFlags.modSelector = NULL; RtsFlags.ProfFlags.descrSelector = NULL; RtsFlags.ProfFlags.typeSelector = NULL; RtsFlags.ProfFlags.ccSelector = NULL; + RtsFlags.ProfFlags.ccsSelector = NULL; RtsFlags.ProfFlags.retainerSelector = NULL; RtsFlags.ProfFlags.bioSelector = NULL; @@ -426,7 +371,8 @@ usage_text[] = { " r = retainer", " b = biography (LAG,DRAG,VOID,USE)", " A subset of closures may be selected thusly:", -" -hc,... specific cost centre(s) (NOT STACKS!)", +" -hc,... specific cost centre(s) (top of stack only)", +" -hC,... specific cost centre(s) (anywhere in stack)", " -hm... all cost centres from the specified modules(s)", " -hd,... closures with specified closure descriptions", " -hy... closures with specified type descriptions", @@ -435,7 +381,9 @@ usage_text[] = { "", " -R Set the maximum retainer set size (default: 8)", "", -" -i Time between heap samples (msec, default: 20)", +" -i 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 @@ -459,6 +407,23 @@ usage_text[] = { " -C 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 Use OS threads (default: 1)", #endif @@ -511,7 +476,7 @@ splitRtsFlags(char *s, int *rts_argc, char *rts_argv[]) 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; @@ -551,7 +516,7 @@ setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]) } } - // 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"); @@ -707,12 +672,59 @@ error = rtsTrue; #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': @@ -835,10 +847,6 @@ error = rtsTrue; 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 */ @@ -889,10 +897,12 @@ error = rtsTrue; *right = '\0'; switch (rts_argv[arg][2]) { - case 'C': case 'c': // cost centre label select RtsFlags.ProfFlags.ccSelector = left; break; + case 'C': + RtsFlags.ProfFlags.ccsSelector = left; + break; case 'M': case 'm': // cost centre module select RtsFlags.ProfFlags.modSelector = left; @@ -1058,8 +1068,15 @@ error = rtsTrue; 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. */ @@ -1379,8 +1396,7 @@ process_gran_option(int arg, int *rts_argc, char *rts_argv[], rtsBool *error) } 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; } @@ -2065,44 +2081,6 @@ help_par_debug_options(nat n) { #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