RFR 9: 8077350 Process API Updates Implementation Review
Roger Riggs
Roger.Riggs at Oracle.com
Mon Apr 20 15:53:47 UTC 2015
Hi Thomas,
I expanded the ProcessHandle class javadoc [1] paragraph to include the
caution about process id reuse.
Thanks, Roger
[1]
http://cr.openjdk.java.net/~rriggs/ph-apidraft/java/lang/ProcessHandle.html
On 4/18/2015 2:44 PM, Thomas Stüfe wrote:
> Hi Roger,
>
> On Fri, Apr 17, 2015 at 8:57 PM, Roger Riggs <Roger.Riggs at oracle.com
> <mailto:Roger.Riggs at oracle.com>> wrote:
>
> Hi David,
>
> On 4/17/2015 2:44 PM, David M. Lloyd wrote:
>
> On 04/17/2015 11:53 AM, Roger Riggs wrote:
>
> Hi Peter,
>
> On 4/17/2015 4:05 AM, Peter Levart wrote:
>
> Hi Roger,
>
> Retrieving and caching the process start time as soon
> as ProcessHandle
> is instantiated might be a good idea. "destroy" native
> code would then
> use pid *and* start time to check the identity of the
> process before
> killing it.
>
> Yes, though it does raise a question about how to specify
> PH.equals().
> Either the start time is explicitly
> mentioned (and is repeatable and testable) or it is vague
> and refers to
> some implementation
> specific value that uniquely identifies the process; and
> is less testable.
>
>
> Even with timestamps though, you cannot prevent the PID from
> being reused in the time window after you verify its timestamp
> but before you kill it unless it is a direct child process (on
> UNIX anyway; who knows what Windows does...). I think that
> this inevitable race should be mentioned in the docs
> regardless of whether the timestamp thing is implemented (or
> doc'd) to prevent unrealistic expectations (the api draft link
> seems to be dead so I didn't see if it already includes this
> kind of language).
>
> I can add a note about race conditions to the existing class level
> javadoc about process information changing asynchronously.
>
> "Race conditions can exist between checking the status of a
> process and acting upon it."
>
> But I'm still struck by the oddity of Java needing to provide a
> better interface
> to processes than the native OS does. In the native OS, a pid is
> a pid and
> the only handle given to applications. So both the app and the os
> need to
> be conservative about pid re-use.
>
> The problem is the audience. Every UNIX system programmer knows about
> the dangers of pid recycling. Java programmers don't, and your API
> promises a robustness and simplicity which it unfortunately cannot
> deliver. No one will expect a ProcessHandle returned by allChildren
> suddenly to refer to a totally different process. Therefore I also
> think the dangers should be clearly mentioned in the java doc.
>
> Regards, Thomas
>
> The link[1] was broken while I replaced it with an update
> reflecting the recent comments.
>
> Thanks, Roger
>
> [1] http://cr.openjdk.java.net/~rriggs/phdoc/
> <http://cr.openjdk.java.net/%7Erriggs/phdoc/>
>
>
>
> At least on Linux (/proc/<pid>/stat) and Solaris
> (/proc/<pid>/status)
> it is not necessary to open those special files and
> read them. Just
> doing stat() on them and using the st_mtime will get
> you the process
> start time. I see AIX shares native code with Linux
> (unix), so perhaps
> AIX does the same. Mac OSX and Windows have special
> calls...
>
> That is less expensive. But opening /proc/<pid>/stat is
> necessary for
> allChildren to get
> and filter on the parent and can provide the starttime as
> well.
> stat would be useful for allProcesses which does not need
> the parent.
>
>
> In case OS does not allow retrieving the start time
> (not owner or
> similar), it should be cached as some "undefined"
> value and treated
> the same when destroying. If while obtaining the
> ProcessHandle *and*
> while destroying the process, the start time of the
> process with a
> particular pid is "undefined" then there are two options:
>
> 1 - don't kill the process
> 2 - kill the process
>
> They might actually be no different as the reason of
> not being able to
> retrieve the start time (not owner) might prevent the
> process from
> being killed too, so option 2 could be used to allow
> killing on any
> hypothetical platforms that don't support retrieving
> start time and it
> is no worse than current implementation anyway.
>
> Destroy is a best-effort method; it is not guaranteed to
> result in
> termination, though
> the docs are a bit weak on this point.
>
> I'd go for option 2, anyone using the API is looking for
> results on
> processes they
> already know something about (mostly), so there's no
> reason to be
> particularly
> conservative about. If the caller is trying to be more
> conservative,
> they can maintain
> their own extra information about the processes they are
> managing.
>
>
>
> What do you think?
>
> I'd like to pick this up as a separate change, and get the
> current one
> in first.
>
> Roger
>
>
>
>
>
More information about the core-libs-dev
mailing list