Packages
islands_engine
0.2.65
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.13
0.2.12
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.0
Models the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/engine/game_recovery.ex
defmodule Islands.Engine.GameRecovery do
@moduledoc """
Makes processes under the top supervisor fault-tolerant. If any crashes (or
is killed), it is immediately restarted and the system remains undisturbed.
"""
use GenServer
use PersistConfig
alias __MODULE__
alias Islands.Engine.{DynGameSup, GameServer}
alias Islands.Game
@ets get_env(:ets_name)
@spec start_link(term) :: GenServer.on_start()
def start_link(_init_arg = :ok),
do: GenServer.start_link(GameRecovery, :ok, name: GameRecovery)
## Private functions
@spec restart_servers :: :ok
defp restart_servers do
@ets
|> :ets.match_object({{GameServer, :_}, :_})
|> Enum.each(fn {{GameServer, _game_name}, game} ->
player1 = game.player1
# Child may already be started...
DynamicSupervisor.start_child(
DynGameSup,
{GameServer, {game.name, player1.name, player1.gender, player1.pid}}
)
end)
end
## Callbacks
@spec init(term) :: {:ok, term}
def init(_init_arg = :ok), do: {:ok, restart_servers()}
@spec handle_call(term, GenServer.from(), term) ::
{:reply, [Game.overview()], term}
def handle_call(:game_overviews, _from, :ok) do
game_overviews =
@ets
|> :ets.match_object({{GameServer, :_}, :_})
|> Enum.map(fn {{GameServer, _game_name}, game} ->
Game.overview(game)
end)
|> Enum.sort()
{:reply, game_overviews, :ok}
end
end