From b082a001c7b11e3cf1d1b53470cb229284bc61cd Mon Sep 17 00:00:00 2001 From: Nikolaus Rath Date: Sun, 2 Oct 2016 21:22:02 -0700 Subject: [PATCH] Merged fuse_session.c into fuse_lowlevel.c This distinction no longer makes sens. fuse_lowlevel.c already contains several session related functions, and fuse_session.c contains various stuff that is more related to the channel interface. --- lib/Makefile.am | 3 +- lib/fuse_lowlevel.c | 94 +++++++++++++++++++++++++++++++++++++ lib/fuse_session.c | 112 -------------------------------------------- 3 files changed, 95 insertions(+), 114 deletions(-) delete mode 100644 lib/fuse_session.c diff --git a/lib/Makefile.am b/lib/Makefile.am index 1d50b0e..69e9dc5 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -17,7 +17,7 @@ else iconv_source = endif -libfuse3_la_SOURCES = \ +libfuse3_la_SOURCES = \ fuse.c \ fuse_i.h \ fuse_loop.c \ @@ -25,7 +25,6 @@ libfuse3_la_SOURCES = \ fuse_lowlevel.c \ fuse_misc.h \ fuse_opt.c \ - fuse_session.c \ fuse_signals.c \ buffer.c \ cuse_lowlevel.c \ diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 8ccc733..368ac71 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -3055,3 +3055,97 @@ int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[]) return -ENOSYS; } #endif + +void fuse_session_add_chan(struct fuse_session *se, struct fuse_chan *ch) +{ + assert(se->ch == NULL); + assert(ch->se == NULL); + se->ch = ch; + ch->se = se; +} + +void fuse_session_remove_chan(struct fuse_chan *ch) +{ + struct fuse_session *se = ch->se; + if (se) { + assert(se->ch == ch); + se->ch = NULL; + ch->se = NULL; + } +} + +struct fuse_chan *fuse_session_chan(struct fuse_session *se) +{ + return se->ch; +} + +int fuse_chan_clearfd(struct fuse_chan *ch) +{ + int fd = ch->fd; + ch->fd = -1; + return fd; +} + +void fuse_session_exit(struct fuse_session *se) +{ + se->exited = 1; +} + +void fuse_session_reset(struct fuse_session *se) +{ + se->exited = 0; +} + +int fuse_session_exited(struct fuse_session *se) +{ + return se->exited; +} + +struct fuse_chan *fuse_chan_new(int fd) +{ + struct fuse_chan *ch = (struct fuse_chan *) malloc(sizeof(*ch)); + if (ch == NULL) { + fprintf(stderr, "fuse: failed to allocate channel\n"); + return NULL; + } + + memset(ch, 0, sizeof(*ch)); + ch->fd = fd; + ch->ctr = 1; + fuse_mutex_init(&ch->lock); + + return ch; +} + +struct fuse_session *fuse_chan_session(struct fuse_chan *ch) +{ + return ch->se; +} + +struct fuse_chan *fuse_chan_get(struct fuse_chan *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); + } + + } +} diff --git a/lib/fuse_session.c b/lib/fuse_session.c deleted file mode 100644 index cdf20f7..0000000 --- a/lib/fuse_session.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - FUSE: Filesystem in Userspace - Copyright (C) 2001-2007 Miklos Szeredi - - This program can be distributed under the terms of the GNU LGPLv2. - See the file COPYING.LIB -*/ - -#include "config.h" -#include "fuse_i.h" -#include "fuse_misc.h" - -#include -#include -#include -#include -#include - - -void fuse_session_add_chan(struct fuse_session *se, struct fuse_chan *ch) -{ - assert(se->ch == NULL); - assert(ch->se == NULL); - se->ch = ch; - ch->se = se; -} - -void fuse_session_remove_chan(struct fuse_chan *ch) -{ - struct fuse_session *se = ch->se; - if (se) { - assert(se->ch == ch); - se->ch = NULL; - ch->se = NULL; - } -} - -struct fuse_chan *fuse_session_chan(struct fuse_session *se) -{ - return se->ch; -} - -int fuse_chan_clearfd(struct fuse_chan *ch) -{ - int fd = ch->fd; - ch->fd = -1; - return fd; -} - -void fuse_session_exit(struct fuse_session *se) -{ - se->exited = 1; -} - -void fuse_session_reset(struct fuse_session *se) -{ - se->exited = 0; -} - -int fuse_session_exited(struct fuse_session *se) -{ - return se->exited; -} - -struct fuse_chan *fuse_chan_new(int fd) -{ - struct fuse_chan *ch = (struct fuse_chan *) malloc(sizeof(*ch)); - if (ch == NULL) { - fprintf(stderr, "fuse: failed to allocate channel\n"); - return NULL; - } - - memset(ch, 0, sizeof(*ch)); - ch->fd = fd; - ch->ctr = 1; - fuse_mutex_init(&ch->lock); - - return ch; -} - -struct fuse_session *fuse_chan_session(struct fuse_chan *ch) -{ - return ch->se; -} - -struct fuse_chan *fuse_chan_get(struct fuse_chan *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); - } - - } -} -- 2.30.2