diff options
Diffstat (limited to 'trywrite.c')
-rw-r--r-- | trywrite.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -3,6 +3,7 @@ * License: GPLv3 or later (see COPYING for details) */ #include "cmogstored.h" +#include "trace.h" struct mog_wbuf { size_t len; @@ -76,30 +77,32 @@ enum mog_write_state mog_tryflush(int fd, struct mog_wbuf **x) */ void * mog_trywritev(int fd, struct iovec *iov, int iovcnt) { - ssize_t total = 0; + ssize_t len = 0; ssize_t w; int i; for (i = 0; i < iovcnt; i++) - total += iov[i].iov_len; + len += iov[i].iov_len; - if (total == 0) + if (len == 0) return NULL; retry: w = writev(fd, iov, iovcnt); - if (w == total) { + if (w == len) { return NULL; } else if (w < 0) { switch (errno) { - case_EAGAIN: return wbuf_newv(total, iov, iovcnt); + case_EAGAIN: + TRACE(CMOGSTORED_WRITE_BUFFERED()); + return wbuf_newv(len, iov, iovcnt); case EINTR: goto retry; } return MOG_WR_ERROR; } else { struct iovec *new_iov = iov; - total -= w; + len -= w; /* skip over iovecs we've already written completely */ for (i = 0; i < iovcnt; i++, new_iov++) { @@ -147,7 +150,9 @@ void * mog_trysend(int fd, void *buf, size_t len, off_t more) if (w < 0) { switch (errno) { - case_EAGAIN: return wbuf_new(buf, len); + case_EAGAIN: + TRACE(CMOGSTORED_WRITE_BUFFERED()); + return wbuf_new(buf, len); case EINTR: continue; } return MOG_WR_ERROR; |