mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-19 09:54:10 +00:00
This used to cause problems in earlier versions of pthreads if PTHREADS_INHERIT_CLASSES was not used. This is no longer a problem in pthreads v3, because pthreads v3 copies passed threaded object classes under the hood, so there is no need to manually include them anymore. Additionally, the files in these paths don't exist anymore.
94 lines
2.4 KiB
PHP
94 lines
2.4 KiB
PHP
<?php
|
|
|
|
/*
|
|
*
|
|
* ____ _ _ __ __ _ __ __ ____
|
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* @author PocketMine Team
|
|
* @link http://www.pocketmine.net/
|
|
*
|
|
*
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace pocketmine;
|
|
|
|
/**
|
|
* This class must be extended by all custom threading classes
|
|
*/
|
|
abstract class Thread extends \Thread{
|
|
|
|
/** @var \ClassLoader */
|
|
protected $classLoader;
|
|
protected $isKilled = false;
|
|
|
|
public function getClassLoader(){
|
|
return $this->classLoader;
|
|
}
|
|
|
|
public function setClassLoader(\ClassLoader $loader = null){
|
|
if($loader === null){
|
|
$loader = Server::getInstance()->getLoader();
|
|
}
|
|
$this->classLoader = $loader;
|
|
}
|
|
|
|
/**
|
|
* Registers the class loader for this thread.
|
|
*
|
|
* WARNING: This method MUST be called from any descendent threads' run() method to make autoloading usable.
|
|
* If you do not do this, you will not be able to use new classes that were not loaded when the thread was started
|
|
* (unless you are using a custom autoloader).
|
|
*/
|
|
public function registerClassLoader(){
|
|
require(\pocketmine\PATH . "vendor/autoload.php");
|
|
if($this->classLoader !== null){
|
|
$this->classLoader->register(false);
|
|
}
|
|
}
|
|
|
|
public function start(?int $options = \PTHREADS_INHERIT_ALL){
|
|
ThreadManager::getInstance()->add($this);
|
|
|
|
if(!$this->isRunning() and !$this->isJoined() and !$this->isTerminated()){
|
|
if($this->getClassLoader() === null){
|
|
$this->setClassLoader();
|
|
}
|
|
return parent::start($options);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Stops the thread using the best way possible. Try to stop it yourself before calling this.
|
|
*/
|
|
public function quit(){
|
|
$this->isKilled = true;
|
|
|
|
$this->notify();
|
|
|
|
if(!$this->isJoined()){
|
|
if(!$this->isTerminated()){
|
|
$this->join();
|
|
}
|
|
}
|
|
|
|
ThreadManager::getInstance()->remove($this);
|
|
}
|
|
|
|
public function getThreadName() : string{
|
|
return (new \ReflectionClass($this))->getShortName();
|
|
}
|
|
}
|