Skip to documentation
SLOP

tiny.coz.Profiler

Reference tiny.coz Profiler

Defined in profiler.

API (40)

Actions

Public operations.

Fields and members

Public fields and members.

No direct callersNo direct callsprofilerProfiler
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/coz/src/profiler.zig:58

zig
pub const Profiler = struct {    registry: registry_mod.Registry = .{},    sources: source_map.Index = .{},    source_mutex: std.atomic.Mutex = .unlocked,    delays: delay.Coordinator = .{},    selected_line_address: std.atomic.Value(usize) = .init(0),    next_line_address: std.atomic.Value(usize) = .init(0),    sampling: SamplingCounters = .{},    experiment_duration_ns: u64 = experiment.experiment_min_time_ns,    pub fn deinit(self: *Profiler, allocator: std.mem.Allocator) void {        self.registry.deinit(allocator);        self.sources.deinit(allocator);        self.delays = .{};        self.selected_line_address.store(0, .release);        self.next_line_address.store(0, .release);        self.sampling = .{};        self.experiment_duration_ns = experiment.experiment_min_time_ns;    }    pub fn getCounter(        self: *Profiler,        allocator: std.mem.Allocator,        kind: abi.CounterKind,        name: []const u8,    ) !*abi.Counter {        return self.registry.getCounter(allocator, kind, name);    }    pub fn preBlock(self: *Profiler, thread: *delay.ThreadState) void {        self.delays.preBlock(thread);    }    pub fn catchUp(self: *Profiler, thread: *delay.ThreadState, wait: anytype) u64 {        return self.delays.addDelays(thread, wait);    }    pub fn postBlock(self: *Profiler, thread: *delay.ThreadState, skip_delays: bool) void {        self.delays.postBlock(thread, skip_delays);    }    pub fn creditSelectedHit(self: *Profiler, thread: *delay.ThreadState) void {        self.delays.creditSelectedHit(thread);    }    pub fn addSourceRange(        self: *Profiler,        allocator: std.mem.Allocator,        filename: []const u8,        line_no: u64,        range: source_map.Interval,    ) !*source_map.Line {        lockMutex(&self.source_mutex);        defer self.source_mutex.unlock();        return self.sources.addRange(allocator, filename, line_no, range);    }    pub fn selectLine(self: *Profiler, line: ?*source_map.Line) void {        self.selected_line_address.store(lineAddress(line), .release);        self.clearNextLine();    }    pub fn selectedLine(self: *const Profiler) ?*source_map.Line {        return addressLine(self.selected_line_address.load(.acquire));    }    pub fn clearNextLine(self: *Profiler) void {        self.next_line_address.store(0, .release);    }    pub fn nextLine(self: *const Profiler) ?*source_map.Line {        return addressLine(self.next_line_address.load(.acquire));    }    pub fn observeSample(self: *Profiler, thread: *delay.ThreadState, sample: source_map.Sample) source_map.Match {        if (!self.source_mutex.tryLock()) return .{};        defer self.source_mutex.unlock();        return self.observeSampleLocked(thread, sample);    }    fn observeSampleLocked(self: *Profiler, thread: *delay.ThreadState, sample: source_map.Sample) source_map.Match {        const matched = self.sources.matchSample(sample, self.selectedLine());        if (matched.line) |line| {            line.addSample();            if (self.delays.active()) {                if (matched.selected_hit) self.creditSelectedHit(thread);            } else if (!path_filter.isCozHeader(line.file.name)) {                _ = self.next_line_address.cmpxchgStrong(0, lineAddress(line), .acq_rel, .acquire);            }        }        return matched;    }    pub fn observeResolvedSample(        self: *Profiler,        allocator: std.mem.Allocator,        thread: *delay.ThreadState,        sample: source_map.Sample,        scope: debug_info.Scope,    ) !source_map.Match {        lockMutex(&self.source_mutex);        defer self.source_mutex.unlock();        try debug_info.resolveSample(allocator, &self.sources, sample, scope);        return self.observeSampleLocked(thread, sample);    }    pub fn observePerfRecord(        self: *Profiler,        thread: *delay.ThreadState,        record: perf.Record,        callchain_scratch: []usize,    ) !source_map.Match {        try self.observePerfRecordKind(record);        const sample = try sampleFromPerfRecord(record, callchain_scratch) orelse return .{};        return self.observeSample(thread, sample);    }    pub fn observeResolvedPerfRecord(        self: *Profiler,        allocator: std.mem.Allocator,        thread: *delay.ThreadState,        record: perf.Record,        callchain_scratch: []usize,        scope: debug_info.Scope,    ) !source_map.Match {        try self.observePerfRecordKind(record);        const sample = try sampleFromPerfRecord(record, callchain_scratch) orelse return .{};        lockMutex(&self.source_mutex);        defer self.source_mutex.unlock();        _ = debug_info.resolveSelfAddress(allocator, &self.sources, sample.ip, scope) catch |err| switch (err) {            error.OutOfMemory => return err,            else => null,        };        return self.observeSampleLocked(thread, sample);    }    pub fn samplingSnapshot(self: *const Profiler) SamplingSnapshot {        return .{            .record_count = self.sampling.record_count.load(.acquire),            .sample_record_count = self.sampling.sample_record_count.load(.acquire),            .lost_record_count = self.sampling.lost_record_count.load(.acquire),            .lost_event_count = self.sampling.lost_event_count.load(.acquire),            .lost_samples_record_count = self.sampling.lost_samples_record_count.load(.acquire),            .lost_samples_count = self.sampling.lost_samples_count.load(.acquire),            .throttle_record_count = self.sampling.throttle_record_count.load(.acquire),            .unthrottle_record_count = self.sampling.unthrottle_record_count.load(.acquire),        };    }    fn observePerfRecordKind(self: *Profiler, record: perf.Record) !void {        addAtomic(&self.sampling.record_count, 1);        switch (record.recordType()) {            .sample => addAtomic(&self.sampling.sample_record_count, 1),            .lost => {                addAtomic(&self.sampling.lost_record_count, 1);                addAtomic(&self.sampling.lost_event_count, try record.getLostCount());            },            .lost_samples => {                addAtomic(&self.sampling.lost_samples_record_count, 1);                addAtomic(&self.sampling.lost_samples_count, try record.getLostCount());            },            .throttle => addAtomic(&self.sampling.throttle_record_count, 1),            .unthrottle => addAtomic(&self.sampling.unthrottle_record_count, 1),            else => {},        }    }    pub fn drainPerfRing(        self: *Profiler,        thread: *delay.ThreadState,        reader: *perf.RingReader,        record_scratch: []u8,        callchain_scratch: []usize,    ) !usize {        var records: usize = 0;        while (try reader.next(record_scratch)) |record| {            _ = try self.observePerfRecord(thread, record, callchain_scratch);            records += 1;        }        return records;    }    pub fn drainResolvedPerfRing(        self: *Profiler,        allocator: std.mem.Allocator,        thread: *delay.ThreadState,        reader: *perf.RingReader,        record_scratch: []u8,        callchain_scratch: []usize,        scope: debug_info.Scope,    ) !usize {        var records: usize = 0;        while (try reader.next(record_scratch)) |record| {            _ = try self.observeResolvedPerfRecord(allocator, thread, record, callchain_scratch, scope);            records += 1;        }        return records;    }    pub fn processPerfRing(        self: *Profiler,        thread: *delay.ThreadState,        reader: *perf.RingReader,        record_scratch: []u8,        callchain_scratch: []usize,        wait: anytype,    ) !usize {        const records = try self.drainPerfRing(thread, reader, record_scratch, callchain_scratch);        _ = self.catchUp(thread, wait);        return records;    }    pub fn drainPerfEvent(        self: *Profiler,        thread: *delay.ThreadState,        event: *perf.Event,        record_scratch: []u8,        callchain_scratch: []usize,    ) !usize {        var reader = event.ringReader() orelse return 0;        const records = try self.drainPerfRing(thread, &reader, record_scratch, callchain_scratch);        event.commitReader(reader);        return records;    }    pub fn processPerfEvent(        self: *Profiler,        thread: *delay.ThreadState,        event: *perf.Event,        record_scratch: []u8,        callchain_scratch: []usize,        wait: anytype,    ) !usize {        var reader = event.ringReader() orelse {            _ = self.catchUp(thread, wait);            return 0;        };        const records = try self.processPerfRing(thread, &reader, record_scratch, callchain_scratch, wait);        event.commitReader(reader);        return records;    }    pub fn drainSampler(        self: *Profiler,        thread: *delay.ThreadState,        sampler: *sampler_mod.Sampler,        record_scratch: []u8,        callchain_scratch: []usize,    ) !usize {        var reader = sampler.ringReader() orelse return 0;        const records = try self.drainPerfRing(thread, &reader, record_scratch, callchain_scratch);        sampler.commitReader(reader);        return records;    }    pub fn drainResolvedSampler(        self: *Profiler,        allocator: std.mem.Allocator,        thread: *delay.ThreadState,        sampler: *sampler_mod.Sampler,        record_scratch: []u8,        callchain_scratch: []usize,        scope: debug_info.Scope,    ) !usize {        var reader = sampler.ringReader() orelse return 0;        const records = try self.drainResolvedPerfRing(allocator, thread, &reader, record_scratch, callchain_scratch, scope);        sampler.commitReader(reader);        return records;    }    pub fn processSampler(        self: *Profiler,        thread: *delay.ThreadState,        sampler: *sampler_mod.Sampler,        record_scratch: []u8,        callchain_scratch: []usize,        wait: sampler_mod.WaitFn,    ) !usize {        const paused_wait = sampler.pausingWait(wait);        var reader = sampler.ringReader() orelse {            _ = self.catchUp(thread, paused_wait);            return 0;        };        const records = try self.processPerfRing(thread, &reader, record_scratch, callchain_scratch, paused_wait);        sampler.commitReader(reader);        return records;    }    pub fn beginExperiment(        self: *Profiler,        allocator: std.mem.Allocator,        selected: profile.Location,        virtual_speedup: f64,    ) !Run {        const selected_file = try allocator.dupe(u8, selected.file);        errdefer allocator.free(selected_file);        const throughput_snapshots = try self.registry.saveThroughputSnapshots(allocator);        errdefer allocator.free(throughput_snapshots);        const latency_snapshots = try self.registry.saveLatencySnapshots(allocator);        errdefer allocator.free(latency_snapshots);        return .{            .selected = .{                .file = selected_file,                .line = selected.line,            },            .virtual_speedup = virtual_speedup,            .throughput_snapshots = throughput_snapshots,            .latency_snapshots = latency_snapshots,        };    }    pub fn finishExperiment(        self: *Profiler,        writer: *std.Io.Writer,        run: Run,        duration_ns: u64,        selected_samples: u64,    ) !bool {        const min_delta = run.minDelta();        self.experiment_duration_ns = experiment.adjustDuration(self.experiment_duration_ns, min_delta);        if (min_delta < experiment.experiment_target_delta) return false;        try run.writeEvents(writer, duration_ns, selected_samples);        return true;    }    pub fn runExperiment(        self: *Profiler,        allocator: std.mem.Allocator,        writer: *std.Io.Writer,        options: ExperimentRunOptions,        wait_fn: sampler_mod.WaitFn,    ) !bool {        var run = try self.beginExperiment(            allocator,            options.selected.location(),            options.plan.virtual_speedup,        );        defer run.deinit(allocator);        const starting_samples = options.selected.sampleCount();        const starting_delay_ns = self.delays.globalDelay();        self.selectLine(options.selected);        self.delays.startExperiment(options.plan.delay_size_ns);        const elapsed_ns = waitForExperiment(options.plan.duration_ns, options.end_to_end, options.running, wait_fn);        self.delays.finishExperiment();        self.selectLine(null);        const inserted_delay_ns = self.delays.globalDelay() -| starting_delay_ns;        const selected_samples = options.selected.sampleCount() -| starting_samples;        const duration_ns = experiment.correctedDurationNs(elapsed_ns, inserted_delay_ns, self.delays.overshoot());        return self.finishExperiment(writer, run, duration_ns, selected_samples);    }    pub fn runExperimentStep(        self: *Profiler,        allocator: std.mem.Allocator,        writer: *std.Io.Writer,        options: ExperimentStepOptions,        wait_fn: sampler_mod.WaitFn,    ) !ExperimentStepResult {        const selected = options.fixed_line orelse self.nextLine() orelse return .{};        const plan = try self.stepPlan(options);        const emitted = try self.runExperiment(            allocator,            writer,            .{                .selected = selected,                .plan = plan,                .end_to_end = options.end_to_end,                .running = options.running,            },            wait_fn,        );        return .{ .selected = selected, .emitted = emitted };    }    fn stepPlan(self: *const Profiler, options: ExperimentStepOptions) !experiment.Plan {        const delay_size_ns = if (options.fixed_speedup_percent) |percent|            experiment.fixedDelaySize(percent) orelse return error.InvalidFixedSpeedup        else blk: {            const draw = try experiment.Draw.init(options.draw.value);            break :blk experiment.delaySizeFromDraw(draw);        };        return .{            .delay_size_ns = delay_size_ns,            .virtual_speedup = experiment.virtualSpeedupFromDelay(delay_size_ns),            .duration_ns = self.experiment_duration_ns,        };    }    pub fn writeStartup(_: *Profiler, writer: *std.Io.Writer, timestamp_ns: u64) !void {        try (profile.Event{ .startup = .{ .timestamp_ns = timestamp_ns } }).writeJsonLine(writer);    }    pub fn writeRuntime(_: *Profiler, writer: *std.Io.Writer, duration_ns: u64) !void {        try (profile.Event{ .runtime = .{ .duration_ns = duration_ns } }).writeJsonLine(writer);    }    pub fn writeSample(_: *Profiler, writer: *std.Io.Writer, location: profile.Location, count: u64) !void {        try (profile.Event{ .sample = .{ .location = location, .count = count } }).writeJsonLine(writer);    }    pub fn writeRuntimeAndSamples(        self: *Profiler,        allocator: std.mem.Allocator,        writer: *std.Io.Writer,        duration_ns: u64,        loss_counter: profile.LossCounter,        terminal_status: profile.TerminalStatus,    ) !void {        const sample_lines = try self.collectSampleLines(allocator);        defer allocator.free(sample_lines);        try self.writeRuntime(writer, duration_ns);        try (profile.Event{ .sampling = self.profileSampling(            loss_counter,            terminal_status,        ) }).writeJsonLine(writer);        for (sample_lines) |line| {            try self.writeSample(writer, line.location(), line.sampleCount());        }    }    fn profileSampling(        self: *const Profiler,        loss_counter: profile.LossCounter,        terminal_status: profile.TerminalStatus,    ) profile.Sampling {        const snapshot = self.samplingSnapshot();        return .{            .record_count = snapshot.record_count,            .sample_record_count = snapshot.sample_record_count,            .lost_record_count = snapshot.lost_record_count,            .lost_event_count = snapshot.lost_event_count,            .lost_samples_record_count = snapshot.lost_samples_record_count,            .lost_samples_count = snapshot.lost_samples_count,            .throttle_record_count = snapshot.throttle_record_count,            .unthrottle_record_count = snapshot.unthrottle_record_count,            .loss_counter = loss_counter,            .terminal_status = terminal_status,        };    }    fn collectSampleLines(self: *Profiler, allocator: std.mem.Allocator) ![]*source_map.Line {        var sample_lines: std.ArrayListUnmanaged(*source_map.Line) = .empty;        errdefer sample_lines.deinit(allocator);        lockMutex(&self.source_mutex);        defer self.source_mutex.unlock();        var file_iter = self.sources.files.valueIterator();        while (file_iter.next()) |file| {            var line_iter = file.*.lines.valueIterator();            while (line_iter.next()) |line| {                if (line.*.sampleCount() != 0) try sample_lines.append(allocator, line.*);            }        }        std.mem.sort(*source_map.Line, sample_lines.items, {}, sampleLineLessThan);        return try sample_lines.toOwnedSlice(allocator);    }};

