class: ProcessorScheduler
authorClaus Gittinger <cg@exept.de>
Tue, 20 Aug 2013 15:56:31 +0200
changeset 15658 f886d275e0fc
parent 15657 ffad68df93ca
child 15659 d39d7e301ecd
class: ProcessorScheduler changed: #highestPriorityRunnableProcess #makeRunnable: #suspend:
ProcessorScheduler.st
--- a/ProcessorScheduler.st	Tue Aug 20 15:51:59 2013 +0200
+++ b/ProcessorScheduler.st	Tue Aug 20 15:56:31 2013 +0200
@@ -1,6 +1,6 @@
 "
  COPYRIGHT (c) 1993 by Claus Gittinger
-	      All Rights Reserved
+              All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -12,24 +12,24 @@
 "{ Package: 'stx:libbasic' }"
 
 Object subclass:#ProcessorScheduler
-	instanceVariableNames:'quiescentProcessLists scheduler zombie activeProcess
-		activeProcessId currentPriority readFdArray readSemaphoreArray
-		readCheckArray writeFdArray writeSemaphoreArray writeCheckArray
-		timeoutArray timeoutActionArray timeoutProcessArray
-		timeoutSemaphoreArray idleActions anyTimeouts dispatching
-		interruptedProcess useIOInterrupts gotIOInterrupt
-		osChildExitActions gotChildSignalInterrupt
-		exitWhenNoMoreUserProcesses suspendScheduler timeSliceProcess
-		supportDynamicPriorities timeSliceNeededSemaphore
-		scheduledProcesses preWaitActions timeoutHandlerProcess
-		readableResultFdArray writableResultFdArray'
-	classVariableNames:'KnownProcesses KnownProcessIds PureEventDriven
-		UserSchedulingPriority UserInterruptPriority TimingPriority
-		HighestPriority SchedulingPriority MaxNumberOfProcesses
-		InvalidProcessSignal TimeSlicingPriorityLimit TimeSliceInterval
-		EventPollingInterval'
-	poolDictionaries:''
-	category:'Kernel-Processes'
+        instanceVariableNames:'quiescentProcessLists scheduler zombie activeProcess
+                activeProcessId currentPriority readFdArray readSemaphoreArray
+                readCheckArray writeFdArray writeSemaphoreArray writeCheckArray
+                timeoutArray timeoutActionArray timeoutProcessArray
+                timeoutSemaphoreArray idleActions anyTimeouts dispatching
+                interruptedProcess useIOInterrupts gotIOInterrupt
+                osChildExitActions gotChildSignalInterrupt
+                exitWhenNoMoreUserProcesses suspendScheduler timeSliceProcess
+                supportDynamicPriorities timeSliceNeededSemaphore
+                scheduledProcesses preWaitActions timeoutHandlerProcess
+                readableResultFdArray writableResultFdArray'
+        classVariableNames:'KnownProcesses KnownProcessIds PureEventDriven
+                UserSchedulingPriority UserInterruptPriority TimingPriority
+                HighestPriority SchedulingPriority MaxNumberOfProcesses
+                InvalidProcessSignal TimeSlicingPriorityLimit TimeSliceInterval
+                EventPollingInterval'
+        poolDictionaries:''
+        category:'Kernel-Processes'
 !
 
 !ProcessorScheduler class methodsFor:'documentation'!
@@ -37,7 +37,7 @@
 copyright
 "
  COPYRIGHT (c) 1993 by Claus Gittinger
-	      All Rights Reserved
+              All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -77,102 +77,102 @@
     (actually, it is no longer maintained, so dont run the system without Processes).
 
     [instance variables:]
-	quiescentProcessLists           - list of waiting processes
-	scheduler                       - the scheduler process itself
-	zombie                          - internal temporary (recently died process)
-	activeProcess                   - the current process
-	activeProcessId                 - the current processes id
-	currentPriority                 - the current processes priority
-	readFdArray                     - fd-sema-checkBlock triple-association
-	readSemaphoreArray                (stupid historic 3-separate arrays for hi-speed-optimization reasons)
-	readCheckArray
-	writeFdArray                    - fd-sema-checkBlock triple-association
-	writeSemaphoreArray               (stupid historic 3-separate arrays for hi-speed-optimization reasons)
-	writeCheckArray
-	timeoutArray                    - time-action-process-sema quadruple-association
-	timeoutActionArray                (stupid historic 3-separate arrays for hi-speed-optimization reasons)
-	timeoutProcessArray
-	timeoutSemaphoreArray
-	idleActions                     - actions to be executed when idle
-	preWaitActions                  - actions to be executed BEFORE going into an OS-wait
-	anyTimeouts                     - flag if any timeouts are pending
-	dispatching                     - flag if dispatch process is running (i.e. NOT initializing)
-	interruptedProcess              - the currently interrupted process.
-	useIOInterrupts                 - flag if the OS supports I/O interrupts and if they are used (to get me out of an OS wait)
-	gotIOInterrupt                  - flag if I came out of a wait due to an I/O interrupt
-	osChildExitActions              - OS chid process actions
-	gotChildSignalInterrupt         - flag if I came out of a wait due to an OS child interrupt
-	exitWhenNoMoreUserProcesses     - flag which controls if ST/X should exit when the last process dies (for standalone apps)
-	suspendScheduler                - internal use
-	timeSliceProcess                - the timeSlicer process
-	supportDynamicPriorities        - flag if dynamic priorities should be supported by the timeSlicer
-	scheduledProcesses              - list of scheduled processes for the timeSlicers dynamic prio handling
+        quiescentProcessLists           - list of waiting processes
+        scheduler                       - the scheduler process itself
+        zombie                          - internal temporary (recently died process)
+        activeProcess                   - the current process
+        activeProcessId                 - the current processes id
+        currentPriority                 - the current processes priority
+        readFdArray                     - fd-sema-checkBlock triple-association
+        readSemaphoreArray                (stupid historic 3-separate arrays for hi-speed-optimization reasons)
+        readCheckArray
+        writeFdArray                    - fd-sema-checkBlock triple-association
+        writeSemaphoreArray               (stupid historic 3-separate arrays for hi-speed-optimization reasons)
+        writeCheckArray
+        timeoutArray                    - time-action-process-sema quadruple-association
+        timeoutActionArray                (stupid historic 3-separate arrays for hi-speed-optimization reasons)
+        timeoutProcessArray
+        timeoutSemaphoreArray
+        idleActions                     - actions to be executed when idle
+        preWaitActions                  - actions to be executed BEFORE going into an OS-wait
+        anyTimeouts                     - flag if any timeouts are pending
+        dispatching                     - flag if dispatch process is running (i.e. NOT initializing)
+        interruptedProcess              - the currently interrupted process.
+        useIOInterrupts                 - flag if the OS supports I/O interrupts and if they are used (to get me out of an OS wait)
+        gotIOInterrupt                  - flag if I came out of a wait due to an I/O interrupt
+        osChildExitActions              - OS chid process actions
+        gotChildSignalInterrupt         - flag if I came out of a wait due to an OS child interrupt
+        exitWhenNoMoreUserProcesses     - flag which controls if ST/X should exit when the last process dies (for standalone apps)
+        suspendScheduler                - internal use
+        timeSliceProcess                - the timeSlicer process
+        supportDynamicPriorities        - flag if dynamic priorities should be supported by the timeSlicer
+        scheduledProcesses              - list of scheduled processes for the timeSlicers dynamic prio handling
 
     [class variables:]
 
-	KnownProcesses          <WeakArray>     all known processes
-	KnownProcessIds         <Collection>    and their IDs
-
-	PureEventDriven         <Boolean>       true, if no process support
-						is available
-
-	UserSchedulingPriority  <Integer>       the priority at which normal
-						user interfaces run
-
-	UserInterruptPriority                   the priority at which user-
-						interrupts (Cntl-C) processing
-						takes place. Processes with
-						a greater or equal priority are
-						not interruptable.
-
-	TimingPriority                          the priority used for timing.
-						Processes with a greater or
-						equal priority are not interrupted
-						by timers.
-
-	HighestPriority                         The highest allowed prio for processes
-
-	SchedulingPriority                      The priority of the scheduler (must
-						me higher than any other).
-
-	MaxNumberOfProcesses                    if non-nil, no more than this
-						number of processes are allowed
-						(for debugging)
-
-	TimeSliceInterval                       for preemptive priority scheduling only:
-						the time interval in millis, at which processes
-						are timesliced
-
-	TimeSlicingPriorityLimit                for preemptive priority scheduling only:
-						processes are only timesliced, if running
-						at or below this priority.
-
-	EventPollingInterval                    for systems which do not support select on
-						a fileDescriptor: the polling interval in millis.
+        KnownProcesses          <WeakArray>     all known processes
+        KnownProcessIds         <Collection>    and their IDs
+
+        PureEventDriven         <Boolean>       true, if no process support
+                                                is available
+
+        UserSchedulingPriority  <Integer>       the priority at which normal
+                                                user interfaces run
+
+        UserInterruptPriority                   the priority at which user-
+                                                interrupts (Cntl-C) processing
+                                                takes place. Processes with
+                                                a greater or equal priority are
+                                                not interruptable.
+
+        TimingPriority                          the priority used for timing.
+                                                Processes with a greater or
+                                                equal priority are not interrupted
+                                                by timers.
+
+        HighestPriority                         The highest allowed prio for processes
+
+        SchedulingPriority                      The priority of the scheduler (must
+                                                me higher than any other).
+
+        MaxNumberOfProcesses                    if non-nil, no more than this
+                                                number of processes are allowed
+                                                (for debugging)
+
+        TimeSliceInterval                       for preemptive priority scheduling only:
+                                                the time interval in millis, at which processes
+                                                are timesliced
+
+        TimeSlicingPriorityLimit                for preemptive priority scheduling only:
+                                                processes are only timesliced, if running
+                                                at or below this priority.
+
+        EventPollingInterval                    for systems which do not support select on
+                                                a fileDescriptor: the polling interval in millis.
 
     most interesting methods:
 
