[Fwd: Request for reviews (M): 6973963: SEGV in ciBlock::start_bci() with EA]
Vladimir Kozlov
vladimir.kozlov at oracle.com
Tue Aug 3 18:33:38 UTC 2010
I updated webrev
http://cr.openjdk.java.net/~kvn/6973963/webrev.02
I added 'virtual' to ~ResourceObj() to avoid any surprises as Dave pointed.
I save/restore allocation type around Copy::fill_to_bytes() in ~CodeBuffer() to solve my problem.
Vladimir
David Holmes wrote:
> Vladimir Kozlov said the following on 08/03/10 19:33:
>> On 8/2/10 11:23 PM, David Holmes wrote:
>>> src/share/vm/asm/codeBuffer.cpp
>>>
>>> + void CodeBuffer::operator delete(void* p) {
>>> + ResourceObj::operator delete(p);
>>> #ifdef ASSERT
>>> ! Copy::fill_to_bytes(p, sizeof(CodeBuffer), badResourceValue);
>>> #endif
>>> }
>>>
>>> You moved the copy from the destructor to operator delete, but now
>>> you access p after you have deleted it.
>>
>> Yes, you are right. But CodeBuffer is never allocated on C heap and
>> ResourceObj::delete(p)
>> should be called only for allocation on C_HEAP. So this code should
>> never be executed,
>
> I'm confused. CodeBuffer is a StackObj, not a ResourceObj, so why would
> you call ResourceObj::delete in the first place ??
>
>> I will replace it with ShouldNotCallThis() in CodeBuffer::delete(void*
>> p).
>> Which leaves the original problem: I need to find how to zap
>> CodeBuffer after ResourceObj destructor
>> which is called after CodeBuffer destructor.
>
> Again I'm missing something - what is the connection between CodeBuffer
> and ResourceObj ?
>
>> Note: the problem here is not CodeBuffer but its field: OopRecorder
>> _default_oop_recorder;
>
> Explain that to me off-list if you like, I'm not familiar with this part
> of the code.
>
>>> src/share/vm/memory/allocation.hpp
>>>
>>> ! ~ResourceObj();
>>>
>>> You've added a destructor, but subclasses define their own
>>> destructors - so doesn't this need to be virtual?
>>
>> Constructor and destructor are special methods. Super class's default
>> destructor are always called from
>> subclass's destructor. The only case when you need to declare it as
>> virtual if subclass object is assigned to
>> local/field of super class type and compiler does not know what the
>> original subclass was.
>>
>> ResourceObj *f = new OopRecorder();
>> ...
>> delete f;
>>
>> We don't use such constructions.
>
> Ok. Just wanted to check. In another codebase we got bitten by a cleanup
> method in the superclass that did "delete this;" which did not invoke
> the destructor for the dynamic type of 'this' because the destructor was
> not virtual.
>
> Cheers,
> David
More information about the hotspot-gc-dev
mailing list