Network: clean up ticking handling, RakLib only processes on Snooze notification

This commit is contained in:
Dylan K. Taylor 2018-08-02 17:13:34 +01:00
parent 7560880168
commit e43496e7e4
4 changed files with 18 additions and 23 deletions

View File

@ -2537,7 +2537,7 @@ class Server{
++$this->tickCounter; ++$this->tickCounter;
Timings::$connectionTimer->startTiming(); Timings::$connectionTimer->startTiming();
$this->network->processInterfaces(); $this->network->tickInterfaces();
Timings::$connectionTimer->stopTiming(); Timings::$connectionTimer->stopTiming();
Timings::$schedulerTimer->startTiming(); Timings::$schedulerTimer->startTiming();

View File

@ -80,26 +80,22 @@ class Network{
return $this->interfaces; return $this->interfaces;
} }
public function processInterfaces() : void{ public function tickInterfaces() : void{
foreach($this->interfaces as $interface){ foreach($this->interfaces as $interface){
$this->processInterface($interface); try{
} $interface->tick();
} }catch(\Exception $e){
$logger = $this->server->getLogger();
if(\pocketmine\DEBUG > 1){
$logger->logException($e);
}
public function processInterface(NetworkInterface $interface) : void{ $this->server->getPluginManager()->callEvent(new NetworkInterfaceCrashEvent($interface, $e));
try{
$interface->process(); $interface->emergencyShutdown();
}catch(\Throwable $e){ $this->unregisterInterface($interface);
$logger = $this->server->getLogger(); $logger->critical($this->server->getLanguage()->translateString("pocketmine.server.networkError", [get_class($interface), $e->getMessage()]));
if(\pocketmine\DEBUG > 1){
$logger->logException($e);
} }
$this->server->getPluginManager()->callEvent(new NetworkInterfaceCrashEvent($interface, $e));
$interface->emergencyShutdown();
$this->unregisterInterface($interface);
$logger->critical($this->server->getLanguage()->translateString("pocketmine.server.networkError", [get_class($interface), $e->getMessage()]));
} }
} }

View File

@ -63,7 +63,7 @@ interface NetworkInterface{
/** /**
* Called every tick to process events on the interface. * Called every tick to process events on the interface.
*/ */
public function process() : void; public function tick() : void;
/** /**
* Gracefully shuts down the network interface. * Gracefully shuts down the network interface.

View File

@ -71,7 +71,8 @@ class RakLibInterface implements ServerInstance, AdvancedNetworkInterface{
$this->sleeper = new SleeperNotifier(); $this->sleeper = new SleeperNotifier();
$server->getTickSleeper()->addNotifier($this->sleeper, function() : void{ $server->getTickSleeper()->addNotifier($this->sleeper, function() : void{
$this->server->getNetwork()->processInterface($this); //this should not throw any exception. If it does, this should crash the server since it's a fault condition.
while($this->interface->handlePacket());
}); });
$this->rakLib = new RakLibServer( $this->rakLib = new RakLibServer(
@ -93,9 +94,7 @@ class RakLibInterface implements ServerInstance, AdvancedNetworkInterface{
$this->network = $network; $this->network = $network;
} }
public function process() : void{ public function tick() : void{
while($this->interface->handlePacket()){}
if(!$this->rakLib->isRunning() and !$this->rakLib->isShutdown()){ if(!$this->rakLib->isRunning() and !$this->rakLib->isShutdown()){
throw new \Exception("RakLib Thread crashed"); throw new \Exception("RakLib Thread crashed");
} }