1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "BufferedArchive.h"
#include "System/GlobalConfig.h"
#include "System/MainDefines.h"
#include "System/Log/ILog.h"
#include <cassert>
spring::mutex CBufferedArchive::archiveLock;
CBufferedArchive::~CBufferedArchive()
{
// filter archives for which only {map,mod}info.lua was accessed
if (cacheSize <= 1 || fileCount <= 1)
return;
LOG_L(L_INFO, "[%s][name=%s] %u bytes cached in %u files", __func__, archiveFile.c_str(), cacheSize, fileCount);
}
bool CBufferedArchive::GetFile(unsigned int fid, std::vector<std::uint8_t>& buffer)
{
std::lock_guard<spring::mutex> lck(archiveLock);
assert(IsFileId(fid));
int ret = 0;
if (noCache) {
if ((ret = GetFileImpl(fid, buffer)) != 1)
LOG_L(L_WARNING, "[BufferedArchive::%s(fid=%u)][noCache] name=%s ret=%d size=" _STPF_, __func__, fid, archiveFile.c_str(), ret, buffer.size());
return (ret == 1);
}
// engine-only
if (!globalConfig.vfsCacheArchiveFiles) {
if ((ret = GetFileImpl(fid, buffer)) != 1)
LOG_L(L_WARNING, "[BufferedArchive::%s(fid=%u)][!vfsCache] name=%s ret=%d size=" _STPF_, __func__, fid, archiveFile.c_str(), ret, buffer.size());
return (ret == 1);
}
// NumFiles is virtual, can't do this in ctor
if (fileCache.empty())
fileCache.resize(NumFiles());
FileBuffer& fb = fileCache.at(fid);
if (!fb.populated) {
fb.exists = ((ret = GetFileImpl(fid, fb.data)) == 1);
fb.populated = true;
cacheSize += fb.data.size();
fileCount += fb.exists;
}
if (!fb.exists) {
LOG_L(L_WARNING, "[BufferedArchive::%s(fid=%u)][!fb.exists] name=%s ret=%d size=" _STPF_, __func__, fid, archiveFile.c_str(), ret, fb.data.size());
return false;
}
if (buffer.size() != fb.data.size())
buffer.resize(fb.data.size());
// TODO: zero-copy access
std::copy(fb.data.begin(), fb.data.end(), buffer.begin());
return true;
}
|