[launchd-changes] [23168] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 22 09:18:32 PDT 2007


Revision: 23168
          http://trac.macosforge.org/projects/launchd/changeset/23168
Author:   zarzycki at apple.com
Date:     2007-03-22 09:18:32 -0700 (Thu, 22 Mar 2007)

Log Message:
-----------
Even more hashed lookups.

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_core_logic.h
    trunk/launchd/src/launchd_runtime.c

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-03-22 04:06:04 UTC (rev 23167)
+++ trunk/launchd/src/launchd_core_logic.c	2007-03-22 16:18:32 UTC (rev 23168)
@@ -94,19 +94,27 @@
 #define LAUNCHD_DEFAULT_EXIT_TIMEOUT 20
 #define LAUNCHD_SIGKILL_TIMER 5
 
+#define IS_POWER_OF_TWO(v)	(!(v & (v - 1)) && v)
+
 extern char **environ;
 
 mach_port_t inherited_bootstrap_port;
 
 struct machservice {
 	SLIST_ENTRY(machservice) sle;
-	SLIST_ENTRY(machservice) hash_sle;
+	SLIST_ENTRY(machservice) name_hash_sle;
+	SLIST_ENTRY(machservice) port_hash_sle;
 	job_t			job;
 	mach_port_name_t	port;
 	unsigned int		isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, must_match_uid:1, debug_on_close:1, per_pid:1;
 	const char		name[0];
 };
 
+#define PORT_HASH_SIZE 32
+#define HASH_PORT(x)	(IS_POWER_OF_TWO(PORT_HASH_SIZE) ? (MACH_PORT_INDEX(x) & (PORT_HASH_SIZE - 1)) : (MACH_PORT_INDEX(x) % PORT_HASH_SIZE))
+
+SLIST_HEAD(, machservice) port_hash[PORT_HASH_SIZE];
+
 static void machservice_setup(launch_data_t obj, const char *key, void *context);
 static void machservice_setup_options(launch_data_t obj, const char *key, void *context);
 static void machservice_resetport(job_t j, struct machservice *ms);
@@ -194,7 +202,6 @@
 static void semaphoreitem_watch(job_t j, struct semaphoreitem *si);
 static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si);
 
-#define IS_POWER_OF_TWO(v)	(!(v & (v - 1)) && v)
 #define ACTIVE_JOB_HASH_SIZE	32
 #define ACTIVE_JOB_HASH(x)	(IS_POWER_OF_TWO(ACTIVE_JOB_HASH_SIZE) ? (x & (ACTIVE_JOB_HASH_SIZE - 1)) : (x % ACTIVE_JOB_HASH_SIZE))
 #define MACHSERVICE_HASH_SIZE	37
@@ -1614,26 +1621,16 @@
 }
 
 job_t
-jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p)
+job_find_by_service_port(mach_port_t p)
 {
 	struct machservice *ms;
-	jobmgr_t jmi;
-	job_t ji, jr;
 
-	SLIST_FOREACH(jmi, &jm->submgrs, sle) {
-		if ((jr = jobmgr_find_by_service_port(jmi, p))) {
-			return jr;
+	SLIST_FOREACH(ms, &port_hash[HASH_PORT(p)], port_hash_sle) {
+		if (ms->port == p) {
+			return ms->job;
 		}
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
-		SLIST_FOREACH(ms, &ji->machservices, sle) {
-			if (ms->port == p) {
-				return ji;
-			}
-		}
-	}
-
 	return NULL;
 }
 
@@ -3203,10 +3200,12 @@
 void
 machservice_resetport(job_t j, struct machservice *ms)
 {
+	SLIST_REMOVE(&port_hash[HASH_PORT(ms->port)], ms, machservice, port_hash_sle);
 	job_assumes(j, launchd_mport_close_recv(ms->port) == KERN_SUCCESS);
 	job_assumes(j, launchd_mport_deallocate(ms->port) == KERN_SUCCESS);
 	job_assumes(j, launchd_mport_create_recv(&ms->port) == KERN_SUCCESS);
 	job_assumes(j, launchd_mport_make_send(ms->port) == KERN_SUCCESS);
+	SLIST_INSERT_HEAD(&port_hash[HASH_PORT(ms->port)], ms, port_hash_sle);
 }
 
 struct machservice *
@@ -3238,7 +3237,8 @@
 	}
 
 	SLIST_INSERT_HEAD(&j->machservices, ms, sle);
-	SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(ms->name)], ms, hash_sle);
+	SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(ms->name)], ms, name_hash_sle);
+	SLIST_INSERT_HEAD(&port_hash[HASH_PORT(ms->port)], ms, port_hash_sle);
 
 	job_log(j, LOG_INFO, "Mach service added: %s", name);
 
@@ -3619,7 +3619,6 @@
 {
 	struct machservice *ms, *next_ms;
 	jobmgr_t jmi, jmn;
-	job_t ji, jn;
 
 	/* Mach ports, unlike Unix descriptors, are reference counted. In other
 	 * words, when some program hands us a second or subsequent send right
@@ -3631,18 +3630,18 @@
 	 * to use.
 	 */
 
-	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
-		jobmgr_delete_anything_with_port(jmi, port);
-	}
-
-	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
-		SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) {
+	if (jm == root_jobmgr) {
+		SLIST_FOREACH_SAFE(ms, &port_hash[HASH_PORT(port)], port_hash_sle, next_ms) {
 			if (ms->port == port) {
-				machservice_delete(ji, ms);
+				machservice_delete(ms->job, ms);
 			}
 		}
 	}
 
+	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
+		jobmgr_delete_anything_with_port(jmi, port);
+	}
+
 	if (jm->req_port == port) {
 		return jobmgr_shutdown(jm);
 	}
