Chromium Code Reviews| Index: src/debug.cc |
| diff --git a/src/debug.cc b/src/debug.cc |
| index a7321b2b157f074a02e8a8dd5bf7e78148803cbc..a1e8042accc69946338c946c784fa89bd7db9062 100644 |
| --- a/src/debug.cc |
| +++ b/src/debug.cc |
| @@ -3103,6 +3103,27 @@ void Debug::EnqueueDebugCommand(v8::Debug::ClientData* client_data) { |
| } |
| +void Debug::EnqueueEmbedderTask(v8::Debug::Task* task) { |
| + embedder_task_queue_.Enqueue(task); |
| + |
| + // Set the debug command break flag to have the command processed. |
| + if (!isolate_->debug()->in_debug_scope()) { |
|
yurys
2014/12/17 14:25:02
if (!in_debug_scope())
alph
2014/12/17 15:05:46
Done.
|
| + isolate_->stack_guard()->RequestDebugCommand(); |
| + } |
| +} |
| + |
| + |
| +bool Debug::ProcessEmbedderTasks() { |
| + bool did_process_task = false; |
| + while (v8::Debug::Task* task = embedder_task_queue_.Dequeue()) { |
| + did_process_task = true; |
| + task->Run(); |
| + delete task; |
| + } |
| + return did_process_task; |
| +} |
| + |
| + |
| MaybeHandle<Object> Debug::Call(Handle<JSFunction> fun, Handle<Object> data) { |
| DebugScope debug_scope(this); |
| if (debug_scope.failed()) return isolate_->factory()->undefined_value(); |
| @@ -3128,6 +3149,9 @@ void Debug::HandleDebugBreak() { |
| if (isolate_->bootstrapper()->IsActive()) return; |
| // Just continue if breaks are disabled. |
| if (break_disabled()) return; |
| + if (ProcessEmbedderTasks()) { |
| + isolate_->stack_guard()->ClearDebugCommand(); |
|
yurys
2014/12/17 14:25:02
It seems fine to reuse the same interrupt bit as f
alph
2014/12/17 15:05:46
Acknowledged.
|
| + } |
| // Ignore debug break if debugger is not active. |
| if (!is_active()) return; |
| @@ -3480,4 +3504,33 @@ void LockingCommandMessageQueue::Clear() { |
| queue_.Clear(); |
| } |
| + |
| +LockingTaskQueue::LockingTaskQueue() {} |
| + |
| + |
| +LockingTaskQueue::~LockingTaskQueue() { Clear(); } |
| + |
| + |
| +void LockingTaskQueue::Enqueue(v8::Debug::Task* task) { |
| + base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| + queue_.push(task); |
| +} |
| + |
| + |
| +v8::Debug::Task* LockingTaskQueue::Dequeue() { |
| + base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| + if (queue_.empty()) return NULL; |
| + v8::Debug::Task* task = queue_.front(); |
| + queue_.pop(); |
| + return task; |
| +} |
| + |
| + |
| +void LockingTaskQueue::Clear() { |
| + base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| + while (!queue_.empty()) { |
| + delete queue_.front(); |
| + queue_.pop(); |
| + } |
| +} |
|
yurys
2014/12/17 14:25:02
empty line?
alph
2014/12/17 15:05:46
Surprisingly git cl format does not want an empty
|
| } } // namespace v8::internal |