diff options
author | Bartosz Taudul <wolf.pld@gmail.com> | 2017-09-30 19:37:32 +0300 |
---|---|---|
committer | Bartosz Taudul <wolf.pld@gmail.com> | 2017-09-30 19:43:56 +0300 |
commit | 1c29367a5464e17d7ddc5f360fb3bf3c3e75df25 (patch) | |
tree | 66e5cfd125a4883f1d4b2d210acf4679ab4bcf26 /server/TracyFileWrite.hpp | |
parent | fc8cd12088d875f1639ea8f6cfd6f50d134fd378 (diff) |
Buffer writes.
Diffstat (limited to 'server/TracyFileWrite.hpp')
-rwxr-xr-x | server/TracyFileWrite.hpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/server/TracyFileWrite.hpp b/server/TracyFileWrite.hpp index d45f3e75..42ae1cf6 100755 --- a/server/TracyFileWrite.hpp +++ b/server/TracyFileWrite.hpp @@ -1,6 +1,7 @@ #ifndef __TRACYFILEWRITE_HPP__ #define __TRACYFILEWRITE_HPP__ +#include <algorithm> #include <stdio.h> namespace tracy @@ -17,18 +18,51 @@ public: ~FileWrite() { + if( m_offset > 0 ) + { + fwrite( m_buf, 1, m_offset, m_file ); + } fclose( m_file ); } void Write( const void* ptr, size_t size ) { - fwrite( ptr, 1, size, m_file ); + if( m_offset + size <= BufSize ) + { + memcpy( m_buf + m_offset, ptr, size ); + m_offset += size; + } + else + { + auto src = (const char*)ptr; + while( size > 0 ) + { + const auto sz = std::min( size, BufSize - m_offset ); + memcpy( m_buf + m_offset, src, sz ); + m_offset += sz; + src += sz; + size -= sz; + + if( m_offset == BufSize ) + { + fwrite( m_buf, 1, BufSize, m_file ); + m_offset = 0; + } + } + } } private: - FileWrite( FILE* f ) : m_file( f ) {} + FileWrite( FILE* f ) + : m_file( f ) + , m_offset( 0 ) + {} + + enum { BufSize = 64 * 1024 }; FILE* m_file; + char m_buf[BufSize]; + size_t m_offset; }; } |