Page MenuHomeFreeBSD

D60245.diff
No OneTemporary

D60245.diff

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

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)

Event Timeline