<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[201482] trunk/Source</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/201482">201482</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-05-27 22:51:42 -0700 (Fri, 27 May 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>callOnMainThread() should not copy captured lambda variables
https://bugs.webkit.org/show_bug.cgi?id=158166
Reviewed by Brady Eidson.
Source/WebCore:
callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.
This patch updates callOnMainThread() to take a NoncopyableFunction&&
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.
* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::putOrAddOnServer):
* Modules/mediastream/MediaDevicesRequest.cpp:
(WebCore::MediaDevicesRequest::didCompletePermissionCheck):
(WebCore::MediaDevicesRequest::didCompleteTrackSourceInfoRequest):
* Modules/mediastream/MediaEndpointPeerConnection.cpp:
(WebCore::MediaEndpointPeerConnection::runTask):
* Modules/mediastream/MediaEndpointPeerConnection.h:
* Modules/mediastream/UserMediaRequest.cpp:
(WebCore::UserMediaRequest::constraintsValidated):
(WebCore::UserMediaRequest::userMediaAccessGranted):
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::scheduleNodeDeletion):
(WebCore::AudioContext::isPlayingAudioDidChange):
* dom/Document.cpp:
(WebCore::Document::postTask):
(WebCore::Document::pendingTasksTimerFired): Deleted.
* dom/ScriptElement.cpp:
(WebCore::ScriptElement::requestScript):
* fileapi/AsyncFileStream.cpp:
(WebCore::callOnFileThread):
(WebCore::AsyncFileStream::~AsyncFileStream):
(WebCore::AsyncFileStream::perform):
* fileapi/AsyncFileStream.h:
* fileapi/ThreadableBlobRegistry.cpp:
(WebCore::ThreadableBlobRegistry::registerFileBlobURL):
(WebCore::ThreadableBlobRegistry::registerBlobURL):
(WebCore::ThreadableBlobRegistry::registerBlobURLForSlice):
(WebCore::ThreadableBlobRegistry::blobSize):
(WebCore::ThreadableBlobRegistry::unregisterBlobURL):
(WebCore::ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked): Deleted.
* loader/icon/IconDatabase.cpp:
(WebCore::IconDatabase::dispatchDidImportIconURLForPageURLOnMainThread):
(WebCore::IconDatabase::dispatchDidImportIconDataForPageURLOnMainThread):
* page/ResourceUsageThread.cpp:
(WebCore::ResourceUsageThread::notifyObservers):
(WebCore::ResourceUsageThread::threadBody):
* page/ResourceUsageThread.h:
* page/scrolling/ScrollingThread.cpp:
(WebCore::ScrollingThread::dispatch):
(WebCore::ScrollingThread::dispatchBarrier):
(WebCore::ScrollingThread::dispatchFunctionsFromScrollingThread):
* page/scrolling/ScrollingThread.h:
* page/scrolling/ios/ScrollingTreeIOS.cpp:
(WebCore::ScrollingTreeIOS::invalidate):
(WebCore::ScrollingTreeIOS::scrollingTreeNodeDidScroll):
(WebCore::ScrollingTreeIOS::currentSnapPointIndicesDidChange):
(WebCore::ScrollingTreeIOS::createScrollingTreeNode): Deleted.
* page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm:
(WebCore::ScrollingTreeFrameScrollingNodeMac::releaseReferencesToScrollerImpsOnTheMainThread):
* platform/MemoryPressureHandler.cpp:
(WebCore::MemoryPressureHandler::releaseMemory):
* platform/audio/ios/MediaSessionManagerIOS.mm:
(-[WebMediaSessionHelper dealloc]):
(-[WebMediaSessionHelper startMonitoringAirPlayRoutes]):
(-[WebMediaSessionHelper stopMonitoringAirPlayRoutes]):
* platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:
(WebCore::AudioSourceProviderAVFObjC::prepare):
* platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
(WebCore::MediaPlayerPrivateAVFoundation::scheduleMainThreadNotification):
(WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification):
* platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm:
(-[WebCDMSessionAVFoundationObjCListener observeValueForKeyPath:ofObject:change:context:]):
* platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
(-[WebAVOutputDeviceMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer):
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
(-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForResponseToAuthenticationChallenge:]):
(-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
(WebCore::CMTimebaseEffectiveRateChangedCallback):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::play):
(WebCore::MediaPlayerPrivateMediaSourceAVFObjC::pause):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask):
* platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
(-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:]):
(-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:withDiscontinuity:]):
(-[WebAVStreamDataParserListener streamDataParser:didFailToParseStreamDataWithError:]):
(-[WebAVStreamDataParserListener streamDataParser:didProvideMediaData:forTrackID:mediaType:flags:]):
(-[WebAVStreamDataParserListener streamDataParser:didReachEndOfTrackWithTrackID:mediaType:]):
(-[WebAVStreamDataParserListener streamDataParser:didProvideContentKeyRequestInitializationData:forTrackID:]):
(-[WebAVSampleBufferErrorListener observeValueForKeyPath:ofObject:change:context:]):
(-[WebAVSampleBufferErrorListener layerFailedToDecode:]):
* platform/graphics/cg/GraphicsContextCG.cpp:
(WebCore::patternReleaseCallback):
* platform/graphics/cg/PatternCG.cpp:
(WebCore::patternReleaseCallback):
* platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:
(WebCore::MediaPlayerPrivateMediaFoundation::endCreatedMediaSource):
(WebCore::MediaPlayerPrivateMediaFoundation::endGetEvent):
(WebCore::MediaPlayerPrivateMediaFoundation::CustomVideoPresenter::processInputNotify):
* platform/mediastream/MediaStreamPrivate.cpp:
(WebCore::MediaStreamPrivate::scheduleDeferredTask):
* platform/mediastream/MediaStreamPrivate.h:
* platform/mediastream/mac/AVMediaCaptureSource.h:
* platform/mediastream/mac/AVMediaCaptureSource.mm:
(WebCore::AVMediaCaptureSource::scheduleDeferredTask):
* platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
(WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources):
* platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
(WebCore::WebAudioSourceProviderAVFObjC::prepare):
* platform/mock/MockRealtimeMediaSourceCenter.cpp:
(WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
* platform/network/BlobResourceHandle.cpp:
(WebCore::BlobResourceHandle::start):
(WebCore::BlobResourceHandle::notifyFinish):
* platform/network/DataURLDecoder.cpp:
(WebCore::DataURLDecoder::decode):
* platform/network/DataURLDecoder.h:
* platform/network/cocoa/WebCoreNSURLSession.mm:
(-[WebCoreNSURLSession dealloc]):
(-[WebCoreNSURLSessionDataTask cancel]):
(-[WebCoreNSURLSessionDataTask suspend]):
(-[WebCoreNSURLSessionDataTask resume]):
* platform/network/curl/CurlDownload.cpp:
(WebCore::CurlDownload::didReceiveHeader):
(WebCore::CurlDownload::didReceiveData): Deleted.
Source/WebKit:
callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.
This patch updates callOnMainThread() to take a NoncopyableFunction&&
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.
* Storage/StorageAreaSync.cpp:
(WebCore::StorageAreaSync::deleteEmptyDatabase):
* Storage/StorageSyncManager.cpp:
(WebCore::StorageSyncManager::dispatch):
* Storage/StorageSyncManager.h:
* Storage/StorageThread.cpp:
(WebCore::StorageThread::dispatch):
(WebCore::StorageThread::terminate):
(WebCore::StorageThread::releaseFastMallocFreeMemoryInAllThreads):
* Storage/StorageThread.h:
* Storage/StorageTracker.cpp:
(WebCore::StorageTracker::syncFileSystemAndTrackerDatabase):
(WebCore::StorageTracker::setOriginDetails):
Source/WebKit/mac:
callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.
This patch updates callOnMainThread() to take a NoncopyableFunction&&
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.
* Storage/WebDatabaseManagerClient.mm:
(DidModifyOriginData::dispatchToMainThread):
(DidModifyOriginData::DidModifyOriginData): Deleted.
* Storage/WebStorageTrackerClient.mm:
(WebStorageTrackerClient::dispatchDidModifyOrigin):
Source/WTF:
callOnMainThread() should not copy captured lambda variables. This
function is usually called cross-thread with a lambda and copying
the lambda (and its captured variables) can lead to thread-safety
issues.
This patch updates callOnMainThread() to take a NoncopyableFunction&&
in parameter instead of a std::function. The call sites of
callOnMainThread() have also been updated to use C++14's lambda
capture with initializer.
* WTF.xcodeproj/project.pbxproj:
* wtf/FunctionDispatcher.h:
* wtf/NoncopyableFunction.h:
- Moved NoncopyableFunction from FunctionDispatcher.h to
NoncopyableFunction.h.
- Add a new operator=(nullptr_t) operator to NoncopyableFunction to
match std::function, as one of the call sites needed it.
* wtf/MainThread.cpp:
(WTF::functionQueue):
(WTF::dispatchFunctionsFromMainThread):
(WTF::callOnMainThread):
* wtf/MainThread.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFWTFxcodeprojprojectpbxproj">trunk/Source/WTF/WTF.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWTFwtfFunctionDispatcherh">trunk/Source/WTF/wtf/FunctionDispatcher.h</a></li>
<li><a href="#trunkSourceWTFwtfMainThreadcpp">trunk/Source/WTF/wtf/MainThread.cpp</a></li>
<li><a href="#trunkSourceWTFwtfMainThreadh">trunk/Source/WTF/wtf/MainThread.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBTransactioncpp">trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaDevicesRequestcpp">trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh">trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp">trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioContextcpp">trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoredomScriptElementcpp">trunk/Source/WebCore/dom/ScriptElement.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiAsyncFileStreamcpp">trunk/Source/WebCore/fileapi/AsyncFileStream.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiAsyncFileStreamh">trunk/Source/WebCore/fileapi/AsyncFileStream.h</a></li>
<li><a href="#trunkSourceWebCorefileapiThreadableBlobRegistrycpp">trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadericonIconDatabasecpp">trunk/Source/WebCore/loader/icon/IconDatabase.cpp</a></li>
<li><a href="#trunkSourceWebCorepageResourceUsageThreadcpp">trunk/Source/WebCore/page/ResourceUsageThread.cpp</a></li>
<li><a href="#trunkSourceWebCorepageResourceUsageThreadh">trunk/Source/WebCore/page/ResourceUsageThread.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingThreadcpp">trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingScrollingThreadh">trunk/Source/WebCore/page/scrolling/ScrollingThread.h</a></li>
<li><a href="#trunkSourceWebCorepagescrollingiosScrollingTreeIOScpp">trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp</a></li>
<li><a href="#trunkSourceWebCorepagescrollingmacScrollingTreeFrameScrollingNodeMacmm">trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformMemoryPressureHandlercpp">trunk/Source/WebCore/platform/MemoryPressureHandler.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformaudioiosMediaSessionManagerIOSmm">trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationAudioSourceProviderAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp">trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcCDMSessionAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMacmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcSourceBufferPrivateAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp">trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgPatternCGcpp">trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswinMediaPlayerPrivateMediaFoundationcpp">trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivatecpp">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh">trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourceh">trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourcemm">trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp">trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformmediastreammacWebAudioSourceProviderAVFObjCmm">trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp">trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkBlobResourceHandlecpp">trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkDataURLDecodercpp">trunk/Source/WebCore/platform/network/DataURLDecoder.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkDataURLDecoderh">trunk/Source/WebCore/platform/network/DataURLDecoder.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcocoaWebCoreNSURLSessionmm">trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcurlCurlDownloadcpp">trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp</a></li>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitStorageStorageAreaSynccpp">trunk/Source/WebKit/Storage/StorageAreaSync.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageSyncManagercpp">trunk/Source/WebKit/Storage/StorageSyncManager.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageSyncManagerh">trunk/Source/WebKit/Storage/StorageSyncManager.h</a></li>
<li><a href="#trunkSourceWebKitStorageStorageThreadcpp">trunk/Source/WebKit/Storage/StorageThread.cpp</a></li>
<li><a href="#trunkSourceWebKitStorageStorageThreadh">trunk/Source/WebKit/Storage/StorageThread.h</a></li>
<li><a href="#trunkSourceWebKitStorageStorageTrackercpp">trunk/Source/WebKit/Storage/StorageTracker.cpp</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseManagerClientmm">trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebStorageTrackerClientmm">trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWTFwtfNoncopyableFunctionh">trunk/Source/WTF/wtf/NoncopyableFunction.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2016-05-27 Chris Dumez <cdumez@apple.com>
+
+ callOnMainThread() should not copy captured lambda variables
+ https://bugs.webkit.org/show_bug.cgi?id=158166
+
+ Reviewed by Brady Eidson.
+
+ callOnMainThread() should not copy captured lambda variables. This
+ function is usually called cross-thread with a lambda and copying
+ the lambda (and its captured variables) can lead to thread-safety
+ issues.
+
+ This patch updates callOnMainThread() to take a NoncopyableFunction&&
+ in parameter instead of a std::function. The call sites of
+ callOnMainThread() have also been updated to use C++14's lambda
+ capture with initializer.
+
+ * WTF.xcodeproj/project.pbxproj:
+
+ * wtf/FunctionDispatcher.h:
+ * wtf/NoncopyableFunction.h:
+ - Moved NoncopyableFunction from FunctionDispatcher.h to
+ NoncopyableFunction.h.
+ - Add a new operator=(nullptr_t) operator to NoncopyableFunction to
+ match std::function, as one of the call sites needed it.
+
+ * wtf/MainThread.cpp:
+ (WTF::functionQueue):
+ (WTF::dispatchFunctionsFromMainThread):
+ (WTF::callOnMainThread):
+ * wtf/MainThread.h:
+
</ins><span class="cx"> 2016-05-27 Yusuke Suzuki <utatane.tea@gmail.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed, build fix for JSCOnly port.
</span></span></pre></div>
<a id="trunkSourceWTFWTFxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.xcodeproj/project.pbxproj (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -114,6 +114,7 @@
</span><span class="cx">                 7E29C33E15FFD79B00516D61 /* ObjcRuntimeExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E29C33D15FFD79B00516D61 /* ObjcRuntimeExtras.h */; };
</span><span class="cx">                 8134013815B092FD001FF0B8 /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8134013615B092FD001FF0B8 /* Base64.cpp */; };
</span><span class="cx">                 8134013915B092FD001FF0B8 /* Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8134013715B092FD001FF0B8 /* Base64.h */; };
</span><ins>+                83F2BADF1CF9524E003E99C3 /* NoncopyableFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 83F2BADE1CF9524E003E99C3 /* NoncopyableFunction.h */; };
</ins><span class="cx">                 83FBA93219DF459700F30ADB /* TypeCasts.h in Headers */ = {isa = PBXBuildFile; fileRef = 83FBA93119DF459700F30ADB /* TypeCasts.h */; };
</span><span class="cx">                 86F46F611A2840EE00CCBF22 /* RefCounter.h in Headers */ = {isa = PBXBuildFile; fileRef = 86F46F5F1A2840EE00CCBF22 /* RefCounter.h */; };
</span><span class="cx">                 93934BD318A1E8C300D0D6A1 /* StringViewObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93934BD218A1E8C300D0D6A1 /* StringViewObjC.mm */; };
</span><span class="lines">@@ -437,6 +438,7 @@
</span><span class="cx">                 7E29C33D15FFD79B00516D61 /* ObjcRuntimeExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjcRuntimeExtras.h; sourceTree = "<group>"; };
</span><span class="cx">                 8134013615B092FD001FF0B8 /* Base64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Base64.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 8134013715B092FD001FF0B8 /* Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Base64.h; sourceTree = "<group>"; };
</span><ins>+                83F2BADE1CF9524E003E99C3 /* NoncopyableFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NoncopyableFunction.h; sourceTree = "<group>"; };
</ins><span class="cx">                 83FBA93119DF459700F30ADB /* TypeCasts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeCasts.h; sourceTree = "<group>"; };
</span><span class="cx">                 86F46F5F1A2840EE00CCBF22 /* RefCounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RefCounter.h; sourceTree = "<group>"; };
</span><span class="cx">                 93934BD218A1E8C300D0D6A1 /* StringViewObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = StringViewObjC.mm; path = mac/StringViewObjC.mm; sourceTree = "<group>"; };
</span><span class="lines">@@ -869,6 +871,7 @@
</span><span class="cx">                                 1A3F6BE6174ADA2100B2EEA7 /* NeverDestroyed.h */,
</span><span class="cx">                                 0F0D85B317234CB100338210 /* NoLock.h */,
</span><span class="cx">                                 A8A472D0151A825B004123FF /* Noncopyable.h */,
</span><ins>+                                83F2BADE1CF9524E003E99C3 /* NoncopyableFunction.h */,
</ins><span class="cx">                                 A8A472D5151A825B004123FF /* NumberOfCores.cpp */,
</span><span class="cx">                                 A8A472D6151A825B004123FF /* NumberOfCores.h */,
</span><span class="cx">                                 7E29C33D15FFD79B00516D61 /* ObjcRuntimeExtras.h */,
</span><span class="lines">@@ -1231,6 +1234,7 @@
</span><span class="cx">                                 A8A473D9151A825B004123FF /* HashTable.h in Headers */,
</span><span class="cx">                                 A8A473DA151A825B004123FF /* HashTraits.h in Headers */,
</span><span class="cx">                                 A8A473DB151A825B004123FF /* HexNumber.h in Headers */,
</span><ins>+                                83F2BADF1CF9524E003E99C3 /* NoncopyableFunction.h in Headers */,
</ins><span class="cx">                                 2684D4361C000D400081D663 /* IndexSparseSet.h in Headers */,
</span><span class="cx">                                 A8A473DC151A825B004123FF /* InlineASM.h in Headers */,
</span><span class="cx">                                 A70DA0841799F04D00529A9B /* Insertion.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWTFwtfFunctionDispatcherh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/FunctionDispatcher.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/FunctionDispatcher.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/wtf/FunctionDispatcher.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -27,66 +27,11 @@
</span><span class="cx"> #define FunctionDispatcher_h
</span><span class="cx">
</span><span class="cx"> #include <functional>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/ThreadSafeRefCounted.h>
</span><span class="cx">
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><del>-// FIXME: Move this to its own header (e.g. Functional.h).
-// FIXME: We could make this templated to support other lambdas than void() and make this more reusable.
-class NoncopyableFunction {
-public:
- NoncopyableFunction() = default;
-
- template<typename CallableType, class = typename std::enable_if<std::is_rvalue_reference<CallableType&&>::value>::type>
- NoncopyableFunction(CallableType&& callable)
- : m_callableWrapper(std::make_unique<CallableWrapper<CallableType>>(WTFMove(callable)))
- {
- }
-
- void operator()() const
- {
- if (m_callableWrapper)
- m_callableWrapper->call();
- }
-
- explicit operator bool() const { return !!m_callableWrapper; }
-
- template<typename CallableType, class = typename std::enable_if<std::is_rvalue_reference<CallableType&&>::value>::type>
- NoncopyableFunction& operator=(CallableType&& callable)
- {
- m_callableWrapper = std::make_unique<CallableWrapper<CallableType>>(WTFMove(callable));
- return *this;
- }
-
-private:
- class CallableWrapperBase {
- WTF_MAKE_FAST_ALLOCATED;
- public:
- virtual ~CallableWrapperBase() { }
-
- virtual void call() = 0;
- };
-
- template<typename CallableType>
- class CallableWrapper final : public CallableWrapperBase {
- public:
- explicit CallableWrapper(CallableType&& callable)
- : m_callable(WTFMove(callable))
- {
- }
-
- CallableWrapper(const CallableWrapper&) = delete;
- CallableWrapper& operator=(const CallableWrapper&) = delete;
-
- void call() final { m_callable(); }
-
- private:
- CallableType m_callable;
- };
-
- std::unique_ptr<CallableWrapperBase> m_callableWrapper;
-};
-
</del><span class="cx"> // FunctionDispatcher is an abstract representation of something that functions can be
</span><span class="cx"> // dispatched to. This can for example be a run loop or a work queue.
</span><span class="cx">
</span><span class="lines">@@ -103,6 +48,5 @@
</span><span class="cx"> } // namespace WTF
</span><span class="cx">
</span><span class="cx"> using WTF::FunctionDispatcher;
</span><del>-using WTF::NoncopyableFunction;
</del><span class="cx">
</span><span class="cx"> #endif // FunctionDispatcher_h
</span></span></pre></div>
<a id="trunkSourceWTFwtfMainThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/MainThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/MainThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/wtf/MainThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx">
</span><span class="cx"> static StaticLock mainThreadFunctionQueueMutex;
</span><span class="cx">
</span><del>-static Deque<std::function<void ()>>& functionQueue()
</del><ins>+static Deque<NoncopyableFunction>& functionQueue()
</ins><span class="cx"> {
</span><del>- static NeverDestroyed<Deque<std::function<void ()>>> functionQueue;
</del><ins>+ static NeverDestroyed<Deque<NoncopyableFunction>> functionQueue;
</ins><span class="cx"> return functionQueue;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -120,7 +120,7 @@
</span><span class="cx">
</span><span class="cx"> auto startTime = std::chrono::steady_clock::now();
</span><span class="cx">
</span><del>- std::function<void ()> function;
</del><ins>+ NoncopyableFunction function;
</ins><span class="cx">
</span><span class="cx"> while (true) {
</span><span class="cx"> {
</span><span class="lines">@@ -144,7 +144,7 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void callOnMainThread(std::function<void ()> function)
</del><ins>+void callOnMainThread(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(function);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWTFwtfMainThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/MainThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/MainThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WTF/wtf/MainThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx">
</span><span class="cx"> #include <functional>
</span><span class="cx"> #include <stdint.h>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx">
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><span class="lines">@@ -40,7 +41,7 @@
</span><span class="cx"> // Must be called from the main thread.
</span><span class="cx"> WTF_EXPORT_PRIVATE void initializeMainThread();
</span><span class="cx">
</span><del>-WTF_EXPORT_PRIVATE void callOnMainThread(std::function<void ()>);
</del><ins>+WTF_EXPORT_PRIVATE void callOnMainThread(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> WTF_EXPORT_PRIVATE void callOnWebThreadOrDispatchAsyncOnMainThread(void (^block)());
</span></span></pre></div>
<a id="trunkSourceWTFwtfNoncopyableFunctionhfromrev201481trunkSourceWTFwtfFunctionDispatcherh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WTF/wtf/NoncopyableFunction.h (from rev 201481, trunk/Source/WTF/wtf/FunctionDispatcher.h) (0 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/NoncopyableFunction.h         (rev 0)
+++ trunk/Source/WTF/wtf/NoncopyableFunction.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -0,0 +1,95 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <memory>
+
+namespace WTF {
+
+// FIXME: We could make this templated to support other lambdas than void() and make this more reusable.
+class NoncopyableFunction {
+public:
+ NoncopyableFunction() = default;
+
+ template<typename CallableType, class = typename std::enable_if<std::is_rvalue_reference<CallableType&&>::value>::type>
+ NoncopyableFunction(CallableType&& callable)
+ : m_callableWrapper(std::make_unique<CallableWrapper<CallableType>>(WTFMove(callable)))
+ {
+ }
+
+ void operator()() const
+ {
+ if (m_callableWrapper)
+ m_callableWrapper->call();
+ }
+
+ explicit operator bool() const { return !!m_callableWrapper; }
+
+ template<typename CallableType, class = typename std::enable_if<std::is_rvalue_reference<CallableType&&>::value>::type>
+ NoncopyableFunction& operator=(CallableType&& callable)
+ {
+ m_callableWrapper = std::make_unique<CallableWrapper<CallableType>>(WTFMove(callable));
+ return *this;
+ }
+
+ NoncopyableFunction& operator=(std::nullptr_t)
+ {
+ m_callableWrapper = nullptr;
+ return *this;
+ }
+
+private:
+ class CallableWrapperBase {
+ WTF_MAKE_FAST_ALLOCATED;
+ public:
+ virtual ~CallableWrapperBase() { }
+
+ virtual void call() = 0;
+ };
+
+ template<typename CallableType>
+ class CallableWrapper final : public CallableWrapperBase {
+ public:
+ explicit CallableWrapper(CallableType&& callable)
+ : m_callable(WTFMove(callable))
+ {
+ }
+
+ CallableWrapper(const CallableWrapper&) = delete;
+ CallableWrapper& operator=(const CallableWrapper&) = delete;
+
+ void call() final { m_callable(); }
+
+ private:
+ CallableType m_callable;
+ };
+
+ std::unique_ptr<CallableWrapperBase> m_callableWrapper;
+};
+
+} // namespace WTF
+
+using WTF::NoncopyableFunction;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,143 @@
</span><ins>+2016-05-27 Chris Dumez <cdumez@apple.com>
+
+ callOnMainThread() should not copy captured lambda variables
+ https://bugs.webkit.org/show_bug.cgi?id=158166
+
+ Reviewed by Brady Eidson.
+
+ callOnMainThread() should not copy captured lambda variables. This
+ function is usually called cross-thread with a lambda and copying
+ the lambda (and its captured variables) can lead to thread-safety
+ issues.
+
+ This patch updates callOnMainThread() to take a NoncopyableFunction&&
+ in parameter instead of a std::function. The call sites of
+ callOnMainThread() have also been updated to use C++14's lambda
+ capture with initializer.
+
+ * Modules/indexeddb/IDBTransaction.cpp:
+ (WebCore::IDBTransaction::putOrAddOnServer):
+ * Modules/mediastream/MediaDevicesRequest.cpp:
+ (WebCore::MediaDevicesRequest::didCompletePermissionCheck):
+ (WebCore::MediaDevicesRequest::didCompleteTrackSourceInfoRequest):
+ * Modules/mediastream/MediaEndpointPeerConnection.cpp:
+ (WebCore::MediaEndpointPeerConnection::runTask):
+ * Modules/mediastream/MediaEndpointPeerConnection.h:
+ * Modules/mediastream/UserMediaRequest.cpp:
+ (WebCore::UserMediaRequest::constraintsValidated):
+ (WebCore::UserMediaRequest::userMediaAccessGranted):
+ * Modules/webaudio/AudioContext.cpp:
+ (WebCore::AudioContext::scheduleNodeDeletion):
+ (WebCore::AudioContext::isPlayingAudioDidChange):
+ * dom/Document.cpp:
+ (WebCore::Document::postTask):
+ (WebCore::Document::pendingTasksTimerFired): Deleted.
+ * dom/ScriptElement.cpp:
+ (WebCore::ScriptElement::requestScript):
+ * fileapi/AsyncFileStream.cpp:
+ (WebCore::callOnFileThread):
+ (WebCore::AsyncFileStream::~AsyncFileStream):
+ (WebCore::AsyncFileStream::perform):
+ * fileapi/AsyncFileStream.h:
+ * fileapi/ThreadableBlobRegistry.cpp:
+ (WebCore::ThreadableBlobRegistry::registerFileBlobURL):
+ (WebCore::ThreadableBlobRegistry::registerBlobURL):
+ (WebCore::ThreadableBlobRegistry::registerBlobURLForSlice):
+ (WebCore::ThreadableBlobRegistry::blobSize):
+ (WebCore::ThreadableBlobRegistry::unregisterBlobURL):
+ (WebCore::ThreadableBlobRegistry::registerBlobURLOptionallyFileBacked): Deleted.
+ * loader/icon/IconDatabase.cpp:
+ (WebCore::IconDatabase::dispatchDidImportIconURLForPageURLOnMainThread):
+ (WebCore::IconDatabase::dispatchDidImportIconDataForPageURLOnMainThread):
+ * page/ResourceUsageThread.cpp:
+ (WebCore::ResourceUsageThread::notifyObservers):
+ (WebCore::ResourceUsageThread::threadBody):
+ * page/ResourceUsageThread.h:
+ * page/scrolling/ScrollingThread.cpp:
+ (WebCore::ScrollingThread::dispatch):
+ (WebCore::ScrollingThread::dispatchBarrier):
+ (WebCore::ScrollingThread::dispatchFunctionsFromScrollingThread):
+ * page/scrolling/ScrollingThread.h:
+ * page/scrolling/ios/ScrollingTreeIOS.cpp:
+ (WebCore::ScrollingTreeIOS::invalidate):
+ (WebCore::ScrollingTreeIOS::scrollingTreeNodeDidScroll):
+ (WebCore::ScrollingTreeIOS::currentSnapPointIndicesDidChange):
+ (WebCore::ScrollingTreeIOS::createScrollingTreeNode): Deleted.
+ * page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm:
+ (WebCore::ScrollingTreeFrameScrollingNodeMac::releaseReferencesToScrollerImpsOnTheMainThread):
+ * platform/MemoryPressureHandler.cpp:
+ (WebCore::MemoryPressureHandler::releaseMemory):
+ * platform/audio/ios/MediaSessionManagerIOS.mm:
+ (-[WebMediaSessionHelper dealloc]):
+ (-[WebMediaSessionHelper startMonitoringAirPlayRoutes]):
+ (-[WebMediaSessionHelper stopMonitoringAirPlayRoutes]):
+ * platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:
+ (WebCore::AudioSourceProviderAVFObjC::prepare):
+ * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:
+ (WebCore::MediaPlayerPrivateAVFoundation::scheduleMainThreadNotification):
+ (WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification):
+ * platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm:
+ (-[WebCDMSessionAVFoundationObjCListener observeValueForKeyPath:ofObject:change:context:]):
+ * platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm:
+ (-[WebAVOutputDeviceMenuControllerHelper observeValueForKeyPath:ofObject:change:context:]):
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer):
+ (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
+ (-[WebCoreAVFMovieObserver outputSequenceWasFlushed:]):
+ (-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForLoadingOfRequestedResource:]):
+ (-[WebCoreAVFLoaderDelegate resourceLoader:shouldWaitForResponseToAuthenticationChallenge:]):
+ (-[WebCoreAVFLoaderDelegate resourceLoader:didCancelLoadingRequest:]):
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
+ (WebCore::CMTimebaseEffectiveRateChangedCallback):
+ (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::play):
+ (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::pause):
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+ (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask):
+ * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
+ (-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:]):
+ (-[WebAVStreamDataParserListener streamDataParser:didParseStreamDataAsAsset:withDiscontinuity:]):
+ (-[WebAVStreamDataParserListener streamDataParser:didFailToParseStreamDataWithError:]):
+ (-[WebAVStreamDataParserListener streamDataParser:didProvideMediaData:forTrackID:mediaType:flags:]):
+ (-[WebAVStreamDataParserListener streamDataParser:didReachEndOfTrackWithTrackID:mediaType:]):
+ (-[WebAVStreamDataParserListener streamDataParser:didProvideContentKeyRequestInitializationData:forTrackID:]):
+ (-[WebAVSampleBufferErrorListener observeValueForKeyPath:ofObject:change:context:]):
+ (-[WebAVSampleBufferErrorListener layerFailedToDecode:]):
+ * platform/graphics/cg/GraphicsContextCG.cpp:
+ (WebCore::patternReleaseCallback):
+ * platform/graphics/cg/PatternCG.cpp:
+ (WebCore::patternReleaseCallback):
+ * platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp:
+ (WebCore::MediaPlayerPrivateMediaFoundation::endCreatedMediaSource):
+ (WebCore::MediaPlayerPrivateMediaFoundation::endGetEvent):
+ (WebCore::MediaPlayerPrivateMediaFoundation::CustomVideoPresenter::processInputNotify):
+ * platform/mediastream/MediaStreamPrivate.cpp:
+ (WebCore::MediaStreamPrivate::scheduleDeferredTask):
+ * platform/mediastream/MediaStreamPrivate.h:
+ * platform/mediastream/mac/AVMediaCaptureSource.h:
+ * platform/mediastream/mac/AVMediaCaptureSource.mm:
+ (WebCore::AVMediaCaptureSource::scheduleDeferredTask):
+ * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+ (WebCore::RealtimeMediaSourceCenterMac::getMediaStreamTrackSources):
+ * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
+ (WebCore::WebAudioSourceProviderAVFObjC::prepare):
+ * platform/mock/MockRealtimeMediaSourceCenter.cpp:
+ (WebCore::MockRealtimeMediaSourceCenter::getMediaStreamTrackSources):
+ * platform/network/BlobResourceHandle.cpp:
+ (WebCore::BlobResourceHandle::start):
+ (WebCore::BlobResourceHandle::notifyFinish):
+ * platform/network/DataURLDecoder.cpp:
+ (WebCore::DataURLDecoder::decode):
+ * platform/network/DataURLDecoder.h:
+ * platform/network/cocoa/WebCoreNSURLSession.mm:
+ (-[WebCoreNSURLSession dealloc]):
+ (-[WebCoreNSURLSessionDataTask cancel]):
+ (-[WebCoreNSURLSessionDataTask suspend]):
+ (-[WebCoreNSURLSessionDataTask resume]):
+ * platform/network/curl/CurlDownload.cpp:
+ (WebCore::CurlDownload::didReceiveHeader):
+ (WebCore::CurlDownload::didReceiveData): Deleted.
+
</ins><span class="cx"> 2016-05-27 Tim Horton <timothy_horton@apple.com>
</span><span class="cx">
</span><span class="cx"> REGRESSION (r190574): Swipe snapshots are always black on iPhone 5
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -979,7 +979,7 @@
</span><span class="cx"> // If the IDBValue doesn't have any data, then something went wrong writing the blobs to disk.
</span><span class="cx"> // In that case, we cannot successfully store this record, so we callback with an error.
</span><span class="cx"> auto result = IDBResultData::error(protectedOperation->identifier(), { IDBDatabaseException::UnknownError, ASCIILiteral("Error preparing Blob/File data to be stored in object store") });
</span><del>- callOnMainThread([protectedThis = WTFMove(protectedThis), this, protectedOperation = WTFMove(protectedOperation), result = WTFMove(result)]() {
</del><ins>+ callOnMainThread([protectedThis = WTFMove(protectedThis), protectedOperation = WTFMove(protectedOperation), result = WTFMove(result)]() {
</ins><span class="cx"> protectedOperation->completed(result);
</span><span class="cx"> });
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevicesRequest.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx"> m_idHashSalt = salt;
</span><span class="cx"> m_havePersistentPermission = canAccess;
</span><span class="cx">
</span><del>- callOnMainThread([this, permissionCheckProtector] {
</del><ins>+ callOnMainThread([this, permissionCheckProtector = WTFMove(permissionCheckProtector)] {
</ins><span class="cx"> RealtimeMediaSourceCenter::singleton().getMediaStreamTrackSources(this);
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -160,8 +160,7 @@
</span><span class="cx"> devices.append(MediaDeviceInfo::create(scriptExecutionContext(), label, id, groupId, deviceType));
</span><span class="cx"> }
</span><span class="cx">
</span><del>- RefPtr<MediaDevicesRequest> protectedThis(this);
- callOnMainThread([protectedThis, devices] {
</del><ins>+ callOnMainThread([protectedThis = Ref<MediaDevicesRequest>(*this), devices = WTFMove(devices)]() mutable {
</ins><span class="cx"> protectedThis->m_promise.resolve(devices);
</span><span class="cx"> });
</span><span class="cx"> m_protector = nullptr;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -95,14 +95,14 @@
</span><span class="cx"> m_mediaEndpoint->generateDtlsInfo();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MediaEndpointPeerConnection::runTask(std::function<void()> task)
</del><ins>+void MediaEndpointPeerConnection::runTask(NoncopyableFunction&& task)
</ins><span class="cx"> {
</span><span class="cx"> if (m_dtlsFingerprint.isNull()) {
</span><span class="cx"> // Only one task needs to be deferred since it will hold off any others until completed.
</span><span class="cx"> ASSERT(!m_initialDeferredTask);
</span><del>- m_initialDeferredTask = task;
</del><ins>+ m_initialDeferredTask = WTFMove(task);
</ins><span class="cx"> } else
</span><del>- callOnMainThread(task);
</del><ins>+ callOnMainThread(WTFMove(task));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void MediaEndpointPeerConnection::startRunningTasks()
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaEndpointPeerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/MediaEndpointPeerConnection.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include "NotImplemented.h"
</span><span class="cx"> #include "PeerConnectionBackend.h"
</span><span class="cx"> #include "RTCSessionDescription.h"
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -77,7 +78,7 @@
</span><span class="cx"> void clearNegotiationNeededState() override { notImplemented(); };
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- void runTask(std::function<void()>);
</del><ins>+ void runTask(NoncopyableFunction&&);
</ins><span class="cx"> void startRunningTasks();
</span><span class="cx">
</span><span class="cx"> void createOfferTask(RTCOfferOptions&, PeerConnection::SessionDescriptionPromise&);
</span><span class="lines">@@ -91,7 +92,7 @@
</span><span class="cx"> PeerConnectionBackendClient* m_client;
</span><span class="cx"> std::unique_ptr<MediaEndpoint> m_mediaEndpoint;
</span><span class="cx">
</span><del>- std::function<void()> m_initialDeferredTask;
</del><ins>+ NoncopyableFunction m_initialDeferredTask;
</ins><span class="cx">
</span><span class="cx"> std::unique_ptr<SDPProcessor> m_sdpProcessor;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -135,11 +135,10 @@
</span><span class="cx"> for (auto& videoTrack : videoTracks)
</span><span class="cx"> m_videoDeviceUIDs.append(videoTrack->persistentID());
</span><span class="cx">
</span><del>- RefPtr<UserMediaRequest> protectedThis(this);
- callOnMainThread([protectedThis] {
</del><ins>+ callOnMainThread([protectedThis = Ref<UserMediaRequest>(*this)]() mutable {
</ins><span class="cx"> // 2 - The constraints are valid, ask the user for access to media.
</span><span class="cx"> if (UserMediaController* controller = protectedThis->m_controller)
</span><del>- controller->requestUserMediaAccess(*protectedThis.get());
</del><ins>+ controller->requestUserMediaAccess(protectedThis.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -148,10 +147,9 @@
</span><span class="cx"> m_allowedVideoDeviceUID = videoDeviceUID;
</span><span class="cx"> m_audioDeviceUIDAllowed = audioDeviceUID;
</span><span class="cx">
</span><del>- RefPtr<UserMediaRequest> protectedThis(this);
- callOnMainThread([protectedThis, audioDeviceUID, videoDeviceUID] {
</del><ins>+ callOnMainThread([protectedThis = Ref<UserMediaRequest>(*this), audioDeviceUID, videoDeviceUID]() mutable {
</ins><span class="cx"> // 3 - the user granted access, ask platform to create the media stream descriptors.
</span><del>- RealtimeMediaSourceCenter::singleton().createMediaStream(protectedThis.get(), audioDeviceUID, videoDeviceUID);
</del><ins>+ RealtimeMediaSourceCenter::singleton().createMediaStream(protectedThis.ptr(), audioDeviceUID, videoDeviceUID);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -797,8 +797,7 @@
</span><span class="cx">
</span><span class="cx"> m_isDeletionScheduled = true;
</span><span class="cx">
</span><del>- RefPtr<AudioContext> protectedThis(this);
- callOnMainThread([protectedThis] {
</del><ins>+ callOnMainThread([protectedThis = Ref<AudioContext>(*this)]() mutable {
</ins><span class="cx"> protectedThis->deleteMarkedNodes();
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -1002,8 +1001,7 @@
</span><span class="cx"> {
</span><span class="cx"> // Make sure to call Document::updateIsPlayingMedia() on the main thread, since
</span><span class="cx"> // we could be on the audio I/O thread here and the call into WebCore could block.
</span><del>- RefPtr<AudioContext> protectedThis(this);
- callOnMainThread([protectedThis] {
</del><ins>+ callOnMainThread([protectedThis = Ref<AudioContext>(*this)] {
</ins><span class="cx"> if (protectedThis->document())
</span><span class="cx"> protectedThis->document()->updateIsPlayingMedia();
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -5386,12 +5386,8 @@
</span><span class="cx">
</span><span class="cx"> void Document::postTask(Task task)
</span><span class="cx"> {
</span><del>- Task* taskPtr = std::make_unique<Task>(WTFMove(task)).release();
- WeakPtr<Document> documentReference(m_weakFactory.createWeakPtr());
-
- callOnMainThread([=] {
</del><ins>+ callOnMainThread([documentReference = m_weakFactory.createWeakPtr(), task = WTFMove(task)]() mutable {
</ins><span class="cx"> ASSERT(isMainThread());
</span><del>- std::unique_ptr<Task> task(taskPtr);
</del><span class="cx">
</span><span class="cx"> Document* document = documentReference.get();
</span><span class="cx"> if (!document)
</span><span class="lines">@@ -5399,9 +5395,9 @@
</span><span class="cx">
</span><span class="cx"> Page* page = document->page();
</span><span class="cx"> if ((page && page->defersLoading() && document->activeDOMObjectsAreSuspended()) || !document->m_pendingTasks.isEmpty())
</span><del>- document->m_pendingTasks.append(WTFMove(*task.release()));
</del><ins>+ document->m_pendingTasks.append(WTFMove(task));
</ins><span class="cx"> else
</span><del>- task->performTask(*document);
</del><ins>+ task.performTask(*document);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoredomScriptElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/ScriptElement.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/ScriptElement.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/dom/ScriptElement.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -280,8 +280,7 @@
</span><span class="cx"> if (m_cachedScript)
</span><span class="cx"> return true;
</span><span class="cx">
</span><del>- RefPtr<Element> element = &m_element;
- callOnMainThread([this, element] {
</del><ins>+ callOnMainThread([this, element = Ref<Element>(m_element)] {
</ins><span class="cx"> dispatchErrorEvent();
</span><span class="cx"> });
</span><span class="cx"> return false;
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiAsyncFileStreamcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/AsyncFileStream.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/AsyncFileStream.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/fileapi/AsyncFileStream.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> #include <wtf/MainThread.h>
</span><span class="cx"> #include <wtf/MessageQueue.h>
</span><span class="cx"> #include <wtf/NeverDestroyed.h>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -63,12 +64,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static void callOnFileThread(std::function<void()>&& function)
</del><ins>+static void callOnFileThread(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx"> ASSERT(function);
</span><span class="cx">
</span><del>- static NeverDestroyed<MessageQueue<std::function<void()>>> queue;
</del><ins>+ static NeverDestroyed<MessageQueue<NoncopyableFunction>> queue;
</ins><span class="cx">
</span><span class="cx"> static std::once_flag createFileThreadOnce;
</span><span class="cx"> std::call_once(createFileThreadOnce, [] {
</span><span class="lines">@@ -89,7 +90,7 @@
</span><span class="cx"> });
</span><span class="cx"> });
</span><span class="cx">
</span><del>- queue.get().append(std::make_unique<std::function<void()>>(WTFMove(function)));
</del><ins>+ queue.get().append(std::make_unique<NoncopyableFunction>(WTFMove(function)));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> AsyncFileStream::AsyncFileStream(FileStreamClient& client)
</span><span class="lines">@@ -102,33 +103,28 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx">
</span><del>- // Release so that we can control the timing of deletion below.
- auto& internals = *m_internals.release();
-
</del><span class="cx"> // Set flag to prevent client callbacks and also prevent queued operations from starting.
</span><del>- internals.destroyed = true;
</del><ins>+ m_internals->destroyed = true;
</ins><span class="cx">
</span><span class="cx"> // Call through file thread and back to main thread to make sure deletion happens
</span><span class="cx"> // after all file thread functions and all main thread functions called from them.
</span><del>- callOnFileThread([&internals] {
- callOnMainThread([&internals] {
- delete &internals;
</del><ins>+ callOnFileThread([internals = WTFMove(m_internals)]() mutable {
+ callOnMainThread([internals = WTFMove(internals)] {
</ins><span class="cx"> });
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void AsyncFileStream::perform(std::function<std::function<void(FileStreamClient&)>(FileStream&)> operation)
</del><ins>+void AsyncFileStream::perform(std::function<std::function<void(FileStreamClient&)>(FileStream&)>&& operation)
</ins><span class="cx"> {
</span><span class="cx"> auto& internals = *m_internals;
</span><del>- callOnFileThread([&internals, operation] {
</del><ins>+ callOnFileThread([&internals, operation = WTFMove(operation)] {
</ins><span class="cx"> // Don't do the operation if stop was already called on the main thread. Note that there is
</span><span class="cx"> // a race here, but since skipping the operation is an optimization it's OK that we can't
</span><span class="cx"> // guarantee exactly which operations are skipped. Note that this is also the only reason
</span><span class="cx"> // we use an atomic_bool rather than just a bool for destroyed.
</span><span class="cx"> if (internals.destroyed)
</span><span class="cx"> return;
</span><del>- auto mainThreadWork = operation(internals.stream);
- callOnMainThread([&internals, mainThreadWork] {
</del><ins>+ callOnMainThread([&internals, mainThreadWork = operation(internals.stream)] {
</ins><span class="cx"> if (internals.destroyed)
</span><span class="cx"> return;
</span><span class="cx"> mainThreadWork(internals.client);
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiAsyncFileStreamh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/AsyncFileStream.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/AsyncFileStream.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/fileapi/AsyncFileStream.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> void start();
</span><del>- void perform(std::function<std::function<void(FileStreamClient&)>(FileStream&)>);
</del><ins>+ void perform(std::function<std::function<void(FileStreamClient&)>(FileStream&)>&&);
</ins><span class="cx">
</span><span class="cx"> struct Internals;
</span><span class="cx"> std::unique_ptr<Internals> m_internals;
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiThreadableBlobRegistrycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/fileapi/ThreadableBlobRegistry.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -117,10 +117,8 @@
</span><span class="cx"> blobRegistry().registerFileBlobURL(url, BlobDataFileReference::create(path), contentType);
</span><span class="cx"> else {
</span><span class="cx"> // BlobRegistryContext performs an isolated copy of data.
</span><del>- BlobRegistryContext* context = new BlobRegistryContext(url, path, contentType);
- callOnMainThread([context] {
- std::unique_ptr<BlobRegistryContext> blobRegistryContext(context);
- blobRegistry().registerFileBlobURL(blobRegistryContext->url, BlobDataFileReference::create(blobRegistryContext->path), blobRegistryContext->contentType);
</del><ins>+ callOnMainThread([context = std::make_unique<BlobRegistryContext>(url, path, contentType)] {
+ blobRegistry().registerFileBlobURL(context->url, BlobDataFileReference::create(context->path), context->contentType);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -131,10 +129,8 @@
</span><span class="cx"> blobRegistry().registerBlobURL(url, WTFMove(blobParts), contentType);
</span><span class="cx"> else {
</span><span class="cx"> // BlobRegistryContext performs an isolated copy of data.
</span><del>- BlobRegistryContext* context = new BlobRegistryContext(url, WTFMove(blobParts), contentType);
- callOnMainThread([context] {
- std::unique_ptr<BlobRegistryContext> blobRegistryContext(context);
- blobRegistry().registerBlobURL(blobRegistryContext->url, WTFMove(blobRegistryContext->blobParts), blobRegistryContext->contentType);
</del><ins>+ callOnMainThread([context = std::make_unique<BlobRegistryContext>(url, WTFMove(blobParts), contentType)] {
+ blobRegistry().registerBlobURL(context->url, WTFMove(context->blobParts), context->contentType);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -149,10 +145,8 @@
</span><span class="cx"> blobRegistry().registerBlobURL(url, srcURL);
</span><span class="cx"> else {
</span><span class="cx"> // BlobRegistryContext performs an isolated copy of data.
</span><del>- BlobRegistryContext* context = new BlobRegistryContext(url, srcURL);
- callOnMainThread([context] {
- std::unique_ptr<BlobRegistryContext> blobRegistryContext(context);
- blobRegistry().registerBlobURL(blobRegistryContext->url, blobRegistryContext->srcURL);
</del><ins>+ callOnMainThread([context = std::make_unique<BlobRegistryContext>(url, srcURL)] {
+ blobRegistry().registerBlobURL(context->url, context->srcURL);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -178,10 +172,8 @@
</span><span class="cx"> blobRegistry().registerBlobURLForSlice(newURL, srcURL, start, end);
</span><span class="cx"> else {
</span><span class="cx"> // BlobRegistryContext performs an isolated copy of data.
</span><del>- BlobRegistryContext* context = new BlobRegistryContext(newURL, srcURL);
- callOnMainThread([context, start, end] {
- std::unique_ptr<BlobRegistryContext> blobRegistryContext(context);
- blobRegistry().registerBlobURLForSlice(blobRegistryContext->url, blobRegistryContext->srcURL, start, end);
</del><ins>+ callOnMainThread([context = std::make_unique<BlobRegistryContext>(newURL, srcURL), start, end] {
+ blobRegistry().registerBlobURLForSlice(context->url, context->srcURL, start, end);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -193,11 +185,9 @@
</span><span class="cx"> resultSize = blobRegistry().blobSize(url);
</span><span class="cx"> else {
</span><span class="cx"> // BlobRegistryContext performs an isolated copy of data.
</span><del>- BlobRegistryContext* context = new BlobRegistryContext(url);
</del><span class="cx"> BinarySemaphore semaphore;
</span><del>- callOnMainThread([context, &semaphore, &resultSize] {
- std::unique_ptr<BlobRegistryContext> blobRegistryContext(context);
- resultSize = blobRegistry().blobSize(blobRegistryContext->url);
</del><ins>+ callOnMainThread([context = std::make_unique<BlobRegistryContext>(url), &semaphore, &resultSize] {
+ resultSize = blobRegistry().blobSize(context->url);
</ins><span class="cx"> semaphore.signal();
</span><span class="cx"> });
</span><span class="cx"> semaphore.wait(std::numeric_limits<double>::max());
</span><span class="lines">@@ -214,10 +204,8 @@
</span><span class="cx"> blobRegistry().unregisterBlobURL(url);
</span><span class="cx"> else {
</span><span class="cx"> // BlobRegistryContext performs an isolated copy of data.
</span><del>- BlobRegistryContext* context = new BlobRegistryContext(url);
- callOnMainThread([context] {
- std::unique_ptr<BlobRegistryContext> blobRegistryContext(context);
- blobRegistry().unregisterBlobURL(blobRegistryContext->url);
</del><ins>+ callOnMainThread([context = std::make_unique<BlobRegistryContext>(url)] {
+ blobRegistry().unregisterBlobURL(context->url);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloadericonIconDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/icon/IconDatabase.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/icon/IconDatabase.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/loader/icon/IconDatabase.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -2090,10 +2090,9 @@
</span><span class="cx"> ASSERT_ICON_SYNC_THREAD();
</span><span class="cx"> ++m_mainThreadCallbackCount;
</span><span class="cx">
</span><del>- String pageURLCopy = pageURL.isolatedCopy();
- callOnMainThread([this, pageURLCopy] {
</del><ins>+ callOnMainThread([this, pageURL = pageURL.isolatedCopy()] {
</ins><span class="cx"> if (m_client)
</span><del>- m_client->didImportIconURLForPageURL(pageURLCopy);
</del><ins>+ m_client->didImportIconURLForPageURL(pageURL);
</ins><span class="cx"> checkClosedAfterMainThreadCallback();
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -2103,10 +2102,9 @@
</span><span class="cx"> ASSERT_ICON_SYNC_THREAD();
</span><span class="cx"> ++m_mainThreadCallbackCount;
</span><span class="cx">
</span><del>- String pageURLCopy = pageURL.isolatedCopy();
- callOnMainThread([this, pageURLCopy] {
</del><ins>+ callOnMainThread([this, pageURL = pageURL.isolatedCopy()] {
</ins><span class="cx"> if (m_client)
</span><del>- m_client->didImportIconDataForPageURL(pageURLCopy);
</del><ins>+ m_client->didImportIconDataForPageURL(pageURL);
</ins><span class="cx"> checkClosedAfterMainThreadCallback();
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepageResourceUsageThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ResourceUsageThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ResourceUsageThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/ResourceUsageThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -77,9 +77,9 @@
</span><span class="cx"> m_condition.wait(m_lock);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ResourceUsageThread::notifyObservers(ResourceUsageData& data)
</del><ins>+void ResourceUsageThread::notifyObservers(ResourceUsageData&& data)
</ins><span class="cx"> {
</span><del>- callOnMainThread([data]() mutable {
</del><ins>+ callOnMainThread([data = WTFMove(data)]() mutable {
</ins><span class="cx"> Vector<std::function<void (const ResourceUsageData&)>> functions;
</span><span class="cx">
</span><span class="cx"> {
</span><span class="lines">@@ -117,7 +117,7 @@
</span><span class="cx">
</span><span class="cx"> ResourceUsageData data;
</span><span class="cx"> platformThreadBody(m_vm, data);
</span><del>- notifyObservers(data);
</del><ins>+ notifyObservers(WTFMove(data));
</ins><span class="cx">
</span><span class="cx"> auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start);
</span><span class="cx"> auto difference = std::chrono::milliseconds(500) - duration;
</span></span></pre></div>
<a id="trunkSourceWebCorepageResourceUsageThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ResourceUsageThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ResourceUsageThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/ResourceUsageThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx"> static ResourceUsageThread& singleton();
</span><span class="cx">
</span><span class="cx"> void waitUntilObservers();
</span><del>- void notifyObservers(ResourceUsageData&);
</del><ins>+ void notifyObservers(ResourceUsageData&&);
</ins><span class="cx">
</span><span class="cx"> void createThreadIfNeeded();
</span><span class="cx"> static void threadCallback(void* scrollingThread);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/ScrollingThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -45,22 +45,22 @@
</span><span class="cx"> return threadIdentifier && currentThread() == threadIdentifier;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ScrollingThread::dispatch(std::function<void ()> function)
</del><ins>+void ScrollingThread::dispatch(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> auto& scrollingThread = ScrollingThread::singleton();
</span><span class="cx"> scrollingThread.createThreadIfNeeded();
</span><span class="cx">
</span><span class="cx"> {
</span><span class="cx"> std::lock_guard<Lock> lock(scrollingThread.m_functionsMutex);
</span><del>- scrollingThread.m_functions.append(function);
</del><ins>+ scrollingThread.m_functions.append(WTFMove(function));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> scrollingThread.wakeUpRunLoop();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void ScrollingThread::dispatchBarrier(std::function<void ()> function)
</del><ins>+void ScrollingThread::dispatchBarrier(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><del>- dispatch([function]() mutable {
</del><ins>+ dispatch([function = WTFMove(function)]() mutable {
</ins><span class="cx"> callOnMainThread(WTFMove(function));
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isCurrentThread());
</span><span class="cx">
</span><del>- Vector<std::function<void ()>> functions;
</del><ins>+ Vector<NoncopyableFunction> functions;
</ins><span class="cx">
</span><span class="cx"> {
</span><span class="cx"> std::lock_guard<Lock> lock(m_functionsMutex);
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingScrollingThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ScrollingThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ScrollingThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/ScrollingThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include <wtf/Forward.h>
</span><span class="cx"> #include <wtf/Lock.h>
</span><span class="cx"> #include <wtf/Noncopyable.h>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/Threading.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx">
</span><span class="lines">@@ -47,11 +48,11 @@
</span><span class="cx">
</span><span class="cx"> public:
</span><span class="cx"> static bool isCurrentThread();
</span><del>- WEBCORE_EXPORT static void dispatch(std::function<void ()>);
</del><ins>+ WEBCORE_EXPORT static void dispatch(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> // Will dispatch the given function on the main thread once all pending functions
</span><span class="cx"> // on the scrolling thread have finished executing. Used for synchronization purposes.
</span><del>- WEBCORE_EXPORT static void dispatchBarrier(std::function<void ()>);
</del><ins>+ WEBCORE_EXPORT static void dispatchBarrier(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> friend NeverDestroyed<ScrollingThread>;
</span><span class="lines">@@ -79,7 +80,7 @@
</span><span class="cx"> Lock m_initializeRunLoopMutex;
</span><span class="cx">
</span><span class="cx"> Lock m_functionsMutex;
</span><del>- Vector<std::function<void ()>> m_functions;
</del><ins>+ Vector<NoncopyableFunction> m_functions;
</ins><span class="cx">
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> // FIXME: We should use WebCore::RunLoop here.
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingiosScrollingTreeIOScpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/ios/ScrollingTreeIOS.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -67,9 +67,7 @@
</span><span class="cx"> // Since this can potentially be the last reference to the scrolling coordinator,
</span><span class="cx"> // we need to release it on the main thread since it has member variables (such as timers)
</span><span class="cx"> // that expect to be destroyed from the main thread.
</span><del>- ScrollingCoordinator* scrollingCoordinator = m_scrollingCoordinator.release().leakRef();
- callOnMainThread([scrollingCoordinator] {
- scrollingCoordinator->deref();
</del><ins>+ callOnMainThread([scrollingCoordinator = WTFMove(m_scrollingCoordinator)] {
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -86,10 +84,7 @@
</span><span class="cx"> if (nodeID == rootNode()->scrollingNodeID())
</span><span class="cx"> setMainFrameScrollPosition(scrollPosition);
</span><span class="cx">
</span><del>- RefPtr<AsyncScrollingCoordinator> scrollingCoordinator = m_scrollingCoordinator;
- bool localIsHandlingProgrammaticScroll = isHandlingProgrammaticScroll();
-
- callOnMainThread([scrollingCoordinator, nodeID, scrollPosition, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction] {
</del><ins>+ callOnMainThread([scrollingCoordinator = m_scrollingCoordinator, nodeID, scrollPosition, localIsHandlingProgrammaticScroll = isHandlingProgrammaticScroll(), scrollingLayerPositionAction] {
</ins><span class="cx"> scrollingCoordinator->scheduleUpdateScrollPositionAfterAsyncScroll(nodeID, scrollPosition, localIsHandlingProgrammaticScroll, scrollingLayerPositionAction);
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -123,8 +118,7 @@
</span><span class="cx"> if (!m_scrollingCoordinator)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- RefPtr<AsyncScrollingCoordinator> scrollingCoordinator = m_scrollingCoordinator;
- callOnMainThread([scrollingCoordinator, nodeID, horizontal, vertical] {
</del><ins>+ callOnMainThread([scrollingCoordinator = m_scrollingCoordinator, nodeID, horizontal, vertical] {
</ins><span class="cx"> scrollingCoordinator->setActiveScrollSnapIndices(nodeID, horizontal, vertical);
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorepagescrollingmacScrollingTreeFrameScrollingNodeMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/page/scrolling/mac/ScrollingTreeFrameScrollingNodeMac.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -75,11 +75,7 @@
</span><span class="cx"> if (m_verticalScrollerImp || m_horizontalScrollerImp) {
</span><span class="cx"> // FIXME: This is a workaround in place for the time being since NSScrollerImps cannot be deallocated
</span><span class="cx"> // on a non-main thread. rdar://problem/24535055
</span><del>- NSScrollerImp *retainedVerticalScrollerImp = m_verticalScrollerImp.leakRef();
- NSScrollerImp *retainedHorizontalScrollerImp = m_horizontalScrollerImp.leakRef();
- WTF::callOnMainThread([retainedVerticalScrollerImp, retainedHorizontalScrollerImp] {
- [retainedVerticalScrollerImp release];
- [retainedHorizontalScrollerImp release];
</del><ins>+ WTF::callOnMainThread([verticalScrollerImp = WTFMove(m_verticalScrollerImp), horizontalScrollerImp = WTFMove(m_horizontalScrollerImp)] {
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformMemoryPressureHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/MemoryPressureHandler.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -172,7 +172,9 @@
</span><span class="cx"> // FastMalloc has lock-free thread specific caches that can only be cleared from the thread itself.
</span><span class="cx"> WorkerThread::releaseFastMallocFreeMemoryInAllThreads();
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING) && !PLATFORM(IOS)
</span><del>- ScrollingThread::dispatch(WTF::releaseFastMallocFreeMemory);
</del><ins>+ ScrollingThread::dispatch([]() {
+ WTF::releaseFastMallocFreeMemory();
+ });
</ins><span class="cx"> #endif
</span><span class="cx"> WTF::releaseFastMallocFreeMemory();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformaudioiosMediaSessionManagerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/audio/ios/MediaSessionManagerIOS.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -396,10 +396,7 @@
</span><span class="cx"> LOG(Media, "-[WebMediaSessionHelper dealloc]");
</span><span class="cx">
</span><span class="cx"> if (!isMainThread()) {
</span><del>- auto volumeView = WTFMove(_volumeView);
- auto routingController = WTFMove(_airPlayPresenceRoutingController);
-
- callOnMainThread([volumeView, routingController] () mutable {
</del><ins>+ callOnMainThread([volumeView = WTFMove(_volumeView), routingController = WTFMove(_airPlayPresenceRoutingController)] () mutable {
</ins><span class="cx"> LOG(Media, "-[WebMediaSessionHelper dealloc] - dipatched to MainThread");
</span><span class="cx">
</span><span class="cx"> volumeView.clear();
</span><span class="lines">@@ -435,15 +432,14 @@
</span><span class="cx">
</span><span class="cx"> LOG(Media, "-[WebMediaSessionHelper startMonitoringAirPlayRoutes]");
</span><span class="cx">
</span><del>- RetainPtr<WebMediaSessionHelper> strongSelf = self;
- callOnMainThread([strongSelf] () {
</del><ins>+ callOnMainThread([protectedSelf = RetainPtr<WebMediaSessionHelper>(self)] () {
</ins><span class="cx"> LOG(Media, "-[WebMediaSessionHelper startMonitoringAirPlayRoutes] - dipatched to MainThread");
</span><span class="cx">
</span><del>- if (strongSelf->_airPlayPresenceRoutingController)
</del><ins>+ if (protectedSelf->_airPlayPresenceRoutingController)
</ins><span class="cx"> return;
</span><span class="cx">
</span><del>- strongSelf->_airPlayPresenceRoutingController = adoptNS([allocMPAVRoutingControllerInstance() initWithName:@"WebCore - HTML media element checking for AirPlay route presence"]);
- [strongSelf->_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModePresence];
</del><ins>+ protectedSelf->_airPlayPresenceRoutingController = adoptNS([allocMPAVRoutingControllerInstance() initWithName:@"WebCore - HTML media element checking for AirPlay route presence"]);
+ [protectedSelf->_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModePresence];
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -454,15 +450,14 @@
</span><span class="cx">
</span><span class="cx"> LOG(Media, "-[WebMediaSessionHelper stopMonitoringAirPlayRoutes]");
</span><span class="cx">
</span><del>- RetainPtr<WebMediaSessionHelper> strongSelf = self;
- callOnMainThread([strongSelf] () {
</del><ins>+ callOnMainThread([protectedSelf = RetainPtr<WebMediaSessionHelper>(self)] () {
</ins><span class="cx"> LOG(Media, "-[WebMediaSessionHelper stopMonitoringAirPlayRoutes] - dipatched to MainThread");
</span><span class="cx">
</span><del>- if (!strongSelf->_airPlayPresenceRoutingController)
</del><ins>+ if (!protectedSelf->_airPlayPresenceRoutingController)
</ins><span class="cx"> return;
</span><span class="cx">
</span><del>- [strongSelf->_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModeDisabled];
- strongSelf->_airPlayPresenceRoutingController = nil;
</del><ins>+ [protectedSelf->_airPlayPresenceRoutingController setDiscoveryMode:MPRouteDiscoveryModeDisabled];
+ protectedSelf->_airPlayPresenceRoutingController = nil;
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationAudioSourceProviderAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -323,9 +323,8 @@
</span><span class="cx"> memset(m_list.get(), 0, bufferListSize);
</span><span class="cx"> m_list->mNumberBuffers = numberOfChannels;
</span><span class="cx">
</span><del>- RefPtr<AudioSourceProviderAVFObjC> strongThis = this;
- callOnMainThread([strongThis, numberOfChannels, sampleRate] {
- strongThis->m_client->setFormat(numberOfChannels, sampleRate);
</del><ins>+ callOnMainThread([protectedThis = Ref<AudioSourceProviderAVFObjC>(*this), numberOfChannels, sampleRate] {
+ protectedThis->m_client->setFormat(numberOfChannels, sampleRate);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationMediaPlayerPrivateAVFoundationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -806,8 +806,7 @@
</span><span class="cx"> if (delayDispatch && !m_mainThreadCallPending) {
</span><span class="cx"> m_mainThreadCallPending = true;
</span><span class="cx">
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis] {
</del><ins>+ callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -844,8 +843,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (!m_queuedNotifications.isEmpty() && !m_mainThreadCallPending) {
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis] {
</del><ins>+ callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcCDMSessionAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVFoundationObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -84,10 +84,10 @@
</span><span class="cx"> if ([keyPath isEqualTo:@"outputObscuredDueToInsufficientExternalProtection"]) {
</span><span class="cx"> if ([[change valueForKey:NSKeyValueChangeNewKey] intValue] == 1) {
</span><span class="cx"> RetainPtr<NSError> error = [NSError errorWithDomain:@"com.apple.WebKit" code:'HDCP' userInfo:nil];
</span><del>- RetainPtr<WebCDMSessionAVFoundationObjCListener> strongSelf = { self };
- callOnMainThread([strongSelf, error] {
- if (strongSelf->_parent)
- strongSelf->_parent->playerDidReceiveError(error.get());
</del><ins>+ RetainPtr<WebCDMSessionAVFoundationObjCListener> protectedSelf = { self };
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), error = WTFMove(error)] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->playerDidReceiveError(error.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> } else
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlaybackTargetPickerMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlaybackTargetPickerMac.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -185,16 +185,16 @@
</span><span class="cx"> if (![keyPath isEqualToString:externalOutputDeviceAvailableKeyName] && ![keyPath isEqualToString:externalOutputDevicePickedKeyName])
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- RetainPtr<WebAVOutputDeviceMenuControllerHelper> strongSelf = self;
- RetainPtr<NSString> strongKeyPath = keyPath;
- callOnMainThread([strongSelf, strongKeyPath] {
- MediaPlaybackTargetPickerMac* callback = strongSelf->m_callback;
</del><ins>+ RetainPtr<WebAVOutputDeviceMenuControllerHelper> protectedSelf = self;
+ RetainPtr<NSString> protectedKeyPath = keyPath;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedKeyPath = WTFMove(protectedKeyPath)] {
+ MediaPlaybackTargetPickerMac* callback = protectedSelf->m_callback;
</ins><span class="cx"> if (!callback)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- if ([strongKeyPath isEqualToString:externalOutputDeviceAvailableKeyName])
</del><ins>+ if ([protectedKeyPath isEqualToString:externalOutputDeviceAvailableKeyName])
</ins><span class="cx"> callback->availableDevicesDidChange();
</span><del>- else if ([strongKeyPath isEqualToString:externalOutputDevicePickedKeyName])
</del><ins>+ else if ([protectedKeyPath isEqualToString:externalOutputDevicePickedKeyName])
</ins><span class="cx"> callback->currentDeviceDidChange();
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -701,8 +701,7 @@
</span><span class="cx"> if (!m_avPlayer || m_haveBeenAskedToCreateLayer)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([this, weakThis] {
</del><ins>+ callOnMainThread([this, weakThis = createWeakPtr()] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="lines">@@ -3441,15 +3440,15 @@
</span><span class="cx"> if (!m_callback)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- RetainPtr<WebCoreAVFMovieObserver> strongSelf = self;
- RetainPtr<NSArray> strongStrings = strings;
- RetainPtr<NSArray> strongSamples = nativeSamples;
- callOnMainThread([strongSelf, strongStrings, strongSamples, itemTime] {
- MediaPlayerPrivateAVFoundationObjC* callback = strongSelf->m_callback;
</del><ins>+ RetainPtr<WebCoreAVFMovieObserver> protectedSelf = self;
+ RetainPtr<NSArray> protectedStrings = strings;
+ RetainPtr<NSArray> protectedNativeSamples = nativeSamples;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedStrings = WTFMove(protectedStrings), protectedNativeSamples = WTFMove(protectedNativeSamples), itemTime] {
+ MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf->m_callback;
</ins><span class="cx"> if (!callback)
</span><span class="cx"> return;
</span><span class="cx"> MediaTime time = std::max(toMediaTime(itemTime), MediaTime::zeroTime());
</span><del>- callback->processCue(strongStrings.get(), strongSamples.get(), time);
</del><ins>+ callback->processCue(protectedStrings.get(), protectedNativeSamples.get(), time);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -3460,9 +3459,8 @@
</span><span class="cx"> if (!m_callback)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- RetainPtr<WebCoreAVFMovieObserver> strongSelf = self;
- callOnMainThread([strongSelf] {
- if (MediaPlayerPrivateAVFoundationObjC* callback = strongSelf->m_callback)
</del><ins>+ callOnMainThread([protectedSelf = RetainPtr<WebCoreAVFMovieObserver>(self)] {
+ if (MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf->m_callback)
</ins><span class="cx"> callback->flushCues();
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -3488,17 +3486,17 @@
</span><span class="cx"> if (!m_callback)
</span><span class="cx"> return NO;
</span><span class="cx">
</span><del>- RetainPtr<WebCoreAVFLoaderDelegate> strongSelf = self;
- RetainPtr<AVAssetResourceLoadingRequest> strongRequest = loadingRequest;
- callOnMainThread([strongSelf, strongRequest] {
- MediaPlayerPrivateAVFoundationObjC* callback = strongSelf->m_callback;
</del><ins>+ RetainPtr<WebCoreAVFLoaderDelegate> protectedSelf = self;
+ RetainPtr<AVAssetResourceLoadingRequest> protectedLoadingRequest = loadingRequest;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedLoadingRequest = WTFMove(protectedLoadingRequest)] {
+ MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf->m_callback;
</ins><span class="cx"> if (!callback) {
</span><del>- [strongRequest finishLoadingWithError:nil];
</del><ins>+ [protectedLoadingRequest finishLoadingWithError:nil];
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (!callback->shouldWaitForLoadingOfResource(strongRequest.get()))
- [strongRequest finishLoadingWithError:nil];
</del><ins>+ if (!callback->shouldWaitForLoadingOfResource(protectedLoadingRequest.get()))
+ [protectedLoadingRequest finishLoadingWithError:nil];
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return YES;
</span><span class="lines">@@ -3513,17 +3511,17 @@
</span><span class="cx"> if ([[[challenge protectionSpace] authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust])
</span><span class="cx"> return NO;
</span><span class="cx">
</span><del>- RetainPtr<WebCoreAVFLoaderDelegate> strongSelf = self;
- RetainPtr<NSURLAuthenticationChallenge> strongChallenge = challenge;
- callOnMainThread([strongSelf, strongChallenge] {
- MediaPlayerPrivateAVFoundationObjC* callback = strongSelf->m_callback;
</del><ins>+ RetainPtr<WebCoreAVFLoaderDelegate> protectedSelf = self;
+ RetainPtr<NSURLAuthenticationChallenge> protectedChallenge = challenge;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedChallenge = WTFMove(protectedChallenge)] {
+ MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf->m_callback;
</ins><span class="cx"> if (!callback) {
</span><del>- [[strongChallenge sender] cancelAuthenticationChallenge:strongChallenge.get()];
</del><ins>+ [[protectedChallenge sender] cancelAuthenticationChallenge:protectedChallenge.get()];
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- if (!callback->shouldWaitForResponseToAuthenticationChallenge(strongChallenge.get()))
- [[strongChallenge sender] cancelAuthenticationChallenge:strongChallenge.get()];
</del><ins>+ if (!callback->shouldWaitForResponseToAuthenticationChallenge(protectedChallenge.get()))
+ [[protectedChallenge sender] cancelAuthenticationChallenge:protectedChallenge.get()];
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> return YES;
</span><span class="lines">@@ -3535,12 +3533,12 @@
</span><span class="cx"> if (!m_callback)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- RetainPtr<WebCoreAVFLoaderDelegate> strongSelf = self;
- RetainPtr<AVAssetResourceLoadingRequest> strongRequest = loadingRequest;
- callOnMainThread([strongSelf, strongRequest] {
- MediaPlayerPrivateAVFoundationObjC* callback = strongSelf->m_callback;
</del><ins>+ RetainPtr<WebCoreAVFLoaderDelegate> protectedSelf = self;
+ RetainPtr<AVAssetResourceLoadingRequest> protectedLoadingRequest = loadingRequest;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedLoadingRequest = WTFMove(protectedLoadingRequest)] {
+ MediaPlayerPrivateAVFoundationObjC* callback = protectedSelf->m_callback;
</ins><span class="cx"> if (callback)
</span><del>- callback->didCancelLoadingRequest(strongRequest.get());
</del><ins>+ callback->didCancelLoadingRequest(protectedLoadingRequest.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaSourceAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -129,8 +129,7 @@
</span><span class="cx"> static void CMTimebaseEffectiveRateChangedCallback(CMNotificationCenterRef, const void *listener, CFStringRef, const void *, CFTypeRef)
</span><span class="cx"> {
</span><span class="cx"> MediaPlayerPrivateMediaSourceAVFObjC* player = (MediaPlayerPrivateMediaSourceAVFObjC*)listener;
</span><del>- auto weakThis = player->createWeakPtr();
- callOnMainThread([weakThis]{
</del><ins>+ callOnMainThread([weakThis = player->createWeakPtr()] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx"> weakThis.get()->effectiveRateChanged();
</span><span class="lines">@@ -312,8 +311,7 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateMediaSourceAVFObjC::play()
</span><span class="cx"> {
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis]{
</del><ins>+ callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx"> weakThis.get()->playInternal();
</span><span class="lines">@@ -332,8 +330,7 @@
</span><span class="cx">
</span><span class="cx"> void MediaPlayerPrivateMediaSourceAVFObjC::pause()
</span><span class="cx"> {
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis]{
</del><ins>+ callOnMainThread([weakThis = createWeakPtr()] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx"> weakThis.get()->pauseInternal();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "MediaPlayerPrivate.h"
</span><span class="cx"> #include "MediaStreamPrivate.h"
</span><span class="cx"> #include <wtf/MediaTime.h>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx"> #include <wtf/WeakPtr.h>
</span><span class="cx">
</span><span class="lines">@@ -142,7 +143,7 @@
</span><span class="cx"> void updateTracks();
</span><span class="cx"> void renderingModeChanged();
</span><span class="cx">
</span><del>- void scheduleDeferredTask(std::function<void()>);
</del><ins>+ void scheduleDeferredTask(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> enum DisplayMode {
</span><span class="cx"> None,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateMediaStreamAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -624,11 +624,10 @@
</span><span class="cx"> m_player->networkStateChanged();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask(std::function<void()> function)
</del><ins>+void MediaPlayerPrivateMediaStreamAVFObjC::scheduleDeferredTask(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(function);
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis, function] {
</del><ins>+ callOnMainThread([weakThis = createWeakPtr(), function = WTFMove(function)] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcSourceBufferPrivateAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -179,12 +179,12 @@
</span><span class="cx"> UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx"> ASSERT(streamDataParser == _parser);
</span><del>- RetainPtr<WebAVStreamDataParserListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVStreamDataParserListener> protectedSelf = self;
</ins><span class="cx">
</span><del>- RetainPtr<AVAsset*> strongAsset = asset;
- callOnMainThread([strongSelf, strongAsset] {
- if (strongSelf->_parent)
- strongSelf->_parent->didParseStreamDataAsAsset(strongAsset.get());
</del><ins>+ RetainPtr<AVAsset*> protectedAsset = asset;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedAsset = WTFMove(protectedAsset)] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->didParseStreamDataAsAsset(protectedAsset.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -195,12 +195,12 @@
</span><span class="cx"> UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx"> ASSERT(streamDataParser == _parser);
</span><del>- RetainPtr<WebAVStreamDataParserListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVStreamDataParserListener> protectedSelf = self;
</ins><span class="cx">
</span><del>- RetainPtr<AVAsset*> strongAsset = asset;
- callOnMainThread([strongSelf, strongAsset] {
- if (strongSelf->_parent)
- strongSelf->_parent->didParseStreamDataAsAsset(strongAsset.get());
</del><ins>+ RetainPtr<AVAsset*> protectedAsset = asset;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedAsset = WTFMove(protectedAsset)] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->didParseStreamDataAsAsset(protectedAsset.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -210,12 +210,12 @@
</span><span class="cx"> UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx"> ASSERT(streamDataParser == _parser);
</span><del>- RetainPtr<WebAVStreamDataParserListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVStreamDataParserListener> protectedSelf = self;
</ins><span class="cx">
</span><del>- RetainPtr<NSError> strongError = error;
- callOnMainThread([strongSelf, strongError] {
- if (strongSelf->_parent)
- strongSelf->_parent->didFailToParseStreamDataWithError(strongError.get());
</del><ins>+ RetainPtr<NSError> protectedError = error;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedError = WTFMove(protectedError)] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->didFailToParseStreamDataWithError(protectedError.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -225,13 +225,13 @@
</span><span class="cx"> UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx"> ASSERT(streamDataParser == _parser);
</span><del>- RetainPtr<WebAVStreamDataParserListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVStreamDataParserListener> protectedSelf = self;
</ins><span class="cx">
</span><del>- RetainPtr<CMSampleBufferRef> strongSample = sample;
</del><ins>+ RetainPtr<CMSampleBufferRef> protectedSample = sample;
</ins><span class="cx"> String mediaType = nsMediaType;
</span><del>- callOnMainThread([strongSelf, strongSample, trackID, mediaType, flags] {
- if (strongSelf->_parent)
- strongSelf->_parent->didProvideMediaDataForTrackID(trackID, strongSample.get(), mediaType, flags);
</del><ins>+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedSample = WTFMove(protectedSample), trackID, mediaType, flags] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->didProvideMediaDataForTrackID(trackID, protectedSample.get(), mediaType, flags);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -241,12 +241,12 @@
</span><span class="cx"> UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx"> ASSERT(streamDataParser == _parser);
</span><del>- RetainPtr<WebAVStreamDataParserListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVStreamDataParserListener> protectedSelf = self;
</ins><span class="cx">
</span><span class="cx"> String mediaType = nsMediaType;
</span><del>- callOnMainThread([strongSelf, trackID, mediaType] {
- if (strongSelf->_parent)
- strongSelf->_parent->didReachEndOfTrackWithTrackID(trackID, mediaType);
</del><ins>+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), trackID, mediaType] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->didReachEndOfTrackWithTrackID(trackID, mediaType);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -272,13 +272,12 @@
</span><span class="cx"> UNUSED_PARAM(streamDataParser);
</span><span class="cx"> #endif
</span><span class="cx"> ASSERT(streamDataParser == _parser);
</span><del>- RetainPtr<WebAVStreamDataParserListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVStreamDataParserListener> protectedSelf = self;
</ins><span class="cx">
</span><del>- RetainPtr<NSData> strongData = initData;
</del><span class="cx"> OSObjectPtr<dispatch_semaphore_t> hasSessionSemaphore = adoptOSObject(dispatch_semaphore_create(0));
</span><del>- callOnMainThread([strongSelf, strongData, trackID, hasSessionSemaphore] {
- if (strongSelf->_parent)
- strongSelf->_parent->didProvideContentKeyRequestInitializationDataForTrackID(strongData.get(), trackID, hasSessionSemaphore);
</del><ins>+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), protectedInitData = RetainPtr<NSData>(initData), trackID, hasSessionSemaphore = WTFMove(hasSessionSemaphore)] {
+ if (protectedSelf->_parent)
+ protectedSelf->_parent->didProvideContentKeyRequestInitializationDataForTrackID(protectedInitData.get(), trackID, hasSessionSemaphore);
</ins><span class="cx"> });
</span><span class="cx"> dispatch_semaphore_wait(hasSessionSemaphore.get(), DISPATCH_TIME_FOREVER);
</span><span class="cx"> }
</span><span class="lines">@@ -382,21 +381,21 @@
</span><span class="cx"> UNUSED_PARAM(keyPath);
</span><span class="cx"> ASSERT(_parent);
</span><span class="cx">
</span><del>- RetainPtr<WebAVSampleBufferErrorListener> strongSelf = self;
</del><ins>+ RetainPtr<WebAVSampleBufferErrorListener> protectedSelf = self;
</ins><span class="cx"> if ([object isKindOfClass:getAVSampleBufferDisplayLayerClass()]) {
</span><span class="cx"> RetainPtr<AVSampleBufferDisplayLayer> layer = (AVSampleBufferDisplayLayer *)object;
</span><span class="cx"> ASSERT(_layers.contains(layer.get()));
</span><span class="cx">
</span><span class="cx"> if ([keyPath isEqualTo:@"error"]) {
</span><span class="cx"> RetainPtr<NSError> error = [change valueForKey:NSKeyValueChangeNewKey];
</span><del>- callOnMainThread([strongSelf, layer, error] {
- strongSelf->_parent->layerDidReceiveError(layer.get(), error.get());
</del><ins>+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
+ protectedSelf->_parent->layerDidReceiveError(layer.get(), error.get());
</ins><span class="cx"> });
</span><span class="cx"> } else if ([keyPath isEqualTo:@"outputObscuredDueToInsufficientExternalProtection"]) {
</span><span class="cx"> if ([[change valueForKey:NSKeyValueChangeNewKey] boolValue]) {
</span><span class="cx"> RetainPtr<NSError> error = [NSError errorWithDomain:@"com.apple.WebKit" code:'HDCP' userInfo:nil];
</span><del>- callOnMainThread([strongSelf, layer, error] {
- strongSelf->_parent->layerDidReceiveError(layer.get(), error.get());
</del><ins>+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
+ protectedSelf->_parent->layerDidReceiveError(layer.get(), error.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> } else
</span><span class="lines">@@ -409,8 +408,8 @@
</span><span class="cx"> ASSERT(_renderers.contains(renderer.get()));
</span><span class="cx"> ASSERT([keyPath isEqualTo:@"error"]);
</span><span class="cx">
</span><del>- callOnMainThread([strongSelf, renderer, error] {
- strongSelf->_parent->rendererDidReceiveError(renderer.get(), error.get());
</del><ins>+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), renderer = WTFMove(renderer), error = WTFMove(error)] {
+ protectedSelf->_parent->rendererDidReceiveError(renderer.get(), error.get());
</ins><span class="cx"> });
</span><span class="cx"> } else
</span><span class="cx"> ASSERT_NOT_REACHED();
</span><span class="lines">@@ -421,11 +420,11 @@
</span><span class="cx"> RetainPtr<AVSampleBufferDisplayLayer> layer = (AVSampleBufferDisplayLayer *)[note object];
</span><span class="cx"> RetainPtr<NSError> error = [[note userInfo] valueForKey:AVSampleBufferDisplayLayerFailedToDecodeNotificationErrorKey];
</span><span class="cx">
</span><del>- RetainPtr<WebAVSampleBufferErrorListener> strongSelf = self;
- callOnMainThread([strongSelf, layer, error] {
- if (!strongSelf->_parent || !strongSelf->_layers.contains(layer.get()))
</del><ins>+ RetainPtr<WebAVSampleBufferErrorListener> protectedSelf = self;
+ callOnMainThread([protectedSelf = WTFMove(protectedSelf), layer = WTFMove(layer), error = WTFMove(error)] {
+ if (!protectedSelf->_parent || !protectedSelf->_layers.contains(layer.get()))
</ins><span class="cx"> return;
</span><del>- strongSelf->_parent->layerDidReceiveError(layer.get(), error.get());
</del><ins>+ protectedSelf->_parent->layerDidReceiveError(layer.get(), error.get());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> @end
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -295,8 +295,7 @@
</span><span class="cx">
</span><span class="cx"> static void patternReleaseCallback(void* info)
</span><span class="cx"> {
</span><del>- auto image = static_cast<CGImageRef>(info);
- callOnMainThread([image] {
</del><ins>+ callOnMainThread([image = static_cast<CGImageRef>(info)] {
</ins><span class="cx"> CGImageRelease(image);
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgPatternCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/cg/PatternCG.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -56,9 +56,7 @@
</span><span class="cx">
</span><span class="cx"> static void patternReleaseCallback(void* info)
</span><span class="cx"> {
</span><del>- auto image = static_cast<CGImageRef>(info);
-
- callOnMainThread([image] {
</del><ins>+ callOnMainThread([image = static_cast<CGImageRef>(info)] {
</ins><span class="cx"> CGImageRelease(image);
</span><span class="cx"> });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswinMediaPlayerPrivateMediaFoundationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -486,8 +486,7 @@
</span><span class="cx"> hr = asyncResult->GetStatus();
</span><span class="cx"> m_loadingProgress = SUCCEEDED(hr);
</span><span class="cx">
</span><del>- auto weakPtr = m_weakPtrFactory.createWeakPtr();
- callOnMainThread([weakPtr] {
</del><ins>+ callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx"> if (!weakPtr)
</span><span class="cx"> return;
</span><span class="cx"> weakPtr->onCreatedMediaSource();
</span><span class="lines">@@ -516,8 +515,7 @@
</span><span class="cx">
</span><span class="cx"> switch (mediaEventType) {
</span><span class="cx"> case MESessionTopologySet: {
</span><del>- auto weakPtr = m_weakPtrFactory.createWeakPtr();
- callOnMainThread([weakPtr] {
</del><ins>+ callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx"> if (!weakPtr)
</span><span class="cx"> return;
</span><span class="cx"> weakPtr->onTopologySet();
</span><span class="lines">@@ -526,8 +524,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> case MEBufferingStarted: {
</span><del>- auto weakPtr = m_weakPtrFactory.createWeakPtr();
- callOnMainThread([weakPtr] {
</del><ins>+ callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx"> if (!weakPtr)
</span><span class="cx"> return;
</span><span class="cx"> weakPtr->onBufferingStarted();
</span><span class="lines">@@ -536,8 +533,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> case MEBufferingStopped: {
</span><del>- auto weakPtr = m_weakPtrFactory.createWeakPtr();
- callOnMainThread([weakPtr] {
</del><ins>+ callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx"> if (!weakPtr)
</span><span class="cx"> return;
</span><span class="cx"> weakPtr->onBufferingStopped();
</span><span class="lines">@@ -546,8 +542,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> case MESessionEnded: {
</span><del>- auto weakPtr = m_weakPtrFactory.createWeakPtr();
- callOnMainThread([weakPtr] {
</del><ins>+ callOnMainThread([weakPtr = m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx"> if (!weakPtr)
</span><span class="cx"> return;
</span><span class="cx"> weakPtr->onSessionEnded();
</span><span class="lines">@@ -1675,8 +1670,7 @@
</span><span class="cx">
</span><span class="cx"> // Invalidate the video area
</span><span class="cx"> if (m_mediaPlayer) {
</span><del>- auto weakPtr = m_mediaPlayer->m_weakPtrFactory.createWeakPtr();
- callOnMainThread([weakPtr] {
</del><ins>+ callOnMainThread([weakPtr = m_mediaPlayer->m_weakPtrFactory.createWeakPtr()] {
</ins><span class="cx"> if (weakPtr)
</span><span class="cx"> weakPtr->invalidateFrameView();
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -299,11 +299,10 @@
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void MediaStreamPrivate::scheduleDeferredTask(std::function<void()> function)
</del><ins>+void MediaStreamPrivate::scheduleDeferredTask(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(function);
</span><del>- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis, function] {
</del><ins>+ callOnMainThread([weakThis = createWeakPtr(), function = WTFMove(function)] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreamMediaStreamPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include "MediaStreamTrackPrivate.h"
</span><span class="cx"> #include <wtf/HashMap.h>
</span><span class="cx"> #include <wtf/MediaTime.h>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="lines">@@ -111,7 +112,7 @@
</span><span class="cx"> void characteristicsChanged();
</span><span class="cx"> void updateActiveVideoTrack();
</span><span class="cx">
</span><del>- void scheduleDeferredTask(std::function<void()>);
</del><ins>+ void scheduleDeferredTask(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> WeakPtrFactory<MediaStreamPrivate> m_weakPtrFactory;
</span><span class="cx"> Vector<Observer*> m_observers;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include "GenericTaskQueue.h"
</span><span class="cx"> #include "RealtimeMediaSource.h"
</span><span class="cx"> #include "Timer.h"
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/RetainPtr.h>
</span><span class="cx"> #include <wtf/WeakPtr.h>
</span><span class="cx">
</span><span class="lines">@@ -85,7 +86,7 @@
</span><span class="cx"> void setVideoSampleBufferDelegate(AVCaptureVideoDataOutput*);
</span><span class="cx"> void setAudioSampleBufferDelegate(AVCaptureAudioDataOutput*);
</span><span class="cx">
</span><del>- void scheduleDeferredTask(std::function<void ()>);
</del><ins>+ void scheduleDeferredTask(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> void setupSession();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacAVMediaCaptureSourcemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -240,12 +240,10 @@
</span><span class="cx"> [audioOutput setSampleBufferDelegate:m_objcObserver.get() queue:globaAudioCaptureSerialQueue()];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void AVMediaCaptureSource::scheduleDeferredTask(std::function<void ()> function)
</del><ins>+void AVMediaCaptureSource::scheduleDeferredTask(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(function);
</span><del>-
- auto weakThis = createWeakPtr();
- callOnMainThread([weakThis, function] {
</del><ins>+ callOnMainThread([weakThis = createWeakPtr(), function = WTFMove(function)] {
</ins><span class="cx"> if (!weakThis)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacRealtimeMediaSourceCenterMaccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -163,10 +163,9 @@
</span><span class="cx"> bool RealtimeMediaSourceCenterMac::getMediaStreamTrackSources(PassRefPtr<MediaStreamTrackSourcesRequestClient> prpClient)
</span><span class="cx"> {
</span><span class="cx"> RefPtr<MediaStreamTrackSourcesRequestClient> requestClient = prpClient;
</span><del>-
</del><span class="cx"> TrackSourceInfoVector sources = AVCaptureDeviceManager::singleton().getSourcesInfo(requestClient->requestOrigin());
</span><span class="cx">
</span><del>- callOnMainThread([this, requestClient, sources] {
</del><ins>+ callOnMainThread([this, requestClient = WTFMove(requestClient), sources = WTFMove(sources)] {
</ins><span class="cx"> requestClient->didCompleteTrackSourceInfoRequest(sources);
</span><span class="cx"> });
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmediastreammacWebAudioSourceProviderAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -214,10 +214,10 @@
</span><span class="cx"> memset(m_list.get(), 0, m_listBufferSize);
</span><span class="cx"> m_list->mNumberBuffers = numberOfChannels;
</span><span class="cx">
</span><del>- RefPtr<WebAudioSourceProviderAVFObjC> strongThis = this;
- callOnMainThread([strongThis, numberOfChannels, sampleRate] {
- if (strongThis->m_client)
- strongThis->m_client->setFormat(numberOfChannels, sampleRate);
</del><ins>+ RefPtr<WebAudioSourceProviderAVFObjC> protectedThis = this;
+ callOnMainThread([protectedThis = WTFMove(protectedThis), numberOfChannels, sampleRate] {
+ if (protectedThis->m_client)
+ protectedThis->m_client->setFormat(numberOfChannels, sampleRate);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformmockMockRealtimeMediaSourceCentercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeMediaSourceCenter.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -159,7 +159,7 @@
</span><span class="cx"> sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockAudioSourcePersistentID(), nullptr));
</span><span class="cx"> sources.append(MockRealtimeMediaSource::trackSourceWithUID(MockRealtimeMediaSource::mockVideoSourcePersistentID(), nullptr));
</span><span class="cx">
</span><del>- callOnMainThread([this, requestClient, sources] {
</del><ins>+ callOnMainThread([this, requestClient = WTFMove(requestClient), sources = WTFMove(sources)] {
</ins><span class="cx"> requestClient->didCompleteTrackSourceInfoRequest(sources);
</span><span class="cx"> });
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkBlobResourceHandlecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/BlobResourceHandle.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -187,10 +187,8 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- RefPtr<BlobResourceHandle> protectedThis(this);
-
</del><span class="cx"> // Finish this async call quickly and return.
</span><del>- callOnMainThread([protectedThis] {
</del><ins>+ callOnMainThread([protectedThis = Ref<BlobResourceHandle>(*this)]() mutable {
</ins><span class="cx"> protectedThis->doStart();
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="lines">@@ -665,9 +663,8 @@
</span><span class="cx">
</span><span class="cx"> // Schedule to notify the client from a standalone function because the client might dispose the handle immediately from the callback function
</span><span class="cx"> // while we still have BlobResourceHandle calls in the stack.
</span><del>- RefPtr<BlobResourceHandle> protectedThis(this);
- callOnMainThread([protectedThis] {
- doNotifyFinish(*protectedThis);
</del><ins>+ callOnMainThread([protectedThis = Ref<BlobResourceHandle>(*this)]() mutable {
+ doNotifyFinish(protectedThis);
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkDataURLDecodercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/DataURLDecoder.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -168,25 +168,21 @@
</span><span class="cx"> task.result.data = SharedBuffer::adoptVector(buffer);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void decode(const URL& url, const ScheduleContext& scheduleContext, DecodeCompletionHandler completionHandler)
</del><ins>+void decode(const URL& url, const ScheduleContext& scheduleContext, DecodeCompletionHandler&& completionHandler)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(url.protocolIsData());
</span><span class="cx">
</span><span class="cx"> auto decodeTask = createDecodeTask(url, scheduleContext, WTFMove(completionHandler));
</span><del>- auto* decodeTaskPtr = decodeTask.release();
- decodeQueue().dispatch([decodeTaskPtr] {
- auto& decodeTask = *decodeTaskPtr;
-
- if (decodeTask.isBase64)
- decodeBase64(decodeTask);
</del><ins>+ decodeQueue().dispatch([decodeTask = WTFMove(decodeTask)]() mutable {
+ if (decodeTask->isBase64)
+ decodeBase64(*decodeTask);
</ins><span class="cx"> else
</span><del>- decodeEscaped(decodeTask);
</del><ins>+ decodeEscaped(*decodeTask);
</ins><span class="cx">
</span><span class="cx"> #if HAVE(RUNLOOP_TIMER)
</span><del>- DecodingResultDispatcher::dispatch(std::unique_ptr<DecodeTask>(decodeTaskPtr));
</del><ins>+ DecodingResultDispatcher::dispatch(WTFMove(decodeTask));
</ins><span class="cx"> #else
</span><del>- callOnMainThread([decodeTaskPtr] {
- std::unique_ptr<DecodeTask> decodeTask(decodeTaskPtr);
</del><ins>+ callOnMainThread([decodeTask = WTFMove(decodeTask)] {
</ins><span class="cx"> if (!decodeTask->result.data) {
</span><span class="cx"> decodeTask->completionHandler({ });
</span><span class="cx"> return;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkDataURLDecoderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/DataURLDecoder.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/DataURLDecoder.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/DataURLDecoder.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx">
</span><del>-void decode(const URL&, const ScheduleContext&, DecodeCompletionHandler);
</del><ins>+void decode(const URL&, const ScheduleContext&, DecodeCompletionHandler&&);
</ins><span class="cx">
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcocoaWebCoreNSURLSessionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -92,10 +92,7 @@
</span><span class="cx"> for (auto& task : _dataTasks)
</span><span class="cx"> task.get().session = nil;
</span><span class="cx">
</span><del>- // FIXME(C++14): When we can move RefPtrs directly into blocks, replace this with a RefPtr&&:
- WebCore::PlatformMediaResourceLoader* loader = _loader.leakRef();
- callOnMainThread([loader] {
- loader->deref();
</del><ins>+ callOnMainThread([loader = WTFMove(_loader)] {
</ins><span class="cx"> });
</span><span class="cx"> [super dealloc];
</span><span class="cx"> }
</span><span class="lines">@@ -466,34 +463,31 @@
</span><span class="cx"> - (void)cancel
</span><span class="cx"> {
</span><span class="cx"> self.state = NSURLSessionTaskStateCanceling;
</span><del>- RetainPtr<WebCoreNSURLSessionDataTask> strongSelf { self };
- callOnMainThread([strongSelf] {
- [strongSelf _cancel];
- [strongSelf _finish];
</del><ins>+ callOnMainThread([protectedSelf = RetainPtr<WebCoreNSURLSessionDataTask>(self)] {
+ [protectedSelf _cancel];
+ [protectedSelf _finish];
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)suspend
</span><span class="cx"> {
</span><del>- RetainPtr<WebCoreNSURLSessionDataTask> strongSelf { self };
- callOnMainThread([strongSelf] {
</del><ins>+ callOnMainThread([protectedSelf = RetainPtr<WebCoreNSURLSessionDataTask>(self)] {
</ins><span class="cx"> // NSURLSessionDataTasks must start over after suspending, so while
</span><span class="cx"> // we could defer loading at this point, instead cancel and restart
</span><span class="cx"> // upon resume so as to adhere to NSURLSessionDataTask semantics.
</span><del>- [strongSelf _cancel];
- strongSelf.get().state = NSURLSessionTaskStateSuspended;
</del><ins>+ [protectedSelf _cancel];
+ protectedSelf.get().state = NSURLSessionTaskStateSuspended;
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> - (void)resume
</span><span class="cx"> {
</span><del>- RetainPtr<WebCoreNSURLSessionDataTask> strongSelf { self };
- callOnMainThread([strongSelf] {
- if (strongSelf.get().state != NSURLSessionTaskStateSuspended)
</del><ins>+ callOnMainThread([protectedSelf = RetainPtr<WebCoreNSURLSessionDataTask>(self)] {
+ if (protectedSelf.get().state != NSURLSessionTaskStateSuspended)
</ins><span class="cx"> return;
</span><span class="cx">
</span><del>- [strongSelf _restart];
- strongSelf.get().state = NSURLSessionTaskStateRunning;
</del><ins>+ [protectedSelf _restart];
+ protectedSelf.get().state = NSURLSessionTaskStateRunning;
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcurlCurlDownloadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebCore/platform/network/curl/CurlDownload.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -402,11 +402,9 @@
</span><span class="cx"> CURLcode err = curl_easy_getinfo(m_curlHandle, CURLINFO_RESPONSE_CODE, &httpCode);
</span><span class="cx">
</span><span class="cx"> if (httpCode >= 200 && httpCode < 300) {
</span><del>- URLCapture capturedUrl(getCurlEffectiveURL(m_curlHandle));
- RefPtr<CurlDownload> protectedThis(this);
-
- callOnMainThread([this, capturedUrl, protectedThis] {
- m_response.setURL(capturedUrl.url());
</del><ins>+ URL url = getCurlEffectiveURL(m_curlHandle);
+ callOnMainThread([this, url = url.isolatedCopy(), protectedThis = Ref<CurlDownload>(*this)] {
+ m_response.setURL(url);
</ins><span class="cx"> m_response.setMimeType(extractMIMETypeFromMediaType(m_response.httpHeaderField(HTTPHeaderName::ContentType)));
</span><span class="cx"> m_response.setTextEncodingName(extractCharsetFromMediaType(m_response.httpHeaderField(HTTPHeaderName::ContentType)));
</span><span class="cx">
</span><span class="lines">@@ -414,14 +412,10 @@
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> } else {
</span><del>- StringCapture capturedHeader(header);
-
- RefPtr<CurlDownload> protectedThis(this);
-
- callOnMainThread([this, capturedHeader, protectedThis] {
- int splitPos = capturedHeader.string().find(":");
</del><ins>+ callOnMainThread([this, header = header.isolatedCopy(), protectedThis = Ref<CurlDownload>(*this)] {
+ int splitPos = header.string().find(":");
</ins><span class="cx"> if (splitPos != -1)
</span><del>- m_response.setHTTPHeaderField(capturedHeader.string().left(splitPos), capturedHeader.string().substring(splitPos + 1).stripWhiteSpace());
</del><ins>+ m_response.setHTTPHeaderField(header.string().left(splitPos), header.string().substring(splitPos + 1).stripWhiteSpace());
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2016-05-27 Chris Dumez <cdumez@apple.com>
+
+ callOnMainThread() should not copy captured lambda variables
+ https://bugs.webkit.org/show_bug.cgi?id=158166
+
+ Reviewed by Brady Eidson.
+
+ callOnMainThread() should not copy captured lambda variables. This
+ function is usually called cross-thread with a lambda and copying
+ the lambda (and its captured variables) can lead to thread-safety
+ issues.
+
+ This patch updates callOnMainThread() to take a NoncopyableFunction&&
+ in parameter instead of a std::function. The call sites of
+ callOnMainThread() have also been updated to use C++14's lambda
+ capture with initializer.
+
+ * Storage/StorageAreaSync.cpp:
+ (WebCore::StorageAreaSync::deleteEmptyDatabase):
+ * Storage/StorageSyncManager.cpp:
+ (WebCore::StorageSyncManager::dispatch):
+ * Storage/StorageSyncManager.h:
+ * Storage/StorageThread.cpp:
+ (WebCore::StorageThread::dispatch):
+ (WebCore::StorageThread::terminate):
+ (WebCore::StorageThread::releaseFastMallocFreeMemoryInAllThreads):
+ * Storage/StorageThread.h:
+ * Storage/StorageTracker.cpp:
+ (WebCore::StorageTracker::syncFileSystemAndTrackerDatabase):
+ (WebCore::StorageTracker::setOriginDetails):
+
</ins><span class="cx"> 2016-05-25 Alex Christensen <achristensen@webkit.org>
</span><span class="cx">
</span><span class="cx"> Fix CMake build.
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageAreaSynccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageAreaSync.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageAreaSync.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageAreaSync.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -514,10 +514,8 @@
</span><span class="cx"> query.finalize();
</span><span class="cx"> m_database.close();
</span><span class="cx"> if (StorageTracker::tracker().isActive()) {
</span><del>- StringImpl* databaseIdentifierCopy = &m_databaseIdentifier.impl()->isolatedCopy().leakRef();
- callOnMainThread([databaseIdentifierCopy] {
- StorageTracker::tracker().deleteOriginWithIdentifier(databaseIdentifierCopy);
- databaseIdentifierCopy->deref();
</del><ins>+ callOnMainThread([databaseIdentifier = m_databaseIdentifier.isolatedCopy()] {
+ StorageTracker::tracker().deleteOriginWithIdentifier(databaseIdentifier);
</ins><span class="cx"> });
</span><span class="cx"> } else {
</span><span class="cx"> String databaseFilename = m_syncManager->fullDatabaseFilename(m_databaseIdentifier);
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageSyncManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageSyncManager.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageSyncManager.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageSyncManager.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -63,13 +63,13 @@
</span><span class="cx"> return pathByAppendingComponent(m_path, databaseIdentifier + ".localstorage");
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void StorageSyncManager::dispatch(const std::function<void ()>& function)
</del><ins>+void StorageSyncManager::dispatch(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx"> ASSERT(m_thread);
</span><span class="cx">
</span><span class="cx"> if (m_thread)
</span><del>- m_thread->dispatch(function);
</del><ins>+ m_thread->dispatch(WTFMove(function));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void StorageSyncManager::close()
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageSyncManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageSyncManager.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageSyncManager.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageSyncManager.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">
</span><span class="cx"> #include <functional>
</span><span class="cx"> #include <wtf/Forward.h>
</span><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/PassRefPtr.h>
</span><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="lines">@@ -42,7 +43,7 @@
</span><span class="cx"> static Ref<StorageSyncManager> create(const String& path);
</span><span class="cx"> ~StorageSyncManager();
</span><span class="cx">
</span><del>- void dispatch(const std::function<void ()>&);
</del><ins>+ void dispatch(NoncopyableFunction&&);
</ins><span class="cx"> void close();
</span><span class="cx">
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageThread.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageThread.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageThread.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -74,11 +74,11 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void StorageThread::dispatch(const std::function<void ()>& function)
</del><ins>+void StorageThread::dispatch(NoncopyableFunction&& function)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span><span class="cx"> ASSERT(!m_queue.killed() && m_threadID);
</span><del>- m_queue.append(std::make_unique<std::function<void ()>>(function));
</del><ins>+ m_queue.append(std::make_unique<NoncopyableFunction>(WTFMove(function)));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void StorageThread::terminate()
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> if (!m_threadID)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- m_queue.append(std::make_unique<std::function<void ()>>([this] {
</del><ins>+ m_queue.append(std::make_unique<NoncopyableFunction>([this] {
</ins><span class="cx"> performTerminate();
</span><span class="cx"> }));
</span><span class="cx"> waitForThreadCompletion(m_threadID);
</span><span class="lines">@@ -108,8 +108,11 @@
</span><span class="cx"> {
</span><span class="cx"> HashSet<StorageThread*>& threads = activeStorageThreads();
</span><span class="cx">
</span><del>- for (HashSet<StorageThread*>::iterator it = threads.begin(), end = threads.end(); it != end; ++it)
- (*it)->dispatch(WTF::releaseFastMallocFreeMemory);
</del><ins>+ for (HashSet<StorageThread*>::iterator it = threads.begin(), end = threads.end(); it != end; ++it) {
+ (*it)->dispatch([]() {
+ WTF::releaseFastMallocFreeMemory();
+ });
+ }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageThread.h (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageThread.h        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageThread.h        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #include <functional>
</span><span class="cx"> #include <wtf/HashSet.h>
</span><span class="cx"> #include <wtf/MessageQueue.h>
</span><del>-#include <wtf/PassRefPtr.h>
</del><ins>+#include <wtf/NoncopyableFunction.h>
</ins><span class="cx"> #include <wtf/Threading.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx"> bool start();
</span><span class="cx"> void terminate();
</span><span class="cx">
</span><del>- void dispatch(const std::function<void()>&);
</del><ins>+ void dispatch(NoncopyableFunction&&);
</ins><span class="cx">
</span><span class="cx"> static void releaseFastMallocFreeMemoryInAllThreads();
</span><span class="cx">
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> void performTerminate();
</span><span class="cx">
</span><span class="cx"> ThreadIdentifier m_threadID;
</span><del>- MessageQueue<std::function<void()>> m_queue;
</del><ins>+ MessageQueue<NoncopyableFunction> m_queue;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebKitStorageStorageTrackercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Storage/StorageTracker.cpp (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Storage/StorageTracker.cpp        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/Storage/StorageTracker.cpp        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -293,9 +293,8 @@
</span><span class="cx"> if (foundOrigins.contains(originIdentifier))
</span><span class="cx"> continue;
</span><span class="cx">
</span><del>- String originIdentifierCopy = originIdentifier.isolatedCopy();
- callOnMainThread([this, originIdentifierCopy] {
- deleteOriginWithIdentifier(originIdentifierCopy);
</del><ins>+ callOnMainThread([this, originIdentifier = originIdentifier.isolatedCopy()] {
+ deleteOriginWithIdentifier(originIdentifier);
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -314,19 +313,17 @@
</span><span class="cx"> m_originSet.add(originIdentifier);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- String originIdentifierCopy = originIdentifier.isolatedCopy();
- String databaseFileCopy = databaseFile.isolatedCopy();
- auto function = [this, originIdentifierCopy, databaseFileCopy] {
- syncSetOriginDetails(originIdentifierCopy, databaseFileCopy);
</del><ins>+ auto function = [this, originIdentifier = originIdentifier.isolatedCopy(), databaseFile = databaseFile.isolatedCopy()] {
+ syncSetOriginDetails(originIdentifier, databaseFile);
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> if (isMainThread()) {
</span><span class="cx"> ASSERT(m_thread);
</span><del>- m_thread->dispatch(function);
</del><ins>+ m_thread->dispatch(WTFMove(function));
</ins><span class="cx"> } else {
</span><span class="cx"> // FIXME: This weird ping-ponging was done to fix a deadlock. We should figure out a cleaner way to avoid it instead.
</span><del>- callOnMainThread([this, function] {
- m_thread->dispatch(function);
</del><ins>+ callOnMainThread([this, function = WTFMove(function)]() mutable {
+ m_thread->dispatch(WTFMove(function));
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/mac/ChangeLog        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2016-05-27 Chris Dumez <cdumez@apple.com>
+
+ callOnMainThread() should not copy captured lambda variables
+ https://bugs.webkit.org/show_bug.cgi?id=158166
+
+ Reviewed by Brady Eidson.
+
+ callOnMainThread() should not copy captured lambda variables. This
+ function is usually called cross-thread with a lambda and copying
+ the lambda (and its captured variables) can lead to thread-safety
+ issues.
+
+ This patch updates callOnMainThread() to take a NoncopyableFunction&&
+ in parameter instead of a std::function. The call sites of
+ callOnMainThread() have also been updated to use C++14's lambda
+ capture with initializer.
+
+ * Storage/WebDatabaseManagerClient.mm:
+ (DidModifyOriginData::dispatchToMainThread):
+ (DidModifyOriginData::DidModifyOriginData): Deleted.
+ * Storage/WebStorageTrackerClient.mm:
+ (WebStorageTrackerClient::dispatchDidModifyOrigin):
+
</ins><span class="cx"> 2016-05-27 Caitlin Potter <caitp@igalia.com>
</span><span class="cx">
</span><span class="cx"> [JSC] implement async functions proposal
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseManagerClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseManagerClient.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -103,20 +103,19 @@
</span><span class="cx"> public:
</span><span class="cx"> static void dispatchToMainThread(WebDatabaseManagerClient* client, SecurityOrigin* origin)
</span><span class="cx"> {
</span><del>- DidModifyOriginData* context = new DidModifyOriginData(client, origin->isolatedCopy());
- callOnMainThread([context] {
</del><ins>+ auto context = std::make_unique<DidModifyOriginData>(client, origin->isolatedCopy());
+ callOnMainThread([context = WTFMove(context)] {
</ins><span class="cx"> context->client->dispatchDidModifyOrigin(context->origin.get());
</span><del>- delete context;
</del><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-private:
</del><span class="cx"> DidModifyOriginData(WebDatabaseManagerClient* client, PassRefPtr<SecurityOrigin> origin)
</span><span class="cx"> : client(client)
</span><span class="cx"> , origin(origin)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+private:
</ins><span class="cx"> WebDatabaseManagerClient* client;
</span><span class="cx"> RefPtr<SecurityOrigin> origin;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebStorageTrackerClientmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm (201481 => 201482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm        2016-05-28 05:44:10 UTC (rev 201481)
+++ trunk/Source/WebKit/mac/Storage/WebStorageTrackerClient.mm        2016-05-28 05:51:42 UTC (rev 201482)
</span><span class="lines">@@ -58,15 +58,15 @@
</span><span class="cx">
</span><span class="cx"> void WebStorageTrackerClient::dispatchDidModifyOrigin(const String& originIdentifier)
</span><span class="cx"> {
</span><del>- RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
</del><ins>+ auto origin = SecurityOrigin::createFromDatabaseIdentifier(originIdentifier);
</ins><span class="cx">
</span><span class="cx"> if (isMainThread()) {
</span><del>- dispatchDidModifyOrigin(origin);
</del><ins>+ dispatchDidModifyOrigin(WTFMove(origin));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- callOnMainThread([origin] {
- WebStorageTrackerClient::sharedWebStorageTrackerClient()->dispatchDidModifyOrigin(origin.get());
</del><ins>+ callOnMainThread([origin = WTFMove(origin)]() mutable {
+ WebStorageTrackerClient::sharedWebStorageTrackerClient()->dispatchDidModifyOrigin(WTFMove(origin));
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>