Skip to content

Commit cabaf67

Browse files
authored
Lock after resume (#64)
1 parent 8d1061e commit cabaf67

File tree

1 file changed

+33
-18
lines changed

1 file changed

+33
-18
lines changed

ETTrace/Tracer/EMGTracer.mm

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ + (NSString *)deviceName {
137137
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
138138
}
139139

140-
+ (Thread *) createThread:(thread_t) threadId
140+
Thread* createThread(thread_t threadId)
141141
{
142142
Thread *thread = new Thread;
143143

@@ -174,6 +174,16 @@ + (void)recordStackForAllThreads
174174
thread_count = 1;
175175
}
176176

177+
std::map<thread_t, Stack *> stackMap;
178+
for (mach_msg_type_number_t i = 0; i < thread_count; i++) {
179+
if (threads[i] == sETTraceThread) {
180+
continue;
181+
}
182+
183+
Stack *stack = new Stack;
184+
stackMap.insert(std::pair<unsigned int, Stack *>(threads[i], stack));
185+
}
186+
177187
// Suspend all threads but ETTrace's
178188
for (mach_msg_type_number_t i = 0; i < thread_count; i++) {
179189
if (threads[i] != sETTraceThread) {
@@ -187,36 +197,41 @@ + (void)recordStackForAllThreads
187197
continue;
188198
}
189199

190-
Stack stack;
191-
stack.time = time;
192-
FIRCLSWriteThreadStack(threads[i], stack.frames, kMaxFramesPerStack, &(stack.frameCount));
200+
Stack *stack = stackMap.at(threads[i]);
201+
stack->time = time;
202+
FIRCLSWriteThreadStack(threads[i], stack->frames, kMaxFramesPerStack, &(stack->frameCount));
203+
}
193204

194-
std::vector<Stack> *threadStack;
195-
sThreadsLock.lock();
196-
if (sThreadsMap->find(threads[i]) == sThreadsMap->end()) {
197-
Thread *thread = [self createThread:threads[i]];
205+
for (mach_msg_type_number_t i = 0; i < thread_count; i++) {
206+
if (threads[i] != sETTraceThread)
207+
thread_resume(threads[i]);
208+
}
209+
210+
std::vector<Stack> *threadStack;
211+
std::map<thread_t, Stack *>::iterator it;
212+
sThreadsLock.lock();
213+
for (it = stackMap.begin(); it != stackMap.end(); it++) {
214+
thread_t t_id = it->first;
215+
if (sThreadsMap->find(t_id) == sThreadsMap->end()) {
216+
Thread *thread = createThread(t_id);
198217
// Add to hash map
199-
sThreadsMap->insert(std::pair<unsigned int, Thread *>(threads[i], thread));
218+
sThreadsMap->insert(std::pair<thread_t, Thread *>(t_id, thread));
200219

201220
threadStack = thread->stacks;
202221
} else {
203-
threadStack = sThreadsMap->at(threads[i])->stacks;
222+
threadStack = sThreadsMap->at(t_id)->stacks;
204223
}
205-
224+
Stack *stack = it->second;
206225
try {
207-
threadStack->emplace_back(stack);
226+
threadStack->emplace_back(*stack);
208227
} catch (const std::length_error& le) {
209228
fflush(stdout);
210229
fflush(stderr);
211230
throw le;
212231
}
213-
sThreadsLock.unlock();
214-
}
215-
216-
for (mach_msg_type_number_t i = 0; i < thread_count; i++) {
217-
if (threads[i] != sETTraceThread)
218-
thread_resume(threads[i]);
232+
delete stack;
219233
}
234+
sThreadsLock.unlock();
220235
}
221236

222237
+ (void)setup {

0 commit comments

Comments
 (0)