Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109362044
D48449.id149193.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D48449.id149193.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D48449: kobj: add DEFINE_CLASSN() for arbitrary # parent, add public/private
Attached
Detach File
Event Timeline
Log In to Comment