OSProcess.st
author Stefan Vogel <sv@exept.de>
Tue, 21 Feb 2017 18:54:49 +0100
changeset 21512 a78759923d34
parent 21332 18ca24f32565
child 21551 a00b3ea45664
permissions -rw-r--r--
#DOCUMENTATION by stefan class: OSProcess comment/format in: #examples
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic' }"
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
19286
9e8eea97fd57 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 13313
diff changeset
     3
"{ NameSpace: Smalltalk }"
9e8eea97fd57 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 13313
diff changeset
     4
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
Object subclass:#OSProcess
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
     6
	instanceVariableNames:'pid command environment directory inStream outStream errorStream
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
     7
		auxStream showWindow lineWise newPgrp exitStatus finishSema
21206
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
     8
		shufflerProcesses streamsToClose terminateActionBlock'
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
	classVariableNames:''
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
	poolDictionaries:''
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
	category:'System-Support'
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
!OSProcess class methodsFor:'documentation'!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    16
documentation
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    17
"
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
    18
    Instances of OSProcess represent operating system processes thatr can be executed.
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    19
    (as opposed to Smalltalk processes).
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    20
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    21
    [author:]
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    22
        Stefan Vogel (stefan@zwerg)
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    23
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    24
    [instance variables:]
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    25
        pid         SmallInteger    the process id
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
    26
        command     String          the command line of the running command.
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    27
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    28
    [class variables:]
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    29
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    30
    [see also:]
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    31
        Process
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    32
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    33
"
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    34
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    35
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    36
examples
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    37
"
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    38
[exBegin]
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    39
        |outStream|
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    40
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    41
        outStream := '' writeStream.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    42
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    43
        OSProcess new 
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
    44
            command:'ls -l';
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    45
            inStream:'abc' readStream;
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    46
            outStream:outStream;
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    47
            lineWise:true;
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    48
            execute.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    49
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
    50
        outStream contents
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    51
[exEnd]
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    52
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    53
[exBegin]
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    54
        |outStream|
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    55
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    56
        outStream := '' writeStream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    57
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    58
        OSProcess new 
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    59
            command:'ls -l; sleep 10; echo =================================; echo hallo after 10s; echo >&2 +++++++++++++++++++++; cat >&2';
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    60
            inStream:'abc' readStream;
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    61
            outStream:outStream;
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    62
            errorStream:outStream;
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    63
            startProcess.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    64
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    65
        outStream inspect
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    66
[exEnd]
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    67
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    68
[exBegin]
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    69
        |outStream|
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    70
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    71
        outStream := '' writeStream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    72
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    73
        OSProcess new 
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    74
            command:'ls -l & ls -l >&2';
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    75
            inStream:'abc' readStream;
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    76
            outStream:outStream;
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    77
            errorStream:outStream;
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    78
            startProcess.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    79
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
    80
        outStream inspect
21512
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    81
[exEnd]
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    82
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    83
    Execute commands in shell/cmd.exe and read them from stdin:
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    84
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    85
[exBegin]
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    86
        |outStream|
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    87
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    88
        outStream := '' writeStream.
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    89
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    90
        OSProcess new 
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    91
            command:'';
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    92
            inStream:'ls -l' readStream;
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    93
            outStream:outStream;
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    94
            lineWise:true;
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    95
            execute.
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    96
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    97
        outStream contents inspect
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    98
[exEnd]
a78759923d34 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21332
diff changeset
    99
