Fixed some cctest flakiness on mac.
authorchristian.plesner.hansen@gmail.com <christian.plesner.hansen@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 25 Sep 2009 10:36:00 +0000 (10:36 +0000)
committerchristian.plesner.hansen@gmail.com <christian.plesner.hansen@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 25 Sep 2009 10:36:00 +0000 (10:36 +0000)
Review URL: http://codereview.chromium.org/242003

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

src/debug-agent.cc
src/debug-agent.h
src/debug.cc
src/debug.h
test/cctest/test-debug.cc
test/cctest/test-sockets.cc

index 3dba53a435764f27505ee8c5862f61de59725ef8..9d5cace03ba1095dbcf27c90f9a271b75a913cc7 100644 (file)
@@ -65,6 +65,7 @@ void DebuggerAgent::Run() {
   // Accept connections on the bound port.
   while (!terminate_) {
     bool ok = server_->Listen(1);
+    listening_->Signal();
     if (ok) {
       // Accept the new connection.
       Socket* client = server_->Accept();
@@ -93,6 +94,10 @@ void DebuggerAgent::Shutdown() {
 }
 
 
+void DebuggerAgent::WaitUntilListening() {
+  listening_->Wait();
+}
+
 void DebuggerAgent::CreateSession(Socket* client) {
   ScopedLock with(session_access_);
 
index 04f883f40edd2a6b9609880e4251f8da02af6786..364799436454c7c11321e33a5b1aa4ca281ea261 100644 (file)
@@ -47,7 +47,8 @@ class DebuggerAgent: public Thread {
       : name_(StrDup(name)), port_(port),
         server_(OS::CreateSocket()), terminate_(false),
         session_access_(OS::CreateMutex()), session_(NULL),
-        terminate_now_(OS::CreateSemaphore(0)) {
+        terminate_now_(OS::CreateSemaphore(0)),
+        listening_(OS::CreateSemaphore(0)) {
     ASSERT(instance_ == NULL);
     instance_ = this;
   }
@@ -57,6 +58,7 @@ class DebuggerAgent: public Thread {
   }
 
   void Shutdown();
+  void WaitUntilListening();
 
  private:
   void Run();
@@ -72,6 +74,7 @@ class DebuggerAgent: public Thread {
   Mutex* session_access_;  // Mutex guarging access to session_.
   DebuggerAgentSession* session_;  // Current active session if any.
   Semaphore* terminate_now_;  // Semaphore to signal termination.
+  Semaphore* listening_;
 
   static DebuggerAgent* instance_;
 
index 3c2bfa80c6e8e2b792ced29f25db7935472fec38..ec658d68f06844f7ca1a93697b763b7311be58ff 100644 (file)
@@ -2498,6 +2498,11 @@ void Debugger::StopAgent() {
 }
 
 
+void Debugger::WaitForAgent() {
+  if (agent_ != NULL)
+    agent_->WaitUntilListening();
+}
+
 MessageImpl MessageImpl::NewEvent(DebugEvent event,
                                   bool running,
                                   Handle<JSObject> exec_state,
index d6b2c088d3324a216596fae2731129df7d1f1bf6..d5efc4385e785cfc84a761c2e177115f594dbba3 100644 (file)
@@ -645,6 +645,9 @@ class Debugger {
   // Stop the debugger agent.
   static void StopAgent();
 
+  // Blocks until the agent has started listening for connections
+  static void WaitForAgent();
+
   // Unload the debugger if possible. Only called when no debugger is currently
   // active.
   static void UnloadDebugger();
index 436084af3724122e9727b3358b91bd7d8e287ae0..e724375b38462c2ec92c42f2d96e023593f87601 100644 (file)
@@ -4522,6 +4522,7 @@ TEST(DebuggerAgent) {
   // with the client connected.
   ok = i::Debugger::StartAgent("test", kPort2);
   CHECK(ok);
+  i::Debugger::WaitForAgent();
   i::Socket* client = i::OS::CreateSocket();
   ok = client->Connect("localhost", port2_str);
   CHECK(ok);
index a4b2285e88139820d3f92cf1fedb2c606f41641e..822a23fa95ff439b0c58c02f59ab5c33626a73aa 100644 (file)
@@ -42,6 +42,7 @@ void SocketListenerThread::Run() {
 
   // Create the server socket and bind it to the requested port.
   server_ = OS::CreateSocket();
+  server_->SetReuseAddress(true);
   CHECK(server_ != NULL);
   ok = server_->Bind(port_);
   CHECK(ok);