add freeStorage() prototype
[ghc-hetmet.git] / ghc / rts / Timer.c
index 425ada5..0bfea2d 100644 (file)
@@ -21,7 +21,6 @@
 #include "Timer.h"
 #include "Ticker.h"
 #include "Capability.h"
-#include "OSThreads.h"
 
 /* ticks left before next pre-emptive context switch */
 static int ticks_to_ctxt_switch = 0;
@@ -31,10 +30,6 @@ static int ticks_to_ctxt_switch = 0;
 static int ticks_to_gc = 0;
 #endif
 
-#if defined(THREADED_RTS)
-static void OSThreadProcAttr proddingThread(void *p);
-#endif
-
 /*
  * Function: handle_tick()
  *
@@ -53,53 +48,42 @@ handle_tick(int unused STG_UNUSED)
       if (ticks_to_ctxt_switch <= 0) {
          ticks_to_ctxt_switch = RtsFlags.ConcFlags.ctxtSwitchTicks;
          context_switch = 1;   /* schedule a context switch */
+      }
+  }
 
 #if defined(THREADED_RTS)
-         /* 
-          * If we've been inactive for idleGCDelayTicks (set by +RTS
-          * -I), tell the scheduler to wake up and do a GC, to check
-          * for threads that are deadlocked.
+  /* 
+   * If we've been inactive for idleGCDelayTicks (set by +RTS
+   * -I), tell the scheduler to wake up and do a GC, to check
+   * for threads that are deadlocked.
+   */
+  switch (recent_activity) {
+  case ACTIVITY_YES:
+      recent_activity = ACTIVITY_MAYBE_NO;
+      ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks;
+      break;
+  case ACTIVITY_MAYBE_NO:
+      if (ticks_to_gc == 0) break; /* 0 ==> no idle GC */
+      ticks_to_gc--;
+      if (ticks_to_gc == 0) {
+         ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks;
+         recent_activity = ACTIVITY_INACTIVE;
+         blackholes_need_checking = rtsTrue;
+         /* hack: re-use the blackholes_need_checking flag */
+         
+         /* ToDo: this doesn't work.  Can't invoke
+          * pthread_cond_signal from a signal handler.
+          * Furthermore, we can't prod a capability that we
+          * might be holding.  What can we do?
           */
-         switch (recent_activity) {
-         case ACTIVITY_YES:
-             recent_activity = ACTIVITY_MAYBE_NO;
-             ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks;
-             break;
-         case ACTIVITY_MAYBE_NO: {
-             OSThreadId id;
-             if (ticks_to_gc == 0) break; /* 0 ==> no idle GC */
-             ticks_to_gc--;
-             if (ticks_to_gc == 0) {
-                 ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks;
-                 recent_activity = ACTIVITY_INACTIVE;
-                 blackholes_need_checking = rtsTrue;
-                 /* hack: re-use the blackholes_need_checking flag */
-
-                 /* We can't prod the Capability from inside the
-                  * signal handler, because pthread_cond_signal()
-                  * doesn't work from signal handlers.  Let's hope
-                  * that pthread_create() works:
-                  */
-                 createOSThread(&id, proddingThread, NULL);
-             }
-             break;
-         }
-         default:
-             break;
-         }
-#endif
+         prodOneCapability();
       }
+      break;
+  default:
+      break;
   }
-}
-
-#if defined(THREADED_RTS)
-static void OSThreadProcAttr
-proddingThread(void *p STG_UNUSED)
-{
-    prodOneCapability();
-    // and exit again.
-}
 #endif
+}
 
 int
 startTimer(nat ms)