[project @ 1996-07-25 20:43:49 by partain]
[ghc-hetmet.git] / ghc / runtime / main / RtsFlags.lc
index 1fb72e8..417cc7f 100644 (file)
@@ -20,6 +20,10 @@ static void   bad_option(const char *);
 static FILE * open_stats_file (I_ arg,
                int argc, char *argv[], int rts_argc, char *rts_argv[],
                const char *FILENAME_FMT);
+#ifdef GRAN
+static void   process_gran_option(int arg, 
+               int *rts_argc, char *rts_argv[], rtsBool *error);
+#endif
 
 /* extern decls */
 long strtol  PROTO((const char *, char **, int));
@@ -69,7 +73,14 @@ initRtsFlagsDefaults (STG_NO_ARGS)
 #endif /* PROFILING or PAR */
 
 #ifdef PROFILING
-    RTSflags.ProfFlags.doHeapProfile   = rtsFalse;
+    RTSflags.ProfFlags.doHeapProfile = rtsFalse;
+
+    RTSflags.ProfFlags.ccSelector    = NULL;
+    RTSflags.ProfFlags.modSelector   = NULL;
+    RTSflags.ProfFlags.grpSelector   = NULL;
+    RTSflags.ProfFlags.descrSelector = NULL;
+    RTSflags.ProfFlags.typeSelector  = NULL;
+    RTSflags.ProfFlags.kindSelector  = NULL;
 #endif /* PROFILING */
 
 #ifdef CONCURRENT
@@ -89,6 +100,73 @@ initRtsFlagsDefaults (STG_NO_ARGS)
     RTSflags.ParFlags.packBufferSize   = 1024;
 #endif /* PAR */
 
+#ifdef GRAN
+    RTSflags.GranFlags.granSimStats    = rtsFalse;
+    RTSflags.GranFlags.granSimStats_suppressed = rtsFalse;
+    RTSflags.GranFlags.granSimStats_Binary = rtsFalse;
+    RTSflags.GranFlags.granSimStats_Sparks = rtsFalse;
+    RTSflags.GranFlags.granSimStats_Heap = rtsFalse;
+    RTSflags.GranFlags.labelling       = rtsFalse;
+    RTSflags.GranFlags.packBufferSize  = 1024;
+    RTSflags.GranFlags.packBufferSize_internal = GRANSIM_DEFAULT_PACK_BUFFER_SIZE;
+
+    RTSflags.GranFlags.proc  = MAX_PROC;
+    RTSflags.GranFlags.max_fishes = MAX_FISHES;
+    RTSflags.GranFlags.time_slice = GRAN_TIME_SLICE;
+    RTSflags.GranFlags.Light = rtsFalse;
+
+    RTSflags.GranFlags.gran_latency =             LATENCY;          
+    RTSflags.GranFlags.gran_additional_latency =  ADDITIONAL_LATENCY; 
+    RTSflags.GranFlags.gran_fetchtime =           FETCHTIME; 
+    RTSflags.GranFlags.gran_lunblocktime =        LOCALUNBLOCKTIME; 
+    RTSflags.GranFlags.gran_gunblocktime =        GLOBALUNBLOCKTIME;
+    RTSflags.GranFlags.gran_mpacktime =           MSGPACKTIME;      
+    RTSflags.GranFlags.gran_munpacktime =         MSGUNPACKTIME;
+    RTSflags.GranFlags.gran_mtidytime =           MSGTIDYTIME;
+
+    RTSflags.GranFlags.gran_threadcreatetime =         THREADCREATETIME;
+    RTSflags.GranFlags.gran_threadqueuetime =          THREADQUEUETIME;
+    RTSflags.GranFlags.gran_threaddescheduletime =     THREADDESCHEDULETIME;
+    RTSflags.GranFlags.gran_threadscheduletime =       THREADSCHEDULETIME;
+    RTSflags.GranFlags.gran_threadcontextswitchtime =  THREADCONTEXTSWITCHTIME;
+
+    RTSflags.GranFlags.gran_arith_cost =         ARITH_COST;       
+    RTSflags.GranFlags.gran_branch_cost =        BRANCH_COST; 
+    RTSflags.GranFlags.gran_load_cost =          LOAD_COST;        
+    RTSflags.GranFlags.gran_store_cost =         STORE_COST; 
+    RTSflags.GranFlags.gran_float_cost =         FLOAT_COST;       
+
+    RTSflags.GranFlags.gran_heapalloc_cost =     HEAPALLOC_COST;
+
+    RTSflags.GranFlags.gran_pri_spark_overhead = PRI_SPARK_OVERHEAD;        
+    RTSflags.GranFlags.gran_pri_sched_overhead = PRI_SCHED_OVERHEAD;        
+
+    RTSflags.GranFlags.DoFairSchedule = rtsFalse;             
+    RTSflags.GranFlags.DoReScheduleOnFetch = rtsFalse;        
+    RTSflags.GranFlags.DoStealThreadsFirst = rtsFalse;        
+    RTSflags.GranFlags.SimplifiedFetch = rtsFalse;            
+    RTSflags.GranFlags.DoAlwaysCreateThreads = rtsFalse;      
+    RTSflags.GranFlags.DoGUMMFetching = rtsFalse;             
+    RTSflags.GranFlags.DoThreadMigration = rtsFalse;          
+    RTSflags.GranFlags.FetchStrategy = 2;                     
+    RTSflags.GranFlags.PreferSparksOfLocalNodes = rtsFalse;   
+    RTSflags.GranFlags.DoPrioritySparking = rtsFalse;         
+    RTSflags.GranFlags.DoPriorityScheduling = rtsFalse;       
+    RTSflags.GranFlags.SparkPriority = 0;
+    RTSflags.GranFlags.SparkPriority2 = 0; 
+    RTSflags.GranFlags.RandomPriorities = rtsFalse;           
+    RTSflags.GranFlags.InversePriorities = rtsFalse;          
+    RTSflags.GranFlags.IgnorePriorities = rtsFalse;           
+    RTSflags.GranFlags.ThunksToPack = 0;                      
+    RTSflags.GranFlags.RandomSteal = rtsTrue;
+    RTSflags.GranFlags.NoForward = rtsFalse;
+    RTSflags.GranFlags.PrintFetchMisses = rtsFalse;
+
+    RTSflags.GranFlags.debug = 0x0;
+    RTSflags.GranFlags.event_trace = rtsFalse;
+    RTSflags.GranFlags.event_trace_all = rtsFalse;
+#endif
+
 #ifdef TICKY_TICKY
     RTSflags.TickyFlags.showTickyStats = rtsFalse;
     RTSflags.TickyFlags.tickyFile      = NULL;
