summaryrefslogtreecommitdiffstats
path: root/src/fuse/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fuse/connection.c')
-rw-r--r--src/fuse/connection.c47
1 files changed, 39 insertions, 8 deletions
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 <errno.h>
#include <time.h>
#include <inttypes.h>
+#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 );