ev_timer problem

2008-07-02 Thread vvvua

Hello!
I'm trying to do a set of time watchers on default loop.
Default loop  also maintain an  async io on sockets. The program 
architecture  is designed with only one point of realisation of async 
calls - in ev_loop (loop,0) with default loop;

Socket i/o works fine, but i have a strange timer problem.
First, i create a timer at 45sec.
After each callback, i am trying to set timer on 5 seconds, but timer 
waits 45 seconds.

After some callback timer starts to wait 5 seconds...
Many time watchers can be active in same time.
Where is problem? Any ideas?
Thanks.

struct TimeSockMapper
{
   struct ev_timer tm;
   ev_tstamp repeat;
   int fd;
   void *defPoint;
   TimeSockMapper()
   {
   memset(&tm,0,sizeof(ev_timer));
   memset(&repeat,0,sizeof(ev_tstamp));
   fd=0;
   defPoint=NULL;
   }
};

void timeout_cb(EV_P_ struct ev_timer *w_, int revents)
{
   int cfd;
   struct TimeSockMapper * w= (struct TimeSockMapper *)w_;
   struct LocalOpcodeData * ldata = (struct LocalOpcodeData *) w->defPoint;
   cfd=w->fd;

   ev_timer_stop(loop,(ev_timer * )w);
...
}

void set_timeout(int fd, long long seconds,LocalOpcodeData *ldata)
{
   TimeSockMapper *mtm=new TimeSockMapper();
   mtm->repeat=0;
   mtm->fd=fd;
   mtm->defPoint=ldata;


   ev_timer_init (&(mtm-> tm), timeout_cb, seconds, 0.);
   ev_timer_set (&(mtm-> tm), seconds + ev_now (loop) - ev_time (), 0.);
   ev_timer_start (loop,&(mtm->tm));
}

___
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev


Re: ev_timer problem

2008-07-02 Thread Marc Lehmann
On Wed, Jul 02, 2008 at 01:46:36PM +0300, vvvua <[EMAIL PROTECTED]> wrote:
> Default loop  also maintain an  async io on sockets. The program  
> architecture  is designed with only one point of realisation of async  
> calls - in ev_loop (loop,0) with default loop;

It is totally unclear to me what you mean with "async io" - i assume this
is something in your program?

> First, i create a timer at 45sec.
> After each callback, i am trying to set timer on 5 seconds, but timer  
> waits 45 seconds.

You should probbaly show the code for that.

>TimeSockMapper()
>{
>memset(&tm,0,sizeof(ev_timer));
>memset(&repeat,0,sizeof(ev_tstamp));

You do not need to zero-initialise the watcher structures, this will only
bloat your code.

> void timeout_cb(EV_P_ struct ev_timer *w_, int revents)
> {
>int cfd;
>struct TimeSockMapper * w= (struct TimeSockMapper *)w_;
>struct LocalOpcodeData * ldata = (struct LocalOpcodeData *) w->defPoint;
>cfd=w->fd;
>
>ev_timer_stop(loop,(ev_timer * )w);

No restart here.

> void set_timeout(int fd, long long seconds,LocalOpcodeData *ldata)
> {
>TimeSockMapper *mtm=new TimeSockMapper();
>mtm->repeat=0;
>mtm->fd=fd;
>mtm->defPoint=ldata;
>
>
>ev_timer_init (&(mtm-> tm), timeout_cb, seconds, 0.);
>ev_timer_set (&(mtm-> tm), seconds + ev_now (loop) - ev_time (), 0.);
>ev_timer_start (loop,&(mtm->tm));
>

No restart here either.

If the timer indeed doesn't restart as you want, then you should show us
the code that actually resets the timer and restarts it - make sure you
stop the timer before modifying it, or, even better, use ev_timer_restart
and a suitable restart interval.

-- 
The choice of a   Deliantra, the free code+content MORPG
  -==- _GNU_  http://www.deliantra.net
  ==-- _   generation
  ---==---(_)__  __   __  Marc Lehmann
  --==---/ / _ \/ // /\ \/ /  [EMAIL PROTECTED]
  -=/_/_//_/\_,_/ /_/\_\

___
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev