Review request for 5049299
Martin Buchholz
martinrb at google.com
Tue Jun 9 19:24:43 UTC 2009
Following up some more...
I did some cleanup of the USE_CLONE vs. non-USE_CLONE
code and tested both of them (on Linux at least).
I took the liberty of removing the references to fork1,
since OpenJDK7 only supports Solaris10 going forward.
The main fork logic now looks like this:
{
#if USE_CLONE
/* See clone(2).
* Instead of worrying about which direction the stack grows, just
* allocate twice as much and start the stack in the middle. */
const int stack_size = 64 * 1024;
if ((clone_stack = NEW(char, 2 * stack_size)) == NULL) goto Catch;
resultPid = clone(childProcess, clone_stack + stack_size,
/* CLONE_VFORK | // works, but unnecessary */
CLONE_VM | SIGCHLD, c);
#else
/* From fork(2): In Solaris 10, a call to fork() is identical
* to a call to fork1(); only the calling thread is replicated
* in the child process. This is the POSIX-specified behavior
* for fork(). */
resultPid = fork();
if (resultPid == 0) {
childProcess(c);
assert(0); /* childProcess must not return */
}
#endif
}
Patch updated on cr.openjdk.java.net.
Martin
On Tue, Jun 9, 2009 at 11:42, Martin Buchholz <martinrb at google.com> wrote:
>
>
> On Tue, Jun 9, 2009 at 09:28, Michael McMahon <Michael.McMahon at sun.com>wrote:
>
>> Martin Buchholz wrote:
>>
>>> In the old implementation, we used the strategy of
>>> fork+mutate environ+execvp
>>> and we got the traditional shell script semantics
>>> from our use of execvp.
>>> Since environ is now a global shared-with-parent variable,
>>> we can't mutate it any more, therefore can't use execvp,
>>> and must implement the missing execvpe ourselves.
>>>
>>
> One more note: we could try to have two implementations of
> execvpe, one that mutated environ and one that didn't,
> since each has its own advantages,
> but I think that would be even harder to understand and maintain.
>
> Hmmmmmmmmmmmmmmmmmm.............................
> Looking at the code again, it seems like it would not be too much work.
>
> Here's an untested example of how we could do both.
>
> static void
> execve_with_shell_fallback(const char *file,
> const char *argv[],
> const char *const envp[])
> {
> #if USE_CLONE
> execve(file, (char **) argv, (char **) envp);
> if (errno == ENOEXEC)
> execve_as_traditional_shell_script(file, argv, envp);
> #else
> extern char **environ;
> environ = (char **) envp;
> execvp(file, (char **) argv);
> #endif
> }
>
> What do you think?
>
> Martin
>
>
>>
>>> Now, strictly speaking, execvp's traditional shell script semantics
>>> is an unspecified implementation detail of execvp;
>>> on other Unix platforms we might not need this. We can leave this to,
>>> e.g. the BSD porters reading this,
>>> to add some #ifdefs.
>>>
>>> Ok, got you.
>>
>>> (It would also be good if you ran the updated tests on
>>> Solaris with the old implementation to confirm my understanding)
>>>
>>
>> I'm just building it now, and will run the test then.
>>
>> Thanks,
>> Michael.
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20090609/7b5b0eb9/attachment.html>
More information about the core-libs-dev
mailing list