mirror of
https://github.com/polserver/polserver
synced 2026-08-13 08:23:08 -04:00
* Add exit_code to uo::Shutdown() Co-authored-by: Eric Swanson <eric.the.unicorn@gmail.com>
85 lines
2.2 KiB
C++
85 lines
2.2 KiB
C++
#include "clienttransmit.h"
|
|
|
|
#include "../../clib/esignal.h"
|
|
#include "../../clib/rawtypes.h"
|
|
#include "../globals/network.h"
|
|
#include "../polsem.h"
|
|
#include "client.h"
|
|
|
|
namespace Pol
|
|
{
|
|
namespace Network
|
|
{
|
|
ClientTransmit::ClientTransmit() : _transmitqueue() {}
|
|
|
|
ClientTransmit::~ClientTransmit() {}
|
|
|
|
void ClientTransmit::Cancel()
|
|
{
|
|
_transmitqueue.cancel();
|
|
}
|
|
void ClientTransmit::AddToQueue( Client* client, const void* data, int len )
|
|
{
|
|
const u8* message = static_cast<const u8*>( data );
|
|
auto transmitdata = TransmitDataSPtr( new TransmitData );
|
|
transmitdata->client = client->getWeakPtr();
|
|
transmitdata->len = len;
|
|
transmitdata->data.assign( message, message + len );
|
|
transmitdata->disconnects = false;
|
|
_transmitqueue.push_move( std::move( transmitdata ) );
|
|
}
|
|
|
|
void ClientTransmit::QueueDisconnection( Client* client )
|
|
{
|
|
auto transmitdata = TransmitDataSPtr( new TransmitData );
|
|
transmitdata->disconnects = true;
|
|
transmitdata->client = client->getWeakPtr();
|
|
_transmitqueue.push_move( std::move( transmitdata ) );
|
|
}
|
|
|
|
void ClientTransmit::QueueDelete( Client* client )
|
|
{
|
|
auto transmitdata = TransmitDataSPtr( new TransmitData );
|
|
transmitdata->remove = true;
|
|
transmitdata->client = client->getWeakPtr();
|
|
_transmitqueue.push_move( std::move( transmitdata ) );
|
|
}
|
|
|
|
TransmitDataSPtr ClientTransmit::NextQueueEntry()
|
|
{
|
|
auto transmitdata = TransmitDataSPtr();
|
|
_transmitqueue.pop_wait( &transmitdata );
|
|
return transmitdata;
|
|
}
|
|
|
|
void ClientTransmitThread()
|
|
{
|
|
ClientTransmit* transmit_instance = Core::networkManager.clientTransmit.get();
|
|
while ( !Clib::exit_signalled )
|
|
{
|
|
try
|
|
{
|
|
auto data = transmit_instance->NextQueueEntry();
|
|
if ( data->client.exists() )
|
|
{
|
|
if ( data->remove )
|
|
{
|
|
Core::PolLock lock;
|
|
Client::Delete( data->client.get_weakptr() );
|
|
}
|
|
else if ( data->disconnects )
|
|
{
|
|
data->client->forceDisconnect();
|
|
}
|
|
else if ( data->client->isReallyConnected() )
|
|
data->client->transmit( static_cast<void*>( &data->data[0] ), data->len, true );
|
|
}
|
|
}
|
|
catch ( ClientTransmitQueue::Canceled& )
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
} // namespace Network
|
|
} // namespace Pol
|