Event helper for detecting empty mboxes
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 9 Dec 2011 23:27:08 +0000 (15:27 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 15 Dec 2011 22:48:42 +0000 (14:48 -0800)
user/parlib/event.c
user/parlib/include/event.h
user/parlib/include/ucq.h
user/parlib/ucq.c

index 40ff026..55c90b9 100644 (file)
@@ -166,7 +166,7 @@ handle_event_t ev_handlers[MAX_NR_EVENT] = {[EV_EVENT] handle_ev_ev, 0};
 
 /* Handles all the messages in the mbox, but not the single bits.  Returns the
  * number handled. */
-int handle_mbox_msgs(struct event_mbox *ev_mbox)
+static int handle_mbox_msgs(struct event_mbox *ev_mbox)
 {
        int retval = 0;
        struct event_msg local_msg;
@@ -218,6 +218,12 @@ int handle_mbox(struct event_mbox *ev_mbox)
        return retval;
 }
 
+/* Empty if the UCQ is empty and the bits don't need checked */
+bool mbox_is_empty(struct event_mbox *ev_mbox)
+{
+       return (ucq_is_empty(&ev_mbox->ev_msgs) && (!ev_mbox->ev_check_bits));
+}
+
 /* The EV_EVENT handler - extract the ev_q from the message. */
 void handle_ev_ev(struct event_msg *ev_msg, unsigned int ev_type)
 {
index b849b34..89be0ab 100644 (file)
@@ -35,6 +35,6 @@ void handle_ev_ev(struct event_msg *ev_msg, unsigned int ev_type);
 int handle_events(uint32_t vcoreid);
 void handle_event_q(struct event_queue *ev_q);
 int handle_mbox(struct event_mbox *ev_mbox);
-int handle_mbox_msgs(struct event_mbox *ev_mbox);
+bool mbox_is_empty(struct event_mbox *ev_mbox);
 
 #endif /* _EVENT_H */
index ce68d78..066c49a 100644 (file)
@@ -14,5 +14,6 @@ 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 ucq_is_empty(struct ucq *ucq);
 
 #endif /* _UCQ_H */
index 5e647e7..473a043 100644 (file)
@@ -152,3 +152,10 @@ claim_slot:
        atomic_inc(&((struct ucq_page*)PTE_ADDR(my_idx))->header.nr_cons);
        return 0;
 }
+
+bool ucq_is_empty(struct ucq *ucq)
+{
+       /* The ucq is empty if the consumer and producer are on the same 'next'
+        * slot. */
+       return (atomic_read(&ucq->cons_idx) == atomic_read(&ucq->prod_idx));
+}