--- 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