[launchd-changes] [23147] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Mar 8 15:34:00 PST 2007


Revision: 23147
          http://trac.macosforge.org/projects/launchd/changeset/23147
Author:   zarzycki at apple.com
Date:     2007-03-08 15:34:00 -0800 (Thu, 08 Mar 2007)

Log Message:
-----------
Let's ditch the old reordring of the job_t list MRU hack in favor of an actual hash based lookup.

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

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-03-08 23:01:26 UTC (rev 23146)
+++ trunk/launchd/src/launchd_core_logic.c	2007-03-08 23:34:00 UTC (rev 23147)
@@ -193,11 +193,16 @@
 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))
+
 struct jobmgr_s {
 	kq_callback kqjobmgr_callback;
 	SLIST_ENTRY(jobmgr_s) sle;
 	SLIST_HEAD(, jobmgr_s) submgrs;
-	TAILQ_HEAD(, job_s) jobs;
+	SLIST_HEAD(, job_s) jobs;
+	SLIST_HEAD(, job_s) active_jobs[ACTIVE_JOB_HASH_SIZE];
 	mach_port_t jm_port;
 	mach_port_t req_port;
 	jobmgr_t parentmgr;
@@ -230,7 +235,8 @@
 
 struct job_s {
 	kq_callback kqjob_callback;
-	TAILQ_ENTRY(job_s) sle;
+	SLIST_ENTRY(job_s) sle;
+	SLIST_ENTRY(job_s) hash_sle;
 	SLIST_HEAD(, socketgroup) sockets;
 	SLIST_HEAD(, calendarinterval) cal_intervals;
 	SLIST_HEAD(, envitem) global_env;
@@ -545,7 +551,7 @@
 		jobmgr_shutdown(jmi);
 	}
 
-	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		if (!job_active(ji)) {
 			job_remove(ji);
 		} else if (!ji->hopefully_exits_last) {
@@ -575,15 +581,15 @@
 	}
 
 	/* We should have one job left and it should be the anonymous job */
-	ji = TAILQ_FIRST(&jm->jobs);
+	ji = SLIST_FIRST(&jm->jobs);
 	if (!(jobmgr_assumes(jm, ji != NULL) && jobmgr_assumes(jm, ji == jm->anonj)
-				&& jobmgr_assumes(jm, TAILQ_NEXT(ji, sle) == NULL))) {
-		TAILQ_FOREACH(ji, &jm->jobs, sle) {
+				&& jobmgr_assumes(jm, SLIST_NEXT(ji, sle) == NULL))) {
+		SLIST_FOREACH(ji, &jm->jobs, sle) {
 			job_log(ji, LOG_ERR, "Still remaining at removal.");
 		}
 	}
 
-	while ((ji = TAILQ_FIRST(&jm->jobs))) {
+	while ((ji = SLIST_FIRST(&jm->jobs))) {
 		job_remove(ji);
 	}
 
@@ -707,7 +713,7 @@
 	kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
 
 	if (job_assumes(j, j->mgr)) {
-		TAILQ_REMOVE(&j->mgr->jobs, j, sle);
+		SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
 	}
 
 	job_log(j, LOG_DEBUG, "Removed");
@@ -998,7 +1004,7 @@
 		j->argv[i] = NULL;
 	}
 
-	TAILQ_INSERT_TAIL(&jm->jobs, j, sle);
+	SLIST_INSERT_HEAD(&jm->jobs, j, sle);
 
 	job_log(j, LOG_DEBUG, "Conceived");
 
@@ -1518,7 +1524,7 @@
 		}
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		if (strcmp(ji->label, label) == 0) {
 			return ji;
 		}
@@ -1536,18 +1542,15 @@
 
 	if (jm->jm_port == p) {
 		struct ldcred ldc;
+		pid_t hashp;
 
 		runtime_get_caller_creds(&ldc);
 
-		TAILQ_FOREACH(ji, &jm->jobs, sle) {
+		hashp = ACTIVE_JOB_HASH(ldc.pid);
+
+		SLIST_FOREACH(ji, &jm->active_jobs[hashp], hash_sle) {
 			if (ji->p == ldc.pid) {
-				/* This is just a MRU perfomance hack */
-				TAILQ_REMOVE(&jm->jobs, ji, sle);
-				TAILQ_INSERT_HEAD(&jm->jobs, ji, sle);
 				return ji;
-			} else if (ji->p == 0) {
-				/* All the PIDs are at the front of the list */
-				break;
 			}
 		}
 		return jm->anonj;
@@ -1561,7 +1564,7 @@
 		}
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->j_port == p) {
 			return ji;
 		}
