src/share/vm/memory/allocation.hpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 6973963 Cdiff src/share/vm/memory/allocation.hpp

src/share/vm/memory/allocation.hpp

Print this page

        

*** 314,349 **** // ResourceObj's can be allocated within other objects, but don't use // new or delete (allocation_type is unknown). If new is used to allocate, // use delete to deallocate. class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { public: ! enum allocation_type { UNKNOWN = 0, C_HEAP, RESOURCE_AREA, ARENA }; #ifdef ASSERT private: ! allocation_type _allocation; public: ! bool allocated_on_C_heap() { return _allocation == C_HEAP; } #endif // ASSERT public: void* operator new(size_t size, allocation_type type); void* operator new(size_t size, Arena *arena) { address res = (address)arena->Amalloc(size); ! // Set allocation type in the resource object ! DEBUG_ONLY(((ResourceObj *)res)->_allocation = ARENA;) return res; } void* operator new(size_t size) { address res = (address)resource_allocate_bytes(size); ! // Set allocation type in the resource object ! DEBUG_ONLY(((ResourceObj *)res)->_allocation = RESOURCE_AREA;) return res; } void* operator new(size_t size, void* where, allocation_type type) { ! void* res = where; ! // Set allocation type in the resource object ! DEBUG_ONLY(((ResourceObj *)res)->_allocation = type;) return res; } void operator delete(void* p); }; --- 314,368 ---- // ResourceObj's can be allocated within other objects, but don't use // new or delete (allocation_type is unknown). If new is used to allocate, // use delete to deallocate. class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { public: ! enum allocation_type { RESOURCE_AREA = 0, C_HEAP, ARENA, allocation_mask = 0x3 }; #ifdef ASSERT private: ! // When this object is allocated on stack the new() operator is not ! // called but garbage on stack may look like a valid allocation_type. ! // Store negated 'this' pointer when new() is called to distinguish cases. ! uintptr_t _allocation; ! static void set_allocation_type(address res, allocation_type type) { ! // Set allocation type in the resource object ! uintptr_t allocation = (uintptr_t)res; ! assert((allocation & allocation_mask) == 0, ""); ! assert(type < allocation_mask, ""); ! ((ResourceObj *)res)->_allocation = ~(allocation + type); ! } ! allocation_type get_allocation_type() { ! return (allocation_type)((~_allocation) & allocation_mask); ! } public: ! bool allocated_on_stack() { return get_allocation_type() == RESOURCE_AREA; } ! bool allocated_on_C_heap() { return get_allocation_type() == C_HEAP; } ! bool allocated_on_arena() { return get_allocation_type() == ARENA; } ! ResourceObj() { ! if (~(_allocation | allocation_mask) != (uintptr_t)this) { ! set_allocation_type((address)this, RESOURCE_AREA); ! } else { ! assert(allocated_on_stack() || allocated_on_C_heap() || allocated_on_arena(), ""); ! } ! } #endif // ASSERT public: void* operator new(size_t size, allocation_type type); void* operator new(size_t size, Arena *arena) { address res = (address)arena->Amalloc(size); ! DEBUG_ONLY(set_allocation_type(res, ARENA);) return res; } void* operator new(size_t size) { address res = (address)resource_allocate_bytes(size); ! DEBUG_ONLY(set_allocation_type(res, RESOURCE_AREA);) return res; } void* operator new(size_t size, void* where, allocation_type type) { ! address res = (address)where; ! DEBUG_ONLY(set_allocation_type(res, C_HEAP);) return res; } void operator delete(void* p); };
src/share/vm/memory/allocation.hpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File