Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 4b51a0df4d5cf653afd99c08091c1887dce58913
      
https://github.com/WebKit/WebKit/commit/4b51a0df4d5cf653afd99c08091c1887dce58913
  Author: Alex Christensen <achristen...@webkit.org>
  Date:   2022-11-18 (Fri, 18 Nov 2022)

  Changed paths:
    M Source/JavaScriptCore/wasm/WasmInstance.h
    M Source/JavaScriptCore/wasm/WasmMemory.cpp
    M Source/JavaScriptCore/wasm/WasmMemory.h
    M Source/WTF/WTF.xcodeproj/project.pbxproj
    M Source/WTF/wtf/CMakeLists.txt
    M Source/WTF/wtf/MainThread.h
    M Source/WTF/wtf/ThreadSafeRefCounted.h
    A Source/WTF/wtf/ThreadSafeWeakPtr.h
    M Source/WebGPU/WebGPU/Device.h
    M Source/WebGPU/WebGPU/Device.mm
    M Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm
    M Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp
    M Source/WebKit/NetworkProcess/storage/QuotaManager.h
    M 
Source/WebKit/UIProcess/Cocoa/SOAuthorization/NavigationSOAuthorizationSession.h
    M 
Source/WebKit/UIProcess/Cocoa/SOAuthorization/PopUpSOAuthorizationSession.mm
    M Source/WebKit/UIProcess/Cocoa/SOAuthorization/SOAuthorizationSession.h
    M Source/WebKit/UIProcess/Cocoa/SOAuthorization/SOAuthorizationSession.mm
    M 
Source/WebKit/UIProcess/Cocoa/SOAuthorization/SubFrameSOAuthorizationSession.h
    M Source/WebKit/UIProcess/Launcher/ProcessLauncher.h
    M Source/WebKit/UIProcess/Launcher/cocoa/ProcessLauncherCocoa.mm
    M Source/WebKit/UIProcess/Notifications/WebNotification.h
    M Source/WebKit/UIProcess/Notifications/WebNotificationManagerProxy.cpp
    M Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp

  Log Message:
  -----------
  Introduce ThreadSafeWeakPtr
https://bugs.webkit.org/show_bug.cgi?id=248051
rdar://102483501

Reviewed by Chris Dumez.

ThreadSafeWeakPtr is similar to std::weak_ptr, but with a few key differences 
to make it fit into WebKit better.
The first is that sizeof(ThreadSafeWeakPtr<T>) is sizeof(void*) and, at least 
in libc++'s implementation,
sizeof(std::weak_ptr<T>) is 2*sizeof(void*).  That is because each 
std::weak_ptr contains a pointer to the object
and a pointer to the control block containing the strong and weak reference 
counts.  Instead of that, we give the
object and the control blocks pointers to each other.  By doing that, we get 
the ability to make a Ref/RefPtr
from only a pointer to the object, so we can continue to use Ref/RefPtr with 
types that have thread safe weak pointers.

Another difference between ThreadSafeWeakPtr and std::weak_ptr is that 
ThreadSafeWeakPtr allows you to create a weak
pointer from a raw pointer, which is often used to make a ThreadSafeWeakPtr 
from *this without an unnecessary
ref/deref cycle.  It does this safely by release asserting that the object is 
still alive when this happens,
which has half the cost of a ref/deref cycle.

We also support DestructionThread like we do in ThreadSafeRefCounted, and we 
have double-delete protection like
have have in ThreadSafeRefCountedBase::derefBase by setting 
ThreadSafeWeakPtrControlBlock.m_object to null when
we delete the object, so that if something makes a Ref to the object during its 
destructor execution, it won't
free the memory twice.

This is just the initial introduction of this class.  I still need to make 
WeakHashSet work with ThreadSafeWeakPtr
and update the 17 more classes that inherit from both ThreadSafeRefCounted and 
CanMakeWeakPtr.

ThreadSafeWeakPtr is a different kind of smart pointer than WeakPtr because all 
you can do with it is get a RefPtr,
which requires that the types be reference counted.  We have many types that 
inherit from CanMakeWeakPtr that are not
reference counted, and we don't want to change that with this PR.  I could use 
some crazy SFINAE to make WeakPtr
just return a different type when it's thread safe, but that is a lot of work 
for little benefit to get a pointer type
that has the same name but still behaves quite differently internally and in 
its API, so I decided to make a different
smart pointer type.

