I know everyone is busy and working in their own domains not having the time to review a lot of other people's issues.�� However I am on my own, not part of a team where I can walk over and tap someone on the shoulder to ask for review of an issue I've resolved.�� It is a bit discouraging not to be able to proceed for lack of review.�� I'd be glad for any feedback including "its crap, do it a different way".�� So consider this a virtual should tap.��
I have...* refactored the two calls to #forMilliseconds: out to a single call* replaced call to #wait ��with #waitOr: ��* added #waitOr: ��
Here is the diff...
WorldState >> interCyclePause: milliSecs| currentTime wait |
self serverModeifFalse: [(lastCycleTime notNil and: [CanSurrenderToOS ~~ false]) ifTrue: [��currentTime := Time millisecondClockValue.wait := lastCycleTime + milliSecs - currentTime.
+ "wait is the time remaining until milliSecs has passed��+ since lastCycle. If wait is zero or less, no need to Delay"
+ "If wait is greater than milliSeconds then bypass Delay,��+ by setting wait to zero."- (wait > 0 and: [ wait <= milliSecs ] ) ifTrue: [- (Delay forMilliseconds: wait) wait ] ] ]+ wait > milliSecs ifTrue: [ wait := 0 ] ] ] ��"btw, wait>milliSecs can only occur when clock rolls over. Eliminate after integrating issue 14353 ?"��
- ifTrue: [ (Delay forMilliseconds: 50) wait ].+ ifTrue: [ wait := 50 ].
+ wait > 0 ifTrue: [��+ (Delay forMilliseconds: wait) waitOr: [��+ �� �� �� �� �� �� �� �� �� �� ��self inform: 'WorldState>>interCyclePause failed.' ] ].
lastCycleTime := Time millisecondClockValue.CanSurrenderToOS := true.
"--------------------------"
+Delay >> waitOr: anErrorBlock+ self schedule.+ [ beingWaitedOn��+ ifTrue: [ delaySemaphore wait ]��+ ifFalse:[ anErrorBlock value ]+ ] ifCurtailed:[self unschedule].
+"Only the high priority timer event loop (TEL) signals /delaySempahore/.�� If the��+ TEL is not running, a delay will block forever (for example the UI will lock up).��
+ /beingWaitedOn/ is only set to true from the TEL (via��+ DelayScheduler>>scheduleDelay: and Delay>>timingPriorityWaitedOn:) so test��+ this to determine if TEL is running.�� Avoid waiting when the TEL is not running."
"--------------------------"
This is for issue 14669 "Delay refactoring (part 2a) - avoid UI locking up when timer event loop is stopped" that is required to facilitate integration of issue 14353 "Delay refactoring (part 2) - change from milliseconds to microseconds.
cheers -ben