RFR(L): 8185265 [MVT] improve performance of return of value types with new calling convention

Tobias Hartmann tobias.hartmann at oracle.com
Thu Aug 10 10:59:59 UTC 2017


Hi Roland,

unfortunately, it still fails.

Best regards,
Tobias

On 10.08.2017 12:26, Roland Westrelin wrote:
> 
>>   >> I've run this through JPRT and found the following crash during class unloading with some internal test on Solaris and
>>   >> Windows:
>>   >
>>   > Is it because just allocated metadata is not zeroed (patch below)? Not
>>   > sure if it is or not but I don't see any code that clears it.
>>
>> Unfortunately, the problem persists.
> 
> Thanks for giving it another try. Maybe a double free for some reason
> (see patch below)?
> 
> Roland.
> 
> diff --git a/src/share/vm/oops/valueKlass.cpp b/src/share/vm/oops/valueKlass.cpp
> --- a/src/share/vm/oops/valueKlass.cpp
> +++ b/src/share/vm/oops/valueKlass.cpp
> @@ -344,6 +344,11 @@
>   }
>   
>   void ValueKlass::initialize_calling_convention() {
> +  *((Array<SigEntry>**)adr_extended_sig()) = NULL;
> +  *((Array<VMRegPair>**)adr_return_regs()) = NULL;
> +  *((address*)adr_pack_handler()) = NULL;
> +  *((address*)adr_unpack_handler()) = NULL;
> +
>     if (ValueTypeReturnedAsFields || ValueTypePassFieldsAsArgs) {
>       Thread* THREAD = Thread::current();
>       assert(!HAS_PENDING_EXCEPTION, "should have no exception");
> @@ -387,11 +392,7 @@
>     if (return_regs() != NULL) {
>       MetadataFactory::free_array<VMRegPair>(loader_data, return_regs());
>     }
> -  if (pack_handler() != NULL) {
> -    CodeBlob* buffered_blob = CodeCache::find_blob(pack_handler());
> -    assert(buffered_blob->is_buffered_value_type_blob(), "bad blob type");
> -    BufferBlob::free((BufferBlob*)buffered_blob);
> -  }
> +  cleanup_blobs();
>     InstanceKlass::deallocate_contents(loader_data);
>   }
>   
> @@ -405,6 +406,8 @@
>       CodeBlob* buffered_blob = CodeCache::find_blob(pack_handler());
>       assert(buffered_blob->is_buffered_value_type_blob(), "bad blob type");
>       BufferBlob::free((BufferBlob*)buffered_blob);
> +    *((address*)adr_pack_handler()) = NULL;
> +    *((address*)adr_unpack_handler()) = NULL;
>     }
>   }
>   
> 


More information about the valhalla-dev mailing list