@@ -152,7 +230,7 @@ usage_text[] = {
 "  -p<sort> Produce cost centre time profile  (output file <program>.prof)",
 "             sort: T = time (default), A = alloc, C = cost centre label",
 "  -P<sort> Produce serial time profile (output file <program>.time)",
-"             and a -p profile with detailed caf/enter/tick/alloc info",
+"             and a -p profile with detailed tick/alloc info",
 # if defined(PROFILING)
 "",
 "  -h<break-down> Heap residency profile      (output file <program>.hp)",
@@ -209,6 +287,9 @@ usage_text[] = {
 "  -d        Turn on PVM-ish debugging",
 "  -O        Disable output for performance measurement",
 # endif /* PAR */
+# ifdef GRAN  /* ToDo: fill in decent Docu here */
+"  -b...     All GranSim options start with -b; see GranSim User's Guide for details",
+# endif
 #endif /* CONCURRENT */
 "",
 "Other RTS options may be available for programs compiled a different way.",
@@ -326,7 +407,7 @@ error = rtsTrue;
 #endif
 
 #ifdef PROFILING
-# define PROFILING_BUILD_ONLY(x)
+# define PROFILING_BUILD_ONLY(x)   x
 #else
 # define PROFILING_BUILD_ONLY(x) \
 fprintf(stderr, "setupRtsFlags: GHC not built for: -prof\n"); \
@@ -334,7 +415,7 @@ error = rtsTrue;
 #endif
 
 #ifdef CONCURRENT
-# define CONCURRENT_BUILD_ONLY(x)
+# define CONCURRENT_BUILD_ONLY(x)  x
 #else
 # define CONCURRENT_BUILD_ONLY(x) \
 fprintf(stderr, "setupRtsFlags: GHC not built for: -concurrent\n"); \
@@ -342,7 +423,7 @@ error = rtsTrue;
 #endif
 
 #ifdef PAR
-# define PAR_BUILD_ONLY(x)
+# define PAR_BUILD_ONLY(x)      x
 #else
 # define PAR_BUILD_ONLY(x) \
 fprintf(stderr, "setupRtsFlags: GHC not built for: -parallel\n"); \
@@ -350,7 +431,7 @@ error = rtsTrue;
 #endif
 
 #ifdef GRAN
-# define GRAN_BUILD_ONLY(x)
+# define GRAN_BUILD_ONLY(x)     x
 #else
 # define GRAN_BUILD_ONLY(x) \
 fprintf(stderr, "setupRtsFlags: GHC not built for: -gransim\n"); \
@@ -458,20 +539,23 @@ error = rtsTrue;
                )
              case 'p': /* cost centre profiling (time/alloc) */
                COST_CENTRE_USING_BUILD_ONLY(
-               { char ch;
                RTSflags.CcFlags.doCostCentres++;
 
-               for (ch = 2; rts_argv[arg][ch]; ch++) {
                switch (rts_argv[arg][2]) {
                  case SORTCC_LABEL:
                  case SORTCC_TIME:
                  case SORTCC_ALLOC:
-                       RTSflags.CcFlags.sortBy = rts_argv[arg][ch];
+                       RTSflags.CcFlags.sortBy = rts_argv[arg][2];
                    break;
                  default:
+                   PAR_BUILD_ONLY(
+                   break; /* we do not care about sortBy for parallel */
+                   )
+                   PROFILING_BUILD_ONLY(
                    fprintf(stderr, "Invalid profiling sort option %s\n", rts_argv[arg]);
-                   error = 1;
-               }}}
+                   error = rtsTrue;
+                   )
+               }
                ) break;
 
              case 'i': /* serial profiling -- initial timer interval */
@@ -519,7 +603,7 @@ error = rtsTrue;
                  default:
                    fprintf(stderr, "Invalid heap profile option: %s\n",
                            rts_argv[arg]);
-                   error = 1;
+                   error = rtsTrue;
                }
                ) break;
 
@@ -530,41 +614,41 @@ error = rtsTrue;
                    max_cc_no = (hash_t) decode(rts_argv[arg]+3);
                    if (max_cc_no == 0) {
                        fprintf(stderr, "Bad number of cost centres %s\n", rts_argv[arg]);
-                       error = 1;
+                       error = rtsTrue;
                    }
                    break;
                  case MODchar:
                    max_mod_no = (hash_t) decode(rts_argv[arg]+3);
                    if (max_mod_no == 0) {
                        fprintf(stderr, "Bad number of modules %s\n", rts_argv[arg]);
-                       error = 1;
+                       error = rtsTrue;
                    }
                    break;
                  case GRPchar:
                    max_grp_no = (hash_t) decode(rts_argv[arg]+3);
                    if (max_grp_no == 0) {
                        fprintf(stderr, "Bad number of groups %s\n", rts_argv[arg]);
-                       error = 1;
+                       error = rtsTrue;
                    }
                    break;
                  case DESCRchar:
                    max_descr_no = (hash_t) decode(rts_argv[arg]+3);
                    if (max_descr_no == 0) {
                        fprintf(stderr, "Bad number of closure descriptions %s\n", rts_argv[arg]);
-                       error = 1;
+                       error = rtsTrue;
                    }
                    break;
                  case TYPEchar:
                    max_type_no = (hash_t) decode(rts_argv[arg]+3);
                    if (max_type_no == 0) {
                        fprintf(stderr, "Bad number of type descriptions %s\n", rts_argv[arg]);
-                       error = 1;
+                       error = rtsTrue;
                    }
                    break;
                  default:
                    fprintf(stderr, "Invalid index table size option: %s\n",
                            rts_argv[arg]);
