Skip to content

Commit

Permalink
Added proper timeout for blender rpc connection
Browse files Browse the repository at this point in the history
  • Loading branch information
mxaddict committed Jan 26, 2024
1 parent 17e7f85 commit 857586b
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 21 deletions.
60 changes: 39 additions & 21 deletions modules/gltf/editor/editor_import_blend_runner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,40 @@ Error EditorImportBlendRunner::do_import(const Dictionary &p_options) {
}
}

HTTPClient::Status EditorImportBlendRunner::connect_blender_rpc(const Ref<HTTPClient> &p_client, int p_timeout_usecs) {
p_client->connect_to_host("127.0.0.1", rpc_port);
HTTPClient::Status status = p_client->get_status();

int attempts = 1;
int wait_usecs = 1000;

bool done = false;
while (!done) {
OS::get_singleton()->delay_usec(wait_usecs);
status = p_client->get_status();
switch (status) {
case HTTPClient::STATUS_RESOLVING:
case HTTPClient::STATUS_CONNECTING: {
p_client->poll();
break;
}
case HTTPClient::STATUS_CONNECTED: {
done = true;
break;
}
default: {
if (attempts * wait_usecs < p_timeout_usecs) {
p_client->connect_to_host("127.0.0.1", rpc_port);
} else {
return status;
}
}
}
}

return status;
}

Error EditorImportBlendRunner::do_import_rpc(const Dictionary &p_options) {
kill_timer->stop();

Expand All @@ -217,25 +251,9 @@ Error EditorImportBlendRunner::do_import_rpc(const Dictionary &p_options) {

// Connect to RPC server.
Ref<HTTPClient> client = HTTPClient::create();
client->connect_to_host("127.0.0.1", rpc_port);

bool done = false;
while (!done) {
HTTPClient::Status status = client->get_status();
switch (status) {
case HTTPClient::STATUS_RESOLVING:
case HTTPClient::STATUS_CONNECTING: {
client->poll();
break;
}
case HTTPClient::STATUS_CONNECTED: {
done = true;
break;
}
default: {
ERR_FAIL_V_MSG(ERR_CONNECTION_ERROR, vformat("Unexpected status during RPC connection: %d", status));
}
}
HTTPClient::Status status = connect_blender_rpc(client, 1000000);
if (status != HTTPClient::STATUS_CONNECTED) {
ERR_FAIL_V_MSG(ERR_CONNECTION_ERROR, vformat("Unexpected status during RPC connection: %d", status));
}

// Send XML request.
Expand All @@ -246,9 +264,9 @@ Error EditorImportBlendRunner::do_import_rpc(const Dictionary &p_options) {
}

// Wait for response.
done = false;
bool done = false;
while (!done) {
HTTPClient::Status status = client->get_status();
status = client->get_status();
switch (status) {
case HTTPClient::STATUS_REQUESTING: {
client->poll();
Expand Down
2 changes: 2 additions & 0 deletions modules/gltf/editor/editor_import_blend_runner.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

#ifdef TOOLS_ENABLED

#include "core/io/http_client.h"
#include "core/os/os.h"
#include "scene/main/node.h"
#include "scene/main/timer.h"
Expand Down Expand Up @@ -60,6 +61,7 @@ class EditorImportBlendRunner : public Node {
bool is_running() { return blender_pid != 0 && OS::get_singleton()->is_process_running(blender_pid); }
bool is_using_rpc() { return rpc_port != 0; }
Error do_import(const Dictionary &p_options);
HTTPClient::Status connect_blender_rpc(const Ref<HTTPClient> &p_client, int p_timeout_usecs);

EditorImportBlendRunner();
};
Expand Down

0 comments on commit 857586b

Please sign in to comment.