Merge jv
authorMerge Script
Thu, 26 Nov 2015 06:54:35 +0100
branchjv
changeset 18958 e35ab14763b6
parent 18953 c6c35fa98cb3 (current diff)
parent 18957 e0bb91eae748 (diff)
child 18960 6e6225b7a7d9
Merge
AbstractOperatingSystem.st
ExternalStream.st
ProcessorScheduler.st
Win32OperatingSystem.st
--- a/AbstractOperatingSystem.st	Wed Nov 25 07:04:00 2015 +0100
+++ b/AbstractOperatingSystem.st	Thu Nov 26 06:54:35 2015 +0100
@@ -6747,6 +6747,34 @@
 
     "on select error, a read will immediately return, so answer true"
     ^ result > 0.
+!
+
+writeExceptionCheck:fd
+    "return true, if filedescriptor can be written without blocking
+     or has an exception event pending.
+     This is the case if data can be written to a filedescriptor
+     or the write would return an error.
+     This is actually only used with sockets, to wait for a connect to
+     be finished."
+
+    |result fdArray|
+
+    self supportsSelect ifFalse:[
+        "/ mhmh - what should we do then ?
+        "/ For now, return true as if data was present,
+        "/ and let the thread fall into the write.
+        "/ It will then (hopefully) be desceduled there and
+        "/ effectively polling for output.
+        ^ true
+    ].
+
+    result := self
+                selectOnAnyReadable:nil writable:(fdArray := Array with:fd) exception:fdArray
+                readableInto:nil writableInto:nil exceptionInto:nil
+                withTimeOut:0.
+
+    "on select error, a read will immediately return, so answer true"
+    ^ result > 0.
 ! !
 
 !AbstractOperatingSystem::PrinterInfo class methodsFor:'constants'!
--- a/ExternalStream.st	Wed Nov 25 07:04:00 2015 +0100
+++ b/ExternalStream.st	Thu Nov 26 06:54:35 2015 +0100
@@ -5613,6 +5613,44 @@
     ^ hasTimedout
 !
 
+writeExceptionWaitWithTimeoutMs:timeout
+    "suspend the current process, until the receiver
+     becomes ready for reading or writing or a timeout (in milliseconds) expired.
+     Return true if a timeout occured (i.e. false, if data is available).
+     Return immediate if the receiver is already ready.
+     The other threads are not affected by the wait."
+
+    |fd sema hasTimedout wasBlocked|
+
+    handle isNil ifTrue:[
+        ^ self errorNotOpen
+    ].
+
+    fd := self fileDescriptor.
+    (OperatingSystem writeExceptionCheck:fd) ifTrue:[^ false].
+
+    wasBlocked := OperatingSystem blockInterrupts.
+    sema := Semaphore new name:'writeExceptionWait'.
+    [
+        timeout notNil ifTrue:[
+            Processor signal:sema afterMilliseconds:timeout
+        ].
+        Processor signal:sema onOutput:fd.
+        Processor signal:sema onException:fd.
+        Processor activeProcess state:#ioWait.
+        sema wait.
+        hasTimedout := timeout notNil and:[(OperatingSystem readWriteCheck:fd) not].
+    ] ifCurtailed:[
+        Processor disableSemaphore:sema.
+        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+    ].
+    timeout notNil ifTrue:[
+        Processor disableSemaphore:sema.
+    ].
+    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+    ^ hasTimedout
+!
+
 writeWaitWithTimeoutMs:timeout
     "suspend the current process, until the receiver
      becomes ready for writing or a timeout (in milliseconds) expired.
--- a/ProcessorScheduler.st	Wed Nov 25 07:04:00 2015 +0100
+++ b/ProcessorScheduler.st	Thu Nov 26 06:54:35 2015 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 1993 by Claus Gittinger
 	      All Rights Reserved
@@ -24,7 +26,8 @@
 		exitWhenNoMoreUserProcesses suspendScheduler timeSliceProcess
 		supportDynamicPriorities timeSliceNeededSemaphore
 		scheduledProcesses preWaitActions timeoutHandlerProcess
-		readableResultFdArray writableResultFdArray'
+		readableResultFdArray writableResultFdArray exceptFdArray
+		exceptResultFdArray exceptSemaphoreArray'
 	classVariableNames:'KnownProcesses KnownProcessIds PureEventDriven
 		UserSchedulingPriority UserInterruptPriority TimingPriority
 		HighestPriority SchedulingPriority MaxNumberOfProcesses
@@ -922,9 +925,9 @@
      p l|
 
     KnownProcesses isNil ifTrue:[
-	KnownProcesses := WeakArray new:30.
-	KnownProcesses addDependent:self class.
-	KnownProcessIds := OrderedCollection new:30.
+        KnownProcesses := WeakArray new:30.
+        KnownProcesses addDependent:self class.
+        KnownProcessIds := OrderedCollection new:30.
     ].
 
     "
@@ -939,6 +942,9 @@
     writeFdArray := Array new:3.
     writeCheckArray := Array new:3.
     writeSemaphoreArray := Array new:3.
+    exceptFdArray := Array new:3.
+    exceptSemaphoreArray := Array new:3.
+
     timeoutArray := Array new:5.
     timeoutSemaphoreArray := Array new:5.
     timeoutActionArray := Array new:5.
@@ -953,7 +959,7 @@
 
     supportDynamicPriorities := false.
     exitWhenNoMoreUserProcesses isNil ifTrue:[
-	exitWhenNoMoreUserProcesses := false. "/ mhmh - how about true ?
+        exitWhenNoMoreUserProcesses := false. "/ mhmh - how about true ?
     ].
 
     "
@@ -965,10 +971,10 @@
     currentPriority := SchedulingPriority.
     p := Process basicNew.
     p
-	setId:0 state:#run;
-	setPriority:currentPriority;
-	name:'scheduler';
-	beSystemProcess.
+        setId:0 state:#run;
+        setPriority:currentPriority;
+        name:'scheduler';
+        beSystemProcess.
 
     scheduler := activeProcess := p.
     activeProcessId := 0.
@@ -981,8 +987,8 @@
     "
     useIOInterrupts ifTrue:[ObjectMemory ioInterruptHandler:self].
     ObjectMemory
-	timerInterruptHandler:self;
-	childSignalInterruptHandler:self.
+        timerInterruptHandler:self;
+        childSignalInterruptHandler:self.
 
     "Modified: / 7.1.1997 / 16:48:26 / stefan"
     "Modified: / 4.2.1999 / 13:08:39 / cg"
@@ -2351,37 +2357,43 @@
     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.
+    ].
+    idx := exceptSemaphoreArray identityIndexOf:aSemaphore startingAt:1.
+    [idx ~~ 0] whileTrue:[
+        exceptFdArray at:idx put:nil.
+        exceptSemaphoreArray at:idx put:nil.
+        idx := exceptSemaphoreArray identityIndexOf:aSemaphore startingAt:idx+1.
     ].
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 
@@ -2460,6 +2472,57 @@
     wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
 !
 
+signal:aSemaphore onException:aFileDescriptor
+    "arrange for a semaphore to be triggered when output on aFileDescriptor
+     is possible (i.e. can be written without blocking) or aBlock returns true.
+     The checkBlock will be evaluated by the scheduler from time to time
+     (i.e. every few milliseconds).
+     This checkBlock is required for poor windows, where a WaitForObject does
+     not know about sockets.
+     If aBlock is nil, the semaphore is removed from the set of semaphores, after being signaled."
+
+    |idx "{ Class: SmallInteger }"
+     wasBlocked slot|
+
+    wasBlocked := OperatingSystem blockInterrupts.
+
+    "Here we assume, that for every triple (aSemaphore, aFileDescriptor, aBlock)
+     aSemphore is never nil, but one of aFileDescriptor, aBlock may be nil"
+
+    aFileDescriptor isNil ifTrue:[
+        idx := exceptSemaphoreArray identityIndexOf:aSemaphore or:nil.
+        idx == 0 ifTrue:[
+            "aSemaphore is not registered yet, have to create a new slot"
+            exceptFdArray := exceptFdArray copyWith:nil.
+            exceptSemaphoreArray := exceptSemaphoreArray copyWith:aSemaphore.
+        ] ifFalse:[
+            slot := exceptSemaphoreArray at:idx.
+            slot isNil ifTrue:[
+                exceptSemaphoreArray at:idx put:aSemaphore.
+            ]
+        ]
+    ] ifFalse:[
+        idx := exceptFdArray identityIndexOf:aFileDescriptor or:nil.
+        idx == 0 ifTrue:[
+            "aFileDescriptor is not registered yet, have to create a new slot"
+            exceptFdArray := exceptFdArray copyWith:aFileDescriptor.
+            exceptSemaphoreArray := exceptSemaphoreArray copyWith:aSemaphore.
+        ] ifFalse:[
+            slot := exceptFdArray at:idx.
+            slot isNil ifTrue:[
+                exceptFdArray at:idx put:aFileDescriptor.
+                exceptSemaphoreArray at:idx put:aSemaphore.
+            ].
+        ].
+"/        (useIOInterrupts and:[slot isNil]) ifTrue:[
+"/            OperatingSystem enableIOInterruptsOn:aFileDescriptor
+"/        ].
+    ].
+    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
+
+    "Modified: 4.8.1997 / 15:21:49 / cg"
+!
+
 signal:aSemaphore onInput:aFileDescriptor
     "arrange for a semaphore to be triggered when input on aFileDescriptor
      arrives. This will only happen, if the OS supports selecting on fileDescriptors.
@@ -3191,7 +3254,7 @@
      or a timeout to occur."
 
     |nReady index sema action wasBlocked err fd readyIndex
-     newProcessMaybeReady pidsFinished pid exceptArray|
+     newProcessMaybeReady fdOrPid exceptArray|
 
     "/ must enable interrupts, to be able to get out of a
     "/ long wait (especially, to handle sigChild in the meantime)
@@ -3200,153 +3263,175 @@
 
     newProcessMaybeReady := false.
     readableResultFdArray size < readFdArray size ifTrue:[
-	readableResultFdArray := Array new:(40 max:readFdArray size).
+        readableResultFdArray := Array new:(40 max:readFdArray size).
     ].
     writableResultFdArray size < writeFdArray size ifTrue:[
-	writableResultFdArray := Array new:(40 max:writeFdArray size).
+        writableResultFdArray := Array new:(40 max:writeFdArray size).
     ].
 
+    exceptArray := exceptFdArray.
+
     OperatingSystem isMSWINDOWSlike ifTrue:[
-	"/
-	"/ win32 does a WaitForMultipleObjects in select...
-	"/ unix waits for SIGCHLD
-	"/
-	osChildExitActions keysDo:[:eachPid|
-	    eachPid address = 0 ifTrue:[
-		'Processor: remove 0 handle pid: ' infoPrint. eachPid infoPrintCR.
-		osChildExitActions safeRemoveKey:eachPid.
-	    ] ifFalse:[
-		pidsFinished isNil ifTrue:[
-		    exceptArray := osChildExitActions keyArray.
-		    pidsFinished := Array new:osChildExitActions size.
-		].
-	    ].
-	].
+        "/
+        "/ win32 does a WaitForMultipleObjects in select...
+        "/ unix waits for SIGCHLD
+        "/
+        |hasPids|
+
+        hasPids := false.
+        osChildExitActions keysDo:[:eachPid|
+            eachPid address = 0 ifTrue:[
+                'Processor: remove 0-handle pid: ' infoPrint. eachPid infoPrintCR.
+                osChildExitActions safeRemoveKey:eachPid.
+            ] ifFalse:[
+                hasPids := true.
+            ].
+        ].
+        hasPids ifTrue:[
+            exceptArray := (exceptArray upTo:nil), osChildExitActions keys asArray.
+"/'exceptArray: ' print. exceptArray printCR.
+        ].
     ].
 
+    exceptResultFdArray size < exceptArray size ifTrue:[
+        exceptResultFdArray := Array new:(40 max:exceptArray size).
+    ].
+
+
     nReady := OperatingSystem
