Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 00f31cb9801c034c0dc99866eba889ea7acae394
      
https://github.com/WebKit/WebKit/commit/00f31cb9801c034c0dc99866eba889ea7acae394
  Author: Chris Dumez <cdu...@apple.com>
  Date:   2024-01-30 (Tue, 30 Jan 2024)

  Changed paths:
    M Source/WTF/wtf/Forward.h
    M Source/WTF/wtf/Ref.h
    M Source/WTF/wtf/RefCounted.h
    M Source/WTF/wtf/RefPtr.h
    M Source/WTF/wtf/SizeLimits.cpp
    M Source/WTF/wtf/ThreadSafeRefCounted.h
    M Source/WebCore/dom/ActiveDOMObject.cpp
    M Source/WebCore/dom/ContainerNodeAlgorithms.cpp
    M Source/WebCore/dom/CustomElementReactionQueue.cpp
    M Source/WebCore/dom/Document.cpp
    M Source/WebCore/dom/Document.h
    M Source/WebCore/dom/EmptyScriptExecutionContext.h
    M Source/WebCore/dom/MessagePort.cpp
    M Source/WebCore/dom/Node.cpp
    M Source/WebCore/dom/Node.h
    M Source/WebCore/dom/ScriptExecutionContext.cpp
    M Source/WebCore/dom/ScriptExecutionContext.h
    M Source/WebCore/html/HTMLElement.cpp
    M Source/WebCore/loader/FrameLoader.cpp
    M Source/WebCore/page/EventHandler.cpp
    M Source/WebCore/page/LocalFrame.cpp
    M Source/WebCore/page/csp/ContentSecurityPolicy.cpp
    M Source/WebCore/svg/properties/SVGAttributeAnimator.cpp
    M Source/WebCore/workers/WorkerOrWorkletGlobalScope.cpp
    M Source/WebCore/workers/WorkerOrWorkletGlobalScope.h
    M Source/WebCore/workers/service/server/SWServerWorker.cpp
    M Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp
    M Source/WebKit/Shared/API/APIObject.h
    M 
Source/WebKit/UIProcess/Media/cocoa/AudioSessionRoutingArbitratorProxyCocoa.mm
    M 
Source/WebKit/UIProcess/Network/CustomProtocols/LegacyCustomProtocolManagerProxy.cpp
    M Source/WebKit/UIProcess/WebProcessProxy.cpp
    M Tools/TestWebKitAPI/Tests/WTF/Ref.cpp
    M Tools/TestWebKitAPI/Tests/WTF/RefPtr.cpp

  Log Message:
  -----------
  Unable to fully adopt smart pointers because some objects may have started 
destruction
https://bugs.webkit.org/show_bug.cgi?id=268132

Reviewed by Ryosuke Niwa.

Unable to fully adopt smart pointers because some objects may have started
destruction at the time we call member functions on them or pass them to other
functions. We've found many such instances while adopting smart pointers and
we've had to revert back to raw pointers to address assertion hits on the debug
bots.

To address the issue, this patch introduces a new 
RefDerefTraitsAllowingPartiallyDestroyed
RefDerefTraits struct for Ref / RefPtr, which calls a variant of ref() / deref()
which bypasses the `!m_deletionHasBegun` check to avoid crashes in debug if the
object has started destruction at the time it gets ref'd. The patch also
introduces new RefAllowingPartiallyDestroyed / RefPtrAllowingPartiallyDestroyed
aliases for using Ref / RefPtr with RefDerefTraitsAllowingPartiallyDestroyed.

For safety, RefDerefTraitsAllowingPartiallyDestroyed will still check in debug 
builds
if the object has not *finished* destruction.

Finally, this patch adopts the new smart pointers in many of the places where
we could not previously adopt Ref / RefPtr. There are more places we can adopt
the new smart pointers but those will require performance A/B testing so I plan
to do that separately.

