2010-02-22 4 views
11

Ich möchte alle Handler aus einem IO_service direkt vor der Wiederverwendung entfernen. Ist das möglich?Entfernen Sie alle Handler von einem boost :: asio :: io_service, ohne sie aufzurufen

Ich schreibe Komponententests, die eine asio::io_service beinhalten. Zwischen jedem Testfall möchte ich die Handler vom globalen io_service löschen. Ich dachte, dass io_service::reset würde, aber es tut es nicht. reset() ermöglicht nur die Wiederaufnahme des io_service. Alle Handler aus dem letzten Testfall sind noch in der Warteschlange.

Ich muss dies nur für Komponententests tun, damit jeder verrückte Hack funktionieren würde.


Weitere Informationen:

Die io_service von einem variablen deadline_timer Mitglied ist. Die deadline_timer ist Teil des Codes, den ich testen, so kann ich nicht ändern, wie es aufgebaut ist. Ich bekomme seine io_service über die deadline_timer 's get_io_service Methode.

+0

Sie können keinen 'io_service' in Ihrer' setup() 'Methode erstellen und dann in Ihrer' teardown() 'Methode zerstören, oder? –

Antwort

3

Nun, ich habe mir ein paar Tage lang das Gehirn gehackt und eine brauchbare Lösung gefunden. Es ist die Mutter aller Hacks.

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

Ich bin nicht sicher, wie sicher dies für Produktionscode wäre. Aber bisher scheint es zu funktionieren (keine segfaults, kein komisches Verhalten).

+0

Sie könnten den io_service dynamisch zuweisen und in einem std :: auto_ptr oder boost :: scoped_ptr speichern. Dann können Sie es zurücksetzen, wenn Sie die Handler "löschen" müssen. Auf diese Weise vermeiden Sie die Verwendung von Placement neu (in diesem Fall müssen Sie den Destruktor explizit aufrufen - siehe http://www.parashift.com/c++faq-lite/dtors.html#faq-11.10). – Yukiko

+0

@Yukiko: Ich kontrolliere nicht den Code, der den io_service erstellt. Außerdem behalte ich den Code, der den io_service des Deadline-Timers festlegt, nicht. Kurz gesagt, ich weise den io_service nicht zu, damit ich ihn nicht in smart_ptr speichern kann. –

+0

Ich verwende Boost 1.49. Dieser Trick funktioniert nicht (einige Assertion ist fehlgeschlagen) –