Changeset 144527 in webkit
- Timestamp:
- Mar 1, 2013 9:23:18 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r144498 r144527 1 2013-03-01 Ilya Tikhonovsky <loislo@chromium.org> 2 3 Web Inspector: Native Memory Instrumentation: do not visit raw pointers by default. 4 https://bugs.webkit.org/show_bug.cgi?id=110943 5 6 Reviewed by Yury Semikhatsky. 7 8 Unfortunately in many cases raw pointer may point to an object that has been deleted. 9 There is no working solution to solve this problem in general. 10 It could be solved only on case by case basis. 11 12 * wtf/MemoryInstrumentation.h: 13 (WTF::MemoryInstrumentation::addObject): 14 (WTF::MemoryInstrumentation::MemberTypeTraits::addObject): 15 (WTF::MemoryClassInfo::addMember): 16 (WTF::MemoryInstrumentation::addObjectImpl): 17 * wtf/MemoryInstrumentationString.h: 18 (WTF::reportMemoryUsage): 19 1 20 2013-03-01 Eric Seidel <eric@webkit.org> 2 21 -
trunk/Source/WTF/wtf/MemoryInstrumentation.h
r143913 r144527 49 49 PointerMember, 50 50 ReferenceMember, 51 OwnPtrMember, 52 RefPtrMember, 51 RetainingPointer, 53 52 LastMemberTypeEntry 54 53 }; … … 168 167 }; 169 168 170 template<typename T> void addObject(const T& t, MemoryObjectInfo* ownerObjectInfo, const char* edgeName) { MemberTypeTraits<T>::addObject(this, t, ownerObjectInfo, edgeName); } 169 template<typename T> void addObject(const T& t, MemoryObjectInfo* ownerObjectInfo, const char* edgeName, MemberType memberType) 170 { 171 MemberTypeTraits<T>::addObject(this, t, ownerObjectInfo, edgeName, memberType); 172 } 171 173 void addRawBuffer(const void* buffer, MemoryObjectType ownerObjectType, size_t size, const char* className = 0, const char* edgeName = 0) 172 174 { … … 180 182 template<typename T> 181 183 struct MemberTypeTraits { // Default ReferenceMember implementation. 182 static void addObject(MemoryInstrumentation* instrumentation, const T& t, MemoryObjectInfo* ownerObjectInfo, const char* edgeName )184 static void addObject(MemoryInstrumentation* instrumentation, const T& t, MemoryObjectInfo* ownerObjectInfo, const char* edgeName, MemberType) 183 185 { 184 186 instrumentation->addObjectImpl(&t, ownerObjectInfo, ReferenceMember, edgeName); … … 193 195 template<typename T> 194 196 struct MemberTypeTraits<T*> { // Custom PointerMember implementation. 195 static void addObject(MemoryInstrumentation* instrumentation, const T* const& t, MemoryObjectInfo* ownerObjectInfo, const char* edgeName )197 static void addObject(MemoryInstrumentation* instrumentation, const T* const& t, MemoryObjectInfo* ownerObjectInfo, const char* edgeName, MemberType memberType) 196 198 { 197 instrumentation->addObjectImpl(t, ownerObjectInfo, PointerMember, edgeName);199 instrumentation->addObjectImpl(t, ownerObjectInfo, memberType != LastMemberTypeEntry ? memberType : PointerMember, edgeName); 198 200 } 199 201 … … 238 240 } 239 241 240 template<typename M> void addMember(const M& member, const char* edgeName = 0 )242 template<typename M> void addMember(const M& member, const char* edgeName = 0, MemberType memberType = LastMemberTypeEntry) 241 243 { 242 244 if (!m_skipMembers) 243 m_memoryInstrumentation->addObject(member, m_memoryObjectInfo, edgeName );245 m_memoryInstrumentation->addObject(member, m_memoryObjectInfo, edgeName, memberType); 244 246 } 245 247 … … 285 287 void MemoryInstrumentation::addObjectImpl(const T* object, MemoryObjectInfo* ownerObjectInfo, MemberType memberType, const char* edgeName) 286 288 { 289 if (memberType == PointerMember) 290 return; 287 291 if (memberType == ReferenceMember) 288 292 reportMemoryUsage(object, ownerObjectInfo); … … 302 306 if (memberType == PointerMember && !visited(object)) 303 307 countObjectSize(object, getObjectType(ownerObjectInfo), sizeof(*object)); 304 addObjectImpl(object->get(), ownerObjectInfo, OwnPtrMember, edgeName);308 addObjectImpl(object->get(), ownerObjectInfo, RetainingPointer, edgeName); 305 309 } 306 310 … … 310 314 if (memberType == PointerMember && !visited(object)) 311 315 countObjectSize(object, getObjectType(ownerObjectInfo), sizeof(*object)); 312 addObjectImpl(object->get(), ownerObjectInfo, Re fPtrMember, edgeName);316 addObjectImpl(object->get(), ownerObjectInfo, RetainingPointer, edgeName); 313 317 } 314 318 -
trunk/Source/WTF/wtf/MemoryInstrumentationString.h
r141591 r144527 55 55 56 56 if (StringImpl* baseString = stringImpl->baseString()) 57 info.addMember(baseString, "baseString" );57 info.addMember(baseString, "baseString", RetainingPointer); 58 58 else { 59 59 if (stringImpl->hasOwnedBuffer()) … … 68 68 { 69 69 MemoryClassInfo info(memoryObjectInfo, string); 70 info.addMember(string->impl(), "stringImpl" );70 info.addMember(string->impl(), "stringImpl", RetainingPointer); 71 71 } 72 72 … … 85 85 { 86 86 MemoryClassInfo info(memoryObjectInfo, cString); 87 info.addMember(cString->buffer(), "buffer" );87 info.addMember(cString->buffer(), "buffer", RetainingPointer); 88 88 } 89 89 -
trunk/Source/WebCore/ChangeLog
r144526 r144527 1 2013-03-01 Ilya Tikhonovsky <loislo@chromium.org> 2 3 Web Inspector: Native Memory Instrumentation: do not visit raw pointers by default. 4 https://bugs.webkit.org/show_bug.cgi?id=110943 5 6 Reviewed by Yury Semikhatsky. 7 8 Unfortunately in many cases raw pointer may point to an object that has been deleted. 9 There is no working solution to solve this problem in general. 10 It could be solved only on case by case basis. 11 12 * inspector/HeapGraphSerializer.cpp: 13 (WebCore::HeapGraphSerializer::HeapGraphSerializer): 14 (WebCore::HeapGraphSerializer::reportLeaf): 15 * loader/cache/MemoryCache.cpp: 16 (WebCore::MemoryCache::reportMemoryUsage): 17 * platform/graphics/BitmapImage.cpp: 18 (WebCore::FrameData::reportMemoryUsage): 19 * platform/graphics/skia/MemoryInstrumentationSkia.cpp: 20 (reportMemoryUsage): 21 1 22 2013-03-01 Kentaro Hara <haraken@chromium.org> 2 23 -
trunk/Source/WebCore/inspector/HeapGraphSerializer.cpp
r143913 r144527 60 60 61 61 m_edgeTypes[WTF::PointerMember] = registerTypeString("weak"); 62 m_edgeTypes[WTF:: OwnPtrMember] = m_edgeTypes[WTF::RefPtrMember] = registerTypeString("property");62 m_edgeTypes[WTF::RetainingPointer] = registerTypeString("property"); 63 63 64 64 // FIXME: It is used as a magic constant for 'object' node type. … … 149 149 { 150 150 int nodeId = reportNodeImpl(info, 0); 151 reportEdgeImpl(nodeId, edgeName, m_edgeTypes[WTF:: OwnPtrMember]);151 reportEdgeImpl(nodeId, edgeName, m_edgeTypes[WTF::RetainingPointer]); 152 152 pushUpdateIfNeeded(); 153 153 } -
trunk/Source/WebCore/loader/cache/MemoryCache.cpp
r144446 r144527 801 801 info.addMember(m_allResources, "allResources"); 802 802 info.addMember(m_liveDecodedResources, "liveDecodedResources"); 803 #if !ENABLE(CACHE_PARTITIONING) 804 for (CachedResourceMap::const_iterator i = m_resources.begin(); i != m_resources.end(); ++i) 805 info.addMember(i->value, "cachedResourceItem", WTF::RetainingPointer); 806 #endif 803 807 } 804 808 -
trunk/Source/WebCore/platform/graphics/BitmapImage.cpp
r141637 r144527 592 592 info.addRawBuffer(m_frame.get(), m_frameBytes, "NativeImage", "frame"); 593 593 #elif USE(SKIA) 594 info.addMember(m_frame, "frame" );594 info.addMember(m_frame, "frame", WTF::RetainingPointer); 595 595 #else 596 596 info.addRawBuffer(m_frame, m_frameBytes, "NativeImage", "frame"); -
trunk/Source/WebCore/platform/graphics/skia/MemoryInstrumentationSkia.cpp
r141570 r144527 52 52 { 53 53 WTF::MemoryClassInfo info(memoryObjectInfo, device); 54 info.addMember(const_cast<SkDevice*>(device)->accessBitmap(false), "bitmap" );54 info.addMember(const_cast<SkDevice*>(device)->accessBitmap(false), "bitmap", WTF::RetainingPointer); 55 55 } 56 56 … … 58 58 { 59 59 WTF::MemoryClassInfo info(memoryObjectInfo, canvas); 60 info.addMember(canvas->getDevice(), "canvas" );60 info.addMember(canvas->getDevice(), "canvas", WTF::RetainingPointer); 61 61 } -
trunk/Tools/ChangeLog
r144524 r144527 1 2013-03-01 Ilya Tikhonovsky <loislo@chromium.org> 2 3 Web Inspector: Native Memory Instrumentation: do not visit raw pointers by default. 4 https://bugs.webkit.org/show_bug.cgi?id=110943 5 6 Reviewed by Yury Semikhatsky. 7 8 Unfortunately in many cases raw pointer may point to an object that has been deleted. 9 There is no working solution to solve this problem in general. 10 It could be solved only on case by case basis. 11 12 * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp: 13 * TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp: 14 (TestWebKitAPI::TEST): 15 1 16 2013-03-01 Jason Anderssen <janderssen@gmail.com> 2 17 -
trunk/Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp
r143913 r144527 90 90 m_links[WTF::PointerMember] = 0; 91 91 m_links[WTF::ReferenceMember] = 0; 92 m_links[WTF::RefPtrMember] = 0; 93 m_links[WTF::OwnPtrMember] = 0; 92 m_links[WTF::RetainingPointer] = 0; 94 93 } 95 94 … … 109 108 virtual void reportLeaf(const MemoryObjectInfo&, const char*) OVERRIDE 110 109 { 111 ++m_links[WTF:: OwnPtrMember];110 ++m_links[WTF::RetainingPointer]; 112 111 } 113 112 virtual void reportBaseAddress(const void*, const void*) OVERRIDE { } … … 197 196 MemoryClassInfo info(memoryObjectInfo, this, TestType); 198 197 memoryObjectInfo->setClassName("Instrumented"); 199 info.addMember(m_notInstrumented, "m_notInstrumented" );198 info.addMember(m_notInstrumented, "m_notInstrumented", WTF::RetainingPointer); 200 199 } 201 200 … … 216 215 EXPECT_EQ(sizeof(NotInstrumented), helper.reportedSizeForAllTypes()); 217 216 EXPECT_EQ(1u, helper.visitedObjects()); 218 EXPECT_EQ(1u, helper.linksCount(WTF:: PointerMember));217 EXPECT_EQ(1u, helper.linksCount(WTF::RetainingPointer)); 219 218 } 220 219 … … 226 225 EXPECT_EQ(0u, helper.reportedSizeForAllTypes()); 227 226 EXPECT_EQ(0u, helper.visitedObjects()); 228 EXPECT_EQ(0u, helper.linksCount(WTF:: PointerMember));227 EXPECT_EQ(0u, helper.linksCount(WTF::RetainingPointer)); 229 228 } 230 229 … … 237 236 EXPECT_EQ(sizeof(Instrumented) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes()); 238 237 EXPECT_EQ(2u, helper.visitedObjects()); 239 EXPECT_EQ(1u, helper.linksCount(WTF:: PointerMember));238 EXPECT_EQ(1u, helper.linksCount(WTF::RetainingPointer)); 240 239 } 241 240 { … … 245 244 EXPECT_EQ(sizeof(NotInstrumented), helper.reportedSizeForAllTypes()); 246 245 EXPECT_EQ(1u, helper.visitedObjects()); 247 EXPECT_EQ(1u, helper.linksCount(WTF:: PointerMember));246 EXPECT_EQ(1u, helper.linksCount(WTF::RetainingPointer)); 248 247 } 249 248 } … … 269 268 EXPECT_EQ(2u * sizeof(NotInstrumented), helper.reportedSizeForAllTypes()); 270 269 EXPECT_EQ(2u, helper.visitedObjects()); 271 EXPECT_EQ(1u, helper.linksCount(WTF::OwnPtrMember)); 272 EXPECT_EQ(1u, helper.linksCount(WTF::PointerMember)); 270 EXPECT_EQ(2u, helper.linksCount(WTF::RetainingPointer)); 273 271 } 274 272 … … 335 333 { 336 334 MemoryClassInfo info(memoryObjectInfo, this, TestType); 337 info.addMember(m_value );335 info.addMember(m_value, "value", WTF::RetainingPointer); 338 336 } 339 337 … … 650 648 } 651 649 650 class InstrumentedRefCounted : public RefCounted<InstrumentedRefCounted> { 651 public: 652 InstrumentedRefCounted() : m_notInstrumented(new NotInstrumented) { } 653 ~InstrumentedRefCounted() { delete m_notInstrumented; } 654 655 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 656 { 657 MemoryClassInfo info(memoryObjectInfo, this, TestType); 658 info.addMember(m_notInstrumented, "m_notInstrumented", WTF::RetainingPointer); 659 } 660 private: 661 NotInstrumented* m_notInstrumented; 662 }; 663 652 664 TEST(MemoryInstrumentationTest, hashMapWithInstrumentedPointerKeysAndPointerValues) 653 665 { 654 666 InstrumentationTestHelper helper; 655 667 656 typedef HashMap< Instrumented*, Instrumented*> InstrumentedToInstrumentedMap;668 typedef HashMap<RefPtr<InstrumentedRefCounted>, RefPtr<InstrumentedRefCounted> > InstrumentedToInstrumentedMap; 657 669 OwnPtr<InstrumentedToInstrumentedMap> value(adoptPtr(new InstrumentedToInstrumentedMap())); 658 Vector<OwnPtr<Instrumented> > valuesVector;659 670 size_t count = 10; 660 for (size_t i = 0; i < count; ++i) { 661 valuesVector.append(adoptPtr(new Instrumented())); 662 valuesVector.append(adoptPtr(new Instrumented())); 663 value->set(valuesVector[2 * i].get(), valuesVector[2 * i + 1].get()); 664 } 671 for (size_t i = 0; i < count; ++i) 672 value->set(adoptRef(new InstrumentedRefCounted()), adoptRef(new InstrumentedRefCounted())); 665 673 InstrumentedOwner<InstrumentedToInstrumentedMap* > root(value.get()); 666 674 helper.addRootObject(root); 667 EXPECT_EQ(sizeof(InstrumentedToInstrumentedMap) + sizeof(InstrumentedToInstrumentedMap::ValueType) * value->capacity() + 2 * (sizeof(Instrumented) + sizeof(NotInstrumented)) * value->size(), helper.reportedSizeForAllTypes()); 675 EXPECT_EQ(sizeof(InstrumentedToInstrumentedMap) 676 + sizeof(InstrumentedToInstrumentedMap::ValueType) * value->capacity() 677 + 2 * (sizeof(InstrumentedRefCounted) + sizeof(NotInstrumented)) * value->size(), 678 helper.reportedSizeForAllTypes()); 668 679 EXPECT_EQ(2u * 2u * count + 1, helper.visitedObjects()); 669 680 } … … 706 717 } 707 718 708 class InstrumentedConvertibleToInt {709 public: 710 InstrumentedConvertibleToInt() : m_notInstrumented( 0) { }711 virtual ~InstrumentedConvertibleToInt() { }719 class InstrumentedConvertibleToInt : public RefCounted<InstrumentedConvertibleToInt> { 720 public: 721 InstrumentedConvertibleToInt() : m_notInstrumented(new NotInstrumented) { } 722 virtual ~InstrumentedConvertibleToInt() { delete m_notInstrumented; } 712 723 713 724 virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const … … 730 741 InstrumentationTestHelper helper; 731 742 732 typedef HashMap< InstrumentedConvertibleToInt*, InstrumentedConvertibleToInt> TestMap;743 typedef HashMap<RefPtr<InstrumentedConvertibleToInt>, int> TestMap; 733 744 OwnPtr<TestMap> value(adoptPtr(new TestMap())); 734 Vector<OwnPtr<InstrumentedConvertibleToInt> > keysVector;735 Vector<OwnPtr<NotInstrumented> > valuesVector;736 745 size_t count = 10; 737 for (size_t i = 0; i < count; ++i) { 738 keysVector.append(adoptPtr(new InstrumentedConvertibleToInt())); 739 valuesVector.append(adoptPtr(new NotInstrumented())); 740 value->set(keysVector[i].get(), InstrumentedConvertibleToInt()).iterator->value.m_notInstrumented = valuesVector[i].get(); 741 } 746 for (size_t i = 0; i < count; ++i) 747 value->set(adoptRef(new InstrumentedConvertibleToInt()), 0); 742 748 InstrumentedOwner<TestMap* > root(value.get()); 743 749 helper.addRootObject(root); … … 758 764 InstrumentedOwner<EnumToStringMap* > root(value.get()); 759 765 helper.addRootObject(root); 760 EXPECT_EQ(sizeof(EnumToStringMap) + sizeof(EnumToStringMap::ValueType) * value->capacity() + (sizeof(StringImpl) + 1) * value->size(), helper.reportedSizeForAllTypes()); 766 EXPECT_EQ(sizeof(EnumToStringMap) 767 + sizeof(EnumToStringMap::ValueType) * value->capacity() 768 + (sizeof(StringImpl) + 1) * value->size(), 769 helper.reportedSizeForAllTypes()); 761 770 EXPECT_EQ(count + 1, helper.visitedObjects()); 762 771 } … … 766 775 InstrumentationTestHelper helper; 767 776 768 typedef HashCountedSet< Instrumented*> TestSet;777 typedef HashCountedSet<RefPtr<InstrumentedRefCounted> > TestSet; 769 778 OwnPtr<TestSet> set(adoptPtr(new TestSet())); 770 Vector<OwnPtr<Instrumented> > keysVector;771 779 size_t count = 10; 772 780 for (size_t i = 0; i < count; ++i) { 773 keysVector.append(adoptPtr(new Instrumented()));781 RefPtr<InstrumentedRefCounted> instrumentedRefCounted = adoptRef(new InstrumentedRefCounted()); 774 782 for (size_t j = 0; j <= i; j++) 775 set->add( keysVector.last().get());783 set->add(instrumentedRefCounted); 776 784 } 777 785 InstrumentedOwner<TestSet* > root(set.get()); 778 786 helper.addRootObject(root); 779 EXPECT_EQ(sizeof(TestSet) + sizeof(HashMap<Instrumented*, unsigned>::ValueType) * set->capacity() + (sizeof(Instrumented) + sizeof(NotInstrumented)) * set->size(), helper.reportedSizeForAllTypes()); 787 EXPECT_EQ(sizeof(TestSet) 788 + sizeof(HashMap<RefPtr<InstrumentedRefCounted>, unsigned>::ValueType) * set->capacity() 789 + (sizeof(InstrumentedRefCounted) + sizeof(NotInstrumented)) * set->size(), 790 helper.reportedSizeForAllTypes()); 780 791 EXPECT_EQ(2u * count + 1, helper.visitedObjects()); 781 792 } … … 790 801 EXPECT_EQ(sizeof(int) * 1000 + sizeof(ArrayBuffer), helper.reportedSizeForAllTypes()); 791 802 EXPECT_EQ(2u, helper.visitedObjects()); 792 EXPECT_EQ( 1u, helper.linksCount(WTF::RefPtrMember));803 EXPECT_EQ(2u, helper.linksCount(WTF::RetainingPointer)); 793 804 } 794 805 -
trunk/Tools/TestWebKitAPI/Tests/WebCore/HeapGraphSerializerTest.cpp
r143913 r144527 249 249 Helper helper(receiver.serializer()); 250 250 void* childObject = helper.addNode("Child", "child", false); 251 helper.addEdge(childObject, "pointerToChild", WTF:: OwnPtrMember);251 helper.addEdge(childObject, "pointerToChild", WTF::RetainingPointer); 252 252 helper.addNode("Parent", "parent", true); 253 253 helper.done(); … … 286 286 receiver.printGraph(); 287 287 EXPECT_EQ(String("[6,0,1,0,0,5,0,4,0,3,9,0,3,0,0,9,0,2,0,0,10,0,5,0,1]"), receiver.dumpNodes()); 288 EXPECT_EQ(String("[2,7,1, 1,8,2,1,8,3,1,0,4]"), receiver.dumpEdges());288 EXPECT_EQ(String("[2,7,1,2,8,2,2,8,3,1,0,4]"), receiver.dumpEdges()); 289 289 EXPECT_EQ(String("[]"), receiver.dumpBaseToRealNodeId()); 290 290 }
Note: See TracChangeset
for help on using the changeset viewer.