как справиться с завершением gen_fsm - PullRequest
1 голос
/ 20 мая 2011

У меня есть процесс MAIN, который порождает реализацию поведения gen_fsm, но этот процесс MAIN не является реализацией поведения супервизора, это просто еще один модуль. Допустим, реализация gen_fsm называется GAME_ROOM. Мой случай таков:

  1. Когда будет готово 3 человека, в процессе MAIN появится новый GAME_ROOM.
  2. Я использую функцию gen_fsm: start_link для запуска нового GAME_ROOM, поэтому, если GAME_ROOM завершит работу по ошибке, мой MAIN-процесс может вызвать новый, чтобы заменить сбитый процесс.
  3. Мне удалось сделать так, чтобы мой процесс MAIN обнаружил событие EXIT всех сбитых GAME_ROOM

Проблема в том, что мне нужно восстановить все сбитые состояния GAME_ROOM на новом. Мой вопрос: как я могу использовать функцию завершения gen_fsm для передачи последних состояний gen_fsm в мой процесс MAIN, поэтому, когда я возрождаю новый GAME_ROOM, я могу передать эти состояния?

Ответы [ 4 ]

1 голос
/ 22 мая 2011

GAME_ROOM terminate/3 может быть одним простым способом отправить сообщение с необходимой информацией о состоянии в MAIN.Чтобы это работало, GAME_ROOM должен знать pid MAIN (легко), и вы должны быть уверены, что terminate/3 действительно вызван.

1 голос
/ 20 мая 2011

Прочитать о process_flag ({trap_exit, true}) и обработать информацию 'EXIT'.

0 голосов
/ 20 мая 2011

Я считаю, что если GAME_ROOM завершает работу из-за ошибки, сохранять нечего (откуда вы знаете, что ваше состояние действительно, иначе вы бы перехватили ошибку внутри GAME_ROOM).

0 голосов
/ 20 мая 2011

Прежде всего, я бы действительно посоветовал вам взглянуть на использование супервизоров в вашей реализации, чтобы избежать повторного изобретения колеса.

Возможна возможность создания таблицы ETS в вашей MAIN, чтобы вы могли хранить данные внутри вашего gen_fsms, которые могут пережить сбои процесса.

...