|
16 | 16 |
|
17 | 17 | using namespace fs; |
18 | 18 |
|
| 19 | +#define DEFAULT_FILE_BUFFER_SIZE 4096 |
| 20 | + |
19 | 21 | FileImplPtr VFSImpl::open(const char* fpath, const char* mode, const bool create) |
20 | 22 | { |
21 | 23 | if(!_mountpoint) { |
@@ -280,6 +282,10 @@ VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* fpath, const char* mode) |
280 | 282 | if(!_f) { |
281 | 283 | log_e("fopen(%s) failed", temp); |
282 | 284 | } |
| 285 | + if(_f && (_stat.st_blksize == 0)) |
| 286 | + { |
| 287 | + setvbuf(_f,NULL,_IOFBF,DEFAULT_FILE_BUFFER_SIZE); |
| 288 | + } |
283 | 289 | } else if(S_ISDIR(_stat.st_mode)) { |
284 | 290 | _isDirectory = true; |
285 | 291 | _d = opendir(temp); |
@@ -307,6 +313,10 @@ VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* fpath, const char* mode) |
307 | 313 | if(!_f) { |
308 | 314 | log_e("fopen(%s) failed", temp); |
309 | 315 | } |
| 316 | + if(_f && (_stat.st_blksize == 0)) |
| 317 | + { |
| 318 | + setvbuf(_f,NULL,_IOFBF,DEFAULT_FILE_BUFFER_SIZE); |
| 319 | + } |
310 | 320 | } |
311 | 321 | } |
312 | 322 | free(temp); |
@@ -415,6 +425,19 @@ size_t VFSFileImpl::size() const |
415 | 425 | return _stat.st_size; |
416 | 426 | } |
417 | 427 |
|
| 428 | +/* |
| 429 | +* Change size of files internal buffer used for read / write operations. |
| 430 | +* Need to be called right after opening file before any other operation! |
| 431 | +*/ |
| 432 | +bool VFSFileImpl::setBufferSize(size_t size) |
| 433 | +{ |
| 434 | + if(_isDirectory || !_f) { |
| 435 | + return 0; |
| 436 | + } |
| 437 | + int res = setvbuf(_f,NULL,_IOFBF,size); |
| 438 | + return res == 0; |
| 439 | +} |
| 440 | + |
418 | 441 | const char* VFSFileImpl::path() const |
419 | 442 | { |
420 | 443 | return (const char*) _path; |
|
0 commit comments