2010-02-22 14 views
11

Quiero eliminar todos los controladores de un IO_service justo antes de reutilizarlo. es posible?Quitar todos los controladores de un boost :: asio :: io_service sin llamarlos

Estoy escribiendo pruebas unitarias que implican un asio::io_service. Entre cada caso de prueba, quiero borrar los controladores del global io_service. Pensé que io_service::reset haría eso pero no es así. reset() solo permite que se reanude el io_service. Todos los controladores del último caso de prueba todavía están en cola.

Solo necesito hacer esto para pruebas unitarias, así que cualquier hack loco funcionaría.


Más información:

El io_service es una variable de deadline_timer miembro. El deadline_timer es parte del código que estoy probando, así que no puedo cambiar cómo está construido. Obtengo su io_service a través del método deadline_timerget_io_service.

+0

No puede crear un 'io_service' en su método' setup() 'y luego destruirlo en su método' teardown() ', ¿o sí? –

Respuesta

3

Bueno, me he atormentado en esto durante unos días y se me ocurrió una solución viable. Es la madre de todos los hacks.

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

No estoy seguro de qué tan seguro sería esto para el código de producciones. Pero hasta ahora parece funcionar (sin segfaults, sin comportamiento extraño).

+0

Puede asignar io_service dinámicamente y almacenarlo en std :: auto_ptr o boost :: scoped_ptr. Luego puede restablecerlo cuando necesite "borrar" los manejadores. De esta forma evitará usar la ubicación nueva (en cuyo caso deberá llamar explícitamente al destructor, consulte http://www.parashift.com/c++faq-lite/dtors.html#faq-11.10). – Yukiko

+0

@Yukiko: No controlo el código que crea el io_service. Además, no controlo el código que establece el io_service de deadline_timer. En resumen, no asigno el servicio io_ por lo que no puedo almacenarlo en smart_ptr. –

+0

Estoy usando boost 1.49. Ese truco no funciona (algunas afirmaciones fallaron) –

Cuestiones relacionadas