summaryrefslogtreecommitdiffstats
path: root/src/fuse
diff options
context:
space:
mode:
authorln-tech2020-01-12 21:24:14 +0100
committerln-tech2020-01-12 21:24:14 +0100
commit911d4130c6ab1e41e2c57c8ba6454b37633f8750 (patch)
tree4dba3d53c591b69fb23fcb87f4f95df7c0248277 /src/fuse
parentfixed code: removed useless splicing, code optimization, commandline argument... (diff)
downloaddnbd3-911d4130c6ab1e41e2c57c8ba6454b37633f8750.tar.gz
dnbd3-911d4130c6ab1e41e2c57c8ba6454b37633f8750.tar.xz
dnbd3-911d4130c6ab1e41e2c57c8ba6454b37633f8750.zip
leak fix in main
Diffstat (limited to 'src/fuse')
-rw-r--r--src/fuse/connection.c3
-rw-r--r--src/fuse/connection.h3
-rw-r--r--src/fuse/main.c11
3 files changed, 12 insertions, 5 deletions
diff --git a/src/fuse/connection.c b/src/fuse/connection.c
index f16eb1e..7a28649 100644
--- a/src/fuse/connection.c
+++ b/src/fuse/connection.c
@@ -31,7 +31,7 @@ static const int FAIL_BACKOFF_START_COUNT = 8;
static bool connectionInitDone = false;
static bool threadInitDone = false;
static pthread_mutex_t mutexInit = PTHREAD_MUTEX_INITIALIZER;
-bool keepRunning = true;
+atomic_bool keepRunning = true;
static bool learnNewServers;
// List of pending requests
@@ -425,6 +425,7 @@ static void* connection_receiveThreadMain(void *sockPtr)
}
}
}
+ if(!keepRunning) connection_close();
logadd( LOG_DEBUG1, "Aus der Schleife rausgeflogen! ARRRRRRRRRR" );
fail:;
// Make sure noone is trying to use the socket for sending by locking,
diff --git a/src/fuse/connection.h b/src/fuse/connection.h
index 15075d5..c64806c 100644
--- a/src/fuse/connection.h
+++ b/src/fuse/connection.h
@@ -3,6 +3,7 @@
#include "../shared/fdsignal.h"
#include "../shared/timing.h"
+#include <stdatomic.h>
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
@@ -10,7 +11,7 @@
#include <fuse_lowlevel.h>
-extern bool keepRunning;
+extern atomic_bool keepRunning;
struct _dnbd3_async;
typedef struct _dnbd3_async {
diff --git a/src/fuse/main.c b/src/fuse/main.c
index df85bc2..26cae50 100644
--- a/src/fuse/main.c
+++ b/src/fuse/main.c
@@ -46,7 +46,6 @@ static struct timespec startupTime;
static uid_t owner;
static void (*fuse_sigIntHandler)(int) = NULL;
static void (*fuse_sigTermHandler)(int) = NULL;
-//static struct fuse_operations dnbd3_fuse_no_operations;
static int reply_buf_limited(fuse_req_t req, const char *buf, size_t bufsize, off_t off, size_t maxsize);
static int fillStatsFile(char *buf, size_t size, off_t offset);
@@ -173,7 +172,7 @@ static void image_ll_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info
else if ((fi->flags & 3) != O_RDONLY)
fuse_reply_err(req, EACCES);
else {
- // auto caching
+ // auto caching
fi->keep_cache = 1;
fuse_reply_open(req, fi);
}
@@ -274,12 +273,12 @@ static void image_ll_init(void *userdata, struct fuse_conn_info *conn)
logadd( LOG_ERROR, "Could not initialize threads for dnbd3 connection, exiting..." );
exit( EXIT_FAILURE );
}
+
// Prepare our handler
struct sigaction newHandler;
memset( &newHandler, 0, sizeof(newHandler) );
newHandler.sa_handler = &image_sigHandler;
sigemptyset( &newHandler.sa_mask );
-
struct sigaction oldHandler;
// Retrieve old handlers when setting
sigaction( SIGINT, &newHandler, &oldHandler );
@@ -288,6 +287,7 @@ static void image_ll_init(void *userdata, struct fuse_conn_info *conn)
sigaction( SIGTERM, &newHandler, &oldHandler );
fuse_sigTermHandler = oldHandler.sa_handler;
logadd( LOG_DEBUG1, "Previous SIGTERM handler was %p", (void*)(uintptr_t)fuse_sigIntHandler );
+ return NULL;
}
/* close the connection */
@@ -367,6 +367,7 @@ int main(int argc, char *argv[])
bool single_thread = false;
struct fuse_chan *ch;
char *mountpoint;
+ int foreground = 0;
int fuse_err;
if ( argc <= 1 || strcmp( argv[1], "--help" ) == 0 || strcmp( argv[1], "--usage" ) == 0 ) {
@@ -381,6 +382,7 @@ int main(int argc, char *argv[])
newArgv = calloc( argc + 10, sizeof(char*) );
newArgv[0] = argv[0];
newArgc = 1;
+
while ( ( opt = getopt_long( argc, argv, optString, longOpts, &lidx ) ) != -1 ) {
switch ( opt ) {
case 'h':
@@ -419,6 +421,7 @@ int main(int argc, char *argv[])
case 'd':
useDebug = true;
newArgv[newArgc++] = "-d";
+ foreground = 1;
break;
case 's':
single_thread = true;
@@ -487,6 +490,7 @@ int main(int argc, char *argv[])
if (se != NULL) {
if (fuse_set_signal_handlers(se) != -1) {
fuse_session_add_chan(se, ch);
+ //fuse_daemonize(foreground);
if (single_thread) fuse_err = fuse_session_loop(se);
else fuse_err = fuse_session_loop_mt(se); //MT produces errors (race conditions) in libfuse and didnt improve speed at all
fuse_remove_signal_handlers(se);
@@ -497,6 +501,7 @@ int main(int argc, char *argv[])
fuse_unmount(mountpoint, ch);
}
fuse_opt_free_args(&args);
+ free(newArgv);
logadd( LOG_DEBUG1, "Terminating. FUSE REPLIED: %d\n", fuse_err);
return fuse_err;
}