[4/4] msvcrt: Implement bufsiz block flushing behavior.
Grazvydas Ignotas
notasas at gmail.com
Thu Jun 12 18:27:07 CDT 2014
---
dlls/msvcrt/file.c | 15 +++++++++++++++
dlls/msvcrt/tests/file.c | 2 +-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 7dee5d6..00f214d 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -3720,6 +3720,21 @@ MSVCRT_size_t CDECL MSVCRT_fwrite(const void *ptr, MSVCRT_size_t size, MSVCRT_si
}
written += wrcnt;
wrcnt = 0;
+ } else if(file->_bufsiz && wrcnt >= file->_bufsiz) {
+ int pcnt=(wrcnt / file->_bufsiz) * file->_bufsiz;
+ if(msvcrt_set_write_direction(file) != 0)
+ break;
+
+ if(msvcrt_flush_buffer(file) == MSVCRT_EOF)
+ break;
+
+ if(MSVCRT__write(file->_file, ptr, pcnt) <= 0) {
+ file->_flag |= MSVCRT__IOERR;
+ break;
+ }
+ written += pcnt;
+ wrcnt -= pcnt;
+ ptr = (const char*)ptr + pcnt;
} else {
if(MSVCRT__flsbuf(*(const char*)ptr, file) == MSVCRT_EOF)
break;
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index 1ca9efb..2de07fc 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -2246,7 +2246,7 @@ static void test_write_flush_size(FILE *file, size_t size)
fflush(file);
fseek(file, 0, SEEK_SET);
ok(fread(inbuffer, 1, size, file) == size, "read failed\n");
- todo_wine ok(memcmp(outbuffer, inbuffer, size) == 0, "missing flush by %d byte write\n", size);
+ ok(memcmp(outbuffer, inbuffer, size) == 0, "missing flush by %d byte write\n", size);
rewind(file);
fwrite(outbuffer, 1, size - 1, file);
lseek(fd, 1, SEEK_SET);
--
1.7.9.5
More information about the wine-patches
mailing list