diff options
Diffstat (limited to 'ui/src/frontend/globals.ts')
-rw-r--r-- | ui/src/frontend/globals.ts | 93 |
1 files changed, 61 insertions, 32 deletions
diff --git a/ui/src/frontend/globals.ts b/ui/src/frontend/globals.ts index 0ca10a077..79ca58a96 100644 --- a/ui/src/frontend/globals.ts +++ b/ui/src/frontend/globals.ts @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +import {BigintMath} from '../base/bigint_math'; import {assertExists} from '../base/logging'; import {Actions, DeferredAction} from '../common/actions'; import {AggregateData} from '../common/aggregation_data'; @@ -22,10 +23,19 @@ import { } from '../common/conversion_jobs'; import {createEmptyState} from '../common/empty_state'; import {Engine} from '../common/engine'; +import { + HighPrecisionTime, + HighPrecisionTimeSpan, +} from '../common/high_precision_time'; import {MetricResult} from '../common/metric_data'; import {CurrentSearchResults, SearchSummary} from '../common/search_data'; import {CallsiteInfo, EngineConfig, ProfileType, State} from '../common/state'; -import {fromNs, toNs} from '../common/time'; +import {Span, tpTimeFromSeconds} from '../common/time'; +import { + TPDuration, + TPTime, + TPTimeSpan, +} from '../common/time'; import {Analytics, initAnalytics} from './analytics'; import {BottomTabList} from './bottom_tab'; @@ -33,6 +43,7 @@ import {FrontendLocalState} from './frontend_local_state'; import {RafScheduler} from './raf_scheduler'; import {Router} from './router'; import {ServiceWorkerController} from './service_worker_controller'; +import {PxSpan, TimeScale} from './time_scale'; type Dispatch = (action: DeferredAction) => void; type TrackDataStore = Map<string, {}>; @@ -41,18 +52,18 @@ type AggregateDataStore = Map<string, AggregateData>; type Description = Map<string, string>; export interface SliceDetails { - ts?: number; + ts?: TPTime; absTime?: string; - dur?: number; - threadTs?: number; - threadDur?: number; + dur?: TPDuration; + threadTs?: TPTime; + threadDur?: TPDuration; priority?: number; endState?: string|null; cpu?: number; id?: number; threadStateId?: number; utid?: number; - wakeupTs?: number; + wakeupTs?: TPTime; wakerUtid?: number; wakerCpu?: number; category?: string; @@ -104,23 +115,23 @@ export interface Flow { } export interface CounterDetails { - startTime?: number; + startTime?: TPTime; value?: number; delta?: number; - duration?: number; + duration?: TPDuration; name?: string; } export interface ThreadStateDetails { - ts?: number; - dur?: number; + ts?: TPTime; + dur?: TPDuration; } export interface FlamegraphDetails { type?: ProfileType; id?: number; - startNs?: number; - durNs?: number; + start?: TPTime; + dur?: TPDuration; pids?: number[]; upids?: number[]; flamegraph?: CallsiteInfo[]; @@ -143,8 +154,8 @@ export interface CpuProfileDetails { } export interface QuantizedLoad { - startSec: number; - endSec: number; + start: TPTime; + end: TPTime; load: number; } type OverviewStore = Map<string, QuantizedLoad[]>; @@ -161,7 +172,7 @@ type ThreadMap = Map<number, ThreadDesc>; export interface FtraceEvent { id: number; - ts: number; + ts: TPTime; name: string; cpu: number; thread: string|null; @@ -530,7 +541,7 @@ class Globals { this.aggregateDataStore.set(kind, data); } - getCurResolution() { + getCurResolution(): TPDuration { // Truncate the resolution to the closest power of 2 (in nanosecond space). // We choose to work in ns space because resolution is consumed be track // controllers for quantization and they rely on resolution to be a power @@ -541,24 +552,18 @@ class Globals { // levels. Logic: each zoom level represents a delta of 0.1 * (visible // window span). Therefore, zooming out by six levels is 1.1^6 ~= 2. // Similarily, zooming in six levels is 0.9^6 ~= 0.5. - const pxToSec = this.frontendLocalState.timeScale.deltaPxToDuration(1); + const timeScale = this.frontendLocalState.visibleTimeScale; // TODO(b/186265930): Remove once fixed: - if (!isFinite(pxToSec)) { - // Resolution is in pixels per second so 1000 means 1px = 1ms. - console.error(`b/186265930: Bad pxToSec suppressed ${pxToSec}`); - return fromNs(Math.pow(2, Math.floor(Math.log2(toNs(1000))))); + if (timeScale.pxSpan.delta === 0) { + console.error(`b/186265930: Bad pxToSec suppressed`); + return BigintMath.bitFloor(tpTimeFromSeconds(1000)); } - const pxToNs = Math.max(toNs(pxToSec), 1); - const resolution = fromNs(Math.pow(2, Math.floor(Math.log2(pxToNs)))); - const log2 = Math.log2(toNs(resolution)); - if (log2 % 1 !== 0) { - throw new Error(`Resolution should be a power of two. - pxToSec: ${pxToSec}, - pxToNs: ${pxToNs}, - resolution: ${resolution}, - log2: ${Math.log2(toNs(resolution))}`); - } - return resolution; + + const timePerPx = HighPrecisionTime.max( + timeScale.pxDeltaToDuration(1), new HighPrecisionTime(1n)); + + const resolutionBig = BigintMath.bitFloor(timePerPx.toTPTime()); + return resolutionBig; } getCurrentEngine(): EngineConfig|undefined { @@ -637,6 +642,30 @@ class Globals { shutdown() { this._rafScheduler!.shutdown(); } + + // Get a timescale that covers the entire trace + getTraceTimeScale(pxSpan: PxSpan): TimeScale { + const {start, end} = this.state.traceTime; + const traceTime = HighPrecisionTimeSpan.fromTpTime(start, end); + return new TimeScale(traceTime.start, traceTime.duration.nanos, pxSpan); + } + + // Get the trace time bounds + stateTraceTime(): Span<HighPrecisionTime> { + const {start, end} = this.state.traceTime; + return HighPrecisionTimeSpan.fromTpTime(start, end); + } + + stateTraceTimeTP(): Span<TPTime> { + const {start, end} = this.state.traceTime; + return new TPTimeSpan(start, end); + } + + // Get the state version of the visible time bounds + stateVisibleTime(): Span<TPTime> { + const {start, end} = this.state.frontendLocalState.visibleState; + return new TPTimeSpan(start, end); + } } export const globals = new Globals(); |