* Source/WTF/wtf/Forward.h:
* Source/WTF/wtf/Ref.h:
(WTF::DefaultRefDerefTraits::refIfNotNull):
(WTF::DefaultRefDerefTraits::ref):
(WTF::DefaultRefDerefTraits::derefIfNotNull):
(WTF::Ref::~Ref):
(WTF::Ref::Ref):
(WTF::=):
(WTF::operator==):
(WTF::RefDerefTraits>::swap):
(WTF::swap):
(WTF::RefDerefTraits>::replace):
(WTF::static_reference_cast):
(WTF::adoptRef):
(WTF::is):
(WTF::checkedDowncast):
(WTF::uncheckedDowncast):
(WTF::downcast):
(WTF::dynamicDowncast):
(WTF::RefDerefTraitsAllowingPartiallyDestroyed::refIfNotNull):
(WTF::RefDerefTraitsAllowingPartiallyDestroyed::ref):
(WTF::RefDerefTraitsAllowingPartiallyDestroyed::derefIfNotNull):
(WTF::U>::swap): Deleted.
(WTF::U>::replace): Deleted.
* Source/WTF/wtf/RefCounted.h:
(WTF::RefCountedBase::refAllowingPartiallyDestroyed const):
(WTF::RefCountedBase::ref const):
(WTF::RefCountedBase::RefCountedBase):
(WTF::RefCountedBase::applyRefDerefThreadingCheck const):
(WTF::RefCountedBase::~RefCountedBase):
(WTF::RefCountedBase::derefAllowingPartiallyDestroyedBase const):
(WTF::RefCountedBase::derefBase const):
(WTF::RefCountedBase::deletionHasEnded const):
(WTF::RefCounted::derefAllowingPartiallyDestroyed const):
* Source/WTF/wtf/RefPtr.h:
(WTF::DefaultRefDerefTraits::refIfNotNull): Deleted.
(WTF::DefaultRefDerefTraits::derefIfNotNull): Deleted.
* Source/WTF/wtf/SizeLimits.cpp:
* Source/WTF/wtf/ThreadSafeRefCounted.h:
(WTF::ThreadSafeRefCountedBase::~ThreadSafeRefCountedBase):
(WTF::ThreadSafeRefCountedBase::ref const):
(WTF::ThreadSafeRefCountedBase::refAllowingPartiallyDestroyed const):
(WTF::ThreadSafeRefCountedBase::derefBaseAllowingPartiallyDestroyed const):
(WTF::ThreadSafeRefCountedBase::derefBase const):
(WTF::ThreadSafeRefCountedBase::deletionHasEnded const):
(WTF::ThreadSafeRefCounted::derefAllowingPartiallyDestroyed const):
* Source/WebCore/dom/ActiveDOMObject.cpp:
(WebCore::ActiveDOMObject::~ActiveDOMObject):
(WebCore::ActiveDOMObject::suspendIfNeeded):
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::willBeRemovedFromFrame):
* Source/WebCore/dom/Document.h:
* Source/WebCore/dom/EmptyScriptExecutionContext.h:
* Source/WebCore/dom/MessagePort.cpp:
(WebCore::MessagePort::dispatchMessages):
* Source/WebCore/dom/Node.cpp:
(WebCore::Node::~Node):
* Source/WebCore/dom/Node.h:
(WebCore::Node::deletionHasEnded const):
(WebCore::Node::ref const):
(WebCore::Node::refAllowingPartiallyDestroyed const):
(WebCore::Node::deref const):
(WebCore::Node::derefAllowingPartiallyDestroyed const):
* Source/WebCore/dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::refAllowingPartiallyDestroyed):
(WebCore::ScriptExecutionContext::derefAllowingPartiallyDestroyed):
* Source/WebCore/html/HTMLElement.cpp:
(WebCore::HTMLElement::hidePopoverInternal):
* Source/WebCore/loader/FrameLoader.cpp:
(WebCore::FrameLoader::stopLoading):
(WebCore::FrameLoader::setOpener):
* Source/WebCore/page/EventHandler.cpp:
(WebCore::EventHandler::clearLatchedState):
* Source/WebCore/page/LocalFrame.cpp:
(WebCore::LocalFrame::willDetachPage):
* Source/WebCore/page/csp/ContentSecurityPolicy.cpp:
(WebCore::ContentSecurityPolicy::reportViolation const):
* Source/WebCore/workers/WorkerOrWorkletGlobalScope.h:
* Source/WebCore/workers/service/server/SWServerWorker.cpp:
(WebCore::SWServerWorker::contextConnection):
* Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
(WebKit::WebSWServerConnection::~WebSWServerConnection):
* Source/WebKit/Shared/API/APIObject.h:
(API::Object::refAllowingPartiallyDestroyed const):
(API::Object::derefAllowingPartiallyDestroyed const):
* 
Source/WebKit/UIProcess/Media/cocoa/AudioSessionRoutingArbitratorProxyCocoa.mm:
(WebKit::AudioSessionRoutingArbitratorProxy::~AudioSessionRoutingArbitratorProxy):
* 
Source/WebKit/UIProcess/Network/CustomProtocols/LegacyCustomProtocolManagerProxy.cpp:
(WebKit::LegacyCustomProtocolManagerProxy::~LegacyCustomProtocolManagerProxy):
(WebKit::LegacyCustomProtocolManagerProxy::invalidate):
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::~WebProcessProxy):
(WebKit::WebProcessProxy::processWillShutDown):
(WebKit::WebProcessProxy::shutDown):

Canonical link: https://commits.webkit.org/273805@main


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to