On 07/08/14 16:05, Andrei Alexandrescu wrote:
On 8/7/14, 1:21 AM, Lars Tandle Kyllingstad via phobos wrote:
I think we made a good case for why those functions ought to be
deprecated on Windows in that discussion, and while I stand by my
arguments, I don't really have anything more to add to re-convince you.

Removing functionality is a drastic step to take, and I won't try to
deprecate them unless there is a clear consensus that it is the right
thing to do.

I am convinced. I do understand exec* is inefficient on Windows.
However, I remember I dealt with an application in which removal of said
functionality would force me to essentially paste the source code from
std.process into my program. That doesn't seem like progress.

Inefficiency was never used as an argument. The problem is that exec* does different things on Windows and POSIX. In other words, a D program which uses std.process.exec* will have different observable behaviour on different platforms. This is what bothers me.

  - On POSIX systems, exec* overwrites the current process
    with a new one.

  - On Windows, exec* spawns a new, independent process and
    exits the current one.

As an example of how this causes different observable behaviour, let us say that program A uses exec* to run program B. The user starts A from the command line. The POSIX user will then be returned to the command line when program B has completed, and the exit code he receives is that of program B. The Windows user will be returned to the command line immediately after the exec* statement has run, and program B will run independently in the background. Which exit code the user receives is anyone's guess, but it is certainly not from B.


Is there a chance to offer the functionality on Windows in a reasonable
way?

Yes or no, depending on how your question is interpreted.

No, it is not possible to make exec* overwrite the current process on Windows. New processes are always created in isolation. Not even Microsoft managed to implement exec* properly in their C runtime; their functions fake it with spawn-and-exit, as described above.

But yes, you can make a program that does the same thing yours does now, even if exec* is deprecated on Windows. The user-side code will be more verbose, but the difference in behaviour will be explicit.

Program using today's std.process.execv():

    execv("prog", ["arg1", "arg2" ]);

Program that behaves in the same manner, after exec* deprecation on Windows:

    auto cmd = [ "prog", "arg1", "arg2" ];
    version (Posix) execv(cmd[0], cmd[1 .. $]);
    else { spawnProcess(cmd); _exit(0); }

Somewhat improved program that appears to behave in almost the same manner on all platforms (assuming there are no other threads running!):

    auto cmd = [ "prog", "arg1", "arg2" ];
    version (Posix) execv(cmd[0], cmd[1 .. $]);
    else _exit(wait(spawnProcess(cmd)));

Lars
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to