void* linearMemAlign(size_t size, size_t alignment) { // Enforce minimum alignment if (alignment < 16) alignment = 16; // Convert alignment to shift amount int shift; for (shift = 4; shift < 32; shift ++) { if ((1U<<shift) == alignment) break; } if (shift == 32) // Invalid alignment return nullptr; // Initialize the pool if it is not ready if (!sLinearPool.Ready() && !linearInit()) return nullptr; // Allocate the chunk MemChunk chunk; if (!sLinearPool.Allocate(chunk, size, shift)) return nullptr; auto node = newNode(chunk); if (!node) { sLinearPool.Deallocate(chunk); return nullptr; } if (rbtree_insert(&sAddrMap, &node->node)); return chunk.addr; }
void Set(MemPool &pool, void *lms, const std::vector<const Factor*> &context) { lmstate = lms; numWords = context.size(); lastWords = (const Factor**) pool.Allocate( sizeof(const Factor*) * numWords); for (size_t i = 0; i < numWords; ++i) { lastWords[i] = context[i]; } }
void Init(MemPool &pool, const Factor *factor) { lmstate = NULL; numWords = 1; lastWords = (const Factor**) pool.Allocate(sizeof(const Factor*)); lastWords[0] = factor; }