Hi Andrey,

Sorry to be slow in getting back to this.

Thanks for the update; did you notice that Windows has a separate implementation of ProcessImpl and would also need a similar, though not identical toString() implementation?
     [jdk/src/java.base/windows/classes/java/lang/ProcessImpl.java ]

Windows has a slightly different implementation of the internal state with respect to knowing if it has exited.
See exitValue() and the native getExitCodeProcess() method.

On 7/24/2016 7:42 AM, Andrey Dyachkov wrote:
Hi Roger,

Thank you for reviewing it! I've prepared another version.

diff --git a/src/java.base/unix/classes/java/lang/ProcessImpl.java b/src/java.base/unix/classes/java/lang/ProcessImpl.java
--- a/src/java.base/unix/classes/java/lang/ProcessImpl.java
+++ b/src/java.base/unix/classes/java/lang/ProcessImpl.java
@@ -630,6 +630,21 @@
         return !hasExited;
     }

+    /**
+     * The {@code toString} method for class {@code ProcessImpl}
+ * returns a string consisting of the native process ID of the process,
+     * exit code of the process and the status of the process.
The javadoc for Process uses the terminology "exit value" or "exit status"; the usage should be consistent.
+     *
+     * @return  a string representation of the object.
+     */
+    @Override
+    public String toString() {
+        return new StringBuilder("ProcessImpl{pid=").append(pid)
The implementation class should be hidden, use "Process".
Other toString methods use '[]' to enclose the aggregate of the values.
+        .append(", exitcode=").append(exitcode)
'exitcode=' -> "exitValue" to be consistent with the exitValue method.

This will need an alternate value if the process has not exited, perhaps "not exited"
+        .append(", hasExited=").append(hasExited)
This isn't needed with the above 'not exited' string.
+        .append("}").toString();
'}' -> ']'


Also, I think this would be viewed more as an enhancement than a bug and we'll need
to request an extension[1][2] for it when the code is complete.

Thanks, Roger

[1] http://mail.openjdk.java.net/pipermail/jdk9-dev/2016-June/004443.html
[2] http://openjdk.java.net/projects/jdk9/fc-extension-process

+    }
+
     private static native void init();

     static {

On Mon, 9 May 2016 at 16:50 Roger Riggs <roger.ri...@oracle.com <mailto:roger.ri...@oracle.com>> wrote:

    Hi Andrey,

    Since toString is a public method it needs to provide complete javadoc
    specification
    as providing values for debugging information.  ToString methods
    typically directly
    reflect the state of the fields of the object.

    Why should the exitValue have the value of the pid if the process
    is not
    alive?

    Also, the if toString is providing the exitValue then it should be
    identified as "exitValue", not exitCode.
    the isAlive value should be identified as "isAlive".
    The implementation class should not be exposed.  (remove
    this.getClass().getSimpleName()).

    The performance of what seems like a simple toString method is not
    going
    to be great
    because of the native calls necessary to determine if the process is
    alive (called twice)
    and in the case of exitValue to handle the IllegalStateException.

    Some of the overhead could be avoided, by implementing toString in
    each
    of the ProcessImpl.java
    files where the current state is known more conveniently with less
    overhead.

    $.02, Roger


    On 5/8/2016 2:47 PM, Andrey Dyachkov wrote:
    > Hello,
    >
    > I have added toString() method in Process.java.
    >
    > diff --git a/src/java.base/share/classes/java/lang/Process.java
    > b/src/java.base/share/classes/java/lang/Process.java
    > --- a/src/java.base/share/classes/java/lang/Process.java
    > +++ b/src/java.base/share/classes/java/lang/Process.java
    > @@ -548,5 +548,16 @@
    >           return toHandle().descendants();
    >       }
    >
    > +    @Override
    > +    public String toString() {
    > +        boolean isAlive = this.isAlive();
    > +        return new
    > StringBuilder(this.getClass().getSimpleName()).append("[")
    > + .append("running=").append(isAlive).append(", ")
    > +                        .append(isAlive ? "pid=" : "exitCode=")
    > +                        .append(isAlive ? this.getPid() :
    this.exitValue())
    > +                        .append("]")
    > +                        .toString();
    > +    }
    > +
    >
    >   }

--

With great enthusiasm,
Andrey

Reply via email to