Skip to content

Instantly share code, notes, and snippets.

@clusterfudge
Created August 23, 2013 22:58
Show Gist options
  • Save clusterfudge/6324798 to your computer and use it in GitHub Desktop.
Save clusterfudge/6324798 to your computer and use it in GitHub Desktop.
Read/write locking for javascript.... maybe? Stack overflow?
var Lock = function() {
this.readLocks = [];
this.writeLocks = [];
}
Lock.prototype.getReadLock = function(callback) {
var self = this;
if (this.writeLocks.length > 0) {
setTimeout(function() {self.getReadLock(callback);}, 5);
} else {
self.readLocks.push(true);
var released = false;
try {
if (callback) {
callback(function() {
self.readLocks.pop();
released = true;
});
}
} catch (ex) {
if (!released) {
self.readLocks.pop();
}
throw ex;
}
}
}
Lock.prototype.getWriteLock = function(callback) {
var self = this;
var release = function() {
self.writeLocks.shift();
}
if (self.writeLocks.length > 0) {
setTimeout(function() {self.getWriteLock(callback);}, 10);
return;
}
self.writeLocks.push(function() {callback(release);});
var invokeWriteCallback = function() {
if (self.readLocks.length == 0) {
var cb = self.writeLocks[0];
if (cb) {
self.writeLocks[0] = null;
cb();
} else {
setTimeout(invokeWriteCallback, 10);
}
} else {
setTimeout(invokeWriteCallback, 10);
}
}
invokeWriteCallback();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment