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) |