diff options
| author | Jakob Unterwurzacher | 2016-05-29 22:40:05 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2016-05-29 22:40:05 +0200 | 
| commit | 77813bdc13118fd08bbff7a68c9d5268080a2a15 (patch) | |
| tree | d135f533b6a54d388c7ba3f8533a4a9afc4b4735 /internal | |
| parent | 9aeb639a15511d0e1c5090e9d3cfcd98074d04f3 (diff) | |
fusefrontend: simplify wlockMap
mapMutex can be anonymous and using an RWMutex is overkill
because the lock protects very short sections.
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/fusefrontend/write_lock.go | 62 | 
1 files changed, 37 insertions, 25 deletions
| diff --git a/internal/fusefrontend/write_lock.go b/internal/fusefrontend/write_lock.go index a8ec6b6..2f8ea4e 100644 --- a/internal/fusefrontend/write_lock.go +++ b/internal/fusefrontend/write_lock.go @@ -5,7 +5,7 @@ import (  )  func init() { -	wlock.m = make(map[uint64]*refCntMutex) +	wlock.inodeLocks = make(map[uint64]*refCntMutex)  }  // wlock - serializes write accesses to each file (identified by inode number) @@ -20,47 +20,59 @@ var wlock wlockMap  // 2) lock ... unlock ...  // 3) unregister  type wlockMap struct { -	mapMutex sync.RWMutex -	m        map[uint64]*refCntMutex +	// Protects map access +	sync.Mutex +	inodeLocks map[uint64]*refCntMutex +} + +// refCntMutex - mutex with reference count +type refCntMutex struct { +	// Write lock for this inode +	sync.Mutex +	// Reference count +	refCnt int  } +// register creates an entry for "ino", or incrementes the reference count +// if the entry already exists.  func (w *wlockMap) register(ino uint64) { -	w.mapMutex.Lock() -	r := w.m[ino] +	w.Lock() +	defer w.Unlock() + +	r := w.inodeLocks[ino]  	if r == nil {  		r = &refCntMutex{} -		w.m[ino] = r +		w.inodeLocks[ino] = r  	} -	r.refCnt++ // this must happen inside the mapMutex lock -	w.mapMutex.Unlock() +	r.refCnt++  } +// unregister decrements the reference count for "ino" and deletes the entry if +// the reference count has reached 0.  func (w *wlockMap) unregister(ino uint64) { -	w.mapMutex.Lock() -	r := w.m[ino] +	w.Lock() +	defer w.Unlock() + +	r := w.inodeLocks[ino]  	r.refCnt--  	if r.refCnt == 0 { -		delete(w.m, ino) +		delete(w.inodeLocks, ino)  	} -	w.mapMutex.Unlock()  } +// lock retrieves the entry for "ino" and locks it.  func (w *wlockMap) lock(ino uint64) { -	w.mapMutex.RLock() -	r := w.m[ino] -	w.mapMutex.RUnlock() -	r.Lock() // this can take a long time - execute outside the mapMutex lock +	w.Lock() +	r := w.inodeLocks[ino] +	w.Unlock() +	// this can take a long time - execute outside the wlockMap lock +	r.Lock()  } +// unlock retrieves the entry for "ino" and unlocks it.  func (w *wlockMap) unlock(ino uint64) { -	w.mapMutex.RLock() -	r := w.m[ino] -	w.mapMutex.RUnlock() +	w.Lock() +	r := w.inodeLocks[ino] +	w.Unlock()  	r.Unlock()  } - -// refCntMutex - mutex with reference count -type refCntMutex struct { -	sync.Mutex -	refCnt int -} | 
