OSDN Git Service

Added a new method, Player#wait_write_thread_finish, to have a writer thread finish...
authorDaigo Moriwaki <beatles@users.sourceforge.jp>
Sat, 3 Dec 2011 12:10:16 +0000 (21:10 +0900)
committerDaigo Moriwaki <daigo@debian.org>
Sat, 3 Dec 2011 12:10:16 +0000 (21:10 +0900)
shogi-server
shogi_server/player.rb

index 3511c65..89e6118 100755 (executable)
@@ -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
index fa43182..08425f5 100644 (file)
@@ -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)