Newer
Older
gitbucket_jkp / src / main / scala / util / LockUtil.scala
@takezoe takezoe on 21 Sep 2013 760 bytes Use ControlUtil.
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()
    }
  }

}