RFR: 8000975: (process) Merge UNIXProcess.java.bsd & UNIXProcess.java.linux (& .solaris & .aix)

Rob McKenna rob.mckenna at oracle.com
Mon May 12 16:06:24 UTC 2014


Great to see this getting in. Thanks Peter!

     -Rob

On 12/05/14 16:51, Peter Levart wrote:
> On 05/07/2014 11:04 PM, Martin Buchholz wrote:
>> Hi Peter,
>>
>> Your last version version looks very good.  Approved!  I'm reduced to 
>> asking you to fix ancient buglets of mine.
>>
>> *"I'd spell creat with an e.*"
>>
>>
>>   188      * Create a process. Depending on the mode flag, this is done by
>> *"I'd spell Create with an s.*"
>>
>>
>>
>
> Alan, Martin, Roger, thank you for your patience in reviewing this. 
> Thanks also to Paul, David M., Rob and Volker for comments and 
> testing. I have just pushed this changeset to jdk9-dev with a little 
> javadoc tweak on a private native method suggested by Martin, fixing 
> also the description of the 'mode' parameter to be in-sync with what 
> it really means in native code.
>
> We can take this as a basis for consolidating some more code after 
> some bake-in time...
>
> Regards, Peter
>
>>
>>
>>
>> On Wed, May 7, 2014 at 12:42 AM, Peter Levart <peter.levart at gmail.com 
>> <mailto:peter.levart at gmail.com>> wrote:
>>
>>     Hi Martin,
>>
>>     I have restructured the processReaperExecutor construction. It
>>     now incorporates system thread group search and thread pool
>>     construction in one doPrivileged call. I also extracted the
>>     creation of ThreadFactory into a local variable so it's more
>>     explicit now. Here's the webrev:
>>
>>     http://cr.openjdk.java.net/~plevart/jdk9-dev/UNIXProcess/webrev.09/
>>     <http://cr.openjdk.java.net/%7Eplevart/jdk9-dev/UNIXProcess/webrev.09/>
>>
>>     ...java/lang/ProcessBuilder tests still pass.
>>
>>     Regards, Peter
>>
>>     P.S. I don't belive Executors.newCachedTreadPool() could
>>     strengthen security in future, since this would break existing
>>     user code. The javadoc does not specify any SecurityExceptions.
>>     But anyway - wrapping the whole logic of processReaperExecutor
>>     construction in one doPrivileged call allowed me to use local
>>     variables instead of private static final fields for
>>     systemThreadGroup and threadFactory, so this looks nicer too.
>>
>>
>>
>>     On 05/06/2014 07:41 PM, Martin Buchholz wrote:
>>>
>>>
>>>
>>>     On Sun, May 4, 2014 at 3:26 AM, Peter Levart
>>>     <peter.levart at gmail.com <mailto:peter.levart at gmail.com>> wrote:
>>>
>>>
>>>         Ah, I've forgotten to mention the most important change from
>>>         webrev.07.
>>>
>>>         Original code wraps the processReaperExecutor construction
>>>         into the doPrivileged() call. I think this was not needed.
>>>
>>>         The Executors.newCachedThreadPool() does not need any
>>>         special privileges. And construction of nested class
>>>         ProcessReaperThreadFactory also didn't need any special
>>>         privileges - apart from static initialization which called
>>>         the getRootThreadGroup() method. But that method did it's
>>>         own doPrivileged() wrapping in order to be able to climb the
>>>         ThreadGroup hierarchy (which requires privilege). In
>>>         webrev.07 I followed original code and wrapped the
>>>         construction of a processReaperExecutor into a
>>>         doPrivileged() although in webrev.07 the rootThreadGroup
>>>         search happens as part of UNIXProcess static initialization
>>>         and is already wrapped in doPrivileged(). In webrev.08 I
>>>         removed this superfluous doPrivileged(). I think this is
>>>         correct. SecurityManagerClinit test passes.
>>>
>>>
>>>     Although I think you're right with the current implementation,
>>>     it seems too brittle to me to remove the doPrivileged, since you
>>>     have no idea what future changes to newCachedThreadPool() might
>>>     do (or what other JDK implementations might do); notably it
>>>     might instantiate some kind of micro-manager thread or do some
>>>     other privileged operation.
>>>
>>>     If you want to have only one call to doPrivileged, you can cause
>>>     both rootThreadGroup and processReaperExecutor to be initialized
>>>     in one static block, although you will need to jump through some
>>>     hoops to keep these fields final.
>>>
>>>     ---
>>>
>>>     As it stands,
>>>
>>>     Executors.newCachedThreadPool(grimReaper -> {
>>>
>>>     doesn't mention either the type ThreadFactory or Runnable.
>>>
>>>     It might be clearer (more verbosity in the spirit of Java) if
>>>     you used explicit ThreadFactory type
>>>
>>>     ThreadFactory factory = grimReaper -> ...
>>
>>
>




More information about the core-libs-dev mailing list