mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-02 11:36:05 +01:00
37 lines
732 B
Scala
37 lines
732 B
Scala
package util
|
|
|
|
import java.util.concurrent.ConcurrentHashMap
|
|
import java.util.concurrent.locks.{ReentrantLock, Lock}
|
|
|
|
object LockUtil {
|
|
|
|
/**
|
|
* lock objects
|
|
*/
|
|
private val locks = new ConcurrentHashMap[String, Lock]()
|
|
|
|
/**
|
|
* Returns the lock object for the specified repository.
|
|
*/
|
|
private def getLockObject(key: String): Lock = synchronized {
|
|
if(!locks.containsKey(key)){
|
|
locks.put(key, new ReentrantLock())
|
|
}
|
|
locks.get(key)
|
|
}
|
|
|
|
/**
|
|
* Synchronizes a given function which modifies the working copy of the wiki repository.
|
|
*/
|
|
def lock[T](key: String)(f: => T): T = {
|
|
val lock = getLockObject(key)
|
|
try {
|
|
lock.lock()
|
|
f
|
|
} finally {
|
|
lock.unlock()
|
|
}
|
|
}
|
|
|
|
}
|