Quellcode durchsuchen

Merge pull request #30998 from Calinou/cap-warnings-errors-per-second

Cap the number of warnings/errors per second rather than per frame
Rémi Verschelde vor 6 Jahren
Ursprung
Commit
365994a630
4 geänderte Dateien mit 64 neuen und 12 gelöschten Zeilen
  1. 50 7
      core/script_debugger_remote.cpp
  2. 5 1
      core/script_debugger_remote.h
  3. 5 2
      doc/classes/ProjectSettings.xml
  4. 4 2
      main/main.cpp

+ 50 - 7
core/script_debugger_remote.cpp

@@ -357,10 +357,11 @@ void ScriptDebuggerRemote::_get_output() {
 		locking = false;
 	}
 
-	if (n_errors_dropped > 0) {
+	if (n_errors_dropped == 1) {
+		// Only print one message about dropping per second
 		OutputError oe;
 		oe.error = "TOO_MANY_ERRORS";
-		oe.error_descr = "Too many errors! " + String::num_int64(n_errors_dropped) + " errors were dropped.";
+		oe.error_descr = "Too many errors! Ignoring errors for up to 1 second.";
 		oe.warning = false;
 		uint64_t time = OS::get_singleton()->get_ticks_msec();
 		oe.hr = time / 3600000;
@@ -368,7 +369,20 @@ void ScriptDebuggerRemote::_get_output() {
 		oe.sec = (time / 1000) % 60;
 		oe.msec = time % 1000;
 		errors.push_back(oe);
-		n_errors_dropped = 0;
+	}
+
+	if (n_warnings_dropped == 1) {
+		// Only print one message about dropping per second
+		OutputError oe;
+		oe.error = "TOO_MANY_WARNINGS";
+		oe.error_descr = "Too many warnings! Ignoring warnings for up to 1 second.";
+		oe.warning = true;
+		uint64_t time = OS::get_singleton()->get_ticks_msec();
+		oe.hr = time / 3600000;
+		oe.min = (time / 60000) % 60;
+		oe.sec = (time / 1000) % 60;
+		oe.msec = time % 1000;
+		errors.push_back(oe);
 	}
 
 	while (errors.size()) {
@@ -934,6 +948,19 @@ void ScriptDebuggerRemote::send_error(const String &p_func, const String &p_file
 	oe.msec = time % 1000;
 	Array cstack;
 
+	uint64_t ticks = OS::get_singleton()->get_ticks_usec() / 1000;
+	msec_count += ticks - last_msec;
+	last_msec = ticks;
+
+	if (msec_count > 1000) {
+		msec_count = 0;
+
+		err_count = 0;
+		n_errors_dropped = 0;
+		warn_count = 0;
+		n_warnings_dropped = 0;
+	}
+
 	cstack.resize(p_stack_info.size() * 3);
 	for (int i = 0; i < p_stack_info.size(); i++) {
 		cstack[i * 3 + 0] = p_stack_info[i].file;
@@ -942,15 +969,28 @@ void ScriptDebuggerRemote::send_error(const String &p_func, const String &p_file
 	}
 
 	oe.callstack = cstack;
+	if (oe.warning) {
+		warn_count++;
+	} else {
+		err_count++;
+	}
 
 	mutex->lock();
 
 	if (!locking && tcp_client->is_connected_to_host()) {
 
-		if (errors.size() >= max_errors_per_frame) {
-			n_errors_dropped++;
+		if (oe.warning) {
+			if (warn_count > max_warnings_per_second) {
+				n_warnings_dropped++;
+			} else {
+				errors.push_back(oe);
+			}
 		} else {
-			errors.push_back(oe);
+			if (err_count > max_errors_per_second) {
+				n_errors_dropped++;
+			} else {
+				errors.push_back(oe);
+			}
 		}
 	}
 
@@ -1070,10 +1110,13 @@ ScriptDebuggerRemote::ScriptDebuggerRemote() :
 		mutex(Mutex::create()),
 		max_messages_per_frame(GLOBAL_GET("network/limits/debugger_stdout/max_messages_per_frame")),
 		n_messages_dropped(0),
-		max_errors_per_frame(GLOBAL_GET("network/limits/debugger_stdout/max_errors_per_frame")),
+		max_errors_per_second(GLOBAL_GET("network/limits/debugger_stdout/max_errors_per_second")),
+		max_warnings_per_second(GLOBAL_GET("network/limits/debugger_stdout/max_warnings_per_second")),
 		n_errors_dropped(0),
 		max_cps(GLOBAL_GET("network/limits/debugger_stdout/max_chars_per_second")),
 		char_count(0),
+		err_count(0),
+		warn_count(0),
 		last_msec(0),
 		msec_count(0),
 		locking(false),

+ 5 - 1
core/script_debugger_remote.h

@@ -91,11 +91,15 @@ class ScriptDebuggerRemote : public ScriptDebugger {
 	int max_messages_per_frame;
 	int n_messages_dropped;
 	List<OutputError> errors;
-	int max_errors_per_frame;
+	int max_errors_per_second;
+	int max_warnings_per_second;
 	int n_errors_dropped;
+	int n_warnings_dropped;
 
 	int max_cps;
 	int char_count;
+	int err_count;
+	int warn_count;
 	uint64_t last_msec;
 	uint64_t msec_count;
 

+ 5 - 2
doc/classes/ProjectSettings.xml

@@ -650,12 +650,15 @@
 		<member name="network/limits/debugger_stdout/max_chars_per_second" type="int" setter="" getter="" default="2048">
 			Maximum amount of characters allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
 		</member>
-		<member name="network/limits/debugger_stdout/max_errors_per_frame" type="int" setter="" getter="" default="10">
-			Maximum amount of errors allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
+		<member name="network/limits/debugger_stdout/max_errors_per_second" type="int" setter="" getter="" default="100">
+			Maximum number of errors allowed to be sent as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
 		</member>
 		<member name="network/limits/debugger_stdout/max_messages_per_frame" type="int" setter="" getter="" default="10">
 			Maximum amount of messages allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
 		</member>
+		<member name="network/limits/debugger_stdout/max_warnings_per_second" type="int" setter="" getter="" default="100">
+			Maximum number of warnings allowed to be sent as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
+		</member>
 		<member name="network/limits/packet_peer_stream/max_buffer_po2" type="int" setter="" getter="" default="16">
 			Default size of packet peer stream for deserializing Godot data. Over this size, data is dropped.
 		</member>

+ 4 - 2
main/main.cpp

@@ -783,8 +783,10 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 	ProjectSettings::get_singleton()->set_custom_property_info("network/limits/debugger_stdout/max_chars_per_second", PropertyInfo(Variant::INT, "network/limits/debugger_stdout/max_chars_per_second", PROPERTY_HINT_RANGE, "0, 4096, 1, or_greater"));
 	GLOBAL_DEF("network/limits/debugger_stdout/max_messages_per_frame", 10);
 	ProjectSettings::get_singleton()->set_custom_property_info("network/limits/debugger_stdout/max_messages_per_frame", PropertyInfo(Variant::INT, "network/limits/debugger_stdout/max_messages_per_frame", PROPERTY_HINT_RANGE, "0, 20, 1, or_greater"));
-	GLOBAL_DEF("network/limits/debugger_stdout/max_errors_per_frame", 10);
-	ProjectSettings::get_singleton()->set_custom_property_info("network/limits/debugger_stdout/max_errors_per_frame", PropertyInfo(Variant::INT, "network/limits/debugger_stdout/max_errors_per_frame", PROPERTY_HINT_RANGE, "0, 20, 1, or_greater"));
+	GLOBAL_DEF("network/limits/debugger_stdout/max_errors_per_second", 100);
+	ProjectSettings::get_singleton()->set_custom_property_info("network/limits/debugger_stdout/max_errors_per_second", PropertyInfo(Variant::INT, "network/limits/debugger_stdout/max_errors_per_second", PROPERTY_HINT_RANGE, "0, 200, 1, or_greater"));
+	GLOBAL_DEF("network/limits/debugger_stdout/max_warnings_per_second", 100);
+	ProjectSettings::get_singleton()->set_custom_property_info("network/limits/debugger_stdout/max_warnings_per_second", PropertyInfo(Variant::INT, "network/limits/debugger_stdout/max_warnings_per_second", PROPERTY_HINT_RANGE, "0, 200, 1, or_greater"));
 
 	if (debug_mode == "remote") {