aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/alsa-lib/files/alsa-lib-1.0.22-fd-leak.patch')
-rw-r--r--media-libs/alsa-lib/files/alsa-lib-1.0.22-fd-leak.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/media-libs/alsa-lib/files/alsa-lib-1.0.22-fd-leak.patch b/media-libs/alsa-lib/files/alsa-lib-1.0.22-fd-leak.patch
new file mode 100644
index 0000000..e7229cb
--- /dev/null
+++ b/media-libs/alsa-lib/files/alsa-lib-1.0.22-fd-leak.patch
@@ -0,0 +1,60 @@
+commit a256766c10c52cb6667de8a65f5cbb332fad4cc7
+Author: Jaroslav Kysela <perex@perex.cz>
+Date: Mon Dec 21 09:09:42 2009 +0100
+
+ pcm: Close event timer in pcm_hw plugin
+
+ Dan McCombs discovered that snd_pcm_close() invocations are not leading
+ to associated timers being closed, which results in successively more
+ timers being created but not freed.
+
+ Original patch from Daniel T Chen <crimsun@ubuntu.com>.
+
+ BugLink: https://bugs.launchpad.net/bugs/451893
+
+ Signed-off-by: Jaroslav Kysela <perex@perex.cz>
+
+diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c
+index 2095b01..b557912 100644
+--- a/src/pcm/pcm_hw.c
++++ b/src/pcm/pcm_hw.c
+@@ -338,18 +338,6 @@ static int snd_pcm_hw_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t * params)
+ return 0;
+ }
+
+-static int snd_pcm_hw_hw_free(snd_pcm_t *pcm)
+-{
+- snd_pcm_hw_t *hw = pcm->private_data;
+- int fd = hw->fd, err;
+- if (ioctl(fd, SNDRV_PCM_IOCTL_HW_FREE) < 0) {
+- err = -errno;
+- SYSMSG("SNDRV_PCM_IOCTL_HW_FREE failed");
+- return err;
+- }
+- return 0;
+-}
+-
+ static void snd_pcm_hw_close_timer(snd_pcm_hw_t *hw)
+ {
+ if (hw->period_timer) {
+@@ -421,6 +409,20 @@ static int snd_pcm_hw_change_timer(snd_pcm_t *pcm, int enable)
+ } else {
+ snd_pcm_hw_close_timer(hw);
+ pcm->fast_ops = &snd_pcm_hw_fast_ops;
++ hw->period_event = 0;
++ }
++ return 0;
++}
++
++static int snd_pcm_hw_hw_free(snd_pcm_t *pcm)
++{
++ snd_pcm_hw_t *hw = pcm->private_data;
++ int fd = hw->fd, err;
++ snd_pcm_hw_change_timer(pcm, 0);
++ if (ioctl(fd, SNDRV_PCM_IOCTL_HW_FREE) < 0) {
++ err = -errno;
++ SYSMSG("SNDRV_PCM_IOCTL_HW_FREE failed");
++ return err;
+ }
+ return 0;
+ }