On Monday, 10 June 2013 at 16:20:53 UTC, Steven Schveighoffer wrote:
On Fri, 07 Jun 2013 01:59:22 -0400, Lars T. Kyllingstad
<[email protected]> wrote:

On Thursday, 6 June 2013 at 17:32:25 UTC, nazriel wrote:
I am aware that std.process is generalized but I doubt such useful functionality which is usable on various Posixen is more disturbing than Windows-only suprpressConsole https://github.com/D-Programming-Language/phobos/blob/master/std/process.d#L954

I think there is a huge difference between a simple flag and the
ability to execute arbitrary code on one OS but not on another.
(When set, suppressConsole actually *eliminates* a difference in
the default behaviour of the two OS families.)

First, suppressConsole is a simple flag, basically passed through to the CreateProcess function, so even though it's Windows-specific, so is the
behavior we are suppressing.  Consider that when you specify
suppressConsole on Posix, the flag works! No console window is created :)

But what to do with arbitrary "run this code between fork and exec" on windows? It's not possible. It doesn't belong in the generalized API.

But I was mistaken. Config is an enum not struct, so yeah, not worth changing it only for sake of posix callback.

So maybe module level variable?

module std.process;

// ...
void delegate() posixPostFork = null;
// ...

Global state?  Don't want to go there...

I agree that the global state is a bad idea, ideally you want to specify PER CALL what happens on a fork/exec, not PER THREAD (or PER PROCESS).

But I think we need some way to hook this. To give up all the niceties of std.process just so you can hook the fork/exec sequence seems overly burdensome.

What I am thinking of is possibly to expose the OS-specific spawnProcess implementation as an object with the API defined by it, similar to how writeln simply forwards to stdout.writeln. We could have spawnProcess simply forward to posixProcessImpl.spawnProcess (or windowsProcessImpl.spawnProcess on windows)


I had no time yet to check out the pthread_atfork approach but I see you found some issue with that.

posixProcessImpl.spawnProcess and windowsProcessImpl.spawnProcess sounds very good.

Then if someone wants to actually take advantage of OS-specific features, they can call on the appropriate object. It shouldn't compile where it's not implemented (e.g. windows spawnProcess shouldn't be callable on Linux).


That would be great.
Being able to use the easy, simple functions to get the work done and encourage to use them (by Docs and examples) but also allow access to more specialized, "less visible" functions as you proposed.

Does this make sense? I think it can be done without breaking any code. May be a lot of boilerplate :)

-Steve

Thank you very much for looking into this.

Reply via email to