From 1344908b6ce8b26ce9ff6e6269348eec904e14dc Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Mon, 18 May 2015 16:55:20 +0200 Subject: libfuse: refcount fuse_chan objects New functions: fuse_chan_get(), fuse_chan_put(). Removed function: fuse_chan_destroy(). --- lib/fuse_session.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'lib/fuse_session.c') diff --git a/lib/fuse_session.c b/lib/fuse_session.c index e919e73..42fe5c3 100644 --- a/lib/fuse_session.c +++ b/lib/fuse_session.c @@ -84,6 +84,8 @@ struct fuse_chan *fuse_chan_new(int fd) memset(ch, 0, sizeof(*ch)); ch->fd = fd; + ch->ctr = 1; + fuse_mutex_init(&ch->lock); return ch; } @@ -98,9 +100,30 @@ struct fuse_session *fuse_chan_session(struct fuse_chan *ch) return ch->se; } -void fuse_chan_destroy(struct fuse_chan *ch) +struct fuse_chan *fuse_chan_get(struct fuse_chan *ch) { - fuse_session_remove_chan(ch); - fuse_chan_close(ch); - free(ch); + assert(ch->ctr > 0); + pthread_mutex_lock(&ch->lock); + ch->ctr++; + pthread_mutex_unlock(&ch->lock); + + return ch; +} + +void fuse_chan_put(struct fuse_chan *ch) +{ + if (ch) { + pthread_mutex_lock(&ch->lock); + ch->ctr--; + if (!ch->ctr) { + pthread_mutex_unlock(&ch->lock); + fuse_session_remove_chan(ch); + fuse_chan_close(ch); + pthread_mutex_destroy(&ch->lock); + free(ch); + } else { + pthread_mutex_unlock(&ch->lock); + } + + } } -- cgit v1.2.3