Удалите все обработчики из boost :: asio :: io_service, не вызывая их - PullRequest
12 голосов
/ 23 февраля 2010

Я хочу удалить все обработчики из службы IO_service прямо перед повторным использованием. Возможно ли это?

Я пишу юнит-тесты, которые включают asio::io_service. Между каждым тестовым примером я хочу очистить обработчики от глобального io_service. Я думал, что io_service::reset будет, но это не так. reset() только позволяет возобновить io_service. Все обработчики из последнего контрольного примера все еще находятся в очереди.

Мне нужно сделать это только для модульного тестирования, чтобы сработал любой сумасшедший взлом.


Дополнительная информация:

io_service из deadline_timer переменной-члена. deadline_timer является частью кода, который я тестирую, поэтому я не могу изменить его конструкцию. Я держу его io_service с помощью метода deadline_timer get_io_service.

1 Ответ

3 голосов
/ 24 февраля 2010

Ну, я несколько дней ломал голову над этим и придумал подходящее решение. Это мать всех хаков.

void clear( boost::asio::io_service& service )
{
    service.stop();
    service.~io_service();
    new( &service ) boost::asio::io_service;
}

Я не уверен, насколько это безопасно для производственного кода. Но пока все работает (без ошибок, без странного поведения).

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