Уведомить и прекратить gen_event менеджер атомарно - PullRequest
3 голосов
/ 28 марта 2011

Когда конкретное сообщение получено моим gen_event процессом менеджера, я хочу, чтобы оно прекратилось после того, как все обработчики обработали его, и до того, как они получат и обработают любые другие события. Единственный способ найти это:

-module(manager).

...

stop(Reason) ->
    gen_event:sync_notify(manager, {stop, Reason}),
    gen_event:stop(manager).

Но для этого требуется, чтобы все обработчики возвращали remove_handler из handle_event({stop, Reason}, State), иначе они могли бы обработать событие, отправленное из другого процесса после sync_notify и до stop. Я предпочел бы иметь подход, который не предъявляет никаких требований к обработчикам.

1 Ответ

2 голосов
/ 29 марта 2011

Насколько я знаю, нет другого способа сделать это, чем тот, который вы используете для обработки способом, который действительно ограничен одним вызовом, кроме простого убийства менеджера событий с помощью exit(Pid, Reason) илиприказывает, чтобы это было закрыто его собственным наблюдателем.

...