On 05/31/14 01:00, Grazvydas Ignotas wrote:
+ } else if(wrcnt >= MSVCRT_WRITE_BLOCK_SIZE) { + if(msvcrt_set_write_direction(file) != 0) + break; + + if(file->_bufsiz && file->_ptr != file->_base) + if(msvcrt_flush_buffer(file) == MSVCRT_EOF) + break; + + if(MSVCRT__write(file->_file, ptr, MSVCRT_WRITE_BLOCK_SIZE) <= 0) { + file->_flag |= MSVCRT__IOERR; + break; + } + written += MSVCRT_WRITE_BLOCK_SIZE; + wrcnt -= MSVCRT_WRITE_BLOCK_SIZE; + ptr = (const char*)ptr + MSVCRT_WRITE_BLOCK_SIZE; This doesn't look right for me. It doesn't make sense to have some special size blocks written in different way.
I think this is caused by 2 differences in native and wine's implementation of fwrite: - if you check file->_bufsiz value on windows it's set to 4096 (on wine it's 512), this is probably causing the flash to be done when 4096 bytes are written - probably there's some kind of optimization that writes integral number of buffers directly to file - I was not checking it but maybe native flushes the output when buffer is full, wine will exit fwrite with full buffer in this case I've also seen that _bufsiz is set to 0 on wine if buffer was not yet allocated. On windows it's value is 4096 just after opening the file. Cheers, Piotr