ProcessorScheduler.st
changeset 18670 34a2526aa029
parent 18620 b4e9f25d6ce6
child 18673 5bc94bc1ebbb
child 18679 882c5a65fae3
--- a/ProcessorScheduler.st	Tue Aug 04 16:47:19 2015 +0200
+++ b/ProcessorScheduler.st	Tue Aug 04 22:06:11 2015 +0200
@@ -3319,6 +3319,29 @@
     "Modified: 4.8.1997 / 14:23:08 / cg"
 !
 
+noMoreUserProcesses    
+    "/ check if there are any processes at all
+    "/ stop dispatching if there is none
+    "/ (and anyTimeouts is false, which means that no timeout blocks are present)
+    "/ and no readSemaphores are present (which means that noone is waiting for input)
+    "/ and no writeSemaphores are present
+
+    |anySema|
+    
+    anyTimeouts ifFalse:[
+        anySema := (readSemaphoreArray findFirst:[:sema | sema notNil]) ~~ 0.
+        anySema ifFalse:[
+            anySema := (writeSemaphoreArray findFirst:[:sema | sema notNil]) ~~ 0.
+            anySema ifFalse:[
+                self anyUserProcessAtAll ifFalse:[
+                    ^ true
+                ]
+            ].
+        ].
+    ].
+    ^ false
+!
+
 removeCorruptedFds
     "this is sent when select returns an error due to some invalid
      fileDescriptor. May happen, if someone does a readWait/writeWait on a
@@ -3467,92 +3490,84 @@
      The idle actions are a leftover from previous ST/X releases and will
      vanish (installing a low-prio process has the same effect)."
 
-    |millis doingGC anySema dT|
+    |millis doingGC dT|
 
     doingGC := true.
     [doingGC] whileTrue:[
-	anyTimeouts ifTrue:[
-	    millis := self timeToNextTimeout.
-	    (millis notNil and:[millis <= 0]) ifTrue:[
-		^ self    "oops - hurry up checking"
-	    ].
-	].
-
-	"
-	 if its worth doing, collect a bit of garbage;
-	 but not, if a backgroundCollector is active
-	"
-	ObjectMemory backgroundCollectorRunning ifTrue:[
-	    doingGC := false
-	] ifFalse:[
-	    doingGC := ObjectMemory gcStepIfUseful.
-	].
-
-	"then do idle actions"
-	(idleActions notNil and:[idleActions size ~~ 0]) ifTrue:[
-	    idleActions do:[:aBlock |
-		aBlock value.
-	    ].
-	    ^ self   "go back checking"
-	].
-
-	doingGC ifTrue:[
-	    (self checkForIOWithTimeout:0) ifTrue:[
-		^ self  "go back checking"
-	    ]
-	]
+        anyTimeouts ifTrue:[
+            millis := self timeToNextTimeout.
+            (millis notNil and:[millis <= 0]) ifTrue:[
+                ^ self    "oops - hurry up checking"
+            ].
+        ].
+
+        "
+         if its worth doing, collect a bit of garbage;
+         but not, if a backgroundCollector is active
+        "
+        ObjectMemory backgroundCollectorRunning ifTrue:[
+            doingGC := false
+        ] ifFalse:[
+            doingGC := ObjectMemory gcStepIfUseful.
+        ].
+
+        "then do idle actions"
+        (idleActions notNil and:[idleActions size ~~ 0]) ifTrue:[
+            idleActions do:[:aBlock |
+                aBlock value.
+            ].
+            ^ self   "go back checking"
+        ].
+
+        doingGC ifTrue:[
+            (self checkForIOWithTimeout:0) ifTrue:[
+                ^ self  "go back checking"
+            ]
+        ]
     ].
 
     exitWhenNoMoreUserProcesses ifTrue:[
-	"/ check if there are any processes at all
-	"/ stop dispatching if there is none
-	"/ (and anyTimeouts is false, which means that no timeout blocks are present)
-	"/ and no readSemaphores are present (which means that noone is waiting for input)
-	"/ and no writeSemaphores are present
-
-	anyTimeouts ifFalse:[
-	    anySema := (readSemaphoreArray findFirst:[:sema | sema notNil]) ~~ 0.
-	    anySema ifFalse:[
-		anySema := (writeSemaphoreArray findFirst:[:sema | sema notNil]) ~~ 0.
-		anySema ifFalse:[
-		    self anyUserProcessAtAll ifFalse:[
-			dispatching := false.
-			^ self
-		    ]
-		].
-	    ].
-	].
+        "/ check if there are any processes at all
+        "/ stop dispatching if there is none
+        "/ (and anyTimeouts is false, which means that no timeout blocks are present)
+        "/ and no readSemaphores are present (which means that noone is waiting for input)
+        "/ and no writeSemaphores are present
+
+        self noMoreUserProcesses ifTrue:[
+            dispatching := false.
+            ^ self
+        ].
     ].
 
     preWaitActions notNil ifTrue:[
-	preWaitActions do:[:action | action value].
+        preWaitActions do:[:action | action value].
     ].
 
     "/
     "/ absolutely nothing to do - simply wait
     "/
     OperatingSystem supportsSelect ifFalse:[
-	"SCO instant ShitStation has a bug here,
-	 waiting always 1 sec in the select - therefore we delay a bit and
-	 return - effectively polling in 50ms cycles
-	"
-	(self checkForIOWithTimeout:0) ifTrue:[
-	    ^ self  "go back checking"
-	].
-	OperatingSystem millisecondDelay:EventPollingInterval.
-	^ self
+        "SCO instant ShitStation has a bug here,
+         waiting always 1 sec in the select - therefore we delay a bit and
+         return - effectively polling in 50ms cycles
+        "
+        (self checkForIOWithTimeout:0) ifTrue:[
+            ^ self  "go back checking"
+        ].
+        OperatingSystem millisecondDelay:EventPollingInterval.
+        ^ self
     ].
 
     useIOInterrupts ifTrue:[
-	dT := 999999
+        dT := 999999
     ] ifFalse:[
-	dT := EventPollingInterval
+        dT := EventPollingInterval
     ].
 
     millis isNil ifTrue:[
-	millis := dT.
+        millis := dT.
     ] ifFalse:[
-	millis := millis rounded min:dT.
+        millis := millis rounded min:dT.
     ].
 
     self checkForIOWithTimeout:millis