Projects
Browse Source     Search     Timeline     Wiki

Changeset 23379

Show
Ignore:
Timestamp:
09/13/07 10:40:43 (15 months ago)
Author:
zarzycki@…
Message:

Smarter idle exit logic.

Files:
1 modified

Legend:

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

    r23378 r23379  
    251251static void semaphoreitem_watch(job_t j, struct semaphoreitem *si); 
    252252static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si); 
     253static void semaphoreitem_runtime_mod_ref(struct semaphoreitem *si, bool add); 
    253254 
    254255#define ACTIVE_JOB_HASH_SIZE    32 
     
    23302331                time_t respawn_delta = j->min_run_time - td; 
    23312332 
     2333                /* 
     2334                 * We technically should ref-count throttled jobs to prevent idle exit, 
     2335                 * but we're not directly tracking the 'throttled' state at the moment. 
     2336                 */ 
     2337 
    23322338                job_log(j, LOG_WARNING, "Throttling respawn: Will start in %ld seconds", respawn_delta); 
    23332339                job_assumes(j, kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_ADD|EV_ONESHOT, NOTE_SECONDS, respawn_delta, j) != -1); 
     
    45734579        SLIST_INSERT_HEAD(&j->semaphores, si, sle); 
    45744580 
    4575         runtime_add_ref(); 
     4581        semaphoreitem_runtime_mod_ref(si, true); 
    45764582 
    45774583        return true; 
     
    45794585 
    45804586void 
     4587semaphoreitem_runtime_mod_ref(struct semaphoreitem *si, bool add) 
     4588{ 
     4589        /* 
     4590         * External events need to be tracked. 
     4591         * Internal events do NOT need to be tracked. 
     4592         */ 
     4593 
     4594        switch (si->why) { 
     4595        case SUCCESSFUL_EXIT: 
     4596        case FAILED_EXIT: 
     4597        case OTHER_JOB_ENABLED: 
     4598        case OTHER_JOB_DISABLED: 
     4599        case OTHER_JOB_ACTIVE: 
     4600        case OTHER_JOB_INACTIVE: 
     4601                return; 
     4602        default: 
     4603                break; 
     4604        } 
     4605 
     4606        if (add) { 
     4607                runtime_add_ref(); 
     4608        } else { 
     4609                runtime_del_ref(); 
     4610        } 
     4611} 
     4612 
     4613void 
    45814614semaphoreitem_delete(job_t j, struct semaphoreitem *si) 
    45824615{ 
     4616        semaphoreitem_runtime_mod_ref(si, false); 
     4617 
    45834618        SLIST_REMOVE(&j->semaphores, si, semaphoreitem, sle); 
    45844619 
     
    45884623 
    45894624        free(si); 
    4590  
    4591         runtime_del_ref(); 
    45924625} 
    45934626