From: Nikolaus Rath Date: Mon, 3 Oct 2016 04:22:02 +0000 (-0700) Subject: Merged fuse_session.c into fuse_lowlevel.c X-Git-Tag: fuse-3.0.0pre0~6 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=b082a001c7b11e3cf1d1b53470cb229284bc61cd;p=qemu-gpiodev%2Flibfuse.git 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. --- 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); - } - - } -}