1/*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "SummaryProfileResult.h"
8
9#include <new>
10
11
12// #pragma mark - SummaryImage
13
14
15SummaryImage::SummaryImage(ImageProfileResult* result)
16	:
17	fResult(result)
18{
19	fResult->AcquireReference();
20}
21
22
23SummaryImage::~SummaryImage()
24{
25	fResult->ReleaseReference();
26}
27
28
29// #pragma mark - SummaryProfileResult
30
31
32SummaryProfileResult::SummaryProfileResult(ProfileResult* result)
33	:
34	fResult(result),
35	fNextImageID(1)
36{
37	fResult->AcquireReference();
38}
39
40
41SummaryProfileResult::~SummaryProfileResult()
42{
43	fResult->ReleaseReference();
44}
45
46
47void
48SummaryProfileResult::SetInterval(bigtime_t interval)
49{
50	ProfileResult::SetInterval(interval);
51	fResult->SetInterval(interval);
52}
53
54
55status_t
56SummaryProfileResult::Init(ProfiledEntity* entity)
57{
58	status_t error = ProfileResult::Init(entity);
59	if (error != B_OK)
60		return error;
61
62	error = fImages.Init();
63	if (error != B_OK)
64		return error;
65
66	return B_OK;
67}
68
69
70void
71SummaryProfileResult::AddSamples(ImageProfileResultContainer* container,
72	addr_t* samples, int32 sampleCount)
73{
74	fResult->AddSamples(container, samples, sampleCount);
75}
76
77
78void
79SummaryProfileResult::AddDroppedTicks(int32 dropped)
80{
81	fResult->AddDroppedTicks(dropped);
82}
83
84
85void
86SummaryProfileResult::PrintResults(ImageProfileResultContainer* container)
87{
88	// This is called for individual threads. We only print results in
89	// PrintSummaryResults(), though.
90}
91
92
93void
94SummaryProfileResult::PrintSummaryResults()
95{
96	fResult->PrintResults(this);
97}
98
99
100status_t
101SummaryProfileResult::GetImageProfileResult(SharedImage* image, image_id id,
102	ImageProfileResult*& _imageResult)
103{
104	// Check whether we do already know the image.
105	SummaryImage* summaryImage = fImages.Lookup(image);
106	if (summaryImage == NULL) {
107		// nope, create it
108		ImageProfileResult* imageResult;
109		status_t error = fResult->GetImageProfileResult(image, fNextImageID++,
110			imageResult);
111		if (error != B_OK)
112			return error;
113
114		BReference<ImageProfileResult> imageResultReference(imageResult, true);
115
116		summaryImage = new(std::nothrow) SummaryImage(imageResult);
117		if (summaryImage == NULL)
118			return B_NO_MEMORY;
119
120		fImages.Insert(summaryImage);
121	}
122
123	_imageResult = summaryImage->Result();
124	_imageResult->AcquireReference();
125
126	return B_OK;
127}
128
129
130int32
131SummaryProfileResult::CountImages() const
132{
133	return fImages.CountElements();
134}
135
136
137ImageProfileResult*
138SummaryProfileResult::VisitImages(Visitor& visitor) const
139{
140	for (ImageTable::Iterator it = fImages.GetIterator();
141			SummaryImage* image = it.Next();) {
142		if (visitor.VisitImage(image->Result()))
143			return image->Result();
144	}
145
146	return NULL;
147}
148
149
150ImageProfileResult*
151SummaryProfileResult::FindImage(addr_t address, addr_t& _loadDelta) const
152{
153	// We cannot and don't need to implement this. It's only relevant for
154	// AddSamples(), where we use the caller's container implementation.
155	return NULL;
156}
157