-		selectOnAnyReadable:readFdArray
-		writable:writeFdArray
-		exception:exceptArray
-		readableInto:readableResultFdArray
-		writableInto:writableResultFdArray
-		exceptionInto:pidsFinished
-		withTimeOut:millis.
+                selectOnAnyReadable:readFdArray
+                writable:writeFdArray
+                exception:exceptArray
+                readableInto:readableResultFdArray
+                writableInto:writableResultFdArray
+                exceptionInto:exceptResultFdArray
+                withTimeOut:millis.
 
     wasBlocked ifTrue:[
-	OperatingSystem blockInterrupts.
+        OperatingSystem blockInterrupts.
     ].
 
     nReady <= 0 ifTrue:[
-	"/ either still nothing to do,
-	"/ or error (which should not happen)
-
-	(nReady < 0 and:[(err := OperatingSystem lastErrorSymbol) notNil]) ifTrue:[
-	    err == #EBADF ifTrue:[
-		"/ mhmh - one of the fd's given to me is corrupt.
-		"/ find out which one .... and remove it
-		self removeCorruptedFds
-	    ] ifFalse:[
-		err == #ENOENT ifTrue:[
-		    'Processor [warning]: ENOENT in select; rd=' infoPrint.
-		    readFdArray infoPrint.
-		    ' wr=' infoPrint.
-		    writeFdArray infoPrintCR.
-		] ifFalse:[
-		    'Processor [warning]: error in select: ' infoPrint. err infoPrintCR.
-		]
-	    ].
-	]
+        "/ either still nothing to do,
+        "/ or error (which should not happen)
+
+        (nReady < 0 and:[(err := OperatingSystem lastErrorSymbol) notNil]) ifTrue:[
+            err == #EBADF ifTrue:[
+                "/ mhmh - one of the fd's given to me is corrupt.
+                "/ find out which one .... and remove it
+                self removeCorruptedFds
+            ] ifFalse:[
+                err == #ENOENT ifTrue:[
+                    'Processor [warning]: ENOENT in select; rd=' infoPrint.
+                    readFdArray infoPrint.
+                    ' wr=' infoPrint.
+                    writeFdArray infoPrintCR.
+                ] ifFalse:[
+                    'Processor [warning]: error in select: ' infoPrint. err infoPrintCR.
+                ]
+            ].
+        ]
     ] ifFalse:[
-	readyIndex := 1.
-	[nReady > 0
-	     and:[ readyIndex <= readableResultFdArray size
-	     and:[ (fd := readableResultFdArray at:readyIndex) notNil ]]]
-	whileTrue:[
-	    index := readFdArray identityIndexOf:fd.
-	    index ~~ 0 ifTrue:[
-		action := readCheckArray at:index.
-		sema := readSemaphoreArray at:index.
-		sema notNil ifTrue:[
-		    sema signalOnce.
-		    newProcessMaybeReady := true.
-		    action isNil ifTrue:[
-			"before May 2014 we disabled the sema in the caller after wakeup.
-			 This caused ST/X to consume 100% cpu, when the caller didn't read
-			 the data (e.g. because his process was stopped)."
-			useIOInterrupts ifTrue:[
-			    OperatingSystem disableIOInterruptsOn:fd
-			].
-			readFdArray at:index put:nil.
-			readSemaphoreArray at:index put:nil.
-			"disable possible write side and timeouts as well"
-			self disableSemaphore:sema.
-		    ].
-		].
-		action notNil ifTrue:[
-		    action value.
-		    newProcessMaybeReady := true
-		].
-	    ].
-	    nReady := nReady - 1.
-	    readyIndex := readyIndex + 1.
-	].
-
-	readyIndex := 1.
-	[nReady > 0
-	     and:[ readyIndex <= writableResultFdArray size
-	     and:[ (fd := writableResultFdArray at:readyIndex) notNil ]]]
-	whileTrue:[
-	    index := writeFdArray identityIndexOf:fd.
-	    index ~~ 0 ifTrue:[
-		action := writeCheckArray at:index.
-		sema := writeSemaphoreArray at:index.
-		sema notNil ifTrue:[
-		    sema signalOnce.
-		    newProcessMaybeReady := true.
-		    action isNil ifTrue:[
-			"now this is a one shot operation - see the input above"
-			useIOInterrupts ifTrue:[
-			    OperatingSystem disableIOInterruptsOn:fd
-			].
-			writeFdArray at:index put:nil.
-			writeSemaphoreArray at:index put:nil.
-			"disable possible read side and timeouts as well"
-			self disableSemaphore:sema.
-		    ].
-		].
-		action notNil ifTrue:[
-		    action value.
-		    newProcessMaybeReady := true
-		]
-	    ].
-	    nReady := nReady - 1.
-	    readyIndex := readyIndex + 1.
-	].
-
-	exceptArray notNil ifTrue:[
-	    "/ only for win32
-	    readyIndex := 1.
-	    [nReady > 0
-		 and:[ readyIndex <= pidsFinished size
-		 and:[ (pid := pidsFinished at:readyIndex) notNil ]]]
-	    whileTrue:[
-		|osProcessStatus actionBlock|
-"/'pid signaled: ' infoPrint. pid infoPrintCR.
-		actionBlock := osChildExitActions removeKey:pid ifAbsent:nil.
-		osProcessStatus := OperatingSystem childProcessWait:false pid:pid.
-		osProcessStatus notNil ifTrue:[
-		    (osProcessStatus pid = pid) ifTrue:[
-			actionBlock notNil ifTrue:[
-			    actionBlock value:osProcessStatus.
-			    newProcessMaybeReady := true
-			].
-		    ].
-		].
-		nReady := nReady - 1.
-		readyIndex := readyIndex + 1.
-	    ].
-	].
+        readyIndex := 1.
+        [nReady > 0
+             and:[ readyIndex <= readableResultFdArray size
+             and:[ (fd := readableResultFdArray at:readyIndex) notNil ]]
+        ] whileTrue:[
+            index := readFdArray identityIndexOf:fd.
+            index ~~ 0 ifTrue:[
+                action := readCheckArray at:index.
+                sema := readSemaphoreArray at:index.
+                sema notNil ifTrue:[
+                    sema signalOnce.
+                    newProcessMaybeReady := true.
+                    action isNil ifTrue:[
+                        "before May 2014 we disabled the sema in the caller after wakeup.
+                         This caused ST/X to consume 100% cpu, when the caller didn't read
+                         the data (e.g. because his process was stopped)."
+                        useIOInterrupts ifTrue:[
+                            OperatingSystem disableIOInterruptsOn:fd
+                        ].
+                        readFdArray at:index put:nil.
+                        readSemaphoreArray at:index put:nil.
+                        "disable possible write side and timeouts as well"
+                        self disableSemaphore:sema.
+                    ].
+                ].
+                action notNil ifTrue:[
+                    action value.
+                    newProcessMaybeReady := true
+                ].
+            ].
+            nReady := nReady - 1.
+            readyIndex := readyIndex + 1.
+        ].
+
+        readyIndex := 1.
+        [nReady > 0
+             and:[ readyIndex <= writableResultFdArray size
+             and:[ (fd := writableResultFdArray at:readyIndex) notNil ]]
+        ] whileTrue:[
+            index := writeFdArray identityIndexOf:fd.
+            index ~~ 0 ifTrue:[
+                action := writeCheckArray at:index.
+                sema := writeSemaphoreArray at:index.
+                sema notNil ifTrue:[
+                    sema signalOnce.
+                    newProcessMaybeReady := true.
+                    action isNil ifTrue:[
+                        "now this is a one shot operation - see the input above"
+                        useIOInterrupts ifTrue:[
+                            OperatingSystem disableIOInterruptsOn:fd
+                        ].
+                        writeFdArray at:index put:nil.
+                        writeSemaphoreArray at:index put:nil.
+                        "disable possible read side and timeouts as well"
+                        self disableSemaphore:sema.
+                    ].
+                ].
+                action notNil ifTrue:[
+                    action value.
+                    newProcessMaybeReady := true
+                ]
+            ].
+            nReady := nReady - 1.
+            readyIndex := readyIndex + 1.
+        ].
+
+"/'except result got: ' print. exceptArray printCR. exceptResultFdArray printCR.
+        readyIndex := 1.
+        [nReady > 0
+             and:[ readyIndex <= exceptResultFdArray size
+             and:[ (fdOrPid := exceptResultFdArray at:readyIndex) notNil ]]
+        ] whileTrue:[
+"/'except got: ' print. fdOrPid printCR.
+            index := exceptFdArray identityIndexOf:fdOrPid.
+            index ~~ 0 ifTrue:[
+                sema := exceptSemaphoreArray at:index.
+                sema notNil ifTrue:[
+                    sema signalOnce.
+                    newProcessMaybeReady := true.
+                    exceptFdArray at:index put:nil.
+                    exceptSemaphoreArray at:index put:nil.
+                    "disable possible read/write side and timeouts as well"
+                    self disableSemaphore:sema.
+                ].
+            ] ifFalse:[ "may be a PID?"
+                |osProcessStatus actionBlock|
+
+                actionBlock := osChildExitActions removeKey:fdOrPid ifAbsent:nil.
+"/'pid signaled: ' print. fdOrPid printCR.
+                actionBlock notNil ifTrue:[
+                    osProcessStatus := OperatingSystem childProcessWait:false pid:fdOrPid.
+                    (osProcessStatus notNil and:[osProcessStatus pid = fdOrPid]) ifTrue:[
+                        actionBlock value:osProcessStatus.
+                        newProcessMaybeReady := true.
+                    ].
+                ].
+            ].
+            nReady := nReady - 1.
+            readyIndex := readyIndex + 1.
+        ].
     ].
     ^ newProcessMaybeReady
 
@@ -3416,67 +3501,88 @@
       readFdArray/writeFdArray in the debugger)"
 
     readFdArray keysAndValuesDo:[:idx :fd |
-	|result sema|
-
-	fd notNil ifTrue:[
-	    result := OperatingSystem
-			selectOnAnyReadable:(Array with:fd) writable:nil exception:nil
-			   readableInto:nil writableInto:nil exceptionInto:nil
-			   withTimeOut:0.
-
-	    result < 0 ifTrue:[
-		('Processor [info]: removing invalid read-select fileDescriptor: ' , fd printString) infoPrintCR.
-		readFdArray at:idx put:nil.
-		readCheckArray at:idx put:nil.
-		(sema := readSemaphoreArray at:idx) notNil ifTrue:[
-		    readSemaphoreArray at:idx put:nil.
-		    sema signalOnce.
-		].
-	    ]
-	].
+        |result sema|
+
+        fd notNil ifTrue:[
+            result := OperatingSystem
+                        selectOnAnyReadable:(Array with:fd) writable:nil exception:nil
+                           readableInto:nil writableInto:nil exceptionInto:nil
+                           withTimeOut:0.
+
+            result < 0 ifTrue:[
+                ('Processor [info]: removing invalid read-select fileDescriptor: ' , fd printString) infoPrintCR.
+                readFdArray at:idx put:nil.
+                readCheckArray at:idx put:nil.
+                (sema := readSemaphoreArray at:idx) notNil ifTrue:[
+                    readSemaphoreArray at:idx put:nil.
+                    sema signalOnce.
+                ].
+            ]
+        ].
     ].
 
     writeFdArray keysAndValuesDo:[:idx :fd |
-	|result sema|
-
-	fd notNil ifTrue:[
-	    result := OperatingSystem
-			selectOnAnyReadable:(Array with:fd) writable:nil exception:nil
-			   readableInto:nil writableInto:nil exceptionInto:nil
-			   withTimeOut:0.
-
-	    result < 0 ifTrue:[
-		('Processor [info]: removing invalid write-select fileDescriptor: ' , fd printString) infoPrintCR.
-		writeFdArray at:idx put:nil.
-		writeCheckArray at:idx put:nil.
-		(sema := writeSemaphoreArray at:idx) notNil ifTrue:[
-		    writeSemaphoreArray at:idx put:nil.
-		    sema signalOnce.
-		].
-	    ]
-	]
+        |result sema|
+
+        fd notNil ifTrue:[
+            result := OperatingSystem
+                        selectOnAnyReadable:(Array with:fd) writable:nil exception:nil
+                           readableInto:nil writableInto:nil exceptionInto:nil
+                           withTimeOut:0.
+
+            result < 0 ifTrue:[
+                ('Processor [info]: removing invalid write-select fileDescriptor: ' , fd printString) infoPrintCR.
+                writeFdArray at:idx put:nil.
+                writeCheckArray at:idx put:nil.
+                (sema := writeSemaphoreArray at:idx) notNil ifTrue:[
+                    writeSemaphoreArray at:idx put:nil.
+                    sema signalOnce.
+                ].
+            ]
+        ]
     ].
 
+    exceptFdArray keysAndValuesDo:[:idx :fd |
+        |result sema|
+
+        fd notNil ifTrue:[
+            result := OperatingSystem
+                        selectOnAnyReadable:(Array with:fd) writable:nil exception:nil
+                           readableInto:nil writableInto:nil exceptionInto:nil
+                           withTimeOut:0.
+
+            result < 0 ifTrue:[
+                ('Processor [info]: removing invalid exceptiom-select fileDescriptor: ' , fd printString) infoPrintCR.
+                exceptFdArray at:idx put:nil.
+                (sema := exceptSemaphoreArray at:idx) notNil ifTrue:[
+                    exceptSemaphoreArray at:idx put:nil.
+                    sema signalOnce.
+                ].
+            ]
+        ]
+    ].
+
+
     OperatingSystem isMSWINDOWSlike ifTrue:[
-	"/
-	"/ win32 does a WaitForMultipleObjects in select...
-	"/ unix waits for SIGCHLD
-	"/
-	osChildExitActions keysDo:[:eachPid |
-	    |result sema|
-
-	    eachPid notNil ifTrue:[
-		result := OperatingSystem
-			    selectOnAnyReadable:nil writable:nil exception:(Array with:eachPid)
-			       readableInto:nil writableInto:nil exceptionInto:nil
-			       withTimeOut:0.
-
-		result < 0 ifTrue:[
-		    ('Processor [info]: removing invalid except-select pid: ' , eachPid printString) infoPrintCR.
-		    osChildExitActions safeRemoveKey:eachPid.
-		]
-	    ]
-	].
+        "/
+        "/ win32 does a WaitForMultipleObjects in select...
+        "/ unix waits for SIGCHLD
+        "/
+        osChildExitActions keysDo:[:eachPid |
+            |result sema|
+
+            eachPid notNil ifTrue:[
+                result := OperatingSystem
+                            selectOnAnyReadable:nil writable:nil exception:(Array with:eachPid)
+                               readableInto:nil writableInto:nil exceptionInto:nil
+                               withTimeOut:0.
+
+                result < 0 ifTrue:[
+                    ('Processor [info]: removing invalid except-select pid: ' , eachPid printString) infoPrintCR.
+                    osChildExitActions safeRemoveKey:eachPid.
+                ]
+            ]
+        ].
     ].
 
     "Modified: 12.4.1996 / 09:32:58 / stefan"
--- a/Win32OperatingSystem.st	Wed Nov 25 07:04:00 2015 +0100
+++ b/Win32OperatingSystem.st	Thu Nov 26 06:54:35 2015 +0100
@@ -282,15 +282,15 @@
 #  define _FCNTL_H_INCLUDED_
 # endif
 
-/* # define PROCESSDEBUGWIN32     /* */
-/* # define PROCESS1DEBUGWIN32    /* */
-/* # define PROCESS2DEBUGWIN32    /* */
-/* # define PROCESSDEBUG_CHILDPROCESSWAIT    /* */
-/* # define SELECTDEBUGWIN32     /* */
-/* # define SELECT1DEBUGWIN32    /* */
-/* # define SELECT2DEBUGWIN32    /* */
-/* # define WAITDEBUGWIN32       /* */
-/* # define SIGNALDEBUGWIN32     /* */
+// # define PROCESSDEBUGWIN32
+// # define PROCESS1DEBUGWIN32
+// # define PROCESS2DEBUGWIN32
+// # define PROCESSDEBUG_CHILDPROCESSWAIT
+// # define SELECTDEBUGWIN32
+// # define SELECT1DEBUGWIN32
+// # define SELECT2DEBUGWIN32
+// # define WAITDEBUGWIN32
+// # define SIGNALDEBUGWIN32
 
 # undef INT
 # undef UINT
