2
using System.Collections.Generic;
3
using System.Collections.ObjectModel;
5
namespace ICSharpCode.Profiler.Controller.Data
7
unsafe sealed class UnmanagedCallTreeNode64 : CallTreeNode
11
const ulong CpuCycleMask = 0x7fffffffffffffL;
12
UnmanagedProfilingDataSet dataSet;
13
internal UnmanagedCallTreeNode64(UnmanagedProfilingDataSet dataSet, FunctionInfo* data, CallTreeNode parent)
16
this.dataSet = dataSet;
19
public override System.Linq.IQueryable<CallTreeNode> Children {
21
dataSet.VerifyAccess();
22
List<UnmanagedCallTreeNode64> children = new List<UnmanagedCallTreeNode64>();
23
TargetProcessPointer64* childrenPtr = FunctionInfo.GetChildren64(data);
24
for (int i = 0; i <= data->LastChildIndex; i++) {
25
FunctionInfo* child = dataSet.GetFunctionInfo(childrenPtr[i]);
27
children.Add(new UnmanagedCallTreeNode64(dataSet, child, this));
29
children.Sort((a, b) => a.Index.CompareTo(b.Index));
30
return children.AsQueryable();
33
public override NameMapping NameMapping {
34
get { return this.dataSet.GetMapping(this.data->Id); }
36
public override int RawCallCount {
38
dataSet.VerifyAccess();
39
return this.data->CallCount;
44
dataSet.VerifyAccess();
45
return (int)(this.data->TimeSpent >> 56);
48
public override bool IsActiveAtStart {
50
dataSet.VerifyAccess();
51
return (this.data->TimeSpent & ((ulong)1 << 55)) != 0;
54
public override long CpuCyclesSpent {
56
dataSet.VerifyAccess();
57
return (long)(this.data->TimeSpent & CpuCycleMask);
60
public override long CpuCyclesSpentSelf {
62
dataSet.VerifyAccess();
63
long result = (long)(this.data->TimeSpent & CpuCycleMask);
64
TargetProcessPointer64* childrenPtr = FunctionInfo.GetChildren64(data);
65
for (int i = 0; i <= data->LastChildIndex; i++) {
66
FunctionInfo* child = dataSet.GetFunctionInfo(childrenPtr[i]);
68
result -= (long)(child->TimeSpent & CpuCycleMask);
73
public override CallTreeNode Parent {
74
get { return this.parent; }
76
public override double TimeSpent {
77
get { return this.CpuCyclesSpent / (1000.0 * this.dataSet.ProcessorFrequency); }
79
public override double TimeSpentSelf {
80
get { return this.CpuCyclesSpentSelf / (1000.0 * this.dataSet.ProcessorFrequency); }
82
public override CallTreeNode Merge(IEnumerable<CallTreeNode> nodes)
84
throw new NotImplementedException();
86
public override IQueryable<CallTreeNode> Callers {
87
get { return GetCallers().AsQueryable(); }
89
IEnumerable<CallTreeNode> GetCallers()
94
public override bool Equals(CallTreeNode other)
96
UnmanagedCallTreeNode64 node = other as UnmanagedCallTreeNode64;
98
return node.data == this.data;
102
public override int GetHashCode()
104
return (new IntPtr(data)).GetHashCode();