about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-12-13 22:56:30 +0000
committerEric Wong <e@80x24.org>2015-12-13 23:22:47 +0000
commitf2549e5fc7f504ecd684e43a3c73522a660dbed5 (patch)
tree441ad551a208cc31b73eb1c6bc99da9db7aa2f1b
parentb7ee299522940d056aef865c2bcc5fbdb6fa0f68 (diff)
downloaddtas-f2549e5fc7f504ecd684e43a3c73522a660dbed5.tar.gz
This avoids stalling when we have a gigantic tracklist.
-rw-r--r--lib/dtas/player/client_handler.rb28
1 files changed, 21 insertions, 7 deletions
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