src/Pure/System/session.scala
changeset 39701 7c351c1c0624
parent 39698 625a3bc4417b
child 40478 4bae781b8f7c
equal deleted inserted replaced
39700:fa55cf2c1ae4 39701:7c351c1c0624
    22   case object Assignment
    22   case object Assignment
    23   case class Commands_Changed(set: Set[Command])
    23   case class Commands_Changed(set: Set[Command])
    24 
    24 
    25   sealed abstract class Phase
    25   sealed abstract class Phase
    26   case object Inactive extends Phase
    26   case object Inactive extends Phase
    27   case object Startup extends Phase
    27   case object Startup extends Phase  // transient
       
    28   case object Failed extends Phase
    28   case object Ready extends Phase
    29   case object Ready extends Phase
    29   case object Shutdown extends Phase
    30   case object Shutdown extends Phase  // transient
    30 }
    31 }
    31 
    32 
    32 
    33 
    33 class Session(system: Isabelle_System)
    34 class Session(system: Isabelle_System)
    34 {
    35 {
    44   val update_delay = 500
    45   val update_delay = 500
    45 
    46 
    46 
    47 
    47   /* pervasive event buses */
    48   /* pervasive event buses */
    48 
    49 
    49   val phase_changed = new Event_Bus[(Session.Phase, Session.Phase)]
    50   val phase_changed = new Event_Bus[Session.Phase]
    50   val global_settings = new Event_Bus[Session.Global_Settings.type]
    51   val global_settings = new Event_Bus[Session.Global_Settings.type]
    51   val raw_messages = new Event_Bus[Isabelle_Process.Result]
    52   val raw_messages = new Event_Bus[Isabelle_Process.Result]
    52   val commands_changed = new Event_Bus[Session.Commands_Changed]
    53   val commands_changed = new Event_Bus[Session.Commands_Changed]
    53   val perspective = new Event_Bus[Session.Perspective.type]
    54   val perspective = new Event_Bus[Session.Perspective.type]
    54   val assignments = new Event_Bus[Session.Assignment.type]
    55   val assignments = new Event_Bus[Session.Assignment.type]
   124 
   125 
   125   @volatile private var _phase: Session.Phase = Session.Inactive
   126   @volatile private var _phase: Session.Phase = Session.Inactive
   126   def phase = _phase
   127   def phase = _phase
   127   private def phase_=(new_phase: Session.Phase)
   128   private def phase_=(new_phase: Session.Phase)
   128   {
   129   {
   129     val old_phase = _phase
       
   130     _phase = new_phase
   130     _phase = new_phase
   131     phase_changed.event(old_phase, new_phase)
   131     phase_changed.event(new_phase)
   132   }
   132   }
   133 
   133 
   134   private val global_state = new Volatile(Document.State.init)
   134   private val global_state = new Volatile(Document.State.init)
   135   def current_state(): Document.State = global_state.peek()
   135   def current_state(): Document.State = global_state.peek()
   136 
   136 
   207           catch { case _: Document.State.Fail => bad_result(result) }
   207           catch { case _: Document.State.Fail => bad_result(result) }
   208         case _ =>
   208         case _ =>
   209           if (result.is_syslog) {
   209           if (result.is_syslog) {
   210             reverse_syslog ::= result.message
   210             reverse_syslog ::= result.message
   211             if (result.is_ready) phase = Session.Ready
   211             if (result.is_ready) phase = Session.Ready
       
   212             else if (result.is_exit && phase == Session.Startup) phase = Session.Failed
   212             else if (result.is_exit) phase = Session.Inactive
   213             else if (result.is_exit) phase = Session.Inactive
   213           }
   214           }
   214           else if (result.is_stdout) { }
   215           else if (result.is_stdout) { }
   215           else if (result.is_status) {
   216           else if (result.is_status) {
   216             result.body match {
   217             result.body match {
   255         case change: Document.Change if prover != null => handle_change(change)
   256         case change: Document.Change if prover != null => handle_change(change)
   256 
   257 
   257         case result: Isabelle_Process.Result => handle_result(result)
   258         case result: Isabelle_Process.Result => handle_result(result)
   258 
   259 
   259         case Start(timeout, args) if prover == null =>
   260         case Start(timeout, args) if prover == null =>
   260           phase = Session.Startup
   261           if (phase == Session.Inactive || phase == Session.Failed) {
   261           prover = new Isabelle_Process(system, timeout, self, args:_*) with Isar_Document
   262             phase = Session.Startup
   262 
   263             prover = new Isabelle_Process(system, timeout, self, args:_*) with Isar_Document
   263         case Stop if phase == Session.Ready =>
   264           }
   264           global_state.change(_ => Document.State.init)  // FIXME event bus!?
   265 
   265           phase = Session.Shutdown
   266         case Stop =>
   266           prover.terminate
   267           if (phase == Session.Ready) {
   267           phase = Session.Inactive
   268             global_state.change(_ => Document.State.init)  // FIXME event bus!?
       
   269             phase = Session.Shutdown
       
   270             prover.terminate
       
   271             phase = Session.Inactive
       
   272           }
   268           finished = true
   273           finished = true
   269           reply(())
   274           reply(())
   270 
   275 
   271         case bad if prover != null =>
   276         case bad if prover != null =>
   272           System.err.println("session_actor: ignoring bad message " + bad)
   277           System.err.println("session_actor: ignoring bad message " + bad)