@@ -1770,854 +1770,872 @@
       int __eno = __unsignedLongIntVal(errNr);
 
       if (__isWIN32Error(__eno)) {
-	switch (__eno & 0xFFFF) {
-	    /*
-	     * WIN32 GetLastError returns
-	     */
-	    case ERROR_INVALID_FUNCTION:
-		sym = @symbol(ERROR_INVALID_FUNCTION);
-		typ = @symbol(illegalOperationSignal);
-		break;
-
-	    case ERROR_BAD_FORMAT:
-		sym = @symbol(ERROR_BAD_FORMAT);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_FILE_NOT_FOUND:
-		sym = @symbol(ERROR_FILE_NOT_FOUND);
-		typ = @symbol(nonexistentSignal);
-		break;
-
-	    case ERROR_PATH_NOT_FOUND:
-		sym = @symbol(ERROR_PATH_NOT_FOUND);
-		typ = @symbol(nonexistentSignal);
-		break;
-
-	    case ERROR_TOO_MANY_OPEN_FILES:
-		sym = @symbol(ERROR_TOO_MANY_OPEN_FILES);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    /*
-	     * what a nice errorCode - thats the most "useful" one I ever
-	     * encountered ... (... those stupid micro-softies ...)
-	     */
-	    case ERROR_OPEN_FAILED:
-		sym = @symbol(ERROR_OPEN_FAILED);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_ACCESS_DENIED:
-		sym = @symbol(ERROR_ACCESS_DENIED);
-		typ = @symbol(noPermissionsSignal);
-		break;
-
-	    case ERROR_INVALID_HANDLE:
-		sym = @symbol(ERROR_INVALID_HANDLE);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_NOT_ENOUGH_MEMORY:
-		sym = @symbol(ERROR_NOT_ENOUGH_MEMORY);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_NO_SYSTEM_RESOURCES:
-		sym = @symbol(ERROR_NO_SYSTEM_RESOURCES);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_NONPAGED_SYSTEM_RESOURCES:
-		sym = @symbol(ERROR_NONPAGED_SYSTEM_RESOURCES);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_PAGED_SYSTEM_RESOURCES:
-		sym = @symbol(ERROR_PAGED_SYSTEM_RESOURCES);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_INVALID_ACCESS:
-		sym = @symbol(ERROR_INVALID_ACCESS);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
-
-	    case ERROR_INVALID_DATA:
-		sym = @symbol(ERROR_INVALID_DATA);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_INVALID_NAME:
-		sym = @symbol(ERROR_INVALID_NAME);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_ARENA_TRASHED:
-		sym = @symbol(ERROR_ARENA_TRASHED);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_OUTOFMEMORY:
-		sym = @symbol(ERROR_OUTOFMEMORY);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_BROKEN_PIPE:
-		sym = @symbol(ERROR_BROKEN_PIPE);
-		typ = @symbol(peerFaultSignal);
-		break;
-
-	    case ERROR_GEN_FAILURE:
-		sym = @symbol(ERROR_GEN_FAILURE);
-		break;
-
-	    case ERROR_WRITE_PROTECT:
-		sym = @symbol(ERROR_WRITE_PROTECT);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
-
-	    case ERROR_WRITE_FAULT:
-		sym = @symbol(ERROR_WRITE_FAULT);
-		typ = @symbol(transferFaultSignal);
-		break;
-
-	    case ERROR_READ_FAULT:
-		sym = @symbol(ERROR_READ_FAULT);
-		typ = @symbol(transferFaultSignal);
-		break;
-
-	    case ERROR_HANDLE_DISK_FULL:
-		sym = @symbol(ERROR_HANDLE_DISK_FULL);
-		typ = @symbol(volumeFullSignal);
-		break;
-
-	    case ERROR_DISK_FULL:
-		sym = @symbol(ERROR_DISK_FULL);
-		typ = @symbol(volumeFullSignal);
-		break;
-
-	    case ERROR_SHARING_VIOLATION:
-		sym = @symbol(ERROR_SHARING_VIOLATION);
-		typ = @symbol(noPermissionsSignal);
-		break;
-
-	    case ERROR_LOCK_VIOLATION:
-		sym = @symbol(ERROR_LOCK_VIOLATION);
-		typ = @symbol(noPermissionsSignal);
-		break;
-
-	    case ERROR_INVALID_PARAMETER:
-		sym = @symbol(ERROR_INVALID_PARAMETER);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_NET_WRITE_FAULT:
-		sym = @symbol(ERROR_NET_WRITE_FAULT);
-		typ = @symbol(transferFaultSignal);
-		break;
-
-	    case ERROR_NOT_SUPPORTED:
-		sym = @symbol(ERROR_NOT_SUPPORTED);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
-
-	    case ERROR_REM_NOT_LIST:
-		sym = @symbol(ERROR_REM_NOT_LIST);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_NETWORK_ACCESS_DENIED:
-		sym = @symbol(ERROR_NETWORK_ACCESS_DENIED);
-		typ = @symbol(noPermissionsSignal);
-		break;
-
-	    case ERROR_DUP_NAME:
-		sym = @symbol(ERROR_DUP_NAME);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_BAD_NETPATH:
-		sym = @symbol(ERROR_BAD_NETPATH);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_NETWORK_BUSY:
-		sym = @symbol(ERROR_NETWORK_BUSY);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_DRIVE_LOCKED:
-		sym = @symbol(ERROR_DRIVE_LOCKED);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
-
-	    case ERROR_INVALID_DRIVE:
-		sym = @symbol(ERROR_INVALID_DRIVE);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_WRONG_DISK:
-		sym = @symbol(ERROR_WRONG_DISK);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_CURRENT_DIRECTORY:
-		sym = @symbol(ERROR_CURRENT_DIRECTORY);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    /*
-	     * what a nice errorCode - thats the most "useful" one I ever
-	     * encountered ... (... those stupid micro-softies ...)
-	     */
-	    case ERROR_CANNOT_MAKE:
-		sym = @symbol(ERROR_CANNOT_MAKE);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
-
-	    case ERROR_NO_MORE_FILES:
-		sym = @symbol(ERROR_NO_MORE_FILES);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_NOT_READY:
-		sym = @symbol(ERROR_NOT_READY);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_NOT_DOS_DISK:
-		sym = @symbol(ERROR_NOT_DOS_DISK);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
-
-	    case ERROR_OUT_OF_PAPER:
-		sym = @symbol(ERROR_OUT_OF_PAPER);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_PRINTQ_FULL:
-		sym = @symbol(ERROR_PRINTQ_FULL);
-		typ = @symbol(noResourcesSignal);
-		break;
-
-	    case ERROR_FILE_EXISTS:
-		sym = @symbol(ERROR_FILE_EXISTS);
-		typ = @symbol(existingReferentSignal);
-		break;
-
-	    default:
-		break;
-	}
+        switch (__eno & 0xFFFF) {
+            /*
+             * WIN32 GetLastError returns
+             */
+            case ERROR_INVALID_FUNCTION:
+                sym = @symbol(ERROR_INVALID_FUNCTION);
+                typ = @symbol(illegalOperationSignal);
+                break;
+
+            case ERROR_BAD_FORMAT:
+                sym = @symbol(ERROR_BAD_FORMAT);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_FILE_NOT_FOUND:
+                sym = @symbol(ERROR_FILE_NOT_FOUND);
+                typ = @symbol(nonexistentSignal);
+                break;
+
+            case ERROR_PATH_NOT_FOUND:
+                sym = @symbol(ERROR_PATH_NOT_FOUND);
+                typ = @symbol(nonexistentSignal);
+                break;
+
+            case ERROR_TOO_MANY_OPEN_FILES:
+                sym = @symbol(ERROR_TOO_MANY_OPEN_FILES);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            /*
+             * what a nice errorCode - thats the most "useful" one I ever
+             * encountered ... (... those stupid micro-softies ...)
+             */
+            case ERROR_OPEN_FAILED:
+                sym = @symbol(ERROR_OPEN_FAILED);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_ACCESS_DENIED:
+                sym = @symbol(ERROR_ACCESS_DENIED);
+                typ = @symbol(noPermissionsSignal);
+                break;
+
+            case ERROR_INVALID_HANDLE:
+                sym = @symbol(ERROR_INVALID_HANDLE);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_NOT_ENOUGH_MEMORY:
+                sym = @symbol(ERROR_NOT_ENOUGH_MEMORY);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_NO_SYSTEM_RESOURCES:
+                sym = @symbol(ERROR_NO_SYSTEM_RESOURCES);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_NONPAGED_SYSTEM_RESOURCES:
+                sym = @symbol(ERROR_NONPAGED_SYSTEM_RESOURCES);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_PAGED_SYSTEM_RESOURCES:
+                sym = @symbol(ERROR_PAGED_SYSTEM_RESOURCES);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_INVALID_ACCESS:
+                sym = @symbol(ERROR_INVALID_ACCESS);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
+
+            case ERROR_INVALID_DATA:
+                sym = @symbol(ERROR_INVALID_DATA);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_INVALID_NAME:
+                sym = @symbol(ERROR_INVALID_NAME);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_ARENA_TRASHED:
+                sym = @symbol(ERROR_ARENA_TRASHED);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_OUTOFMEMORY:
+                sym = @symbol(ERROR_OUTOFMEMORY);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_BROKEN_PIPE:
+                sym = @symbol(ERROR_BROKEN_PIPE);
+                typ = @symbol(peerFaultSignal);
+                break;
+
+            case ERROR_GEN_FAILURE:
+                sym = @symbol(ERROR_GEN_FAILURE);
+                break;
+
+            case ERROR_WRITE_PROTECT:
+                sym = @symbol(ERROR_WRITE_PROTECT);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
+
+            case ERROR_WRITE_FAULT:
+                sym = @symbol(ERROR_WRITE_FAULT);
+                typ = @symbol(transferFaultSignal);
+                break;
+
+            case ERROR_READ_FAULT:
+                sym = @symbol(ERROR_READ_FAULT);
+                typ = @symbol(transferFaultSignal);
+                break;
+
+            case ERROR_HANDLE_DISK_FULL:
+                sym = @symbol(ERROR_HANDLE_DISK_FULL);
+                typ = @symbol(volumeFullSignal);
+                break;
+
+            case ERROR_DISK_FULL:
+                sym = @symbol(ERROR_DISK_FULL);
+                typ = @symbol(volumeFullSignal);
+                break;
+
+            case ERROR_SHARING_VIOLATION:
+                sym = @symbol(ERROR_SHARING_VIOLATION);
+                typ = @symbol(noPermissionsSignal);
+                break;
+
+            case ERROR_LOCK_VIOLATION:
+                sym = @symbol(ERROR_LOCK_VIOLATION);
+                typ = @symbol(noPermissionsSignal);
+                break;
+
+            case ERROR_INVALID_PARAMETER:
+                sym = @symbol(ERROR_INVALID_PARAMETER);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_NET_WRITE_FAULT:
+                sym = @symbol(ERROR_NET_WRITE_FAULT);
+                typ = @symbol(transferFaultSignal);
+                break;
+
+            case ERROR_NOT_SUPPORTED:
+                sym = @symbol(ERROR_NOT_SUPPORTED);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
+
+            case ERROR_REM_NOT_LIST:
+                sym = @symbol(ERROR_REM_NOT_LIST);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_NETWORK_ACCESS_DENIED:
+                sym = @symbol(ERROR_NETWORK_ACCESS_DENIED);
+                typ = @symbol(noPermissionsSignal);
+                break;
+
+            case ERROR_DUP_NAME:
+                sym = @symbol(ERROR_DUP_NAME);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_BAD_NETPATH:
+                sym = @symbol(ERROR_BAD_NETPATH);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_NETWORK_BUSY:
+                sym = @symbol(ERROR_NETWORK_BUSY);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_DRIVE_LOCKED:
+                sym = @symbol(ERROR_DRIVE_LOCKED);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
+
+            case ERROR_INVALID_DRIVE:
+                sym = @symbol(ERROR_INVALID_DRIVE);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_WRONG_DISK:
+                sym = @symbol(ERROR_WRONG_DISK);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_CURRENT_DIRECTORY:
+                sym = @symbol(ERROR_CURRENT_DIRECTORY);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            /*
+             * what a nice errorCode - thats the most "useful" one I ever
+             * encountered ... (... those stupid micro-softies ...)
+             */
+            case ERROR_CANNOT_MAKE:
+                sym = @symbol(ERROR_CANNOT_MAKE);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
+
+            case ERROR_NO_MORE_FILES:
+                sym = @symbol(ERROR_NO_MORE_FILES);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_NOT_READY:
+                sym = @symbol(ERROR_NOT_READY);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_NOT_DOS_DISK:
+                sym = @symbol(ERROR_NOT_DOS_DISK);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
+
+            case ERROR_OUT_OF_PAPER:
+                sym = @symbol(ERROR_OUT_OF_PAPER);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_PRINTQ_FULL:
+                sym = @symbol(ERROR_PRINTQ_FULL);
+                typ = @symbol(noResourcesSignal);
+                break;
+
+            case ERROR_FILE_EXISTS:
+                sym = @symbol(ERROR_FILE_EXISTS);
+                typ = @symbol(existingReferentSignal);
+                break;
+
+            default:
+                break;
+        }
       } else {
-	switch (__eno) {
-	    /*
-	     * POSIX errnos - these should be defined
-	     */
+        switch (__eno) {
+            /*
+             * POSIX errnos - these should be defined
+             */
 #ifdef EPERM
-	    case EPERM:
-		sym = @symbol(EPERM);
-		typ = @symbol(noPermissionsSignal);
-		break;
+            case EPERM:
+                sym = @symbol(EPERM);
+                typ = @symbol(noPermissionsSignal);
+                break;
 #endif
 #ifdef ENOENT
-	    case ENOENT:
-		sym = @symbol(ENOENT);
-		typ = @symbol(nonexistentSignal);
-		break;
+            case ENOENT:
+                sym = @symbol(ENOENT);
+                typ = @symbol(nonexistentSignal);
+                break;
 #endif
 #ifdef ESRCH
-	    case ESRCH:
-		sym = @symbol(ESRCH);
-		typ = @symbol(unavailableReferentSignal);
-		break;
+            case ESRCH:
+                sym = @symbol(ESRCH);
+                typ = @symbol(unavailableReferentSignal);
+                break;
 #endif
 #ifdef EINTR
-	    case EINTR:
-		sym = @symbol(EINTR);
-		typ = @symbol(transientErrorSignal);
-		break;
+            case EINTR:
+                sym = @symbol(EINTR);
+                typ = @symbol(transientErrorSignal);
+                break;
 #endif
 #ifdef EIO
-	    case EIO:
-		sym = @symbol(EIO);
-		typ = @symbol(transferFaultSignal);
-		break;
+            case EIO:
+                sym = @symbol(EIO);
+                typ = @symbol(transferFaultSignal);
+                break;
 #endif
 #ifdef ENXIO
-	    case ENXIO:
-		sym = @symbol(ENXIO);
-		typ = @symbol(unavailableReferentSignal);
-		break;
+            case ENXIO:
+                sym = @symbol(ENXIO);
+                typ = @symbol(unavailableReferentSignal);
+                break;
 #endif
 #ifdef E2BIG
-	    case E2BIG:
-		sym = @symbol(E2BIG);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
+            case E2BIG:
+                sym = @symbol(E2BIG);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
 #endif
 #ifdef ENOEXEC
-	    case ENOEXEC:
-		sym = @symbol(ENOEXEC);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ENOEXEC:
+                sym = @symbol(ENOEXEC);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EBADF
-	    case EBADF:
-		sym = @symbol(EBADF);
-		typ = @symbol(badAccessorSignal);
-		break;
+            case EBADF:
+                sym = @symbol(EBADF);
+                typ = @symbol(badAccessorSignal);
+                break;
 #endif
 #ifdef ECHILD
-	    case ECHILD:
-		sym = @symbol(ECHILD);
-		typ = @symbol(informationSignal);
-		break;
+            case ECHILD:
+                sym = @symbol(ECHILD);
+                typ = @symbol(informationSignal);
+                break;
 #endif
 #if !defined(EWOULDBLOCK) && defined(EAGAIN) && (EWOULDBLOCK != EAGAIN)
-	    case EAGAIN:
-		sym = @symbol(EAGAIN);
-		typ = @symbol(notReadySignal);
-		break;
+            case EAGAIN:
+                sym = @symbol(EAGAIN);
+                typ = @symbol(notReadySignal);
+                break;
 #endif
 #ifdef ENOMEM
-	    case ENOMEM:
-		sym = @symbol(ENOMEM);
-		typ = @symbol(noMemorySignal);
-		break;
+            case ENOMEM:
+                sym = @symbol(ENOMEM);
+                typ = @symbol(noMemorySignal);
+                break;
 #endif
 #ifdef EACCES
-	    case EACCES:
-		sym = @symbol(EACCES);
-		typ = @symbol(noPermissionsSignal);
-		break;
+            case EACCES:
+                sym = @symbol(EACCES);
+                typ = @symbol(noPermissionsSignal);
+                break;
 #endif
 #ifdef EFAULT
-	    case EFAULT:
-		sym = @symbol(EFAULT);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
+            case EFAULT:
+                sym = @symbol(EFAULT);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
 #endif
 #ifdef EBUSY
-	    case EBUSY:
-		sym = @symbol(EBUSY);
-		typ = @symbol(unavailableReferentSignal);
-		break;
+            case EBUSY:
+                sym = @symbol(EBUSY);
+                typ = @symbol(unavailableReferentSignal);
+                break;
 #endif
 #ifdef EEXIST
-	    case EEXIST:
-		sym = @symbol(EEXIST);
-		typ = @symbol(existingReferentSignal);
-		break;
+            case EEXIST:
+                sym = @symbol(EEXIST);
+                typ = @symbol(existingReferentSignal);
+                break;
 #endif
 #ifdef EXDEV
-	    case EXDEV:
-		sym = @symbol(EXDEV);
-		typ = @symbol(inappropriateReferentSignal);
-		break;
+            case EXDEV:
+                sym = @symbol(EXDEV);
+                typ = @symbol(inappropriateReferentSignal);
+                break;
 #endif
 #ifdef ENODEV
-	    case ENODEV:
-		sym = @symbol(ENODEV);
-		typ = @symbol(inaccessibleSignal);
-		break;
+            case ENODEV:
+                sym = @symbol(ENODEV);
+                typ = @symbol(inaccessibleSignal);
+                break;
 #endif
 #ifdef ENOTDIR
-	    case ENOTDIR:
-		sym = @symbol(ENOTDIR);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ENOTDIR:
+                sym = @symbol(ENOTDIR);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EISDIR
-	    case EISDIR:
-		sym = @symbol(EISDIR);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case EISDIR:
+                sym = @symbol(EISDIR);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EINVAL
-	    case EINVAL:
-		sym = @symbol(EINVAL);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
+            case EINVAL:
+                sym = @symbol(EINVAL);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
 #endif
 #ifdef ENFILE
-	    case ENFILE:
-		sym = @symbol(ENFILE);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case ENFILE:
+                sym = @symbol(ENFILE);
+                typ = @symbol(noResourcesSignal);
+                break;
 #endif
 #ifdef EMFILE
-	    case EMFILE:
-		sym = @symbol(EMFILE);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case EMFILE:
+                sym = @symbol(EMFILE);
+                typ = @symbol(noResourcesSignal);
+                break;
 #endif
 #ifdef ENOTTY
-	    case ENOTTY:
-		sym = @symbol(ENOTTY);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ENOTTY:
+                sym = @symbol(ENOTTY);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EFBIG
-	    case EFBIG:
-		sym = @symbol(EFBIG);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case EFBIG:
+                sym = @symbol(EFBIG);
+                typ = @symbol(noResourcesSignal);
+                break;
 #endif
 #ifdef ENOSPC
-	    case ENOSPC:
-		sym = @symbol(ENOSPC);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case ENOSPC:
+                sym = @symbol(ENOSPC);
+                typ = @symbol(noResourcesSignal);
+                break;
 #endif
 #ifdef ESPIPE
-	    case ESPIPE:
-		sym = @symbol(ESPIPE);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ESPIPE:
+                sym = @symbol(ESPIPE);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EROFS
-	    case EROFS:
-		sym = @symbol(EROFS);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case EROFS:
+                sym = @symbol(EROFS);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EMLINK
-	    case EMLINK:
-		sym = @symbol(EMLINK);
-		typ = @symbol(rangeErrorSignal);
-		break;
+            case EMLINK:
+                sym = @symbol(EMLINK);
+                typ = @symbol(rangeErrorSignal);
+                break;
 #endif
 #ifdef EPIPE
-	    case EPIPE:
-		sym = @symbol(EPIPE);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case EPIPE:
+                sym = @symbol(EPIPE);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef EDOM
-	    case EDOM:
-		sym = @symbol(EDOM);
-		typ = @symbol(rangeErrorSignal);
-		break;
+            case EDOM:
+                sym = @symbol(EDOM);
+                typ = @symbol(rangeErrorSignal);
+                break;
 #endif
 #ifdef ERANGE
-	    case ERANGE:
-		sym = @symbol(ERANGE);
-		typ = @symbol(rangeErrorSignal);
-		break;
+            case ERANGE:
+                sym = @symbol(ERANGE);
+                typ = @symbol(rangeErrorSignal);
+                break;
 #endif
 #ifdef EDEADLK
 # if EDEADLK != EWOULDBLOCK
-	    case EDEADLK:
-		sym = @symbol(EDEADLK);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case EDEADLK:
+                sym = @symbol(EDEADLK);
+                typ = @symbol(noResourcesSignal);
+                break;
 # endif
 #endif
 #ifdef ENAMETOOLONG
-	    case ENAMETOOLONG:
-		sym = @symbol(ENAMETOOLONG);
-		typ = @symbol(rangeErrorSignal);
-		break;
+            case ENAMETOOLONG:
+                sym = @symbol(ENAMETOOLONG);
+                typ = @symbol(rangeErrorSignal);
+                break;
 #endif
 #ifdef ENOLCK
-	    case ENOLCK:
-		sym = @symbol(ENOLCK);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ENOLCK:
+                sym = @symbol(ENOLCK);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef ENOSYS
-	    case ENOSYS:
-		sym = @symbol(ENOSYS);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ENOSYS:
+                sym = @symbol(ENOSYS);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST)
-	    case ENOTEMPTY:
-		sym = @symbol(ENOTEMPTY);
-		typ = @symbol(inappropriateReferentSignal);
-		break;
+            case ENOTEMPTY:
+                sym = @symbol(ENOTEMPTY);
+                typ = @symbol(inappropriateReferentSignal);
+                break;
 #endif
 #ifdef EILSEQ
-	    case EILSEQ:
-		sym = @symbol(EILSEQ);
-		typ = @symbol(transferFaultSignal);
-		break;
-#endif
-	    /*
-	     * XPG3 errnos - defined on most systems
-	     */
+            case EILSEQ:
+                sym = @symbol(EILSEQ);
+                typ = @symbol(transferFaultSignal);
+                break;
+#endif
+            /*
+             * XPG3 errnos - defined on most systems
+             */
 #ifdef ENOTBLK
-	    case ENOTBLK:
-		sym = @symbol(ENOTBLK);
-		typ = @symbol(inappropriateReferentSignal);
-		break;
+            case ENOTBLK:
+                sym = @symbol(ENOTBLK);
+                typ = @symbol(inappropriateReferentSignal);
+                break;
 #endif
 #ifdef ETXTBSY
-	    case ETXTBSY:
-		sym = @symbol(ETXTBSY);
-		typ = @symbol(inaccessibleSignal);
-		break;
-#endif
-	    /*
-	     * some others
-	     */
+            case ETXTBSY:
+                sym = @symbol(ETXTBSY);
+                typ = @symbol(inaccessibleSignal);
+                break;
+#endif
+            /*
+             * some others
+             */
 #ifdef EWOULDBLOCK
-	    case EWOULDBLOCK:
-		sym = @symbol(EWOULDBLOCK);
-		typ = @symbol(notReadySignal);
-		break;
+            case EWOULDBLOCK:
+                sym = @symbol(EWOULDBLOCK);
+                typ = @symbol(notReadySignal);
+                break;
 #endif
 #ifdef ENOMSG
-	    case ENOMSG:
-		sym = @symbol(ENOMSG);
-		typ = @symbol(noDataSignal);
-		break;
+            case ENOMSG:
+                sym = @symbol(ENOMSG);
+                typ = @symbol(noDataSignal);
+                break;
 #endif
 #ifdef ELOOP
-	    case ELOOP:
-		sym = @symbol(ELOOP);
-		typ = @symbol(rangeErrorSignal);
-		break;
-#endif
-
-	    /*
-	     * some stream errors
-	     */
+            case ELOOP:
+                sym = @symbol(ELOOP);
+                typ = @symbol(rangeErrorSignal);
+                break;
+#endif
+
+            /*
+             * some stream errors
+             */
 #ifdef ETIME
-	    case ETIME:
-		sym = @symbol(ETIME);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ETIME:
+                sym = @symbol(ETIME);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ENOSR
-	    case ENOSR:
-		sym = @symbol(ENOSR);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case ENOSR:
+                sym = @symbol(ENOSR);
+                typ = @symbol(noResourcesSignal);
+                break;
 #endif
 #ifdef ENOSTR
-	    case ENOSTR:
-		sym = @symbol(ENOSTR);
-		typ = @symbol(inappropriateReferentSignal);
-		break;
+            case ENOSTR:
+                sym = @symbol(ENOSTR);
+                typ = @symbol(inappropriateReferentSignal);
+                break;
 #endif
 #ifdef ECOMM
-	    case ECOMM:
-		sym = @symbol(ECOMM);
-		typ = @symbol(transferFaultSignal);
-		break;
+            case ECOMM:
+                sym = @symbol(ECOMM);
+                typ = @symbol(transferFaultSignal);
+                break;
 #endif
 #ifdef EPROTO
-	    case EPROTO:
-		sym = @symbol(EPROTO);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
-#endif
-	    /*
-	     * nfs errors
-	     */
+            case EPROTO:
+                sym = @symbol(EPROTO);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
+#endif
+            /*
+             * nfs errors
+             */
 #ifdef ESTALE
-	    case ESTALE:
-		sym = @symbol(ESTALE);
-		typ = @symbol(unavailableReferentSignal);
-		break;
+            case ESTALE:
+                sym = @symbol(ESTALE);
+                typ = @symbol(unavailableReferentSignal);
+                break;
 #endif
 #ifdef EREMOTE
-	    case EREMOTE:
-		sym = @symbol(EREMOTE);
-		typ = @symbol(rangeErrorSignal);
-		break;
-#endif
-	    /*
-	     * some networking errors
-	     */
+            case EREMOTE:
+                sym = @symbol(EREMOTE);
+                typ = @symbol(rangeErrorSignal);
+                break;
+#endif
+            /*
+             * some networking errors
+             */
 #ifdef EINPROGRESS
-	    case EINPROGRESS:
-		sym = @symbol(EINPROGRESS);
-		typ = @symbol(operationStartedSignal);
-		break;
+            case EINPROGRESS:
+                sym = @symbol(EINPROGRESS);
+                typ = @symbol(operationStartedSignal);
+                break;
 #endif
 #ifdef EALREADY
-	    case EALREADY:
-		sym = @symbol(EALREADY);
-		typ = @symbol(operationStartedSignal);
-		break;
+            case EALREADY:
+                sym = @symbol(EALREADY);
+                typ = @symbol(operationStartedSignal);
+                break;
 #endif
 #ifdef ENOTSOCK
-	    case ENOTSOCK:
-		sym = @symbol(ENOTSOCK);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case ENOTSOCK:
+                sym = @symbol(ENOTSOCK);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EDESTADDRREQ
-	    case EDESTADDRREQ:
-		sym = @symbol(EDESTADDRREQ);
-		typ = @symbol(underspecifiedSignal);
-		break;
+            case EDESTADDRREQ:
+                sym = @symbol(EDESTADDRREQ);
+                typ = @symbol(underspecifiedSignal);
+                break;
 #endif
 #ifdef EMSGSIZE
-	    case EMSGSIZE:
-		sym = @symbol(EMSGSIZE);
-		typ = @symbol(rangeErrorSignal);
-		break;
+            case EMSGSIZE:
+                sym = @symbol(EMSGSIZE);
+                typ = @symbol(rangeErrorSignal);
+                break;
 #endif
 #ifdef EPROTOTYPE
-	    case EPROTOTYPE:
-		sym = @symbol(EPROTOTYPE);
-		typ = @symbol(wrongSubtypeForOperationSignal);
-		break;
+            case EPROTOTYPE:
+                sym = @symbol(EPROTOTYPE);
+                typ = @symbol(wrongSubtypeForOperationSignal);
+                break;
 #endif
 #ifdef ENOPROTOOPT
-	    case ENOPROTOOPT:
-		sym = @symbol(ENOPROTOOPT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case ENOPROTOOPT:
+                sym = @symbol(ENOPROTOOPT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef EPROTONOSUPPORT
-	    case EPROTONOSUPPORT:
-		sym = @symbol(EPROTONOSUPPORT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case EPROTONOSUPPORT:
+                sym = @symbol(EPROTONOSUPPORT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef ESOCKTNOSUPPORT
-	    case ESOCKTNOSUPPORT:
-		sym = @symbol(ESOCKTNOSUPPORT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case ESOCKTNOSUPPORT:
+                sym = @symbol(ESOCKTNOSUPPORT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef EOPNOTSUPP
-	    case EOPNOTSUPP:
-		sym = @symbol(EOPNOTSUPP);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case EOPNOTSUPP:
+                sym = @symbol(EOPNOTSUPP);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef EPFNOSUPPORT
-	    case EPFNOSUPPORT:
-		sym = @symbol(EPFNOSUPPORT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case EPFNOSUPPORT:
+                sym = @symbol(EPFNOSUPPORT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef EAFNOSUPPORT
-	    case EAFNOSUPPORT:
-		sym = @symbol(EAFNOSUPPORT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case EAFNOSUPPORT:
+                sym = @symbol(EAFNOSUPPORT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef EADDRINUSE
-	    case EADDRINUSE:
-		sym = @symbol(EADDRINUSE);
-		typ = @symbol(existingReferentSignal);
-		break;
+            case EADDRINUSE:
+                sym = @symbol(EADDRINUSE);
+                typ = @symbol(existingReferentSignal);
+                break;
 #endif
 #ifdef WSAEADDRINUSE
-	    case WSAEADDRINUSE:
-		sym = @symbol(WSAEADDRINUSE);
-		typ = @symbol(existingReferentSignal);
-		break;
+            case WSAEADDRINUSE:
+                sym = @symbol(WSAEADDRINUSE);
+                typ = @symbol(existingReferentSignal);
+                break;
 #endif
 
 #ifdef EADDRNOTAVAIL
-	    case EADDRNOTAVAIL:
-		sym = @symbol(EADDRNOTAVAIL);
-		typ = @symbol(noPermissionsSignal);
-		break;
+            case EADDRNOTAVAIL:
+                sym = @symbol(EADDRNOTAVAIL);
+                typ = @symbol(noPermissionsSignal);
+                break;
 #endif
 #ifdef ETIMEDOUT
-	    case ETIMEDOUT:
-		sym = @symbol(ETIMEDOUT);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ETIMEDOUT:
+                sym = @symbol(ETIMEDOUT);
+                typ = @symbol(peerFaultSignal);
+                break;
+#endif
+#ifdef WSAETIMEDOUT
+            case WSAETIMEDOUT:
+                sym = @symbol(ETIMEDOUT);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ECONNREFUSED
-	    case ECONNREFUSED:
-		sym = @symbol(ECONNREFUSED);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ECONNREFUSED:
+                sym = @symbol(ECONNREFUSED);
+                typ = @symbol(peerFaultSignal);
+                break;
+#endif
+#ifdef WSAECONNREFUSED
+            case WSAECONNREFUSED:
+                sym = @symbol(ECONNREFUSED);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ENETDOWN
-	    case ENETDOWN:
-		sym = @symbol(ENETDOWN);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ENETDOWN:
+                sym = @symbol(ENETDOWN);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ENETUNREACH
-	    case ENETUNREACH:
-		sym = @symbol(ENETUNREACH);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ENETUNREACH:
+                sym = @symbol(ENETUNREACH);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ENETRESET
-	    case ENETRESET:
-		sym = @symbol(ENETRESET);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ENETRESET:
+                sym = @symbol(ENETRESET);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ECONNABORTED
-	    case ECONNABORTED:
-		sym = @symbol(ECONNABORTED);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ECONNABORTED:
+                sym = @symbol(ECONNABORTED);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef ECONNRESET
-	    case ECONNRESET:
-		sym = @symbol(ECONNRESET);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case ECONNRESET:
+                sym = @symbol(ECONNRESET);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef EISCONN
-	    case EISCONN:
-		sym = @symbol(EISCONN);
-		typ = @symbol(unpreparedOperationSignal);
-		break;
+            case EISCONN:
+                sym = @symbol(EISCONN);
+                typ = @symbol(unpreparedOperationSignal);
+                break;
 #endif
 #ifdef ENOTCONN
-	    case ENOTCONN:
-		sym = @symbol(ENOTCONN);
-		typ = @symbol(unpreparedOperationSignal);
-		break;
+            case ENOTCONN:
+                sym = @symbol(ENOTCONN);
+                typ = @symbol(unpreparedOperationSignal);
+                break;
 #endif
 #ifdef ESHUTDOWN
-	    case ESHUTDOWN:
-		sym = @symbol(ESHUTDOWN);
-		typ = @symbol(unpreparedOperationSignal);
-		break;
+            case ESHUTDOWN:
+                sym = @symbol(ESHUTDOWN);
+                typ = @symbol(unpreparedOperationSignal);
+                break;
 #endif
 #ifdef EHOSTDOWN
-	    case EHOSTDOWN:
-		sym = @symbol(EHOSTDOWN);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case EHOSTDOWN:
+                sym = @symbol(EHOSTDOWN);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 #ifdef EHOSTUNREACH
-	    case EHOSTUNREACH:
-		sym = @symbol(EHOSTUNREACH);
-		typ = @symbol(peerFaultSignal);
-		break;
+            case EHOSTUNREACH:
+                sym = @symbol(EHOSTUNREACH);
+                typ = @symbol(peerFaultSignal);
+                break;
+#endif
+#ifdef WSAHOSTUNREACH
+            case WSAHOSTUNREACH:
+                sym = @symbol(EHOSTUNREACH);
+                typ = @symbol(peerFaultSignal);
+                break;
 #endif
 
 #ifdef WSAEFAULT
-	    case WSAEFAULT:
-		sym = @symbol(WSAEFAULT);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
+            case WSAEFAULT:
+                sym = @symbol(WSAEFAULT);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
 #endif
 #ifdef WSAEINTR
-	    case WSAEINTR:
-		sym = @symbol(WSAEINTR);
-		typ = @symbol(transientErrorSignal);
-		break;
+            case WSAEINTR:
+                sym = @symbol(WSAEINTR);
+                typ = @symbol(transientErrorSignal);
+                break;
 #endif
 #ifdef WSAEBADF
-	    case WSAEBADF:
-		sym = @symbol(WSAEBADF);
-		typ = @symbol(badAccessorSignal);
-		break;
+            case WSAEBADF:
+                sym = @symbol(WSAEBADF);
+                typ = @symbol(badAccessorSignal);
+                break;
 #endif
 #ifdef WSAEACCES
-	    case WSAEACCES:
-		sym = @symbol(WSAEACCES);
-		typ = @symbol(badAccessorSignal);
-		break;
+            case WSAEACCES:
+                sym = @symbol(WSAEACCES);
+                typ = @symbol(badAccessorSignal);
+                break;
 #endif
 #ifdef WSAEINVAL
-	    case WSAEINVAL:
-		sym = @symbol(WSAEINVAL);
-		typ = @symbol(invalidArgumentsSignal);
-		break;
+            case WSAEINVAL:
+                sym = @symbol(WSAEINVAL);
+                typ = @symbol(invalidArgumentsSignal);
+                break;
 #endif
 #ifdef WSAEMFILE
-	    case WSAEMFILE:
-		sym = @symbol(WSAEMFILE);
-		typ = @symbol(noResourcesSignal);
-		break;
+            case WSAEMFILE:
+                sym = @symbol(WSAEMFILE);
+                typ = @symbol(noResourcesSignal);
+                break;
 #endif
 #ifdef WSAEWOULDBLOCK
-	    case WSAEWOULDBLOCK:
-		sym = @symbol(WSAEWOULDBLOCK);
-		typ = @symbol(notReadySignal);
-		break;
+            case WSAEWOULDBLOCK:
+                sym = @symbol(WSAEWOULDBLOCK);
+                typ = @symbol(notReadySignal);
+                break;
 #endif
 #ifdef WSAEINPROGRESS
-	    case WSAEINPROGRESS:
-		sym = @symbol(WSAEINPROGRESS);
-		typ = @symbol(operationStartedSignal);
-		break;
+            case WSAEINPROGRESS:
+                sym = @symbol(WSAEINPROGRESS);
+                typ = @symbol(operationStartedSignal);
+                break;
 #endif
 #ifdef WSAEALREADY
-	    case WSAEALREADY:
-		sym = @symbol(WSAEALREADY);
-		typ = @symbol(operationStartedSignal);
-		break;
+            case WSAEALREADY:
+                sym = @symbol(WSAEALREADY);
+                typ = @symbol(operationStartedSignal);
+                break;
 #endif
 #ifdef WSAENOTSOCK
-	    case WSAENOTSOCK:
-		sym = @symbol(WSAENOTSOCK);
-		typ = @symbol(inappropriateOperationSignal);
-		break;
+            case WSAENOTSOCK:
+                sym = @symbol(WSAENOTSOCK);
+                typ = @symbol(inappropriateOperationSignal);
+                break;
 #endif
 #ifdef WSAEPROTONOSUPPORT
-	    case WSAEPROTONOSUPPORT:
-		sym = @symbol(WSAEPROTONOSUPPORT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case WSAEPROTONOSUPPORT:
+                sym = @symbol(WSAEPROTONOSUPPORT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef WSAESOCKTNOSUPPORT
-	    case WSAESOCKTNOSUPPORT:
-		sym = @symbol(WSAESOCKTNOSUPPORT);
-		typ = @symbol(unsupportedOperationSignal);
-		break;
+            case WSAESOCKTNOSUPPORT:
+                sym = @symbol(WSAESOCKTNOSUPPORT);
+                typ = @symbol(unsupportedOperationSignal);
+                break;
 #endif
 #ifdef E_NOINTERFACE
-	    case E_NOINTERFACE:
-		sym = @symbol(E_NOINTERFACE);
-		typ = @symbol(noInterfaceSignal);
-		break;
+            case E_NOINTERFACE:
+                sym = @symbol(E_NOINTERFACE);
+                typ = @symbol(noInterfaceSignal);
+                break;
 #endif
 #ifdef CO_E_NOTINITIALIZED
-	    case CO_E_NOTINITIALIZED:
-		sym = @symbol(CO_E_NOTINITIALIZED);
-		typ = @symbol(coNotInitializedSignal);
-		break;
+            case CO_E_NOTINITIALIZED:
+                sym = @symbol(CO_E_NOTINITIALIZED);
+                typ = @symbol(coNotInitializedSignal);
+                break;
 #endif
 #ifdef REGDB_E_CLASSNOTREG
-	    case REGDB_E_CLASSNOTREG:
-		sym = @symbol(REGDB_E_CLASSNOTREG);
-		typ = @symbol(classNotRegisteredSignal);
-		break;
+            case REGDB_E_CLASSNOTREG:
+                sym = @symbol(REGDB_E_CLASSNOTREG);
+                typ = @symbol(classNotRegisteredSignal);
+                break;
 #endif
 #ifdef CLASS_E_NOAGGREGATION
-	    case CLASS_E_NOAGGREGATION:
-		sym = @symbol(CLASS_E_NOAGGREGATION);
-		typ = @symbol(noAggregationSignal);
-		break;
+            case CLASS_E_NOAGGREGATION:
+                sym = @symbol(CLASS_E_NOAGGREGATION);
+                typ = @symbol(noAggregationSignal);
+                break;
 #endif
 #ifdef DISP_E_UNKNOWNNAME
-	    case DISP_E_UNKNOWNNAME:
-		sym = @symbol(DISP_E_UNKNOWNNAME);
-		typ = @symbol(unknownNameSignal);
-		break;
+            case DISP_E_UNKNOWNNAME:
+                sym = @symbol(DISP_E_UNKNOWNNAME);
+                typ = @symbol(unknownNameSignal);
+                break;
 #endif
 #ifdef OLEOBJ_E_NOVERBS
-	    case OLEOBJ_E_NOVERBS:
-		sym = @symbol(OLEOBJ_E_NOVERBS);
-		typ = @symbol(noVerbsSignal);
-		break;
-#endif
-
-	    default:
-		break;
-	}
+            case OLEOBJ_E_NOVERBS:
+                sym = @symbol(OLEOBJ_E_NOVERBS);
+                typ = @symbol(noVerbsSignal);
+                break;
+#endif
+
+            default:
+                break;
+        }
       }
     }
 %}.
     holder := OSErrorHolder new.
     sym isNil ifTrue:[
-	sym := #ERROR_OTHER.
-	errNr notNil ifTrue:[
-	    "keep symbols as symbols"
-	    holder parameter:(errNr isString ifTrue:[errNr] ifFalse:[errNr asString]).
-	].
+        sym := #ERROR_OTHER.
+        errNr notNil ifTrue:[
+            "keep symbols as symbols"
+            holder parameter:(errNr isString ifTrue:[errNr] ifFalse:[errNr asString]).
+        ].
     ].
     holder errorSymbol:sym errorCategory:(typ ? #defaultOsErrorSignal).
     ^ holder
@@ -2648,212 +2666,212 @@
      */
 #ifdef ERROR_INVALID_FUNCTION
     if (sym == @symbol(ERROR_INVALID_FUNCTION)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_FUNCTION)) );
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_FUNCTION)) );
     }
 #endif
 #ifdef ERROR_BAD_FORMAT
     if (sym == @symbol(ERROR_BAD_FORMAT)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_BAD_FORMAT)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_BAD_FORMAT)));
     }
 #endif
 #ifdef ERROR_FILE_NOT_FOUND
     if (sym == @symbol(ERROR_FILE_NOT_FOUND)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_FILE_NOT_FOUND)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_FILE_NOT_FOUND)));
     }
 #endif
 #ifdef ERROR_PATH_NOT_FOUND
     if (sym == @symbol(ERROR_PATH_NOT_FOUND)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_PATH_NOT_FOUND)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_PATH_NOT_FOUND)));
     }
 #endif
 #ifdef ERROR_TOO_MANY_OPEN_FILES
     if (sym == @symbol(ERROR_TOO_MANY_OPEN_FILES)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_TOO_MANY_OPEN_FILES)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_TOO_MANY_OPEN_FILES)));
     }
 #endif
 #ifdef ERROR_OPEN_FAILED
     if (sym == @symbol(ERROR_OPEN_FAILED)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_OPEN_FAILED)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_OPEN_FAILED)));
     }
 #endif
 #ifdef ERROR_ACCESS_DENIED
     if (sym == @symbol(ERROR_ACCESS_DENIED)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_ACCESS_DENIED)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_ACCESS_DENIED)));
     }
 #endif
 #ifdef ERROR_INVALID_HANDLE
     if (sym == @symbol(ERROR_INVALID_HANDLE)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_HANDLE)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_HANDLE)));
     }
 #endif
 #ifdef ERROR_NOT_ENOUGH_MEMORY
     if (sym == @symbol(ERROR_NOT_ENOUGH_MEMORY)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_ENOUGH_MEMORY)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_ENOUGH_MEMORY)));
     }
 #endif
 #ifdef ERROR_NO_SYSTEM_RESOURCES
     if (sym == @symbol(ERROR_NO_SYSTEM_RESOURCES)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NO_SYSTEM_RESOURCES)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NO_SYSTEM_RESOURCES)));
     }
 #endif
 #ifdef ERROR_INVALID_ACCESS
     if (sym == @symbol(ERROR_INVALID_ACCESS)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_ACCESS)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_ACCESS)));
     }
 #endif
 #ifdef ERROR_INVALID_DATA
     if (sym == @symbol(ERROR_INVALID_DATA)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_DATA)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_DATA)));
     }
 #endif
 #ifdef ERROR_INVALID_NAME
     if (sym == @symbol(ERROR_INVALID_NAME)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_NAME)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_NAME)));
     }
 #endif
 #ifdef ERROR_ARENA_TRASHED
     if (sym == @symbol(ERROR_ARENA_TRASHED)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_ARENA_TRASHED)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_ARENA_TRASHED)));
     }
 #endif
 #ifdef ERROR_OUTOFMEMORY
     if (sym == @symbol(ERROR_OUTOFMEMORY)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_OUTOFMEMORY)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_OUTOFMEMORY)));
     }
 #endif
 #ifdef ERROR_BROKEN_PIPE
     if (sym == @symbol(ERROR_BROKEN_PIPE)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_BROKEN_PIPE)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_BROKEN_PIPE)));
     }
 #endif
 #ifdef ERROR_GEN_FAILURE
     if (sym == @symbol(ERROR_GEN_FAILURE)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_GEN_FAILURE)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_GEN_FAILURE)));
     }
 #endif
 #ifdef ERROR_WRITE_PROTECT
     if (sym == @symbol(ERROR_WRITE_PROTECT)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_WRITE_PROTECT)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_WRITE_PROTECT)));
     }
 #endif
 #ifdef ERROR_WRITE_FAULT
     if (sym == @symbol(ERROR_WRITE_FAULT)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_WRITE_FAULT)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_WRITE_FAULT)));
     }
 #endif
 #ifdef ERROR_READ_FAULT
     if (sym == @symbol(ERROR_READ_FAULT)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_READ_FAULT)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_READ_FAULT)));
     }
 #endif
 #ifdef ERROR_HANDLE_DISK_FULL
     if (sym == @symbol(ERROR_HANDLE_DISK_FULL)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_HANDLE_DISK_FULL)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_HANDLE_DISK_FULL)));
     }
 #endif
 #ifdef ERROR_DISK_FULL
     if (sym == @symbol(ERROR_DISK_FULL)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_DISK_FULL)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_DISK_FULL)));
     }
 #endif
 #ifdef ERROR_ERROR_SHARING_VIOLATION
     if (sym == @symbol(ERROR_ERROR_SHARING_VIOLATION)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_ERROR_SHARING_VIOLATION)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_ERROR_SHARING_VIOLATION)));
     }
 #endif
 #ifdef ERROR_LOCK_VIOLATION
     if (sym == @symbol(ERROR_LOCK_VIOLATION)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_LOCK_VIOLATION)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_LOCK_VIOLATION)));
     }
 #endif
 #ifdef ERROR_INVALID_PARAMETER
     if (sym == @symbol(ERROR_INVALID_PARAMETER)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_PARAMETER)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_PARAMETER)));
     }
 #endif
 #ifdef ERROR_NET_WRITE_FAULT
     if (sym == @symbol(ERROR_NET_WRITE_FAULT)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NET_WRITE_FAULT)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NET_WRITE_FAULT)));
     }
 #endif
 #ifdef ERROR_NOT_SUPPORTED
     if (sym == @symbol(ERROR_NOT_SUPPORTED)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_SUPPORTED)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_SUPPORTED)));
     }
 #endif
 #ifdef ERROR_REM_NOT_LIST
     if (sym == @symbol(ERROR_REM_NOT_LIST)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_REM_NOT_LIST)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_REM_NOT_LIST)));
     }
 #endif
 #ifdef ERROR_NETWORK_ACCESS_DENIED
     if (sym == @symbol(ERROR_NETWORK_ACCESS_DENIED)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NETWORK_ACCESS_DENIED)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NETWORK_ACCESS_DENIED)));
     }
 #endif
 #ifdef ERROR_DUP_NAME
     if (sym == @symbol(ERROR_DUP_NAME)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_DUP_NAME)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_DUP_NAME)));
     }
 #endif
 #ifdef ERROR_BAD_NETPATH
     if (sym == @symbol(ERROR_BAD_NETPATH)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_BAD_NETPATH)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_BAD_NETPATH)));
     }
 #endif
 #ifdef ERROR_NETWORK_BUSY
     if (sym == @symbol(ERROR_NETWORK_BUSY)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NETWORK_BUSY)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NETWORK_BUSY)));
     }
 #endif
 #ifdef ERROR_DRIVE_LOCKED
     if (sym == @symbol(ERROR_DRIVE_LOCKED)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_DRIVE_LOCKED)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_DRIVE_LOCKED)));
     }
 #endif
 #ifdef ERROR_INVALID_DRIVE
     if (sym == @symbol(ERROR_INVALID_DRIVE)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_DRIVE)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_INVALID_DRIVE)));
     }
 #endif
 #ifdef ERROR_WRONG_DISK
     if (sym == @symbol(ERROR_WRONG_DISK)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_WRONG_DISK)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_WRONG_DISK)));
     }
 #endif
 #ifdef ERROR_CURRENT_DIRECTORY
     if (sym == @symbol(ERROR_CURRENT_DIRECTORY)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_CURRENT_DIRECTORY)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_CURRENT_DIRECTORY)));
     }
 #endif
 #ifdef ERROR_CANNOT_MAKE
     if (sym == @symbol(ERROR_CANNOT_MAKE)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_CANNOT_MAKE)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_CANNOT_MAKE)));
     }
 #endif
 #ifdef ERROR_NO_MORE_FILES
     if (sym == @symbol(ERROR_NO_MORE_FILES)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NO_MORE_FILES)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NO_MORE_FILES)));
     }
 #endif
 #ifdef ERROR_NOT_READY
     if (sym == @symbol(ERROR_NOT_READY)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_READY)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_READY)));
     }
 #endif
 #ifdef ERROR_NOT_DOS_DISK
     if (sym == @symbol(ERROR_NOT_DOS_DISK)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_DOS_DISK)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_NOT_DOS_DISK)));
     }
 #endif
 #ifdef ERROR_OUT_OF_PAPER
     if (sym == @symbol(ERROR_OUT_OF_PAPER)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_OUT_OF_PAPER)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_OUT_OF_PAPER)));
     }
 #endif
 #ifdef ERROR_PRINTQ_FULL
     if (sym == @symbol(ERROR_PRINTQ_FULL)) {
-	RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_PRINTQ_FULL)));
+        RETURN ( __mkSmallInteger(__WIN32_ERR(ERROR_PRINTQ_FULL)));
     }
 #endif
 