"
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   100
! !
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   101
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   102
!OSProcess class methodsFor:'instance creation'!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   103
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   104
new
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   105
    "return an initialized instance"
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   106
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   107
    ^ self basicNew initialize.
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
! !
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   110
!OSProcess class methodsFor:'initialize'!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   111
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   112
initialize
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   113
    "Backward compatibility"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   114
    Win32Process := self.
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   115
! !
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   116
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   117
!OSProcess methodsFor:'accessing'!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   118
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   119
auxStream
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   120
    ^ auxStream
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   121
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   122
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   123
auxStream:something
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   124
    "set an auxilliary input stream that will be available to the command as
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   125
     file descriptor 3"
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   126
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   127
    auxStream := something.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   128
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   129
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   130
command
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   131
    "return the value of the instance variable 'command' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   132
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   133
    ^ command
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   134
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   135
    "Created: / 10.11.1998 / 21:27:07 / cg"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   136
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   137
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   138
command:aStringOrArray
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   139
    "set the command to be executed.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   140
     If aStringOrArray is a String, the commandString is passed to a shell for execution
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   141
     - see the description of 'sh -c' in your UNIX manual ('cmd.exe' in your Windows manual).
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   142
     If aCommandString is an Array, the first element is the command to be executed,
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   143
     and the other elements are the arguments to the command. No shell is invoked in this case."
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   144
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   145
    command := aStringOrArray.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   146
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   147
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   148
directory
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   149
    "return the value of the instance variable 'directory' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   150
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   151
    ^ directory
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   152
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   153
    "Created: / 10.11.1998 / 21:21:52 / cg"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   154
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   155
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   156
directory:aString
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   157
    "set the directory that will be set as the current directory of the command to be executed"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   158
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   159
    directory := aString.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   160
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   161
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   162
environment
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   163
    "return the value of the instance variable 'environment' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   164
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   165
    ^ environment
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   166
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   167
    "Created: / 10.11.1998 / 21:26:34 / cg"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   168
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   169
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   170
environment:aDictionary
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   171
    "set the environment variables of the command to be executed"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   172
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   173
    environment := aDictionary.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   174
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   175
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   176
errorStream
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   177
    "return the value of the instance variable 'errorStream' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   178
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   179
    ^ errorStream
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   180
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   181
    "Created: / 10.11.1998 / 21:26:34 / cg"
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   182
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   184
errorStream:aStream
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   185
    "set the stream where the stderr output of the command is directed to"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   186
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   187
    errorStream := aStream.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   188
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   189
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   190
exitStatus
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   191
    "answer the exit status of the command or nil, if the command has not yet been finished"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   192
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   193
    ^ exitStatus
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   194
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   195
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   196
exitStatus:something
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   197
    "set the value of the instance variable 'exitStatus' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   198
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   199
    exitStatus := something.
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   200
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   201
    "Created: / 10.11.1998 / 21:24:55 / cg"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   202
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   203
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   204
finishSema
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   205
    "wait on this semaphore if yo want to wait until the os process has finished.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   206
     There may be multiple waiters, so it is a good idea to do a #waitUncounted"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   207
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   208
    ^ finishSema
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   209
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   210
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   211
inStream
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   212
    "return the value of the instance variable 'inStream' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   213
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   214
    ^ inStream
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   215
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   216
    "Created: / 10.11.1998 / 21:26:34 / cg"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   217
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   218
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   219
inStream:aStream
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   220
    "set the stream where the stdin input of the command is read from"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   221
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   222
    inStream := aStream.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   223
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   224
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   225
lineWise
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   226
    ^ lineWise
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   227
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   228
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   229
lineWise:aBoolean
21209
e9395c842124 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21208
diff changeset
   230
    "When setting to true, read linewise from the command's output and error.
e9395c842124 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 21208
diff changeset
   231
     This is a bit slower than lineWise = false.
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   232
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   233
     You may use it also when streaming to e.g. Transcript"
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   234
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   235
    lineWise := aBoolean.
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   236
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   237
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   238
newPgrp
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   239
    ^ newPgrp
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   240
!
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   241
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   242
newPgrp:aBoolean
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   243
    "if aBoolean is true, a new process group will be created for the command and its subprocesses"
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   244
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   245
    newPgrp := aBoolean.
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   246
!
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   247
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   248
outStream
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   249
    "return the value of the instance variable 'outStream' (automatically generated)"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   250
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   251
    ^ outStream
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   252
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   253
    "Created: / 10.11.1998 / 21:26:34 / cg"
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   254
!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   255
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   256
outStream:aStream
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   257
    "set the stream where the stdout output of the command is directed to"
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   258
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   259
    outStream := aStream.
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   260
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   261
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   262
pid
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   263
    "answer the pid of the process the command is running in or nil, if the command has not yet been started."
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   264
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   265
    ^ pid
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   266
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   267
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   268
pid:something
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   269
    pid := something.
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   270
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   271
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   272
showWindow
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   273
    ^ showWindow
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   274
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   275
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   276
showWindow:aBooleanOrNil
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   277
    "This parameter is ignored on Unix systems.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   278
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   279
     You can control (have to - sigh) if a window should be shown for the command or not.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   280
     This is the OS's H_SHOWWINDOW argument.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   281
     If you pass nil as showWindow-argument, the OS's default is used for the particular
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   282
     command, which is correct most of the time: i.e. a notepad will open its window, other (non-UI)
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   283
     executables will not.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   284
     However, some command-line executables show a window, even if they should not.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   285
     (and also, there seems to be an inconsistency between windows7 and newer windows: in newer,
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   286
     a shell command opens a cmd-window, whereas in windows7 it did not)
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   287
     In this case, pass an explicit false argument to suppress it."
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   288
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   289
    showWindow := aBooleanOrNil.
