root/sys/dev/pci/drm/include/linux/cleanup.h
/* Public domain. */

#ifndef _LINUX_CLEANUP_H
#define _LINUX_CLEANUP_H

#define __free(fn)      __cleanup(__free_##fn)

/* function arg is effectively type *, deref is required */
#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