aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_i.h
diff options
context:
space:
mode:
authorBernd Schubert <bschubert@ddn.com>2025-03-30 22:43:09 +0200
committerBernd Schubert <bernd@bsbernd.com>2025-04-24 16:10:40 +0200
commitc5dbcdce2d1942abb567d03bf9dafb74f06b5769 (patch)
tree9bf54e908b73c2acae3b326c930a1e243c354dad /lib/fuse_i.h
parente025a78d9b296bc78e9e3ac2925d8bc0ec26d702 (diff)
downloadlibfuse-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.h8
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;
};