- CMakeLists в корне: ветвление ESP_PLATFORM (idf_component_register, lwip/esp_timer/esp_hw_support/pthread) / POSIX (статическая библиотека fgl-aircon, C++20, -fno-exceptions -fno-rtti, -Werror). - src/ayla/platform: сокеты/потоки/CSPRNG/время; posix (getrandom, poll, pthread_join) и esp-idf (lwip_select, esp_fill_random, pthread-слой IDF); tcp_shutdown/tcp_local_port/thread_join для управляемой остановки. - src/ayla: log (sink, без printf); мини-httpd/1.1 (keep-alive, Content-Length, лимиты заголовков/тела, ephemeral-порт, жизненный цикл с гарантией завершения потока: shutdown(active)→join→close). - tests/ayla: platform (join, loopback+shutdown) и httpd (404, keep-alive, обработчик/парсинг, oversize-400, stop при живом соединении, стрим заголовков). doctest через FetchContent. - scripts/ci.sh: сборка+ctest. ESP-IDF v5.5.5 esp32: смоук-сборка с ядром как компонентом — Project build complete. Ревью под-агентом: 3 круга, все блокеры (жизненный цикл httpd) закрыты, APPROVED.
33 lines
1.3 KiB
C++
33 lines
1.3 KiB
C++
// Логирование ядра: без printf в stdout, вывод через настраиваемый sink.
|
|
// Вызовы из внутреннего потока сессии; sink должен быть быстрым и реентерабельным.
|
|
#pragma once
|
|
|
|
#include <cstddef>
|
|
|
|
namespace fgl::ayla::log {
|
|
|
|
enum Level : int {
|
|
kDebug = 0,
|
|
kInfo = 1,
|
|
kWarn = 2,
|
|
kError = 3,
|
|
};
|
|
|
|
using Sink = void (*)(int level, const char* msg, size_t len, void* ctx);
|
|
|
|
// Устанавливает приёмник логов (глобально). nullptr — логирование отключено.
|
|
void set_sink(Sink sink, void* ctx);
|
|
|
|
// Форматирует в фиксированный буфер (без кучи) и отправляет в sink.
|
|
void write(int level, const char* fmt, ...) __attribute__((format(printf, 2, 3)));
|
|
|
|
int min_level(); // по умолчанию kInfo
|
|
void set_min_level(int level);
|
|
|
|
} // namespace fgl::ayla::log
|
|
|
|
#define FGL_LOGD(...) ::fgl::ayla::log::write(::fgl::ayla::log::kDebug, __VA_ARGS__)
|
|
#define FGL_LOGI(...) ::fgl::ayla::log::write(::fgl::ayla::log::kInfo, __VA_ARGS__)
|
|
#define FGL_LOGW(...) ::fgl::ayla::log::write(::fgl::ayla::log::kWarn, __VA_ARGS__)
|
|
#define FGL_LOGE(...) ::fgl::ayla::log::write(::fgl::ayla::log::kError, __VA_ARGS__)
|