The new std.process is ready for review

Lars T. Kyllingstad public at kyllingen.net
Tue Mar 5 23:27:18 PST 2013


On Tuesday, 5 March 2013 at 21:04:15 UTC, Vladimir Panteleev 
wrote:
> On Tuesday, 5 March 2013 at 20:19:06 UTC, Lars T. Kyllingstad 
> wrote:
>> A special thanks to Vladimir P. for pointing out an egregious 
>> flaw in the original design.
>
> But wait, there's more!

Aw, man....


> (please don't hurt me)
>
> 1. Typo: "plattform"

That would be my native language shining through. :)


> 2. Is there any meaning in the idea of consolidating 
> spawnProcess/pipeProcess/execute and 
> spawnShell/pipeShell/shell? How about that collectOutput idea?

In principle, I like that idea.  In fact, you'll see that 
execute() and shell() are now both implemented using a function 
similar to (and inspired by) the collectOutput() method you 
suggested.  Furthermore, pipeProcess() and pipeShell() both 
forward to a pipeProcessImpl() function which takes a spawn 
function as a template parameter.

I'm not sure if this is the API we want to expose to the user, 
though.  Firstly,

     auto r = execute("foo");

is a lot easier on the eye than

     auto r = pipeProcess("foo", Redirect.stdout | 
Redirect.stderrToStdout)
              .collectOutput();

Secondly, I only think a collectOutput() method would be 
appropriate to use if one of the output streams is redirected 
into the other.  Consider this:

     auto r = pipeProcess("foo").collectOutput();

Now, the output and error streams are redirected into separate 
pipes.  But what if "foo" starts off by writing 1 MB of data to 
its error stream?

Maybe it could be solved by some intelligent behaviour on the 
part of collectOutput(), based on the redirect flags, but I think 
it is better to encapsulate pipe creation AND reading in one 
function, as is currently done with execute() and shell().

pipeProcess(), on the other hand, that is another matter.  I 
wonder if pipeProcessImpl() would be a good public interface 
(with a different name, of course)?

> 3. Where are we with compatibility with the old module? One 
> idea I haven't seen mentioned yet is: perhaps we could make the 
> return value of "shell" have a deprecated "alias this" to the 
> output string, so that it's implicitly convertible to a string 
> to preserve compatibility.

If that works in all cases, I think it is a fantastic idea!  
There is still the issue of the old shell() throwing when the 
process exits with a nonzero status, though.

Maybe I'll just have to bite the bullet and accept a different 
name. :(  It really seems to be the one thing that is preventing 
the two modules from being combined.  Suggestions, anyone?


> 4. Is there any way to deal with pipe clogging (pipe buffer 
> getting exceeded when manually handling both input and output 
> of a subprocess)? Can we query the number of bytes we can 
> immediately read/write without blocking on a File?

I've wondered about that myself.  I don't know whether this is a 
problem std.process should aim to solve in any way, or if it 
should be treated as a general problem with File.

It is a real problem, though.  Pipe buffers are surprisingly 
small.


> 5. How about that Environment.opIn_r?

Forgot about it. :)  I'll add it.

Lars


More information about the Digitalmars-d mailing list