Skip to content

Conversation

bnham
Copy link
Contributor

@bnham bnham commented Mar 18, 2025

b168cf3

Create dispatch queues with autorelease pools
https://bugs.webkit.org/show_bug.cgi?id=290004
rdar://147361301

Reviewed by NOBODY (OOPS!).

For legacy reasons, dispatch queues do not drain an autorelease pool for each work item. Instead,
root autoreleased objects will accumulate in a last-resort pool which drains when the worker thread
backing the queue exits.

To fix this, use the `WITH_AUTORELEASE_POOL` attribute when creating dispatch queues so each work
item is executed with its own autorelease pool. Also add a style rule to enforce this in the future.

* Source/JavaScriptCore/API/tests/Regress141275.mm:
(-[JSTEvaluator init]):
* Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm:
(Inspector::RemoteInspector::RemoteInspector):
* Source/JavaScriptCore/jsc.cpp:
(jscmain):
* Source/WTF/wtf/cocoa/WorkQueueCocoa.cpp:
(WTF::WorkQueueBase::platformInitialize):
* Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.mm:
(WebCore::NetworkExtensionContentFilter::initialize):
* Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::globalLoaderDelegateQueue):
* Source/WebCore/platform/graphics/avfoundation/objc/QueuedVideoOutput.mm:
(WebCore::globalOutputDelegateQueue):
* Source/WebCore/platform/mac/PowerObserverMac.cpp:
(WebCore::PowerObserver::PowerObserver):
* Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::globaVideoCaptureSerialQueue):
* Source/WebCore/platform/mediastream/mac/ScreenCaptureKitCaptureSource.mm:
(WebCore::ScreenCaptureKitCaptureSource::captureQueue):
* Source/WebKit/NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.mm:
(WebKit::tcpSocketQueue):
* Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm:
(WebKit::udpSocketQueue):
* Source/WebKit/Shared/Extensions/_WKWebExtensionSQLiteStore.mm:
* Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::setMediaAccessibilityPreferences):
* Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.mm:
(-[WKMouseDeviceObserver init]):
* Source/WebKit/UIProcess/ios/WKWebGeolocationPolicyDeciderIOS.mm:
(-[WKWebGeolocationPolicyDecider init]):
* Source/WebKit/UIProcess/mac/ServicesController.mm:
(WebKit::ServicesController::ServicesController):
* Source/WebKitLegacy/mac/WebView/WebPreferences.mm:
(WebPreferencesPrivate::WebPreferencesPrivate):
* Source/bmalloc/bmalloc/Scavenger.cpp:
(bmalloc::Scavenger::Scavenger):
* Tools/Scripts/webkitpy/style/checkers/cpp.py:
(check_language):
* Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py:
(CppStyleTest):
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WTF/darwin/OSObjectPtr.cpp:
(TestWebKitAPI::TEST(OS_OBJECT_PTR_TEST_NAME, AdoptOSObject)):
(TestWebKitAPI::TEST(OS_OBJECT_PTR_TEST_NAME, RetainRelease)):
(TestWebKitAPI::TEST(OS_OBJECT_PTR_TEST_NAME, LeakRef)):
* Tools/TestWebKitAPI/mac/VirtualGamepad.mm:
(TestWebKitAPI::VirtualGamepad::VirtualGamepad):

b168cf3

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows
✅ 🧪 style ✅ 🛠 ios ✅ 🛠 mac ✅ 🛠 wpe ✅ 🛠 win
✅ 🧪 bindings ✅ 🛠 ios-sim ✅ 🛠 mac-AS-debug ✅ 🧪 wpe-wk2 ✅ 🧪 win-tests
✅ 🧪 webkitperl ✅ 🧪 ios-wk2 ✅ 🧪 api-mac ❌ 🧪 api-wpe
❌ 🧪 webkitpy ✅ 🧪 ios-wk2-wpt ✅ 🧪 mac-wk1 ✅ 🛠 wpe-cairo
✅ 🛠 🧪 jsc ✅ 🧪 api-ios ✅ 🧪 mac-wk2 ✅ 🛠 gtk
✅ 🛠 🧪 jsc-arm64 ✅ 🛠 vision ✅ 🧪 mac-AS-debug-wk2 ✅ 🧪 gtk-wk2
✅ 🛠 vision-sim ✅ 🧪 mac-wk2-stress ✅ 🧪 api-gtk
✅ 🧪 vision-wk2 ✅ 🧪 mac-intel-wk2 ✅ 🛠 playstation
✅ 🛠 tv ✅ 🛠 mac-safer-cpp ✅ 🛠 jsc-armv7
✅ 🛠 tv-sim ❌ 🧪 jsc-armv7-tests
✅ 🛠 watch
✅ 🛠 watch-sim

