У меня есть существующее приложение, которое широко использует libev для своего цикла обработки событий. Теперь я хотел бы добавить функциональность сервера OPC UA, но не уверен, как лучше всего интегрировать цикл событий open62541 в libev.
На ум приходят следующие возможности:
- Вызов
UA_Server_run_iterate
из цикла событий libev со временемwaitInternal
, равным 0. Это будет означать, что сервер никогда не сможет спать (опрос open62541 вev_idle
), или что запросы от клиента OPC UA будут испытывать дополнительную задержку до 50 мс. (максимальное время ожидания по умолчанию open62541). - Патч open62541, позволяющий извлекать файловые дескрипторы, используемые в данный момент (серверные сокеты и соединения) на сетевом уровне сервера. Это позволит добавлять события libev для этих файловых дескрипторов, которые, в свою очередь, могут опрашивать
UA_Server_run_iterate
только при необходимости. - Реализуйте собственный сетевой уровень сервера, использующий libev. Похоже, это подразумевает довольно частое дублирование кода ... Есть ли какие-нибудь примеры / учебные пособия для реализации настраиваемого сетевого уровня?
- Запустите цикл событий open62541 в отдельном потоке. Я действительно очень хочу избежать этого, поскольку вся цель системы событий, такой как libev, - избежать проблем, связанных с асинхронной работой. Например, все обратные вызовы от open62541 должны будут синхронизироваться с основным потоком libev.
Какой из вышеперечисленных вариантов вы считаете лучшим с точки зрения сложности и производительности?
Можете ли вы придумать какие-либо другие варианты, не перечисленные выше?