Changeset 23147
- Timestamp:
- 03/08/07 15:34:00 (21 months ago)
- Files:
-
- 1 modified
-
trunk/launchd/src/launchd_core_logic.c (modified) (27 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/launchd/src/launchd_core_logic.c
r23144 r23147 194 194 static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si); 195 195 196 #define IS_POWER_OF_TWO(v) (!(v & (v - 1)) && v) 197 #define ACTIVE_JOB_HASH_SIZE 32 198 #define ACTIVE_JOB_HASH(x) (IS_POWER_OF_TWO(ACTIVE_JOB_HASH_SIZE) ? (x & (ACTIVE_JOB_HASH_SIZE - 1)) : (x % ACTIVE_JOB_HASH_SIZE)) 199 196 200 struct jobmgr_s { 197 201 kq_callback kqjobmgr_callback; 198 202 SLIST_ENTRY(jobmgr_s) sle; 199 203 SLIST_HEAD(, jobmgr_s) submgrs; 200 TAILQ_HEAD(, job_s) jobs; 204 SLIST_HEAD(, job_s) jobs; 205 SLIST_HEAD(, job_s) active_jobs[ACTIVE_JOB_HASH_SIZE]; 201 206 mach_port_t jm_port; 202 207 mach_port_t req_port; … … 231 236 struct job_s { 232 237 kq_callback kqjob_callback; 233 TAILQ_ENTRY(job_s) sle; 238 SLIST_ENTRY(job_s) sle; 239 SLIST_ENTRY(job_s) hash_sle; 234 240 SLIST_HEAD(, socketgroup) sockets; 235 241 SLIST_HEAD(, calendarinterval) cal_intervals; … … 546 552 } 547 553 548 TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {554 SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 549 555 if (!job_active(ji)) { 550 556 job_remove(ji); … … 576 582 577 583 /* We should have one job left and it should be the anonymous job */ 578 ji = TAILQ_FIRST(&jm->jobs);584 ji = SLIST_FIRST(&jm->jobs); 579 585 if (!(jobmgr_assumes(jm, ji != NULL) && jobmgr_assumes(jm, ji == jm->anonj) 580 && jobmgr_assumes(jm, TAILQ_NEXT(ji, sle) == NULL))) {581 TAILQ_FOREACH(ji, &jm->jobs, sle) {586 && jobmgr_assumes(jm, SLIST_NEXT(ji, sle) == NULL))) { 587 SLIST_FOREACH(ji, &jm->jobs, sle) { 582 588 job_log(ji, LOG_ERR, "Still remaining at removal."); 583 589 } 584 590 } 585 591 586 while ((ji = TAILQ_FIRST(&jm->jobs))) {592 while ((ji = SLIST_FIRST(&jm->jobs))) { 587 593 job_remove(ji); 588 594 } … … 708 714 709 715 if (job_assumes(j, j->mgr)) { 710 TAILQ_REMOVE(&j->mgr->jobs, j, sle);716 SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); 711 717 } 712 718 … … 999 1005 } 1000 1006 1001 TAILQ_INSERT_TAIL(&jm->jobs, j, sle);1007 SLIST_INSERT_HEAD(&jm->jobs, j, sle); 1002 1008 1003 1009 job_log(j, LOG_DEBUG, "Conceived"); … … 1519 1525 } 1520 1526 1521 TAILQ_FOREACH(ji, &jm->jobs, sle) {1527 SLIST_FOREACH(ji, &jm->jobs, sle) { 1522 1528 if (strcmp(ji->label, label) == 0) { 1523 1529 return ji; … … 1537 1543 if (jm->jm_port == p) { 1538 1544 struct ldcred ldc; 1545 pid_t hashp; 1539 1546 1540 1547 runtime_get_caller_creds(&ldc); 1541 1548 1542 TAILQ_FOREACH(ji, &jm->jobs, sle) { 1549 hashp = ACTIVE_JOB_HASH(ldc.pid); 1550 1551 SLIST_FOREACH(ji, &jm->active_jobs[hashp], hash_sle) { 1543 1552 if (ji->p == ldc.pid) { 1544 /* This is just a MRU perfomance hack */1545 TAILQ_REMOVE(&jm->jobs, ji, sle);1546 TAILQ_INSERT_HEAD(&jm->jobs, ji, sle);1547 1553 return ji; 1548 } else if (ji->p == 0) {1549 /* All the PIDs are at the front of the list */1550 break;1551 1554 } 1552 1555 } … … 1562 1565 } 1563 1566 1564 TAILQ_FOREACH(ji, &jm->jobs, sle) {1567 SLIST_FOREACH(ji, &jm->jobs, sle) { 1565 1568 if (ji->j_port == p) { 1566 1569 return ji; … … 1594 1597 } 1595 1598 1596 TAILQ_FOREACH(ji, &jm->jobs, sle) {1599 SLIST_FOREACH(ji, &jm->jobs, sle) { 1597 1600 SLIST_FOREACH(ms, &ji->machservices, sle) { 1598 1601 if (ms->port == p) { … … 1620 1623 } 1621 1624 1622 TAILQ_FOREACH(ji, &jm->jobs, sle) {1625 SLIST_FOREACH(ji, &jm->jobs, sle) { 1623 1626 launch_data_t tmp; 1624 1627 … … 1689 1692 1690 1693 total_children--; 1691 1692 /* Performance hack */ 1693 TAILQ_REMOVE(&j->mgr->jobs, j, sle); 1694 TAILQ_INSERT_TAIL(&j->mgr->jobs, j, sle); 1694 SLIST_REMOVE(&j->mgr->active_jobs[ACTIVE_JOB_HASH(j->p)], j, job_s, hash_sle); 1695 1695 1696 1696 job_assumes(j, gettimeofday(&tve, NULL) != -1); … … 1761 1761 } 1762 1762 1763 TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {1763 SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 1764 1764 job_dispatch(ji, false); 1765 1765 } … … 2026 2026 default: 2027 2027 total_children++; 2028 2029 /* Performance hack */ 2030 TAILQ_REMOVE(&j->mgr->jobs, j, sle); 2031 TAILQ_INSERT_HEAD(&j->mgr->jobs, j, sle); 2028 SLIST_INSERT_HEAD(&j->mgr->active_jobs[ACTIVE_JOB_HASH(c)], j, hash_sle); 2032 2029 2033 2030 if (!j->legacy_mach_job) { … … 2138 2135 } 2139 2136 2140 TAILQ_FOREACH(ji, &jm->jobs, sle) {2137 SLIST_FOREACH(ji, &jm->jobs, sle) { 2141 2138 SLIST_FOREACH(ei, &ji->global_env, sle) { 2142 2139 setenv(ei->key, ei->value, 1); … … 3304 3301 } 3305 3302 3306 TAILQ_FOREACH(ji, &jm->jobs, sle) {3303 SLIST_FOREACH(ji, &jm->jobs, sle) { 3307 3304 if (ji->p && !ji->hopefully_exits_last) { 3308 3305 return jm; … … 3312 3309 jobmgr_log(jm, LOG_DEBUG, "Asking \"hopeful\" jobs to exit."); 3313 3310 3314 TAILQ_FOREACH(ji, &jm->jobs, sle) {3311 SLIST_FOREACH(ji, &jm->jobs, sle) { 3315 3312 job_stop(ji); 3316 3313 } … … 3369 3366 } 3370 3367 3371 TAILQ_FOREACH(ji, &jm->jobs, sle) {3368 SLIST_FOREACH(ji, &jm->jobs, sle) { 3372 3369 if (ji->p) { 3373 3370 return false; … … 3422 3419 } 3423 3420 3424 TAILQ_INIT(&jmr->jobs);3425 3421 jmr->kqjobmgr_callback = jobmgr_callback; 3426 3422 strcpy(jmr->name, name ? name : "Under construction"); … … 3541 3537 } 3542 3538 3543 TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {3539 SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 3544 3540 SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) { 3545 3541 if (ms->port == port) { … … 3566 3562 } 3567 3563 3568 TAILQ_FOREACH(ji, &jm->jobs, sle) {3564 SLIST_FOREACH(ji, &jm->jobs, sle) { 3569 3565 if (target_pid && (ji->p != target_pid)) { 3570 3566 continue; … … 3729 3725 3730 3726 /* We don't need the _SAFE version because we return after the job_dispatch() */ 3731 TAILQ_FOREACH(ji, &jm->jobs, sle) {3727 SLIST_FOREACH(ji, &jm->jobs, sle) { 3732 3728 SLIST_FOREACH(ms, &ji->machservices, sle) { 3733 3729 if (ms->port != p) { … … 3948 3944 } 3949 3945 3950 TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {3946 SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 3951 3947 if (!SLIST_EMPTY(&ji->semaphores)) { 3952 3948 job_dispatch(ji, false); … … 4314 4310 *up_cont = MACH_PORT_NULL; 4315 4311 4316 TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {4312 SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { 4317 4313 if (ji->mach_uid != which_user) { 4318 4314 continue; … … 4539 4535 jm = j->mgr; 4540 4536 4541 TAILQ_FOREACH(ji, &jm->jobs, sle) {4537 SLIST_FOREACH(ji, &jm->jobs, sle) { 4542 4538 SLIST_FOREACH(ms, &ji->machservices, sle) { 4543 4539 if (!ms->per_pid) { … … 4561 4557 } 4562 4558 4563 TAILQ_FOREACH(ji, &jm->jobs, sle) {4559 SLIST_FOREACH(ji, &jm->jobs, sle) { 4564 4560 SLIST_FOREACH(ms, &ji->machservices, sle) { 4565 4561 if (!ms->per_pid) { … … 4611 4607 4612 4608 if (job_assumes(j, jmi != NULL)) { 4613 TAILQ_REMOVE(&j->mgr->jobs, j, sle);4614 TAILQ_INSERT_TAIL(&jmi->jobs, j, sle);4609 SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); 4610 SLIST_INSERT_HEAD(&jmi->jobs, j, sle); 4615 4611 j->mgr = jmi; 4616 4612 }

