GenisysPro  for Minecraft PE/Windows 10 v1.1.x
Feature-rich server software for Minecraft PE and Windows 10 Edition
AsyncPool Class Reference

Public Member Functions

 __construct (Server $server, $size)
 
 getSize ()
 
 increaseSize ($newSize)
 
 submitTaskToWorker (AsyncTask $task, $worker)
 
 submitTask (AsyncTask $task)
 
 removeTasks ()
 
 collectTasks ()
 

Protected Attributes

 $size
 

Constructor & Destructor Documentation

◆ __construct()

__construct ( Server  $server,
  $size 
)

AsyncPool constructor.

Parameters
Server$server
$size
50  {
51  $this->server = $server;
52  $this->size = (int) $size;
53 
54  for($i = 0; $i < $this->size; ++$i){
55  $this->workerUsage[$i] = 0;
56  $this->workers[$i] = new AsyncWorker($this->server->getLogger(), $i + 1);
57  $this->workers[$i]->setClassLoader($this->server->getLoader());
58  $this->workers[$i]->start();
59  }
60  }

Member Function Documentation

◆ collectTasks()

collectTasks ( )
167  {
168  Timings::$schedulerAsyncTimer->startTiming();
169 
170  foreach($this->tasks as $task){
171  if($task->isFinished() and !$task->isRunning() and !$task->isCrashed()){
172 
173  if(!$task->hasCancelledRun()){
174  $task->onCompletion($this->server);
175  }
176 
177  $this->removeTask($task);
178  }elseif($task->isTerminated() or $task->isCrashed()){
179  $this->server->getLogger()->critical("Could not execute asynchronous task " . (new \ReflectionClass($task))->getShortName() . ": Task crashed");
180  $this->removeTask($task, true);
181  }
182  }
183 
184  Timings::$schedulerAsyncTimer->stopTiming();
185  }

◆ getSize()

getSize ( )
Returns
int
65  {
66  return $this->size;
67  }

◆ increaseSize()

increaseSize (   $newSize)
Parameters
$newSize
72  {
73  $newSize = (int) $newSize;
74  if($newSize > $this->size){
75  for($i = $this->size; $i < $newSize; ++$i){
76  $this->workerUsage[$i] = 0;
77  $this->workers[$i] = new AsyncWorker($this->server->getLogger(), $i + 1);
78  $this->workers[$i]->setClassLoader($this->server->getLoader());
79  $this->workers[$i]->start();
80  }
81  $this->size = $newSize;
82  }
83  }

◆ removeTasks()

removeTasks ( )
147  {
148  do{
149  foreach($this->tasks as $task){
150  $task->cancelRun();
151  $this->removeTask($task);
152  }
153 
154  if(count($this->tasks) > 0){
155  Server::microSleep(25000);
156  }
157  }while(count($this->tasks) > 0);
158 
159  for($i = 0; $i < $this->size; ++$i){
160  $this->workerUsage[$i] = 0;
161  }
162 
163  $this->taskWorkers = [];
164  $this->tasks = [];
165  }

◆ submitTask()

submitTask ( AsyncTask  $task)
Parameters
AsyncTask$task
109  {
110  if(isset($this->tasks[$task->getTaskId()]) or $task->isGarbage()){
111  return;
112  }
113 
114  $selectedWorker = mt_rand(0, $this->size - 1);
115  $selectedTasks = $this->workerUsage[$selectedWorker];
116  for($i = 0; $i < $this->size; ++$i){
117  if($this->workerUsage[$i] < $selectedTasks){
118  $selectedWorker = $i;
119  $selectedTasks = $this->workerUsage[$i];
120  }
121  }
122 
123  $this->submitTaskToWorker($task, $selectedWorker);
124  }

◆ submitTaskToWorker()

submitTaskToWorker ( AsyncTask  $task,
  $worker 
)
Parameters
AsyncTask$task
$worker
89  {
90  if(isset($this->tasks[$task->getTaskId()]) or $task->isGarbage()){
91  return;
92  }
93 
94  $worker = (int) $worker;
95  if($worker < 0 or $worker >= $this->size){
96  throw new \InvalidArgumentException("Invalid worker $worker");
97  }
98 
99  $this->tasks[$task->getTaskId()] = $task;
100 
101  $this->workers[$worker]->stack($task);
102  $this->workerUsage[$worker]++;
103  $this->taskWorkers[$task->getTaskId()] = $worker;
104  }

Field Documentation

◆ $size

$size
protected

The documentation for this class was generated from the following file: