@@ -13,6 +13,11 @@ void MethodInfo::serialize(std::vector<char>& buffer) const {
13
13
serializePrimitive (moduleNameLength, buffer);
14
14
serializePrimitiveArray (moduleName, moduleNameLength, buffer);
15
15
}
16
+
17
+ void MethodInfo::Dispose () {
18
+ delete moduleName;
19
+ delete assemblyName;
20
+ }
16
21
// endregion
17
22
18
23
// region CoverageRecord
@@ -21,27 +26,31 @@ void CoverageRecord::serialize(std::vector<char>& buffer) const {
21
26
serializePrimitive (event, buffer);
22
27
serializePrimitive (methodId, buffer);
23
28
serializePrimitive (thread, buffer);
29
+ serializePrimitive (timestamp, buffer);
24
30
}
25
31
// endregion
26
32
33
+ auto GetMicrosecondTime () {
34
+ using namespace std ::chrono;
35
+ return duration_cast<microseconds>(system_clock::now ().time_since_epoch ()).count ();
36
+ }
37
+
27
38
// region CoverageHistory
28
39
CoverageHistory::CoverageHistory (OFFSET offset, int methodId) {
29
40
auto insertResult = visitedMethods.insert (methodId);
30
- LOG ( if (insertResult.second ) {
31
- tout << " Visit method: " << methodId;
32
- });
33
- auto record = new CoverageRecord ({offset, EnterMain, profilerState->threadInfo ->getCurrentThread (), methodId});
41
+ if (insertResult.second ) {
42
+ LOG ( tout << " Visit method: " << methodId) ;
43
+ }
44
+ auto record = new CoverageRecord ({offset, EnterMain, profilerState->threadInfo ->getCurrentThread (), methodId, GetMicrosecondTime () });
34
45
records.push_back (record);
35
46
}
36
47
37
48
void CoverageHistory::addCoverage (OFFSET offset, CoverageEvent event, int methodId) {
38
49
auto insertResult = visitedMethods.insert (methodId);
39
- LOG (
40
50
if (insertResult.second ) {
41
- tout << " Visit method: " << methodId;
51
+ LOG ( tout << " Visit method: " << methodId) ;
42
52
}
43
- );
44
- auto record = new CoverageRecord ({offset, event, profilerState->threadInfo ->getCurrentThread (), methodId});
53
+ auto record = new CoverageRecord ({offset, event, profilerState->threadInfo ->getCurrentThread (), methodId, GetMicrosecondTime ()});
45
54
records.push_back (record);
46
55
}
47
56
@@ -54,6 +63,8 @@ void CoverageHistory::serialize(std::vector<char>& buffer) const {
54
63
}
55
64
56
65
CoverageHistory::~CoverageHistory () {
66
+ for (auto r : records)
67
+ delete r;
57
68
records.clear ();
58
69
}
59
70
// endregion
@@ -99,6 +110,7 @@ void CoverageTracker::invocationFinished() {
99
110
coverage->serialize (buffer);
100
111
}
101
112
113
+ delete coverage;
102
114
trackedCoverage->remove ();
103
115
104
116
serializedCoverageMutex.lock ();
@@ -110,6 +122,7 @@ void CoverageTracker::invocationFinished() {
110
122
char * CoverageTracker::serializeCoverageReport (size_t * size) {
111
123
collectedMethodsMutex.lock ();
112
124
serializedCoverageMutex.lock ();
125
+ printf (" got locks, converting info\n " );
113
126
114
127
auto buffer = std::vector<char >();
115
128
auto methodsToSerialize = std::vector<std::pair<int , MethodInfo>>();
@@ -126,6 +139,7 @@ char* CoverageTracker::serializeCoverageReport(size_t* size) {
126
139
serializePrimitive (el.first , buffer);
127
140
el.second .serialize (buffer);
128
141
}
142
+ printf (" converted methods: %lld\n " , buffer.size ());
129
143
130
144
auto threadMapping = profilerState->threadTracker ->getMapping ();
131
145
for (auto mapping: threadMapping) {
@@ -148,16 +162,25 @@ char* CoverageTracker::serializeCoverageReport(size_t* size) {
148
162
serializePrimitiveArray (&serializedCoverage[i][0 ], serializedCoverage[i].size (), buffer);
149
163
}
150
164
165
+ printf (" converted reports: %lld\n " , buffer.size ());
166
+
167
+ for (auto cov : trackedCoverage->items ())
168
+ delete cov.second ;
151
169
trackedCoverage->clear ();
152
170
serializedCoverage.clear ();
153
171
methodsToSerialize.clear ();
154
172
155
173
serializedCoverageMutex.unlock ();
156
174
collectedMethodsMutex.unlock ();
157
175
176
+ printf (" cleared and unlocked data\n " );
177
+
158
178
*size = buffer.size ();
159
179
char * array = new char [*size];
180
+ printf (" successfully allocated\n " );
160
181
std::memcpy (array, &buffer[0 ], *size);
182
+
183
+ printf (" total bytes: %lld" , *size);
161
184
return array;
162
185
}
163
186
@@ -179,9 +202,15 @@ void CoverageTracker::clear() {
179
202
180
203
CoverageTracker::~CoverageTracker (){
181
204
clear ();
205
+ for (int i = 0 ; i < collectedMethods.size (); i++)
206
+ collectedMethods[i].Dispose ();
207
+ collectedMethods.clear ();
208
+ delete trackedCoverage;
182
209
}
183
210
184
211
void CoverageTracker::invocationAborted () {
212
+ auto abortedCov = trackedCoverage->load ();
213
+ delete abortedCov;
185
214
trackedCoverage->update ([](CoverageHistory *cov) {
186
215
return (CoverageHistory*) nullptr ;
187
216
});
0 commit comments