#ifndef _LINUX_CLEANUP_H
#define _LINUX_CLEANUP_H
#define __free(fn) __cleanup(__free_##fn)
#define DEFINE_FREE(fn, type, body) \
static inline void \
__free_##fn(void *p) \
{ \
type _T = *(type *)p; \
body; \
}
#define no_free_ptr(p) \
({void *_p = (p); (p) = NULL; _p; })
#define DEFINE_CLASS(_name, _type, _exit, _enter, _args...) \
typedef _type class_##_name##_t; \
static inline _type \
class_##_name##_constructor(_args) \
{ \
_type t = _enter; \
return t; \
} \
static inline void \
class_##_name##_destructor(_type *p) \
{ \
_type _T = *p; \
_exit; \
}
#define _guard(_type) \
class_##_type##_t _guard_p __cleanup(class_##_type##_destructor) = \
class_##_type##_constructor
#define guard(_type) _guard(_type)
#define _scoped_guard(_type, _varname, _args...) \
int _varname = 1; \
for (class_##_type##_t _guard_p __cleanup(class_##_type##_destructor) = \
class_##_type##_constructor(_args); _varname;_varname--)
#ifndef __COUNTER__
#define __COUNTER__ __LINE
#endif
#define __guardname(num) _scoped_guard_loop##num
#define _guardname(num) __guardname(num)
#define guardname() _guardname(__COUNTER__)
#define scoped_guard(_type, _args...) _scoped_guard(_type, guardname(), _args)
#endif