Skip to content

Instantly share code, notes, and snippets.

@co3moz
Created January 27, 2019 13:34
Show Gist options
  • Save co3moz/96e5d8ba20964cb80f63ba4685beff81 to your computer and use it in GitHub Desktop.
Save co3moz/96e5d8ba20964cb80f63ba4685beff81 to your computer and use it in GitHub Desktop.
crappy lock mechanism for js, "minor projects"
function deferred() {
let r;
let p = new Promise(a => r = a);
p.r = r;
return p;
}
function lock() {
let queue = [];
let locked = false;
return {
lock() {
if(locked) {
let q = deferred();
queue.push(q);
return q;
}
locked = true;
},
unlock() {
if (!locked) throw new Error('already unlocked');
if(queue.length > 0) {
let q = queue.shift();
q.r();
} else {
locked = false;
}
}
}
}
let s = lock();
for(let i = 0; i<5; i++) {
(async () => {
try {
console.log('trigger' + i);
await s.lock();
console.log('lock' + i);
await new Promise(resolve => setTimeout(resolve, 1000 + Math.random() * 5000));
} finally {
console.log('unlock' + i);
s.unlock();
}
})();
}
/*
trigger0
trigger1
trigger2
trigger3
trigger4
lock0
...
unlock0
lock1
...
unlock1
lock2
...
unlock2
lock3
...
unlock3
lock4
...
unlock4
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment