Reviewers: Søren Gjesse,

Message:
The Windows implementation of Thread::Join leads to a deadlock when a thread
attempts to join with itself.

The test case added to test-debug/DebuggerAgent reproduces this deadlock (on
Windows) and leads to a timeout.

Please take a look.

Description:
Fixed deadlock in the debugger agent in Windows.

BUG=v8:1723
TEST=cctest test-debug/DebuggerAgent


Please review this at http://codereview.chromium.org/8069002/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/platform-win32.cc
  M test/cctest/test-debug.cc


Index: src/platform-win32.cc
diff --git a/src/platform-win32.cc b/src/platform-win32.cc
index 898a2a3918c3816a2fcee171a2f025f80d2f649f..46af4dcdcd22b126fbaaa528bffbee655a0299ea 100644
--- a/src/platform-win32.cc
+++ b/src/platform-win32.cc
@@ -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: test/cctest/test-debug.cc
diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
index de60d4999ded690f22ce0c14b5b077d3bdbe41cf..2383f2dd09fb9926ebe5cbc4078290b4c9348585 100644
--- a/test/cctest/test-debug.cc
+++ b/test/cctest/test-debug.cc
@@ -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();
 }




--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to