218 pending: State.Pending = Map.empty, |
218 pending: State.Pending = Map.empty, |
219 running: State.Running = Map.empty, |
219 running: State.Running = Map.empty, |
220 results: State.Results = Map.empty |
220 results: State.Results = Map.empty |
221 ) { |
221 ) { |
222 require(serial >= 0, "serial underflow") |
222 require(serial >= 0, "serial underflow") |
223 def inc_serial: State = { |
223 |
|
224 def next_serial: Long = { |
224 require(serial < Long.MaxValue, "serial overflow") |
225 require(serial < Long.MaxValue, "serial overflow") |
225 copy(serial = serial + 1) |
226 serial + 1 |
226 } |
227 } |
|
228 def inc_serial: State = copy(serial = next_serial) |
227 |
229 |
228 def ready: List[Task] = pending.valuesIterator.filter(_.is_ready).toList.sortBy(_.name) |
230 def ready: List[Task] = pending.valuesIterator.filter(_.is_ready).toList.sortBy(_.name) |
229 def next_ready: List[Task] = ready.filter(entry => !is_running(entry.name)) |
231 def next_ready: List[Task] = ready.filter(entry => !is_running(entry.name)) |
230 |
232 |
231 def remove_pending(a: String): State = |
233 def remove_pending(a: String): State = |
820 db: SQL.Database, |
822 db: SQL.Database, |
821 worker_uuid: String, |
823 worker_uuid: String, |
822 state: State, |
824 state: State, |
823 old_state: State |
825 old_state: State |
824 ): State = { |
826 ): State = { |
|
827 val serial = state.next_serial |
825 val changed = |
828 val changed = |
826 List( |
829 List( |
827 update_sessions(db, state.sessions, old_state.sessions), |
830 update_sessions(db, state.sessions, old_state.sessions), |
828 update_pending(db, state.pending, old_state.pending), |
831 update_pending(db, state.pending, old_state.pending), |
829 update_running(db, state.running, old_state.running), |
832 update_running(db, state.running, old_state.running), |
830 update_results(db, state.results, old_state.results)) |
833 update_results(db, state.results, old_state.results) |
831 |
834 ).exists(identity) |
832 val state1 = if (changed.exists(identity)) state.inc_serial else state |
835 |
833 if (state1.serial != state.serial) stamp_worker(db, worker_uuid, state1.serial) |
836 if (changed) { |
834 |
837 stamp_worker(db, worker_uuid, serial) |
835 state1 |
838 state.copy(serial = serial) |
|
839 } |
|
840 else state |
836 } |
841 } |
837 } |
842 } |
838 |
843 |
839 def read_builds(db: SQL.Database): List[Build] = |
844 def read_builds(db: SQL.Database): List[Build] = |
840 private_data.transaction_lock(db, create = true, label = "Build_Process.read_builds") { |
845 private_data.transaction_lock(db, create = true, label = "Build_Process.read_builds") { |