Index: runtime/bin/dbg_connection_win.cc |
diff --git a/runtime/bin/dbg_connection_win.cc b/runtime/bin/dbg_connection_win.cc |
index fee02e6c0b7533284197ee1f0bdd125025acb41d..49bc4a985d7ce4846857b0b9036841412d95eac9 100644 |
--- a/runtime/bin/dbg_connection_win.cc |
+++ b/runtime/bin/dbg_connection_win.cc |
@@ -8,12 +8,59 @@ |
#include "bin/dbg_connection.h" |
#include "bin/eventhandler.h" |
- |
+#include "bin/lockers.h" |
+#include "bin/log.h" |
+#include "bin/thread.h" |
namespace dart { |
namespace bin { |
+Monitor* DebuggerConnectionImpl::handler_monitor_ = new Monitor(); |
+ThreadId DebuggerConnectionImpl::handler_thread_id_ = Thread::kInvalidThreadId; |
+bool DebuggerConnectionImpl::handler_thread_running_ = false; |
+ |
+ |
+void DebuggerConnectionImpl::NotifyThreadStarted() { |
+ MonitorLocker ml(handler_monitor_); |
+ ASSERT(!handler_thread_running_); |
+ ASSERT(handler_thread_id_ == Thread::kInvalidThreadId); |
+ handler_thread_running_ = true; |
+ handler_thread_id_ = Thread::GetCurrentThreadId(); |
+ ml.Notify(); |
+} |
+ |
+ |
+void DebuggerConnectionImpl::WaitForThreadStarted() { |
+ MonitorLocker ml(handler_monitor_); |
+ while (!handler_thread_running_) { |
+ ml.Wait(); |
+ } |
+ ASSERT(handler_thread_id_ != Thread::kInvalidThreadId); |
+} |
+ |
+ |
+void DebuggerConnectionImpl::NotifyThreadFinished() { |
+ MonitorLocker ml(handler_monitor_); |
+ ASSERT(handler_thread_running_); |
+ ASSERT(handler_thread_id_ != Thread::kInvalidThreadId); |
+ handler_thread_running_ = false; |
+ ml.Notify(); |
+} |
+ |
+ |
+void DebuggerConnectionImpl::WaitForThreadFinished() { |
+ MonitorLocker ml(handler_monitor_); |
+ while (handler_thread_running_) { |
+ ml.Wait(); |
+ } |
+ ASSERT(handler_thread_id_ != Thread::kInvalidThreadId); |
+ Thread::Join(handler_thread_id_); |
+ handler_thread_id_ = Thread::kInvalidThreadId; |
+} |
+ |
+ |
void DebuggerConnectionImpl::ThreadEntry(uword args) { |
+ NotifyThreadStarted(); |
ListenSocket* listen_socket = |
reinterpret_cast<ListenSocket*>(DebuggerConnectionHandler::listener_fd_); |
SOCKET client_socket = accept(listen_socket->socket(), NULL, NULL); |
@@ -23,6 +70,7 @@ void DebuggerConnectionImpl::ThreadEntry(uword args) { |
ClientSocket* socket = new ClientSocket(client_socket); |
DebuggerConnectionHandler::AcceptDbgConnection( |
reinterpret_cast<intptr_t>(socket)); |
+ NotifyThreadFinished(); |
} |
@@ -32,6 +80,13 @@ void DebuggerConnectionImpl::StartHandler(int port_number) { |
if (result != 0) { |
FATAL1("Failed to start debugger connection handler thread: %d\n", result); |
} |
+ WaitForThreadStarted(); |
+} |
+ |
+ |
+void DebuggerConnectionImpl::StopHandler(intptr_t debug_fd) { |
+ Send(debug_fd, NULL, 0); |
+ WaitForThreadFinished(); |
} |