#include "enstfilecache.h"
#include "../enstsvcpack.h"
//#define file_cache_size 0x40000000 /* = 1gb */ #define file_cache_size 0x01e00000 /* = 30mb */
enstfilecache::enstfilecache() { mmappingviewsize = 1024*(64*1024); //windows default block size is 64kb
mfilehandle = invalid_handle_value; mmappinghandle = null; mwritemappingoffset = 0; mwritebuffer = null; mwritebufferoffset = 0; mreadmappingoffset = 0; mreadbuffer = null; }
enstfilecache::~enstfilecache() { if (mwritebuffer != null) { unmapviewoffile(mwritebuffer); } if (mreadbuffer != null) { unmapviewoffile(mreadbuffer); } if (mmappinghandle != null) { closehandle(mmappinghandle); } if (mfilehandle != invalid_handle_value) { closehandle(mfilehandle); } }
bool enstfilecache::createfilecache(const qstring &pfilename) { enstlogservice *logservice = enstlogservice::getmyaddr();
mfilehandle = createfile(pfilename.toascii(), generic_read | generic_write, file_share_read, null, open_always, file_attribute_normal, 0); if (mfilehandle == invalid_handle_value) { dumpwindowserrormessage(); logservice->appendlog(this, "error when create file."); return false; } mmappinghandle = createfilemapping(mfilehandle, null, page_readwrite, (dword)(file_cache_size>>32), (dword)(file_cache_size & 0xffffffff), null); if (mmappinghandle == null) { if (getlasterror() == 112) { logservice->appendlog(this, "looks like its not enough space on the disk."); } dumpwindowserrormessage(); logservice->appendlog(this, "error when create file mapping."); return false; } mwritemappingoffset = 0; mwritebuffer = null; mwritebufferoffset = 0; mreadmappingoffset = 0; mreadbuffer = null; return true; }
bool enstfilecache::appenddata(t_int8* pdata, int pdatalength) { int datawrote = 0; do { int datacanwrite = mmappingviewsize - mwritebufferoffset; if (mwritebuffer && datacanwrite <= 0) { unmapviewoffile(mwritebuffer); mwritebuffer = null; mwritemappingoffset += mmappingviewsize; } if (mwritebuffer == null) { mwritebuffer = mapviewoffile(mmappinghandle, file_map_write, (dword)(mwritemappingoffset>>32), (dword)(mwritemappingoffset & 0xffffffff), mmappingviewsize); mwritebufferoffset = 0; datacanwrite = mmappingviewsize - mwritebufferoffset; if (! mwritebuffer) { dumpwindowserrormessage(); enstlogservice *logservice = enstlogservice::getmyaddr(); logservice->appendlog(this, "error when map view of file."); return false; } } int datatowrite = pdatalength - datawrote; int actualdatatowrite = (datacanwrite >= datatowrite)?datatowrite:datacanwrite; memcpy((pbyte)mwritebuffer+mwritebufferoffset, (pbyte)pdata+datawrote, actualdatatowrite); mwritebufferoffset += actualdatatowrite; datawrote += actualdatatowrite; } while (datawrote < pdatalength); return true; }
|