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

Peter Levart peter.levart at gmail.com
Wed Apr 2 10:49:21 UTC 2014


On 04/01/2014 09:47 PM, roger riggs wrote:
> Hi,
>
> A minor point, but the Enum for LaunchMechanism can be simpler; the 
> defined enum values (1,2,3)
> are never used and can be removed along with the extra constructor.

They are used for the "mode" parameter of forkAndExec() native method.

>
> With the refactoring so f0ar, this seems more complex and harder to 
> understand.

Are you comparing webrev.03 with webrev.04 or original code with 
webrev.0[34] ?

I agree that one individual original source is simpler than merged 
single source, but there are 4 of them to be kept in-sync and still be 
different in places. I find it more convenient to see the differences in 
one place without using a diff tool pair-wisely. It's also friendlier to 
IDEs if they "understand" the code instead of just treating those 4 
files as texts. Some of the IDEs can be teached to understand the 
various (.java.bsd, .java.linux, .java.solaris, .java.aix) extensions as 
Java sources, but then they get confused because they see 4 sources for 
the same class...


> At least in the non-merged version all (and only) the code for a 
> platform was in a single class.
> The static UNIXProcess subclasses for the various platforms are always 
> kept around.

We could bring them to the upper level as package-private subclasses and 
arrange in makefile to just include the ones that are needed. But then 
this knowledge of mapping is in two places: the makefiles and the code.

>
> Other alternatives would have been to factor the common code (Streams 
> handling)
> into a utilities class or ProcessImpl and retain the 1st class 
> subclasses (with different names)
> for each platform or merge more up into ProcessImpl.
>
> Maybe it will be clearer with additional refactoring.

As I said, I believe the consolidation of various Input/OutputStream 
wrappers could bring the class files number and size further down.

>
> $.02, Roger

If you're concerned about class files included in the distributable, but 
not used, we can compensate this a bit by reducing the number of 
anonymous inner classes generated by javac just by replacing them with 
lambdas. Here's new webrev that does that too:

http://cr.openjdk.java.net/~plevart/jdk9-dev/UNIXProcess/webrev.05/

If UNIXProcess.java in above webrev is compiled, the following class 
files are produced:

-rw-rw-r--. 1 peter peter  772 Apr  2 12:33 UNIXProcess$1.class// 
SwitchMap for Platform enum
-rw-rw-r--. 1 peter peter 2706 Apr  2 12:33 UNIXProcess$AixProcess.class
-rw-rw-r--. 1 peter peter 2155 Apr  2 12:33 
UNIXProcess$DeferredCloseInputStream.class
-rw-rw-r--. 1 peter peter 2930 Apr  2 12:33 
UNIXProcess$DeferredCloseProcessPipeInputStream.class
-rw-rw-r--. 1 peter peter 1166 Apr  2 12:33 
UNIXProcess$LaunchMechanism.class
-rw-rw-r--. 1 peter peter 2701 Apr  2 12:33 
UNIXProcess$LinuxOrBsdProcess.class
-rw-rw-r--. 1 peter peter 4762 Apr  2 12:33 UNIXProcess$Platform.class
-rw-rw-r--. 1 peter peter 1711 Apr  2 12:33 
UNIXProcess$ProcessPipeInputStream.class
-rw-rw-r--. 1 peter peter  949 Apr  2 12:33 
UNIXProcess$ProcessPipeOutputStream.class
-rw-rw-r--. 1 peter peter 1902 Apr  2 12:33 
UNIXProcess$ProcessReaperThreadFactory.class
-rw-rw-r--. 1 peter peter 2935 Apr  2 12:33 UNIXProcess$SolarisProcess.class
-rw-rw-r--. 1 peter peter 6260 Apr  2 12:33 UNIXProcess.class

...12 class files totaling 30.2 KiB.

If original UNIXProcess.java.linux is compiled, for example, the 
following files are produced:

-rw-rw-r--. 1 peter peter 1648 Apr  2 12:25 UNIXProcess$1.class
-rw-rw-r--. 1 peter peter  926 Apr  2 12:25 UNIXProcess$2.class
-rw-rw-r--. 1 peter peter  865 Apr  2 12:25 UNIXProcess$3.class
-rw-rw-r--. 1 peter peter  648 Apr  2 12:25 UNIXProcess$4.class
-rw-rw-r--. 1 peter peter 1200 Apr  2 12:25 
UNIXProcess$LaunchMechanism.class
-rw-rw-r--. 1 peter peter 1711 Apr  2 12:25 
UNIXProcess$ProcessPipeInputStream.class
-rw-rw-r--. 1 peter peter  949 Apr  2 12:25 
UNIXProcess$ProcessPipeOutputStream.class
-rw-rw-r--. 1 peter peter  939 Apr  2 12:25 
UNIXProcess$ProcessReaperThreadFactory$1.class
-rw-rw-r--. 1 peter peter 1233 Apr  2 12:25 
UNIXProcess$ProcessReaperThreadFactory.class
-rw-rw-r--. 1 peter peter 5626 Apr  2 12:25 UNIXProcess.class

