src/Pure/Concurrent/delay.scala
author wenzelm
Fri, 01 Apr 2022 17:06:10 +0200
changeset 75393 87ebf5a50283
parent 75380 2cb2606ce075
child 77182 25dbf5bec91e
permissions -rw-r--r--
clarified formatting, for the sake of scala3;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Concurrent/delay.scala
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     3
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     4
Delayed events.
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     6
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     8
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
     9
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75380
diff changeset
    10
object Delay {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    11
  // delayed event after first invocation
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    12
  def first(delay: => Time, log: Logger = No_Logger, gui: Boolean = false)(event: => Unit): Delay =
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    13
    new Delay(true, delay, log, if (gui) GUI_Thread.later { event } else event )
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    14
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    15
  // delayed event after last invocation
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    16
  def last(delay: => Time, log: Logger = No_Logger, gui: Boolean = false)(event: => Unit): Delay =
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    17
    new Delay(false, delay, log, if (gui) GUI_Thread.later { event } else event )
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    18
}
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    19
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75380
diff changeset
    20
final class Delay private(first: Boolean, delay: => Time, log: Logger, event: => Unit) {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    21
  private var running: Option[Event_Timer.Request] = None
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    22
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75380
diff changeset
    23
  private def run: Unit = {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    24
    val do_run = synchronized {
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    25
      if (running.isDefined) { running = None; true } else false
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    26
    }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    27
    if (do_run) {
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    28
      try { event }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    29
      catch { case exn: Throwable if !Exn.is_interrupt(exn) => log(Exn.message(exn)); throw exn }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    30
    }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    31
  }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    32
75380
2cb2606ce075 tuned: avoid problems with scala3;
wenzelm
parents: 73367
diff changeset
    33
  def invoke(): Unit = synchronized {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    34
    val new_run =
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    35
      running match {
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 71704
diff changeset
    36
        case Some(request) => if (first) false else { request.cancel(); true }
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    37
        case None => true
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    38
      }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    39
    if (new_run)
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    40
      running = Some(Event_Timer.request(Time.now() + delay)(run))
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    41
  }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    42
75380
2cb2606ce075 tuned: avoid problems with scala3;
wenzelm
parents: 73367
diff changeset
    43
  def revoke(): Unit = synchronized {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    44
    running match {
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 71704
diff changeset
    45
      case Some(request) => request.cancel(); running = None
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    46
      case None =>
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    47
    }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    48
  }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    49
75380
2cb2606ce075 tuned: avoid problems with scala3;
wenzelm
parents: 73367
diff changeset
    50
  def postpone(alt_delay: Time): Unit = synchronized {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    51
    running match {
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    52
      case Some(request) =>
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    53
        val alt_time = Time.now() + alt_delay
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 71704
diff changeset
    54
        if (request.time < alt_time && request.cancel()) {
71704
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    55
          running = Some(Event_Timer.request(alt_time)(run))
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    56
        }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    57
      case None =>
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    58
    }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    59
  }
b9a5eb0f3b43 clarified modules;
wenzelm
parents:
diff changeset
    60
}