-	Processor>>suspend:                  (see also Process>>suspend)
-	Processor>>resume:                   (see also Process>>resume)
-	Processor>>terminate:                (see also Process>>terminate)
-	Processor>>yield
-	Processor>>changePriority:for:       (see also Process>>priority:
-
-	Processor>>signal:afterSeconds:      (see also Delay>>forSeconds:)
-	Processor>>signal:afterMilliseconds: (see also Delay>>forMilliseconds:)
-	Processor>>signal:onInput:           (see also ExternalStream>>readWait)
-	Processor>>signal:onOutput:          (see also ExternalStream>>writeWait)
-	Processor>>disableSemaphore:
+        Processor>>suspend:                  (see also Process>>suspend)
+        Processor>>resume:                   (see also Process>>resume)
+        Processor>>terminate:                (see also Process>>terminate)
+        Processor>>yield
+        Processor>>changePriority:for:       (see also Process>>priority:
+
+        Processor>>signal:afterSeconds:      (see also Delay>>forSeconds:)
+        Processor>>signal:afterMilliseconds: (see also Delay>>forMilliseconds:)
+        Processor>>signal:onInput:           (see also ExternalStream>>readWait)
+        Processor>>signal:onOutput:          (see also ExternalStream>>writeWait)
+        Processor>>disableSemaphore:
 
 
     [see also:]
-	Process
-	Delay Semaphore SemaphoreSet SharedQueue
-	WindowGroup
-	(``Working with processes'': programming/processes.html)
+        Process
+        Delay Semaphore SemaphoreSet SharedQueue
+        WindowGroup
+        (``Working with processes'': programming/processes.html)
 
     [author:]
-	Claus Gittinger
+        Claus Gittinger
 "
 !
 
@@ -210,16 +210,16 @@
     allows for critical processes to run unaffected to completion.
 
     WARNING:
-	timesliced priority scheduling is an experimental feature. There is no warranty,
-	(at the moment), that the system runs reliable in this mode.
-	The problem is, that shared collections may now be easily modified by other
-	processes, running at the same time.
-	The class library has being investigated for such possible trouble spots
-	(we have eliminated many weak spots, and added critical regions at many places,
-	 but cannot guarantee that all of them have been found so far ...)
-	We found that many existing public domain programs are not prepared for
-	being interrupted by a same-prio process and therefore may corrupt their
-	data. If in doubt, disable this fefature.
+        timesliced priority scheduling is an experimental feature. There is no warranty,
+        (at the moment), that the system runs reliable in this mode.
+        The problem is, that shared collections may now be easily modified by other
+        processes, running at the same time.
+        The class library has being investigated for such possible trouble spots
+        (we have eliminated many weak spots, and added critical regions at many places,
+         but cannot guarantee that all of them have been found so far ...)
+        We found that many existing public domain programs are not prepared for
+        being interrupted by a same-prio process and therefore may corrupt their
+        data. If in doubt, disable this fefature.
 
     We think, that the timeSlicer is a useful add-on and that the system is fit enough
     for it to be evaluated, therefore, its included.
@@ -227,10 +227,10 @@
 
     To demonstrate the effect of timeSlicing, do the following:
 
-	- disable timeSlicing (in the launchers misc-settings menu)
-	- open a workSpace
-	- in the workspace, evaluate:
-		[true] whileTrue:[1000 factorial]
+        - disable timeSlicing (in the launchers misc-settings menu)
+        - open a workSpace
+        - in the workspace, evaluate:
+                [true] whileTrue:[1000 factorial]
 
     now, (since the workSpace runs at the same prio as other window-processes),
     other views do no longer react - all CPU is used up by the workSpace.
@@ -260,15 +260,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"
+
+        Processor := self basicNew initialize.
     ].
 
     "
@@ -277,7 +277,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
     ].
 
     "Modified: 23.9.1996 / 14:24:50 / stefan"
@@ -311,22 +311,22 @@
     |id sz "{ Class: SmallInteger }"|
 
     something == #ElementExpired ifTrue:[
-	sz := KnownProcessIds size.
-	1 to:sz do:[:index |
-	    "/ (KnownProcesses at:index) isNil ifTrue:[
-	    (KnownProcesses at:index) == 0 ifTrue:[
-		id := KnownProcessIds at:index.
-		id notNil ifTrue:[
-		    'Processor [warning]: terminating thread ' errorPrint.
-		    id errorPrint.
-		    ' (no longer refd)' errorPrintCR.
-
-		    self threadDestroy:id.
-		    KnownProcessIds at:index put:nil.
-		].
-		KnownProcesses at:index put:nil.
-	    ]
-	]
+        sz := KnownProcessIds size.
+        1 to:sz do:[:index |
+            "/ (KnownProcesses at:index) isNil ifTrue:[
+            (KnownProcesses at:index) == 0 ifTrue:[
+                id := KnownProcessIds at:index.
+                id notNil ifTrue:[
+                    'Processor [warning]: terminating thread ' errorPrint.
+                    id errorPrint.
+                    ' (no longer refd)' errorPrintCR.
+
+                    self threadDestroy:id.
+                    KnownProcessIds at:index put:nil.
+                ].
+                KnownProcesses at:index put:nil.
+            ]
+        ]
     ]
 
     "Created: 7.1.1997 / 16:45:42 / stefan"
@@ -341,17 +341,17 @@
      This may raise an exception, if a VM process could not be created."
 
     MaxNumberOfProcesses notNil ifTrue:[
-	KnownProcessIds size >= MaxNumberOfProcesses ifTrue:[
-	    (KnownProcessIds count:[:el | el notNil]) >= MaxNumberOfProcesses ifTrue:[
-		"
-		 the number of processes has reached the (soft) limit.
-		 This limit prevents runaway programs from creating too many
-		 processes. If you continue in the debugger, the process will be
-		 created as usual. If you dont want this, abort or terminate.
-		"
-		self error:'too many processes'.
-	    ]
-	]
+        KnownProcessIds size >= MaxNumberOfProcesses ifTrue:[
+            (KnownProcessIds count:[:el | el notNil]) >= MaxNumberOfProcesses ifTrue:[
+                "
+                 the number of processes has reached the (soft) limit.
+                 This limit prevents runaway programs from creating too many
+                 processes. If you continue in the debugger, the process will be
+                 created as usual. If you dont want this, abort or terminate.
+                "
+                self error:'too many processes'.
+            ]
+        ]
     ].
 
 %{
@@ -359,11 +359,11 @@
     extern int __threadCreate();
 
     tid = __threadCreate(aProcess,
-			 0   /* stackSize: no longer needed */,
-			 __isSmallInteger(id) ? __intVal(id)     /* assign id */
-					      : -1              /* let VM assign one */  );
+                         0   /* stackSize: no longer needed */,
+                         __isSmallInteger(id) ? __intVal(id)     /* assign id */
+                                              : -1              /* let VM assign one */  );
     if (tid) {
-	RETURN ( __mkSmallInteger(tid));
+        RETURN ( __mkSmallInteger(tid));
     }
 %}
 .
@@ -383,7 +383,7 @@
 %{  /* NOCONTEXT */
 
     if (__isSmallInteger(id)) {
-	__threadDestroy(__intVal(id));
+        __threadDestroy(__intVal(id));
     }
 %}
 !
@@ -397,7 +397,7 @@
 %{  /* NOCONTEXT */
 
     if (__isSmallInteger(id)) {
-	__threadInterrupt(__intVal(id));
+        __threadInterrupt(__intVal(id));
     }
 %}
 !
@@ -439,7 +439,7 @@
     "evaluate aBlock for each (living) processes in the system"
 
     KnownProcesses do:[:p |
-	(p notNil and:[p ~~ 0]) ifTrue:[aBlock value:p]
+        (p notNil and:[p ~~ 0]) ifTrue:[aBlock value:p]
     ]
 
     "Created: / 26-10-2012 / 13:02:33 / cg"
