diff -r 2f3cb5fbd335 -r bd49177015de ExternalStream.st --- a/ExternalStream.st Mon Dec 16 23:02:30 2019 +0100 +++ b/ExternalStream.st Tue Dec 17 00:25:06 2019 +0100 @@ -297,6 +297,7 @@ clearerr(f); \ continue; \ } \ + (ret) = -1; \ } else { \ (ret) = 0; \ } \ @@ -636,6 +637,7 @@ clearerr(f); \ continue; \ } \ + (ret) = -1; \ break; \ } else { \ (ret) = 0; \ @@ -681,6 +683,7 @@ clearerr(f); \ continue; \ } \ + (ret) = -1; \ break; \ } else { \ (ret) = 0; \ @@ -2269,29 +2272,29 @@ OBJ _handle = __INST(handle); if (_handle != nil) { - if ((__INST(handleType) == @symbol(fileHandle)) - || (__INST(handleType) == @symbol(socketHandle))) { - RETURN (_handle); - } - if (__INST(handleType) == @symbol(pipeFilePointer)) { - RETURN (__MKINT(fileno(__FILEVal(_handle)))); - } - if ((__INST(handleType) == nil) - || (__INST(handleType) == @symbol(filePointer)) - || (__INST(handleType) == @symbol(socketFilePointer)) - || (__INST(handleType) == @symbol(pipeFilePointer))) { - FILE *file = __FILEVal(_handle); - if (file != NULL) { - int fileNo = fileno(file); - if (fileNo >= 0) { + if ((__INST(handleType) == @symbol(fileHandle)) + || (__INST(handleType) == @symbol(socketHandle))) { + RETURN (_handle); + } + if (__INST(handleType) == @symbol(pipeFilePointer)) { + RETURN (__MKINT(fileno(__FILEVal(_handle)))); + } + if ((__INST(handleType) == nil) + || (__INST(handleType) == @symbol(filePointer)) + || (__INST(handleType) == @symbol(socketFilePointer)) + || (__INST(handleType) == @symbol(pipeFilePointer))) { + FILE *file = __FILEVal(_handle); + if (file != NULL) { + int fileNo = fileno(file); + if (fileNo >= 0) { #ifdef __win32__ - RETURN(__MKEXTERNALADDRESS(_get_osfhandle(fileNo))); + RETURN(__MKEXTERNALADDRESS(_get_osfhandle(fileNo))); #else - RETURN (__MKINT(fileNo)); + RETURN (__MKINT(fileNo)); #endif - } - } - } + } + } + } } %}. ^ handle @@ -6053,24 +6056,24 @@ In this case, all I/O operations here will be blocking." Smalltalk isInitialized ifFalse:[ - ^ false + ^ false ]. wasBlocked := OperatingSystem blockInterrupts. (OperatingSystem readCheck:fd) ifTrue:[ - hasTimedout := false + hasTimedout := false ] ifFalse:[ - inputSema := Semaphore name:'readWait'. - hasTimedout := [ - Processor signal:inputSema onInput:fd. - (inputSema waitWithTimeoutMs:timeoutOrNil state:#ioWait) isNil. - ] ifCurtailed:[ - Processor disableSemaphore:inputSema. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. - ]. - hasTimedout ifTrue:[ - Processor disableSemaphore:inputSema. - ]. + inputSema := Semaphore name:'readWait'. + hasTimedout := [ + Processor signal:inputSema onInput:fd. + (inputSema waitWithTimeoutMs:timeoutOrNil state:#ioWait) isNil. + ] ifCurtailed:[ + Processor disableSemaphore:inputSema. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. + ]. + hasTimedout ifTrue:[ + Processor disableSemaphore:inputSema. + ]. ]. wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ^ hasTimedout @@ -6164,18 +6167,18 @@ |fd outputSema hasTimedout wasBlocked| handle isNil ifTrue:[ - ^ self errorNotOpen + ^ self errorNotOpen ]. mode == #readonly ifTrue:[ - ^ self errorReadOnly + ^ self errorReadOnly ]. %{ #ifdef __win32__ { - FILEPOINTER f = __FILEVal(__INST(handle)); - if ((f == __win32_stdout()) || (f == __win32_stderr())) { - RETURN(false); - } + FILEPOINTER f = __FILEVal(__INST(handle)); + if ((f == __win32_stdout()) || (f == __win32_stderr())) { + RETURN(false); + } } #endif %}. @@ -6186,19 +6189,19 @@ wasBlocked := OperatingSystem blockInterrupts. "/ check again - now inside lock (OperatingSystem writeCheck:fd) ifTrue:[ - hasTimedout := false. + hasTimedout := false. ] ifFalse:[ - outputSema := Semaphore name:'writeWait'. - hasTimedout := [ - Processor signal:outputSema onOutput:fd. - (outputSema waitWithTimeoutMs:timeoutOrNil state:#ioWait) isNil. - ] ifCurtailed:[ - Processor disableSemaphore:outputSema. - wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. - ]. - hasTimedout ifTrue:[ - Processor disableSemaphore:outputSema. - ]. + outputSema := Semaphore name:'writeWait'. + hasTimedout := [ + Processor signal:outputSema onOutput:fd. + (outputSema waitWithTimeoutMs:timeoutOrNil state:#ioWait) isNil. + ] ifCurtailed:[ + Processor disableSemaphore:outputSema. + wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. + ]. + hasTimedout ifTrue:[ + Processor disableSemaphore:outputSema. + ]. ]. wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. ^ hasTimedout