Commit 945145c0016e68ab95bf0003dc41a937777aaf36
1 parent
fe3033bbf9
Exists in
master
mutex-common.js
Showing 1 changed file with 57 additions and 0 deletions Inline Diff
lib/mutex-common.js
File was created | 1 | const DEBUGMODE = (process.env.NODE_ENV !== 'production') || process.env.DEBUG_MUTEX; | |
2 | |||
3 | const locks = require('locks'); | ||
4 | const logger = require('komodo-sdk/logger'); | ||
5 | |||
6 | const locksList = {}; | ||
7 | const lockBy = {}; | ||
8 | |||
9 | exports.lock = function lock(lockName, label, cb) { | ||
10 | if (DEBUGMODE) logger.verbose('Locking MUTEX', { lockName, label }); | ||
11 | return new Promise((resolve) => { | ||
12 | if (!locksList[lockName]) { | ||
13 | locksList[lockName] = locks.createMutex(); | ||
14 | } | ||
15 | |||
16 | locksList[lockName].lock(() => { | ||
17 | lockBy[lockName] = label; | ||
18 | if (DEBUGMODE) logger.verbose('MUTEX locked', { lockName, label }); | ||
19 | resolve(true); | ||
20 | if (typeof cb === 'function') cb(); | ||
21 | }); | ||
22 | }); | ||
23 | }; | ||
24 | |||
25 | exports.tryLock = function tryLock(lockName, label) { | ||
26 | if (DEBUGMODE) logger.verbose('Trying to enter MUTEX if not locked', { lockName, label }); | ||
27 | |||
28 | if (!locksList[lockName]) { | ||
29 | locksList[lockName] = locks.createMutex(); | ||
30 | } | ||
31 | |||
32 | const result = locksList[lockName].tryLock(); | ||
33 | if (DEBUGMODE && result) logger.verbose('MUTEX entered', { lockName, label }); | ||
34 | if (DEBUGMODE && !result) logger.verbose('MUTEX not entered', { lockName, label }); | ||
35 | return result; | ||
36 | }; | ||
37 | |||
38 | |||
39 | exports.unlock = function unlock(lockName, label) { | ||
40 | if (DEBUGMODE) logger.verbose('Unlocking MUTEX', { lockName, label }); | ||
41 | |||
42 | if (!locksList[lockName]) { | ||
43 | logger.warn('Try to unlock undefined MUTEX', { lockName, label }); | ||
44 | return; | ||
45 | } | ||
46 | |||
47 | try { | ||
48 | if (locksList[lockName]) locksList[lockName].unlock(); | ||
49 | if (DEBUGMODE) logger.verbose('MUTEX unlocked', { lockName, label }); | ||
50 | } catch (e) { | ||
51 | logger.warn('Exception on unlocking MUTEX', { lockName, label, e }); | ||
52 | } | ||
53 | }; | ||
54 | |||
55 | exports.getLockBy = function getLockBy(lockName) { | ||
56 | return lockBy[lockName]; | ||
57 | }; | ||
58 |