- && atomic_long_read(&buf->active_readers)
- && lib_ring_buffer_poll_deliver(config, buf, chan)) {
- wake_up_interruptible(&buf->read_wait);
- wake_up_interruptible(&chan->read_wait);
+ && uatomic_read(&buf->active_readers)
+ && lib_ring_buffer_poll_deliver(config, buf, chan, handle)) {
+ int wakeup_fd = shm_get_wakeup_fd(handle, &buf->self._ref);
+
+ if (wakeup_fd >= 0) {
+ int ret;
+ /*
+ * Wake-up the other end by
+ * writing a null byte in the
+ * pipe (non-blocking).
+ */
+ do {
+ ret = write(wakeup_fd, "", 1);
+ } while (ret == -1L && errno == EINTR);
+ }