@@ -2862,229 +2880,229 @@
      */
 #ifdef EPERM
     if (sym == @symbol(EPERM)) {
-	RETURN ( __mkSmallInteger(EPERM) );
+        RETURN ( __mkSmallInteger(EPERM) );
     }
 #endif
 
 #ifdef ENOENT
     if (sym == @symbol(ENOENT)) {
-	RETURN ( __mkSmallInteger(ENOENT) );
+        RETURN ( __mkSmallInteger(ENOENT) );
     }
 #endif
 
 #ifdef ESRCH
     if (sym == @symbol(ESRCH)) {
-	RETURN ( __mkSmallInteger(ESRCH) );
+        RETURN ( __mkSmallInteger(ESRCH) );
     }
 #endif
 
 #ifdef EINTR
     if (sym == @symbol(EINTR)) {
-	RETURN ( __mkSmallInteger(EINTR) );
+        RETURN ( __mkSmallInteger(EINTR) );
     }
 #endif
 
 #ifdef EIO
     if (sym == @symbol(EIO)) {
-	RETURN ( __mkSmallInteger(EIO) );
+        RETURN ( __mkSmallInteger(EIO) );
     }
 #endif
 
 #ifdef ENXIO
     if (sym == @symbol(ENXIO)) {
-	RETURN ( __mkSmallInteger(ENXIO) );
+        RETURN ( __mkSmallInteger(ENXIO) );
     }
 #endif
 
 #ifdef E2BIG
     if (sym == @symbol(E2BIG)) {
-	RETURN ( __mkSmallInteger(E2BIG) );
+        RETURN ( __mkSmallInteger(E2BIG) );
     }
 #endif
 
 #ifdef ENOEXEC
     if (sym == @symbol(ENOEXEC)) {
-	RETURN ( __mkSmallInteger(ENOEXEC) );
+        RETURN ( __mkSmallInteger(ENOEXEC) );
     }
 #endif
 
 #ifdef EBADF
     if (sym == @symbol(EBADF)) {
-	RETURN ( __mkSmallInteger(EBADF) );
+        RETURN ( __mkSmallInteger(EBADF) );
     }
 #endif
 
 #ifdef ECHILD
     if (sym == @symbol(ECHILD)) {
-	RETURN ( __mkSmallInteger(ECHILD) );
+        RETURN ( __mkSmallInteger(ECHILD) );
     }
 #endif
 
 #if defined(EAGAIN)
     if (sym == @symbol(EAGAIN)) {
-	RETURN ( __mkSmallInteger(EAGAIN) );
+        RETURN ( __mkSmallInteger(EAGAIN) );
     }
 #endif
 
 #ifdef ENOMEM
     if (sym == @symbol(ENOMEM)) {
-	RETURN ( __mkSmallInteger(ENOMEM) );
+        RETURN ( __mkSmallInteger(ENOMEM) );
     }
 #endif
 
 #ifdef EACCES
     if (sym == @symbol(EACCES)) {
-	RETURN ( __mkSmallInteger(EACCES) );
+        RETURN ( __mkSmallInteger(EACCES) );
     }
 #endif
 
 #ifdef EFAULT
     if (sym == @symbol(EFAULT)) {
-	RETURN ( __mkSmallInteger(EFAULT) );
+        RETURN ( __mkSmallInteger(EFAULT) );
     }
 #endif
 
 #ifdef EBUSY
     if (sym == @symbol(EBUSY)) {
-	RETURN ( __mkSmallInteger(EBUSY) );
+        RETURN ( __mkSmallInteger(EBUSY) );
     }
 #endif
 
 #ifdef EXDEV
     if (sym == @symbol(EXDEV)) {
-	RETURN ( __mkSmallInteger(EXDEV) );
+        RETURN ( __mkSmallInteger(EXDEV) );
     }
 #endif
 
 #ifdef ENODEV
     if (sym == @symbol(ENODEV)) {
-	RETURN ( __mkSmallInteger(ENODEV) );
+        RETURN ( __mkSmallInteger(ENODEV) );
     }
 #endif
 
 #ifdef ENOTDIR
     if (sym == @symbol(ENOTDIR)) {
-	RETURN ( __mkSmallInteger(ENOTDIR) );
+        RETURN ( __mkSmallInteger(ENOTDIR) );
     }
 #endif
 
 #ifdef EISDIR
     if (sym == @symbol(EISDIR)) {
-	RETURN ( __mkSmallInteger(EISDIR) );
+        RETURN ( __mkSmallInteger(EISDIR) );
     }
 #endif
 
 #ifdef EINVAL
     if (sym == @symbol(EINVAL)) {
-	RETURN ( __mkSmallInteger(EINVAL) );
+        RETURN ( __mkSmallInteger(EINVAL) );
     }
 #endif
 
 #ifdef ENFILE
     if (sym == @symbol(ENFILE)) {
-	RETURN ( __mkSmallInteger(ENFILE) );
+        RETURN ( __mkSmallInteger(ENFILE) );
     }
 #endif
 
 #ifdef EMFILE
     if (sym == @symbol(EMFILE)) {
-	RETURN ( __mkSmallInteger(EMFILE) );
+        RETURN ( __mkSmallInteger(EMFILE) );
     }
 #endif
 
 #ifdef ENOTTY
     if (sym == @symbol(ENOTTY)) {
-	RETURN ( __mkSmallInteger(ENOTTY) );
+        RETURN ( __mkSmallInteger(ENOTTY) );
     }
 #endif
 
 #ifdef EFBIG
     if (sym == @symbol(EFBIG)) {
-	RETURN ( __mkSmallInteger(EFBIG) );
+        RETURN ( __mkSmallInteger(EFBIG) );
     }
 #endif
 
 #ifdef ENOSPC
     if (sym == @symbol(ENOSPC)) {
-	RETURN ( __mkSmallInteger(ENOSPC) );
+        RETURN ( __mkSmallInteger(ENOSPC) );
     }
 #endif
 
 #ifdef ESPIPE
     if (sym == @symbol(ESPIPE)) {
-	RETURN ( __mkSmallInteger(ESPIPE) );
+        RETURN ( __mkSmallInteger(ESPIPE) );
     }
 #endif
 
 #ifdef EROFS
     if (sym == @symbol(EROFS)) {
-	RETURN ( __mkSmallInteger(EROFS) );
+        RETURN ( __mkSmallInteger(EROFS) );
     }
 #endif
 
 #ifdef EMLINK
     if (sym == @symbol(EMLINK)) {
-	RETURN ( __mkSmallInteger(EMLINK) );
+        RETURN ( __mkSmallInteger(EMLINK) );
     }
 #endif
 
 #ifdef EPIPE
     if (sym == @symbol(EPIPE)) {
-	RETURN ( __mkSmallInteger(EPIPE) );
+        RETURN ( __mkSmallInteger(EPIPE) );
     }
 #endif
 
 #ifdef EDOM
     if (sym == @symbol(EDOM)) {
-	RETURN ( __mkSmallInteger(EDOM) );
+        RETURN ( __mkSmallInteger(EDOM) );
     }
 #endif
 
 #ifdef ERANGE
     if (sym == @symbol(ERANGE)) {
-	RETURN ( __mkSmallInteger(ERANGE) );
+        RETURN ( __mkSmallInteger(ERANGE) );
     }
 #endif
 
 #ifdef EDEADLK
     if (sym == @symbol(EDEADLK)) {
-	RETURN ( __mkSmallInteger(EDEADLK) );
+        RETURN ( __mkSmallInteger(EDEADLK) );
     }
 #endif
 
 #ifdef ENAMETOOLONG
     if (sym == @symbol(ENAMETOOLONG)) {
-	RETURN ( __mkSmallInteger(ENAMETOOLONG) );
+        RETURN ( __mkSmallInteger(ENAMETOOLONG) );
     }
 #endif
 
 #ifdef ENOLCK
     if (sym == @symbol(ENOLCK)) {
-	RETURN ( __mkSmallInteger(ENOLCK) );
+        RETURN ( __mkSmallInteger(ENOLCK) );
     }
 #endif
 
 #ifdef ENOSYS
     if (sym == @symbol(ENOSYS)) {
-	RETURN ( __mkSmallInteger(ENOSYS) );
+        RETURN ( __mkSmallInteger(ENOSYS) );
     }
 #endif
 
 #ifdef ENOTEMPTY
     if (sym == @symbol(ENOTEMPTY)) {
-	RETURN ( __mkSmallInteger(ENOTEMPTY) );
+        RETURN ( __mkSmallInteger(ENOTEMPTY) );
     }
 #endif
 
 #ifdef EEXIST
     if (sym == @symbol(EEXIST)) {
-	RETURN ( __mkSmallInteger(EEXIST) );
+        RETURN ( __mkSmallInteger(EEXIST) );
     }
 #endif
 
 #ifdef EILSEQ
     if (sym == @symbol(EILSEQ)) {
-	RETURN ( __mkSmallInteger(EILSEQ) );
+        RETURN ( __mkSmallInteger(EILSEQ) );
     }
 #endif
 
