2013-05-22 41 views
1

我需要使用malloc创建事件,但我不知道它在哪里释放它们,我想知道 是否它允许释放事件的回调函数内,如:libevent:是否允许释放其回调函数中的事件,如果事件是由malloc创建的

struct event *pkt_ev = (struct event *)malloc(sizeof(struct event)); 
evtimer_set(&pkt_ev, timer_cb, &pkt_ev);  
event_base_set(base, &pkt_ev); 
event_add(&pkt_ev, timeout); 

回调函数timer_cb():

timer_cb(int fd, short ev, void* arg){ 
    ....... 
    free(arg); // here the arg is &pkt_ev 
} 

我最初的想法是:回调函数timer_cb()被调用后,libevent的意志隐含地呼叫event_del(&pkt_ev)。但是由于我在回调中释放了&pkt_ev,因此在event_del(&pkt_ev)上会出现崩溃/异常。这样对吗?

但是,如果event_del(&pkt_ev)不在乎什么内容pkt_ev指向,它可能不是一个问题?

之外,在这个函数:

 event_add(struct event *ev, struct timeval *timeout); 

ev指向的内容应该被照顾了很多,一般应该是一个全局变量或它的寿命应涵盖事件循环(即,当事件循环功能正在运行,它将访问ev指出的内容)。由超时指向的内容如何?应该由超时指向的内容覆盖事件循环吗?

回答

0

你第一个假设是错误的,libevent的隐式调用event_del()之前调用回调函数,而不是(鉴于EV_PERSIST标志没有被设置)。因此,如果未设置EV_PERSIST标志,则在回调中释放pkt_ev没有问题。如果已设置,则需要先明确呼叫event_del()

关于你的第二个问题,不,在超时返回event_add()之前复制超时指向的内容。

相关问题