mirror of
https://github.com/opnsense/src.git
synced 2026-06-10 09:11:07 -04:00
LinuxKPI: add cleanup.h for guard DEFINE_GUARD/guard.
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 fa81baa307)
This commit is contained in:
parent
f9c867bf4e
commit
75ac24a7df
1 changed files with 46 additions and 0 deletions
46
sys/compat/linuxkpi/common/include/linux/cleanup.h
Normal file
46
sys/compat/linuxkpi/common/include/linux/cleanup.h
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*-
|
||||
* 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 */
|
||||
Loading…
Reference in a new issue