...10 class files totaling 15,4 KiB

So it's ~15 KiB that we are talking about at this moment.


Regards, Peter

>
>
> On 4/1/2014 1:04 PM, Peter Levart wrote:
>> On 04/01/2014 05:43 PM, Peter Levart wrote:
>>> On 04/01/2014 03:49 PM, roger riggs wrote:
>>>> Hi Peter,
>>>>
>>>> The design using enum for the os dependencies does not make it 
>>>> possible
>>>> to include only the support needed for a particular platform at 
>>>> build time.
>>>> Every implementation will be carrying around the support for all 
>>>> the other platforms.
>>>> A build time binding would be more efficient.
>>>>
>>>> Roger
>>>
>>> That's true. A trade-off between maintainability and efficiency. The 
>>> efficiency has two categories here. One is the size of the 
>>> distributable and the other is run-time efficiency. I've been 
>>> thinking to improve both efficiencies (the run-time in particular) 
>>> with a little re-design. Since nearly each OS platform requires a 
>>> sub-class of UNIXProcess to implement the differences, I can move 
>>> the implementations of various methods now in Os enum to the 
>>> UNIXProcess subclasses and get rid of Os enum per-instance subclasses.
>>>
>>> Let me try this and see what comes out.
>>
>> Hi Roger,
>>
>> Well, it turns out the methods would like to stay in Os (renamed to 
>> Platform), but there is no need for per-enum-instance subclasses. 
>> Using enum constructor parameters and switch statements makes code 
>> even more compact and easy to follow...
>>
>> http://cr.openjdk.java.net/~plevart/jdk9-dev/UNIXProcess/webrev.04/
>>
>>
>> I belive there is still room for consolidating logic in various 
>> Input/OutputStream wrappers used in UNIXProcess variants. But in the 
>> first round I tried to preserve the exact behaviour. If the wrapping 
>> of streams could be made more-or-less equal in all UNIX platforms, 
>> then the need for UNIXProcess subclasses and/or overhead of support 
>> classes included but not used goes away...
>>
>> Regards, Peter
>>
>>>
>>>>
>>>>
>>>>
>>>> On 4/1/2014 9:16 AM, Peter Levart wrote:
>>>>> Hi Alan, Volker,
>>>>>
>>>>> Thanks for sharing the info and for testing on AIX. Here's the 
>>>>> updated webrev that hopefully includes the correct "dispatch on 
>>>>> os.name" logic. I included "Solaris" as an alternative to "SunOS" 
>>>>> since I saw this in some documents on Internet. If this is 
>>>>> superfluous, I can remove it:
>>>>>
>>>>> http://cr.openjdk.java.net/~plevart/jdk9-dev/UNIXProcess/webrev.03/
>>>>>
>>>>> I tested this on Linux and Solaris and the 
>>>>> java/lang/ProcessBuilder jtreg tests pass. So with Volker's test 
>>>>> on AIX, the only OS platform left for testing is Mac OS X. Would 
>>>>> someone volunteer?
>>>>>
>>>>> Regards, Peter
>>>>>
>>>>> On 03/27/2014 11:18 AM, Volker Simonis wrote:
>>>>>> Hi Peter,
>>>>>>
>>>>>> thanks for applying these changes to the AIX files as well.
>>>>>>
>>>>>> With the additional line:
>>>>>>
>>>>>>              if (osName.equals("AIX")) { return AIX; }
>>>>>>
>>>>>> in Os.get() your change compiles cleanly on AIX and runs the
>>>>>> java/lang/ProcessBuilder tests without any errors.
>>>>>>
>>>>>> So from an AIX perspective, thumbs up.
>>>>>>
>>>>>> Regards,
>>>>>> Volker
>>>>>>
>>>>>>
>>>>>> On Wed, Mar 26, 2014 at 5:18 PM, Alan Bateman 
>>>>>> <Alan.Bateman at oracle.com> wrote:
>>>>>>> On 26/03/2014 15:19, Peter Levart wrote:
>>>>>>>> I couldn't find any official document about possible os.name 
>>>>>>>> values for
>>>>>>>> different supported OSes. Does anyone have a pointer?
>>>>>>> I don't know if there is a definite list but I assume we don't 
>>>>>>> need to be
>>>>>>> concerned with anything beyond the 4 that we have in OpenJDK, 
>>>>>>> which is
>>>>>>> "Linux", "SunOS", "AIX" and contains("OS X").
>>>>>>>
>>>>>>> If we get to the point in JDK 9 where src/solaris is renamed to 
>>>>>>> src/unix (or
>>>>>>> something equivalent) then it could mean that the Os enum can be 
>>>>>>> replaced
>>>>>>> with an OS specific class in src/linux, src/solaris, ... and 
>>>>>>> this would
>>>>>>> avoid the need for an os.name check at runtime.
>>>>>>>
>>>>>>> -Alan.
>>>>>>>
>>>>>
>>>>
>>>
>>
>




More information about the core-libs-dev mailing list