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

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 8 17:51:31 PST 2007


Revision: 23050
          http://trac.macosforge.org/projects/launchd/changeset/23050
Author:   zarzycki at apple.com
Date:     2007-02-08 17:51:31 -0800 (Thu, 08 Feb 2007)

Log Message:
-----------
Performance hack. We really ought to switch to hashes at some point.

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-02-08 23:44:35 UTC (rev 23049)
+++ trunk/launchd/src/launchd_core_logic.c	2007-02-09 01:51:31 UTC (rev 23050)
@@ -191,7 +191,7 @@
 struct jobmgr_s {
 	SLIST_ENTRY(jobmgr_s) sle;
 	SLIST_HEAD(, jobmgr_s) submgrs;
-	SLIST_HEAD(, job_s) jobs;
+	TAILQ_HEAD(, job_s) jobs;
 	mach_port_t jm_port;
 	mach_port_t req_port;
 	jobmgr_t parentmgr;
@@ -227,7 +227,7 @@
 
 struct job_s {
 	kq_callback kqjob_callback;
-	SLIST_ENTRY(job_s) sle;
+	TAILQ_ENTRY(job_s) sle;
 	SLIST_HEAD(, socketgroup) sockets;
 	SLIST_HEAD(, calendarinterval) cal_intervals;
 	SLIST_HEAD(, envitem) global_env;
@@ -523,7 +523,7 @@
 		jobmgr_shutdown(jmi);
 	}
 
-	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		if (!job_active(ji)) {
 			job_remove(ji);
 		} else if (!ji->hopefully_exits_last) {
@@ -551,10 +551,10 @@
 	}
 
 	/* We should have one job left and it should be the anonymous job */
-	ji = SLIST_FIRST(&jm->jobs);
-	jobmgr_assumes(jm, ji && ji == jm->anonj && (SLIST_NEXT(ji, sle) == NULL));
+	ji = TAILQ_FIRST(&jm->jobs);
+	jobmgr_assumes(jm, ji && ji == jm->anonj && (TAILQ_NEXT(ji, sle) == NULL));
 
-	while ((ji = SLIST_FIRST(&jm->jobs))) {
+	while ((ji = TAILQ_FIRST(&jm->jobs))) {
 		job_remove(ji);
 	}
 
@@ -682,7 +682,7 @@
 	kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_DELETE, 0, 0, NULL);
 
 	if (job_assumes(j, j->mgr)) {
-		SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
+		TAILQ_REMOVE(&j->mgr->jobs, j, sle);
 		jobmgr_tickle(j->mgr);
 	}
 
@@ -972,7 +972,7 @@
 		j->argv[i] = NULL;
 	}
 
-	SLIST_INSERT_HEAD(&jm->jobs, j, sle);
+	TAILQ_INSERT_TAIL(&jm->jobs, j, sle);
 
 	job_log(j, LOG_DEBUG, "Conceived");
 
@@ -1493,7 +1493,7 @@
 		}
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		if (strcmp(ji->label, label) == 0) {
 			return ji;
 		}
@@ -1514,15 +1514,17 @@
 
 		runtime_get_caller_creds(&ldc);
 
-		SLIST_FOREACH(ji, &jm->jobs, sle) {
+		TAILQ_FOREACH(ji, &jm->jobs, sle) {
 			if (ji->p == ldc.pid) {
 				/* This is just a MRU perfomance hack */
-				SLIST_REMOVE(&jm->jobs, ji, job_s, sle);
-				SLIST_INSERT_HEAD(&jm->jobs, ji, sle);
+				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;
 	}
 
@@ -1534,7 +1536,7 @@
 		}
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->j_port == p) {
 			return ji;
 		}
