pipewire: fix timerfd deadlock issue
[AGL/meta-agl.git] / meta-pipewire / recipes-multimedia / pipewire / pipewire / 0001-null-sink-make-the-timerfd-non-blocking.patch
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-null-sink-make-the-timerfd-non-blocking.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-null-sink-make-the-timerfd-non-blocking.patch
new file mode 100644 (file)
index 0000000..71e526f
--- /dev/null
@@ -0,0 +1,43 @@
+From c633004bf310998580ff8944c59d94689d6fca87 Mon Sep 17 00:00:00 2001
+From: George Kiagiadakis <george.kiagiadakis@collabora.com>
+Date: Thu, 1 Jul 2021 11:37:01 +0300
+Subject: [PATCH] null-sink: make the timerfd non-blocking
+
+Fixes #1377
+
+Upstream-Status: Backport [from master/0.3.32]
+Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
+---
+ spa/plugins/support/null-audio-sink.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/spa/plugins/support/null-audio-sink.c b/spa/plugins/support/null-audio-sink.c
+index e9588f1e2..12e671db8 100644
+--- a/spa/plugins/support/null-audio-sink.c
++++ b/spa/plugins/support/null-audio-sink.c
+@@ -221,8 +221,11 @@ static void on_timeout(struct spa_source *source)
+       spa_log_trace(this->log, "timeout");
+
+       if (spa_system_timerfd_read(this->data_system,
+-                              this->timer_source.fd, &expirations) < 0)
++                              this->timer_source.fd, &expirations) < 0) {
++              if (errno == EAGAIN)
++                      return;
+               perror("read timerfd");
++      }
+
+       nsec = this->next_time;
+
+@@ -818,7 +821,8 @@ impl_init(const struct spa_handle_factory *factory,
+
+       this->timer_source.func = on_timeout;
+       this->timer_source.data = this;
+-      this->timer_source.fd = spa_system_timerfd_create(this->data_system, CLOCK_MONOTONIC, SPA_FD_CLOEXEC);
++      this->timer_source.fd = spa_system_timerfd_create(this->data_system, CLOCK_MONOTONIC,
++                                                        SPA_FD_CLOEXEC | SPA_FD_NONBLOCK);
+       this->timer_source.mask = SPA_IO_IN;
+       this->timer_source.rmask = 0;
+       this->timerspec.it_value.tv_sec = 0;
+--
+2.30.2
+