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

source_changes at macosforge.org source_changes at macosforge.org
Sun Mar 25 12:52:03 PDT 2007


Revision: 23182
          http://trac.macosforge.org/projects/launchd/changeset/23182
Author:   zarzycki at apple.com
Date:     2007-03-25 12:52:03 -0700 (Sun, 25 Mar 2007)

Log Message:
-----------
Add basic support for a job to be kept alive based on whether another job is running or not.

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

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-03-23 20:33:04 UTC (rev 23181)
+++ trunk/launchd/src/launchd_core_logic.c	2007-03-25 19:52:03 UTC (rev 23182)
@@ -184,6 +184,8 @@
 	FAILED_EXIT,
 	PATH_EXISTS,
 	PATH_MISSING,
+	OTHER_JOB_ACTIVE,
+	OTHER_JOB_INACTIVE,
 	PATH_CHANGES,
 	DIR_NOT_EMPTY,
 	// FILESYSTEMTYPE_IS_MOUNTED,	/* for nfsiod, but maybe others */
@@ -200,6 +202,7 @@
 static void semaphoreitem_delete(job_t j, struct semaphoreitem *si);
 static void semaphoreitem_setup(launch_data_t obj, const char *key, void *context);
 static void semaphoreitem_setup_paths(launch_data_t obj, const char *key, void *context);
+static void semaphoreitem_setup_otherjobs(launch_data_t obj, const char *key, void *context);
 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);
@@ -3111,6 +3114,7 @@
 	SLIST_FOREACH(si, &j->semaphores, sle) {
 		bool wanted_state = false;
 		int qdir_file_cnt;
+		job_t other_j;
 
 		switch (si->why) {
 		case NETWORK_UP:
@@ -3129,6 +3133,16 @@
 				return true;
 			}
 			break;
+		case OTHER_JOB_ACTIVE:
+			wanted_state = true;
+		case OTHER_JOB_INACTIVE:
+			if ((other_j = job_find(si->what))) {
+				if ((bool)other_j->p == wanted_state) {
+					job_log(j, LOG_DEBUG, "KeepAlive: The following job is %s: %s", wanted_state ? "active" : "inactive", si->what);
+					return true;
+				}
+			}
+			break;
 		case PATH_EXISTS:
 			wanted_state = true;
 		case PATH_MISSING:
@@ -4005,6 +4019,17 @@
 }
 
 void
+semaphoreitem_setup_otherjobs(launch_data_t obj, const char *key, void *context)
+{
+	job_t j = context;
+	semaphore_reason_t why;
+
+	why = launch_data_get_bool(obj) ? OTHER_JOB_ACTIVE : OTHER_JOB_INACTIVE;
+
+	semaphoreitem_new(j, why, key);
+}
+
+void
 semaphoreitem_setup_paths(launch_data_t obj, const char *key, void *context)
 {
 	job_t j = context;
@@ -4031,6 +4056,9 @@
 	} else if (strcasecmp(key, LAUNCH_JOBKEY_KEEPALIVE_PATHSTATE) == 0 &&
 			launch_data_get_type(obj) == LAUNCH_DATA_DICTIONARY) {
 		launch_data_dict_iterate(obj, semaphoreitem_setup_paths, j);
+	} else if (strcasecmp(key, LAUNCH_JOBKEY_KEEPALIVE_OTHERJOBSTATE) == 0 &&
+			launch_data_get_type(obj) == LAUNCH_DATA_DICTIONARY) {
+		launch_data_dict_iterate(obj, semaphoreitem_setup_otherjobs, j);
 	}
 }
 

Modified: trunk/launchd/src/liblaunch_public.h
===================================================================
--- trunk/launchd/src/liblaunch_public.h	2007-03-23 20:33:04 UTC (rev 23181)
+++ trunk/launchd/src/liblaunch_public.h	2007-03-25 19:52:03 UTC (rev 23182)
@@ -106,6 +106,7 @@
 #define LAUNCH_JOBKEY_KEEPALIVE_SUCCESSFULEXIT	"SuccessfulExit"
 #define LAUNCH_JOBKEY_KEEPALIVE_NETWORKSTATE	"NetworkState"
 #define LAUNCH_JOBKEY_KEEPALIVE_PATHSTATE	"PathState"
+#define LAUNCH_JOBKEY_KEEPALIVE_OTHERJOBSTATE	"OtherJobState"
 
 #define LAUNCH_JOBKEY_CAL_MINUTE		"Minute"
 #define LAUNCH_JOBKEY_CAL_HOUR			"Hour"

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


More information about the launchd-changes mailing list