@@ -1593,7 +1596,7 @@
 		}
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (ms->port == p) {
 				return ji;
@@ -1619,7 +1622,7 @@
 		job_export_all2(jmi, where);
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		launch_data_t tmp;
 
 		if (jobmgr_assumes(jm, (tmp = job_export2(ji, false)) != NULL)) {
@@ -1688,11 +1691,8 @@
 	}
 
 	total_children--;
+	SLIST_REMOVE(&j->mgr->active_jobs[ACTIVE_JOB_HASH(j->p)], j, job_s, hash_sle);
 
-	/* Performance hack */
-	TAILQ_REMOVE(&j->mgr->jobs, j, sle);
-	TAILQ_INSERT_TAIL(&j->mgr->jobs, j, sle);
-
 	job_assumes(j, gettimeofday(&tve, NULL) != -1);
 
 	if (j->wait_reply_port) {
@@ -1760,7 +1760,7 @@
 		jobmgr_dispatch_all(jmi);
 	}
 
-	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		job_dispatch(ji, false);
 	}
 }
@@ -2025,11 +2025,8 @@
 		break;
 	default:
 		total_children++;
+		SLIST_INSERT_HEAD(&j->mgr->active_jobs[ACTIVE_JOB_HASH(c)], j, hash_sle);
 
-		/* Performance hack */
-		TAILQ_REMOVE(&j->mgr->jobs, j, sle);
-		TAILQ_INSERT_HEAD(&j->mgr->jobs, j, sle);
-
 		if (!j->legacy_mach_job) {
 			job_assumes(j, close(oepair[1]) != -1);
 		}
@@ -2137,7 +2134,7 @@
 		jobmgr_setup_env_from_other_jobs(jm->parentmgr);
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ei, &ji->global_env, sle) {
 			setenv(ei->key, ei->value, 1);
 		}
@@ -3303,7 +3300,7 @@
 		return jm;
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->p && !ji->hopefully_exits_last) {
 			return jm;
 		}
@@ -3311,7 +3308,7 @@
 
 	jobmgr_log(jm, LOG_DEBUG, "Asking \"hopeful\" jobs to exit.");
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		job_stop(ji);
 	}
 
@@ -3368,7 +3365,7 @@
 		return false;
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->p) {
 			return false;
 		}
@@ -3421,7 +3418,6 @@
 		return NULL;
 	}
 
-	TAILQ_INIT(&jmr->jobs);
 	jmr->kqjobmgr_callback = jobmgr_callback;
 	strcpy(jmr->name, name ? name : "Under construction");
 
@@ -3540,7 +3536,7 @@
 		jobmgr_delete_anything_with_port(jmi, port);
 	}
 
-	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) {
 			if (ms->port == port) {
 				machservice_delete(ms);
@@ -3565,7 +3561,7 @@
 		jobmgr_assumes(jm, !check_parent);
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		if (target_pid && (ji->p != target_pid)) {
 			continue;
 		}
@@ -3728,7 +3724,7 @@
 	}
 
 	/* We don't need the _SAFE version because we return after the job_dispatch() */
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (ms->port != p) {
 				continue;
@@ -3947,7 +3943,7 @@
 		jobmgr_dispatch_all_semaphores(jmi);
 	}
 
-	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		if (!SLIST_EMPTY(&ji->semaphores)) {
 			job_dispatch(ji, false);
 		}
@@ -4313,7 +4309,7 @@
 
 	*up_cont = MACH_PORT_NULL;
 
-	TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {
+	SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
 		if (ji->mach_uid != which_user) {
 			continue;
 		}
@@ -4538,7 +4534,7 @@
 
 	jm = j->mgr;
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (!ms->per_pid) {
 				cnt++;
@@ -4560,7 +4556,7 @@
 		goto out_bad;
 	}
 
-	TAILQ_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (!ms->per_pid) {
 				strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
@@ -4610,8 +4606,8 @@
 	}
 
 	if (job_assumes(j, jmi != NULL)) {
-		TAILQ_REMOVE(&j->mgr->jobs, j, sle);
-		TAILQ_INSERT_TAIL(&jmi->jobs, j, sle);
+		SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
+		SLIST_INSERT_HEAD(&jmi->jobs, j, sle);
 		j->mgr = jmi;
 	}
 }

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


More information about the launchd-changes mailing list