@@ -485,20 +485,20 @@
 
     wasBlocked := OperatingSystem blockInterrupts.
     useIOInterrupts ifTrue:[
-	OperatingSystem disableIOInterruptsOn:aFileDescriptor
+        OperatingSystem disableIOInterruptsOn:aFileDescriptor
     ].
 
     idx := readFdArray identityIndexOf:aFileDescriptor startingAt:1.
     idx ~~ 0 ifTrue:[
-	readFdArray at:idx put:nil.
-	readCheckArray at:idx put:nil.
-	readSemaphoreArray at:idx put:nil
+        readFdArray at:idx put:nil.
+        readCheckArray at:idx put:nil.
+        readSemaphoreArray at:idx put:nil
     ].
     idx := writeFdArray identityIndexOf:aFileDescriptor startingAt:1.
     idx ~~ 0 ifTrue:[
-	writeFdArray at:idx put:nil.
-	writeCheckArray at:idx put:nil.
-	writeSemaphoreArray at:idx put:nil
+        writeFdArray at:idx put:nil.
+        writeCheckArray at:idx put:nil.
+        writeSemaphoreArray at:idx put:nil
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 
@@ -514,26 +514,26 @@
      wasBlocked|
 
     aFileDescriptor < 0 ifTrue:[
-	'Processor [warning]: ignored invalid fd for IO action.' errorPrintCR.
-	thisContext fullPrintAll.
-	^ self
+        'Processor [warning]: ignored invalid fd for IO action.' errorPrintCR.
+        thisContext fullPrintAll.
+        ^ self
     ].
 
     wasBlocked := OperatingSystem blockInterrupts.
     (readFdArray identityIndexOf:aFileDescriptor startingAt:1) == 0 ifTrue:[
-	idx := readFdArray identityIndexOf:nil startingAt:1.
-	idx ~~ 0 ifTrue:[
-	    readFdArray at:idx put:aFileDescriptor.
-	    readCheckArray at:idx put:aBlock.
-	    readSemaphoreArray at:idx put:nil
-	] ifFalse:[
-	    readFdArray := readFdArray copyWith:aFileDescriptor.
-	    readCheckArray := readCheckArray copyWith:aBlock.
-	    readSemaphoreArray := readSemaphoreArray copyWith:nil.
-	].
-	useIOInterrupts ifTrue:[
-	    OperatingSystem enableIOInterruptsOn:aFileDescriptor
-	].
+        idx := readFdArray identityIndexOf:nil startingAt:1.
+        idx ~~ 0 ifTrue:[
+            readFdArray at:idx put:aFileDescriptor.
+            readCheckArray at:idx put:aBlock.
+            readSemaphoreArray at:idx put:nil
+        ] ifFalse:[
+            readFdArray := readFdArray copyWith:aFileDescriptor.
+            readCheckArray := readCheckArray copyWith:aBlock.
+            readSemaphoreArray := readSemaphoreArray copyWith:nil.
+        ].
+        useIOInterrupts ifTrue:[
+            OperatingSystem enableIOInterruptsOn:aFileDescriptor
+        ].
 
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
@@ -602,7 +602,7 @@
 
     wasBlocked := OperatingSystem blockInterrupts.
     idleActions isNil ifTrue:[
-	idleActions := OrderedCollection new
+        idleActions := OrderedCollection new
     ].
     idleActions add:aBlock.
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
@@ -874,9 +874,9 @@
      p l|
 
     KnownProcesses isNil ifTrue:[
-	KnownProcesses := WeakArray new:30.
-	KnownProcesses addDependent:self class.
-	KnownProcessIds := OrderedCollection new.
+        KnownProcesses := WeakArray new:30.
+        KnownProcesses addDependent:self class.
+        KnownProcessIds := OrderedCollection new.
     ].
 
     "
@@ -899,7 +899,7 @@
     anyTimeouts := false.
     dispatching := false.
     exitWhenNoMoreUserProcesses isNil ifTrue:[
-	exitWhenNoMoreUserProcesses := false. "/ mhmh - how about true ?
+        exitWhenNoMoreUserProcesses := false. "/ mhmh - how about true ?
     ].
     useIOInterrupts := OperatingSystem supportsIOInterrupts.
     gotIOInterrupt := false.
@@ -956,16 +956,16 @@
     "
     processesToRestart := OrderedCollection new.
     KnownProcesses do:[:p |
-	(p notNil and:[p ~~ 0]) ifTrue:[
-	    "how, exactly should this be done ?"
-
-	    p isRestartable == true ifTrue:[
-		p nextLink:nil.
-		processesToRestart add:p
-	    ] ifFalse:[
-		p setId:nil state:#dead
-	    ]
-	].
+        (p notNil and:[p ~~ 0]) ifTrue:[
+            "how, exactly should this be done ?"
+
+            p isRestartable == true ifTrue:[
+                p nextLink:nil.
+                processesToRestart add:p
+            ] ifFalse:[
+                p setId:nil state:#dead
+            ]
+        ].
     ].
     scheduler setId:nil state:#dead.
 
@@ -976,7 +976,7 @@
     self initialize.
 
     processesToRestart do:[:p |
-	p imageRestart
+        p imageRestart
     ]
 
     "Modified: / 7.6.1998 / 02:23:56 / cg"
@@ -994,44 +994,44 @@
     |index pri aProcess l|
 
     OperatingSystem interruptsBlocked ifFalse:[
-	MiniDebugger
-	    enterWithMessage:'vmResumeInterrupt with no interruptsBlocked'
-	    mayProceed:true.
+        MiniDebugger
+            enterWithMessage:'vmResumeInterrupt with no interruptsBlocked'
+            mayProceed:true.
     ].
 
     index := KnownProcessIds identityIndexOf:id.
     index ~~ 0 ifTrue:[
-	aProcess := KnownProcesses at:index.
-	pri := aProcess priority.
-	l := quiescentProcessLists at:pri.
-	l notNil ifTrue:[
-	    (l includesIdentical:aProcess) ifTrue:[
-		"/ aProcess is on a run queue.
-		"/ CG: this situation may happen, if the wrapCall
-		"/ finishes before the process was layed to sleep
-		"/ (i.e. schedulerIRQ arrives before the threadSwitch was finished).
-		"/ In that case, simply resume it and everything is OK.
-		"/ If the process is state running, ignore.
-
-		|state|
-
-		state := aProcess state.
-		(state == #wrapWait or:[state == #osWait] or:[state == #stopped]) ifTrue:[
-		    aProcess state:#run.
-		].
-		'ProcSched [info]: resumeIRQ ignored for process: ' infoPrint.
-		aProcess id infoPrint. ' in state: ' infoPrint. state infoPrintCR.
-		^ self
-	    ]
-	] ifFalse:[
-	    l := LinkedList new.
-	    quiescentProcessLists at:pri put:l.
-	].
-	l addLast:aProcess.
-	aProcess state:#run.
+        aProcess := KnownProcesses at:index.
+        pri := aProcess priority.
+        l := quiescentProcessLists at:pri.
+        l notNil ifTrue:[
+            (l includesIdentical:aProcess) ifTrue:[
+                "/ aProcess is on a run queue.
+                "/ CG: this situation may happen, if the wrapCall
+                "/ finishes before the process was layed to sleep
+                "/ (i.e. schedulerIRQ arrives before the threadSwitch was finished).
+                "/ In that case, simply resume it and everything is OK.
+                "/ If the process is state running, ignore.
+
+                |state|
+
+                state := aProcess state.
+                (state == #wrapWait or:[state == #osWait] or:[state == #stopped]) ifTrue:[
+                    aProcess state:#run.
+                ].
+                'ProcSched [info]: resumeIRQ ignored for process: ' infoPrint.
+                aProcess id infoPrint. ' in state: ' infoPrint. state infoPrintCR.
+                ^ self
+            ]
+        ] ifFalse:[
+            l := LinkedList new.
+            quiescentProcessLists at:pri put:l.
+        ].
+        l addLast:aProcess.
+        aProcess state:#run.
     ] ifFalse:[
-	'ProcSched [info]: resumeIRQ for unknown process: ' infoPrint.
-	id infoPrintCR.
+        'ProcSched [info]: resumeIRQ for unknown process: ' infoPrint.
+        id infoPrintCR.
     ]
 
     "Modified: / 28.9.1998 / 11:36:53 / cg"
@@ -1048,19 +1048,19 @@
     |pri l newState|
 
     OperatingSystem interruptsBlocked ifFalse:[
-	MiniDebugger
-	    enterWithMessage:'immediateInterrupt with no interruptsBlocked'
-	    mayProceed:true.
+        MiniDebugger
+            enterWithMessage:'immediateInterrupt with no interruptsBlocked'
+            mayProceed:true.
     ].
 
     (whyCode == 2) ifTrue:[
-	 newState := #wrapWait.
+         newState := #wrapWait.
     ] ifFalse:[
-	(whyCode == 3) ifTrue:[
-	    newState := #osWait.
-	] ifFalse:[
-	    newState := #stopped.
-	].
+        (whyCode == 3) ifTrue:[
+            newState := #osWait.
+        ] ifFalse:[
+            newState := #stopped.
+        ].
     ].
     activeProcess setStateTo:newState if:#active.
 
@@ -1071,9 +1071,9 @@
      the ifAbsent block, because [] is a shared cheap block, created at compile time
     "
     (l isNil or:[(l removeIdentical:activeProcess ifAbsent:nil) isNil]) ifTrue:[
-	"/ 'Processor [warning]: bad vmSuspendInterrupt: not on run list' errorPrintCR.
-	MiniDebugger enterWithMessage:'bad vmSuspendInterrupt: not on run list' mayProceed:true.
-	^ self
+        "/ 'Processor [warning]: bad vmSuspendInterrupt: not on run list' errorPrintCR.
+        MiniDebugger enterWithMessage:'bad vmSuspendInterrupt: not on run list' mayProceed:true.
+        ^ self
     ].
 ! !
 
@@ -1087,8 +1087,8 @@
 
     gotChildSignalInterrupt := true.
     activeProcess ~~ scheduler ifTrue:[
-	interruptedProcess := activeProcess.
-	self threadSwitch:scheduler
+        interruptedProcess := activeProcess.
+        self threadSwitch:scheduler
     ]
 
     "Modified: 12.4.1996 / 10:12:18 / stefan"
@@ -1105,37 +1105,37 @@
     "/ no interrupt processing, to avoid races with monitorPid
     wasBlocked := OperatingSystem blockInterrupts.
     [
-	[
-	    osProcessStatus := OperatingSystem childProcessWait:blocking pid:nil.
-	    osProcessStatus notNil ifTrue:[
-		|pid action|
-
-		pid := osProcessStatus pid.
-		osProcessStatus stillAlive ifTrue:[
-		    action := osChildExitActions at:pid ifAbsent:nil.
-		] ifFalse:[
-		    action := osChildExitActions removeKey:pid ifAbsent:nil.
-		].
-		action notNil ifTrue:[
-		    action value:osProcessStatus
-		].
-	    ].
-
-	    "/ if pollChildProcesses does block, poll only one status change.
-	    "/ we will get another SIGCHLD for other status changes.
-
-	    osProcessStatus notNil and:[blocking not]
-	] whileTrue.
-
-	"/ if there are no more waiters, disable SIGCHILD handler.
-	"/ this helps us with synchronous waiters (e.g. pclose),
-	"/ But they should block SIGCHLD anyway.
-
-	osChildExitActions isEmpty ifTrue:[
-	    OperatingSystem disableChildSignalInterrupts.
-	].
+        [
+            osProcessStatus := OperatingSystem childProcessWait:blocking pid:nil.
+            osProcessStatus notNil ifTrue:[
+                |pid action|
+
+                pid := osProcessStatus pid.
+                osProcessStatus stillAlive ifTrue:[
+                    action := osChildExitActions at:pid ifAbsent:nil.
+                ] ifFalse:[
+                    action := osChildExitActions removeKey:pid ifAbsent:nil.
+                ].
+                action notNil ifTrue:[
+                    action value:osProcessStatus
+                ].
+            ].
+
+            "/ if pollChildProcesses does block, poll only one status change.
+            "/ we will get another SIGCHLD for other status changes.
+
+            osProcessStatus notNil and:[blocking not]
+        ] whileTrue.
+
+        "/ if there are no more waiters, disable SIGCHILD handler.
+        "/ this helps us with synchronous waiters (e.g. pclose),
+        "/ But they should block SIGCHLD anyway.
+
+        osChildExitActions isEmpty ifTrue:[
+            OperatingSystem disableChildSignalInterrupts.
+        ].
     ] ensure:[
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     ]
 
     "Modified: 5.1.1996 / 16:56:11 / stefan"
@@ -1156,67 +1156,67 @@
     |pid wasBlocked osProcessStatus|
 
     OperatingSystem supportsChildInterrupts ifTrue:[
-	"/ SIGCHLD is supported,
-	"/ aBlock will be evaluated, as soon as a SIGCHLD interrupt for pid has been received.
-
-	OperatingSystem enableChildSignalInterrupts.
-	wasBlocked := OperatingSystem blockInterrupts.
-	pid := aBlockReturningPid value.
-	pid notNil ifTrue:[
-	    osChildExitActions at:pid put:actionBlock.
-	].
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        "/ SIGCHLD is supported,
+        "/ aBlock will be evaluated, as soon as a SIGCHLD interrupt for pid has been received.
+
+        OperatingSystem enableChildSignalInterrupts.
+        wasBlocked := OperatingSystem blockInterrupts.
+        pid := aBlockReturningPid value.
+        pid notNil ifTrue:[
+            osChildExitActions at:pid put:actionBlock.
+        ].
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     ] ifFalse:[
-	"/ SIGCHLD is not supported, fork a high prio process
-	"/ to poll for for the exit of pid.
-
-	wasBlocked := OperatingSystem blockInterrupts.
-	pid := aBlockReturningPid value.
-	pid notNil ifTrue:[
-	    osChildExitActions at:pid put:actionBlock.
-	].
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-
-	pid notNil ifTrue:[
-	    [
-		[
-		  |polling myDelay t|
-
-		  polling := true.
-		  myDelay := Delay forMilliseconds:(t := EventPollingInterval).
-		  [polling] whileTrue:[
-		      t ~~ EventPollingInterval ifTrue:[
-			  "/ interval changed -> need a new delay
-			  myDelay delay:(t := EventPollingInterval).
-		      ].
-		      myDelay wait.
-		      (osChildExitActions includesKey:pid) ifFalse:[
-			  polling := false.
-		      ] ifTrue:[
-			  osProcessStatus := OperatingSystem childProcessWait:false pid:pid.
-			  osProcessStatus notNil ifTrue:[
-			      (osProcessStatus pid = pid) ifTrue:[
-				  OperatingSystem blockInterrupts.
-				  osChildExitActions removeKey:pid ifAbsent:nil.
-				  wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-				  actionBlock value:osProcessStatus.
-				  polling := false.
-			      ] ifFalse:[
-				  osProcessStatus stillAlive
-			      ]
-			  ]
-		      ].
-		  ]
-	      ] ifCurtailed:[
-		  OperatingSystem blockInterrupts.
-		  osChildExitActions removeKey:pid ifAbsent:nil.
-		  wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-	      ]
-	    ] newProcess
-		priority:TimingPriority;
+        "/ SIGCHLD is not supported, fork a high prio process
+        "/ to poll for for the exit of pid.
+
+        wasBlocked := OperatingSystem blockInterrupts.
+        pid := aBlockReturningPid value.
+        pid notNil ifTrue:[
+            osChildExitActions at:pid put:actionBlock.
+        ].
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+
+        pid notNil ifTrue:[
+            [
+                [
+                  |polling myDelay t|
+
+                  polling := true.
+                  myDelay := Delay forMilliseconds:(t := EventPollingInterval).
+                  [polling] whileTrue:[
+                      t ~~ EventPollingInterval ifTrue:[
+                          "/ interval changed -> need a new delay
+                          myDelay delay:(t := EventPollingInterval).
+                      ].
+                      myDelay wait.
+                      (osChildExitActions includesKey:pid) ifFalse:[
+                          polling := false.
+                      ] ifTrue:[
+                          osProcessStatus := OperatingSystem childProcessWait:false pid:pid.
+                          osProcessStatus notNil ifTrue:[
+                              (osProcessStatus pid = pid) ifTrue:[
+                                  OperatingSystem blockInterrupts.
+                                  osChildExitActions removeKey:pid ifAbsent:nil.
+                                  wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+                                  actionBlock value:osProcessStatus.
+                                  polling := false.
+                              ] ifFalse:[
+                                  osProcessStatus stillAlive
+                              ]
+                          ]
+                      ].
+                  ]
+              ] ifCurtailed:[
+                  OperatingSystem blockInterrupts.
+                  osChildExitActions removeKey:pid ifAbsent:nil.
+                  wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+              ]
+            ] newProcess
+                priority:TimingPriority;
 "/                beSystemProcess;
-		resume.
-	].
+                resume.
+        ].
     ].
     ^ pid
 
@@ -1241,10 +1241,10 @@
 
     self scheduleInterruptActionsOf:aProcess.
     aProcess state ~~ #stopped ifTrue:[
-	"
-	 make the process runnable
-	"
-	self resume:aProcess
+        "
+         make the process runnable
+        "
+        self resume:aProcess
     ]
 
     "Modified: / 24.8.1998 / 18:31:32 / cg"
@@ -1298,9 +1298,9 @@
     extern OBJ ___threadSwitch();
 
     if (__isSmallInteger(id)) {
-	ok = ___threadSwitch(__context, __intVal(id), (singleStep == true) ? 1 : 0, 0);
+        ok = ___threadSwitch(__context, __intVal(id), (singleStep == true) ? 1 : 0, 0);
     } else {
-	ok = false;
+        ok = false;
     }
 %}.
 