@@ -3093,13 +3111,13 @@
      */
 #ifdef ENOTBLK
     if (sym == @symbol(ENOTBLK)) {
-	RETURN ( __mkSmallInteger(ENOTBLK) );
+        RETURN ( __mkSmallInteger(ENOTBLK) );
     }
 #endif
 
 #ifdef ETXTBSY
     if (sym == @symbol(ETXTBSY)) {
-	RETURN ( __mkSmallInteger(ETXTBSY) );
+        RETURN ( __mkSmallInteger(ETXTBSY) );
     }
 #endif
 
@@ -3108,19 +3126,19 @@
      */
 #ifdef EWOULDBLOCK
     if (sym == @symbol(EWOULDBLOCK)) {
-	RETURN ( __mkSmallInteger(EWOULDBLOCK) );
+        RETURN ( __mkSmallInteger(EWOULDBLOCK) );
     }
 #endif
 
 #ifdef ENOMSG
     if (sym == @symbol(ENOMSG)) {
-	RETURN ( __mkSmallInteger(ENOMSG) );
+        RETURN ( __mkSmallInteger(ENOMSG) );
     }
 #endif
 
 #ifdef ELOOP
     if (sym == @symbol(ELOOP)) {
-	RETURN ( __mkSmallInteger(ELOOP) );
+        RETURN ( __mkSmallInteger(ELOOP) );
     }
 #endif
 
