[squeak-dev] Time primitives

David T. Lewis lewis at mail.msen.com
Wed Apr 8 01:51:13 UTC 2015


Hi Eliot,

In trunk Interpreter>>initializePrimitiveTable we currently have:

		(240 primitiveUTCMicrosecondClock)		"was serial port primitive"
		(241 primitiveLocalMicrosecondClock)		"was serial port primitive"

I think these are the primitives that you wanted to have numbered. Please
let me know if I missed some others.

Note - I have never suggested adding #primitiveUtcWithOffset because I cannot
see any performance impact beyond the initial symbol lookups, so I'm quite
happy to leave it as a named primitive.

Dave

On Tue, Apr 07, 2015 at 06:21:19PM -0700, Eliot Miranda wrote:
> Hi David,
> 
>     named primitives have overhead that numbered ones don't.  Given the importance if time prims can we not have the  Cog numbered prims in the interpreter?
> 
> Eliot (phone)
> 
> On Apr 7, 2015, at 6:10 PM, "David T. Lewis" <lewis at mail.msen.com> wrote:
> 
> > On Tue, Apr 07, 2015 at 11:42:21PM +0200, Levente Uzonyi wrote:
> >> On Tue, 7 Apr 2015, David T. Lewis wrote:
> >> 
> >>> I am away and cannot double check the code right now, but the primitives
> >>> should be consistent across Cog and the interpreter VM. There had been
> >>> some confusion due to the early fork between trunk and oscog, but I
> >>> believe that Eliot and I got it sorted out quite a while ago.
> >> 
> >> I can confirm this, but the primitives don't work correctly on the 
> >> Interpreter VM (4.10.2.2614 on linux from squeakvm.org):
> >> 
> >> Time primUTCMicrosecondClock. "==> 2177453298247316"
> >> Time primPosixMicrosecondClockWithOffset. "==> #(519745201 7200)"
> >> DateAndTime now. "==> 2015-04-07T23:30:28.665+01:00"
> >> 
> >> The same with CogVM:
> >> 
> >> Time primUTCMicrosecondClock. "==> 3605895086935548"
> >> Time primPosixMicrosecondClockWithOffset. "==> #(1428442289746346 7200)"
> >> DateAndTime now. "==> 2015-04-07T23:31:32.962+01:00"
> > 
> > Why do you think this is wrong? I suspect that the one hour time zone
> > offset in your image is not in agreement with the three hour offset that
> > your operating system is reporting. The difference in absolute microseconds
> > is due to different origins in the time scale. Eliot's primitive used the
> > Smalltalk epoch UTC as its origin, and mine used Posix. Neither is wrong.
> > 
> >>> 
> >>> These are not necessarily set up as numbered primitives, but the
> >>> implementations are there, and they can be called as named primitives in
> >>> Cog/Spur and interpreter VMs.
> >>> 
> >>> I don't know about the Pharo fork, it's quite possible that things have
> >>> gotten renamed there.
> >> 
> >> The primitives are the same, but the method names in the image are not, 
> >> and the latter is what matters for me. It's a pain to keep code running in 
> >> both branches.
> >> 
> >>> 
> >>> Note, the UTC with offset primitive is important to me because of
> >>> UTCDateAndTime (http://wiki.squeak.org/squeak/6197), which is designed
> >>> around the notion of a single primitive answering UTC time and local
> >>> offset as an atomic call to the VM.
> >> 
> >> It seems like this primitive caches the time zone offset, which is bad 
> >> when there are daylight savings changes (or when the machine goes to a 
> >> different time zone). Here's the current value from a long running image:
> >> 
> >> Time primPosixMicrosecondClockWithOffset. "==> #(1428442620344927 3600)"
> >> 
> >> But the LocalePlugin's primitives seem like they know the truth:
> >> 
> >> Locale current primTimezone. "==> 120"
> >> Locale current primDST. "==> true"
> > 
> > If you are suggesting that the handling of time zones in the various images
> > is less than perfect, then I will be the first to agree with you. But I don't
> > think that the primitives are wrong.
> > 
> > We have this primitive:
> > 
> >  InterpreterPrimitives>>primitiveUtcWithOffset
> >    "Answer an array with UTC microseconds since the Posix epoch and
> >    the current seconds offset from GMT in the local time zone. An empty
> >    two element array may be supplied as a parameter.
> >    This is a named (not numbered) primitive in the null module (ie the VM)"
> > 
> > And the unix platforms sources implement it like this (with ifdefs removed
> > for clarity):
> > 
> >  sqInt sqUnixUtcWithOffset(sqLong *microSeconds, int *offset)
> >  {
> >    struct timeval timeval;
> >    if (gettimeofday(&timeval, NULL) == -1) return -1;
> >    time_t seconds= timeval.tv_sec;
> >    suseconds_t usec= timeval.tv_usec;
> >    *microSeconds= seconds * 1000000 + usec;
> >    *offset= localtime(&seconds)->tm_gmtoff;
> >    return 0;
> >  }
> > 
> > So the operating system is telling you its best estimate of the current time
> > in microseconds since the Posix epoch, as well as the local time zone offset
> > in seconds at the time of the call. This is a single gettimeofday() call to
> > the platform runtime library, which is about as close as we can get to a
> > coherent result on general purpose unix systems.
> > 
> > Dave
> > 
> > 


More information about the Squeak-dev mailing list