X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Fmempool.h;h=f566b79cd2a5fb1e4cf3e285b23af81b01ba8532;hb=021f9175774cb99755d692ca7e0e7a7e576a89e2;hp=bad5131593756f020f60e6423f0fe0058ab4e746;hpb=17307e8b3b7e44ee4373b182e63e78b54d0d08c2;p=libucw.git diff --git a/ucw/mempool.h b/ucw/mempool.h index bad51315..f566b79c 100644 --- a/ucw/mempool.h +++ b/ucw/mempool.h @@ -19,14 +19,19 @@ /** * Memory pool state (see @mp_push(), ...). - ***/ + * You should use this one as an opaque handle only, the insides are internal. + **/ struct mempool_state { uns free[2]; void *last[2]; struct mempool_state *next; }; -struct mempool { /** Memory pool. **/ +/** + * Memory pool. + * You should use this one as an opaque handle only, the insides are internal. + **/ +struct mempool { struct mempool_state state; void *unused, *last_big; uns chunk_size, threshold, idx; @@ -68,7 +73,7 @@ struct mempool *mp_new(uns chunk_size); void mp_delete(struct mempool *pool); /** - * Free all data on a memory pool, but leaves it working. + * Frees all data on a memory pool, but leaves it working. * It can keep some of the chunks allocated to serve * further allocation requests. Leaves the @pool alive, * even if it was created with @mp_new(). @@ -350,6 +355,20 @@ struct mempool_state *mp_push(struct mempool *pool); **/ void mp_restore(struct mempool *pool, struct mempool_state *state); +/** + * Inlined version of @mp_restore(). + **/ +static inline void mp_restore_fast(struct mempool *pool, struct mempool_state *state) +{ + if (pool->state.last[0] != state->last[0] || pool->state.last[1] != state->last[1]) + mp_restore(pool, state); + else + { + pool->state = *state; + pool->last_big = &pool->last_big; + } +} + /** * Restore the state saved by the last call to @mp_push(). * @mp_pop() and @mp_push() works as a stack so you can push more states safely. @@ -402,11 +421,11 @@ char *mp_printf(struct mempool *mp, const char *fmt, ...) FORMAT_CHECK(printf,2, **/ char *mp_vprintf(struct mempool *mp, const char *fmt, va_list args) LIKE_MALLOC; /** - * Like @mp_printf(), but it appends the data at the end of memory - * block pointed to by @ptr. The block is @mp_open()ed, so you have to + * Like @mp_printf(), but it appends the data at the end of string + * pointed to by @ptr. The string is @mp_open()ed, so you have to * provide something that can be. * - * Returns pointer to the beginning of the block (the pointer may have + * Returns pointer to the beginning of the string (the pointer may have * changed due to reallocation). **/ char *mp_printf_append(struct mempool *mp, char *ptr, const char *fmt, ...) FORMAT_CHECK(printf,3,4);