<!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>[138530] trunk/base/src/darwintracelib1.0/darwintrace.c</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="https://trac.macports.org/changeset/138530">138530</a></dd>
<dt>Author</dt> <dd>cal@macports.org</dd>
<dt>Date</dt> <dd>2015-07-11 04:14:59 -0700 (Sat, 11 Jul 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>base: darwintrace: close sockets when threads are terminated

If a long-running process started and terminated a large number of processes,
the file descriptors the were opened for these threads would not get closed.
Instead, they would linger around in memory, unreferenced, until the process
was terminated completely.

This can cause exhaustion of file descriptors and fail builds. I've seen this
behavior with GHC.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbasesrcdarwintracelib10darwintracec">trunk/base/src/darwintracelib1.0/darwintrace.c</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbasesrcdarwintracelib10darwintracec"></a>
<div class="modfile"><h4>Modified: trunk/base/src/darwintracelib1.0/darwintrace.c (138529 => 138530)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/base/src/darwintracelib1.0/darwintrace.c        2015-07-11 11:08:38 UTC (rev 138529)
+++ trunk/base/src/darwintracelib1.0/darwintrace.c        2015-07-11 11:14:59 UTC (rev 138530)
</span><span class="lines">@@ -133,6 +133,13 @@
</span><span class="cx">  */
</span><span class="cx"> static char *filemap;
</span><span class="cx"> 
</span><ins>+static void __darwintrace_sock_destructor(FILE *dtsock) {
+        __darwintrace_close_sock = fileno(dtsock);
+        fclose(dtsock);
+        __darwintrace_close_sock = -1;
+        pthread_setspecific(sock_key, NULL);
+}
+
</ins><span class="cx"> /**
</span><span class="cx">  * Setup method called as constructor to set up thread-local storage for the
</span><span class="cx">  * thread id and the darwintrace socket.
</span><span class="lines">@@ -142,7 +149,7 @@
</span><span class="cx">                 perror(&quot;darwintrace: pthread_key_create&quot;);
</span><span class="cx">                 abort();
</span><span class="cx">         }
</span><del>-        if (0 != (errno = pthread_key_create(&amp;sock_key, NULL))) {
</del><ins>+        if (0 != (errno = pthread_key_create(&amp;sock_key, (void (*)(void *)) __darwintrace_sock_destructor))) {
</ins><span class="cx">                 perror(&quot;darwintrace: pthread_key_create&quot;);
</span><span class="cx">                 abort();
</span><span class="cx">         }
</span></span></pre>
</div>
</div>

</body>
</html>