Source: lib/coz/src/root.zig:60

zig
pub const Profiler = profiler.Profiler;
Called byCallstest sourcelib.coz.src.profilertest: profiler does not select coz he...test sourcelib.coz.src.profilertest: profiler drains perf ring recor...test sourcelib.coz.src.profilertest: profiler experiment step can us...test sourcelib.coz.src.profilertest: profiler experiment step reject...test sourcelib.coz.src.profilertest: profiler experiment step uses t...+6 moreprivate sourcelib.coz.src.profilerlockMutexProfileraddSourceRange
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callsProfilerrunExperimenttest sourcelib.coz.src.profilertest: profiler ignores inactive progr...test sourcelib.coz.src.profilertest: profiler suppresses experiment ...test sourcelib.coz.src.profilertest: profiler suppresses low-delta e...test sourcelib.coz.src.profilertest: profiler writes structured expe...ProfilerbeginExperiment
Static calls · unresolved targets: 0 · external targets: 4.
Called byCallsProfilerprocessPerfEventProfilerprocessPerfRingProfilerprocessSamplertest sourcelib.coz.src.profilertest: profiler exposes delay accounti...delay.CoordinatoraddDelaysProfilercatchUp
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsProfilerselectLineProfilerclearNextLine
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsprivate sourcelib.coz.src.profiler.ProfilerobserveSampleLockeddelay.CoordinatorcreditSelectedHitProfilercreditSelectedHit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.coz.src.profilertest: profiler attributes a sample af...test sourcelib.coz.src.profilertest: profiler audits perf loss and t...test sourcelib.coz.src.profilertest: profiler does not select coz he...test sourcelib.coz.src.profilertest: profiler drains perf ring recor...test sourcelib.coz.src.profilertest: profiler drains zero records fr...+28 moreProfilerdeinit
Static calls · unresolved targets: 0 · external targets: 3.
Called byCallstest sourcelib.coz.src.profilertest: profiler drains zero records fr...ProfilerdrainPerfRingProfilerdrainPerfEvent
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsProfilerdrainPerfEventProfilerdrainSamplerProfilerprocessPerfRingtest sourcelib.coz.src.profilertest: profiler drains perf ring recor...ProfilerobservePerfRecordProfilerdrainPerfRing
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsProfilerdrainResolvedSamplerProfilerobserveResolvedPerfRecordProfilerdrainResolvedPerfRing
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callersProfilerdrainResolvedPerfRingProfilerdrainResolvedSampler
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallstest sourcelib.coz.src.profilertest: profiler drains zero records fr...ProfilerdrainPerfRingProfilerdrainSampler
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsProfilerrunExperimenttest sourcelib.coz.src.profilertest: profiler ignores inactive progr...test sourcelib.coz.src.profilertest: profiler suppresses experiment ...test sourcelib.coz.src.profilertest: profiler suppresses low-delta e...test sourcelib.coz.src.profilertest: profiler writes structured expe...experimentadjustDurationProfilerfinishExperiment
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callstest sourcelib.coz.src.profilertest: profiler experiment step can us...test sourcelib.coz.src.profilertest: profiler experiment step uses t...test sourcelib.coz.src.profilertest: profiler ignores inactive progr...test sourcelib.coz.src.profilertest: profiler runs an experiment cyc...test sourcelib.coz.src.profilertest: profiler suppresses low-delta e...test sourcelib.coz.src.profilertest: profiler writes structured expe...ProfilergetCounter
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsProfilerrunExperimentSteptest sourcelib.coz.src.profilertest: profiler attributes a sample af...test sourcelib.coz.src.profilertest: profiler does not select coz he...test sourcelib.coz.src.profilertest: profiler experiment step uses t...test sourcelib.coz.src.profilertest: profiler observes active select...test sourcelib.coz.src.profilertest: profiler observes idle samples ...private sourcelib.coz.src.profileraddressLineProfilernextLine
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsProfilerdrainPerfRingtest sourcelib.coz.src.profilertest: profiler audits perf loss and t...test sourcelib.coz.src.profilertest: profiler observes decoded perf ...test sourcelib.coz.src.profilertest: profiler rejects perf callchain...private sourcelib.coz.src.profiler.ProfilerobservePerfRecordKindProfilerobserveSampleprivate sourcelib.coz.src.profilersampleFromPerfRecordProfilerobservePerfRecord
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsProfilerdrainResolvedPerfRingprivate sourcelib.coz.src.profiler.ProfilerobservePerfRecordKindprivate sourcelib.coz.src.profiler.ProfilerobserveSampleLockedprivate sourcelib.coz.src.profilerlockMutexprivate sourcelib.coz.src.profilersampleFromPerfRecordProfilerobserveResolvedPerfRecord
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callersprivate sourcelib.coz.src.profiler.ProfilerobserveSampleLockedprivate sourcelib.coz.src.profilerlockMutexProfilerobserveResolvedSample
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsProfilerobservePerfRecordtest sourcelib.coz.src.profilertest: profiler attributes a sample af...test sourcelib.coz.src.profilertest: profiler does not select coz he...test sourcelib.coz.src.profilertest: profiler experiment step uses t...test sourcelib.coz.src.profilertest: profiler observes active select...+2 moreprivate sourcelib.coz.src.profiler.ProfilerobserveSampleLockedProfilerobserveSample
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallstest sourcelib.coz.src.profilertest: profiler exposes delay accounti...delay.CoordinatorpostBlockProfilerpostBlock
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.coz.src.profilertest: profiler exposes delay accounti...delay.CoordinatorpreBlockProfilerpreBlock
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersProfilercatchUpProfilerprocessPerfRingProfilerprocessPerfEvent
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsProfilerprocessPerfEventProfilerprocessSamplertest sourcelib.coz.src.profilertest: profiler processes perf ring sa...ProfilercatchUpProfilerdrainPerfRingProfilerprocessPerfRing
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.coz.src.profilertest: profiler processes unopened sam...ProfilercatchUpProfilerprocessPerfRingProfilerprocessSampler
Static calls · unresolved targets: 0 · external targets: 3.
Called byCallsProfilerrunExperimentSteptest sourcelib.coz.src.profilertest: profiler runs an experiment cyc...delay.CoordinatorfinishExperimentdelay.CoordinatorglobalDelaydelay.Coordinatorovershootdelay.CoordinatorstartExperimentexperimentcorrectedDurationNs+4 moreProfilerrunExperiment
Static calls · unresolved targets: 0 · external targets: 3.
Called byCallstest sourcelib.coz.src.profilertest: profiler experiment step can us...test sourcelib.coz.src.profilertest: profiler experiment step is ine...test sourcelib.coz.src.profilertest: profiler experiment step reject...test sourcelib.coz.src.profilertest: profiler experiment step uses t...private sourcelib.coz.src.runtime.RuntimerunExperimentStepWithWaitProfilernextLineProfilerrunExperimentprivate sourcelib.coz.src.profiler.ProfilerstepPlanProfilerrunExperimentStep
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.coz.src.profiler.ProfilerprofileSamplingtest sourcelib.coz.src.profilertest: profiler audits perf loss and t...test sourcelib.coz.src.profilertest: profiler observes decoded perf ...ProfilersamplingSnapshot
Static calls · unresolved targets: 8 · external targets: 0.
Called byCallsProfilerrunExperimenttest sourcelib.coz.src.profilertest: profiler observes active select...test sourcelib.coz.src.profilertest: profiler observes decoded perf ...test sourcelib.coz.src.profilertest: profiler processes perf ring sa...ProfilerclearNextLineprivate sourcelib.coz.src.profilerlineAddressProfilerselectLine
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsprivate sourcelib.coz.src.profiler.ProfilerobserveSampleLockedtest sourcelib.coz.src.profilertest: profiler experiment step reject...test sourcelib.coz.src.profilertest: profiler experiment step uses t...test sourcelib.coz.src.profilertest: profiler runs an experiment cyc...private sourcelib.coz.src.profileraddressLineProfilerselectedLine
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callsProfilerwriteRuntimeAndSamplestest sourcelib.coz.src.profilertest: profiler writes startup runtime...ProfilerwriteRuntime
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.coz.src.profilertest: profiler writes runtime and sor...Runtimestopprivate sourcelib.coz.src.profiler.ProfilercollectSampleLinesprivate sourcelib.coz.src.profiler.ProfilerprofileSamplingProfilerwriteRuntimeProfilerwriteSampleProfilerwriteRuntimeAndSamples
Static calls · unresolved targets: 0 · external targets: 3.
Called byCallsNo direct callsProfilerwriteRuntimeAndSamplestest sourcelib.coz.src.profilertest: profiler writes startup runtime...ProfilerwriteSample
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.coz.src.profilertest: profiler writes startup runtime...RuntimestartProfilerwriteStartup
Static calls · unresolved targets: 0 · external targets: 0.

Complete caller list for Profiler.addSourceRange

11 direct callers.

Complete caller list for Profiler.deinit

33 direct callers.

Complete caller list for Profiler.observeSample

7 direct callers.

Complete call list for Profiler.runExperiment

9 direct calls.

Audit

Definitions33
Public names66
Members8
Version26.7.0
Revisiondaab053ee433