Corey Farrell has uploaded a new change for review.

  https://gerrit.asterisk.org/73

Change subject: Optional API: Fix handling of sources that are both provider 
and user.
......................................................................

Optional API: Fix handling of sources that are both provider and user.

OPTIONAL_API has conditionals to define AST_OPTIONAL_API and
AST_OPTIONAL_API_ATTR differently based on if AST_API_MODULE is defined.
Unfortunately this is inside the include protection block, so only the
first status of AST_API_MODULE is respected.  For example res_monitor
is an optional API provider, but uses func_periodic_hook.  This makes
func_periodic_hook non-optional to res_monitor.

This changes optional_api.h so that AST_OPTIONAL_API and
AST_OPTIONAL_API_ATTR is redefined every time the header is included.

ASTERISK-17608 #close
Reported by: Warren Selby

Change-Id: I8fcf2a5e7b481893e17484ecde4f172c9ffb5679
---
M include/asterisk/optional_api.h
1 file changed, 54 insertions(+), 28 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/73/73/1

diff --git a/include/asterisk/optional_api.h b/include/asterisk/optional_api.h
index 394aed0..1118dc7 100644
--- a/include/asterisk/optional_api.h
+++ b/include/asterisk/optional_api.h
@@ -178,10 +178,7 @@
 
 #define AST_OPTIONAL_API_NAME(name) __##name
 
-#if defined(AST_API_MODULE)
-/* Module defining the API */
-
-#define AST_OPTIONAL_API_IMPL_INIT(name)                               \
+#define AST_OPTIONAL_API_INIT_IMPL(name)                               \
        static void __attribute__((constructor)) __init__##name##_impl(void) { \
                ast_optional_api_provide(#name,                         \
                        (ast_optional_fn)AST_OPTIONAL_API_NAME(name));  \
@@ -191,22 +188,7 @@
                        (ast_optional_fn)AST_OPTIONAL_API_NAME(name));  \
        }
 
-#define AST_OPTIONAL_API(result, name, proto, stub)                    \
-       result AST_OPTIONAL_API_NAME(name) proto;                       \
-       static attribute_unused typeof(AST_OPTIONAL_API_NAME(name)) * const \
-            name = AST_OPTIONAL_API_NAME(name);                        \
-       AST_OPTIONAL_API_IMPL_INIT(name)
-
-#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub)         \
-       result  __attribute__((attr)) AST_OPTIONAL_API_NAME(name) proto; \
-       static attribute_unused typeof(AST_OPTIONAL_API_NAME(name)) * const \
-            name = AST_OPTIONAL_API_NAME(name);                        \
-       AST_OPTIONAL_API_IMPL_INIT(name)
-
-#else
-/* Module using the API */
-
-#define AST_OPTIONAL_API_INIT(name)                                    \
+#define AST_OPTIONAL_API_INIT_USER(name)                               \
        static void __attribute__((constructor)) __init__##name(void) { \
                ast_optional_api_use(#name, (ast_optional_fn *)&name,   \
                        (ast_optional_fn)__stub__##name,                \
@@ -217,19 +199,31 @@
                        AST_MODULE);                                    \
        }
 
-#define AST_OPTIONAL_API(result, name, proto, stub)                    \
+#define AST_OPTIONAL_API_IMPL(result, name, proto, stub)                       
\
+       result AST_OPTIONAL_API_NAME(name) proto;                       \
+       static attribute_unused typeof(AST_OPTIONAL_API_NAME(name)) * const \
+            name = AST_OPTIONAL_API_NAME(name);                        \
+       AST_OPTIONAL_API_INIT_IMPL(name)
+
+#define AST_OPTIONAL_API_USER(result, name, proto, stub)                       
\
        static result __stub__##name proto stub;                        \
        static attribute_unused                                         \
                typeof(__stub__##name) * name;                          \
-       AST_OPTIONAL_API_INIT(name)
+       AST_OPTIONAL_API_INIT_USER(name)
 
-#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub)         \
+
+/* AST_OPTIONAL_API_ATTR */
+#define AST_OPTIONAL_API_ATTR_IMPL(result, attr, name, proto, stub)            
\
+       result  __attribute__((attr)) AST_OPTIONAL_API_NAME(name) proto; \
+       static attribute_unused typeof(AST_OPTIONAL_API_NAME(name)) * const \
+            name = AST_OPTIONAL_API_NAME(name);                        \
+       AST_OPTIONAL_API_INIT_IMPL(name)
+
+#define AST_OPTIONAL_API_ATTR_USER(result, attr, name, proto, stub)            
\
        static __attribute__((attr)) result __stub__##name proto stub;  \
        static attribute_unused __attribute__((attr))                   \
                typeof(__stub__##name) * name;                          \
-       AST_OPTIONAL_API_INIT(name)
-
-#endif /* defined(AST_API_MODULE) */
+       AST_OPTIONAL_API_INIT_USER(name)
 
 #else /* defined(OPTIONAL_API) */
 
@@ -245,6 +239,38 @@
 
 #endif /* defined(OPTIONAL_API) */
 
-#undef AST_API_MODULE
-
 #endif /* __ASTERISK_OPTIONAL_API_H */
+
+/*
+ * Some Asterisk sources are both consumer and provider of optional API's.  The
+ * following definitons are intentionally outside the include protected portion
+ * of this header so AST_OPTIONAL_API and AST_OPTIONAL_API_ATTR can be 
redefined
+ * each time the header is included.  This also ensures that AST_API_MODULE is
+ * undefined after every include of this header.
+ */
+#if defined(OPTIONAL_API)
+
+#undef AST_OPTIONAL_API
+#undef AST_OPTIONAL_API_ATTR
+
+#if defined(AST_API_MODULE)
+
+#define AST_OPTIONAL_API(result, name, proto, stub) \
+       AST_OPTIONAL_API_IMPL(result, name, proto, stub)
+
+#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) \
+       AST_OPTIONAL_API_ATTR_IMPL(result, attr, name, proto, stub)
+
+#else
+
+#define AST_OPTIONAL_API(result, name, proto, stub) \
+       AST_OPTIONAL_API_USER(result, name, proto, stub)
+
+#define AST_OPTIONAL_API_ATTR(result, attr, name, proto, stub) \
+       AST_OPTIONAL_API_ATTR_USER(result, attr, name, proto, stub)
+
+#endif /* defined(AST_API_MODULE) */
+
+#endif /* defined(OPTIONAL_API) */
+
+#undef AST_API_MODULE

-- 
To view, visit https://gerrit.asterisk.org/73
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8fcf2a5e7b481893e17484ecde4f172c9ffb5679
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Corey Farrell <g...@cfware.com>

-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to