Skip to content

Reads are exclusive with writes, writes are exclusive with everything

Notifications You must be signed in to change notification settings

TehShrike/read-write-lock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

read-write-lock

Build Status

  • a write lock prevents all other writes or reads
  • a read lock only prevents writes

Based on mutexify!

Algorithm

Write lock requests get put on the queue and handed out in order.

Read lock requests get put on the queue too - but when one read lock is given, all read requests in the queue go at once - once they all come back, it's on to the next lock request in the queue.

Usage

var createMutex = require('read-write-lock')

var mutex = createMutex()

mutex.writeLock(function(release) {
	// lol I've got a write lock which means that nobody else can do anything

	setTimeout(release, 200)
})

mutex.readLock(function(release) {
	// I've got a read lock at the same time as the function below!
	setTimeout(release, 100)
})

mutex.readLock(function(release) {
	// I've got a read lock at the same time as the function above!
	setTimeout(release, 200)
})

In the real world

If you're using this to lock around a simple key/value store like levelup, you'll want a different lock for each key. The key-master can help with this:

var createMutex = require('read-write-lock')
var KeyMaster = require('key-master')
var mutexes = new KeyMaster(createMutex)

mutexes.get('my key').readLock(function(release) {
	db.get('my key', function(err, value) {
		// wheeeee!
		console.log('totally safe', value)
		release()
	})
})

License

WTFPL

About

Reads are exclusive with writes, writes are exclusive with everything

Resources

Stars

Watchers

Forks

Packages