19#ifndef __ASTERISK_OPTIONAL_API_H
20#define __ASTERISK_OPTIONAL_API_H
74#define AST_OPTIONAL_API_UNAVAILABLE INT_MIN
108#if defined(OPTIONAL_API)
133void ast_optional_api_provide(
const char *symname, ast_optional_fn impl);
144void ast_optional_api_unprovide(
const char *symname, ast_optional_fn impl);
158void ast_optional_api_use(
const char *symname, ast_optional_fn *optional_ref,
159 ast_optional_fn stub,
const char *module);
172void ast_optional_api_unuse(
const char *symname, ast_optional_fn *optional_ref,
175#define AST_OPTIONAL_API_NAME(name) __##name
177#define AST_OPTIONAL_API_INIT_IMPL(name) \
178 static void __attribute__((constructor)) __init__##name##_impl(void) { \
179 ast_optional_api_provide(#name, \
180 (ast_optional_fn)AST_OPTIONAL_API_NAME(name)); \
182 static void __attribute__((destructor)) __dtor__##name##_impl(void) { \
183 ast_optional_api_unprovide(#name, \
184 (ast_optional_fn)AST_OPTIONAL_API_NAME(name)); \
187#define AST_OPTIONAL_API_INIT_USER(name) \
188 static void __attribute__((constructor)) __init__##name(void) { \
189 ast_optional_api_use(#name, (ast_optional_fn *)&name, \
190 (ast_optional_fn)__stub__##name, \
193 static void __attribute__((destructor)) __dtor__##name(void) { \
194 ast_optional_api_unuse(#name, (ast_optional_fn *)&name, \
198#define AST_OPTIONAL_API_IMPL(result, name, proto, stub) \
199 result AST_OPTIONAL_API_NAME(name) proto; \
200 static attribute_unused typeof(AST_OPTIONAL_API_NAME(name)) * const \
201 name = AST_OPTIONAL_API_NAME(name); \
202 AST_OPTIONAL_API_INIT_IMPL(name)
204#define AST_OPTIONAL_API_USER(result, name, proto, stub) \
205 static result __stub__##name proto stub; \
206 static attribute_unused \
207 typeof(__stub__##name) * name; \
208 AST_OPTIONAL_API_INIT_USER(name)
212#define AST_OPTIONAL_API_ATTR_IMPL(result, attr, name, proto, stub) \
213 result __attribute__((attr)) AST_OPTIONAL_API_NAME(name) proto; \
214 static attribute_unused typeof(AST_OPTIONAL_API_NAME(name)) * const \
215 name = AST_OPTIONAL_API_NAME(name); \
216 AST_OPTIONAL_API_INIT_IMPL(name)
218#define AST_OPTIONAL_API_ATTR_USER(result, attr, name, proto, stub) \
219 static __attribute__((attr)) result __stub__##name proto stub; \
220 static attribute_unused __attribute__((attr)) \
221 typeof(__stub__##name) * name; \
222 AST_OPTIONAL_API_INIT_USER(name)
228#define AST_OPTIONAL_API_NAME(name) name
230#define AST_OPTIONAL_API(result, name, proto, stub) \
231 result AST_OPTIONAL_API_NAME(name) proto
233#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) \
234 result __attribute__((attr)) AST_OPTIONAL_API_NAME(name) proto
247#if defined(OPTIONAL_API)
249#undef AST_OPTIONAL_API
250#undef AST_OPTIONAL_API_ATTR
252#if defined(AST_API_MODULE)
254#define AST_OPTIONAL_API(result, name, proto, stub) \
255 AST_OPTIONAL_API_IMPL(result, name, proto, stub)
257#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) \
258 AST_OPTIONAL_API_ATTR_IMPL(result, attr, name, proto, stub)
262#define AST_OPTIONAL_API(result, name, proto, stub) \
263 AST_OPTIONAL_API_USER(result, name, proto, stub)
265#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) \
266 AST_OPTIONAL_API_ATTR_USER(result, attr, name, proto, stub)
#define attribute_may_alias