-                   error = 1;
+                   error = rtsTrue;
                }
                ) break;
 
@@ -575,37 +659,37 @@ error = rtsTrue;
              case 'y': /* closure type select */
              case 'k': /* closure kind select */
                PROFILING_BUILD_ONLY(
+               {char *left  = strchr(rts_argv[arg], '{');
+                char *right = strrchr(rts_argv[arg], '}');
 
-               left  = strchr(rts_argv[arg], '{');
-               right = strrchr(rts_argv[arg], '}');
                if (! left || ! right ||
                        strrchr(rts_argv[arg], '{') != left ||
                         strchr(rts_argv[arg], '}') != right) {
                    fprintf(stderr, "Invalid heap profiling selection bracketing\n   %s\n", rts_argv[arg]);
-                   error = 1;
+                   error = rtsTrue;
                } else {
                    *right = '\0';
                    switch (rts_argv[arg][1]) {
                      case 'c': /* cost centre label select */
-                       select_cc = left + 1;
+                       RTSflags.ProfFlags.ccSelector = left + 1;
                        break;
                      case 'm': /* cost centre module select */
-                       select_mod = left + 1;
+                       RTSflags.ProfFlags.modSelector = left + 1;
                        break;
                      case 'g': /* cost centre group select */
-                       select_grp = left + 1;
+                       RTSflags.ProfFlags.grpSelector = left + 1;
                        break;
                      case 'd': /* closure descr select */
-                       select_descr = left + 1;
+                       RTSflags.ProfFlags.descrSelector = left + 1;
                        break;
                      case 't': /* closure type select */
-                       select_type = left + 1;
+                       RTSflags.ProfFlags.typeSelector = left + 1;
                        break;
                      case 'k': /* closure kind select */
-                       select_kind = left + 1;
+                       RTSflags.ProfFlags.kindSelector = left + 1;
                        break;
-               }
-               }
+                   }
+               }}
                ) break;
 
              /* =========== CONCURRENT ========================= */
@@ -704,7 +788,7 @@ error = rtsTrue;
 
              case 'b':
                GRAN_BUILD_ONLY(
-               process_gran_option();
+               process_gran_option(arg, rts_argc, rts_argv, &error);
                ) break;
 
              /* =========== TICKY ============================== */
@@ -739,393 +823,679 @@ error = rtsTrue;
 
 }
 
-#ifdef GRAN
+#if defined(GRAN)
+void
+enable_GrAnSimLight() {
+
+    fprintf(stderr,"GrAnSim Light enabled (infinite number of processors;  0 communication costs)\n");
+    RTSflags.GranFlags.Light=rtsTrue;
+    RTSflags.GranFlags.gran_latency = 
+       RTSflags.GranFlags.gran_fetchtime = 
+       RTSflags.GranFlags.gran_additional_latency =
+       RTSflags.GranFlags.gran_gunblocktime = 
+       RTSflags.GranFlags.gran_lunblocktime =
+       RTSflags.GranFlags.gran_threadcreatetime = 
+       RTSflags.GranFlags.gran_threadqueuetime =
+       RTSflags.GranFlags.gran_threadscheduletime = 
+       RTSflags.GranFlags.gran_threaddescheduletime =
+       RTSflags.GranFlags.gran_threadcontextswitchtime = 0;
+  
+    RTSflags.GranFlags.gran_mpacktime = 
+       RTSflags.GranFlags.gran_munpacktime = 0;
+
+    RTSflags.GranFlags.DoFairSchedule = rtsTrue;
+    RTSflags.GranFlags.DoReScheduleOnFetch = rtsFalse;
+    RTSflags.GranFlags.DoAlwaysCreateThreads = rtsTrue;
+    /* FetchStrategy is irrelevant in GrAnSim-Light */
+
+    /* GrAnSim Light often creates an abundance of parallel threads,
+       each with its own stack etc. Therefore, it's in general a good
+       idea to use small stack chunks (use the -o<size> option to 
+       increase it again). 
+    */
+    RTSflags.ConcFlags.stkChunkSize = 100;
+
+    RTSflags.GranFlags.proc = 1; 
+}
+
 static void
