comp.lang.ada
 help / color / mirror / Atom feed
From: gpriv@axonx.com
Subject: Re: GNAT.Sockets: Timeval_Duration is in milliseconds?
Date: Sun, 9 Dec 2007 11:36:15 -0800 (PST)
Date: 2007-12-09T11:36:15-08:00	[thread overview]
Message-ID: <8808f9fb-64a5-4a44-9684-dc0446a26bbc@b1g2000pra.googlegroups.com> (raw)
In-Reply-To: m2bq8ziv1z.fsf@mac.com

On Dec 9, 1:26 pm, Simon Wright <simon.j.wri...@mac.com> wrote:
> gp...@axonx.com writes:
> > On Dec 8, 5:11 pm, Simon Wright <simon.j.wri...@mac.com> wrote:
> >> gp...@axonx.com writes:
> >> > I find it somewhat misleading that Timeout values use different scale
> >> > than Ada duration while share that type (not Ada way).  Is there a
> >> > purpose in that (other than direct translation in socket library).  It
> >> > does cost some headache to figure that out and it would be more
> >> > appropriate in Ada style to make a new type for timeouts or scale it
> >> > back to seconds.  Anyone would agree?
>
> >> GNAT GPL 2006[1] agrees with you! from GNAT.Sockets,
>
> >>    --  Timeval_Duration is a subtype of Standard.Duration because the full
> >>    --  range of Standard.Duration cannot be represented in the equivalent C
> >>    --  structure. Moreover, negative values are not allowed to avoid system
> >>    --  incompatibilities.
>
> >>    Immediate : constant := 0.0;
> >>    Forever   : constant := Duration (Integer'Last) * 1.0;
>
> >>    subtype Timeval_Duration is Duration range Immediate .. Forever;
>
> >> [1] No GNAT GPL 2007 for Mac OS X :-(
>
> > But that was precisely my point to rather make a new type instead of
> > subtyping, since scales are totally different.  But that is subjective
> > I guess.
>
> Oh. I don't understand why you think that milliseconds are involved at
> all?
>
> *If* a Timeval_Duration was in units of milliseconds you would be
>  completely right. But it is in seconds, just as it should be.
>
> If you look at GNAT.Sockets'Body you'll find
>
>    function To_Timeval (Val : Timeval_Duration) return Timeval is
>       S  : time_t;
>       uS : suseconds_t;
>
>    begin
>       --  If zero, set result as zero (otherwise it gets rounded down to -1)
>
>       if Val = 0.0 then
>          S  := 0;
>          uS := 0;
>
>       --  Normal case where we do round down
>
>       else
>          S  := time_t (Val - 0.5);
>          uS := suseconds_t (1_000_000 * (Val - Selector_Duration (S)));
>       end if;
>
>       return (S, uS);
>    end To_Timeval;
>
> which is pretty clearly based on *seconds*.
>
> (If you wanted to ask what Selector_Duration is doing there -- it's an
> unconstrained subtype of Timeval_Duration -- you'd have a point!)

That's very good point, but unfortunately it is not what happening in
real (windows at least).  Setsockoption defines timeouts in
milliseconds:

http://msdn2.microsoft.com/en-us/library/ms740532.aspx

"Sets a timeout, in milliseconds, for blocking receive calls. The
default for this option is zero, which indicates that a receive
operation will not time out. If a blocking receive call times out, the
connection is in an indeterminate state and should be closed."

Here is a fragment from my old code to set the timeout in milliseconds
and it worked:


	void Socket::RecvTimeout(int to)
	{
		int rc = setsockopt(mSock, SOL_SOCKET, SO_RCVTIMEO, (char*) &to,
sizeof(to));
		if (rc == SOCKET_ERROR)
			std::cerr << "Failed socket option" << std::endl;
	}



The confusion comes from crudeness of setsockopt with const char*
being passed as parameter.  So in Gnat.socket case it is passing
structure with second.micosecondsecond part. In windows it may be
simply taking the first value and interpret it as milliseconds.  Haven
checked on Linux yet.

What a mess!

George





  reply	other threads:[~2007-12-09 19:36 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-12-08 19:45 GNAT.Sockets: Timeval_Duration is in milliseconds? gpriv
2007-12-08 22:11 ` Simon Wright
2007-12-08 22:34   ` gpriv
2007-12-09  1:45     ` tmoran
2007-12-09  9:33       ` Dmitry A. Kazakov
2007-12-09 12:50         ` Gautier
2007-12-09 13:37           ` Dmitry A. Kazakov
2007-12-09 14:59             ` Martin Krischik
2007-12-09 17:24               ` Dmitry A. Kazakov
2007-12-09 15:55         ` gpriv
2007-12-09 17:25           ` Dmitry A. Kazakov
2007-12-09 18:26     ` Simon Wright
2007-12-09 19:36       ` gpriv [this message]
2007-12-09 22:51         ` Simon Wright
2007-12-09 23:27           ` gpriv
2007-12-10 20:06             ` Simon Wright
2007-12-10 21:02               ` gpriv
2007-12-11 20:33                 ` Simon Wright
2007-12-13  3:44                   ` gpriv
2007-12-13 13:13                     ` Simon Wright
2007-12-13 14:32                       ` gpriv
2007-12-09 19:46       ` tmoran
2007-12-09  9:01   ` Martin Krischik
2007-12-09  9:32 ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox