对于以下 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)
我想知道:
ev
1) 对于第二个函数中的指针参数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, ...);
event 1 和 event 2 不同,因为参数列表 1 和参数列表 2 不同。如果 event_add 做本地副本,那没问题,但如果 event_add 不做本地副本,那么这两个event_add
实际上只添加事件 2 ?
此外,如果我有一个主要功能:
void func(){
struct event ev;
event_set(&ev, ...);
event_add(&ev, ...)
}
int main(){
func();
event_base_dispatch(base);
}
在调用 func() 之后,执行返回到 main()。因为ev
是 func() 内部的一个局部变量。如果 event_add(&ev,...) 不做本地副本,那就ev
无处可寻,就会有问题。那么我可以在本地事件结构上调用 event_add() 吗?
我想不时添加许多计时器事件(使用类似 evtimer_set 的东西),并且添加发生在一些回调函数中。所以我不能提前为超时事件定义全局变量,如果不能在局部变量上调用event_add(),有什么解决办法吗?
2)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()
不会被调用,因为pkt_ev
是局部变量。