2010-02-22 4 views
11

재사용하기 전에 IO_service에서 모든 핸들러를 제거하고 싶습니다. 이것이 가능한가?부스트 :: asio :: io_service에서 모든 핸들러를 호출하지 않고 호출합니다.

asio::io_service과 관련된 단위 테스트를 작성하고 있습니다. 각 테스트 케이스 사이에 글로벌 io_service 핸들러를 지우고 싶습니다. 나는 그게 io_service::reset 것이라고 생각했지만 그렇지 않습니다. reset()io_service 만 재개 할 수 있습니다. 마지막 테스트 케이스의 모든 핸들러는 여전히 대기열에 있습니다.

단위 테스트를 위해이 작업을 수행하면 미친 해킹이 효과적입니다.


더 많은 정보 : io_servicedeadline_timer 멤버 변수에서입니다

. deadline_timer은 내가 테스트하고있는 코드의 일부로, 어떻게 구성되었는지 변경할 수 없습니다. deadline_timerget_io_service 메소드를 통해 io_service을 보유하고 있습니다.

+0

'setup()'메소드에서'io_service'를 생성 한 다음'teardown()'메소드에서 그것을 파괴 할 수 있습니까? –

답변

3

글쎄, 나는 이것을 며칠 동안 두뇌에 고정시키고 실행 가능한 해결책을 찾았다. 그것은 모든 해킹의 어머니입니다.

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

프로덕션 코드에 대한 안전성이 확실하지 않습니다. 그러나 지금까지 그것은 작동하는 것처럼 보입니다 (segfaults, 이상한 행동 없음).

+0

io_service를 동적으로 할당하여 std :: auto_ptr 또는 boost :: scoped_ptr에 저장할 수 있습니다. 그런 다음 핸들러를 "지우려면"필요할 때 재설정 할 수 있습니다. 그렇게하면 배치 배치를 사용하지 않아도됩니다.이 경우 소멸자를 명시 적으로 호출해야합니다 (http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10 참조). – Yukiko

+0

@Yukiko : io_service를 만드는 코드를 제어하지 않습니다. 더 나아가 나는 deadline_timer의 io_service를 설정하는 코드를 통제하지 않는다. 즉, io_service를 할당하지 않기 때문에 smart_ptr에 저장할 수 없습니다. –

+0

나는 부스트 1.49를 사용하고있다. 그 트릭이 작동하지 않습니다 (일부 어설 션이 실패했습니다) –

관련 문제