diff --git a/src/LinuxPerf.jl b/src/LinuxPerf.jl index e330e92..bc0dfcc 100644 --- a/src/LinuxPerf.jl +++ b/src/LinuxPerf.jl @@ -118,6 +118,12 @@ struct EventType event::UInt64 end +Base.copy(event::EventType) = EventType(event.category, event.event) + +function Base.convert(::Type{EventType}, d::Dict{String}) + return EventType(d["category"], d["event"]) +end + function all_events() evts = EventType[] for (cat_name, cat_id, events) in EVENT_TYPES @@ -356,6 +362,18 @@ struct Counter running::UInt64 end +function Base.copy(counter::Counter) + return Counter( + copy(counter.event), counter.value, counter.enabled, counter.running + ) +end + +function Base.convert(::Type{Counter}, d::Dict{String}) + return Counter( + convert(EventType, d["event"]), d["value"], d["enabled"], d["running"] + ) +end + struct Counters counters::Vector{Counter} end @@ -734,6 +752,14 @@ struct ThreadStats groups::Vector{Vector{Counter}} end +function Base.copy(thread_stats::ThreadStats) + return ThreadStats(thread_stats.pid, copy(thread_stats.groups)) +end + +function Base.convert(::Type{ThreadStats}, d::Dict{String}) + return ThreadStats(d["pid"], d["groups"]) +end + function ThreadStats(b::PerfBench) groups = Vector{Counter}[] for g in b.groups @@ -775,6 +801,10 @@ struct Stats threads::Vector{ThreadStats} end +Base.copy(stats::Stats) = Stats(copy(stats.threads)) + +Base.convert(::Type{Stats}, d::Dict{String}) = Stats(d["threads"]) + Stats(b::PerfBenchThreaded) = Stats(map(ThreadStats, b.data)) Base.show(io::IO, stats::Stats) = printsummary(io, stats)