[Net] Make StreamPeerTCP::_poll_connection explicit.
No longer hacked into `get_status` and renamed to `poll`. The old `poll` (for *nix `poll`, win `select`) is now called `wait`.
This commit is contained in:
parent
a5eed70fa2
commit
0e52867668
|
@ -93,7 +93,7 @@ RemoteDebuggerPeerTCP::~RemoteDebuggerPeerTCP() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteDebuggerPeerTCP::_write_out() {
|
void RemoteDebuggerPeerTCP::_write_out() {
|
||||||
while (tcp_client->poll(NetSocket::POLL_TYPE_OUT) == OK) {
|
while (tcp_client->get_status() == StreamPeerTCP::STATUS_CONNECTED && tcp_client->wait(NetSocket::POLL_TYPE_OUT) == OK) {
|
||||||
uint8_t *buf = out_buf.ptrw();
|
uint8_t *buf = out_buf.ptrw();
|
||||||
if (out_left <= 0) {
|
if (out_left <= 0) {
|
||||||
if (out_queue.size() == 0) {
|
if (out_queue.size() == 0) {
|
||||||
|
@ -119,7 +119,7 @@ void RemoteDebuggerPeerTCP::_write_out() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteDebuggerPeerTCP::_read_in() {
|
void RemoteDebuggerPeerTCP::_read_in() {
|
||||||
while (tcp_client->poll(NetSocket::POLL_TYPE_IN) == OK) {
|
while (tcp_client->get_status() == StreamPeerTCP::STATUS_CONNECTED && tcp_client->wait(NetSocket::POLL_TYPE_IN) == OK) {
|
||||||
uint8_t *buf = in_buf.ptrw();
|
uint8_t *buf = in_buf.ptrw();
|
||||||
if (in_left <= 0) {
|
if (in_left <= 0) {
|
||||||
if (in_queue.size() > max_queued_messages) {
|
if (in_queue.size() > max_queued_messages) {
|
||||||
|
@ -167,6 +167,7 @@ Error RemoteDebuggerPeerTCP::connect_to_host(const String &p_host, uint16_t p_po
|
||||||
tcp_client->connect_to_host(ip, port);
|
tcp_client->connect_to_host(ip, port);
|
||||||
|
|
||||||
for (int i = 0; i < tries; i++) {
|
for (int i = 0; i < tries; i++) {
|
||||||
|
tcp_client->poll();
|
||||||
if (tcp_client->get_status() == StreamPeerTCP::STATUS_CONNECTED) {
|
if (tcp_client->get_status() == StreamPeerTCP::STATUS_CONNECTED) {
|
||||||
print_verbose("Remote Debugger: Connected!");
|
print_verbose("Remote Debugger: Connected!");
|
||||||
break;
|
break;
|
||||||
|
@ -213,6 +214,7 @@ void RemoteDebuggerPeerTCP::poll() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteDebuggerPeerTCP::_poll() {
|
void RemoteDebuggerPeerTCP::_poll() {
|
||||||
|
tcp_client->poll();
|
||||||
if (connected) {
|
if (connected) {
|
||||||
_write_out();
|
_write_out();
|
||||||
_read_in();
|
_read_in();
|
||||||
|
|
|
@ -264,6 +264,9 @@ void HTTPClientTCP::close() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Error HTTPClientTCP::poll() {
|
Error HTTPClientTCP::poll() {
|
||||||
|
if (tcp_connection.is_valid()) {
|
||||||
|
tcp_connection->poll();
|
||||||
|
}
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case STATUS_RESOLVING: {
|
case STATUS_RESOLVING: {
|
||||||
ERR_FAIL_COND_V(resolving == IP::RESOLVER_INVALID_ID, ERR_BUG);
|
ERR_FAIL_COND_V(resolving == IP::RESOLVER_INVALID_ID, ERR_BUG);
|
||||||
|
|
|
@ -32,8 +32,28 @@
|
||||||
|
|
||||||
#include "core/config/project_settings.h"
|
#include "core/config/project_settings.h"
|
||||||
|
|
||||||
Error StreamPeerTCP::_poll_connection() {
|
Error StreamPeerTCP::poll() {
|
||||||
ERR_FAIL_COND_V(status != STATUS_CONNECTING || !_sock.is_valid() || !_sock->is_open(), FAILED);
|
if (status == STATUS_CONNECTED) {
|
||||||
|
Error err;
|
||||||
|
err = _sock->poll(NetSocket::POLL_TYPE_IN, 0);
|
||||||
|
if (err == OK) {
|
||||||
|
// FIN received
|
||||||
|
if (_sock->get_available_bytes() == 0) {
|
||||||
|
disconnect_from_host();
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Also poll write
|
||||||
|
err = _sock->poll(NetSocket::POLL_TYPE_IN_OUT, 0);
|
||||||
|
if (err != OK && err != ERR_BUSY) {
|
||||||
|
// Got an error
|
||||||
|
disconnect_from_host();
|
||||||
|
status = STATUS_ERROR;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
} else if (status != STATUS_CONNECTING) {
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
Error err = _sock->connect_to_host(peer_host, peer_port);
|
Error err = _sock->connect_to_host(peer_host, peer_port);
|
||||||
|
|
||||||
|
@ -121,22 +141,7 @@ Error StreamPeerTCP::connect_to_host(const IPAddress &p_host, int p_port) {
|
||||||
Error StreamPeerTCP::write(const uint8_t *p_data, int p_bytes, int &r_sent, bool p_block) {
|
Error StreamPeerTCP::write(const uint8_t *p_data, int p_bytes, int &r_sent, bool p_block) {
|
||||||
ERR_FAIL_COND_V(!_sock.is_valid(), ERR_UNAVAILABLE);
|
ERR_FAIL_COND_V(!_sock.is_valid(), ERR_UNAVAILABLE);
|
||||||
|
|
||||||
if (status == STATUS_NONE || status == STATUS_ERROR) {
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status != STATUS_CONNECTED) {
|
if (status != STATUS_CONNECTED) {
|
||||||
if (_poll_connection() != OK) {
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status != STATUS_CONNECTED) {
|
|
||||||
r_sent = 0;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_sock->is_open()) {
|
|
||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,17 +188,6 @@ Error StreamPeerTCP::read(uint8_t *p_buffer, int p_bytes, int &r_received, bool
|
||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == STATUS_CONNECTING) {
|
|
||||||
if (_poll_connection() != OK) {
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status != STATUS_CONNECTED) {
|
|
||||||
r_received = 0;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Error err;
|
Error err;
|
||||||
int to_read = p_bytes;
|
int to_read = p_bytes;
|
||||||
int total_read = 0;
|
int total_read = 0;
|
||||||
|
@ -251,28 +245,7 @@ bool StreamPeerTCP::is_connected_to_host() const {
|
||||||
return _sock.is_valid() && _sock->is_open() && (status == STATUS_CONNECTED || status == STATUS_CONNECTING);
|
return _sock.is_valid() && _sock->is_open() && (status == STATUS_CONNECTED || status == STATUS_CONNECTING);
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamPeerTCP::Status StreamPeerTCP::get_status() {
|
StreamPeerTCP::Status StreamPeerTCP::get_status() const {
|
||||||
if (status == STATUS_CONNECTING) {
|
|
||||||
_poll_connection();
|
|
||||||
} else if (status == STATUS_CONNECTED) {
|
|
||||||
Error err;
|
|
||||||
err = _sock->poll(NetSocket::POLL_TYPE_IN, 0);
|
|
||||||
if (err == OK) {
|
|
||||||
// FIN received
|
|
||||||
if (_sock->get_available_bytes() == 0) {
|
|
||||||
disconnect_from_host();
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Also poll write
|
|
||||||
err = _sock->poll(NetSocket::POLL_TYPE_IN_OUT, 0);
|
|
||||||
if (err != OK && err != ERR_BUSY) {
|
|
||||||
// Got an error
|
|
||||||
disconnect_from_host();
|
|
||||||
status = STATUS_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +260,7 @@ void StreamPeerTCP::disconnect_from_host() {
|
||||||
peer_port = 0;
|
peer_port = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error StreamPeerTCP::poll(NetSocket::PollType p_type, int timeout) {
|
Error StreamPeerTCP::wait(NetSocket::PollType p_type, int timeout) {
|
||||||
ERR_FAIL_COND_V(_sock.is_null() || !_sock->is_open(), ERR_UNAVAILABLE);
|
ERR_FAIL_COND_V(_sock.is_null() || !_sock->is_open(), ERR_UNAVAILABLE);
|
||||||
return _sock->poll(p_type, timeout);
|
return _sock->poll(p_type, timeout);
|
||||||
}
|
}
|
||||||
|
@ -347,6 +320,7 @@ void StreamPeerTCP::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("bind", "port", "host"), &StreamPeerTCP::bind, DEFVAL("*"));
|
ClassDB::bind_method(D_METHOD("bind", "port", "host"), &StreamPeerTCP::bind, DEFVAL("*"));
|
||||||
ClassDB::bind_method(D_METHOD("connect_to_host", "host", "port"), &StreamPeerTCP::_connect);
|
ClassDB::bind_method(D_METHOD("connect_to_host", "host", "port"), &StreamPeerTCP::_connect);
|
||||||
ClassDB::bind_method(D_METHOD("is_connected_to_host"), &StreamPeerTCP::is_connected_to_host);
|
ClassDB::bind_method(D_METHOD("is_connected_to_host"), &StreamPeerTCP::is_connected_to_host);
|
||||||
|
ClassDB::bind_method(D_METHOD("poll"), &StreamPeerTCP::poll);
|
||||||
ClassDB::bind_method(D_METHOD("get_status"), &StreamPeerTCP::get_status);
|
ClassDB::bind_method(D_METHOD("get_status"), &StreamPeerTCP::get_status);
|
||||||
ClassDB::bind_method(D_METHOD("get_connected_host"), &StreamPeerTCP::get_connected_host);
|
ClassDB::bind_method(D_METHOD("get_connected_host"), &StreamPeerTCP::get_connected_host);
|
||||||
ClassDB::bind_method(D_METHOD("get_connected_port"), &StreamPeerTCP::get_connected_port);
|
ClassDB::bind_method(D_METHOD("get_connected_port"), &StreamPeerTCP::get_connected_port);
|
||||||
|
|
|
@ -56,7 +56,6 @@ protected:
|
||||||
uint16_t peer_port = 0;
|
uint16_t peer_port = 0;
|
||||||
|
|
||||||
Error _connect(const String &p_address, int p_port);
|
Error _connect(const String &p_address, int p_port);
|
||||||
Error _poll_connection();
|
|
||||||
Error write(const uint8_t *p_data, int p_bytes, int &r_sent, bool p_block);
|
Error write(const uint8_t *p_data, int p_bytes, int &r_sent, bool p_block);
|
||||||
Error read(uint8_t *p_buffer, int p_bytes, int &r_received, bool p_block);
|
Error read(uint8_t *p_buffer, int p_bytes, int &r_received, bool p_block);
|
||||||
|
|
||||||
|
@ -74,12 +73,15 @@ public:
|
||||||
void disconnect_from_host();
|
void disconnect_from_host();
|
||||||
|
|
||||||
int get_available_bytes() const override;
|
int get_available_bytes() const override;
|
||||||
Status get_status();
|
Status get_status() const;
|
||||||
|
|
||||||
void set_no_delay(bool p_enabled);
|
void set_no_delay(bool p_enabled);
|
||||||
|
|
||||||
// Poll functions (wait or check for writable, readable)
|
// Poll socket updating its state.
|
||||||
Error poll(NetSocket::PollType p_type, int timeout = 0);
|
Error poll();
|
||||||
|
|
||||||
|
// Wait or check for writable, readable.
|
||||||
|
Error wait(NetSocket::PollType p_type, int timeout = 0);
|
||||||
|
|
||||||
// Read/Write from StreamPeer
|
// Read/Write from StreamPeer
|
||||||
Error put_data(const uint8_t *p_data, int p_bytes) override;
|
Error put_data(const uint8_t *p_data, int p_bytes) override;
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
Returns the local port to which this peer is bound.
|
Returns the local port to which this peer is bound.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_status">
|
<method name="get_status" qualifiers="const">
|
||||||
<return type="int" enum="StreamPeerTCP.Status" />
|
<return type="int" enum="StreamPeerTCP.Status" />
|
||||||
<description>
|
<description>
|
||||||
Returns the status of the connection, see [enum Status].
|
Returns the status of the connection, see [enum Status].
|
||||||
|
@ -63,6 +63,12 @@
|
||||||
Returns [code]true[/code] if this peer is currently connected or is connecting to a host, [code]false[/code] otherwise.
|
Returns [code]true[/code] if this peer is currently connected or is connecting to a host, [code]false[/code] otherwise.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="poll">
|
||||||
|
<return type="int" enum="Error" />
|
||||||
|
<description>
|
||||||
|
Poll the socket, updating its state. See [method get_status].
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="set_no_delay">
|
<method name="set_no_delay">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<argument index="0" name="enabled" type="bool" />
|
<argument index="0" name="enabled" type="bool" />
|
||||||
|
|
|
@ -273,6 +273,7 @@ void WSLClient::poll() {
|
||||||
return; // Not connected.
|
return; // Not connected.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_tcp->poll();
|
||||||
switch (_tcp->get_status()) {
|
switch (_tcp->get_status()) {
|
||||||
case StreamPeerTCP::STATUS_NONE:
|
case StreamPeerTCP::STATUS_NONE:
|
||||||
// Clean close
|
// Clean close
|
||||||
|
|
Loading…
Reference in New Issue