21206
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   290
!
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   291
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   292
terminateActionBlock
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   293
    ^ terminateActionBlock
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   294
!
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   295
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   296
terminateActionBlock:aBlock
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   297
    "set the block that will be executed when the command has been finished or terminated."
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   298
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   299
    terminateActionBlock := aBlock.
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   300
! !
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   301
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   302
!OSProcess methodsFor:'initialization'!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   303
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   304
initialize
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   305
    "Invoked when a new instance is created."
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   306
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   307
    showWindow := false.    "/ for backward compatibility
21183
fdeb19204fb2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21182
diff changeset
   308
    lineWise := false.
fdeb19204fb2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21182
diff changeset
   309
    newPgrp := true.
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   310
! !
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   311
13313
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   312
!OSProcess methodsFor:'printing'!
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   313
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   314
printOn:aStream
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   315
    aStream 
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   316
        nextPutAll:self className;
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   317
        nextPut:$(.
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   318
    pid printOn:aStream.
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   319
    aStream space.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   320
    command printOn:aStream.
13313
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   321
    aStream nextPut:$)
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   322
! !
e5a29a7594be added: #printOn:
Stefan Vogel <sv@exept.de>
parents: 12890
diff changeset
   323
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   324
!OSProcess methodsFor:'private'!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   325
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   326
setupShufflerForInput:aStream
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   327
    "if aStream is an internal Stream, set up a pipe for the command input.
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   328
     Start a process that shuffles tha data fron the internal stream into the pipe
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   329
     (and into the command's input)."
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   330
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   331
    |pipe externalStream shuffledStream shufflerProcess|
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   332
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   333
    (aStream isNil or:[aStream isExternalStream]) ifTrue:[
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   334
        ^ aStream.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   335
    ].
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   336
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   337
    pipe := NonPositionableExternalStream makePipe.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   338
    externalStream := pipe at:1.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   339
    shuffledStream := pipe at:2.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   340
    lineWise ifFalse:[
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   341
        shuffledStream blocking:false.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   342
    ].
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   343
    aStream isBinary ifTrue:[
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   344
        shuffledStream binary.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   345
    ].
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   346
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   347
    "/ start a reader process, shuffling data from the given
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   348
    "/ inStream to the pipe (which is connected to the commands input)
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   349
    shufflerProcess := [
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   350
            [
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   351
                lineWise ifTrue:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   352
                    "shuffle until end-of-input"
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   353
                    [aStream atEnd] whileFalse:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   354
                        |data|
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   355
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   356
                        data := aStream nextLine.
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   357
                        data notNil ifTrue:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   358
                            shuffledStream nextPutLine:data.
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   359
                            shuffledStream flush.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   360
                        ].
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   361
                    ].
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   362
                ] ifFalse:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   363
                    aStream copyToEndInto:shuffledStream.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   364
                ].
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   365
            ] on:WriteError do:[:ex|
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   366
                "ignore"
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   367
            ] ensure:[
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   368
                shuffledStream close.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   369
            ]
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   370
        ] newProcess
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   371
            name:'OSProcess input shuffler';
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   372
"/                beSystemProcess;
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   373
            resume.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   374
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   375
    shufflerProcesses add:shufflerProcess.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   376
    streamsToClose add:externalStream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   377
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   378
    ^ externalStream
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   379
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   380
    "Modified: / 31-01-2017 / 16:50:39 / stefan"
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   381
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   382
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   383
setupShufflerForOutput:aStream
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   384
    "if aStream is an internal Stream, set up a pipe for the command output.
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   385
     Start a process that shuffles the data fron the pipe into the internal stream."
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   386
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   387
    |pipe externalStream shuffledStream shufflerProcess|
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   388
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   389
    (aStream isNil or:[aStream isExternalStream]) ifTrue:[
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   390
        ^ aStream.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   391
    ].
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   392
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   393
    pipe := NonPositionableExternalStream makePipe.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   394
    externalStream := pipe at:2.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   395
    shuffledStream := pipe at:1.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   396
    aStream isBinary ifTrue:[
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   397
        shuffledStream binary.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   398
    ].
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   399
21182
001704ae8bbf #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21181
diff changeset
   400
    shufflerProcess := [
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   401
            [
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   402
                "shuffle until the pipe closes"
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   403
                lineWise ifTrue:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   404
                    [shuffledStream atEnd] whileFalse:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   405
                        |data|
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   406
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   407
                        data := shuffledStream nextLine.
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   408
                        data notNil ifTrue:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   409
                            aStream nextPutLine:data
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   410
                        ].
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   411
                    ].
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   412
                ] ifFalse:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   413
                    shuffledStream copyToEndInto:aStream.
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   414
                ].
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   415
            ] on:WriteError do:[:ex |
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   416
                "ignore" 
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   417
            ] ensure:[
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   418
                shuffledStream close.
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   419
            ].
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   420
        ] newProcess
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   421
            priority:(Processor userSchedulingPriority "+ 1");
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   422
            name:'OSProcess output shuffler';
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   423
"/                beSystemProcess;
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   424
            resume.
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   425
21223
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   426
    shufflerProcesses add:shufflerProcess.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   427
    streamsToClose add:externalStream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   428
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   429
    ^ externalStream
