Changeset 23611
- Timestamp:
- 2008-04-30 13:31:20 (6 months ago)
- Files:
-
- 1 modified
-
trunk/launchd/src/libbootstrap.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/launchd/src/libbootstrap.c
r23601 r23611 170 170 bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags) 171 171 { 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; 173 177 mach_port_t puc; 174 178 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 175 192 if ((kr = vproc_mig_look_up2(bp, service_name, sp, target_pid, flags)) != VPROC_ERR_TRY_PER_USER) { 176 return kr;193 goto out; 177 194 } 178 195 179 196 if ((kr = vproc_mig_lookup_per_user_context(bp, 0, &puc)) != 0) { 180 return kr;197 goto out; 181 198 } 182 199 183 200 kr = vproc_mig_look_up2(puc, service_name, sp, target_pid, flags); 184 201 mach_port_deallocate(mach_task_self(), puc); 202 203 out: 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); 185 212 186 213 return kr;

