summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/blissful_monitor.cc10
-rw-r--r--src/fake_monitor.cc45
-rw-r--r--src/main.cc19
-rw-r--r--src/monitor.cc6
-rw-r--r--src/monitor.hh4
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;