21332
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   430
18ca24f32565 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21226
diff changeset
   431
    "Modified: / 31-01-2017 / 16:57:25 / stefan"
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   432
! !
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   433
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   434
!OSProcess methodsFor:'queries'!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   435
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   436
finishedWithSuccess
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   437
    ^ exitStatus notNil and:[exitStatus success].
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   438
!
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   439
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   440
isAlive
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   441
    "answer true, if the process is still alive"
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   442
21205
580c1baf6e3f #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21200
diff changeset
   443
    ^ pid notNil and:[exitStatus isNil]
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   444
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   445
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   446
isDead
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   447
    "answer true, if the process is no longer alive"
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   448
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   449
    ^ self isAlive not
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   450
! !
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   451
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   452
!OSProcess methodsFor:'starting'!
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   453
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   454
execute
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   455
    "execute the command. 
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   456
     Wait until is is finished.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   457
     Abort the execution if I am interrupted.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   458
     Answer true if the terminated succesfully, 
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   459
     false if it could not be started or terminated with error."
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   460
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   461
    |ok|
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   462
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   463
    [
21185
b2ecc061106c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21184
diff changeset
   464
        ok := self startProcess.
b2ecc061106c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21184
diff changeset
   465
        ok ifTrue:[
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   466
            self waitUntilFinished.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   467
            ok := self finishedWithSuccess.
21185
b2ecc061106c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21184
diff changeset
   468
        ].
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   469
    ] ifCurtailed:[
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   470
        "/ we were interrupted -
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   471
        "/ terminate the os-command (and all of its forked commands)
21185
b2ecc061106c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21184
diff changeset
   472
        pid notNil ifTrue:[
b2ecc061106c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21184
diff changeset
   473
            self terminateGroup.
b2ecc061106c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21184
diff changeset
   474
        ].
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   475
    ].
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   476
    ^ ok.
21181
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   477
!
a8a9220ed86f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21172
diff changeset
   478
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   479
startProcess
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   480
    "If there are non-external streams, setup transfer (shuffler) processes
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   481
     to transfer data from a pipe to the internal stream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   482
     Start the command.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   483
     Answer true if the command could be started, false if not.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   484
     Return immediately (do not wait until the command is finished)." 
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   485
21200
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   486
    |externalInStream externalAuxStream externalErrorStream externalOutStream|
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   487
21200
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   488
    shufflerProcesses := OrderedCollection new:4.
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   489
    streamsToClose := OrderedCollection new:2.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   490
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   491
    externalInStream := self setupShufflerForInput:inStream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   492
    externalAuxStream := self setupShufflerForInput:auxStream.
21226
568b192939c7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21223
diff changeset
   493
    externalOutStream := self setupShufflerForOutput:outStream.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   494
    errorStream == outStream ifTrue:[
21226
568b192939c7 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21223
diff changeset
   495
        externalErrorStream := externalOutStream.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   496
    ] ifFalse:[
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   497
        externalErrorStream := self setupShufflerForOutput:errorStream.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   498
    ].
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   499
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   500
    "start the command"
