Chromium Code Reviews| Index: src/inspector/v8-debugger.cc |
| diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc |
| index 3d3f18189440609a561c57157cae8a681db0db1c..251bb15bf1a4ba0e8c5ccb3c70e7ea01cf5c2029 100644 |
| --- a/src/inspector/v8-debugger.cc |
| +++ b/src/inspector/v8-debugger.cc |
| @@ -26,6 +26,11 @@ static const char v8AsyncTaskEventWillHandle[] = "willHandle"; |
| static const char v8AsyncTaskEventDidHandle[] = "didHandle"; |
| static const char v8AsyncTaskEventCancel[] = "cancel"; |
| +// Based on DevTools frontend measurement, with asyncCallStackDepth = 4, |
| +// average async call stack tail requires ~1 Kb. Let's reserve ~ 128 Mb |
| +// for async stacks. |
| +static const int kMaxAsyncTaskStacks = 128 * 1024; |
| + |
| inline v8::Local<v8::Boolean> v8Boolean(bool value, v8::Isolate* isolate) { |
| return value ? v8::True(isolate) : v8::False(isolate); |
| } |
| @@ -55,6 +60,7 @@ V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) |
| m_breakpointsActivated(true), |
| m_runningNestedMessageLoop(false), |
| m_ignoreScriptParsedEventsCounter(0), |
| + m_lastId(0), |
| m_maxAsyncCallStackDepth(0), |
| m_pauseOnExceptionsState(v8::debug::NoBreakOnException), |
| m_wasmTranslation(isolate) {} |
| @@ -901,6 +907,13 @@ void V8Debugger::asyncTaskScheduled(const String16& taskName, void* task, |
| if (chain) { |
| m_asyncTaskStacks[task] = std::move(chain); |
| if (recurring) m_recurringTasks.insert(task); |
| + int id = ++m_lastId; |
| + m_rawIdToId[task] = id; |
| + m_idToRawId[id] = task; |
| + while (m_idToRawId.size() > kMaxAsyncTaskStacks) { |
|
dgozman
2016/12/16 23:59:49
while -> if ?
kozy
2016/12/17 01:12:41
Done.
|
| + void* taskToRemove = m_idToRawId.begin()->second; |
| + asyncTaskCanceled(taskToRemove); |
| + } |
| } |
| } |
| @@ -908,6 +921,9 @@ void V8Debugger::asyncTaskCanceled(void* task) { |
| if (!m_maxAsyncCallStackDepth) return; |
| m_asyncTaskStacks.erase(task); |
| m_recurringTasks.erase(task); |
| + auto it = m_rawIdToId.find(task); |
| + m_idToRawId.erase(it->second); |
| + m_rawIdToId.erase(it); |
| } |
| void V8Debugger::asyncTaskStarted(void* task) { |
| @@ -936,8 +952,12 @@ void V8Debugger::asyncTaskFinished(void* task) { |
| m_currentTasks.pop_back(); |
| m_currentStacks.pop_back(); |
| - if (m_recurringTasks.find(task) == m_recurringTasks.end()) |
| + if (m_recurringTasks.find(task) == m_recurringTasks.end()) { |
| m_asyncTaskStacks.erase(task); |
| + auto it = m_rawIdToId.find(task); |
| + m_idToRawId.erase(it->second); |
| + m_rawIdToId.erase(it); |
| + } |
| } |
| void V8Debugger::allAsyncTasksCanceled() { |
| @@ -945,6 +965,9 @@ void V8Debugger::allAsyncTasksCanceled() { |
| m_recurringTasks.clear(); |
| m_currentStacks.clear(); |
| m_currentTasks.clear(); |
| + m_idToRawId.clear(); |
| + m_rawIdToId.clear(); |
| + m_lastId = 0; |
| } |
| void V8Debugger::muteScriptParsedEvents() { |