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.

Revisions

  1. clusterfudge created this gist Aug 23, 2013.
    55 changes: 55 additions & 0 deletions lock.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    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();


    }