@@ -1566,7 +1568,7 @@
 		}
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (ms->port == p) {
 				return ji;
@@ -1592,7 +1594,7 @@
 		job_export_all2(jmi, where);
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		launch_data_t tmp;
 
 		if (jobmgr_assumes(jm, (tmp = job_export2(ji, false)) != NULL)) {
@@ -1636,6 +1638,10 @@
 		return;
 	}
 
+	/* 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) {
@@ -1698,7 +1704,7 @@
 		jobmgr_dispatch_all(jmi);
 	}
 
-	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		job_dispatch(ji, false);
 	}
 }
@@ -1889,6 +1895,10 @@
 		job_start_child(j);
 		break;
 	default:
+		/* 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);
 		}
@@ -1993,7 +2003,7 @@
 		jobmgr_setup_env_from_other_jobs(jm->parentmgr);
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ei, &ji->global_env, sle) {
 			setenv(ei->key, ei->value, 1);
 		}
@@ -2815,7 +2825,7 @@
 		unsigned int cnt = 0;
 		job_t ji;
 
-		SLIST_FOREACH(ji, &j->mgr->jobs, sle) {
+		TAILQ_FOREACH(ji, &j->mgr->jobs, sle) {
 			if (ji->p) {
 				cnt++;
 			}
@@ -3186,13 +3196,13 @@
 		return jm;
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->p && !ji->hopefully_exits_last) {
 			return jm;
 		}
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		job_stop(ji);
 	}
 
@@ -3215,7 +3225,7 @@
 		return false;
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->p) {
 			return false;
 		}
@@ -3306,6 +3316,8 @@
 		return NULL;
 	}
 
+	TAILQ_INIT(&jmr->jobs);
+
 	jmr->req_port = requestorport;
 
 	if ((jmr->parentmgr = jm)) {
@@ -3378,7 +3390,7 @@
 		jobmgr_delete_anything_with_port(jmi, port);
 	}
 
-	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		SLIST_FOREACH_SAFE(ms, &ji->machservices, sle, next_ms) {
 			if (ms->port == port) {
 				machservice_delete(ms);
@@ -3393,7 +3405,7 @@
 	struct machservice *ms;
 	job_t ji;
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (strcmp(name, ms->name) == 0) {
 				return ms;
@@ -3551,7 +3563,7 @@
 	}
 
 	/* We don't need the _SAFE version because we return after the job_dispatch() */
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (ms->port != p) {
 				continue;
@@ -3704,7 +3716,7 @@
 		jobmgr_dispatch_all_semaphores(jmi);
 	}
 
-	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
+	TAILQ_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		if (!SLIST_EMPTY(&ji->semaphores)) {
 			job_dispatch(ji, false);
 		}
@@ -4027,7 +4039,7 @@
 
 	*up_cont = MACH_PORT_NULL;
 
-	SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
+	TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {
 		if (ji->mach_uid != which_user) {
 			continue;
 		}
@@ -4248,7 +4260,7 @@
 
 	jm = j->mgr;
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			cnt++;
 		}
@@ -4268,7 +4280,7 @@
 		goto out_bad;
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
 			service_actives[cnt2] = machservice_status(ms);
@@ -4312,8 +4324,8 @@
 	}
 
 	if (job_assumes(j, jmi != NULL)) {
-		SLIST_REMOVE(&j->mgr->jobs, j, job_s, sle);
-		SLIST_INSERT_HEAD(&jmi->jobs, j, sle);
+		TAILQ_REMOVE(&j->mgr->jobs, j, sle);
+		TAILQ_INSERT_TAIL(&jmi->jobs, j, sle);
 		j->mgr = jmi;
 	}
 }
@@ -4651,7 +4663,7 @@
 
 	launchd_assert((root_jobmgr = jobmgr_new(NULL, mach_task_self(), checkin_port)) != NULL);
 
-	SLIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
+	TAILQ_FOREACH(ji, &root_jobmgr->jobs, sle) {
 		if (ji->anonymous) {
 			anon_job = ji;
 			break;

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


More information about the launchd-changes mailing list