You are here

protected function RuntimeMeasurementTracker::initializeCounters in Purge 8.3

Intialize or reinitialize the counter objects.

Throws

\LogicException Thrown when $this->purgers isn't initialized.

1 call to RuntimeMeasurementTracker::initializeCounters()
RuntimeMeasurementTracker::setPurgers in src/Plugin/Purge/Purger/RuntimeMeasurementTracker.php
Set all purger plugin instances.

File

src/Plugin/Purge/Purger/RuntimeMeasurementTracker.php, line 61

Class

RuntimeMeasurementTracker
Provides the tracker that tracks RuntimeMeasurement objects for purgers.

Namespace

Drupal\purge\Plugin\Purge\Purger

Code

protected function initializeCounters() {
  if (is_null($this->purgers)) {
    throw new \LogicException('$this->purgers is still NULL, call ::setPurgers.');
  }

  // Generate state keys for participating purger plugins.
  $this->stateKeys = [];
  foreach ($this->purgers as $purger) {
    if ($purger
      ->hasRuntimeMeasurement()) {
      $id = $purger
        ->getId();
      $this->stateKeys[$id] = 'purge_purger_measurement_' . $id;
    }
  }

  // Prefetch counter values, instantiate and then associate counter objects.
  if (count($this->stateKeys)) {
    $values = $this->state
      ->getMultiple($this->stateKeys);
    foreach ($this->stateKeys as $id => $key) {
      if (isset($this->buffer[$key])) {
        $values[$key] = $this->buffer[$key];
      }
      if (!isset($values[$key])) {
        $values[$key] = 0.0;
      }

      // Instantiate (or overwrite) the counter objects and pass a closure as
      // write callback. The closure writes changed values to $this->buffer.
      $measurement = new RuntimeMeasurement($values[$key]);
      $measurement
        ->disableDecrement();
      $measurement
        ->disableIncrement();
      $measurement
        ->setWriteCallback(function ($value) use ($key) {
        $this->buffer[$key] = $value;
      });

      // To start and stop measurement, PurgersServiceInterface::invalidate()
      // needs to access ::start() and ::stop(), so we need to add the counter
      // to the purger. Once ::invalidate() did its work, this will lead to
      // calls to ::setDirectly() within the counter and this in fact, will
      // lead back here as that calls our write callback.
      $this->purgers[$id]
        ->setRuntimeMeasurement($measurement);
    }
  }
}