diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2010-11-08 17:11:46 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2010-11-08 17:11:46 +0100 |
commit | 4e0aea6a96146115e2fb3b8c4a4c75325ad894d7 (patch) | |
tree | ddccccd975def8b0881dbd4b219a931a03ffd227 /lib/fuse_session.c | |
parent | 7d878eb13a9b1e0e1a428c1ead2733b8453a3bb7 (diff) | |
download | libfuse-4e0aea6a96146115e2fb3b8c4a4c75325ad894d7.tar.gz |
libfuse: support zero copy writes in lowlevel interface
Add new ->write_buf() method to low level interface. This
allows passig a generic buffer, either containing a memory buffer
or a file descriptor. This allows implementing zero copy writes.
Add fuse_session_receive_buf() and fuse_session_process_buf()
which may be used in event loop implementations to replace
fuse_chan_recv() and fuse_session_process() respectively.
Diffstat (limited to 'lib/fuse_session.c')
-rw-r--r-- | lib/fuse_session.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/fuse_session.c b/lib/fuse_session.c index 3758627..c55f250 100644 --- a/lib/fuse_session.c +++ b/lib/fuse_session.c @@ -80,6 +80,34 @@ void fuse_session_process(struct fuse_session *se, const char *buf, size_t len, se->op.process(se->data, buf, len, ch); } +void fuse_session_process_buf(struct fuse_session *se, + const struct fuse_buf *buf, struct fuse_chan *ch) +{ + if (se->process_buf) { + se->process_buf(se->data, buf, ch); + } else { + assert(!(buf->flags & FUSE_BUF_IS_FD)); + fuse_session_process(se->data, buf->mem, buf->size, ch); + } +} + +int fuse_session_receive_buf(struct fuse_session *se, struct fuse_buf *buf, + struct fuse_chan **chp) +{ + int res; + + if (se->receive_buf) { + res = se->receive_buf(se, buf, chp); + } else { + res = fuse_chan_recv(chp, buf->mem, buf->size); + if (res > 0) + buf->size = res; + } + + return res; +} + + void fuse_session_destroy(struct fuse_session *se) { if (se->op.destroy) |