Boost Meta State Machine приводит к переполнению стека при отсрочке события - PullRequest
1 голос
/ 15 апреля 2011

У меня есть код, который реализует конечный автомат на основе библиотеки Boost MSM. Это работало отлично, пока мне не пришлось добавить строку, которая откладывает внешний интерфейс функтора событий:

Row < StateX, Event1, none, Defer, none >

Теперь, когда этот ряд получает удар, потоки заканчиваются стеком ударов. Я отслеживал вызовы методов в MSM, и, к сожалению, все работает, как задумано Это шаги выполнения:

  1. process_event вызывается с Event1
  2. Event1 добавляется в отложенную очередь событий внутри функтора Defer
  3. , поскольку строка успешно обработана, для обработчика установлено значение ИСТИНА
  4. в конце process_event есть код для обработки переходов без событий. Этот код необходим, потому что, если событие вызывает переход из состояния A в B, B может иметь автоматический переход в другое состояние, и это единственное место, где они будут обрабатываться (в моем коде я не использую ничего из этого, но логика все еще вызывается)
  5. eventless_helper вызывает process_event с событием типа «none»
  6. при обработке «none» (без фактической работы) код теперь видит, что в очереди есть отложенное событие, поэтому он удаляет его из очереди и снова вызывает process_event.
  7. Теперь мы повторяем все, начиная с шага 1, но мы все еще в функции из предыдущего шага, так что это продолжается до тех пор, пока мы не исчерпаем стек.

Кажется, логика для отсрочки событий вступает в конфликт с логикой для обработки переходов без событий, и мне очень хочется просто перейти к буст-коду и взломать последние. Похоже, что если событие «отклонено», его не следует рассматривать как обработанное, и если бы это было так, переходы без событий не были бы запущены (как они не должны), но тогда конечный автомат оказался бы в вызов no_transition, который по сути является универсальным обработчиком неожиданных ошибок. Это также потребовало бы взлома библиотечного кода, которого я хотел бы избежать.

Но прежде чем я что-то сделаю, я хочу посмотреть, нашел ли кто-нибудь еще это. Или дайте мне совет, где можно получить помощь в этом.

UPDATE: Судя по всему, версия Boost Library, которую использовала моя компания, была 1.44, и в этой версии была ошибка с отложенной обработкой событий. Это исправлено в 1.46.1.

1 Ответ

1 голос
/ 15 апреля 2011

Лучшее место для получения надлежащей помощи - это список рассылки буст-пользователей . Кристоф великолепно реагирует на возможные сообщения об ошибках, но я не думаю, что он смотрит на SO.

Кроме того, вы можете написать Кристофу напрямую, так как я знаю, что он поддается этому. Я не буду публиковать здесь его адрес электронной почты, но его легко найти в архиве списка рассылки gmane boost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...