@@ -3129,31 +3147,31 @@
      */
 #ifdef ETIME
     if (sym == @symbol(ETIME)) {
-	RETURN ( __mkSmallInteger(ETIME) );
+        RETURN ( __mkSmallInteger(ETIME) );
     }
 #endif
 
 #ifdef ENOSR
     if (sym == @symbol(ENOSR)) {
-	RETURN ( __mkSmallInteger(ENOSR) );
+        RETURN ( __mkSmallInteger(ENOSR) );
     }
 #endif
 
 #ifdef ENOSTR
     if (sym == @symbol(ENOSTR)) {
-	RETURN ( __mkSmallInteger(ENOSTR) );
+        RETURN ( __mkSmallInteger(ENOSTR) );
     }
 #endif
 
 #ifdef ECOMM
     if (sym == @symbol(ECOMM)) {
-	RETURN ( __mkSmallInteger(ECOMM) );
+        RETURN ( __mkSmallInteger(ECOMM) );
     }
 #endif
 
 #ifdef EPROTO
     if (sym == @symbol(EPROTO)) {
-	RETURN ( __mkSmallInteger(EPROTO) );
+        RETURN ( __mkSmallInteger(EPROTO) );
     }
 #endif
 
@@ -3162,13 +3180,13 @@
      */
 #ifdef ESTALE
     if (sym == @symbol(ESTALE)) {
-	RETURN ( __mkSmallInteger(ESTALE) );
+        RETURN ( __mkSmallInteger(ESTALE) );
     }
 #endif
 
 #ifdef EREMOTE
     if (sym == @symbol(EREMOTE)) {
-	RETURN ( __mkSmallInteger(EREMOTE) );
+        RETURN ( __mkSmallInteger(EREMOTE) );
     }
 #endif
 
