diff --git a/pool.go b/pool.go index 4871371..978bc34 100644 --- a/pool.go +++ b/pool.go @@ -13,7 +13,6 @@ type SimplePool struct { Relays map[string]*Relay Context context.Context - mutex sync.Mutex cancel context.CancelFunc } @@ -31,8 +30,7 @@ func NewSimplePool(ctx context.Context) *SimplePool { func (pool *SimplePool) EnsureRelay(url string) (*Relay, error) { nm := NormalizeURL(url) - pool.mutex.Lock() - defer pool.mutex.Unlock() + defer namedLock(url)() relay, ok := pool.Relays[nm] if ok && relay.IsConnected() { diff --git a/utils.go b/utils.go index cdeeae5..724bcaf 100644 --- a/utils.go +++ b/utils.go @@ -3,10 +3,22 @@ package nostr import ( "net/url" "strings" + "sync" + "github.com/dgraph-io/ristretto/z" "golang.org/x/exp/constraints" ) +const MAX_LOCKS = 50 + +var namedMutexPool = make([]sync.Mutex, MAX_LOCKS) + +func namedLock(name string) (unlock func()) { + idx := z.MemHashString(name) % MAX_LOCKS + namedMutexPool[idx].Lock() + return namedMutexPool[idx].Unlock +} + func similar[E constraints.Ordered](as, bs []E) bool { if len(as) != len(bs) { return false