From 4224237cb4958d453f3ea3658d0fc9d2786fdea8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 7 Jul 2016 02:17:57 +0000 Subject: dtas-readahead: cleanup open files on pause We must not leave open files lingering when the player pauses, as it could prevent remote filesystems from unmounting. --- bin/dtas-readahead | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'bin/dtas-readahead') diff --git a/bin/dtas-readahead b/bin/dtas-readahead index 97d5a89..b4b7311 100755 --- a/bin/dtas-readahead +++ b/bin/dtas-readahead @@ -149,8 +149,8 @@ def do_open(path) File.open(path) end +work = {} begin - work = {} cur_pid = nil @todo_ra = @max_ra t0 = DTAS.now @@ -159,13 +159,16 @@ begin while @todo_ra > 0 && fp.nil? if current = cur['current'] track = current['infile'].freeze - work[track] ||= fp = do_open(track) + fp = work[track] ||= do_open(track) cur_pid = current['pid'] if fp pos = expand_pid(cur_pid).map do |pid| seek_to_cur_pos(pid, fp) end.compact.max - pos and fp = do_ra(fp, pos, w) + if pos + fp = do_ra(fp, pos, w) + work.delete_if { |_, io| io.closed? } + end end else break @@ -176,10 +179,11 @@ begin while @todo_ra > 0 && track = queue.shift fp = nil begin - work[track] ||= fp = do_open(track) + fp = work[track] ||= do_open(track) rescue SystemCallError end fp = do_ra(fp, 0, w) if fp + work.delete_if { |_, io| io.closed? } end break if @todo_ra <= 0 @@ -192,10 +196,11 @@ begin fp = nil track = c.req("tl get #{cid}").sub!(/\A1 \d+=/, '').freeze begin - work[track] ||= fp = do_open(track) + fp = work[track] ||= do_open(track) rescue SystemCallError end fp = do_ra(fp, 0, w) if fp + work.delete_if { |_, io| io.closed? } if @todo_ra > 0 && fp.nil? && ids[idx += 1].nil? idx = repeat == 'true' ? 0 : nil end @@ -210,7 +215,9 @@ begin timeout = 5 - elapsed timeout = 0 if timeout < 0 else - timeout = nil + work.each_value(&:close).clear + fp.close if fp && !fp.closed? + fp = timeout = nil end r = wait_read(w, timeout) p w.res_wait if r -- cgit v1.2.3-24-ge0c7