2 #include "DataBufferFile.hpp"
4 DataBufferFile::DataBufferFile( FILE* f
, int secondaryBufferSize
, Mode mode
)
6 , m_buf( new char[BufSize
] )
7 , m_buf2( new char[BufSize
] )
8 , m_secBuf( new char[secondaryBufferSize
] )
11 , m_threadRunning( false )
23 DataBufferFile::~DataBufferFile()
25 // Dump buffer to disk if needed
26 if( m_mode
== M_WRITE
&& m_offset
!= 0 )
32 pthread_join( m_thread
, NULL
);
42 int DataBufferFile::Read( void* ptr
, int size
)
44 int bufSize
= m_secBufSize
;
47 memcpy( ptr
, m_secBuf
, bufSize
);
49 return fread( (char*)ptr
+ bufSize
, 1, size
- bufSize
, m_file
) + bufSize
;
52 int DataBufferFile::Write( void* _ptr
, int _size
)
55 char* ptr
= (char*)_ptr
;
59 int dataToWrite
= std::min( size
, BufSize
- m_offset
);
60 memcpy( m_buf
+ m_offset
, ptr
, dataToWrite
);
62 m_offset
+= dataToWrite
;
65 if( m_offset
== BufSize
)
74 void DataBufferFile::Store( void* ptr
, int size
)
76 memcpy( m_secBuf
, ptr
, size
);
80 void DataBufferFile::SaveBuffer()
84 pthread_join( m_thread
, NULL
);
87 m_offsetToWrite
= m_offset
;
89 std::swap( m_buf
, m_buf2
);
91 pthread_create( &m_thread
, NULL
, &DataBufferFile::SaveBuffer
, (void*)this );
92 m_threadRunning
= true;
95 void* DataBufferFile::SaveBuffer( void* _ptr
)
97 DataBufferFile
* ptr
= static_cast<DataBufferFile
*>( _ptr
);
99 if( ptr
->m_offsetToWrite
== BufSize
)
101 fwrite( ptr
->m_buf2
, BufSize
, 1, ptr
->m_file
);
105 fwrite( ptr
->m_buf2
, 1, ptr
->m_offsetToWrite
, ptr
->m_file
);