Semaphore.js 681 B

12345678910111213141516171819202122232425262728
  1. var Class = require('./Class');
  2. var Queue = require('./Queue');
  3. exports = Class({
  4. initialize: function Semaphore() {
  5. var counter =
  6. arguments.length > 0 && arguments[0] !== undefined
  7. ? arguments[0]
  8. : 1;
  9. this._counter = counter;
  10. this._tasks = new Queue();
  11. },
  12. wait: function(fn) {
  13. if (this._counter > 0) {
  14. this._counter--;
  15. return fn();
  16. }
  17. this._tasks.enqueue(fn);
  18. },
  19. signal: function() {
  20. var task = this._tasks.dequeue();
  21. if (task) {
  22. return task();
  23. }
  24. this._counter++;
  25. }
  26. });
  27. module.exports = exports;