Changeset 18588 in webkit
- Timestamp:
- Jan 4, 2007 12:52:59 PM (17 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r18587 r18588 1 2007-01-04 Mitz Pettel <mitz@webkit.org> 2 3 Reviewed and landed by Brady 4 5 - fix http://bugs.webkit.org/show_bug.cgi?id=12087 6 REGRESSION: Reproducible crash going back in Back/Forward history 7 8 Allow a PageCache that is pending release to be resurrected by its 9 HistoryItem instead of creating a new PageCache. This avoids the 10 the condition of having two PageCaches for the same HistoryItem, one 11 current and one pending release but not yet released, which was causing 12 this and other bugs before. 13 14 Replaced the vector of PageCaches pending release with a set of 15 HistoryItems that are pending release of their PageCache. 16 17 * history/HistoryItem.cpp: 18 (WebCore::HistoryItem::HistoryItem): 19 (WebCore::HistoryItem::setHasPageCache): Check for an existing PageCache 20 pending release, and if found, resurrect it by canceling the release. 21 (WebCore::HistoryItem::pageCache): Return 0 if the PageCache is pending 22 release. 23 (WebCore::itemsWithPendingPageCacheToRelease): Renamed pendingPageCacheToRelease 24 to this. This method now returns a HashSet of HistoryItems that have scheduled 25 their PageCaches for release. 26 (WebCore::HistoryItem::releasePageCachesOrReschedule): Renamed releasePageCache 27 to this. 28 (WebCore::HistoryItem::releasePageCache): Added. Actually closes and releases 29 the PageCache. 30 (WebCore::HistoryItem::releaseAllPendingPageCaches): Rolled closeObjectsInPendingPageCaches 31 into this method. 32 (WebCore::HistoryItem::scheduleRelease): 33 (WebCore::HistoryItem::cancelRelease): Added. 34 * history/HistoryItem.h: Removed unused declaration of scheduleReleaseTimer() 35 * history/HistoryItemTimer.cpp: 36 (WebCore::HistoryItemTimer::HistoryItemTimer): 37 (WebCore::HistoryItemTimer::callReleasePageCachesOrReschedule): 38 * history/HistoryItemTimer.h: 39 1 40 2007-01-04 David Hyatt <hyatt@apple.com> 2 41 -
trunk/WebCore/history/HistoryItem.cpp
r18541 r18588 44 44 HistoryItem::HistoryItem() 45 45 : m_lastVisitedTime(0) 46 , m_pageCacheIsPendingRelease(false) 46 47 , m_isTargetItem(false) 47 48 , m_alwaysAttemptToUsePageCache(false) … … 55 56 , m_title(title) 56 57 , m_lastVisitedTime(time) 58 , m_pageCacheIsPendingRelease(false) 57 59 , m_isTargetItem(false) 58 60 , m_alwaysAttemptToUsePageCache(false) … … 67 69 , m_title(title) 68 70 , m_lastVisitedTime(0) 71 , m_pageCacheIsPendingRelease(false) 69 72 , m_isTargetItem(false) 70 73 , m_alwaysAttemptToUsePageCache(false) … … 81 84 , m_title(title) 82 85 , m_lastVisitedTime(0) 86 , m_pageCacheIsPendingRelease(false) 83 87 , m_isTargetItem(false) 84 88 , m_alwaysAttemptToUsePageCache(false) … … 104 108 , m_scrollPoint(item.m_scrollPoint) 105 109 , m_subItems(item.m_subItems.size()) 110 , m_pageCacheIsPendingRelease(false) 106 111 , m_isTargetItem(item.m_isTargetItem) 107 112 , m_alwaysAttemptToUsePageCache(item.m_alwaysAttemptToUsePageCache) … … 128 133 LOG(PageCache, "WebCorePageCache - HistoryItem %p setting has page cache to %s", this, hasCache ? "TRUE" : "FALSE" ); 129 134 130 if (hasCache && !m_pageCache) 131 m_pageCache = new PageCache; 132 if (!hasCache && m_pageCache) 135 if (hasCache) { 136 if (!m_pageCache) 137 m_pageCache = new PageCache; 138 else if (m_pageCacheIsPendingRelease) 139 cancelRelease(); 140 } else if (m_pageCache) 133 141 scheduleRelease(); 134 142 } … … 354 362 PageCache* HistoryItem::pageCache() 355 363 { 364 if (m_pageCacheIsPendingRelease) 365 return 0; 356 366 return m_pageCache.get(); 357 367 } … … 427 437 } 428 438 429 static Vector<RefPtr<PageCache> >& pendingPageCacheToRelease()439 static HashSet<RefPtr<HistoryItem> >& itemsWithPendingPageCacheToRelease() 430 440 { 431 441 // We keep this on the heap because otherwise, at app shutdown, we run into the "static destruction order fiasco" 432 442 // where the vector is torn down, the PageCaches destroyed, and all havok may break loose. Instead, we just leak at shutdown 433 443 // since nothing here persists 434 static Vector<RefPtr<PageCache> >* pendingPageCacheToRelease = new Vector<RefPtr<PageCache> >;435 return * pendingPageCacheToRelease;436 } 437 438 void HistoryItem::releasePageCache ()444 static HashSet<RefPtr<HistoryItem> >* itemsWithPendingPageCacheToRelease = new HashSet<RefPtr<HistoryItem> >; 445 return *itemsWithPendingPageCacheToRelease; 446 } 447 448 void HistoryItem::releasePageCachesOrReschedule() 439 449 { 440 450 double loadDelta = currentTime() - FrameLoader::timeOfLastCompletedLoad(); … … 443 453 // FIXME: This size of 42 pending caches to release seems awfully arbitrary 444 454 // Wonder if anyone knows the rationalization 445 if ((userDelta < 0.5 || loadDelta < 1.25) && pendingPageCacheToRelease().size() < 42) {446 LOG(PageCache, "WebCorePageCache: Postponing releasePageCache () - %f since last load, %f since last input, %i objects pending release", loadDelta, userDelta, pendingPageCacheToRelease().size());455 if ((userDelta < 0.5 || loadDelta < 1.25) && itemsWithPendingPageCacheToRelease().size() < 42) { 456 LOG(PageCache, "WebCorePageCache: Postponing releasePageCachesOrReschedule() - %f since last load, %f since last input, %i objects pending release", loadDelta, userDelta, itemsWithPendingPageCacheToRelease().size()); 447 457 timer().schedule(); 448 458 return; 449 459 } 450 460 451 LOG(PageCache, "WebCorePageCache: Releasing page caches - %f seconds since last load, %f since last input, %i objects pending release", loadDelta, userDelta, pendingPageCacheToRelease().size());461 LOG(PageCache, "WebCorePageCache: Releasing page caches - %f seconds since last load, %f since last input, %i objects pending release", loadDelta, userDelta, itemsWithPendingPageCacheToRelease().size()); 452 462 releaseAllPendingPageCaches(); 453 463 } 454 464 455 void closeObjectsInPendingPageCaches()456 { 457 size_t size = pendingPageCacheToRelease().size();458 for (size_t i = 0; i < size; ++i)459 pendingPageCacheToRelease()[i]->close();465 void HistoryItem::releasePageCache() 466 { 467 m_pageCache->close(); 468 m_pageCache = 0; 469 m_pageCacheIsPendingRelease = false; 460 470 } 461 471 … … 463 473 { 464 474 timer().invalidate(); 465 closeObjectsInPendingPageCaches(); 466 pendingPageCacheToRelease().clear(); 475 476 HashSet<RefPtr<HistoryItem> >::iterator i = itemsWithPendingPageCacheToRelease().begin(); 477 HashSet<RefPtr<HistoryItem> >::iterator end = itemsWithPendingPageCacheToRelease().end(); 478 for (; i != end; ++i) 479 (*i)->releasePageCache(); 480 481 itemsWithPendingPageCacheToRelease().clear(); 467 482 } 468 483 … … 474 489 timer().schedule(); 475 490 476 if (m_pageCache) { 477 pendingPageCacheToRelease().append(m_pageCache); 478 m_pageCache = 0; 479 } 480 } 481 491 if (m_pageCache && !m_pageCacheIsPendingRelease) { 492 m_pageCacheIsPendingRelease = true; 493 itemsWithPendingPageCacheToRelease().add(this); 494 } 495 } 496 497 void HistoryItem::cancelRelease() 498 { 499 itemsWithPendingPageCacheToRelease().remove(this); 500 m_pageCacheIsPendingRelease = false; 501 } 482 502 #ifndef NDEBUG 483 503 void HistoryItem::print() const -
trunk/WebCore/history/HistoryItem.h
r18541 r18588 144 144 145 145 void scheduleRelease(); 146 void cancelRelease(); 147 void releasePageCache(); 146 148 147 149 #ifndef NDEBUG … … 151 153 private: 152 154 HistoryItem(const HistoryItem&); 153 static void scheduleReleaseTimer(); 154 static void releasePageCache(); 155 static void releasePageCachesOrReschedule(); 155 156 156 157 String m_urlString; … … 167 168 168 169 HistoryItemVector m_subItems; 170 bool m_pageCacheIsPendingRelease; 169 171 RefPtr<PageCache> m_pageCache; 170 172 -
trunk/WebCore/history/HistoryItemTimer.cpp
r18541 r18588 34 34 35 35 HistoryItemTimer::HistoryItemTimer() 36 : m_timer(this, &HistoryItemTimer::callReleasePageCache )36 : m_timer(this, &HistoryItemTimer::callReleasePageCachesOrReschedule) 37 37 { 38 38 } … … 53 53 } 54 54 55 void HistoryItemTimer::callReleasePageCache (Timer<HistoryItemTimer>*)55 void HistoryItemTimer::callReleasePageCachesOrReschedule(Timer<HistoryItemTimer>*) 56 56 { 57 HistoryItem::releasePageCache ();57 HistoryItem::releasePageCachesOrReschedule(); 58 58 } 59 59 -
trunk/WebCore/history/HistoryItemTimer.h
r18541 r18588 42 42 43 43 private: 44 void callReleasePageCache (Timer<HistoryItemTimer>*);44 void callReleasePageCachesOrReschedule(Timer<HistoryItemTimer>*); 45 45 Timer<HistoryItemTimer> m_timer; 46 46 };
Note: See TracChangeset
for help on using the changeset viewer.