https://bugs.webkit.org/show_bug.cgi?id=290004
rdar://147361301

Reviewed by NOBODY (OOPS!).

For legacy reasons, dispatch queues do not drain an autorelease pool for each work item. Instead,
root autoreleased objects will accumulate in a last-resort pool which drains when the worker thread
backing the queue exits.

To fix this, use the `WITH_AUTORELEASE_POOL` attribute when creating dispatch queues so each work
item is executed with its own autorelease pool. Also add a style rule to enforce this in the future.

* Source/JavaScriptCore/API/tests/Regress141275.mm:
(-[JSTEvaluator init]):
* Source/JavaScriptCore/inspector/remote/cocoa/RemoteInspectorCocoa.mm:
(Inspector::RemoteInspector::RemoteInspector):
* Source/JavaScriptCore/jsc.cpp:
(jscmain):
* Source/WTF/wtf/cocoa/WorkQueueCocoa.cpp:
(WTF::WorkQueueBase::platformInitialize):
* Source/WebCore/platform/cocoa/NetworkExtensionContentFilter.mm:
(WebCore::NetworkExtensionContentFilter::initialize):
* Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::globalLoaderDelegateQueue):
* Source/WebCore/platform/graphics/avfoundation/objc/QueuedVideoOutput.mm:
(WebCore::globalOutputDelegateQueue):
* Source/WebCore/platform/mac/PowerObserverMac.cpp:
(WebCore::PowerObserver::PowerObserver):
* Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::globaVideoCaptureSerialQueue):
* Source/WebCore/platform/mediastream/mac/ScreenCaptureKitCaptureSource.mm:
(WebCore::ScreenCaptureKitCaptureSource::captureQueue):
* Source/WebKit/NetworkProcess/webrtc/NetworkRTCTCPSocketCocoa.mm:
(WebKit::tcpSocketQueue):
* Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm:
(WebKit::udpSocketQueue):
* Source/WebKit/Shared/Extensions/_WKWebExtensionSQLiteStore.mm:
* Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::setMediaAccessibilityPreferences):
* Source/WebKit/UIProcess/ios/WKMouseDeviceObserver.mm:
(-[WKMouseDeviceObserver init]):
* Source/WebKit/UIProcess/ios/WKWebGeolocationPolicyDeciderIOS.mm:
(-[WKWebGeolocationPolicyDecider init]):
* Source/WebKit/UIProcess/mac/ServicesController.mm:
(WebKit::ServicesController::ServicesController):
* Source/WebKitLegacy/mac/WebView/WebPreferences.mm:
(WebPreferencesPrivate::WebPreferencesPrivate):
* Source/bmalloc/bmalloc/Scavenger.cpp:
(bmalloc::Scavenger::Scavenger):
* Tools/Scripts/webkitpy/style/checkers/cpp.py:
(check_language):
* Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py:
(CppStyleTest):
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WTF/darwin/OSObjectPtr.cpp:
(TestWebKitAPI::TEST(OS_OBJECT_PTR_TEST_NAME, AdoptOSObject)):
(TestWebKitAPI::TEST(OS_OBJECT_PTR_TEST_NAME, RetainRelease)):
(TestWebKitAPI::TEST(OS_OBJECT_PTR_TEST_NAME, LeakRef)):
* Tools/TestWebKitAPI/mac/VirtualGamepad.mm:
(TestWebKitAPI::VirtualGamepad::VirtualGamepad):
@bnham bnham self-assigned this Mar 18, 2025
@bnham bnham added the WebKit Misc. For miscellaneous bugs in the WebKit framework (and not JavaScriptCore or WebCore). label Mar 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
WebKit Misc. For miscellaneous bugs in the WebKit framework (and not JavaScriptCore or WebCore).
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants