mirror of
https://github.com/esphome/esphome.git
synced 2025-08-07 10:57:46 +00:00
Make defer FIFO
This commit is contained in:
parent
068594be5e
commit
ba4c268956
@ -244,11 +244,7 @@ void DeferredUpdateEventSourceList::on_client_disconnect_(DeferredUpdateEventSou
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WebServer::WebServer(web_server_base::WebServerBase *base) : base_(base) {
|
WebServer::WebServer(web_server_base::WebServerBase *base) : base_(base) {}
|
||||||
#ifdef USE_ESP32
|
|
||||||
to_schedule_lock_ = xSemaphoreCreateMutex();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_WEBSERVER_CSS_INCLUDE
|
#ifdef USE_WEBSERVER_CSS_INCLUDE
|
||||||
void WebServer::set_css_include(const char *css_include) { this->css_include_ = css_include; }
|
void WebServer::set_css_include(const char *css_include) { this->css_include_ = css_include; }
|
||||||
@ -297,30 +293,7 @@ void WebServer::setup() {
|
|||||||
// getting a lot of events
|
// getting a lot of events
|
||||||
this->set_interval(10000, [this]() { this->events_.try_send_nodefer("", "ping", millis(), 30000); });
|
this->set_interval(10000, [this]() { this->events_.try_send_nodefer("", "ping", millis(), 30000); });
|
||||||
}
|
}
|
||||||
void WebServer::loop() {
|
void WebServer::loop() { this->events_.loop(); }
|
||||||
#ifdef USE_ESP32
|
|
||||||
// Check atomic flag first to avoid taking semaphore when queue is empty
|
|
||||||
if (this->to_schedule_has_items_.load(std::memory_order_relaxed) && xSemaphoreTake(this->to_schedule_lock_, 0L)) {
|
|
||||||
std::function<void()> fn;
|
|
||||||
if (!to_schedule_.empty()) {
|
|
||||||
// scheduler execute things out of order which may lead to incorrect state
|
|
||||||
// this->defer(std::move(to_schedule_.front()));
|
|
||||||
// let's execute it directly from the loop
|
|
||||||
fn = std::move(to_schedule_.front());
|
|
||||||
to_schedule_.pop_front();
|
|
||||||
if (to_schedule_.empty()) {
|
|
||||||
this->to_schedule_has_items_.store(false, std::memory_order_relaxed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xSemaphoreGive(this->to_schedule_lock_);
|
|
||||||
if (fn) {
|
|
||||||
fn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
this->events_.loop();
|
|
||||||
}
|
|
||||||
void WebServer::dump_config() {
|
void WebServer::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG,
|
ESP_LOGCONFIG(TAG,
|
||||||
"Web Server:\n"
|
"Web Server:\n"
|
||||||
@ -2061,16 +2034,7 @@ void WebServer::add_sorting_group(uint64_t group_id, const std::string &group_na
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void WebServer::schedule_(std::function<void()> &&f) {
|
void WebServer::schedule_(std::function<void()> &&f) { this->defer(std::move(f)); }
|
||||||
#ifdef USE_ESP32
|
|
||||||
xSemaphoreTake(this->to_schedule_lock_, portMAX_DELAY);
|
|
||||||
to_schedule_.push_back(std::move(f));
|
|
||||||
this->to_schedule_has_items_.store(true, std::memory_order_relaxed);
|
|
||||||
xSemaphoreGive(this->to_schedule_lock_);
|
|
||||||
#else
|
|
||||||
this->defer(std::move(f));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace web_server
|
} // namespace web_server
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
@ -14,12 +14,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#ifdef USE_ESP32
|
|
||||||
#include <freertos/FreeRTOS.h>
|
|
||||||
#include <freertos/semphr.h>
|
|
||||||
#include <deque>
|
|
||||||
#include <atomic>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USE_WEBSERVER_VERSION >= 2
|
#if USE_WEBSERVER_VERSION >= 2
|
||||||
extern const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM;
|
extern const uint8_t ESPHOME_WEBSERVER_INDEX_HTML[] PROGMEM;
|
||||||
@ -522,11 +516,6 @@ class WebServer : public Controller, public Component, public AsyncWebHandler {
|
|||||||
const char *js_include_{nullptr};
|
const char *js_include_{nullptr};
|
||||||
#endif
|
#endif
|
||||||
bool expose_log_{true};
|
bool expose_log_{true};
|
||||||
#ifdef USE_ESP32
|
|
||||||
std::deque<std::function<void()>> to_schedule_;
|
|
||||||
SemaphoreHandle_t to_schedule_lock_;
|
|
||||||
std::atomic<bool> to_schedule_has_items_{false};
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace web_server
|
} // namespace web_server
|
||||||
|
Loading…
x
Reference in New Issue
Block a user