|
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