@@ -3177,157 +3195,162 @@
      */
 #ifdef EINPROGRESS
     if (sym == @symbol(EINPROGRESS)) {
-	RETURN ( __mkSmallInteger(EINPROGRESS) );
+        RETURN ( __mkSmallInteger(EINPROGRESS) );
     }
 #endif
 
 #ifdef EALREADY
     if (sym == @symbol(EALREADY)) {
-	RETURN ( __mkSmallInteger(EALREADY) );
+        RETURN ( __mkSmallInteger(EALREADY) );
     }
 #endif
 
 #ifdef ENOTSOCK
     if (sym == @symbol(ENOTSOCK)) {
-	RETURN ( __mkSmallInteger(ENOTSOCK) );
+        RETURN ( __mkSmallInteger(ENOTSOCK) );
     }
 #endif
 
 #ifdef EDESTADDRREQ
     if (sym == @symbol(EDESTADDRREQ)) {
-	RETURN ( __mkSmallInteger(EDESTADDRREQ) );
+        RETURN ( __mkSmallInteger(EDESTADDRREQ) );
     }
 #endif
 
 #ifdef EMSGSIZE
     if (sym == @symbol(EMSGSIZE)) {
-	RETURN ( __mkSmallInteger(EMSGSIZE) );
+        RETURN ( __mkSmallInteger(EMSGSIZE) );
     }
 #endif
 
 #ifdef EPROTOTYPE
     if (sym == @symbol(EPROTOTYPE)) {
-	RETURN ( __mkSmallInteger(EPROTOTYPE) );
+        RETURN ( __mkSmallInteger(EPROTOTYPE) );
     }
 #endif
 
 #ifdef ENOPROTOOPT
     if (sym == @symbol(ENOPROTOOPT)) {
-	RETURN ( __mkSmallInteger(ENOPROTOOPT) );
+        RETURN ( __mkSmallInteger(ENOPROTOOPT) );
     }
 #endif
 
 #ifdef EPROTONOSUPPORT
     if (sym == @symbol(EPROTONOSUPPORT)) {
-	RETURN ( __mkSmallInteger(EPROTONOSUPPORT) );
+        RETURN ( __mkSmallInteger(EPROTONOSUPPORT) );
     }
 #endif
 
 #ifdef ESOCKTNOSUPPORT
     if (sym == @symbol(ESOCKTNOSUPPORT)) {
-	RETURN ( __mkSmallInteger(ESOCKTNOSUPPORT) );
+        RETURN ( __mkSmallInteger(ESOCKTNOSUPPORT) );
     }
 #endif
 
 #ifdef EOPNOTSUPP
     if (sym == @symbol(EOPNOTSUPP)) {
-	RETURN ( __mkSmallInteger(EOPNOTSUPP) );
+        RETURN ( __mkSmallInteger(EOPNOTSUPP) );
     }
 #endif
 
 #ifdef EPFNOSUPPORT
     if (sym == @symbol(EPFNOSUPPORT)) {
-	RETURN ( __mkSmallInteger(EPFNOSUPPORT) );
+        RETURN ( __mkSmallInteger(EPFNOSUPPORT) );
     }
 #endif
 
 #ifdef EAFNOSUPPORT
     if (sym == @symbol(EAFNOSUPPORT)) {
-	RETURN ( __mkSmallInteger(EAFNOSUPPORT) );
+        RETURN ( __mkSmallInteger(EAFNOSUPPORT) );
     }
 #endif
 
 #ifdef EADDRINUSE
     if (sym == @symbol(EADDRINUSE)) {
-	RETURN ( __mkSmallInteger(EADDRINUSE) );
+        RETURN ( __mkSmallInteger(EADDRINUSE) );
     }
 #endif
 
 #ifdef EADDRNOTAVAIL
     if (sym == @symbol(EADDRNOTAVAIL)) {
-	RETURN ( __mkSmallInteger(EADDRNOTAVAIL) );
+        RETURN ( __mkSmallInteger(EADDRNOTAVAIL) );
     }
 #endif
 
 #ifdef ETIMEDOUT
     if (sym == @symbol(ETIMEDOUT)) {
-	RETURN ( __mkSmallInteger(ETIMEDOUT) );
+        RETURN ( __mkSmallInteger(ETIMEDOUT) );
+    }
+#endif
+#ifdef WSAETIMEDOUT
+    if (sym == @symbol(ETIMEDOUT)) {
+        RETURN ( __mkSmallInteger(WSAETIMEDOUT) );
     }
 #endif
 
 #ifdef ECONNREFUSED
     if (sym == @symbol(ECONNREFUSED)) {
-	RETURN ( __mkSmallInteger(ECONNREFUSED) );
+        RETURN ( __mkSmallInteger(ECONNREFUSED) );
     }
 #endif
 
 #ifdef ENETDOWN
     if (sym == @symbol(ENETDOWN)) {
-	RETURN ( __mkSmallInteger(ENETDOWN) );
+        RETURN ( __mkSmallInteger(ENETDOWN) );
     }
 #endif
 
 #ifdef ENETUNREACH
     if (sym == @symbol(ENETUNREACH)) {
-	RETURN ( __mkSmallInteger(ENETUNREACH) );
+        RETURN ( __mkSmallInteger(ENETUNREACH) );
     }
 #endif
 
 #ifdef ENETRESET
     if (sym == @symbol(ENETRESET)) {
-	RETURN ( __mkSmallInteger(ENETRESET) );
+        RETURN ( __mkSmallInteger(ENETRESET) );
     }
 #endif
 
 #ifdef ECONNABORTED
     if (sym == @symbol(ECONNABORTED)) {
-	RETURN ( __mkSmallInteger(ECONNABORTED) );
+        RETURN ( __mkSmallInteger(ECONNABORTED) );
     }
 #endif
 
 #ifdef ECONNRESET
     if (sym == @symbol(ECONNRESET)) {
-	RETURN ( __mkSmallInteger(ECONNRESET) );
+        RETURN ( __mkSmallInteger(ECONNRESET) );
     }
 #endif
 
 #ifdef EISCONN
     if (sym == @symbol(EISCONN)) {
-	RETURN ( __mkSmallInteger(EISCONN) );
+        RETURN ( __mkSmallInteger(EISCONN) );
     }
 #endif
 
 #ifdef ENOTCONN
     if (sym == @symbol(ENOTCONN)) {
-	RETURN ( __mkSmallInteger(ENOTCONN) );
+        RETURN ( __mkSmallInteger(ENOTCONN) );
     }
 #endif
 
 #ifdef ESHUTDOWN
     if (sym == @symbol(ESHUTDOWN)) {
-	RETURN ( __mkSmallInteger(ESHUTDOWN) );
+        RETURN ( __mkSmallInteger(ESHUTDOWN) );
     }
 #endif
 
 #ifdef EHOSTDOWN
     if (sym == @symbol(EHOSTDOWN)) {
-	RETURN ( __mkSmallInteger(EHOSTDOWN) );
+        RETURN ( __mkSmallInteger(EHOSTDOWN) );
     }
 #endif
 
 #ifdef EHOSTUNREACH
     if (sym == @symbol(EHOSTUNREACH)) {
-	RETURN ( __mkSmallInteger(EHOSTUNREACH) );
+        RETURN ( __mkSmallInteger(EHOSTUNREACH) );
     }
 #endif
     /*
@@ -3335,92 +3358,92 @@
      */
 #ifdef WSAEINTR
     if (sym == @symbol(WSAEINTR)) {
-	RETURN ( __mkSmallInteger(WSAEINTR) );
+        RETURN ( __mkSmallInteger(WSAEINTR) );
     }
 #endif
 #ifdef WSAEBADF
     if (sym == @symbol(WSAEBADF)) {
-	RETURN ( __mkSmallInteger(WSAEBADF) );
+        RETURN ( __mkSmallInteger(WSAEBADF) );
     }
 #endif
 #ifdef WSAEACCESS
     if (sym == @symbol(WSAEACCESS)) {
-	RETURN ( __mkSmallInteger(WSAEACCESS) );
+        RETURN ( __mkSmallInteger(WSAEACCESS) );
     }
 #endif
 #ifdef WSAEFAULT
     if (sym == @symbol(WSAEFAULT)) {
-	RETURN ( __mkSmallInteger(WSAEFAULT) );
+        RETURN ( __mkSmallInteger(WSAEFAULT) );
     }
 #endif
 #ifdef WSAEINVAL
     if (sym == @symbol(WSAEINVAL)) {
-	RETURN ( __mkSmallInteger(WSAEINVAL) );
+        RETURN ( __mkSmallInteger(WSAEINVAL) );
     }
 #endif
 #ifdef WSAEMFILE
     if (sym == @symbol(WSAEMFILE)) {
-	RETURN ( __mkSmallInteger(WSAEMFILE) );
+        RETURN ( __mkSmallInteger(WSAEMFILE) );
     }
 #endif
 #ifdef WSAEWOULDBLOCK
     if (sym == @symbol(WSAEWOULDBLOCK)) {
-	RETURN ( __mkSmallInteger(WSAEWOULDBLOCK) );
+        RETURN ( __mkSmallInteger(WSAEWOULDBLOCK) );
     }
 #endif
 #ifdef WSAEINPROGRESS
     if (sym == @symbol(WSAEINPROGRESS)) {
-	RETURN ( __mkSmallInteger(WSAEINPROGRESS) );
+        RETURN ( __mkSmallInteger(WSAEINPROGRESS) );
     }
 #endif
 #ifdef WSAEALREADY
     if (sym == @symbol(WSAEALREADY)) {
-	RETURN ( __mkSmallInteger(WSAEALREADY) );
+        RETURN ( __mkSmallInteger(WSAEALREADY) );
     }
 #endif
 #ifdef WSAENOTSOCK
     if (sym == @symbol(WSAENOTSOCK)) {
-	RETURN ( __mkSmallInteger(WSAENOTSOCK) );
+        RETURN ( __mkSmallInteger(WSAENOTSOCK) );
     }
 #endif
 #ifdef WSAEPROTONOSUPPORT
     if (sym == @symbol(WSAEPROTONOSUPPORT)) {
-	RETURN ( __mkSmallInteger(WSAEPROTONOSUPPORT) );
+        RETURN ( __mkSmallInteger(WSAEPROTONOSUPPORT) );
     }
 #endif
 #ifdef WSAESOCKTNOSUPPORT
     if (sym == @symbol(WSAESOCKTNOSUPPORT)) {
-	RETURN ( __mkSmallInteger(WSAESOCKTNOSUPPORT) );
+        RETURN ( __mkSmallInteger(WSAESOCKTNOSUPPORT) );
     }
 #endif
 #ifdef E_NOINTERFACE
     if (sym == @symbol(E_NOINTERFACE)) {
-	RETURN ( __MKUINT(E_NOINTERFACE) );
+        RETURN ( __MKUINT(E_NOINTERFACE) );
     }
 #endif
 #ifdef CO_E_NOTINITIALIZED
     if (sym == @symbol(CO_E_NOTINITIALIZED)) {
-	RETURN ( __MKUINT(CO_E_NOTINITIALIZED) );
+        RETURN ( __MKUINT(CO_E_NOTINITIALIZED) );
     }
 #endif
 #ifdef REGDB_E_CLASSNOTREG
     if (sym == @symbol(REGDB_E_CLASSNOTREG)) {
-	RETURN ( __MKUINT(REGDB_E_CLASSNOTREG) );
+        RETURN ( __MKUINT(REGDB_E_CLASSNOTREG) );
     }
 #endif
 #ifdef CLASS_E_NOAGGREGATION
     if (sym == @symbol(CLASS_E_NOAGGREGATION)) {
-	RETURN ( __MKUINT(CLASS_E_NOAGGREGATION) );
+        RETURN ( __MKUINT(CLASS_E_NOAGGREGATION) );
     }
 #endif
 #ifdef DISP_E_UNKNOWNNAME
     if (sym == @symbol(DISP_E_UNKNOWNNAME)) {
-	RETURN ( __MKUINT(DISP_E_UNKNOWNNAME) );
+        RETURN ( __MKUINT(DISP_E_UNKNOWNNAME) );
     }
 #endif
 #ifdef OLEOBJ_E_NOVERBS
     if (sym == @symbol(OLEOBJ_E_NOVERBS)) {
-	RETURN ( __MKUINT(OLEOBJ_E_NOVERBS) );
+        RETURN ( __MKUINT(OLEOBJ_E_NOVERBS) );
     }
 #endif
 
@@ -11460,190 +11483,207 @@
     int *pcntR = &cntR, *pcntW = &cntW, *pcntE = &cntE;
     fd_set readFds;
     fd_set writeFds;
+    fd_set exceptFds;
     int hasSockets;
     int hasPipes;
     int pass = 1;       // perform up to 2 passes
 
     if (readableResultFdArray != nil) {
-	if (! __isArrayLike(readableResultFdArray)) {
-	    goto fail;
-	}
-	resultSizeReadable = __arraySize(readableResultFdArray);
+        if (! __isArrayLike(readableResultFdArray)) {
+            goto fail;
+        }
+        resultSizeReadable = __arraySize(readableResultFdArray);
     }
     if (writableResultFdArray != nil) {
-	if (! __isArrayLike(writableResultFdArray)) {
-	    goto fail;
-	}
-	resultSizeWritable = __arraySize(writableResultFdArray);
-	if (readableResultFdArray == writableResultFdArray) {
-	    // allow common result set for read/write/except
-	    pcntW = &cntR;
-	}
+        if (! __isArrayLike(writableResultFdArray)) {
+            goto fail;
+        }
+        resultSizeWritable = __arraySize(writableResultFdArray);
+        if (readableResultFdArray == writableResultFdArray) {
+            // allow common result set for read/write/except
+            pcntW = &cntR;
+        }
     }
     if (exceptionResultFdArray != nil) {
-	if (! __isArrayLike(exceptionResultFdArray)) {
-	    goto fail;
-	}
-	resultSizeException = __arraySize(exceptionResultFdArray);
-	if (exceptionResultFdArray == readableResultFdArray) {
-	    // allow common result set for read/write/except
-	    pcntE = &cntR;
-	} else if (exceptionResultFdArray == writableResultFdArray) {
-	    pcntE = &cntW;
-	}
+        if (! __isArrayLike(exceptionResultFdArray)) {
+            goto fail;
+        }
+        resultSizeException = __arraySize(exceptionResultFdArray);
+        if (exceptionResultFdArray == readableResultFdArray) {
+            // allow common result set for read/write/except
+            pcntE = &cntR;
+        } else if (exceptionResultFdArray == writableResultFdArray) {
+            pcntE = &cntW;
+        }
     }
 
     if (__isNonNilObject(readFdArray)) {
-	if (! __isArrayLike(readFdArray)) goto fail;
-	readCount = __arraySize(readFdArray);
+        if (! __isArrayLike(readFdArray)) goto fail;
+        readCount = __arraySize(readFdArray);
     } else {
-	readCount = 0;
+        readCount = 0;
     }
 
     if (__isNonNilObject(writeFdArray)) {
-	if (! __isArrayLike(writeFdArray)) goto fail;
-	writeCount = __arraySize(writeFdArray);
+        if (! __isArrayLike(writeFdArray)) goto fail;
+        writeCount = __arraySize(writeFdArray);
     } else {
-	writeCount = 0;
+        writeCount = 0;
     }
 
     if (__isNonNilObject(exceptFdArray)) {
-	if (! __isArrayLike(exceptFdArray)) goto fail;
-	exceptCount = __arraySize(exceptFdArray);
+        if (! __isArrayLike(exceptFdArray)) goto fail;
+        exceptCount = __arraySize(exceptFdArray);
     } else {
-	exceptCount = 0;
+        exceptCount = 0;
     }
 
 pollAgain:
     FD_ZERO(&readFds);
     FD_ZERO(&writeFds);
