[squeak-dev] The Trunk: Morphic-eem.994.mcz

Eliot Miranda eliot.miranda at gmail.com
Sat Jul 18 17:37:54 UTC 2015


Hi Chris,

On Sat, Jul 18, 2015 at 10:31 AM, Chris Muller <asqueaker at gmail.com> wrote:

> Does this only affect the 64-bit image?  If so, we should move this to
> Inbox until we finish the release.
>

OK.  Go ahead.  In fact, I may just have mis-diagnosed the bug.  I'll take
another look.  But feel free to move it to inbox.



>
> On Sat, Jul 18, 2015 at 12:24 PM,  <commits at source.squeak.org> wrote:
> > Eliot Miranda uploaded a new version of Morphic to project The Trunk:
> > http://source.squeak.org/trunk/Morphic-eem.994.mcz
> >
> > ==================== Summary ====================
> >
> > Name: Morphic-eem.994
> > Author: eem
> > Time: 18 July 2015, 10:22:51.401 am
> > UUID: bd1bf232-933d-4017-95d5-974200758bb6
> > Ancestors: Morphic-cmm.993
> >
> > Fix a serious bug with interCyclePause:.  On the first invocation,
> lastCycleTime may be far in the future (since it will be whatever it was
> when the image is saved), hence Time millisecondsSince: lastCycleTime can
> be large and negative, hence milliSecs - (Time millisecondsSince:
> lastCycleTime) can be large and positive, which can result in a delay of
> many minutes in the first invocation.  This was causing the unresponsivness
> of the 64-bit Spur image on start-up.  The fix is simple; if lastCycleTime
> iks in the future it should be reset.
> >
> > Change HandMorph>>handleEvent: to only update EventStats if it is
> non-nil, and change the package prologue to nil it.  Nothing reads
> EventStats, so it is taking cycles for no purpose.  This isn;t an issue
> until the count of mouse move events rolls over into large positive
> integers, at which point there's real overhead.  There's a comment in the
> method to allow one to "install" EventStats if and when one does want to
> collect such stats.  But IMO this shouldn't be enabled by default.  Waste
> not, want not.
> >
> > =============== Diff against Morphic-cmm.993 ===============
> >
> > Item was changed:
> >   ----- Method: HandMorph>>handleEvent: (in category
> 'events-processing') -----
> >   handleEvent: anEvent
> >         | evt ofs |
> >         owner ifNil:[^self].
> >         evt := anEvent.
> >
> > +       "EventStats ifNil:[EventStats := IdentityDictionary new]
> ifNotNil: [EventStats := nil]."
> > +       EventStats ifNotNil:
> > +               [EventStats
> > +                       at: #TypicalStack ifAbsentPut: [thisContext
> copyStack];
> > +                       at: #count put: (EventStats at: #count
> ifAbsent:[0]) + 1;
> > +                       at: evt type put: (EventStats at: evt type
> ifAbsent:[0]) + 1].
> > -       EventStats ifNil:[EventStats := IdentityDictionary new].
> > -       EventStats at: #count put: (EventStats at: #count ifAbsent:[0])
> + 1.
> > -       EventStats at: evt type put: (EventStats at: evt type
> ifAbsent:[0]) + 1.
> >
> >         evt isMouseOver ifTrue:[^self sendMouseEvent: evt].
> >
> >   ShowEvents == true ifTrue:[
> >         Display fill: (0 at 0 extent: 250 at 120) rule: Form over fillColor:
> Color white.
> >         ofs := (owner hands indexOf: self) - 1 * 60.
> >         evt printString displayAt: (0 at ofs) + (evt isKeyboard
> ifTrue:[0 at 30] ifFalse:[0 at 0]).
> >         self keyboardFocus printString displayAt: (0 at ofs)+(0 at 45).
> >   ].
> >         "Notify listeners"
> >         self sendListenEvent: evt to: self eventListeners.
> >
> >         evt isWindowEvent ifTrue: [
> >                 self sendEvent: evt focus: nil.
> >                 ^self mouseOverHandler processMouseOver: lastMouseEvent].
> >
> >         evt isKeyboard ifTrue:[
> >                 self sendListenEvent: evt to: self keyboardListeners.
> >                 self sendKeyboardEvent: evt.
> >                 ^self mouseOverHandler processMouseOver: lastMouseEvent].
> >
> >         evt isDropEvent ifTrue:[
> >                 self sendEvent: evt focus: nil.
> >                 ^self mouseOverHandler processMouseOver: lastMouseEvent].
> >
> >         evt isMouse ifTrue:[
> >                 self sendListenEvent: evt to: self mouseListeners.
> >                 lastMouseEvent := evt].
> >
> >         "Check for pending drag or double click operations."
> >         mouseClickState ifNotNil:[
> >                 (mouseClickState handleEvent: evt from: self) ifFalse:[
> >                         "Possibly dispatched #click: or something and
> will not re-establish otherwise"
> >                         ^self mouseOverHandler processMouseOver:
> lastMouseEvent]].
> >
> >         evt isMove ifTrue:[
> >                 self position: evt position.
> >                 self sendMouseEvent: evt.
> >         ] ifFalse:[
> >                 "Issue a synthetic move event if we're not at the
> position of the event"
> >                 (evt position = self position) ifFalse:[self
> moveToEvent: evt].
> >                 "Drop submorphs on button events"
> >                 (self hasSubmorphs)
> >                         ifTrue:[self dropMorphs: evt]
> >                         ifFalse:[self sendMouseEvent: evt].
> >         ].
> >         ShowEvents == true ifTrue:[self mouseFocus printString
> displayAt: (0 at ofs) + (0 at 15)].
> >         self mouseOverHandler processMouseOver: lastMouseEvent.
> >         "self handleDragOutside: anEvent."
> >   !
> >
> > Item was changed:
> >   ----- Method: WorldState>>interCyclePause: (in category 'update
> cycle') -----
> >   interCyclePause: milliSecs
> > +       "Delay enough that the previous cycle plus the amount of delay
> will equal milliSecs.  If the cycle is
> > +        already expensive, then no delay occurs.  However, if the
> system is idly waiting for interaction from
> > +        the user, the method will delay for a proportionally long time
> and cause the overall CPU usage of
> > +        Squeak to be low. If the preference #serverMode is enabled,
> always do a complete delay of 50ms,
> > +        independant of my argument. This prevents the freezing problem
> described in Mantis #6581"
> > -       "delay enough that the previous cycle plus the amount of delay
> will equal milliSecs.  If the cycle is already expensive, then no delay
> occurs.  However, if the system is idly waiting for interaction from the
> user, the method will delay for a proportionally long time and cause the
> overall CPU usage of Squeak to be low.
> > -       If the preference #serverMode is enabled, always do a complete
> delay of 50ms, independant of my argument. This prevents the freezing
> problem described in Mantis #6581"
> >
> > +       | now millisecondsToWait |
> > +       now := Time millisecondClockValue.
> > +       "Be careful not to be misled by the first invocation after
> start-up.
> > +        lastCycleTime may be a left-over.  On clock wraparound, this
> will
> > +        result in a delya-less cycle, which should not be a problem."
> > +       (lastCycleTime notNil and: [lastCycleTime > now]) ifTrue:
> > +               [lastCycleTime := nil].
> > -       | millisecondsToWait |
> >         millisecondsToWait := Preferences serverMode
> >                 ifTrue: [ 50 ]
> > +               ifFalse: "e.g. CanSurrenderToOS is falsified by mouse
> move events in the SketchEditor for maximal responsiveness."
> > +                       [ (lastCycleTime isNil or: [ CanSurrenderToOS ==
> false ])
> > -               ifFalse: [
> > -                       (lastCycleTime isNil or: [ CanSurrenderToOS ==
> false ])
> >                                 ifTrue: [ 0 ]
> > +                               ifFalse: [ milliSecs - (now -
> lastCycleTime) ] ].
> > +       millisecondsToWait > 0 ifTrue:
> > +               [ (interCycleDelay isNil or: [ interCycleDelay
> beingWaitedOn ])
> > -                               ifFalse: [ milliSecs - (Time
> millisecondsSince: lastCycleTime) ] ].
> > -       millisecondsToWait > 0 ifTrue: [
> > -               (interCycleDelay isNil or: [ interCycleDelay
> beingWaitedOn ])
> >                         ifTrue: [ interCycleDelay := Delay
> forMilliseconds: millisecondsToWait ]
> >                         ifFalse: [ interCycleDelay delayDuration:
> millisecondsToWait ].
> >                 interCycleDelay wait ].
> > +       lastCycleTime := now.
> > +       CanSurrenderToOS := true!
> > -       lastCycleTime := Time millisecondClockValue.
> > -       CanSurrenderToOS := true.!
> >
> > Item was changed:
> >   (PackageInfo named: 'Morphic') postscript: '"Initialize the key
> bindings and menus"
> >   Editor initialize.
> >
> >   "apply the new icons"
> >   MenuIcons initializeIcons.
> >   TheWorldMainDockingBar updateInstances.
> >
> >   "Fix missing inset of old-style windows."
> >   SystemWindow allSubInstancesDo: [:ea |
> >         (ea paneMorphs detect: [:m | m layoutFrame leftFraction = 0]
> ifNone: [])
> >                 ifNotNil: [:m | m layoutFrame leftOffset > 0
> >                         ifTrue: [ea layoutInset: 0]]].
> >
> >   "Remove non-functional tools from world menu."
> >   LanguageEditor unload.
> >   UUniverseBrowser unload.
> > + UUniverseEditor unload.
> > +
> > + "Nuke the dubious EventStats dictionary"
> > + HandMorph classPool at: #EventStats put: nil.'!
> > - UUniverseEditor unload.'!
> >
> >
>



-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150718/6f741cbc/attachment.htm


More information about the Squeak-dev mailing list