Add a helper to extract mbox messages
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 10 Aug 2015 20:28:37 +0000 (16:28 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
This hides the fact that we're using a UCQ from most of the code.
Later, we'll extract a message based on the type of mbox.

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

index ef61a4a..dc530cc 100644 (file)
@@ -15,7 +15,7 @@
 #include <assert.h>
 #include <errno.h>
 #include <parlib/parlib.h>
-#include <event.h>
+#include <parlib/event.h>
 #include <parlib/uthread.h>
 #include <parlib/spinlock.h>
 
@@ -148,10 +148,9 @@ struct event_queue *disable_kevent(unsigned int ev_type)
 unsigned int get_event_type(struct event_mbox *ev_mbox)
 {
        struct event_msg local_msg = {0};
-       /* UCQ returns 0 on success, so this will dequeue and return the type. */
-       if (!get_ucq_msg(&ev_mbox->ev_msgs, &local_msg)) {
+
+       if (extract_one_mbox_msg(ev_mbox, &local_msg))
                return local_msg.ev_type;
-       }
        if (BITMASK_IS_CLEAR(&ev_mbox->ev_bitmap, MAX_NR_EVENT))
                return EV_NONE; /* aka, 0 */
        for (int i = 0; i < MAX_NR_EVENT; i++) {
@@ -204,13 +203,21 @@ static void run_ev_handlers(unsigned int ev_type, struct event_msg *ev_msg)
        }
 }
 
+/* Attempts to extract a message from an mbox, copying it into ev_msg.
+ * Returns TRUE on success. */
+bool extract_one_mbox_msg(struct event_mbox *ev_mbox, struct event_msg *ev_msg)
+{
+       /* get_ucq returns 0 on success, -1 on empty */
+       return get_ucq_msg(&ev_mbox->ev_msgs, ev_msg) == 0;
+}
+
 /* Attempts to handle a message.  Returns 1 if we dequeued a msg, 0 o/w. */
 int handle_one_mbox_msg(struct event_mbox *ev_mbox)
 {
        struct event_msg local_msg;
        unsigned int ev_type;
-       /* get_ucq returns 0 on success, -1 on empty */
-       if (get_ucq_msg(&ev_mbox->ev_msgs, &local_msg) == -1)
+       /* extract returns TRUE on success, we return 1. */
+       if (!extract_one_mbox_msg(ev_mbox, &local_msg))
                return 0;
        ev_type = local_msg.ev_type;
        assert(ev_type < MAX_NR_EVENT);
index 8702c43..8478142 100644 (file)
@@ -46,6 +46,7 @@ void handle_ev_ev(struct event_msg *ev_msg, unsigned int ev_type, void *data);
 
 int handle_events(uint32_t vcoreid);
 void handle_event_q(struct event_queue *ev_q);
+bool extract_one_mbox_msg(struct event_mbox *ev_mbox, struct event_msg *ev_msg);
 int handle_one_mbox_msg(struct event_mbox *ev_mbox);
 int handle_mbox(struct event_mbox *ev_mbox);
 bool mbox_is_empty(struct event_mbox *ev_mbox);