Commit 945145c0016e68ab95bf0003dc41a937777aaf36

Authored by Adhidarma Hadiwinoto
1 parent fe3033bbf9
Exists in master

mutex-common.js

Showing 1 changed file with 57 additions and 0 deletions Side-by-side Diff

... ... @@ -0,0 +1,57 @@
  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 +};