From 540ca05a80e23daafa191cdf24c07b3f8e37b47a Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Mon, 24 Feb 2020 06:21:15 +0100 Subject: [PATCH] Threaded networking for editor debugger. --- editor/debugger/editor_debugger_node.cpp | 44 +++- editor/debugger/editor_debugger_node.h | 39 ++-- editor/debugger/editor_debugger_server.cpp | 216 +++++++++++++++++++ editor/debugger/editor_debugger_server.h | 59 +++++ editor/debugger/script_editor_debugger.cpp | 74 +++---- editor/debugger/script_editor_debugger.h | 34 +-- editor/plugins/canvas_item_editor_plugin.cpp | 6 +- editor/plugins/script_editor_plugin.cpp | 1 - editor/plugins/spatial_editor_plugin.cpp | 10 +- modules/mono/mono_gd/gd_mono_utils.cpp | 2 +- 10 files changed, 385 insertions(+), 100 deletions(-) create mode 100644 editor/debugger/editor_debugger_server.cpp create mode 100644 editor/debugger/editor_debugger_server.h diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index fba86f2954b..825883cffe2 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -31,9 +31,12 @@ #include "editor_debugger_node.h" #include "editor/debugger/editor_debugger_tree.h" +#include "editor/debugger/script_editor_debugger.h" #include "editor/editor_log.h" #include "editor/editor_node.h" #include "editor/plugins/script_editor_plugin.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/tab_container.h" template void _for_all(TabContainer *p_node, const Func &p_func) { @@ -49,7 +52,6 @@ EditorDebuggerNode *EditorDebuggerNode::singleton = NULL; EditorDebuggerNode::EditorDebuggerNode() { if (!singleton) singleton = this; - server.instance(); add_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_LEFT)); add_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_stylebox("BottomPanelDebuggerOverride", "EditorStyles")->get_margin(MARGIN_RIGHT)); @@ -179,10 +181,9 @@ Error EditorDebuggerNode::start() { EditorNode::get_singleton()->make_bottom_panel_item_visible(this); } - int remote_port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port"); - const Error err = server->listen(remote_port); + server = Ref(EditorDebuggerServer::create_default()); + const Error err = server->start(); if (err != OK) { - EditorNode::get_log()->add_message(String("Error listening on port ") + itos(remote_port), EditorLog::MSG_TYPE_ERROR); return err; } set_process(true); @@ -191,9 +192,10 @@ Error EditorDebuggerNode::start() { } void EditorDebuggerNode::stop() { - if (server->is_listening()) { + if (server.is_valid()) { server->stop(); EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR); + server.unref(); } // Also close all debugging sessions. _for_all(tabs, [&](ScriptEditorDebugger *dbg) { @@ -231,9 +233,14 @@ void EditorDebuggerNode::_notification(int p_what) { break; } - if (p_what != NOTIFICATION_PROCESS || !server->is_listening()) + if (p_what != NOTIFICATION_PROCESS || !server.is_valid()) return; + if (!server.is_valid() || !server->is_active()) { + stop(); + return; + } + // Errors and warnings int error_count = 0; int warning_count = 0; @@ -293,9 +300,8 @@ void EditorDebuggerNode::_notification(int p_what) { if (tabs->get_tab_count() <= 4) { // Max 4 debugging sessions active. debugger = _add_debugger(); } else { - // We already have too many sessions, disconnecting new clients to prevent it from hanging. - // (Not keeping a reference to the connection will disconnect it) - server->take_connection(); + // We already have too many sessions, disconnecting new clients to prevent them from hanging. + server->take_connection()->close(); return; // Can't add, stop here. } } @@ -462,6 +468,26 @@ void EditorDebuggerNode::reload_scripts() { }); } +void EditorDebuggerNode::debug_next() { + get_default_debugger()->debug_next(); +} + +void EditorDebuggerNode::debug_step() { + get_default_debugger()->debug_step(); +} + +void EditorDebuggerNode::debug_break() { + get_default_debugger()->debug_break(); +} + +void EditorDebuggerNode::debug_continue() { + get_default_debugger()->debug_continue(); +} + +String EditorDebuggerNode::get_var_value(const String &p_var) const { + return get_default_debugger()->get_var_value(p_var); +} + // LiveEdit/Inspector void EditorDebuggerNode::request_remote_tree() { get_current_debugger()->request_remote_tree(); diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h index 13a1d6dcb38..6181ccdb5f8 100644 --- a/editor/debugger/editor_debugger_node.h +++ b/editor/debugger/editor_debugger_node.h @@ -31,17 +31,30 @@ #ifndef EDITOR_DEBUGGER_NODE_H #define EDITOR_DEBUGGER_NODE_H -#include "core/io/tcp_server.h" -#include "editor/debugger/script_editor_debugger.h" -#include "scene/gui/button.h" -#include "scene/gui/tab_container.h" +#include "editor/debugger/editor_debugger_server.h" +#include "scene/gui/margin_container.h" +class Button; class EditorDebuggerTree; +class EditorDebuggerRemoteObject; +class MenuButton; +class ScriptEditorDebugger; +class TabContainer; class EditorDebuggerNode : public MarginContainer { GDCLASS(EditorDebuggerNode, MarginContainer); +public: + enum CameraOverride { + OVERRIDE_NONE, + OVERRIDE_2D, + OVERRIDE_3D_1, // 3D Viewport 1 + OVERRIDE_3D_2, // 3D Viewport 2 + OVERRIDE_3D_3, // 3D Viewport 3 + OVERRIDE_3D_4 // 3D Viewport 4 + }; + private: enum Options { DEBUG_NEXT, @@ -71,7 +84,7 @@ private: } }; - Ref server = NULL; + Ref server; TabContainer *tabs = NULL; Button *debugger_button = NULL; MenuButton *script_menu = NULL; @@ -87,7 +100,7 @@ private: bool auto_switch_remote_scene_tree = false; bool debug_with_external_editor = false; bool hide_on_stop = true; - ScriptEditorDebugger::CameraOverride camera_override = ScriptEditorDebugger::OVERRIDE_NONE; + CameraOverride camera_override = OVERRIDE_NONE; Map breakpoints; ScriptEditorDebugger *_add_debugger(); @@ -130,10 +143,10 @@ public: ScriptEditorDebugger *get_default_debugger() const; ScriptEditorDebugger *get_debugger(int p_debugger) const; - void debug_next() { get_default_debugger()->debug_next(); } - void debug_step() { get_default_debugger()->debug_step(); } - void debug_break() { get_default_debugger()->debug_break(); } - void debug_continue() { get_default_debugger()->debug_continue(); } + void debug_next(); + void debug_step(); + void debug_break(); + void debug_continue(); void set_script_debug_button(MenuButton *p_button); @@ -141,7 +154,7 @@ public: debugger_button = p_button; } - String get_var_value(const String &p_var) const { return get_default_debugger()->get_var_value(p_var); } + String get_var_value(const String &p_var) const; Ref