X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRtsFlags.c;h=25d53da1fe71981a068ae697d00386bde6d82ff7;hb=3a4f9158d6d6688e591d505461d40e82c002c74c;hp=2f01d5e219ba55559258ce979221a44d1aa54123;hpb=b61f70ce5ff947642c96b1ad980351691bb1e07a;p=ghc-hetmet.git diff --git a/ghc/rts/RtsFlags.c b/ghc/rts/RtsFlags.c index 2f01d5e..25d53da 100644 --- a/ghc/rts/RtsFlags.c +++ b/ghc/rts/RtsFlags.c @@ -152,7 +152,7 @@ void initRtsFlagsDefaults(void) 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 */ @@ -173,6 +173,7 @@ void initRtsFlagsDefaults(void) #ifdef RTS_GTK_FRONTPANEL RtsFlags.GcFlags.frontpanel = rtsFalse; #endif + RtsFlags.GcFlags.idleGCDelayTicks = 300 / TICK_MILLISECS; /* ticks */ #ifdef DEBUG RtsFlags.DebugFlags.scheduler = rtsFalse; @@ -189,6 +190,7 @@ void initRtsFlagsDefaults(void) RtsFlags.DebugFlags.gran = rtsFalse; RtsFlags.DebugFlags.par = rtsFalse; RtsFlags.DebugFlags.linker = rtsFalse; + RtsFlags.DebugFlags.squeeze = rtsFalse; #endif #if defined(PROFILING) || defined(PAR) @@ -346,6 +348,9 @@ usage_text[] = { " -c Auto-enable compaction of the oldest generation when live data is", " at least % of the maximum heap size set with -M (default: 30%)", " -c Enable compaction for all major collections", +#if defined(THREADED_RTS) +" -I Perform full GC after idle time (default: 0.3, 0 == off)", +#endif "", " -t One-line GC statistics (default file: .stat)", " -s Summary GC statistics (with -Sstderr going to stderr)", @@ -427,8 +432,9 @@ usage_text[] = { " -DP DEBUG: par", " -Dl DEBUG: linker", " -Dm DEBUG: stm", +" -Dz DEBUG: stack squezing", "", -#endif // DEBUG +#endif /* DEBUG */ #if defined(SMP) " -N Use OS threads (default: 1)", #endif @@ -499,21 +505,8 @@ setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]) 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; @@ -735,6 +728,9 @@ error = rtsTrue; case 'm': RtsFlags.DebugFlags.stm = rtsTrue; break; + case 'z': + RtsFlags.DebugFlags.squeeze = rtsTrue; + break; default: bad_option( rts_argv[arg] ); } @@ -806,6 +802,23 @@ error = rtsTrue; 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; @@ -986,7 +999,7 @@ error = rtsTrue; error = rtsTrue; } ) -#endif // PROFILING +#endif /* PROFILING */ break; #if defined(PROFILING) @@ -2191,3 +2204,53 @@ bad_option(const char *s) 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); +}