Make glibc's printf with a vcore-ctx aware (XCC)
[akaros.git] / user / parlib / ucq.c
index 8f99a12..8d0551f 100644 (file)
 #include <parlib/ucq.h>
 #include <parlib/spinlock.h>
 #include <sys/mman.h>
-#include <assert.h>
+#include <parlib/assert.h>
 #include <stdio.h>
-#include <parlib/rassert.h> /* for the static_assert() */
+#include <stdlib.h>
 #include <parlib/vcore.h>
+#include <parlib/ros_debug.h> /* for printd() */
 
 /* Initializes a ucq.  You pass in addresses of mmaped pages for the main page
  * (prod_idx) and the spare page.  I recommend mmaping a big chunk and breaking
@@ -31,7 +32,7 @@ void ucq_init_raw(struct ucq *ucq, uintptr_t pg1, uintptr_t pg2)
        ucq->prod_overflow = FALSE;
        atomic_set(&ucq->nr_extra_pgs, 0);
        atomic_set(&ucq->spare_pg, pg2);
-       static_assert(sizeof(struct spin_pdr_lock) <= sizeof(ucq->u_lock));
+       parlib_static_assert(sizeof(struct spin_pdr_lock) <= sizeof(ucq->u_lock));
        spin_pdr_init((struct spin_pdr_lock*)(&ucq->u_lock));
        ucq->ucq_ready = TRUE;
 }
@@ -59,9 +60,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 +77,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 +93,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 +155,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)