static ssize_t rs_write(void *data, const void *buf, size_t size) { rsd_t *rsd = (rsd_t*)data; if (rsd->has_error) return -1; if (rsd->nonblock) { size_t avail, write_amt; rsd_callback_lock(rsd->rd); avail = fifo_write_avail(rsd->buffer); write_amt = avail > size ? size : avail; fifo_write(rsd->buffer, buf, write_amt); rsd_callback_unlock(rsd->rd); return write_amt; } else { size_t written = 0; while (written < size && !rsd->has_error) { size_t avail; rsd_callback_lock(rsd->rd); avail = fifo_write_avail(rsd->buffer); if (avail == 0) { rsd_callback_unlock(rsd->rd); if (!rsd->has_error) { slock_lock(rsd->cond_lock); scond_wait(rsd->cond, rsd->cond_lock); slock_unlock(rsd->cond_lock); } } else { size_t write_amt = size - written > avail ? avail : size - written; fifo_write(rsd->buffer, (const char*)buf + written, write_amt); rsd_callback_unlock(rsd->rd); written += write_amt; } } return written; } }
static size_t rs_write_avail(void *data) { rsd_t *rsd = (rsd_t*)data; if (rsd->has_error) return 0; rsd_callback_lock(rsd->rd); size_t val = fifo_write_avail(rsd->buffer); rsd_callback_unlock(rsd->rd); return val; }