[squeak-dev] The Trunk: Kernel-ul.513.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Nov 6 23:26:40 UTC 2010
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.513.mcz
==================== Summary ====================
Name: Kernel-ul.513
Author: ul
Time: 7 November 2010, 12:08:10.875 am
UUID: 887f4907-c347-2e45-8d2e-dd7814ac4248
Ancestors: Kernel-ul.512
- DateAndTime startup enhancement from Cuis part 2
=============== Diff against Kernel-ul.512 ===============
Item was changed:
----- Method: DateAndTime class>>initializeOffsets (in category 'initialize-release') -----
+ initializeOffsets
+ | durationSinceEpoch secondsSinceMidnight nowSecs |
+ LastTick := 0.
+ nowSecs := self clock secondsWhenClockTicks.
+ LastMilliSeconds := self millisecondClockValue.
+ durationSinceEpoch := Duration
+ days: SqueakEpoch
+ hours: 0
+ minutes: 0
+ seconds: nowSecs.
+ DaysSinceEpoch := durationSinceEpoch days.
+ secondsSinceMidnight := (durationSinceEpoch -
+ (Duration
+ days: DaysSinceEpoch
+ hours: 0
+ minutes: 0
+ seconds: 0)) asSeconds.
+ MilliSecondOffset := secondsSinceMidnight * 1000 - LastMilliSeconds!
- initializeOffsets
-
- | epochianSeconds secondsSinceMidnight nowSecs |
-
- LastTick := 0.
-
- nowSecs := self clock secondsWhenClockTicks.
- LastMilliSeconds := self millisecondClockValue.
-
- epochianSeconds := Duration days: SqueakEpoch hours: 0 minutes: 0 seconds: nowSecs.
-
- DaysSinceEpoch := epochianSeconds days.
-
- secondsSinceMidnight := (epochianSeconds - (Duration days: DaysSinceEpoch hours: 0 minutes: 0 seconds: 0)) asSeconds.
-
- MilliSecondOffset := (secondsSinceMidnight * 1000 - LastMilliSeconds)
- !
Item was changed:
----- Method: DateAndTime class>>milliSecondsSinceMidnight (in category 'squeak protocol') -----
milliSecondsSinceMidnight
-
| msm msClock |
-
- msClock := self millisecondClockValue.
+ "This is usually only during system startup..."
+ self waitForOffsets.
- (
- msClock < LastMilliSeconds)
- ifTrue:[ "rolled over" MilliSecondOffset := MilliSecondOffset + (SmallInteger maxVal // 2) + 1 ].
+ msClock := self millisecondClockValue.
+ msClock < LastMilliSeconds ifTrue: [ "rolled over"
+ MilliSecondOffset := MilliSecondOffset + (SmallInteger maxVal // 2) + 1 ].
LastMilliSeconds := msClock.
+ [
+ msm := msClock + MilliSecondOffset.
+ msm >= 86400000 ] whileTrue: [
+ "next day"
+ LastTick := -1.
+ DaysSinceEpoch := DaysSinceEpoch + 1.
+ MilliSecondOffset := MilliSecondOffset - 86400000 ].
-
- [ msm := msClock + MilliSecondOffset.
- (msm >= 86400000) ]
- whileTrue: [ "next day"
- LastTick := -1.
- DaysSinceEpoch := DaysSinceEpoch + 1.
- MilliSecondOffset := MilliSecondOffset - 86400000 ].
-
"day rolled over sanity check"
+ (LastTick = -1 and: [
+ (Duration
+ days: SqueakEpoch
+ hours: 0
+ minutes: 0
+ seconds: self clock totalSeconds) days ~= DaysSinceEpoch ]) ifTrue: [
+ self initializeOffsets.
+ ^ self milliSecondsSinceMidnight ].
+ ^ msm.!
- ((LastTick = -1) and: [
- (Duration days: SqueakEpoch hours: 0 minutes: 0 seconds: (self clock totalSeconds)) days ~= DaysSinceEpoch ])
- ifTrue:
- [ self initializeOffsets.
- ^ self milliSecondsSinceMidnight ].
-
- ^msm
-
-
-
- !
Item was changed:
----- Method: DateAndTime class>>now (in category 'ansi protocol') -----
now
| nanoTicks msm |
nanoTicks := (msm := self milliSecondsSinceMidnight) * 1000000.
(LastTick < nanoTicks) ifTrue: [
LastTick := nanoTicks.
^ self todayAtMilliSeconds: msm].
+ LastTickSemaphore critical: [
- LastTickSemaphore critical: [
LastTick := LastTick + 1.
^ self todayAtNanoSeconds: LastTick]
"
[ 10000 timesRepeat: [ self now. ] ] timeToRun / 10000.0 .
If calls to DateAndTime-c-#now are within a single millisecond the semaphore code
to ensure that (self now <= self now) slows things down considerably by a factor of about 20.
The actual speed of a single call to DateAndTime-now in milliseconds is
demonstrated by the unguarded method below.
[ 100000 timesRepeat: [ self todayAtMilliSeconds: (self milliSecondsSinceMidnight) ] ] timeToRun / 100000.0 . 0.00494 0.00481 0.00492 0.00495
"!
Item was changed:
----- Method: DateAndTime class>>startUp: (in category 'initialize-release') -----
+ startUp: resuming
+ resuming ifFalse: [ ^ self ].
+ OffsetsAreValid := false.
+ [
+ self initializeOffsets.
+ OffsetsAreValid := true
+ ] forkAt: Processor userInterruptPriority.!
- startUp: resuming
-
- resuming ifFalse: [^ self].
-
- [ self initializeOffsets ] fork.
-
- !
Item was changed:
----- Method: DateAndTime class>>todayAtMilliSeconds: (in category 'squeak protocol') -----
todayAtMilliSeconds: milliSecondsSinceMidnight
+ "This is usually only during system startup..."
+ self waitForOffsets.
+
^ self basicNew
setJdn: DaysSinceEpoch
seconds: (milliSecondsSinceMidnight // 1000)
nano: (milliSecondsSinceMidnight \\ 1000 * 1000000 )
offset: self localOffset
"
+ [ 100000 timesRepeat: [ self fromMilliSeconds: self milliSecondsSinceMidnight. ] ] timeToRun.
- [ 100000 timesRepeat: [ self fromMilliSeconds: self milliSecondsSinceMidnight. ] ] timeToRun.
"!
Item was changed:
----- Method: DateAndTime class>>todayAtNanoSeconds: (in category 'squeak protocol') -----
todayAtNanoSeconds: nanoSecondsSinceMidnight
+ "This is usually only during system startup..."
+ self waitForOffsets.
+
^ self basicNew
setJdn: DaysSinceEpoch
seconds: (nanoSecondsSinceMidnight // 1000000000)
nano: (nanoSecondsSinceMidnight \\ 1000000000 )
offset: self localOffset
!
Item was added:
+ ----- Method: DateAndTime class>>waitForOffsets (in category 'initialize-release') -----
+ waitForOffsets
+ OffsetsAreValid ifFalse: [
+ [
+ (Delay forSeconds: 1) wait.
+ OffsetsAreValid
+ ] whileFalse
+ ]!
More information about the Squeak-dev
mailing list
|