Revision: 23050 http://trac.macosforge.org/projects/launchd/changeset/23050 Author: zarzycki@apple.com Date: 2007-02-08 17:51:31 -0800 (Thu, 08 Feb 2007) Log Message: ----------- Performance hack. We really ought to switch to hashes at some point. 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-02-08 23:44:35 UTC (rev 23049) +++ trunk/launchd/src/launchd_core_logic.c 2007-02-09 01:51:31 UTC (rev 23050) @@ -191,7 +191,7 @@ struct jobmgr_s { SLIST_ENTRY(jobmgr_s) sle; SLIST_HEAD(, jobmgr_s) submgrs; - SLIST_HEAD(, job_s) jobs; + TAILQ_HEAD(, job_s) jobs; mach_port_t jm_port; mach_port_t req_port; jobmgr_t parentmgr; @@ -227,7 +227,7 @@ struct job_s { kq_callback kqjob_callback; - SLIST_ENTRY(job_s) sle; + TAILQ_ENTRY(job_s) sle; SLIST_HEAD(, socketgroup) sockets; SLIST_HEAD(, calendarinterval) cal_intervals; SLIST_HEAD(, envitem) global_env; @@ -523,7 +523,7 @@ jobmgr_shutdown(jmi); } - SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { if (!job_active(ji)) { job_remove(ji); } else if (!ji->hopefully_exits_last) { @@ -551,10 +551,10 @@ } /* We should have one job left and it should be the anonymous job */ - ji = SLIST_FIRST(&jm->jobs); - jobmgr_assumes(jm, ji && ji == jm->anonj && (SLIST_NEXT(ji, sle) == NULL)); + ji = TAILQ_FIRST(&jm->jobs); + jobmgr_assumes(jm, ji && ji == jm->anonj && (TAILQ_NEXT(ji, sle) == NULL)); - while ((ji = SLIST_FIRST(&jm->jobs))) { + while ((ji = TAILQ_FIRST(&jm->jobs))) { job_remove(ji); } @@ -682,7 +682,7 @@ kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); if (job_assumes(j, j->mgr)) { - SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); + TAILQ_REMOVE(&j->mgr->jobs, j, sle); jobmgr_tickle(j->mgr); } @@ -972,7 +972,7 @@ j->argv[i] = NULL; } - SLIST_INSERT_HEAD(&jm->jobs, j, sle); + TAILQ_INSERT_TAIL(&jm->jobs, j, sle); job_log(j, LOG_DEBUG, "Conceived"); @@ -1493,7 +1493,7 @@ } } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { if (strcmp(ji->label, label) == 0) { return ji; } @@ -1514,15 +1514,17 @@ runtime_get_caller_creds(&ldc); - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { if (ji->p == ldc.pid) { /* This is just a MRU perfomance hack */ - SLIST_REMOVE(&jm->jobs, ji, job_s, sle); - SLIST_INSERT_HEAD(&jm->jobs, ji, sle); + 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; } @@ -1534,7 +1536,7 @@ } } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { if (ji->j_port == p) { return ji; } @@ -1566,7 +1568,7 @@ } } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ms, &ji->machservices, sle) { if (ms->port == p) { return ji; @@ -1592,7 +1594,7 @@ job_export_all2(jmi, where); } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { launch_data_t tmp; if (jobmgr_assumes(jm, (tmp = job_export2(ji, false)) != NULL)) { @@ -1636,6 +1638,10 @@ return; } + /* 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) { @@ -1698,7 +1704,7 @@ jobmgr_dispatch_all(jmi); } - SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { job_dispatch(ji, false); } } @@ -1889,6 +1895,10 @@ job_start_child(j); break; default: + /* 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); } @@ -1993,7 +2003,7 @@ jobmgr_setup_env_from_other_jobs(jm->parentmgr); } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ei, &ji->global_env, sle) { setenv(ei->key, ei->value, 1); } @@ -2815,7 +2825,7 @@ unsigned int cnt = 0; job_t ji; - SLIST_FOREACH(ji, &j->mgr->jobs, sle) { + TAILQ_FOREACH(ji, &j->mgr->jobs, sle) { if (ji->p) { cnt++; } @@ -3186,13 +3196,13 @@ return jm; } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { if (ji->p && !ji->hopefully_exits_last) { return jm; } } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { job_stop(ji); } @@ -3215,7 +3225,7 @@ return false; } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { if (ji->p) { return false; } @@ -3306,6 +3316,8 @@ return NULL; } + TAILQ_INIT(&jmr->jobs); + jmr->req_port = requestorport; if ((jmr->parentmgr = jm)) { @@ -3378,7 +3390,7 @@ jobmgr_delete_anything_with_port(jmi, port); } - SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) { if (ms->port == port) { machservice_delete(ms); @@ -3393,7 +3405,7 @@ struct machservice *ms; job_t ji; - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ms, &ji->machservices, sle) { if (strcmp(name, ms->name) == 0) { return ms; @@ -3551,7 +3563,7 @@ } /* We don't need the _SAFE version because we return after the job_dispatch() */ - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ms, &ji->machservices, sle) { if (ms->port != p) { continue; @@ -3704,7 +3716,7 @@ jobmgr_dispatch_all_semaphores(jmi); } - SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { + TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { if (!SLIST_EMPTY(&ji->semaphores)) { job_dispatch(ji, false); } @@ -4027,7 +4039,7 @@ *up_cont = MACH_PORT_NULL; - SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { + TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) { if (ji->mach_uid != which_user) { continue; } @@ -4248,7 +4260,7 @@ jm = j->mgr; - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ms, &ji->machservices, sle) { cnt++; } @@ -4268,7 +4280,7 @@ goto out_bad; } - SLIST_FOREACH(ji, &jm->jobs, sle) { + TAILQ_FOREACH(ji, &jm->jobs, sle) { SLIST_FOREACH(ms, &ji->machservices, sle) { strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0])); service_actives[cnt2] = machservice_status(ms); @@ -4312,8 +4324,8 @@ } if (job_assumes(j, jmi != NULL)) { - SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); - SLIST_INSERT_HEAD(&jmi->jobs, j, sle); + TAILQ_REMOVE(&j->mgr->jobs, j, sle); + TAILQ_INSERT_TAIL(&jmi->jobs, j, sle); j->mgr = jmi; } } @@ -4651,7 +4663,7 @@ launchd_assert((root_jobmgr = jobmgr_new(NULL, mach_task_self(), checkin_port)) != NULL); - SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { + TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) { if (ji->anonymous) { anon_job = ji; break;
participants (1)
-
source_changes@macosforge.org