1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_DEBUG_AGENT_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_DEBUG_AGENT_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "../include/v8-debug.h" 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h" 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Forward decelrations. 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DebuggerAgentSession; 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Debugger agent which starts a socket listener on the debugger port and 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// handles connection from a remote debugger. 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DebuggerAgent: public Thread { 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DebuggerAgent(const char* name, int port) 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Thread(name), 483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch isolate_(Isolate::Current()), 499fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block name_(StrDup(name)), port_(port), 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block server_(OS::CreateSocket()), terminate_(false), 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block session_access_(OS::CreateMutex()), session_(NULL), 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block terminate_now_(OS::CreateSemaphore(0)), 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block listening_(OS::CreateSemaphore(0)) { 543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(isolate_->debugger_agent_instance() == NULL); 553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch isolate_->set_debugger_agent_instance(this); 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ~DebuggerAgent() { 583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch isolate_->set_debugger_agent_instance(NULL); 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block delete server_; 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Shutdown(); 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void WaitUntilListening(); 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Isolate* isolate() { return isolate_; } 663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Run(); 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void CreateSession(Socket* socket); 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void DebuggerMessage(const v8::Debug::Message& message); 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void CloseSession(); 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void OnSessionClosed(DebuggerAgentSession* session); 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Isolate* isolate_; 75589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch SmartArrayPointer<const char> name_; // Name of the embedding application. 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int port_; // Port to use for the agent. 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Socket* server_; // Server socket for listen/accept. 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool terminate_; // Termination flag. 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Mutex* session_access_; // Mutex guarging access to session_. 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DebuggerAgentSession* session_; // Current active session if any. 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Semaphore* terminate_now_; // Semaphore to signal termination. 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Semaphore* listening_; 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class DebuggerAgentSession; 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend void DebuggerAgentMessageHandler(const v8::Debug::Message& message); 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_COPY_AND_ASSIGN(DebuggerAgent); 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Debugger agent session. The session receives requests from the remote 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// debugger and sends debugger events/responses to the remote debugger. 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DebuggerAgentSession: public Thread { 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DebuggerAgentSession(DebuggerAgent* agent, Socket* client) 963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Thread("v8:DbgAgntSessn"), 979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block agent_(agent), client_(client) {} 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void DebuggerMessage(Vector<uint16_t> message); 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Shutdown(); 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Run(); 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void DebuggerMessage(Vector<char> message); 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DebuggerAgent* agent_; 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Socket* client_; 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_COPY_AND_ASSIGN(DebuggerAgentSession); 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Utility methods factored out to be used by the D8 shell as well. 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DebuggerAgentUtil { 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const kContentLength; 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 119589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static SmartArrayPointer<char> ReceiveMessage(const Socket* conn); 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool SendConnectMessage(const Socket* conn, 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* embedding_host); 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool SendMessage(const Socket* conn, const Vector<uint16_t> message); 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool SendMessage(const Socket* conn, 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const v8::Handle<v8::String> message); 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int ReceiveAll(const Socket* conn, char* data, int len); 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // ENABLE_DEBUGGER_SUPPORT 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_DEBUG_AGENT_H_ 133