<!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>[183520] trunk/Tools</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/183520">183520</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-04-28 17:51:36 -0700 (Tue, 28 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Increase stablility of run-benchmark script
https://bugs.webkit.org/show_bug.cgi?id=144361

Patch by Dewei Zhu &lt;dewei_zhu@apple.com&gt; on 2015-04-28
Reviewed by Ryosuke Niwa.

* Scripts/run-benchmark:
(main):
* Scripts/webkitpy/benchmark_runner/README.md: Update readme due to changes.
* Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py:
(GenericBenchmarkBuilder.clean):
* Scripts/webkitpy/benchmark_runner/benchmark_runner.py: Improve error handling and remove an unnecessary loop.
(BenchmarkRunner.__init__):
(BenchmarkRunner.execute):
* Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py:
(OSXSafariDriver.prepareEnv): Remove saved sessions of Safari.
* Scripts/webkitpy/benchmark_runner/data/patches/JetStream.patch: Upload 'results' rather than 'time'.
* Scripts/webkitpy/benchmark_runner/data/plans/jetstream.plan: Update formate.
* Scripts/webkitpy/benchmark_runner/data/plans/speedometer.plan: Update formate.
* Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py:
(ServerControl.render_POST): Flush the buffer to make sure we can pass the result to stdout.
* Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py:
(HTTPServerDriver.fetchResult):
(HTTPServerDriver):
(HTTPServerDriver.killServer): Add kill server interface.
(HTTPServerDriver.getReturnCode): Add get return code interface.
* Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py: Adjust to support new interfaces.
(SimpleHTTPServerDriver.serve):
(SimpleHTTPServerDriver.fetchResult):
(SimpleHTTPServerDriver):
(SimpleHTTPServerDriver.killServer):
(SimpleHTTPServerDriver.getReturnCode):
* Scripts/webkitpy/benchmark_runner/utils.py:
(forceRemove): Provide python version of 'rm -rf'.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptsrunbenchmark">trunk/Tools/Scripts/run-benchmark</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerREADMEmd">trunk/Tools/Scripts/webkitpy/benchmark_runner/README.md</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbenchmark_buildergeneric_benchmark_builderpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbenchmark_runnerpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverosx_safari_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerdatapatchesJetStreampatch">trunk/Tools/Scripts/webkitpy/benchmark_runner/data/patches/JetStream.patch</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerdataplansjetstreamplan">trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/jetstream.plan</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerdataplansspeedometerplan">trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/speedometer.plan</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driverhttp_servertwisted_http_serverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driverhttp_server_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driversimple_http_server_driverpy">trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpybenchmark_runnerutilspy">trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/ChangeLog        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2015-04-28  Dewei Zhu  &lt;dewei_zhu@apple.com&gt;
+
+        Increase stablility of run-benchmark script
+        https://bugs.webkit.org/show_bug.cgi?id=144361
+
+        Reviewed by Ryosuke Niwa.
+
+        * Scripts/run-benchmark:
+        (main):
+        * Scripts/webkitpy/benchmark_runner/README.md: Update readme due to changes.
+        * Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py:
+        (GenericBenchmarkBuilder.clean):
+        * Scripts/webkitpy/benchmark_runner/benchmark_runner.py: Improve error handling and remove an unnecessary loop.
+        (BenchmarkRunner.__init__):
+        (BenchmarkRunner.execute):
+        * Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py:
+        (OSXSafariDriver.prepareEnv): Remove saved sessions of Safari.
+        * Scripts/webkitpy/benchmark_runner/data/patches/JetStream.patch: Upload 'results' rather than 'time'.
+        * Scripts/webkitpy/benchmark_runner/data/plans/jetstream.plan: Update formate.
+        * Scripts/webkitpy/benchmark_runner/data/plans/speedometer.plan: Update formate.
+        * Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py: 
+        (ServerControl.render_POST): Flush the buffer to make sure we can pass the result to stdout.
+        * Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py:
+        (HTTPServerDriver.fetchResult):
+        (HTTPServerDriver):
+        (HTTPServerDriver.killServer): Add kill server interface.
+        (HTTPServerDriver.getReturnCode): Add get return code interface.
+        * Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py: Adjust to support new interfaces.
+        (SimpleHTTPServerDriver.serve):
+        (SimpleHTTPServerDriver.fetchResult):
+        (SimpleHTTPServerDriver):
+        (SimpleHTTPServerDriver.killServer):
+        (SimpleHTTPServerDriver.getReturnCode):
+        * Scripts/webkitpy/benchmark_runner/utils.py:
+        (forceRemove): Provide python version of 'rm -rf'.
+
</ins><span class="cx"> 2015-04-28  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [Content Extensions] Process NFAs individually to avoid having all NFAs live at the same time
</span></span></pre></div>
<a id="trunkToolsScriptsrunbenchmark"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/run-benchmark (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/run-benchmark        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/run-benchmark        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx">     _log.debug('\tbuild directory\t: %s' % args.buildDir)
</span><span class="cx">     _log.debug('\tplan name\t: %s', args.plan)
</span><span class="cx">     runner = BenchmarkRunner(args.plan, args.buildDir, args.output, args.platform, args.browser)
</span><del>-    runner.execute()
</del><ins>+    return runner.execute()
</ins><span class="cx"> 
</span><span class="cx"> if __name__ == '__main__':
</span><span class="cx">     main()
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerREADMEmd"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/README.md (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/README.md        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/README.md        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx"> ## HOW TOs
</span><span class="cx"> ### How to run
</span><span class="cx"> ```shell
</span><del>-    python path/to/run_benchmark --build-directory path/to/browser/directory --plan json_format_plan --platform target_platform --browser target_browser
</del><ins>+    python path/to/run-benchmark --build-directory path/to/browser/directory --plan json_format_plan --platform target_platform --browser target_browser
</ins><span class="cx"> ```
</span><span class="cx"> * **path/to/browser/directory**: should be the folder containing the executable binary(e.g. /Application/ on OSX which contains Safari.app)
</span><span class="cx"> * **json_format_plan**: the benchmark plan you want to execute  
</span><span class="lines">@@ -55,29 +55,24 @@
</span><span class="cx"> ```json 
</span><span class="cx"> {
</span><span class="cx">     &quot;http_server_driver&quot;: &quot;SimpleHTTPServerDriver&quot;, 
</span><del>-    &quot;benchmarks&quot;: [
-        {
-            &quot;timeout&quot; : 600,
-            &quot;count&quot;: 5,
-            &quot;benchmark_builder&quot;: &quot;JetStreamBenchmarkBuilder&quot;,
-            &quot;original_benchmark&quot;: &quot;../../../../PerformanceTests/JetStream&quot;,
-            &quot;benchmark_patch&quot;: &quot;data/patches/JetStream.patch&quot;,
-            &quot;entry_point&quot;: &quot;JetStream/JetStream-1.0.1/index.html&quot;,
-            &quot;output_file&quot;: &quot;jetstream.result&quot;
-        }
-    ]
</del><ins>+    &quot;timeout&quot; : 600,
+    &quot;count&quot;: 5,
+    &quot;benchmark_builder&quot;: &quot;JetStreamBenchmarkBuilder&quot;,
+    &quot;original_benchmark&quot;: &quot;../../../../PerformanceTests/JetStream&quot;,
+    &quot;benchmark_patch&quot;: &quot;data/patches/JetStream.patch&quot;,
+    &quot;entry_point&quot;: &quot;JetStream/JetStream-1.0.1/index.html&quot;,
+    &quot;output_file&quot;: &quot;jetstream.result&quot;
</ins><span class="cx"> }
</span><span class="cx"> ```
</span><span class="cx"> Plan is a json-formatted dictionary which contains following keys 
</span><span class="cx"> * **http_server_driver**: (**case-sensitive**) the http server module you want to host the resources. Current available option is &quot;SimpleHTTPServerHandle&quot; which is based on python twisted framework.
</span><del>-* **benchmarks**: contains a list of benchmarks you want to run, each benchmark is a list contains following keys:
-    * **timeout**: time limit for **EACH RUN** of the benchmark. This can avoid program getting stuck in the extreme circumstances. The time limit is suggested to be 1.5-2x the time spent in a normal run.
-    * **count**: the number of times you want to run benchmark
-    * **benchmark_builder**:  builder of the benchmark which is responsible for arranging benchmark before the web server serving the directory. In most case, 'GenericBenchmarkHandler' is sufficient. It copies the benchmark to a temporary directory and applies patch to benchmark. If you have special requirement, you could design your own benchmark handle, just like the 'JetStreamBenchmarkHandle' in this example.
-    * **original_benchmark**: path of benchmark, a relative path to the root of this project ('benchmark_runner' directory)
-    * **benchmark_path**: (**OPTIONAL**) path of patch, a relative path to the root of this project ('benchmark_runner' directory)
-    * **entry_point**: the relative url you want browser to launch (a relative path to the webroot)
-    * **output_file**: specify the output file
</del><ins>+* **timeout**: time limit for **EACH RUN** of the benchmark. This can avoid program getting stuck in the extreme circumstances. The time limit is suggested to be 1.5-2x the time spent in a normal run.
+* **count**: the number of times you want to run benchmark
+* **benchmark_builder**:  builder of the benchmark which is responsible for arranging benchmark before the web server serving the directory. In most case, 'GenericBenchmarkHandler' is sufficient. It copies the benchmark to a temporary directory and applies patch to benchmark. If you have special requirement, you could design your own benchmark handle, just like the 'JetStreamBenchmarkHandle' in this example.
+* **original_benchmark**: path of benchmark, a relative path to the root of this project ('benchmark_runner' directory)
+* **benchmark_path**: (**OPTIONAL**) path of patch, a relative path to the root of this project ('benchmark_runner' directory)
+* **entry_point**: the relative url you want browser to launch (a relative path to the webRoot)
+* **output_file**: specify the output file, this can be overwritten by specifying '--output-file' while invoking run-benchmark script
</ins><span class="cx"> 
</span><span class="cx"> ### How to import a benchmark
</span><span class="cx"> * Modify the benchmark html file, make sure the page has following functionalities:
</span><span class="lines">@@ -107,5 +102,4 @@
</span><span class="cx"> * Do following instruction **ONLY IF NEEDED**. In most case, you do not have to.
</span><span class="cx">     * If you want to customize BrowserDriver for specific browser/platform, you need to extend browser_driver/browser_driver.py and register your module in browser_driver/browser_driversjson.
</span><span class="cx">     * If you want to customize HTTPServerDriver, you need to extend http_server_drirver/http_server_driver and register your module in http_server_driver/http_server_drivers.json.
</span><del>-    * If you want to customize ResultWrapper, you need to extend result_wrapper/base_result_wrapper.py and register your module in result_wrapper/result_wrappers.json 
</del><span class="cx">     * If you want to customize BenchmarkBuilder, you need to extend benchmark_builder/generic_benchmark_builder register you module in benchmark_builder/benchmark_builders.json
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbenchmark_buildergeneric_benchmark_builderpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_builder/generic_benchmark_builder.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -6,7 +6,7 @@
</span><span class="cx"> import shutil
</span><span class="cx"> import subprocess
</span><span class="cx"> 
</span><del>-from webkitpy.benchmark_runner.utils import getPathFromProjectRoot
</del><ins>+from webkitpy.benchmark_runner.utils import getPathFromProjectRoot, forceRemove
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> _log = logging.getLogger(__name__)
</span><span class="lines">@@ -40,4 +40,4 @@
</span><span class="cx">     def clean(self):
</span><span class="cx">         _log.info('Cleanning Benchmark')
</span><span class="cx">         if self.webRoot:
</span><del>-            shutil.rmtree(self.webRoot)
</del><ins>+            forceRemove(self.webRoot)
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbenchmark_runnerpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/benchmark_runner.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -30,43 +30,45 @@
</span><span class="cx">                 self.plan = json.load(fp)
</span><span class="cx">                 self.browserDriver = BrowserDriverFactory.create([platform, browser])
</span><span class="cx">                 self.httpServerDriver = HTTPServerDriverFactory.create([self.plan['http_server_driver']])
</span><del>-                self.benchmarks = self.plan['benchmarks']
</del><span class="cx">                 self.buildDir = os.path.abspath(buildDir)
</span><span class="cx">                 self.outputFile = outputFile
</span><span class="cx">         except IOError:
</span><span class="cx">             _log.error('Can not open plan file: %s' % planFile)
</span><span class="cx">         except ValueError:
</span><del>-            _log.error('Plan file:%s may not follow json format' % planFile)
</del><ins>+            _log.error('Plan file:%s may not follow JSON format' % planFile)
</ins><span class="cx">         except:
</span><span class="cx">             raise
</span><span class="cx"> 
</span><span class="cx">     def execute(self):
</span><span class="cx">         _log.info('Start to execute the plan')
</span><del>-        for benchmark in self.benchmarks:
-            _log.info('Start a new benchmark')
-            results = []
-            benchmarkBuilder = BenchmarkBuilderFactory.create([benchmark['benchmark_builder']])
-            webRoot = benchmarkBuilder.prepare(benchmark['original_benchmark'], benchmark['benchmark_patch'] if 'benchmark_patch' in benchmark else None)
-            for x in xrange(int(benchmark['count'])):
-                _log.info('Start the iteration %d of current benchmark' % (x + 1))
-                self.httpServerDriver.serve(webRoot)
-                self.browserDriver.prepareEnv()
-                self.browserDriver.launchUrl(urlparse.urljoin(self.httpServerDriver.baseUrl(), benchmark['entry_point']), self.buildDir)
-                try:
-                    with timeout(benchmark['timeout']):
-                        result = json.loads(self.httpServerDriver.fetchResult())
-                        assert(result)
-                        results.append(result)
-                except:
-                    _log.error('No result. Something went wrong. Will skip current benchmark.')
-                    self.browserDriver.closeBrowsers()
-                    break
-                finally:
-                    self.browserDriver.closeBrowsers()
-                    _log.info('End of %d iteration of current benchmark' % (x + 1))
-            results = self.wrap(results)
-            self.dump(results, self.outputFile if self.outputFile else benchmark['output_file'])
-            benchmarkBuilder.clean()
</del><ins>+        _log.info('Start a new benchmark')
+        results = []
+        benchmarkBuilder = BenchmarkBuilderFactory.create([self.plan['benchmark_builder']])
+        webRoot = benchmarkBuilder.prepare(self.plan['original_benchmark'], self.plan['benchmark_patch'] if 'benchmark_patch' in self.plan else None)
+        for x in xrange(int(self.plan['count'])):
+            _log.info('Start the iteration %d of current benchmark' % (x + 1))
+            self.httpServerDriver.serve(webRoot)
+            self.browserDriver.prepareEnv()
+            self.browserDriver.launchUrl(urlparse.urljoin(self.httpServerDriver.baseUrl(), self.plan['entry_point']), self.buildDir)
+            try:
+                with timeout(self.plan['timeout']):
+                    result = json.loads(self.httpServerDriver.fetchResult())
+                assert(not self.httpServerDriver.getReturnCode())
+                assert(result)
+                results.append(result)
+            except:
+                _log.error('No result or server crashes. Something went wrong. Will skip current benchmark.')
+                self.browserDriver.closeBrowsers()
+                self.httpServerDriver.killServer()
+                benchmarkBuilder.clean()
+                return 1
+            finally:
+                self.browserDriver.closeBrowsers()
+                _log.info('End of %d iteration of current benchmark' % (x + 1))
+        results = self.wrap(results)
+        self.dump(results, self.outputFile if self.outputFile else self.plan['output_file'])
+        benchmarkBuilder.clean()
+        return 0
</ins><span class="cx"> 
</span><span class="cx">     @classmethod
</span><span class="cx">     def dump(cls, results, outputFile):
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerbrowser_driverosx_safari_driverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/browser_driver/osx_safari_driver.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -8,6 +8,7 @@
</span><span class="cx"> # We assume that this handle can only be used when the platform is OSX.
</span><span class="cx"> from AppKit import NSRunningApplication
</span><span class="cx"> from browser_driver import BrowserDriver
</span><ins>+from webkitpy.benchmark_runner.utils import forceRemove
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> _log = logging.getLogger(__name__)
</span><span class="lines">@@ -17,6 +18,8 @@
</span><span class="cx"> 
</span><span class="cx">     def prepareEnv(self):
</span><span class="cx">         self.closeBrowsers()
</span><ins>+        forceRemove(os.path.join(os.path.expanduser('~'), 'Library/Saved Application State/com.apple.Safari.savedState'))
+        forceRemove(os.path.join(os.path.expanduser('~'), 'Library/Safari/LastSession.plist'))
</ins><span class="cx">         self.safariPreferences = [&quot;-HomePage&quot;, &quot;about:blank&quot;, &quot;-WarnAboutFraudulentWebsites&quot;, &quot;0&quot;, &quot;-ExtensionsEnabled&quot;, &quot;0&quot;, &quot;-ShowStatusBar&quot;, &quot;0&quot;, &quot;-NewWindowBehavior&quot;, &quot;1&quot;, &quot;-NewTabBehavior&quot;, &quot;1&quot;]
</span><span class="cx"> 
</span><span class="cx">     def launchUrl(self, url, browserBuildPath=None):
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerdatapatchesJetStreampatch"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/data/patches/JetStream.patch (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/data/patches/JetStream.patch        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/data/patches/JetStream.patch        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -10,7 +10,7 @@
</span><span class="cx"> +    function computeRefinedResults(){
</span><span class="cx"> +        var results = {};
</span><span class="cx"> +        for (var i = 0; i &lt; benchmarks.length; ++i) {
</span><del>-+            results[benchmarks[i].name] = {&quot;metrics&quot; : {&quot;Score&quot; : {&quot;current&quot; : [benchmarks[i].times]}}};
</del><ins>++            results[benchmarks[i].name] = {&quot;metrics&quot; : {&quot;Score&quot; : {&quot;current&quot; : [benchmarks[i].results]}}};
</ins><span class="cx"> +        }
</span><span class="cx"> +        return {&quot;JetStream&quot;: {&quot;metrics&quot; : {&quot;Score&quot; : [&quot;Geometric&quot;]}, &quot;tests&quot; : results}};
</span><span class="cx"> +    }
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerdataplansjetstreamplan"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/jetstream.plan (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/jetstream.plan        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/jetstream.plan        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -1,14 +1,10 @@
</span><span class="cx"> {
</span><span class="cx">     &quot;http_server_driver&quot;: &quot;SimpleHTTPServerDriver&quot;, 
</span><del>-    &quot;benchmarks&quot;: [
-        {
-            &quot;timeout&quot; : 600,
-            &quot;count&quot;: 5,
-            &quot;benchmark_builder&quot;: &quot;JetStreamBenchmarkBuilder&quot;,
-            &quot;original_benchmark&quot;: &quot;../../../../PerformanceTests/JetStream&quot;,
-            &quot;benchmark_patch&quot;: &quot;data/patches/JetStream.patch&quot;,
-            &quot;entry_point&quot;: &quot;JetStream/JetStream-1.0.1/index.html&quot;,
-            &quot;output_file&quot;: &quot;jetstream.result&quot;
-        }
-    ]
</del><ins>+    &quot;timeout&quot; : 600,
+    &quot;count&quot;: 5,
+    &quot;benchmark_builder&quot;: &quot;JetStreamBenchmarkBuilder&quot;,
+    &quot;original_benchmark&quot;: &quot;../../../../PerformanceTests/JetStream&quot;,
+    &quot;benchmark_patch&quot;: &quot;data/patches/JetStream.patch&quot;,
+    &quot;entry_point&quot;: &quot;JetStream/JetStream-1.0.1/index.html&quot;,
+    &quot;output_file&quot;: &quot;jetstream.result&quot;
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerdataplansspeedometerplan"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/speedometer.plan (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/speedometer.plan        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/data/plans/speedometer.plan        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -1,14 +1,10 @@
</span><span class="cx"> {
</span><del>-    &quot;benchmarks&quot;: [
-        {
-            &quot;benchmark_builder&quot;: &quot;GenericBenchmarkBuilder&quot;,
-            &quot;benchmark_patch&quot;: &quot;data/patches/Speedometer.patch&quot;,
-            &quot;original_benchmark&quot;: &quot;../../../../PerformanceTests/Speedometer&quot;,
-            &quot;count&quot;: 5,
-            &quot;entry_point&quot;: &quot;Speedometer/Full.html&quot;,
-            &quot;output_file&quot;: &quot;speedometer.result&quot;,
-            &quot;timeout&quot;: 600
-        }
-    ],
-    &quot;http_server_driver&quot;: &quot;SimpleHTTPServerDriver&quot;
</del><ins>+    &quot;http_server_driver&quot;: &quot;SimpleHTTPServerDriver&quot;,
+    &quot;timeout&quot;: 300,
+    &quot;count&quot;: 5,
+    &quot;benchmark_builder&quot;: &quot;GenericBenchmarkBuilder&quot;,
+    &quot;original_benchmark&quot;: &quot;../../../../PerformanceTests/Speedometer&quot;,
+    &quot;benchmark_patch&quot;: &quot;data/patches/Speedometer.patch&quot;,
+    &quot;entry_point&quot;: &quot;Speedometer/Full.html&quot;,
+    &quot;output_file&quot;: &quot;speedometer.result&quot;
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driverhttp_servertwisted_http_serverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx"> 
</span><span class="cx">     def render_POST(self, request):
</span><span class="cx">         sys.stdout.write(request.content.getvalue())
</span><ins>+        sys.stdout.flush()
</ins><span class="cx">         return 'OK'
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driverhttp_server_driverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server_driver.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -11,3 +11,11 @@
</span><span class="cx">     @abstractmethod
</span><span class="cx">     def fetchResult(self):
</span><span class="cx">         pass
</span><ins>+
+    @abstractmethod
+    def killServer(self):
+        pass
+
+    @abstractmethod
+    def getReturnCode(self):
+        pass
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerhttp_server_driversimple_http_server_driverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -30,11 +30,11 @@
</span><span class="cx">             _log.error('Cannot get the ip address of current machine')
</span><span class="cx">             raise
</span><span class="cx"> 
</span><del>-    def serve(self, webroot):
</del><ins>+    def serve(self, webRoot):
</ins><span class="cx">         oldWorkingDirectory = os.getcwd()
</span><span class="cx">         os.chdir(os.path.dirname(os.path.abspath(__file__)))
</span><del>-        _log.info('Lauchning an http server')
-        self.serverProcess = subprocess.Popen(['/usr/bin/python', 'http_server/twisted_http_server.py', webroot], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
</del><ins>+        _log.info('Launching an http server')
+        self.serverProcess = subprocess.Popen(['/usr/bin/python', 'http_server/twisted_http_server.py', webRoot], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
</ins><span class="cx">         os.chdir(oldWorkingDirectory)
</span><span class="cx">         maxAttempt = 5
</span><span class="cx">         interval = 0.5
</span><span class="lines">@@ -77,3 +77,12 @@
</span><span class="cx"> 
</span><span class="cx">     def fetchResult(self):
</span><span class="cx">         return self.serverProcess.communicate()[0]
</span><ins>+
+    def killServer(self):
+        try:
+            self.serverProcess.terminate()
+        except OSError:
+            _log.info('Invalid pid, server may exit properly')
+
+    def getReturnCode(self):
+        return self.serverProcess.returncode
</ins></span></pre></div>
<a id="trunkToolsScriptswebkitpybenchmark_runnerutilspy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py (183519 => 183520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py        2015-04-29 00:32:25 UTC (rev 183519)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/utils.py        2015-04-29 00:51:36 UTC (rev 183520)
</span><span class="lines">@@ -4,6 +4,7 @@
</span><span class="cx"> import logging
</span><span class="cx"> import os
</span><span class="cx"> import signal
</span><ins>+import shutil
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> _log = logging.getLogger(__name__)
</span><span class="lines">@@ -37,6 +38,13 @@
</span><span class="cx">         raise Exception(&quot;Invalid json format or empty json was found in %s&quot; % (filePath))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def forceRemove(path):
+    try:
+        shutil.rmtree(path)
+    except:
+        # Directory/file does not exist or privilege issue, just ignore it
+        pass
+
</ins><span class="cx"> # Borrow this code from
</span><span class="cx"> # 'http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish'
</span><span class="cx"> class TimeoutError(Exception):
</span></span></pre>
</div>
</div>

</body>
</html>