[launchd-changes] [23611] trunk/launchd/src/libbootstrap.c

source_changes at macosforge.org source_changes at macosforge.org
Wed Apr 30 13:31:20 PDT 2008


Revision: 23611
          http://trac.macosforge.org/projects/launchd/changeset/23611
Author:   zarzycki at apple.com
Date:     2008-04-30 13:31:20 -0700 (Wed, 30 Apr 2008)

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

Modified Paths:
--------------
    trunk/launchd/src/libbootstrap.c

Modified: trunk/launchd/src/libbootstrap.c
===================================================================
--- trunk/launchd/src/libbootstrap.c	2008-04-30 17:29:52 UTC (rev 23610)
+++ trunk/launchd/src/libbootstrap.c	2008-04-30 20:31:20 UTC (rev 23611)
@@ -169,20 +169,47 @@
 kern_return_t
 bootstrap_look_up2(mach_port_t bp, name_t service_name, mach_port_t *sp, pid_t target_pid, uint64_t flags)
 {
-	kern_return_t kr;
+	static pthread_mutex_t bslu2_lock = PTHREAD_MUTEX_INITIALIZER;
+	static mach_port_t prev_bp;
+	static mach_port_t prev_sp;
+	static name_t prev_name;
+	kern_return_t kr = 0;
 	mach_port_t puc;
 
+	pthread_mutex_lock(&bslu2_lock);
+
+	if (prev_sp) {
+	       	if ((bp == prev_bp) && (strncmp(prev_name, service_name, sizeof(name_t)) == 0)
+				&& (mach_port_mod_refs(mach_task_self(), prev_sp, MACH_PORT_RIGHT_SEND, 1) == 0)) {
+			*sp = prev_sp;
+			goto out;
+		} else {
+			mach_port_deallocate(mach_task_self(), prev_sp);
+			prev_sp = 0;
+		}
+	}
+
 	if ((kr = vproc_mig_look_up2(bp, service_name, sp, target_pid, flags)) != VPROC_ERR_TRY_PER_USER) {
-		return kr;
+		goto out;
 	}
 
 	if ((kr = vproc_mig_lookup_per_user_context(bp, 0, &puc)) != 0) {
-		return kr;
+		goto out;
 	}
 
 	kr = vproc_mig_look_up2(puc, service_name, sp, target_pid, flags);
 	mach_port_deallocate(mach_task_self(), puc);
 
+out:
+	if (kr == 0 && prev_sp == 0 && mach_port_mod_refs(mach_task_self(), *sp, MACH_PORT_RIGHT_SEND, 1) == 0) {
+		/* We're going to hold on to a send right as a MRU cache */
+		prev_bp = bp;
+		prev_sp = *sp;
+		strlcpy(prev_name, service_name, sizeof(name_t));
+	}
+
+	pthread_mutex_unlock(&bslu2_lock);
+
 	return kr;
 }
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20080430/d2f9f460/attachment.html


More information about the launchd-changes mailing list