<!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>[165687] 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/165687">165687</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2014-03-15 17:44:51 -0700 (Sat, 15 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>It should be possible to adjust DFG and FTL compiler thread priorities
https://bugs.webkit.org/show_bug.cgi?id=130288

Reviewed by Filip Pizlo.

Added ability to change thread priorities relative to its current priority.
Created options to adjust the priority of the DFG and FTL compilation work thread
pools.  For two core systems, there might be three runnable threads, the main thread,
the DFG compilation thread and the FTL compilation thread.  With the same priority,
the scheduler is free to schedule whatever thread it wants.  By lowering the
compilation threads, the main thread can run.  Further tests may suggest better values
for the new options, priorityDeltaOfDFGCompilerThreads and priorityDeltaOfFTLCompilerThreads.

For a two-core device, this change has a net positive improvement of 1-3% across
SunSpider, Octane, Kraken and AsmBench.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGWorklistcpp">trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGWorklisth">trunk/Source/JavaScriptCore/dfg/DFGWorklist.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionscpp">trunk/Source/JavaScriptCore/runtime/Options.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeOptionsh">trunk/Source/JavaScriptCore/runtime/Options.h</a></li>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfThreadingh">trunk/Source/WTF/wtf/Threading.h</a></li>
<li><a href="#trunkSourceWTFwtfThreadingPthreadscpp">trunk/Source/WTF/wtf/ThreadingPthreads.cpp</a></li>
<li><a href="#trunkSourceWTFwtfThreadingWincpp">trunk/Source/WTF/wtf/ThreadingWin.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2014-03-15  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        It should be possible to adjust DFG and FTL compiler thread priorities
+        https://bugs.webkit.org/show_bug.cgi?id=130288
+
+        Reviewed by Filip Pizlo.
+
+        Added ability to change thread priorities relative to its current priority.
+        Created options to adjust the priority of the DFG and FTL compilation work thread
+        pools.  For two core systems, there might be three runnable threads, the main thread,
+        the DFG compilation thread and the FTL compilation thread.  With the same priority,
+        the scheduler is free to schedule whatever thread it wants.  By lowering the
+        compilation threads, the main thread can run.  Further tests may suggest better values
+        for the new options, priorityDeltaOfDFGCompilerThreads and priorityDeltaOfFTLCompilerThreads.
+
+        For a two-core device, this change has a net positive improvement of 1-3% across
+        SunSpider, Octane, Kraken and AsmBench.
+
+        * dfg/DFGWorklist.cpp:
+        (JSC::DFG::Worklist::finishCreation):
+        (JSC::DFG::Worklist::create):
+        (JSC::DFG::ensureGlobalDFGWorklist):
+        (JSC::DFG::ensureGlobalFTLWorklist):
+        * dfg/DFGWorklist.h:
+        * runtime/Options.cpp:
+        (JSC::computePriorityDeltaOfWorkerThreads):
+        * runtime/Options.h:
+
</ins><span class="cx"> 2014-03-15  David Kilzer  &lt;ddkilzer@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Define SYSTEM_VERSION_PREFIX consistently
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGWorklistcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/JavaScriptCore/dfg/DFGWorklist.cpp        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -55,20 +55,22 @@
</span><span class="cx">     ASSERT(!m_numberOfActiveThreads);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Worklist::finishCreation(unsigned numberOfThreads)
</del><ins>+void Worklist::finishCreation(unsigned numberOfThreads, int relativePriority)
</ins><span class="cx"> {
</span><span class="cx">     RELEASE_ASSERT(numberOfThreads);
</span><span class="cx">     for (unsigned i = numberOfThreads; i--;) {
</span><span class="cx">         std::unique_ptr&lt;ThreadData&gt; data = std::make_unique&lt;ThreadData&gt;(this);
</span><span class="cx">         data-&gt;m_identifier = createThread(threadFunction, data.get(), &quot;JSC Compilation Thread&quot;);
</span><ins>+        if (relativePriority)
+            changeThreadPriority(data-&gt;m_identifier, relativePriority);
</ins><span class="cx">         m_threads.append(std::move(data));
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;Worklist&gt; Worklist::create(unsigned numberOfThreads)
</del><ins>+PassRefPtr&lt;Worklist&gt; Worklist::create(unsigned numberOfThreads, int relativePriority)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;Worklist&gt; result = adoptRef(new Worklist());
</span><del>-    result-&gt;finishCreation(numberOfThreads);
</del><ins>+    result-&gt;finishCreation(numberOfThreads, relativePriority);
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -321,7 +323,7 @@
</span><span class="cx"> {
</span><span class="cx">     static std::once_flag initializeGlobalWorklistOnceFlag;
</span><span class="cx">     std::call_once(initializeGlobalWorklistOnceFlag, [] {
</span><del>-        theGlobalDFGWorklist = Worklist::create(Options::numberOfDFGCompilerThreads()).leakRef();
</del><ins>+        theGlobalDFGWorklist = Worklist::create(Options::numberOfDFGCompilerThreads(), Options::priorityDeltaOfDFGCompilerThreads()).leakRef();
</ins><span class="cx">     });
</span><span class="cx">     return theGlobalDFGWorklist;
</span><span class="cx"> }
</span><span class="lines">@@ -337,7 +339,7 @@
</span><span class="cx"> {
</span><span class="cx">     static std::once_flag initializeGlobalWorklistOnceFlag;
</span><span class="cx">     std::call_once(initializeGlobalWorklistOnceFlag, [] {
</span><del>-        theGlobalFTLWorklist = Worklist::create(Options::numberOfFTLCompilerThreads()).leakRef();
</del><ins>+        theGlobalFTLWorklist = Worklist::create(Options::numberOfFTLCompilerThreads(), Options::priorityDeltaOfFTLCompilerThreads()).leakRef();
</ins><span class="cx">     });
</span><span class="cx">     return theGlobalFTLWorklist;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGWorklisth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGWorklist.h (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGWorklist.h        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/JavaScriptCore/dfg/DFGWorklist.h        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx"> 
</span><span class="cx">     ~Worklist();
</span><span class="cx">     
</span><del>-    static PassRefPtr&lt;Worklist&gt; create(unsigned numberOfThreads);
</del><ins>+    static PassRefPtr&lt;Worklist&gt; create(unsigned numberOfThreads, int relativePriority = 0);
</ins><span class="cx">     
</span><span class="cx">     void enqueue(PassRefPtr&lt;Plan&gt;);
</span><span class="cx">     
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     Worklist();
</span><del>-    void finishCreation(unsigned numberOfThreads);
</del><ins>+    void finishCreation(unsigned numberOfThreads, int);
</ins><span class="cx">     
</span><span class="cx">     void runThread(ThreadData*);
</span><span class="cx">     static void threadFunction(void* argument);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.cpp (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.cpp        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/JavaScriptCore/runtime/Options.cpp        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -101,6 +101,14 @@
</span><span class="cx">     return std::max(cpusToUse, minimum);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static int32_t computePriorityDeltaOfWorkerThreads(int32_t twoCorePriorityDelta, int32_t multiCorePriorityDelta)
+{
+    if (WTF::numberOfProcessorCores() &lt;= 2)
+        return twoCorePriorityDelta;
+
+    return multiCorePriorityDelta;
+}
+
</ins><span class="cx"> static unsigned computeNumberOfGCMarkers(unsigned maxNumberOfGCMarkers)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(PARALLEL_GC)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Options.h (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Options.h        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/JavaScriptCore/runtime/Options.h        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -160,6 +160,8 @@
</span><span class="cx">     v(bool, enableConcurrentJIT, true) \
</span><span class="cx">     v(unsigned, numberOfDFGCompilerThreads, computeNumberOfWorkerThreads(2, 2) - 1) \
</span><span class="cx">     v(unsigned, numberOfFTLCompilerThreads, computeNumberOfWorkerThreads(8, 2) - 1) \
</span><ins>+    v(int32, priorityDeltaOfDFGCompilerThreads, computePriorityDeltaOfWorkerThreads(-1, 0)) \
+    v(int32, priorityDeltaOfFTLCompilerThreads, computePriorityDeltaOfWorkerThreads(-2, 0)) \
</ins><span class="cx">     \
</span><span class="cx">     v(bool, enableProfiler, false) \
</span><span class="cx">     \
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/WTF/ChangeLog        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2014-03-15  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        It should be possible to adjust DFG and FTL compiler thread priorities
+        https://bugs.webkit.org/show_bug.cgi?id=130288
+
+        Reviewed by Filip Pizlo.
+
+        Added ability to change thread priorities relative to its current priority.
+        Created options to adjust the priority of the DFG and FTL compilation work thread
+        pools.  For two core systems, there might be three runnable threads, the main thread,
+        the DFG compilation thread and the FTL compilation thread.  With the same priority,
+        the scheduler is free to schedule whatever thread it wants.  By lowering the
+        compilation threads, the main thread can run.  Further tests may suggest better values
+        for the new options, priorityDeltaOfDFGCompilerThreads and priorityDeltaOfFTLCompilerThreads.
+
+        For a two-core device, this change has a net positive improvement of 1-3% across
+        SunSpider, Octane, Kraken and AsmBench.
+
+        * wtf/Threading.h:
+        * wtf/ThreadingPthreads.cpp:
+        (WTF::changeThreadPriority):
+        * wtf/ThreadingWin.cpp:
+        (WTF::changeThreadPriority):
+
</ins><span class="cx"> 2014-03-15  David Kilzer  &lt;ddkilzer@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix undefined behavior in WTF::equal() in StringImpl.h for i386/x86_64
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Threading.h (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Threading.h        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/WTF/wtf/Threading.h        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -89,6 +89,7 @@
</span><span class="cx"> void initializeCurrentThreadInternal(const char* threadName);
</span><span class="cx"> 
</span><span class="cx"> WTF_EXPORT_PRIVATE ThreadIdentifier currentThread();
</span><ins>+WTF_EXPORT_PRIVATE void changeThreadPriority(ThreadIdentifier, int);
</ins><span class="cx"> WTF_EXPORT_PRIVATE int waitForThreadCompletion(ThreadIdentifier);
</span><span class="cx"> WTF_EXPORT_PRIVATE void detachThread(ThreadIdentifier);
</span><span class="cx"> 
</span><span class="lines">@@ -97,6 +98,7 @@
</span><span class="cx"> using WTF::ThreadIdentifier;
</span><span class="cx"> using WTF::createThread;
</span><span class="cx"> using WTF::currentThread;
</span><ins>+using WTF::changeThreadPriority;
</ins><span class="cx"> using WTF::detachThread;
</span><span class="cx"> using WTF::waitForThreadCompletion;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingPthreadscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/ThreadingPthreads.cpp (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/ThreadingPthreads.cpp        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/WTF/wtf/ThreadingPthreads.cpp        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -203,7 +203,30 @@
</span><span class="cx">     ASSERT(id);
</span><span class="cx">     ThreadIdentifierData::initialize(id);
</span><span class="cx"> }
</span><ins>+    
+void changeThreadPriority(ThreadIdentifier threadID, int delta)
+{
+    pthread_t pthreadHandle;
+    ASSERT(threadID);
</ins><span class="cx"> 
</span><ins>+    {
+        // We don't want to lock across the call to join, since that can block our thread and cause deadlock.
+        MutexLocker locker(threadMapMutex());
+        pthreadHandle = pthreadHandleForIdentifierWithLockAlreadyHeld(threadID);
+        ASSERT(pthreadHandle);
+    }
+
+    int policy;
+    struct sched_param param;
+
+    if (pthread_getschedparam(pthread_self(), &amp;policy, &amp;param))
+        return;
+
+    param.sched_priority += delta;
+
+    pthread_setschedparam(pthread_self(), policy, &amp;param);
+}
+    
</ins><span class="cx"> int waitForThreadCompletion(ThreadIdentifier threadID)
</span><span class="cx"> {
</span><span class="cx">     pthread_t pthreadHandle;
</span></span></pre></div>
<a id="trunkSourceWTFwtfThreadingWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/ThreadingWin.cpp (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/ThreadingWin.cpp        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/WTF/wtf/ThreadingWin.cpp        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -246,6 +246,17 @@
</span><span class="cx">     return threadID;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void changeThreadPriority(ThreadIdentifier threadID, int delta)
+{
+    ASSERT(threadID);
+
+    HANDLE threadHandle = threadHandleForIdentifier(threadID);
+    if (!threadHandle)
+        LOG_ERROR(&quot;ThreadIdentifier %u does not correspond to an active thread&quot;, threadID);
+
+    SetThreadPriority(threadHandle, THREAD_PRIORITY_NORMAL + delta);
+}
+
</ins><span class="cx"> int waitForThreadCompletion(ThreadIdentifier threadID)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(threadID);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (165686 => 165687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-03-16 00:17:56 UTC (rev 165686)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-03-16 00:44:51 UTC (rev 165687)
</span><span class="lines">@@ -1952,8 +1952,8 @@
</span><span class="cx">                 1A5B1C5318987EDF004FCF9B /* WebDocumentLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDocumentLoader.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCheckerState.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A60224918C16B0800C3E8C9 /* VisitedLinkProvider.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = VisitedLinkProvider.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                1A60224A18C16B9F00C3E8C9 /* VisitedLinkProviderMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VisitedLinkProviderMessageReceiver.cpp; path = VisitedLinkProviderMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                1A60224B18C16B9F00C3E8C9 /* VisitedLinkProviderMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VisitedLinkProviderMessages.h; path = VisitedLinkProviderMessages.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                1A60224A18C16B9F00C3E8C9 /* VisitedLinkProviderMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VisitedLinkProviderMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                1A60224B18C16B9F00C3E8C9 /* VisitedLinkProviderMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisitedLinkProviderMessages.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 1A6420E212DCE2FF00CAAE2C /* ShareableBitmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShareableBitmap.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A6420E312DCE2FF00CAAE2C /* ShareableBitmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShareableBitmap.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 1A64228A12DD024700CAAE2C /* DrawingArea.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DrawingArea.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
</span></span></pre>
</div>
</div>

</body>
</html>