2014-02-25 5 views
0

libevent 님의 타이머 기능을 테스트하고 있습니다. timeout_cb에서타이머에서베이스를 가져 옵니까?

shared_ptr<event_base> base(event_base_new(), std::ptr_fun(event_base_free)); 
vector<shared_ptr<event> > std_events; 
... 

static const timeval three_sec = { 3, 0 }; 
event* tev = NULL; 

tev = evtimer_new(base.get(), NULL, NULL); 
rc = event_assign(tev, base.get(), -1, EV_PERSIST, timeout_cb, tev); 

rc = event_add(tev, &three_sec); 
shared_ptr<event> ptr(tev, std::ptr_fun(event_free)); 
std_events.push_back(ptr); 

rc = event_base_dispatch(base.get()); 

, 나는 그것이 디스패치 루프 후 몇 번 실행 종료하려면 :

void 
timeout_cb(evutil_socket_t fd, short events, void *arg) 
{ 
    static int count = 0; 
    int rc = 0; 

    event* timer = (event *)arg; 
    event_base* base = NULL;  

    if(count++ == 5) { 
     struct timeval delay = { 1, 0 }; 
     rc = event_base_loopexit(base, &delay); 
    } 
} 

나는 타이머를 3 초마다 발사 다음에 타이머를 설정

콜백에서 arg에 대한 사용자 정의 구조체를 피하려고합니다.

event_base_loopexitbase_event이 필요합니다. base_eventevutil_socket_t 또는 event*timer에서 가져올 수 있습니까?

답변

0

base을 가져 오는 방법은 두 가지가 있습니다.

event_get_base 기본 검색합니다 :

event_base* base = NULL; 
event_get_assignment(timer, &base, NULL, NULL, NULL, NULL); 
:

event_base* base = event_get_base(timer); 

event_get_assignment 또한 base을 검색합니다을

관련 문제