[Vm-dev] VM Maker: VMMaker.oscog-eem.1426.mcz

David T. Lewis lewis at mail.msen.com
Mon Jul 20 20:48:35 UTC 2015


Eliot,

Thanks for this explanation. I had not spotted the discrepancy in the
sqComplexEvent struct. Yikes! no way that could work.

Thanks,
Dave

>  Hi David,
>
> On Sun, Jul 19, 2015 at 8:52 PM, David T. Lewis <lewis at mail.msen.com>
> wrote:
>
>>
>> On Sun, Jul 19, 2015 at 11:35:46AM -0400, David T. Lewis wrote:
>> >
>> > On Sat, Jul 18, 2015 at 09:51:30PM -0700, Eliot Miranda wrote:
>> > >
>> > > On Sat, Jul 18, 2015 at 8:10 PM, David T. Lewis
>> <lewis at mail.msen.com>
>> wrote:
>> > > >
>> > > > I may be missing something, but I do not see anything about the
>> Spur
>> > > > 64-bit image format that should require special handling for this.
>> > > >
>> > >
>> > > Yes, I think you're missing something.  let me take you through it.
>> We're
>> > > talking about evaluating, in a 64-bit C, sizeof(long) == 8,
>> sizeof(int) ==
>> > > 4, the following two variants:
>> > >
>> > > #define MillisecondClockMask 0x1FFFFFFF
>> > >
>> > > (sqInt)((MillisecondClockMask << 3) + 1L)
>> > >
>> > > (sqInt)(((sqInt)MillisecondClockMask << 3) + 1L)
>> > >
>> > >
>> > > So let's take the first.  The type of MillisecondClockMask is int.
>> The
>> > > type of MillisecondClockMask << 3 is int.  It's bit-pattern is
>> 0xFFFFFFF8,
>> > > and hence its value is, incorrectly, -8.  So it evaluates to the
>> > > SmallInteger -1, not 16r1FFFFFFF as desired.
>> > >
>> > > In the second, the type of MillisecondClockMask is int. The type of
>> > > (sqInt) MillisecondClockMask is long.  The type
>> > > of ((sqInt)MillisecondClockMask << 3).  It's bit pattern is also
>> 0xFFFFFFF8
>> > > but its value is 0xFFFFFFF8, /not/ -8, and so it evaluates to the
>> > > SMallInteger 16r1FFFFFFF as desired.
>> > >
>> > > Does that make sense?
>> >
>> > Yes, the shift left 3 (rather that 1 in the old object format) is what
>> I
>> > was missing.
>> >
>> > I suspect that a cast to usqInt would accomplish the same thing
>> without
>> > the ifTrue: test. Sorry I can't try it right now but it might be worth
>> a
>> > look.
>> >
>>
>> At the risk of further annoyance, here is one more question/observation:
>>
>> In VMMaker.oscog-eem.1417 (and sq.h in platforms sources), we change the
>> type of the event buffer from int[8] to long[8], which corrects a
>> failure
>> in starting in the 64-bit Spur image. I don't know exactly what was
>> failing,
>> but I am suspecting perhaps the time stamp field in the event struct was
>> being incorrectly converted from its 32 bit int value to an integer
>> object
>> in primitiveGetNextEvent, and that using long rather than int fields
>> prevented this from happening.
>>
>> Later, in VMMaker.oscog-eem.1426 we have the fix for conversion of
>> integer
>> value to integer object, which particularly affected conversion of
>> millisecond clock values. So I wonder if the fix in
>> VMMaker.oscog-eem.1426
>> might make the changes in VMMaker.oscog-eem.1417 unnecessary? And if so,
>> can the fields of the sqInputEvent struct be changed back from long to
>> int (possibly with some performance advantage)?
>>
>
> Well, indeed the commit comment on  VMMaker.oscog-eem.1417 is wrong, in
> that the size of the evtBuf wasn't the cause of the bug.  But there /is/ a
> bug here with 64-bits.  Look at platforms/Cross/vm/sq.h:
>
> The generic input event conforms to int evtBuf[8]:
>
> /* generic input event */
> typedef struct sqInputEvent
> {
>   int type;         /* type of event; either one of EventTypeXXX */
>   unsigned int timeStamp;   /* time stamp */
>   /* the interpretation of the following fields depend on the type of the
> event */
>   int unused1;
>   int unused2;
>   int unused3;
>   int unused4;
>   int unused5;
>   int windowIndex;      /* SmallInteger used in image to identify a host
> window structure */
> } sqInputEvent;
>
> But the complex event *does not*:
>
> typedef struct sqComplexEvent
>     {
>         int type;           /* type of event;  EventTypeComplex */
>         unsigned int timeStamp; /* time stamp */
>         /* the interpretation of the following fields depend on the type
>  of the event */
>         int action;             /* one of ComplexEventXXX (see below) */
>         usqInt objectPointer;   /* used to point to object */
>         int unused1;            /*  */
>         int unused2;            /*  */
>         int unused3;            /*  */
>         int windowIndex;    /* host window structure */
>     } sqComplexEvent;
>
> In 64-bits usqInt objectPointer occupies 64-bits, not 32, and so
> a sqComplexEvent does not conform to int evtBuf[8].
>
>
> Hence my solution is to change evtBuf to long evtBuf[8], and change all
> the
> fields in the events from (unsigned) int to (unsigned) long.  There is no
> performance issue with 32-bits; sizeof(long) == sizeof(int), and in 64
> bits
> it won't make any difference either; events are simply not that frequent
> for this to be an issue.
>
> HTH
>
> _,,,^..^,,,_
> best, Eliot
>




More information about the Vm-dev mailing list