[rfc][icedtea-web] replace runtime().exec by processbuilder
Jiri Vanek
jvanek at redhat.com
Mon Jun 15 16:15:46 UTC 2015
On 06/15/2015 06:11 PM, Andrew Azores wrote:
> On 15/06/15 11:57 AM, Jiri Vanek wrote:
>> On 06/15/2015 05:46 PM, Andrew Azores wrote:
>>> On 15/06/15 11:34 AM, Jiri Vanek wrote:
>>>> ssia
>>>>
>>>>
>>>> I'm also in temptation to push this to 1.6
>>>>
>>>> The handling of streams is just terrible :(
>>>>
>>>>
>>>> J.
>>>
>>>> - Process p = Runtime.getRuntime().exec(command);
>>>> - new StreamEater(p.getErrorStream()).start();
>>>> - new StreamEater(p.getInputStream()).start();
>>>> - p.getOutputStream().close();
>>>> -
>>>> + ProcessBuilder pb = new ProcessBuilder(command);
>>>> + pb.inheritIO();
>>>> + Process p =pb.start();
>>>> + try {
>>>> + p.waitFor();
>>>> + } catch (InterruptedException e) {
>>>> + OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e);
>>>> + }
>>>
>>> Where does the "waitFor" come from? I'm not seeing that the old code does the same thing (but maybe
>>
>> Surprisingly no - the change of behavior is to not include it.
>> The wait is hidden in the handling of streams.
>> As streaminheritance is different, then the waitFor is the necessarything to do.
>>
>
> Ah alright. I figured that might have been what was happening but it wasn't clear even when reading
> the StreamEater that it sort of implicitly caused a waitFor effect. This way is much, much better then!
>
>>
>>> I'm just missing it and it does). Is this meant to be a change in behaviour? If that
>>> InterruptedException does get thrown, is it ok that the current thread continues on in parallel with
>>> process p?
>>
>> For that I dont have answer. Whats your suggestion? HAve you ever seenthis exception? :)
>>
>> J
>>
>
> Well, only when I've been intentionally trying to interrupt and wake up a waiting thread. But
yes:)
> spurious wakeups [0] can happen and are probably worth handling. In this case I suppose that just
hmmm
> means putting the waitFor into a loop and continuing to waitFor until p.exitStatus() returns rather
> than throws IllegalThreadStateException? Sounds pretty messy :(
>
> [0] https://en.wikipedia.org/wiki/Spurious_wakeup
Process p =pb.start();
boolean workaround = true;
do{
try {
p.waitFor();
woraround=false;
} catch (InterruptedException e) {
OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e);
}
}while(workaround);
??
ISnt better jsut keep going or die?
More information about the distro-pkg-dev
mailing list