Skip to content
Snippets Groups Projects
overrides.scala 3.08 KiB
package concpar21final03

import instrumentation.*

class SchedulableThreadMap[A](val scheduler: Scheduler)
    extends ThreadMap[A]
    with MockedMonitor:

  override def currentThreadHasValue: Boolean = scheduler.exec {
    super.currentThreadHasValue
  }("", Some(res => s"currentThreadHasValue is $res"))

  override def currentThreadValue: Option[A] = scheduler.exec {
    super.currentThreadValue
  }("", Some(res => s"currentThreadValue is $res"))

  override def setCurrentThreadValue(value: A): Unit = scheduler.exec {
    super.setCurrentThreadValue(value)
  }(s"setCurrentThreadValue($value)")

  override def deleteCurrentThreadValue(): Unit = scheduler.exec {
    super.deleteCurrentThreadValue()
  }("deleteCurrentThreadValue()")

  override def waitForall(predicate: A => Boolean): Unit = scheduler.exec {
    super.waitForall(predicate)
  }("waitForall")

  def allValues: List[A] = synchronized {
    theMap.values.toList
  }

end SchedulableThreadMap

class SchedulableRCU(scheduler: Scheduler) extends RCU with LockFreeMonitor:
  override protected val latestVersion =
    SchedulableAtomicLong(0, scheduler, "latestVersion")
  override protected val readersVersion: ThreadMap[Long] = SchedulableThreadMap(
    scheduler
  )

class SchedulableInMemoryFileSystem(scheduler: Scheduler)
    extends InMemoryFileSystem:
  override def createFile(file: FileName, content: String): Unit =
    scheduler.exec {
      super.createFile(file, content)
    }(s"createFile($file)")
  override def readFile(file: FileName): String = scheduler.exec {
    super.readFile(file)
  }(s"readFile($file)")
  override def deleteFile(file: FileName): Unit = scheduler.exec {
    super.deleteFile(file)
  }(s"deleteFile($file)")

class SchedulableUpdateServer(scheduler: Scheduler, fs: InMemoryFileSystem)
    extends UpdateServer(fs)
    with LockFreeMonitor:
  override val rcu = SchedulableRCU(scheduler)

class SchedulableAtomicLong(initial: Long, scheduler: Scheduler, name: String)
    extends AtomicLong(initial):

  override def get: Long = scheduler.exec {
    super.get
  }(s"", Some(res => s"$name: get $res"))

  override def set(value: Long): Unit = scheduler.exec {
    super.set(value)
  }(s"$name: set $value", None)
  override def incrementAndGet(): Long = scheduler.exec {
    super.incrementAndGet()
  }(s"", Some(res => s"$name: incrementAndGet $res"))

  override def getAndIncrement(): Long = scheduler.exec {
    super.getAndIncrement()
  }(s"", Some(res => s"$name: getandIncrement $res"))

  override def compareAndSet(expected: Long, newValue: Long): Boolean =
    scheduler.exec {
      super.compareAndSet(expected, newValue)
    }(
      s"$name: compareAndSet(expected = $expected, newValue = $newValue)",
      Some(res => s"$name: Did it set? $res")
    )

end SchedulableAtomicLong

class SchedulableAtomicReference[T](
    initial: T,
    scheduler: Scheduler,
    name: String
) extends AtomicReference(initial):
  override def get: T = scheduler.exec {
    super.get
  }(s"", Some(res => s"$name: get $res"))

  override def set(value: T): Unit = scheduler.exec {
    super.set(value)
  }(s"$name: set $value", None)