NGL@1.0.0-beta.7 Home Manual Reference Source Gallery

src/worker/worker-pool.js

/**
 * @file Worker Pool
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 * @private
 */

import Worker from './worker.js'

function WorkerPool (name, maxCount) {
  maxCount = Math.min(8, maxCount || 2)

  var pool = []
  var count = 0

    // API

  this.name = name

  this.maxCount = maxCount

  this.post = function (aMessage, transferList, onmessage, onerror) {
    var worker = this.getNextWorker()
    worker.post(aMessage, transferList, onmessage, onerror)

    return this
  }

  this.terminate = function () {
    pool.forEach(function (worker) {
      worker.terminate()
    })
  }

  this.getNextWorker = function () {
    var nextWorker
    var minPending = Infinity

    for (var i = 0; i < maxCount; ++i) {
      if (i >= count) {
        nextWorker = new Worker(name)
        pool.push(nextWorker)
        count += 1
        break
      }

      var worker = pool[ i ]

      if (worker.pending === 0) {
        nextWorker = worker
        break
      } else if (worker.pending < minPending) {
        minPending = worker.pending
        nextWorker = worker
      }
    }

    return nextWorker
  }

  Object.defineProperties(this, {
    count: {
      get: function () { return count }
    }
  })
}

WorkerPool.prototype.constructor = WorkerPool

export default WorkerPool