2005-10-16 18:33:22 +04:00
/*
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
* Copyright ( C ) 2004 - 2005 Red Hat , Inc . All rights reserved .
*
* This file is part of the device - mapper userspace tools .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-21 20:26:07 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2005-10-16 18:33:22 +04:00
*
2007-08-21 20:26:07 +04:00
* You should have received a copy of the GNU Lesser General Public License
2005-10-16 18:33:22 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2008-11-03 21:59:59 +03:00
# include "dmlib.h"
2009-04-10 13:56:58 +04:00
/* FIXME: thread unsafe */
static DM_LIST_INIT ( _dm_pools ) ;
void dm_pools_check_leaks ( void ) ;
2005-10-16 18:33:22 +04:00
# ifdef DEBUG_POOL
# include "pool-debug.c"
# else
# include "pool-fast.c"
# endif
2005-10-17 02:57:20 +04:00
char * dm_pool_strdup ( struct dm_pool * p , const char * str )
2005-10-16 18:33:22 +04:00
{
2011-03-30 16:57:03 +04:00
char * ret = dm_pool_alloc_aligned ( p , strlen ( str ) + 1 , 2 ) ;
2005-10-16 18:33:22 +04:00
if ( ret )
strcpy ( ret , str ) ;
return ret ;
}
2005-10-17 02:57:20 +04:00
char * dm_pool_strndup ( struct dm_pool * p , const char * str , size_t n )
2005-10-16 18:33:22 +04:00
{
2011-03-30 16:57:03 +04:00
char * ret = dm_pool_alloc_aligned ( p , n + 1 , 2 ) ;
2005-10-16 18:33:22 +04:00
if ( ret ) {
strncpy ( ret , str , n ) ;
ret [ n ] = ' \0 ' ;
}
return ret ;
}
2005-10-17 02:57:20 +04:00
void * dm_pool_zalloc ( struct dm_pool * p , size_t s )
2005-10-16 18:33:22 +04:00
{
2005-10-17 02:57:20 +04:00
void * ptr = dm_pool_alloc ( p , s ) ;
2005-10-16 18:33:22 +04:00
if ( ptr )
memset ( ptr , 0 , s ) ;
return ptr ;
}
2009-04-10 13:56:58 +04:00
void dm_pools_check_leaks ( void )
{
struct dm_pool * p ;
if ( dm_list_empty ( & _dm_pools ) )
return ;
log_error ( " You have a memory leak (not released memory pool): " ) ;
dm_list_iterate_items ( p , & _dm_pools ) {
# ifdef DEBUG_POOL
log_error ( " [%p] %s (%u bytes) " ,
p - > orig_pool ,
p - > name , p - > stats . bytes ) ;
# else
2011-03-10 17:49:01 +03:00
log_error ( " [%p] %s " , p , p - > name ) ;
2009-04-10 13:56:58 +04:00
# endif
}
}