Was: Re: Vote for std.process

Vladimir Panteleev vladimir at thecybershadow.net
Fri Apr 12 09:41:07 PDT 2013


On Friday, 12 April 2013 at 16:04:09 UTC, Manu wrote:
> I didn't see anywhere where it was possible to example the 
> current
> processed environment? I only saw the mechanism for feeding 
> additional env
> vars to the system command.
> Linear array of key/value pair struct would be fine.

There's the "environment" object. It generally acts like a 
string[string], and has a toAA() method that constructs a real 
string[string].

> Beautiful! Actually, I think if you look a couple of pages 
> below, I think
> you'll see something rather like that already there in the 
> windows code.

I see, it also uses appender, although appender's buffer will be 
on the heap, and there is no need for an envz array.

> Thought not sure why you use a size_t array which you just cast 
> to a char*
> array?
> I think you could also fold that into one pass, rather than 2.
> And I'm not sure about this line: envz[n] += 
> cast(size_t)buf.data.ptr;

The problem is that the pointer to the data may change once 
appender reallocates the buffer when it reaches the current 
buffer's capacity. For this reason, we can't store pointers to 
the strings we store, since they can "move" around until the 
point that we're done appending.

I think this is the most common gotcha when writing / working 
with appenders, and it bit be once too. As you can see, the code 
is not completely obvious ;)

> But those helpers make the problem rather painless.
> I wonder if there's opportunity for improvement by having 
> appender support
> the ~ operator? Might be able to jig it to use natural concat 
> syntax rather
> than put()...

Allowing put() take multiple arguments would be an improvement as 
well - not just in usability, but performance as well, since it 
would only need to check for overflow once for all arguments.

I have this in my own appender:
https://github.com/CyberShadow/ae/blob/master/utils/appender.d

Rob Jacques was working on a Phobos appender replacement which 
also had this, I believe:
http://d.puremagic.com/issues/show_bug.cgi?id=5813

Too bad nothing came out of the latter.


More information about the Digitalmars-d mailing list