2010-02-22 28 views
11

Tôi muốn xóa tất cả các trình xử lý khỏi quyền IO_service trước khi tôi sử dụng lại nó. Điều này có thể không?Xóa tất cả các trình xử lý khỏi một tăng :: asio :: io_service mà không cần gọi chúng

Tôi đang viết các bài kiểm tra đơn vị có liên quan đến asio::io_service. Ở giữa mỗi trường hợp thử nghiệm, tôi muốn xóa các trình xử lý khỏi toàn cầu io_service. Tôi nghĩ rằng io_service::reset sẽ như vậy nhưng nó không. reset() chỉ cho phép io_service được tiếp tục. Tất cả các trình xử lý từ trường hợp thử nghiệm cuối cùng vẫn được xếp hàng đợi.

Tôi chỉ cần thực hiện việc này để kiểm tra đơn vị để mọi hoạt động hack điên rồ hoạt động.


Thông tin thêm:

Các io_service là từ một biến deadline_timer thành viên. Các deadline_timer là một phần của mã tôi đang thử nghiệm vì vậy tôi không thể thay đổi cách nó được xây dựng. Tôi giữ một số của nó io_service thông qua phương pháp get_io_service của deadline_timer.

+0

Bạn không thể tạo một 'io_service' trong phương thức' setup() 'và sau đó phá hủy nó trong phương thức' teardown() 'của bạn, có thể không? –

Trả lời

3

Vâng, tôi đã xếp bộ não của mình vào điều này trong vài ngày và đưa ra giải pháp khả thi. Đó là mẹ của mọi hacks.

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

Tôi không biết mã này sẽ an toàn như thế nào đối với mã sản xuất. Nhưng cho đến nay nó có vẻ làm việc (không có segfaults, không có hành vi kỳ lạ).

+0

Bạn có thể phân bổ io_service động và lưu trữ nó trong một std :: auto_ptr hoặc boost :: scoped_ptr. Sau đó, bạn có thể đặt lại khi bạn cần "xóa" các trình xử lý. Bằng cách đó bạn tránh sử dụng vị trí mới (trong trường hợp này bạn cần gọi rõ ràng trình phá hủy - xem http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10). – Yukiko

+0

@Yukiko: Tôi không kiểm soát mã tạo io_service. Hơn nữa tôi không contol mã đặt io_service deadline_timer của. Tóm lại, tôi không phân bổ io_service vì vậy tôi không thể lưu trữ nó trong smart_ptr. –

+0

Tôi đang sử dụng tăng 1,49. Bí quyết đó không hoạt động (một số khẳng định thất bại) –

Các vấn đề liên quan