diff options
Diffstat (limited to 'deps/v8/src/debug-agent.cc')
-rw-r--r-- | deps/v8/src/debug-agent.cc | 111 |
1 files changed, 76 insertions, 35 deletions
diff --git a/deps/v8/src/debug-agent.cc b/deps/v8/src/debug-agent.cc index 811c00e0c..51823aaf2 100644 --- a/deps/v8/src/debug-agent.cc +++ b/deps/v8/src/debug-agent.cc @@ -25,12 +25,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#ifdef ENABLE_DEBUGGER_SUPPORT #include "v8.h" #include "debug.h" #include "debug-agent.h" - -#ifdef ENABLE_DEBUGGER_SUPPORT +#include "platform/socket.h" namespace v8 { namespace internal { @@ -38,16 +38,36 @@ namespace internal { // Public V8 debugger API message handler function. This function just delegates // to the debugger agent through it's data parameter. void DebuggerAgentMessageHandler(const v8::Debug::Message& message) { - DebuggerAgent* agent = Isolate::Current()->debugger_agent_instance(); + Isolate* isolate = reinterpret_cast<Isolate*>(message.GetIsolate()); + DebuggerAgent* agent = isolate->debugger_agent_instance(); ASSERT(agent != NULL); agent->DebuggerMessage(message); } +DebuggerAgent::DebuggerAgent(Isolate* isolate, const char* name, int port) + : Thread(name), + isolate_(isolate), + name_(StrDup(name)), + port_(port), + server_(new Socket), + terminate_(false), + session_(NULL), + terminate_now_(0), + listening_(0) { + ASSERT(isolate_->debugger_agent_instance() == NULL); + isolate_->set_debugger_agent_instance(this); +} + + +DebuggerAgent::~DebuggerAgent() { + isolate_->set_debugger_agent_instance(NULL); + delete server_; +} + + // Debugger agent main thread. void DebuggerAgent::Run() { - const int kOneSecondInMicros = 1000000; - // Allow this socket to reuse port even if still in TIME_WAIT. server_->SetReuseAddress(true); @@ -60,16 +80,20 @@ void DebuggerAgent::Run() { // would be that the port is already in use so this avoids a busy loop and // make the agent take over the port when it becomes free. if (!bound) { + const TimeDelta kTimeout = TimeDelta::FromSeconds(1); PrintF("Failed to open socket on port %d, " - "waiting %d ms before retrying\n", port_, kOneSecondInMicros / 1000); - terminate_now_->Wait(kOneSecondInMicros); + "waiting %d ms before retrying\n", port_, + static_cast<int>(kTimeout.InMilliseconds())); + if (!terminate_now_.WaitFor(kTimeout)) { + if (terminate_) return; + } } } // Accept connections on the bound port. while (!terminate_) { bool ok = server_->Listen(1); - listening_->Signal(); + listening_.Signal(); if (ok) { // Accept the new connection. Socket* client = server_->Accept(); @@ -89,7 +113,7 @@ void DebuggerAgent::Shutdown() { // Signal termination and make the server exit either its listen call or its // binding loop. This makes sure that no new sessions can be established. - terminate_now_->Signal(); + terminate_now_.Signal(); server_->Shutdown(); Join(); @@ -99,19 +123,21 @@ void DebuggerAgent::Shutdown() { void DebuggerAgent::WaitUntilListening() { - listening_->Wait(); + listening_.Wait(); } static const char* kCreateSessionMessage = "Remote debugging session already active\r\n"; void DebuggerAgent::CreateSession(Socket* client) { - ScopedLock with(session_access_); + LockGuard<RecursiveMutex> session_access_guard(&session_access_); // If another session is already established terminate this one. if (session_ != NULL) { - client->Send(kCreateSessionMessage, StrLength(kCreateSessionMessage)); + int len = StrLength(kCreateSessionMessage); + int res = client->Send(kCreateSessionMessage, len); delete client; + USE(res); return; } @@ -123,7 +149,7 @@ void DebuggerAgent::CreateSession(Socket* client) { void DebuggerAgent::CloseSession() { - ScopedLock with(session_access_); + LockGuard<RecursiveMutex> session_access_guard(&session_access_); // Terminate the session. if (session_ != NULL) { @@ -136,7 +162,7 @@ void DebuggerAgent::CloseSession() { void DebuggerAgent::DebuggerMessage(const v8::Debug::Message& message) { - ScopedLock with(session_access_); + LockGuard<RecursiveMutex> session_access_guard(&session_access_); // Forward the message handling to the session. if (session_ != NULL) { @@ -154,7 +180,7 @@ void DebuggerAgent::OnSessionClosed(DebuggerAgentSession* session) { } // Terminate the session. - ScopedLock with(session_access_); + LockGuard<RecursiveMutex> session_access_guard(&session_access_); ASSERT(session == session_); if (session == session_) { session_->Shutdown(); @@ -226,7 +252,7 @@ void DebuggerAgentSession::Shutdown() { const char* const DebuggerAgentUtil::kContentLength = "Content-Length"; -SmartArrayPointer<char> DebuggerAgentUtil::ReceiveMessage(const Socket* conn) { +SmartArrayPointer<char> DebuggerAgentUtil::ReceiveMessage(Socket* conn) { int received; // Read header. @@ -243,7 +269,7 @@ SmartArrayPointer<char> DebuggerAgentUtil::ReceiveMessage(const Socket* conn) { prev_c = c; received = conn->Receive(&c, 1); if (received == 0) { - PrintF("Error %d\n", Socket::LastError()); + PrintF("Error %d\n", Socket::GetLastError()); return SmartArrayPointer<char>(); } @@ -305,7 +331,7 @@ SmartArrayPointer<char> DebuggerAgentUtil::ReceiveMessage(const Socket* conn) { char* buffer = NewArray<char>(content_length + 1); received = ReceiveAll(conn, buffer, content_length); if (received < content_length) { - PrintF("Error %d\n", Socket::LastError()); + PrintF("Error %d\n", Socket::GetLastError()); return SmartArrayPointer<char>(); } buffer[content_length] = '\0'; @@ -314,7 +340,7 @@ SmartArrayPointer<char> DebuggerAgentUtil::ReceiveMessage(const Socket* conn) { } -bool DebuggerAgentUtil::SendConnectMessage(const Socket* conn, +bool DebuggerAgentUtil::SendConnectMessage(Socket* conn, const char* embedding_host) { static const int kBufferSize = 80; char buffer[kBufferSize]; // Sending buffer. @@ -360,7 +386,7 @@ bool DebuggerAgentUtil::SendConnectMessage(const Socket* conn, } -bool DebuggerAgentUtil::SendMessage(const Socket* conn, +bool DebuggerAgentUtil::SendMessage(Socket* conn, const Vector<uint16_t> message) { static const int kBufferSize = 80; char buffer[kBufferSize]; // Sending buffer both for header and body. @@ -375,14 +401,17 @@ bool DebuggerAgentUtil::SendMessage(const Socket* conn, } // Send the header. - int len; - len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), - "%s: %d\r\n", kContentLength, utf8_len); - conn->Send(buffer, len); + int len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), + "%s: %d\r\n", kContentLength, utf8_len); + if (conn->Send(buffer, len) < len) { + return false; + } // Terminate header with empty line. len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\r\n"); - conn->Send(buffer, len); + if (conn->Send(buffer, len) < len) { + return false; + } // Send message body as UTF-8. int buffer_position = 0; // Current buffer position. @@ -402,13 +431,19 @@ bool DebuggerAgentUtil::SendMessage(const Socket* conn, const int kEncodedSurrogateLength = unibrow::Utf16::kUtf8BytesToCodeASurrogate; ASSERT(buffer_position >= kEncodedSurrogateLength); - conn->Send(buffer, buffer_position - kEncodedSurrogateLength); + len = buffer_position - kEncodedSurrogateLength; + if (conn->Send(buffer, len) < len) { + return false; + } for (int i = 0; i < kEncodedSurrogateLength; i++) { buffer[i] = buffer[buffer_position + i]; } buffer_position = kEncodedSurrogateLength; } else { - conn->Send(buffer, buffer_position); + len = buffer_position; + if (conn->Send(buffer, len) < len) { + return false; + } buffer_position = 0; } } @@ -419,7 +454,7 @@ bool DebuggerAgentUtil::SendMessage(const Socket* conn, } -bool DebuggerAgentUtil::SendMessage(const Socket* conn, +bool DebuggerAgentUtil::SendMessage(Socket* conn, const v8::Handle<v8::String> request) { static const int kBufferSize = 80; char buffer[kBufferSize]; // Sending buffer both for header and body. @@ -428,24 +463,30 @@ bool DebuggerAgentUtil::SendMessage(const Socket* conn, v8::String::Utf8Value utf8_request(request); // Send the header. - int len; - len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), - "Content-Length: %d\r\n", utf8_request.length()); - conn->Send(buffer, len); + int len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), + "Content-Length: %d\r\n", utf8_request.length()); + if (conn->Send(buffer, len) < len) { + return false; + } // Terminate header with empty line. len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\r\n"); - conn->Send(buffer, len); + if (conn->Send(buffer, len) < len) { + return false; + } // Send message body as UTF-8. - conn->Send(*utf8_request, utf8_request.length()); + len = utf8_request.length(); + if (conn->Send(*utf8_request, len) < len) { + return false; + } return true; } // Receive the full buffer before returning unless an error occours. -int DebuggerAgentUtil::ReceiveAll(const Socket* conn, char* data, int len) { +int DebuggerAgentUtil::ReceiveAll(Socket* conn, char* data, int len) { int total_received = 0; while (total_received < len) { int received = conn->Receive(data + total_received, len - total_received); |