| Index: src/debug.h
|
| ===================================================================
|
| --- src/debug.h (revision 1647)
|
| +++ src/debug.h (working copy)
|
| @@ -495,7 +495,6 @@
|
| static bool HasCommands();
|
|
|
| static void ProcessHostDispatch(void* dispatch);
|
| - static void UpdateActiveDebugger();
|
| static Handle<Object> Call(Handle<JSFunction> fun,
|
| Handle<Object> data,
|
| bool* pending_exception);
|
| @@ -506,15 +505,22 @@
|
| // Stop the debugger agent.
|
| static void StopAgent();
|
|
|
| + // Unload the debugger if possible. Only called when no debugger is currently
|
| + // active.
|
| + static void UnloadDebugger();
|
| +
|
| inline static bool EventActive(v8::DebugEvent event) {
|
| + ScopedLock with(debugger_access_);
|
| +
|
| + // Check whether the message handler was been cleared.
|
| + if (message_handler_cleared_) {
|
| + UnloadDebugger();
|
| + }
|
| +
|
| // Currently argument event is not used.
|
| - return !Debugger::compiling_natives_ && Debugger::debugger_active_;
|
| + return !compiling_natives_ && Debugger::IsDebuggerActive();
|
| }
|
|
|
| - static void set_debugger_active(bool debugger_active) {
|
| - Debugger::debugger_active_ = debugger_active;
|
| - }
|
| - static bool debugger_active() { return Debugger::debugger_active_; }
|
| static void set_compiling_natives(bool compiling_natives) {
|
| Debugger::compiling_natives_ = compiling_natives;
|
| }
|
| @@ -523,13 +529,17 @@
|
| static bool is_loading_debugger() { return Debugger::is_loading_debugger_; }
|
|
|
| private:
|
| - static Handle<Object> event_listener_; // Global handle to listener
|
| + static bool IsDebuggerActive();
|
| +
|
| + static Mutex* debugger_access_; // Mutex guarding debugger variables.
|
| + static Handle<Object> event_listener_; // Global handle to listener.
|
| static Handle<Object> event_listener_data_;
|
| - static bool debugger_active_; // Are there any active debugger?
|
| static bool compiling_natives_; // Are we compiling natives?
|
| static bool is_loading_debugger_; // Are we loading the debugger?
|
| + static bool never_unload_debugger_; // Can we unload the debugger?
|
| static DebugMessageThread* message_thread_;
|
| static v8::DebugMessageHandler message_handler_;
|
| + static bool message_handler_cleared_; // Was message handler cleared?
|
| static void* message_handler_data_;
|
| static v8::DebugHostDispatchHandler host_dispatch_handler_;
|
| static void* host_dispatch_handler_data_;
|
| @@ -542,6 +552,7 @@
|
| static Semaphore* command_received_; // Signaled for each command received.
|
| static Semaphore* message_received_; // Signalled for each message send.
|
|
|
| + friend class EnterDebugger;
|
| friend class DebugMessageThread;
|
| };
|
|
|
| @@ -618,6 +629,13 @@
|
| StackGuard::DebugCommand();
|
| }
|
|
|
| + // If leaving the debugger with the debugger no longer active unload it.
|
| + if (prev_ == NULL) {
|
| + if (!Debugger::IsDebuggerActive()) {
|
| + Debugger::UnloadDebugger();
|
| + }
|
| + }
|
| +
|
| // Leaving this debugger entry.
|
| Debug::set_debugger_entry(prev_);
|
| }
|
|
|