package util import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.locks.{ReentrantLock, Lock} import util.ControlUtil._ 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 = defining(getLockObject(key)){ lock => try { lock.lock() f } finally { lock.unlock() } } }