JEP 102 Process Updates revised API draft

Peter Levart peter.levart at gmail.com
Tue Feb 10 11:35:08 UTC 2015


On 02/10/2015 12:25 AM, Roger Riggs wrote:
> Hi,
>
> After a protracted absence from working on JEP 102, the updated API draft
> provides access to process hierarchies and individual process 
> information;
> as permitted by the OS. The relationship between Process and 
> ProcessHandle
> is clarified and the security model validated.
>
> Both Processes and ProcessHandles can be monitored using 
> CompletableFuture
> for termination and to trigger additional actions on Process exit.
> Information about processes includes the total cputime, starttime, user,
> executable, and arguments.
>
> Please review and comment:
>    http://cr.openjdk.java.net/~rriggs/ph-apidraft/
>
> Thanks, Roger
>
>
>
>
Hi Roger,

Great to see progress on this.

Here are my comments:

ProcessHandle.{allProcesses,allChildren,children} return 
Stream<ProcessHandle>. This is convenient if one wants to use Stream 
API, but a little more inconvenient and perhaps with additional overhead 
if one doesn't. Since all those methods return a "snapshot", I can 
imagine that internally, there is a collection built from this snapshot. 
So it would be most appropriate to return a List<ProcessHandle>. One can 
always continue the expression by appending .stream()..., but on the 
other hand if one wants to .collect(toList()), additional copying is 
introduced.

ProcessHandle.completableFuture().cancel(true) forcibly destorys 
(destroyForcibly()) the process *and* vice versa: destory[Forcibly]() 
cancels the CompletableFuture. I don't know if this is the best way - 
can't decide yet. In particular, in the implementation it would be hard 
to achieve the atommicity of both destroying the process and canceling 
the future. Races are inevitable. So it would be better to think of a 
process (and a ProcessHandle representing it) as the 1st stage in the 
processing pipeline, where ProcessHandle.completableFuture() is it's 
dependent stage which tracks real changes of the process. Which means 
the behaviour would be something like the following:

- ProcessHandle.destroy[Forcibly]() triggers destruction of the process 
which in turn (when successful) triggers completion of 
CompletableFuture, exceptionally with CompletionException, wrapping the 
exception indicating the destruction of the process 
(ProcessDestroyedException?).

- ProcessHandle.completableFuture().cancel(true/false) just cancels the 
CompletableFuture and does not do anything to the process itself.

In that variant, then perhaps it would be more appropriate for 
ProcessHandle.completableFuture() to be a "factory" for 
CompletableFuture(s) so that each call would return new independent 
instance.

What do you think?

Regards, Peter




More information about the core-libs-dev mailing list