21200
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   501
    finishSema := EventSemaphore new.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   502
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   503
    Processor 
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   504
        monitor:[
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   505
            pid := OperatingSystem
21200
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   506
                        startProcess:command
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   507
                        inputFrom:externalInStream
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   508
                        outputTo:externalOutStream
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   509
                        errorTo:externalErrorStream
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   510
                        auxFrom:externalAuxStream
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   511
                        environment:environment
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   512
                        inDirectory:directory
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   513
                        newPgrp:newPgrp
6de129aead00 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21185
diff changeset
   514
                        showWindow:showWindow.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   515
        ] 
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   516
        action:[:status |
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   517
            status stillAlive ifFalse:[
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   518
                exitStatus := status.
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   519
                pid notNil ifTrue:[
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   520
                    OperatingSystem closePid:pid.
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   521
                ].
21223
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   522
"/                shufflerProcesses do:[:eachProcess|
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   523
"/                    "terminate the shuffler processes.
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   524
"/                     They close the local side of the pipe when being terminated"
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   525
"/                    eachProcess terminate.
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   526
"/                ].
bebca95ca864 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 21209
diff changeset
   527
                finishSema signal.
21206
aad552f2f306 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 21205
diff changeset
   528
                terminateActionBlock value.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   529
            ].
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   530
        ].
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   531
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   532
    "we can close the remote side of the pipes after the os process has been started (after the fork)"
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   533
    streamsToClose do:[:eachStream | eachStream close].
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   534
    streamsToClose := nil.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   535
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   536
    pid isNil ifTrue:[
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   537
        "process could not be started - terminate shufflers"
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   538
        shufflerProcesses do:[:eachProcess|
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   539
            eachProcess terminate.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   540
        ].
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   541
        shufflerProcesses := nil.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   542
        exitStatus := OperatingSystem osProcessStatusClass processCreationFailure.
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   543
        finishSema signal.
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   544
        ^ false.
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   545
    ].
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   546
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   547
    ^ true.
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   548
! !
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   549
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   550
!OSProcess methodsFor:'terminating'!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   551
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   552
kill
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   553
    "kill the process - the process does not get the chance to clean up"
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   554
    
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   555
    pid notNil ifTrue:[
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   556
        OperatingSystem killProcess:pid.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   557
    ].
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   558
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   559
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   560
killGroup
20379
135c4fc19014 #OTHER by mawalch
mawalch
parents: 19298
diff changeset
   561
    "kill the processGroup - the processes do not get the chance to clean up"
135c4fc19014 #OTHER by mawalch
mawalch
parents: 19298
diff changeset
   562
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   563
    pid notNil ifTrue:[
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   564
        OperatingSystem 
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   565
            killProcessGroup:pid;
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   566
            killProcess:pid.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   567
    ].
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   568
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   569
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   570
terminate
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   571
    "terminate the process gracefully"
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   572
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   573
    pid notNil ifTrue:[
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   574
        OperatingSystem terminateProcess:pid.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   575
    ].
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   576
!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   577
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   578
terminateGroup
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   579
    "terminate the process group.
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   580
     Under Windows, these is the same as terminateWithhAllChildren,
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   581
     under unix, this terminates a subset of all children"
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   582
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   583
    pid notNil ifTrue:[
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   584
        OperatingSystem 
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   585
            terminateProcessGroup:pid;
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   586
            terminateProcess:pid.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   587
    ].
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   588
! !
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   589
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   590
!OSProcess methodsFor:'waiting'!
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   591
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   592
waitUntilFinished
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   593
    ^ self waitUntilFinishedWithTimeout:nil
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   594
!
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   595
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   596
waitUntilFinishedWithTimeout:timeout
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   597
    |processList|
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   598
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   599
    (finishSema waitWithTimeout:timeout) isNil ifTrue:[
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   600
        "timed out"
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   601
        ^ nil.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   602
    ].
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   603
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   604
    "have to wait until the shufflers have finished their work"
21208
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   605
    processList := shufflerProcesses.
9fbb51649256 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 21206
diff changeset
   606
    processList notEmptyOrNil ifTrue:[
21184
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   607
        processList do:[:eachProcess | 
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   608
            eachProcess waitUntilTerminated.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   609
        ].
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   610
        shufflerProcesses := nil.
190ae0ab71c2 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21183
diff changeset
   611
    ].
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   612
! !
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   613
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   614
!OSProcess class methodsFor:'documentation'!
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   615
19298
cfacc6b159c5 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 19286
diff changeset
   616
version
cfacc6b159c5 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 19286
diff changeset
   617
    ^ '$Header$'
cfacc6b159c5 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 19286
diff changeset
   618
!
cfacc6b159c5 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 19286
diff changeset
   619
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   620
version_CVS
19286
9e8eea97fd57 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 13313
diff changeset
   621
    ^ '$Header$'
12890
2488b1f65af2 initial checkin
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   622
! !
19286
9e8eea97fd57 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 13313
diff changeset
   623
21172
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   624
36a0e5430705 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 20379
diff changeset
   625
OSProcess initialize!