Network: Fix locking issues around server map PacketWriter
This commit is contained in:
@@ -127,6 +127,8 @@ struct PacketWriter : SaveFilter {
|
|||||||
*/
|
*/
|
||||||
bool HasPackets()
|
bool HasPackets()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(this->mutex);
|
||||||
|
|
||||||
return this->packets != nullptr;
|
return this->packets != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,6 +140,7 @@ struct PacketWriter : SaveFilter {
|
|||||||
std::lock_guard<std::mutex> lock(this->mutex);
|
std::lock_guard<std::mutex> lock(this->mutex);
|
||||||
|
|
||||||
Packet *p = this->packets;
|
Packet *p = this->packets;
|
||||||
|
if (p == nullptr) return nullptr;
|
||||||
this->packets = p->next;
|
this->packets = p->next;
|
||||||
p->next = nullptr;
|
p->next = nullptr;
|
||||||
|
|
||||||
@@ -621,10 +624,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
|
|||||||
|
|
||||||
if (this->status == STATUS_MAP) {
|
if (this->status == STATUS_MAP) {
|
||||||
bool last_packet = false;
|
bool last_packet = false;
|
||||||
bool has_packets = false;
|
bool has_packets = true;
|
||||||
|
|
||||||
for (uint i = 0; (has_packets = this->savegame->HasPackets()) && i < sent_packets; i++) {
|
for (uint i = 0; i < sent_packets; i++) {
|
||||||
Packet *p = this->savegame->PopPacket();
|
Packet *p = this->savegame->PopPacket();
|
||||||
|
if (p == nullptr) {
|
||||||
|
has_packets = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
last_packet = p->buffer[2] == PACKET_SERVER_MAP_DONE;
|
last_packet = p->buffer[2] == PACKET_SERVER_MAP_DONE;
|
||||||
|
|
||||||
this->SendPacket(p);
|
this->SendPacket(p);
|
||||||
@@ -634,6 +641,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (has_packets) has_packets = this->savegame->HasPackets();
|
||||||
|
|
||||||
if (last_packet) {
|
if (last_packet) {
|
||||||
/* Done reading, make sure saving is done as well */
|
/* Done reading, make sure saving is done as well */
|
||||||
|
Reference in New Issue
Block a user