mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-09-24 20:20:37 +00:00
fix: avoid passing ggml logs as format strings (#2002)
This commit is contained in:
parent
008ca5b492
commit
b8248a869c
@ -62,17 +62,34 @@ void replace_all_chars(std::string& str, char target, char replacement) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string sd_vformat(const char* fmt, va_list ap) {
|
||||||
|
char small[128];
|
||||||
|
va_list ap2;
|
||||||
|
va_copy(ap2, ap);
|
||||||
|
int size = vsnprintf(small, sizeof small, fmt, ap);
|
||||||
|
if (size < 0) {
|
||||||
|
va_end(ap2);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
size_t needed = (size_t)size;
|
||||||
|
if (needed < sizeof small) {
|
||||||
|
va_end(ap2);
|
||||||
|
return std::string(small, needed);
|
||||||
|
}
|
||||||
|
std::string out(needed, '\0');
|
||||||
|
int size2 = vsnprintf(out.data(), needed + 1, fmt, ap2);
|
||||||
|
va_end(ap2);
|
||||||
|
if (size2 < 0)
|
||||||
|
out.clear();
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
std::string sd_format(const char* fmt, ...) {
|
std::string sd_format(const char* fmt, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_list ap2;
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
va_copy(ap2, ap);
|
std::string result = sd_vformat(fmt, ap);
|
||||||
int size = vsnprintf(nullptr, 0, fmt, ap);
|
|
||||||
std::vector<char> buf(size + 1);
|
|
||||||
int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2);
|
|
||||||
va_end(ap2);
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return std::string(buf.data(), size);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int round_up_to(int value, int base) {
|
int round_up_to(int value, int base) {
|
||||||
@ -624,47 +641,45 @@ std::string trim(const std::string& s) {
|
|||||||
static sd_log_cb_t sd_log_cb = nullptr;
|
static sd_log_cb_t sd_log_cb = nullptr;
|
||||||
void* sd_log_cb_data = nullptr;
|
void* sd_log_cb_data = nullptr;
|
||||||
|
|
||||||
#define LOG_BUFFER_SIZE 4096
|
static void sd_log_dispatch(sd_log_level_t level, const std::string& origin, const std::string& text) {
|
||||||
|
if (sd_log_cb == nullptr)
|
||||||
|
return;
|
||||||
|
std::string message = origin + " - " + text;
|
||||||
|
if (message.back() != '\n') {
|
||||||
|
message += '\n';
|
||||||
|
}
|
||||||
|
sd_log_cb(level, message.c_str(), sd_log_cb_data);
|
||||||
|
}
|
||||||
|
|
||||||
void log_printf(sd_log_level_t level, const char* file, int line, const char* format, ...) {
|
void log_printf(sd_log_level_t level, const char* file, int line, const char* format, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
|
std::string message = sd_vformat(format, args);
|
||||||
static char log_buffer[LOG_BUFFER_SIZE + 1];
|
|
||||||
int written = snprintf(log_buffer, LOG_BUFFER_SIZE, "%s:%-4d - ", sd_basename(file).c_str(), line);
|
|
||||||
|
|
||||||
if (written >= 0 && written < LOG_BUFFER_SIZE) {
|
|
||||||
vsnprintf(log_buffer + written, LOG_BUFFER_SIZE - written, format, args);
|
|
||||||
}
|
|
||||||
size_t len = strlen(log_buffer);
|
|
||||||
if (log_buffer[len - 1] != '\n') {
|
|
||||||
strncat(log_buffer, "\n", LOG_BUFFER_SIZE - len);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sd_log_cb) {
|
|
||||||
sd_log_cb(level, log_buffer, sd_log_cb_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
std::string origin = sd_format("%s:%-4d", sd_basename(file).c_str(), line);
|
||||||
|
sd_log_dispatch(level, origin, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sd_ggml_log_callback(ggml_log_level level, const char* text, void*) {
|
void sd_ggml_log_callback(ggml_log_level level, const char* text, void*) {
|
||||||
|
sd_log_level_t sd_level = SD_LOG_VERBOSE;
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case GGML_LOG_LEVEL_DEBUG:
|
case GGML_LOG_LEVEL_DEBUG:
|
||||||
LOG_VERBOSE(text);
|
sd_level = SD_LOG_VERBOSE;
|
||||||
break;
|
break;
|
||||||
case GGML_LOG_LEVEL_INFO:
|
case GGML_LOG_LEVEL_INFO:
|
||||||
LOG_INFO(text);
|
sd_level = SD_LOG_INFO;
|
||||||
break;
|
break;
|
||||||
case GGML_LOG_LEVEL_WARN:
|
case GGML_LOG_LEVEL_WARN:
|
||||||
LOG_WARN(text);
|
sd_level = SD_LOG_WARN;
|
||||||
break;
|
break;
|
||||||
case GGML_LOG_LEVEL_ERROR:
|
case GGML_LOG_LEVEL_ERROR:
|
||||||
LOG_ERROR(text);
|
sd_level = SD_LOG_ERROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG_VERBOSE(text);
|
sd_level = SD_LOG_VERBOSE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
sd_log_dispatch(sd_level, "ggml", text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sd_set_log_callback(sd_log_cb_t cb, void* data) {
|
void sd_set_log_callback(sd_log_cb_t cb, void* data) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user