AbstractOperatingSystem.st
branchjv
changeset 19353 2b04ee017e72
parent 19225 9e8abf62f932
parent 19341 2ab29dd7ec1a
child 19431 3e697e4bcbf5
--- a/AbstractOperatingSystem.st	Fri Mar 11 22:36:14 2016 +0000
+++ b/AbstractOperatingSystem.st	Sat Mar 12 07:23:20 2016 +0000
@@ -909,15 +909,15 @@
 shuffleAllFrom:anInStream to:anOutStream lineWise:lineWise lockWith:aLock
 
     lineWise ifFalse:[
-        ^ anInStream copyToEndInto:anOutStream.
+	^ anInStream copyToEndInto:anOutStream.
     ].
     [anInStream isOpen and:[anInStream atEnd not]] whileTrue:[
-        aLock critical:[
-            self
-                shuffleFrom:anInStream
-                to:anOutStream
-                lineWise:lineWise
-        ]
+	aLock critical:[
+	    self
+		shuffleFrom:anInStream
+		to:anOutStream
+		lineWise:lineWise
+	]
     ]
 !
 
@@ -1339,244 +1339,244 @@
     terminateLock := Semaphore forMutualExclusion.
     ((externalInStream := anInStream) notNil
      and:[externalInStream isExternalStream not]) ifTrue:[
-        pIn := NonPositionableExternalStream makePipe.
-        inStreamToClose := externalInStream := pIn at:1.
-        shuffledInStream := pIn at:2.
-        anInStream isBinary ifTrue:[
-            shuffledInStream binary
-        ].
-        lineWise ifFalse:[
-            shuffledInStream blocking:false.
-        ].
-
-        "/ start a reader process, shuffling data from the given
-        "/ inStream to the pipe (which is connected to the commands input)
-        inputShufflerProcess :=
-            [
-                [
-                    [anInStream atEnd] whileFalse:[
-                        self shuffleFrom:anInStream to:shuffledInStream lineWise:lineWise.
-                        shuffledInStream flush
-                    ]
-                ] ensure:[
-                    shuffledInStream close
-                ]
-            ] newProcess
-                name:'cmd input shuffler';
+	pIn := NonPositionableExternalStream makePipe.
+	inStreamToClose := externalInStream := pIn at:1.
+	shuffledInStream := pIn at:2.
+	anInStream isBinary ifTrue:[
+	    shuffledInStream binary
+	].
+	lineWise ifFalse:[
+	    shuffledInStream blocking:false.
+	].
+
+	"/ start a reader process, shuffling data from the given
+	"/ inStream to the pipe (which is connected to the commands input)
+	inputShufflerProcess :=
+	    [
+		[
+		    [anInStream atEnd] whileFalse:[
+			self shuffleFrom:anInStream to:shuffledInStream lineWise:lineWise.
+			shuffledInStream flush
+		    ]
+		] ensure:[
+		    shuffledInStream close
+		]
+	    ] newProcess
+		name:'cmd input shuffler';
 "/                beSystemProcess;
-                resume.
+		resume.
     ].
     ((externalOutStream := anOutStream) notNil
      and:[externalOutStream isExternalStream not]) ifTrue:[
-        pOut := NonPositionableExternalStream makePipe.
-        shuffledOutStream := (pOut at:1).
-        anOutStream isBinary ifTrue:[
-            shuffledOutStream binary
-        ].
-        outStreamToClose := externalOutStream := pOut at:2.
-        outputShufflerProcess :=
-            [
-                WriteError handle:[:ex |
-                    "/ ignored
-                ] do:[
-                    self shuffleAllFrom:shuffledOutStream to:anOutStream lineWise:lineWise lockWith:terminateLock.
-                ].
-            ] newProcess
-                priority:(Processor userSchedulingPriority "+ 1");
-                name:'cmd output shuffler';
+	pOut := NonPositionableExternalStream makePipe.
+	shuffledOutStream := (pOut at:1).
+	anOutStream isBinary ifTrue:[
+	    shuffledOutStream binary
+	].
+	outStreamToClose := externalOutStream := pOut at:2.
+	outputShufflerProcess :=
+	    [
+		WriteError handle:[:ex |
+		    "/ ignored
+		] do:[
+		    self shuffleAllFrom:shuffledOutStream to:anOutStream lineWise:lineWise lockWith:terminateLock.
+		].
+	    ] newProcess
+		priority:(Processor userSchedulingPriority "+ 1");
+		name:'cmd output shuffler';
 "/                beSystemProcess;
-                resume.
+		resume.
     ].
     (externalErrStream := anErrStream) notNil ifTrue:[
-        anErrStream == anOutStream ifTrue:[
-            externalErrStream := externalOutStream
-        ] ifFalse:[
-            anErrStream isExternalStream ifFalse:[
-                pErr := NonPositionableExternalStream makePipe.
-                shuffledErrStream := (pErr at:1).
-                anErrStream isBinary ifTrue:[
-                    shuffledErrStream binary
-                ].
-                errStreamToClose := externalErrStream := pErr at:2.
-                errorShufflerProcess :=
-                    [
-                        self shuffleAllFrom:shuffledErrStream to:anErrStream lineWise:lineWise lockWith:terminateLock.
-                    ] newProcess
-                        priority:(Processor userSchedulingPriority + 1);
-                        name:'cmd err-output shuffler';
+	anErrStream == anOutStream ifTrue:[
+	    externalErrStream := externalOutStream
+	] ifFalse:[
+	    anErrStream isExternalStream ifFalse:[
+		pErr := NonPositionableExternalStream makePipe.
+		shuffledErrStream := (pErr at:1).
+		anErrStream isBinary ifTrue:[
+		    shuffledErrStream binary
+		].
+		errStreamToClose := externalErrStream := pErr at:2.
+		errorShufflerProcess :=
+		    [
+			self shuffleAllFrom:shuffledErrStream to:anErrStream lineWise:lineWise lockWith:terminateLock.
+		    ] newProcess
+			priority:(Processor userSchedulingPriority + 1);
+			name:'cmd err-output shuffler';
 "/                        beSystemProcess;
-                        resume.
-            ]
-        ]
+			resume.
+	    ]
+	]
     ].
     ((externalAuxStream := anAuxStream) notNil
      and:[externalAuxStream isExternalStream not]) ifTrue:[
-        pAux := NonPositionableExternalStream makePipe.
-        auxStreamToClose := externalAuxStream := pAux at:1.
-        shuffledAuxStream := pAux at:2.
-        shuffledAuxStream blocking:false.
-        anAuxStream isBinary ifTrue:[
-            shuffledAuxStream binary
-        ].
-
-        "/ start a reader process, shuffling data from the given
-        "/ auxStream to the pipe (which is connected to the commands aux)
-        auxShufflerProcess :=
-            [
-                [
-                    [anAuxStream atEnd] whileFalse:[
-                        self shuffleFrom:anAuxStream to:shuffledAuxStream lineWise:false.
-                        shuffledAuxStream flush
-                    ]
-                ] ensure:[
-                    shuffledAuxStream close
-                ]
-            ] newProcess
-                name:'cmd aux shuffler';
+	pAux := NonPositionableExternalStream makePipe.
+	auxStreamToClose := externalAuxStream := pAux at:1.
+	shuffledAuxStream := pAux at:2.
+	shuffledAuxStream blocking:false.
+	anAuxStream isBinary ifTrue:[
+	    shuffledAuxStream binary
+	].
+
+	"/ start a reader process, shuffling data from the given
+	"/ auxStream to the pipe (which is connected to the commands aux)
+	auxShufflerProcess :=
+	    [
+		[
+		    [anAuxStream atEnd] whileFalse:[
+			self shuffleFrom:anAuxStream to:shuffledAuxStream lineWise:false.
+			shuffledAuxStream flush
+		    ]
+		] ensure:[
+		    shuffledAuxStream close
+		]
+	    ] newProcess
+		name:'cmd aux shuffler';
 "/                beSystemProcess;
-                resume.
+		resume.
     ].
 
     stopShufflers := [:shuffleRest |
-            inputShufflerProcess notNil ifTrue:[
-                terminateLock critical:[inputShufflerProcess terminate].
-                inputShufflerProcess waitUntilTerminated
-            ].
-            auxShufflerProcess notNil ifTrue:[
-                terminateLock critical:[auxShufflerProcess terminate].
-                auxShufflerProcess waitUntilTerminated
-            ].
-            outputShufflerProcess notNil ifTrue:[
-                terminateLock critical:[outputShufflerProcess terminate].
-                outputShufflerProcess waitUntilTerminated.
-                shuffleRest ifTrue:[ self shuffleRestFrom:shuffledOutStream to:anOutStream lineWise:lineWise ].
-                shuffledOutStream close.
-            ].
-            errorShufflerProcess notNil ifTrue:[
-                terminateLock critical:[errorShufflerProcess terminate].
-                errorShufflerProcess waitUntilTerminated.
-                shuffleRest ifTrue:[ self shuffleRestFrom:shuffledErrStream to:anErrStream lineWise:lineWise ].
-                shuffledErrStream close.
-            ].
-        ].
+	    inputShufflerProcess notNil ifTrue:[
+		terminateLock critical:[inputShufflerProcess terminate].
+		inputShufflerProcess waitUntilTerminated
+	    ].
+	    auxShufflerProcess notNil ifTrue:[
+		terminateLock critical:[auxShufflerProcess terminate].
+		auxShufflerProcess waitUntilTerminated
+	    ].
+	    outputShufflerProcess notNil ifTrue:[
+		terminateLock critical:[outputShufflerProcess terminate].
+		outputShufflerProcess waitUntilTerminated.
+		shuffleRest ifTrue:[ self shuffleRestFrom:shuffledOutStream to:anOutStream lineWise:lineWise ].
+		shuffledOutStream close.
+	    ].
+	    errorShufflerProcess notNil ifTrue:[
+		terminateLock critical:[errorShufflerProcess terminate].
+		errorShufflerProcess waitUntilTerminated.
+		shuffleRest ifTrue:[ self shuffleRestFrom:shuffledErrStream to:anErrStream lineWise:lineWise ].
+		shuffledErrStream close.
+	    ].
+	].
 
     closeStreams := [
-            inStreamToClose notNil ifTrue:[
-                inStreamToClose close
-            ].
-            errStreamToClose notNil ifTrue:[
-                errStreamToClose close
-            ].
-            outStreamToClose notNil ifTrue:[
-                outStreamToClose close
-            ].
-            auxStreamToClose notNil ifTrue:[
-                auxStreamToClose close
-            ].
-            nullStream notNil ifTrue:[
-                nullStream close
-            ].
-        ].
+	    inStreamToClose notNil ifTrue:[
+		inStreamToClose close
+	    ].
+	    errStreamToClose notNil ifTrue:[
+		errStreamToClose close
+	    ].
+	    outStreamToClose notNil ifTrue:[
+		outStreamToClose close
+	    ].
+	    auxStreamToClose notNil ifTrue:[
+		auxStreamToClose close
+	    ].
+	    nullStream notNil ifTrue:[
+		nullStream close
+	    ].
+	].
 
 
     sema := Semaphore new name:'OS command wait'.
     [
-        externalInStream isNil ifTrue:[
-            externalInStream := nullStream := Filename nullDevice readWriteStream.
-        ].
-        externalOutStream isNil ifTrue:[
-            nullStream isNil ifTrue:[nullStream := Filename nullDevice writeStream].
-            externalOutStream := nullStream.
-        ].
-        externalErrStream isNil ifTrue:[
-            externalErrStream := externalOutStream
-        ].
-
-        pid := Processor
-                    monitor:[
-                        self
-                            startProcess:aCommandStringOrArray
-                            inputFrom:externalInStream
-                            outputTo:externalOutStream
-                            errorTo:externalErrStream
-                            auxFrom:externalAuxStream
-                            environment:environmentDictionary
-                            inDirectory:dirOrNil
-                    ]
-                    action:[:status |
-                        status stillAlive ifFalse:[
-                            exitStatus := status.
-                            sema signal.
-                            self closePid:pid
-                        ]
-                    ].
-
-        pid isNil ifTrue:[
-            exitStatus := self osProcessStatusClass processCreationFailure
-        ] ifFalse:[
-            sema wait.
-        ].
+	externalInStream isNil ifTrue:[
+	    externalInStream := nullStream := Filename nullDevice readWriteStream.
+	].
+	externalOutStream isNil ifTrue:[
+	    nullStream isNil ifTrue:[nullStream := Filename nullDevice writeStream].
+	    externalOutStream := nullStream.
+	].
+	externalErrStream isNil ifTrue:[
+	    externalErrStream := externalOutStream
+	].
+
+	pid := Processor
+		    monitor:[
+			self
+			    startProcess:aCommandStringOrArray
+			    inputFrom:externalInStream
+			    outputTo:externalOutStream
+			    errorTo:externalErrStream
+			    auxFrom:externalAuxStream
+			    environment:environmentDictionary
+			    inDirectory:dirOrNil
+		    ]
+		    action:[:status |
+			status stillAlive ifFalse:[
+			    exitStatus := status.
+			    sema signal.
+			    self closePid:pid
+			]
+		    ].
+
+	pid isNil ifTrue:[
+	    exitStatus := self osProcessStatusClass processCreationFailure
+	] ifFalse:[
+	    sema wait.
+	].
     ] ifCurtailed:[
-        closeStreams value.
-        pid notNil ifTrue:[
-            "/ terminate the os-command (and all of its forked commands)
-            self terminateProcessGroup:pid.
-            self terminateProcess:pid.
-            self closePid:pid.
-        ].
-        stopShufflers value:false.
+	closeStreams value.
+	pid notNil ifTrue:[
+	    "/ terminate the os-command (and all of its forked commands)
+	    self terminateProcessGroup:pid.
+	    self terminateProcess:pid.
+	    self closePid:pid.
+	].
+	stopShufflers value:false.
     ].
 
     closeStreams value.
     stopShufflers value:true.
     (exitStatus isNil or:[exitStatus success]) ifFalse:[
-        ^ aBlock value:exitStatus
+	^ aBlock value:exitStatus
     ].
     ^ true
 
     "