@@ -1313,40 +1313,40 @@
     currentPriority := oldProcess priority.
 
     ok == true ifFalse:[
-	"
-	 switch failed for some reason -
-	 destroy (hard-terminate) the bad process.
-	 This happens when:
-	 - the stack went above the absolute limit
-	   (VM switches back to scheduler)
-	 - a halted process cannot execute its interrupt
-	   actions (win32 only)
-	"
-	(id := p id) ~~ 0 ifTrue:[
-	    id notNil ifTrue:[
-		'Processor [warning]: problem with process ' errorPrint.
-		id errorPrint.
-		(nm := p name) notNil ifTrue:[
-		    ' (' errorPrint. nm errorPrint. ')' errorPrint.
-		].
-
-		ok == #halted ifTrue:[
-		    "/ that process was halted (win32 only)
-		    p state:#halted.
-		   '; stopped it.' errorPrintCR.
-		   self suspend:p.
-		] ifFalse:[
-		   '; hard-terminate it.' errorPrintCR.
-		   'Processor [info]: cleanup may take a while if stack is huge' infoPrintCR.
-		   p state:#cleanup.
-		   self terminateNoSignal:p.
-		]
-	    ]
-	]
+        "
+         switch failed for some reason -
+         destroy (hard-terminate) the bad process.
+         This happens when:
+         - the stack went above the absolute limit
+           (VM switches back to scheduler)
+         - a halted process cannot execute its interrupt
+           actions (win32 only)
+        "
+        (id := p id) ~~ 0 ifTrue:[
+            id notNil ifTrue:[
+                'Processor [warning]: problem with process ' errorPrint.
+                id errorPrint.
+                (nm := p name) notNil ifTrue:[
+                    ' (' errorPrint. nm errorPrint. ')' errorPrint.
+                ].
+
+                ok == #halted ifTrue:[
+                    "/ that process was halted (win32 only)
+                    p state:#halted.
+                   '; stopped it.' errorPrintCR.
+                   self suspend:p.
+                ] ifFalse:[
+                   '; hard-terminate it.' errorPrintCR.
+                   'Processor [info]: cleanup may take a while if stack is huge' infoPrintCR.
+                   p state:#cleanup.
+                   self terminateNoSignal:p.
+                ]
+            ]
+        ]
     ].
     zombie notNil ifTrue:[
-	self class threadDestroy:zombie.
-	zombie := nil
+        self class threadDestroy:zombie.
+        zombie := nil
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 
@@ -1460,17 +1460,17 @@
     index := 1.
     sz := KnownProcessIds size.
     [index <= sz] whileTrue:[
-	(KnownProcesses at:index) isNil ifTrue:[
-	    oldId := KnownProcessIds at:index.
-	    oldId notNil ifTrue:[
-		self class threadDestroy:oldId.
-	    ].
-	    KnownProcesses at:index put:aProcess.
-	    KnownProcessIds at:index put:aProcess id.
-	    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-	    ^ self
-	].
-	index := index + 1
+        (KnownProcesses at:index) isNil ifTrue:[
+            oldId := KnownProcessIds at:index.
+            oldId notNil ifTrue:[
+                self class threadDestroy:oldId.
+            ].
+            KnownProcesses at:index put:aProcess.
+            KnownProcessIds at:index put:aProcess id.
+            wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+            ^ self
+        ].
+        index := index + 1
     ].
 
     KnownProcessIds grow:index.
@@ -1478,10 +1478,10 @@
 
     oldSize := KnownProcesses size.
     (index > oldSize) ifTrue:[
-	newShadow := WeakArray new:(oldSize * 2).
-	newShadow addDependent:self class.
-	newShadow replaceFrom:1 with:KnownProcesses.
-	KnownProcesses := newShadow
+        newShadow := WeakArray new:(oldSize * 2).
+        newShadow addDependent:self class.
+        newShadow replaceFrom:1 with:KnownProcesses.
+        KnownProcesses := newShadow
     ].
     KnownProcesses at:index put:aProcess.
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
@@ -1497,8 +1497,8 @@
     wasBlocked := OperatingSystem blockInterrupts.
     index := KnownProcesses identityIndexOf:aProcess.
     index ~~ 0 ifTrue:[
-	KnownProcessIds at:index put:nil.
-	KnownProcesses at:index put:nil.
+        KnownProcessIds at:index put:nil.
+        KnownProcesses at:index put:nil.
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 ! !
@@ -1523,12 +1523,12 @@
     "private entry for Process restart - do not use in your program"
 
     idWant isNil ifTrue:[
-	self newProcessFor:aProcess.
-	^ true.
+        self newProcessFor:aProcess.
+        ^ true.
     ].
 
     (self class threadCreate:aProcess withId:idWant) ~~ idWant ifTrue:[
-	^ false
+        ^ false
     ].
 
     aProcess state:#light.   "meaning: has no stack yet"
@@ -1569,16 +1569,16 @@
     listArray := quiescentProcessLists.
 
     [prio >= 1] whileTrue:[
-	l := listArray at:prio.
-	l notNil ifTrue:[
-	    l do:[:aProcess |
-		aProcess processGroupId ~~ 0 ifTrue:[
-		    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-		    ^ true.
-		]
-	    ]
-	].
-	prio := prio - 1
+        l := listArray at:prio.
+        l notNil ifTrue:[
+            l do:[:aProcess |
+                aProcess processGroupId ~~ 0 ifTrue:[
+                    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+                    ^ true.
+                ]
+            ]
+        ].
+        prio := prio - 1
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     ^ false
@@ -1608,8 +1608,8 @@
                 "
                  if it got corrupted somehow ...
                 "
-                p id isNil ifTrue:[
-                    'Processor [warning]: process with nil id removed' errorPrintCR.
+                p isDead ifTrue:[
+                    'Processor [warning]: dead process removed' errorPrintCR.
                     l removeFirst.
                     p := nil.
                 ].
@@ -1674,48 +1674,48 @@
     "
     newPrio := prio.
     newPrio < 1 ifTrue:[
-	newPrio := 1.
+        newPrio := 1.
     ] ifFalse:[
-	newPrio > HighestPriority ifTrue:[
-	    newPrio := HighestPriority
-	]
+        newPrio > HighestPriority ifTrue:[
+            newPrio := HighestPriority
+        ]
     ].
 
     [
-	wasBlocked := OperatingSystem blockInterrupts.
-
-	aProcess setPriority:newPrio.
-
-	oldList := quiescentProcessLists at:oldPrio.
-	oldList notNil ifTrue:[
-	    (oldList removeIdentical:aProcess ifAbsent:nil) notNil ifTrue:[
-		newList := quiescentProcessLists at:newPrio.
-		newList isNil ifTrue:[
-		    quiescentProcessLists at:newPrio put:(newList := LinkedList new).
-		].
-		newList addLast:aProcess.
-
-		"if its the current process lowering its prio
-		 or another one raising, we have to reschedule"
-
-		aProcess == activeProcess ifTrue:[
-		    currentPriority := newPrio.
-		    newPrio < oldPrio ifTrue:[
-			self threadSwitch:scheduler.
-		    ]
-		] ifFalse:[
-		    newPrio > currentPriority ifTrue:[
-			self threadSwitch:aProcess.
-		    ]
-		].
-		timeSliceNeededSemaphore notNil ifTrue:[
-		    "/ tell timeslicer, that some work might be needed...
-		    timeSliceNeededSemaphore signalIf.
-		]
-	    ]
-	]
+        wasBlocked := OperatingSystem blockInterrupts.
+
+        aProcess setPriority:newPrio.
+
+        oldList := quiescentProcessLists at:oldPrio.
+        oldList notNil ifTrue:[
+            (oldList removeIdentical:aProcess ifAbsent:nil) notNil ifTrue:[
+                newList := quiescentProcessLists at:newPrio.
+                newList isNil ifTrue:[
+                    quiescentProcessLists at:newPrio put:(newList := LinkedList new).
+                ].
+                newList addLast:aProcess.
+
+                "if its the current process lowering its prio
+                 or another one raising, we have to reschedule"
+
+                aProcess == activeProcess ifTrue:[
+                    currentPriority := newPrio.
+                    newPrio < oldPrio ifTrue:[
+                        self threadSwitch:scheduler.
+                    ]
+                ] ifFalse:[
+                    newPrio > currentPriority ifTrue:[
+                        self threadSwitch:aProcess.
+                    ]
+                ].
+                timeSliceNeededSemaphore notNil ifTrue:[
+                    "/ tell timeslicer, that some work might be needed...
+                    timeSliceNeededSemaphore signalIf.
+                ]
+            ]
+        ]
     ] ensure:[
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     ]
 
     "Modified: / 4.8.1998 / 00:08:54 / cg"
@@ -1737,13 +1737,13 @@
 
     s := thisContext sender.
     s selector == #threadSwitchFrom:to:id:singleStep: ifTrue:[
-	s := s sender.
-	s selector == #threadSwitch: ifTrue:[
-	    s := s sender.
-	    s selector == #timerInterrupt ifTrue:[
-		s := s sender
-	    ]
-	]
+        s := s sender.
+        s selector == #threadSwitch: ifTrue:[
+            s := s sender.
+            s selector == #timerInterrupt ifTrue:[
+                s := s sender
+            ]
+        ]
     ].
 
     "/ the returned value here has a subtle effect:
