2010-02-22 14 views
11

Voglio rimuovere tutti i gestori da un IO_service subito prima di riutilizzarlo. È possibile?Rimuovere tutti i gestori da un boost :: asio :: io_service senza chiamarli

Sto scrivendo test di unità che coinvolgono uno asio::io_service. Tra ogni caso di test voglio cancellare i gestori dal globale io_service. Pensavo che lo io_service::reset ci fosse, ma non è così. reset() consente di riprendere solo lo io_service. Tutti i gestori dell'ultimo caso di test sono ancora in coda.

Ho solo bisogno di fare questo per il collaudo di unità in modo che qualsiasi scribacchino possa funzionare.


Maggiori informazioni:

Il io_service da una variabile deadline_timer membro. Il deadline_timer fa parte del codice che sto testando, quindi non posso cambiare il modo in cui è stato costruito. Riceverò il suo io_service tramite il metodo get_io_serviceget_io_service.

+0

Non è possibile creare un 'io_service' nel metodo' setup() 'e quindi distruggerlo nel metodo' teardown() ', vero? –

risposta

3

Beh, mi sono tormentato per qualche giorno e ho trovato una soluzione praticabile. È la madre di tutti gli hack.

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

Non sono sicuro di quanto sarebbe sicuro per il codice di produzione. Ma finora sembra funzionare (nessun segfault, nessun comportamento strano).

+0

È possibile allocare dinamicamente il servizio io_service e memorizzarlo in std :: auto_ptr o boost :: scoped_ptr. Quindi è possibile ripristinarlo quando è necessario "cancellare" i gestori. In questo modo eviti di usare il posizionamento nuovo (nel qual caso devi chiamare esplicitamente il distruttore - vedi http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10). – Yukiko

+0

@Yukiko: non controllo il codice che crea il servizio io_. Inoltre, non contollo il codice che imposta il servizio io_stampare_statempo. In breve, non alloco il servizio io_consiglia quindi non posso memorizzarlo in smart_ptr. –

+0

Sto usando boost 1.49. Quel trucco non funziona (qualche asserzione fallita) –

Problemi correlati