<!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" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { 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 #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#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>
<title>[23050] trunk/launchd/src/launchd_core_logic.c</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/launchd/changeset/23050">23050</a></dd>
<dt>Author</dt> <dd>zarzycki@apple.com</dd>
<dt>Date</dt> <dd>2007-02-08 17:51:31 -0800 (Thu, 08 Feb 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre>Performance hack. We really ought to switch to hashes at some point.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunklaunchdsrclaunchd_core_logicc">trunk/launchd/src/launchd_core_logic.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunklaunchdsrclaunchd_core_logicc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_core_logic.c (23049 => 23050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchd_core_logic.c        2007-02-08 23:44:35 UTC (rev 23049)
+++ trunk/launchd/src/launchd_core_logic.c        2007-02-09 01:51:31 UTC (rev 23050)
</span><span class="lines">@@ -191,7 +191,7 @@
</span><span class="cx"> struct jobmgr_s {
</span><span class="cx">         SLIST_ENTRY(jobmgr_s) sle;
</span><span class="cx">         SLIST_HEAD(, jobmgr_s) submgrs;
</span><del>-        SLIST_HEAD(, job_s) jobs;
</del><ins>+        TAILQ_HEAD(, job_s) jobs;
</ins><span class="cx">         mach_port_t jm_port;
</span><span class="cx">         mach_port_t req_port;
</span><span class="cx">         jobmgr_t parentmgr;
</span><span class="lines">@@ -227,7 +227,7 @@
</span><span class="cx">
</span><span class="cx"> struct job_s {
</span><span class="cx">         kq_callback kqjob_callback;
</span><del>-        SLIST_ENTRY(job_s) sle;
</del><ins>+        TAILQ_ENTRY(job_s) sle;
</ins><span class="cx">         SLIST_HEAD(, socketgroup) sockets;
</span><span class="cx">         SLIST_HEAD(, calendarinterval) cal_intervals;
</span><span class="cx">         SLIST_HEAD(, envitem) global_env;
</span><span class="lines">@@ -523,7 +523,7 @@
</span><span class="cx">                 jobmgr_shutdown(jmi);
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</del><ins>+        TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</ins><span class="cx">                 if (!job_active(ji)) {
</span><span class="cx">                         job_remove(ji);
</span><span class="cx">                 } else if (!ji->hopefully_exits_last) {
</span><span class="lines">@@ -551,10 +551,10 @@
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         /* We should have one job left and it should be the anonymous job */
</span><del>-        ji = SLIST_FIRST(&jm->jobs);
-        jobmgr_assumes(jm, ji && ji == jm->anonj && (SLIST_NEXT(ji, sle) == NULL));
</del><ins>+        ji = TAILQ_FIRST(&jm->jobs);
+        jobmgr_assumes(jm, ji && ji == jm->anonj && (TAILQ_NEXT(ji, sle) == NULL));
</ins><span class="cx">
</span><del>-        while ((ji = SLIST_FIRST(&jm->jobs))) {
</del><ins>+        while ((ji = TAILQ_FIRST(&jm->jobs))) {
</ins><span class="cx">                 job_remove(ji);
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -682,7 +682,7 @@
</span><span class="cx">         kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
</span><span class="cx">
</span><span class="cx">         if (job_assumes(j, j->mgr)) {
</span><del>-                SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
</del><ins>+                TAILQ_REMOVE(&j->mgr->jobs, j, sle);
</ins><span class="cx">                 jobmgr_tickle(j->mgr);
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -972,7 +972,7 @@
</span><span class="cx">                 j->argv[i] = NULL;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_INSERT_HEAD(&jm->jobs, j, sle);
</del><ins>+        TAILQ_INSERT_TAIL(&jm->jobs, j, sle);
</ins><span class="cx">
</span><span class="cx">         job_log(j, LOG_DEBUG, "Conceived");
</span><span class="cx">
</span><span class="lines">@@ -1493,7 +1493,7 @@
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 if (strcmp(ji->label, label) == 0) {
</span><span class="cx">                         return ji;
</span><span class="cx">                 }
</span><span class="lines">@@ -1514,15 +1514,17 @@
</span><span class="cx">
</span><span class="cx">                 runtime_get_caller_creds(&ldc);
</span><span class="cx">
</span><del>-                SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+                TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                         if (ji->p == ldc.pid) {
</span><span class="cx">                                 /* This is just a MRU perfomance hack */
</span><del>-                                SLIST_REMOVE(&jm->jobs, ji, job_s, sle);
-                                SLIST_INSERT_HEAD(&jm->jobs, ji, sle);
</del><ins>+                                TAILQ_REMOVE(&jm->jobs, ji, sle);
+                                TAILQ_INSERT_HEAD(&jm->jobs, ji, sle);
</ins><span class="cx">                                 return ji;
</span><ins>+                        } else if (ji->p == 0) {
+                                /* All the PIDs are at the front of the list */
+                                break;
</ins><span class="cx">                         }
</span><span class="cx">                 }
</span><del>-
</del><span class="cx">                 return jm->anonj;
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -1534,7 +1536,7 @@
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 if (ji->j_port == p) {
</span><span class="cx">                         return ji;
</span><span class="cx">                 }
</span><span class="lines">@@ -1566,7 +1568,7 @@
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 SLIST_FOREACH(ms, &ji->machservices, sle) {
</span><span class="cx">                         if (ms->port == p) {
</span><span class="cx">                                 return ji;
</span><span class="lines">@@ -1592,7 +1594,7 @@
</span><span class="cx">                 job_export_all2(jmi, where);
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 launch_data_t tmp;
</span><span class="cx">
</span><span class="cx">                 if (jobmgr_assumes(jm, (tmp = job_export2(ji, false)) != NULL)) {
</span><span class="lines">@@ -1636,6 +1638,10 @@
</span><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">
</span><ins>+        /* Performance hack */
+        TAILQ_REMOVE(&j->mgr->jobs, j, sle);
+        TAILQ_INSERT_TAIL(&j->mgr->jobs, j, sle);
+
</ins><span class="cx">         job_assumes(j, gettimeofday(&tve, NULL) != -1);
</span><span class="cx">
</span><span class="cx">         if (j->wait_reply_port) {
</span><span class="lines">@@ -1698,7 +1704,7 @@
</span><span class="cx">                 jobmgr_dispatch_all(jmi);
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</del><ins>+        TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</ins><span class="cx">                 job_dispatch(ji, false);
</span><span class="cx">         }
</span><span class="cx"> }
</span><span class="lines">@@ -1889,6 +1895,10 @@
</span><span class="cx">                 job_start_child(j);
</span><span class="cx">                 break;
</span><span class="cx">         default:
</span><ins>+                /* Performance hack */
+                TAILQ_REMOVE(&j->mgr->jobs, j, sle);
+                TAILQ_INSERT_HEAD(&j->mgr->jobs, j, sle);
+
</ins><span class="cx">                 if (!j->legacy_mach_job) {
</span><span class="cx">                         job_assumes(j, close(oepair[1]) != -1);
</span><span class="cx">                 }
</span><span class="lines">@@ -1993,7 +2003,7 @@
</span><span class="cx">                 jobmgr_setup_env_from_other_jobs(jm->parentmgr);
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 SLIST_FOREACH(ei, &ji->global_env, sle) {
</span><span class="cx">                         setenv(ei->key, ei->value, 1);
</span><span class="cx">                 }
</span><span class="lines">@@ -2815,7 +2825,7 @@
</span><span class="cx">                 unsigned int cnt = 0;
</span><span class="cx">                 job_t ji;
</span><span class="cx">
</span><del>-                SLIST_FOREACH(ji, &j->mgr->jobs, sle) {
</del><ins>+                TAILQ_FOREACH(ji, &j->mgr->jobs, sle) {
</ins><span class="cx">                         if (ji->p) {
</span><span class="cx">                                 cnt++;
</span><span class="cx">                         }
</span><span class="lines">@@ -3186,13 +3196,13 @@
</span><span class="cx">                 return jm;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 if (ji->p && !ji->hopefully_exits_last) {
</span><span class="cx">                         return jm;
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 job_stop(ji);
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -3215,7 +3225,7 @@
</span><span class="cx">                 return false;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 if (ji->p) {
</span><span class="cx">                         return false;
</span><span class="cx">                 }
</span><span class="lines">@@ -3306,6 +3316,8 @@
</span><span class="cx">                 return NULL;
</span><span class="cx">         }
</span><span class="cx">
</span><ins>+        TAILQ_INIT(&jmr->jobs);
+
</ins><span class="cx">         jmr->req_port = requestorport;
</span><span class="cx">
</span><span class="cx">         if ((jmr->parentmgr = jm)) {
</span><span class="lines">@@ -3378,7 +3390,7 @@
</span><span class="cx">                 jobmgr_delete_anything_with_port(jmi, port);
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</del><ins>+        TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</ins><span class="cx">                 SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) {
</span><span class="cx">                         if (ms->port == port) {
</span><span class="cx">                                 machservice_delete(ms);
</span><span class="lines">@@ -3393,7 +3405,7 @@
</span><span class="cx">         struct machservice *ms;
</span><span class="cx">         job_t ji;
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 SLIST_FOREACH(ms, &ji->machservices, sle) {
</span><span class="cx">                         if (strcmp(name, ms->name) == 0) {
</span><span class="cx">                                 return ms;
</span><span class="lines">@@ -3551,7 +3563,7 @@
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         /* We don't need the _SAFE version because we return after the job_dispatch() */
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 SLIST_FOREACH(ms, &ji->machservices, sle) {
</span><span class="cx">                         if (ms->port != p) {
</span><span class="cx">                                 continue;
</span><span class="lines">@@ -3704,7 +3716,7 @@
</span><span class="cx">                 jobmgr_dispatch_all_semaphores(jmi);
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</del><ins>+        TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
</ins><span class="cx">                 if (!SLIST_EMPTY(&ji->semaphores)) {
</span><span class="cx">                         job_dispatch(ji, false);
</span><span class="cx">                 }
</span><span class="lines">@@ -4027,7 +4039,7 @@
</span><span class="cx">
</span><span class="cx">         *up_cont = MACH_PORT_NULL;
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {
</ins><span class="cx">                 if (ji->mach_uid != which_user) {
</span><span class="cx">                         continue;
</span><span class="cx">                 }
</span><span class="lines">@@ -4248,7 +4260,7 @@
</span><span class="cx">
</span><span class="cx">         jm = j->mgr;
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 SLIST_FOREACH(ms, &ji->machservices, sle) {
</span><span class="cx">                         cnt++;
</span><span class="cx">                 }
</span><span class="lines">@@ -4268,7 +4280,7 @@
</span><span class="cx">                 goto out_bad;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &jm->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &jm->jobs, sle) {
</ins><span class="cx">                 SLIST_FOREACH(ms, &ji->machservices, sle) {
</span><span class="cx">                         strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
</span><span class="cx">                         service_actives[cnt2] = machservice_status(ms);
</span><span class="lines">@@ -4312,8 +4324,8 @@
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (job_assumes(j, jmi != NULL)) {
</span><del>-                SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
-                SLIST_INSERT_HEAD(&jmi->jobs, j, sle);
</del><ins>+                TAILQ_REMOVE(&j->mgr->jobs, j, sle);
+                TAILQ_INSERT_TAIL(&jmi->jobs, j, sle);
</ins><span class="cx">                 j->mgr = jmi;
</span><span class="cx">         }
</span><span class="cx"> }
</span><span class="lines">@@ -4651,7 +4663,7 @@
</span><span class="cx">
</span><span class="cx">         launchd_assert((root_jobmgr = jobmgr_new(NULL, mach_task_self(), checkin_port)) != NULL);
</span><span class="cx">
</span><del>-        SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
</del><ins>+        TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {
</ins><span class="cx">                 if (ji->anonymous) {
</span><span class="cx">                         anon_job = ji;
</span><span class="cx">                         break;
</span></span></pre>
</div>
</div>
</body>
</html>