-process_gran_option()
+process_gran_option(int arg, int *rts_argc, char *rts_argv[], rtsBool *error)
 {
-    if (rts_argv[arg][2] != '\0') {
+    if (rts_argv[arg][1] != 'b') /* All GranSim options start with -b */
+      return;
 
       /* Should we emulate hbcpp */
-      if(strequal((rts_argv[arg]+2),"roken")) {
-       ++DoAlwaysCreateThreads;
+      if(strcmp((rts_argv[arg]+2),"roken")==0) {
+       RTSflags.GranFlags.DoAlwaysCreateThreads=rtsTrue;
        strcpy(rts_argv[arg]+2,"oring");
       }
 
       /* or a ridiculously idealised simulator */
-      if(strequal((rts_argv[arg]+2),"oring")) {
-       gran_latency = gran_fetchtime = gran_additional_latency =
-         gran_gunblocktime = gran_lunblocktime
-           = gran_threadcreatetime = gran_threadqueuetime
-             = gran_threadscheduletime = gran_threaddescheduletime
-               = gran_threadcontextswitchtime
-                 = 0;
-
-       gran_mpacktime = gran_munpacktime = 0;
-
-       gran_arith_cost = gran_float_cost = gran_load_cost
-         = gran_store_cost = gran_branch_cost = 0;
-
-       gran_heapalloc_cost = 1;
-
-       /* ++DoFairSchedule; */
-       ++DoStealThreadsFirst;
-       ++DoThreadMigration;
-       RTSflags.ParFlags.granSimStats = rtsTrue;
+      if(strcmp((rts_argv[arg]+2),"oring")==0) {
+       RTSflags.GranFlags.gran_latency = 
+       RTSflags.GranFlags.gran_fetchtime = 
+       RTSflags.GranFlags.gran_additional_latency =
+       RTSflags.GranFlags.gran_gunblocktime = 
+       RTSflags.GranFlags.gran_lunblocktime =
+       RTSflags.GranFlags.gran_threadcreatetime = 
+       RTSflags.GranFlags.gran_threadqueuetime =
+       RTSflags.GranFlags.gran_threadscheduletime = 
+       RTSflags.GranFlags.gran_threaddescheduletime =
+       RTSflags.GranFlags.gran_threadcontextswitchtime = 0;
+
+       RTSflags.GranFlags.gran_mpacktime = 
+       RTSflags.GranFlags.gran_munpacktime = 0;
+
+       RTSflags.GranFlags.gran_arith_cost = 
+       RTSflags.GranFlags.gran_float_cost = 
+       RTSflags.GranFlags.gran_load_cost =
+       RTSflags.GranFlags.gran_store_cost = 
+       RTSflags.GranFlags.gran_branch_cost = 0;
+
+       RTSflags.GranFlags.gran_heapalloc_cost = 1;
+
+       /* ++RTSflags.GranFlags.DoFairSchedule; */
+       RTSflags.GranFlags.DoStealThreadsFirst = rtsTrue;         /* -bZ */
+       RTSflags.GranFlags.DoThreadMigration  = rtsTrue;          /* -bM */
+       RTSflags.GranFlags.granSimStats = rtsTrue;                /* -bP */
+       return;
       }
 
-      /* or a ridiculously idealised simulator */
-      if(strequal((rts_argv[arg]+2),"onzo")) {
-       gran_latency = gran_fetchtime = gran_additional_latency =
-         gran_gunblocktime = gran_lunblocktime
-           = gran_threadcreatetime = gran_threadqueuetime
-             = gran_threadscheduletime = gran_threaddescheduletime
-               = gran_threadcontextswitchtime
-                 = 0;
-
-       gran_mpacktime = gran_munpacktime = 0;
-
-       /* Keep default values for these
-       gran_arith_cost = gran_float_cost = gran_load_cost
-         = gran_store_cost = gran_branch_cost = 0;
-         */
-
-       gran_heapalloc_cost = 1;
-
-       /* ++DoFairSchedule; */       /* -b-R */
-       /* ++DoStealThreadsFirst; */  /* -b-T */
-       ++DoReScheduleOnFetch;        /* -bZ */
-       ++DoThreadMigration;          /* -bM */
-       RTSflags.ParFlags.granSimStats = rtsTrue; /* -bP */
-#   if defined(GRAN_CHECK) && defined(GRAN)
-       debug = 0x20;       /* print event statistics   */
-#   endif
+      /* or a somewhat idealised simulator */
+      if(strcmp((rts_argv[arg]+2),"onzo")==0) {
+       RTSflags.GranFlags.gran_latency = 
+       RTSflags.GranFlags.gran_fetchtime = 
+       RTSflags.GranFlags.gran_additional_latency =
+       RTSflags.GranFlags.gran_gunblocktime = 
+       RTSflags.GranFlags.gran_lunblocktime =
+       RTSflags.GranFlags.gran_threadcreatetime = 
+       RTSflags.GranFlags.gran_threadqueuetime =
+       RTSflags.GranFlags.gran_threadscheduletime = 
+       RTSflags.GranFlags.gran_threaddescheduletime =
+       RTSflags.GranFlags.gran_threadcontextswitchtime = 0;
+
+       RTSflags.GranFlags.gran_mpacktime = 
+       RTSflags.GranFlags.gran_munpacktime = 0;
+       
+       RTSflags.GranFlags.gran_heapalloc_cost = 1;
+
+       /* RTSflags.GranFlags.DoFairSchedule  = rtsTrue; */       /* -b-R */
+       /* RTSflags.GranFlags.DoStealThreadsFirst = rtsTrue; */   /* -b-T */
+       RTSflags.GranFlags.DoReScheduleOnFetch = rtsTrue;         /* -bZ */
+       RTSflags.GranFlags.DoThreadMigration  = rtsTrue;          /* -bM */
+       RTSflags.GranFlags.granSimStats = rtsTrue;                /* -bP */
+#  if defined(GRAN_CHECK) && defined(GRAN)
+       RTSflags.GranFlags.debug = 0x20;       /* print event statistics   */
+#  endif
+       return;
       }
 
       /* Communication and task creation cost parameters */
-      else switch(rts_argv[arg][2]) {
-       case 'l':
+      switch(rts_argv[arg][2]) {
+        case ':':
+         enable_GrAnSimLight();       /* set flags for GrAnSim-Light mode */
+         break;
+
+        case 'l':
          if (rts_argv[arg][3] != '\0')
            {
-             gran_gunblocktime = gran_latency = decode(rts_argv[arg]+3);
-             gran_fetchtime = 2* gran_latency;
+             RTSflags.GranFlags.gran_gunblocktime = 
+             RTSflags.GranFlags.gran_latency = decode(rts_argv[arg]+3);
+             RTSflags.GranFlags.gran_fetchtime = 2*RTSflags.GranFlags.gran_latency;
            }
          else
-           gran_latency = LATENCY;
+           RTSflags.GranFlags.gran_latency = LATENCY;
          break;
 
-       case 'a':
+        case 'a':
          if (rts_argv[arg][3] != '\0')
-           gran_additional_latency = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_additional_latency = decode(rts_argv[arg]+3);
          else
-           gran_additional_latency = ADDITIONAL_LATENCY;
+           RTSflags.GranFlags.gran_additional_latency = ADDITIONAL_LATENCY;
          break;
 
-       case 'm':
+        case 'm':
          if (rts_argv[arg][3] != '\0')
-           gran_mpacktime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_mpacktime = decode(rts_argv[arg]+3);
          else
-           gran_mpacktime = MSGPACKTIME;
+           RTSflags.GranFlags.gran_mpacktime = MSGPACKTIME;
          break;
 
-       case 'x':
+        case 'x':
          if (rts_argv[arg][3] != '\0')
-           gran_mtidytime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_mtidytime = decode(rts_argv[arg]+3);
          else
-           gran_mtidytime = 0;
+           RTSflags.GranFlags.gran_mtidytime = 0;
          break;
 
-       case 'r':
+        case 'r':
          if (rts_argv[arg][3] != '\0')
-           gran_munpacktime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_munpacktime = decode(rts_argv[arg]+3);
          else
-           gran_munpacktime = MSGUNPACKTIME;
+           RTSflags.GranFlags.gran_munpacktime = MSGUNPACKTIME;
          break;
-
-       case 'f':
+         
+        case 'g':
          if (rts_argv[arg][3] != '\0')
-           gran_fetchtime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_fetchtime = decode(rts_argv[arg]+3);
          else
-           gran_fetchtime = FETCHTIME;
+           RTSflags.GranFlags.gran_fetchtime = FETCHTIME;
          break;
-
-       case 'n':
+         
+        case 'n':
          if (rts_argv[arg][3] != '\0')
-           gran_gunblocktime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_gunblocktime = decode(rts_argv[arg]+3);
          else
-           gran_gunblocktime = GLOBALUNBLOCKTIME;
+           RTSflags.GranFlags.gran_gunblocktime = GLOBALUNBLOCKTIME;
          break;
 
-       case 'u':
+        case 'u':
          if (rts_argv[arg][3] != '\0')
-           gran_lunblocktime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_lunblocktime = decode(rts_argv[arg]+3);
          else
-           gran_lunblocktime = LOCALUNBLOCKTIME;
+           RTSflags.GranFlags.gran_lunblocktime = LOCALUNBLOCKTIME;
          break;
 
        /* Thread-related metrics */
-       case 't':
+        case 't':
          if (rts_argv[arg][3] != '\0')
-           gran_threadcreatetime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_threadcreatetime = decode(rts_argv[arg]+3);
          else
-           gran_threadcreatetime = THREADCREATETIME;
+           RTSflags.GranFlags.gran_threadcreatetime = THREADCREATETIME;
          break;
-
-       case 'q':
+         
+        case 'q':
          if (rts_argv[arg][3] != '\0')
-           gran_threadqueuetime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_threadqueuetime = decode(rts_argv[arg]+3);
          else
-           gran_threadqueuetime = THREADQUEUETIME;
+           RTSflags.GranFlags.gran_threadqueuetime = THREADQUEUETIME;
          break;
-
-       case 'c':
+         
+        case 'c':
          if (rts_argv[arg][3] != '\0')
-           gran_threadscheduletime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_threadscheduletime = decode(rts_argv[arg]+3);
          else
-           gran_threadscheduletime = THREADSCHEDULETIME;
-
-         gran_threadcontextswitchtime = gran_threadscheduletime
-                                      + gran_threaddescheduletime;
+           RTSflags.GranFlags.gran_threadscheduletime = THREADSCHEDULETIME;
+         
+         RTSflags.GranFlags.gran_threadcontextswitchtime = RTSflags.GranFlags.gran_threadscheduletime
+           + RTSflags.GranFlags.gran_threaddescheduletime;
          break;
 
-       case 'd':
+        case 'd':
          if (rts_argv[arg][3] != '\0')
-           gran_threaddescheduletime = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_threaddescheduletime = decode(rts_argv[arg]+3);
          else
-           gran_threaddescheduletime = THREADDESCHEDULETIME;
-
-         gran_threadcontextswitchtime = gran_threadscheduletime
-                                      + gran_threaddescheduletime;
+           RTSflags.GranFlags.gran_threaddescheduletime = THREADDESCHEDULETIME;
+         
+         RTSflags.GranFlags.gran_threadcontextswitchtime = RTSflags.GranFlags.gran_threadscheduletime
+           + RTSflags.GranFlags.gran_threaddescheduletime;
          break;
 
        /* Instruction Cost Metrics */
-       case 'A':
+        case 'A':
          if (rts_argv[arg][3] != '\0')
-           gran_arith_cost = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_arith_cost = decode(rts_argv[arg]+3);
          else
-           gran_arith_cost = ARITH_COST;
+           RTSflags.GranFlags.gran_arith_cost = ARITH_COST;
          break;
 
-       case 'F':
+        case 'F':
          if (rts_argv[arg][3] != '\0')
-           gran_float_cost = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_float_cost = decode(rts_argv[arg]+3);
          else
-           gran_float_cost = FLOAT_COST;
+           RTSflags.GranFlags.gran_float_cost = FLOAT_COST;
          break;
-
-       case 'B':
+                     
+        case 'B':
          if (rts_argv[arg][3] != '\0')
-           gran_branch_cost = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_branch_cost = decode(rts_argv[arg]+3);
          else
-           gran_branch_cost = BRANCH_COST;
+           RTSflags.GranFlags.gran_branch_cost = BRANCH_COST;
          break;
 
-       case 'L':
+        case 'L':
          if (rts_argv[arg][3] != '\0')
-           gran_load_cost = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_load_cost = decode(rts_argv[arg]+3);
          else
-           gran_load_cost = LOAD_COST;
+           RTSflags.GranFlags.gran_load_cost = LOAD_COST;
+         break;
+         
+        case 'S':
+         if (rts_argv[arg][3] != '\0')
+           RTSflags.GranFlags.gran_store_cost = decode(rts_argv[arg]+3);
+         else
+           RTSflags.GranFlags.gran_store_cost = STORE_COST;
          break;
 
-       case 'S':
+        case 'H':
          if (rts_argv[arg][3] != '\0')
-           gran_store_cost = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_heapalloc_cost = decode(rts_argv[arg]+3);
          else
-           gran_store_cost = STORE_COST;
+           RTSflags.GranFlags.gran_heapalloc_cost = 0;
          break;
 
-       case 'H':
+        case 'y':
+         RTSflags.GranFlags.DoReScheduleOnFetch = rtsTrue;
+         if (rts_argv[arg][3] != '\0')
+           RTSflags.GranFlags.FetchStrategy = decode(rts_argv[arg]+3);
+         if (RTSflags.GranFlags.FetchStrategy == 0)
+           RTSflags.GranFlags.DoReScheduleOnFetch = rtsFalse;
+         else
+           RTSflags.GranFlags.FetchStrategy = 2; /* default: fetch everything */
+         break;
+         
+        case 'K':   /* sort overhead (per elem in spark list) */
          if (rts_argv[arg][3] != '\0')
-           gran_heapalloc_cost = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_pri_spark_overhead = decode(rts_argv[arg]+3);
          else
-           gran_heapalloc_cost = 0;
+           RTSflags.GranFlags.gran_pri_spark_overhead = PRI_SPARK_OVERHEAD;
+         fprintf(stderr,"Overhead for pri spark: %d (per elem).\n",
+                        RTSflags.GranFlags.gran_pri_spark_overhead);
          break;
 
-       case 'y':
+        case 'O':  /* sort overhead (per elem in spark list) */
          if (rts_argv[arg][3] != '\0')
-           FetchStrategy = decode(rts_argv[arg]+3);
+           RTSflags.GranFlags.gran_pri_sched_overhead = decode(rts_argv[arg]+3);
          else
-           FetchStrategy = 4; /* default: fetch everything */
+           RTSflags.GranFlags.gran_pri_sched_overhead = PRI_SCHED_OVERHEAD;
+         fprintf(stderr,"Overhead for pri sched: %d (per elem).\n",
+                      RTSflags.GranFlags.gran_pri_sched_overhead);
          break;
 
-       /* General Parameters */
-       case 'p':
+        /* General Parameters */
+        case 'p':
          if (rts_argv[arg][3] != '\0')
            {
-             max_proc = decode(rts_argv[arg]+3);
-             if(max_proc > MAX_PROC || max_proc < 1)
+             RTSflags.GranFlags.proc = decode(rts_argv[arg]+3);
+             if (RTSflags.GranFlags.proc==0) {
+                 enable_GrAnSimLight(); /* set flags for GrAnSim-Light mode */
+             } else if (RTSflags.GranFlags.proc > MAX_PROC || 
+                        RTSflags.GranFlags.proc < 1)
                {
-                 fprintf(stderr,"setupRtsFlags: no more than %u processors allowed\n", MAX_PROC);
-                 error = rtsTrue;
+                 fprintf(stderr,"setupRtsFlags: no more than %u processors
+allowed\n", 
+                         MAX_PROC);
+                 *error = rtsTrue;
                }
            }
          else
-           max_proc = MAX_PROC;
+           RTSflags.GranFlags.proc = MAX_PROC;
          break;
 
-       case 'C':
-         ++DoAlwaysCreateThreads;
-         ++DoThreadMigration;
+        case 'f':
+         if (rts_argv[arg][3] != '\0')
+           RTSflags.GranFlags.max_fishes = decode(rts_argv[arg]+3);
+         else
+           RTSflags.GranFlags.max_fishes = 1;
          break;
-
-       case 'G':
-         ++DoGUMMFetching;
+         
+        case 'w':
+         if (rts_argv[arg][3] != '\0')
+           RTSflags.GranFlags.time_slice = decode(rts_argv[arg]+3);
+         else
+           RTSflags.GranFlags.time_slice = GRAN_TIME_SLICE;
          break;
-
-       case 'M':
-         ++DoThreadMigration;
+         
+        case 'C':
+         RTSflags.GranFlags.DoAlwaysCreateThreads=rtsTrue;
+         RTSflags.GranFlags.DoThreadMigration=rtsTrue;
          break;
 
-       case 'R':
-         ++DoFairSchedule;
+        case 'G':
+         fprintf(stderr,"Bulk fetching enabled.\n");
+         RTSflags.GranFlags.DoGUMMFetching=rtsTrue;
          break;
-
-       case 'T':
-         ++DoStealThreadsFirst;
-         ++DoThreadMigration;
+         
+        case 'M':
+         fprintf(stderr,"Thread migration enabled.\n");
+         RTSflags.GranFlags.DoThreadMigration=rtsTrue;
          break;
 
-       case 'Z':
-         ++DoReScheduleOnFetch;
+        case 'R':
+         fprintf(stderr,"Fair Scheduling enabled.\n");
+         RTSflags.GranFlags.DoFairSchedule=rtsTrue;
+         break;
+         
+        case 'I':
+         fprintf(stderr,"Priority Scheduling enabled.\n");
+         RTSflags.GranFlags.DoPriorityScheduling=rtsTrue;
          break;
 
-       case 'z':
-         ++SimplifiedFetch;
+        case 'T':
+         RTSflags.GranFlags.DoStealThreadsFirst=rtsTrue;
+         RTSflags.GranFlags.DoThreadMigration=rtsTrue;
+         break;
+         
+        case 'Z':
+         RTSflags.GranFlags.DoReScheduleOnFetch=rtsTrue;
+         break;
+         
+        case 'z':
+         RTSflags.GranFlags.SimplifiedFetch=rtsTrue;
+         break;
+         
+        case 'N':
+         RTSflags.GranFlags.PreferSparksOfLocalNodes=rtsTrue;
+         break;
+         
+        case 'b':
+         RTSflags.GranFlags.granSimStats_Binary=rtsTrue;
+         break;
+         
+        case 'P':
+         RTSflags.GranFlags.granSimStats=rtsTrue;
          break;
 
-       case 'N':
-         ++PreferSparksOfLocalNodes;
+        case 's':
+         RTSflags.GranFlags.granSimStats_Sparks=rtsTrue;
          break;
 
-       case 'b':
-         RTSflags.ParFlags.granSimStats_Binary = rtsTrue;
+        case 'h':
+         RTSflags.GranFlags.granSimStats_Heap=rtsTrue;
          break;
 
-       case 'P':
-         RTSflags.ParFlags.granSimStats = rtsTrue;
+        case 'U':
+         RTSflags.GranFlags.labelling=rtsTrue;
          break;
 
-       case 's':
-         ++do_sp_profile;
+        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);
+             fprintf(stderr,"SparkPriority: %u.\n",RTSflags.GranFlags.SparkPriority);
+           } else {
+             *(tmp++) = '\0'; 
+             RTSflags.GranFlags.SparkPriority = decode(arg0);
+             RTSflags.GranFlags.SparkPriority2 = decode(tmp);
+             fprintf(stderr,"SparkPriority: %u.\n",
+                     RTSflags.GranFlags.SparkPriority);
+             fprintf(stderr,"SparkPriority2:%u.\n",
+                     RTSflags.GranFlags.SparkPriority2);
+             if (RTSflags.GranFlags.SparkPriority2 < 
+                 RTSflags.GranFlags.SparkPriority) {
+               fprintf(stderr,"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;
+              fprintf(stderr,"PrioritySparking.\n");
+           */
+         }
          break;
 
-       case '-':
+        case 'Q':
+         if (rts_argv[arg][3] != '\0') {
+           RTSflags.GranFlags.ThunksToPack = decode(rts_argv[arg]+3);
+         } else {
+           RTSflags.GranFlags.ThunksToPack = 1;
+         }
+         fprintf(stderr,"Thunks To Pack in one packet: %u.\n",
+                 RTSflags.GranFlags.ThunksToPack);
+         break;
+                     
+        case 'e':
+         RTSflags.GranFlags.RandomSteal = rtsFalse;
+         fprintf(stderr,"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;
+         }
+         fprintf(stderr,"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;
+             fprintf(stderr,"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;
+             fprintf(stderr,"Priority Sparking with Inverse Priorities.\n");
+             RTSflags.GranFlags.InversePriorities++; 
+             break;
+             
+           case 'R': 
+             RTSflags.GranFlags.DoPrioritySparking = 1;
+             fprintf(stderr,"Priority Sparking with Random Priorities.\n");
+             RTSflags.GranFlags.RandomPriorities++;
+             break;
+             
+           case 'N':
+             RTSflags.GranFlags.DoPrioritySparking = 1;
+             fprintf(stderr,"Priority Sparking with No Priorities.\n");
+             RTSflags.GranFlags.IgnorePriorities++;
+             break;
+             
+           default:
+             bad_option( rts_argv[arg] );
+             break;
+         }
+         break;
 
-          case 'C':
-            DoAlwaysCreateThreads=0;
-            DoThreadMigration=0;
-            break;
-
-          case 'G':
-            DoGUMMFetching=0;
-            break;
-
-          case 'M':
-            DoThreadMigration=0;
-            break;
+        case '-':
+         switch(rts_argv[arg][3]) {
+           
+           case 'C':
+             RTSflags.GranFlags.DoAlwaysCreateThreads=rtsFalse;
+             RTSflags.GranFlags.DoThreadMigration=rtsFalse;
+             break;
+
+           case 'G':
+             RTSflags.GranFlags.DoGUMMFetching=rtsFalse;
+             break;
+             
+           case 'M':
+             RTSflags.GranFlags.DoThreadMigration=rtsFalse;
+             break;
 
            case 'R':
-            DoFairSchedule=0;
-            break;
-
-          case 'T':
-            DoStealThreadsFirst=0;
-            DoThreadMigration=0;
-            break;
-
-          case 'Z':
-            DoReScheduleOnFetch=0;
-            break;
-
-          case 'N':
-            PreferSparksOfLocalNodes=0;
-            break;
-
-          case 'P':
-            RTSflags.ParFlags.granSimStats = rtsFalse;
-            no_gr_profile=1;
-            break;
-
-          case 's':
-            do_sp_profile=0;
-            break;
-
-          case 'b':
-            RTSflags.ParFlags.granSimStats_Binary = rtsFalse;
-            break;
-
-          default:
-            bad_option( rts_argv[arg] );
-            break;
-          }
+             RTSflags.GranFlags.DoFairSchedule=rtsFalse;
+             break;
+
+           case 'T':
+             RTSflags.GranFlags.DoStealThreadsFirst=rtsFalse;
+             RTSflags.GranFlags.DoThreadMigration=rtsFalse;
+             break;
+
+           case 'Z':
+             RTSflags.GranFlags.DoReScheduleOnFetch=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':
+#  if defined(GRAN_CHECK) && defined(GRAN)
+        case 'D':
          switch(rts_argv[arg][3]) {
-             case 'e':       /* event trace */
-               fprintf(stderr,"Printing event trace.\n");
-               ++event_trace;
-               break;
-
-             case 'f':
-               fprintf(stderr,"Printing forwarding of FETCHNODES.\n");
-               debug |= 0x2; /* print fwd messages */
-               break;
-
-             case 'z':
-               fprintf(stderr,"Check for blocked on fetch.\n");
-               debug |= 0x4; /* debug non-reschedule-on-fetch */
-               break;
-
-             case 't':
-               fprintf(stderr,"Check for TSO asleep on fetch.\n");
-               debug |= 0x10; /* debug TSO asleep for fetch  */
-               break;
-
-             case 'E':
-               fprintf(stderr,"Printing event statistics.\n");
-               debug |= 0x20; /* print event statistics   */
-               break;
-
-             case 'F':
-               fprintf(stderr,"Prohibiting forward.\n");
-               NoForward = 1; /* prohibit forwarding   */
-               break;
-
-             case 'm':
-               fprintf(stderr,"Printing fetch misses.\n");
-               PrintFetchMisses = 1; /* prohibit forwarding   */
-               break;
-
-             case 'd':
-               fprintf(stderr,"Debug mode.\n");
-               debug |= 0x40; 
-               break;
-
-             case 'D':
-               fprintf(stderr,"Severe debug mode.\n");
-               debug |= 0x80; 
-               break;
-
-             case '\0':
-               debug = 1;
-               break;
-
-             default:
-               bad_option( rts_argv[arg] );
-               break;
-             }
-         break;
-#   endif
-       default:
-         bad_option( rts_argv[arg] );
+           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);
+               fprintf(stderr,"Pack buffer size: %d\n",
+                       RTSflags.GranFlags.packBufferSize);
+             } else {
+               fprintf(stderr, "setupRtsFlags: missing size of PackBuffer (for -Q)\n");
+               error = rtsTrue;
+             }
+             break;
+
+           case 'e':       /* event trace */
+             fprintf(stderr,"Printing event trace.\n");
+             RTSflags.GranFlags.event_trace=rtsTrue;
+             break;
+             
+           case 'f':
+             fprintf(stderr,"Printing forwarding of FETCHNODES.\n");
+             RTSflags.GranFlags.debug |= 0x2; /* print fwd messages */
+             break;
+
+           case 'z':
+             fprintf(stderr,"Check for blocked on fetch.\n");
+             RTSflags.GranFlags.debug |= 0x4; /* debug non-reschedule-on-fetch */
+             break;
+             
+           case 't':
+             fprintf(stderr,"Check for TSO asleep on fetch.\n");
+             RTSflags.GranFlags.debug |= 0x10; /* debug TSO asleep for fetch  */
+             break;
+
+           case 'E':
+             fprintf(stderr,"Printing event statistics.\n");
+             RTSflags.GranFlags.debug |= 0x20; /* print event statistics   */
+             break;
+             
+           case 'F':
+             fprintf(stderr,"Prohibiting forward.\n");
+             RTSflags.GranFlags.NoForward = rtsTrue; /* prohibit forwarding   */
+             break;
+             
+           case 'm':
+             fprintf(stderr,"Printing fetch misses.\n");
+             RTSflags.GranFlags.PrintFetchMisses = rtsTrue; /* prohibit forwarding   */
+             break;
+
+           case 'd':
+             fprintf(stderr,"Debug mode.\n");
+             RTSflags.GranFlags.debug |= 0x40; 
+                           break;
+
+           case 'D':
+             fprintf(stderr,"Severe debug mode.\n");
+             RTSflags.GranFlags.debug |= 0x80; 
+             break;
+             
+           case 'q':
+             fprintf(stderr,"FULL event trace.\n");
+             RTSflags.GranFlags.event_trace_all =rtsTrue;
+             break;
+
+           case 'G':
+             fprintf(stderr,"Debugging packet fetching.\n");
+             RTSflags.GranFlags.debug |= 0x100; 
+             break;
+             
+           case 'n':
+             fprintf(stderr,"Ignore events till end of time slice\n");
+             RTSflags.GranFlags.debug |= 0x200; 
+              IgnoreEvents = rtsTrue;
+             break;
+
+           case 'S':
+             fprintf(stderr,"Check that spark queues are sorted.\n");
+             RTSflags.GranFlags.debug |= 0x400; 
+             break;
+
+           case 'H':
+             fprintf(stderr,"Print heap allocation messages (RBH).\n");
+             RTSflags.GranFlags.debug |= 0x800; 
+             break;
+
+           case 'p':
+             fprintf(stderr,"Debug breadth-first pruning.\n");
+             RTSflags.GranFlags.debug |= 0x1000; 
+             break;
+             
+           case 'r':
+             fprintf(stderr,"Debug random stealing.\n");
+             RTSflags.GranFlags.debug |= 0x2000; 
+             break;
+
+           case 'B':
+             fprintf(stderr,"Debug busyness.\n");
+             RTSflags.GranFlags.debug |= 0x4000; 
+             break;
+
+           case 'P':
+             fprintf(stderr,"Debug pack buffer handling.\n");
+             RTSflags.GranFlags.debug |= 0x8000; 
+             break;
+
+           case 's':
+             fprintf(stderr,"Debug spark-queue manipulations.\n");
+             RTSflags.GranFlags.debug |= 0x10000; 
+             break;
+             
+           case ':':
+             fprintf(stderr,"Debug GrAnSim Light.\n");
+             RTSflags.GranFlags.debug |= 0x20000; 
+             break;
+             
+           case '\0':
+             RTSflags.GranFlags.debug = 1;
+             break;
+
+           default:
+             bad_option( rts_argv[arg] );
+             break;
+         }
          break;
-       }
-    }
-    do_gr_sim++;
-    RTSflags.ConcFlags.ctxtSwitchTime = 0;
-}
+#  endif  /* GRAN_CHECK */
+      default:
+       bad_option( rts_argv[arg] );
+       break;
+     }
+}      
 #endif /* GRAN */
 \end{code}