- case 's':
- RtsFlags.GranFlags.GranSimStats.Sparks=rtsTrue;
- break;
-
- case 'h':
- RtsFlags.GranFlags.GranSimStats.Heap=rtsTrue;
- break;
-
- case 'Y': /* syntax: -bY<n>[,<n>] n ... pos int */
- if (rts_argv[arg][3] != '\0') {
- char *arg0, *tmp;
-
- arg0 = rts_argv[arg]+3;
- if ((tmp = strstr(arg0,","))==NULL) {
- RtsFlags.GranFlags.SparkPriority = decode(arg0);
- debugBelch("SparkPriority: %u.\n",RtsFlags.GranFlags.SparkPriority);
- } else {
- *(tmp++) = '\0';
- RtsFlags.GranFlags.SparkPriority = decode(arg0);
- RtsFlags.GranFlags.SparkPriority2 = decode(tmp);
- debugBelch("SparkPriority: %u.\n",
- RtsFlags.GranFlags.SparkPriority);
- debugBelch("SparkPriority2:%u.\n",
- RtsFlags.GranFlags.SparkPriority2);
- if (RtsFlags.GranFlags.SparkPriority2 <
- RtsFlags.GranFlags.SparkPriority) {
- debugBelch("WARNING: 2nd pri < main pri (%u<%u); 2nd pri has no effect\n",
- RtsFlags.GranFlags.SparkPriority2,
- RtsFlags.GranFlags.SparkPriority);
- }
- }
- } else {
- /* plain pri spark is now invoked with -bX
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("PrioritySparking.\n");
- */
- }
- break;
-
- case 'Q':
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.GranFlags.ThunksToPack = decode(rts_argv[arg]+3);
- } else {
- RtsFlags.GranFlags.ThunksToPack = 1;
- }
- debugBelch("Thunks To Pack in one packet: %u.\n",
- RtsFlags.GranFlags.ThunksToPack);
- break;
-
- case 'e':
- RtsFlags.GranFlags.RandomSteal = rtsFalse;
- debugBelch("Deterministic mode (no random stealing)\n");
- break;
-
- /* The following class of options contains eXperimental */
- /* features in connection with exploiting granularity */
- /* information. I.e. if -bY is chosen these options */
- /* tell the RTS what to do with the supplied info --HWL */
-
- case 'W':
- if (rts_argv[arg][3] != '\0') {
- RtsFlags.GranFlags.packBufferSize_internal = decode(rts_argv[arg]+3);
- } else {
- RtsFlags.GranFlags.packBufferSize_internal = GRANSIM_DEFAULT_PACK_BUFFER_SIZE;
- }
- debugBelch("Size of GranSim internal pack buffer: %u.\n",
- RtsFlags.GranFlags.packBufferSize_internal);
- break;
-
- case 'X':
- switch(rts_argv[arg][3]) {
-
- case '\0':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with Normal Priorities.\n");
- RtsFlags.GranFlags.InversePriorities = rtsFalse;
- RtsFlags.GranFlags.RandomPriorities = rtsFalse;
- RtsFlags.GranFlags.IgnorePriorities = rtsFalse;
- break;
-
- case 'I':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with Inverse Priorities.\n");
- RtsFlags.GranFlags.InversePriorities++;
- break;
-
- case 'R':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with Random Priorities.\n");
- RtsFlags.GranFlags.RandomPriorities++;
- break;
-
- case 'N':
- RtsFlags.GranFlags.DoPrioritySparking = 1;
- debugBelch("Priority Sparking with No Priorities.\n");
- RtsFlags.GranFlags.IgnorePriorities++;
- break;
-
- default:
- bad_option( rts_argv[arg] );
- break;
- }
- break;
-
- case '-':
- switch(rts_argv[arg][3]) {
-
- case 'C':
- RtsFlags.GranFlags.DoAlwaysCreateThreads=rtsFalse;
- RtsFlags.GranFlags.DoThreadMigration=rtsFalse;
- break;
-
- case 'G':
- RtsFlags.GranFlags.DoBulkFetching=rtsFalse;
- break;
-
- case 'M':
- RtsFlags.GranFlags.DoThreadMigration=rtsFalse;
- break;
-
- case 'R':
- RtsFlags.GranFlags.DoFairSchedule=rtsFalse;
- break;
-
- case 'T':
- RtsFlags.GranFlags.DoStealThreadsFirst=rtsFalse;
- RtsFlags.GranFlags.DoThreadMigration=rtsFalse;
- break;
-
- case 'Z':
- RtsFlags.GranFlags.DoAsyncFetch=rtsFalse;
- break;
-
- case 'N':
- RtsFlags.GranFlags.PreferSparksOfLocalNodes=rtsFalse;
- break;
-
- case 'P':
- RtsFlags.GranFlags.GranSimStats.Suppressed=rtsTrue;
- break;
-
- case 's':
- RtsFlags.GranFlags.GranSimStats.Sparks=rtsFalse;
- break;
-
- case 'h':
- RtsFlags.GranFlags.GranSimStats.Heap=rtsFalse;
- break;
-
- case 'b':
- RtsFlags.GranFlags.GranSimStats.Binary=rtsFalse;
- break;
-
- case 'X':
- RtsFlags.GranFlags.DoPrioritySparking = rtsFalse;
- break;
-
- case 'Y':
- RtsFlags.GranFlags.DoPrioritySparking = rtsFalse;
- RtsFlags.GranFlags.SparkPriority = rtsFalse;
- break;
-
- case 'I':
- RtsFlags.GranFlags.DoPriorityScheduling = rtsFalse;
- break;
-
- case 'e':
- RtsFlags.GranFlags.RandomSteal = rtsFalse;
- break;
-
- default:
- bad_option( rts_argv[arg] );
- break;
- }
- break;
-
-# if defined(GRAN_CHECK) && defined(GRAN)
- case 'D':
- switch(rts_argv[arg][3]) {
- case 'Q': /* Set pack buffer size (same as 'Q' in GUM) */
- if (rts_argv[arg][4] != '\0') {
- RtsFlags.GranFlags.packBufferSize = decode(rts_argv[arg]+4);
- debugBelch("Pack buffer size: %d\n",
- RtsFlags.GranFlags.packBufferSize);
- } else {
- debugBelch("setupRtsFlags: missing size of PackBuffer (for -Q)\n");
- *error = rtsTrue;
- }
- break;
-
- default:
- if (isdigit(rts_argv[arg][3])) {/* Set all debugging options in one */
- /* hack warning: interpret the flags as a binary number */
- nat n = decode(rts_argv[arg]+3);
- set_GranSim_debug_options(n);
- } else {
- nat i;
- for (i=0; i<=MAX_GRAN_DEBUG_OPTION; i++)
- if (rts_argv[arg][3] == gran_debug_opts_flags[i])
- break;
-
- if (i==MAX_GRAN_DEBUG_OPTION+1) {
- debugBelch("Valid GranSim debug options are:\n");
- help_GranSim_debug_options(MAX_GRAN_DEBUG_MASK);
- bad_option( rts_argv[arg] );
- } else { // flag found; now set it
- set_GranSim_debug_options(GRAN_DEBUG_MASK(i)); // 2^i
- }
- }
- break;
-
-#if 0
- case 'e': /* event trace; also -bD1 */
- debugBelch("DEBUG: event_trace; printing event trace.\n");
- RtsFlags.GranFlags.Debug.event_trace = rtsTrue;
- /* RtsFlags.GranFlags.event_trace=rtsTrue; */
- break;
-
- case 'E': /* event statistics; also -bD2 */
- debugBelch("DEBUG: event_stats; printing event statistics.\n");
- RtsFlags.GranFlags.Debug.event_stats = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x20; print event statistics */
- break;
-
- case 'f': /* thunkStealing; also -bD4 */
- debugBelch("DEBUG: thunkStealing; printing forwarding of FETCHNODES.\n");
- RtsFlags.GranFlags.Debug.thunkStealing = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x2; print fwd messages */
- break;
-
- case 'z': /* blockOnFetch; also -bD8 */
- debugBelch("DEBUG: blockOnFetch; check for blocked on fetch.\n");
- RtsFlags.GranFlags.Debug.blockOnFetch = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x4; debug non-reschedule-on-fetch */
- break;
-
- case 't': /* blockOnFetch_sanity; also -bD16 */
- debugBelch("DEBUG: blockOnFetch_sanity; check for TSO asleep on fetch.\n");
- RtsFlags.GranFlags.Debug.blockOnFetch_sanity = rtsTrue;
- /* RtsFlags.GranFlags.Debug |= 0x10; debug TSO asleep for fetch */
- break;
-
- case 'S': /* priSpark; also -bD32 */
- debugBelch("DEBUG: priSpark; priority sparking.\n");
- RtsFlags.GranFlags.Debug.priSpark = rtsTrue;
- break;
-
- case 's': /* priSched; also -bD64 */
- debugBelch("DEBUG: priSched; priority scheduling.\n");
- RtsFlags.GranFlags.Debug.priSched = rtsTrue;
- break;
-
- case 'F': /* findWork; also -bD128 */
- debugBelch("DEBUG: findWork; searching spark-pools (local & remote), thread queues for work.\n");
- RtsFlags.GranFlags.Debug.findWork = rtsTrue;
- break;
-
- case 'g': /* globalBlock; also -bD256 */
- debugBelch("DEBUG: globalBlock; blocking on remote closures (FETCHMEs etc in GUM).\n");
- RtsFlags.GranFlags.Debug.globalBlock = rtsTrue;
- break;
-
- case 'G': /* pack; also -bD512 */
- debugBelch("DEBUG: pack; routines for (un-)packing graph structures.\n");
- RtsFlags.GranFlags.Debug.pack = rtsTrue;
- break;
-
- case 'P': /* packBuffer; also -bD1024 */
- debugBelch("DEBUG: packBuffer; routines handling pack buffer (GranSim internal!).\n");
- RtsFlags.GranFlags.Debug.packBuffer = rtsTrue;
- break;
-
- case 'o': /* sortedQ; also -bD2048 */
- debugBelch("DEBUG: sortedQ; check whether spark/thread queues are sorted.\n");
- RtsFlags.GranFlags.Debug.sortedQ = rtsTrue;
- break;
-
- case 'r': /* randomSteal; also -bD4096 */
- debugBelch("DEBUG: randomSteal; stealing sparks/threads from random PEs.\n");
- RtsFlags.GranFlags.Debug.randomSteal = rtsTrue;
- break;
-
- case 'q': /* checkSparkQ; also -bD8192 */
- debugBelch("DEBUG: checkSparkQ; check consistency of the spark queues.\n");
- RtsFlags.GranFlags.Debug.checkSparkQ = rtsTrue;
- break;
-
- case ':': /* checkLight; also -bD16384 */
- debugBelch("DEBUG: checkLight; check GranSim-Light setup.\n");
- RtsFlags.GranFlags.Debug.checkLight = rtsTrue;
- break;
-
- case 'b': /* bq; also -bD32768 */
- debugBelch("DEBUG: bq; check blocking queues\n");
- RtsFlags.GranFlags.Debug.bq = rtsTrue;
- break;
-
- case 'd': /* all options turned on */
- debugBelch("DEBUG: all options turned on.\n");
- set_GranSim_debug_options(MAX_GRAN_DEBUG_MASK);
- /* RtsFlags.GranFlags.Debug |= 0x40; */
- break;
-
-/* case '\0': */
-/* RtsFlags.GranFlags.Debug = 1; */
-/* break; */
-#endif
-
- }
- break;
-# endif /* GRAN_CHECK */
- default:
- bad_option( rts_argv[arg] );
- break;
- }
-}
-
-/*
- Interpret n as a binary number masking GranSim debug options and set the
- correxponding option. See gran_debug_opts_strs for explanations of the flags.
-*/
-static void
-set_GranSim_debug_options(nat n) {
- nat i;
-
- for (i=0; i<=MAX_GRAN_DEBUG_OPTION; i++)
- if ((n>>i)&1) {
- errorBelch(gran_debug_opts_strs[i]);
- switch (i) {
- case 0: RtsFlags.GranFlags.Debug.event_trace = rtsTrue; break;
- case 1: RtsFlags.GranFlags.Debug.event_stats = rtsTrue; break;
- case 2: RtsFlags.GranFlags.Debug.bq = rtsTrue; break;
- case 3: RtsFlags.GranFlags.Debug.pack = rtsTrue; break;
- case 4: RtsFlags.GranFlags.Debug.checkSparkQ = rtsTrue; break;
- case 5: RtsFlags.GranFlags.Debug.thunkStealing = rtsTrue; break;
- case 6: RtsFlags.GranFlags.Debug.randomSteal = rtsTrue; break;
- case 7: RtsFlags.GranFlags.Debug.findWork = rtsTrue; break;
- case 8: RtsFlags.GranFlags.Debug.unused = rtsTrue; break;
- case 9: RtsFlags.GranFlags.Debug.pri = rtsTrue; break;
- case 10: RtsFlags.GranFlags.Debug.checkLight = rtsTrue; break;
- case 11: RtsFlags.GranFlags.Debug.sortedQ = rtsTrue; break;
- case 12: RtsFlags.GranFlags.Debug.blockOnFetch = rtsTrue; break;
- case 13: RtsFlags.GranFlags.Debug.packBuffer = rtsTrue; break;
- case 14: RtsFlags.GranFlags.Debug.blockOnFetch_sanity = rtsTrue; break;
- default: barf("set_GranSim_debug_options: only %d debug options expected");
- } /* switch */
- } /* if */
-}
-
-/*
- Print one line explanation for each of the GranSim debug options specified
- in the bitmask n.
-*/
-static void
-help_GranSim_debug_options(nat n) {
- nat i;
-
- for (i=0; i<=MAX_GRAN_DEBUG_OPTION; i++)
- if ((n>>i)&1)
- debugBelch(gran_debug_opts_strs[i]);