Fixes disable_kevent()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 20 Sep 2011 21:50:14 +0000 (14:50 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:07 +0000 (17:36 -0700)
Need to be more careful with deregistering for events (don't free the
ev_q if it is possible the kernel is still sending messages).

No one uses it yet (or ever), so it's not a big deal.

user/parlib/event.c
user/parlib/include/event.h

index 0ec6680..ccb1432 100644 (file)
@@ -116,14 +116,14 @@ void enable_kevent(unsigned int ev_type, uint32_t vcoreid, int ev_flags)
        register_kevent_q(ev_q, ev_type);
 }
 
        register_kevent_q(ev_q, ev_type);
 }
 
-/* Stop receiving the events (one could be on the way) */
-void disable_kevent(unsigned int ev_type)
+/* Stop receiving the events (one could be on the way).  Caller needs to be
+ * careful, since the kernel might be sending an event to the ev_q.  Depending
+ * on the ev_q, it may be hard to know when it is done (for instance, if all
+ * syscalls you ever registered with the ev_q are done, then it would be okay).
+ * o/w, don't free it. */
+struct event_queue *disable_kevent(unsigned int ev_type)
 {
 {
-       struct event_queue *ev_q = clear_kevent_q(ev_type);
-       if (ev_q)
-               put_event_q(ev_q);
-       else
-               printf("Tried to disable but no event_q loaded on ev_type %d", ev_type);
+       return clear_kevent_q(ev_type);
 }
 
 /********* Event Handling / Reception ***********/
 }
 
 /********* Event Handling / Reception ***********/
index e6249e6..ff5b40c 100644 (file)
@@ -22,7 +22,7 @@ void put_event_q(struct event_queue *ev_q);
 void register_kevent_q(struct event_queue *ev_q, unsigned int ev_type);
 struct event_queue *clear_kevent_q(unsigned int ev_type);
 void enable_kevent(unsigned int ev_type, uint32_t vcoreid, int ev_flags);
 void register_kevent_q(struct event_queue *ev_q, unsigned int ev_type);
 struct event_queue *clear_kevent_q(unsigned int ev_type);
 void enable_kevent(unsigned int ev_type, uint32_t vcoreid, int ev_flags);
-void disable_kevent(unsigned int ev_type);
+struct event_queue *disable_kevent(unsigned int ev_type);
 
 /********* Event Handling / Reception ***********/
 unsigned int get_event_type(struct event_mbox *ev_mbox);
 
 /********* Event Handling / Reception ***********/
 unsigned int get_event_type(struct event_mbox *ev_mbox);