diff -r 222ed6c9364e -r fb8c5591428b ProcessorScheduler.st --- 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