Serialize printing during panic()
[akaros.git] / kern / src / apipe.c
index 2f915a6..c97333d 100644 (file)
@@ -87,14 +87,16 @@ int apipe_read_locked(struct atomic_pipe *ap, void *buf, size_t nr_elem)
        int nr_copied = 0;
 
        for (int i = 0; i < nr_elem; i++) {
+               /* readers that call read_locked directly might have failed to check for
+                * emptiness, so we'll double check early. */
+               if (__ring_empty(ap->ap_wr_off, ap->ap_rd_off))
+                       break;
                /* power of 2 elements in the ring buffer, index is the lower n bits */
                rd_idx = ap->ap_rd_off & (ap->ap_ring_sz - 1);
                memcpy(buf, ap->ap_buf + rd_idx * ap->ap_elem_sz, ap->ap_elem_sz);
                ap->ap_rd_off++;
                buf += ap->ap_elem_sz;
                nr_copied++;
-               if (__ring_empty(ap->ap_wr_off, ap->ap_rd_off))
-                       break;
        }
        /* We could have multiple writers blocked.  Just broadcast for them all.
         * Alternatively, we could signal one, and then it's on the writers to
@@ -174,7 +176,7 @@ void *apipe_head(struct atomic_pipe *ap)
        return ap->ap_buf + (ap->ap_rd_off & (ap->ap_ring_sz - 1)) * ap->ap_elem_sz;
 }
 
-/* 
+/*
  * Read data from the pipe until a condition is satisfied.
  * f is the function that determines the condition. f saves its
  * state in arg. When f returns non-zero, this function exits,