diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2015-09-29 17:51:32 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2015-09-29 17:51:32 +0200 |
commit | 386b1b6e3d0fcf7e2dfd5473e867284410dfa624 (patch) | |
tree | d16206c9de6043e78f663b8cfadc835df2981f1e /lib/fuse_session.c | |
parent | 4ae8680e40b60d65029f4630c21ab182d3c79e8e (diff) | |
parent | a5a00e9b7dd8c8dfef17523dccb3051e1f1dd5a2 (diff) | |
download | libfuse-386b1b6e3d0fcf7e2dfd5473e867284410dfa624.tar.gz |
Merge branch 'clone_fd'
Diffstat (limited to 'lib/fuse_session.c')
-rw-r--r-- | lib/fuse_session.c | 31 |
1 files changed, 27 insertions, 4 deletions
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); + } + + } } |