Page MenuHomeFreeBSD

D48449.id149193.diff
No OneTemporary

D48449.id149193.diff

diff --git a/sys/sys/kobj.h b/sys/sys/kobj.h
--- a/sys/sys/kobj.h
+++ b/sys/sys/kobj.h
@@ -131,14 +131,8 @@
* DEFINE_CLASS_1(foo, foo_class, foo_methods, sizeof(foo_softc),
* bar);
*/
-#define DEFINE_CLASS_1(name, classvar, methods, size, \
- base1) \
- \
-static kobj_class_t name ## _baseclasses[] = \
- { &base1, NULL }; \
-struct kobj_class classvar = { \
- #name, methods, size, name ## _baseclasses \
-}
+#define DEFINE_CLASS_1(name, classvar, methods, size, base1) \
+ DEFINE_CLASSN(name, classvar, methods, size, base1)
/*
* Define a class inheriting two base classes. Use like this:
@@ -146,15 +140,8 @@
* DEFINE_CLASS_2(foo, foo_class, foo_methods, sizeof(foo_softc),
* bar, baz);
*/
-#define DEFINE_CLASS_2(name, classvar, methods, size, \
- base1, base2) \
- \
-static kobj_class_t name ## _baseclasses[] = \
- { &base1, \
- &base2, NULL }; \
-struct kobj_class classvar = { \
- #name, methods, size, name ## _baseclasses \
-}
+#define DEFINE_CLASS_2(name, classvar, methods, size, base1, base2) \
+ DEFINE_CLASSN(name, classvar, methods, size, base1, base2)
/*
* Define a class inheriting three base classes. Use like this:
@@ -162,17 +149,62 @@
* DEFINE_CLASS_3(foo, foo_class, foo_methods, sizeof(foo_softc),
* bar, baz, foobar);
*/
-#define DEFINE_CLASS_3(name, classvar, methods, size, \
- base1, base2, base3) \
- \
-static kobj_class_t name ## _baseclasses[] = \
- { &base1, \
- &base2, \
- &base3, NULL }; \
-struct kobj_class classvar = { \
- #name, methods, size, name ## _baseclasses \
+#define DEFINE_CLASS_3(name, classvar, methods, size, base1, base2, base3) \
+ DEFINE_CLASSN(name, classvar, methods, size, base1, base2, base3)
+
+/*
+ * Define a class with unspecified visibility (presently public)
+ * inheriting any number (including zero) base classes. Use like this:
+ *
+ * DEFINE_CLASSN(foo, foo_class, foo_methods, sizeof(foo_softc)[,
+ * bar[, baz[, foobar]]]);
+ */
+#define DEFINE_CLASSN(_name, _classvar, _methods, _size, ...) \
+ PUBLIC_DEFINE_CLASSN(_name, _classvar, _methods, _size, __VA_ARGS)
+
+/*
+ * Define a public class inheriting any number (including zero) base
+ * classes. Use like this:
+ *
+ * PUBLIC_DEFINE_CLASSN(foo, foo_class, foo_methods, sizeof(foo_softc)[,
+ * bar[, baz[, foobar]]]);
+ */
+#define PUBLIC_DEFINE_CLASSN(_name, _classvar, _methods, _size, ...) \
+ \
+__VA_OPT__(static kobj_class_t _name ## _baseclasses[] = { \
+ __DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__), NULL }); \
+struct kobj_class _classvar = { \
+ .name = #_name, \
+ .methods = _methods, \
+ .size = _size, \
+ __VA_OPT__(.baseclasses = _name ## _baseclasses,) \
}
+/*
+ * Define a private class inheriting any number (including zero) base
+ * classes. Use like this:
+ *
+ * PRIVATE_DEFINE_CLASSN(foo, foo_class, foo_methods, sizeof(foo_softc)[,
+ * bar[, baz[, foobar]]]);
+ */
+#define PRIVATE_DEFINE_CLASSN(_name, _classvar, _methods, _size, ...) \
+ \
+__VA_OPT__(static kobj_class_t _name ## _baseclasses[] = { \
+ __DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__), NULL }); \
+static struct kobj_class _classvar = { \
+ .name = #_name, \
+ .methods = _methods, \
+ .size = _size, \
+ __VA_OPT__(.baseclasses = _name ## _baseclasses,) \
+}
+
+/* Helper macros for the above, adding ampersands to parent class names */
+#define __DEFINE_CLASSN_BASE_EXPANDER(_base, ...) \
+ &_base __VA_OPT__(, ___DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__))
+
+#define ___DEFINE_CLASSN_BASE_EXPANDER(_base, ...) \
+ &_base __VA_OPT__(, __DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__))
+
/*
* Compile the method table in a class.
*/

File Metadata

Mime Type
text/plain
Expires
Wed, Feb 5, 1:57 AM (3 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15797978
Default Alt Text
D48449.id149193.diff (3 KB)

Event Timeline