RFR (L) JDK-8195100: Use a low latency hashtable for SymbolTable
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Thu Aug 2 17:08:14 UTC 2018
On 8/2/18 12:26 PM, Ioi Lam wrote:
>
>
> On 8/2/18 8:44 AM, Gerard Ziemski wrote:
>>> On Aug 2, 2018, at 10:40 AM, Ioi Lam <ioi.lam at oracle.com> wrote:
>>>
>>>
>>>
>>> On 8/2/18 8:26 AM, Gerard Ziemski wrote:
>>>>> symbolTable.cpp:
>>>>>
>>>>> 342 // Otherwise, add the symbol to table. Copy to a C string
>>>>> first.
>>>>> 343 char stack_buf[ON_STACK_BUFFER_LENGTH];
>>>>> 344 ResourceMark rm(THREAD);
>>>>> 345 if (len <= ON_STACK_BUFFER_LENGTH) {
>>>>> 346 buffer = stack_buf;
>>>>> 347 } else {
>>>>> 348 buffer = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
>>>>> 349 }
>>>>> 350 for (int i=0; i<len; i++) {
>>>>> 351 buffer[i] = name[i];
>>>>> 352 }
>>>>> 353 // Make sure there is no safepoint in the code above since
>>>>> name can't move.
>>>>> 354 // We can't include the code in NoSafepointVerifier
>>>>> because of the
>>>>> 355 // ResourceMark.
>>>>>
>>>>> The above is dead code and should be removed.
>>>> That’s not dead code, but in fact you did find an issue here - we
>>>> should be using the “buffer”, not “name” when we add to the table.
>>>> Thanks!
>>>>
>>>>
>>> Why do you need to make a copy here? buffer and name seems to have
>>> the exact same contents.
>> I didn’t write that code, but I assume the name comes in some temp
>> memory that can go away at any time, so we need a solid copy.
>>
>>
>> cheers
>>
> This function is called only from two places. In both cases, the input
> Symbol won't go away
>
> Symbol* SignatureStream::as_symbol(TRAPS) {
> // Create a symbol from for string _begin _end
> int begin = _begin;
> int end = _end;
>
> if ( _signature->byte_at(_begin) == 'L'
> && _signature->byte_at(_end-1) == ';') {
> begin++;
> end--;
> }
>
> // Save names for cleaning up reference count at the end of
> // SignatureStream scope.
> Symbol* name = SymbolTable::new_symbol(_signature, begin, end,
> CHECK_NULL);
> _names->push(name); // save new symbol for decrementing later
> return name;
> }
>
> Symbol* ClassVerifier::create_temporary_symbol(const Symbol *s, int
> begin,
> int end, TRAPS) {
> Symbol* sym = SymbolTable::new_symbol(s, begin, end, CHECK_NULL);
> _symbols->push(sym);
> return sym;
> }
>
> Also, the "name" was used just a few lines above in the lookup, so if
> this was ever a issue, that lookup would fail as well.
>
> Mercurial history shows that this function has not had any meaningful
> change since it was imported from SCCS in 2007, so I think it's just a
> case of bit rot and the dead code can be safely removed.
I don't like the concept of one Symbol pointing into a substring of
another Symbol. If the latter goes away, then the former will point to
deallocated memory. Can we examine this outside this change to see if
the lifetime of the substring Symbol is completely contained in the
superstring Symbol?
thanks,
Coleen
>
> Thanks
> - Ioi
More information about the hotspot-runtime-dev
mailing list