PERFORCE change 82971 for review
soc-tyler
soc-tyler at FreeBSD.org
Thu Sep 1 19:09:55 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=82971
Change 82971 by soc-tyler at soc-tyler_launchd on 2005/09/01 19:09:08
Hoorah, at least it's correctly managing jobs now.
note: remove "stop" command from launchctl, as it *sucks*
Add launch_fork() command to replace functionality of
fork_with_bootstrap_port() from launchd/MacOS
Affected files ...
.. //depot/projects/soc2005/launchd/includes/launch_priv.h#3 edit
.. //depot/projects/soc2005/launchd/launchctl/launchctl.c#16 edit
.. //depot/projects/soc2005/launchd/launchd.c#18 edit
.. //depot/projects/soc2005/launchd/liblaunch.c#15 edit
Differences ...
==== //depot/projects/soc2005/launchd/includes/launch_priv.h#3 (text+ko) ====
@@ -23,6 +23,8 @@
#ifndef _LAUNCH_PRIV_H_
#define _LAUNCH_PRIV_H_
+#include <sys/types.h>
+
#define LAUNCH_KEY_GETUSERENVIRONMENT "GetUserEnvironment"
#define LAUNCH_KEY_SETUSERENVIRONMENT "SetUserEnvironment"
#define LAUNCH_KEY_UNSETUSERENVIRONMENT "UnsetUserEnvironment"
@@ -48,6 +50,11 @@
typedef struct _launch *launch_t;
+/* launch_fork() is essentially the replacement for
+ * fork_with_bootstrap_port() on non-OS X machines.
+ * (defined in launchd.c)
+ */
+pid_t launch_fork(void);
launch_t launchd_fdopen(int);
int launchd_getfd(launch_t);
void launchd_close(launch_t);
==== //depot/projects/soc2005/launchd/launchctl/launchctl.c#16 (text+ko) ====
@@ -131,9 +131,9 @@
{ "unload", load_and_unload_cmd, "Unload configuration files and/or directories" },
// { "reload", reload_cmd, "Reload configuration files and/or directories" },
{ "start", start_stop_remove_cmd, "Start specified job" },
- { "stop", start_stop_remove_cmd, "Stop specified job" },
+// { "stop", start_stop_remove_cmd, "Stop specified job" },
{ "submit", submit_cmd, "Submit a job from the command line" },
- { "remove", start_stop_remove_cmd, "Remove specified job" },
+ { "remove", start_stop_remove_cmd, "Remove/stop specified job" },
{ "list", list_cmd, "List jobs and information about jobs" },
{ "setenv", setenv_cmd, "Set an environmental variable in launchd" },
{ "unsetenv", unsetenv_cmd, "Unset an environmental variable in launchd" },
==== //depot/projects/soc2005/launchd/launchd.c#18 (text+ko) ====
@@ -90,7 +90,6 @@
#define LAUNCHD_REWARD_JOB_RUN_TIME 60
#define LAUNCHD_FAILED_EXITS_THRESHOLD 10
#define PID1LAUNCHD_CONF "/etc/launchd.conf"
-/* XXX: will we really need a local launchd.conf? */
#define LAUNCHD_CONF ".launchd.conf"
#ifdef _BUILD_DARWIN_
@@ -344,37 +343,41 @@
static struct timespec timeout = { 30, 0 };
struct timespec *timeoutp = NULL;
- if (getpid() == 1) {
+ /* if (getpid() == 1) {
if (readcfg_pid == 0)
init_pre_kevent();
} else {
+ /* in theory, this will make sure we don't exit if we
+ * have (a) any more jobs nd (b) open socket connections
+ * to say, something like, launchctl? ;)
+ *
if (TAILQ_EMPTY(&jobs) && TAILQ_EMPTY(&connections)) {
- /* liblaunch will restart launchd if we're needed again */
+ /* liblaunch will restart launchd if we're needed again *
timeoutp = &timeout;
} else if (shutdown_in_progress && total_children == 0) {
exit(EXIT_SUCCESS);
}
}
-
+ */
switch (kevent(mainkq, NULL, 0, &kev, 1, timeoutp)) {
- case -1:
- syslog(LOG_DEBUG, "kevent(): %m");
- break;
- case 1:
- (*((kq_callback *)kev.udata))(kev.udata, &kev);
- break;
- case 0:
- /* we exit here if and once we're done processing all jobs
- * assigned to us
- */
- if (timeoutp)
- exit(EXIT_SUCCESS);
- else
- syslog(LOG_DEBUG, "kevent(): spurious return with infinite timeout");
- break;
- default:
- syslog(LOG_DEBUG, "unexpected: kevent() returned something != 0, -1 or 1");
- break;
+ case -1:
+ syslog(LOG_DEBUG, "kevent(): %m");
+ break;
+ case 1:
+ (*((kq_callback *)kev.udata))(kev.udata, &kev);
+ break;
+ case 0:
+ /* we exit here if and once we're done processing all jobs
+ * assigned to us
+ */
+ if (timeoutp)
+ exit(EXIT_SUCCESS);
+ else
+ syslog(LOG_DEBUG, "kevent(): spurious return with infinite timeout");
+ break;
+ default:
+ syslog(LOG_DEBUG, "unexpected: kevent() returned something != 0, -1 or 1");
+ break;
}
}
}
@@ -1008,10 +1011,14 @@
if (NULL == resp)
resp = launch_data_new_errno(ESRCH);
} else if (!strcmp(cmd, LAUNCH_KEY_REMOVEJOB)) {
+ fprintf(stderr, "**debug** j == %p\n", j);
+ fprintf(stderr, "**debug** jobs.tqh_first == %p\n", jobs.tqh_first);
+ fprintf(stderr, "**debug** jobs.tqh_last == %p\n", jobs.tqh_last);
TAILQ_FOREACH(j, &jobs, tqe) {
if (!strcmp(j->label, launch_data_get_string(data))) {
job_remove(j);
resp = launch_data_new_errno(0);
+ break;
}
}
if (NULL == resp)
@@ -1661,7 +1668,7 @@
// This function can be found in the vendor source in bootstrap.c
switch (c = fork_with_bootstrap_port(launchd_bootstrap_port)) {
#else
- switch (c = fork()) {
+ switch (c = launch_fork()) {
#endif
case -1:
job_log_error(j, LOG_ERR, "fork() failed, will try again in one second");
@@ -2529,3 +2536,34 @@
syslog(LOG_DEBUG, "unexpected: kevent() returned something != 0, -1 or 1");
}
}
+
+/*
+ * launch_fork() effectively replaces the functionality of
+ * fork_with_bootstrap_port() on non-MacOS boxen
+ */
+pid_t launch_fork() {
+ static pthread_mutex_t forklock = PTHREAD_MUTEX_INITIALIZER;
+ pid_t r;
+ size_t i;
+
+ fprintf(stderr, "**debug** starting launch_fork()\n");
+
+ pthread_mutex_lock(&forklock);
+
+ sigprocmask(SIG_BLOCK, &blocked_signals, NULL);
+
+ r = fork();
+
+ if (r <= 0) {
+ for (i = 0; i <= NSIG; i++) {
+ if (sigismember(&blocked_signals, i))
+ signal(i, SIG_DFL);
+ }
+ }
+
+ sigprocmask(SIG_UNBLOCK, &blocked_signals, NULL);
+
+ pthread_mutex_unlock(&forklock);
+
+ return r;
+}
==== //depot/projects/soc2005/launchd/liblaunch.c#15 (text+ko) ====
@@ -965,3 +965,4 @@
return r;
}
+
More information about the p4-projects
mailing list