Mercurial > hg > truffle
comparison src/share/vm/memory/allocation.hpp @ 1689:f4f596978298
Merge
author | never |
---|---|
date | Mon, 09 Aug 2010 17:51:56 -0700 |
parents | 126ea7725993 2dfd013a7465 |
children | 894b1d7c7e01 |
comparison
equal
deleted
inserted
replaced
1681:126ea7725993 | 1689:f4f596978298 |
---|---|
315 // ResourceObj's can be allocated within other objects, but don't use | 315 // ResourceObj's can be allocated within other objects, but don't use |
316 // new or delete (allocation_type is unknown). If new is used to allocate, | 316 // new or delete (allocation_type is unknown). If new is used to allocate, |
317 // use delete to deallocate. | 317 // use delete to deallocate. |
318 class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { | 318 class ResourceObj ALLOCATION_SUPER_CLASS_SPEC { |
319 public: | 319 public: |
320 enum allocation_type { UNKNOWN = 0, C_HEAP, RESOURCE_AREA, ARENA }; | 320 enum allocation_type { STACK_OR_EMBEDDED = 0, RESOURCE_AREA, C_HEAP, ARENA, allocation_mask = 0x3 }; |
321 static void set_allocation_type(address res, allocation_type type) NOT_DEBUG_RETURN; | |
321 #ifdef ASSERT | 322 #ifdef ASSERT |
322 private: | 323 private: |
323 allocation_type _allocation; | 324 // When this object is allocated on stack the new() operator is not |
324 public: | 325 // called but garbage on stack may look like a valid allocation_type. |
325 bool allocated_on_C_heap() { return _allocation == C_HEAP; } | 326 // Store negated 'this' pointer when new() is called to distinguish cases. |
327 uintptr_t _allocation; | |
328 public: | |
329 allocation_type get_allocation_type() const; | |
330 bool allocated_on_stack() const { return get_allocation_type() == STACK_OR_EMBEDDED; } | |
331 bool allocated_on_res_area() const { return get_allocation_type() == RESOURCE_AREA; } | |
332 bool allocated_on_C_heap() const { return get_allocation_type() == C_HEAP; } | |
333 bool allocated_on_arena() const { return get_allocation_type() == ARENA; } | |
334 ResourceObj(); // default construtor | |
335 ResourceObj(const ResourceObj& r); // default copy construtor | |
336 ResourceObj& operator=(const ResourceObj& r); // default copy assignment | |
337 ~ResourceObj(); | |
326 #endif // ASSERT | 338 #endif // ASSERT |
327 | 339 |
328 public: | 340 public: |
329 void* operator new(size_t size, allocation_type type); | 341 void* operator new(size_t size, allocation_type type); |
330 void* operator new(size_t size, Arena *arena) { | 342 void* operator new(size_t size, Arena *arena) { |
331 address res = (address)arena->Amalloc(size); | 343 address res = (address)arena->Amalloc(size); |
332 // Set allocation type in the resource object | 344 DEBUG_ONLY(set_allocation_type(res, ARENA);) |
333 DEBUG_ONLY(((ResourceObj *)res)->_allocation = ARENA;) | |
334 return res; | 345 return res; |
335 } | 346 } |
336 void* operator new(size_t size) { | 347 void* operator new(size_t size) { |
337 address res = (address)resource_allocate_bytes(size); | 348 address res = (address)resource_allocate_bytes(size); |
338 // Set allocation type in the resource object | 349 DEBUG_ONLY(set_allocation_type(res, RESOURCE_AREA);) |
339 DEBUG_ONLY(((ResourceObj *)res)->_allocation = RESOURCE_AREA;) | |
340 return res; | |
341 } | |
342 void* operator new(size_t size, void* where, allocation_type type) { | |
343 void* res = where; | |
344 // Set allocation type in the resource object | |
345 DEBUG_ONLY(((ResourceObj *)res)->_allocation = type;) | |
346 return res; | 350 return res; |
347 } | 351 } |
348 void operator delete(void* p); | 352 void operator delete(void* p); |
349 }; | 353 }; |
350 | 354 |