src/Pure/Concurrent/simple_thread.scala
changeset 61194 e4699ef5cf90
parent 59136 c2b23cb8a677
child 61555 e27cfd2bf094
equal deleted inserted replaced
61193:dde5ecbd5e10 61194:e4699ef5cf90
    51     default_pool.submit(new Callable[A] { def call = body })
    51     default_pool.submit(new Callable[A] { def call = body })
    52 
    52 
    53 
    53 
    54   /* delayed events */
    54   /* delayed events */
    55 
    55 
    56   final class Delay private [Simple_Thread](first: Boolean, delay: => Time, event: => Unit)
    56   final class Delay private [Simple_Thread](
       
    57     first: Boolean, delay: => Time, cancel: () => Unit, event: => Unit)
    57   {
    58   {
    58     private var running: Option[Event_Timer.Request] = None
    59     private var running: Option[Event_Timer.Request] = None
    59 
    60 
    60     private def run: Unit =
    61     private def run: Unit =
    61     {
    62     {
    67 
    68 
    68     def invoke(): Unit = synchronized
    69     def invoke(): Unit = synchronized
    69     {
    70     {
    70       val new_run =
    71       val new_run =
    71         running match {
    72         running match {
    72           case Some(request) => if (first) false else { request.cancel; true }
    73           case Some(request) => if (first) false else { request.cancel; cancel(); true }
    73           case None => true
    74           case None => true
    74         }
    75         }
    75       if (new_run)
    76       if (new_run)
    76         running = Some(Event_Timer.request(Time.now() + delay)(run))
    77         running = Some(Event_Timer.request(Time.now() + delay)(run))
    77     }
    78     }
    78 
    79 
    79     def revoke(): Unit = synchronized
    80     def revoke(): Unit = synchronized
    80     {
    81     {
    81       running match {
    82       running match {
    82         case Some(request) => request.cancel; running = None
    83         case Some(request) => request.cancel; cancel(); running = None
    83         case None =>
    84         case None => cancel()
    84       }
    85       }
    85     }
    86     }
    86 
    87 
    87     def postpone(alt_delay: Time): Unit =
    88     def postpone(alt_delay: Time): Unit = synchronized
    88     {
    89     {
    89       running match {
    90       running match {
    90         case Some(request) =>
    91         case Some(request) =>
    91           val alt_time = Time.now() + alt_delay
    92           val alt_time = Time.now() + alt_delay
    92           if (request.time < alt_time && request.cancel) {
    93           if (request.time < alt_time && request.cancel) {
       
    94             cancel()
    93             running = Some(Event_Timer.request(alt_time)(run))
    95             running = Some(Event_Timer.request(alt_time)(run))
    94           }
    96           }
    95         case None =>
    97           else cancel()
       
    98         case None => cancel()
    96       }
    99       }
    97     }
   100     }
    98   }
   101   }
    99 
   102 
   100   // delayed event after first invocation
   103   // delayed event after first invocation
   101   def delay_first(delay: => Time)(event: => Unit): Delay = new Delay(true, delay, event)
   104   def delay_first(delay: => Time, cancel: () => Unit = () => ())(event: => Unit): Delay =
       
   105     new Delay(true, delay, cancel, event)
   102 
   106 
   103   // delayed event after last invocation
   107   // delayed event after last invocation
   104   def delay_last(delay: => Time)(event: => Unit): Delay = new Delay(false, delay, event)
   108   def delay_last(delay: => Time, cancel: () => Unit = () => ())(event: => Unit): Delay =
       
   109     new Delay(false, delay, cancel, event)
   105 }
   110 }
   106