Regd ev_timer

Varun Chandramohan cvaruneng04 at gmail.com
Wed Apr 3 00:27:31 CEST 2013


Hi Jann,

Sorry for psudo code and bad format. I put only the pseudo code because it
will easier to see if there is a logical flaw.

This is not to check for internet connectivity. In my actual code I use IP
address not resolving. This is just test code so I have the same. Please
excuse me.

With the changes you suggested
This trick with the timer is a bit ugly. Why don't you do it the way it's
documented in the manual? Just do

    ev_now_update(loop);
    ev_timer_set(&ps_hb->timer, DEFAULT_CONNECT_TIMER, 0);

(same thing in hb_timeout_handler)

This fixes my problem. It seem to work as expected. Iam pasting my code
anyways so that you can take a look and let me know if you see proper use
of the libev. Please
add any comment. Thanks a lot for your help.

My code: http://pastebin.com/Zvzurj2N

Regards,
Varun


On Tue, Apr 2, 2013 at 5:53 PM, Jann Horn <jann+libev at thejh.net> wrote:

> On Tue, Apr 02, 2013 at 02:48:05PM +1100, Varun Chandramohan wrote:
> > Hi Folks,
> >
> > Iam trying to understand the timer behaviour using a simple program. Let
> me
> > first post the pseudo code.
>
> Why pseudo code? Why not your real code? If you have made a mistake that's
> not visible
> in your pseudo code anymore, we can't spot it. And we can't run your
> pseudo code.
> By the way, every second line of the code is blank – that's hard to read
> on a small
> display (I reformatted it so that it's easier to read for me). Also, your
> code isn't
> properly indented.
> I can't find an error in your pseudocode, but I'll comment on it anyway.
>
>
> > static void hb_conn_cb(struct ev_loop *loop, struct ev_io *w, int
> events) {
> >     struct ps_hb *ps_hb = (struct ps_hb *)w;
> >     printf("HB Timer\n");
> >     if (EV_WRITE & events) {
> >         ev_io_stop(loop, &ps_hb->io);
> >         ev_timer_stop(loop, &ps_hb->timer);
> >         close(ps_hb->sd);
> >         sleep(10);
> >
> >         if ((ps_hb->sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) return;
> >         if (set_socket_nonblock(ps_hb->sd)) return;
> >         ev_io_set(&ps_hb->io, ps_hb->sd, EV_WRITE);
> >         ev_timer_set(&ps_hb->timer, DEFAULT_CONNECT_TIMER + ev_now
> (loop) -
> > ev_time (), 0);
>
> This trick with the timer is a bit ugly. Why don't you do it the way it's
> documented in the manual? Just do
>
>     ev_now_update(loop);
>     ev_timer_set(&ps_hb->timer, DEFAULT_CONNECT_TIMER, 0);
>
> (same thing in hb_timeout_handler)
>
>
> >         ev_io_start(loop, &ps_hb->io);
> >         ev_timer_start(loop, &ps_hb->timer);
> >
> >        connect();
>
> Is this connect() part of that block? It's indented weirdly and the curly
> brace
> is missing, so I can't tell. (Another reason why you should have posted
> real code.)
> (again, same thing in hb_timeout_handler)
>
>
> >     return;
> > }
>
>
> > As you can see its a pretty simple program and my intention is to do a
> > connect to say "google.com" periodically every 10 sec (originally 2
> mins)
> > and see if its connects or not.
>
> If your intention is to check whether the internet is reachable, you
> should try
> connecting to an IP, not to a hostname. Connecting to a hostname usually
> means
> that you have to do a DNS lookup which might also block. Just use 8.8.8.8
> or so
> (that's a public DNS server by Google).
>
>
> > Since by default connect timeout is too
> > long for me I want set sd to non-block and set a timeout for
> > DEFAULT_CONNECT_TIMER. That is if that timer exipres and we have not
> > connected then I will not connect to google.com failed. If the timer
> does
> > not expire and connect happens before that then I simply reset the timer
> > and do this forever.
>
> Sounds good.
>
>
> > However, the above code does not work because of using sleep(10) which is
> > more than DEFAULT_CONNECT_TIMER. If I increase DEFAULT_CONNECT_TIMER to
> > 11.0 then everything works as planned. But I do not want connect to have
> > such big timeout. Is there a way I can make the timer stop and not record
> > events when Iam sleeping?
>
> Huh? What do you mean, "record events"? A timer does not record events,
> all it
> does is fire after the specified delay is over.
>
>
> > Iam not quite sure why this must happen even
> > after I did  ev_timer_stop(loop, &ps_hb->timer).
>
> After you have called ev_timer_stop, the timer will not fire anymore.
>
> _______________________________________________
> libev mailing list
> libev at lists.schmorp.de
> http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.schmorp.de/pipermail/libev/attachments/20130403/5403668a/attachment.html>


More information about the libev mailing list