@@ -1840,8 +1840,8 @@
      if its prio is higher than the currently running prio, switch to it."
 
     (self makeRunnable:aProcess) ifTrue:[
-	"aProcess prio is higher; immediately transfer control to it"
-	self threadSwitch:aProcess.
+        "aProcess prio is higher; immediately transfer control to it"
+        self threadSwitch:aProcess.
     ].
 !
 
@@ -1861,8 +1861,8 @@
      If the process is the current one, reschedule.
 
      Notice:
-	 This method should only be called by Process>>suspend or
-	 Process>>suspendWithState:"
+         This method should only be called by Process>>suspend or
+         Process>>suspendWithState:"
 
     |pri l p wasBlocked|
 
@@ -1870,30 +1870,30 @@
      some debugging stuff
     "
     aProcess isNil ifTrue:[
-	InvalidProcessSignal raiseRequestWith:aProcess errorString:'nil suspend'.
-	^ self
+        InvalidProcessSignal raiseRequestWith:aProcess errorString:'nil suspend'.
+        ^ self
     ].
-    aProcess id isNil ifTrue:[
-	InvalidProcessSignal raiseRequestWith:aProcess errorString:'bad suspend: already dead'.
-	self threadSwitch:scheduler.
-	^ self
+    aProcess isDead ifTrue:[
+        InvalidProcessSignal raiseRequestWith:aProcess errorString:'bad suspend: already dead'.
+        self threadSwitch:scheduler.
+        ^ self
     ].
     aProcess == scheduler ifTrue:[
-	"only the scheduler may suspend itself"
-	activeProcess == scheduler ifTrue:[
-	    suspendScheduler := true.
-	    [suspendScheduler] whileTrue:[
-		self dispatch.
-	    ].
-	    ^ self
-	].
-
-	InvalidProcessSignal raiseRequestWith:aProcess errorString:'attempt to suspend scheduler'.
-	^ self
+        "only the scheduler may suspend itself"
+        activeProcess == scheduler ifTrue:[
+            suspendScheduler := true.
+            [suspendScheduler] whileTrue:[
+                self dispatch.
+            ].
+            ^ self
+        ].
+
+        InvalidProcessSignal raiseRequestWith:aProcess errorString:'attempt to suspend scheduler'.
+        ^ self
     ].
 
     aProcess hasInterruptActions ifTrue:[
-	aProcess interrupt.
+        aProcess interrupt.
     ].
 
     wasBlocked := OperatingSystem blockInterrupts.
@@ -1905,23 +1905,23 @@
      the ifAbsent block, because [] is a shared cheap block, created at compile time
     "
     (l isNil or:[(l removeIdentical:aProcess ifAbsent:nil) isNil]) ifTrue:[
-	"/ 'Processor [warning]: bad suspend: process is not running' errorPrintCR.
-	"/ MiniDebugger enterWithMessage:'bad suspend: process is not running'.
-	aProcess == activeProcess ifTrue:[
-	    self threadSwitch:scheduler.
-	].
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-	^ self
+        "/ 'Processor [warning]: bad suspend: process is not running' errorPrintCR.
+        "/ MiniDebugger enterWithMessage:'bad suspend: process is not running'.
+        aProcess == activeProcess ifTrue:[
+            self threadSwitch:scheduler.
+        ].
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        ^ self
     ].
 
     (aProcess == activeProcess) ifTrue:[
-	"we can immediately switch sometimes"
-	l isEmpty ifTrue:[
-	    p := scheduler
-	] ifFalse:[
-	    p := l first
-	].
-	self threadSwitch:p
+        "we can immediately switch sometimes"
+        l isEmpty ifTrue:[
+            p := scheduler
+        ] ifFalse:[
+            p := l first
+        ].
+        self threadSwitch:p
     ].
 
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
@@ -1968,16 +1968,16 @@
 
     aProcess isNil ifTrue:[^ self].
     aProcess == scheduler ifTrue:[
-	InvalidProcessSignal raiseWith:aProcess errorString:'attempt to terminate scheduler'.
-	^ self
+        InvalidProcessSignal raiseWith:aProcess errorString:'attempt to terminate scheduler'.
+        ^ self
     ].
 
     wasBlocked := OperatingSystem blockInterrupts.
 
     id := aProcess id.
     id isNil ifTrue:[   "already dead"
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-	^ self
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        ^ self
     ].
 
     aProcess setId:nil state:#dead.
@@ -1987,31 +1987,31 @@
     pri := aProcess priority.
     l := quiescentProcessLists at:pri.
     l notNil ifTrue:[
-	(l removeIdentical:aProcess ifAbsent:nil) "notNil ifTrue:[
-	    l isEmpty ifTrue:[
-		quiescentProcessLists at:pri put:nil
-	    ]
-	]."
+        (l removeIdentical:aProcess ifAbsent:nil) "notNil ifTrue:[
+            l isEmpty ifTrue:[
+                quiescentProcessLists at:pri put:nil
+            ]
+        ]."
     ].
 
     aProcess == activeProcess ifTrue:[
-	"
-	 hard case - it's the currently running process
-	 we must have the next active process destroy this one
-	 (we cannot destroy the chair we are sitting on ... :-)
-	"
-	zombie notNil ifTrue:[
-	    self error:'active process is zombie' mayProceed:true.
-	    self class threadDestroy:zombie.
-	].
-
-	self unRemember:aProcess.
-	zombie := id.
-
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-	self threadSwitch:scheduler.
-	"not reached"
-	^ self
+        "
+         hard case - it's the currently running process
+         we must have the next active process destroy this one
+         (we cannot destroy the chair we are sitting on ... :-)
+        "
+        zombie notNil ifTrue:[
+            self error:'active process is zombie' mayProceed:true.
+            self class threadDestroy:zombie.
+        ].
+
+        self unRemember:aProcess.
+        zombie := id.
+
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        self threadSwitch:scheduler.
+        "not reached"
+        ^ self
     ].
 
     self unRemember:aProcess.
