[project @ 2000-08-15 14:18:43 by simonmar]
[ghc-hetmet.git] / ghc / rts / Schedule.c
index 05d44df..39cd819 100644 (file)
@@ -1,5 +1,5 @@
 /* ---------------------------------------------------------------------------
- * $Id: Schedule.c,v 1.73 2000/07/17 15:15:40 rrt Exp $
+ * $Id: Schedule.c,v 1.76 2000/08/15 14:18:43 simonmar Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
@@ -850,8 +850,16 @@ schedule( void )
     
     cap->rCurrentTSO = t;
     
-    /* context switches are now initiated by the timer signal */
-    context_switch = 0;
+    /* context switches are now initiated by the timer signal, unless
+     * the user specified "context switch as often as possible", with
+     * +RTS -C0
+     */
+    if (RtsFlags.ConcFlags.ctxtSwitchTicks == 0
+       && (run_queue_hd != END_TSO_QUEUE
+           || blocked_queue_hd != END_TSO_QUEUE))
+       context_switch = 1;
+    else
+       context_switch = 0;
 
     RELEASE_LOCK(&sched_mutex);
 
@@ -1352,7 +1360,6 @@ createThread_(nat size, rtsBool have_lock)
   tso->why_blocked  = NotBlocked;
   tso->blocked_exceptions = NULL;
 
-  tso->splim        = (P_)&(tso->stack) + RESERVED_STACK_WORDS;
   tso->stack_size   = stack_size;
   tso->max_stack_size = round_to_mblocks(RtsFlags.GcFlags.maxStkSize) 
                               - TSO_STRUCT_SIZEW;
@@ -1589,6 +1596,9 @@ initScheduler(void)
   context_switch = 0;
   interrupted    = 0;
 
+  RtsFlags.ConcFlags.ctxtSwitchTicks =
+      RtsFlags.ConcFlags.ctxtSwitchTime / TICK_MILLISECS;
+
 #ifdef INTERPRETER
   ecafList = END_ECAF_LIST;
   clearECafTable();
@@ -2075,7 +2085,6 @@ threadStackOverflow(StgTSO *tso)
   diff = (P_)new_sp - (P_)tso->sp; /* In *words* */
   dest->su    = (StgUpdateFrame *) ((P_)dest->su + diff);
   dest->sp    = new_sp;
-  dest->splim = (P_)dest->splim + (nat)((P_)dest - (P_)tso);
   dest->stack_size = new_stack_size;
        
   /* and relocate the update frame list */
@@ -2713,7 +2722,7 @@ raiseAsync(StgTSO *tso, StgClosure *exception)
              
       ap->n_args = 2;
       ap->fun = cf->handler;   /* :: Exception -> IO a */
-      ap->payload[0] = (P_)exception;
+      ap->payload[0] = exception;
       ap->payload[1] = ARG_TAG(0); /* realworld token */
 
       /* throw away the stack from Sp up to and including the
@@ -2761,7 +2770,7 @@ raiseAsync(StgTSO *tso, StgClosure *exception)
     ap->fun    = (StgClosure *)sp[0];
     sp++;
     for(i=0; i < (nat)words; ++i) {
-      ap->payload[i] = (P_)*sp++;
+      ap->payload[i] = (StgClosure *)*sp++;
     }
     
     switch (get_itbl(su)->type) {