+    FD_ZERO(&exceptFds);
     numHandles = hasSockets = hasPipes = 0;
 
     for (i = 0; (i < readCount) && (numHandles < MAXHANDLE); i++) {
-	OBJ fd = __arrayVal(readFdArray)[i];
-
-	if (fd != nil) {
-	    if (__Class(fd) == @global(Win32SocketHandle)) {
-		FD_SET (_HANDLEVal(fd), &readFds);
-		hasSockets++;
-	    } else if (__isSmallInteger(fd)) {
-		DWORD canRead;
-		if (PeekNamedPipe(_get_osfhandle(__intVal(fd)), 0, 0, 0, &canRead, 0)) {
-		    if (canRead > 0) {
-			if (*pcntR < resultSizeReadable) {
-			    __arrayVal(readableResultFdArray)[*pcntR] = fd;
-			}
-			(*pcntR)++; cntAll++;
-		    }
-		} else {
-		    @global(LastErrorNumber) = __mkSmallInteger(EBADF);
-		    RETURN (__mkSmallInteger(-1));
-		}
-		hasPipes++;
-	    } else {
-		hArray  [numHandles] = _HANDLEVal(fd);
-		retArray[numHandles] = i;
-		++numHandles;
-	    }
-	}
+        OBJ fd = __arrayVal(readFdArray)[i];
+
+        if (fd != nil) {
+            if (__Class(fd) == @global(Win32SocketHandle)) {
+                FD_SET (_HANDLEVal(fd), &readFds);
+                hasSockets++;
+            } else if (__isSmallInteger(fd)) {
+                DWORD canRead;
+                if (PeekNamedPipe(_get_osfhandle(__intVal(fd)), 0, 0, 0, &canRead, 0)) {
+                    if (canRead > 0) {
+                        if (*pcntR < resultSizeReadable) {
+                            __arrayVal(readableResultFdArray)[*pcntR] = fd;
+                        }
+                        (*pcntR)++; cntAll++;
+                    }
+                } else {
+                    @global(LastErrorNumber) = __mkSmallInteger(EBADF);
+                    RETURN (__mkSmallInteger(-1));
+                }
+                hasPipes++;
+            } else {
+                hArray  [numHandles] = _HANDLEVal(fd);
+                retArray[numHandles] = i;
+                ++numHandles;
+            }
+        }
     }
 
     for (i = 0; (i < writeCount) && (numHandles < MAXHANDLE); i++) {
-	OBJ fd = __arrayVal(writeFdArray)[i];
-
-	if (fd != nil) {
-	    if (__Class(fd) == @global(Win32SocketHandle)) {
-		FD_SET (_HANDLEVal(fd), &writeFds);
-		hasSockets++;
-	    } else if (__isSmallInteger(fd)) {
-		// kludge: assume that pipes can alway be written
-	       if (*pcntW < resultSizeWritable) {
-		    __arrayVal(writableResultFdArray)[*pcntW] = fd;
-		}
-		(*pcntW)++; cntAll++;
-		// there is no pipe to check
-	    } else {
-		hArray  [numHandles] = _HANDLEVal(fd);
-		retArray[numHandles] = i + 10000;
-		++numHandles;
-	    }
-	}
+        OBJ fd = __arrayVal(writeFdArray)[i];
+
+        if (fd != nil) {
+            if (__Class(fd) == @global(Win32SocketHandle)) {
+                FD_SET (_HANDLEVal(fd), &writeFds);
+                hasSockets++;
+            } else if (__isSmallInteger(fd)) {
+                // kludge: assume that pipes can alway be written
+               if (*pcntW < resultSizeWritable) {
+                    __arrayVal(writableResultFdArray)[*pcntW] = fd;
+                }
+                (*pcntW)++; cntAll++;
+                // there is no pipe to check
+            } else {
+                hArray  [numHandles] = _HANDLEVal(fd);
+                retArray[numHandles] = i + 10000;
+                ++numHandles;
+            }
+        }
     }
 
     for (i = 0; (i < exceptCount) && (numHandles < MAXHANDLE); i++) {
-	OBJ fd = __arrayVal(exceptFdArray)[i];
-
-	if (fd != nil) {
-	    if (__isExternalAddressLike(fd)) {
-		hArray  [numHandles] = _HANDLEVal(fd);
-		retArray[numHandles] = i + 20000;
-		++numHandles;
-	    }
-	}
+        OBJ fdOrPid = __arrayVal(exceptFdArray)[i];
+
+        if (fdOrPid != nil) {
+            if (__Class(fdOrPid) == @global(Win32SocketHandle)) {
+                FD_SET (_HANDLEVal(fdOrPid), &exceptFds);
+                hasSockets++;
+            } else if (__isExternalAddressLike(fdOrPid)) {
+                // a PID
+                hArray  [numHandles] = _HANDLEVal(fdOrPid);
+                retArray[numHandles] = i + 20000;
+                ++numHandles;
+            }
+        }
     }
 
     if (hasSockets) {
-	struct timeval tv = {0, 0};
-	int nReady;
+        struct timeval tv = {0, 0};
+        int nReady;
 
 #ifdef SELECT3DEBUGWIN32
-	console_printf("select hasSockets = %d\n", hasSockets);
-#endif
-	nReady = select(1 , &readFds, &writeFds, NULL, &tv);  // first parameter to select is ignored in windows
-	if (nReady < 0) {
+        console_printf("select hasSockets = %d\n", hasSockets);
+#endif
+        nReady = select(1 , &readFds, &writeFds, &exceptFds, &tv);  // first parameter to select is ignored in windows
+        if (nReady < 0) {
 #ifdef SELECTDEBUGWIN32
-	    console_printf("error in select %d %d\n", nReady, GetLastError());
-#endif
-	    @global(LastErrorNumber) = __mkSmallInteger(EBADF);
-	    RETURN (__mkSmallInteger(-1));
-	}
-	if (nReady > 0) {
+            console_printf("error in select %d %d\n", nReady, GetLastError());
+#endif
+            @global(LastErrorNumber) = __mkSmallInteger(EBADF);
+            RETURN (__mkSmallInteger(-1));
+        }
+        if (nReady > 0) {
 #ifdef SELECT3DEBUGWIN32
-	    console_printf("select nReady %d of %d\n", nReady, hasSockets);
-#endif
-	    for (i = 0; i < readCount; i++) {
-		OBJ fd = __arrayVal(readFdArray)[i];
-		if ((__Class(fd) == @global(Win32SocketHandle)) && FD_ISSET(_HANDLEVal(fd), &readFds)) {
-		    if (*pcntR < resultSizeReadable) {
-			__arrayVal(readableResultFdArray)[*pcntR] = fd;
-			__STORE(readableResultFdArray, fd);
-		    }
-		    (*pcntR)++; cntAll++;
-		}
-	    }
-	    for (i = 0; i < writeCount; i++) {
-		OBJ fd = __arrayVal(writeFdArray)[i];
-		if ((__Class(fd) == @global(Win32SocketHandle)) && FD_ISSET(_HANDLEVal(fd), &writeFds)) {
-		    if (*pcntW < resultSizeWritable) {
-			__arrayVal(writableResultFdArray)[*pcntW] = fd;
-			__STORE(writableResultFdArray, fd);
-		    }
-		    (*pcntW)++; cntAll++;
-		}
-	    }
-	}
+            console_printf("select nReady %d of %d\n", nReady, hasSockets);
+#endif
+            for (i = 0; i < readCount; i++) {
+                OBJ fd = __arrayVal(readFdArray)[i];
+                if ((__Class(fd) == @global(Win32SocketHandle)) && FD_ISSET(_HANDLEVal(fd), &readFds)) {
+                    if (*pcntR < resultSizeReadable) {
+                        __arrayVal(readableResultFdArray)[*pcntR] = fd;
+                        __STORE(readableResultFdArray, fd);
+                    }
+                    (*pcntR)++; cntAll++;
+                }
+            }
+            for (i = 0; i < writeCount; i++) {
+                OBJ fd = __arrayVal(writeFdArray)[i];
+                if ((__Class(fd) == @global(Win32SocketHandle)) && FD_ISSET(_HANDLEVal(fd), &writeFds)) {
+                    if (*pcntW < resultSizeWritable) {
+                        __arrayVal(writableResultFdArray)[*pcntW] = fd;
+                        __STORE(writableResultFdArray, fd);
+                    }
+                    (*pcntW)++; cntAll++;
+                }
+            }
+            for (i = 0; i < exceptCount; i++) {
+                OBJ fd = __arrayVal(exceptFdArray)[i];
+                if ((__Class(fd) == @global(Win32SocketHandle)) && FD_ISSET(_HANDLEVal(fd), &exceptFds)) {
+                    if (*pcntE < resultSizeException) {
+                        __arrayVal(exceptionResultFdArray)[*pcntE] = fd;
+                        __STORE(exceptionResultFdArray, fd);
+                    }
+                    (*pcntE)++; cntAll++;
+                }
+            }
+
+        }
     }
     if (pass > 1)       // perform maximum 2 passes
-	goto done;
+        goto done;
 
     if (cntAll) {
-	// check for other handles and return immediately, no timeout
-	t = 0;
+        // check for other handles and return immediately, no timeout
+        t = 0;
     } else {
-	if (__isSmallInteger(millis)) {
-	    t = __intVal(millis);
-
-	    if (t <= 0 && numHandles == 0) {
-		RETURN (__mkSmallInteger(0));
-	    }
-	} else {
-	    t = INFINITE;
-	}
+        if (__isSmallInteger(millis)) {
+            t = __intVal(millis);
+
+            if (t <= 0 && numHandles == 0) {
+                RETURN (__mkSmallInteger(0));
+            }
+        } else {
+            t = INFINITE;
+        }
     }
 
     if (numHandles == 0 && t == 0) {
-	// nothing to do and no wait
-	goto done;
+        // nothing to do and no wait
+        goto done;
     }
 
 #ifdef SELECT3DEBUGWIN32
@@ -11654,105 +11694,105 @@
 
     if (res == WAIT_TIMEOUT) {
 #ifdef SELECT3DEBUGWIN32
-	console_printf("- timeOut; ret nil\n" );
-#endif
-	if (t != 0 && (hasSockets || hasPipes)) {
-	    // if not a single handle is ready, poll sockets an pipes again
-	    pass = 2;
-	    goto pollAgain;
-	}
-	goto done;
+        console_printf("- timeOut; ret nil\n" );
+#endif
+        if (t != 0 && (hasSockets || hasPipes)) {
+            // if not a single handle is ready, poll sockets an pipes again
+            pass = 2;
+            goto pollAgain;
+        }
+        goto done;
     }
 
     if (res == WAIT_FAILED) {
 #ifdef SELECT2DEBUGWIN32
-	console_printf("- error %d (last %d); ret -1\n", __threadErrno, GetLastError());
-#endif
-	if (__threadErrno == EINTR) {
-	    @global(LastErrorNumber) = nil;
-	    RETURN (__mkSmallInteger(0));
-	} else {
-	    if (@global(InfoPrinting) == true) {
+        console_printf("- error %d (last %d); ret -1\n", __threadErrno, GetLastError());
+#endif
+        if (__threadErrno == EINTR) {
+            @global(LastErrorNumber) = nil;
+            RETURN (__mkSmallInteger(0));
+        } else {
+            if (@global(InfoPrinting) == true) {
 //                console_fprintf(stderr, "Win32OS [info]: select errno = %d (last %d)\n", __threadErrno, GetLastError());
-		console_printf("Win32OS [info]: select errno = %d (last %d)\n", __threadErrno, GetLastError());
-	    }
-	    @global(LastErrorNumber) = __mkSmallInteger(EBADF);
-	    RETURN (__mkSmallInteger(-1));
-	}
+                console_printf("Win32OS [info]: select errno = %d (last %d)\n", __threadErrno, GetLastError());
+            }
+            @global(LastErrorNumber) = __mkSmallInteger(EBADF);
+            RETURN (__mkSmallInteger(-1));
+        }
     }
 
     if (numHandles) {
-	if (res == numHandles) {
-	    // vmwait() added an IRQ event to the handles, and this one has been triggered
-	    if (1 /* @global(InfoPrinting) == true */) {
-		console_fprintf(stderr, "Win32OS [info]: plugIn event has been handled\n");
-	    }
-	    goto done;
-	}
-	if ((res < 0) || (res >= numHandles)) {
-	    console_printf("- res=%d error1 %d\n", res, GetLastError());
-	    goto done;
-	}
-
-	idx = retArray[res];
-	cntAll++;
+        if (res == numHandles) {
+            // vmwait() added an IRQ event to the handles, and this one has been triggered
+            if (1 /* @global(InfoPrinting) == true */) {
+                console_fprintf(stderr, "Win32OS [info]: plugIn event has been handled\n");
+            }
+            goto done;
+        }
+        if ((res < 0) || (res >= numHandles)) {
+            console_printf("- res=%d error1 %d\n", res, GetLastError());
+            goto done;
+        }
+
+        idx = retArray[res];
+        cntAll++;
 
 #ifdef SELECTDEBUGWIN32
-	console_printf("wait Handles res %d idx %d numHandles %d --- ", res, idx, numHandles);
-#endif
-	if (idx < 10000) {
-	    if (*pcntR < resultSizeReadable) {
-		OBJ temp = __arrayVal(readFdArray)[idx];
-		__arrayVal(readableResultFdArray)[*pcntR] = temp;
-		__STORE(readableResultFdArray, temp);
+        console_printf("wait Handles res %d idx %d numHandles %d --- ", res, idx, numHandles);
+#endif
+        if (idx < 10000) {
+            if (*pcntR < resultSizeReadable) {
+                OBJ temp = __arrayVal(readFdArray)[idx];
+                __arrayVal(readableResultFdArray)[*pcntR] = temp;
+                __STORE(readableResultFdArray, temp);
 #ifdef SELECTDEBUGWIN32
-		console_printf("read ready: %x\n", __externalAddressVal(temp));
-#endif
-		(*pcntR)++;
-	    }
-	} else if (idx < 20000) {
-	    if (*pcntW < resultSizeWritable) {
-		OBJ temp = __arrayVal(writeFdArray)[idx-10000];
-		__arrayVal(writableResultFdArray)[*pcntW] = temp;
-		__STORE(writableResultFdArray, temp);
+                console_printf("read ready: %x\n", __externalAddressVal(temp));
+#endif
+                (*pcntR)++;
+            }
+        } else if (idx < 20000) {
+            if (*pcntW < resultSizeWritable) {
+                OBJ temp = __arrayVal(writeFdArray)[idx-10000];
+                __arrayVal(writableResultFdArray)[*pcntW] = temp;
+                __STORE(writableResultFdArray, temp);
 #ifdef SELECTDEBUGWIN32
-		console_printf("write ready: %x\n", temp);
-#endif
-		(*pcntW)++;
-	    }
-	} else {
-	    if (*pcntE < resultSizeException) {
-		OBJ temp = __arrayVal(exceptFdArray)[idx-20000];
-		__arrayVal(exceptionResultFdArray)[*pcntE] = temp;
-		__STORE(exceptionResultFdArray, temp);
+                console_printf("write ready: %x\n", temp);
+#endif
+                (*pcntW)++;
+            }
+        } else {
+            if (*pcntE < resultSizeException) {
+                OBJ temp = __arrayVal(exceptFdArray)[idx-20000];
+                __arrayVal(exceptionResultFdArray)[*pcntE] = temp;
+                __STORE(exceptionResultFdArray, temp);
 #ifdef SELECTDEBUGWIN32
-		console_printf("except ready: %x\n", temp);
-#endif
-		(*pcntE)++;
-	    }
+                console_printf("except ready: %x\n", temp);
+#endif
+                (*pcntE)++;
+            }
 #ifdef SELECTDEBUGWIN32
-	    else
-		console_printf("cntE: %d, resultSizeException: %d\n", *pcntE, resultSizeException);
-#endif
-	}
+            else
+                console_printf("cntE: %d, resultSizeException: %d\n", *pcntE, resultSizeException);
+#endif
+        }
     }
     if (t != 0 && (hasSockets || hasPipes)) {
-	// back after timeout, maybe some sockets or pipes die wake up
-	// in the meantime?
-	pass = 2;
-	goto pollAgain;
+        // back after timeout, maybe some sockets or pipes did wake up
+        // in the meantime?
+        pass = 2;
+        goto pollAgain;
     }
 
 done:
     /* add a delimiter */
     if (*pcntR < resultSizeReadable) {
-	__arrayVal(readableResultFdArray)[*pcntR] = nil;
+        __arrayVal(readableResultFdArray)[*pcntR] = nil;
     }
     if (*pcntW < resultSizeWritable) {
-	__arrayVal(writableResultFdArray)[*pcntW] = nil;
+        __arrayVal(writableResultFdArray)[*pcntW] = nil;
     }
     if (*pcntE < resultSizeException) {
-	__arrayVal(exceptionResultFdArray)[*pcntE] = nil;
+        __arrayVal(exceptionResultFdArray)[*pcntE] = nil;
     }
 
     @global(LastErrorNumber) = nil;