int dm_pool_grow_object(struct dm_pool *p, const void *extra, size_t delta) { struct chunk *c = p->chunk, *nc; if (!delta) delta = strlen(extra); if (c->end - (c->begin + p->object_len) < delta) { /* move into a new chunk */ if (p->object_len + delta > (p->chunk_size / 2)) nc = _new_chunk(p, (p->object_len + delta) * 2); else nc = _new_chunk(p, p->chunk_size); if (!nc) return 0; _align_chunk(p->chunk, p->object_alignment); memcpy(p->chunk->begin, c->begin, p->object_len); c = p->chunk; } memcpy(c->begin + p->object_len, extra, delta); p->object_len += delta; return 1; }
void *dm_pool_alloc_aligned(struct dm_pool *p, size_t s, unsigned alignment) { struct chunk *c = p->chunk; void *r; /* realign begin */ if (c) _align_chunk(c, alignment); /* have we got room ? */ if (!c || (c->begin > c->end) || (c->end - c->begin < s)) { /* allocate new chunk */ size_t needed = s + alignment + sizeof(struct chunk); c = _new_chunk(p, (needed > p->chunk_size) ? needed : p->chunk_size); if (!c) return NULL; _align_chunk(c, alignment); } r = c->begin; c->begin += s; #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_UNDEFINED(r, s); #endif return r; }
int dm_pool_begin_object(struct dm_pool *p, size_t hint) { struct chunk *c = p->chunk; const size_t align = DEFAULT_ALIGNMENT; p->object_len = 0; p->object_alignment = align; if (c) _align_chunk(c, align); if (!c || (c->begin > c->end) || (c->end - c->begin < hint)) { /* allocate a new chunk */ c = _new_chunk(p, hint > (p->chunk_size - sizeof(struct chunk)) ? hint + sizeof(struct chunk) + align : p->chunk_size); if (!c) return 0; _align_chunk(c, align); } return 1; }
int dm_pool_grow_object(struct dm_pool *p, const void *extra, size_t delta) { struct chunk *c = p->chunk, *nc; if (!delta) delta = strlen(extra); if (c->end - (c->begin + p->object_len) < delta) { /* move into a new chunk */ if (p->object_len + delta > (p->chunk_size / 2)) nc = _new_chunk(p, (p->object_len + delta) * 2); else nc = _new_chunk(p, p->chunk_size); if (!nc) return 0; _align_chunk(p->chunk, p->object_alignment); #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_UNDEFINED(p->chunk->begin, p->object_len); #endif memcpy(p->chunk->begin, c->begin, p->object_len); #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_NOACCESS(c->begin, p->object_len); #endif c = p->chunk; } #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_UNDEFINED(p->chunk->begin + p->object_len, delta); #endif memcpy(c->begin + p->object_len, extra, delta); p->object_len += delta; return 1; }