Skip to content
Snippets Groups Projects
Commit 754ace90 authored by Hans Moog's avatar Hans Moog
Browse files

Feat: added a KRWMutex which allows locking per unique id

parent 7ce74d9e
No related branches found
No related tags found
No related merge requests found
package datastructure
import (
"sync"
)
type KRWMutex struct {
keyMutexConsumers map[interface{}]int
keyMutexes map[interface{}]*sync.RWMutex
mutex sync.RWMutex
}
func NewKRWMutex() *KRWMutex {
return &KRWMutex{
keyMutexConsumers: make(map[interface{}]int),
keyMutexes: make(map[interface{}]*sync.RWMutex),
}
}
func (krwMutex *KRWMutex) Register(key interface{}) (result *sync.RWMutex) {
krwMutex.mutex.Lock()
if val, exists := krwMutex.keyMutexConsumers[key]; exists {
krwMutex.keyMutexConsumers[key] = val + 1
result = krwMutex.keyMutexes[key]
} else {
result = &sync.RWMutex{}
krwMutex.keyMutexConsumers[key] = 1
krwMutex.keyMutexes[key] = result
}
krwMutex.mutex.Unlock()
return
}
func (kwrMutex *KRWMutex) Free(key interface{}) {
kwrMutex.mutex.Lock()
if val, exists := kwrMutex.keyMutexConsumers[key]; exists {
if val == 1 {
delete(kwrMutex.keyMutexConsumers, key)
delete(kwrMutex.keyMutexes, key)
} else {
kwrMutex.keyMutexConsumers[key] = val - 1
}
} else {
panic("trying to free non-existent key")
}
kwrMutex.mutex.Unlock()
}
package datastructure
import (
"testing"
)
func TestKRWMutex_Free(t *testing.T) {
krwMutex := NewKRWMutex()
krwMutex.Register("test")
krwMutex.Register("test")
krwMutex.Free("test")
krwMutex.Free("test")
}
func BenchmarkKRWMutex(b *testing.B) {
krwMutex := NewKRWMutex()
for i := 0; i < b.N; i++ {
krwMutex.Register(i)
krwMutex.Free(i)
}
}
......@@ -90,9 +90,6 @@ func storeTransactionMetadataInDatabase(metadata *transactionmetadata.Transactio
if marshaledMetadata, err := metadata.Marshal(); err != nil {
return err
} else {
if len(marshaledMetadata) != 97 {
panic("WATT")
}
if err := transactionMetadataDatabase.Set(metadata.GetHash().CastToBytes(), marshaledMetadata); err != nil {
return ErrDatabaseError.Derive(err, "failed to store transaction metadata")
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment