Projects
Browse Source     Search     Timeline     Wiki

Changeset 23611

Show
Ignore:
Timestamp:
2008-04-30 13:31:20 (6 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5737942> WindowServer is hammering my console with "Please fix the framework to cache the Mach port" messages

Files:
1 modified

Legend:

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

    r23601 r23611  
    170170bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags) 
    171171{ 
    172         kern_return_t kr; 
     172        static pthread_mutex_t bslu2_lock = PTHREAD_MUTEX_INITIALIZER; 
     173        static mach_port_t prev_bp; 
     174        static mach_port_t prev_sp; 
     175        static name_t prev_name; 
     176        kern_return_t kr = 0; 
    173177        mach_port_t puc; 
    174178 
     179        pthread_mutex_lock(&bslu2_lock); 
     180 
     181        if (prev_sp) { 
     182                if ((bp == prev_bp) && (strncmp(prev_name, service_name, sizeof(name_t)) == 0) 
     183                                && (mach_port_mod_refs(mach_task_self(), prev_sp, MACH_PORT_RIGHT_SEND, 1) == 0)) { 
     184                        *sp = prev_sp; 
     185                        goto out; 
     186                } else { 
     187                        mach_port_deallocate(mach_task_self(), prev_sp); 
     188                        prev_sp = 0; 
     189                } 
     190        } 
     191 
    175192        if ((kr = vproc_mig_look_up2(bp, service_name, sp, target_pid, flags)) != VPROC_ERR_TRY_PER_USER) { 
    176                 return kr; 
     193                goto out; 
    177194        } 
    178195 
    179196        if ((kr = vproc_mig_lookup_per_user_context(bp, 0, &puc)) != 0) { 
    180                 return kr; 
     197                goto out; 
    181198        } 
    182199 
    183200        kr = vproc_mig_look_up2(puc, service_name, sp, target_pid, flags); 
    184201        mach_port_deallocate(mach_task_self(), puc); 
     202 
     203out: 
     204        if (kr == 0 && prev_sp == 0 && mach_port_mod_refs(mach_task_self(), *sp, MACH_PORT_RIGHT_SEND, 1) == 0) { 
     205                /* We're going to hold on to a send right as a MRU cache */ 
     206                prev_bp = bp; 
     207                prev_sp = *sp; 
     208                strlcpy(prev_name, service_name, sizeof(name_t)); 
     209        } 
     210 
     211        pthread_mutex_unlock(&bslu2_lock); 
    185212 
    186213        return kr;