@@ -2034,16 +2034,16 @@
     wasBlocked := OperatingSystem blockInterrupts.
 
     activeProcess == scheduler ifTrue:[
-	'Processor [warning]: scheduler tries to yield' errorPrintCR.
-	^ self
+        'Processor [warning]: scheduler tries to yield' errorPrintCR.
+        ^ self
     ].
 
     "
      debugging consistency check - will be removed later
     "
     activeProcess priority ~~ currentPriority ifTrue:[
-	'Processor [warning]: process changed its priority' errorPrintCR.
-	currentPriority := activeProcess priority.
+        'Processor [warning]: process changed its priority' errorPrintCR.
+        currentPriority := activeProcess priority.
     ].
 
     l := quiescentProcessLists at:currentPriority.
@@ -2053,25 +2053,25 @@
      debugging consistency checks - will be removed later
     "
     sz == 0 ifTrue:[
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
-	'Processor [warning]: empty runnable list' errorPrintCR.
-	^ self
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        'Processor [warning]: empty runnable list' errorPrintCR.
+        ^ self
     ].
 
     "
      check if the running process is not the only one
     "
     sz ~~ 1 ifTrue:[
-	"
-	 bring running process to the end
-	"
-	l removeFirst.
-	l addLast:activeProcess.
-
-	"
-	 and switch to first in the list
-	"
-	self threadSwitch:(l first).
+        "
+         bring running process to the end
+        "
+        l removeFirst.
+        l addLast:activeProcess.
+
+        "
+         and switch to first in the list
+        "
+        self threadSwitch:(l first).
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 
@@ -2171,14 +2171,14 @@
     i := TimeSlicingPriorityLimit.
     [(i > 0) and:[(list := quiescentProcessLists at:i) size <= 1]] whileTrue: [i := i - 1].
     i ~~ 0 ifTrue: [
-	"/ shuffle that list
-	list addLast:(list removeFirst).
-	anyShuffle := true.
+        "/ shuffle that list
+        list addLast:(list removeFirst).
+        anyShuffle := true.
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     anyShuffle ifFalse:[
-	"/ wait for the scheduler to make some process runnable...
-	timeSliceNeededSemaphore wait.
+        "/ wait for the scheduler to make some process runnable...
+        timeSliceNeededSemaphore wait.
     ].
 
     "Modified: / 4.8.1998 / 00:13:32 / cg"
@@ -2192,37 +2192,37 @@
     timeSliceNeededSemaphore := Semaphore new name:'timeSlice needed'.
 
     timeSliceProcess := [
-	[
-	    |myDelay t flipFlop|
-
-	    myDelay := Delay forMilliseconds:(t := TimeSliceInterval).
-	    flipFlop := true.
-
-	    'Processor [info]: timeslicer started' infoPrintCR.
-	    [true] whileTrue: [
-		t ~~ TimeSliceInterval ifTrue:[
-		    "/ interval changed -> need a new delay
-		    myDelay delay:(t := TimeSliceInterval).
-		].
-		myDelay wait.
-		self slice.
-
-		"/ every other tick, recompute priorities.
-		flipFlop := flipFlop not.
-		flipFlop ifTrue:[
-		    scheduledProcesses notNil ifTrue:[
-			supportDynamicPriorities == true ifTrue:[
-			    self recomputeDynamicPriorities.
-			].
-			scheduledProcesses removeAll.
-		    ].
-		    scheduledProcesses := IdentitySet new.
-		].
-	    ]
-	] ifCurtailed:[
-	    timeSliceProcess := nil.
-	    'Processor [info]: timeslicer finished' infoPrintCR.
-	]
+        [
+            |myDelay t flipFlop|
+
+            myDelay := Delay forMilliseconds:(t := TimeSliceInterval).
+            flipFlop := true.
+
+            'Processor [info]: timeslicer started' infoPrintCR.
+            [true] whileTrue: [
+                t ~~ TimeSliceInterval ifTrue:[
+                    "/ interval changed -> need a new delay
+                    myDelay delay:(t := TimeSliceInterval).
+                ].
+                myDelay wait.
+                self slice.
+
+                "/ every other tick, recompute priorities.
+                flipFlop := flipFlop not.
+                flipFlop ifTrue:[
+                    scheduledProcesses notNil ifTrue:[
+                        supportDynamicPriorities == true ifTrue:[
+                            self recomputeDynamicPriorities.
+                        ].
+                        scheduledProcesses removeAll.
+                    ].
+                    scheduledProcesses := IdentitySet new.
+                ].
+            ]
+        ] ifCurtailed:[
+            timeSliceProcess := nil.
+            'Processor [info]: timeslicer finished' infoPrintCR.
+        ]
     ] newProcess.
     timeSliceProcess priority:HighestPriority.
     timeSliceProcess name:'time slicer'.
@@ -2243,10 +2243,10 @@
     "stop preemptive scheduling (timeSlicing)"
 
     timeSliceProcess notNil ifTrue: [
-	timeSliceProcess terminate.
-	timeSliceProcess := nil.
-	scheduledProcesses := nil.
-	timeSliceNeededSemaphore := nil.
+        timeSliceProcess terminate.
+        timeSliceProcess := nil.
+        scheduledProcesses := nil.
+        timeSliceNeededSemaphore := nil.
     ]
 
     "
@@ -2290,37 +2290,37 @@
     wasBlocked := OperatingSystem blockInterrupts.
     idx := readSemaphoreArray identityIndexOf:aSemaphore startingAt:1.
     [idx ~~ 0] whileTrue:[
-	useIOInterrupts ifTrue:[
-	    fd := readFdArray at:idx.
-	    fd notNil ifTrue:[
-		OperatingSystem disableIOInterruptsOn:fd
-	    ].
-	].
-	readFdArray at:idx put:nil.
-	readSemaphoreArray at:idx put:nil.
-	readCheckArray at:idx put:nil.
-	idx := readSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
+        useIOInterrupts ifTrue:[
+            fd := readFdArray at:idx.
+            fd notNil ifTrue:[
+                OperatingSystem disableIOInterruptsOn:fd
+            ].
+        ].
+        readFdArray at:idx put:nil.
+        readSemaphoreArray at:idx put:nil.
+        readCheckArray at:idx put:nil.
+        idx := readSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
     ].
     idx := writeSemaphoreArray identityIndexOf:aSemaphore startingAt:1.
     [idx ~~ 0] whileTrue:[
-	useIOInterrupts ifTrue:[
-	    fd := writeFdArray at:idx.
-	    fd notNil ifTrue:[
-		OperatingSystem disableIOInterruptsOn:fd
-	    ].
-	].
-	writeFdArray at:idx put:nil.
-	writeSemaphoreArray at:idx put:nil.
-	writeCheckArray at:idx put:nil.
-	idx := writeSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
+        useIOInterrupts ifTrue:[
+            fd := writeFdArray at:idx.
+            fd notNil ifTrue:[
+                OperatingSystem disableIOInterruptsOn:fd
+            ].
+        ].
+        writeFdArray at:idx put:nil.
+        writeSemaphoreArray at:idx put:nil.
+        writeCheckArray at:idx put:nil.
+        idx := writeSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
     ].
     idx := timeoutSemaphoreArray identityIndexOf:aSemaphore startingAt:1.
     [idx ~~ 0] whileTrue:[
-	timeoutArray at:idx put:nil.
-	timeoutSemaphoreArray at:idx put:nil.
-	timeoutActionArray at:idx put:nil.
-	timeoutProcessArray at:idx put:nil.
-	idx := timeoutSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
+        timeoutArray at:idx put:nil.
+        timeoutSemaphoreArray at:idx put:nil.
+        timeoutActionArray at:idx put:nil.
+        timeoutProcessArray at:idx put:nil.
+        idx := timeoutSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 
@@ -2373,20 +2373,20 @@
     wasBlocked := OperatingSystem blockInterrupts.
     index := timeoutSemaphoreArray identityIndexOf:aSemaphore startingAt:1.
     index ~~ 0 ifTrue:[
-	timeoutArray at:index put:aMillisecondTime
+        timeoutArray at:index put:aMillisecondTime
     ] ifFalse:[
-	index := timeoutArray identityIndexOf:nil startingAt:1.
-	index ~~ 0 ifTrue:[
-	    timeoutSemaphoreArray at:index put:aSemaphore.
-	    timeoutArray at:index put:aMillisecondTime.
-	    timeoutActionArray at:index put:nil.
-	    timeoutProcessArray at:index put:nil
-	] ifFalse:[
-	    timeoutSemaphoreArray := timeoutSemaphoreArray copyWith:aSemaphore.
-	    timeoutArray := timeoutArray copyWith:aMillisecondTime.
-	    timeoutActionArray := timeoutActionArray copyWith:nil.
-	    timeoutProcessArray := timeoutProcessArray copyWith:nil
-	].
+        index := timeoutArray identityIndexOf:nil startingAt:1.
+        index ~~ 0 ifTrue:[
+            timeoutSemaphoreArray at:index put:aSemaphore.
+            timeoutArray at:index put:aMillisecondTime.
+            timeoutActionArray at:index put:nil.
+            timeoutProcessArray at:index put:nil
+        ] ifFalse:[
+            timeoutSemaphoreArray := timeoutSemaphoreArray copyWith:aSemaphore.
+            timeoutArray := timeoutArray copyWith:aMillisecondTime.
+            timeoutActionArray := timeoutActionArray copyWith:nil.
+            timeoutProcessArray := timeoutProcessArray copyWith:nil
+        ].
     ].
 
     anyTimeouts := true.
@@ -2471,11 +2471,11 @@
      otherwise, it will be polled every few milliseconds (MSDOS)."
 
     aStream canBeSelected ifTrue:[
-	"/ can this stream be selected on ?
-	self signal:aSemaphore onInput:aStream fileDescriptor orCheck:nil
+        "/ can this stream be selected on ?
+        self signal:aSemaphore onInput:aStream fileDescriptor orCheck:nil
     ] ifFalse:[
-	"/ nope - must poll ...
-	self signal:aSemaphore onInput:nil orCheck:[aStream canReadWithoutBlocking]
+        "/ nope - must poll ...
+        self signal:aSemaphore onInput:nil orCheck:[aStream canReadWithoutBlocking]
     ]
 
     "Modified: / 14.12.1999 / 23:58:50 / cg"
@@ -2504,34 +2504,34 @@
     wasBlocked := OperatingSystem blockInterrupts.
 
     aFileDescriptor isNil ifTrue:[
-	(writeCheckArray identityIndexOf:aBlock startingAt:1) == 0 ifTrue:[
-	    idx := writeFdArray identityIndexOf:nil startingAt:1.
-	    idx ~~ 0 ifTrue:[
-		writeFdArray at:idx put:aFileDescriptor.
-		writeSemaphoreArray at:idx put:aSemaphore.
-		writeCheckArray at:idx put:aBlock
-	    ] ifFalse:[
-		writeFdArray := writeFdArray copyWith:nil.
-		writeSemaphoreArray := writeSemaphoreArray copyWith:aSemaphore.
-		writeCheckArray := writeCheckArray copyWith:aBlock.
-	    ]
-	]
+        (writeCheckArray identityIndexOf:aBlock startingAt:1) == 0 ifTrue:[
+            idx := writeFdArray identityIndexOf:nil startingAt:1.
+            idx ~~ 0 ifTrue:[
+                writeFdArray at:idx put:aFileDescriptor.
+                writeSemaphoreArray at:idx put:aSemaphore.
+                writeCheckArray at:idx put:aBlock
+            ] ifFalse:[
+                writeFdArray := writeFdArray copyWith:nil.
+                writeSemaphoreArray := writeSemaphoreArray copyWith:aSemaphore.
+                writeCheckArray := writeCheckArray copyWith:aBlock.
+            ]
+        ]
     ] ifFalse:[
-	(writeFdArray identityIndexOf:aFileDescriptor startingAt:1) == 0 ifTrue:[
-	    idx := writeFdArray identityIndexOf:nil startingAt:1.
-	    idx ~~ 0 ifTrue:[
-		writeFdArray at:idx put:aFileDescriptor.
-		writeSemaphoreArray at:idx put:aSemaphore.
-		writeCheckArray at:idx put:aBlock
-	    ] ifFalse:[
-		writeFdArray := writeFdArray copyWith:aFileDescriptor.
-		writeSemaphoreArray := writeSemaphoreArray copyWith:aSemaphore.
-		writeCheckArray := writeCheckArray copyWith:aBlock.
-	    ].
-	    useIOInterrupts ifTrue:[
-		OperatingSystem enableIOInterruptsOn:aFileDescriptor
-	    ].
-	]
+        (writeFdArray identityIndexOf:aFileDescriptor startingAt:1) == 0 ifTrue:[
+            idx := writeFdArray identityIndexOf:nil startingAt:1.
+            idx ~~ 0 ifTrue:[
+                writeFdArray at:idx put:aFileDescriptor.
+                writeSemaphoreArray at:idx put:aSemaphore.
+                writeCheckArray at:idx put:aBlock
+            ] ifFalse:[
+                writeFdArray := writeFdArray copyWith:aFileDescriptor.
+                writeSemaphoreArray := writeSemaphoreArray copyWith:aSemaphore.
+                writeCheckArray := writeCheckArray copyWith:aBlock.
+            ].
+            useIOInterrupts ifTrue:[
+                OperatingSystem enableIOInterruptsOn:aFileDescriptor
+            ].
+        ]
     ].
 
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
@@ -2545,11 +2545,11 @@
      otherwise, it will be polled every few milliseconds (MSDOS)."
 
     aStream canBeSelected ifTrue:[
-	"/ can this stream be selected on ?
-	self signal:aSemaphore onOutput:aStream fileDescriptor orCheck:nil
+        "/ can this stream be selected on ?
+        self signal:aSemaphore onOutput:aStream fileDescriptor orCheck:nil
     ] ifFalse:[
-	"/ nope - must poll ...
-	self signal:aSemaphore onOutput:nil orCheck:[aStream canWriteWithoutBlocking]
+        "/ nope - must poll ...
+        self signal:aSemaphore onOutput:nil orCheck:[aStream canWriteWithoutBlocking]
     ]
 
     "Modified: / 14.12.1999 / 23:59:19 / cg"
@@ -2566,18 +2566,18 @@
      Using IO interrupts reduces the idle CPU usage of ST/X by some percent
      (typically 2-7%).
      Notice:
-	some systems do not support IO-interrupts (or have a broken stdio-lib),
-	and this feature is always disabled;
+        some systems do not support IO-interrupts (or have a broken stdio-lib),
+        and this feature is always disabled;
      Also notice:
-	we found that in some Xlib-implementations, interrupted reads are not
-	handled correctly (especially in multi-headed applications), and this
-	feature should be disabled to avoid a blocking XPending.
+        we found that in some Xlib-implementations, interrupted reads are not
+        handled correctly (especially in multi-headed applications), and this
+        feature should be disabled to avoid a blocking XPending.
 
      If this method is used to disable IO interrupts in multi-headed apps,
      it should be invoked BEFORE the display event dispatcher processes are started."
 
     OperatingSystem supportsIOInterrupts ifTrue:[
-	useIOInterrupts := aBoolean
+        useIOInterrupts := aBoolean
     ].
 
     "Created: / 15.7.1998 / 13:32:29 / cg"
@@ -2695,21 +2695,21 @@
     wasBlocked := OperatingSystem blockInterrupts.
     index := timeoutActionArray identityIndexOf:aBlock startingAt:1.
     index ~~ 0 ifTrue:[
-	timeoutArray at:index put:aMillisecondTime
+        timeoutArray at:index put:aMillisecondTime
     ] ifFalse:[
-	index := timeoutArray indexOf:nil.
-	index ~~ 0 ifTrue:[
-	    timeoutArray at:index put:aMillisecondTime.
-	    timeoutActionArray at:index put:aBlock.
-	    timeoutSemaphoreArray at:index put:nil.
-	    timeoutProcessArray at:index put:aProcess
-	] ifFalse:[
-	    timeoutArray := timeoutArray copyWith:aMillisecondTime.
-	    timeoutActionArray := timeoutActionArray copyWith:aBlock.
-	    timeoutSemaphoreArray := timeoutSemaphoreArray copyWith:nil.
-	    timeoutProcessArray := timeoutProcessArray copyWith:aProcess.
-	    index := timeoutArray size.
-	].
+        index := timeoutArray indexOf:nil.
+        index ~~ 0 ifTrue:[
+            timeoutArray at:index put:aMillisecondTime.
+            timeoutActionArray at:index put:aBlock.
+            timeoutSemaphoreArray at:index put:nil.
+            timeoutProcessArray at:index put:aProcess
+        ] ifFalse:[
+            timeoutArray := timeoutArray copyWith:aMillisecondTime.
+            timeoutActionArray := timeoutActionArray copyWith:aBlock.
+            timeoutSemaphoreArray := timeoutSemaphoreArray copyWith:nil.
+            timeoutProcessArray := timeoutProcessArray copyWith:aProcess.
+            index := timeoutArray size.
+        ].
     ].
 
     anyTimeouts := true.
@@ -2736,10 +2736,10 @@
     then := OperatingSystem millisecondTimeAdd:now and:delta.
 
     id := self
-	addTimeoutFunctionCall:anExternalFunction
-	for:aProcess
-	atMilliseconds:then
-	with:argument.
+        addTimeoutFunctionCall:anExternalFunction
+        for:aProcess
+        atMilliseconds:then
+        with:argument.
 
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     ^ id
@@ -2762,9 +2762,9 @@
 
     action := [anExternalFunction callWith:argument].
     ^ self
-	addTimedBlock:action
-	for:aProcess
-	atMilliseconds:milliTime.
+        addTimedBlock:action
+        for:aProcess
+        atMilliseconds:milliTime.
 
     "Created: 23.9.1996 / 14:29:30 / cg"
     "Modified: 23.9.1996 / 14:34:57 / cg"
@@ -2873,10 +2873,10 @@
     wasBlocked := OperatingSystem blockInterrupts.
     index := timeoutActionArray identityIndexOf:aBlock startingAt:1.
     (index ~~ 0) ifTrue:[
-	timeoutArray at:index put:nil.
-	timeoutActionArray at:index put:nil.
-	timeoutSemaphoreArray at:index put:nil.
-	timeoutProcessArray at:index put:nil.
+        timeoutArray at:index put:nil.
+        timeoutActionArray at:index put:nil.
+        timeoutSemaphoreArray at:index put:nil.
+        timeoutProcessArray at:index put:nil.
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 !
@@ -2890,14 +2890,14 @@
 
     index := anID.
     (index > 0) ifTrue:[
-	wasBlocked := OperatingSystem blockInterrupts.
-
-	timeoutArray at:index put:nil.
-	timeoutActionArray at:index put:nil.
-	timeoutSemaphoreArray at:index put:nil.
-	timeoutProcessArray at:index put:nil.
-
-	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+        wasBlocked := OperatingSystem blockInterrupts.
+
+        timeoutArray at:index put:nil.
+        timeoutActionArray at:index put:nil.
+        timeoutSemaphoreArray at:index put:nil.
+        timeoutProcessArray at:index put:nil.
+
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
     ]
 
     "Created: 23.9.1996 / 14:32:33 / cg"
@@ -2906,28 +2906,28 @@
 
 timeoutHandlerProcess
     (timeoutHandlerProcess isNil or:[timeoutHandlerProcess isDead]) ifTrue:[
-	timeoutHandlerProcess :=
-		[
-		    [
-			[true] whileTrue:[
-			    [
-				self timeoutHandlerProcessLoop
-			    ] on:Exception do:[:ex|
-				"ignore errors, but tell the user"
-				('ProcessorScheduler [warning]: error while handling timeouts in TimeoutHandlerProcess: ''' , ex description , '''') infoPrintCR.
+        timeoutHandlerProcess :=
+                [
+                    [
+                        [true] whileTrue:[
+                            [
+                                self timeoutHandlerProcessLoop
+                            ] on:Exception do:[:ex|
+                                "ignore errors, but tell the user"
+                                ('ProcessorScheduler [warning]: error while handling timeouts in TimeoutHandlerProcess: ''' , ex description , '''') infoPrintCR.
 "/                                thisContext fullPrintAll.
-			    ].
-			]
-		    ] ensure:[
-			timeoutHandlerProcess := nil
-		    ].
-		] newProcess.
-
-	timeoutHandlerProcess
-	    priority:TimingPriority;
-	    name:'Timeout handler';
-	    beSystemProcess;
-	    resume.
+                            ].
+                        ]
+                    ] ensure:[
+                        timeoutHandlerProcess := nil
+                    ].
+                ] newProcess.
+
+        timeoutHandlerProcess
+            priority:TimingPriority;
+            name:'Timeout handler';
+            beSystemProcess;
+            resume.
     ].
     ^ timeoutHandlerProcess.
 
@@ -2954,7 +2954,7 @@
 
     wasBlocked := OperatingSystem blockInterrupts.
     preWaitActions isNil ifTrue:[
-	preWaitActions := OrderedCollection new
+        preWaitActions := OrderedCollection new
     ].
     preWaitActions add:aBlock.
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
@@ -3166,8 +3166,8 @@
 
     gotIOInterrupt := true.
     activeProcess ~~ scheduler ifTrue:[
-	interruptedProcess := activeProcess.
-	self threadSwitch:scheduler
+        interruptedProcess := activeProcess.
+        self threadSwitch:scheduler
     ]
 
     "Modified: 21.12.1995 / 16:17:40 / stefan"
@@ -3185,49 +3185,49 @@
       readFdArray/writeFdArray in the debugger)"
 
     readFdArray keysAndValuesDo:[:idx :fd |
-	|rslt sema|
-
-	(fd notNil "and:[fd >= 0]") ifTrue:[
-	    rslt := OperatingSystem
-			selectOnAnyReadable:(Array with:fd)
-				   writable:nil
-				  exception:nil
-				withTimeOut:0.
-
-	    (rslt == #error or:[rslt isNil and:[OperatingSystem lastErrorSymbol == #EBADF]]) ifTrue:[
-		"/ ('Processor [info]: removing invalid read-select fileDescriptor: ' , fd printString) infoPrintCR.
-		readFdArray at:idx put:nil.
-		readCheckArray at:idx put:nil.
-		OperatingSystem clearLastErrorNumber.
-		(sema := readSemaphoreArray at:idx) notNil ifTrue:[
-		    readSemaphoreArray at:idx put:nil.
-		    sema signal.
-		].
-	    ]
-	].
+        |rslt sema|
+
+        (fd notNil "and:[fd >= 0]") ifTrue:[
+            rslt := OperatingSystem
+                        selectOnAnyReadable:(Array with:fd)
+                                   writable:nil
+                                  exception:nil
+                                withTimeOut:0.
+
+            (rslt == #error or:[rslt isNil and:[OperatingSystem lastErrorSymbol == #EBADF]]) ifTrue:[
+                "/ ('Processor [info]: removing invalid read-select fileDescriptor: ' , fd printString) infoPrintCR.
+                readFdArray at:idx put:nil.
+                readCheckArray at:idx put:nil.
+                OperatingSystem clearLastErrorNumber.
+                (sema := readSemaphoreArray at:idx) notNil ifTrue:[
+                    readSemaphoreArray at:idx put:nil.
+                    sema signal.
+                ].
+            ]
+        ].
     ].
 
     writeFdArray keysAndValuesDo:[:idx :fd |
-	|rslt sema|
-
-	fd notNil ifTrue:[
-	    rslt := OperatingSystem
-			selectOnAnyReadable:nil
-				   writable:(Array with:fd)
-				  exception:nil
-				withTimeOut:0.
-
-	    (rslt == #error or:[rslt isNil and:[OperatingSystem lastErrorSymbol == #EBADF]]) ifTrue:[
-		"/ ('Processor [info]: removing invalid write-select fileDescriptor: ' , fd printString) infoPrintCR.
-		writeFdArray at:idx put:nil.
-		writeCheckArray at:idx put:nil.
-		OperatingSystem clearLastErrorNumber.
-		(sema := writeSemaphoreArray at:idx) notNil ifTrue:[
-		    writeSemaphoreArray at:idx put:nil.
-		    sema signal.
-		].
-	    ]
-	]
+        |rslt sema|
+
+        fd notNil ifTrue:[
+            rslt := OperatingSystem
+                        selectOnAnyReadable:nil
+                                   writable:(Array with:fd)
+                                  exception:nil
+                                withTimeOut:0.
+
+            (rslt == #error or:[rslt isNil and:[OperatingSystem lastErrorSymbol == #EBADF]]) ifTrue:[
+                "/ ('Processor [info]: removing invalid write-select fileDescriptor: ' , fd printString) infoPrintCR.
+                writeFdArray at:idx put:nil.
+                writeCheckArray at:idx put:nil.
+                OperatingSystem clearLastErrorNumber.
+                (sema := writeSemaphoreArray at:idx) notNil ifTrue:[
+                    writeSemaphoreArray at:idx put:nil.
+                    sema signal.
+                ].
+            ]
+        ]
     ].
 
     "Modified: 12.4.1996 / 09:32:58 / stefan"
@@ -3239,8 +3239,8 @@
      what to do now."
 
     activeProcess ~~ scheduler ifTrue:[
-	interruptedProcess := activeProcess.
-	self threadSwitch:scheduler
+        interruptedProcess := activeProcess.
+        self threadSwitch:scheduler
     ]
 !
 
@@ -3290,8 +3290,8 @@
      of whichever process is currently running."
 
     activeProcess ~~ scheduler ifTrue:[
-	interruptedProcess := activeProcess.
-	self threadSwitch:scheduler
+        interruptedProcess := activeProcess.
+        self threadSwitch:scheduler
     ]
 
     "Modified: 18.10.1996 / 20:35:54 / cg"
@@ -3308,86 +3308,86 @@
 
     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 millis is nil, 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 := (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 millis is nil, 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 := (readSemaphoreArray findFirst:[:sema | sema notNil]) ~~ 0.
+        anySema ifFalse:[
+            anySema := (writeSemaphoreArray findFirst:[:sema | sema notNil]) ~~ 0.
+        ].
+        anySema ifFalse:[
+            self anyUserProcessAtAll ifFalse:[
+                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
@@ -3399,11 +3399,11 @@
 !ProcessorScheduler class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/ProcessorScheduler.st,v 1.275 2013-08-20 13:51:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ProcessorScheduler.st,v 1.276 2013-08-20 13:56:31 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/ProcessorScheduler.st,v 1.275 2013-08-20 13:51:59 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/ProcessorScheduler.st,v 1.276 2013-08-20 13:56:31 cg Exp $'
 ! !