feat: EventThrottler
This commit is contained in:
parent
c506829e4e
commit
ac22b59a40
31
include/services/event_throttler.hpp
Normal file
31
include/services/event_throttler.hpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <deque>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace event_throttler
|
||||||
|
{
|
||||||
|
typedef std::chrono::duration<double, std::milli> timewindow_t;
|
||||||
|
typedef std::chrono::high_resolution_clock timepoint_clock_t;
|
||||||
|
typedef event_throttler::timepoint_clock_t::time_point timepoint_t;
|
||||||
|
typedef std::deque<event_throttler::timepoint_t> queue_t;
|
||||||
|
typedef std::size_t limit_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
class EventThrottler
|
||||||
|
{
|
||||||
|
event_throttler::queue_t event_queue;
|
||||||
|
event_throttler::limit_t passthrough_limit;
|
||||||
|
event_throttler::timewindow_t timewindow;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void expire();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit EventThrottler(int limit, event_throttler::timewindow_t timewindow)
|
||||||
|
: passthrough_limit(limit), timewindow(timewindow) {}
|
||||||
|
|
||||||
|
bool passthrough();
|
||||||
|
};
|
@ -43,6 +43,7 @@ set(SOURCE_FILES
|
|||||||
"src/modules/text.cpp"
|
"src/modules/text.cpp"
|
||||||
"src/services/builder.cpp"
|
"src/services/builder.cpp"
|
||||||
"src/services/command.cpp"
|
"src/services/command.cpp"
|
||||||
|
"src/services/event_throttler.cpp"
|
||||||
"src/services/inotify.cpp"
|
"src/services/inotify.cpp"
|
||||||
"src/services/logger.cpp"
|
"src/services/logger.cpp"
|
||||||
# "src/services/store.cpp"
|
# "src/services/store.cpp"
|
||||||
|
40
src/services/event_throttler.cpp
Normal file
40
src/services/event_throttler.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "services/event_throttler.hpp"
|
||||||
|
#include "services/logger.hpp"
|
||||||
|
|
||||||
|
using namespace event_throttler;
|
||||||
|
|
||||||
|
bool EventThrottler::passthrough()
|
||||||
|
{
|
||||||
|
// Remove expired frames from the queue
|
||||||
|
this->expire();
|
||||||
|
|
||||||
|
// Place the new frame in the bottom of the deck
|
||||||
|
this->event_queue.emplace_back(timepoint_clock_t::now());
|
||||||
|
|
||||||
|
// Check if the limit has been reached
|
||||||
|
if (this->event_queue.size() >= this->passthrough_limit) {
|
||||||
|
// std::this_thread::sleep_for(this->timewindow * this->event_queue.size());
|
||||||
|
std::this_thread::sleep_for(this->timewindow);
|
||||||
|
|
||||||
|
if (this->event_queue.size() - 1 >= this->passthrough_limit) {
|
||||||
|
log_trace("Event passthrough throttled");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventThrottler::expire()
|
||||||
|
{
|
||||||
|
auto now = timepoint_clock_t::now();
|
||||||
|
|
||||||
|
while (this->event_queue.size() > 0) {
|
||||||
|
if ((now - this->event_queue.front()) < this->timewindow)
|
||||||
|
break;
|
||||||
|
|
||||||
|
this->event_queue.pop_front();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user