<!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>[284021] trunk/Source/WebCore</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/284021">284021</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2021-10-12 13:54:40 -0700 (Tue, 12 Oct 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Manage NetworkLoadMetrics on main thread in WebCoreNSURLSession
https://bugs.webkit.org/show_bug.cgi?id=231557

Patch by Alex Christensen <achristensen@webkit.org> on 2021-10-12
Reviewed by Jer Noble.

There is evidence that <a href="http://trac.webkit.org/projects/webkit/changeset/281486">r281486</a> wasn't quite sufficient.
Instead of making an isolated copy when hopping threads then giving the metrics to an ObjC object,
which can be destroyed on any thread,
we now create the ObjC object on the main thread and destroy it on the main thread.

* platform/network/cocoa/WebCoreNSURLSession.mm:
(-[WebCoreNSURLSessionTaskTransactionMetrics _initWithMetrics:]):
(-[WebCoreNSURLSessionTaskTransactionMetrics dealloc]):
(-[WebCoreNSURLSessionTaskMetrics _initWithMetrics:]):
(-[WebCoreNSURLSessionTaskMetrics dealloc]):
(-[WebCoreNSURLSessionDataTask _resource:loadFinishedWithError:metrics:]):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcocoaWebCoreNSURLSessionmm">trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (284020 => 284021)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-10-12 20:52:37 UTC (rev 284020)
+++ trunk/Source/WebCore/ChangeLog      2021-10-12 20:54:40 UTC (rev 284021)
</span><span class="lines">@@ -1,5 +1,24 @@
</span><span class="cx"> 2021-10-12  Alex Christensen  <achristensen@webkit.org>
</span><span class="cx"> 
</span><ins>+        Manage NetworkLoadMetrics on main thread in WebCoreNSURLSession
+        https://bugs.webkit.org/show_bug.cgi?id=231557
+
+        Reviewed by Jer Noble.
+
+        There is evidence that r281486 wasn't quite sufficient.
+        Instead of making an isolated copy when hopping threads then giving the metrics to an ObjC object,
+        which can be destroyed on any thread,
+        we now create the ObjC object on the main thread and destroy it on the main thread.
+
+        * platform/network/cocoa/WebCoreNSURLSession.mm:
+        (-[WebCoreNSURLSessionTaskTransactionMetrics _initWithMetrics:]):
+        (-[WebCoreNSURLSessionTaskTransactionMetrics dealloc]):
+        (-[WebCoreNSURLSessionTaskMetrics _initWithMetrics:]):
+        (-[WebCoreNSURLSessionTaskMetrics dealloc]):
+        (-[WebCoreNSURLSessionDataTask _resource:loadFinishedWithError:metrics:]):
+
+2021-10-12  Alex Christensen  <achristensen@webkit.org>
+
</ins><span class="cx">         Use STL instead of WTF::get_if, WTF::Monostate, WTF::visit, and WTF::holds_alternative
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=231582
</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 (284020 => 284021)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm       2021-10-12 20:52:37 UTC (rev 284020)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm  2021-10-12 20:54:40 UTC (rev 284021)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #import "ParsedRequestRange.h"
</span><span class="cx"> #import "PlatformMediaResourceLoader.h"
</span><span class="cx"> #import "SubresourceLoader.h"
</span><ins>+#import "WebCoreObjCExtras.h"
</ins><span class="cx"> #import <pal/spi/cf/CFNetworkSPI.h>
</span><span class="cx"> #import <wtf/BlockPtr.h>
</span><span class="cx"> #import <wtf/CompletionHandler.h>
</span><span class="lines">@@ -81,6 +82,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (instancetype)_initWithMetrics:(WebCore::NetworkLoadMetrics&&)metrics
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (!(self = [super init]))
</span><span class="cx">         return nil;
</span><span class="cx">     _metrics = metrics;
</span><span class="lines">@@ -87,6 +89,14 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)dealloc
+{
+    if (WebCoreObjCScheduleDeallocateOnMainThread(WebCoreNSURLSessionTaskTransactionMetrics.class, self))
+        return;
+
+    [super dealloc];
+}
+
</ins><span class="cx"> @dynamic fetchStartDate;
</span><span class="cx"> - (nullable NSDate *)fetchStartDate
</span><span class="cx"> {
</span><span class="lines">@@ -216,6 +226,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (instancetype)_initWithMetrics:(WebCore::NetworkLoadMetrics&&)metrics
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
+
</ins><span class="cx">     if (!(self = [super init]))
</span><span class="cx">         return nil;
</span><span class="cx">     _transactionMetrics = adoptNS([[WebCoreNSURLSessionTaskTransactionMetrics alloc] _initWithMetrics:WTFMove(metrics)]);
</span><span class="lines">@@ -222,6 +234,14 @@
</span><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)dealloc
+{
+    if (WebCoreObjCScheduleDeallocateOnMainThread(WebCoreNSURLSessionTaskMetrics.class, self))
+        return;
+
+    [super dealloc];
+}
+
</ins><span class="cx"> @dynamic transactionMetrics;
</span><span class="cx"> - (NSArray<NSURLSessionTaskTransactionMetrics *> *)transactionMetrics
</span><span class="cx"> {
</span><span class="lines">@@ -941,11 +961,12 @@
</span><span class="cx">     RetainPtr<WebCoreNSURLSessionDataTask> strongSelf { self };
</span><span class="cx">     RetainPtr<WebCoreNSURLSession> strongSession { self.session };
</span><span class="cx">     RetainPtr<NSError> strongError { error };
</span><del>-    [self.session addDelegateOperation:[strongSelf, strongSession, strongError, metrics = metrics.isolatedCopy()] () mutable {
</del><ins>+    auto taskMetrics = adoptNS([[WebCoreNSURLSessionTaskMetrics alloc] _initWithMetrics:NetworkLoadMetrics(metrics)]);
+    [self.session addDelegateOperation:[strongSelf, strongSession, strongError, taskMetrics = WTFMove(taskMetrics)] () mutable {
</ins><span class="cx">         id<NSURLSessionTaskDelegate> delegate = (id<NSURLSessionTaskDelegate>)strongSession.get().delegate;
</span><span class="cx"> 
</span><span class="cx">         if ([delegate respondsToSelector:@selector(URLSession:task:didFinishCollectingMetrics:)])
</span><del>-            [delegate URLSession:(NSURLSession *)strongSession.get() task:(NSURLSessionDataTask *)strongSelf.get() didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)adoptNS([[WebCoreNSURLSessionTaskMetrics alloc] _initWithMetrics:WTFMove(metrics)]).get()];
</del><ins>+            [delegate URLSession:(NSURLSession *)strongSession.get() task:(NSURLSessionDataTask *)strongSelf.get() didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)taskMetrics.get()];
</ins><span class="cx"> 
</span><span class="cx">         if ([delegate respondsToSelector:@selector(URLSession:task:didCompleteWithError:)])
</span><span class="cx">             [delegate URLSession:(NSURLSession *)strongSession.get() task:(NSURLSessionDataTask *)strongSelf.get() didCompleteWithError:strongError.get()];
</span></span></pre>
</div>
</div>

</body>
</html>