-        |outStream errStream|
-
-        outStream := '' writeStream.
-
-        OperatingSystem executeCommand:'ls -l'
-                        inputFrom:'abc' readStream
-                        outputTo:outStream
-                        errorTo:nil
-                        inDirectory:nil
-                        lineWise:true
-                        onError:[:exitStatus | ^ false].
-        outStream contents
-    "
-
-    "
-        |outStream errStream|
-
-        outStream := #[] writeStream.
-
-        OperatingSystem executeCommand:'cat'
-                        inputFrom:(ByteArray new:5000000) readStream
-                        outputTo:outStream
-                        errorTo:nil
-                        inDirectory:nil
-                        lineWise:false
-                        onError:[:exitStatus | ^ false].
-        outStream size
-    "
-
-    "
-        |outStream errStream|
-
-        outStream := '' writeStream.
-
-        OperatingSystem executeCommand:'gpg -s --batch --no-tty --passphrase-fd 0 /tmp/passwd'
-                        inputFrom:'bla' readStream
-                        outputTo:outStream
-                        errorTo:nil
-                        inDirectory:nil
-                        lineWise:true
-                        onError:[:exitStatus |  false].
-        outStream contents
+	|outStream errStream|
+
+	outStream := '' writeStream.
+
+	OperatingSystem executeCommand:'ls -l'
+			inputFrom:'abc' readStream
+			outputTo:outStream
+			errorTo:nil
+			inDirectory:nil
+			lineWise:true
+			onError:[:exitStatus | ^ false].
+	outStream contents
+    "
+
+    "
+	|outStream errStream|
+
+	outStream := #[] writeStream.
+
+	OperatingSystem executeCommand:'cat'
+			inputFrom:(ByteArray new:5000000) readStream
+			outputTo:outStream
+			errorTo:nil
+			inDirectory:nil
+			lineWise:false
+			onError:[:exitStatus | ^ false].
+	outStream size
+    "
+
+    "
+	|outStream errStream|
+
+	outStream := '' writeStream.
+
+	OperatingSystem executeCommand:'gpg -s --batch --no-tty --passphrase-fd 0 /tmp/passwd'
+			inputFrom:'bla' readStream
+			outputTo:outStream
+			errorTo:nil
+			inDirectory:nil
+			lineWise:true
+			onError:[:exitStatus |  false].
+	outStream contents
     "
 
     "Modified: / 11-02-2007 / 20:54:39 / cg"
@@ -6037,7 +6037,7 @@
     unsigned INT low, high;
 
 #ifdef __x86_64__
-# if defined(__GCC__)
+# if defined(__GCC__) || defined(__CLANG__) || defined(__MINGW64__)
     asm volatile("rdtsc" : "=a"(low), "=d"(high));
     RETURN ( __MKUINT(low + (high << 32)) );
 # endif
@@ -6053,7 +6053,7 @@
     _asm { mov high,edx };
     _asm { pop edx };
 # else
-#  if defined(__MINGW_H) || defined(__GNUC__)
+#  if defined(__MINGW_H) || defined(__MINGW32__) || defined(__GNUC__)
     asm volatile("rdtsc" : "=a"(low), "=d"(high));
 #  else
     goto unsupported;
@@ -6783,18 +6783,18 @@
     |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
+	"/ 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.
+		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.