12 votes

Supprimer tous les gestionnaires d'un boost :: asio :: io_service sans les appeler

Je veux supprimer tous les gestionnaires d'un IO_service juste avant de le réutiliser. Est-ce possible?

Je rédige des tests unitaires qui impliquent un asio::io_service. Entre chaque cas de test, je veux effacer les gestionnaires de l'io_service global. Je pensais que io_service::reset ferait ça mais ce n'est pas le cas. reset() permet seulement de reprendre l'io_service. Tous les gestionnaires du dernier cas de test restent en file d'attente.

Je n'ai besoin de le faire que pour les tests unitaires donc n'importe quelle astuce folle fonctionnerait.


Plus d'informations:

L'io_service provient d'une variable membre deadline_timer. Le deadline_timer fait partie du code que je teste donc je ne peux pas modifier comment il est construit. Je récupère son io_service via la méthode get_io_service du deadline_timer.

4voto

deft_code Points 19418

Eh bien, j'ai pris la tête avec ça pendant quelques jours et j'ai trouvé une solution qui fonctionne. C'est le hack ultime.

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

Je ne suis pas sûr que ce soit sûr pour du code en production. Mais pour l'instant, cela semble fonctionner (pas de segmentation fault, pas de comportement étrange).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X