From 4f7d300b2d5ce7c47c45740d220c6412dddca139 Mon Sep 17 00:00:00 2001 From: kpfleming Date: Tue, 23 Mar 2010 14:22:27 +0000 Subject: [PATCH] Change per-file debug and verbose levels to be per-module, the way users expect them to work. 'core set debug' and 'core set verbose' can optionally change the level for a specific filename; however, this is actually for a specific source file name, not the module that source file is included in. With examples like chan_sip, chan_iax2, chan_misdn and others consisting of multiple source files, this will not lead to the behavior that users expect. If they want to set the debug level for chan_sip, they want it set for all of chan_sip, and not to have to also set it for reqresp_parser and other files that comprise the chan_sip module. This patch changes this functionality to be module-name based instead of file-name based. To make this work, some Makefile modifications were required to ensure that the AST_MODULE definition is present in each object file produced for each module as well. Review: https://reviewboard.asterisk.org/r/574/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@253917 f38db490-d61c-443f-a65b-d21fe96a405b --- CHANGES | 11 +++ Makefile.moddir_rules | 10 ++- channels/Makefile | 5 ++ codecs/Makefile | 1 + include/asterisk/logger.h | 14 ++-- include/asterisk/options.h | 16 ++--- main/Makefile | 2 + main/cli.c | 134 +++++++++++++++++++------------------ pbx/Makefile | 1 + res/Makefile | 5 +- 10 files changed, 115 insertions(+), 84 deletions(-) diff --git a/CHANGES b/CHANGES index df47a323a..12e3614d4 100644 --- a/CHANGES +++ b/CHANGES @@ -426,6 +426,17 @@ Miscellaneous * chan_dahdi now supports reporting alarms over AMI either by channel or span via the reportalarms config option. +CLI Changes +----------- + * The 'core set debug' and 'core set verbose' commands, in previous versions, could + optionally accept a filename, to apply the setting only to the code generated from + that source file when Asterisk was built. However, there are some modules in Asterisk + that are composed of multiple source files, so this did not result in the behavior + that users expected. In this version, 'core set debug' and 'core set verbose' + can optionally accept *module* names instead (with or without the .so extension), + which applies the setting to the entire module specified, regardless of which source + files it was built from. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 1.6.1 to Asterisk 1.6.2 ------------- ------------------------------------------------------------------------------ diff --git a/Makefile.moddir_rules b/Makefile.moddir_rules index 72d4c2a8b..00494a8b5 100644 --- a/Makefile.moddir_rules +++ b/Makefile.moddir_rules @@ -54,10 +54,16 @@ endif # Both C++ and C++ sources need their module name in AST_MODULE # We also pass whatever _INCLUDE list is generated by menuselect -# (they are stored in file 'makeopts') +# (they are stored in file 'makeopts'). This is also necessary +# for components used to build modules, which can't be determined +# by the rules in this file, so the MOD_ASTCFLAGS definition +# is used to collect the required flags for a module... which can +# then be used any place they are required. + +MOD_ASTCFLAGS=-DAST_MODULE=\"$(1)\" $(MENUSELECT_OPTS_$(1):%=-D%) $(foreach dep,$(MENUSELECT_DEPENDS_$(1)),$(value $(dep)_INCLUDE)) $(addsuffix .oo,$(CC_MODS)) $(addsuffix .o,$(C_MODS)): \ - _ASTCFLAGS+= -DAST_MODULE=\"$*\" $(MENUSELECT_OPTS_$*:%=-D%) $(foreach dep,$(MENUSELECT_DEPENDS_$*),$(value $(dep)_INCLUDE)) + _ASTCFLAGS+=$(call MOD_ASTCFLAGS,$*) ifeq ($(findstring $(OSARCH), mingw32 cygwin ),) # don't define -fPIC on mingw32 and cygwin, it is the default diff --git a/channels/Makefile b/channels/Makefile index 516b548b0..c8f4d8041 100644 --- a/channels/Makefile +++ b/channels/Makefile @@ -70,8 +70,11 @@ dist-clean:: rm -f h323/Makefile $(if $(filter chan_iax2,$(EMBEDDED_MODS)),modules.link,chan_iax2.so): iax2-parser.o iax2-provision.o +iax2-parser.o iax2-provision.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_iax2) $(if $(filter chan_sip,$(EMBEDDED_MODS)),modules.link,chan_sip.so): $(subst .c,.o,$(wildcard sip/*.c)) +$(subst .c,.o,$(wildcard sip/*.c)): _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_sip) $(if $(filter chan_dahdi,$(EMBEDDED_MODS)),modules.link,chan_dahdi.so): sig_analog.o sig_pri.o +sig_analog.o sig_pri.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_dahdi) ifneq ($(filter chan_h323,$(EMBEDDED_MODS)),) modules.link: h323/libchanh323.a @@ -94,8 +97,10 @@ misdn_config.o: _ASTCFLAGS+=-Imisdn misdn/isdn_lib.o: _ASTCFLAGS+=-Wno-strict-aliasing $(if $(filter chan_misdn,$(EMBEDDED_MODS)),modules.link,chan_misdn.so): misdn_config.o misdn/isdn_lib.o misdn/isdn_msg_parser.o +misdn_config.o misdn/isdn_lib.o misdn/isdn_msg_parser.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_misdn) $(if $(filter chan_oss,$(EMBEDDED_MODS)),modules.link,chan_oss.so): console_video.o vgrabbers.o console_board.o +console_video.o vgrabbers.o console_board.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,chan_oss) chan_usbradio.o: ./xpmr/xpmr.c ./xpmr/xpmr.h ./xpmr/xpmr_coef.h diff --git a/codecs/Makefile b/codecs/Makefile index 4d0059102..846c16364 100644 --- a/codecs/Makefile +++ b/codecs/Makefile @@ -50,3 +50,4 @@ $(LIBILBC): $(if $(filter codec_ilbc,$(EMBEDDED_MODS)),modules.link,codec_ilbc.so): $(LIBILBC) $(if $(filter codec_g722,$(EMBEDDED_MODS)),modules.link,codec_g722.so): g722/g722_encode.o g722/g722_decode.o +g722/g722_encode.o g722/g722_decode.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,codec_g722) diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index 75d07d6fe..c829843ee 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -181,18 +181,18 @@ void ast_console_toggle_loglevel(int fd, int level, int state); #define NUMLOGLEVELS 6 /*! - * \brief Get the debug level for a file + * \brief Get the debug level for a module * \param file the filename * \return the debug level */ -unsigned int ast_debug_get_by_file(const char *file); +unsigned int ast_debug_get_by_module(const char *module); /*! - * \brief Get the debug level for a file + * \brief Get the verbose level for a module * \param file the filename - * \return the debug level + * \return the verbose level */ -unsigned int ast_verbose_get_by_file(const char *file); +unsigned int ast_verbose_get_by_module(const char *module); /*! * \brief Register a new logger level @@ -231,11 +231,11 @@ void ast_logger_unregister_level(const char *name); * to get logged */ #define ast_debug(level, ...) do { \ - if (option_debug >= (level) || (ast_opt_dbg_file && ast_debug_get_by_file(__FILE__) >= (level)) ) \ + if (option_debug >= (level) || (ast_opt_dbg_module && ast_debug_get_by_module(AST_MODULE) >= (level)) ) \ ast_log(AST_LOG_DEBUG, __VA_ARGS__); \ } while (0) -#define VERBOSITY_ATLEAST(level) (option_verbose >= (level) || (ast_opt_verb_file && ast_verbose_get_by_file(__FILE__) >= (level))) +#define VERBOSITY_ATLEAST(level) (option_verbose >= (level) || (ast_opt_verb_module && ast_verbose_get_by_module(AST_MODULE) >= (level))) #define ast_verb(level, ...) do { \ if (VERBOSITY_ATLEAST((level)) ) { \ diff --git a/include/asterisk/options.h b/include/asterisk/options.h index d3305be66..c76e8332d 100644 --- a/include/asterisk/options.h +++ b/include/asterisk/options.h @@ -78,10 +78,10 @@ enum ast_option_flags { AST_OPT_FLAG_ALWAYS_FORK = (1 << 21), /*! Disable log/verbose output to remote consoles */ AST_OPT_FLAG_MUTE = (1 << 22), - /*! There is a per-file debug setting */ - AST_OPT_FLAG_DEBUG_FILE = (1 << 23), - /*! There is a per-file verbose setting */ - AST_OPT_FLAG_VERBOSE_FILE = (1 << 24), + /*! There is a per-module debug setting */ + AST_OPT_FLAG_DEBUG_MODULE = (1 << 23), + /*! There is a per-module verbose setting */ + AST_OPT_FLAG_VERBOSE_MODULE = (1 << 24), /*! Terminal colors should be adjusted for a light-colored background */ AST_OPT_FLAG_LIGHT_BACKGROUND = (1 << 25), /*! Count Initiated seconds in CDR's */ @@ -119,10 +119,10 @@ enum ast_option_flags { #define ast_opt_internal_timing ast_test_flag(&ast_options, AST_OPT_FLAG_INTERNAL_TIMING) #define ast_opt_always_fork ast_test_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK) #define ast_opt_mute ast_test_flag(&ast_options, AST_OPT_FLAG_MUTE) -#define ast_opt_dbg_file ast_test_flag(&ast_options, AST_OPT_FLAG_DEBUG_FILE) -#define ast_opt_verb_file ast_test_flag(&ast_options, AST_OPT_FLAG_VERBOSE_FILE) -#define ast_opt_light_background ast_test_flag(&ast_options, AST_OPT_FLAG_LIGHT_BACKGROUND) -#define ast_opt_force_black_background ast_test_flag(&ast_options, AST_OPT_FLAG_FORCE_BLACK_BACKGROUND) +#define ast_opt_dbg_module ast_test_flag(&ast_options, AST_OPT_FLAG_DEBUG_MODULE) +#define ast_opt_verb_module ast_test_flag(&ast_options, AST_OPT_FLAG_VERBOSE_MODULE) +#define ast_opt_light_background ast_test_flag(&ast_options, AST_OPT_FLAG_LIGHT_BACKGROUND) +#define ast_opt_force_black_background ast_test_flag(&ast_options, AST_OPT_FLAG_FORCE_BLACK_BACKGROUND) #define ast_opt_hide_connect ast_test_flag(&ast_options, AST_OPT_FLAG_HIDE_CONSOLE_CONNECT) #define ast_opt_lock_confdir ast_test_flag(&ast_options, AST_OPT_FLAG_LOCK_CONFIG_DIR) diff --git a/main/Makefile b/main/Makefile index ade396811..a019a0855 100644 --- a/main/Makefile +++ b/main/Makefile @@ -165,6 +165,8 @@ ifneq ($(findstring ENABLE_UPLOADS,$(MENUSELECT_CFLAGS)),) GMIMELDFLAGS+=$(GMIME_LIB) endif +$(OBJS): _ASTCFLAGS+=-DAST_MODULE=\"core\" + $(MAIN_TGT): $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) asterisk.exports @$(CC) -c -o buildinfo.o $(_ASTCFLAGS) buildinfo.c $(ASTCFLAGS) $(ECHO_PREFIX) echo " [LD] $(OBJS) editline/libedit.a db1-ast/libdb1.a $(AST_EMBED_LDSCRIPTS) -> $@" diff --git a/main/cli.c b/main/cli.c index 6d227fb1e..99dc1b54b 100644 --- a/main/cli.c +++ b/main/cli.c @@ -77,20 +77,20 @@ AST_MUTEX_DEFINE_STATIC(permsconfiglock); static AST_RWLIST_HEAD_STATIC(cli_perms, usergroup_cli_perm); /*! - * \brief map a debug or verbose value to a filename + * \brief map a debug or verbose level to a module name */ -struct ast_debug_file { +struct module_level { unsigned int level; - AST_RWLIST_ENTRY(ast_debug_file) entry; - char filename[0]; + AST_RWLIST_ENTRY(module_level) entry; + char module[0]; }; -AST_RWLIST_HEAD(debug_file_list, ast_debug_file); +AST_RWLIST_HEAD(module_level_list, module_level); -/*! list of filenames and their debug settings */ -static struct debug_file_list debug_files; -/*! list of filenames and their verbose settings */ -static struct debug_file_list verbose_files; +/*! list of module names and their debug levels */ +static struct module_level_list debug_modules; +/*! list of module names and their verbose levels */ +static struct module_level_list verbose_modules; AST_THREADSTORAGE(ast_cli_buf); @@ -115,36 +115,36 @@ void ast_cli(int fd, const char *fmt, ...) } } -unsigned int ast_debug_get_by_file(const char *file) +unsigned int ast_debug_get_by_module(const char *module) { - struct ast_debug_file *adf; + struct module_level *ml; unsigned int res = 0; - AST_RWLIST_RDLOCK(&debug_files); - AST_LIST_TRAVERSE(&debug_files, adf, entry) { - if (!strncasecmp(adf->filename, file, strlen(adf->filename))) { - res = adf->level; + AST_RWLIST_RDLOCK(&debug_modules); + AST_LIST_TRAVERSE(&debug_modules, ml, entry) { + if (!strcasecmp(ml->module, module)) { + res = ml->level; break; } } - AST_RWLIST_UNLOCK(&debug_files); + AST_RWLIST_UNLOCK(&debug_modules); return res; } -unsigned int ast_verbose_get_by_file(const char *file) +unsigned int ast_verbose_get_by_module(const char *module) { - struct ast_debug_file *adf; + struct module_level *ml; unsigned int res = 0; - AST_RWLIST_RDLOCK(&verbose_files); - AST_LIST_TRAVERSE(&verbose_files, adf, entry) { - if (!strncasecmp(adf->filename, file, strlen(file))) { - res = adf->level; + AST_RWLIST_RDLOCK(&verbose_modules); + AST_LIST_TRAVERSE(&verbose_modules, ml, entry) { + if (!strcasecmp(ml->module, module)) { + res = ml->level; break; } } - AST_RWLIST_UNLOCK(&verbose_files); + AST_RWLIST_UNLOCK(&verbose_modules); return res; } @@ -305,17 +305,17 @@ static char *handle_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args * \brief Find the debug or verbose file setting * \arg debug 1 for debug, 0 for verbose */ -static struct ast_debug_file *find_debug_file(const char *fn, unsigned int debug) +static struct module_level *find_module_level(const char *module, unsigned int debug) { - struct ast_debug_file *df = NULL; - struct debug_file_list *dfl = debug ? &debug_files : &verbose_files; + struct module_level *ml; + struct module_level_list *mll = debug ? &debug_modules : &verbose_modules; - AST_LIST_TRAVERSE(dfl, df, entry) { - if (!strcasecmp(df->filename, fn)) - break; + AST_LIST_TRAVERSE(mll, ml, entry) { + if (!strcasecmp(ml->module, module)) + return ml; } - return df; + return NULL; } static char *complete_number(const char *partial, unsigned int min, unsigned int max, int n) @@ -369,23 +369,22 @@ static char *handle_verbose(struct ast_cli_entry *e, int cmd, struct ast_cli_arg const char *argv3 = a->argv ? S_OR(a->argv[3], "") : ""; int *dst; char *what; - struct debug_file_list *dfl; - struct ast_debug_file *adf; - const char *fn; + struct module_level_list *mll; + struct module_level *ml; switch (cmd) { case CLI_INIT: e->command = "core set {debug|verbose}"; e->usage = #if !defined(LOW_MEMORY) - "Usage: core set {debug|verbose} [atleast] [filename]\n" + "Usage: core set {debug|verbose} [atleast] [module]\n" #else "Usage: core set {debug|verbose} [atleast] \n" #endif " core set {debug|verbose} off\n" #if !defined(LOW_MEMORY) - " Sets level of debug or verbose messages to be displayed or \n" - " sets a filename to display debug messages from.\n" + " Sets level of debug or verbose messages to be displayed or\n" + " sets a module name to display debug messages from.\n" #else " Sets level of debug or verbose messages to be displayed.\n" #endif @@ -440,13 +439,14 @@ static char *handle_verbose(struct ast_cli_entry *e, int cmd, struct ast_cli_arg unsigned int debug = (*what == 'C'); newlevel = 0; - dfl = debug ? &debug_files : &verbose_files; + mll = debug ? &debug_modules : &verbose_modules; - AST_RWLIST_WRLOCK(dfl); - while ((adf = AST_RWLIST_REMOVE_HEAD(dfl, entry))) - ast_free(adf); - ast_clear_flag(&ast_options, debug ? AST_OPT_FLAG_DEBUG_FILE : AST_OPT_FLAG_VERBOSE_FILE); - AST_RWLIST_UNLOCK(dfl); + AST_RWLIST_WRLOCK(mll); + while ((ml = AST_RWLIST_REMOVE_HEAD(mll, entry))) { + ast_free(ml); + } + ast_clear_flag(&ast_options, debug ? AST_OPT_FLAG_DEBUG_MODULE : AST_OPT_FLAG_VERBOSE_MODULE); + AST_RWLIST_UNLOCK(mll); goto done; } @@ -458,43 +458,47 @@ static char *handle_verbose(struct ast_cli_entry *e, int cmd, struct ast_cli_arg return CLI_SHOWUSAGE; if (argc == e->args + atleast + 2) { unsigned int debug = (*what == 'C'); - dfl = debug ? &debug_files : &verbose_files; + char *mod = ast_strdupa(argv[e->args + atleast + 1]); - fn = argv[e->args + atleast + 1]; + mll = debug ? &debug_modules : &verbose_modules; - AST_RWLIST_WRLOCK(dfl); + if ((strlen(mod) > 3) && !strcasecmp(mod + strlen(mod) - 3, ".so")) { + mod[strlen(mod) - 3] = '\0'; + } - if ((adf = find_debug_file(fn, debug)) && !newlevel) { - AST_RWLIST_REMOVE(dfl, adf, entry); - if (AST_RWLIST_EMPTY(dfl)) - ast_clear_flag(&ast_options, debug ? AST_OPT_FLAG_DEBUG_FILE : AST_OPT_FLAG_VERBOSE_FILE); - AST_RWLIST_UNLOCK(dfl); - ast_cli(fd, "%s was %d and has been set to 0 for '%s'\n", what, adf->level, fn); - ast_free(adf); + AST_RWLIST_WRLOCK(mll); + + if ((ml = find_module_level(mod, debug)) && !newlevel) { + AST_RWLIST_REMOVE(mll, ml, entry); + if (AST_RWLIST_EMPTY(mll)) + ast_clear_flag(&ast_options, debug ? AST_OPT_FLAG_DEBUG_MODULE : AST_OPT_FLAG_VERBOSE_MODULE); + AST_RWLIST_UNLOCK(mll); + ast_cli(fd, "%s was %d and has been set to 0 for '%s'\n", what, ml->level, mod); + ast_free(ml); return CLI_SUCCESS; } - if (adf) { - if ((atleast && newlevel < adf->level) || adf->level == newlevel) { - ast_cli(fd, "%s is %d for '%s'\n", what, adf->level, fn); - AST_RWLIST_UNLOCK(dfl); + if (ml) { + if ((atleast && newlevel < ml->level) || ml->level == newlevel) { + ast_cli(fd, "%s is %d for '%s'\n", what, ml->level, mod); + AST_RWLIST_UNLOCK(mll); return CLI_SUCCESS; } - } else if (!(adf = ast_calloc(1, sizeof(*adf) + strlen(fn) + 1))) { - AST_RWLIST_UNLOCK(dfl); + } else if (!(ml = ast_calloc(1, sizeof(*ml) + strlen(mod) + 1))) { + AST_RWLIST_UNLOCK(mll); return CLI_FAILURE; } - oldval = adf->level; - adf->level = newlevel; - strcpy(adf->filename, fn); + oldval = ml->level; + ml->level = newlevel; + strcpy(ml->module, mod); - ast_set_flag(&ast_options, debug ? AST_OPT_FLAG_DEBUG_FILE : AST_OPT_FLAG_VERBOSE_FILE); + ast_set_flag(&ast_options, debug ? AST_OPT_FLAG_DEBUG_MODULE : AST_OPT_FLAG_VERBOSE_MODULE); - AST_RWLIST_INSERT_TAIL(dfl, adf, entry); - AST_RWLIST_UNLOCK(dfl); + AST_RWLIST_INSERT_TAIL(mll, ml, entry); + AST_RWLIST_UNLOCK(mll); - ast_cli(fd, "%s was %d and has been set to %d for '%s'\n", what, oldval, adf->level, adf->filename); + ast_cli(fd, "%s was %d and has been set to %d for '%s'\n", what, oldval, ml->level, ml->module); return CLI_SUCCESS; } diff --git a/pbx/Makefile b/pbx/Makefile index 99d97f297..a328dc461 100644 --- a/pbx/Makefile +++ b/pbx/Makefile @@ -32,3 +32,4 @@ dundi-parser.o: _ASTCFLAGS+=-I. pbx_gtkconsole.o: _ASTCFLAGS+=-Wno-strict-prototypes $(if $(filter pbx_dundi,$(EMBEDDED_MODS)),modules.link,pbx_dundi.so): dundi-parser.o +dundi-parser.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,pbx_dundi) diff --git a/res/Makefile b/res/Makefile index aeb317004..2f2abe2b4 100644 --- a/res/Makefile +++ b/res/Makefile @@ -37,13 +37,14 @@ ael/ael_lex.o: _ASTCFLAGS+=-I. -Iael -Wno-unused ael/ael.tab.o: ael/ael.tab.c ael/ael.tab.h ../include/asterisk/ael_structs.h ael/ael.tab.o: _ASTCFLAGS+=-I. -Iael -DYYENABLE_NLS=0 -ais/clm.o ais/evt.o: _ASTCFLAGS+=${AIS_INCLUDE} - $(if $(filter res_ais,$(EMBEDDED_MODS)),modules.link,res_ais.so): ais/clm.o ais/evt.o +ais/clm.o ais/evt.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,res_ais) $(if $(filter res_snmp,$(EMBEDDED_MODS)),modules.link,res_snmp.so): snmp/agent.o +snmp/agent.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,res_snmp) $(if $(filter res_ael_share,$(EMBEDDED_MODS)),modules.link,res_ael_share.so): ael/ael_lex.o ael/ael.tab.o ael/pval.o +ael/ael_lex.o ael/ael.tab.o ael/pval.o: _ASTCFLAGS+=$(call MOD_ASTCFLAGS,res_ael_share) ifneq ($(findstring REBUILD_PARSERS,$(MENUSELECT_CFLAGS)),) ael/ael_lex.c: ael/ael.flex