[rfc][icedtea-web] replace runtime().exec by processbuilder

Andrew Azores aazores at redhat.com
Mon Jun 15 17:04:36 UTC 2015


On 15/06/15 01:02 PM, Jiri Vanek wrote:
> On 06/15/2015 06:58 PM, Andrew Azores wrote:
>> On 15/06/15 12:52 PM, Jiri Vanek wrote:
>>> On 06/15/2015 06:37 PM, Andrew Azores wrote:
>>>> On 15/06/15 12:26 PM, Jiri Vanek wrote:
>>>>>
>>>>>> I don't know about "keep going" and what that would actually mean 
>>>>>> in this case and what kind of
>>>>>> behaviour would arise. "Die" sounds reasonable, though, but then 
>>>>>> we need to check if p is actually
>>>>>> finished after we wake up and then decide to die if it isn't - so 
>>>>>> then why not instead of dying
>>>>>> just
>>>>>> waitFor p again?
>>>>>
>>>>>
>>>>> May you provide code snippet please?
>>>>
>>>>              ProcessBuilder pb = new ProcessBuilder(command);
>>>>              pb.inheritIO();
>>>>              Process p = pb.start();
>>>>              boolean pTerminated = false;
>>>>              while (!pTerminated) {
>>>>                  try {
>>>>                      p.waitFor();
>>>>                  } catch (InterruptedException e) {
>>>> OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e);
>>>>                  }
>>>>                  try {
>>>>                      p.exitValue();
>>>>                      pTerminated = true;
>>>>                  } catch (IllegalThreadStateException e) {
>>>> OutputController.getLogger().log(OutputController.Level.ERROR_ALL, e);
>>>>                  }
>>>>              }
>>>>
>>>> Hopefully the formatting survives.
>>>
>>> Does :) Thanx!
>>>>
>>>>>
>>>>> Is this kind of awaking really worthy of surviving?  I'm really 
>>>>> inclined to just catch, log, and
>>>>> continue ITW running...
>>>>>
>>>>> J.
>>>>
>>>> It's not that hard to correctly handle it, although the code does 
>>>> look pretty ugly. I think the
>>>> better question to ask is if a spurious wakeup does occur here, 
>>>> will ITW continue to run properly?
>>>> Because like I said, it's possible that the wakeup occurs and there 
>>>> is no exception to catch or log,
>>>> and so you just end up with a silent failure later on.
>>>
>>> I really don't know. I'm still a bit more inclined to my straight 
>>> original version.
>>> If you insists on this one you posted, please state it (jsut for 
>>> record).
>>>
>>> I'm probably unable to provide any more decision points:(
>>>
>>> J.
>>
>> I "gently insist". I think mine is a more correct approach to take, 
>> but it is targeting what should
>> be a very rare edge case and so in practice your cleaner code should 
>> work just as well. I just think
>> it's worthwhile to add the slightly dirty loop and exitValue stuff to 
>> make sure that this code hunk
>> never makes us have to worry about what happens if the calling 
>> Launcher thread ends up running in
>> parallel with the forked process, because that doesn't sound easy to 
>> analyze and does sound like it
>> would not lead to correct results - and above all, would be extremely 
>> hard to track and reproduce.
>>
> Fair enough.
>
>
> There is one one related waitFor in Xdesktopentry. and few more over ITW
>
> I'm for encapsualting
>
> >>>  while (!pTerminated) {
> >>>                  try {
> >>>                      p.waitFor();
> >>>                  } catch (InterruptedException e) {
> >>> OutputController.getLogger().log(OutputController.Level.ERROR_ALL, 
> e);
> >>>                  }
> >>>                  try {
> >>>                      p.exitValue();
> >>>                      pTerminated = true;
> >>>                  } catch (IllegalThreadStateException e) {
> >>> OutputController.getLogger().log(OutputController.Level.ERROR_ALL, 
> e);
> >>>                  }
> >>>              }
>
> I'm for separate it into  method waitForSafely(Process p), and use in 
> all palces across ITW (where the waitFor is used, and the 
> InterruptedException is cacth and just logged.
>
>
> oook?
>
>
> Thanx!
>
>  J.

+1

-- 
Thanks,

Andrew Azores



More information about the distro-pkg-dev mailing list