Merge "PJPROJECT logging: Fix detection of max supported log level."
authorzuul <zuul@gerrit.asterisk.org>
Fri, 27 Jan 2017 00:46:22 +0000 (18:46 -0600)
committerGerrit Code Review <gerrit2@gerrit.digium.api>
Fri, 27 Jan 2017 00:46:22 +0000 (18:46 -0600)
include/asterisk/options.h
main/asterisk.c
main/libasteriskpj.c
res/res_pjproject.c
res/res_rtp_asterisk.c

index ff35c16..05ad6c5 100644 (file)
@@ -143,6 +143,33 @@ enum ast_option_flags {
  */
 #define DEFAULT_PJ_LOG_MAX_LEVEL       2
 
+/*!
+ * \brief Get maximum log level pjproject was compiled with.
+ *
+ * \details
+ * Determine the maximum log level the pjproject we are running
+ * with supports.
+ *
+ * When pjproject is initially loaded the default log level in
+ * effect is the maximum log level the library was compiled to
+ * generate.  We must save this value off somewhere before we
+ * change it to what we want to use as the default level.
+ *
+ * \note This must be done before calling pj_init() so the level
+ * we want to use as the default level is in effect while the
+ * library initializes.
+ */
+#define AST_PJPROJECT_INIT_LOG_LEVEL()                                                 \
+       do {                                                                                                            \
+               if (ast_pjproject_max_log_level < 0) {                                  \
+                       ast_pjproject_max_log_level = pj_log_get_level();       \
+               }                                                                                                               \
+               pj_log_set_level(ast_option_pjproject_log_level);               \
+       } while (0)
+
+/*! Current linked pjproject maximum logging level */
+extern int ast_pjproject_max_log_level;
+
 /*! Current pjproject logging level */
 extern int ast_option_pjproject_log_level;
 
index 338c1f5..69183c1 100644 (file)
@@ -330,6 +330,7 @@ int ast_verb_sys_level;
 
 int option_verbose;                            /*!< Verbosity level */
 int option_debug;                              /*!< Debug level */
+int ast_pjproject_max_log_level = -1;/* Default to -1 to know if we have read the level from pjproject yet. */
 int ast_option_pjproject_log_level;
 double ast_option_maxload;                     /*!< Max load avg on system */
 int ast_option_maxcalls;                       /*!< Max number of active calls */
index 0f893a2..40efa92 100644 (file)
@@ -45,7 +45,7 @@
 int ast_pj_init(void)
 {
 #ifdef HAVE_PJPROJECT_BUNDLED
-       pj_log_set_level(ast_option_pjproject_log_level);
+       AST_PJPROJECT_INIT_LOG_LEVEL();
        pj_init();
 #endif
        return 0;
index 476defb..1d9d73e 100644 (file)
@@ -410,18 +410,22 @@ static char *handle_pjproject_set_log_level(struct ast_cli_entry *e, int cmd, st
        }
 
        /* Update pjproject logging level */
+       if (ast_pjproject_max_log_level < level_new) {
+               level_new = ast_pjproject_max_log_level;
+               ast_cli(a->fd,
+                       "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d.\n"
+                       "Lowering request to the max supported level.\n",
+                       ast_pjproject_max_log_level);
+       }
        level_old = ast_option_pjproject_log_level;
        if (level_old == level_new) {
                ast_cli(a->fd, "pjproject log level is still %d.\n", level_old);
        } else {
                ast_cli(a->fd, "pjproject log level was %d and is now %d.\n",
                        level_old, level_new);
+               ast_option_pjproject_log_level = level_new;
                pj_log_set_level(level_new);
        }
-       ast_option_pjproject_log_level = pj_log_get_level();
-       if (ast_option_pjproject_log_level != level_new) {
-               ast_log(LOG_WARNING, "Asterisk built with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
-       }
 
        return CLI_SUCCESS;
 }
@@ -495,7 +499,7 @@ static int load_module(void)
 
        ast_sorcery_load(pjproject_sorcery);
 
-       pj_log_set_level(ast_option_pjproject_log_level);
+       AST_PJPROJECT_INIT_LOG_LEVEL();
        pj_init();
 
        decor_orig = pj_log_get_decor();
@@ -512,12 +516,19 @@ static int load_module(void)
        pj_log_set_decor(0);
        pj_log_set_level(MAX_PJ_LOG_MAX_LEVEL);/* Set level to guarantee the dump output. */
        pj_dump_config();
-       pj_log_set_level(ast_option_pjproject_log_level);
        pj_log_set_decor(PJ_LOG_HAS_SENDER | PJ_LOG_HAS_INDENT);
        pj_log_set_log_func(log_forwarder);
-       if (!AST_VECTOR_SIZE(&buildopts)
-               || ast_option_pjproject_log_level != pj_log_get_level()) {
-               ast_log(LOG_WARNING, "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL set too low.\n");
+       if (ast_pjproject_max_log_level < ast_option_pjproject_log_level) {
+               ast_log(LOG_WARNING,
+                       "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d which is too low for startup level: %d.\n",
+                       ast_pjproject_max_log_level, ast_option_pjproject_log_level);
+               ast_option_pjproject_log_level = ast_pjproject_max_log_level;
+       }
+       pj_log_set_level(ast_option_pjproject_log_level);
+       if (!AST_VECTOR_SIZE(&buildopts)) {
+               ast_log(LOG_NOTICE,
+                       "Asterisk built or linked with pjproject PJ_LOG_MAX_LEVEL=%d which is too low to get buildopts.\n",
+                       ast_pjproject_max_log_level);
        }
 
        ast_cli_register_multiple(pjproject_cli, ARRAY_LEN(pjproject_cli));
index c88c7b5..750e1ef 100644 (file)
@@ -5666,7 +5666,7 @@ static int load_module(void)
 #ifdef HAVE_PJPROJECT
        pj_lock_t *lock;
 
-       pj_log_set_level(ast_option_pjproject_log_level);
+       AST_PJPROJECT_INIT_LOG_LEVEL();
        if (pj_init() != PJ_SUCCESS) {
                return AST_MODULE_LOAD_DECLINE;
        }