Module Name: src Committed By: haad Date: Thu Feb 11 23:13:46 UTC 2010
Modified Files: src/share/man/man9: kmem.9 src/sys/kern: subr_kmem.c src/sys/sys: kmem.h Log Message: Add kmem_asprintf rotuine which allocates string accordingly to format string from kmem pool. Allocated string is string length + 1 char for ending zero. Ok: a...@. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/share/man/man9/kmem.9 cvs rdiff -u -r1.32 -r1.33 src/sys/kern/subr_kmem.c cvs rdiff -u -r1.3 -r1.4 src/sys/sys/kmem.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/share/man/man9/kmem.9 diff -u src/share/man/man9/kmem.9:1.4 src/share/man/man9/kmem.9:1.5 --- src/share/man/man9/kmem.9:1.4 Sat Jan 23 00:54:43 2010 +++ src/share/man/man9/kmem.9 Thu Feb 11 23:13:46 2010 @@ -1,4 +1,4 @@ -.\" $NetBSD: kmem.9,v 1.4 2010/01/23 00:54:43 rmind Exp $ +.\" $NetBSD: kmem.9,v 1.5 2010/02/11 23:13:46 haad Exp $ .\" .\" Copyright (c)2006 YAMAMOTO Takashi, .\" All rights reserved. @@ -45,6 +45,9 @@ .Ft void .Fn kmem_free \ "void *p" "size_t size" +.Ft char * +.Fn kmem_asprintf \ +"const char *fmt" "..." .\" ------------------------------------------------------------ .Pp .Cd "options DEBUG" @@ -93,6 +96,16 @@ except that it initializes the memory to zero. .Pp .\" ------------------------------------------------------------ +.Fn kmem_asprintf +functions as the well known +.Fn asprintf +function, but allocates memory using +.Fn kmem_alloc . +This routine can sleep during allocation. +The size of the allocated area is the length of the returned character string, plus one (for the NUL terminator). +This must be taken into consideration when freeing the returned area with +.Fn kmem_free . +.\" ------------------------------------------------------------ .Fn kmem_free frees kernel wired memory allocated by .Fn kmem_alloc Index: src/sys/kern/subr_kmem.c diff -u src/sys/kern/subr_kmem.c:1.32 src/sys/kern/subr_kmem.c:1.33 --- src/sys/kern/subr_kmem.c:1.32 Sun Jan 31 11:54:32 2010 +++ src/sys/kern/subr_kmem.c Thu Feb 11 23:13:46 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kmem.c,v 1.32 2010/01/31 11:54:32 skrll Exp $ */ +/* $NetBSD: subr_kmem.c,v 1.33 2010/02/11 23:13:46 haad Exp $ */ /*- * Copyright (c) 2009 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_kmem.c,v 1.32 2010/01/31 11:54:32 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kmem.c,v 1.33 2010/02/11 23:13:46 haad Exp $"); #include <sys/param.h> #include <sys/callback.h> @@ -79,6 +79,8 @@ #include <lib/libkern/libkern.h> +#include <machine/stdarg.h> + #define KMEM_QUANTUM_SIZE (ALIGNBYTES + 1) #define KMEM_QCACHE_MAX (KMEM_QUANTUM_SIZE * 32) #define KMEM_CACHE_COUNT 16 @@ -456,3 +458,28 @@ } } #endif /* defined(KMEM_SIZE) */ + +/* + * Used to dynamically allocate string with kmem accordingly to format. + */ +char * +kmem_asprintf(const char *fmt, ...) +{ + int size, str_len; + va_list va; + char *str; + char buf[1]; + + va_start(va, fmt); + str_len = vsnprintf(buf, sizeof(buf), fmt, va) + 1; + va_end(va); + + str = kmem_alloc(str_len, KM_SLEEP); + + if ((size = vsnprintf(str, str_len, fmt, va)) == -1) { + kmem_free(str, str_len); + return NULL; + } + + return str; +} Index: src/sys/sys/kmem.h diff -u src/sys/sys/kmem.h:1.3 src/sys/sys/kmem.h:1.4 --- src/sys/sys/kmem.h:1.3 Mon Dec 24 16:45:16 2007 +++ src/sys/sys/kmem.h Thu Feb 11 23:13:46 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: kmem.h,v 1.3 2007/12/24 16:45:16 ad Exp $ */ +/* $NetBSD: kmem.h,v 1.4 2010/02/11 23:13:46 haad Exp $ */ /*- * Copyright (c)2006 YAMAMOTO Takashi, @@ -39,6 +39,7 @@ void kmem_init(void); size_t kmem_roundup_size(size_t); +char *kmem_asprintf(const char *, ...); /* * km_flag_t *