From f6791aead10681f976fa81147042707f4ff5f673 Mon Sep 17 00:00:00 2001 From: Daigo Moriwaki Date: Sat, 3 Dec 2011 21:10:16 +0900 Subject: [PATCH 1/1] Added a new method, Player#wait_write_thread_finish, to have a writer thread finish milder. --- shogi-server | 3 ++- shogi_server/player.rb | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/shogi-server b/shogi-server index 3511c65..89e6118 100755 --- a/shogi-server +++ b/shogi-server @@ -431,12 +431,13 @@ def main if (player.game) player.game.kill(player) end - player.finish # socket has been closed + player.finish $league.delete(player) log_message(sprintf("user %s logout", player.name)) ensure $mutex.unlock end + player.wait_write_thread_finish(1000) # milliseconds rescue Exception => ex log_error("server.start: #{ex.class}: #{ex.message}\n\t#{ex.backtrace[0]}") end diff --git a/shogi_server/player.rb b/shogi_server/player.rb index fa43182..08425f5 100644 --- a/shogi_server/player.rb +++ b/shogi_server/player.rb @@ -206,7 +206,6 @@ class Player < BasicPlayer write_safe(nil) Thread.pass # help the write_thread to terminate end - @player_logger.close if @player_logger log_debug("done.") rescue log_message(sprintf("user %s finish failed", @name)) @@ -248,6 +247,17 @@ class Player < BasicPlayer end # + # Wait for the write thread to finish. + # This method should be called just before this instance will be freed. + # + def wait_write_thread_finish(msec=1000) + while msec > 0 && @write_thread && @write_thread.alive? + sleep 0.1; msec -= 0.1 + end + @player_logger.close if @player_logger + end + + # # Note that sending a message is included in the giant lock. # def write_safe(str) -- 2.11.0