Fixed deadlock in the debugger agent in Windows.
authoryangguo@chromium.org <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 28 Sep 2011 13:27:20 +0000 (13:27 +0000)
committeryangguo@chromium.org <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 28 Sep 2011 13:27:20 +0000 (13:27 +0000)
BUG=v8:1723
TEST=cctest test-debug/DebuggerAgent

Review URL: http://codereview.chromium.org/8069002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9469 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/platform-win32.cc
test/cctest/test-debug.cc

index 898a2a3..46af4dc 100644 (file)
@@ -1511,6 +1511,7 @@ class Thread::PlatformData : public Malloced {
  public:
   explicit PlatformData(HANDLE thread) : thread_(thread) {}
   HANDLE thread_;
+  unsigned thread_id_;
 };
 
 
@@ -1554,13 +1555,15 @@ void Thread::Start() {
                      ThreadEntry,
                      this,
                      0,
-                     NULL));
+                     &data_->thread_id_));
 }
 
 
 // Wait for thread to terminate.
 void Thread::Join() {
-  WaitForSingleObject(data_->thread_, INFINITE);
+  if (data_->thread_id_ != GetCurrentThreadId()) {
+    WaitForSingleObject(data_->thread_, INFINITE);
+  }
 }
 
 
index de60d49..2383f2d 100644 (file)
@@ -5845,11 +5845,14 @@ TEST(DebuggerAgent) {
   const int kPort1 = 5858;
   const int kPort2 = 5857;
   const int kPort3 = 5856;
+  const int kPort4 = 5855;
 
   // Make a string with the port2 number.
   const int kPortBufferLen = 6;
   char port2_str[kPortBufferLen];
   OS::SNPrintF(i::Vector<char>(port2_str, kPortBufferLen), "%d", kPort2);
+  char port4_str[kPortBufferLen];
+  OS::SNPrintF(i::Vector<char>(port4_str, kPortBufferLen), "%d", kPort4);
 
   bool ok;
 
@@ -5885,6 +5888,27 @@ TEST(DebuggerAgent) {
   debugger->StopAgent();
 
   delete server;
+
+  // Test responsiveness after connecting and disconnecting a client.
+  ok = debugger->StartAgent("test", kPort4);
+  CHECK(ok);
+  client = i::OS::CreateSocket();
+  ok = client->Connect("localhost", port4_str);
+  CHECK(ok);
+  ok = client->Receive(&buf, 1) == 1;
+  CHECK(ok);
+  ok = client->Send(
+      "{\"seq\":1,\"type\":\"request\",\"command\":\"disconnect\"}", 49);
+  CHECK(ok);
+  client->Shutdown();
+  delete client;
+  // Is the server still responsive?
+  client = i::OS::CreateSocket();
+  ok = client->Connect("localhost", port4_str);
+  CHECK(ok);
+  client->Shutdown();
+  delete client;
+  debugger->StopAgent();
 }