Я заметил, что сообщения, отправленные в pid процесса gen_fsm, сопоставляются в обратных вызовах состояния как события. Это случайно или я могу положиться на эту функцию?
Обычно я ожидал, что общие сообщения, отправленные в gen_fsm, будут отображаться в обратном вызове handle_info/3, и подумал, что мне придется повторно отправить его, используя gen_fsm:send_event.
Пытается ли gen_fsm сопоставить сообщение сначала с обратным вызовом состояния, а затем всегда с обратным вызовом handle_info/3? Или только если он не соответствует пункту обратного вызова состояния?
Однако, когда я пытаюсь это сделать, мое сообщение обрабатывается дважды в соответствии с выводом отладки.
Таким образом, в основном вопрос также может быть сформулирован так: как правильно обрабатывать полученные сообщения как события в функциях состояния gen_fsm?
Пояснение: то, что некоторые события происходят при передаче сообщений, следует считать заданным для этого вопроса.
Я знаю, что во многих случаях проще сделать протокол видимым, используя вызовы функций только в fsm.
Я не уверен, что это улучшит текущую структуру, в которую должен вписаться упомянутый gen_fsm: различные стеки протоколов, где каждый уровень вызывает функцию connect() для подключения (а иногда и запуска) нижнего уровня. Пакеты отправляются на нижние уровни путем вызова функции (отправки) и принимаются путем receive
передачи сообщения. Очень похоже на gen_tcp.
Глядя на код для gen_fsm, я уже понял, что общие сообщения передаются только в handle_info, поэтому остается только вопрос, вызывать ли функцию состояния непосредственно из обратного вызова handle_info/3 или повторно отправлять с помощью gen_fsm:send_event.