Safety checks in send_event()
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 18 Nov 2013 23:31:02 +0000 (15:31 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 19:46:08 +0000 (11:46 -0800)
Catch future IRQ calls of send_event().  Also, send_event() might be
able to handle PROC_DYING, but just in case, we abort.  Once again,
we're using "the immutable state of DYING" here (no worry of races once
your DYING when you hold a ref).

kern/src/event.c

index 314c706..d7efd62 100644 (file)
@@ -342,7 +342,10 @@ void send_event(struct proc *p, struct event_queue *ev_q, struct event_msg *msg,
 {
        struct proc *old_proc;
        struct event_mbox *ev_mbox = 0;
+       assert(!in_irq_ctx(&per_cpu_info[core_id()]));
        assert(p);
+       if (p->state == PROC_DYING)
+               return;
        printd("[kernel] sending msg to proc %p, ev_q %p\n", p, ev_q);
        if (!ev_q) {
                warn("[kernel] Null ev_q - kernel code should check before sending!");