Я проектирую игровой сервер с возможностями сценариев. Общий дизайн выглядит так:
Client connects to Server,
Server initializes Client,
Server sends Client to EventManager (separate thread, uses libevent),
EventManager receives receive Event from Client socket,
Client manages what it received via callbacks.
Теперь последняя часть - самая сложная для меня сейчас.
В настоящее время мой дизайн позволяет мне для класса, который наследует Client
, создавать обратные вызовы для определенных полученных событий. Этими обратными вызовами управляют в списке, и полученный буфер проходит процесс синтаксического анализа каждый раз, когда что-то получено. Если буфер действителен, обратный вызов вызывается, когда он воздействует на то, что находится в буфере. Следует отметить, что обратные вызовы могут передаваться в механизм сценариев, и в этот момент ничто не может быть уверенным в том, что может произойти.
Каждый раз, когда завершается обратный вызов, текущий буфер приема должен быть сброшен и т. Д. В настоящее время обратные вызовы не имеют возможности вернуть значение, потому что, как было сказано ранее, все может произойти.
Что происходит, когда где-то в обратном вызове что-то говорит это-> disconnect (), я хочу немедленно отключить Client
, удалить его из EventManager
и, наконец, удалить его из Server
, где это также должно получить окончательно разрушенную и свободную память. Тем не менее, у меня все еще есть код, выполняющийся после завершения обратного вызова в клиенте, поэтому я не могу освободить память.
Что я должен изменить в дизайне? Должен ли я иметь какое-то временное событие в Server
, которое проверяет, какие Client
можно уничтожить? Это создаст дополнительные накладные расходы, которые мне не нужны? Будет ли нормально после завершения обратного вызова выполнить минимальный код в стеке (return -1;
) или нет?
Понятия не имею, что делать, но я готов к полной модернизации дизайна.
Заранее спасибо.