ProcessorScheduler.st
branchjv
changeset 20727 fb8c5591428b
parent 20080 093324d7a47c
parent 20643 cdc2a4259d4d
child 21024 8734987eb5c7
--- a/ProcessorScheduler.st	Wed Oct 12 07:05:13 2016 +0200
+++ b/ProcessorScheduler.st	Tue Oct 25 12:31:42 2016 +0100
@@ -264,15 +264,15 @@
     SchedulingPriority := 31.
 
     InvalidProcessSignal isNil ifTrue:[
-	InvalidProcessSignal := Error newSignalMayProceed:true.
-	InvalidProcessSignal nameClass:self message:#invalidProcessSignal.
-	InvalidProcessSignal notifierString:'invalid process'.
+        InvalidProcessSignal := Error newSignalMayProceed:true.
+        InvalidProcessSignal nameClass:self message:#invalidProcessSignal.
+        InvalidProcessSignal notifierString:'invalid process'.
     ].
 
     Processor isNil ifTrue:[
-	"create the one and only processor"
-
-	Processor := self basicNew initialize.
+        "create the one and only processor"
+
+        Smalltalk at:#Processor put:(self basicNew initialize).
     ].
 
     "
@@ -281,7 +281,7 @@
     "
     PureEventDriven := self threadsAvailable not.
     PureEventDriven ifTrue:[
-	'Processor [error]: no process support - running event driven' errorPrintCR
+        'Processor [error]: no process support - running event driven' errorPrintCR
     ].
     self initializeVMMaxProcessId
 
@@ -2340,52 +2340,62 @@
 
 disableFd:aFileDescriptor doSignal:doSignal
     "disable triggering of a semaphore for aFileDescriptor..
-     If doSignal is true, the associated semaphore is signaled."
+     If doSignal is true, the associated semaphore is signaled.
+     Answer a collection of semaphores that haven't been signaled."
 
     |idx "{ Class: SmallInteger }"
-     wasBlocked sema|
+     wasBlocked sema semaCollection|
 
     wasBlocked := OperatingSystem blockInterrupts.
     useIOInterrupts ifTrue:[
-	OperatingSystem disableIOInterruptsOn:aFileDescriptor.
+        OperatingSystem disableIOInterruptsOn:aFileDescriptor.
     ].
 
-    idx := readFdArray identityIndexOf:aFileDescriptor startingAt:1.
+    idx := readFdArray indexOf:aFileDescriptor startingAt:1.
     [idx ~~ 0] whileTrue:[
-	readFdArray at:idx put:nil.
-	readCheckArray at:idx put:nil.
-	(sema := readSemaphoreArray at:idx) notNil ifTrue:[
-	    readSemaphoreArray at:idx put:nil.
-	    doSignal ifTrue:[
-		sema signalForAll.
-	    ].
-	].
-	idx := readFdArray identityIndexOf:aFileDescriptor startingAt:idx+1.
+        readFdArray at:idx put:nil.
+        readCheckArray at:idx put:nil.
+        (sema := readSemaphoreArray at:idx) notNil ifTrue:[
+            readSemaphoreArray at:idx put:nil.
+            semaCollection isNil ifTrue:[semaCollection := Set new].
+            semaCollection add:sema.
+        ].
+        idx := readFdArray indexOf:aFileDescriptor startingAt:idx+1.
     ].
-    idx := writeFdArray identityIndexOf:aFileDescriptor startingAt:1.
+    idx := writeFdArray indexOf:aFileDescriptor startingAt:1.
     [idx ~~ 0] whileTrue:[
-	writeFdArray at:idx put:nil.
-	writeCheckArray at:idx put:nil.
-	(sema := writeSemaphoreArray at:idx) notNil ifTrue:[
-	    writeSemaphoreArray at:idx put:nil.
-	    doSignal ifTrue:[
-		sema signalForAll.
-	    ].
-	].
-	idx := writeFdArray identityIndexOf:aFileDescriptor startingAt:idx+1.
+        writeFdArray at:idx put:nil.
+        writeCheckArray at:idx put:nil.
+        (sema := writeSemaphoreArray at:idx) notNil ifTrue:[
+            writeSemaphoreArray at:idx put:nil.
+            semaCollection isNil ifTrue:[semaCollection := Set new].
+            semaCollection add:sema.
+        ].
+        idx := writeFdArray indexOf:aFileDescriptor startingAt:idx+1.
     ].
-    idx := exceptFdArray identityIndexOf:aFileDescriptor startingAt:1.
+    idx := exceptFdArray indexOf:aFileDescriptor startingAt:1.
     [idx ~~ 0] whileTrue:[
-	exceptFdArray at:idx put:nil.
-	(sema := exceptSemaphoreArray at:idx) notNil ifTrue:[
-	    exceptSemaphoreArray at:idx put:nil.
-	    doSignal ifTrue:[
-		sema signalForAll.
-	    ].
-	].
-	idx := exceptFdArray identityIndexOf:aFileDescriptor startingAt:idx+1.
+        exceptFdArray at:idx put:nil.
+        (sema := exceptSemaphoreArray at:idx) notNil ifTrue:[
+            exceptSemaphoreArray at:idx put:nil.
+            semaCollection isNil ifTrue:[semaCollection := Set new].
+            semaCollection add:sema.
+        ].
+        idx := exceptFdArray indexOf:aFileDescriptor startingAt:idx+1.
+    ].
+
+    semaCollection isNil ifTrue:[
+        semaCollection := #().
+    ] ifFalse:[
+        doSignal ifTrue:[
+            semaCollection do:[:eachSema|
+                eachSema signalForAll.
+                semaCollection := #().
+            ].
+        ].
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+    ^ semaCollection
 !
 
 disableSemaphore:aSemaphore