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

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 14 11:41:32 PST 2007


Revision: 23062
          http://trac.macosforge.org/projects/launchd/changeset/23062
Author:   zarzycki at apple.com
Date:     2007-02-14 11:41:31 -0800 (Wed, 14 Feb 2007)

Log Message:
-----------
Mega kevent debugging.

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

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-02-14 17:09:18 UTC (rev 23061)
+++ trunk/launchd/src/launchd_core_logic.c	2007-02-14 19:41:31 UTC (rev 23062)
@@ -1837,8 +1837,7 @@
 {
 	job_t j = obj;
 
-	job_log(j, LOG_DEBUG, "kev.ident = 0x%lx kev.filter = 0x%x kev->flags = 0x%x kev.fflags = 0x%x kev.data = 0x%lx kev.udata = %p",
-			kev->ident, kev->filter, kev->flags, kev->fflags, kev->data, kev->udata);
+	job_log(j, LOG_DEBUG, "Dispatching kevent callback.");
 
 	switch (kev->filter) {
 	case EVFILT_PROC:

Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c	2007-02-14 17:09:18 UTC (rev 23061)
+++ trunk/launchd/src/launchd_runtime.c	2007-02-14 19:41:31 UTC (rev 23062)
@@ -143,6 +143,197 @@
 	return NULL;
 }
 
+static void
+log_kevent_struct(int level, struct kevent *kev)
+{
+	const char *filter_str;
+	char ident_buf[100];
+	char filter_buf[100];
+	char fflags_buf[1000];
+	char flags_buf[1000] = "0x0";
+	char *flags_off = NULL;
+	char *fflags_off = NULL;
+	unsigned short flags = kev->flags;
+	unsigned int fflags = kev->fflags;
+
+	if (flags) while (flags) {
+		if (flags_off) {
+			*flags_off = '|';
+			flags_off++;
+			*flags_off = '\0';
+		} else {
+			flags_off = flags_buf;
+		}
+		if (flags & EV_ADD) {
+			flags_off += sprintf(flags_off, "EV_ADD");
+			flags &= ~EV_ADD;
+		} else if (flags & EV_DELETE) {
+			flags_off += sprintf(flags_off, "EV_DELETE");
+			flags &= ~EV_DELETE;
+		} else if (flags & EV_ENABLE) {
+			flags_off += sprintf(flags_off, "EV_ENABLE");
+			flags &= ~EV_ENABLE;
+		} else if (flags & EV_DISABLE) {
+			flags_off += sprintf(flags_off, "EV_DISABLE");
+			flags &= ~EV_DISABLE;
+		} else if (flags & EV_ONESHOT) {
+			flags_off += sprintf(flags_off, "EV_ONESHOT");
+			flags &= ~EV_ONESHOT;
+		} else if (flags & EV_CLEAR) {
+			flags_off += sprintf(flags_off, "EV_CLEAR");
+			flags &= ~EV_CLEAR;
+		} else if (flags & EV_EOF) {
+			flags_off += sprintf(flags_off, "EV_EOF");
+			flags &= ~EV_EOF;
+		} else if (flags & EV_ERROR) {
+			flags_off += sprintf(flags_off, "EV_ERROR");
+			flags &= ~EV_ERROR;
+		} else {
+			flags_off += sprintf(flags_off, "0x%x", flags);
+			flags = 0;
+		}
+	}
+
+	snprintf(ident_buf, sizeof(ident_buf), "%ld", kev->ident);
+	snprintf(fflags_buf, sizeof(fflags_buf), "0x%x", fflags);
+
+	switch (kev->filter) {
+	case EVFILT_READ:
+		filter_str = "EVFILT_READ";
+		break;
+	case EVFILT_WRITE:
+		filter_str = "EVFILT_WRITE";
+		break;
+	case EVFILT_AIO:
+		filter_str = "EVFILT_AIO";
+		break;
+	case EVFILT_VNODE:
+		filter_str = "EVFILT_VNODE";
+		if (fflags) while (fflags) {
+			if (fflags_off) {
+				*fflags_off = '|';
+				fflags_off++;
+				*fflags_off = '\0';
+			} else {
+				fflags_off = fflags_buf;
+			}
+
+#define FFLAGIF(ff) if (fflags & ff) { fflags_off += sprintf(fflags_off, #ff); fflags &= ~ff; }
+
+			FFLAGIF(NOTE_DELETE)
+			else FFLAGIF(NOTE_WRITE)
+			else FFLAGIF(NOTE_EXTEND)
+			else FFLAGIF(NOTE_ATTRIB)
+			else FFLAGIF(NOTE_LINK)
+			else FFLAGIF(NOTE_RENAME)
+			else FFLAGIF(NOTE_REVOKE)
+			else {
+				fflags_off += sprintf(fflags_off, "0x%x", fflags);
+				fflags = 0;
+			}
+		}
+		break;
+	case EVFILT_PROC:
+		filter_str = "EVFILT_PROC";
+		if (fflags) while (fflags) {
+			if (fflags_off) {
+				*fflags_off = '|';
+				fflags_off++;
+				*fflags_off = '\0';
+			} else {
+				fflags_off = fflags_buf;
+			}
+
+			FFLAGIF(NOTE_EXIT)
+			else FFLAGIF(NOTE_FORK)
+			else FFLAGIF(NOTE_EXEC)
+			else FFLAGIF(NOTE_TRACK)
+			else FFLAGIF(NOTE_TRACKERR)
+			else FFLAGIF(NOTE_CHILD)
+			else {
+				fflags_off += sprintf(fflags_off, "0x%x", fflags);
+				fflags = 0;
+			}
+		}
+		break;
+	case EVFILT_SIGNAL:
+		filter_str = "EVFILT_SIGNAL";
+		switch (kev->ident) {
+#define SIG2CASE(sg)	case sg: sprintf(ident_buf, #sg); break
+		SIG2CASE(SIGHUP);
+		SIG2CASE(SIGINT);
+		SIG2CASE(SIGQUIT);
+		SIG2CASE(SIGILL);
+		SIG2CASE(SIGTRAP);
+		SIG2CASE(SIGABRT);
+		SIG2CASE(SIGFPE);
+		SIG2CASE(SIGKILL);
+		SIG2CASE(SIGBUS);
+		SIG2CASE(SIGSEGV);
+		SIG2CASE(SIGSYS);
+		SIG2CASE(SIGPIPE);
+		SIG2CASE(SIGALRM);
+		SIG2CASE(SIGTERM);
+		SIG2CASE(SIGURG);
+		SIG2CASE(SIGSTOP);
+		SIG2CASE(SIGTSTP);
+		SIG2CASE(SIGCONT);
+		SIG2CASE(SIGCHLD);
+		SIG2CASE(SIGTTIN);
+		SIG2CASE(SIGTTOU);
+		SIG2CASE(SIGIO);
+		SIG2CASE(SIGXCPU);
+		SIG2CASE(SIGXFSZ);
+		SIG2CASE(SIGVTALRM);
+		SIG2CASE(SIGPROF);
+		SIG2CASE(SIGWINCH);
+		SIG2CASE(SIGINFO);
+		SIG2CASE(SIGUSR1);
+		SIG2CASE(SIGUSR2);
+		default:
+			sprintf(ident_buf, "%ld", kev->ident);
+			break;
+		}
+		break;
+	case EVFILT_TIMER:
+		filter_str = "EVFILT_TIMER";
+		snprintf(ident_buf, sizeof(ident_buf), "0x%lx", kev->ident);
+		if (fflags) while (fflags) {
+			if (fflags_off) {
+				*fflags_off = '|';
+				fflags_off++;
+				*fflags_off = '\0';
+			} else {
+				fflags_off = fflags_buf;
+			}
+
+			FFLAGIF(NOTE_SECONDS)
+			else FFLAGIF(NOTE_USECONDS)
+			else FFLAGIF(NOTE_NSECONDS)
+			else FFLAGIF(NOTE_ABSOLUTE)
+			else {
+				fflags_off += sprintf(fflags_off, "0x%x", fflags);
+				fflags = 0;
+			}
+		}
+		break;
+	case EVFILT_MACHPORT:
+		filter_str = "EVFILT_MACHPORT";
+		snprintf(ident_buf, sizeof(ident_buf), "0x%lx", kev->ident);
+		break;
+	case EVFILT_FS:
+		filter_str = "EVFILT_FS";
+		break;
+	default:
+		snprintf(filter_buf, sizeof(filter_buf), "%d", kev->filter);
+		filter_str = filter_buf;
+		break;
+	}
+
+	syslog(level, "KEVENT: ident = %s filter = %s flags = %s fflags = %s data = 0x%x udata = %p",
+			ident_buf, filter_str, flags_buf, fflags_buf, kev->data, kev->udata);
+}
+
 kern_return_t
 x_handle_mport(mach_port_t junk __attribute__((unused)))
 {
@@ -166,7 +357,10 @@
 		if (status.mps_msgcount) {
 			EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, jobmgr_find_by_service_port(root_jobmgr, members[i]));
 			if (launchd_assumes(kev.udata != NULL)) {
+				log_kevent_struct(LOG_DEBUG, &kev);
 				(*((kq_callback *)kev.udata))(kev.udata, &kev);
+			} else {
+				log_kevent_struct(LOG_ERR, &kev);
 			}
 			/* the callback may have tainted our ability to continue this for loop */
 			break;
@@ -207,10 +401,10 @@
 
 	if (kevr == 1) {
 		if (launchd_assumes(malloc_size(kev.udata) || dladdr(kev.udata, &dli))) {
+			log_kevent_struct(LOG_DEBUG, &kev);
 			(*((kq_callback *)kev.udata))(kev.udata, &kev);
 		} else {
-			syslog(LOG_ERR, "kev.ident == 0x%x kev.filter == 0x%x kev.fflags = 0x%x kev.udata = 0x%x",
-					kev.ident, kev.filter, kev.fflags, kev.udata);
+			log_kevent_struct(LOG_ERR, &kev);
 		}
 	}
 

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


More information about the launchd-changes mailing list