9#ifdef USE_ESPHOME_TASK_LOG_BUFFER
11static inline uint32_t total_size_in_32bit_words(uint16_t text_length) {
16static inline uint32_t get_wlen(
const mpsc_pbuf_generic *item) {
17 return total_size_in_32bit_words(
reinterpret_cast<const TaskLogBuffer::LogMessage *
>(item)->text_length);
22 total_buffer_size = (total_buffer_size + 3) /
sizeof(uint32_t);
23 this->
mpsc_config_.buf =
new uint32_t[total_buffer_size];
34 const char *format, va_list args) {
37 va_copy(args_copy, args);
38 int ret = vsnprintf(
nullptr, 0, format, args_copy);
46 static constexpr size_t MAX_TEXT_SIZE = 255;
47 size_t text_length = (
static_cast<size_t>(ret) > MAX_TEXT_SIZE) ? MAX_TEXT_SIZE : ret;
48 size_t total_size = total_size_in_32bit_words(text_length);
49 auto *msg =
reinterpret_cast<LogMessage *
>(mpsc_pbuf_alloc(&this->
log_buffer_, total_size, K_NO_WAIT));
56 strncpy(msg->thread_name, thread_name,
sizeof(msg->thread_name) - 1);
57 msg->thread_name[
sizeof(msg->thread_name) - 1] =
'\0';
61 char *text_area = msg->text_data();
62 ret = vsnprintf(text_area, text_length + 1, format, args);
69 for (
size_t i = 0; i < text_length; ++i) {
72 text_area[text_length] = 0;
76 msg->text_length = text_length;
78 mpsc_pbuf_commit(&this->
log_buffer_,
reinterpret_cast<mpsc_pbuf_generic *
>(msg));
83 if (this->current_token_) {
87 this->current_token_ = mpsc_pbuf_claim(&this->
log_buffer_);
89 if (this->current_token_ ==
nullptr) {
94 message =
const_cast<LogMessage *
>(
reinterpret_cast<const LogMessage *
>(this->current_token_));
96 text_length =
message->text_length;
98 while (text_length > 0 &&
message->text_data()[text_length - 1] ==
'\n') {
106 if (this->current_token_ ==
nullptr) {
109 mpsc_pbuf_free(&this->
log_buffer_, this->current_token_);
110 this->current_token_ =
nullptr;
void release_message_main_loop()
mpsc_pbuf_buffer log_buffer_
TaskLogBuffer(size_t total_buffer_size)
mpsc_pbuf_buffer_config mpsc_config_
bool borrow_message_main_loop(LogMessage *&message, uint16_t &text_length)
bool send_message_thread_safe(uint8_t level, const char *tag, uint16_t line, const char *thread_name, const char *format, va_list args)
__thread bool non_main_task_recursion_guard_