setupFullMultiConfs: return smart ptr

This commit is contained in:
Justin Viiret 2016-03-01 16:35:09 +11:00 committed by Matthew Barr
parent 9953a026f8
commit aebbd4f169
4 changed files with 16 additions and 20 deletions

View File

@ -145,9 +145,7 @@ aligned_unique_ptr<FDR> FDRCompiler::setupFDR(pair<u8 *, size_t> link) {
size_t tabSize = eng.getTabSizeBytes(); size_t tabSize = eng.getTabSizeBytes();
auto floodControlTmp = setupFDRFloodControl(lits, eng); auto floodControlTmp = setupFDRFloodControl(lits, eng);
auto confirmTmp = setupFullMultiConfs(lits, eng, bucketToLits, make_small);
pair<u8 *, size_t> confirmTmp =
setupFullMultiConfs(lits, eng, bucketToLits, make_small);
assert(ISALIGNED_16(tabSize)); assert(ISALIGNED_16(tabSize));
assert(ISALIGNED_16(confirmTmp.second)); assert(ISALIGNED_16(confirmTmp.second));
@ -175,9 +173,8 @@ aligned_unique_ptr<FDR> FDRCompiler::setupFDR(pair<u8 *, size_t> link) {
copy(tab.begin(), tab.end(), ptr); copy(tab.begin(), tab.end(), ptr);
ptr += tabSize; ptr += tabSize;
memcpy(ptr, confirmTmp.first, confirmTmp.second); memcpy(ptr, confirmTmp.first.get(), confirmTmp.second);
ptr += confirmTmp.second; ptr += confirmTmp.second;
aligned_free(confirmTmp.first);
fdr->floodOffset = verify_u32(ptr - fdr_base); fdr->floodOffset = verify_u32(ptr - fdr_base);
memcpy(ptr, floodControlTmp.first.get(), floodControlTmp.second); memcpy(ptr, floodControlTmp.first.get(), floodControlTmp.second);

View File

@ -57,7 +57,7 @@ class EngineDescription;
class FDREngineDescription; class FDREngineDescription;
struct hwlmStreamingControl; struct hwlmStreamingControl;
std::pair<u8 *, size_t> setupFullMultiConfs( std::pair<aligned_unique_ptr<u8>, size_t> setupFullMultiConfs(
const std::vector<hwlmLiteral> &lits, const EngineDescription &eng, const std::vector<hwlmLiteral> &lits, const EngineDescription &eng,
std::map<BucketIndex, std::vector<LiteralIndex>> &bucketToLits, std::map<BucketIndex, std::vector<LiteralIndex>> &bucketToLits,
bool make_small); bool make_small);

View File

@ -435,7 +435,8 @@ u32 setupMultiConfirms(const vector<hwlmLiteral> &lits,
return totalConfirmSize; return totalConfirmSize;
} }
pair<u8 *, size_t> setupFullMultiConfs(const vector<hwlmLiteral> &lits, pair<aligned_unique_ptr<u8>, size_t>
setupFullMultiConfs(const vector<hwlmLiteral> &lits,
const EngineDescription &eng, const EngineDescription &eng,
map<BucketIndex, vector<LiteralIndex>> &bucketToLits, map<BucketIndex, vector<LiteralIndex>> &bucketToLits,
bool make_small) { bool make_small) {
@ -448,24 +449,24 @@ pair<u8 *, size_t> setupFullMultiConfs(const vector<hwlmLiteral> &lits,
u32 totalConfSwitchSize = primarySwitch * nBuckets * sizeof(u32); u32 totalConfSwitchSize = primarySwitch * nBuckets * sizeof(u32);
u32 totalSize = ROUNDUP_16(totalConfSwitchSize + totalConfirmSize); u32 totalSize = ROUNDUP_16(totalConfSwitchSize + totalConfirmSize);
u8 *buf = (u8 *)aligned_zmalloc(totalSize); auto buf = aligned_zmalloc_unique<u8>(totalSize);
assert(buf); // otherwise would have thrown std::bad_alloc assert(buf); // otherwise would have thrown std::bad_alloc
u32 *confBase = (u32 *)buf; u32 *confBase = (u32 *)buf.get();
u8 *ptr = buf + totalConfSwitchSize; u8 *ptr = buf.get() + totalConfSwitchSize;
for (const auto &m : bc2Conf) { for (const auto &m : bc2Conf) {
const BucketIndex &b = m.first.first; const BucketIndex &b = m.first.first;
const u8 &c = m.first.second; const u8 &c = m.first.second;
const pair<aligned_unique_ptr<FDRConfirm>, size_t> &p = m.second; const pair<aligned_unique_ptr<FDRConfirm>, size_t> &p = m.second;
// confirm offset is relative to the base of this structure, now // confirm offset is relative to the base of this structure, now
u32 confirm_offset = verify_u32(ptr - (u8 *)buf); u32 confirm_offset = verify_u32(ptr - buf.get());
memcpy(ptr, p.first.get(), p.second); memcpy(ptr, p.first.get(), p.second);
ptr += p.second; ptr += p.second;
u32 idx = c * nBuckets + b; u32 idx = c * nBuckets + b;
confBase[idx] = confirm_offset; confBase[idx] = confirm_offset;
} }
return make_pair(buf, totalSize); return make_pair(move(buf), totalSize);
} }
} // namespace ue2 } // namespace ue2

View File

@ -315,8 +315,7 @@ aligned_unique_ptr<FDR> TeddyCompiler::build(pair<u8 *, size_t> link) {
size_t maskLen = eng.numMasks * 16 * 2 * maskWidth; size_t maskLen = eng.numMasks * 16 * 2 * maskWidth;
auto floodControlTmp = setupFDRFloodControl(lits, eng); auto floodControlTmp = setupFDRFloodControl(lits, eng);
pair<u8 *, size_t> confirmTmp auto confirmTmp = setupFullMultiConfs(lits, eng, bucketToLits, make_small);
= setupFullMultiConfs(lits, eng, bucketToLits, make_small);
size_t size = ROUNDUP_N(sizeof(Teddy) + size_t size = ROUNDUP_N(sizeof(Teddy) +
maskLen + maskLen +
@ -334,9 +333,8 @@ aligned_unique_ptr<FDR> TeddyCompiler::build(pair<u8 *, size_t> link) {
teddy->maxStringLen = verify_u32(maxLen(lits)); teddy->maxStringLen = verify_u32(maxLen(lits));
u8 *ptr = teddy_base + sizeof(Teddy) + maskLen; u8 *ptr = teddy_base + sizeof(Teddy) + maskLen;
memcpy(ptr, confirmTmp.first, confirmTmp.second); memcpy(ptr, confirmTmp.first.get(), confirmTmp.second);
ptr += confirmTmp.second; ptr += confirmTmp.second;
aligned_free(confirmTmp.first);
teddy->floodOffset = verify_u32(ptr - teddy_base); teddy->floodOffset = verify_u32(ptr - teddy_base);
memcpy(ptr, floodControlTmp.first.get(), floodControlTmp.second); memcpy(ptr, floodControlTmp.first.get(), floodControlTmp.second);