libevent API:理解指针参数或返回值

时间:2013-05-21 22:34:40

标签: c libevent

以下libevent API:

void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg)

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

struct event* event_new (struct event_base *, evutil_socket_t, short, event_callback_fn, void)   

我想知道:

1)对于第二个函数ev中的指针参数event_add,函数event_add是否构成了ev结构的本地副本?

例如,如果我做了类似的事情:

  code snippet 1:

     struct event ev;
     event_set(&ev, ..para list 1...);    // event 1 
     event_add(&ev, ...);
     event_set(&ev, ..para list 2...);    // event 2
     event_add(&ev, ...);

事件1与事件2不同,因为参数列表1与参数列表2不同。如果event_add创建本地副本,则没有问题,但如果event_add没有创建本地副本,那么这两个{{ 1}}实际上只添加事件2?

此外,如果我有一个主要功能:

event_add

调用func()后,执行返回main()。因为 void func(){ struct event ev; event_set(&ev, ...); event_add(&ev, ...) } int main(){ func(); event_base_dispatch(base); } 是func()中的局部变量。如果event_add(& ev,...)没有制作本地副本,则无法找到ev,并且会出现问题。 那么我可以在本地事件结构上调用event_add()吗?

我想不时添加许多计时器事件(使用像evtimer_set这样的东西),并且在一些回调函数中添加。所以我无法提前为超时事件定义全局变量,如果无法在局部变量上调用event_add(),是否有任何解决方案?

2)ev返回一个结构指针,我想知道结构在哪里,它是在堆栈/堆内存还是静态内存中?

我的特殊情况:

event_new

我只是害怕 in the main.c int main(){ struct event_base *base; struct event pcap_ev; ..... // here I get a file descriptor pcapfd event_set(&pcap_ev, pcapfd, EV_READ|EV_PERSIST, on_capture, pcap_handle); event_base_set(base, &pcap_ev); event_add(&pcap_ev, NULL); ..... event_base_dispatch(base); } on_capture callback function: void *on_capture(int pcapfd, short op, void *arg) { pcap_t *handle; handle = (pcap_t *)arg; fqueue_t* pkt_queue; pkt_queue = init_fqueue(); pcap_dispatch(handle, -1, collect_pkt, pkt_queue); // this function put all the cached packets into pkt_queue process_pcap(pkt_queue); } the sub-routine process_pcap(): void process_pcap(pkt_queue);{ for (pkt in pkt_queue){ // here is pseudo code insert(table, pkt); // here insert the pkt into a certain table struct event pkt_ev; evtimer_set(&pkt_ev, timer_cb, NULL); // I want to call timer_cb after timeout event_base_set(base, &pkt_ev); event_add(&pkt_ev, timeout); } } the callback function timer_cb(): timer_cb(...){ if(...) delete(table, pkt); ....... } 不会被调用,因为timer_cb()是一个局部变量。

1 个答案:

答案 0 :(得分:0)

您必须为要了解的每个事件使用不同的struct event实例。您只能在本地event_add()变量上调用struct event,如果该变量的生命周期跨越所有对事件循环API的调用,直到使用event_del()删除它。

分配函数默认为堆,但您可以使用event_set_mem_functions()替换自己的分配例程。