Change get_ucq_msg()'s return value to a bool
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 18 Aug 2015 19:55:11 +0000 (15:55 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
We're not passing any info with the -1, and it makes
extract_one_mbox_msg() nasty.

This is part of a general cleanup of the mailbox interface.

tests/old/test_ucq.c
user/parlib/event.c
user/parlib/include/ucq.h
user/parlib/ucq.c

index 0bd1c5a..3770154 100644 (file)
@@ -25,13 +25,13 @@ int main(int argc, char** argv)
        /* try to get a simple message */
        struct event_msg msg;
        /* 1: Spin til we can get a message (0 on success breaks) */
-       while (get_ucq_msg(ucq, &msg))
+       while (!get_ucq_msg(ucq, &msg))
                cpu_relax();
        printf("[user] Got simple message type %d(7) with A2 %08p(0xdeadbeef)\n",
               msg.ev_type, msg.ev_arg2);
        /* 2: get a bunch */
        for (int i = 0; i < 5000; i++) {
-               while (get_ucq_msg(ucq, &msg))
+               while (!get_ucq_msg(ucq, &msg))
                        cpu_relax();
                assert(msg.ev_type == i);
        }
@@ -45,13 +45,13 @@ int main(int argc, char** argv)
               atomic_read(&ucq->nr_extra_pgs));
        /* this assumes 1000 is enough for a couple pages */
        for (int i = 0; i < 1000; i++) {
-               while (get_ucq_msg(ucq, &msg))
+               while (!get_ucq_msg(ucq, &msg))
                        cpu_relax();
                assert(msg.ev_type == i);
        }
        printf("[user] Done, extra pages: %d(0)\n", atomic_read(&ucq->nr_extra_pgs));
        int extra = 0;
-       while (!get_ucq_msg(ucq, &msg)) {
+       while (get_ucq_msg(ucq, &msg)) {
                printf("[user] got %d extra messages in the ucq, type %d\n", ++extra,
                       msg.ev_type);
        }
index e269b4e..074bdd9 100644 (file)
@@ -245,8 +245,7 @@ bool extract_one_mbox_msg(struct event_mbox *ev_mbox, struct event_msg *ev_msg)
 {
        switch (ev_mbox->type) {
                case (EV_MBOX_UCQ):
-                       /* get_ucq returns 0 on success, -1 on empty */
-                       return get_ucq_msg(&ev_mbox->ucq, ev_msg) == 0;
+                       return get_ucq_msg(&ev_mbox->ucq, ev_msg);
                case (EV_MBOX_BITMAP):
                        return get_evbitmap_msg(&ev_mbox->evbm, ev_msg);
                default:
index 1387cec..d04aeac 100644 (file)
@@ -15,7 +15,7 @@ __BEGIN_DECLS
 void ucq_init_raw(struct ucq *ucq, uintptr_t pg1, uintptr_t pg2);
 void ucq_init(struct ucq *ucq);
 void ucq_free_pgs(struct ucq *ucq);
-int get_ucq_msg(struct ucq *ucq, struct event_msg *msg);
+bool get_ucq_msg(struct ucq *ucq, struct event_msg *msg);
 bool ucq_is_empty(struct ucq *ucq);
 
 __END_DECLS
index 8f99a12..6319e45 100644 (file)
@@ -59,9 +59,10 @@ void ucq_free_pgs(struct ucq *ucq)
        munmap((void*)pg2, PGSIZE);
 }
 
-/* Consumer side, returns 0 on success and fills *msg with the ev_msg.  If the
- * ucq is empty, it will return -1. */
-int get_ucq_msg(struct ucq *ucq, struct event_msg *msg)
+/* Consumer side, returns TRUE on success and fills *msg with the ev_msg.  If
+ * the ucq appears empty, it will return FALSE.  Messages may have arrived after
+ * we started getting that we do not receive. */
+bool get_ucq_msg(struct ucq *ucq, struct event_msg *msg)
 {
        uintptr_t my_idx;
        struct ucq_page *old_page, *other_page;
@@ -75,7 +76,7 @@ loop_top:
                /* The ucq is empty if the consumer and producer are on the same 'next'
                 * slot. */
                if (my_idx == atomic_read(&ucq->prod_idx))
-                       return -1;
+                       return FALSE;
                /* Is the slot we want good?  If not, we're going to need to try and
                 * move on to the next page.  If it is, we bypass all of this and try to
                 * CAS on us getting my_idx. */
@@ -91,7 +92,7 @@ loop_top:
                        spin_pdr_unlock(ucq_lock);
                        /* Make sure this new slot has a producer (ucq isn't empty) */
                        if (my_idx == atomic_read(&ucq->prod_idx))
-                               return -1;
+                               return FALSE;
                        goto claim_slot;
                }
                /* At this point, the slot is bad, and all other possible consumers are
@@ -153,7 +154,7 @@ claim_slot:
        wmb();  /* post the ready write before incrementing */
        /* Increment nr_cons, showing we're done */
        atomic_inc(&((struct ucq_page*)PTE_ADDR(my_idx))->header.nr_cons);
-       return 0;
+       return TRUE;
 }
 
 bool ucq_is_empty(struct ucq *ucq)