OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 30 matching lines...) Expand all Loading... |
41 #include "wtf/Allocator.h" | 41 #include "wtf/Allocator.h" |
42 #include "wtf/Assertions.h" | 42 #include "wtf/Assertions.h" |
43 #include "wtf/Atomics.h" | 43 #include "wtf/Atomics.h" |
44 #include "wtf/Forward.h" | 44 #include "wtf/Forward.h" |
45 | 45 |
46 namespace blink { | 46 namespace blink { |
47 | 47 |
48 class PLATFORM_EXPORT HeapAllocHooks { | 48 class PLATFORM_EXPORT HeapAllocHooks { |
49 public: | 49 public: |
50 // TODO(hajimehoshi): Pass a type name of the allocated object. | 50 // TODO(hajimehoshi): Pass a type name of the allocated object. |
51 typedef void AllocationHook(Address, size_t); | 51 typedef void AllocationHook(Address, size_t, const char*); |
52 typedef void FreeHook(Address); | 52 typedef void FreeHook(Address); |
53 | 53 |
54 static void setAllocationHook(AllocationHook* hook) { m_allocationHook = hoo
k; } | 54 static void setAllocationHook(AllocationHook* hook) { m_allocationHook = hoo
k; } |
55 static void setFreeHook(FreeHook* hook) { m_freeHook = hook; } | 55 static void setFreeHook(FreeHook* hook) { m_freeHook = hook; } |
56 | 56 |
57 static void allocationHookIfEnabled(Address address, size_t size) | 57 static void allocationHookIfEnabled(Address address, size_t size, const char
* typeName) |
58 { | 58 { |
59 AllocationHook* allocationHook = m_allocationHook; | 59 AllocationHook* allocationHook = m_allocationHook; |
60 if (UNLIKELY(!!allocationHook)) | 60 if (UNLIKELY(!!allocationHook)) |
61 allocationHook(address, size); | 61 allocationHook(address, size, typeName); |
62 } | 62 } |
63 | 63 |
64 static void freeHookIfEnabled(Address address) | 64 static void freeHookIfEnabled(Address address) |
65 { | 65 { |
66 FreeHook* freeHook = m_freeHook; | 66 FreeHook* freeHook = m_freeHook; |
67 if (UNLIKELY(!!freeHook)) | 67 if (UNLIKELY(!!freeHook)) |
68 freeHook(address); | 68 freeHook(address); |
69 } | 69 } |
70 | 70 |
71 static void reallocHookIfEnabled(Address oldAddress, Address newAddress, siz
e_t size) | 71 static void reallocHookIfEnabled(Address oldAddress, Address newAddress, siz
e_t size, const char* typeName) |
72 { | 72 { |
73 // Report a reallocation as a free followed by an allocation. | 73 // Report a reallocation as a free followed by an allocation. |
74 AllocationHook* allocationHook = m_allocationHook; | 74 AllocationHook* allocationHook = m_allocationHook; |
75 FreeHook* freeHook = m_freeHook; | 75 FreeHook* freeHook = m_freeHook; |
76 if (UNLIKELY(allocationHook && freeHook)) { | 76 if (UNLIKELY(allocationHook && freeHook)) { |
77 freeHook(oldAddress); | 77 freeHook(oldAddress); |
78 allocationHook(newAddress, size); | 78 allocationHook(newAddress, size, typeName); |
79 } | 79 } |
80 } | 80 } |
81 | 81 |
82 private: | 82 private: |
83 static AllocationHook* m_allocationHook; | 83 static AllocationHook* m_allocationHook; |
84 static FreeHook* m_freeHook; | 84 static FreeHook* m_freeHook; |
85 }; | 85 }; |
86 | 86 |
87 class CrossThreadPersistentRegion; | 87 class CrossThreadPersistentRegion; |
88 template<typename T> class Member; | 88 template<typename T> class Member; |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 ASSERT(heapIndex != BlinkGC::LargeObjectHeapIndex); | 489 ASSERT(heapIndex != BlinkGC::LargeObjectHeapIndex); |
490 NormalPageHeap* heap = static_cast<NormalPageHeap*>(state->heap(heapIndex)); | 490 NormalPageHeap* heap = static_cast<NormalPageHeap*>(state->heap(heapIndex)); |
491 return heap->allocateObject(allocationSizeFromSize(size), gcInfoIndex); | 491 return heap->allocateObject(allocationSizeFromSize(size), gcInfoIndex); |
492 } | 492 } |
493 | 493 |
494 template<typename T> | 494 template<typename T> |
495 Address Heap::allocate(size_t size, bool eagerlySweep) | 495 Address Heap::allocate(size_t size, bool eagerlySweep) |
496 { | 496 { |
497 ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state(); | 497 ThreadState* state = ThreadStateFor<ThreadingTrait<T>::Affinity>::state(); |
498 Address address = Heap::allocateOnHeapIndex(state, size, eagerlySweep ? Blin
kGC::EagerSweepHeapIndex : Heap::heapIndexForObjectSize(size), GCInfoTrait<T>::i
ndex()); | 498 Address address = Heap::allocateOnHeapIndex(state, size, eagerlySweep ? Blin
kGC::EagerSweepHeapIndex : Heap::heapIndexForObjectSize(size), GCInfoTrait<T>::i
ndex()); |
499 HeapAllocHooks::allocationHookIfEnabled(address, size); | 499 const char* typeName = WTF_HEAP_PROFILER_TYPE_NAME(T); |
| 500 HeapAllocHooks::allocationHookIfEnabled(address, size, typeName); |
500 return address; | 501 return address; |
501 } | 502 } |
502 | 503 |
503 template<typename T> | 504 template<typename T> |
504 Address Heap::reallocate(void* previous, size_t size) | 505 Address Heap::reallocate(void* previous, size_t size) |
505 { | 506 { |
506 // Not intended to be a full C realloc() substitute; | 507 // Not intended to be a full C realloc() substitute; |
507 // realloc(nullptr, size) is not a supported alias for malloc(size). | 508 // realloc(nullptr, size) is not a supported alias for malloc(size). |
508 | 509 |
509 // TODO(sof): promptly free the previous object. | 510 // TODO(sof): promptly free the previous object. |
(...skipping 13 matching lines...) Expand all Loading... |
523 heapIndex = heapIndexForObjectSize(size); | 524 heapIndex = heapIndexForObjectSize(size); |
524 | 525 |
525 // TODO(haraken): We don't support reallocate() for finalizable objects. | 526 // TODO(haraken): We don't support reallocate() for finalizable objects. |
526 ASSERT(!Heap::gcInfo(previousHeader->gcInfoIndex())->hasFinalizer()); | 527 ASSERT(!Heap::gcInfo(previousHeader->gcInfoIndex())->hasFinalizer()); |
527 ASSERT(previousHeader->gcInfoIndex() == GCInfoTrait<T>::index()); | 528 ASSERT(previousHeader->gcInfoIndex() == GCInfoTrait<T>::index()); |
528 Address address = Heap::allocateOnHeapIndex(state, size, heapIndex, GCInfoTr
ait<T>::index()); | 529 Address address = Heap::allocateOnHeapIndex(state, size, heapIndex, GCInfoTr
ait<T>::index()); |
529 size_t copySize = previousHeader->payloadSize(); | 530 size_t copySize = previousHeader->payloadSize(); |
530 if (copySize > size) | 531 if (copySize > size) |
531 copySize = size; | 532 copySize = size; |
532 memcpy(address, previous, copySize); | 533 memcpy(address, previous, copySize); |
533 HeapAllocHooks::reallocHookIfEnabled(static_cast<Address>(previous), address
, size); | 534 const char* typeName = WTF_HEAP_PROFILER_TYPE_NAME(T); |
| 535 HeapAllocHooks::reallocHookIfEnabled(static_cast<Address>(previous), address
, size, typeName); |
534 return address; | 536 return address; |
535 } | 537 } |
536 | 538 |
537 template<typename Derived> | 539 template<typename Derived> |
538 template<typename T> | 540 template<typename T> |
539 void VisitorHelper<Derived>::handleWeakCell(Visitor* self, void* object) | 541 void VisitorHelper<Derived>::handleWeakCell(Visitor* self, void* object) |
540 { | 542 { |
541 T** cell = reinterpret_cast<T**>(object); | 543 T** cell = reinterpret_cast<T**>(object); |
542 if (*cell && !ObjectAliveTrait<T>::isHeapObjectAlive(*cell)) | 544 if (*cell && !ObjectAliveTrait<T>::isHeapObjectAlive(*cell)) |
543 *cell = nullptr; | 545 *cell = nullptr; |
544 } | 546 } |
545 | 547 |
546 } // namespace blink | 548 } // namespace blink |
547 | 549 |
548 #endif // Heap_h | 550 #endif // Heap_h |
OLD | NEW |