<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[23062] trunk/launchd/src</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/launchd/changeset/23062">23062</a></dd>
<dt>Author</dt> <dd>zarzycki@apple.com</dd>
<dt>Date</dt> <dd>2007-02-14 11:41:31 -0800 (Wed, 14 Feb 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre>Mega kevent debugging.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunklaunchdsrclaunchd_core_logicc">trunk/launchd/src/launchd_core_logic.c</a></li>
<li><a href="#trunklaunchdsrclaunchd_runtimec">trunk/launchd/src/launchd_runtime.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunklaunchdsrclaunchd_core_logicc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_core_logic.c (23061 => 23062)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1837,8 +1837,7 @@
</span><span class="cx"> {
</span><span class="cx">         job_t j = obj;
</span><span class="cx">
</span><del>-        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);
</del><ins>+        job_log(j, LOG_DEBUG, "Dispatching kevent callback.");
</ins><span class="cx">
</span><span class="cx">         switch (kev->filter) {
</span><span class="cx">         case EVFILT_PROC:
</span></span></pre></div>
<a id="trunklaunchdsrclaunchd_runtimec"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_runtime.c (23061 => 23062)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -143,6 +143,197 @@
</span><span class="cx">         return NULL;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+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);
+}
+
</ins><span class="cx"> kern_return_t
</span><span class="cx"> x_handle_mport(mach_port_t junk __attribute__((unused)))
</span><span class="cx"> {
</span><span class="lines">@@ -166,7 +357,10 @@
</span><span class="cx">                 if (status.mps_msgcount) {
</span><span class="cx">                         EV_SET(&kev, members[i], EVFILT_MACHPORT, 0, 0, 0, jobmgr_find_by_service_port(root_jobmgr, members[i]));
</span><span class="cx">                         if (launchd_assumes(kev.udata != NULL)) {
</span><ins>+                                log_kevent_struct(LOG_DEBUG, &kev);
</ins><span class="cx">                                 (*((kq_callback *)kev.udata))(kev.udata, &kev);
</span><ins>+                        } else {
+                                log_kevent_struct(LOG_ERR, &kev);
</ins><span class="cx">                         }
</span><span class="cx">                         /* the callback may have tainted our ability to continue this for loop */
</span><span class="cx">                         break;
</span><span class="lines">@@ -207,10 +401,10 @@
</span><span class="cx">
</span><span class="cx">         if (kevr == 1) {
</span><span class="cx">                 if (launchd_assumes(malloc_size(kev.udata) || dladdr(kev.udata, &dli))) {
</span><ins>+                        log_kevent_struct(LOG_DEBUG, &kev);
</ins><span class="cx">                         (*((kq_callback *)kev.udata))(kev.udata, &kev);
</span><span class="cx">                 } else {
</span><del>-                        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);
</del><ins>+                        log_kevent_struct(LOG_ERR, &kev);
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span></span></pre>
</div>
</div>
</body>
</html>