2001-08-21 16:56:08 +04:00
/*
2001-10-04 14:13:07 +04:00
* Copyright ( C ) 2001 Sistina Software ( UK ) Limited .
2001-08-21 16:56:08 +04:00
*
2001-10-04 14:13:07 +04:00
* This file is released under the GPL .
2001-08-21 16:56:08 +04:00
*/
2001-09-25 16:49:28 +04:00
# ifndef _LVM_POOL_H
# define _LVM_POOL_H
2001-08-21 16:56:08 +04:00
2001-11-15 14:46:00 +03:00
# include <string.h>
2001-08-21 16:56:08 +04:00
# include <stdlib.h>
struct pool ;
/* constructor and destructor */
2001-10-04 14:13:07 +04:00
struct pool * pool_create ( size_t chunk_hint ) ;
void pool_destroy ( struct pool * p ) ;
2001-08-21 16:56:08 +04:00
/* simple allocation/free routines */
void * pool_alloc ( struct pool * p , size_t s ) ;
void * pool_alloc_aligned ( struct pool * p , size_t s , unsigned alignment ) ;
2001-10-12 14:32:06 +04:00
void pool_empty ( struct pool * p ) ;
2001-08-21 16:56:08 +04:00
void pool_free ( struct pool * p , void * ptr ) ;
2001-12-13 19:09:06 +03:00
/*
* Object building routines :
*
* These allow you to ' grow ' an object , useful for
* building strings , or filling in dynamic
* arrays .
*
* It ' s probably best explained with an example :
*
* char * build_string ( struct pool * mem )
* {
* int i ;
* char buffer [ 16 ] ;
*
* if ( ! pool_begin_object ( mem , 128 ) )
* return NULL ;
*
* for ( i = 0 ; i < 50 ; i + + ) {
* snprintf ( buffer , sizeof ( buffer ) , " %d, " , i ) ;
* if ( ! pool_grow_object ( mem , buffer , strlen ( buffer ) ) )
* goto bad ;
* }
*
* // add null
* if ( ! pool_grow_object ( mem , " \0 " , 1 ) )
* goto bad ;
*
* return pool_end_object ( mem ) ;
*
* bad :
*
* pool_abandon_object ( mem ) ;
* return NULL ;
* }
*
* So start an object by calling pool_begin_object
* with a guess at the final object size - if in
* doubt make the guess too small .
*
* Then append chunks of data to your object with
* pool_grow_object . Finally get your object with
* a call to pool_end_object .
*
*/
void * pool_begin_object ( struct pool * p , size_t hint ) ;
void * pool_grow_object ( struct pool * p , void * extra , size_t delta ) ;
2001-08-21 16:56:08 +04:00
void * pool_end_object ( struct pool * p ) ;
void pool_abandon_object ( struct pool * p ) ;
/* utilities */
char * pool_strdup ( struct pool * p , const char * str ) ;
static inline void * pool_zalloc ( struct pool * p , size_t s ) {
void * ptr = pool_alloc ( p , s ) ;
if ( ptr )
memset ( ptr , 0 , s ) ;
return ptr ;
}
# endif