vvvua wrote:
vvvua wrote:
Marc Lehmann wrote:
> 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?
> Yes. I mean input/output with sockets
ev_io_init (eh->getEvP(), func, sfd, flags);
ev_io_start (loop, eh->getEvP());
> >> 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.
> Original code too big to show, but simple example is
> for(int i=100;i>0;i-=10)
{
LocalOpcodeData *ldt = new LocalOpcodeData();
ldt->opcode=1;
set_timeout(fd, i,ldt);
}
Sorry, it was bad example. This example works fine, becouse time
interval is still.
Next example describes the problem:
*/ / int a[3]={40,5,20};
for(int i=0;i<3;i++)
{
LocalOpcodeData *ldt = new LocalOpcodeData();
ldt->opcode=1;
ldt->opcode_param0_uint=time(NULL);
ldt->opcode_param1_int=a[i];
cerr<<"\nsetTimeout="<<a[i]<<endl;
set_timeout(cfd, i,ldt);
}*
And out is:
/setTimeout=40
setTimeout=5
setTimeout=20
localOpcode=1
bot5 timer...5
localOpcode=1
bot5 timer...20/
And the out of
/localOpcode=1
bot5 timer...5
localOpcode=1
bot5 timer...20
/happens at firs 1..3 seconds.
Timeout for 40 seconds not passed over a 2 minutes. And i do not wait
for it any more.
SORRY! I have a bad day...
set_timeout(cfd, i,ldt);
must be
set_timeout(cfd, a[i],ldt);
After thet change works fine if i have a socket input/output.
But...
I setup first timer at 5 seconds.
After callback i setup timers from last given example.
If we have only timer activity callback function not called until i have
i/o on sockets.
Waiting about of 1 minute..
After socket i/o i have a call of callback function for all timers at ones.
>> 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.
> ok, i'll remove it.
> >> 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.
> it's ok
> >> 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.
> that's also ok.
> 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.
>
> ev_loop is in different thread. Is this a problem?
------------------------------------------------------------------------
_______________________________________________
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
------------------------------------------------------------------------
_______________________________________________
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
_______________________________________________
libev mailing list
libev@lists.schmorp.de
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev