From 945145c0016e68ab95bf0003dc41a937777aaf36 Mon Sep 17 00:00:00 2001 From: Adhidarma Hadiwinoto <me@adhisimon.org> Date: Tue, 3 Sep 2019 15:37:31 +0700 Subject: [PATCH] mutex-common.js --- lib/mutex-common.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 lib/mutex-common.js diff --git a/lib/mutex-common.js b/lib/mutex-common.js new file mode 100644 index 0000000..494d609 --- /dev/null +++ b/lib/mutex-common.js @@ -0,0 +1,57 @@ +const DEBUGMODE = (process.env.NODE_ENV !== 'production') || process.env.DEBUG_MUTEX; + +const locks = require('locks'); +const logger = require('komodo-sdk/logger'); + +const locksList = {}; +const lockBy = {}; + +exports.lock = function lock(lockName, label, cb) { + if (DEBUGMODE) logger.verbose('Locking MUTEX', { lockName, label }); + return new Promise((resolve) => { + if (!locksList[lockName]) { + locksList[lockName] = locks.createMutex(); + } + + locksList[lockName].lock(() => { + lockBy[lockName] = label; + if (DEBUGMODE) logger.verbose('MUTEX locked', { lockName, label }); + resolve(true); + if (typeof cb === 'function') cb(); + }); + }); +}; + +exports.tryLock = function tryLock(lockName, label) { + if (DEBUGMODE) logger.verbose('Trying to enter MUTEX if not locked', { lockName, label }); + + if (!locksList[lockName]) { + locksList[lockName] = locks.createMutex(); + } + + const result = locksList[lockName].tryLock(); + if (DEBUGMODE && result) logger.verbose('MUTEX entered', { lockName, label }); + if (DEBUGMODE && !result) logger.verbose('MUTEX not entered', { lockName, label }); + return result; +}; + + +exports.unlock = function unlock(lockName, label) { + if (DEBUGMODE) logger.verbose('Unlocking MUTEX', { lockName, label }); + + if (!locksList[lockName]) { + logger.warn('Try to unlock undefined MUTEX', { lockName, label }); + return; + } + + try { + if (locksList[lockName]) locksList[lockName].unlock(); + if (DEBUGMODE) logger.verbose('MUTEX unlocked', { lockName, label }); + } catch (e) { + logger.warn('Exception on unlocking MUTEX', { lockName, label, e }); + } +}; + +exports.getLockBy = function getLockBy(lockName) { + return lockBy[lockName]; +}; -- 1.9.0