Module Name: src
Committed By: pooka
Date: Mon Apr 12 22:15:32 UTC 2010
Modified Files:
src/sys/conf: files
src/sys/kern: kern_lwp.c
src/sys/sys: lwp.h
Added Files:
src/sys/kern: subr_lwp_specificdata.c
Log Message:
Separate lwp specificdata data structure management from lwp cpu/vm
management.
No functional change.
(specificdata routines went from kern_lwp.c to subr_lwp_specificdata.c)
To generate a diff of this commit:
cvs rdiff -u -r1.985 -r1.986 src/sys/conf/files
cvs rdiff -u -r1.143 -r1.144 src/sys/kern/kern_lwp.c
cvs rdiff -u -r0 -r1.1 src/sys/kern/subr_lwp_specificdata.c
cvs rdiff -u -r1.129 -r1.130 src/sys/sys/lwp.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/conf/files
diff -u src/sys/conf/files:1.985 src/sys/conf/files:1.986
--- src/sys/conf/files:1.985 Fri Apr 9 10:09:49 2010
+++ src/sys/conf/files Mon Apr 12 22:15:32 2010
@@ -1,4 +1,4 @@
-# $NetBSD: files,v 1.985 2010/04/09 10:09:49 nonaka Exp $
+# $NetBSD: files,v 1.986 2010/04/12 22:15:32 pooka Exp $
# @(#)files.newconf 7.5 (Berkeley) 5/10/93
version 20090313
@@ -1510,6 +1510,7 @@
file kern/subr_kobj_vfs.c
file kern/subr_lockdebug.c
file kern/subr_log.c
+file kern/subr_lwp_specificdata.c
file kern/subr_once.c
file kern/subr_optstr.c
file kern/subr_percpu.c
Index: src/sys/kern/kern_lwp.c
diff -u src/sys/kern/kern_lwp.c:1.143 src/sys/kern/kern_lwp.c:1.144
--- src/sys/kern/kern_lwp.c:1.143 Fri Apr 9 11:47:17 2010
+++ src/sys/kern/kern_lwp.c Mon Apr 12 22:15:31 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_lwp.c,v 1.143 2010/04/09 11:47:17 njoly Exp $ */
+/* $NetBSD: kern_lwp.c,v 1.144 2010/04/12 22:15:31 pooka Exp $ */
/*-
* Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -209,7 +209,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.143 2010/04/09 11:47:17 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.144 2010/04/12 22:15:31 pooka Exp $");
#include "opt_ddb.h"
#include "opt_lockdebug.h"
@@ -247,7 +247,6 @@
struct pool lwp_uc_pool;
static pool_cache_t lwp_cache;
-static specificdata_domain_t lwp_specificdata_domain;
/* DTrace proc provider probes */
SDT_PROBE_DEFINE(proc,,,lwp_create,
@@ -269,8 +268,7 @@
pool_init(&lwp_uc_pool, sizeof(ucontext_t), 0, 0, 0, "lwpucpl",
&pool_allocator_nointr, IPL_NONE);
- lwp_specificdata_domain = specificdata_domain_create();
- KASSERT(lwp_specificdata_domain != NULL);
+ lwpinit_specificdata();
lwp_sys_init();
lwp_cache = pool_cache_init(sizeof(lwp_t), MIN_LWP_ALIGNMENT, 0, 0,
"lwppl", NULL, IPL_NONE, NULL, NULL, NULL);
@@ -829,7 +827,7 @@
fd_free();
/* Delete the specificdata while it's still safe to sleep. */
- specificdata_fini(lwp_specificdata_domain, &l->l_specdataref);
+ lwp_finispecific(l)
/*
* Release our cached credentials.
@@ -1513,91 +1511,6 @@
}
/*
- * lwp_specific_key_create --
- * Create a key for subsystem lwp-specific data.
- */
-int
-lwp_specific_key_create(specificdata_key_t *keyp, specificdata_dtor_t dtor)
-{
-
- return (specificdata_key_create(lwp_specificdata_domain, keyp, dtor));
-}
-
-/*
- * lwp_specific_key_delete --
- * Delete a key for subsystem lwp-specific data.
- */
-void
-lwp_specific_key_delete(specificdata_key_t key)
-{
-
- specificdata_key_delete(lwp_specificdata_domain, key);
-}
-
-/*
- * lwp_initspecific --
- * Initialize an LWP's specificdata container.
- */
-void
-lwp_initspecific(struct lwp *l)
-{
- int error;
-
- error = specificdata_init(lwp_specificdata_domain, &l->l_specdataref);
- KASSERT(error == 0);
-}
-
-/*
- * lwp_finispecific --
- * Finalize an LWP's specificdata container.
- */
-void
-lwp_finispecific(struct lwp *l)
-{
-
- specificdata_fini(lwp_specificdata_domain, &l->l_specdataref);
-}
-
-/*
- * lwp_getspecific --
- * Return lwp-specific data corresponding to the specified key.
- *
- * Note: LWP specific data is NOT INTERLOCKED. An LWP should access
- * only its OWN SPECIFIC DATA. If it is necessary to access another
- * LWP's specifc data, care must be taken to ensure that doing so
- * would not cause internal data structure inconsistency (i.e. caller
- * can guarantee that the target LWP is not inside an lwp_getspecific()
- * or lwp_setspecific() call).
- */
-void *
-lwp_getspecific(specificdata_key_t key)
-{
-
- return (specificdata_getspecific_unlocked(lwp_specificdata_domain,
- &curlwp->l_specdataref, key));
-}
-
-void *
-_lwp_getspecific_by_lwp(struct lwp *l, specificdata_key_t key)
-{
-
- return (specificdata_getspecific_unlocked(lwp_specificdata_domain,
- &l->l_specdataref, key));
-}
-
-/*
- * lwp_setspecific --
- * Set lwp-specific data corresponding to the specified key.
- */
-void
-lwp_setspecific(specificdata_key_t key, void *data)
-{
-
- specificdata_setspecific(lwp_specificdata_domain,
- &curlwp->l_specdataref, key, data);
-}
-
-/*
* Allocate a new lwpctl structure for a user LWP.
*/
int
Index: src/sys/sys/lwp.h
diff -u src/sys/sys/lwp.h:1.129 src/sys/sys/lwp.h:1.130
--- src/sys/sys/lwp.h:1.129 Tue Apr 6 13:50:22 2010
+++ src/sys/sys/lwp.h Mon Apr 12 22:15:31 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: lwp.h,v 1.129 2010/04/06 13:50:22 christos Exp $ */
+/* $NetBSD: lwp.h,v 1.130 2010/04/12 22:15:31 pooka Exp $ */
/*-
* Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -327,6 +327,7 @@
void lwp_unsleep(lwp_t *, bool);
uint64_t lwp_pctr(void);
+void lwpinit_specificdata(void);
int lwp_specific_key_create(specificdata_key_t *, specificdata_dtor_t);
void lwp_specific_key_delete(specificdata_key_t);
void lwp_initspecific(lwp_t *);
Added files:
Index: src/sys/kern/subr_lwp_specificdata.c
diff -u /dev/null src/sys/kern/subr_lwp_specificdata.c:1.1
--- /dev/null Mon Apr 12 22:15:32 2010
+++ src/sys/kern/subr_lwp_specificdata.c Mon Apr 12 22:15:31 2010
@@ -0,0 +1,131 @@
+/* $NetBSD: subr_lwp_specificdata.c,v 1.1 2010/04/12 22:15:31 pooka Exp $ */
+
+/*-
+ * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define _LWP_API_PRIVATE
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: subr_lwp_specificdata.c,v 1.1 2010/04/12 22:15:31 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/lwp.h>
+#include <sys/specificdata.h>
+
+static specificdata_domain_t lwp_specificdata_domain;
+
+void
+lwpinit_specificdata()
+{
+
+ lwp_specificdata_domain = specificdata_domain_create();
+ KASSERT(lwp_specificdata_domain != NULL);
+}
+
+/*
+ * lwp_specific_key_create --
+ * Create a key for subsystem lwp-specific data.
+ */
+int
+lwp_specific_key_create(specificdata_key_t *keyp, specificdata_dtor_t dtor)
+{
+
+ return (specificdata_key_create(lwp_specificdata_domain, keyp, dtor));
+}
+
+/*
+ * lwp_specific_key_delete --
+ * Delete a key for subsystem lwp-specific data.
+ */
+void
+lwp_specific_key_delete(specificdata_key_t key)
+{
+
+ specificdata_key_delete(lwp_specificdata_domain, key);
+}
+
+/*
+ * lwp_initspecific --
+ * Initialize an LWP's specificdata container.
+ */
+void
+lwp_initspecific(struct lwp *l)
+{
+ int error;
+
+ error = specificdata_init(lwp_specificdata_domain, &l->l_specdataref);
+ KASSERT(error == 0);
+}
+
+/*
+ * lwp_finispecific --
+ * Finalize an LWP's specificdata container.
+ */
+void
+lwp_finispecific(struct lwp *l)
+{
+
+ specificdata_fini(lwp_specificdata_domain, &l->l_specdataref);
+}
+
+/*
+ * lwp_getspecific --
+ * Return lwp-specific data corresponding to the specified key.
+ *
+ * Note: LWP specific data is NOT INTERLOCKED. An LWP should access
+ * only its OWN SPECIFIC DATA. If it is necessary to access another
+ * LWP's specifc data, care must be taken to ensure that doing so
+ * would not cause internal data structure inconsistency (i.e. caller
+ * can guarantee that the target LWP is not inside an lwp_getspecific()
+ * or lwp_setspecific() call).
+ */
+void *
+lwp_getspecific(specificdata_key_t key)
+{
+
+ return (specificdata_getspecific_unlocked(lwp_specificdata_domain,
+ &curlwp->l_specdataref, key));
+}
+
+void *
+_lwp_getspecific_by_lwp(struct lwp *l, specificdata_key_t key)
+{
+
+ return (specificdata_getspecific_unlocked(lwp_specificdata_domain,
+ &l->l_specdataref, key));
+}
+
+/*
+ * lwp_setspecific --
+ * Set lwp-specific data corresponding to the specified key.
+ */
+void
+lwp_setspecific(specificdata_key_t key, void *data)
+{
+
+ specificdata_setspecific(lwp_specificdata_domain,
+ &curlwp->l_specdataref, key, data);
+}