function Mutex() {
this.isLocked = false;
this._waiting = [];
this._index = 0;
}
Mutex.prototype.lock = function (cb) {
if (this.isLocked) {
// Original line, this._waiting.push(cb);
this._waiting.splice(this._index, 0, cb);
} else {
this.isLocked = true;
cb();
}
}
Mutex.prototype.unlock = function () {
if (!this.isLocked) {
throw new Error('Mutex is not locked');
}
var waiter = this._waiting[this._index];
if (waiter) {
this._index++;
waiter();
} else {
this.isLocked = false;
}
}
var mutex = new Mutex();
function log(text) {
var el = document.getElementById("results");
el.innerHTML += text + "<br>";
}
mutex.lock(function () {
mutex.lock(function () {
mutex.lock(function () {
log("car");
mutex.lock(function () {
log("quz");
mutex.unlock();
});
mutex.unlock();
});
log("bar");
mutex.lock(function () {
log("baz");
mutex.unlock();
});
// this will unlock the last acquired lock
// so the above code is executed
mutex.unlock();
});
log("foo");
mutex.unlock();
});
// Original : <a href="https://github.com/Wizcorp/locks/">Wizcorp/locks/</a><br>
// License : MIT <br>http://jsfiddle.net/#run
<div id="results"></div>