Move dart_debugger into tonic and use it in mojo dart controller

R=abarth@chromium.org

Review URL: https://codereview.chromium.org/1245243002 .
diff --git a/tonic/dart_debugger.h b/tonic/dart_debugger.h
new file mode 100644
index 0000000..779b35d
--- /dev/null
+++ b/tonic/dart_debugger.h
@@ -0,0 +1,139 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef TONIC_DART_DEBUGGER_H_
+#define TONIC_DART_DEBUGGER_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/synchronization/condition_variable.h"
+#include "base/synchronization/lock.h"
+#include "dart/runtime/include/dart_api.h"
+#include "dart/runtime/include/dart_native_api.h"
+#include "dart/runtime/include/dart_tools_api.h"
+
+namespace base {
+  class Lock;
+}
+
+namespace tonic {
+
+class Monitor {
+ public:
+  Monitor() {
+    lock_ = new base::Lock();
+    condition_variable_ = new base::ConditionVariable(lock_);
+  }
+
+  ~Monitor() {
+    delete condition_variable_;
+    delete lock_;
+  }
+
+  void Enter() {
+    lock_->Acquire();
+  }
+
+  void Exit() {
+    lock_->Release();
+  }
+
+  void Notify() {
+    condition_variable_->Signal();
+  }
+
+  void Wait() {
+    condition_variable_->Wait();
+  }
+
+ private:
+  base::Lock* lock_;
+  base::ConditionVariable* condition_variable_;
+  DISALLOW_COPY_AND_ASSIGN(Monitor);
+};
+
+class MonitorLocker {
+ public:
+  explicit MonitorLocker(Monitor* monitor) : monitor_(monitor) {
+    CHECK(monitor_);
+    monitor_->Enter();
+  }
+
+  virtual ~MonitorLocker();
+
+  void Wait() {
+    return monitor_->Wait();
+  }
+
+  void Notify() {
+    monitor_->Notify();
+  }
+
+ private:
+  Monitor* const monitor_;
+
+  DISALLOW_COPY_AND_ASSIGN(MonitorLocker);
+};
+
+class DartDebuggerIsolate {
+ public:
+  DartDebuggerIsolate(Dart_IsolateId id)
+      : id_(id) {
+  }
+
+  Dart_IsolateId id() const {
+    return id_;
+  }
+
+  void Notify() {
+    monitor_.Notify();
+  }
+
+  void MessageLoop();
+
+ private:
+  const Dart_IsolateId id_;
+  Monitor monitor_;
+};
+
+class DartDebugger {
+ public:
+  static void InitDebugger();
+
+ private:
+  static void BptResolvedHandler(Dart_IsolateId isolate_id,
+                                 intptr_t bp_id,
+                                 const Dart_CodeLocation& location);
+
+  static void PausedEventHandler(Dart_IsolateId isolate_id,
+                                 intptr_t bp_id,
+                                 const Dart_CodeLocation& loc);
+
+  static void ExceptionThrownHandler(Dart_IsolateId isolate_id,
+                                     Dart_Handle exception,
+                                     Dart_StackTrace stack_trace);
+
+  static void IsolateEventHandler(Dart_IsolateId isolate_id,
+                                  Dart_IsolateEvent kind);
+
+  static void NotifyIsolate(Dart_Isolate isolate);
+
+  static intptr_t FindIsolateIndexById(Dart_IsolateId id);
+
+  static intptr_t FindIsolateIndexByIdLocked(Dart_IsolateId id);
+
+  static void AddIsolate(Dart_IsolateId id);
+
+  static void RemoveIsolate(Dart_IsolateId id);
+
+  static base::Lock* lock_;
+  static std::vector<std::unique_ptr<DartDebuggerIsolate>>* isolates_;
+
+  friend class DartDebuggerIsolate;
+};
+
+}  // namespace tonic
+
+#endif  // TONIC_DART_DEBUGGER_H_