Home | History | Annotate | Line # | Download | only in mm
      1 /*	$NetBSD: pool.c,v 1.1.1.2 2009/12/02 00:26:09 haad Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
      5  * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
      6  *
      7  * This file is part of the device-mapper userspace tools.
      8  *
      9  * This copyrighted material is made available to anyone wishing to use,
     10  * modify, copy, or redistribute it subject to the terms and conditions
     11  * of the GNU Lesser General Public License v.2.1.
     12  *
     13  * You should have received a copy of the GNU Lesser General Public License
     14  * along with this program; if not, write to the Free Software Foundation,
     15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     16  */
     17 
     18 #include "dmlib.h"
     19 
     20 /* FIXME: thread unsafe */
     21 static DM_LIST_INIT(_dm_pools);
     22 void dm_pools_check_leaks(void);
     23 
     24 #ifdef DEBUG_POOL
     25 #include "pool-debug.c"
     26 #else
     27 #include "pool-fast.c"
     28 #endif
     29 
     30 char *dm_pool_strdup(struct dm_pool *p, const char *str)
     31 {
     32 	char *ret = dm_pool_alloc(p, strlen(str) + 1);
     33 
     34 	if (ret)
     35 		strcpy(ret, str);
     36 
     37 	return ret;
     38 }
     39 
     40 char *dm_pool_strndup(struct dm_pool *p, const char *str, size_t n)
     41 {
     42 	char *ret = dm_pool_alloc(p, n + 1);
     43 
     44 	if (ret) {
     45 		strncpy(ret, str, n);
     46 		ret[n] = '\0';
     47 	}
     48 
     49 	return ret;
     50 }
     51 
     52 void *dm_pool_zalloc(struct dm_pool *p, size_t s)
     53 {
     54 	void *ptr = dm_pool_alloc(p, s);
     55 
     56 	if (ptr)
     57 		memset(ptr, 0, s);
     58 
     59 	return ptr;
     60 }
     61 
     62 void dm_pools_check_leaks(void)
     63 {
     64 	struct dm_pool *p;
     65 
     66 	if (dm_list_empty(&_dm_pools))
     67 		return;
     68 
     69 	log_error("You have a memory leak (not released memory pool):");
     70 	dm_list_iterate_items(p, &_dm_pools) {
     71 #ifdef DEBUG_POOL
     72 		log_error(" [%p] %s (%u bytes)",
     73 			  p->orig_pool,
     74 			  p->name, p->stats.bytes);
     75 #else
     76 		log_error(" [%p]", p);
     77 #endif
     78 	}
     79 }
     80