]> git.pld-linux.org Git - packages/polybar.git/commitdiff
add patches for reducing overhead of mpd plugin; rel 2 auto/th/polybar-3.5.3-2
authorJan Palus <atler@pld-linux.org>
Thu, 31 Dec 2020 10:58:09 +0000 (11:58 +0100)
committerJan Palus <atler@pld-linux.org>
Thu, 31 Dec 2020 10:58:09 +0000 (11:58 +0100)
polybar-mpd-overhead.patch [new file with mode: 0644]
polybar.spec

diff --git a/polybar-mpd-overhead.patch b/polybar-mpd-overhead.patch
new file mode 100644 (file)
index 0000000..9d07c28
--- /dev/null
@@ -0,0 +1,257 @@
+From b1b5cd6bbb1e0dea35e7b86429ff3e04fd67db9f Mon Sep 17 00:00:00 2001
+From: Jan Palus <atler@pld-linux.org>
+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<mpdstatus> get_status();
+     unique_ptr<mpdstatus> 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 <atler@pld-linux.org>
+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<mpdstatus> get_status();
+     unique_ptr<mpdstatus> 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 <cassert>
+ #include <csignal>
++#include <poll.h>
+ #include <thread>
+ #include <utility>
+@@ -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<mpdstatus> mpdconnection::get_status() {
+     check_prerequisites();
+     auto status = make_unique<mpdstatus>(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 <atler@pld-linux.org>
+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 <atler@pld-linux.org>
+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 <atler@pld-linux.org>
+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);
+     }
+   }
index c890fbe847093e64c3b7070eff11aaf2a26f83fe..0f7f96f1c0d023529d91a15dd6347659d9949f13 100644 (file)
@@ -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
This page took 0.060385 seconds and 4 git commands to generate.