Projects
Browse Source     Search     Timeline     Wiki

Changeset 23147

Show
Ignore:
Timestamp:
03/08/07 15:34:00 (21 months ago)
Author:
zarzycki@…
Message:

Let's ditch the old reordring of the job_t list MRU hack in favor of an actual hash based lookup.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/launchd/src/launchd_core_logic.c

    r23144 r23147  
    194194static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si); 
    195195 
     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 
    196200struct jobmgr_s { 
    197201        kq_callback kqjobmgr_callback; 
    198202        SLIST_ENTRY(jobmgr_s) sle; 
    199203        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]; 
    201206        mach_port_t jm_port; 
    202207        mach_port_t req_port; 
     
    231236struct job_s { 
    232237        kq_callback kqjob_callback; 
    233         TAILQ_ENTRY(job_s) sle; 
     238        SLIST_ENTRY(job_s) sle; 
     239        SLIST_ENTRY(job_s) hash_sle; 
    234240        SLIST_HEAD(, socketgroup) sockets; 
    235241        SLIST_HEAD(, calendarinterval) cal_intervals; 
     
    546552        } 
    547553 
    548         TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
     554        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
    549555                if (!job_active(ji)) { 
    550556                        job_remove(ji); 
     
    576582 
    577583        /* 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); 
    579585        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) { 
    582588                        job_log(ji, LOG_ERR, "Still remaining at removal."); 
    583589                } 
    584590        } 
    585591 
    586         while ((ji = TAILQ_FIRST(&jm->jobs))) { 
     592        while ((ji = SLIST_FIRST(&jm->jobs))) { 
    587593                job_remove(ji); 
    588594        } 
     
    708714 
    709715        if (job_assumes(j, j->mgr)) { 
    710                 TAILQ_REMOVE(&j->mgr->jobs, j, sle); 
     716                SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle); 
    711717        } 
    712718 
     
    9991005        } 
    10001006 
    1001         TAILQ_INSERT_TAIL(&jm->jobs, j, sle); 
     1007        SLIST_INSERT_HEAD(&jm->jobs, j, sle); 
    10021008 
    10031009        job_log(j, LOG_DEBUG, "Conceived"); 
     
    15191525        } 
    15201526 
    1521         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     1527        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    15221528                if (strcmp(ji->label, label) == 0) { 
    15231529                        return ji; 
     
    15371543        if (jm->jm_port == p) { 
    15381544                struct ldcred ldc; 
     1545                pid_t hashp; 
    15391546 
    15401547                runtime_get_caller_creds(&ldc); 
    15411548 
    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) { 
    15431552                        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); 
    15471553                                return ji; 
    1548                         } else if (ji->p == 0) { 
    1549                                 /* All the PIDs are at the front of the list */ 
    1550                                 break; 
    15511554                        } 
    15521555                } 
     
    15621565        } 
    15631566 
    1564         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     1567        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    15651568                if (ji->j_port == p) { 
    15661569                        return ji; 
     
    15941597        } 
    15951598 
    1596         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     1599        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    15971600                SLIST_FOREACH(ms, &ji->machservices, sle) { 
    15981601                        if (ms->port == p) { 
     
    16201623        } 
    16211624 
    1622         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     1625        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    16231626                launch_data_t tmp; 
    16241627 
     
    16891692 
    16901693        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); 
    16951695 
    16961696        job_assumes(j, gettimeofday(&tve, NULL) != -1); 
     
    17611761        } 
    17621762 
    1763         TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
     1763        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
    17641764                job_dispatch(ji, false); 
    17651765        } 
     
    20262026        default: 
    20272027                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); 
    20322029 
    20332030                if (!j->legacy_mach_job) { 
     
    21382135        } 
    21392136 
    2140         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     2137        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    21412138                SLIST_FOREACH(ei, &ji->global_env, sle) { 
    21422139                        setenv(ei->key, ei->value, 1); 
     
    33043301        } 
    33053302 
    3306         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     3303        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    33073304                if (ji->p && !ji->hopefully_exits_last) { 
    33083305                        return jm; 
     
    33123309        jobmgr_log(jm, LOG_DEBUG, "Asking \"hopeful\" jobs to exit."); 
    33133310 
    3314         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     3311        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    33153312                job_stop(ji); 
    33163313        } 
     
    33693366        } 
    33703367 
    3371         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     3368        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    33723369                if (ji->p) { 
    33733370                        return false; 
     
    34223419        } 
    34233420 
    3424         TAILQ_INIT(&jmr->jobs); 
    34253421        jmr->kqjobmgr_callback = jobmgr_callback; 
    34263422        strcpy(jmr->name, name ? name : "Under construction"); 
     
    35413537        } 
    35423538 
    3543         TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
     3539        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
    35443540                SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) { 
    35453541                        if (ms->port == port) { 
     
    35663562        } 
    35673563 
    3568         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     3564        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    35693565                if (target_pid && (ji->p != target_pid)) { 
    35703566                        continue; 
     
    37293725 
    37303726        /* 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) { 
    37323728                SLIST_FOREACH(ms, &ji->machservices, sle) { 
    37333729                        if (ms->port != p) { 
     
    39483944        } 
    39493945 
    3950         TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
     3946        SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) { 
    39513947                if (!SLIST_EMPTY(&ji->semaphores)) { 
    39523948                        job_dispatch(ji, false); 
     
    43144310        *up_cont = MACH_PORT_NULL; 
    43154311 
    4316         TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) { 
     4312        SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) { 
    43174313                if (ji->mach_uid != which_user) { 
    43184314                        continue; 
     
    45394535        jm = j->mgr; 
    45404536 
    4541         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     4537        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    45424538                SLIST_FOREACH(ms, &ji->machservices, sle) { 
    45434539                        if (!ms->per_pid) { 
     
    45614557        } 
    45624558 
    4563         TAILQ_FOREACH(ji, &jm->jobs, sle) { 
     4559        SLIST_FOREACH(ji, &jm->jobs, sle) { 
    45644560                SLIST_FOREACH(ms, &ji->machservices, sle) { 
    45654561                        if (!ms->per_pid) { 
     
    46114607 
    46124608        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); 
    46154611                j->mgr = jmi; 
    46164612        }