mirror of
https://github.com/asterisk/asterisk.git
synced 2026-06-18 13:34:16 +00:00
f5bc032567
RAII_VAR, which is used extensively in Asterisk to manage reference counted resources, uses a GCC extension to automatically invoke a cleanup function when a variable loses scope. While this functionality is incredibly useful and has prevented a large number of memory leaks, it also prevents Asterisk from being compiled with clang. This patch updates the RAII_VAR macro such that it can be compiled with clang. It makes use of the BlocksRuntime, which allows for a closure to be created that performs the actual cleanup. Note that this does not attempt to address the numerous warnings that the clang compiler catches in Asterisk. Much thanks for this patch goes to: * The folks on StackOverflow who asked this question and Leushenko for providing the answer that formed the basis of this code: http://stackoverflow.com/questions/24959440/rewrite-gcc-cleanup-macro-with-nested-function-for-clang * Diederik de Groot, who has been extremely patient in working on getting this patch into Asterisk. Review: https://reviewboard.asterisk.org/r/4370/ ASTERISK-24133 ASTERISK-23666 ASTERISK-20399 ASTERISK-20850 #close Reported by: Diederik de Groot patches: RAII_CLANG.patch uploaded by Diederik de Groot (License 6600) ........ Merged revisions 432807 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@432808 65c4cc65-6c06-0410-ace0-fbb531ad65f3
73 lines
2.4 KiB
C
73 lines
2.4 KiB
C
/*
|
|
* Asterisk -- An open source telephony toolkit.
|
|
*
|
|
* Copyright (C) 1999 - 2005, Digium, Inc.
|
|
*
|
|
* Kevin P. Fleming <kpfleming@digium.com>
|
|
*
|
|
* See http://www.asterisk.org for more information about
|
|
* the Asterisk project. Please do not directly contact
|
|
* any of the maintainers of this project for assistance;
|
|
* the project provides a web site, mailing lists and IRC
|
|
* channels for your use.
|
|
*
|
|
* This program is free software, distributed under the terms of
|
|
* the GNU General Public License Version 2. See the LICENSE file
|
|
* at the top of the source tree.
|
|
*/
|
|
|
|
#ifndef __ASTERISK_INLINEAPI_H
|
|
#define __ASTERISK_INLINEAPI_H
|
|
|
|
/*! \file
|
|
* \brief Inlinable API function macro
|
|
|
|
Small API functions that are candidates for inlining need to be specially
|
|
declared and defined, to ensure that the 'right thing' always happens.
|
|
For example:
|
|
- there must _always_ be a non-inlined version of the function
|
|
available for modules compiled out of the tree to link to
|
|
- references to a function that cannot be inlined (for any
|
|
reason that the compiler deems proper) must devolve into an
|
|
'extern' reference, instead of 'static', so that multiple
|
|
copies of the function body are not built in different modules.
|
|
However, since this doesn't work for clang, we go with 'static'
|
|
anyway and hope for the best!
|
|
- when LOW_MEMORY is defined, inlining should be disabled
|
|
completely, even if the compiler is configured to support it
|
|
|
|
The AST_INLINE_API macro allows this to happen automatically, when
|
|
used to define your function. Proper usage is as follows:
|
|
- define your function one place, in a header file, using the macro
|
|
to wrap the function (see strings.h or time.h for examples)
|
|
- choose a module to 'host' the function body for non-inline
|
|
usages, and in that module _only_, define AST_API_MODULE before
|
|
including the header file
|
|
*/
|
|
|
|
#if !defined(LOW_MEMORY) && !defined(DISABLE_INLINE)
|
|
|
|
#if !defined(AST_API_MODULE)
|
|
#if defined(__clang__)
|
|
#define AST_INLINE_API(hdr, body) static hdr; static inline hdr body
|
|
#else /* if defined(__clang__) */
|
|
#define AST_INLINE_API(hdr, body) hdr; extern inline hdr body
|
|
#endif
|
|
#else /* if !defined(AST_API_MODULE) */
|
|
#define AST_INLINE_API(hdr, body) hdr; hdr body
|
|
#endif
|
|
|
|
#else /* defined(LOW_MEMORY) */
|
|
|
|
#if !defined(AST_API_MODULE)
|
|
#define AST_INLINE_API(hdr, body) hdr;
|
|
#else
|
|
#define AST_INLINE_API(hdr, body) hdr; hdr body
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#undef AST_API_MODULE
|
|
|
|
#endif /* __ASTERISK_INLINEAPI_H */
|