Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(682)

Unified Diff: third_party/WebKit/Source/core/fetch/Resource.cpp

Issue 1667843003: Make Resource RefCountedWillBeGarbageCollectedFinalized, attempt #2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + address review comments Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/fetch/Resource.cpp
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp
index 4f6712198a66ac12d94686ff5e7702792a46d80e..a8e26add4501e71a3baa01f1332b39d27d16e5d9 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
@@ -31,7 +31,6 @@
#include "core/fetch/ResourceClientWalker.h"
#include "core/fetch/ResourceFetcher.h"
#include "core/fetch/ResourceLoader.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "platform/Logging.h"
#include "platform/SharedBuffer.h"
@@ -155,17 +154,13 @@ Resource::Resource(const ResourceRequest& request, Type type)
, m_identifier(0)
, m_encodedSize(0)
, m_decodedSize(0)
- , m_handleCount(0)
, m_preloadCount(0)
- , m_protectorCount(0)
, m_cacheIdentifier(MemoryCache::defaultCacheIdentifier())
, m_preloadResult(PreloadNotReferenced)
, m_requestedFromNetworkingLayer(false)
, m_loading(false)
- , m_switchingClientsToRevalidatedResource(false)
, m_type(type)
, m_status(Pending)
- , m_wasPurged(false)
, m_needsSynchronousCacheHit(false)
, m_linkPreload(false)
#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
@@ -174,7 +169,6 @@ Resource::Resource(const ResourceRequest& request, Type type)
{
ASSERT(m_type == unsigned(type)); // m_type is a bitfield, so this tests careless updates of the enum.
InstanceCounters::incrementCounter(InstanceCounters::ResourceCounter);
- memoryCache()->registerLiveResource(*this);
// Currently we support the metadata caching only for HTTP family.
if (m_resourceRequest.url().protocolIsInHTTPFamily())
@@ -191,19 +185,18 @@ Resource::Resource(const ResourceRequest& request, Type type)
Resource::~Resource()
{
- ASSERT(canDelete());
- RELEASE_ASSERT(!memoryCache()->contains(this));
- RELEASE_ASSERT(!ResourceCallback::callbackHandler()->isScheduled(this));
assertAlive();
#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
m_deleted = true;
#endif
+
InstanceCounters::decrementCounter(InstanceCounters::ResourceCounter);
}
-void Resource::dispose()
+void Resource::removedFromMemoryCache()
{
+ InspectorInstrumentation::removedResourceFromMemoryCache(this);
}
DEFINE_TRACE(Resource)
@@ -446,18 +439,13 @@ bool Resource::unlock()
if (!m_data->isLocked())
return true;
- if (!memoryCache()->contains(this) || hasClients() || m_handleCount > 1 || !m_revalidatingRequest.isNull() || !m_loadFinishTime || !isSafeToUnlock())
+ if (!memoryCache()->contains(this) || hasClients() || !m_revalidatingRequest.isNull() || !m_loadFinishTime || !isSafeToUnlock())
return false;
m_data->unlock();
return true;
}
-bool Resource::hasRightHandleCountApartFromCache(unsigned targetCount) const
-{
- return m_handleCount == targetCount + (memoryCache()->contains(this) ? 1 : 0);
-}
-
void Resource::responseReceived(const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle>)
{
m_responseTimestamp = currentTime();
@@ -529,12 +517,6 @@ WeakPtrWillBeRawPtr<Resource> Resource::asWeakPtr()
#endif
}
-bool Resource::canDelete() const
-{
- return !hasClients() && !m_loader && !m_preloadCount && hasRightHandleCountApartFromCache(0)
- && !m_protectorCount;
-}
-
String Resource::reasonNotDeletable() const
{
StringBuilder builder;
@@ -563,20 +545,6 @@ String Resource::reasonNotDeletable() const
builder.appendNumber(m_preloadCount);
builder.append(")");
}
- if (!hasRightHandleCountApartFromCache(0)) {
- if (!builder.isEmpty())
- builder.append(' ');
- builder.append("m_handleCount(");
- builder.appendNumber(m_handleCount);
- builder.append(")");
- }
- if (m_protectorCount) {
- if (!builder.isEmpty())
- builder.append(' ');
- builder.append("m_protectorCount(");
- builder.appendNumber(m_protectorCount);
- builder.append(")");
- }
if (memoryCache()->contains(this)) {
if (!builder.isEmpty())
builder.append(' ');
@@ -585,11 +553,6 @@ String Resource::reasonNotDeletable() const
return builder.toString();
}
-bool Resource::hasOneHandle() const
-{
- return hasRightHandleCountApartFromCache(1);
-}
-
CachedMetadata* Resource::cachedMetadata(unsigned dataTypeID) const
{
if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID)
@@ -679,11 +642,10 @@ void Resource::removeClient(ResourceClient* client)
if (m_clientsAwaitingCallback.isEmpty())
ResourceCallback::callbackHandler()->cancel(this);
- bool deleted = deleteIfPossible();
- if (!deleted && !hasClients()) {
+ if (!hasClients()) {
+ RefPtrWillBeRawPtr<Resource> protect(this);
memoryCache()->makeDead(this);
- if (!m_switchingClientsToRevalidatedResource)
- allClientsRemoved();
+ allClientsRemoved();
// RFC2616 14.9.2:
// "no-store: ... MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible"
@@ -703,7 +665,7 @@ void Resource::allClientsRemoved()
{
if (!m_loader)
return;
- if (m_type == MainResource || m_type == Raw)
+ if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this))
cancelTimerFired(&m_cancelTimer);
else if (!m_cancelTimer.isActive())
m_cancelTimer.startOneShot(0, BLINK_FROM_HERE);
@@ -716,26 +678,12 @@ void Resource::cancelTimerFired(Timer<Resource>* timer)
ASSERT_UNUSED(timer, timer == &m_cancelTimer);
if (hasClients() || !m_loader)
return;
- ResourcePtr<Resource> protect(this);
+ RefPtrWillBeRawPtr<Resource> protect(this);
m_loader->cancelIfNotFinishing();
if (m_status != Cached)
memoryCache()->remove(this);
}
-bool Resource::deleteIfPossible()
-{
- if (canDelete() && !memoryCache()->contains(this)) {
- InspectorInstrumentation::willDestroyResource(this);
- dispose();
- memoryCache()->unregisterLiveResource(*this);
-#if !ENABLE(OILPAN)
- delete this;
-#endif
- return true;
- }
- return false;
-}
-
void Resource::setDecodedSize(size_t decodedSize)
{
if (decodedSize == m_decodedSize)
@@ -807,14 +755,13 @@ void Resource::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProcess
const String dumpName = getMemoryDumpName();
WebMemoryAllocatorDump* dump = memoryDump->createMemoryAllocatorDump(dumpName);
dump->addScalar("encoded_size", "bytes", m_encodedSize);
- if (canDelete()) {
- dump->addScalar("dead_size", "bytes", m_encodedSize);
- } else {
+ if (m_data && m_data->isLocked())
dump->addScalar("live_size", "bytes", m_encodedSize);
- }
+ else
+ dump->addScalar("dead_size", "bytes", m_encodedSize);
if (m_data) {
- dump->addScalar("purgeable_size", "bytes", isPurgeable() && !wasPurged() ? encodedSize() + overheadSize() : 0);
+ dump->addScalar("purgeable_size", "bytes", isPurgeable() ? encodedSize() + overheadSize() : 0);
m_data->onMemoryDump(dumpName, memoryDump);
}
@@ -896,29 +843,6 @@ void Resource::revalidationFailed()
destroyDecodedDataForFailedRevalidation();
}
-void Resource::registerHandle(ResourcePtrBase* h)
-{
- assertAlive();
- ++m_handleCount;
-}
-
-void Resource::unregisterHandle(ResourcePtrBase* h)
-{
- assertAlive();
- ASSERT(m_handleCount > 0);
- --m_handleCount;
-
- if (!m_handleCount) {
- if (deleteIfPossible())
- return;
- unlock();
- } else if (m_handleCount == 1 && memoryCache()->contains(this)) {
- unlock();
- if (!hasClients())
- memoryCache()->prune(this);
- }
-}
-
bool Resource::canReuseRedirectChain()
{
for (auto& redirect : m_redirectChain) {
@@ -960,11 +884,6 @@ bool Resource::isPurgeable() const
return m_data && !m_data->isLocked();
}
-bool Resource::wasPurged() const
-{
- return m_wasPurged;
-}
-
bool Resource::lock()
{
if (!m_data)
@@ -974,8 +893,10 @@ bool Resource::lock()
ASSERT(!hasClients());
+ // If locking fails, our buffer has been purged. There's no point
+ // in leaving a purged resource in MemoryCache.
if (!m_data->lock()) {
- m_wasPurged = true;
+ memoryCache()->remove(this);
return false;
}
return true;
@@ -1055,8 +976,8 @@ bool Resource::ResourceCallback::isScheduled(Resource* resource) const
void Resource::ResourceCallback::runTask()
{
- Vector<ResourcePtr<Resource>> resources;
- for (const RawPtrWillBeMember<Resource>& resource : m_resourcesWithPendingClients)
+ WillBeHeapVector<RefPtrWillBeMember<Resource>> resources;
+ for (const RefPtrWillBeMember<Resource>& resource : m_resourcesWithPendingClients)
resources.append(resource.get());
m_resourcesWithPendingClients.clear();
« no previous file with comments | « third_party/WebKit/Source/core/fetch/Resource.h ('k') | third_party/WebKit/Source/core/fetch/ResourceFetcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698