diff --git a/external/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp b/external/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp index c9b2c224958737e64f9e2a454733aef07a5bade5..2c1dea22275bd686d67ce375c143f133570c1333 100644 --- a/external/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp +++ b/external/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp @@ -71,7 +71,6 @@ static GLESiface s_glesIface = { extern "C" { static void initGLESx() { - DBG("No special initialization necessary for GLES_CM\n"); return; } diff --git a/external/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/external/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp index 0e73b9dbe5ae5a53b66baa739ca4c5b51766249a..c49d4b70fae6e7c633c1c5246c6ee6795ccc70df 100644 --- a/external/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp +++ b/external/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp @@ -70,7 +70,6 @@ static GLESiface s_glesIface = { extern "C" { static void initGLESx() { - DBG("No special initialization necessary for GLES_V2\n"); return; } diff --git a/external/android-emugl/host/tools/emugen/ApiGen.cpp b/external/android-emugl/host/tools/emugen/ApiGen.cpp index 7e87c07a239aa41db774ae65959d8ac26ecc242c..c7713d2893d1b86bc7360426d4b2182b8075387e 100644 --- a/external/android-emugl/host/tools/emugen/ApiGen.cpp +++ b/external/android-emugl/host/tools/emugen/ApiGen.cpp @@ -823,12 +823,7 @@ int ApiGen::genDecoderImpl(const std::string &filename) fprintf(fp, "typedef unsigned int tsize_t; // Target \"size_t\", which is 32-bit for now. It may or may not be the same as host's size_t when emugen is compiled.\n\n"); // helper macros - fprintf(fp, - "#ifdef OPENGL_DEBUG_PRINTOUT\n" - "# define DEBUG(...) do { if (emugl_cxt_logger) { emugl_cxt_logger(__VA_ARGS__); } } while(0)\n" - "#else\n" - "# define DEBUG(...) ((void)0)\n" - "#endif\n\n"); + fprintf(fp, "# define DEBUG(...) do { if (emugl_cxt_logger) { emugl_cxt_logger(LogLevel::TRACE, __VA_ARGS__); } } while(0)\n\n"); fprintf(fp, "#ifdef CHECK_GLERROR\n" @@ -913,7 +908,7 @@ int ApiGen::genDecoderImpl(const std::string &filename) } } else if (pass == PASS_DebugPrint) { fprintf(fp, - "\t\t\tDEBUG(\"%s(%%p): %s(%s)\\n\", stream", + "\t\t\tDEBUG(\"%s(%%p): %s(%s)\", stream", m_basename.c_str(), e->name().c_str(), printString.c_str()); diff --git a/external/android-emugl/shared/OpenglCodecCommon/ChecksumCalculatorThreadInfo.cpp b/external/android-emugl/shared/OpenglCodecCommon/ChecksumCalculatorThreadInfo.cpp index 6a35c9203e6dcf5482698b9db1345a5e410dd6fe..aedfea1eb08ea0e3dd28dd2c25f27cd5faafdbfa 100644 --- a/external/android-emugl/shared/OpenglCodecCommon/ChecksumCalculatorThreadInfo.cpp +++ b/external/android-emugl/shared/OpenglCodecCommon/ChecksumCalculatorThreadInfo.cpp @@ -98,6 +98,6 @@ void ChecksumCalculatorThreadInfo::validOrDie(void* buf, // We should actually call crashhandler_die(message), but I don't think we // can link to that library from here if (!validate(buf, bufLen, checksum, checksumLen)) { - emugl_crash_reporter(message); + emugl_crash_reporter(emugl::LogLevel::FATAL, message); } } diff --git a/external/android-emugl/shared/emugl/common/crash_reporter.cpp b/external/android-emugl/shared/emugl/common/crash_reporter.cpp index b4e0267f76b38376de17a3e094103c2ce389bf4a..2df5d1bc7e63065ee46ae7c43f411aee87c9e347 100644 --- a/external/android-emugl/shared/emugl/common/crash_reporter.cpp +++ b/external/android-emugl/shared/emugl/common/crash_reporter.cpp @@ -18,13 +18,13 @@ #include -void default_crash_reporter(const char* format, ...) { +void default_crash_reporter(const emugl::LogLevel &level, const char* format, ...) { abort(); } -crash_reporter_t emugl_crash_reporter = default_crash_reporter; +logger_t emugl_crash_reporter = default_crash_reporter; -void set_emugl_crash_reporter(crash_reporter_t crash_reporter) { +void set_emugl_crash_reporter(logger_t crash_reporter) { if (crash_reporter) { emugl_crash_reporter = crash_reporter; } else { diff --git a/external/android-emugl/shared/emugl/common/crash_reporter.h b/external/android-emugl/shared/emugl/common/crash_reporter.h index 81bb21a7baba304bc95f9dbddf769ed48fa5897a..3f189ddeb8584c8fd0eed0007724bdd5d6ebbdcf 100644 --- a/external/android-emugl/shared/emugl/common/crash_reporter.h +++ b/external/android-emugl/shared/emugl/common/crash_reporter.h @@ -16,7 +16,7 @@ #pragma once -typedef void (*crash_reporter_t)(const char* format, ...); +#include "emugl/common/logging.h" -extern crash_reporter_t emugl_crash_reporter; -void set_emugl_crash_reporter(crash_reporter_t crash_reporter); +extern logger_t emugl_crash_reporter; +void set_emugl_crash_reporter(logger_t crash_reporter); diff --git a/external/android-emugl/shared/emugl/common/logging.cpp b/external/android-emugl/shared/emugl/common/logging.cpp index 1f40ea837a67136d606be8cbf584ba7c1e300a69..69a24da9413d783253f860a83d217ddfdfa64125 100644 --- a/external/android-emugl/shared/emugl/common/logging.cpp +++ b/external/android-emugl/shared/emugl/common/logging.cpp @@ -16,7 +16,7 @@ #include "emugl/common/logging.h" -void default_logger(const char* fmt, ...) { } +void default_logger(const emugl::LogLevel &level, const char* fmt, ...) { } logger_t emugl_logger = default_logger; logger_t emugl_cxt_logger = default_logger; diff --git a/external/android-emugl/shared/emugl/common/logging.h b/external/android-emugl/shared/emugl/common/logging.h index d8b00bd19fa22ea722dfe331144db0edc242b327..2fc1f15e91097dbeef766f6b9a9fd26313261360 100644 --- a/external/android-emugl/shared/emugl/common/logging.h +++ b/external/android-emugl/shared/emugl/common/logging.h @@ -14,10 +14,24 @@ * limitations under the License. */ +#ifndef EMUGL_COMMON_LOGGING_H_ +#define EMUGL_COMMON_LOGGING_H_ + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wredundant-decls" -typedef void (*logger_t)(const char* fmt, ...); +namespace emugl { +enum class LogLevel { + TRACE, + DEBUG, + INFO, + WARNING, + ERROR, + FATAL, +}; +} // namespace emugl + +typedef void (*logger_t)(const emugl::LogLevel &level, const char* fmt, ...); extern logger_t emugl_logger; extern logger_t emugl_cxt_logger; void set_emugl_logger(logger_t f); @@ -40,3 +54,5 @@ void set_emugl_cxt_logger(logger_t f); #endif #pragma GCC diagnostic pop + +#endif diff --git a/src/anbox/daemon.cpp b/src/anbox/daemon.cpp index 248a70cd5adaf37c756fbd9177a39ad545b7d5ab..6bb4e844e0ed7c0e9e953635d5879e1b4b0d7fa5 100644 --- a/src/anbox/daemon.cpp +++ b/src/anbox/daemon.cpp @@ -39,6 +39,12 @@ Daemon::Daemon() .command(std::make_shared()) .command(std::make_shared()) .command(std::make_shared()); + + Log().Init(anbox::Logger::Severity::kWarning); + + const auto log_level = utils::get_env_value("ANBOX_LOG_LEVEL", ""); + if (!log_level.empty() || !Log().SetSeverityFromString(log_level)) + WARNING("Failed to set logging severity to '%s'", log_level); } int Daemon::Run(const std::vector &arguments) try { diff --git a/src/anbox/graphics/emugl/RenderApi.cpp b/src/anbox/graphics/emugl/RenderApi.cpp index 93f343f603fcfb80136a544d0334dc6483588dcf..934be25bb3ae5ccdf12c8e0a0251faafa538abb1 100644 --- a/src/anbox/graphics/emugl/RenderApi.cpp +++ b/src/anbox/graphics/emugl/RenderApi.cpp @@ -23,7 +23,6 @@ #include "OpenGLESDispatch/GLESv2Dispatch.h" #include "emugl/common/crash_reporter.h" -#include "emugl/common/logging.h" #include @@ -50,7 +49,7 @@ std::vector default_gl_libraries(bool no_glesv1) { }; } -bool initialize(const std::vector &libs, emugl_logger_struct log_funcs, emugl_crash_func_t crash_func) { +bool initialize(const std::vector &libs, emugl_logger_struct log_funcs, logger_t crash_func) { set_emugl_crash_reporter(crash_func); set_emugl_logger(log_funcs.coarse); set_emugl_cxt_logger(log_funcs.fine); diff --git a/src/anbox/graphics/emugl/RenderApi.h b/src/anbox/graphics/emugl/RenderApi.h index 7d1e93d7fcb49fa4b553a46fe381320bcfa95d41..61c2c28f46ea95075bf475de4fdd4e61941a9fbd 100644 --- a/src/anbox/graphics/emugl/RenderApi.h +++ b/src/anbox/graphics/emugl/RenderApi.h @@ -21,12 +21,11 @@ #include -typedef void (*emugl_logger_func_t)(const char* fmt, ...); -typedef void (*emugl_crash_func_t)(const char* format, ...); +#include "emugl/common/logging.h" typedef struct { - emugl_logger_func_t coarse; - emugl_logger_func_t fine; + logger_t coarse; + logger_t fine; } emugl_logger_struct; namespace anbox { @@ -40,7 +39,7 @@ struct GLLibrary { std::vector default_gl_libraries(bool no_glesv1 = false); -bool initialize(const std::vector &libs, emugl_logger_struct log_funcs, emugl_crash_func_t crash_func); +bool initialize(const std::vector &libs, emugl_logger_struct log_funcs, logger_t crash_func); } // namespace emugl } // namespace graphics } // namespace anbox diff --git a/src/anbox/graphics/gl_renderer_server.cpp b/src/anbox/graphics/gl_renderer_server.cpp index f8337d4443f0ebc4328fdff4bff8d5f0f30b57bb..4da77f54f69b0f2af0fe0b0f125fbd481748f276 100644 --- a/src/anbox/graphics/gl_renderer_server.cpp +++ b/src/anbox/graphics/gl_renderer_server.cpp @@ -29,7 +29,9 @@ #include namespace { -void logger_write(const char *format, ...) { +void logger_write(const emugl::LogLevel &level, const char *format, ...) { + (void)level; + char message[2048]; va_list args; @@ -37,7 +39,25 @@ void logger_write(const char *format, ...) { vsnprintf(message, sizeof(message) - 1, format, args); va_end(args); - DEBUG("%s", message); + switch (level) { + case emugl::LogLevel::WARNING: + WARNING("%s", message); + break; + case emugl::LogLevel::ERROR: + ERROR("%s", message); + break; + case emugl::LogLevel::FATAL: + FATAL("%s", message); + break; + case emugl::LogLevel::DEBUG: + DEBUG("%s", message); + break; + case emugl::LogLevel::TRACE: + TRACE("%s", message); + break; + default: + break; + } } } diff --git a/src/anbox/logger.cpp b/src/anbox/logger.cpp index c2c2aedb702adc06bcac536d0265edbdde6c2b6c..f59803d47d3e70eb7bb07698fa941634b703e32a 100644 --- a/src/anbox/logger.cpp +++ b/src/anbox/logger.cpp @@ -30,8 +30,7 @@ namespace { namespace attrs { -BOOST_LOG_ATTRIBUTE_KEYWORD(Severity, "anbox::Severity", - anbox::Logger::Severity) +BOOST_LOG_ATTRIBUTE_KEYWORD(Severity, "anbox::Severity", anbox::Logger::Severity) BOOST_LOG_ATTRIBUTE_KEYWORD(Location, "Location", anbox::Logger::Location) BOOST_LOG_ATTRIBUTE_KEYWORD(Timestamp, "Timestamp", boost::posix_time::ptime) } @@ -39,8 +38,7 @@ BOOST_LOG_ATTRIBUTE_KEYWORD(Timestamp, "Timestamp", boost::posix_time::ptime) struct BoostLogLogger : public anbox::Logger { BoostLogLogger() : initialized_(false) {} - void Init(const anbox::Logger::Severity& severity = - anbox::Logger::Severity::kWarning) override { + void Init(const anbox::Logger::Severity& severity = anbox::Logger::Severity::kWarning) override { if (initialized_) return; boost::log::formatter formatter = @@ -58,25 +56,28 @@ struct BoostLogLogger : public anbox::Logger { auto logger = boost::log::add_console_log(std::cout); logger->set_formatter(formatter); - // FIXME need to enable this once we found how we wrap this - // properly into our service architecture. For now left as - // it is. - boost::ignore_unused_variable_warning(severity); - // logger->set_filter(attrs::Severity < severity); - + severity_ = severity; initialized_ = true; } - void Log(Severity severity, const std::string& message, - const boost::optional& loc) { + void SetSeverity(const Severity& severity) override { + severity_ = severity; + } + + void Log(Severity severity, const std::string& message, const boost::optional& loc) override { if (!initialized_) Init(); + // FIXME somehow set_filter doesn't work with the trivial logger. If + // we set a filter based on the severity attribute open_record will + // not return a new record. Because of that we do a poor man filtering + // here until we have a proper way to do this via boost. + if (severity < severity_) + return; + if (auto rec = boost::log::trivial::logger::get().open_record()) { boost::log::record_ostream out{rec}; out << boost::log::add_value(attrs::Severity, severity) - << boost::log::add_value( - attrs::Timestamp, - boost::posix_time::microsec_clock::universal_time()) + << boost::log::add_value(attrs::Timestamp, boost::posix_time::microsec_clock::universal_time()) << message; if (loc) { @@ -91,6 +92,7 @@ struct BoostLogLogger : public anbox::Logger { } private: + Severity severity_; bool initialized_; }; @@ -105,6 +107,24 @@ void SetInstance(const std::shared_ptr& logger) { } namespace anbox { +bool Logger::SetSeverityFromString(const std::string& severity) { + if (severity == "trace") + SetSeverity(Severity::kTrace); + else if (severity == "debug") + SetSeverity(Severity::kDebug); + else if (severity == "info") + SetSeverity(Severity::kInfo); + else if (severity == "warning") + SetSeverity(Severity::kWarning); + else if (severity == "error") + SetSeverity(Severity::kError); + else if (severity == "fatal") + SetSeverity(Severity::kFatal); + else + return false; + return true; +} + void Logger::Trace(const std::string& message, const boost::optional& location) { Log(Severity::kTrace, message, location); diff --git a/src/anbox/logger.h b/src/anbox/logger.h index 8f720644c2865c9601f632964d2f8af47b8575b3..6e797b65f76575c8129d43609f4546baf297940e 100644 --- a/src/anbox/logger.h +++ b/src/anbox/logger.h @@ -49,6 +49,9 @@ class Logger : public DoNotCopyOrMove { virtual void Init(const Severity& severity = Severity::kWarning) = 0; + bool SetSeverityFromString(const std::string &severity); + virtual void SetSeverity(const Severity& severity) = 0; + virtual void Log(Severity severity, const std::string& message, const boost::optional& location) = 0;