From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,8ee4430d1820a774 X-Google-Attributes: gid103376,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!postnews.google.com!b1g2000pra.googlegroups.com!not-for-mail From: gpriv@axonx.com Newsgroups: comp.lang.ada Subject: Re: GNAT.Sockets: Timeval_Duration is in milliseconds? Date: Sun, 9 Dec 2007 11:36:15 -0800 (PST) Organization: http://groups.google.com Message-ID: <8808f9fb-64a5-4a44-9684-dc0446a26bbc@b1g2000pra.googlegroups.com> References: <9d687056-c98b-405a-b166-afddac34f109@e67g2000hsc.googlegroups.com> <99906a58-2645-4880-bd13-9b63a30ffb59@e4g2000hsg.googlegroups.com> NNTP-Posting-Host: 151.196.71.114 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Trace: posting.google.com 1197228975 20937 127.0.0.1 (9 Dec 2007 19:36:15 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Sun, 9 Dec 2007 19:36:15 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: b1g2000pra.googlegroups.com; posting-host=151.196.71.114; posting-account=YaY8rAoAAAAAnFXOECY3BGVJsrvFJCgy User-Agent: G2/1.0 X-HTTP-Via: 1.1 SPARKS X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11,gzip(gfe),gzip(gfe) Xref: g2news1.google.com comp.lang.ada:18824 Date: 2007-12-09T11:36:15-08:00 List-Id: On Dec 9, 1:26 pm, Simon Wright wrote: > gp...@axonx.com writes: > > On Dec 8, 5:11 pm, Simon Wright 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