ok, thanks, roger

On 4/20/2015 11:57 AM, Thomas Stüfe wrote:
Hi Roger,

thanks!

Maybe better:

"When using ProcessHandles avoid assumptions about the state or liveness of the underlying process." -> "When using ProcessHandles avoid assumptions about liveness or identity of the underlying process."

Regards, Thomas


On Mon, Apr 20, 2015 at 5:53 PM, Roger Riggs <roger.ri...@oracle.com <mailto:roger.ri...@oracle.com>> wrote:

    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
    
<http://cr.openjdk.java.net/%7Erriggs/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.ri...@oracle.com <mailto:roger.ri...@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








Reply via email to