summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_kobj.c
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2000-08-28 21:11:12 +0000
committerdfr <dfr@FreeBSD.org>2000-08-28 21:11:12 +0000
commit1e7cf75b9537431c6f21ffa6e98dcabcf07ef8b4 (patch)
tree73de949ba43636bf05256d30b9aefca8f682c067 /sys/kern/subr_kobj.c
parentd704f8b4162aee315f87d506fbf1d74f1ccdc1d6 (diff)
downloadFreeBSD-src-1e7cf75b9537431c6f21ffa6e98dcabcf07ef8b4.zip
FreeBSD-src-1e7cf75b9537431c6f21ffa6e98dcabcf07ef8b4.tar.gz
Add kobj_class_compile_static() to allow classes to be initialised
statically (i.e. without calling malloc). This allows kobj to be used very early in the boot sequence.
Diffstat (limited to 'sys/kern/subr_kobj.c')
-rw-r--r--sys/kern/subr_kobj.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/sys/kern/subr_kobj.c b/sys/kern/subr_kobj.c
index 6b95eb9..2f3e60f 100644
--- a/sys/kern/subr_kobj.c
+++ b/sys/kern/subr_kobj.c
@@ -77,10 +77,9 @@ kobj_unregister_method(struct kobjop_desc *desc)
{
}
-void
-kobj_class_compile(kobj_class_t cls)
+static void
+kobj_class_compile_common(kobj_class_t cls, kobj_ops_t ops)
{
- kobj_ops_t ops;
kobj_method_t *m;
int i;
@@ -97,17 +96,38 @@ kobj_class_compile(kobj_class_t cls)
kobj_register_method(m->desc);
/*
- * Then allocate the compiled op table.
+ * Then initialise the ops table.
*/
- ops = malloc(sizeof(struct kobj_ops), M_KOBJ, M_NOWAIT);
- if (!ops)
- panic("kobj_compile_methods: out of memory");
bzero(ops, sizeof(struct kobj_ops));
ops->cls = cls;
cls->ops = ops;
}
void
+kobj_class_compile(kobj_class_t cls)
+{
+ kobj_ops_t ops;
+
+ /*
+ * Allocate space for the compiled ops table.
+ */
+ ops = malloc(sizeof(struct kobj_ops), M_KOBJ, M_NOWAIT);
+ if (!ops)
+ panic("kobj_compile_methods: out of memory");
+ kobj_class_compile_common(cls, ops);
+}
+
+void
+kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops)
+{
+ /*
+ * Increment refs to make sure that the ops table is not freed.
+ */
+ cls->refs++;
+ kobj_class_compile_common(cls, ops);
+}
+
+void
kobj_lookup_method(kobj_method_t *methods,
kobj_method_t *ce,
kobjop_desc_t desc)
OpenPOWER on IntegriCloud