From 7b89b39e1087742ada6e8992159390f885c07919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Mon, 28 Mar 2022 10:44:10 +0200 Subject: [PATCH] Edited VFSFileImpl::read to use both read/fread (#6456) * Edited VFSFileImpl::read to use both read/fread * Added missing include --- libraries/FS/src/vfs_api.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index e43b43974..9e200a150 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -13,9 +13,12 @@ // limitations under the License. #include "vfs_api.h" +#include using namespace fs; +#define READ_SIZE_SWITCH 128 //swithc to read func when read size > 128bytes + FileImplPtr VFSImpl::open(const char* fpath, const char* mode, const bool create) { if(!_mountpoint) { @@ -374,7 +377,28 @@ size_t VFSFileImpl::read(uint8_t* buf, size_t size) return 0; } - return fread(buf, 1, size, _f); + //ERASE BYTEBUFFER and use read when size > READ_SIZE_SWITCH always + if(size > READ_SIZE_SWITCH) + { + //check some data in buffer exists –> clear buffer and move pointer to deleted data + size_t bytesinbuf = __fpending(_f); + if (bytesinbuf && (bytesinbuf != 128)) //buffer lenght is 128 bytes + { + fpurge(_f); + lseek(fileno(_f),(-128+bytesinbuf),SEEK_CUR); + } + + int res = ::read(fileno(_f), buf, size); + if (res < 0) { + // an error occurred + return 0; + } + return res; + } + else + { + return fread(buf, 1, size, _f); + } } void VFSFileImpl::flush() -- GitLab