parlib: add a helper for "notify debugging"
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 3 Mar 2020 19:36:41 +0000 (14:36 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 1 Apr 2020 22:27:54 +0000 (18:27 -0400)
Notification events carry payloads, unlike signals which are just a
bit per interrupt.  During debugging, I'll often hook up a handler to
the debug event EV_FREE_APPLE_PIE (9), and poke it from the shell with:

$ notify PID 9 arg1 arg2

This commit adds a helper for hooking an event handler to event 9.  Note
you need a ev_mbox type that can handle a payload (e.g. a UCQ, but not a
bitmap) if you want to receive the actual arguments.

You can, of course, hook in to any event you'd like.  '9' is typically
free.  You can also do similar things with signals, but once you want to
do more than one thing with a command (like print different debug info,
or set different flags), you'll want the full capabilities of a
notification event.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/include/parlib/parlib.h
user/parlib/parlib.c

index 4b985a1..d7c0727 100644 (file)
@@ -75,6 +75,11 @@ pid_t create_child_with_stdfds(const char *exe, int argc, char *const argv[],
                                char *const envp[]);
 int provision_core_set(pid_t pid, const struct core_set *cores);
 
+/* Debugging */
+void set_notify_9(void (*handler)(struct event_msg *ev_msg,
+                                 unsigned int ev_type, void *data),
+                 void *data);
+
 /* Once */
 typedef struct {
        bool ran_once;
index 4f06efe..33bead9 100644 (file)
@@ -5,6 +5,7 @@
 #include <parlib/parlib.h>
 #include <parlib/core_set.h>
 #include <parlib/ros_debug.h>
+#include <parlib/event.h>
 #include <stdlib.h>
 
 /* Control variables */
@@ -109,3 +110,40 @@ int provision_core_set(pid_t pid, const struct core_set *cores)
        }
        return 0;
 }
+
+/* This sets up 'handler' to be run when the process receives EV_FREE_APPLE_PIE
+ * (9).  You can send this event with the notify utility:
+ *
+ *     notify PID 9 [Arg1 Arg2 0xArg3 Arg4]
+ *
+ * A simple debug handler can switch on an arg:
+
+       static void notify_ipi(struct event_msg *ev_msg, unsigned int ev_type,
+                              void *data)
+       {
+               switch (ev_msg->ev_arg1) {
+               case 1:
+                       // do something
+                       break;
+               case 2:
+                       // do something else
+                       break;
+               default:
+                       printf("Unknown arg %d\n", ev_msg->ev_arg1);
+                       break;
+               }
+       }
+
+ */
+void set_notify_9(void (*handler)(struct event_msg *ev_msg,
+                                 unsigned int ev_type, void *data),
+                 void *data)
+{
+       struct event_queue *evq;
+
+       register_ev_handler(EV_FREE_APPLE_PIE, handler, data);
+       evq = get_eventq(EV_MBOX_UCQ);
+       evq->ev_flags = EVENT_IPI | EVENT_INDIR | EVENT_SPAM_INDIR |
+                       EVENT_WAKEUP;
+       register_kevent_q(evq, EV_FREE_APPLE_PIE);
+}