#include "sdcpp_logger_adapter.h" #include #include "otherarch/sdcpp/src/core/util.h" static std::atomic previous_ggml_log_callback{nullptr}; static std::atomic previous_ggml_log_user_data{nullptr}; static std::atomic preserve_ggml_logger{false}; void kcpp_sd_preserve_ggml_logger() { ggml_log_callback current_callback = nullptr; void* current_user_data = nullptr; ggml_log_get(¤t_callback, ¤t_user_data); if (current_callback != kcpp_sd_ggml_log_callback) { previous_ggml_log_callback.store(current_callback, std::memory_order_relaxed); previous_ggml_log_user_data.store(current_user_data, std::memory_order_relaxed); } preserve_ggml_logger.store(true, std::memory_order_release); } void kcpp_sd_ggml_log_callback(ggml_log_level level, const char* text, void*) { if (preserve_ggml_logger.load(std::memory_order_acquire)) { ggml_log_callback callback = previous_ggml_log_callback.load(std::memory_order_relaxed); if (callback != nullptr && callback != kcpp_sd_ggml_log_callback) { callback(level, text, previous_ggml_log_user_data.load(std::memory_order_relaxed)); } return; } // stable-diffusion.cpp's standalone tools still use the SD logger. GGML // supplies an already formatted string, so it must be passed as data. switch (level) { case GGML_LOG_LEVEL_DEBUG: LOG_VERBOSE("%s", text); break; case GGML_LOG_LEVEL_INFO: LOG_INFO("%s", text); break; case GGML_LOG_LEVEL_WARN: LOG_WARN("%s", text); break; case GGML_LOG_LEVEL_ERROR: LOG_ERROR("%s", text); break; default: LOG_VERBOSE("%s", text); break; } }