src/Pure/Concurrent/standard_thread.scala
changeset 64810 05b29c8f0add
parent 64370 865b39487b5d
child 71681 3622eea18e39
equal deleted inserted replaced
64809:a0e1f64be67c 64810:05b29c8f0add
    48     }
    48     }
    49 
    49 
    50 
    50 
    51   /* delayed events */
    51   /* delayed events */
    52 
    52 
    53   final class Delay private[Standard_Thread](first: Boolean, delay: => Time, event: => Unit)
    53   final class Delay private[Standard_Thread](
       
    54     first: Boolean, delay: => Time, log: Logger, event: => Unit)
    54   {
    55   {
    55     private var running: Option[Event_Timer.Request] = None
    56     private var running: Option[Event_Timer.Request] = None
    56 
    57 
    57     private def run: Unit =
    58     private def run: Unit =
    58     {
    59     {
    59       val do_run = synchronized {
    60       val do_run = synchronized {
    60         if (running.isDefined) { running = None; true } else false
    61         if (running.isDefined) { running = None; true } else false
    61       }
    62       }
    62       if (do_run) event
    63       if (do_run) {
       
    64         try { event }
       
    65         catch { case exn: Throwable if !Exn.is_interrupt(exn) => log(Exn.message(exn)); throw exn }
       
    66       }
    63     }
    67     }
    64 
    68 
    65     def invoke(): Unit = synchronized
    69     def invoke(): Unit = synchronized
    66     {
    70     {
    67       val new_run =
    71       val new_run =
    93       }
    97       }
    94     }
    98     }
    95   }
    99   }
    96 
   100 
    97   // delayed event after first invocation
   101   // delayed event after first invocation
    98   def delay_first(delay: => Time)(event: => Unit): Delay = new Delay(true, delay, event)
   102   def delay_first(delay: => Time, log: Logger = No_Logger)(event: => Unit): Delay =
       
   103     new Delay(true, delay, log, event)
    99 
   104 
   100   // delayed event after last invocation
   105   // delayed event after last invocation
   101   def delay_last(delay: => Time)(event: => Unit): Delay = new Delay(false, delay, event)
   106   def delay_last(delay: => Time, log: Logger = No_Logger)(event: => Unit): Delay =
       
   107     new Delay(false, delay, log, event)
   102 }
   108 }