Ivan Socolsky
10 years ago
5 changed files with 61 additions and 54 deletions
@ -0,0 +1,34 @@ |
|||
var _ = require('lodash'); |
|||
var $ = require('preconditions').singleton(); |
|||
|
|||
var locks = {}; |
|||
|
|||
var Lock = function() { |
|||
this.taken = false; |
|||
this.queue = []; |
|||
}; |
|||
|
|||
Lock.prototype.free = function() { |
|||
if (this.queue.length > 0) { |
|||
var f = this.queue.shift(); |
|||
f(this); |
|||
} else { |
|||
this.taken = false; |
|||
} |
|||
}; |
|||
|
|||
Lock.get = function(key, callback) { |
|||
if (_.isUndefined(locks[key])) { |
|||
locks[key] = new Lock(); |
|||
} |
|||
var lock = locks[key]; |
|||
|
|||
if (lock.taken) { |
|||
lock.queue.push(callback); |
|||
} else { |
|||
lock.taken = true; |
|||
callback(lock); |
|||
} |
|||
}; |
|||
|
|||
module.exports = Lock; |
@ -1,34 +1,20 @@ |
|||
var _ = require('lodash'); |
|||
var $ = require('preconditions').singleton(); |
|||
var _ = require('lodash'); |
|||
var LocalLock = require('./locallock'); |
|||
var RemoteLock = require('locker'); |
|||
|
|||
var locks = {}; |
|||
|
|||
var Lock = function() { |
|||
this.taken = false; |
|||
this.queue = []; |
|||
}; |
|||
|
|||
Lock.prototype.free = function() { |
|||
if (this.queue.length > 0) { |
|||
var f = this.queue.shift(); |
|||
f(this); |
|||
} else { |
|||
this.taken = false; |
|||
} |
|||
}; |
|||
function Lock(opts) {}; |
|||
|
|||
Lock.get = function(key, callback) { |
|||
if (_.isUndefined(locks[key])) { |
|||
locks[key] = new Lock(); |
|||
} |
|||
var lock = locks[key]; |
|||
Lock.prototype.runLocked = function(token, cb, task) { |
|||
$.shouldBeDefined(token); |
|||
|
|||
if (lock.taken) { |
|||
lock.queue.push(callback); |
|||
} else { |
|||
lock.taken = true; |
|||
callback(lock); |
|||
} |
|||
LocalLock.get(token, function(lock) { |
|||
var _cb = function() { |
|||
cb.apply(null, arguments); |
|||
lock.free(); |
|||
}; |
|||
task(_cb); |
|||
}); |
|||
}; |
|||
|
|||
module.exports = Lock; |
|||
|
Loading…
Reference in new issue