src/Pure/PIDE/session.scala
changeset 65207 004bc5968c2a
parent 65206 ff8c3c29a924
child 65208 91c528cd376a
equal deleted inserted replaced
65206:ff8c3c29a924 65207:004bc5968c2a
   230   /* global state */
   230   /* global state */
   231 
   231 
   232   private val syslog = new Session.Syslog(syslog_limit)
   232   private val syslog = new Session.Syslog(syslog_limit)
   233   def syslog_content(): String = syslog.content
   233   def syslog_content(): String = syslog.content
   234 
   234 
   235   @volatile private var _phase: Session.Phase = Session.Inactive
   235   private val _phase = Synchronized[Session.Phase](Session.Inactive)
   236   private def phase_=(new_phase: Session.Phase)
   236   private def phase_=(new_phase: Session.Phase)
   237   {
   237   {
   238     _phase = new_phase
   238     _phase.change(_ => { phase_changed.post(new_phase); new_phase })
   239     phase_changed.post(new_phase)
   239   }
   240   }
   240   def phase = _phase.value
   241   def phase = _phase
       
   242   def is_ready: Boolean = phase == Session.Ready
   241   def is_ready: Boolean = phase == Session.Ready
   243 
   242 
   244   private val global_state = Synchronized(Document.State.init)
   243   private val global_state = Synchronized(Document.State.init)
   245   def current_state(): Document.State = global_state.value
   244   def current_state(): Document.State = global_state.value
   246 
   245 
   526 
   525 
   527           case input: Prover.Input =>
   526           case input: Prover.Input =>
   528             all_messages.post(input)
   527             all_messages.post(input)
   529 
   528 
   530           case Start(start_prover) if !prover.defined =>
   529           case Start(start_prover) if !prover.defined =>
   531             phase match {
   530             prover.set(start_prover(manager.send(_)))
   532               case Session.Inactive | Session.Terminated(_) =>
       
   533                 phase = Session.Startup
       
   534                 prover.set(start_prover(manager.send(_)))
       
   535               case _ =>
       
   536             }
       
   537 
   531 
   538           case Stop =>
   532           case Stop =>
   539             if (prover.defined && is_ready) {
   533             if (prover.defined && is_ready) {
   540               _protocol_handlers.change(_.stop(prover.get))
   534               _protocol_handlers.change(_.stop(prover.get))
   541               global_state.change(_ => Document.State.init)
   535               global_state.change(_ => Document.State.init)
   597   def snapshot(name: Document.Node.Name = Document.Node.Name.empty,
   591   def snapshot(name: Document.Node.Name = Document.Node.Name.empty,
   598       pending_edits: List[Text.Edit] = Nil): Document.Snapshot =
   592       pending_edits: List[Text.Edit] = Nil): Document.Snapshot =
   599     global_state.value.snapshot(name, pending_edits)
   593     global_state.value.snapshot(name, pending_edits)
   600 
   594 
   601   def start(start_prover: Prover.Receiver => Prover)
   595   def start(start_prover: Prover.Receiver => Prover)
   602   { manager.send(Start(start_prover)) }
   596   {
       
   597     _phase.change(
       
   598       {
       
   599         case Session.Inactive =>
       
   600           manager.send(Start(start_prover))
       
   601           Session.Startup
       
   602         case phase => error("Cannot start prover in phase " + quote(phase.print))
       
   603       })
       
   604   }
   603 
   605 
   604   def stop()
   606   def stop()
   605   {
   607   {
   606     delay_prune.revoke()
   608     delay_prune.revoke()
   607     manager.send_wait(Stop)
   609     manager.send_wait(Stop)