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