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
  *

Reply via email to