From f2549e5fc7f504ecd684e43a3c73522a660dbed5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 13 Dec 2015 22:56:30 +0000 Subject: player: dump state file asynchronously when requested This avoids stalling when we have a gigantic tracklist. --- lib/dtas/player/client_handler.rb | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'lib/dtas/player/client_handler.rb') diff --git a/lib/dtas/player/client_handler.rb b/lib/dtas/player/client_handler.rb index 1c0a79e..e0af295 100644 --- a/lib/dtas/player/client_handler.rb +++ b/lib/dtas/player/client_handler.rb @@ -526,9 +526,27 @@ module DTAS::Player::ClientHandler # :nodoc: io.emit("OK") end + def state_file_dump_async(io, sf) + on_death = lambda { |_| @srv.wait_ctl(io, :wait_readable) } + pid = fork do + begin + begin + sf.dump(self) + res = 'OK' + rescue => e + res = "ERR dumping to #{xs(sf.path)} #{e.message}" + end + io.to_io.send(res, Socket::MSG_EOR) + ensure + exit!(0) + end + end + DTAS::Process::PIDS[pid] = on_death + end + def dpc_state(io, msg) case msg.shift - when "dump" + when 'dump' dest = msg.shift if dest sf = DTAS::StateFile.new(dest, false) @@ -538,13 +556,9 @@ module DTAS::Player::ClientHandler # :nodoc: else return io.emit("ERR no state file configured") end - begin - sf.dump(self) - rescue => e - return io.emit("ERR dumping to #{xs(dest)} #{e.message}") - end + state_file_dump_async(io, sf) + :ignore end - io.emit("OK") end def _tl_skip -- cgit v1.2.3-24-ge0c7