mirror of
https://github.com/opnsense/src.git
synced 2026-03-16 15:48:26 -04:00
iwlwifi v6.11 started to use guard(). _T in the implementation needs to be exposed to the driver which uses it in DEFINE_GUARD(). Given this is the first instance of attribute(cleanup) in the tree: - gcc has support for it since at least 2003-06-04 (0bfa5f65bfb186f10d43304946fd7fcd69988732) - llvm gained support on 2009-01-31 (d277d790e0f6f23043397ba919619b5c3e157ff3, llvm-svn 63462). Sponsored by: The FreeBSD Foundation Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D46843 (cherry picked from commit fa81baa307da9a0055d7d08f6d141ea310f067ed)
46 lines
1.2 KiB
C
46 lines
1.2 KiB
C
/*-
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2024 The FreeBSD Foundation
|
|
*
|
|
* This software was developed by Björn Zeeb under sponsorship from
|
|
* the FreeBSD Foundation.
|
|
*/
|
|
|
|
#ifndef _LINUXKPI_LINUX_CLEANUP_H
|
|
#define _LINUXKPI_LINUX_CLEANUP_H
|
|
|
|
#define __cleanup(_f) __attribute__((__cleanup__(_f)))
|
|
|
|
/*
|
|
* 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 guard_ ## _n ## _t; \
|
|
\
|
|
static inline _dt \
|
|
guard_ ## _n ## _create( _dt _T) \
|
|
{ \
|
|
_dt c; \
|
|
\
|
|
c = ({ _lock; _T; }); \
|
|
return (c); \
|
|
} \
|
|
\
|
|
static inline void \
|
|
guard_ ## _n ## _destroy(_dt *t) \
|
|
{ \
|
|
_dt _T; \
|
|
\
|
|
_T = *t; \
|
|
if (_T) { _unlock; }; \
|
|
}
|
|
|
|
/* We need to keep these calls unique. */
|
|
#define guard(_n) \
|
|
guard_ ## _n ## _t guard_ ## _n ## _ ## __COUNTER__ \
|
|
__cleanup(guard_ ## _n ## _destroy) = guard_ ## _n ## _create
|
|
|
|
#endif /* _LINUXKPI_LINUX_CLEANUP_H */
|