Files

78 lines
2.1 KiB
C++

/*
* Copyright (c) 2025 Amlogic, Inc. All rights reserved.
*
* This source code is subject to the terms and conditions defined in the
* file 'LICENSE' which is part of this source code package.
*
* Description:
*/
#include <unistd.h>
#include <stdlib.h>
#include "MesonLog.h"
#include <time.h>
#define MAX_MSG_BUF 512
#define TIME_BUF 64
static LogLevel g_backend_debug = LOG_LEVEL_INFO;
static int g_log_to_logcat = 0;
void meson_log_set_debug_level(LogLevel level) {
fprintf(stderr, "meson_log_set_debug_level:%d\n", level);
g_backend_debug = level;
}
void meson_log_set_log_to_logcat(int to_logcat) {
fprintf(stderr, "meson_log_set_log_to_logcat:%d\n", to_logcat);
g_log_to_logcat = to_logcat;
}
static const char* log_level_to_string(LogLevel level) {
switch (level) {
case LOG_LEVEL_ERROR:
return "[E]MesonDisplay: ";
case LOG_LEVEL_WARN:
return "[W]MesonDisplay: ";
case LOG_LEVEL_INFO:
return "[I]MesonDisplay: ";
case LOG_LEVEL_DEBUG:
return "[D]MesonDisplay: ";
case LOG_LEVEL_VERBOSE:
return "[V]MesonDisplay: ";
default:
return "UNKNOWN";
}
}
void meson_log_impl(LogLevel level, const char *fmt, ...) {
struct timespec ts;
char time_buf[TIME_BUF] = {0};
char final_msg[MAX_MSG_BUF] = {0};
va_list args;
if (level > g_backend_debug )
return;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
snprintf(time_buf, sizeof(time_buf), "%lld.%09lld", (long long)ts.tv_sec, (long long)ts.tv_nsec);
} else {
snprintf(time_buf, sizeof(time_buf), "0.0");
}
int len = snprintf(final_msg, sizeof(final_msg), "[%s][%s] ", time_buf, log_level_to_string(level));
if (len > 0 && len < sizeof(final_msg)) {
va_start(args, fmt);
int written = vsnprintf(final_msg + len, sizeof(final_msg) - len, fmt, args);
va_end(args);
if (written < 0) {
final_msg[len] = '\0';
}
}
if (g_log_to_logcat)
ALOGI("%s\n", final_msg);
else
fprintf(stderr, "%s\n", final_msg);
}