mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-01-12 13:51:10 +01:00
Removed multiple poll thread support related things from the web server, that was a bad idea. Also implemented single threaded mode.
This commit is contained in:
parent
731dbb427c
commit
9106b5685e
@ -42,6 +42,7 @@ void HTTPServerConnection::update() {
|
|||||||
close();
|
close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tcp->get_status() != StreamPeerTCP::STATUS_CONNECTED) {
|
if (tcp->get_status() != StreamPeerTCP::STATUS_CONNECTED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -125,6 +126,7 @@ void HTTPServerConnection::send_redirect(Ref<WebServerRequest> request, const St
|
|||||||
CharString cs = s.utf8();
|
CharString cs = s.utf8();
|
||||||
peer->put_data((const uint8_t *)cs.get_data(), cs.size() - 1);
|
peer->put_data((const uint8_t *)cs.get_data(), cs.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTTPServerConnection::send(Ref<WebServerRequest> request) {
|
void HTTPServerConnection::send(Ref<WebServerRequest> request) {
|
||||||
String body = request->get_compiled_body();
|
String body = request->get_compiled_body();
|
||||||
|
|
||||||
@ -316,6 +318,12 @@ void HTTPServerSimple::poll() {
|
|||||||
|
|
||||||
//todo add connection limit
|
//todo add connection limit
|
||||||
while (server->is_connection_available()) {
|
while (server->is_connection_available()) {
|
||||||
|
_connections_lock.write_lock();
|
||||||
|
|
||||||
|
Ref<StreamPeerTCP> tcp = server->take_connection();
|
||||||
|
|
||||||
|
ERR_CONTINUE(!tcp.is_valid());
|
||||||
|
|
||||||
Ref<HTTPServerConnection> connection;
|
Ref<HTTPServerConnection> connection;
|
||||||
connection.instance();
|
connection.instance();
|
||||||
|
|
||||||
@ -325,11 +333,10 @@ void HTTPServerSimple::poll() {
|
|||||||
connection->use_ssl = use_ssl;
|
connection->use_ssl = use_ssl;
|
||||||
connection->key = key;
|
connection->key = key;
|
||||||
|
|
||||||
connection->tcp = server->take_connection();
|
connection->tcp = tcp;
|
||||||
connection->peer = connection->tcp;
|
connection->peer = connection->tcp;
|
||||||
connection->time = OS::get_singleton()->get_ticks_usec();
|
connection->time = OS::get_singleton()->get_ticks_usec();
|
||||||
|
|
||||||
_connections_lock.write_lock();
|
|
||||||
_connections.push_back(connection);
|
_connections.push_back(connection);
|
||||||
_connections_lock.write_unlock();
|
_connections_lock.write_unlock();
|
||||||
}
|
}
|
||||||
@ -472,6 +479,7 @@ void HTTPServerSimple::_worker_thread_func(void *data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ref<HTTPServerConnection> c = e->get();
|
Ref<HTTPServerConnection> c = e->get();
|
||||||
|
|
||||||
server->_connections.pop_front();
|
server->_connections.pop_front();
|
||||||
server->_connections_lock.write_unlock();
|
server->_connections_lock.write_unlock();
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ int WebServerSimple::get_bind_port() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_bind_port(const int val) {
|
void WebServerSimple::set_bind_port(const int val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_bind_port = val;
|
_bind_port = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,6 +47,7 @@ String WebServerSimple::get_bind_host() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_bind_host(const String &val) {
|
void WebServerSimple::set_bind_host(const String &val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_bind_host = val;
|
_bind_host = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,6 +56,7 @@ bool WebServerSimple::get_use_ssl() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_use_ssl(const bool val) {
|
void WebServerSimple::set_use_ssl(const bool val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_use_ssl = val;
|
_use_ssl = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,6 +65,7 @@ String WebServerSimple::get_ssl_key() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_ssl_key(const String &val) {
|
void WebServerSimple::set_ssl_key(const String &val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_ssl_key = val;
|
_ssl_key = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,6 +74,7 @@ String WebServerSimple::get_ssl_cert() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_ssl_cert(const String &val) {
|
void WebServerSimple::set_ssl_cert(const String &val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_ssl_cert = val;
|
_ssl_cert = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,15 +83,8 @@ bool WebServerSimple::get_use_poll_thread() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_use_poll_thread(const bool val) {
|
void WebServerSimple::set_use_poll_thread(const bool val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
_use_poll_thread = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
int WebServerSimple::get_poll_thread_count() {
|
_use_poll_thread = val;
|
||||||
return _poll_thread_count;
|
|
||||||
}
|
|
||||||
void WebServerSimple::set_poll_thread_count(const int val) {
|
|
||||||
ERR_FAIL_COND(_running);
|
|
||||||
_poll_thread_count = val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebServerSimple::get_use_worker_threads() {
|
bool WebServerSimple::get_use_worker_threads() {
|
||||||
@ -94,6 +92,7 @@ bool WebServerSimple::get_use_worker_threads() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_use_worker_threads(const bool val) {
|
void WebServerSimple::set_use_worker_threads(const bool val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_use_worker_threads = val;
|
_use_worker_threads = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +101,7 @@ int WebServerSimple::get_worker_thread_count() {
|
|||||||
}
|
}
|
||||||
void WebServerSimple::set_worker_thread_count(const int val) {
|
void WebServerSimple::set_worker_thread_count(const int val) {
|
||||||
ERR_FAIL_COND(_running);
|
ERR_FAIL_COND(_running);
|
||||||
|
|
||||||
_worker_thread_count = val;
|
_worker_thread_count = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ void WebServerSimple::_start() {
|
|||||||
server->_use_worker_threads = _use_worker_threads;
|
server->_use_worker_threads = _use_worker_threads;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_worker_thread_count < 0) {
|
if (_worker_thread_count <= 0) {
|
||||||
server->_thread_count = OS::get_singleton()->get_processor_count();
|
server->_thread_count = OS::get_singleton()->get_processor_count();
|
||||||
} else {
|
} else {
|
||||||
server->_thread_count = _worker_thread_count;
|
server->_thread_count = _worker_thread_count;
|
||||||
@ -146,21 +146,26 @@ void WebServerSimple::_start() {
|
|||||||
Error err;
|
Error err;
|
||||||
|
|
||||||
// Restart server.
|
// Restart server.
|
||||||
{
|
|
||||||
server_lock.write_lock();
|
server_lock.write_lock();
|
||||||
|
|
||||||
server->stop();
|
server->stop();
|
||||||
err = server->listen(bind_port, bind_ip, use_ssl, ssl_key, ssl_cert);
|
err = server->listen(bind_port, bind_ip, use_ssl, ssl_key, ssl_cert);
|
||||||
|
|
||||||
server_lock.write_unlock();
|
server_lock.write_unlock();
|
||||||
}
|
|
||||||
ERR_FAIL_COND_MSG(err != OK, "Error starting HTTP server:\n" + itos(err));
|
ERR_FAIL_COND_MSG(err != OK, "Error starting HTTP server:\n" + itos(err));
|
||||||
|
|
||||||
_running = true;
|
_running = true;
|
||||||
|
|
||||||
if (!server_thread) {
|
if (!_use_poll_thread || !OS::get_singleton()->can_use_threads()) {
|
||||||
server_thread = memnew(Thread);
|
set_process_internal(true);
|
||||||
server_thread->start(_server_thread_poll, this);
|
|
||||||
|
_single_threaded_poll = true;
|
||||||
|
} else {
|
||||||
|
_poll_thread = memnew(Thread);
|
||||||
|
_poll_thread->start(_server_thread_poll, this);
|
||||||
|
|
||||||
|
_single_threaded_poll = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,12 +178,14 @@ void WebServerSimple::_stop() {
|
|||||||
|
|
||||||
server->stop();
|
server->stop();
|
||||||
|
|
||||||
if (server_thread) {
|
if (_poll_thread) {
|
||||||
server_thread->wait_to_finish();
|
_poll_thread->wait_to_finish();
|
||||||
memdelete(server_thread);
|
memdelete(_poll_thread);
|
||||||
server_thread = nullptr;
|
_poll_thread = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_process_internal(false);
|
||||||
|
|
||||||
_running = false;
|
_running = false;
|
||||||
server_lock.write_unlock();
|
server_lock.write_unlock();
|
||||||
}
|
}
|
||||||
@ -191,7 +198,7 @@ WebServerSimple::WebServerSimple() {
|
|||||||
|
|
||||||
_use_worker_threads = true;
|
_use_worker_threads = true;
|
||||||
_use_poll_thread = true;
|
_use_poll_thread = true;
|
||||||
_poll_thread_count = 1;
|
_poll_thread = nullptr;
|
||||||
_worker_thread_count = 4;
|
_worker_thread_count = 4;
|
||||||
|
|
||||||
_running = false;
|
_running = false;
|
||||||
@ -200,16 +207,25 @@ WebServerSimple::WebServerSimple() {
|
|||||||
|
|
||||||
server.instance();
|
server.instance();
|
||||||
server->_web_server = this;
|
server->_web_server = this;
|
||||||
server_thread = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WebServerSimple::~WebServerSimple() {
|
WebServerSimple::~WebServerSimple() {
|
||||||
server->stop();
|
server->stop();
|
||||||
server_quit = true;
|
server_quit = true;
|
||||||
|
|
||||||
if (server_thread) {
|
if (_poll_thread) {
|
||||||
server_thread->wait_to_finish();
|
_poll_thread->wait_to_finish();
|
||||||
memdelete(server_thread);
|
memdelete(_poll_thread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebServerSimple::_notification(int p_what) {
|
||||||
|
if (p_what == NOTIFICATION_INTERNAL_PROCESS) {
|
||||||
|
if (_single_threaded_poll) {
|
||||||
|
server_lock.read_lock();
|
||||||
|
server->poll();
|
||||||
|
server_lock.read_unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,10 +254,6 @@ void WebServerSimple::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("set_use_poll_thread", "val"), &WebServerSimple::set_use_poll_thread);
|
ClassDB::bind_method(D_METHOD("set_use_poll_thread", "val"), &WebServerSimple::set_use_poll_thread);
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_poll_thread"), "set_use_poll_thread", "get_use_poll_thread");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_poll_thread"), "set_use_poll_thread", "get_use_poll_thread");
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_poll_thread_count"), &WebServerSimple::get_poll_thread_count);
|
|
||||||
ClassDB::bind_method(D_METHOD("set_poll_thread_count", "val"), &WebServerSimple::set_poll_thread_count);
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "poll_thread_count"), "set_poll_thread_count", "get_poll_thread_count");
|
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_use_worker_threads"), &WebServerSimple::get_use_worker_threads);
|
ClassDB::bind_method(D_METHOD("get_use_worker_threads"), &WebServerSimple::get_use_worker_threads);
|
||||||
ClassDB::bind_method(D_METHOD("set_use_worker_threads", "val"), &WebServerSimple::set_use_worker_threads);
|
ClassDB::bind_method(D_METHOD("set_use_worker_threads", "val"), &WebServerSimple::set_use_worker_threads);
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_worker_threads"), "set_use_worker_threads", "get_use_worker_threads");
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_worker_threads"), "set_use_worker_threads", "get_use_worker_threads");
|
||||||
@ -257,10 +269,9 @@ void WebServerSimple::_server_thread_poll(void *data) {
|
|||||||
WebServerSimple *ej = (WebServerSimple *)data;
|
WebServerSimple *ej = (WebServerSimple *)data;
|
||||||
while (!ej->server_quit) {
|
while (!ej->server_quit) {
|
||||||
OS::get_singleton()->delay_usec(1000);
|
OS::get_singleton()->delay_usec(1000);
|
||||||
{
|
|
||||||
ej->server_lock.read_lock();
|
ej->server_lock.read_lock();
|
||||||
ej->server->poll();
|
ej->server->poll();
|
||||||
ej->server_lock.read_unlock();
|
ej->server_lock.read_unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@ -65,9 +65,6 @@ public:
|
|||||||
bool get_use_poll_thread();
|
bool get_use_poll_thread();
|
||||||
void set_use_poll_thread(const bool val);
|
void set_use_poll_thread(const bool val);
|
||||||
|
|
||||||
int get_poll_thread_count();
|
|
||||||
void set_poll_thread_count(const int val);
|
|
||||||
|
|
||||||
bool get_use_worker_threads();
|
bool get_use_worker_threads();
|
||||||
void set_use_worker_threads(const bool val);
|
void set_use_worker_threads(const bool val);
|
||||||
|
|
||||||
@ -83,6 +80,8 @@ public:
|
|||||||
~WebServerSimple();
|
~WebServerSimple();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void _notification(int p_what);
|
||||||
|
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
int _bind_port;
|
int _bind_port;
|
||||||
@ -94,14 +93,15 @@ protected:
|
|||||||
String _ssl_cert;
|
String _ssl_cert;
|
||||||
|
|
||||||
bool _use_poll_thread;
|
bool _use_poll_thread;
|
||||||
int _poll_thread_count;
|
|
||||||
bool _use_worker_threads;
|
bool _use_worker_threads;
|
||||||
int _worker_thread_count;
|
int _worker_thread_count;
|
||||||
|
|
||||||
|
bool _single_threaded_poll;
|
||||||
|
|
||||||
Ref<HTTPServerSimple> server;
|
Ref<HTTPServerSimple> server;
|
||||||
bool server_quit;
|
bool server_quit;
|
||||||
RWLock server_lock;
|
RWLock server_lock;
|
||||||
Thread *server_thread;
|
Thread *_poll_thread;
|
||||||
bool _running;
|
bool _running;
|
||||||
|
|
||||||
static void _server_thread_poll(void *data);
|
static void _server_thread_poll(void *data);
|
||||||
|
Loading…
Reference in New Issue
Block a user