Skip to content
Snippets Groups Projects
MockedMonitor.scala 2 KiB
Newer Older
Matt Bovel's avatar
Matt Bovel committed
package instrumentation

trait MockedMonitor extends Monitor:
  def scheduler: Scheduler

  // Can be overriden.
  override def waitDefault() =
    scheduler.log("wait")
    scheduler updateThreadState Wait(this, scheduler.threadLocks.tail)
Matt Bovel's avatar
Matt Bovel committed
  override def synchronizedDefault[T](toExecute: => T): T =
Matt Bovel's avatar
Matt Bovel committed
    scheduler.log("synchronized check")
    val prevLocks = scheduler.threadLocks
Matt Bovel's avatar
Matt Bovel committed
    scheduler updateThreadState Sync(
      this,
      prevLocks
    ) // If this belongs to prevLocks, should just continue.
Matt Bovel's avatar
Matt Bovel committed
    scheduler.log("synchronized -> enter")
    try
      toExecute
    finally
      scheduler updateThreadState Running(prevLocks)
      scheduler.log("synchronized -> out")
  override def notifyDefault() =
    scheduler mapOtherStates {
Matt Bovel's avatar
Matt Bovel committed
      state =>
        state match
          case Wait(lockToAquire, locks) if lockToAquire == this =>
            SyncUnique(this, state.locks)
          case e => e
Matt Bovel's avatar
Matt Bovel committed
    }
    scheduler.log("notify")
  override def notifyAllDefault() =
    scheduler mapOtherStates {
Matt Bovel's avatar
Matt Bovel committed
      state =>
        state match
          case Wait(lockToAquire, locks) if lockToAquire == this =>
            Sync(this, state.locks)
          case SyncUnique(lockToAquire, locks) if lockToAquire == this =>
            Sync(this, state.locks)
          case e => e
Matt Bovel's avatar
Matt Bovel committed
    }
    scheduler.log("notifyAll")

abstract class ThreadState:
  def locks: Seq[AnyRef]
trait CanContinueIfAcquiresLock extends ThreadState:
  def lockToAquire: AnyRef
Matt Bovel's avatar
Matt Bovel committed
case object Start extends ThreadState:
  def locks: Seq[AnyRef] = Seq.empty
case object End extends ThreadState:
  def locks: Seq[AnyRef] = Seq.empty
Matt Bovel's avatar
Matt Bovel committed
case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState
Matt Bovel's avatar
Matt Bovel committed
case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef])
    extends ThreadState with CanContinueIfAcquiresLock
case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState
    with CanContinueIfAcquiresLock
Matt Bovel's avatar
Matt Bovel committed
case class Running(locks: Seq[AnyRef]) extends ThreadState
case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState