From 45abc127b1e8335aecd5315b61161644a23d6696 Mon Sep 17 00:00:00 2001 From: Jan Palus Date: Thu, 31 Dec 2020 11:58:09 +0100 Subject: [PATCH] add patches for reducing overhead of mpd plugin; rel 2 --- polybar-mpd-overhead.patch | 257 +++++++++++++++++++++++++++++++++++++ polybar.spec | 4 +- 2 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 polybar-mpd-overhead.patch diff --git a/polybar-mpd-overhead.patch b/polybar-mpd-overhead.patch new file mode 100644 index 0000000..9d07c28 --- /dev/null +++ b/polybar-mpd-overhead.patch @@ -0,0 +1,257 @@ +From b1b5cd6bbb1e0dea35e7b86429ff3e04fd67db9f Mon Sep 17 00:00:00 2001 +From: Jan Palus +Date: Wed, 23 Dec 2020 23:31:20 +0100 +Subject: [PATCH 1/5] feat(mpd): split noidle into noidle and recv_idle + +--- + include/adapters/mpd.hpp | 3 ++- + src/adapters/mpd.cpp | 15 ++++++++++++--- + src/modules/mpd.cpp | 3 ++- + 3 files changed, 16 insertions(+), 5 deletions(-) + +diff --git a/include/adapters/mpd.hpp b/include/adapters/mpd.hpp +index 2a152b01c..2e9b438e8 100644 +--- a/include/adapters/mpd.hpp ++++ b/include/adapters/mpd.hpp +@@ -91,7 +91,8 @@ namespace mpd { + + int get_fd(); + void idle(); +- int noidle(); ++ bool noidle(); ++ int recv_idle(); + + unique_ptr get_status(); + unique_ptr get_status_safe(); +diff --git a/src/adapters/mpd.cpp b/src/adapters/mpd.cpp +index 4a5438ad5..083427a9c 100644 +--- a/src/adapters/mpd.cpp ++++ b/src/adapters/mpd.cpp +@@ -201,12 +201,21 @@ namespace mpd { + } + } + +- int mpdconnection::noidle() { ++ bool mpdconnection::noidle() { ++ check_connection(m_connection.get()); ++ bool success = true; ++ if (m_idle) { ++ success = mpd_send_noidle(m_connection.get()); ++ } ++ return success; ++ } ++ ++ int mpdconnection::recv_idle() { + check_connection(m_connection.get()); + int flags = 0; +- if (m_idle && mpd_send_noidle(m_connection.get())) { +- m_idle = false; ++ if (m_idle) { + flags = mpd_recv_idle(m_connection.get(), true); ++ m_idle = false; + mpd_response_finish(m_connection.get()); + check_errors(m_connection.get()); + } +diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp +index ea867f281..1ba33c81c 100644 +--- a/src/modules/mpd.cpp ++++ b/src/modules/mpd.cpp +@@ -182,7 +182,8 @@ namespace modules { + m_mpd->idle(); + + int idle_flags = 0; +- if ((idle_flags = m_mpd->noidle()) != 0) { ++ m_mpd->noidle(); ++ if ((idle_flags = m_mpd->recv_idle()) != 0) { + // Update status on every event + m_status->update(idle_flags, m_mpd.get()); + return true; + +From 1e2d86354cf3553df202e3fddc848ee54b2ff872 Mon Sep 17 00:00:00 2001 +From: Jan Palus +Date: Fri, 25 Dec 2020 01:15:30 +0100 +Subject: [PATCH 2/5] feat(mpd): reduce wakeups/network traffic when not + tracking time + +--- + include/adapters/mpd.hpp | 1 + + src/adapters/mpd.cpp | 15 +++++++++++++++ + src/modules/mpd.cpp | 16 ++++++++++++---- + 3 files changed, 28 insertions(+), 4 deletions(-) + +diff --git a/include/adapters/mpd.hpp b/include/adapters/mpd.hpp +index 2e9b438e8..7f5a43e1b 100644 +--- a/include/adapters/mpd.hpp ++++ b/include/adapters/mpd.hpp +@@ -93,6 +93,7 @@ namespace mpd { + void idle(); + bool noidle(); + int recv_idle(); ++ int try_recv_idle(int timeout); + + unique_ptr get_status(); + unique_ptr get_status_safe(); +diff --git a/src/adapters/mpd.cpp b/src/adapters/mpd.cpp +index 083427a9c..76f824115 100644 +--- a/src/adapters/mpd.cpp ++++ b/src/adapters/mpd.cpp +@@ -1,5 +1,6 @@ + #include + #include ++#include + #include + #include + +@@ -222,6 +223,20 @@ namespace mpd { + return flags; + } + ++ int mpdconnection::try_recv_idle(int timeout) { ++ struct pollfd pfd = { m_fd, POLLIN, 0 }; ++ ++ int poll_ret = poll(&pfd, 1, timeout); ++ ++ if (poll_ret > 0) { ++ return recv_idle(); ++ } else if (poll_ret == 0) { ++ return 0; ++ } else { ++ throw mpd_exception("poll() returned error: "s + std::strerror(errno)); ++ } ++ } ++ + unique_ptr mpdconnection::get_status() { + check_prerequisites(); + auto status = make_unique(this); +diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp +index 1ba33c81c..9c53378b8 100644 +--- a/src/modules/mpd.cpp ++++ b/src/modules/mpd.cpp +@@ -178,12 +178,20 @@ namespace modules { + m_status = m_mpd->get_status_safe(); + } + ++ bool track_time = (m_label_time || m_bar_progress) && m_status->match_state(mpdstate::PLAYING); + try { + m_mpd->idle(); + +- int idle_flags = 0; +- m_mpd->noidle(); +- if ((idle_flags = m_mpd->recv_idle()) != 0) { ++ int idle_flags; ++ ++ if (track_time) { ++ m_mpd->noidle(); ++ idle_flags = m_mpd->recv_idle(); ++ } else { ++ idle_flags = m_mpd->try_recv_idle(2000); ++ } ++ ++ if (idle_flags != 0) { + // Update status on every event + m_status->update(idle_flags, m_mpd.get()); + return true; +@@ -194,7 +202,7 @@ namespace modules { + return def; + } + +- if ((m_label_time || m_bar_progress) && m_status->match_state(mpdstate::PLAYING)) { ++ if (track_time) { + auto now = chrono::system_clock::now(); + auto diff = now - m_lastsync; + + +From 139dca02ae02615cd331d8061ac7c0cae661be25 Mon Sep 17 00:00:00 2001 +From: Jan Palus +Date: Fri, 25 Dec 2020 01:23:34 +0100 +Subject: [PATCH 3/5] feat(mpd): subscribe only to relevant event types + +--- + src/adapters/mpd.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/adapters/mpd.cpp b/src/adapters/mpd.cpp +index 76f824115..b4567e7f2 100644 +--- a/src/adapters/mpd.cpp ++++ b/src/adapters/mpd.cpp +@@ -196,7 +196,7 @@ namespace mpd { + void mpdconnection::idle() { + check_connection(m_connection.get()); + if (!m_idle) { +- mpd_send_idle(m_connection.get()); ++ mpd_send_idle_mask(m_connection.get(), (mpd_idle) (MPD_IDLE_PLAYER | MPD_IDLE_OPTIONS)); + check_errors(m_connection.get()); + m_idle = true; + } + +From 00eeb73637ff1928c9621fe6008628f04a1cf655 Mon Sep 17 00:00:00 2001 +From: Jan Palus +Date: Fri, 25 Dec 2020 01:31:04 +0100 +Subject: [PATCH 4/5] feat(mpd): minor optimization of happy code path + +--- + src/modules/mpd.cpp | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp +index 9c53378b8..702fbebf6 100644 +--- a/src/modules/mpd.cpp ++++ b/src/modules/mpd.cpp +@@ -149,13 +149,7 @@ namespace modules { + } + + bool mpd_module::has_event() { +- bool def = false; +- +- if (!connected() && m_statebroadcasted == mpd::connection_state::CONNECTED) { +- def = true; +- } else if (connected() && m_statebroadcasted == mpd::connection_state::DISCONNECTED) { +- def = true; +- } ++ bool def = (m_statebroadcasted == (connected() ? mpd::connection_state::DISCONNECTED : mpd::connection_state::CONNECTED)); + + try { + if (!m_mpd) { + +From b073db3569d887a1567a387c3ea71989ffede0cc Mon Sep 17 00:00:00 2001 +From: Jan Palus +Date: Fri, 25 Dec 2020 12:30:10 +0100 +Subject: [PATCH 5/5] feat(mpd): slightly modify delay calculation between + connection attempts + +wait 0.5s more on each attempt and cap it at 5s +--- + include/modules/mpd.hpp | 2 +- + src/modules/mpd.cpp | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/include/modules/mpd.hpp b/include/modules/mpd.hpp +index 04afc97e7..ed591fe42 100644 +--- a/include/modules/mpd.hpp ++++ b/include/modules/mpd.hpp +@@ -90,7 +90,7 @@ namespace modules { + chrono::system_clock::time_point m_lastsync{}; + float m_synctime{1.0f}; + +- int m_quick_attempts{0}; ++ int m_connect_attempts{0}; + + // This flag is used to let thru a broadcast once every time + // the connection state changes +diff --git a/src/modules/mpd.cpp b/src/modules/mpd.cpp +index 702fbebf6..3394f42a9 100644 +--- a/src/modules/mpd.cpp ++++ b/src/modules/mpd.cpp +@@ -141,10 +141,10 @@ namespace modules { + + void mpd_module::idle() { + if (connected()) { +- m_quick_attempts = 0; ++ m_connect_attempts = 0; + sleep(80ms); + } else { +- sleep(m_quick_attempts++ < 5 ? 0.5s : 2s); ++ sleep(++m_connect_attempts < 10 ? m_connect_attempts * 0.5s : 5s); + } + } + diff --git a/polybar.spec b/polybar.spec index c890fbe..0f7f96f 100644 --- a/polybar.spec +++ b/polybar.spec @@ -1,11 +1,12 @@ Summary: Fast and easy-to-use status bar Name: polybar Version: 3.5.3 -Release: 1 +Release: 2 License: MIT, BSD Group: X11/Window Managers Source0: https://github.com/polybar/polybar/releases/download/%{version}/%{name}-%{version}.tar.gz # Source0-md5: 188c46519c214b3272c99f1d8bb898bf +Patch0: %{name}-mpd-overhead.patch URL: https://polybar.github.io/ BuildRequires: alsa-lib-devel BuildRequires: cairo-devel @@ -68,6 +69,7 @@ zsh-completion for polybar. %prep %setup -q +%patch0 -p1 %build install -d build -- 2.43.0