From 30fc7b8d043c85a6d65b0bad0edf48a75e3f95b1 Mon Sep 17 00:00:00 2001 From: Kolyvan Date: Fri, 8 Jan 2016 15:01:14 +1000 Subject: [PATCH] tune the buffer size for reading file --- KxSMBProvider.m | 15 +++++++++++---- KxSMBSample/FileViewController.m | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/KxSMBProvider.m b/KxSMBProvider.m index 18a9c9d..7b8c85d 100644 --- a/KxSMBProvider.m +++ b/KxSMBProvider.m @@ -2158,8 +2158,13 @@ - (id)readDataOfLength:(NSUInteger)length NSError *error = [self openFile]; if (error) return error; } - - Byte buffer[32768]; + + // it seems 512 kb is an optimal buffer size + const size_t bufferSize = MIN(length, 512*1024); + Byte *buffer = malloc(bufferSize); + if (!buffer) { + return mkKxSMBError(KxSMBErrorOutOfMemory, nil); + } smbc_read_fn readFn = smbc_getFunctionRead(_context); NSMutableData *md = [NSMutableData data]; @@ -2167,7 +2172,7 @@ - (id)readDataOfLength:(NSUInteger)length while (bytesToRead > 0) { - ssize_t r = readFn(_context, _file, buffer, MIN(bytesToRead, sizeof(buffer))); + ssize_t r = readFn(_context, _file, buffer, MIN(bytesToRead, bufferSize)); if (r == 0) break; @@ -2175,6 +2180,7 @@ - (id)readDataOfLength:(NSUInteger)length if (r < 0) { const int err = errno; + free(buffer); return mkKxSMBError(errnoToSMBErr(err), NSLocalizedString(@"Unable read file:%@ (errno:%d)", nil), _path, err); } @@ -2182,7 +2188,8 @@ - (id)readDataOfLength:(NSUInteger)length [md appendBytes:buffer length:r]; bytesToRead -= r; } - + + free(buffer); return md; } diff --git a/KxSMBSample/FileViewController.m b/KxSMBSample/FileViewController.m index 05fc8c4..3a81fab 100644 --- a/KxSMBSample/FileViewController.m +++ b/KxSMBSample/FileViewController.m @@ -301,7 +301,7 @@ -(void) updateDownloadStatus: (id) result - (void) download { __weak __typeof(self) weakSelf = self; - [_smbFile readDataOfLength:32768 + [_smbFile readDataOfLength:1024*1024 block:^(id result) { FileViewController *p = weakSelf;