diff options
author | Bernd Schubert <bschubert@ddn.com> | 2025-03-30 22:43:09 +0200 |
---|---|---|
committer | Bernd Schubert <bernd@bsbernd.com> | 2025-04-24 16:10:40 +0200 |
commit | c5dbcdce2d1942abb567d03bf9dafb74f06b5769 (patch) | |
tree | 9bf54e908b73c2acae3b326c930a1e243c354dad /lib/fuse_i.h | |
parent | e025a78d9b296bc78e9e3ac2925d8bc0ec26d702 (diff) | |
download | libfuse-c5dbcdce2d1942abb567d03bf9dafb74f06b5769.tar.gz |
Fix multi-threaded fuse session exit
Issue with previous code was that fuse_session_exit()
didn't wake up the semaphore in fuse_loop_mt.c.
Lock, semaphore and all uses of checking for "exited"
are now moved to struct fuse_session to have it
available for the signal handler.
This also removes internal fuse_session_reset() calls,
as that makes testing hard. From git history I also
don't see why it was added.
Closes: https://github.com/libfuse/libfuse/issues/997
Signed-off-by: Bernd Schubert <bschubert@ddn.com>
Diffstat (limited to 'lib/fuse_i.h')
-rw-r--r-- | lib/fuse_i.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/fuse_i.h b/lib/fuse_i.h index 48b8294..1f59944 100644 --- a/lib/fuse_i.h +++ b/lib/fuse_i.h @@ -10,6 +10,8 @@ #include "fuse_lowlevel.h" #include "util.h" +#include <pthread.h> +#include <semaphore.h> #include <stdint.h> #include <stdbool.h> #include <errno.h> @@ -55,7 +57,6 @@ struct fuse_notify_req { struct fuse_session { char *mountpoint; - volatile int exited; int fd; struct fuse_custom_io *io; struct mount_opts *mo; @@ -83,6 +84,11 @@ struct fuse_session { */ struct libfuse_version version; + /* thread synchronization */ + _Atomic bool mt_exited; + pthread_mutex_t mt_lock; + sem_t mt_finish; + /* true if reading requests from /dev/fuse are handled internally */ bool buf_reallocable; }; |