[launchd-changes] [23147] trunk/launchd/src/launchd_core_logic.c
source_changes at macosforge.org
source_changes at macosforge.org
Thu Mar 8 15:34:00 PST 2007
Revision: 23147
http://trac.macosforge.org/projects/launchd/changeset/23147
Author: zarzycki at apple.com
Date: 2007-03-08 15:34:00 -0800 (Thu, 08 Mar 2007)
Log Message:
-----------
Let's ditch the old reordring of the job_t list MRU hack in favor of an actual hash based lookup.
Modified Paths:
--------------
trunk/launchd/src/launchd_core_logic.c
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-03-08 23:01:26 UTC (rev 23146)
+++ trunk/launchd/src/launchd_core_logic.c 2007-03-08 23:34:00 UTC (rev 23147)
@@ -193,11 +193,16 @@
static void semaphoreitem_watch(job_t j, struct semaphoreitem *si);
static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si);
+#define IS_POWER_OF_TWO(v) (!(v & (v - 1)) && v)
+#define ACTIVE_JOB_HASH_SIZE 32
+#define ACTIVE_JOB_HASH(x) (IS_POWER_OF_TWO(ACTIVE_JOB_HASH_SIZE) ? (x & (ACTIVE_JOB_HASH_SIZE - 1)) : (x % ACTIVE_JOB_HASH_SIZE))
+
struct jobmgr_s {
kq_callback kqjobmgr_callback;
SLIST_ENTRY(jobmgr_s) sle;
SLIST_HEAD(, jobmgr_s) submgrs;
- TAILQ_HEAD(, job_s) jobs;
+ SLIST_HEAD(, job_s) jobs;
+ SLIST_HEAD(, job_s) active_jobs[ACTIVE_JOB_HASH_SIZE];
mach_port_t jm_port;
mach_port_t req_port;
jobmgr_t parentmgr;
@@ -230,7 +235,8 @@
struct job_s {
kq_callback kqjob_callback;
- TAILQ_ENTRY(job_s) sle;
+ SLIST_ENTRY(job_s) sle;
+ SLIST_ENTRY(job_s) hash_sle;
SLIST_HEAD(, socketgroup) sockets;
SLIST_HEAD(, calendarinterval) cal_intervals;
SLIST_HEAD(, envitem) global_env;
@@ -545,7 +551,7 @@
jobmgr_shutdown(jmi);
}
- TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+ SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
if (!job_active(ji)) {
job_remove(ji);
} else if (!ji->hopefully_exits_last) {
@@ -575,15 +581,15 @@
}
/* We should have one job left and it should be the anonymous job */
- ji = TAILQ_FIRST(&jm->jobs);
+ ji = SLIST_FIRST(&jm->jobs);
if (!(jobmgr_assumes(jm, ji != NULL) && jobmgr_assumes(jm, ji == jm->anonj)
- && jobmgr_assumes(jm, TAILQ_NEXT(ji, sle) == NULL))) {
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ && jobmgr_assumes(jm, SLIST_NEXT(ji, sle) == NULL))) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
job_log(ji, LOG_ERR, "Still remaining at removal.");
}
}
- while ((ji = TAILQ_FIRST(&jm->jobs))) {
+ while ((ji = SLIST_FIRST(&jm->jobs))) {
job_remove(ji);
}
@@ -707,7 +713,7 @@
kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
if (job_assumes(j, j->mgr)) {
- TAILQ_REMOVE(&j->mgr->jobs, j, sle);
+ SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
}
job_log(j, LOG_DEBUG, "Removed");
@@ -998,7 +1004,7 @@
j->argv[i] = NULL;
}
- TAILQ_INSERT_TAIL(&jm->jobs, j, sle);
+ SLIST_INSERT_HEAD(&jm->jobs, j, sle);
job_log(j, LOG_DEBUG, "Conceived");
@@ -1518,7 +1524,7 @@
}
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
if (strcmp(ji->label, label) == 0) {
return ji;
}
@@ -1536,18 +1542,15 @@
if (jm->jm_port == p) {
struct ldcred ldc;
+ pid_t hashp;
runtime_get_caller_creds(&ldc);
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ hashp = ACTIVE_JOB_HASH(ldc.pid);
+
+ SLIST_FOREACH(ji, &jm->active_jobs[hashp], hash_sle) {
if (ji->p == ldc.pid) {
- /* This is just a MRU perfomance hack */
- TAILQ_REMOVE(&jm->jobs, ji, sle);
- TAILQ_INSERT_HEAD(&jm->jobs, ji, sle);
return ji;
- } else if (ji->p == 0) {
- /* All the PIDs are at the front of the list */
- break;
}
}
return jm->anonj;
@@ -1561,7 +1564,7 @@
}
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
if (ji->j_port == p) {
return ji;
}
@@ -1593,7 +1596,7 @@
}
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
SLIST_FOREACH(ms, &ji->machservices, sle) {
if (ms->port == p) {
return ji;
@@ -1619,7 +1622,7 @@
job_export_all2(jmi, where);
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
launch_data_t tmp;
if (jobmgr_assumes(jm, (tmp = job_export2(ji, false)) != NULL)) {
@@ -1688,11 +1691,8 @@
}
total_children--;
+ SLIST_REMOVE(&j->mgr->active_jobs[ACTIVE_JOB_HASH(j->p)], j, job_s, hash_sle);
- /* Performance hack */
- TAILQ_REMOVE(&j->mgr->jobs, j, sle);
- TAILQ_INSERT_TAIL(&j->mgr->jobs, j, sle);
-
job_assumes(j, gettimeofday(&tve, NULL) != -1);
if (j->wait_reply_port) {
@@ -1760,7 +1760,7 @@
jobmgr_dispatch_all(jmi);
}
- TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+ SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
job_dispatch(ji, false);
}
}
@@ -2025,11 +2025,8 @@
break;
default:
total_children++;
+ SLIST_INSERT_HEAD(&j->mgr->active_jobs[ACTIVE_JOB_HASH(c)], j, hash_sle);
- /* Performance hack */
- TAILQ_REMOVE(&j->mgr->jobs, j, sle);
- TAILQ_INSERT_HEAD(&j->mgr->jobs, j, sle);
-
if (!j->legacy_mach_job) {
job_assumes(j, close(oepair[1]) != -1);
}
@@ -2137,7 +2134,7 @@
jobmgr_setup_env_from_other_jobs(jm->parentmgr);
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
SLIST_FOREACH(ei, &ji->global_env, sle) {
setenv(ei->key, ei->value, 1);
}
@@ -3303,7 +3300,7 @@
return jm;
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
if (ji->p && !ji->hopefully_exits_last) {
return jm;
}
@@ -3311,7 +3308,7 @@
jobmgr_log(jm, LOG_DEBUG, "Asking \"hopeful\" jobs to exit.");
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
job_stop(ji);
}
@@ -3368,7 +3365,7 @@
return false;
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
if (ji->p) {
return false;
}
@@ -3421,7 +3418,6 @@
return NULL;
}
- TAILQ_INIT(&jmr->jobs);
jmr->kqjobmgr_callback = jobmgr_callback;
strcpy(jmr->name, name ? name : "Under construction");
@@ -3540,7 +3536,7 @@
jobmgr_delete_anything_with_port(jmi, port);
}
- TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+ SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) {
if (ms->port == port) {
machservice_delete(ms);
@@ -3565,7 +3561,7 @@
jobmgr_assumes(jm, !check_parent);
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
if (target_pid && (ji->p != target_pid)) {
continue;
}
@@ -3728,7 +3724,7 @@
}
/* We don't need the _SAFE version because we return after the job_dispatch() */
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
SLIST_FOREACH(ms, &ji->machservices, sle) {
if (ms->port != p) {
continue;
@@ -3947,7 +3943,7 @@
jobmgr_dispatch_all_semaphores(jmi);
}
- TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+ SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
if (!SLIST_EMPTY(&ji->semaphores)) {
job_dispatch(ji, false);
}
@@ -4313,7 +4309,7 @@
*up_cont = MACH_PORT_NULL;
- TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {
+ SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
if (ji->mach_uid != which_user) {
continue;
}
@@ -4538,7 +4534,7 @@
jm = j->mgr;
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
SLIST_FOREACH(ms, &ji->machservices, sle) {
if (!ms->per_pid) {
cnt++;
@@ -4560,7 +4556,7 @@
goto out_bad;
}
- TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ SLIST_FOREACH(ji, &jm->jobs, sle) {
SLIST_FOREACH(ms, &ji->machservices, sle) {
if (!ms->per_pid) {
strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
@@ -4610,8 +4606,8 @@
}
if (job_assumes(j, jmi != NULL)) {
- TAILQ_REMOVE(&j->mgr->jobs, j, sle);
- TAILQ_INSERT_TAIL(&jmi->jobs, j, sle);
+ SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
+ SLIST_INSERT_HEAD(&jmi->jobs, j, sle);
j->mgr = jmi;
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070308/d1d82a26/attachment.html
More information about the launchd-changes
mailing list