2 require 'shogi_server/league/floodgate'
8 # @param game_names an array of game name strings
10 def initialize(game_names)
11 @game_names = game_names
15 # Return the most recent Floodgate instance
17 def next_league(leagues)
18 floodgate = leagues.min {|a,b| a.next_time <=> b.next_time}
22 def floodgate_reload_log(leagues)
23 floodgate = next_league(leagues)
24 diff = floodgate.next_time - Time.now
25 log_message("Floodgate reloaded. The next match will start at %s in %d seconds" %
26 [floodgate.next_time, diff])
30 leagues = @game_names.collect do |game_name|
31 ShogiServer::League::Floodgate.new($league,
32 {:game_name => game_name})
34 leagues.delete_if do |floodgate|
36 unless floodgate.next_time
37 log_error("Unsupported game name: %s" % floodgate.game_name)
43 log_error("No valid Floodgate game names found")
44 return [] # will exit the thread
46 floodgate_reload_log(leagues)
50 def wait_next_floodgate(floodgate)
51 diff = floodgate.next_time - Time.now
59 def reload_shogi_server
61 log_message("Reloading source...")
66 def start_games(floodgate)
71 # Regenerate floodgate instances from next_instances for the next matches.
72 # @param next_instances array of [game_name, next_time]
74 def regenerate_leagues(next_instances)
75 leagues = next_instances.collect do |prev|
76 log_message("Regenerating a floodgate league...: %s %s %s %s %d %d" %
77 [prev.game_name, prev.next_time, prev.pairing_factory, prev.sacrifice, prev.max_moves, prev.least_time_per_move])
78 floodgate = ShogiServer::League::Floodgate.new($league,
79 {:game_name => prev.game_name, :next_time => prev.next_time,
80 :pairing_factory => prev.pairing_factory, :sacrifice => prev.sacrifice,
81 :max_moves => prev.max_moves, :least_time_per_move => prev.least_time_per_move})
84 floodgate_reload_log(leagues)
89 return nil if @game_names.nil? || @game_names.empty?
91 log_message("Set up floodgate games: %s" % [@game_names.join(",")])
92 @thread = Thread.start(@game_names) do |game_names|
95 if leagues.nil? || leagues.empty?
96 return # exit from this thread
101 floodgate = next_league(leagues)
102 next if wait_next_floodgate(floodgate)
104 next_instances = leagues.collect do |fg|
105 unless (fg.next_time - Time.now) > 0
106 if ShogiServer::available?
109 log_message("The STOP file prevents from starting new Floodgate matches")
111 fg.charge # updates next_time
118 # Regenerate floodgate instances after ShogiServer.realod
119 leagues = regenerate_leagues(next_instances)
120 rescue Exception => ex
122 log_error("[in Floodgate's thread] #{ex} #{ex.backtrace}")
131 @thread.kill if @thread
134 end # class SetupFloodgate
136 end # module ShogiServer