// Copyright 1999, 2007 Google Inc. All Rights Reserved. // Author: Ray Sidney and many others // // Defines the VLOG_IS_ON macro that controls the variable-verbosity // conditional logging. // // It's used by VLOG and VLOG_IF in logging.h // and by RAW_VLOG in raw_logging.h to trigger the logging. // // It can also be used directly e.g. like this: // if (VLOG_IS_ON(2)) { // // do some logging preparation and logging // // that can't be accomplished e.g. via just VLOG(2) << ...; // } // // The truth value that VLOG_IS_ON(level) returns is determined by // the three verbosity level flags: // --v= Gives the default maximal active V-logging level; // 0 is the default. // Normally positive values are used for V-logging levels. // --vmodule= Gives the per-module maximal V-logging levels to override // the value given by --v. // E.g. "my_module=2,foo*=3" would change the logging level // for all code in source files "my_module.*" and "foo*.*" // ("-inl" suffixes are also disregarded for this matching). // // SetVLOGLevel helper function is provided to do limited dynamic control over // V-logging by overriding the per-module settings given via --vmodule flag. // // CAVEAT: --vmodule functionality is not available in non gcc compilers. // #ifndef BASE_VLOG_IS_ON_H_ #define BASE_VLOG_IS_ON_H_ #include "glog/log_severity.h" #if defined(__GNUC__) // We emit an anonymous static int* variable at every VLOG_IS_ON(n) site. // (Normally) the first time every VLOG_IS_ON(n) site is hit, // we determine what variable will dynamically control logging at this site: // it's either FLAGS_v or an appropriate internal variable // matching the current source file that represents results of // parsing of --vmodule flag and/or SetVLOGLevel calls. #define VLOG_IS_ON(verboselevel) \ ({ static @ac_google_namespace@::int32* vlocal__ = &@ac_google_namespace@::kLogSiteUninitialized; \ @ac_google_namespace@::int32 verbose_level__ = (verboselevel); \ (*vlocal__ >= verbose_level__) && \ ((vlocal__ != &@ac_google_namespace@::kLogSiteUninitialized) || \ (@ac_google_namespace@::InitVLOG3__(&vlocal__, &FLAGS_v, \ __FILE__, verbose_level__))); }) #else // GNU extensions not available, so we do not support --vmodule. // Dynamic value of FLAGS_v always controls the logging level. #define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel)) #endif // Set VLOG(_IS_ON) level for module_pattern to log_level. // This lets us dynamically control what is normally set by the --vmodule flag. // Returns the level that previously applied to module_pattern. // NOTE: To change the log level for VLOG(_IS_ON) sites // that have already executed after/during InitGoogleLogging, // one needs to supply the exact --vmodule pattern that applied to them. // (If no --vmodule pattern applied to them // the value of FLAGS_v will continue to control them.) extern int SetVLOGLevel(const char* module_pattern, int log_level); // Various declarations needed for VLOG_IS_ON above: ========================= // Special value used to indicate that a VLOG_IS_ON site has not been // initialized. We make this a large value, so the common-case check // of "*vlocal__ >= verbose_level__" in VLOG_IS_ON definition // passes in such cases and InitVLOG3__ is then triggered. extern @ac_google_namespace@::int32 kLogSiteUninitialized; // Helper routine which determines the logging info for a particalur VLOG site. // site_flag is the address of the site-local pointer to the controlling // verbosity level // site_default is the default to use for *site_flag // fname is the current source file name // verbose_level is the argument to VLOG_IS_ON // We will return the return value for VLOG_IS_ON // and if possible set *site_flag appropriately. extern bool InitVLOG3__(@ac_google_namespace@::int32** site_flag, @ac_google_namespace@::int32* site_default, const char* fname, @ac_google_namespace@::int32 verbose_level); #endif // BASE_VLOG_IS_ON_H_