// Copyright Project Harbor Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cache

import (
	"sync"
)

type keyMutex struct {
	m *sync.Map
}

func (km keyMutex) Lock(key any) {
	m := sync.Mutex{}
	act, _ := km.m.LoadOrStore(key, &m)

	mm := act.(*sync.Mutex)
	mm.Lock()
	if mm != &m {
		mm.Unlock()
		km.Lock(key)
	}
}

func (km keyMutex) Unlock(key any) {
	act, exist := km.m.Load(key)
	if !exist {
		panic("unlock of unlocked mutex")
	}
	m := act.(*sync.Mutex)
	km.m.Delete(key)
	m.Unlock()
}
