Skip to content

Commit

Permalink
Simplify mutex lock
Browse files Browse the repository at this point in the history
  • Loading branch information
tommy351 committed Nov 30, 2015
1 parent 9d31e08 commit 4824685
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 14 deletions.
15 changes: 6 additions & 9 deletions lib/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
var EventEmitter = require('events').EventEmitter;
var _ = require('lodash');
var Promise = require('bluebird');
var ReadWriteLock = require('rwlock');
var util = require('./util');
var Document = require('./document');
var Query = require('./query');
var Schema = require('./schema');
var Types = require('./types');
var WarehouseError = require('./error');
var PopulationError = require('./error/population');
var Mutex = require('./mutex');

var parseArgs = util.parseArgs;
var reverse = util.reverse;
Expand Down Expand Up @@ -71,7 +71,7 @@ function Model(name, schema_) {
* @property {Object} locks
* @private
*/
this._lock = new ReadWriteLock();
this._mutex = new Mutex();

/**
* Schema.
Expand Down Expand Up @@ -195,15 +195,12 @@ function execHooks(schema, type, event, data) {
}

Model.prototype._acquireWriteLock = function(id) {
var lock = this._lock;
var mutex = this._mutex;

return new Promise(function(resolve, reject) {
lock.async.writeLock(id, function(err, release) {
if (err) return reject(err);
resolve(release);
});
}).disposer(function(release) {
release();
mutex.lock(resolve);
}).disposer(function() {
mutex.unlock();
});
};

Expand Down
30 changes: 30 additions & 0 deletions lib/mutex.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';

function Mutex() {
this._locked = false;
this._queue = [];
}

Mutex.prototype.lock = function(fn) {
if (this._locked) {
this._queue.push(fn);
return;
}

this._locked = true;
fn();
};

Mutex.prototype.unlock = function() {
if (!this._locked) return;

var next = this._queue.shift();

if (next) {
next();
} else {
this._locked = false;
}
};

module.exports = Mutex;
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@
"bluebird": "^3.0.5",
"cuid": "~1.3.8",
"graceful-fs": "^4.1.2",
"lodash": "^3.10.1",
"rwlock": "^5.0.0"
"lodash": "^3.10.1"
},
"devDependencies": {
"chai": "^3.4.1",
Expand Down
1 change: 1 addition & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,5 @@ describe('Warehouse', function() {
require('./scripts/types/string');
require('./scripts/types/virtual');
require('./scripts/util');
require('./scripts/mutex');
});
6 changes: 3 additions & 3 deletions test/scripts/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,9 @@ describe('Model', function() {

Test = db.model('Test', testSchema);

return Test.insert([
{id: 1},
{id: 1}
return Promise.all([
Test.insert({id: 1}),
Test.insert({id: 1})
]).should.eventually.be.rejected;
});

Expand Down
33 changes: 33 additions & 0 deletions test/scripts/mutex.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';

var should = require('chai').should(); // eslint-disable-line
var Mutex = require('../../lib/mutex');
var sinon = require('sinon');

describe('Mutex', function() {
it('mutex test', function(callback) {
var mutex = new Mutex();
var fn1, fn2;

fn1 = sinon.spy(function() {
setTimeout(function() {
fn2.called.should.be.false;
mutex.unlock();
}, 20);
});

fn2 = sinon.spy(function() {
fn1.calledOnce.should.be.true;
mutex.unlock();
});

mutex.lock(fn1);
mutex.lock(fn2);

mutex.lock(function() {
fn1.calledOnce.should.be.true;
fn2.calledOnce.should.be.true;
callback();
});
});
});

0 comments on commit 4824685

Please sign in to comment.