Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F174900837
D60245.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D60245.diff
View Options
diff --git a/sys/compat/linuxkpi/common/include/linux/cleanup.h b/sys/compat/linuxkpi/common/include/linux/cleanup.h
--- a/sys/compat/linuxkpi/common/include/linux/cleanup.h
+++ b/sys/compat/linuxkpi/common/include/linux/cleanup.h
@@ -11,15 +11,13 @@
#define _LINUXKPI_LINUX_CLEANUP_H
#include <linux/err.h>
+#include <linux/compiler.h>
-#define CLEANUP_NAME(_n, _s) __CONCAT(__CONCAT(cleanup_, _n), _s)
+#define LKPI_CLASS_NAME(_name, _s) \
+ __CONCAT(__CONCAT(class, _name), _s)
#define __cleanup(_f) __attribute__((__cleanup__(_f)))
-#define DECLARE(_n, _x) \
- CLEANUP_NAME(_n, _t) _x __cleanup(CLEANUP_NAME(_n, _destroy)) = \
- CLEANUP_NAME(_n, _create)
-
/*
* On Linux, the following macro is called `DEFINE_CLASS()`. However it
* conflicts with FreeBSD's macro defined in <sys/kobj.h>.
@@ -28,67 +26,49 @@
* statements. Extra care should be taken when changing the code.
*/
#define LINUXKPI_DEFINE_CLASS(_name, _type, _exit, _init, _init_args...)\
- typedef _type class_##_name##_t; \
+ typedef _type LKPI_CLASS_NAME(_name, _t); \
\
- static inline _type class_##_name##_constructor(_init_args) \
+ static inline _type \
+ LKPI_CLASS_NAME(_name, _constructor)(_init_args) \
{ \
_type v = _init; \
return (v); \
} \
\
- static inline void class_##_name##_destructor(_type *p) \
+ static inline void \
+ LKPI_CLASS_NAME(_name, _destructor)(_type *p) \
{ \
_type _T = *p; \
_exit; \
}
#define CLASS(_name, _var) \
- class_##_name##_t _var __cleanup(class_##_name##_destructor) = \
- class_##_name##_constructor
+ LKPI_CLASS_NAME(_name, _t) _var \
+ __cleanup(LKPI_CLASS_NAME(_name, _destructor)) = \
+ LKPI_CLASS_NAME(_name, _constructor)
/*
* Note: "_T" are special as they are exposed into common code for
* statements. Extra care should be taken when changing the code.
*/
-#define DEFINE_GUARD(_n, _dt, _lock, _unlock) \
- \
- typedef _dt CLEANUP_NAME(_n, _t); \
- \
- static inline _dt \
- CLEANUP_NAME(_n, _create)( _dt _T) \
- { \
- _dt c; \
- \
- c = ({ _lock; _T; }); \
- return (c); \
- } \
- \
- static inline void \
- CLEANUP_NAME(_n, _destroy)(_dt *t) \
- { \
- _dt _T; \
- \
- _T = *t; \
- if (_T) { _unlock; }; \
- }
+#define DEFINE_GUARD(_name, _type, _lock, _unlock) \
+ LINUXKPI_DEFINE_CLASS(_name, _type, _unlock, ({ _lock; _T; }), _type _T)
/* We need to keep these calls unique. */
-#define _guard(_n, _x) \
- DECLARE(_n, _x)
-#define guard(_n) \
- _guard(_n, guard_ ## _n ## _ ## __COUNTER__)
+#define guard(_name) \
+ CLASS(_name, __UNIQUE_ID(guard))
-#define DEFINE_FREE(_n, _t, _f) \
+#define DEFINE_FREE(_name, _type, _f) \
static inline void \
- __free_ ## _n(void *p) \
+ __free_ ## _name(void *p) \
{ \
- _t _T; \
+ _type _T; \
\
- _T = *(_t *)p; \
+ _T = *(_type *)p; \
_f; \
}
-#define __free(_n) __cleanup(__free_##_n)
+#define __free(_name) __cleanup(__free_##_name)
/*
* Our initial version go broken up. Some simplifications like using
@@ -96,12 +76,12 @@
* _T is still special and, like other bits, may not always be used,
* so tag with __unused (or better the LinuxKPI __maybe_unused).
*/
-#define _DEFINE_LOCK_GUARD_0(_n, _lock) \
- static inline CLEANUP_NAME(_n, _t) \
- CLEANUP_NAME(_n, _create)(void) \
+#define _DEFINE_LOCK_GUARD_0(_name, _lock) \
+ static inline LKPI_CLASS_NAME(_name, _t) \
+ LKPI_CLASS_NAME(_name, _constructor)(void) \
{ \
- CLEANUP_NAME(_n, _t) _tmp; \
- CLEANUP_NAME(_n, _t) *_T __maybe_unused; \
+ LKPI_CLASS_NAME(_name, _t) _tmp; \
+ LKPI_CLASS_NAME(_name, _t) *_T __maybe_unused; \
\
_tmp.lock = (void *)1; \
_T = &_tmp; \
@@ -109,12 +89,12 @@
return (_tmp); \
}
-#define _DEFINE_LOCK_GUARD_1(_n, _type, _lock) \
- static inline CLEANUP_NAME(_n, _t) \
- CLEANUP_NAME(_n, _create)(_type *l) \
+#define _DEFINE_LOCK_GUARD_1(_name, _type, _lock) \
+ static inline LKPI_CLASS_NAME(_name, _t) \
+ LKPI_CLASS_NAME(_name, _constructor)(_type *l) \
{ \
- CLEANUP_NAME(_n, _t) _tmp; \
- CLEANUP_NAME(_n, _t) *_T __maybe_unused; \
+ LKPI_CLASS_NAME(_name, _t) _tmp; \
+ LKPI_CLASS_NAME(_name, _t) *_T __maybe_unused; \
\
_tmp.lock = l; \
_T = &_tmp; \
@@ -128,17 +108,17 @@
IS_ERR_VALUE(x); \
})
-#define __is_cond_ptr(_n) \
- CLEANUP_NAME(_n, _is_cond)
-#define __guard_ptr(_n) \
- CLEANUP_NAME(_n, _ptr)
+#define __is_cond_ptr(_name) \
+ LKPI_CLASS_NAME(_name, _is_cond)
+#define __guard_ptr(_name) \
+ LKPI_CLASS_NAME(_name, _ptr)
-#define _DEFINE_CLEANUP_IS_CONDITIONAL(_n, _b) \
- static const bool CLEANUP_NAME(_n, _is_cond) __maybe_unused = _b
+#define _DEFINE_CLEANUP_IS_CONDITIONAL(_name, _b) \
+ static const bool LKPI_CLASS_NAME(_name, _is_cond) __maybe_unused = _b
-#define _DEFINE_GUARD_LOCK_PTR(_n, _lp) \
+#define _DEFINE_GUARD_LOCK_PTR(_name, _lp) \
static inline void * \
- CLEANUP_NAME(_n, _lock_ptr)(CLEANUP_NAME(_n, _t) *_T) \
+ LKPI_CLASS_NAME(_name, _lock_ptr)(LKPI_CLASS_NAME(_name, _t) *_T) \
{ \
void *_p; \
\
@@ -148,43 +128,43 @@
return (_p); \
}
-#define _DEFINE_UNLOCK_GUARD(_n, _type, _unlock, ...) \
+#define _DEFINE_UNLOCK_GUARD(_name, _type, _unlock, ...) \
typedef struct { \
_type *lock; \
__VA_ARGS__; \
- } CLEANUP_NAME(_n, _t); \
+ } LKPI_CLASS_NAME(_name, _t); \
\
static inline void \
- CLEANUP_NAME(_n, _destroy)(CLEANUP_NAME(_n, _t) *_T) \
+ LKPI_CLASS_NAME(_name, _destructor)(LKPI_CLASS_NAME(_name, _t) *_T) \
{ \
if (!_GUARD_IS_ERR(_T->lock)) { \
_unlock; \
} \
} \
\
- _DEFINE_GUARD_LOCK_PTR(_n, &_T->lock)
+ _DEFINE_GUARD_LOCK_PTR(_name, &_T->lock)
-#define DEFINE_LOCK_GUARD_0(_n, _lock, _unlock, ...) \
- _DEFINE_CLEANUP_IS_CONDITIONAL(_n, false); \
- _DEFINE_UNLOCK_GUARD(_n, void, _unlock, __VA_ARGS__) \
- _DEFINE_LOCK_GUARD_0(_n, _lock)
+#define DEFINE_LOCK_GUARD_0(_name, _lock, _unlock, ...) \
+ _DEFINE_CLEANUP_IS_CONDITIONAL(_name, false); \
+ _DEFINE_UNLOCK_GUARD(_name, void, _unlock, __VA_ARGS__) \
+ _DEFINE_LOCK_GUARD_0(_name, _lock)
/* This allows the type to be set. */
-#define DEFINE_LOCK_GUARD_1(_n, _t, _lock, _unlock, ...) \
- _DEFINE_CLEANUP_IS_CONDITIONAL(_n, false); \
- _DEFINE_UNLOCK_GUARD(_n, _t, _unlock, __VA_ARGS__) \
- _DEFINE_LOCK_GUARD_1(_n, _t, _lock)
-
-#define _scoped_guard(_n, _l, ...) \
- for (DECLARE(_n, _scoped)(__VA_ARGS__); \
- 1 /*__guard_ptr(_n)(&_scoped) || !__is_cond_ptr(_n) */; \
+#define DEFINE_LOCK_GUARD_1(_name, _type, _lock, _unlock, ...) \
+ _DEFINE_CLEANUP_IS_CONDITIONAL(_name, false); \
+ _DEFINE_UNLOCK_GUARD(_name, _type, _unlock, __VA_ARGS__) \
+ _DEFINE_LOCK_GUARD_1(_name, _type, _lock)
+
+#define _scoped_guard(_name, _l, ...) \
+ for (CLASS(_name, _scoped)(__VA_ARGS__); \
+ 1 /*__guard_ptr(_name)(&_scoped) || !__is_cond_ptr(_name) */; \
({ goto _l; })) \
if (0) { \
_l: \
break; \
} else
-#define scoped_guard(_n, ...) \
- _scoped_guard(_n, ___label_ ## __COUNTER__, ##__VA_ARGS__)
+#define scoped_guard(_name, ...) \
+ _scoped_guard(_name, __UNIQUE_ID(label), ##__VA_ARGS__)
#endif /* _LINUXKPI_LINUX_CLEANUP_H */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Oct 7, 8:53 PM (6 h, 22 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40126495
Default Alt Text
D60245.diff (7 KB)
Attached To
Mode
D60245: LinuxKPI: rework cleanup.h to use CLASS
Attached
Detach File
Event Timeline
Log In to Comment