*MY special case:*:
        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);
                     .......
                }


I'm just afraid timer_cb() won't be called because pkt_ev is a local variable.



2013/5/22 wen lui <[email protected]>

>
>
>    void func(){
>      struct event ev1;
>
>      event_set(&ev1, ...);
>      event_base_set(base, &ev);
>      event_add(&ev1, ...)
>    }
>
>    int main(){
>       struct event_base * mybase = event_init();
>       func();
>       event_base_dispatch(base);
>    }
>
>
> -----------------------------------------------------------------------------------------------------------------
> the more complete version is as above. you mean the event_init() will
> create 2 event bases, the default base
> and mybase? why will the memory used for the event be overwritten by
> random data if it is added to the
> default base? if it is added to mybase, there is no problem?
>
>
>
>
>
>
>
>
> Basically what you want to do is:
>
> - Create new events when needed with event_new()
>  - Add the new events to base with event_add()
> - Free your events when done with event_free()
>
> --------------------------------------------------------------------------------------------------------------
> event_new() is in libevent version 2.0.xxx, I'm using libevent version
> 1.4xxxx
> I think the following 3 lines can replace event_new()
>
>      struct event ev1;
>      event_set(&ev1, ...);
>      event_base_set(base, &ev);
>
>
> I'm just afraid, if the event is created in a non-main sub-routine, then it is
> a local variable. its lifetime is inside that sub-routine. When event_add() is
> called in that sub-routine, the event is added to event loop, but after that
>
> subroutine is finished, the local variable is game over. If libevent doesn't 
> make
> a copy of the event inside the event loop, there is a crash.
>
>
>
>
>
>
> 2013/5/22 Nir Soffer <[email protected]>
>
>> On Wed, May 22, 2013 at 4:41 AM, wen lui <[email protected]> wrote:
>>
>>> From stackoverflow I get to know that  if I define a struct event
>>> variable in a function which is different from where
>>> event_base_dispatch()
>>> is defined, this event will not be added to the event loop, as below,
>>> ev1 will not be added to event loop.
>>>
>>>    void func(){
>>>      struct event ev1;
>>>
>>>
>> This event is on the stuck...
>>
>>
>>>
>>>      event_set(&ev1, ...);
>>>      event_add(&ev1, ...)
>>>
>>>
>> And you added it to the default event base.
>>
>> If you dispatch the default base, you probably crash (soon if you are
>> lucky). The memory used for the event will be overwritten by random data
>> when another function is called.
>>
>>
>>>
>>>    }
>>>
>>>    int main(){
>>>       func();
>>>
>>>
>> Here you dispatch on another base.
>>
>>
>>>
>>>       event_base_dispatch(base);
>>>    }
>>>
>>> my problem is that I can't estimate the number of events in advance(think 
>>> about discrete-event-driven simulation
>>>
>>>
>>>
>>> if you know it, but I'm not using libevent for this purpose). so I have to 
>>> create one event each time a call
>>> back function or its sub-function wants to insert an event into the 
>>> event_loop. That's being said I need to create
>>> many events that are local varibles which are not seen by 
>>> event_base_dispatch(base);
>>>
>>>
>>>
>>> are there any workaround for my problem?
>>>
>>> No, but reading libevent book may help.
>> http://www.wangafu.net/~nickm/libevent-book/
>>
>> Basically what you want to do is:
>>
>> - Create new events when needed with event_new()
>> - Add the new events to base with event_add()
>> - Free your events when done with event_free()
>>
>>
>>
>

Reply via email to