Skip to content

Commit

Permalink
SafeCondition
Browse files Browse the repository at this point in the history
  • Loading branch information
skozlov committed Aug 28, 2023
1 parent b913b94 commit f7e52ed
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 0 deletions.
@@ -0,0 +1,30 @@
package com.github.skozlov.commons.scala.concurrent.lock

import com.github.skozlov.commons.scala.time.Deadline

import java.util.concurrent.TimeoutException
import java.util.concurrent.locks.Condition
import scala.annotation.tailrec

extension (condition: Condition) {
def awaitUninterruptibly(exitCondition: () => Boolean): Unit = {
while (!exitCondition()) {
condition.awaitUninterruptibly()
}
}

@throws[InterruptedException]
@throws[TimeoutException]
@tailrec
def await(exitCondition: () => Boolean)(implicit deadline: Deadline): Unit = {
if (!exitCondition()) {
if deadline.isOver then throw new TimeoutException(s"Condition was never true before $deadline")
if (deadline == Deadline.Inf) {
condition.await()
} else {
condition.awaitNanos(deadline.toTimeout.toNanos)
}
await(exitCondition)(deadline)
}
}
}
@@ -0,0 +1,11 @@
package com.github.skozlov.commons.scala.concurrent.lock

import com.github.skozlov.commons.scala.time.Deadline

import java.util.concurrent.locks.Condition

case class SafeCondition(unsafe: Condition) {
def await(exitCondition: () => Boolean)(implicit deadline: Deadline): Unit = unsafe.await(exitCondition)(deadline)

def signalAll(): Unit = unsafe.signalAll()
}
Expand Up @@ -14,4 +14,6 @@ case class SafeLock(unsafe: ReentrantLock) {
@throws[InterruptedException]
@throws[TimeoutException]
def locking[R](f: () => R)(implicit deadline: Deadline): R = unsafe.locking(f)(deadline)

def newCondition(): SafeCondition = SafeCondition(unsafe.newCondition())
}

0 comments on commit f7e52ed

Please sign in to comment.