summaryrefslogtreecommitdiffstats
path: root/platform/web
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-02-07 15:59:11 +0100
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2024-02-07 20:40:12 +0100
commitfdf6fa82c3753534d367c6b07576c832417a86a3 (patch)
treec0d1953b8b5b6865888a117e66267821a72fbf05 /platform/web
parent222214c05fa621501191026064f9d6f6e02fa7b1 (diff)
downloadredot-engine-fdf6fa82c3753534d367c6b07576c832417a86a3.tar.gz
[Web] Move polling thread to EditorHTTPServer
Diffstat (limited to 'platform/web')
-rw-r--r--platform/web/export/editor_http_server.cpp93
-rw-r--r--platform/web/export/editor_http_server.h9
-rw-r--r--platform/web/export/export_plugin.cpp29
-rw-r--r--platform/web/export/export_plugin.h5
4 files changed, 72 insertions, 64 deletions
diff --git a/platform/web/export/editor_http_server.cpp b/platform/web/export/editor_http_server.cpp
index 87420e457f..0ccd4b8782 100644
--- a/platform/web/export/editor_http_server.cpp
+++ b/platform/web/export/editor_http_server.cpp
@@ -30,6 +30,17 @@
#include "editor_http_server.h"
+void EditorHTTPServer::_server_thread_poll(void *data) {
+ EditorHTTPServer *web_server = static_cast<EditorHTTPServer *>(data);
+ while (!web_server->server_quit.get()) {
+ OS::get_singleton()->delay_usec(6900);
+ {
+ MutexLock lock(web_server->server_lock);
+ web_server->_poll();
+ }
+ }
+}
+
void EditorHTTPServer::_clear_client() {
peer = Ref<StreamPeer>();
tls = Ref<StreamPeerTLS>();
@@ -117,37 +128,7 @@ void EditorHTTPServer::_send_response() {
}
}
-void EditorHTTPServer::stop() {
- server->stop();
- _clear_client();
-}
-
-Error EditorHTTPServer::listen(int p_port, IPAddress p_address, bool p_use_tls, String p_tls_key, String p_tls_cert) {
- use_tls = p_use_tls;
- if (use_tls) {
- Ref<Crypto> crypto = Crypto::create();
- if (crypto.is_null()) {
- return ERR_UNAVAILABLE;
- }
- if (!p_tls_key.is_empty() && !p_tls_cert.is_empty()) {
- key = Ref<CryptoKey>(CryptoKey::create());
- Error err = key->load(p_tls_key);
- ERR_FAIL_COND_V(err != OK, err);
- cert = Ref<X509Certificate>(X509Certificate::create());
- err = cert->load(p_tls_cert);
- ERR_FAIL_COND_V(err != OK, err);
- } else {
- _set_internal_certs(crypto);
- }
- }
- return server->listen(p_port, p_address);
-}
-
-bool EditorHTTPServer::is_listening() const {
- return server->is_listening();
-}
-
-void EditorHTTPServer::poll() {
+void EditorHTTPServer::_poll() {
if (!server->is_listening()) {
return;
}
@@ -211,6 +192,52 @@ void EditorHTTPServer::poll() {
}
}
+void EditorHTTPServer::stop() {
+ server_quit.set(true);
+ if (server_thread.is_started()) {
+ server_thread.wait_to_finish();
+ }
+ if (server.is_valid()) {
+ server->stop();
+ }
+ _clear_client();
+}
+
+Error EditorHTTPServer::listen(int p_port, IPAddress p_address, bool p_use_tls, String p_tls_key, String p_tls_cert) {
+ MutexLock lock(server_lock);
+ if (server->is_listening()) {
+ return ERR_ALREADY_IN_USE;
+ }
+ use_tls = p_use_tls;
+ if (use_tls) {
+ Ref<Crypto> crypto = Crypto::create();
+ if (crypto.is_null()) {
+ return ERR_UNAVAILABLE;
+ }
+ if (!p_tls_key.is_empty() && !p_tls_cert.is_empty()) {
+ key = Ref<CryptoKey>(CryptoKey::create());
+ Error err = key->load(p_tls_key);
+ ERR_FAIL_COND_V(err != OK, err);
+ cert = Ref<X509Certificate>(X509Certificate::create());
+ err = cert->load(p_tls_cert);
+ ERR_FAIL_COND_V(err != OK, err);
+ } else {
+ _set_internal_certs(crypto);
+ }
+ }
+ Error err = server->listen(p_port, p_address);
+ if (err == OK) {
+ server_quit.set(false);
+ server_thread.start(_server_thread_poll, this);
+ }
+ return err;
+}
+
+bool EditorHTTPServer::is_listening() const {
+ MutexLock lock(server_lock);
+ return server->is_listening();
+}
+
EditorHTTPServer::EditorHTTPServer() {
mimes["html"] = "text/html";
mimes["js"] = "application/javascript";
@@ -222,3 +249,7 @@ EditorHTTPServer::EditorHTTPServer() {
server.instantiate();
stop();
}
+
+EditorHTTPServer::~EditorHTTPServer() {
+ stop();
+}
diff --git a/platform/web/export/editor_http_server.h b/platform/web/export/editor_http_server.h
index 02e8665ca6..8f5f69cc1e 100644
--- a/platform/web/export/editor_http_server.h
+++ b/platform/web/export/editor_http_server.h
@@ -51,17 +51,24 @@ private:
uint8_t req_buf[4096];
int req_pos = 0;
+ SafeNumeric<bool> server_quit;
+ Mutex server_lock;
+ Thread server_thread;
+
void _clear_client();
void _set_internal_certs(Ref<Crypto> p_crypto);
void _send_response();
+ void _poll();
+
+ static void _server_thread_poll(void *data);
public:
EditorHTTPServer();
+ ~EditorHTTPServer();
void stop();
Error listen(int p_port, IPAddress p_address, bool p_use_tls, String p_tls_key, String p_tls_cert);
bool is_listening() const;
- void poll();
};
#endif // WEB_EDITOR_HTTP_SERVER_H
diff --git a/platform/web/export/export_plugin.cpp b/platform/web/export/export_plugin.cpp
index e2967ee8b8..706bfca8ba 100644
--- a/platform/web/export/export_plugin.cpp
+++ b/platform/web/export/export_plugin.cpp
@@ -584,7 +584,6 @@ bool EditorExportPlatformWeb::poll_export() {
menu_options = preset.is_valid();
if (server->is_listening()) {
if (menu_options == 0) {
- MutexLock lock(server_lock);
server->stop();
} else {
menu_options += 1;
@@ -603,7 +602,6 @@ int EditorExportPlatformWeb::get_options_count() const {
Error EditorExportPlatformWeb::run(const Ref<EditorExportPreset> &p_preset, int p_option, int p_debug_flags) {
if (p_option == 1) {
- MutexLock lock(server_lock);
server->stop();
return OK;
}
@@ -653,12 +651,8 @@ Error EditorExportPlatformWeb::run(const Ref<EditorExportPreset> &p_preset, int
const String tls_cert = EDITOR_GET("export/web/tls_certificate");
// Restart server.
- {
- MutexLock lock(server_lock);
-
- server->stop();
- err = server->listen(bind_port, bind_ip, use_tls, tls_key, tls_cert);
- }
+ server->stop();
+ err = server->listen(bind_port, bind_ip, use_tls, tls_key, tls_cert);
if (err != OK) {
add_message(EXPORT_MESSAGE_ERROR, TTR("Run"), vformat(TTR("Error starting HTTP server: %d."), err));
return err;
@@ -674,21 +668,9 @@ Ref<Texture2D> EditorExportPlatformWeb::get_run_icon() const {
return run_icon;
}
-void EditorExportPlatformWeb::_server_thread_poll(void *data) {
- EditorExportPlatformWeb *ej = static_cast<EditorExportPlatformWeb *>(data);
- while (!ej->server_quit.get()) {
- OS::get_singleton()->delay_usec(6900);
- {
- MutexLock lock(ej->server_lock);
- ej->server->poll();
- }
- }
-}
-
EditorExportPlatformWeb::EditorExportPlatformWeb() {
if (EditorNode::get_singleton()) {
server.instantiate();
- server_thread.start(_server_thread_poll, this);
#ifdef MODULE_SVG_ENABLED
Ref<Image> img = memnew(Image);
@@ -711,11 +693,4 @@ EditorExportPlatformWeb::EditorExportPlatformWeb() {
}
EditorExportPlatformWeb::~EditorExportPlatformWeb() {
- if (server.is_valid()) {
- server->stop();
- }
- server_quit.set(true);
- if (server_thread.is_started()) {
- server_thread.wait_to_finish();
- }
}
diff --git a/platform/web/export/export_plugin.h b/platform/web/export/export_plugin.h
index c73d6d6794..952d03cdb4 100644
--- a/platform/web/export/export_plugin.h
+++ b/platform/web/export/export_plugin.h
@@ -52,9 +52,6 @@ class EditorExportPlatformWeb : public EditorExportPlatform {
int menu_options = 0;
Ref<EditorHTTPServer> server;
- SafeNumeric<bool> server_quit;
- Mutex server_lock;
- Thread server_thread;
String _get_template_name(bool p_extension, bool p_thread_support, bool p_debug) const {
String name = "web";
@@ -99,8 +96,6 @@ class EditorExportPlatformWeb : public EditorExportPlatform {
Error _build_pwa(const Ref<EditorExportPreset> &p_preset, const String p_path, const Vector<SharedObject> &p_shared_objects);
Error _write_or_error(const uint8_t *p_content, int p_len, String p_path);
- static void _server_thread_poll(void *data);
-
public:
virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) const override;