<!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>[174628] 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/174628">174628</a></dd>
<dt>Author</dt> <dd>dfarler@apple.com</dd>
<dt>Date</dt> <dd>2014-10-10 18:09:30 -0700 (Fri, 10 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] LayoutTestRelay should ensure its DRT/WKTR dies when receiving kill/term signals
https://bugs.webkit.org/show_bug.cgi?id=137528

Reviewed by Simon Fraser.

Catch SIGINT and SIGTERM signals in the LayoutTestRelay
and SIGKILL the paired simulator app before exiting cleanly.

webkitpy only uses SIGKILL to kill processes which you cannot
catch. Send SIGTERM to the process and give it chance to do
its thing before sending SIGKILL. Sending a SIGKILL to an already
dead PID is safe.

* LayoutTestRelay/LayoutTestRelay/LTRelayController.h:
* LayoutTestRelay/LayoutTestRelay/LTRelayController.m:
(-[LTRelayController finish]):
* LayoutTestRelay/LayoutTestRelay/main.m:
(receivedSignal):
(main):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsLayoutTestRelayLayoutTestRelayLTRelayControllerh">trunk/Tools/LayoutTestRelay/LayoutTestRelay/LTRelayController.h</a></li>
<li><a href="#trunkToolsLayoutTestRelayLayoutTestRelaymainm">trunk/Tools/LayoutTestRelay/LayoutTestRelay/main.m</a></li>
<li><a href="#trunkToolsScriptswebkitpycommonsystemexecutivepy">trunk/Tools/Scripts/webkitpy/common/system/executive.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (174627 => 174628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-10-11 00:59:43 UTC (rev 174627)
+++ trunk/Tools/ChangeLog        2014-10-11 01:09:30 UTC (rev 174628)
</span><span class="lines">@@ -1,5 +1,27 @@
</span><span class="cx"> 2014-10-10  David Farler  &lt;dfarler@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        [iOS] LayoutTestRelay should ensure its DRT/WKTR dies when receiving kill/term signals
+        https://bugs.webkit.org/show_bug.cgi?id=137528
+
+        Reviewed by Simon Fraser.
+
+        Catch SIGINT and SIGTERM signals in the LayoutTestRelay
+        and SIGKILL the paired simulator app before exiting cleanly.
+
+        webkitpy only uses SIGKILL to kill processes which you cannot
+        catch. Send SIGTERM to the process and give it chance to do
+        its thing before sending SIGKILL. Sending a SIGKILL to an already
+        dead PID is safe.
+
+        * LayoutTestRelay/LayoutTestRelay/LTRelayController.h:
+        * LayoutTestRelay/LayoutTestRelay/LTRelayController.m:
+        (-[LTRelayController finish]):
+        * LayoutTestRelay/LayoutTestRelay/main.m:
+        (receivedSignal):
+        (main):
+
+2014-10-10  David Farler  &lt;dfarler@apple.com&gt;
+
</ins><span class="cx">         [iOS] LayoutTestRelay should detect EOF and properly signal underlying DRT/WKTR
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=137527
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsLayoutTestRelayLayoutTestRelayLTRelayControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/LayoutTestRelay/LayoutTestRelay/LTRelayController.h (174627 => 174628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/LayoutTestRelay/LayoutTestRelay/LTRelayController.h        2014-10-11 00:59:43 UTC (rev 174627)
+++ trunk/Tools/LayoutTestRelay/LayoutTestRelay/LTRelayController.h        2014-10-11 01:09:30 UTC (rev 174628)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> @interface LTRelayController : NSObject &lt;LTRelayDelegate&gt;
</span><span class="cx"> - (id)initWithDevice:(SimDevice *)device productDir:(NSString *)productDir appPath:(NSString *)appPath identifierSuffix:(NSString *)suffix dumpToolArguments:(NSArray *)arguments;
</span><span class="cx"> - (void)start;
</span><ins>+- (void)finish;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkToolsLayoutTestRelayLayoutTestRelaymainm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/LayoutTestRelay/LayoutTestRelay/main.m (174627 => 174628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/LayoutTestRelay/LayoutTestRelay/main.m        2014-10-11 00:59:43 UTC (rev 174627)
+++ trunk/Tools/LayoutTestRelay/LayoutTestRelay/main.m        2014-10-11 01:09:30 UTC (rev 174628)
</span><span class="lines">@@ -28,6 +28,8 @@
</span><span class="cx"> #import &lt;CoreSimulator/CoreSimulator.h&gt;
</span><span class="cx"> #import &lt;Foundation/Foundation.h&gt;
</span><span class="cx"> 
</span><ins>+static LTRelayController *relayController;
+
</ins><span class="cx"> void usage()
</span><span class="cx"> {
</span><span class="cx">     NSString *helpText = @&quot;LayoutTestRelay: run a dump tool in the simulator. Not for direct consumption.\n&quot;
</span><span class="lines">@@ -96,6 +98,16 @@
</span><span class="cx">     return dumpToolArguments;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void finish()
+{
+    [relayController finish];
+}
+
+void receivedSignal(int signal)
+{
+    exit(EXIT_SUCCESS);
+}
+
</ins><span class="cx"> int main(int argc, const char * argv[])
</span><span class="cx"> {
</span><span class="cx">     @autoreleasepool {
</span><span class="lines">@@ -127,8 +139,13 @@
</span><span class="cx"> 
</span><span class="cx">         SimDevice *device = getTestingSimDevice(deviceType, runtime);
</span><span class="cx"> 
</span><del>-        LTRelayController *relayController = [[LTRelayController alloc] initWithDevice:device productDir:productDir appPath:appPath identifierSuffix:suffix dumpToolArguments:dumpToolArguments];
</del><ins>+        relayController = [[LTRelayController alloc] initWithDevice:device productDir:productDir appPath:appPath identifierSuffix:suffix dumpToolArguments:dumpToolArguments];
</ins><span class="cx">         [relayController start];
</span><ins>+
+        atexit(finish);
+        signal(SIGINT, receivedSignal);
+        signal(SIGTERM, receivedSignal);
+
</ins><span class="cx">         [[NSRunLoop mainRunLoop] run];
</span><span class="cx">     }
</span><span class="cx">     return 0;
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpycommonsystemexecutivepy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/common/system/executive.py (174627 => 174628)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/common/system/executive.py        2014-10-11 00:59:43 UTC (rev 174627)
+++ trunk/Tools/Scripts/webkitpy/common/system/executive.py        2014-10-11 01:09:30 UTC (rev 174628)
</span><span class="lines">@@ -199,6 +199,10 @@
</span><span class="cx">         while retries_left &gt; 0:
</span><span class="cx">             try:
</span><span class="cx">                 retries_left -= 1
</span><ins>+                # Give processes one change to clean up quickly before exiting.
+                # Following up with a kill should have no effect if the process
+                # already exited, and forcefully kill it if SIGTERM wasn't enough.
+                os.kill(pid, signal.SIGTERM)
</ins><span class="cx">                 os.kill(pid, signal.SIGKILL)
</span><span class="cx">                 _ = os.waitpid(pid, os.WNOHANG)
</span><span class="cx">             except OSError, e:
</span></span></pre>
</div>
</div>

</body>
</html>