diff options
| -rw-r--r-- | src/blissful_monitor.cc | 10 | ||||
| -rw-r--r-- | src/fake_monitor.cc | 45 | ||||
| -rw-r--r-- | src/main.cc | 19 | ||||
| -rw-r--r-- | src/monitor.cc | 6 | ||||
| -rw-r--r-- | src/monitor.hh | 4 |
5 files changed, 80 insertions, 4 deletions
diff --git a/src/blissful_monitor.cc b/src/blissful_monitor.cc index 0f23970..8addc45 100644 --- a/src/blissful_monitor.cc +++ b/src/blissful_monitor.cc @@ -9,7 +9,11 @@ namespace { +#if FAKE_MONITOR +static const double JOB_EXPIRE_S = 1 * 60.0; // 1 min +#else static const double JOB_EXPIRE_S = 10 * 60.0; // 10 min +#endif class BlissfulMonitorImpl : public BlissfulMonitor, private Monitor::Observer { public: @@ -57,6 +61,12 @@ public: observers_.remove(observer); } +#if FAKE_MONITOR + void toggle_fakes() override { + monitor_->toggle_fakes(); + } +#endif + private: struct Job { uint32_t source; diff --git a/src/fake_monitor.cc b/src/fake_monitor.cc index a444476..336ad9c 100644 --- a/src/fake_monitor.cc +++ b/src/fake_monitor.cc @@ -83,6 +83,40 @@ public: observers_.remove(observer); } +#if FAKE_MONITOR + void toggle_fakes() override { + if (timer_) { + looper_->cancel(timer_); + timer_ = 0; + +#if 0 + remove_jobs((jobs_.size() * 3) / 4); +#else + auto index = rand() % machines_.size(); + auto it = machines_.begin(); + while (index--) ++it; + auto id = it->first; + machines_.erase(it); + auto jit = jobs_.begin(); + while (jit != jobs_.end()) { + if (jit->second.worker == id) { + jit = jobs_.erase(jit); + } else { + ++jit; + } + } + auto observer = observers_.first(); + while (observer) { + observer->removed_machine(this, id); + observer = observers_.next(); + } +#endif + } else { + schedule_jobs(); + } + } +#endif + private: struct Job { uint32_t const host; @@ -145,10 +179,7 @@ private: std::placeholders::_2)); } - void fiddle_jobs(Looper*, uint32_t) { - timer_ = 0; - - auto remove = !jobs_.empty() ? rand() % jobs_.size() : 0; + void remove_jobs(size_t remove) { while (remove--) { auto it = jobs_.begin(); auto job = it->second; @@ -160,6 +191,12 @@ private: observer = observers_.next(); } } + } + + void fiddle_jobs(Looper*, uint32_t) { + timer_ = 0; + + remove_jobs(!jobs_.empty() ? rand() % jobs_.size() : 0); auto avail = (max_jobs_ * 7) / 8 - jobs_.size(); auto add = avail ? rand() % avail : 0; diff --git a/src/main.cc b/src/main.cc index 9285ccb..f7b3e58 100644 --- a/src/main.cc +++ b/src/main.cc @@ -239,6 +239,12 @@ public: io::write(pipe_, "q", 1); } +#if FAKE_MONITOR + void toggle_fakes() { + io::write(pipe_, " ", 1); + } +#endif + /* void quit_from_main(std::shared_ptr<x::Atoms> const& atoms) { // Wake up the event thread by sending an event to our window @@ -543,6 +549,12 @@ private: force_draw(); return; } +#if FAKE_MONITOR + if (tmp == ' ') { + monitor_->toggle_fakes(); + return; + } +#endif } } @@ -903,6 +915,13 @@ void xcb_event_loop(x::shared_connection const& conn, } break; } +#if FAKE_MONITOR + case ' ': + if (monmon->match(e->event)) { + monmon->toggle_fakes(); + } + break; +#endif } break; } diff --git a/src/monitor.cc b/src/monitor.cc index c665034..b9c6085 100644 --- a/src/monitor.cc +++ b/src/monitor.cc @@ -81,6 +81,12 @@ public: observers_.remove(observer); } +#if FAKE_MONITOR + void toggle_fakes() override { + assert(false); + } +#endif + private: static Machine const EMPTY; diff --git a/src/monitor.hh b/src/monitor.hh index 14168f0..bf9cb05 100644 --- a/src/monitor.hh +++ b/src/monitor.hh @@ -54,6 +54,10 @@ public: virtual void add_observer(Observer* observer) = 0; virtual void remove_observer(Observer* observer) = 0; +#if FAKE_MONITOR + virtual void toggle_fakes() = 0; +#endif + protected: Monitor() {} Monitor(Monitor const&) = delete; |
