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

source_changes at macosforge.org source_changes at macosforge.org
Thu Sep 13 10:40:43 PDT 2007


Revision: 23379
          http://trac.macosforge.org/projects/launchd/changeset/23379
Author:   zarzycki at apple.com
Date:     2007-09-13 10:40:43 -0700 (Thu, 13 Sep 2007)

Log Message:
-----------
Smarter idle exit logic.

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-09-13 17:16:54 UTC (rev 23378)
+++ trunk/launchd/src/launchd_core_logic.c	2007-09-13 17:40:43 UTC (rev 23379)
@@ -250,6 +250,7 @@
 static void semaphoreitem_callback(job_t j, struct kevent *kev);
 static void semaphoreitem_watch(job_t j, struct semaphoreitem *si);
 static void semaphoreitem_ignore(job_t j, struct semaphoreitem *si);
+static void semaphoreitem_runtime_mod_ref(struct semaphoreitem *si, bool add);
 
 #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))
@@ -2329,6 +2330,11 @@
 	if (td < j->min_run_time && !j->legacy_mach_job && !j->inetcompat) {
 		time_t respawn_delta = j->min_run_time - td;
 
+		/*
+		 * We technically should ref-count throttled jobs to prevent idle exit,
+		 * but we're not directly tracking the 'throttled' state at the moment.
+		 */
+
 		job_log(j, LOG_WARNING, "Throttling respawn: Will start in %ld seconds", respawn_delta);
 		job_assumes(j, kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_ADD|EV_ONESHOT, NOTE_SECONDS, respawn_delta, j) != -1);
 		job_ignore(j);
@@ -4572,14 +4578,43 @@
 
 	SLIST_INSERT_HEAD(&j->semaphores, si, sle);
 
-	runtime_add_ref();
+	semaphoreitem_runtime_mod_ref(si, true);
 
 	return true;
 }
 
 void
+semaphoreitem_runtime_mod_ref(struct semaphoreitem *si, bool add)
+{
+	/*
+	 * External events need to be tracked.
+	 * Internal events do NOT need to be tracked.
+	 */
+
+	switch (si->why) {
+	case SUCCESSFUL_EXIT:
+	case FAILED_EXIT:
+	case OTHER_JOB_ENABLED:
+	case OTHER_JOB_DISABLED:
+	case OTHER_JOB_ACTIVE:
+	case OTHER_JOB_INACTIVE:
+		return;
+	default:
+		break;
+	}
+
+	if (add) {
+		runtime_add_ref();
+	} else {
+		runtime_del_ref();
+	}
+}
+
+void
 semaphoreitem_delete(job_t j, struct semaphoreitem *si)
 {
+	semaphoreitem_runtime_mod_ref(si, false);
+
 	SLIST_REMOVE(&j->semaphores, si, semaphoreitem, sle);
 
 	if (si->fd != -1) {
@@ -4587,8 +4622,6 @@
 	}
 
 	free(si);
-
-	runtime_del_ref();
 }
 
 void

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


More information about the launchd-changes mailing list