aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_session.c
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2015-09-29 17:51:32 +0200
committerMiklos Szeredi <mszeredi@suse.cz>2015-09-29 17:51:32 +0200
commit386b1b6e3d0fcf7e2dfd5473e867284410dfa624 (patch)
treed16206c9de6043e78f663b8cfadc835df2981f1e /lib/fuse_session.c
parent4ae8680e40b60d65029f4630c21ab182d3c79e8e (diff)
parenta5a00e9b7dd8c8dfef17523dccb3051e1f1dd5a2 (diff)
downloadlibfuse-386b1b6e3d0fcf7e2dfd5473e867284410dfa624.tar.gz
Merge branch 'clone_fd'
Diffstat (limited to 'lib/fuse_session.c')
-rw-r--r--lib/fuse_session.c31
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);
+ }
+
+ }
}