RFR (S): 8230395: Code checks for NULL value returned from NEW_C_HEAP_ARRAY which can not happen
David Holmes
david.holmes at oracle.com
Thu Sep 19 21:58:58 UTC 2019
Adding hotspot-jfr-dev list as I just realized this os_perf code belongs
to JFR.
I filed:
https://bugs.openjdk.java.net/browse/JDK-8231271
as a follow up, but the logic was changed to always return true in JDK 11.
David
On 20/09/2019 7:39 am, David Holmes wrote:
> (adding back hotspot-compiler-dev)
>
> Hi Harold,
>
> On 20/09/2019 12:14 am, Harold Seigel wrote:
>> Hi David,
>>
>> The change looks good.
>
> Thanks for taking a look.
>
>> Can CPUInformationInterface::initialize() be changed to return void?
>> It looks like it will now always returns TRUE.
>
> It currently appears that way, however:
>
> 1. There is a common pattern for all these XXXInterface classes to
> include a "bool initialize()" method. This allows them to all be handled
> consistently e.g. the JFR code has this:
>
> template <typename T>
> static T* create_interface() {
> ResourceMark rm;
> T* iface = new T();
> if (iface != NULL) {
> if (!iface->initialize()) {
> delete iface;
> iface = NULL;
> }
> }
> return iface;
> }
>
> which would break if we changed the signature for one.
>
> 2. I think the Windows version is broken and returning true when it
> should be returning false! Certainly this logic makes no sense to me:
>
> bool CPUPerformanceInterface::CPUPerformance::initialize() {
> if (!pdh_acquire()) {
> return true;
> }
> _context_switches = create_counter_query(PDH_SYSTEM_IDX,
> PDH_CONTEXT_SWITCH_RATE_IDX);
> _process_cpu_load = create_process_query();
> if (_process_cpu_load == NULL) {
> return true;
> }
> allocate_counters(_process_cpu_load, 2);
> if (initialize_process_counter(_process_cpu_load, 0,
> PDH_PROCESSOR_TIME_IDX) != OS_OK) {
> return true;
> }
> if (initialize_process_counter(_process_cpu_load, 1,
> PDH_PRIV_PROCESSOR_TIME_IDX) != OS_OK) {
> return true;
> }
> _process_cpu_load->set.initialized = true;
> _machine_cpu_load = create_multi_counter_query();
> if (_machine_cpu_load == NULL) {
> return true;
> }
> initialize_cpu_query(_machine_cpu_load, PDH_PROCESSOR_TIME_IDX);
> return true;
> }
>
> I'll file a bug for Windows. :)
>
> Thanks,
> David
> -----
>
>> Thanks, Harold
>>
>> On 9/19/2019 1:57 AM, David Holmes wrote:
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8230395
>>> webrev: http://cr.openjdk.java.net/~dholmes/8230395/webrev/
>>>
>>> First, thanks to Leo for going through and finding the places that
>>> needed to be fixed. I didn't go looking for others.
>>>
>>> For the most part I have deleted the NULL checks. A few notes:
>>>
>>> - changed to NEW_C_HEAP_ARRAY_RETURN_NULL in a couple of places where
>>> it was more consistent with the general recoverability approach of
>>> the code in question (and did the opposite change in one place)
>>> - for the "perf" changes I also noticed that we were checking for
>>> NULL after doing "new SomeCHeapObj()" which also cannot return NULL,
>>> so removed those NULL checks too
>>> - the JVMCI thread counter changes became a bit more extensive due to
>>> the fact a boolean method could now only every return true. So it was
>>> changed to void and that had to filter all the way back up to the
>>> JVMCI Java API. The JVMCI/Graal folk need to approve this
>>>
>>> Testing: tier 1-3 sanity tests (in progress)
>>>
>>> Thanks,
>>> David
More information about the hotspot-jfr-dev
mailing list