| Index: src/debug.cc
|
| diff --git a/src/debug.cc b/src/debug.cc
|
| index a7321b2b157f074a02e8a8dd5bf7e78148803cbc..fc9a80aefb4778e16f4e5575069ba420c0203609 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::Task* task) {
|
| + embedder_task_queue_.Enqueue(task);
|
| +
|
| + // Set the debug command break flag to have the command processed.
|
| + if (!in_debug_scope()) {
|
| + isolate_->stack_guard()->RequestDebugCommand();
|
| + }
|
| +}
|
| +
|
| +
|
| +bool Debug::ProcessEmbedderTasks() {
|
| + bool did_process_task = false;
|
| + while (v8::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();
|
| + }
|
| // 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::Task* task) {
|
| + base::LockGuard<base::Mutex> lock_guard(&mutex_);
|
| + queue_.push(task);
|
| +}
|
| +
|
| +
|
| +v8::Task* LockingTaskQueue::Dequeue() {
|
| + base::LockGuard<base::Mutex> lock_guard(&mutex_);
|
| + if (queue_.empty()) return NULL;
|
| + v8::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();
|
| + }
|
| +}
|
| } } // namespace v8::internal
|
|
|