@@ -3659,7 +3658,7 @@
 		jobmgr_assumes(jm, !check_parent);
 	}
 
-	SLIST_FOREACH(ms, &jm->ms_hash[hash_ms(name)], hash_sle) {
+	SLIST_FOREACH(ms, &jm->ms_hash[hash_ms(name)], name_hash_sle) {
 		if ((target_pid && ms->per_pid && ms->job->p == target_pid) || (!target_pid && !ms->per_pid)) {
 			if (strcmp(name, ms->name) == 0) {
 				return ms;
@@ -3725,7 +3724,8 @@
 	job_log(j, LOG_INFO, "Mach service deleted: %s", ms->name);
 
 	SLIST_REMOVE(&j->machservices, ms, machservice, sle);
-	SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(ms->name)], ms, machservice, hash_sle);
+	SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(ms->name)], ms, machservice, name_hash_sle);
+	SLIST_REMOVE(&port_hash[HASH_PORT(ms->port)], ms, machservice, port_hash_sle);
 
 	free(ms);
 }
@@ -3805,38 +3805,29 @@
 }
 
 bool
-jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p)
+job_ack_port_destruction(mach_port_t p)
 {
-	struct machservice *ms = NULL;
-	jobmgr_t jmi;
-	job_t ji;
+	struct machservice *ms;
 
-	SLIST_FOREACH(jmi, &jm->submgrs, sle) {
-		if (jobmgr_ack_port_destruction(jmi, p)) {
-			return true;
+	SLIST_FOREACH(ms, &port_hash[HASH_PORT(p)], port_hash_sle) {
+		if (ms->port == p) {
+			break;
 		}
 	}
 
-	/* We don't need the _SAFE version because we return after the job_dispatch() */
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
-		SLIST_FOREACH(ms, &ji->machservices, sle) {
-			if (ms->port != p) {
-				continue;
-			}
+	if (!ms) {
+		return false;
+	}
 
-			ms->isActive = false;
+	ms->isActive = false;
 
-			if (ms->reset) {
-				machservice_resetport(ji, ms);
-			}
-
-			job_log(ji, LOG_DEBUG, "Receive right returned to us: %s", ms->name);
-			job_dispatch(ji, false);
-			return true;
-		}
+	if (ms->reset) {
+		machservice_resetport(ms->job, ms);
 	}
 
-	return false;
+	job_log(ms->job, LOG_DEBUG, "Receive right returned to us: %s", ms->name);
+	job_dispatch(ms->job, false);
+	return true;
 }
 
 void
@@ -4713,7 +4704,7 @@
 		struct machservice *msi;
 
 		SLIST_FOREACH(msi, &j->machservices, sle) {
-			SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(msi->name)], msi, machservice, hash_sle);
+			SLIST_REMOVE(&j->mgr->ms_hash[hash_ms(msi->name)], msi, machservice, name_hash_sle);
 		}
 
 		SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
@@ -4721,7 +4712,7 @@
 		j->mgr = jmi;
 
 		SLIST_FOREACH(msi, &j->machservices, sle) {
-			SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(msi->name)], msi, hash_sle);
+			SLIST_INSERT_HEAD(&j->mgr->ms_hash[hash_ms(msi->name)], msi, name_hash_sle);
 		}
 	}
 }

Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h	2007-03-22 04:06:04 UTC (rev 23167)
+++ trunk/launchd/src/launchd_core_logic.h	2007-03-22 16:18:32 UTC (rev 23168)
@@ -32,13 +32,13 @@
 jobmgr_t jobmgr_shutdown(jobmgr_t jm);
 void jobmgr_dispatch_all_semaphores(jobmgr_t jm);
 jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port);
-bool jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p);
-job_t jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p);
 
 launch_data_t job_export_all(void);
 
 job_t job_dispatch(job_t j, bool kickstart); /* returns j on success, NULL on job removal */
 job_t job_find(const char *label);
+job_t job_find_by_service_port(mach_port_t p);
+bool job_ack_port_destruction(mach_port_t p);
 bool job_active(job_t j);
 bool job_is_anonymous(job_t j);
 launch_data_t job_export(job_t j);

Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c	2007-03-22 04:06:04 UTC (rev 23167)
+++ trunk/launchd/src/launchd_runtime.c	2007-03-22 16:18:32 UTC (rev 23168)
@@ -419,7 +419,7 @@
 			continue;
 		}
 		if (status.mps_msgcount) {
-			EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, jobmgr_find_by_service_port(root_jobmgr, members[i]));
+			EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, job_find_by_service_port(members[i]));
 #if 0
 			if (launchd_assumes(kev.udata != NULL)) {
 #endif
@@ -709,7 +709,7 @@
 {
 	/* This message is sent to us when a receive right is returned to us. */
 
-	if (!jobmgr_ack_port_destruction(root_jobmgr, rights)) {
+	if (!launchd_assumes(job_ack_port_destruction(rights))) {
 		launchd_assumes(launchd_mport_close_recv(rights) == KERN_SUCCESS);
 	}
 

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


More information about the launchd-changes mailing list