libevent的:它是允许释放它的回调函数内的事件,如果是由malloc的创建事件(libeven

2019-10-18 04:36发布

我需要创建使用事件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 )。 如何通过超时指向的内容? 应该指出超时内容涵盖事件循环?

Answer 1:

你第一个假设是错误的,libevent的隐式调用event_del()调用回调函数,而不是之后 (假定EV_PERSIST标志没有被设置) 。 因此,有没有问题,在回调释放pkt_ev如果未设置EV_PERSIST标志。 如果它被设置,你需要明确地调用event_del()第一。

关于你的第二个问题,没有通过超时指向的内容被复制之前event_add()返回。



文章来源: libevent: is it allowed to free an event inside its callback function if the event is created by malloc
标签: c linux libevent