aligned_unique_ptr<FDR> FDRCompiler::setupFDR(pair<u8 *, size_t> link) {
size_t tabSize = eng.getTabSizeBytes();
- pair<u8 *, size_t> floodControlTmp = setupFDRFloodControl(lits, eng);
+ auto floodControlTmp = setupFDRFloodControl(lits, eng);
pair<u8 *, size_t> confirmTmp =
setupFullMultiConfs(lits, eng, bucketToLits, make_small);
aligned_free(confirmTmp.first);
fdr->floodOffset = verify_u32(ptr - fdr_base);
- memcpy(ptr, floodControlTmp.first, floodControlTmp.second);
+ memcpy(ptr, floodControlTmp.first.get(), floodControlTmp.second);
ptr += floodControlTmp.second;
- aligned_free(floodControlTmp.first);
/* we are allowing domains 9 to 15 only */
assert(eng.bits > 8 && eng.bits < 16);
#include "ue2common.h"
#include "hwlm/hwlm_literal.h"
+#include "util/alloc.h"
#include <map>
#include <utility>
// we always read a full-scale flood "behind" us in terms of what's in our
// state; if we don't have a flood that's long enough we won't be in the
// right state yet to allow blindly advancing
-std::pair<u8 *, size_t>
+std::pair<aligned_unique_ptr<u8>, size_t>
setupFDRFloodControl(const std::vector<hwlmLiteral> &lits,
const EngineDescription &eng);
}
}
-pair<u8 *, size_t> setupFDRFloodControl(const vector<hwlmLiteral> &lits,
- const EngineDescription &eng) {
+pair<aligned_unique_ptr<u8>, size_t>
+setupFDRFloodControl(const vector<hwlmLiteral> &lits,
+ const EngineDescription &eng) {
vector<FDRFlood> tmpFlood(N_CHARS);
u32 default_suffix = eng.getDefaultFloodSuffixLength();
size_t floodHeaderSize = sizeof(u32) * N_CHARS;
size_t floodStructSize = sizeof(FDRFlood) * nDistinctFloods;
size_t totalSize = ROUNDUP_16(floodHeaderSize + floodStructSize);
- u8 *buf = (u8 *)aligned_zmalloc(totalSize);
+
+ auto buf = aligned_zmalloc_unique<u8>(totalSize);
assert(buf); // otherwise would have thrown std::bad_alloc
- u32 *floodHeader = (u32 *)buf;
- FDRFlood *layoutFlood = (FDRFlood * )(buf + floodHeaderSize);
+ u32 *floodHeader = (u32 *)buf.get();
+ FDRFlood *layoutFlood = (FDRFlood *)(buf.get() + floodHeaderSize);
u32 currentFloodIndex = 0;
for (const auto &m : flood2chars) {
DEBUG_PRINTF("made a flood structure with %zu + %zu = %zu\n",
floodHeaderSize, floodStructSize, totalSize);
- return make_pair((u8 *)buf, totalSize);
+ return make_pair(move(buf), totalSize);
}
} // namespace ue2
size_t maskLen = eng.numMasks * 16 * 2 * maskWidth;
- pair<u8 *, size_t> floodControlTmp = setupFDRFloodControl(lits, eng);
+ auto floodControlTmp = setupFDRFloodControl(lits, eng);
pair<u8 *, size_t> confirmTmp
= setupFullMultiConfs(lits, eng, bucketToLits, make_small);
aligned_free(confirmTmp.first);
teddy->floodOffset = verify_u32(ptr - teddy_base);
- memcpy(ptr, floodControlTmp.first, floodControlTmp.second);
+ memcpy(ptr, floodControlTmp.first.get(), floodControlTmp.second);
ptr += floodControlTmp.second;
- aligned_free(floodControlTmp.first);
if (link.first) {
teddy->link = verify_u32(ptr - teddy_base);