* Source/JavaScriptCore/wasm/WasmInstance.h:
(JSC::Wasm::Instance::setMemory):
* Source/JavaScriptCore/wasm/WasmMemory.cpp:
(JSC::Wasm::Memory::growShared):
(JSC::Wasm::Memory::registerInstance):
* Source/JavaScriptCore/wasm/WasmMemory.h:
* Source/WTF/WTF.xcodeproj/project.pbxproj:
* Source/WTF/wtf/CMakeLists.txt:
* Source/WTF/wtf/MainThread.h:
* Source/WTF/wtf/ThreadSafeRefCounted.h:
* Source/WTF/wtf/ThreadSafeWeakPtr.h: Added.
(WTF::ThreadSafeWeakPtrControlBlock::ref const):
(WTF::ThreadSafeWeakPtrControlBlock::deref const):
(WTF::ThreadSafeWeakPtrControlBlock::strongRef const):
(WTF::ThreadSafeWeakPtrControlBlock::strongDeref const):
(WTF::ThreadSafeWeakPtrControlBlock::makeStrongReferenceIfPossible const):
(WTF::ThreadSafeWeakPtrControlBlock::refCount const):
(WTF::ThreadSafeWeakPtrControlBlock::ThreadSafeWeakPtrControlBlock):
(WTF::ThreadSafeWeakPtrControlBlock::WTF_GUARDED_BY_LOCK):
(WTF::ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ref const):
(WTF::ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::deref const):
(WTF::ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::refCount const):
(WTF::ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr):
(WTF::ThreadSafeWeakPtr::ThreadSafeWeakPtr):
(WTF::ThreadSafeWeakPtr::operator=):
(WTF::ThreadSafeWeakPtr::get const):
* Source/WebGPU/WebGPU/Device.h:
* Source/WebGPU/WebGPU/Device.mm:
(WebGPU::Device::Device):
* Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
(WebKit::NetworkDataTaskCocoa::willPerformHTTPRedirection):
* Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp:
(WebKit::OriginStorageManager::idbStorageManager):
* Source/WebKit/NetworkProcess/storage/QuotaManager.h:
* 
Source/WebKit/UIProcess/Cocoa/SOAuthorization/NavigationSOAuthorizationSession.h:
* Source/WebKit/UIProcess/Cocoa/SOAuthorization/PopUpSOAuthorizationSession.mm:
(-[WKSOSecretDelegate initWithSession:]):
(-[WKSOSecretDelegate webViewDidClose:]):
(-[WKSOSecretDelegate webView:didFinishNavigation:]):
(WebKit::PopUpSOAuthorizationSession::initSecretWebView):
* Source/WebKit/UIProcess/Cocoa/SOAuthorization/SOAuthorizationSession.h:
* Source/WebKit/UIProcess/Cocoa/SOAuthorization/SOAuthorizationSession.mm:
(WebKit::SOAuthorizationSession::start):
(WebKit::SOAuthorizationSession::continueStartAfterGetAuthorizationHints):
(WebKit::SOAuthorizationSession::complete):
(WebKit::SOAuthorizationSession::presentViewController):
* 
Source/WebKit/UIProcess/Cocoa/SOAuthorization/SubFrameSOAuthorizationSession.h:
* Source/WebKit/UIProcess/Launcher/ProcessLauncher.h:
* Source/WebKit/UIProcess/Launcher/cocoa/ProcessLauncherCocoa.mm:
(WebKit::ProcessLauncher::launchProcess):
* Source/WebKit/UIProcess/Notifications/WebNotification.h:
(WebKit::WebNotification::sourceConnection const):
* Source/WebKit/UIProcess/Notifications/WebNotificationManagerProxy.cpp:
(WebKit::WebNotificationManagerProxy::providerDidShowNotification):
(WebKit::dispatchDidClickNotification):
(WebKit::WebNotificationManagerProxy::providerDidCloseNotifications):
* Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp:
(TestWebKitAPI::ThreadSafeInstanceCounter::ThreadSafeInstanceCounter):
(TestWebKitAPI::ThreadSafeInstanceCounter::~ThreadSafeInstanceCounter):
(TestWebKitAPI::TEST):

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


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

Reply via email to