Compare commits

...

2 Commits

Author SHA1 Message Date
Mr_Goldberg 60fbdcfdba
Fix build and makefile. 2020-05-02 00:54:55 -04:00
Mr_Goldberg 91dbf2f9b0
Fixed some networking api related threading 2020-05-01 22:56:53 -04:00
2 changed files with 26 additions and 10 deletions

View File

@ -2,7 +2,7 @@
CXX=clang++ CXX=clang++
CXX_FLAGS += -fPIC -std=c++11 CXX_FLAGS += -fPIC -std=c++11
LD_FLAGS += -shared -lprotobuf-lite -Wl,--no-undefined LD_FLAGS += -shared -lprotobuf-lite -ldl -Wl,--no-undefined
LIBRARY_NAME=libsteam_api.so LIBRARY_NAME=libsteam_api.so
RM = rm -f RM = rm -f

View File

@ -16,6 +16,7 @@
<http://www.gnu.org/licenses/>. */ <http://www.gnu.org/licenses/>. */
#include "base.h" #include "base.h"
#include <list>
//packet timeout in seconds for non connections //packet timeout in seconds for non connections
#define ORPHANED_PACKET_TIMEOUT (20) #define ORPHANED_PACKET_TIMEOUT (20)
@ -72,7 +73,8 @@ public ISteamNetworking
class RunEveryRunCB *run_every_runcb; class RunEveryRunCB *run_every_runcb;
std::recursive_mutex messages_mutex; std::recursive_mutex messages_mutex;
std::vector<Common_Message> messages; std::list<Common_Message> messages;
std::list<Common_Message> unprocessed_messages;
std::recursive_mutex connections_edit_mutex; std::recursive_mutex connections_edit_mutex;
std::vector<struct Steam_Networking_Connection> connections; std::vector<struct Steam_Networking_Connection> connections;
@ -131,6 +133,17 @@ void remove_connection(CSteamID id)
} }
} }
} }
{
auto msg = std::begin(unprocessed_messages);
while (msg != std::end(unprocessed_messages)) {
if (msg->source_id() == id.ConvertToUint64()) {
msg = messages.erase(msg);
} else {
++msg;
}
}
}
} }
SNetSocket_t create_connection_socket(CSteamID target, int nVirtualPort, uint32 nIP, uint16 nPort, SNetListenSocket_t id=0, enum steam_socket_connection_status status=SOCKET_CONNECTING, SNetSocket_t other_id=0) SNetSocket_t create_connection_socket(CSteamID target, int nVirtualPort, uint32 nIP, uint16 nPort, SNetListenSocket_t id=0, enum steam_socket_connection_status status=SOCKET_CONNECTING, SNetSocket_t other_id=0)
@ -817,9 +830,10 @@ void RunCallbacks()
{ {
std::lock_guard<std::recursive_mutex> lock(messages_mutex); std::lock_guard<std::recursive_mutex> lock(messages_mutex);
for (auto &msg : messages) { {
CSteamID source_id((uint64)msg.source_id()); auto msg = std::begin(unprocessed_messages);
if (!msg.network().processed()) { while (msg != std::end(unprocessed_messages)) {
CSteamID source_id((uint64)msg->source_id());
if (!connection_exists(source_id)) { if (!connection_exists(source_id)) {
if (new_connection_times.find(source_id) == new_connection_times.end()) { if (new_connection_times.find(source_id) == new_connection_times.end()) {
new_connections_to_call_cb.push(source_id); new_connections_to_call_cb.push(source_id);
@ -827,11 +841,13 @@ void RunCallbacks()
} }
} else { } else {
struct Steam_Networking_Connection *conn = get_or_create_connection(source_id); struct Steam_Networking_Connection *conn = get_or_create_connection(source_id);
conn->open_channels.insert(msg.network().channel()); conn->open_channels.insert(msg->network().channel());
} }
msg.mutable_network()->set_processed(true); msg->mutable_network()->set_processed(true);
msg.mutable_network()->set_time_processed(current_time); msg->mutable_network()->set_time_processed(current_time);
messages.push_back(*msg);
msg = unprocessed_messages.erase(msg);
} }
} }
@ -897,12 +913,12 @@ void Callback(Common_Message *msg)
}PRINT_DEBUG("\n"); }PRINT_DEBUG("\n");
#endif #endif
std::lock_guard<std::recursive_mutex> lock(messages_mutex);
if (msg->network().type() == Network::DATA) { if (msg->network().type() == Network::DATA) {
messages.push_back(Common_Message(*msg)); unprocessed_messages.push_back(Common_Message(*msg));
} }
if (msg->network().type() == Network::NEW_CONNECTION) { if (msg->network().type() == Network::NEW_CONNECTION) {
std::lock_guard<std::recursive_mutex> lock(messages_mutex);
auto msg_temp = std::begin(messages); auto msg_temp = std::begin(messages);
while (msg_temp != std::end(messages)) { while (msg_temp != std::end(messages)) {
//only delete processed to handle unreliable message arriving at the same time. //only delete processed to handle unreliable message arriving at the same time.