From 59de892b49d588acd2d3e5e632d9b3bad8a7c03e Mon Sep 17 00:00:00 2001 From: ln-tech Date: Tue, 22 Oct 2019 08:05:22 +0200 Subject: cleaned code and atomic_ints against --- src/fuse/connection.c | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'src/fuse/connection.c') diff --git a/src/fuse/connection.c b/src/fuse/connection.c index 98b1d36..4c28dd8 100644 --- a/src/fuse/connection.c +++ b/src/fuse/connection.c @@ -14,6 +14,7 @@ #include #include #include +#include "main.h" /* Constants */ static const size_t SHORTBUF = 100; @@ -344,9 +345,11 @@ static void* connection_receiveThreadMain(void *sockPtr) int sockFd = (int)(size_t)sockPtr; dnbd3_reply_t reply; pthread_detach( pthread_self() ); + while ( keepRunning ) { int ret; + struct fuse_bufvec splice_buf; do { ret = dnbd3_read_reply( sockFd, &reply, true ); if ( ret == REPLY_OK ) break; @@ -369,10 +372,18 @@ static void* connection_receiveThreadMain(void *sockPtr) } } else { // Found a match + request->buffer = malloc(request->length); // char* + if (request->mode == SPLICE) { + splice_buf = FUSE_BUFVEC_INIT(request->length); + splice_buf.buf[0].mem = request->buffer; + splice_buf.buf[0].pos = request->offset; + } const ssize_t ret = sock_recv( sockFd, request->buffer, request->length ); if ( ret != (ssize_t)request->length ) { logadd( LOG_DEBUG1, "receiving payload for a block reply failed" ); connection_read( request ); + free(request->buffer); + request->buffer = NULL; goto fail; } // Check RTT @@ -390,10 +401,30 @@ static void* connection_receiveThreadMain(void *sockPtr) } unlock_rw( &altLock ); } + int rep = -errno; + if (request->mode == NO_SPLICE) { + rep = fuse_reply_buf(request->fuse_req, request->buffer, request->length); + } + else if (request->mode == SPLICE) { + rep = fuse_reply_data(request->fuse_req, &splice_buf, FUSE_BUF_FORCE_SPLICE); + // free(splice_buf); + } + if (rep != -errno) { + // no error + } + else { + printf("ERROR ON FUSE REPLY %i \n", rep); + fuse_reply_err(request->fuse_req, rep); + } + free(request->buffer); + request->buffer = NULL; + //free(request->fuse_req); + //request->fuse_req = NULL; + free(request); // Success, wake up caller - request->success = true; - request->finished = true; - signal_call( request->signal ); + //request->success = true; + //request->finished = true; + //signal_call( request->signal ); } } else if ( reply.cmd == CMD_GET_SERVERS ) { // List of known alt servers @@ -686,9 +717,9 @@ static void probeAltServers() } // Success, wake up caller logadd( LOG_DEBUG1, "[RTT] Successful direct probe" ); - request->success = true; - request->finished = true; - signal_call( request->signal ); + //request->success = true; + //request->finished = true; + //signal_call( request->signal ); } else { // Wasn't a request that's in our request queue if ( !throwDataAway( sock, testLength ) ) { @@ -886,8 +917,8 @@ static bool throwDataAway(int sockFd, uint32_t amount) static void enqueueRequest(dnbd3_async_t *request) { request->next = NULL; - request->finished = false; - request->success = false; + //request->finished = false; + //request->success = false; //logadd( LOG_DEBUG2, "Queue: %p @ %s : %d", request, file, line ); // Measure latency and add to switch formula timing_get( &request->time ); -- cgit v1.2.3-55-g7522